@kupola/kupola 1.2.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +330 -286
- package/adapters/axios.d.ts +34 -0
- package/adapters/axios.js +122 -0
- package/adapters/navios-http.d.ts +110 -0
- package/adapters/navios-http.js +151 -0
- package/dist/css/accessibility.css +119 -0
- package/dist/css/animations.css +224 -0
- package/dist/css/brand-themes.css +300 -0
- package/dist/css/colors_and_type.css +441 -0
- package/dist/css/components-ext.css +4165 -0
- package/dist/css/components.css +1483 -0
- package/dist/css/responsive.css +697 -0
- package/dist/css/scaffold.css +145 -0
- package/dist/css/states.css +316 -0
- package/dist/css/theme-dark.css +296 -0
- package/dist/css/theme-light.css +296 -0
- package/dist/css/utilities.css +171 -0
- package/dist/kupola.cjs.js +219 -161
- package/dist/kupola.cjs.js.map +1 -1
- package/dist/kupola.esm.js +6643 -5709
- package/dist/kupola.esm.js.map +1 -1
- package/dist/kupola.umd.js +219 -161
- package/dist/kupola.umd.js.map +1 -1
- package/dist/plugins/vite-plugin-kupola.js +120 -0
- package/dist/types/kupola.d.ts +421 -323
- package/js/calendar.js +334 -25
- package/js/carousel.js +182 -48
- package/js/collapse.js +148 -34
- package/js/color-picker.js +416 -108
- package/js/component.js +8 -19
- package/js/countdown.js +9 -8
- package/js/data-bind.js +73 -16
- package/js/datepicker.js +488 -110
- package/js/depends.js +710 -0
- package/js/dialog.js +4 -2
- package/js/drawer.js +172 -8
- package/js/dropdown.js +272 -17
- package/js/dynamic-tags.js +156 -40
- package/js/fileupload.js +9 -8
- package/js/form.js +280 -254
- package/js/global-events.js +281 -188
- package/js/heatmap.js +10 -7
- package/js/i18n.js +18 -10
- package/js/icons.js +141 -161
- package/js/image-preview.js +146 -2
- package/js/initializer.js +113 -71
- package/js/kupola-core.js +123 -45
- package/js/kupola-lifecycle.js +13 -11
- package/js/message.js +8 -1
- package/js/modal.js +207 -59
- package/js/notification.js +8 -1
- package/js/numberinput.js +9 -8
- package/js/pagination.js +263 -0
- package/js/registry.js +29 -12
- package/js/select.js +482 -27
- package/js/slide-captcha.js +11 -2
- package/js/slider.js +442 -25
- package/js/statcard.js +9 -7
- package/js/table.js +1210 -0
- package/js/tag.js +268 -14
- package/js/theme.js +14 -43
- package/js/timepicker.js +335 -66
- package/js/tooltip.js +317 -86
- package/js/utils.js +6 -2
- package/js/validation.js +6 -2
- package/js/virtual-list.js +11 -7
- package/js/web-components.js +288 -0
- package/package.json +77 -67
- package/plugins/vite-plugin-kupola.js +120 -0
- package/types/kupola.d.ts +421 -323
- package/CHANGELOG.md +0 -130
- package/INTEGRATION.md +0 -440
- package/PROJECT_SUMMARY.md +0 -312
- package/SKILL.md +0 -572
- package/dist/utils/utils/Kupola.cs +0 -77
- package/dist/utils/utils/Kupola.java +0 -104
- package/dist/utils/utils/kupola.go +0 -120
- package/dist/utils/utils/kupola.js +0 -63
- package/dist/utils/utils/kupola.py +0 -1392
- package/dist/utils/utils/kupola.rb +0 -69
- package/js/composition-api.js +0 -458
- package/js/error-handler.js +0 -181
- package/js/http.js +0 -419
- package/js/kupola-devtools.js +0 -598
- package/js/performance.js +0 -250
- package/js/router.js +0 -396
- package/js/security.js +0 -189
- package/js/test-utils.js +0 -251
- package/templates/base.html +0 -30
- package/templates/base_dashboard.html +0 -99
- package/utils/Kupola.cs +0 -77
- package/utils/Kupola.java +0 -104
- package/utils/kupola.go +0 -120
- package/utils/kupola.js +0 -63
- package/utils/kupola.py +0 -1392
- package/utils/kupola.rb +0 -69
package/dist/kupola.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kupola.esm.js","sources":["../js/component.js","../js/registry.js","../js/router.js","../js/http.js","../js/initializer.js","../js/kupola-core.js","../js/kupola-lifecycle.js","../js/utils.js","../js/data-bind.js","../js/theme.js","../js/dropdown.js","../js/select.js","../js/datepicker.js","../js/timepicker.js","../js/slider.js","../js/carousel.js","../js/drawer.js","../js/modal.js","../js/dialog.js","../js/fileupload.js","../js/collapse.js","../js/color-picker.js","../js/calendar.js","../js/dynamic-tags.js","../js/image-preview.js","../js/tag.js","../js/statcard.js","../js/heatmap.js","../js/tooltip.js","../js/validation.js","../js/virtual-list.js","../js/kupola-devtools.js","../js/icons.js","../js/countdown.js","../js/numberinput.js","../js/slide-captcha.js","../js/composition-api.js","../js/form.js","../js/test-utils.js","../js/i18n.js","../js/global-events.js","../js/security.js","../js/error-handler.js","../js/performance.js","../src/index.js"],"sourcesContent":["class KupolaComponent {\r\n constructor(element) {\r\n this.element = element;\r\n this.isMounted = false;\r\n this.isDestroyed = false;\r\n this.props = this._parseProps();\r\n this.state = {};\r\n this.slots = this._parseSlots();\r\n this._eventListeners = {};\r\n this._appliedMixins = [];\r\n this.lifecycle = window.KupolaLifecycle \r\n ? new window.KupolaLifecycle()\r\n : {\r\n on: () => () => {},\r\n emit: () => {},\r\n bootstrap: () => {},\r\n mount: () => {},\r\n update: () => {},\r\n unmount: () => {},\r\n destroy: () => {},\r\n state: 'created'\r\n };\r\n this.setupContext = null;\r\n }\r\n\r\n _parseProps() {\r\n const props = {};\r\n for (const attr of this.element.attributes) {\r\n if (attr.name.startsWith('data-prop-')) {\r\n const name = attr.name.replace('data-prop-', '');\r\n let value = attr.value;\r\n try {\r\n value = JSON.parse(value);\r\n } catch (e) {}\r\n props[name] = value;\r\n }\r\n }\r\n return props;\r\n }\r\n\r\n _parseSlots() {\r\n const slots = {};\r\n const slotElements = this.element.querySelectorAll('[data-slot]');\r\n \r\n slotElements.forEach(slotEl => {\r\n const slotName = slotEl.getAttribute('data-slot') || 'default';\r\n slots[slotName] = slotEl.innerHTML.trim();\r\n slotEl.remove();\r\n });\r\n \r\n if (!slots.default && this.element.children.length > 0) {\r\n slots.default = this.element.innerHTML.trim();\r\n }\r\n \r\n return slots;\r\n }\r\n\r\n $slot(name = 'default') {\r\n return this.slots[name] || '';\r\n }\r\n\r\n $emit(eventName, data) {\r\n const handlers = this._eventListeners[eventName] || [];\r\n handlers.forEach(handler => {\r\n try {\r\n handler(data);\r\n } catch (e) {\r\n console.error(`Error in event handler for ${eventName}:`, e);\r\n }\r\n });\r\n \r\n if (this.element) {\r\n const customEvent = new CustomEvent(`kupola:${eventName}`, {\r\n detail: data,\r\n bubbles: true,\r\n cancelable: true\r\n });\r\n this.element.dispatchEvent(customEvent);\r\n }\r\n }\r\n\r\n $on(eventName, handler) {\r\n if (!this._eventListeners[eventName]) {\r\n this._eventListeners[eventName] = [];\r\n }\r\n this._eventListeners[eventName].push(handler);\r\n return handler;\r\n }\r\n\r\n $off(eventName, handler) {\r\n if (this._eventListeners[eventName]) {\r\n this._eventListeners[eventName] = this._eventListeners[eventName].filter(cb => cb !== handler);\r\n }\r\n }\r\n\r\n async setProps(newProps) {\r\n try {\r\n this.props = { ...this.props, ...newProps };\r\n await this.lifecycle.update();\r\n this.setupContext?._executeUpdated();\r\n } catch (error) {\r\n console.error(`[KupolaComponent] Error in setProps for \"${this.constructor.name}\":`, error);\r\n \r\n if (this.lifecycle && typeof this.lifecycle._handleError === 'function') {\r\n await this.lifecycle._handleError({ phase: 'update', hook: 'setProps', error, args: [newProps] });\r\n }\r\n }\r\n }\r\n\r\n async setState(newState) {\r\n try {\r\n this.state = { ...this.state, ...newState };\r\n await this.lifecycle.update();\r\n this.setupContext?._executeUpdated();\r\n } catch (error) {\r\n console.error(`[KupolaComponent] Error in setState for \"${this.constructor.name}\":`, error);\r\n \r\n if (this.lifecycle && typeof this.lifecycle._handleError === 'function') {\r\n await this.lifecycle._handleError({ phase: 'update', hook: 'setState', error, args: [newState] });\r\n }\r\n }\r\n }\r\n\r\n async mount() {\r\n if (this.isMounted || this.isDestroyed) return;\r\n\r\n try {\r\n this._bindLifecycleHooks();\r\n\r\n await this.lifecycle.bootstrap();\r\n\r\n if (window._setCurrentSetupContext && window.SetupContext) {\r\n this.setupContext = new window.SetupContext(this);\r\n window._setCurrentSetupContext(this.setupContext);\r\n \r\n if (typeof this.setup === 'function') {\r\n const result = this.setup();\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n }\r\n }\r\n\r\n this.isMounted = true;\r\n await this.lifecycle.mount();\r\n\r\n this.setupContext?._executeMounted();\r\n \r\n if (window._clearSetupContext) {\r\n window._clearSetupContext();\r\n }\r\n } catch (error) {\r\n console.error(`[KupolaComponent] Error mounting component \"${this.constructor.name}\":`, error);\r\n \r\n if (this.lifecycle && typeof this.lifecycle._handleError === 'function') {\r\n await this.lifecycle._handleError({ phase: 'mount', hook: 'component', error, args: [] });\r\n }\r\n \r\n if (typeof this.renderError === 'function') {\r\n try {\r\n this.renderError(error);\r\n } catch (e) {\r\n console.error(`[KupolaComponent] Error in renderError for \"${this.constructor.name}\":`, e);\r\n }\r\n } else {\r\n this.element.innerHTML = `\r\n <div style=\"padding: 16px; background: #fee2e2; border: 1px solid #fecaca; border-radius: 8px; color: #991b1b;\">\r\n <div style=\"font-weight: bold; margin-bottom: 8px;\">Component Error</div>\r\n <div style=\"font-size: 12px; white-space: pre-wrap;\">${error.message}</div>\r\n </div>\r\n `;\r\n }\r\n }\r\n }\r\n\r\n _bindLifecycleHooks() {\r\n if (this._hooksBound) return;\r\n \r\n const hookMap = {\r\n beforeMount: 'beforeMount',\r\n render: ['mount', 'update'],\r\n afterMount: 'afterMount',\r\n updated: 'afterUpdate',\r\n beforeUnmount: 'beforeUnmount',\r\n afterUnmount: 'afterUnmount',\r\n renderError: 'errorBoundary'\r\n };\r\n \r\n let proto = Object.getPrototypeOf(this);\r\n const registeredHooks = new Set();\r\n \r\n while (proto && proto.constructor !== Object && proto.constructor !== KupolaComponent) {\r\n for (const [methodName, lifecyclePhase] of Object.entries(hookMap)) {\r\n if (registeredHooks.has(methodName)) continue;\r\n \r\n if (proto.hasOwnProperty(methodName)) {\r\n if (Array.isArray(lifecyclePhase)) {\r\n lifecyclePhase.forEach(phase => {\r\n if (methodName === 'render') {\r\n this.lifecycle.on(phase, () => this.render?.());\r\n }\r\n });\r\n } else if (methodName === 'renderError') {\r\n this.lifecycle.on(lifecyclePhase, (errorInfo) => {\r\n this.renderError(errorInfo.error);\r\n return 'handled';\r\n });\r\n } else {\r\n this.lifecycle.on(lifecyclePhase, () => this[methodName]?.());\r\n }\r\n registeredHooks.add(methodName);\r\n }\r\n }\r\n proto = Object.getPrototypeOf(proto);\r\n }\r\n \r\n this._hooksBound = true;\r\n }\r\n\r\n async unmount() {\r\n if (!this.isMounted || this.isDestroyed) return;\r\n\r\n try {\r\n this.setupContext?._executeUnmounted();\r\n \r\n await this.lifecycle.unmount();\r\n this.isMounted = false;\r\n this.isDestroyed = true;\r\n await this.lifecycle.destroy();\r\n } catch (error) {\r\n console.error(`[KupolaComponent] Error unmounting component \"${this.constructor.name}\":`, error);\r\n \r\n if (this.lifecycle && typeof this.lifecycle._handleError === 'function') {\r\n await this.lifecycle._handleError({ phase: 'unmount', hook: 'component', error, args: [] });\r\n }\r\n \r\n this.isMounted = false;\r\n this.isDestroyed = true;\r\n }\r\n }\r\n\r\n beforeMount() {}\r\n afterMount() {}\r\n beforeUnmount() {}\r\n afterUnmount() {}\r\n render() {}\r\n renderError(error) {}\r\n updated() {}\r\n setup() {}\r\n}\r\n\r\nfunction applyMixin(componentClass, mixin) {\r\n Object.keys(mixin).forEach(key => {\r\n if (key === 'constructor') return;\r\n if (typeof mixin[key] === 'function') {\r\n const original = componentClass.prototype[key];\r\n if (original) {\r\n componentClass.prototype[key] = function(...args) {\r\n mixin[key].apply(this, args);\r\n return original.apply(this, args);\r\n };\r\n } else {\r\n componentClass.prototype[key] = mixin[key];\r\n }\r\n } else {\r\n componentClass.prototype[key] = mixin[key];\r\n }\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { KupolaComponent, applyMixin };\r\n} else {\r\n window.KupolaComponent = KupolaComponent;\r\n window.applyMixin = applyMixin;\r\n}","class KupolaComponentRegistry {\r\n constructor() {\r\n this.components = new Map();\r\n this.lazyComponents = new Map();\r\n this.loadedComponents = new Map();\r\n this.instances = new Map();\r\n this.observer = null;\r\n this.mixins = new Map();\r\n this.loadingPromises = new Map();\r\n }\r\n\r\n register(name, componentClass) {\r\n if (!(componentClass.prototype instanceof window.KupolaComponent)) {\r\n throw new Error(`Component ${name} must extend KupolaComponent`);\r\n }\r\n this.components.set(name, componentClass);\r\n }\r\n\r\n registerLazy(name, loader) {\r\n this.lazyComponents.set(name, loader);\r\n }\r\n\r\n unregister(name) {\r\n this.components.delete(name);\r\n this.lazyComponents.delete(name);\r\n this.loadedComponents.delete(name);\r\n this.loadingPromises.delete(name);\r\n }\r\n\r\n get(name) {\r\n return this.components.get(name) || this.loadedComponents.get(name);\r\n }\r\n\r\n async getAsync(name) {\r\n const cached = this.components.get(name) || this.loadedComponents.get(name);\r\n if (cached) return cached;\r\n\r\n if (this.loadingPromises.has(name)) {\r\n return this.loadingPromises.get(name);\r\n }\r\n\r\n const loader = this.lazyComponents.get(name);\r\n if (!loader) {\r\n throw new Error(`Component ${name} not found`);\r\n }\r\n\r\n const loadingPromise = (async () => {\r\n try {\r\n const result = await loader();\r\n const componentClass = result.default || result;\r\n if (!(componentClass.prototype instanceof window.KupolaComponent)) {\r\n throw new Error(`Component ${name} must extend KupolaComponent`);\r\n }\r\n this.loadedComponents.set(name, componentClass);\r\n return componentClass;\r\n } catch (e) {\r\n this.loadingPromises.delete(name);\r\n throw e;\r\n }\r\n })();\r\n\r\n this.loadingPromises.set(name, loadingPromise);\r\n return loadingPromise;\r\n }\r\n\r\n defineMixin(name, mixin) {\r\n this.mixins.set(name, mixin);\r\n }\r\n\r\n useMixin(componentClass, ...mixinNames) {\r\n mixinNames.forEach(name => {\r\n const mixin = this.mixins.get(name);\r\n if (mixin && window.applyMixin) {\r\n window.applyMixin(componentClass, mixin);\r\n }\r\n });\r\n }\r\n\r\n async bootstrap(root = document) {\r\n await this._upgradeElements(root);\r\n this._startObserver(root);\r\n }\r\n\r\n async _upgradeElements(root) {\r\n const elements = root.querySelectorAll('[data-component]');\r\n const promises = [];\r\n elements.forEach(element => {\r\n promises.push(this._upgradeElement(element));\r\n });\r\n await Promise.all(promises);\r\n }\r\n\r\n async _upgradeElement(element) {\r\n if (element.__kupolaInstance || element.__kupolaUpgrading) return;\r\n \r\n element.__kupolaUpgrading = true;\r\n \r\n try {\r\n const componentName = element.getAttribute('data-component');\r\n \r\n if (window.kupolaInitializer && componentName) {\r\n const initializer = window.kupolaInitializer.get(componentName);\r\n if (initializer) {\r\n try {\r\n await initializer(element);\r\n return;\r\n } catch (e) {\r\n console.warn(`[KupolaComponentRegistry] Initializer for \"${componentName}\" failed, trying component class:`, e);\r\n }\r\n }\r\n }\r\n \r\n let ComponentClass = this.components.get(componentName);\r\n \r\n if (!ComponentClass) {\r\n try {\r\n ComponentClass = await this.getAsync(componentName);\r\n } catch (e) {\r\n console.error(`Failed to load component ${componentName}:`, e);\r\n return;\r\n }\r\n \r\n if (!element.isConnected) {\r\n return;\r\n }\r\n }\r\n \r\n const mixinNames = element.getAttribute('data-mixins');\r\n const componentClass = ComponentClass;\r\n if (mixinNames && window.applyMixin) {\r\n mixinNames.split(',').forEach(name => {\r\n const mixin = this.mixins.get(name.trim());\r\n if (mixin) {\r\n window.applyMixin(componentClass, mixin);\r\n }\r\n });\r\n }\r\n \r\n const instance = new componentClass(element);\r\n element.__kupolaInstance = instance;\r\n this.instances.set(element, instance);\r\n instance.mount();\r\n } finally {\r\n element.__kupolaUpgrading = false;\r\n }\r\n }\r\n\r\n _startObserver(root) {\r\n if (this.observer) return;\r\n \r\n this.observer = new MutationObserver((mutations) => {\r\n mutations.forEach(mutation => {\r\n mutation.addedNodes.forEach(node => {\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n if (node.hasAttribute('data-component')) {\r\n this._upgradeElement(node).catch(e => console.error(e));\r\n }\r\n this._upgradeElements(node).catch(e => console.error(e));\r\n }\r\n });\r\n \r\n mutation.removedNodes.forEach(node => {\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n const instance = this.instances.get(node);\r\n if (instance) {\r\n instance.unmount();\r\n this.instances.delete(node);\r\n }\r\n node.querySelectorAll('[data-component]').forEach(child => {\r\n const childInstance = this.instances.get(child);\r\n if (childInstance) {\r\n childInstance.unmount();\r\n this.instances.delete(child);\r\n }\r\n });\r\n }\r\n });\r\n });\r\n });\r\n\r\n this.observer.observe(root, {\r\n childList: true,\r\n subtree: true\r\n });\r\n }\r\n\r\n destroy() {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n this.observer = null;\r\n }\r\n this.instances.forEach(instance => {\r\n instance.unmount();\r\n });\r\n this.instances.clear();\r\n this.components.clear();\r\n this.mixins.clear();\r\n }\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { KupolaComponentRegistry };\r\n} else {\r\n window.KupolaComponentRegistry = KupolaComponentRegistry;\r\n}","class KupolaRouter {\r\n constructor(options = {}) {\r\n this.mode = options.mode || 'hash';\r\n this.routes = options.routes || [];\r\n this.base = options.base || '';\r\n this.currentRoute = null;\r\n this.beforeEachHandlers = [];\r\n this.afterEachHandlers = [];\r\n this.isStarted = false;\r\n this.animationClass = 'fade';\r\n this.componentCache = new Map();\r\n this._routeHandler = () => this._handleRoute();\r\n \r\n this._setupRoutes();\r\n this._bindEvents();\r\n }\r\n\r\n _setupRoutes() {\r\n this.routeMap = new Map();\r\n this._registerRoutes(this.routes, '');\r\n }\r\n\r\n _registerRoutes(routes, parentPath) {\r\n routes.forEach(route => {\r\n const fullPath = route.path.startsWith('/') \r\n ? route.path \r\n : parentPath + (parentPath && !route.path.startsWith('/') ? '/' : '') + route.path;\r\n const pathRegex = this._pathToRegex(fullPath);\r\n this.routeMap.set(fullPath, { ...route, regex: pathRegex, parentPath });\r\n \r\n if (route.children && route.children.length > 0) {\r\n this._registerRoutes(route.children, fullPath);\r\n }\r\n });\r\n }\r\n\r\n _pathToRegex(path) {\r\n const regexStr = path\r\n .replace(/:(\\w+)/g, '([^/]+)')\r\n .replace(/\\*/g, '.*');\r\n return new RegExp(`^${regexStr}$`);\r\n }\r\n\r\n _bindEvents() {\r\n if (this.mode === 'hash') {\r\n window.addEventListener('hashchange', this._routeHandler);\r\n } else {\r\n window.addEventListener('popstate', this._routeHandler);\r\n }\r\n }\r\n\r\n _handleRoute() {\r\n const path = this._getCurrentPath();\r\n this.navigate(path);\r\n }\r\n\r\n _getCurrentPath() {\r\n if (this.mode === 'hash') {\r\n return location.hash.slice(1) || '/';\r\n }\r\n return location.pathname.replace(this.base, '') || '/';\r\n }\r\n\r\n async navigate(path, replace = false) {\r\n const route = this._matchRoute(path);\r\n if (!route) return;\r\n\r\n const from = this.currentRoute;\r\n \r\n for (const handler of this.beforeEachHandlers) {\r\n const result = await handler(route, from);\r\n if (result === false) return;\r\n }\r\n\r\n this.currentRoute = route;\r\n this._updateURL(path, replace);\r\n await this._renderRoute(route);\r\n\r\n for (const handler of this.afterEachHandlers) {\r\n handler(route);\r\n }\r\n }\r\n\r\n _matchRoute(path) {\r\n for (const [, route] of this.routeMap) {\r\n const match = path.match(route.regex);\r\n if (match) {\r\n const params = {};\r\n const paramNames = route.path.match(/:(\\w+)/g) || [];\r\n paramNames.forEach((name, index) => {\r\n params[name.slice(1)] = match[index + 1];\r\n });\r\n \r\n const query = this._parseQuery();\r\n \r\n return {\r\n ...route,\r\n params,\r\n query,\r\n fullPath: path\r\n };\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n _parseQuery() {\r\n const search = location.search.slice(1);\r\n const params = {};\r\n if (search) {\r\n search.split('&').forEach(pair => {\r\n const [key, value] = pair.split('=');\r\n params[key] = decodeURIComponent(value || '');\r\n });\r\n }\r\n return params;\r\n }\r\n\r\n _updateURL(path, replace) {\r\n if (this.mode === 'hash') {\r\n const url = `#${path}`;\r\n if (replace) {\r\n location.replace(url);\r\n } else {\r\n location.hash = path;\r\n }\r\n } else {\r\n const url = this.base + path + location.search;\r\n if (replace) {\r\n history.replaceState({}, '', url);\r\n } else {\r\n history.pushState({}, '', url);\r\n }\r\n }\r\n }\r\n\r\n async _renderRoute(route) {\r\n if (route.parentPath && route.parentPath !== '') {\r\n await this._renderNestedRoute(route);\r\n } else {\r\n await this._renderRootRoute(route);\r\n }\r\n }\r\n\r\n async _renderRootRoute(route) {\r\n const container = document.querySelector('[data-router-view]');\r\n if (!container || !route.component) return;\r\n \r\n this._cleanupContainerComponents(container);\r\n \r\n container.classList.add('router-view-leave');\r\n container.classList.remove('router-view-enter');\r\n \r\n await this._waitForAnimation(container);\r\n \r\n const componentName = await this._resolveComponent(route.component);\r\n if (!componentName) return;\r\n \r\n const componentElement = document.createElement('div');\r\n componentElement.setAttribute('data-component', componentName);\r\n componentElement.classList.add('router-view-enter');\r\n \r\n Object.keys(route.params).forEach(key => {\r\n componentElement.setAttribute(`data-prop-${key}`, route.params[key]);\r\n });\r\n \r\n container.innerHTML = '';\r\n container.appendChild(componentElement);\r\n \r\n if (window.kupolaRegistry) {\r\n await window.kupolaRegistry.bootstrap(container);\r\n }\r\n \r\n setTimeout(() => {\r\n container.classList.remove('router-view-leave');\r\n componentElement.classList.remove('router-view-enter');\r\n }, 10);\r\n }\r\n\r\n async _renderNestedRoute(route) {\r\n const parentRoute = this.routeMap.get(route.parentPath);\r\n if (!parentRoute) return;\r\n \r\n const rootContainer = document.querySelector('[data-router-view]');\r\n if (!rootContainer) return;\r\n \r\n const existingParent = document.querySelector(`[data-component=\"${parentRoute.component}\"]`);\r\n \r\n if (!existingParent) {\r\n this._cleanupContainerComponents(rootContainer);\r\n \r\n rootContainer.classList.add('router-view-leave');\r\n rootContainer.classList.remove('router-view-enter');\r\n \r\n await this._waitForAnimation(rootContainer);\r\n \r\n const parentName = await this._resolveComponent(parentRoute.component);\r\n if (!parentName) return;\r\n \r\n const parentElement = document.createElement('div');\r\n parentElement.setAttribute('data-component', parentName);\r\n \r\n rootContainer.innerHTML = '';\r\n rootContainer.appendChild(parentElement);\r\n \r\n if (window.kupolaRegistry) {\r\n await window.kupolaRegistry.bootstrap(rootContainer);\r\n }\r\n \r\n setTimeout(() => {\r\n rootContainer.classList.remove('router-view-leave');\r\n }, 50);\r\n \r\n await this._renderChildComponent(route);\r\n } else {\r\n await this._renderChildComponent(route);\r\n }\r\n }\r\n\r\n async _renderChildComponent(route) {\r\n const parentElement = document.querySelector(`[data-component=\"${this._getParentComponent(route.parentPath)}\"]`);\r\n if (!parentElement) return;\r\n \r\n const container = parentElement.querySelector('[data-router-view]');\r\n if (!container || !route.component) return;\r\n \r\n const componentName = await this._resolveComponent(route.component);\r\n if (!componentName) return;\r\n \r\n const componentElement = document.createElement('div');\r\n componentElement.setAttribute('data-component', componentName);\r\n componentElement.classList.add('router-view-enter');\r\n \r\n Object.keys(route.params).forEach(key => {\r\n componentElement.setAttribute(`data-prop-${key}`, route.params[key]);\r\n });\r\n \r\n container.innerHTML = '';\r\n container.appendChild(componentElement);\r\n \r\n if (window.kupolaRegistry) {\r\n await window.kupolaRegistry.bootstrap(container);\r\n }\r\n \r\n setTimeout(() => {\r\n componentElement.classList.remove('router-view-enter');\r\n }, 10);\r\n }\r\n\r\n async _resolveComponent(component) {\r\n if (typeof component === 'function') {\r\n const cacheKey = component.toString();\r\n if (this.componentCache.has(cacheKey)) {\r\n return this.componentCache.get(cacheKey);\r\n }\r\n \r\n try {\r\n const result = await component();\r\n const componentClass = result.default || result;\r\n \r\n const componentName = `lazy-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n if (window.kupolaRegistry) {\r\n window.kupolaRegistry.register(componentName, componentClass);\r\n }\r\n \r\n this.componentCache.set(cacheKey, componentName);\r\n return componentName;\r\n } catch (e) {\r\n console.error('Failed to load lazy component:', e);\r\n return null;\r\n }\r\n }\r\n \r\n if (typeof component === 'string' && component.startsWith('lazy:')) {\r\n const componentName = component.slice(5);\r\n if (window.kupolaRegistry) {\r\n try {\r\n await window.kupolaRegistry.getAsync(componentName);\r\n } catch (e) {\r\n console.error(`Failed to load lazy component ${componentName}:`, e);\r\n return null;\r\n }\r\n }\r\n return componentName;\r\n }\r\n \r\n return component;\r\n }\r\n\r\n _getParentComponent(parentPath) {\r\n for (const [path, route] of this.routeMap) {\r\n if (path === parentPath) {\r\n return route.component;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n setAnimation(name) {\r\n this.animationClass = name;\r\n }\r\n\r\n push(path) {\r\n this.navigate(path, false);\r\n }\r\n\r\n replace(path) {\r\n this.navigate(path, true);\r\n }\r\n\r\n go(delta) {\r\n history.go(delta);\r\n }\r\n\r\n back() {\r\n history.back();\r\n }\r\n\r\n forward() {\r\n history.forward();\r\n }\r\n\r\n beforeEach(handler) {\r\n this.beforeEachHandlers.push(handler);\r\n }\r\n\r\n afterEach(handler) {\r\n this.afterEachHandlers.push(handler);\r\n }\r\n\r\n _waitForAnimation(element) {\r\n return new Promise(resolve => {\r\n const transitionDuration = this._getTransitionDuration(element);\r\n if (transitionDuration > 0) {\r\n const cleanup = () => {\r\n element.removeEventListener('transitionend', cleanup);\r\n element.removeEventListener('animationend', cleanup);\r\n resolve();\r\n };\r\n element.addEventListener('transitionend', cleanup);\r\n element.addEventListener('animationend', cleanup);\r\n setTimeout(cleanup, transitionDuration + 100);\r\n } else {\r\n resolve();\r\n }\r\n });\r\n }\r\n\r\n _getTransitionDuration(element) {\r\n const style = window.getComputedStyle(element);\r\n const transitionDuration = parseFloat(style.transitionDuration) || 0;\r\n const animationDuration = parseFloat(style.animationDuration) || 0;\r\n return Math.max(transitionDuration, animationDuration) * 1000;\r\n }\r\n\r\n _cleanupContainerComponents(container) {\r\n const components = container.querySelectorAll('[data-component]');\r\n components.forEach(element => {\r\n const instance = element.__kupolaInstance;\r\n if (instance && typeof instance.unmount === 'function') {\r\n instance.unmount().catch(e => console.error(`Error unmounting component:`, e));\r\n }\r\n });\r\n \r\n if (window.kupolaInitializer) {\r\n const allElements = container.querySelectorAll('[data-component], [data-dropdown], [data-select], [data-datepicker], [data-timepicker], [data-slider], [data-carousel], [data-drawer], [data-modal], [data-dialog], [data-color-picker], [data-calendar], [data-slide-captcha], [data-heatmap]');\r\n allElements.forEach(element => {\r\n window.kupolaInitializer.cleanup(element);\r\n });\r\n }\r\n }\r\n\r\n destroy() {\r\n if (this.mode === 'hash') {\r\n window.removeEventListener('hashchange', this._routeHandler);\r\n } else {\r\n window.removeEventListener('popstate', this._routeHandler);\r\n }\r\n this.routes = [];\r\n this.routeMap.clear();\r\n this.beforeEachHandlers = [];\r\n this.afterEachHandlers = [];\r\n }\r\n}\r\n\r\nfunction createRouter(options) {\r\n return new KupolaRouter(options);\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { KupolaRouter, createRouter };\r\n} else {\r\n window.KupolaRouter = KupolaRouter;\r\n window.createRouter = createRouter;\r\n}","class KupolaHttp {\r\n constructor(options = {}) {\r\n this.baseURL = options.baseURL || '';\r\n this.timeout = options.timeout || 30000;\r\n this.headers = options.headers || {};\r\n this.cache = new Map();\r\n this.cacheTTL = options.cacheTTL || 60000;\r\n this.maxRetries = options.maxRetries || 0;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.activeRequests = new Map();\r\n this.withCredentials = options.withCredentials || false;\r\n\r\n this._useAxios = typeof axios !== 'undefined';\r\n if (this._useAxios) {\r\n this._initAxios(options);\r\n }\r\n \r\n if (options.interceptors) {\r\n this.interceptors = options.interceptors;\r\n }\r\n }\r\n\r\n _initAxios(options) {\r\n this.axios = axios.create({\r\n baseURL: this.baseURL,\r\n timeout: this.timeout,\r\n headers: this.headers\r\n });\r\n \r\n this.axios.defaults.withCredentials = options.withCredentials || false;\r\n }\r\n\r\n _generateCacheKey(config) {\r\n const { url, method = 'GET', params = {}, data = null } = config;\r\n const query = params ? new URLSearchParams(params).toString() : '';\r\n const dataKey = data ? JSON.stringify(data) : '';\r\n return `${method}:${url}:${query}:${dataKey}`;\r\n }\r\n\r\n _getCache(key) {\r\n const cached = this.cache.get(key);\r\n if (cached && Date.now() - cached.timestamp < this.cacheTTL) {\r\n return cached.data;\r\n }\r\n this.cache.delete(key);\r\n return null;\r\n }\r\n\r\n _setCache(key, data) {\r\n this.cache.set(key, { data, timestamp: Date.now() });\r\n }\r\n\r\n async _requestWithRetry(config, retryCount = 0) {\r\n try {\r\n return await this._request(config);\r\n } catch (error) {\r\n if (retryCount < this.maxRetries) {\r\n await new Promise(resolve => setTimeout(resolve, this.retryDelay * Math.pow(2, retryCount)));\r\n return this._requestWithRetry(config, retryCount + 1);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async _request(config) {\r\n const { \r\n url, \r\n method = 'GET', \r\n headers = {}, \r\n params = {}, \r\n data = null, \r\n timeout = this.timeout,\r\n cache = false\r\n } = config;\r\n\r\n const cacheKey = this._generateCacheKey({ url, method, params, data });\r\n \r\n if (cache && method === 'GET') {\r\n const cached = this._getCache(cacheKey);\r\n if (cached) {\r\n return cached;\r\n }\r\n }\r\n\r\n const controller = new AbortController();\r\n this.activeRequests.set(cacheKey, controller);\r\n\r\n const requestHeaders = { ...this.headers, ...headers };\r\n \r\n if (!requestHeaders['Content-Type'] && data && !(data instanceof FormData)) {\r\n requestHeaders['Content-Type'] = 'application/json';\r\n }\r\n\r\n let requestConfig = {\r\n url: this.baseURL ? new URL(url, this.baseURL).toString() : url,\r\n method,\r\n headers: requestHeaders,\r\n signal: controller.signal,\r\n credentials: this.withCredentials ? 'include' : 'same-origin'\r\n };\r\n\r\n if (Object.keys(params).length > 0) {\r\n const urlObj = new URL(requestConfig.url);\r\n Object.keys(params).forEach(key => {\r\n urlObj.searchParams.append(key, params[key]);\r\n });\r\n requestConfig.url = urlObj.toString();\r\n }\r\n\r\n if (data !== null) {\r\n requestConfig.body = data instanceof FormData ? data : JSON.stringify(data);\r\n }\r\n\r\n if (this.interceptors && this.interceptors.request) {\r\n try {\r\n const intercepted = await this.interceptors.request(requestConfig);\r\n if (intercepted) requestConfig = intercepted;\r\n } catch (error) {\r\n this.activeRequests.delete(cacheKey);\r\n if (this.interceptors.requestError) {\r\n return this.interceptors.requestError(error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n try {\r\n let response;\r\n if (this._useAxios) {\r\n const axiosConfig = {\r\n url: requestConfig.url.replace(this.baseURL, ''),\r\n method: requestConfig.method,\r\n headers: requestConfig.headers,\r\n signal: requestConfig.signal,\r\n timeout\r\n };\r\n if (data !== null) axiosConfig.data = data;\r\n if (params && Object.keys(params).length > 0) axiosConfig.params = params;\r\n \r\n response = await this.axios(axiosConfig);\r\n } else {\r\n response = await this._fetchWithTimeout(requestConfig, timeout);\r\n \r\n if (!response.ok) {\r\n const error = new Error(`HTTP error! status: ${response.status}`);\r\n error.status = response.status;\r\n error.statusText = response.statusText;\r\n throw error;\r\n }\r\n }\r\n \r\n const result = {\r\n data: this._useAxios ? response.data : await this._parseResponse(response),\r\n status: this._useAxios ? response.status : response.status,\r\n statusText: this._useAxios ? response.statusText : response.statusText,\r\n headers: this._useAxios ? response.headers : this._parseHeaders(response.headers),\r\n config: requestConfig\r\n };\r\n \r\n if (this.interceptors && this.interceptors.response) {\r\n return this.interceptors.response(result);\r\n }\r\n \r\n if (cache && method === 'GET') {\r\n this._setCache(cacheKey, result);\r\n }\r\n \r\n return result;\r\n } catch (error) {\r\n if (error.name === 'AbortError' || (this._useAxios && error.code === 'ERR_CANCELED')) {\r\n return null;\r\n }\r\n if (this.interceptors && this.interceptors.responseError) {\r\n return this.interceptors.responseError(error);\r\n }\r\n throw error;\r\n } finally {\r\n this.activeRequests.delete(cacheKey);\r\n }\r\n }\r\n\r\n async _fetchWithTimeout(config, timeout) {\r\n const controller = new AbortController();\r\n const signal = controller.signal;\r\n \r\n const timeoutPromise = new Promise((_, reject) => {\r\n const timerId = setTimeout(() => {\r\n controller.abort();\r\n reject(new Error('Request timeout'));\r\n }, timeout);\r\n \r\n signal.addEventListener('abort', () => {\r\n clearTimeout(timerId);\r\n });\r\n });\r\n \r\n const fetchPromise = fetch({ ...config, signal });\r\n \r\n return Promise.race([fetchPromise, timeoutPromise]);\r\n }\r\n\r\n async _parseResponse(response) {\r\n const contentType = response.headers.get('content-type');\r\n if (contentType && contentType.includes('application/json')) {\r\n return response.json();\r\n }\r\n return response.text();\r\n }\r\n\r\n _parseHeaders(headers) {\r\n const result = {};\r\n headers.forEach((value, key) => {\r\n result[key] = value;\r\n });\r\n return result;\r\n }\r\n\r\n cancelRequest(url, params = {}, method = 'GET', data = null) {\r\n const cacheKey = this._generateCacheKey({ url, method, params, data });\r\n if (this.activeRequests.has(cacheKey)) {\r\n this.activeRequests.get(cacheKey).abort();\r\n this.activeRequests.delete(cacheKey);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n cancelAllRequests() {\r\n this.activeRequests.forEach((controller) => {\r\n controller.abort();\r\n });\r\n this.activeRequests.clear();\r\n }\r\n\r\n clearCache() {\r\n this.cache.clear();\r\n }\r\n\r\n clearCacheByUrl(url) {\r\n this.cache.forEach((_, key) => {\r\n if (key.startsWith(`GET:${url}`)) {\r\n this.cache.delete(key);\r\n }\r\n });\r\n }\r\n\r\n get(url, config = {}) {\r\n const useCache = config.cache ?? true;\r\n const useRetry = config.retry ?? this.maxRetries > 0;\r\n \r\n const requestConfig = { ...config, url, method: 'GET', cache: useCache };\r\n \r\n if (useRetry) {\r\n return this._requestWithRetry(requestConfig);\r\n }\r\n return this._request(requestConfig);\r\n }\r\n\r\n post(url, data = null, config = {}) {\r\n const useRetry = config.retry ?? this.maxRetries > 0;\r\n const requestConfig = { ...config, url, method: 'POST', data, cache: false };\r\n \r\n if (useRetry) {\r\n return this._requestWithRetry(requestConfig);\r\n }\r\n return this._request(requestConfig);\r\n }\r\n\r\n async uploadFile(url, file, options = {}) {\r\n const {\r\n chunkSize = 2 * 1024 * 1024,\r\n onProgress,\r\n headers = {},\r\n parallel = false\r\n } = options;\r\n\r\n const totalChunks = Math.ceil(file.size / chunkSize);\r\n let uploadedChunks = 0;\r\n let progress = 0;\r\n\r\n const fileId = this._generateFileId(file);\r\n\r\n if (parallel) {\r\n const promises = [];\r\n for (let i = 0; i < totalChunks; i++) {\r\n const promise = this._uploadChunk(url, file, i, totalChunks, chunkSize, fileId, headers)\r\n .then(() => {\r\n uploadedChunks++;\r\n progress = Math.round((uploadedChunks / totalChunks) * 100);\r\n \r\n if (onProgress) {\r\n onProgress({\r\n progress,\r\n uploaded: uploadedChunks * chunkSize,\r\n total: file.size,\r\n currentChunk: uploadedChunks,\r\n totalChunks\r\n });\r\n }\r\n });\r\n promises.push(promise);\r\n }\r\n await Promise.all(promises);\r\n return this._completeUpload(url, fileId, totalChunks, file.name);\r\n }\r\n\r\n for (let i = 0; i < totalChunks; i++) {\r\n await this._uploadChunk(url, file, i, totalChunks, chunkSize, fileId, headers);\r\n \r\n uploadedChunks++;\r\n progress = Math.round((uploadedChunks / totalChunks) * 100);\r\n \r\n if (onProgress) {\r\n onProgress({\r\n progress,\r\n uploaded: uploadedChunks * chunkSize,\r\n total: file.size,\r\n currentChunk: i + 1,\r\n totalChunks\r\n });\r\n }\r\n }\r\n\r\n return this._completeUpload(url, fileId, totalChunks, file.name);\r\n }\r\n\r\n async _uploadChunk(url, file, chunkIndex, totalChunks, chunkSize, fileId, headers) {\r\n const start = chunkIndex * chunkSize;\r\n const end = Math.min(start + chunkSize, file.size);\r\n const chunk = file.slice(start, end);\r\n\r\n const formData = new FormData();\r\n formData.append('chunk', chunk);\r\n formData.append('chunkIndex', chunkIndex);\r\n formData.append('totalChunks', totalChunks);\r\n formData.append('fileId', fileId);\r\n formData.append('fileName', file.name);\r\n formData.append('fileSize', file.size);\r\n\r\n return this.post(`${url}/chunk`, formData, { headers });\r\n }\r\n\r\n async _completeUpload(url, fileId, totalChunks, fileName) {\r\n return this.post(`${url}/complete`, { fileId, totalChunks, fileName });\r\n }\r\n\r\n _generateFileId(file) {\r\n const hash = `${file.name}-${file.size}-${file.lastModified}`;\r\n let result = 0;\r\n for (let i = 0; i < hash.length; i++) {\r\n result = ((result << 5) - result) + hash.charCodeAt(i);\r\n result |= 0;\r\n }\r\n return Math.abs(result).toString(36) + Date.now().toString(36);\r\n }\r\n\r\n put(url, data = null, config = {}) {\r\n const useRetry = config.retry ?? this.maxRetries > 0;\r\n const requestConfig = { ...config, url, method: 'PUT', data, cache: false };\r\n \r\n if (useRetry) {\r\n return this._requestWithRetry(requestConfig);\r\n }\r\n return this._request(requestConfig);\r\n }\r\n\r\n delete(url, config = {}) {\r\n const useRetry = config.retry ?? this.maxRetries > 0;\r\n const requestConfig = { ...config, url, method: 'DELETE', cache: false };\r\n \r\n if (useRetry) {\r\n return this._requestWithRetry(requestConfig);\r\n }\r\n return this._request(requestConfig);\r\n }\r\n\r\n patch(url, data = null, config = {}) {\r\n const useRetry = config.retry ?? this.maxRetries > 0;\r\n const requestConfig = { ...config, url, method: 'PATCH', data, cache: false };\r\n \r\n if (useRetry) {\r\n return this._requestWithRetry(requestConfig);\r\n }\r\n return this._request(requestConfig);\r\n }\r\n\r\n setHeader(name, value) {\r\n this.headers[name] = value;\r\n if (this.axios) {\r\n this.axios.defaults.headers.common[name] = value;\r\n }\r\n }\r\n\r\n setToken(token, type = 'Bearer') {\r\n this.headers['Authorization'] = `${type} ${token}`;\r\n if (this.axios) {\r\n this.axios.defaults.headers.common['Authorization'] = `${type} ${token}`;\r\n }\r\n }\r\n\r\n setCacheTTL(ttl) {\r\n this.cacheTTL = ttl;\r\n }\r\n\r\n setMaxRetries(retries) {\r\n this.maxRetries = retries;\r\n }\r\n}\r\n\r\nfunction createHttp(options) {\r\n return new KupolaHttp(options);\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { KupolaHttp, createHttp };\r\n} else {\r\n window.KupolaHttp = KupolaHttp;\r\n window.createHttp = createHttp;\r\n}","class ComponentInitializerRegistry {\r\n constructor() {\r\n this.initializers = new Map();\r\n this.cleanupFunctions = new Map();\r\n this.processedElements = new WeakSet();\r\n }\r\n\r\n register(name, initFn, cleanupFn = null) {\r\n this.initializers.set(name, initFn);\r\n if (cleanupFn) {\r\n this.cleanupFunctions.set(name, cleanupFn);\r\n }\r\n }\r\n\r\n unregister(name) {\r\n this.initializers.delete(name);\r\n this.cleanupFunctions.delete(name);\r\n }\r\n\r\n has(name) {\r\n return this.initializers.has(name);\r\n }\r\n\r\n get(name) {\r\n return this.initializers.get(name);\r\n }\r\n\r\n async initialize(element) {\r\n if (this.processedElements.has(element)) return;\r\n\r\n const dataAttrs = ['data-component', 'data-dropdown', 'data-select', 'data-datepicker', \r\n 'data-timepicker', 'data-slider', 'data-carousel', 'data-drawer', \r\n 'data-modal', 'data-dialog', 'data-color-picker', 'data-calendar',\r\n 'data-slide-captcha', 'data-heatmap'];\r\n\r\n for (const attr of dataAttrs) {\r\n const value = element.getAttribute(attr);\r\n if (value) {\r\n const name = value || attr.replace('data-', '');\r\n const initFn = this.initializers.get(name) || this.initializers.get(attr.replace('data-', ''));\r\n \r\n if (initFn) {\r\n try {\r\n await initFn(element);\r\n this.processedElements.add(element);\r\n } catch (error) {\r\n console.error(`[ComponentInitializerRegistry] Error initializing \"${name}\":`, error);\r\n }\r\n return;\r\n }\r\n }\r\n }\r\n\r\n const className = element.className;\r\n const classSelectors = [\r\n '.ds-dropdown', '.ds-select', '.ds-datepicker', '.ds-timepicker', \r\n '.ds-slider', '.ds-carousel', '.ds-drawer', '.ds-modal', '.ds-dialog',\r\n '.ds-color-picker', '.ds-calendar', '.ds-slider-captcha', '.ds-heatmap',\r\n '.ds-tooltip', '.ds-tag', '.ds-statcard', '.ds-collapse', '.ds-fileupload',\r\n '.ds-notification', '.ds-message'\r\n ];\r\n\r\n for (const selector of classSelectors) {\r\n const classNamePart = selector.replace('.', '');\r\n if (className.includes(classNamePart)) {\r\n const name = classNamePart.replace('ds-', '');\r\n const initFn = this.initializers.get(name) || this.initializers.get(classNamePart);\r\n \r\n if (initFn) {\r\n try {\r\n await initFn(element);\r\n this.processedElements.add(element);\r\n } catch (error) {\r\n console.error(`[ComponentInitializerRegistry] Error initializing \"${name}\":`, error);\r\n }\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n\r\n cleanup(element) {\r\n const dataAttrs = ['data-component', 'data-dropdown', 'data-select', 'data-datepicker', \r\n 'data-timepicker', 'data-slider', 'data-carousel', 'data-drawer', \r\n 'data-modal', 'data-dialog', 'data-color-picker', 'data-calendar',\r\n 'data-slide-captcha', 'data-heatmap'];\r\n\r\n for (const attr of dataAttrs) {\r\n const value = element.getAttribute(attr);\r\n if (value) {\r\n const name = value || attr.replace('data-', '');\r\n const cleanupFn = this.cleanupFunctions.get(name) || this.cleanupFunctions.get(attr.replace('data-', ''));\r\n \r\n if (cleanupFn) {\r\n try {\r\n cleanupFn(element);\r\n } catch (error) {\r\n console.error(`[ComponentInitializerRegistry] Error cleaning up \"${name}\":`, error);\r\n }\r\n this.processedElements.delete(element);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n const className = element.className;\r\n const classSelectors = [\r\n '.ds-dropdown', '.ds-select', '.ds-datepicker', '.ds-timepicker', \r\n '.ds-slider', '.ds-carousel', '.ds-drawer', '.ds-modal', '.ds-dialog',\r\n '.ds-color-picker', '.ds-calendar', '.ds-slider-captcha', '.ds-heatmap',\r\n '.ds-tooltip', '.ds-tag', '.ds-statcard', '.ds-collapse', '.ds-fileupload',\r\n '.ds-notification', '.ds-message'\r\n ];\r\n\r\n for (const selector of classSelectors) {\r\n const classNamePart = selector.replace('.', '');\r\n if (className.includes(classNamePart)) {\r\n const name = classNamePart.replace('ds-', '');\r\n const cleanupFn = this.cleanupFunctions.get(name) || this.cleanupFunctions.get(classNamePart);\r\n \r\n if (cleanupFn) {\r\n try {\r\n cleanupFn(element);\r\n } catch (error) {\r\n console.error(`[ComponentInitializerRegistry] Error cleaning up \"${name}\":`, error);\r\n }\r\n this.processedElements.delete(element);\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n\r\n async initializeAll(root = document) {\r\n const elements = root.querySelectorAll('[data-component], [data-dropdown], [data-select], ' +\r\n '[data-datepicker], [data-timepicker], [data-slider], [data-carousel], ' +\r\n '[data-drawer], [data-modal], [data-dialog], [data-color-picker], ' +\r\n '[data-calendar], [data-slide-captcha], [data-heatmap], ' +\r\n '.ds-dropdown, .ds-select, .ds-datepicker, .ds-timepicker, ' +\r\n '.ds-slider, .ds-carousel, .ds-drawer, .ds-modal, .ds-dialog, ' +\r\n '.ds-color-picker, .ds-calendar, .ds-slider-captcha, .ds-heatmap, ' +\r\n '.ds-tooltip, .ds-tag, .ds-statcard, .ds-collapse, .ds-fileupload, ' +\r\n '.ds-notification, .ds-message');\r\n\r\n const promises = [];\r\n elements.forEach(element => {\r\n if (!this.processedElements.has(element)) {\r\n promises.push(this.initialize(element));\r\n }\r\n });\r\n await Promise.all(promises);\r\n }\r\n}\r\n\r\nconst kupolaInitializer = new ComponentInitializerRegistry();\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { ComponentInitializerRegistry, kupolaInitializer };\r\n} else {\r\n window.ComponentInitializerRegistry = ComponentInitializerRegistry;\r\n window.kupolaInitializer = kupolaInitializer;\r\n}","if (typeof window === 'undefined') {\r\n const { KupolaComponent, applyMixin } = require('./component.js');\r\n const { KupolaComponentRegistry } = require('./registry.js');\r\n const { KupolaRouter, createRouter } = require('./router.js');\r\n const { KupolaHttp, createHttp } = require('./http.js');\r\n \r\n module.exports = {\r\n KupolaComponent,\r\n applyMixin,\r\n KupolaComponentRegistry,\r\n KupolaRouter,\r\n KupolaHttp,\r\n createRouter,\r\n createHttp\r\n };\r\n}\r\n\r\nif (window.KupolaComponentRegistry) {\r\n window.kupolaRegistry = new window.KupolaComponentRegistry();\r\n}\r\n\r\nasync function kupolaBootstrap() {\r\n if (window.kupolaData) {\r\n window.kupolaData.loadPersisted();\r\n }\r\n if (window.kupolaRegistry) {\r\n await window.kupolaRegistry.bootstrap();\r\n }\r\n}\r\n\r\nif (document.readyState === 'loading') {\r\n document.addEventListener('DOMContentLoaded', kupolaBootstrap);\r\n} else {\r\n setTimeout(kupolaBootstrap, 0);\r\n}\r\n\r\nwindow.registerComponent = function(name, componentClass) {\r\n if (window.kupolaRegistry) {\r\n window.kupolaRegistry.register(name, componentClass);\r\n }\r\n};\r\n\r\nwindow.registerLazyComponent = function(name, loader) {\r\n if (window.kupolaRegistry) {\r\n window.kupolaRegistry.registerLazy(name, loader);\r\n }\r\n};\r\n\r\nwindow.bootstrapComponents = function(root) {\r\n if (window.kupolaRegistry) {\r\n return window.kupolaRegistry.bootstrap(root);\r\n }\r\n return Promise.resolve();\r\n};\r\n\r\nwindow.defineMixin = function(name, mixin) {\r\n if (window.kupolaRegistry) {\r\n window.kupolaRegistry.defineMixin(name, mixin);\r\n }\r\n};\r\n\r\nwindow.useMixin = function(componentClass, ...mixinNames) {\r\n if (window.kupolaRegistry) {\r\n window.kupolaRegistry.useMixin(componentClass, ...mixinNames);\r\n }\r\n};","class KupolaLifecycle {\r\n constructor(scope = 'app') {\r\n this.scope = scope;\r\n this.hooks = new Map();\r\n this.state = 'created';\r\n this.stateHistory = ['created'];\r\n this.transitions = new Map([\r\n ['created', ['bootstrapped', 'destroyed']],\r\n ['bootstrapped', ['mounted', 'destroyed']],\r\n ['mounted', ['updated', 'unmounted', 'destroyed']],\r\n ['updated', ['updated', 'unmounted', 'destroyed']],\r\n ['unmounted', ['mounted', 'destroyed']],\r\n ['destroyed', []]\r\n ]);\r\n \r\n this.phaseStateMap = {\r\n 'bootstrap': { from: 'created', to: 'bootstrapped' },\r\n 'mount': { from: ['bootstrapped', 'unmounted'], to: 'mounted' },\r\n 'update': { from: ['mounted', 'updated'], to: 'updated' },\r\n 'unmount': { from: ['mounted', 'updated'], to: 'unmounted' },\r\n 'destroy': { from: ['bootstrapped', 'mounted', 'updated', 'unmounted'], to: 'destroyed' }\r\n };\r\n\r\n this.basePhases = ['bootstrap', 'mount', 'update', 'unmount', 'destroy'];\r\n this.allPhases = ['error', 'errorBoundary'];\r\n \r\n this.basePhases.forEach(phase => {\r\n this.allPhases.push(`before${phase.charAt(0).toUpperCase() + phase.slice(1)}`);\r\n this.allPhases.push(phase);\r\n this.allPhases.push(`after${phase.charAt(0).toUpperCase() + phase.slice(1)}`);\r\n });\r\n \r\n this.allPhases.forEach(phase => {\r\n this.hooks.set(phase, []);\r\n });\r\n \r\n this.pendingHooks = new Set();\r\n this.trace = [];\r\n this.errorHandler = null;\r\n this.errorBoundary = null;\r\n this.lastError = null;\r\n this.errorCount = 0;\r\n this.maxErrors = 10;\r\n this._onErrorCallback = null;\r\n }\r\n\r\n _validateTransition(nextState) {\r\n const allowed = this.transitions.get(this.state);\r\n if (!allowed || !allowed.includes(nextState)) {\r\n throw new Error(`Invalid state transition: ${this.state} -> ${nextState}`);\r\n }\r\n return true;\r\n }\r\n\r\n _updateState(nextState) {\r\n this._validateTransition(nextState);\r\n this.state = nextState;\r\n this.stateHistory.push(nextState);\r\n }\r\n\r\n _resetResolved(phase) {\r\n const handlers = this.hooks.get(phase);\r\n if (handlers) {\r\n handlers.forEach(hook => {\r\n hook.resolved = false;\r\n });\r\n }\r\n }\r\n\r\n on(phase, handler, options = {}) {\r\n if (!this.allPhases.includes(phase)) {\r\n throw new Error(`Unknown lifecycle phase: ${phase}`);\r\n }\r\n \r\n const hooks = this.hooks.get(phase);\r\n hooks.push({\r\n handler,\r\n priority: options.priority || 0,\r\n depends: options.depends || [],\r\n name: options.name || handler.name || `anonymous_${hooks.length}`\r\n });\r\n \r\n hooks.sort((a, b) => b.priority - a.priority);\r\n \r\n return () => {\r\n const index = hooks.findIndex(h => h.handler === handler);\r\n if (index > -1) {\r\n hooks.splice(index, 1);\r\n }\r\n };\r\n }\r\n\r\n async _resolveDepends(depends, phase) {\r\n if (!depends || depends.length === 0) return;\r\n \r\n for (const depName of depends) {\r\n const phaseHooks = this.hooks.get(phase);\r\n const depHook = phaseHooks.find(h => h.name === depName);\r\n if (depHook && !depHook.resolved) {\r\n await depHook.handler();\r\n depHook.resolved = true;\r\n }\r\n }\r\n }\r\n\r\n async emit(phase, ...args) {\r\n if (this.state === 'destroyed' && phase !== 'error') return;\r\n \r\n const handlers = this.hooks.get(phase);\r\n if (!handlers || handlers.length === 0) return;\r\n\r\n const emitId = `${phase}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n this.pendingHooks.add(emitId);\r\n\r\n const startTime = performance.now();\r\n \r\n try {\r\n for (const hook of handlers) {\r\n await this._resolveDepends(hook.depends, phase);\r\n \r\n const hookStartTime = performance.now();\r\n let hookResult, hookError;\r\n \r\n try {\r\n hookResult = hook.handler(...args);\r\n if (hookResult instanceof Promise) {\r\n await hookResult;\r\n }\r\n hook.resolved = true;\r\n } catch (error) {\r\n hookError = error;\r\n console.error(`[KupolaLifecycle] Error in ${phase} hook \"${hook.name}\":`, error);\r\n \r\n if (phase !== 'error') {\r\n await this._handleError({ phase, hook: hook.name, error, args });\r\n }\r\n }\r\n \r\n const hookDuration = performance.now() - hookStartTime;\r\n \r\n this.trace.push({\r\n emitId,\r\n phase,\r\n hookName: hook.name,\r\n duration: hookDuration,\r\n status: hookError ? 'error' : 'success',\r\n error: hookError ? hookError.message : null,\r\n timestamp: Date.now()\r\n });\r\n }\r\n \r\n const totalDuration = performance.now() - startTime;\r\n console.debug(`[KupolaLifecycle] ${phase} completed in ${totalDuration.toFixed(2)}ms (${this.scope})`);\r\n } finally {\r\n this.pendingHooks.delete(emitId);\r\n }\r\n }\r\n\r\n async runPhase(phase, ...args) {\r\n if (!this.basePhases.includes(phase)) {\r\n throw new Error(`Unknown base phase: ${phase}`);\r\n }\r\n\r\n const stateMap = this.phaseStateMap[phase];\r\n if (stateMap) {\r\n if (Array.isArray(stateMap.from)) {\r\n if (!stateMap.from.includes(this.state)) {\r\n throw new Error(`Cannot ${phase} from state ${this.state}, expected one of: ${stateMap.from.join(', ')}`);\r\n }\r\n } else {\r\n if (this.state !== stateMap.from) {\r\n throw new Error(`Cannot ${phase} from state ${this.state}, expected ${stateMap.from}`);\r\n }\r\n }\r\n }\r\n\r\n const beforePhase = `before${phase.charAt(0).toUpperCase() + phase.slice(1)}`;\r\n const afterPhase = `after${phase.charAt(0).toUpperCase() + phase.slice(1)}`;\r\n \r\n this._resetResolved(beforePhase);\r\n this._resetResolved(phase);\r\n this._resetResolved(afterPhase);\r\n\r\n if (this.allPhases.includes(beforePhase)) {\r\n await this.emit(beforePhase, ...args);\r\n }\r\n\r\n await this.emit(phase, ...args);\r\n\r\n if (stateMap) {\r\n this._updateState(stateMap.to);\r\n }\r\n\r\n if (this.allPhases.includes(afterPhase)) {\r\n await this.emit(afterPhase, ...args);\r\n }\r\n }\r\n\r\n async bootstrap(...args) {\r\n await this.runPhase('bootstrap', ...args);\r\n }\r\n\r\n async _waitForDOMReady() {\r\n return new Promise((resolve) => {\r\n if (document.readyState === 'complete' || document.readyState === 'interactive') {\r\n resolve();\r\n return;\r\n }\r\n \r\n const onReady = () => {\r\n document.removeEventListener('DOMContentLoaded', onReady);\r\n window.removeEventListener('load', onReady);\r\n resolve();\r\n };\r\n \r\n document.addEventListener('DOMContentLoaded', onReady);\r\n window.addEventListener('load', onReady);\r\n });\r\n }\r\n\r\n async mount(...args) {\r\n await this.runPhase('mount', ...args);\r\n }\r\n\r\n async mountWithDOMReady(...args) {\r\n await this._waitForDOMReady();\r\n await this.runPhase('mount', ...args);\r\n }\r\n\r\n async update(...args) {\r\n await this.runPhase('update', ...args);\r\n }\r\n\r\n async unmount(...args) {\r\n await this.runPhase('unmount', ...args);\r\n }\r\n\r\n async destroy(...args) {\r\n await this.runPhase('destroy', ...args);\r\n \r\n this.hooks.forEach(handlers => {\r\n handlers.length = 0;\r\n });\r\n }\r\n\r\n getPhaseHandlers(phase) {\r\n return this.hooks.get(phase) || [];\r\n }\r\n\r\n hasHandlers(phase) {\r\n const handlers = this.hooks.get(phase);\r\n return handlers && handlers.length > 0;\r\n }\r\n\r\n getTrace() {\r\n return [...this.trace];\r\n }\r\n\r\n clearTrace() {\r\n this.trace = [];\r\n }\r\n\r\n getState() {\r\n return this.state;\r\n }\r\n\r\n getStateHistory() {\r\n return [...this.stateHistory];\r\n }\r\n\r\n isInState(targetState) {\r\n return this.state === targetState;\r\n }\r\n\r\n onError(handler) {\r\n this._onErrorCallback = handler;\r\n return this.on('error', handler);\r\n }\r\n\r\n setErrorBoundary(boundary) {\r\n this.errorBoundary = boundary;\r\n return this.on('errorBoundary', (errorInfo) => {\r\n if (typeof boundary === 'function') {\r\n return boundary(errorInfo);\r\n }\r\n return null;\r\n });\r\n }\r\n\r\n setMaxErrors(max) {\r\n this.maxErrors = max;\r\n }\r\n\r\n getErrorCount() {\r\n return this.errorCount;\r\n }\r\n\r\n getLastError() {\r\n return this.lastError;\r\n }\r\n\r\n resetErrorCount() {\r\n this.errorCount = 0;\r\n this.lastError = null;\r\n }\r\n\r\n async _handleError(errorInfo) {\r\n this.errorCount++;\r\n this.lastError = errorInfo.error;\r\n\r\n if (this.errorCount >= this.maxErrors) {\r\n console.error(`[KupolaLifecycle] Error limit reached (${this.maxErrors}), stopping error handling`);\r\n return;\r\n }\r\n\r\n await this.emit('error', errorInfo);\r\n\r\n if (typeof this._onErrorCallback === 'function') {\r\n try {\r\n await this._onErrorCallback(errorInfo);\r\n } catch (e) {\r\n console.error('[KupolaLifecycle] Error in onError callback:', e);\r\n }\r\n }\r\n\r\n const boundaryHandlers = this.hooks.get('errorBoundary');\r\n if (boundaryHandlers && boundaryHandlers.length > 0) {\r\n for (const hook of boundaryHandlers) {\r\n try {\r\n const result = hook.handler(errorInfo);\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n if (result === 'handled') {\r\n console.debug(`[KupolaLifecycle] Error handled by errorBoundary hook \"${hook.name}\"`);\r\n return;\r\n }\r\n } catch (e) {\r\n console.error(`[KupolaLifecycle] Error in errorBoundary hook \"${hook.name}\":`, e);\r\n }\r\n }\r\n }\r\n\r\n console.error(`[KupolaLifecycle] Unhandled error in ${errorInfo.phase}:`, errorInfo.error);\r\n }\r\n}\r\n\r\nclass KupolaPluginManager {\r\n constructor() {\r\n this.plugins = new Map();\r\n this.enabledPlugins = new Set();\r\n this.pluginHooks = new Map();\r\n }\r\n\r\n register(name, plugin) {\r\n if (this.plugins.has(name)) {\r\n console.warn(`Plugin ${name} already registered, overriding`);\r\n }\r\n \r\n this.plugins.set(name, {\r\n ...plugin,\r\n name,\r\n enabled: false,\r\n instance: null,\r\n lifecycle: new KupolaLifecycle(`plugin:${name}`)\r\n });\r\n }\r\n\r\n async enable(name) {\r\n const plugin = this.plugins.get(name);\r\n if (!plugin) {\r\n throw new Error(`Plugin ${name} not found`);\r\n }\r\n \r\n if (plugin.enabled) return;\r\n \r\n try {\r\n await plugin.lifecycle.bootstrap();\r\n \r\n if (plugin.install) {\r\n plugin.instance = await plugin.install();\r\n }\r\n plugin.enabled = true;\r\n this.enabledPlugins.add(name);\r\n \r\n await plugin.lifecycle.mount();\r\n \r\n if (plugin.hooks) {\r\n this._registerPluginHooks(name, plugin.hooks);\r\n }\r\n \r\n console.log(`Plugin ${name} enabled`);\r\n } catch (error) {\r\n console.error(`Failed to enable plugin ${name}:`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n async disable(name) {\r\n const plugin = this.plugins.get(name);\r\n if (!plugin || !plugin.enabled) return;\r\n \r\n try {\r\n await plugin.lifecycle.unmount();\r\n \r\n if (plugin.uninstall) {\r\n await plugin.uninstall(plugin.instance);\r\n }\r\n \r\n if (plugin.hooks) {\r\n this._unregisterPluginHooks(name);\r\n }\r\n \r\n plugin.enabled = false;\r\n this.enabledPlugins.delete(name);\r\n plugin.instance = null;\r\n \r\n await plugin.lifecycle.destroy();\r\n \r\n console.log(`Plugin ${name} disabled`);\r\n } catch (error) {\r\n console.error(`Failed to disable plugin ${name}:`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n get(name) {\r\n const plugin = this.plugins.get(name);\r\n return plugin?.instance || null;\r\n }\r\n\r\n getAll() {\r\n const result = {};\r\n this.plugins.forEach((plugin, name) => {\r\n result[name] = {\r\n name: plugin.name,\r\n enabled: plugin.enabled,\r\n instance: plugin.instance,\r\n state: plugin.lifecycle.getState()\r\n };\r\n });\r\n return result;\r\n }\r\n\r\n getEnabled() {\r\n const result = {};\r\n this.enabledPlugins.forEach(name => {\r\n const plugin = this.plugins.get(name);\r\n if (plugin) {\r\n result[name] = plugin.instance;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n async enableAll() {\r\n const promises = [];\r\n this.plugins.forEach((_, name) => {\r\n promises.push(this.enable(name));\r\n });\r\n await Promise.all(promises);\r\n }\r\n\r\n async disableAll() {\r\n const promises = [];\r\n this.enabledPlugins.forEach(name => {\r\n promises.push(this.disable(name));\r\n });\r\n await Promise.all(promises);\r\n }\r\n\r\n _registerPluginHooks(pluginName, hooks) {\r\n if (!this.pluginHooks.has(pluginName)) {\r\n this.pluginHooks.set(pluginName, []);\r\n }\r\n \r\n const pluginHooks = this.pluginHooks.get(pluginName);\r\n \r\n Object.keys(hooks).forEach(phase => {\r\n const unsubscribe = window.kupolaLifecycle?.on(phase, hooks[phase], { name: `${pluginName}:${phase}` });\r\n if (unsubscribe) {\r\n pluginHooks.push({ phase, unsubscribe });\r\n }\r\n });\r\n }\r\n\r\n _unregisterPluginHooks(pluginName) {\r\n const pluginHooks = this.pluginHooks.get(pluginName);\r\n if (!pluginHooks) return;\r\n \r\n pluginHooks.forEach(({ unsubscribe }) => {\r\n if (unsubscribe) unsubscribe();\r\n });\r\n \r\n this.pluginHooks.delete(pluginName);\r\n }\r\n}\r\n\r\nconst kupolaLifecycle = new KupolaLifecycle('app');\r\nconst kupolaPluginManager = new KupolaPluginManager();\r\n\r\nfunction createLifecycle(scope = 'app') {\r\n return new KupolaLifecycle(scope);\r\n}\r\n\r\nwindow.KupolaLifecycle = KupolaLifecycle;\r\nwindow.KupolaPluginManager = KupolaPluginManager;\r\nwindow.kupolaLifecycle = kupolaLifecycle;\r\nwindow.kupolaPluginManager = kupolaPluginManager;\r\nwindow.createLifecycle = createLifecycle;","const KupolaUtils = {\r\n string: {\r\n trim(str) {\r\n return str ? str.trim() : '';\r\n },\r\n trimLeft(str) {\r\n return str ? str.replace(/^\\s+/, '') : '';\r\n },\r\n trimRight(str) {\r\n return str ? str.replace(/\\s+$/, '') : '';\r\n },\r\n toUpperCase(str) {\r\n return str ? str.toUpperCase() : '';\r\n },\r\n toLowerCase(str) {\r\n return str ? str.toLowerCase() : '';\r\n },\r\n capitalize(str) {\r\n if (!str) return '';\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n },\r\n camelize(str) {\r\n if (!str) return '';\r\n return str.replace(/-(\\w)/g, (_, c) => c ? c.toUpperCase() : '');\r\n },\r\n hyphenate(str) {\r\n if (!str) return '';\r\n return str.replace(/([A-Z])/g, '-$1').toLowerCase().replace(/^-/, '');\r\n },\r\n padStart(str, length, padChar = ' ') {\r\n return (String(str) || '').padStart(length, padChar);\r\n },\r\n padEnd(str, length, padChar = ' ') {\r\n return (String(str) || '').padEnd(length, padChar);\r\n },\r\n truncate(str, maxLength, suffix = '...') {\r\n if (!str || str.length <= maxLength) return str || '';\r\n return str.slice(0, maxLength) + suffix;\r\n },\r\n replaceAll(str, search, replacement) {\r\n if (!str) return '';\r\n return str.split(search).join(replacement);\r\n },\r\n format(template, data) {\r\n if (!template) return '';\r\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => data[key] !== undefined ? data[key] : `{{${key}}}`);\r\n },\r\n startsWith(str, prefix) {\r\n return (str || '').startsWith(prefix);\r\n },\r\n endsWith(str, suffix) {\r\n return (str || '').endsWith(suffix);\r\n },\r\n includes(str, search) {\r\n return (str || '').includes(search);\r\n },\r\n repeat(str, times) {\r\n return (str || '').repeat(times);\r\n },\r\n reverse(str) {\r\n return (str || '').split('').reverse().join('');\r\n },\r\n countOccurrences(str, search) {\r\n if (!str || !search) return 0;\r\n return str.split(search).length - 1;\r\n },\r\n escapeHtml(str) {\r\n if (!str) return '';\r\n const div = document.createElement('div');\r\n div.textContent = str;\r\n return div.innerHTML;\r\n },\r\n unescapeHtml(str) {\r\n if (!str) return '';\r\n const div = document.createElement('div');\r\n div.innerHTML = str;\r\n return div.textContent;\r\n },\r\n generateRandom(length = 8) {\r\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n let result = '';\r\n for (let i = 0; i < length; i++) {\r\n result += chars.charAt(Math.floor(Math.random() * chars.length));\r\n }\r\n return result;\r\n },\r\n generateUUID() {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = Math.random() * 16 | 0;\r\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n }\r\n },\r\n\r\n array: {\r\n isArray(arr) {\r\n return Array.isArray(arr);\r\n },\r\n isEmpty(arr) {\r\n return !arr || arr.length === 0;\r\n },\r\n size(arr) {\r\n return arr ? arr.length : 0;\r\n },\r\n first(arr, defaultValue) {\r\n return arr && arr.length > 0 ? arr[0] : defaultValue;\r\n },\r\n last(arr, defaultValue) {\r\n return arr && arr.length > 0 ? arr[arr.length - 1] : defaultValue;\r\n },\r\n get(arr, index, defaultValue) {\r\n return arr && arr[index] !== undefined ? arr[index] : defaultValue;\r\n },\r\n slice(arr, start, end) {\r\n return arr ? arr.slice(start, end) : [];\r\n },\r\n concat(...args) {\r\n return args.reduce((result, arg) => result.concat(arg || []), []);\r\n },\r\n join(arr, separator = ',') {\r\n return arr ? arr.join(separator) : '';\r\n },\r\n indexOf(arr, item, fromIndex = 0) {\r\n return arr ? arr.indexOf(item, fromIndex) : -1;\r\n },\r\n lastIndexOf(arr, item, fromIndex) {\r\n return arr ? arr.lastIndexOf(item, fromIndex) : -1;\r\n },\r\n includes(arr, item) {\r\n return arr ? arr.includes(item) : false;\r\n },\r\n push(arr, ...items) {\r\n if (arr) arr.push(...items);\r\n return arr;\r\n },\r\n pop(arr) {\r\n return arr ? arr.pop() : undefined;\r\n },\r\n shift(arr) {\r\n return arr ? arr.shift() : undefined;\r\n },\r\n unshift(arr, ...items) {\r\n if (arr) arr.unshift(...items);\r\n return arr;\r\n },\r\n remove(arr, item) {\r\n if (!arr) return arr;\r\n const index = arr.indexOf(item);\r\n if (index > -1) arr.splice(index, 1);\r\n return arr;\r\n },\r\n removeAt(arr, index) {\r\n if (!arr || index < 0 || index >= arr.length) return arr;\r\n arr.splice(index, 1);\r\n return arr;\r\n },\r\n insert(arr, index, item) {\r\n if (!arr) return arr;\r\n arr.splice(index, 0, item);\r\n return arr;\r\n },\r\n reverse(arr) {\r\n return arr ? arr.slice().reverse() : [];\r\n },\r\n sort(arr, compareFn) {\r\n return arr ? arr.slice().sort(compareFn) : [];\r\n },\r\n sortBy(arr, key, order = 'asc') {\r\n if (!arr) return [];\r\n return arr.slice().sort((a, b) => {\r\n const valA = typeof a === 'object' ? a[key] : a;\r\n const valB = typeof b === 'object' ? b[key] : b;\r\n if (valA < valB) return order === 'asc' ? -1 : 1;\r\n if (valA > valB) return order === 'asc' ? 1 : -1;\r\n return 0;\r\n });\r\n },\r\n filter(arr, predicate) {\r\n return arr ? arr.filter(predicate) : [];\r\n },\r\n map(arr, fn) {\r\n return arr ? arr.map(fn) : [];\r\n },\r\n reduce(arr, fn, initialValue) {\r\n return arr ? arr.reduce(fn, initialValue) : initialValue;\r\n },\r\n forEach(arr, fn) {\r\n if (arr) arr.forEach(fn);\r\n },\r\n every(arr, predicate) {\r\n return arr ? arr.every(predicate) : true;\r\n },\r\n some(arr, predicate) {\r\n return arr ? arr.some(predicate) : false;\r\n },\r\n find(arr, predicate) {\r\n return arr ? arr.find(predicate) : undefined;\r\n },\r\n findIndex(arr, predicate) {\r\n return arr ? arr.findIndex(predicate) : -1;\r\n },\r\n flat(arr, depth = 1) {\r\n return arr ? arr.flat(depth) : [];\r\n },\r\n flattenDeep(arr) {\r\n return arr ? arr.reduce((acc, item) => \r\n Array.isArray(item) ? acc.concat(this.flattenDeep(item)) : acc.concat(item), []) : [];\r\n },\r\n unique(arr) {\r\n return arr ? [...new Set(arr)] : [];\r\n },\r\n uniqueBy(arr, key) {\r\n if (!arr) return [];\r\n const seen = new Set();\r\n return arr.filter(item => {\r\n const value = typeof item === 'object' ? item[key] : item;\r\n if (seen.has(value)) return false;\r\n seen.add(value);\r\n return true;\r\n });\r\n },\r\n chunk(arr, size) {\r\n if (!arr || size <= 0) return [];\r\n const chunks = [];\r\n for (let i = 0; i < arr.length; i += size) {\r\n chunks.push(arr.slice(i, i + size));\r\n }\r\n return chunks;\r\n },\r\n shuffle(arr) {\r\n if (!arr) return [];\r\n const result = arr.slice();\r\n for (let i = result.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [result[i], result[j]] = [result[j], result[i]];\r\n }\r\n return result;\r\n },\r\n sum(arr) {\r\n return arr ? arr.reduce((acc, val) => acc + (Number(val) || 0), 0) : 0;\r\n },\r\n average(arr) {\r\n if (!arr || arr.length === 0) return 0;\r\n return this.sum(arr) / arr.length;\r\n },\r\n max(arr) {\r\n return arr && arr.length > 0 ? Math.max(...arr) : -Infinity;\r\n },\r\n min(arr) {\r\n return arr && arr.length > 0 ? Math.min(...arr) : Infinity;\r\n },\r\n intersection(...args) {\r\n if (args.length === 0) return [];\r\n return args.reduce((result, arr) => \r\n result.filter(item => arr && arr.includes(item)));\r\n },\r\n union(...args) {\r\n return [...new Set(args.flat().filter(Boolean))];\r\n },\r\n difference(arr1, arr2) {\r\n return arr1 ? arr1.filter(item => !arr2 || !arr2.includes(item)) : [];\r\n },\r\n zip(...args) {\r\n if (args.length === 0) return [];\r\n const maxLength = Math.max(...args.map(arr => arr ? arr.length : 0));\r\n return Array.from({ length: maxLength }, (_, i) => \r\n args.map(arr => arr && arr[i]));\r\n }\r\n },\r\n\r\n object: {\r\n isObject(obj) {\r\n return obj !== null && typeof obj === 'object' && !Array.isArray(obj);\r\n },\r\n isEmpty(obj) {\r\n if (!obj || typeof obj !== 'object') return true;\r\n return Object.keys(obj).length === 0;\r\n },\r\n keys(obj) {\r\n return obj ? Object.keys(obj) : [];\r\n },\r\n values(obj) {\r\n return obj ? Object.values(obj) : [];\r\n },\r\n entries(obj) {\r\n return obj ? Object.entries(obj) : [];\r\n },\r\n has(obj, key) {\r\n return obj ? Object.prototype.hasOwnProperty.call(obj, key) : false;\r\n },\r\n get(obj, path, defaultValue) {\r\n if (!obj) return defaultValue;\r\n const keys = path.split('.');\r\n return keys.reduce((current, key) => current && current[key], obj) || defaultValue;\r\n },\r\n set(obj, path, value) {\r\n if (!obj || typeof obj !== 'object') return obj;\r\n const keys = path.split('.');\r\n const lastKey = keys.pop();\r\n let current = obj;\r\n keys.forEach(key => {\r\n if (!current[key]) current[key] = {};\r\n current = current[key];\r\n });\r\n current[lastKey] = value;\r\n return obj;\r\n },\r\n pick(obj, keys) {\r\n if (!obj) return {};\r\n return keys.reduce((result, key) => {\r\n if (obj[key] !== undefined) result[key] = obj[key];\r\n return result;\r\n }, {});\r\n },\r\n omit(obj, keys) {\r\n if (!obj) return {};\r\n return Object.keys(obj).reduce((result, key) => {\r\n if (!keys.includes(key)) result[key] = obj[key];\r\n return result;\r\n }, {});\r\n },\r\n merge(...args) {\r\n return args.reduce((result, obj) => {\r\n if (obj && typeof obj === 'object') {\r\n Object.keys(obj).forEach(key => {\r\n if (this.isObject(obj[key]) && this.isObject(result[key])) {\r\n result[key] = this.merge(result[key], obj[key]);\r\n } else {\r\n result[key] = obj[key];\r\n }\r\n });\r\n }\r\n return result;\r\n }, {});\r\n },\r\n clone(obj) {\r\n return obj ? JSON.parse(JSON.stringify(obj)) : obj;\r\n },\r\n deepClone(obj, hash = new WeakMap()) {\r\n if (!obj || typeof obj !== 'object') return obj;\r\n if (hash.has(obj)) return hash.get(obj);\r\n if (obj instanceof Date) return new Date(obj);\r\n if (obj instanceof RegExp) return new RegExp(obj);\r\n if (obj instanceof Map) {\r\n const map = new Map();\r\n hash.set(obj, map);\r\n obj.forEach((val, key) => map.set(key, this.deepClone(val, hash)));\r\n return map;\r\n }\r\n if (obj instanceof Set) {\r\n const set = new Set();\r\n hash.set(obj, set);\r\n obj.forEach(val => set.add(this.deepClone(val, hash)));\r\n return set;\r\n }\r\n if (Array.isArray(obj)) {\r\n const arr = [];\r\n hash.set(obj, arr);\r\n obj.forEach(item => arr.push(this.deepClone(item, hash)));\r\n return arr;\r\n }\r\n const clone = {};\r\n hash.set(obj, clone);\r\n Object.keys(obj).forEach(key => {\r\n clone[key] = this.deepClone(obj[key], hash);\r\n });\r\n return clone;\r\n },\r\n forEach(obj, fn) {\r\n if (!obj) return;\r\n Object.keys(obj).forEach(key => fn(obj[key], key, obj));\r\n },\r\n map(obj, fn) {\r\n if (!obj) return {};\r\n const result = {};\r\n Object.keys(obj).forEach(key => {\r\n result[key] = fn(obj[key], key, obj);\r\n });\r\n return result;\r\n },\r\n filter(obj, fn) {\r\n if (!obj) return {};\r\n const result = {};\r\n Object.keys(obj).forEach(key => {\r\n if (fn(obj[key], key, obj)) result[key] = obj[key];\r\n });\r\n return result;\r\n },\r\n reduce(obj, fn, initialValue) {\r\n if (!obj) return initialValue;\r\n return Object.keys(obj).reduce((acc, key) => \r\n fn(acc, obj[key], key, obj), initialValue);\r\n },\r\n toArray(obj) {\r\n if (!obj) return [];\r\n return Object.keys(obj).map(key => ({ key, value: obj[key] }));\r\n },\r\n fromArray(arr, keyField, valueField) {\r\n if (!arr) return {};\r\n return arr.reduce((result, item) => {\r\n const key = typeof item === 'object' ? item[keyField] : item;\r\n const value = valueField ? item[valueField] : item;\r\n if (key !== undefined) result[key] = value;\r\n return result;\r\n }, {});\r\n },\r\n size(obj) {\r\n return obj ? Object.keys(obj).length : 0;\r\n },\r\n invert(obj) {\r\n if (!obj) return {};\r\n const result = {};\r\n Object.keys(obj).forEach(key => {\r\n result[obj[key]] = key;\r\n });\r\n return result;\r\n },\r\n isEqual(obj1, obj2) {\r\n if (obj1 === obj2) return true;\r\n if (!obj1 || !obj2 || typeof obj1 !== 'object' || typeof obj2 !== 'object') return false;\r\n const keys1 = Object.keys(obj1);\r\n const keys2 = Object.keys(obj2);\r\n if (keys1.length !== keys2.length) return false;\r\n return keys1.every(key => this.isEqual(obj1[key], obj2[key]));\r\n },\r\n freeze(obj) {\r\n if (!obj) return obj;\r\n Object.freeze(obj);\r\n Object.keys(obj).forEach(key => {\r\n if (typeof obj[key] === 'object') this.freeze(obj[key]);\r\n });\r\n return obj;\r\n },\r\n seal(obj) {\r\n return obj ? Object.seal(obj) : obj;\r\n }\r\n },\r\n\r\n number: {\r\n isNumber(val) {\r\n return typeof val === 'number' && !isNaN(val);\r\n },\r\n isInteger(val) {\r\n return Number.isInteger(val);\r\n },\r\n isFloat(val) {\r\n return this.isNumber(val) && !Number.isInteger(val);\r\n },\r\n isPositive(val) {\r\n return this.isNumber(val) && val > 0;\r\n },\r\n isNegative(val) {\r\n return this.isNumber(val) && val < 0;\r\n },\r\n isZero(val) {\r\n return this.isNumber(val) && val === 0;\r\n },\r\n clamp(val, min, max) {\r\n if (!this.isNumber(val)) return val;\r\n return Math.min(Math.max(val, min), max);\r\n },\r\n round(val, precision = 0) {\r\n if (!this.isNumber(val)) return val;\r\n const factor = Math.pow(10, precision);\r\n return Math.round(val * factor) / factor;\r\n },\r\n floor(val) {\r\n return this.isNumber(val) ? Math.floor(val) : val;\r\n },\r\n ceil(val) {\r\n return this.isNumber(val) ? Math.ceil(val) : val;\r\n },\r\n abs(val) {\r\n return this.isNumber(val) ? Math.abs(val) : val;\r\n },\r\n min(...args) {\r\n const nums = args.filter(this.isNumber);\r\n return nums.length > 0 ? Math.min(...nums) : undefined;\r\n },\r\n max(...args) {\r\n const nums = args.filter(this.isNumber);\r\n return nums.length > 0 ? Math.max(...nums) : undefined;\r\n },\r\n sum(...args) {\r\n const nums = args.flat().filter(this.isNumber);\r\n return nums.reduce((acc, val) => acc + val, 0);\r\n },\r\n average(...args) {\r\n const nums = args.flat().filter(this.isNumber);\r\n return nums.length > 0 ? this.sum(nums) / nums.length : 0;\r\n },\r\n random(min = 0, max = 1) {\r\n return Math.random() * (max - min) + min;\r\n },\r\n randomInt(min, max) {\r\n return Math.floor(this.random(min, max + 1));\r\n },\r\n format(val, decimals = 2) {\r\n if (!this.isNumber(val)) return String(val);\r\n return val.toFixed(decimals);\r\n },\r\n formatCurrency(val, currency = 'CNY', decimals = 2) {\r\n if (!this.isNumber(val)) return String(val);\r\n const formatter = new Intl.NumberFormat('zh-CN', {\r\n style: 'currency',\r\n currency,\r\n minimumFractionDigits: decimals,\r\n maximumFractionDigits: decimals\r\n });\r\n return formatter.format(val);\r\n },\r\n formatPercent(val, decimals = 0) {\r\n if (!this.isNumber(val)) return String(val);\r\n return `${(val * 100).toFixed(decimals)}%`;\r\n },\r\n toFixed(val, decimals = 0) {\r\n if (!this.isNumber(val)) return String(val);\r\n return val.toFixed(decimals);\r\n },\r\n toPrecision(val, precision = 6) {\r\n if (!this.isNumber(val)) return String(val);\r\n return val.toPrecision(precision);\r\n },\r\n isNaN(val) {\r\n return Number.isNaN(val);\r\n },\r\n isFinite(val) {\r\n return Number.isFinite(val);\r\n },\r\n parseInt(val, radix = 10) {\r\n return Number.parseInt(val, radix);\r\n },\r\n parseFloat(val) {\r\n return Number.parseFloat(val);\r\n },\r\n toNumber(val, defaultValue = 0) {\r\n const num = Number(val);\r\n return isNaN(num) ? defaultValue : num;\r\n },\r\n safeDivide(a, b, defaultValue = 0) {\r\n if (!this.isNumber(a) || !this.isNumber(b) || b === 0) return defaultValue;\r\n return a / b;\r\n },\r\n safeMultiply(...args) {\r\n return args.reduce((result, val) => {\r\n if (!this.isNumber(result) || !this.isNumber(val)) return 0;\r\n return result * val;\r\n }, 1);\r\n }\r\n },\r\n\r\n date: {\r\n now() {\r\n return Date.now();\r\n },\r\n today() {\r\n const now = new Date();\r\n now.setHours(0, 0, 0, 0);\r\n return now;\r\n },\r\n tomorrow() {\r\n const date = this.today();\r\n date.setDate(date.getDate() + 1);\r\n return date;\r\n },\r\n yesterday() {\r\n const date = this.today();\r\n date.setDate(date.getDate() - 1);\r\n return date;\r\n },\r\n isDate(val) {\r\n return val instanceof Date && !isNaN(val.getTime());\r\n },\r\n isValid(date) {\r\n return this.isDate(date);\r\n },\r\n parse(str) {\r\n const date = new Date(str);\r\n return this.isValid(date) ? date : null;\r\n },\r\n format(date, formatStr = 'YYYY-MM-DD HH:mm:ss') {\r\n if (!this.isDate(date)) return '';\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const hours = String(date.getHours()).padStart(2, '0');\r\n const minutes = String(date.getMinutes()).padStart(2, '0');\r\n const seconds = String(date.getSeconds()).padStart(2, '0');\r\n const milliseconds = String(date.getMilliseconds()).padStart(3, '0');\r\n const weekDays = ['日', '一', '二', '三', '四', '五', '六'];\r\n const weekDay = weekDays[date.getDay()];\r\n \r\n return formatStr\r\n .replace('YYYY', year)\r\n .replace('MM', month)\r\n .replace('DD', day)\r\n .replace('HH', hours)\r\n .replace('mm', minutes)\r\n .replace('ss', seconds)\r\n .replace('SSS', milliseconds)\r\n .replace('D', date.getDate())\r\n .replace('M', date.getMonth() + 1)\r\n .replace('H', date.getHours())\r\n .replace('m', date.getMinutes())\r\n .replace('s', date.getSeconds())\r\n .replace('W', weekDay);\r\n },\r\n toISO(date) {\r\n return this.isDate(date) ? date.toISOString() : '';\r\n },\r\n toUTC(date) {\r\n return this.isDate(date) ? new Date(date.toUTCString()) : null;\r\n },\r\n addDays(date, days) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setDate(newDate.getDate() + days);\r\n return newDate;\r\n },\r\n addHours(date, hours) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setHours(newDate.getHours() + hours);\r\n return newDate;\r\n },\r\n addMinutes(date, minutes) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setMinutes(newDate.getMinutes() + minutes);\r\n return newDate;\r\n },\r\n addSeconds(date, seconds) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setSeconds(newDate.getSeconds() + seconds);\r\n return newDate;\r\n },\r\n diffDays(date1, date2) {\r\n if (!this.isDate(date1) || !this.isDate(date2)) return 0;\r\n const d1 = this.today();\r\n const d2 = this.today();\r\n d1.setTime(date1.getTime());\r\n d2.setTime(date2.getTime());\r\n return Math.floor((d1.getTime() - d2.getTime()) / (1000 * 60 * 60 * 24));\r\n },\r\n diffHours(date1, date2) {\r\n if (!this.isDate(date1) || !this.isDate(date2)) return 0;\r\n return Math.floor((date1.getTime() - date2.getTime()) / (1000 * 60 * 60));\r\n },\r\n diffMinutes(date1, date2) {\r\n if (!this.isDate(date1) || !this.isDate(date2)) return 0;\r\n return Math.floor((date1.getTime() - date2.getTime()) / (1000 * 60));\r\n },\r\n diffSeconds(date1, date2) {\r\n if (!this.isDate(date1) || !this.isDate(date2)) return 0;\r\n return Math.floor((date1.getTime() - date2.getTime()) / 1000);\r\n },\r\n isToday(date) {\r\n if (!this.isDate(date)) return false;\r\n return this.diffDays(date, this.today()) === 0;\r\n },\r\n isYesterday(date) {\r\n if (!this.isDate(date)) return false;\r\n return this.diffDays(date, this.today()) === -1;\r\n },\r\n isTomorrow(date) {\r\n if (!this.isDate(date)) return false;\r\n return this.diffDays(date, this.today()) === 1;\r\n },\r\n isFuture(date) {\r\n if (!this.isDate(date)) return false;\r\n return date.getTime() > this.now();\r\n },\r\n isPast(date) {\r\n if (!this.isDate(date)) return false;\r\n return date.getTime() < this.now();\r\n },\r\n isLeapYear(date) {\r\n if (!this.isDate(date)) return false;\r\n const year = date.getFullYear();\r\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\r\n },\r\n getDaysInMonth(date) {\r\n if (!this.isDate(date)) return 0;\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n return new Date(year, month + 1, 0).getDate();\r\n },\r\n getWeekOfYear(date) {\r\n if (!this.isDate(date)) return 0;\r\n const startOfYear = new Date(date.getFullYear(), 0, 1);\r\n const diff = date.getTime() - startOfYear.getTime();\r\n return Math.ceil(diff / (1000 * 60 * 60 * 24 * 7));\r\n },\r\n getQuarter(date) {\r\n if (!this.isDate(date)) return 0;\r\n return Math.ceil((date.getMonth() + 1) / 3);\r\n },\r\n startOfDay(date) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setHours(0, 0, 0, 0);\r\n return newDate;\r\n },\r\n endOfDay(date) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setHours(23, 59, 59, 999);\r\n return newDate;\r\n },\r\n startOfMonth(date) {\r\n if (!this.isDate(date)) return date;\r\n return new Date(date.getFullYear(), date.getMonth(), 1);\r\n },\r\n endOfMonth(date) {\r\n if (!this.isDate(date)) return date;\r\n return new Date(date.getFullYear(), date.getMonth() + 1, 0, 23, 59, 59, 999);\r\n },\r\n startOfWeek(date, startDay = 1) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n const day = newDate.getDay();\r\n const diff = day >= startDay ? day - startDay : day + (7 - startDay);\r\n newDate.setDate(newDate.getDate() - diff);\r\n newDate.setHours(0, 0, 0, 0);\r\n return newDate;\r\n },\r\n endOfWeek(date, startDay = 1) {\r\n if (!this.isDate(date)) return date;\r\n const start = this.startOfWeek(date, startDay);\r\n const end = new Date(start);\r\n end.setDate(end.getDate() + 6);\r\n end.setHours(23, 59, 59, 999);\r\n return end;\r\n },\r\n getAge(birthDate) {\r\n if (!this.isDate(birthDate)) return 0;\r\n const now = new Date();\r\n let age = now.getFullYear() - birthDate.getFullYear();\r\n if (now.getMonth() < birthDate.getMonth() || \r\n (now.getMonth() === birthDate.getMonth() && now.getDate() < birthDate.getDate())) {\r\n age--;\r\n }\r\n return Math.max(0, age);\r\n },\r\n fromNow(date) {\r\n if (!this.isDate(date)) return '';\r\n const now = this.now();\r\n const diff = now - date.getTime();\r\n const minute = 60 * 1000;\r\n const hour = 60 * minute;\r\n const day = 24 * hour;\r\n const week = 7 * day;\r\n const month = 30 * day;\r\n const year = 365 * day;\r\n \r\n if (diff < minute) return '刚刚';\r\n if (diff < hour) return `${Math.floor(diff / minute)}分钟前`;\r\n if (diff < day) return `${Math.floor(diff / hour)}小时前`;\r\n if (diff < week) return `${Math.floor(diff / day)}天前`;\r\n if (diff < month) return `${Math.floor(diff / week)}周前`;\r\n if (diff < year) return `${Math.floor(diff / month)}个月前`;\r\n return `${Math.floor(diff / year)}年前`;\r\n }\r\n },\r\n\r\n debounce(func, wait, options = {}) {\r\n let timeout = null;\r\n let lastArgs = null;\r\n let lastThis = null;\r\n let lastCallTime = 0;\r\n \r\n const leading = options.leading || false;\r\n const trailing = options.trailing !== false;\r\n \r\n function invokeFunc() {\r\n func.apply(lastThis, lastArgs);\r\n }\r\n \r\n function leadingEdge() {\r\n lastCallTime = Date.now();\r\n if (leading) {\r\n timeout = setTimeout(trailingEdge, wait);\r\n invokeFunc();\r\n } else {\r\n timeout = setTimeout(trailingEdge, wait);\r\n }\r\n }\r\n \r\n function trailingEdge() {\r\n timeout = null;\r\n if (trailing && lastArgs) {\r\n invokeFunc();\r\n }\r\n lastArgs = null;\r\n lastThis = null;\r\n }\r\n \r\n function remainingWait() {\r\n const timeSinceLastCall = Date.now() - lastCallTime;\r\n return Math.max(0, wait - timeSinceLastCall);\r\n }\r\n \r\n return function(...args) {\r\n lastArgs = args;\r\n lastThis = this;\r\n lastCallTime = Date.now();\r\n \r\n if (!timeout) {\r\n leadingEdge();\r\n } else {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(trailingEdge, remainingWait());\r\n }\r\n };\r\n },\r\n\r\n throttle(func, limit, options = {}) {\r\n let inThrottle = false;\r\n const trailing = options.trailing || false;\r\n let lastArgs = null;\r\n let lastThis = null;\r\n \r\n function invokeFunc() {\r\n func.apply(lastThis, lastArgs);\r\n lastArgs = null;\r\n lastThis = null;\r\n }\r\n \r\n return function(...args) {\r\n if (!inThrottle) {\r\n inThrottle = true;\r\n lastArgs = args;\r\n lastThis = this;\r\n invokeFunc();\r\n setTimeout(() => {\r\n inThrottle = false;\r\n if (trailing && lastArgs) {\r\n invokeFunc();\r\n }\r\n }, limit);\r\n } else if (trailing) {\r\n lastArgs = args;\r\n lastThis = this;\r\n }\r\n };\r\n },\r\n\r\n validator: {\r\n isEmail(str) {\r\n const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\r\n return regex.test(str || '');\r\n },\r\n isPhone(str) {\r\n const regex = /^1[3-9]\\d{9}$/;\r\n return regex.test(str || '');\r\n },\r\n isURL(str) {\r\n const regex = /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w.-]*)*\\/?$/;\r\n return regex.test(str || '');\r\n },\r\n isIPv4(str) {\r\n const regex = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\r\n return regex.test(str || '');\r\n },\r\n isIPv6(str) {\r\n const regex = /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/;\r\n return regex.test(str || '');\r\n },\r\n isIP(str) {\r\n return this.isIPv4(str) || this.isIPv6(str);\r\n },\r\n isIDCard(str) {\r\n const regex = /^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]$/;\r\n return regex.test(str || '');\r\n },\r\n isPassport(str) {\r\n const regex = /^[A-Z][0-9]{8}$|^[A-Z]{2}[0-9]{7}$/;\r\n return regex.test(str || '');\r\n },\r\n isCreditCard(str) {\r\n const regex = /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9]{2})[0-9]{12}|3[47][0-9]{13})$/;\r\n const cleanStr = str.replace(/\\s/g, '');\r\n if (!regex.test(cleanStr)) return false;\r\n let sum = 0;\r\n let alternate = false;\r\n for (let i = cleanStr.length - 1; i >= 0; i--) {\r\n let digit = parseInt(cleanStr[i], 10);\r\n if (alternate) {\r\n digit *= 2;\r\n if (digit > 9) digit -= 9;\r\n }\r\n sum += digit;\r\n alternate = !alternate;\r\n }\r\n return sum % 10 === 0;\r\n },\r\n isHexColor(str) {\r\n const regex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\r\n return regex.test(str || '');\r\n },\r\n isRGB(str) {\r\n const regex = /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/;\r\n const match = regex.exec(str || '');\r\n if (!match) return false;\r\n return match.slice(1).every(val => parseInt(val) >= 0 && parseInt(val) <= 255);\r\n },\r\n isRGBA(str) {\r\n const regex = /^rgba\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3}),\\s*([01]|0\\.\\d+)\\)$/;\r\n const match = regex.exec(str || '');\r\n if (!match) return false;\r\n const [, r, g, b, a] = match;\r\n return parseInt(r) >= 0 && parseInt(r) <= 255 &&\r\n parseInt(g) >= 0 && parseInt(g) <= 255 &&\r\n parseInt(b) >= 0 && parseInt(b) <= 255 &&\r\n parseFloat(a) >= 0 && parseFloat(a) <= 1;\r\n },\r\n isColor(str) {\r\n return this.isHexColor(str) || this.isRGB(str) || this.isRGBA(str);\r\n },\r\n isDate(str) {\r\n return !isNaN(new Date(str).getTime());\r\n },\r\n isJSON(str) {\r\n try {\r\n JSON.parse(str);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n },\r\n isEmpty(str) {\r\n return !str || str.trim() === '';\r\n },\r\n isWhitespace(str) {\r\n return /^\\s+$/.test(str || '');\r\n },\r\n isNumber(str) {\r\n return !isNaN(parseFloat(str)) && isFinite(str);\r\n },\r\n isInteger(str) {\r\n return /^-?\\d+$/.test(str || '');\r\n },\r\n isFloat(str) {\r\n return /^-?\\d+\\.\\d+$/.test(str || '');\r\n },\r\n isPositive(str) {\r\n const num = parseFloat(str);\r\n return !isNaN(num) && num > 0;\r\n },\r\n isNegative(str) {\r\n const num = parseFloat(str);\r\n return !isNaN(num) && num < 0;\r\n },\r\n isAlpha(str) {\r\n return /^[a-zA-Z]+$/.test(str || '');\r\n },\r\n isAlphaNumeric(str) {\r\n return /^[a-zA-Z0-9]+$/.test(str || '');\r\n },\r\n isChinese(str) {\r\n return /^[\\u4e00-\\u9fa5]+$/.test(str || '');\r\n },\r\n isLength(str, min, max) {\r\n const len = (str || '').length;\r\n return len >= min && (max === undefined || len <= max);\r\n },\r\n minLength(str, min) {\r\n return (str || '').length >= min;\r\n },\r\n maxLength(str, max) {\r\n return (str || '').length <= max;\r\n },\r\n matches(str, regex) {\r\n return (regex instanceof RegExp) ? regex.test(str || '') : false;\r\n },\r\n equals(str1, str2) {\r\n return String(str1) === String(str2);\r\n },\r\n contains(str, substring) {\r\n return (str || '').includes(substring);\r\n },\r\n notContains(str, substring) {\r\n return !this.contains(str, substring);\r\n },\r\n isArray(arr) {\r\n return Array.isArray(arr);\r\n },\r\n arrayLength(arr, min, max) {\r\n const len = arr ? arr.length : 0;\r\n return len >= min && (max === undefined || len <= max);\r\n },\r\n arrayMinLength(arr, min) {\r\n return arr ? arr.length >= min : false;\r\n },\r\n arrayMaxLength(arr, max) {\r\n return arr ? arr.length <= max : false;\r\n },\r\n isObject(obj) {\r\n return obj !== null && typeof obj === 'object' && !Array.isArray(obj);\r\n },\r\n hasKeys(obj, keys) {\r\n if (!obj || !keys || !Array.isArray(keys)) return false;\r\n return keys.every(key => Object.prototype.hasOwnProperty.call(obj, key));\r\n },\r\n validate(obj, rules) {\r\n const errors = {};\r\n Object.keys(rules).forEach(key => {\r\n const value = obj[key];\r\n const fieldRules = rules[key];\r\n const fieldErrors = [];\r\n \r\n fieldRules.forEach(rule => {\r\n if (typeof rule === 'string') {\r\n const [name, ...params] = rule.split(':');\r\n if (!this[name](value, ...params)) {\r\n fieldErrors.push(name);\r\n }\r\n } else if (typeof rule === 'function') {\r\n const result = rule(value, obj);\r\n if (result !== true) {\r\n fieldErrors.push(result || 'validation_failed');\r\n }\r\n }\r\n });\r\n \r\n if (fieldErrors.length > 0) {\r\n errors[key] = fieldErrors;\r\n }\r\n });\r\n \r\n return {\r\n valid: Object.keys(errors).length === 0,\r\n errors\r\n };\r\n }\r\n },\r\n\r\n crypto: {\r\n md5(str) {\r\n const message = str ? String(str) : '';\r\n const md5Array = [\r\n 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476\r\n ];\r\n \r\n const K = [\r\n 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,\r\n 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,\r\n 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,\r\n 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,\r\n 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,\r\n 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,\r\n 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,\r\n 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,\r\n 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,\r\n 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,\r\n 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,\r\n 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,\r\n 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,\r\n 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,\r\n 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,\r\n 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391\r\n ];\r\n \r\n const S = [\r\n [7, 12, 17, 22], [5, 9, 14, 20], [4, 11, 16, 23], [6, 10, 15, 21]\r\n ];\r\n \r\n function leftRotate(value, shift) {\r\n return (value << shift) | (value >>> (32 - shift));\r\n }\r\n \r\n function addPadding(message) {\r\n const bitLength = message.length * 8;\r\n message += '\\x80';\r\n while ((message.length % 64) !== 56) {\r\n message += '\\x00';\r\n }\r\n const lowBytes = bitLength & 0xffffffff;\r\n const highBytes = (bitLength >>> 32) & 0xffffffff;\r\n for (let i = 0; i < 4; i++) {\r\n message += String.fromCharCode((lowBytes >>> (8 * i)) & 0xff);\r\n }\r\n for (let i = 0; i < 4; i++) {\r\n message += String.fromCharCode((highBytes >>> (8 * i)) & 0xff);\r\n }\r\n return message;\r\n }\r\n \r\n function processBlock(block, state) {\r\n const [a, b, c, d] = state;\r\n const words = [];\r\n for (let i = 0; i < 16; i++) {\r\n words[i] = (block.charCodeAt(i * 4) & 0xff) |\r\n ((block.charCodeAt(i * 4 + 1) & 0xff) << 8) |\r\n ((block.charCodeAt(i * 4 + 2) & 0xff) << 16) |\r\n ((block.charCodeAt(i * 4 + 3) & 0xff) << 24);\r\n }\r\n \r\n let AA = a, BB = b, CC = c, DD = d;\r\n \r\n for (let i = 0; i < 64; i++) {\r\n let f, g;\r\n const round = Math.floor(i / 16);\r\n const wordIndex = i % 16;\r\n \r\n if (round === 0) {\r\n f = (BB & CC) | (~BB & DD);\r\n g = wordIndex;\r\n } else if (round === 1) {\r\n f = (DD & BB) | (~DD & CC);\r\n g = (5 * wordIndex + 1) % 16;\r\n } else if (round === 2) {\r\n f = BB ^ CC ^ DD;\r\n g = (3 * wordIndex + 5) % 16;\r\n } else {\r\n f = CC ^ (BB | ~DD);\r\n g = (7 * wordIndex) % 16;\r\n }\r\n \r\n const temp = DD;\r\n DD = CC;\r\n CC = BB;\r\n BB = BB + leftRotate((AA + f + K[i] + words[g]) & 0xffffffff, S[round][i % 4]);\r\n AA = temp;\r\n }\r\n \r\n return [\r\n (a + AA) & 0xffffffff,\r\n (b + BB) & 0xffffffff,\r\n (c + CC) & 0xffffffff,\r\n (d + DD) & 0xffffffff\r\n ];\r\n }\r\n \r\n const paddedMessage = addPadding(message);\r\n let state = [...md5Array];\r\n \r\n for (let i = 0; i < paddedMessage.length; i += 64) {\r\n state = processBlock(paddedMessage.substring(i, i + 64), state);\r\n }\r\n \r\n let result = '';\r\n state.forEach(word => {\r\n for (let i = 0; i < 4; i++) {\r\n result += ((word >>> (8 * i)) & 0xff).toString(16).padStart(2, '0');\r\n }\r\n });\r\n \r\n return result;\r\n },\r\n \r\n sha256(str) {\r\n const message = str ? String(str) : '';\r\n const K = [\r\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\r\n 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\r\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\r\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\r\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\r\n 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\r\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\r\n 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\r\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\r\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\r\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\r\n 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\r\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\r\n 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\r\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\r\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\r\n ];\r\n \r\n function rightRotate(value, shift) {\r\n return (value >>> shift) | (value << (32 - shift));\r\n }\r\n \r\n function addPadding(message) {\r\n const bitLength = message.length * 8;\r\n message += '\\x80';\r\n while ((message.length % 64) !== 56) {\r\n message += '\\x00';\r\n }\r\n const lowBytes = bitLength & 0xffffffff;\r\n const highBytes = (bitLength >>> 32) & 0xffffffff;\r\n for (let i = 0; i < 4; i++) {\r\n message += String.fromCharCode((highBytes >>> (8 * i)) & 0xff);\r\n }\r\n for (let i = 0; i < 4; i++) {\r\n message += String.fromCharCode((lowBytes >>> (8 * i)) & 0xff);\r\n }\r\n return message;\r\n }\r\n \r\n function processBlock(block, state) {\r\n const words = [];\r\n for (let i = 0; i < 16; i++) {\r\n words[i] = (block.charCodeAt(i * 4) & 0xff) |\r\n ((block.charCodeAt(i * 4 + 1) & 0xff) << 8) |\r\n ((block.charCodeAt(i * 4 + 2) & 0xff) << 16) |\r\n ((block.charCodeAt(i * 4 + 3) & 0xff) << 24);\r\n }\r\n \r\n for (let i = 16; i < 64; i++) {\r\n const s0 = rightRotate(words[i - 15], 7) ^ rightRotate(words[i - 15], 18) ^ (words[i - 15] >>> 3);\r\n const s1 = rightRotate(words[i - 2], 17) ^ rightRotate(words[i - 2], 19) ^ (words[i - 2] >>> 10);\r\n words[i] = (words[i - 16] + s0 + words[i - 7] + s1) & 0xffffffff;\r\n }\r\n \r\n let [a, b, c, d, e, f, g, h] = state;\r\n \r\n for (let i = 0; i < 64; i++) {\r\n const S1 = rightRotate(e, 6) ^ rightRotate(e, 11) ^ rightRotate(e, 25);\r\n const ch = (e & f) ^ (~e & g);\r\n const temp1 = (h + S1 + ch + K[i] + words[i]) & 0xffffffff;\r\n const S0 = rightRotate(a, 2) ^ rightRotate(a, 13) ^ rightRotate(a, 22);\r\n const maj = (a & b) ^ (a & c) ^ (b & c);\r\n const temp2 = (S0 + maj) & 0xffffffff;\r\n \r\n h = g;\r\n g = f;\r\n f = e;\r\n e = (d + temp1) & 0xffffffff;\r\n d = c;\r\n c = b;\r\n b = a;\r\n a = (temp1 + temp2) & 0xffffffff;\r\n }\r\n \r\n return [\r\n (state[0] + a) & 0xffffffff,\r\n (state[1] + b) & 0xffffffff,\r\n (state[2] + c) & 0xffffffff,\r\n (state[3] + d) & 0xffffffff,\r\n (state[4] + e) & 0xffffffff,\r\n (state[5] + f) & 0xffffffff,\r\n (state[6] + g) & 0xffffffff,\r\n (state[7] + h) & 0xffffffff\r\n ];\r\n }\r\n \r\n const paddedMessage = addPadding(message);\r\n let state = [\r\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\r\n 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\r\n ];\r\n \r\n for (let i = 0; i < paddedMessage.length; i += 64) {\r\n state = processBlock(paddedMessage.substring(i, i + 64), state);\r\n }\r\n \r\n let result = '';\r\n state.forEach(word => {\r\n for (let i = 3; i >= 0; i--) {\r\n result += ((word >>> (8 * i)) & 0xff).toString(16).padStart(2, '0');\r\n }\r\n });\r\n \r\n return result;\r\n },\r\n \r\n base64Encode(str) {\r\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\n let result = '';\r\n let i = 0;\r\n const bytes = str ? str.split('').map(c => c.charCodeAt(0)) : [];\r\n \r\n while (i < bytes.length) {\r\n const byte1 = bytes[i++];\r\n const byte2 = bytes[i++] || 0;\r\n const byte3 = bytes[i++] || 0;\r\n \r\n const enc1 = byte1 >> 2;\r\n const enc2 = ((byte1 & 3) << 4) | (byte2 >> 4);\r\n const enc3 = ((byte2 & 15) << 2) | (byte3 >> 6);\r\n const enc4 = byte3 & 63;\r\n \r\n result += chars[enc1] + chars[enc2] + \r\n (i > bytes.length + 1 ? '=' : chars[enc3]) + \r\n (i > bytes.length ? '=' : chars[enc4]);\r\n }\r\n \r\n return result;\r\n },\r\n \r\n base64Decode(str) {\r\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\n let result = '';\r\n let i = 0;\r\n str = str.replace(/[^A-Za-z0-9+/=]/g, '');\r\n \r\n while (i < str.length) {\r\n const enc1 = chars.indexOf(str.charAt(i++));\r\n const enc2 = chars.indexOf(str.charAt(i++));\r\n const enc3 = chars.indexOf(str.charAt(i++));\r\n const enc4 = chars.indexOf(str.charAt(i++));\r\n \r\n const byte1 = (enc1 << 2) | (enc2 >> 4);\r\n const byte2 = ((enc2 & 15) << 4) | (enc3 >> 2);\r\n const byte3 = ((enc3 & 3) << 6) | enc4;\r\n \r\n result += String.fromCharCode(byte1);\r\n if (enc3 !== 64) result += String.fromCharCode(byte2);\r\n if (enc4 !== 64) result += String.fromCharCode(byte3);\r\n }\r\n \r\n return result;\r\n },\r\n \r\n uuid() {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = Math.random() * 16 | 0;\r\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n }\r\n },\r\n\r\n preload: {\r\n cache: new Map(),\r\n\r\n async loadImage(url, options = {}) {\r\n const { crossOrigin = 'anonymous' } = options;\r\n \r\n if (this.cache.has(url)) {\r\n return this.cache.get(url);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.crossOrigin = crossOrigin;\r\n \r\n img.onload = () => {\r\n this.cache.set(url, img);\r\n resolve(img);\r\n };\r\n \r\n img.onerror = () => {\r\n reject(new Error(`Failed to load image: ${url}`));\r\n };\r\n \r\n img.src = url;\r\n });\r\n },\r\n\r\n async loadImages(urls, options = {}) {\r\n const { parallel = true } = options;\r\n \r\n if (parallel) {\r\n return Promise.all(urls.map(url => this.loadImage(url, options)));\r\n }\r\n \r\n const results = [];\r\n for (const url of urls) {\r\n results.push(await this.loadImage(url, options));\r\n }\r\n return results;\r\n },\r\n\r\n async loadScript(url, options = {}) {\r\n const { type = 'text/javascript', async = true, defer = false } = options;\r\n \r\n if (this.cache.has(url)) {\r\n return this.cache.get(url);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.type = type;\r\n script.async = async;\r\n script.defer = defer;\r\n \r\n script.onload = () => {\r\n this.cache.set(url, script);\r\n resolve(script);\r\n };\r\n \r\n script.onerror = () => {\r\n script.remove();\r\n reject(new Error(`Failed to load script: ${url}`));\r\n };\r\n \r\n script.src = url;\r\n document.head.appendChild(script);\r\n });\r\n },\r\n\r\n async loadStylesheet(url, options = {}) {\r\n const { media = 'all' } = options;\r\n \r\n if (this.cache.has(url)) {\r\n return this.cache.get(url);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = url;\r\n link.media = media;\r\n \r\n link.onload = () => {\r\n this.cache.set(url, link);\r\n resolve(link);\r\n };\r\n \r\n link.onerror = () => {\r\n link.remove();\r\n reject(new Error(`Failed to load stylesheet: ${url}`));\r\n };\r\n \r\n document.head.appendChild(link);\r\n });\r\n },\r\n\r\n async loadFont(fontFamily, src, options = {}) {\r\n const { weight = 'normal', style = 'normal' } = options;\r\n const fontFace = new FontFace(fontFamily, `url(${src})`, { weight, style });\r\n \r\n try {\r\n await fontFace.load();\r\n document.fonts.add(fontFace);\r\n return fontFace;\r\n } catch (e) {\r\n throw new Error(`Failed to load font: ${fontFamily}`);\r\n }\r\n },\r\n\r\n async preload(url, type = 'image') {\r\n switch (type) {\r\n case 'image':\r\n return this.loadImage(url);\r\n case 'script':\r\n return this.loadScript(url);\r\n case 'stylesheet':\r\n case 'style':\r\n return this.loadStylesheet(url);\r\n default:\r\n throw new Error(`Unsupported preload type: ${type}`);\r\n }\r\n },\r\n\r\n isLoaded(url) {\r\n return this.cache.has(url);\r\n },\r\n\r\n clearCache() {\r\n this.cache.clear();\r\n },\r\n\r\n clearCacheByUrl(url) {\r\n this.cache.delete(url);\r\n }\r\n }\r\n};\r\n\r\nwindow.KupolaUtils = KupolaUtils;\r\nwindow.kupolaUtils = KupolaUtils;","class TrieNode {\r\n constructor() {\r\n this.children = {};\r\n this.keys = [];\r\n }\r\n}\r\n\r\nclass PathTrie {\r\n constructor() {\r\n this.root = new TrieNode();\r\n }\r\n\r\n insert(key) {\r\n let node = this.root;\r\n const parts = key.split('.');\r\n \r\n parts.forEach((part, index) => {\r\n if (!node.children[part]) {\r\n node.children[part] = new TrieNode();\r\n }\r\n node = node.children[part];\r\n if (index === parts.length - 1) {\r\n node.keys.push(key);\r\n }\r\n });\r\n }\r\n\r\n getSubKeys(key) {\r\n let node = this.root;\r\n const parts = key.split('.');\r\n const result = [];\r\n\r\n for (let i = 0; i < parts.length; i++) {\r\n const part = parts[i];\r\n if (!node.children[part]) {\r\n break;\r\n }\r\n node = node.children[part];\r\n \r\n const collectKeys = (n) => {\r\n if (n.keys.length > 0) {\r\n result.push(...n.keys);\r\n }\r\n Object.values(n.children).forEach(child => collectKeys(child));\r\n };\r\n collectKeys(node);\r\n }\r\n\r\n return [...new Set(result)];\r\n }\r\n\r\n getParentKeys(key) {\r\n const parts = key.split('.');\r\n const result = [];\r\n \r\n for (let i = 1; i <= parts.length; i++) {\r\n const parentPath = parts.slice(0, i).join('.');\r\n result.push(parentPath);\r\n }\r\n \r\n return result;\r\n }\r\n}\r\n\r\nconst REACTIVE_SYMBOLS = {\r\n parent: Symbol('reactive_parent'),\r\n path: Symbol('reactive_path'),\r\n isReactive: Symbol('reactive_is_reactive')\r\n};\r\n\r\nclass KupolaDataBind {\r\n constructor() {\r\n this.rawData = {};\r\n this.data = null;\r\n this.observers = {};\r\n this.elements = {};\r\n this.computedProperties = {};\r\n this.pathTrie = new PathTrie();\r\n this.updateQueue = new Map();\r\n this.isProcessing = false;\r\n this.pendingComputed = new Set();\r\n this.persistedKeys = new Map();\r\n this.snapshots = [];\r\n this.snapshotLimit = 10;\r\n this._proxyCache = new WeakMap();\r\n \r\n this.createReactiveData();\r\n }\r\n\r\n createReactiveData() {\r\n const handler = {\r\n get: (target, key, receiver) => {\r\n if (key === '__raw__') return target;\r\n const result = Reflect.get(target, key, receiver);\r\n if (result && typeof result === 'object' && !Array.isArray(result)) {\r\n return this.wrapReactive(result, key);\r\n }\r\n return result;\r\n },\r\n set: (target, key, value, receiver) => {\r\n const oldValue = Reflect.get(target, key, receiver);\r\n const result = Reflect.set(target, key, value, receiver);\r\n \r\n const fullPath = this.resolvePath(target, key);\r\n this.notify(fullPath, value, oldValue);\r\n this.queueUpdate(fullPath, value);\r\n \r\n return result;\r\n },\r\n deleteProperty: (target, key) => {\r\n const oldValue = Reflect.get(target, key, receiver);\r\n const result = Reflect.deleteProperty(target, key);\r\n \r\n const fullPath = this.resolvePath(target, key);\r\n this.notify(fullPath, undefined, oldValue);\r\n this.queueUpdate(fullPath, undefined);\r\n \r\n return result;\r\n }\r\n };\r\n\r\n this.data = new Proxy(this.rawData, handler);\r\n this.data.__parent__ = null;\r\n this.data.__path__ = '';\r\n }\r\n\r\n wrapReactive(obj, parentKey) {\r\n if (obj[REACTIVE_SYMBOLS.isReactive]) return obj;\r\n \r\n if (this._proxyCache.has(obj)) {\r\n return this._proxyCache.get(obj);\r\n }\r\n \r\n const handler = {\r\n get: (target, key, receiver) => {\r\n if (key === '__raw__') return target;\r\n if (key === REACTIVE_SYMBOLS.parent || key === '__parent__') return target[REACTIVE_SYMBOLS.parent];\r\n if (key === REACTIVE_SYMBOLS.path || key === '__path__') return target[REACTIVE_SYMBOLS.path];\r\n if (key === REACTIVE_SYMBOLS.isReactive || key === '__isReactive__') return true;\r\n \r\n const result = Reflect.get(target, key, receiver);\r\n if (result && typeof result === 'object' && !Array.isArray(result)) {\r\n return this.wrapReactive(result, `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`);\r\n }\r\n return result;\r\n },\r\n set: (target, key, value, receiver) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive ||\r\n key === '__parent__' ||\r\n key === '__path__' ||\r\n key === '__isReactive__') {\r\n return true;\r\n }\r\n \r\n const oldValue = Reflect.get(target, key, receiver);\r\n const result = Reflect.set(target, key, value, receiver);\r\n \r\n const fullPath = `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`;\r\n this.notify(fullPath, value, oldValue);\r\n this.queueUpdate(fullPath, value);\r\n \r\n return result;\r\n },\r\n deleteProperty: (target, key) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive) {\r\n return false;\r\n }\r\n \r\n const oldValue = Reflect.get(target, key);\r\n const result = Reflect.deleteProperty(target, key);\r\n \r\n const fullPath = `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`;\r\n this.notify(fullPath, undefined, oldValue);\r\n this.queueUpdate(fullPath, undefined);\r\n \r\n return result;\r\n },\r\n has: (target, key) => {\r\n if (key === '__raw__' || \r\n key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive ||\r\n key === '__parent__' ||\r\n key === '__path__' ||\r\n key === '__isReactive__') {\r\n return true;\r\n }\r\n return key in target;\r\n },\r\n ownKeys: (target) => {\r\n return Reflect.ownKeys(target).filter(key => \r\n key !== REACTIVE_SYMBOLS.parent && \r\n key !== REACTIVE_SYMBOLS.path && \r\n key !== REACTIVE_SYMBOLS.isReactive\r\n );\r\n },\r\n getOwnPropertyDescriptor: (target, key) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive) {\r\n return {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: target[key]\r\n };\r\n }\r\n return Reflect.getOwnPropertyDescriptor(target, key);\r\n }\r\n };\r\n \r\n const proxy = new Proxy(obj, handler);\r\n obj[REACTIVE_SYMBOLS.parent] = obj;\r\n obj[REACTIVE_SYMBOLS.path] = parentKey;\r\n obj[REACTIVE_SYMBOLS.isReactive] = true;\r\n this._proxyCache.set(obj, proxy);\r\n \r\n Object.keys(obj).forEach(key => {\r\n if (obj[key] && typeof obj[key] === 'object' && !Array.isArray(obj[key])) {\r\n obj[key] = this.wrapReactive(obj[key], `${parentKey}${parentKey ? '.' : ''}${key}`);\r\n }\r\n });\r\n \r\n return proxy;\r\n }\r\n\r\n resolvePath(target, key) {\r\n if (target[REACTIVE_SYMBOLS.path]) {\r\n return `${target[REACTIVE_SYMBOLS.path]}.${key}`;\r\n }\r\n return key;\r\n }\r\n\r\n queueUpdate(key, value) {\r\n this.updateQueue.set(key, value);\r\n \r\n if (!this.isProcessing) {\r\n this.isProcessing = true;\r\n requestAnimationFrame(() => {\r\n this.processQueue();\r\n });\r\n }\r\n }\r\n\r\n processQueue() {\r\n const updatedKeys = new Set();\r\n \r\n this.updateQueue.forEach((value, key) => {\r\n updatedKeys.add(key);\r\n this.updateElementsDirect(key, value);\r\n \r\n const subKeys = this.pathTrie.getSubKeys(key);\r\n subKeys.forEach(subKey => {\r\n if (!updatedKeys.has(subKey)) {\r\n const subValue = this.get(subKey);\r\n this.updateElementsDirect(subKey, subValue);\r\n updatedKeys.add(subKey);\r\n }\r\n });\r\n });\r\n \r\n this.updateQueue.clear();\r\n this.processComputed();\r\n this.isProcessing = false;\r\n }\r\n\r\n updateElementsDirect(key, value) {\r\n if (this.elements[key]) {\r\n this.elements[key].forEach(element => {\r\n this.updateElement(element, value);\r\n });\r\n }\r\n }\r\n\r\n processComputed() {\r\n const computedKeys = Object.keys(this.computedProperties);\r\n \r\n computedKeys.forEach(name => {\r\n const prop = this.computedProperties[name];\r\n const depsChanged = prop.deps.some(dep => {\r\n return this.updateQueue.has(dep) || \r\n this.pathTrie.getSubKeys(dep).some(k => this.updateQueue.has(k));\r\n });\r\n \r\n if (depsChanged) {\r\n this.updateComputedProperty(name);\r\n }\r\n });\r\n }\r\n\r\n set(key, value, silent = false) {\r\n const oldValue = this.get(key);\r\n \r\n if (typeof key === 'object') {\r\n Object.assign(this.rawData, key);\r\n Object.keys(key).forEach(k => {\r\n if (!silent) {\r\n this.notify(k, key[k], oldValue?.[k]);\r\n this.queueUpdate(k, key[k]);\r\n }\r\n });\r\n } else {\r\n if (key.includes('.')) {\r\n this.setNested(key, value);\r\n } else {\r\n this.rawData[key] = value;\r\n }\r\n \r\n if (!silent) {\r\n this.notify(key, value, oldValue);\r\n this.queueUpdate(key, value);\r\n }\r\n }\r\n \r\n if (!silent) {\r\n this.processComputed();\r\n }\r\n }\r\n\r\n get(key) {\r\n if (!key) return undefined;\r\n if (key.includes('.')) {\r\n return this.getNested(key);\r\n }\r\n return this.rawData[key];\r\n }\r\n\r\n getNested(path) {\r\n if (!path) return undefined;\r\n return path.split('.').reduce((obj, key) => obj?.[key], this.rawData);\r\n }\r\n\r\n setNested(path, value) {\r\n const keys = path.split('.');\r\n const lastKey = keys.pop();\r\n const parent = keys.reduce((obj, key) => {\r\n if (!obj[key]) obj[key] = {};\r\n return obj[key];\r\n }, this.rawData);\r\n \r\n const oldValue = parent[lastKey];\r\n parent[lastKey] = value;\r\n this.notify(path, value, oldValue);\r\n this.queueUpdate(path, value);\r\n }\r\n\r\n observe(key, callback) {\r\n if (!this.observers[key]) {\r\n this.observers[key] = [];\r\n }\r\n this.observers[key].push(callback);\r\n }\r\n\r\n unobserve(key, callback) {\r\n if (this.observers[key]) {\r\n this.observers[key] = this.observers[key].filter(cb => cb !== callback);\r\n }\r\n }\r\n\r\n notify(key, value, oldValue) {\r\n if (this.observers[key]) {\r\n this.observers[key].forEach(callback => {\r\n try {\r\n callback(value, oldValue);\r\n } catch (e) {\r\n console.error(`Observer error for ${key}:`, e);\r\n }\r\n });\r\n }\r\n \r\n this.observers['*']?.forEach(callback => {\r\n try {\r\n callback(key, value, oldValue);\r\n } catch (e) {\r\n console.error('Wildcard observer error:', e);\r\n }\r\n });\r\n }\r\n\r\n updateElement(element, value) {\r\n const binding = element.getAttribute('data-bind');\r\n if (!binding) return;\r\n\r\n const bindings = binding.split('|');\r\n \r\n bindings.forEach(b => {\r\n const parts = b.split(':');\r\n const type = parts[0].trim();\r\n const target = parts[1]?.trim();\r\n\r\n switch (type) {\r\n case 'text':\r\n if (element.textContent !== String(value ?? '')) {\r\n element.textContent = value ?? '';\r\n }\r\n break;\r\n case 'html':\r\n if (element.innerHTML !== String(value ?? '')) {\r\n element.innerHTML = value ?? '';\r\n }\r\n break;\r\n case 'value':\r\n if (element.type === 'checkbox') {\r\n if (element.checked !== !!value) {\r\n element.checked = !!value;\r\n }\r\n } else if (element.value !== String(value ?? '')) {\r\n element.value = value ?? '';\r\n }\r\n break;\r\n case 'checked':\r\n if (element.checked !== !!value) {\r\n element.checked = !!value;\r\n }\r\n break;\r\n case 'disabled':\r\n if (element.disabled !== !!value) {\r\n element.disabled = !!value;\r\n }\r\n break;\r\n case 'hidden':\r\n const display = value ? 'none' : '';\r\n if (element.style.display !== display) {\r\n element.style.display = display;\r\n }\r\n break;\r\n case 'class':\r\n if (target) {\r\n if (value) {\r\n element.classList.add(target);\r\n } else {\r\n element.classList.remove(target);\r\n }\r\n }\r\n break;\r\n case 'style':\r\n if (target && element.style[target] !== String(value ?? '')) {\r\n element.style[target] = value ?? '';\r\n }\r\n break;\r\n case 'attr':\r\n if (target) {\r\n const current = element.getAttribute(target);\r\n if (current !== String(value ?? '')) {\r\n element.setAttribute(target, value ?? '');\r\n }\r\n }\r\n break;\r\n case 'src':\r\n if (element.src !== String(value ?? '')) {\r\n element.src = value ?? '';\r\n }\r\n break;\r\n case 'href':\r\n if (element.href !== String(value ?? '')) {\r\n element.href = value ?? '';\r\n }\r\n break;\r\n case 'placeholder':\r\n if (element.placeholder !== String(value ?? '')) {\r\n element.placeholder = value ?? '';\r\n }\r\n break;\r\n }\r\n });\r\n }\r\n\r\n computed(name, deps, callback) {\r\n this.computedProperties[name] = { deps, callback };\r\n \r\n deps.forEach(dep => {\r\n this.pathTrie.insert(dep);\r\n });\r\n \r\n this.updateComputedProperty(name);\r\n }\r\n\r\n updateComputedProperty(name) {\r\n const prop = this.computedProperties[name];\r\n if (!prop) return;\r\n \r\n try {\r\n const values = prop.deps.map(dep => this.get(dep));\r\n const result = prop.callback(...values);\r\n this.set(name, result, true);\r\n } catch (e) {\r\n console.error(`Computed error for ${name}:`, e);\r\n }\r\n }\r\n\r\n load(data) {\r\n Object.keys(data).forEach(key => {\r\n if (data[key] && typeof data[key] === 'object' && !Array.isArray(data[key])) {\r\n this.rawData[key] = this.wrapReactive(data[key], key);\r\n } else {\r\n this.rawData[key] = data[key];\r\n }\r\n this.queueUpdate(key, this.rawData[key]);\r\n });\r\n \r\n this.processComputed();\r\n }\r\n\r\n reset() {\r\n this.rawData = {};\r\n this.observers = {};\r\n this.elements = {};\r\n this.computedProperties = {};\r\n this.pathTrie = new PathTrie();\r\n this.updateQueue.clear();\r\n this.snapshots = [];\r\n this.createReactiveData();\r\n this.bind();\r\n }\r\n\r\n persist(key, options = {}) {\r\n const {\r\n storage: storageType = 'local',\r\n debounce = 0,\r\n version = 1,\r\n encrypt = false,\r\n encryptionKey = null\r\n } = options;\r\n\r\n const storage = storageType === 'session' ? sessionStorage : localStorage;\r\n \r\n this.persistedKeys.set(key, { \r\n storage, \r\n debounce, \r\n timeout: null,\r\n version,\r\n encrypt,\r\n encryptionKey\r\n });\r\n \r\n const value = this.get(key);\r\n if (value !== undefined) {\r\n this._persistSave(key, value, storage, { version, encrypt, encryptionKey });\r\n }\r\n \r\n this.observe(key, (newValue) => {\r\n const config = this.persistedKeys.get(key);\r\n if (!config) return;\r\n \r\n if (config.debounce > 0) {\r\n if (config.timeout) clearTimeout(config.timeout);\r\n config.timeout = setTimeout(() => {\r\n this._persistSave(key, newValue, config.storage, { \r\n version: config.version, \r\n encrypt: config.encrypt, \r\n encryptionKey: config.encryptionKey \r\n });\r\n }, config.debounce);\r\n } else {\r\n this._persistSave(key, newValue, config.storage, { \r\n version: config.version, \r\n encrypt: config.encrypt, \r\n encryptionKey: config.encryptionKey \r\n });\r\n }\r\n });\r\n }\r\n\r\n _persistSave(key, value, storage, options = {}) {\r\n try {\r\n const { version = 1, encrypt = false, encryptionKey = null } = options;\r\n \r\n const dataToStore = {\r\n value,\r\n version,\r\n timestamp: Date.now()\r\n };\r\n \r\n let serialized = JSON.stringify(dataToStore);\r\n \r\n if (encrypt && encryptionKey) {\r\n serialized = this._encrypt(serialized, encryptionKey);\r\n }\r\n \r\n this._ensureStorageCapacity(storage);\r\n storage.setItem(`kupola:${key}`, serialized);\r\n } catch (e) {\r\n console.warn(`Failed to persist key ${key}:`, e);\r\n \r\n if (e.name === 'QuotaExceededError' && storage === localStorage) {\r\n console.warn(`localStorage quota exceeded, trying sessionStorage for key ${key}`);\r\n try {\r\n sessionStorage.setItem(`kupola:${key}`, JSON.stringify({ value, version: 1 }));\r\n } catch (e2) {\r\n console.warn(`sessionStorage also failed for key ${key}:`, e2);\r\n }\r\n }\r\n }\r\n }\r\n\r\n _ensureStorageCapacity(storage) {\r\n try {\r\n const testKey = `kupola:__storage_test__`;\r\n storage.setItem(testKey, 'test');\r\n storage.removeItem(testKey);\r\n } catch (e) {\r\n if (e.name === 'QuotaExceededError') {\r\n this._cleanupOldStorage(storage);\r\n }\r\n }\r\n }\r\n\r\n _cleanupOldStorage(storage) {\r\n const now = Date.now();\r\n const maxAge = 30 * 24 * 60 * 60 * 1000;\r\n \r\n for (let i = 0; i < storage.length; i++) {\r\n const key = storage.key(i);\r\n if (key?.startsWith('kupola:')) {\r\n try {\r\n const data = JSON.parse(storage.getItem(key));\r\n if (data.timestamp && now - data.timestamp > maxAge) {\r\n storage.removeItem(key);\r\n }\r\n } catch (e) {\r\n storage.removeItem(key);\r\n }\r\n }\r\n }\r\n }\r\n\r\n _encrypt(text, key) {\r\n if (!window.CryptoJS) {\r\n console.warn('CryptoJS not available, encryption skipped');\r\n return text;\r\n }\r\n return window.CryptoJS.AES.encrypt(text, key).toString();\r\n }\r\n\r\n _decrypt(ciphertext, key) {\r\n if (!window.CryptoJS) {\r\n console.warn('CryptoJS not available, decryption skipped');\r\n return ciphertext;\r\n }\r\n try {\r\n const bytes = window.CryptoJS.AES.decrypt(ciphertext, key);\r\n return bytes.toString(window.CryptoJS.enc.Utf8);\r\n } catch (e) {\r\n console.warn('Decryption failed:', e);\r\n return ciphertext;\r\n }\r\n }\r\n\r\n unpersist(key) {\r\n const config = this.persistedKeys.get(key);\r\n if (config) {\r\n if (config.timeout) clearTimeout(config.timeout);\r\n config.storage.removeItem(`kupola:${key}`);\r\n this.persistedKeys.delete(key);\r\n }\r\n }\r\n\r\n loadPersisted(options = {}) {\r\n const persisted = {};\r\n const { encryptionKey = null } = options;\r\n \r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key?.startsWith('kupola:')) {\r\n const dataKey = key.replace('kupola:', '');\r\n try {\r\n const stored = localStorage.getItem(key);\r\n let parsed;\r\n \r\n if (encryptionKey) {\r\n const decrypted = this._decrypt(stored, encryptionKey);\r\n parsed = JSON.parse(decrypted);\r\n } else {\r\n parsed = JSON.parse(stored);\r\n }\r\n \r\n if (parsed.version !== undefined && parsed.version !== options.version) {\r\n console.debug(`Skipping outdated data for ${dataKey} (version ${parsed.version})`);\r\n continue;\r\n }\r\n \r\n persisted[dataKey] = parsed.value !== undefined ? parsed.value : parsed;\r\n } catch (e) {\r\n console.warn(`Failed to load persisted key ${dataKey}:`, e);\r\n }\r\n }\r\n }\r\n \r\n for (let i = 0; i < sessionStorage.length; i++) {\r\n const key = sessionStorage.key(i);\r\n if (key?.startsWith('kupola:')) {\r\n const dataKey = key.replace('kupola:', '');\r\n try {\r\n const stored = sessionStorage.getItem(key);\r\n let parsed;\r\n \r\n if (encryptionKey) {\r\n const decrypted = this._decrypt(stored, encryptionKey);\r\n parsed = JSON.parse(decrypted);\r\n } else {\r\n parsed = JSON.parse(stored);\r\n }\r\n \r\n if (parsed.version !== undefined && parsed.version !== options.version) {\r\n console.debug(`Skipping outdated data for ${dataKey} (version ${parsed.version})`);\r\n continue;\r\n }\r\n \r\n persisted[dataKey] = parsed.value !== undefined ? parsed.value : parsed;\r\n } catch (e) {}\r\n }\r\n }\r\n \r\n if (Object.keys(persisted).length > 0) {\r\n this.load(persisted);\r\n }\r\n \r\n return persisted;\r\n }\r\n\r\n _clone(data) {\r\n if (typeof structuredClone === 'function') {\r\n try {\r\n return structuredClone(data);\r\n } catch (e) {\r\n console.warn('structuredClone failed, falling back to JSON:', e);\r\n }\r\n }\r\n return JSON.parse(JSON.stringify(data));\r\n }\r\n\r\n snapshot() {\r\n const snapshot = this._clone(this.rawData);\r\n this.snapshots.push(snapshot);\r\n if (this.snapshots.length > this.snapshotLimit) {\r\n this.snapshots.shift();\r\n }\r\n return this.snapshots.length - 1;\r\n }\r\n\r\n rollback(index = -1) {\r\n if (this.snapshots.length === 0) return false;\r\n \r\n const snapshotIndex = index >= 0 ? index : this.snapshots.length - 1;\r\n const snapshot = this.snapshots[snapshotIndex];\r\n \r\n if (!snapshot) return false;\r\n \r\n this.rawData = this._clone(snapshot);\r\n this.createReactiveData();\r\n \r\n Object.keys(this.rawData).forEach(key => {\r\n this.queueUpdate(key, this.rawData[key]);\r\n });\r\n \r\n this.processComputed();\r\n return true;\r\n }\r\n\r\n getSnapshotCount() {\r\n return this.snapshots.length;\r\n }\r\n\r\n clearSnapshots() {\r\n this.snapshots = [];\r\n }\r\n\r\n serializeForm(formElement) {\r\n const data = {};\r\n \r\n formElement.querySelectorAll('input, select, textarea').forEach(element => {\r\n const name = element.getAttribute('data-bind');\r\n if (!name) return;\r\n \r\n const parts = name.split(':');\r\n const key = parts[1]?.trim();\r\n if (!key) return;\r\n \r\n if (element.type === 'checkbox') {\r\n if (!data[key]) data[key] = [];\r\n if (element.checked) {\r\n data[key].push(element.value);\r\n }\r\n } else if (element.type === 'radio') {\r\n if (element.checked) {\r\n data[key] = element.value;\r\n }\r\n } else {\r\n data[key] = element.value;\r\n }\r\n });\r\n \r\n return data;\r\n }\r\n\r\n fillForm(formElement, data) {\r\n Object.keys(data).forEach(key => {\r\n formElement.querySelectorAll('[data-bind*=\":' + key + '\"]').forEach(element => {\r\n if (element.type === 'checkbox') {\r\n element.checked = Array.isArray(data[key]) \r\n ? data[key].includes(element.value) \r\n : !!data[key];\r\n } else if (element.type === 'radio') {\r\n element.checked = element.value === data[key];\r\n } else {\r\n element.value = data[key] ?? '';\r\n }\r\n });\r\n });\r\n }\r\n\r\n createReactive(target, path = '') {\r\n if (target[REACTIVE_SYMBOLS.isReactive]) return target;\r\n \r\n if (this._proxyCache.has(target)) {\r\n return this._proxyCache.get(target);\r\n }\r\n \r\n const handler = {\r\n get: (target, key, receiver) => {\r\n if (key === '__raw__') return target;\r\n if (key === REACTIVE_SYMBOLS.parent || key === '__parent__') return target[REACTIVE_SYMBOLS.parent];\r\n if (key === REACTIVE_SYMBOLS.path || key === '__path__') return target[REACTIVE_SYMBOLS.path];\r\n if (key === REACTIVE_SYMBOLS.isReactive || key === '__isReactive__') return true;\r\n \r\n const result = Reflect.get(target, key, receiver);\r\n if (result && typeof result === 'object' && !Array.isArray(result)) {\r\n return this.wrapReactive(result, `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`);\r\n }\r\n return result;\r\n },\r\n set: (target, key, value, receiver) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive ||\r\n key === '__parent__' ||\r\n key === '__path__' ||\r\n key === '__isReactive__') {\r\n return true;\r\n }\r\n \r\n const oldValue = Reflect.get(target, key, receiver);\r\n const result = Reflect.set(target, key, value, receiver);\r\n \r\n const fullPath = `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`;\r\n this.notify(fullPath, value, oldValue);\r\n this.queueUpdate(fullPath, value);\r\n \r\n return result;\r\n },\r\n deleteProperty: (target, key) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive) {\r\n return false;\r\n }\r\n \r\n const oldValue = Reflect.get(target, key);\r\n const result = Reflect.deleteProperty(target, key);\r\n \r\n const fullPath = `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`;\r\n this.notify(fullPath, undefined, oldValue);\r\n this.queueUpdate(fullPath, undefined);\r\n \r\n return result;\r\n },\r\n has: (target, key) => {\r\n if (key === '__raw__' || \r\n key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive ||\r\n key === '__parent__' ||\r\n key === '__path__' ||\r\n key === '__isReactive__') {\r\n return true;\r\n }\r\n return key in target;\r\n },\r\n ownKeys: (target) => {\r\n return Reflect.ownKeys(target).filter(key => \r\n key !== REACTIVE_SYMBOLS.parent && \r\n key !== REACTIVE_SYMBOLS.path && \r\n key !== REACTIVE_SYMBOLS.isReactive\r\n );\r\n },\r\n getOwnPropertyDescriptor: (target, key) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive) {\r\n return {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: target[key]\r\n };\r\n }\r\n return Reflect.getOwnPropertyDescriptor(target, key);\r\n }\r\n };\r\n \r\n const proxy = new Proxy(target, handler);\r\n target[REACTIVE_SYMBOLS.parent] = target;\r\n target[REACTIVE_SYMBOLS.path] = path;\r\n target[REACTIVE_SYMBOLS.isReactive] = true;\r\n this._proxyCache.set(target, proxy);\r\n \r\n Object.keys(target).forEach(key => {\r\n if (target[key] && typeof target[key] === 'object' && !Array.isArray(target[key])) {\r\n target[key] = this.wrapReactive(target[key], `${path}${path ? '.' : ''}${key}`);\r\n }\r\n });\r\n \r\n return proxy;\r\n }\r\n\r\n bind() {\r\n document.querySelectorAll('[data-bind]').forEach(element => {\r\n this._bindElement(element);\r\n });\r\n \r\n if (!this._mutationObserver) {\r\n this._mutationObserver = new MutationObserver((mutations) => {\r\n mutations.forEach(mutation => {\r\n mutation.addedNodes.forEach(node => {\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n const bindElements = node.querySelectorAll('[data-bind]');\r\n bindElements.forEach(element => this._bindElement(element));\r\n if (node.hasAttribute && node.hasAttribute('data-bind')) {\r\n this._bindElement(node);\r\n }\r\n }\r\n });\r\n });\r\n });\r\n \r\n this._mutationObserver.observe(document.body, {\r\n childList: true,\r\n subtree: true\r\n });\r\n }\r\n }\r\n\r\n _bindElement(element) {\r\n const binding = element.getAttribute('data-bind');\r\n const parts = binding.split(':');\r\n const typePart = parts[0].split('|')[0].trim();\r\n const key = parts[1]?.trim();\r\n \r\n if (!key) return;\r\n \r\n this.pathTrie.insert(key);\r\n \r\n if (!this.elements[key]) {\r\n this.elements[key] = [];\r\n }\r\n \r\n if (!this.elements[key].includes(element)) {\r\n this.elements[key].push(element);\r\n }\r\n \r\n if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA' || element.tagName === 'SELECT') {\r\n const existingHandler = element.__kupolaBindHandler;\r\n if (existingHandler) {\r\n element.removeEventListener('input', existingHandler);\r\n }\r\n \r\n const handler = () => {\r\n const value = element.type === 'checkbox' ? element.checked : element.value;\r\n if (key.includes('.')) {\r\n this.setNested(key, value);\r\n } else {\r\n this.set(key, value);\r\n }\r\n };\r\n \r\n element.__kupolaBindHandler = handler;\r\n element.addEventListener('input', handler);\r\n }\r\n \r\n if (this.rawData[key] !== undefined) {\r\n this.updateElement(element, this.rawData[key]);\r\n }\r\n }\r\n\r\n destroy() {\r\n if (this._mutationObserver) {\r\n this._mutationObserver.disconnect();\r\n this._mutationObserver = null;\r\n }\r\n \r\n Object.values(this.elements).forEach(elements => {\r\n elements.forEach(element => {\r\n const handler = element.__kupolaBindHandler;\r\n if (handler) {\r\n element.removeEventListener('input', handler);\r\n delete element.__kupolaBindHandler;\r\n }\r\n });\r\n });\r\n \r\n this.persistedKeys.forEach((config, key) => {\r\n if (config.timeout) clearTimeout(config.timeout);\r\n });\r\n this.persistedKeys.clear();\r\n \r\n this.rawData = {};\r\n this.observers = {};\r\n this.elements = {};\r\n this.computedProperties = {};\r\n this.pathTrie = new PathTrie();\r\n this.updateQueue.clear();\r\n this.snapshots = [];\r\n }\r\n}\r\n\r\nclass KupolaStore {\r\n constructor(name, options = {}) {\r\n this.name = name;\r\n this._stateKey = `__store_${name}__`;\r\n \r\n const initialState = options.state ? options.state() : {};\r\n this.getters = options.getters || {};\r\n this.actions = options.actions || {};\r\n this.mutations = options.mutations || {};\r\n \r\n this.observers = {};\r\n \r\n if (window.kupolaData) {\r\n window.kupolaData.set(this._stateKey, initialState);\r\n this.state = window.kupolaData.data?.[this._stateKey] || \r\n window.kupolaData.createReactive(initialState, this._stateKey);\r\n \r\n window.kupolaData.observe(this._stateKey, (newState) => {\r\n this.notify(newState);\r\n });\r\n } else {\r\n this.state = initialState;\r\n }\r\n \r\n this._bindGetters();\r\n this._bindActions();\r\n }\r\n\r\n _bindGetters() {\r\n Object.keys(this.getters).forEach(name => {\r\n Object.defineProperty(this, name, {\r\n get: () => this.getters[name](this.state),\r\n enumerable: true\r\n });\r\n });\r\n }\r\n\r\n _bindActions() {\r\n Object.keys(this.actions).forEach(name => {\r\n this[name] = (...args) => {\r\n return this.actions[name]({\r\n state: this.state,\r\n commit: this.commit.bind(this),\r\n dispatch: this.dispatch.bind(this),\r\n getters: this\r\n }, ...args);\r\n };\r\n });\r\n }\r\n\r\n commit(type, payload) {\r\n const mutation = this.mutations[type];\r\n if (!mutation) {\r\n console.warn(`Mutation ${type} not found in store ${this.name}`);\r\n return;\r\n }\r\n \r\n mutation(this.state, payload);\r\n }\r\n\r\n dispatch(type, payload) {\r\n const action = this.actions[type];\r\n if (!action) {\r\n console.warn(`Action ${type} not found in store ${this.name}`);\r\n return;\r\n }\r\n \r\n return action({\r\n state: this.state,\r\n commit: this.commit.bind(this),\r\n dispatch: this.dispatch.bind(this),\r\n getters: this\r\n }, payload);\r\n }\r\n\r\n observe(callback) {\r\n if (!this.observers['*']) {\r\n this.observers['*'] = [];\r\n }\r\n this.observers['*'].push(callback);\r\n return callback;\r\n }\r\n\r\n unobserve(callback) {\r\n if (this.observers['*']) {\r\n this.observers['*'] = this.observers['*'].filter(cb => cb !== callback);\r\n }\r\n }\r\n\r\n notify(newState) {\r\n if (this.observers['*']) {\r\n this.observers['*'].forEach(callback => {\r\n try {\r\n callback(newState);\r\n } catch (e) {\r\n console.error(`Observer error for store ${this.name}:`, e);\r\n }\r\n });\r\n }\r\n \r\n if (window.kupolaData) {\r\n window.kupolaData.set(this.name, newState);\r\n }\r\n }\r\n\r\n toJSON() {\r\n return {\r\n name: this.name,\r\n state: this.state,\r\n getters: Object.keys(this.getters).reduce((acc, name) => {\r\n acc[name] = this[name];\r\n return acc;\r\n }, {})\r\n };\r\n }\r\n}\r\n\r\nclass KupolaStoreManager {\r\n constructor() {\r\n this.stores = new Map();\r\n }\r\n\r\n createStore(name, options) {\r\n const store = new KupolaStore(name, options);\r\n this.stores.set(name, store);\r\n return store;\r\n }\r\n\r\n getStore(name) {\r\n return this.stores.get(name);\r\n }\r\n\r\n registerStore(store) {\r\n if (store instanceof KupolaStore) {\r\n this.stores.set(store.name, store);\r\n }\r\n }\r\n\r\n dispose() {\r\n this.stores.clear();\r\n }\r\n}\r\n\r\nclass KupolaEventBus {\r\n constructor() {\r\n this.events = {};\r\n this.delegatedEvents = {};\r\n this.eventListeners = {};\r\n }\r\n\r\n on(eventName, callback) {\r\n if (!this.events[eventName]) {\r\n this.events[eventName] = [];\r\n }\r\n this.events[eventName].push(callback);\r\n return callback;\r\n }\r\n\r\n off(eventName, callback) {\r\n if (this.events[eventName]) {\r\n this.events[eventName] = this.events[eventName].filter(cb => cb !== callback);\r\n }\r\n }\r\n\r\n emit(eventName, data) {\r\n if (this.events[eventName]) {\r\n this.events[eventName].forEach(callback => {\r\n try {\r\n callback(data);\r\n } catch (e) {\r\n console.error(`Error in event handler for ${eventName}:`, e);\r\n }\r\n });\r\n }\r\n \r\n this.events['*']?.forEach(callback => {\r\n try {\r\n callback(eventName, data);\r\n } catch (e) {\r\n console.error(`Error in wildcard event handler:`, e);\r\n }\r\n });\r\n }\r\n\r\n once(eventName, callback) {\r\n const onceCallback = (data) => {\r\n callback(data);\r\n this.off(eventName, onceCallback);\r\n };\r\n this.on(eventName, onceCallback);\r\n return onceCallback;\r\n }\r\n\r\n delegate(selector, eventName, callback) {\r\n if (!this.delegatedEvents[eventName]) {\r\n this.delegatedEvents[eventName] = [];\r\n \r\n const listener = (e) => {\r\n this.delegatedEvents[eventName].forEach(({ selector: sel, cb }) => {\r\n if (e.target.matches(sel) || e.target.closest(sel)) {\r\n cb(e);\r\n }\r\n });\r\n };\r\n \r\n document.addEventListener(eventName, listener);\r\n this.eventListeners[eventName] = listener;\r\n }\r\n \r\n this.delegatedEvents[eventName].push({ selector, cb: callback });\r\n return callback;\r\n }\r\n\r\n undelegate(selector, eventName) {\r\n if (this.delegatedEvents[eventName]) {\r\n this.delegatedEvents[eventName] = this.delegatedEvents[eventName].filter(\r\n item => item.selector !== selector\r\n );\r\n \r\n if (this.delegatedEvents[eventName].length === 0) {\r\n const listener = this.eventListeners[eventName];\r\n if (listener) {\r\n document.removeEventListener(eventName, listener);\r\n delete this.eventListeners[eventName];\r\n }\r\n delete this.delegatedEvents[eventName];\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n Object.entries(this.eventListeners).forEach(([eventName, listener]) => {\r\n document.removeEventListener(eventName, listener);\r\n });\r\n \r\n this.events = {};\r\n this.delegatedEvents = {};\r\n this.eventListeners = {};\r\n }\r\n}\r\n\r\nconst kupolaData = new KupolaDataBind();\r\nconst kupolaEvents = new KupolaEventBus();\r\nconst kupolaStoreManager = new KupolaStoreManager();\r\n\r\nfunction createStore(name, options) {\r\n return kupolaStoreManager.createStore(name, options);\r\n}\r\n\r\nfunction getStore(name) {\r\n return kupolaStoreManager.getStore(name);\r\n}\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n kupolaData.loadPersisted();\r\n kupolaData.bind();\r\n});\r\n\r\nwindow.KupolaDataBind = KupolaDataBind;\r\nwindow.KupolaEventBus = KupolaEventBus;\r\nwindow.KupolaStore = KupolaStore;\r\nwindow.KupolaStoreManager = KupolaStoreManager;\r\nwindow.kupolaData = kupolaData;\r\nwindow.kupolaEvents = kupolaEvents;\r\nwindow.kupolaStoreManager = kupolaStoreManager;\r\nwindow.createStore = createStore;\r\nwindow.getStore = getStore;\r\n","const THEME_KEY = 'kupola-theme';\r\nconst BRAND_KEY = 'kupola-brand';\r\n\r\nconst BRAND_OPTIONS = [\r\n { id: 'green', name: '翠绿', color: '#32F08C' },\r\n { id: 'xionghuang', name: '雄黄', color: '#FF9900' },\r\n { id: 'jianghuang', name: '姜黄', color: '#E2C027' },\r\n { id: 'lanlv', name: '蓝绿', color: '#12A182' },\r\n { id: 'kongquelan', name: '孔雀蓝', color: '#0EB0C9' },\r\n { id: 'meiguizi', name: '玫瑰紫', color: '#BA2F7B' },\r\n { id: 'shihong', name: '柿红', color: '#F2481B' },\r\n { id: 'quhong', name: '紫云', color: '#B1A6CC' },\r\n { id: 'shanchahong', name: '山茶红', color: '#F05A46' },\r\n { id: 'zengqing', name: '曾青', color: '#535164' },\r\n { id: 'roulan', name: '柔蓝', color: '#106898' }\r\n];\r\n\r\nfunction getTheme() {\r\n return localStorage.getItem(THEME_KEY) || 'dark';\r\n}\r\n\r\nfunction setTheme(theme) {\r\n if (theme !== 'dark' && theme !== 'light') return;\r\n \r\n document.documentElement.setAttribute('data-theme', theme);\r\n localStorage.setItem(THEME_KEY, theme);\r\n \r\n const toggleBtn = document.querySelector('[data-theme-toggle]');\r\n if (toggleBtn) {\r\n toggleBtn.setAttribute('data-current-theme', theme);\r\n const icon = toggleBtn.querySelector('.theme-icon');\r\n if (icon) {\r\n const iconPath = icon.src.substring(0, icon.src.lastIndexOf('/') + 1);\r\n icon.src = theme === 'dark' \r\n ? iconPath + 'sun.svg' \r\n : iconPath + 'moon.svg';\r\n }\r\n }\r\n}\r\n\r\nfunction getBrand() {\r\n return localStorage.getItem(BRAND_KEY) || 'zengqing';\r\n}\r\n\r\nfunction setBrand(brandId) {\r\n const brand = BRAND_OPTIONS.find(b => b.id === brandId);\r\n if (!brand) return;\r\n \r\n document.documentElement.setAttribute('data-brand', brandId);\r\n localStorage.setItem(BRAND_KEY, brandId);\r\n \r\n const brandToggle = document.querySelector('[data-brand-toggle]');\r\n if (brandToggle) {\r\n brandToggle.setAttribute('data-current-brand', brandId);\r\n const brandIcon = brandToggle.querySelector('.brand-icon');\r\n if (brandIcon) {\r\n brandIcon.style.backgroundColor = brand.color;\r\n }\r\n const brandName = brandToggle.querySelector('.brand-name');\r\n if (brandName) {\r\n brandName.textContent = brand.name;\r\n }\r\n }\r\n \r\n const brandButtons = document.querySelectorAll('[data-brand-btn]');\r\n brandButtons.forEach(btn => {\r\n if (btn.getAttribute('data-brand-btn') === brandId) {\r\n btn.classList.add('is-active');\r\n } else {\r\n btn.classList.remove('is-active');\r\n }\r\n });\r\n}\r\n\r\nfunction initTheme() {\r\n \r\n const savedTheme = getTheme();\r\n setTheme(savedTheme);\r\n \r\n const savedBrand = getBrand();\r\n setBrand(savedBrand);\r\n \r\n const toggleBtn = document.querySelector('[data-theme-toggle]');\r\n if (toggleBtn) {\r\n toggleBtn.addEventListener('click', () => {\r\n const currentTheme = getTheme();\r\n const newTheme = currentTheme === 'dark' ? 'light' : 'dark';\r\n setTheme(newTheme);\r\n });\r\n }\r\n \r\n let brandPicker = document.getElementById('brand-picker');\r\n if (!brandPicker) {\r\n brandPicker = document.createElement('div');\r\n brandPicker.id = 'brand-picker';\r\n brandPicker.style.position = 'fixed';\r\n brandPicker.style.top = '64px';\r\n brandPicker.style.right = '16px';\r\n brandPicker.style.zIndex = '9998';\r\n brandPicker.style.display = 'none';\r\n brandPicker.style.padding = '12px';\r\n brandPicker.style.width = '200px';\r\n brandPicker.style.gridTemplateColumns = 'repeat(3, 1fr)';\r\n brandPicker.style.gap = '6px';\r\n brandPicker.style.backgroundColor = 'var(--bg-base-secondary)';\r\n brandPicker.style.border = '1px solid var(--border-neutral-l1)';\r\n brandPicker.style.borderRadius = '8px';\r\n brandPicker.style.boxShadow = '0 4px 20px rgba(0, 0, 0, 0.2)';\r\n brandPicker.style.overflow = 'hidden';\r\n \r\n BRAND_OPTIONS.forEach(brand => {\r\n const btn = document.createElement('button');\r\n btn.setAttribute('data-brand-btn', brand.id);\r\n btn.style.display = 'flex';\r\n btn.style.justifyContent = 'center';\r\n btn.style.alignItems = 'center';\r\n btn.style.height = '60px';\r\n btn.style.backgroundColor = brand.color;\r\n btn.style.color = ['#32F08C', '#FF9900', '#E2C027', '#0EB0C9', '#B1A6CC'].includes(brand.color) ? '#0C0C0D' : '#FFFFFF';\r\n btn.style.fontWeight = '500';\r\n btn.style.borderRadius = '4px';\r\n btn.style.border = 'none';\r\n btn.style.cursor = 'pointer';\r\n btn.style.margin = '0';\r\n btn.style.padding = '0';\r\n btn.textContent = brand.name;\r\n brandPicker.appendChild(btn);\r\n });\r\n \r\n document.body.appendChild(brandPicker);\r\n }\r\n \r\n const brandToggle = document.querySelector('[data-brand-toggle]');\r\n \r\n if (brandToggle && brandPicker) {\r\n brandToggle.onclick = function(e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n const isHidden = brandPicker.style.display === 'none';\r\n brandPicker.style.display = isHidden ? 'grid' : 'none';\r\n \r\n if (isHidden) {\r\n setTimeout(() => {\r\n document.addEventListener('click', closeBrandPicker, true);\r\n }, 0);\r\n } else {\r\n document.removeEventListener('click', closeBrandPicker, true);\r\n }\r\n };\r\n \r\n brandPicker.onclick = function(e) {\r\n e.stopPropagation();\r\n };\r\n }\r\n \r\n function closeBrandPicker(e) {\r\n if (brandPicker && brandToggle) {\r\n if (!brandPicker.contains(e.target) && !brandToggle.contains(e.target)) {\r\n brandPicker.style.display = 'none';\r\n document.removeEventListener('click', closeBrandPicker, true);\r\n }\r\n }\r\n }\r\n \r\n const brandButtons = document.querySelectorAll('[data-brand-btn]');\r\n \r\n brandButtons.forEach(btn => {\r\n btn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n const brandId = btn.getAttribute('data-brand-btn');\r\n setBrand(brandId);\r\n if (brandPicker) {\r\n brandPicker.style.display = 'none';\r\n }\r\n });\r\n });\r\n}\r\n\r\nfunction createThemeToggle() {\r\n const btn = document.createElement('button');\r\n btn.setAttribute('data-theme-toggle', '');\r\n btn.setAttribute('data-current-theme', getTheme());\r\n btn.className = 'ds-btn ds-btn--ghost ds-btn--sm ds-btn--icon';\r\n btn.style.position = 'fixed';\r\n btn.style.top = '16px';\r\n btn.style.right = '16px';\r\n btn.style.zIndex = '9999';\r\n \r\n const icon = document.createElement('img');\r\n icon.className = 'theme-icon';\r\n const scripts = document.getElementsByTagName('script');\r\n const currentScript = scripts[scripts.length - 1];\r\n const scriptPath = currentScript.src.substring(0, currentScript.src.lastIndexOf('/') + 1);\r\n icon.src = getTheme() === 'dark' \r\n ? scriptPath + '../icons/sun.svg' \r\n : scriptPath + '../icons/moon.svg';\r\n icon.width = 14;\r\n icon.height = 14;\r\n icon.alt = 'Toggle theme';\r\n \r\n btn.appendChild(icon);\r\n document.body.appendChild(btn);\r\n \r\n btn.addEventListener('click', () => {\r\n const currentTheme = getTheme();\r\n const newTheme = currentTheme === 'dark' ? 'light' : 'dark';\r\n setTheme(newTheme);\r\n });\r\n \r\n return btn;\r\n}\r\n\r\nfunction createBrandPicker() {\r\n const container = document.createElement('div');\r\n container.id = 'brand-picker-auto';\r\n container.style.position = 'fixed';\r\n container.style.top = '56px';\r\n container.style.right = '16px';\r\n container.style.zIndex = '9998';\r\n container.style.display = 'none';\r\n container.style.padding = '12px';\r\n container.style.width = '200px';\r\n container.style.gridTemplateColumns = 'repeat(3, 1fr)';\r\n container.style.gap = '6px';\r\n container.style.backgroundColor = 'var(--bg-base-secondary)';\r\n container.style.border = '1px solid var(--border-neutral-l1)';\r\n container.style.borderRadius = '8px';\r\n container.style.boxShadow = '0 4px 20px rgba(0, 0, 0, 0.2)';\r\n container.style.overflow = 'hidden';\r\n \r\n BRAND_OPTIONS.forEach(brand => {\r\n const btn = document.createElement('button');\r\n btn.setAttribute('data-brand-btn', brand.id);\r\n btn.style.display = 'flex';\r\n btn.style.justifyContent = 'center';\r\n btn.style.alignItems = 'center';\r\n btn.style.height = '60px';\r\n btn.style.backgroundColor = brand.color;\r\n btn.style.color = ['#32F08C', '#FF9900', '#E2C027', '#0EB0C9', '#B1A6CC'].includes(brand.color) ? '#0C0C0D' : '#FFFFFF';\r\n btn.style.fontWeight = '500';\r\n btn.style.borderRadius = '4px';\r\n btn.style.border = 'none';\r\n btn.style.cursor = 'pointer';\r\n btn.style.margin = '0';\r\n btn.style.padding = '0';\r\n btn.textContent = brand.name;\r\n container.appendChild(btn);\r\n });\r\n \r\n document.body.appendChild(container);\r\n \r\n const toggleBtn = document.createElement('button');\r\n toggleBtn.setAttribute('data-brand-toggle', '');\r\n toggleBtn.setAttribute('data-current-brand', getBrand());\r\n toggleBtn.className = 'ds-btn ds-btn--ghost ds-btn--sm';\r\n toggleBtn.style.position = 'fixed';\r\n toggleBtn.style.top = '16px';\r\n toggleBtn.style.right = '56px';\r\n toggleBtn.style.zIndex = '9999';\r\n toggleBtn.style.display = 'flex';\r\n toggleBtn.style.alignItems = 'center';\r\n toggleBtn.style.gap = '6px';\r\n \r\n const brandIcon = document.createElement('span');\r\n brandIcon.className = 'brand-icon';\r\n brandIcon.style.width = '12px';\r\n brandIcon.style.height = '12px';\r\n brandIcon.style.borderRadius = '50%';\r\n brandIcon.style.backgroundColor = BRAND_OPTIONS.find(b => b.id === getBrand()).color;\r\n \r\n const brandName = document.createElement('span');\r\n brandName.className = 'brand-name';\r\n brandName.style.fontSize = '11px';\r\n brandName.textContent = BRAND_OPTIONS.find(b => b.id === getBrand()).name;\r\n \r\n toggleBtn.appendChild(brandIcon);\r\n toggleBtn.appendChild(brandName);\r\n document.body.appendChild(toggleBtn);\r\n \r\n toggleBtn.onclick = function(e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n const isHidden = container.style.display === 'none';\r\n container.style.display = isHidden ? 'grid' : 'none';\r\n \r\n if (isHidden) {\r\n setTimeout(() => {\r\n document.addEventListener('click', closeBrandPickerAuto, true);\r\n }, 0);\r\n } else {\r\n document.removeEventListener('click', closeBrandPickerAuto, true);\r\n }\r\n };\r\n \r\n container.onclick = function(e) {\r\n e.stopPropagation();\r\n };\r\n \r\n function closeBrandPickerAuto(e) {\r\n if (!container.contains(e.target) && !toggleBtn.contains(e.target)) {\r\n container.style.display = 'none';\r\n document.removeEventListener('click', closeBrandPickerAuto, true);\r\n }\r\n }\r\n \r\n const brandButtons = container.querySelectorAll('[data-brand-btn]');\r\n brandButtons.forEach(btn => {\r\n btn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n const brandId = btn.getAttribute('data-brand-btn');\r\n setBrand(brandId);\r\n container.style.display = 'none';\r\n });\r\n });\r\n \r\n return { toggleBtn, container };\r\n}\r\n\r\nfunction loadDevTools() {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const enabled = urlParams.has('dev') || urlParams.has('debug');\r\n \r\n if (!enabled) return;\r\n \r\n const themeScript = document.querySelector('script[src*=\"theme.js\"]');\r\n if (!themeScript || !themeScript.src) return;\r\n \r\n const scriptPath = themeScript.src.substring(0, themeScript.src.lastIndexOf('/') + 1);\r\n \r\n const devToolsScript = document.createElement('script');\r\n devToolsScript.src = scriptPath + 'kupola-devtools.js?v=15';\r\n devToolsScript.async = true;\r\n \r\n document.head.appendChild(devToolsScript);\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { \r\n getTheme, setTheme, initTheme, createThemeToggle,\r\n getBrand, setBrand, BRAND_OPTIONS, createBrandPicker,\r\n loadDevTools\r\n };\r\n} else {\r\n if (!window.__kupolaThemeInitialized) {\r\n window.__kupolaThemeInitialized = true;\r\n \r\n function runInit() {\r\n initTheme();\r\n loadDevTools();\r\n }\r\n \r\n if (document.readyState === 'loading') {\r\n document.addEventListener('readystatechange', function readyStateHandler() {\r\n if (document.readyState !== 'loading') {\r\n document.removeEventListener('readystatechange', readyStateHandler);\r\n runInit();\r\n }\r\n });\r\n } else {\r\n setTimeout(runInit, 0);\r\n }\r\n }\r\n}","class Dropdown {\r\n constructor(element) {\r\n this.element = element;\r\n this.trigger = element.querySelector('.ds-dropdown__trigger');\r\n this.menu = element.querySelector('.ds-dropdown__menu');\r\n this.triggerText = this.trigger ? this.trigger.querySelector('span') : null;\r\n this.scope = `dropdown-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n this._triggerClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._itemClickHandler = null;\r\n }\r\n\r\n init() {\r\n if (!this.trigger || !this.menu) return;\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n this._itemClickHandler = (e) => {\r\n const item = e.currentTarget;\r\n if (this.triggerText) {\r\n this.triggerText.textContent = item.textContent.trim();\r\n }\r\n this.hideMenu();\r\n };\r\n\r\n this.menu.querySelectorAll('.ds-dropdown__item').forEach(item => {\r\n item.addEventListener('click', this._itemClickHandler);\r\n item._dropdownItemClickHandler = this._itemClickHandler;\r\n });\r\n\r\n this._triggerClickHandler = (e) => {\r\n e.stopPropagation();\r\n this.toggleMenu();\r\n };\r\n\r\n this.trigger.addEventListener('click', this._triggerClickHandler);\r\n\r\n this._documentClickHandler = (e) => {\r\n if (!this.element.contains(e.target)) {\r\n this.hideMenu();\r\n }\r\n };\r\n\r\n if (window.globalEvents) {\r\n this._documentClickListener = window.globalEvents.on(document, 'click', this._documentClickHandler, { scope: this.scope });\r\n } else {\r\n document.addEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n this.menu.style.display = 'none';\r\n this.element.__kupolaInitialized = true;\r\n }\r\n\r\n toggleMenu() {\r\n const isOpen = this.menu.style.display === 'block';\r\n this.menu.style.display = isOpen ? 'none' : 'block';\r\n this.element.classList.toggle('is-open', !isOpen);\r\n }\r\n\r\n hideMenu() {\r\n this.menu.style.display = 'none';\r\n this.element.classList.remove('is-open');\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n if (this.trigger && this._triggerClickHandler) {\r\n this.trigger.removeEventListener('click', this._triggerClickHandler);\r\n }\r\n\r\n if (this.menu) {\r\n this.menu.querySelectorAll('.ds-dropdown__item').forEach(item => {\r\n if (item._dropdownItemClickHandler) {\r\n item.removeEventListener('click', item._dropdownItemClickHandler);\r\n }\r\n });\r\n }\r\n\r\n if (this._documentClickListener && this._documentClickListener.unsubscribe) {\r\n this._documentClickListener.unsubscribe();\r\n } else if (this._documentClickHandler) {\r\n document.removeEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._triggerClickHandler = null;\r\n this._itemClickHandler = null;\r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initDropdown(element) {\r\n const dropdown = new Dropdown(element);\r\n dropdown.init();\r\n element._kupolaDropdown = dropdown;\r\n}\r\n\r\nfunction initDropdowns(root = document) {\r\n root.querySelectorAll('.ds-dropdown').forEach(dropdown => {\r\n initDropdown(dropdown);\r\n });\r\n}\r\n\r\nfunction cleanupDropdown(dropdown) {\r\n if (dropdown._kupolaDropdown) {\r\n dropdown._kupolaDropdown.destroy();\r\n dropdown._kupolaDropdown = null;\r\n }\r\n}\r\n\r\nfunction cleanupAllDropdowns() {\r\n document.querySelectorAll('.ds-dropdown').forEach(dropdown => {\r\n cleanupDropdown(dropdown);\r\n });\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('dropdown', initDropdown, cleanupDropdown);\r\n}","class Select {\r\n constructor(element) {\r\n this.element = element;\r\n this.trigger = element.querySelector('.ds-select__trigger');\r\n this.valueEl = element.querySelector('.ds-select__value') || element.querySelector('.ds-select__trigger span');\r\n this.optionsEl = element.querySelector('.ds-select__options') || element.querySelector('.ds-select__menu');\r\n this.nativeSelect = element.querySelector('select');\r\n this.icon = element.querySelector('.ds-select__icon');\r\n this.scope = `select-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n this._triggerClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._optionClickHandler = null;\r\n }\r\n\r\n init() {\r\n if (!this.trigger || !this.optionsEl) return;\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n this._optionClickHandler = (e) => {\r\n const option = e.currentTarget;\r\n const value = option.getAttribute('data-value');\r\n if (this.nativeSelect) {\r\n this.nativeSelect.value = value;\r\n }\r\n this.optionsEl.querySelectorAll('.ds-select__option, .ds-select__item').forEach(o => o.classList.remove('is-selected'));\r\n option.classList.add('is-selected');\r\n this.updateValue(option.textContent.trim());\r\n this.hideOptions();\r\n if (this.nativeSelect) {\r\n this.nativeSelect.dispatchEvent(new Event('change'));\r\n }\r\n };\r\n\r\n this.optionsEl.querySelectorAll('.ds-select__option, .ds-select__item').forEach(option => {\r\n option.addEventListener('click', this._optionClickHandler);\r\n option._selectOptionClickHandler = this._optionClickHandler;\r\n });\r\n\r\n this._triggerClickHandler = (e) => {\r\n e.stopPropagation();\r\n this.showOptions();\r\n };\r\n\r\n this.trigger.addEventListener('click', this._triggerClickHandler);\r\n\r\n this._documentClickHandler = (e) => {\r\n if (!this.element.contains(e.target)) {\r\n this.hideOptions();\r\n }\r\n };\r\n\r\n if (window.globalEvents) {\r\n this._documentClickListener = window.globalEvents.on(document, 'click', this._documentClickHandler, { scope: this.scope });\r\n } else {\r\n document.addEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n this.optionsEl.style.display = 'none';\r\n this.element.__kupolaInitialized = true;\r\n }\r\n\r\n updateValue(text) {\r\n if (this.valueEl) {\r\n this.valueEl.textContent = text || this.valueEl.textContent;\r\n }\r\n }\r\n\r\n showOptions() {\r\n const isOpen = this.optionsEl.style.display === 'block';\r\n this.optionsEl.style.display = isOpen ? 'none' : 'block';\r\n if (this.icon) {\r\n this.icon.style.transform = isOpen ? 'rotate(0deg)' : 'rotate(180deg)';\r\n }\r\n this.element.classList.toggle('is-open', !isOpen);\r\n }\r\n\r\n hideOptions() {\r\n this.optionsEl.style.display = 'none';\r\n if (this.icon) {\r\n this.icon.style.transform = 'rotate(0deg)';\r\n }\r\n this.element.classList.remove('is-open');\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n if (this.trigger && this._triggerClickHandler) {\r\n this.trigger.removeEventListener('click', this._triggerClickHandler);\r\n }\r\n\r\n if (this.optionsEl) {\r\n this.optionsEl.querySelectorAll('.ds-select__option, .ds-select__item').forEach(option => {\r\n if (option._selectOptionClickHandler) {\r\n option.removeEventListener('click', option._selectOptionClickHandler);\r\n }\r\n });\r\n }\r\n\r\n if (this._documentClickListener && this._documentClickListener.unsubscribe) {\r\n this._documentClickListener.unsubscribe();\r\n } else if (this._documentClickHandler) {\r\n document.removeEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._triggerClickHandler = null;\r\n this._optionClickHandler = null;\r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initSelect(element) {\r\n const select = new Select(element);\r\n select.init();\r\n element._kupolaSelect = select;\r\n}\r\n\r\nfunction initSelects(root = document) {\r\n root.querySelectorAll('.ds-select').forEach(select => {\r\n initSelect(select);\r\n });\r\n}\r\n\r\nfunction cleanupSelect(select) {\r\n if (select._kupolaSelect) {\r\n select._kupolaSelect.destroy();\r\n select._kupolaSelect = null;\r\n }\r\n}\r\n\r\nfunction cleanupAllSelects() {\r\n document.querySelectorAll('.ds-select').forEach(select => {\r\n cleanupSelect(select);\r\n });\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('select', initSelect, cleanupSelect);\r\n}","class Datepicker {\r\n constructor(element) {\r\n this.element = element;\r\n this.input = element.querySelector('input');\r\n this.icon = element.querySelector('.ds-datepicker__icon');\r\n this.calendarEl = element.querySelector('.ds-datepicker__calendar');\r\n this.scope = `datepicker-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n this._iconClickHandler = null;\r\n this._inputClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._resizeHandler = null;\r\n this._resizeListener = null;\r\n }\r\n\r\n init() {\r\n if (!this.calendarEl) return;\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n this._iconClickHandler = (e) => this.toggleCalendar(e);\r\n this._inputClickHandler = (e) => this.toggleCalendar(e);\r\n\r\n if (this.icon) {\r\n this.icon.addEventListener('click', this._iconClickHandler);\r\n }\r\n\r\n this.input.addEventListener('click', this._inputClickHandler);\r\n\r\n if (window.globalEvents) {\r\n this._documentClickListener = window.globalEvents.on(document, 'click', (e) => this.hideCalendar(e), { scope: this.scope });\r\n this._resizeListener = window.globalEvents.on(window, 'resize', () => this.resizeHandler(), { scope: this.scope });\r\n } else {\r\n document.addEventListener('click', (e) => this.hideCalendar(e));\r\n window.addEventListener('resize', () => this.resizeHandler());\r\n this._documentClickHandler = (e) => this.hideCalendar(e);\r\n this._resizeHandler = () => this.resizeHandler();\r\n }\r\n\r\n this.element.__kupolaInitialized = true;\r\n this.initCalendar();\r\n }\r\n\r\n calculatePosition() {\r\n const pickerRect = this.element.getBoundingClientRect();\r\n const calendarRect = this.calendarEl.getBoundingClientRect();\r\n const viewportHeight = window.innerHeight;\r\n \r\n const spaceBelow = viewportHeight - pickerRect.bottom;\r\n const spaceAbove = pickerRect.top;\r\n const calendarHeight = calendarRect.height || 280;\r\n \r\n if (spaceBelow >= calendarHeight) {\r\n this.calendarEl.style.top = 'calc(100% + 4px)';\r\n this.calendarEl.style.bottom = 'auto';\r\n } else if (spaceAbove >= calendarHeight) {\r\n this.calendarEl.style.top = 'auto';\r\n this.calendarEl.style.bottom = 'calc(100% + 4px)';\r\n } else {\r\n this.calendarEl.style.top = 'calc(100% + 4px)';\r\n this.calendarEl.style.bottom = 'auto';\r\n }\r\n }\r\n\r\n toggleCalendar(e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n const isVisible = this.calendarEl.style.display === 'block';\r\n \r\n document.querySelectorAll('.ds-datepicker__calendar').forEach(c => {\r\n c.style.display = 'none';\r\n c.setAttribute('hidden', '');\r\n });\r\n \r\n if (!isVisible) {\r\n this.calendarEl.style.display = 'block';\r\n this.calendarEl.removeAttribute('hidden');\r\n this.calculatePosition();\r\n }\r\n }\r\n\r\n hideCalendar(e) {\r\n if (!this.element.contains(e.target)) {\r\n this.calendarEl.style.display = 'none';\r\n this.calendarEl.setAttribute('hidden', '');\r\n }\r\n }\r\n\r\n resizeHandler() {\r\n if (this.calendarEl.style.display === 'block') {\r\n this.calculatePosition();\r\n }\r\n }\r\n\r\n initCalendar() {\r\n const calendar = this.calendarEl;\r\n const input = this.input;\r\n const titleEl = calendar.querySelector('.ds-datepicker__title');\r\n const daysEl = calendar.querySelector('.ds-datepicker__days');\r\n const prevBtn = calendar.querySelector('.ds-datepicker__nav--prev');\r\n const nextBtn = calendar.querySelector('.ds-datepicker__nav--next');\r\n \r\n let currentDate = new Date();\r\n if (input.value) {\r\n const parts = input.value.split('-');\r\n if (parts.length === 3) {\r\n currentDate = new Date(parts[0], parts[1] - 1, parts[2]);\r\n }\r\n }\r\n \r\n function renderCalendar() {\r\n daysEl.querySelectorAll('.ds-datepicker__day').forEach(dayEl => {\r\n if (dayEl._dayClickHandler) {\r\n dayEl.removeEventListener('click', dayEl._dayClickHandler);\r\n }\r\n });\r\n \r\n daysEl.innerHTML = '';\r\n \r\n const year = currentDate.getFullYear();\r\n const month = currentDate.getMonth();\r\n \r\n titleEl.textContent = `${year} ${['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][month]}`;\r\n \r\n const firstDay = new Date(year, month, 1).getDay();\r\n const daysInMonth = new Date(year, month + 1, 0).getDate();\r\n \r\n for (let i = 0; i < firstDay; i++) {\r\n const emptyDay = document.createElement('span');\r\n emptyDay.className = 'ds-datepicker__day--empty';\r\n daysEl.appendChild(emptyDay);\r\n }\r\n \r\n for (let day = 1; day <= daysInMonth; day++) {\r\n const dayEl = document.createElement('button');\r\n dayEl.className = 'ds-datepicker__day';\r\n dayEl.textContent = day;\r\n \r\n const dateStr = `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\r\n if (input.value === dateStr) {\r\n dayEl.classList.add('is-selected');\r\n }\r\n \r\n const today = new Date();\r\n const todayStr = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}-${String(today.getDate()).padStart(2, '0')}`;\r\n if (dateStr === todayStr) {\r\n dayEl.classList.add('is-today');\r\n }\r\n \r\n const dayClickHandler = () => {\r\n input.value = dateStr;\r\n calendar.style.display = 'none';\r\n calendar.setAttribute('hidden', '');\r\n input.dispatchEvent(new Event('change'));\r\n };\r\n \r\n dayEl.addEventListener('click', dayClickHandler);\r\n dayEl._dayClickHandler = dayClickHandler;\r\n \r\n daysEl.appendChild(dayEl);\r\n }\r\n }\r\n \r\n const prevClickHandler = (e) => {\r\n e.stopPropagation();\r\n currentDate.setMonth(currentDate.getMonth() - 1);\r\n renderCalendar();\r\n };\r\n \r\n const nextClickHandler = (e) => {\r\n e.stopPropagation();\r\n currentDate.setMonth(currentDate.getMonth() + 1);\r\n renderCalendar();\r\n };\r\n \r\n if (prevBtn) {\r\n prevBtn.addEventListener('click', prevClickHandler);\r\n prevBtn._prevClickHandler = prevClickHandler;\r\n }\r\n \r\n if (nextBtn) {\r\n nextBtn.addEventListener('click', nextClickHandler);\r\n nextBtn._nextClickHandler = nextClickHandler;\r\n }\r\n \r\n calendar._calendarInitialized = true;\r\n renderCalendar();\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n if (this.icon && this._iconClickHandler) {\r\n this.icon.removeEventListener('click', this._iconClickHandler);\r\n }\r\n\r\n if (this.input && this._inputClickHandler) {\r\n this.input.removeEventListener('click', this._inputClickHandler);\r\n }\r\n\r\n if (this._documentClickListener && this._documentClickListener.unsubscribe) {\r\n this._documentClickListener.unsubscribe();\r\n } else if (this._documentClickHandler) {\r\n document.removeEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n if (this._resizeListener && this._resizeListener.unsubscribe) {\r\n this._resizeListener.unsubscribe();\r\n } else if (this._resizeHandler) {\r\n window.removeEventListener('resize', this._resizeHandler);\r\n }\r\n\r\n if (this.calendarEl) {\r\n const daysEl = this.calendarEl.querySelector('.ds-datepicker__days');\r\n if (daysEl) {\r\n daysEl.querySelectorAll('.ds-datepicker__day').forEach(dayEl => {\r\n if (dayEl._dayClickHandler) {\r\n dayEl.removeEventListener('click', dayEl._dayClickHandler);\r\n }\r\n });\r\n }\r\n const prevBtn = this.calendarEl.querySelector('.ds-datepicker__nav--prev');\r\n const nextBtn = this.calendarEl.querySelector('.ds-datepicker__nav--next');\r\n if (prevBtn && prevBtn._prevClickHandler) {\r\n prevBtn.removeEventListener('click', prevBtn._prevClickHandler);\r\n }\r\n if (nextBtn && nextBtn._nextClickHandler) {\r\n nextBtn.removeEventListener('click', nextBtn._nextClickHandler);\r\n }\r\n }\r\n\r\n this._documentClickHandler = null;\r\n this._resizeHandler = null;\r\n this._documentClickListener = null;\r\n this._resizeListener = null;\r\n this._iconClickHandler = null;\r\n this._inputClickHandler = null;\r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initDatepicker(element) {\r\n const picker = new Datepicker(element);\r\n picker.init();\r\n element._kupolaDatepicker = picker;\r\n}\r\n\r\nfunction initDatepickers(root = document) {\r\n root.querySelectorAll('.ds-datepicker').forEach(picker => {\r\n initDatepicker(picker);\r\n });\r\n}\r\n\r\nfunction cleanupDatepicker(picker) {\r\n if (picker._kupolaDatepicker) {\r\n picker._kupolaDatepicker.destroy();\r\n picker._kupolaDatepicker = null;\r\n }\r\n}\r\n\r\nfunction cleanupAllDatepickers() {\r\n document.querySelectorAll('.ds-datepicker').forEach(picker => {\r\n cleanupDatepicker(picker);\r\n });\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('datepicker', initDatepicker, cleanupDatepicker);\r\n}","class Timepicker {\r\n constructor(element) {\r\n this.element = element;\r\n this.input = element.querySelector('input');\r\n this.inputWrap = element.querySelector('.ds-timepicker__input-wrap');\r\n this.panelEl = null;\r\n this.scope = `timepicker-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n this._inputWrapClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._resizeHandler = null;\r\n this._resizeListener = null;\r\n \r\n this.selectedHour = 12;\r\n this.selectedMinute = 0;\r\n }\r\n\r\n init() {\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n this._inputWrapClickHandler = (e) => {\r\n e.stopPropagation();\r\n if (this.panelEl && this.panelEl.style.display === 'block') {\r\n this.panelEl.style.display = 'none';\r\n } else {\r\n this.showTimepicker();\r\n }\r\n };\r\n\r\n this.inputWrap.addEventListener('click', this._inputWrapClickHandler);\r\n\r\n if (window.globalEvents) {\r\n this._documentClickListener = window.globalEvents.on(document, 'click', (e) => this.hideTimepicker(e), { scope: this.scope });\r\n this._resizeListener = window.globalEvents.on(window, 'resize', () => this.resizeHandler(), { scope: this.scope });\r\n } else {\r\n document.addEventListener('click', (e) => this.hideTimepicker(e));\r\n window.addEventListener('resize', () => this.resizeHandler());\r\n this._documentClickHandler = (e) => this.hideTimepicker(e);\r\n this._resizeHandler = () => this.resizeHandler();\r\n }\r\n\r\n this.element.__kupolaInitialized = true;\r\n }\r\n\r\n calculatePosition() {\r\n if (!this.panelEl) return;\r\n \r\n const pickerRect = this.element.getBoundingClientRect();\r\n const panelRect = this.panelEl.getBoundingClientRect();\r\n const viewportHeight = window.innerHeight;\r\n \r\n const spaceBelow = viewportHeight - pickerRect.bottom;\r\n const spaceAbove = pickerRect.top;\r\n const panelHeight = panelRect.height || 320;\r\n \r\n if (spaceBelow >= panelHeight) {\r\n this.panelEl.style.top = 'calc(100% + 4px)';\r\n this.panelEl.style.bottom = 'auto';\r\n } else if (spaceAbove >= panelHeight) {\r\n this.panelEl.style.top = 'auto';\r\n this.panelEl.style.bottom = 'calc(100% + 4px)';\r\n } else {\r\n this.panelEl.style.top = 'calc(100% + 4px)';\r\n this.panelEl.style.bottom = 'auto';\r\n }\r\n }\r\n\r\n showTimepicker() {\r\n if (this.panelEl) {\r\n this.panelEl.style.display = 'block';\r\n this.calculatePosition();\r\n return;\r\n }\r\n \r\n this.panelEl = document.createElement('div');\r\n this.panelEl.className = 'ds-timepicker__panel';\r\n this.panelEl.innerHTML = `\r\n <div class=\"ds-timepicker__header\">\r\n <div class=\"ds-timepicker__display\">\r\n <span class=\"ds-timepicker__display-hour\">12</span>\r\n <span class=\"ds-timepicker__separator\">:</span>\r\n <span class=\"ds-timepicker__display-minute\">00</span>\r\n </div>\r\n </div>\r\n <div class=\"ds-timepicker__body\">\r\n <div class=\"ds-timepicker__section\">\r\n <div class=\"ds-timepicker__section-label\">Hour</div>\r\n <div class=\"ds-timepicker__grid ds-timepicker__grid--hour\" data-type=\"hour\"></div>\r\n </div>\r\n <div class=\"ds-timepicker__section\">\r\n <div class=\"ds-timepicker__section-label\">Minute</div>\r\n <div class=\"ds-timepicker__grid ds-timepicker__grid--minute\" data-type=\"minute\"></div>\r\n </div>\r\n </div>\r\n `;\r\n this.element.appendChild(this.panelEl);\r\n \r\n if (this.input.value) {\r\n const timeParts = this.input.value.split(':');\r\n if (timeParts.length >= 2) {\r\n this.selectedHour = parseInt(timeParts[0]) || 0;\r\n this.selectedMinute = parseInt(timeParts[1]) || 0;\r\n }\r\n }\r\n \r\n const displayHour = this.panelEl.querySelector('.ds-timepicker__display-hour');\r\n const displayMinute = this.panelEl.querySelector('.ds-timepicker__display-minute');\r\n \r\n function updateDisplay() {\r\n displayHour.textContent = String(this.selectedHour).padStart(2, '0');\r\n displayMinute.textContent = String(this.selectedMinute).padStart(2, '0');\r\n }\r\n \r\n function updateInput() {\r\n this.input.value = `${String(this.selectedHour).padStart(2, '0')}:${String(this.selectedMinute).padStart(2, '0')}`;\r\n }\r\n \r\n function selectTimeAndClose() {\r\n updateInput.call(this);\r\n this.panelEl.style.display = 'none';\r\n this.input.dispatchEvent(new Event('change'));\r\n }\r\n \r\n const hourGrid = this.panelEl.querySelector('[data-type=\"hour\"]');\r\n const minuteGrid = this.panelEl.querySelector('[data-type=\"minute\"]');\r\n \r\n for (let i = 0; i < 24; i++) {\r\n const btn = document.createElement('button');\r\n btn.className = 'ds-timepicker__item';\r\n btn.textContent = String(i).padStart(2, '0');\r\n if (i === this.selectedHour) btn.classList.add('is-selected');\r\n btn.addEventListener('click', () => {\r\n hourGrid.querySelectorAll('.ds-timepicker__item').forEach(b => b.classList.remove('is-selected'));\r\n btn.classList.add('is-selected');\r\n this.selectedHour = i;\r\n updateDisplay.call(this);\r\n selectTimeAndClose.call(this);\r\n });\r\n hourGrid.appendChild(btn);\r\n }\r\n \r\n for (let i = 0; i < 60; i += 5) {\r\n const btn = document.createElement('button');\r\n btn.className = 'ds-timepicker__item';\r\n btn.textContent = String(i).padStart(2, '0');\r\n if (i === this.selectedMinute) btn.classList.add('is-selected');\r\n btn.addEventListener('click', () => {\r\n minuteGrid.querySelectorAll('.ds-timepicker__item').forEach(b => b.classList.remove('is-selected'));\r\n btn.classList.add('is-selected');\r\n this.selectedMinute = i;\r\n updateDisplay.call(this);\r\n selectTimeAndClose.call(this);\r\n });\r\n minuteGrid.appendChild(btn);\r\n }\r\n \r\n this.panelEl.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n });\r\n \r\n updateDisplay.call(this);\r\n updateInput.call(this);\r\n \r\n setTimeout(() => {\r\n this.calculatePosition();\r\n }, 0);\r\n }\r\n\r\n hideTimepicker(e) {\r\n if (this.panelEl && this.panelEl.style.display === 'block') {\r\n if (!this.element.contains(e.target)) {\r\n this.panelEl.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n resizeHandler() {\r\n if (this.panelEl && this.panelEl.style.display === 'block') {\r\n this.calculatePosition();\r\n }\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n if (this.inputWrap && this._inputWrapClickHandler) {\r\n this.inputWrap.removeEventListener('click', this._inputWrapClickHandler);\r\n }\r\n\r\n if (this._documentClickListener && this._documentClickListener.unsubscribe) {\r\n this._documentClickListener.unsubscribe();\r\n } else if (this._documentClickHandler) {\r\n document.removeEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n if (this._resizeListener && this._resizeListener.unsubscribe) {\r\n this._resizeListener.unsubscribe();\r\n } else if (this._resizeHandler) {\r\n window.removeEventListener('resize', this._resizeHandler);\r\n }\r\n\r\n if (this.panelEl) {\r\n this.panelEl.remove();\r\n this.panelEl = null;\r\n }\r\n\r\n this._inputWrapClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._resizeHandler = null;\r\n this._resizeListener = null;\r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initTimepicker(element) {\r\n const picker = new Timepicker(element);\r\n picker.init();\r\n element._kupolaTimepicker = picker;\r\n}\r\n\r\nfunction initTimepickers(root = document) {\r\n root.querySelectorAll('.ds-timepicker').forEach(picker => {\r\n initTimepicker(picker);\r\n });\r\n}\r\n\r\nfunction cleanupTimepicker(element) {\r\n if (element._kupolaTimepicker) {\r\n element._kupolaTimepicker.destroy();\r\n element._kupolaTimepicker = null;\r\n }\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('timepicker', initTimepicker, cleanupTimepicker);\r\n}","class Slider {\r\n constructor(element) {\r\n this.element = element;\r\n this.track = element.querySelector('.ds-slider__track');\r\n this.fill = element.querySelector('.ds-slider__fill');\r\n this.input = element.querySelector('.ds-slider__input');\r\n this.valueEl = element.querySelector('.ds-slider__value');\r\n\r\n if (!this.track || !this.fill || !this.input) {\r\n throw new Error('Slider: Missing required elements');\r\n }\r\n\r\n this._bindEvents();\r\n this.updateSlider();\r\n }\r\n\r\n _bindEvents() {\r\n this.updateSlider = () => {\r\n const value = this.input.value;\r\n const min = this.input.min || 0;\r\n const max = this.input.max || 100;\r\n const percentage = ((value - min) / (max - min)) * 100;\r\n\r\n this.fill.style.width = `${percentage}%`;\r\n if (this.valueEl) {\r\n this.valueEl.textContent = value;\r\n }\r\n this.element.setAttribute('aria-valuenow', value);\r\n };\r\n\r\n this.input.addEventListener('input', this.updateSlider);\r\n this.input.addEventListener('change', this.updateSlider);\r\n\r\n this._listeners = [\r\n { el: this.input, event: 'input', handler: this.updateSlider },\r\n { el: this.input, event: 'change', handler: this.updateSlider }\r\n ];\r\n }\r\n\r\n destroy() {\r\n this._listeners?.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.track = null;\r\n this.fill = null;\r\n this.input = null;\r\n this.valueEl = null;\r\n this.element = null;\r\n }\r\n\r\n setValue(value) {\r\n if (this.input) {\r\n this.input.value = value;\r\n this.updateSlider();\r\n }\r\n }\r\n\r\n getValue() {\r\n return this.input?.value;\r\n }\r\n}\r\n\r\nfunction initSlider(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n try {\r\n const slider = new Slider(element);\r\n element.__kupolaInstance = slider;\r\n element.__kupolaInitialized = true;\r\n } catch (error) {\r\n console.error('[Slider] Error initializing:', error);\r\n }\r\n}\r\n\r\nfunction cleanupSlider(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const slider = element.__kupolaInstance;\r\n slider.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initSliders() {\r\n document.querySelectorAll('.ds-slider').forEach(slider => {\r\n initSlider(slider);\r\n });\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('slider', initSlider, cleanupSlider);\r\n}","class Carousel {\r\n constructor(element) {\r\n this.element = element;\r\n this.track = element.querySelector('.ds-carousel__track');\r\n this.items = element.querySelectorAll('.ds-carousel__item');\r\n this.prevBtn = element.querySelector('.ds-carousel__prev');\r\n this.nextBtn = element.querySelector('.ds-carousel__next');\r\n this.indicators = element.querySelectorAll('.ds-carousel__indicator');\r\n this.autoBtn = element.querySelector('.ds-carousel__auto');\r\n \r\n this.currentIndex = 0;\r\n this.totalItems = this.items.length;\r\n this.autoPlayTimer = null;\r\n this.isAutoPlaying = false;\r\n \r\n this._mouseEnterHandler = () => this.stopAutoPlay();\r\n this._mouseLeaveHandler = () => { if (this.isAutoPlaying) this.startAutoPlay(); };\r\n \r\n this.init();\r\n }\r\n \r\n init() {\r\n this._prevClickHandler = () => this.prev();\r\n this._nextClickHandler = () => this.next();\r\n this._autoClickHandler = () => this.toggleAutoPlay();\r\n this._indicatorClickHandlers = [];\r\n \r\n if (this.prevBtn) {\r\n this.prevBtn.addEventListener('click', this._prevClickHandler);\r\n }\r\n if (this.nextBtn) {\r\n this.nextBtn.addEventListener('click', this._nextClickHandler);\r\n }\r\n \r\n this.indicators.forEach((indicator, index) => {\r\n const handler = () => this.goTo(index);\r\n this._indicatorClickHandlers.push(handler);\r\n indicator.addEventListener('click', handler);\r\n });\r\n \r\n if (this.autoBtn) {\r\n this.autoBtn.addEventListener('click', this._autoClickHandler);\r\n }\r\n \r\n this.updateIndicators();\r\n this.startAutoPlay();\r\n \r\n this.element.addEventListener('mouseenter', this._mouseEnterHandler);\r\n this.element.addEventListener('mouseleave', this._mouseLeaveHandler);\r\n }\r\n \r\n goTo(index) {\r\n if (index < 0 || index >= this.totalItems) return;\r\n \r\n this.currentIndex = index;\r\n const offset = -index * 100;\r\n this.track.style.transform = `translateX(${offset}%)`;\r\n this.updateIndicators();\r\n }\r\n \r\n prev() {\r\n const newIndex = this.currentIndex > 0 ? this.currentIndex - 1 : this.totalItems - 1;\r\n this.goTo(newIndex);\r\n }\r\n \r\n next() {\r\n const newIndex = this.currentIndex < this.totalItems - 1 ? this.currentIndex + 1 : 0;\r\n this.goTo(newIndex);\r\n }\r\n \r\n updateIndicators() {\r\n this.indicators.forEach((indicator, index) => {\r\n if (index === this.currentIndex) {\r\n indicator.classList.add('is-active');\r\n } else {\r\n indicator.classList.remove('is-active');\r\n }\r\n });\r\n }\r\n \r\n startAutoPlay() {\r\n if (this.totalItems <= 1) return;\r\n this.stopAutoPlay();\r\n this.isAutoPlaying = true;\r\n if (this.autoBtn) {\r\n this.autoBtn.classList.add('is-active');\r\n }\r\n this.autoPlayTimer = setInterval(() => this.next(), 3000);\r\n }\r\n \r\n stopAutoPlay() {\r\n if (this.autoPlayTimer) {\r\n clearInterval(this.autoPlayTimer);\r\n this.autoPlayTimer = null;\r\n }\r\n if (this.autoBtn) {\r\n this.autoBtn.classList.remove('is-active');\r\n }\r\n }\r\n \r\n toggleAutoPlay() {\r\n if (this.isAutoPlaying) {\r\n this.isAutoPlaying = false;\r\n this.stopAutoPlay();\r\n } else {\r\n this.startAutoPlay();\r\n }\r\n }\r\n \r\n destroy() {\r\n this.stopAutoPlay();\r\n this.element.removeEventListener('mouseenter', this._mouseEnterHandler);\r\n this.element.removeEventListener('mouseleave', this._mouseLeaveHandler);\r\n \r\n if (this.prevBtn && this._prevClickHandler) {\r\n this.prevBtn.removeEventListener('click', this._prevClickHandler);\r\n }\r\n if (this.nextBtn && this._nextClickHandler) {\r\n this.nextBtn.removeEventListener('click', this._nextClickHandler);\r\n }\r\n if (this.autoBtn && this._autoClickHandler) {\r\n this.autoBtn.removeEventListener('click', this._autoClickHandler);\r\n }\r\n \r\n this.indicators.forEach((indicator, index) => {\r\n const handler = this._indicatorClickHandlers[index];\r\n if (handler) {\r\n indicator.removeEventListener('click', handler);\r\n }\r\n });\r\n \r\n this._prevClickHandler = null;\r\n this._nextClickHandler = null;\r\n this._autoClickHandler = null;\r\n this._indicatorClickHandlers = null;\r\n }\r\n}\r\n\r\nfunction initCarousel(element) {\r\n if (element.__kupolaInitialized) return;\r\n \r\n const carousel = new Carousel(element);\r\n element.__kupolaInstance = carousel;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction initCarousels(root = document) {\r\n root.querySelectorAll('.ds-carousel').forEach(carousel => {\r\n initCarousel(carousel);\r\n });\r\n}\r\n\r\nfunction cleanupCarousel(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n \r\n const carousel = element.__kupolaInstance;\r\n carousel.destroy();\r\n \r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { Carousel, initCarousel, initCarousels, cleanupCarousel };\r\n} else {\r\n window.Carousel = Carousel;\r\n window.initCarousel = initCarousel;\r\n window.initCarousels = initCarousels;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('carousel', initCarousel, cleanupCarousel);\r\n }\r\n}\r\n","class Drawer {\r\n constructor(element) {\r\n this.element = element;\r\n this.mask = element.querySelector('.ds-drawer-mask');\r\n this.drawerEl = element.querySelector('.ds-drawer');\r\n this._bindEvents();\r\n }\r\n\r\n _bindEvents() {\r\n const closeBtn = this.mask?.querySelector('.ds-drawer__close');\r\n const cancelBtn = this.mask?.querySelector('.ds-drawer__footer .ds-btn--ghost');\r\n const confirmBtn = this.mask?.querySelector('.ds-drawer__footer .ds-btn--brand');\r\n\r\n this.closeDrawer = () => {\r\n if (this.mask) {\r\n this.mask.classList.remove('is-visible');\r\n }\r\n if (this.drawerEl) {\r\n this.drawerEl.classList.remove('is-visible');\r\n }\r\n };\r\n\r\n this.handleMaskClick = (e) => {\r\n if (e.target === this.mask) {\r\n this.closeDrawer();\r\n }\r\n };\r\n\r\n if (this.mask) {\r\n this.mask.addEventListener('click', this.handleMaskClick);\r\n }\r\n\r\n if (closeBtn) {\r\n closeBtn.addEventListener('click', this.closeDrawer);\r\n }\r\n\r\n if (cancelBtn) {\r\n cancelBtn.addEventListener('click', this.closeDrawer);\r\n }\r\n\r\n if (confirmBtn) {\r\n confirmBtn.addEventListener('click', this.closeDrawer);\r\n }\r\n\r\n this._listeners = [\r\n { el: this.mask, event: 'click', handler: this.handleMaskClick },\r\n { el: closeBtn, event: 'click', handler: this.closeDrawer },\r\n { el: cancelBtn, event: 'click', handler: this.closeDrawer },\r\n { el: confirmBtn, event: 'click', handler: this.closeDrawer }\r\n ].filter(item => item.el);\r\n }\r\n\r\n destroy() {\r\n this._listeners?.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.mask = null;\r\n this.drawerEl = null;\r\n this.element = null;\r\n }\r\n\r\n open() {\r\n if (this.mask) {\r\n this.mask.classList.add('is-visible');\r\n }\r\n if (this.drawerEl) {\r\n this.drawerEl.classList.add('is-visible');\r\n }\r\n }\r\n\r\n close() {\r\n this.closeDrawer();\r\n }\r\n}\r\n\r\nfunction initDrawer(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const drawer = new Drawer(element);\r\n element.__kupolaInstance = drawer;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupDrawer(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const drawer = element.__kupolaInstance;\r\n drawer.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initDrawers() {\r\n document.querySelectorAll('[data-drawer]').forEach(trigger => {\r\n trigger.addEventListener('click', () => {\r\n const drawerId = trigger.getAttribute('data-drawer');\r\n const drawer = document.getElementById(drawerId);\r\n\r\n if (!drawer) return;\r\n\r\n initDrawer(drawer);\r\n drawer.__kupolaInstance?.open();\r\n });\r\n });\r\n\r\n document.querySelectorAll('.ds-drawer-mask').forEach(mask => {\r\n const drawerEl = mask.parentElement;\r\n if (drawerEl) {\r\n initDrawer(drawerEl);\r\n }\r\n });\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('drawer', initDrawer, cleanupDrawer);\r\n}","class Modal {\r\n constructor(element) {\r\n this.element = element;\r\n this.mask = element.querySelector('.ds-modal-mask');\r\n this.modal = element.querySelector('.ds-modal');\r\n this.closeBtn = element.querySelector('.ds-modal__close');\r\n \r\n this._keydownHandler = (e) => {\r\n if (e.key === 'Escape' && this.isVisible()) {\r\n this.close();\r\n }\r\n };\r\n \r\n this._closeBtnClickHandler = () => this.close();\r\n \r\n this._maskClickHandler = (e) => {\r\n if (e.target === this.mask) {\r\n this.close();\r\n }\r\n };\r\n \r\n this.init();\r\n }\r\n \r\n init() {\r\n if (this.closeBtn) {\r\n this.closeBtn.addEventListener('click', this._closeBtnClickHandler);\r\n }\r\n \r\n if (this.mask) {\r\n this.mask.addEventListener('click', this._maskClickHandler);\r\n }\r\n \r\n document.addEventListener('keydown', this._keydownHandler);\r\n }\r\n \r\n open() {\r\n this.mask.classList.add('is-visible');\r\n Modal._openCount = (Modal._openCount || 0) + 1;\r\n document.body.style.overflow = 'hidden';\r\n }\r\n \r\n close() {\r\n this.mask.classList.remove('is-visible');\r\n Modal._openCount = Math.max(0, (Modal._openCount || 0) - 1);\r\n if (Modal._openCount === 0) {\r\n document.body.style.overflow = '';\r\n }\r\n }\r\n \r\n isVisible() {\r\n return this.mask.classList.contains('is-visible');\r\n }\r\n \r\n destroy() {\r\n document.removeEventListener('keydown', this._keydownHandler);\r\n if (this.closeBtn) {\r\n this.closeBtn.removeEventListener('click', this._closeBtnClickHandler);\r\n }\r\n if (this.mask) {\r\n this.mask.removeEventListener('click', this._maskClickHandler);\r\n }\r\n if (this.isVisible()) {\r\n this.close();\r\n }\r\n }\r\n}\r\n\r\nModal._openCount = 0;\r\n\r\nfunction createModal(options = {}) {\r\n const {\r\n title = '',\r\n content = '',\r\n width = '480px',\r\n onConfirm,\r\n onCancel\r\n } = options;\r\n \r\n const container = document.createElement('div');\r\n container.className = 'ds-modal-container';\r\n container.innerHTML = `\r\n <div class=\"ds-modal-mask\">\r\n <div class=\"ds-modal\" style=\"max-width: ${width}\">\r\n <div class=\"ds-modal__header\">\r\n <span class=\"ds-modal__title\"></span>\r\n <button class=\"ds-modal__close\" aria-label=\"Close\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M18 6L6 18M6 6l12 12\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n <div class=\"ds-modal__body\"></div>\r\n ${onConfirm || onCancel ? `\r\n <div class=\"ds-modal__footer\">\r\n ${onCancel ? `<button class=\"ds-btn ds-btn--ghost\" data-modal-cancel>Cancel</button>` : ''}\r\n ${onConfirm ? `<button class=\"ds-btn ds-btn--brand\" data-modal-confirm>OK</button>` : ''}\r\n </div>\r\n ` : ''}\r\n </div>\r\n </div>\r\n `;\r\n \r\n document.body.appendChild(container);\r\n \r\n const modal = new Modal(container);\r\n \r\n const titleEl = container.querySelector('.ds-modal__title');\r\n if (titleEl) titleEl.textContent = title;\r\n const bodyEl = container.querySelector('.ds-modal__body');\r\n if (bodyEl) bodyEl.textContent = content;\r\n \r\n const confirmBtn = container.querySelector('[data-modal-confirm]');\r\n const cancelBtn = container.querySelector('[data-modal-cancel]');\r\n \r\n const confirmHandler = () => {\r\n if (onConfirm) onConfirm();\r\n modal.close();\r\n };\r\n \r\n const cancelHandler = () => {\r\n if (onCancel) onCancel();\r\n modal.close();\r\n };\r\n \r\n if (confirmBtn) {\r\n confirmBtn.addEventListener('click', confirmHandler);\r\n }\r\n \r\n if (cancelBtn) {\r\n cancelBtn.addEventListener('click', cancelHandler);\r\n }\r\n \r\n const closeAndDestroy = () => {\r\n setTimeout(() => {\r\n if (confirmBtn) {\r\n confirmBtn.removeEventListener('click', confirmHandler);\r\n }\r\n if (cancelBtn) {\r\n cancelBtn.removeEventListener('click', cancelHandler);\r\n }\r\n modal.destroy();\r\n container.remove();\r\n }, 300);\r\n };\r\n \r\n const originalClose = modal.close.bind(modal);\r\n modal.close = () => {\r\n originalClose();\r\n closeAndDestroy();\r\n };\r\n \r\n modal.open();\r\n \r\n return modal;\r\n}\r\n\r\nfunction initModal(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const modal = new Modal(element);\r\n element.__kupolaInstance = modal;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupModal(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const modal = element.__kupolaInstance;\r\n modal.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initModals() {\r\n document.querySelectorAll('.ds-modal-container').forEach(container => {\r\n initModal(container);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { Modal, initModals, initModal, cleanupModal, createModal };\r\n} else {\r\n window.initModal = initModal;\r\n window.cleanupModal = cleanupModal;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('modal', initModal, cleanupModal);\r\n}\r\n","class Dialog {\r\n static normal(options = {}) {\r\n return this._create({ type: 'normal', ...options });\r\n }\r\n \r\n static success(options = {}) {\r\n return this._create({ type: 'success', ...options });\r\n }\r\n \r\n static warning(options = {}) {\r\n return this._create({ type: 'warning', ...options });\r\n }\r\n \r\n static error(options = {}) {\r\n return this._create({ type: 'error', ...options });\r\n }\r\n \r\n static info(options = {}) {\r\n return this._create({ type: 'info', ...options });\r\n }\r\n \r\n static confirm(options = {}) {\r\n return this._create({ type: 'confirm', ...options });\r\n }\r\n \r\n static _create(options) {\r\n const {\r\n type = 'normal',\r\n title = '',\r\n content = '',\r\n onConfirm,\r\n onCancel\r\n } = options;\r\n \r\n const icons = {\r\n normal: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>`,\r\n success: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"20 6 9 17 4 12\"/></svg>`,\r\n warning: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 9v4M12 17h.01\"/><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\"/></svg>`,\r\n error: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/></svg>`,\r\n info: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>`,\r\n confirm: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 9v4M12 17h.01\"/><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\"/></svg>`\r\n };\r\n \r\n const container = document.createElement('div');\r\n container.className = 'ds-modal-container';\r\n container.innerHTML = `\r\n <div class=\"ds-modal-mask\">\r\n <div class=\"ds-modal\" style=\"max-width: 360px\">\r\n <div class=\"ds-modal__body\" style=\"text-align: center; padding: 24px 16px;\">\r\n <div class=\"ds-dialog__icon ds-dialog__icon--${type}\">${icons[type]}</div>\r\n ${title ? '<div class=\"ds-dialog__title\"></div>' : ''}\r\n <div class=\"ds-dialog__content\"></div>\r\n <div class=\"ds-dialog__actions\">\r\n ${type === 'confirm' || onCancel ? `<button class=\"ds-btn ds-btn--ghost\" data-dialog-cancel>Cancel</button>` : ''}\r\n <button class=\"ds-btn ${type === 'confirm' ? 'ds-btn--brand' : 'ds-btn--ghost'}\" data-dialog-confirm>\r\n ${type === 'confirm' ? 'Confirm' : 'OK'}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n \r\n document.body.appendChild(container);\r\n \r\n if (title) container.querySelector('.ds-dialog__title').textContent = title;\r\n container.querySelector('.ds-dialog__content').textContent = content;\r\n \r\n const mask = container.querySelector('.ds-modal-mask');\r\n const confirmBtn = container.querySelector('[data-dialog-confirm]');\r\n const cancelBtn = container.querySelector('[data-dialog-cancel]');\r\n \r\n const keydownHandler = function(e) {\r\n if (e.key === 'Escape') {\r\n if (onCancel) onCancel();\r\n close();\r\n }\r\n };\r\n \r\n const maskClickHandler = function(e) {\r\n if (e.target === mask) {\r\n if (onCancel) onCancel();\r\n close();\r\n }\r\n };\r\n \r\n const confirmClickHandler = function() {\r\n if (onConfirm) onConfirm();\r\n close();\r\n };\r\n \r\n const cancelClickHandler = function() {\r\n if (onCancel) onCancel();\r\n close();\r\n };\r\n \r\n const close = () => {\r\n mask.classList.remove('is-visible');\r\n document.body.style.overflow = '';\r\n document.removeEventListener('keydown', keydownHandler);\r\n mask.removeEventListener('click', maskClickHandler);\r\n if (confirmBtn) {\r\n confirmBtn.removeEventListener('click', confirmClickHandler);\r\n }\r\n if (cancelBtn) {\r\n cancelBtn.removeEventListener('click', cancelClickHandler);\r\n }\r\n setTimeout(() => container.remove(), 300);\r\n };\r\n \r\n mask.classList.add('is-visible');\r\n document.body.style.overflow = 'hidden';\r\n \r\n if (confirmBtn) {\r\n confirmBtn.addEventListener('click', confirmClickHandler);\r\n }\r\n \r\n if (cancelBtn) {\r\n cancelBtn.addEventListener('click', cancelClickHandler);\r\n }\r\n \r\n mask.addEventListener('click', maskClickHandler);\r\n document.addEventListener('keydown', keydownHandler);\r\n \r\n return { close };\r\n }\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = Dialog;\r\n}","class FileUpload {\r\n constructor(element) {\r\n this.element = element;\r\n this.dropzone = element.querySelector('.ds-fileupload__dropzone');\r\n this.input = element.querySelector('.ds-fileupload__input');\r\n this.list = element.querySelector('.ds-fileupload__list');\r\n this.progress = element.querySelector('.ds-fileupload__preview');\r\n \r\n this.files = [];\r\n this.maxSize = parseInt(element.getAttribute('data-max-size')) || 0;\r\n this.maxCount = parseInt(element.getAttribute('data-max-count')) || 0;\r\n this._listeners = [];\r\n \r\n this.init();\r\n }\r\n\r\n init() {\r\n this.bindEvents();\r\n }\r\n\r\n bindEvents() {\r\n const clickHandler = (e) => {\r\n if (e.target === this.input || this.input.contains(e.target)) return;\r\n this.input.click();\r\n };\r\n\r\n const changeHandler = (e) => {\r\n const files = Array.from(e.target.files);\r\n this.addFiles(files);\r\n e.target.value = '';\r\n };\r\n\r\n const dragoverHandler = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.dropzone.classList.add('is-dragging');\r\n };\r\n\r\n const dragleaveHandler = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.dropzone.classList.remove('is-dragging');\r\n };\r\n\r\n const dropHandler = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.dropzone.classList.remove('is-dragging');\r\n \r\n const files = Array.from(e.dataTransfer.files);\r\n this.addFiles(files);\r\n };\r\n\r\n this.dropzone.addEventListener('click', clickHandler);\r\n this.input.addEventListener('change', changeHandler);\r\n this.dropzone.addEventListener('dragover', dragoverHandler);\r\n this.dropzone.addEventListener('dragleave', dragleaveHandler);\r\n this.dropzone.addEventListener('drop', dropHandler);\r\n\r\n this._listeners.push(\r\n { el: this.dropzone, event: 'click', handler: clickHandler },\r\n { el: this.input, event: 'change', handler: changeHandler },\r\n { el: this.dropzone, event: 'dragover', handler: dragoverHandler },\r\n { el: this.dropzone, event: 'dragleave', handler: dragleaveHandler },\r\n { el: this.dropzone, event: 'drop', handler: dropHandler }\r\n );\r\n }\r\n\r\n addFiles(files) {\r\n files.forEach(file => {\r\n if (this.maxCount > 0 && this.files.length >= this.maxCount) {\r\n this.showError(`Maximum ${this.maxCount} files allowed`);\r\n return;\r\n }\r\n if (this.isValidFile(file)) {\r\n this.files.push(file);\r\n this.renderFileItem(file);\r\n this.showPreview(file);\r\n }\r\n });\r\n \r\n this.dispatchChange();\r\n }\r\n\r\n isValidFile(file) {\r\n const accept = this.input.getAttribute('accept');\r\n if (accept && accept !== '') {\r\n const types = accept.split(',').map(t => t.trim());\r\n const fileType = file.type;\r\n const fileName = file.name.toLowerCase();\r\n \r\n const isValidType = types.some(type => {\r\n if (type.startsWith('.')) {\r\n return fileName.endsWith(type);\r\n } else if (type.includes('/')) {\r\n if (type.endsWith('/*')) {\r\n return fileType.startsWith(type.replace('/*', ''));\r\n }\r\n return fileType === type;\r\n }\r\n return true;\r\n });\r\n \r\n if (!isValidType) {\r\n this.showError(`File type not allowed: ${file.type}`);\r\n return false;\r\n }\r\n }\r\n \r\n if (this.maxSize > 0 && file.size > this.maxSize) {\r\n this.showError(`File size exceeds ${this.formatSize(this.maxSize)}`);\r\n return false;\r\n }\r\n \r\n return true;\r\n }\r\n\r\n renderFileItem(file) {\r\n const item = document.createElement('div');\r\n item.className = 'ds-fileupload__item';\r\n item.dataset.filename = file.name;\r\n \r\n const fileIcon = this.getFileIcon(file.type);\r\n \r\n item.innerHTML = `\r\n <div class=\"ds-fileupload__icon\" style=\"width: 24px; height: 24px; border-radius: 4px;\">\r\n ${fileIcon}\r\n </div>\r\n <span class=\"ds-fileupload__filename\">${this.truncateFilename(file.name)}</span>\r\n <span class=\"ds-fileupload__size\">${this.formatSize(file.size)}</span>\r\n <button class=\"ds-fileupload__remove\" type=\"button\" aria-label=\"Remove file\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M18 6L6 18\"/>\r\n <path d=\"M6 6l12 12\"/>\r\n </svg>\r\n </button>\r\n `;\r\n \r\n const removeBtn = item.querySelector('.ds-fileupload__remove');\r\n const removeHandler = () => {\r\n this.removeFile(file, item);\r\n };\r\n removeBtn.addEventListener('click', removeHandler);\r\n \r\n this._listeners.push({ el: removeBtn, event: 'click', handler: removeHandler });\r\n \r\n if (!this.list) {\r\n this.list = document.createElement('div');\r\n this.list.className = 'ds-fileupload__list';\r\n this.element.appendChild(this.list);\r\n }\r\n \r\n this.list.appendChild(item);\r\n }\r\n\r\n getFileIcon(type) {\r\n if (type.startsWith('image/')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><polyline points=\"21 15 16 10 5 21\"/></svg>';\r\n }\r\n if (type.startsWith('video/')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polygon points=\"23 7 16 12 23 17 23 7\"/><rect x=\"1\" y=\"5\" width=\"15\" height=\"14\" rx=\"2\" ry=\"2\"/></svg>';\r\n }\r\n if (type.startsWith('audio/')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\"/><path d=\"M19.07 4.93a10 10 0 0 1 0 14.14M15.54 8.46a5 5 0 0 1 0 7.07\"/></svg>';\r\n }\r\n if (type.includes('pdf')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"/><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"/><polyline points=\"10 9 9 9 8 9\"/></svg>';\r\n }\r\n if (type.includes('document') || type.includes('text')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"/><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"/><polyline points=\"10 9 9 9 8 9\"/></svg>';\r\n }\r\n if (type.includes('zip') || type.includes('archive')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"/><path d=\"M16 11V7a4 4 0 0 0-8 0v4\"/><polyline points=\"10 14 8 16 6 14\"/></svg>';\r\n }\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/></svg>';\r\n }\r\n\r\n truncateFilename(name, maxLength = 20) {\r\n if (name.length <= maxLength) return name;\r\n const extension = name.substring(name.lastIndexOf('.'));\r\n const nameWithoutExt = name.substring(0, name.lastIndexOf('.'));\r\n const truncated = nameWithoutExt.substring(0, maxLength - extension.length - 3) + '...';\r\n return truncated + extension;\r\n }\r\n\r\n formatSize(bytes) {\r\n if (bytes === 0) return '0 B';\r\n const k = 1024;\r\n const sizes = ['B', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];\r\n }\r\n\r\n removeFile(file, itemElement) {\r\n this.files = this.files.filter(f => f !== file);\r\n if (itemElement) {\r\n itemElement.remove();\r\n }\r\n if (this.files.length === 0 && this.list) {\r\n this.list.remove();\r\n this.list = null;\r\n }\r\n this.dispatchChange();\r\n }\r\n\r\n clearFiles() {\r\n this.files = [];\r\n if (this.list) {\r\n this.list.remove();\r\n this.list = null;\r\n }\r\n if (this.preview) {\r\n this.preview.innerHTML = '';\r\n }\r\n this.clearError();\r\n this.dispatchChange();\r\n }\r\n\r\n showError(message) {\r\n this.clearError();\r\n this.dropzone.classList.add('is-error');\r\n \r\n const errorElement = document.createElement('div');\r\n errorElement.className = 'ds-fileupload__error';\r\n errorElement.textContent = message;\r\n errorElement.setAttribute('role', 'alert');\r\n errorElement.setAttribute('aria-live', 'polite');\r\n this.dropzone.appendChild(errorElement);\r\n \r\n setTimeout(() => {\r\n this.clearError();\r\n }, 5000);\r\n }\r\n\r\n clearError() {\r\n this.dropzone.classList.remove('is-error');\r\n const errorElement = this.dropzone.querySelector('.ds-fileupload__error');\r\n if (errorElement) {\r\n errorElement.remove();\r\n }\r\n }\r\n\r\n showPreview(file) {\r\n if (!file.type.startsWith('image/')) return;\r\n \r\n if (!this.preview) {\r\n this.preview = document.createElement('div');\r\n this.preview.className = 'ds-fileupload__preview';\r\n this.element.insertBefore(this.preview, this.list || null);\r\n }\r\n \r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n const previewItem = document.createElement('div');\r\n previewItem.className = 'ds-fileupload__preview-item';\r\n previewItem.innerHTML = `\r\n <img src=\"${e.target.result}\" alt=\"${file.name}\">\r\n <button class=\"ds-fileupload__preview-remove\" type=\"button\" aria-label=\"Remove preview\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M18 6L6 18\"/>\r\n <path d=\"M6 6l12 12\"/>\r\n </svg>\r\n </button>\r\n `;\r\n \r\n const previewRemoveBtn = previewItem.querySelector('.ds-fileupload__preview-remove');\r\n const previewRemoveHandler = () => {\r\n this.removeFile(file, this.list?.querySelector(`[data-filename=\"${file.name}\"]`));\r\n previewItem.remove();\r\n if (this.preview && this.preview.children.length === 0) {\r\n this.preview.remove();\r\n this.preview = null;\r\n }\r\n };\r\n previewRemoveBtn.addEventListener('click', previewRemoveHandler);\r\n this._listeners.push({ el: previewRemoveBtn, event: 'click', handler: previewRemoveHandler });\r\n \r\n this.preview.appendChild(previewItem);\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n\r\n updateProgress(percent) {\r\n if (!this.progress) {\r\n this.progress = document.createElement('div');\r\n this.progress.className = 'ds-fileupload__progress';\r\n this.element.insertBefore(this.progress, this.list || null);\r\n }\r\n \r\n this.progress.style.display = 'block';\r\n \r\n const bar = this.progress.querySelector('.ds-fileupload__progress-bar') || document.createElement('div');\r\n bar.className = 'ds-fileupload__progress-bar';\r\n bar.style.width = `${percent}%`;\r\n \r\n if (!this.progress.querySelector('.ds-fileupload__progress-bar')) {\r\n this.progress.appendChild(bar);\r\n }\r\n \r\n if (percent >= 100) {\r\n setTimeout(() => {\r\n if (this.progress) {\r\n this.progress.remove();\r\n this.progress = null;\r\n }\r\n }, 500);\r\n }\r\n }\r\n\r\n simulateUpload(file) {\r\n this.updateProgress(0);\r\n const totalChunks = 100;\r\n let currentChunk = 0;\r\n const chunkSize = Math.max(1, Math.floor(file.size / totalChunks));\r\n \r\n const uploadInterval = setInterval(() => {\r\n currentChunk++;\r\n const percent = Math.min(100, Math.floor((currentChunk / totalChunks) * 100));\r\n this.updateProgress(percent);\r\n \r\n if (currentChunk >= totalChunks) {\r\n clearInterval(uploadInterval);\r\n this.updateProgress(100);\r\n }\r\n }, Math.max(50, Math.floor(5000 / totalChunks)));\r\n \r\n return uploadInterval;\r\n }\r\n\r\n getFiles() {\r\n return [...this.files];\r\n }\r\n\r\n dispatchChange() {\r\n this.element.dispatchEvent(new CustomEvent('ds-fileupload-change', {\r\n detail: {\r\n files: this.getFiles(),\r\n count: this.files.length\r\n }\r\n }));\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.files = [];\r\n this.dropzone = null;\r\n this.input = null;\r\n this.list = null;\r\n this.progress = null;\r\n this.preview = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initFileUpload(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const instance = new FileUpload(element);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupFileUpload(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initFileUploads() {\r\n document.querySelectorAll('.ds-fileupload').forEach(el => {\r\n initFileUpload(el);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { FileUpload, initFileUploads, initFileUpload, cleanupFileUpload };\r\n} else {\r\n window.FileUpload = FileUpload;\r\n window.initFileUpload = initFileUpload;\r\n window.cleanupFileUpload = cleanupFileUpload;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('fileupload', initFileUpload, cleanupFileUpload);\r\n}","class Collapse {\r\n constructor(element) {\r\n this.element = element;\r\n this.headers = [];\r\n this._listeners = [];\r\n this._init();\r\n }\r\n\r\n _init() {\r\n const headers = this.element.querySelectorAll('.ds-collapse__header');\r\n \r\n headers.forEach(header => {\r\n const item = header.closest('.ds-collapse__item');\r\n const content = header.nextElementSibling;\r\n \r\n if (!item || !content || !content.classList.contains('ds-collapse__content')) return;\r\n \r\n const isActive = item.classList.contains('is-active');\r\n content.style.height = isActive ? content.scrollHeight + 'px' : '0';\r\n \r\n const clickHandler = () => {\r\n const isExpanded = content.style.height !== '0px';\r\n \r\n if (isExpanded) {\r\n content.style.height = '0';\r\n item.classList.remove('is-active');\r\n } else {\r\n content.style.height = content.scrollHeight + 'px';\r\n item.classList.add('is-active');\r\n \r\n const transitionHandler = function onTransitionEnd() {\r\n content.removeEventListener('transitionend', transitionHandler);\r\n content.style.height = '';\r\n };\r\n content.addEventListener('transitionend', transitionHandler);\r\n this._listeners.push({ el: content, event: 'transitionend', handler: transitionHandler });\r\n }\r\n };\r\n \r\n header.addEventListener('click', clickHandler);\r\n this.headers.push({ header, item, content, clickHandler });\r\n this._listeners.push({ el: header, event: 'click', handler: clickHandler });\r\n });\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.headers = null;\r\n this.element = null;\r\n }\r\n\r\n toggle(index) {\r\n const headerInfo = this.headers[index];\r\n if (headerInfo) {\r\n headerInfo.clickHandler();\r\n }\r\n }\r\n\r\n expand(index) {\r\n const headerInfo = this.headers[index];\r\n if (headerInfo && !headerInfo.item.classList.contains('is-active')) {\r\n headerInfo.clickHandler();\r\n }\r\n }\r\n\r\n collapse(index) {\r\n const headerInfo = this.headers[index];\r\n if (headerInfo && headerInfo.item.classList.contains('is-active')) {\r\n headerInfo.clickHandler();\r\n }\r\n }\r\n\r\n expandAll() {\r\n this.headers.forEach((headerInfo, index) => {\r\n if (!headerInfo.item.classList.contains('is-active')) {\r\n this.toggle(index);\r\n }\r\n });\r\n }\r\n\r\n collapseAll() {\r\n this.headers.forEach((headerInfo, index) => {\r\n if (headerInfo.item.classList.contains('is-active')) {\r\n this.toggle(index);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction initCollapse(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const collapse = new Collapse(element);\r\n element.__kupolaInstance = collapse;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupCollapse(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const collapse = element.__kupolaInstance;\r\n collapse.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initCollapses() {\r\n document.querySelectorAll('.ds-collapse').forEach(collapse => {\r\n initCollapse(collapse);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { Collapse, initCollapses, initCollapse, cleanupCollapse };\r\n} else {\r\n window.Collapse = Collapse;\r\n window.initCollapse = initCollapse;\r\n window.cleanupCollapse = cleanupCollapse;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('collapse', initCollapse, cleanupCollapse);\r\n}","class ColorPicker {\r\n constructor(element) {\r\n this.element = element;\r\n this.trigger = element.querySelector('.ds-color-picker__trigger');\r\n this.panel = element.querySelector('.ds-color-picker__panel');\r\n this.valueSpan = element.querySelector('.ds-color-picker__value');\r\n this.customInput = element.querySelector('.ds-color-picker__input');\r\n this.scope = `colorpicker-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n this._triggerClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._colorClickHandler = null;\r\n this._inputInputHandler = null;\r\n }\r\n\r\n init() {\r\n if (!this.trigger || !this.panel) return;\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n this._triggerClickHandler = (e) => {\r\n e.stopPropagation();\r\n this.togglePanel();\r\n };\r\n\r\n this._colorClickHandler = (e) => {\r\n const colorBtn = e.currentTarget;\r\n const color = colorBtn.getAttribute('data-color');\r\n this.updateColor(color);\r\n this.hidePanel();\r\n };\r\n\r\n this._inputInputHandler = (e) => {\r\n this.updateColor(e.target.value);\r\n };\r\n\r\n this._documentClickHandler = (e) => {\r\n if (!this.element.contains(e.target)) {\r\n this.hidePanel();\r\n }\r\n };\r\n\r\n this.trigger.addEventListener('click', this._triggerClickHandler);\r\n\r\n this.panel.querySelectorAll('.ds-color-picker__color').forEach(colorBtn => {\r\n colorBtn.addEventListener('click', this._colorClickHandler);\r\n colorBtn._colorPickerColorHandler = this._colorClickHandler;\r\n });\r\n\r\n if (this.customInput) {\r\n this.customInput.addEventListener('input', this._inputInputHandler);\r\n this.customInput._colorPickerInputHandler = this._inputInputHandler;\r\n }\r\n\r\n if (window.globalEvents) {\r\n this._documentClickListener = window.globalEvents.on(document, 'click', this._documentClickHandler, { scope: this.scope });\r\n } else {\r\n document.addEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n this.element.__kupolaInitialized = true;\r\n }\r\n\r\n togglePanel() {\r\n this.panel.classList.toggle('is-visible');\r\n }\r\n\r\n hidePanel() {\r\n this.panel.classList.remove('is-visible');\r\n }\r\n\r\n updateColor(color) {\r\n this.trigger.style.backgroundColor = color;\r\n if (this.valueSpan) {\r\n this.valueSpan.textContent = color.toUpperCase();\r\n }\r\n if (this.customInput) {\r\n this.customInput.value = color;\r\n }\r\n this.element.dispatchEvent(new CustomEvent('colorchange', { detail: { color } }));\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n if (this.trigger && this._triggerClickHandler) {\r\n this.trigger.removeEventListener('click', this._triggerClickHandler);\r\n }\r\n\r\n if (this.panel) {\r\n this.panel.querySelectorAll('.ds-color-picker__color').forEach(colorBtn => {\r\n if (colorBtn._colorPickerColorHandler) {\r\n colorBtn.removeEventListener('click', colorBtn._colorPickerColorHandler);\r\n }\r\n });\r\n }\r\n\r\n if (this.customInput && this._inputInputHandler) {\r\n this.customInput.removeEventListener('input', this._inputInputHandler);\r\n }\r\n\r\n if (this._documentClickListener && this._documentClickListener.unsubscribe) {\r\n this._documentClickListener.unsubscribe();\r\n } else if (this._documentClickHandler) {\r\n document.removeEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._triggerClickHandler = null;\r\n this._colorClickHandler = null;\r\n this._inputInputHandler = null;\r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initColorPicker(element) {\r\n const picker = new ColorPicker(element);\r\n picker.init();\r\n element._kupolaColorPicker = picker;\r\n}\r\n\r\nfunction initColorPickers(root = document) {\r\n root.querySelectorAll('.ds-color-picker').forEach(picker => {\r\n initColorPicker(picker);\r\n });\r\n}\r\n\r\nfunction cleanupColorPicker(picker) {\r\n if (picker._kupolaColorPicker) {\r\n picker._kupolaColorPicker.destroy();\r\n picker._kupolaColorPicker = null;\r\n }\r\n}\r\n\r\nfunction cleanupAllColorPickers() {\r\n document.querySelectorAll('.ds-color-picker').forEach(picker => {\r\n cleanupColorPicker(picker);\r\n });\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('color-picker', initColorPicker, cleanupColorPicker);\r\n}","class Calendar {\r\n constructor(element) {\r\n this.element = element;\r\n this.titleEl = element.querySelector('.ds-calendar__title');\r\n this.daysEl = element.querySelector('.ds-calendar__days');\r\n this.prevBtn = element.querySelector('.ds-calendar__nav--prev');\r\n this.nextBtn = element.querySelector('.ds-calendar__nav--next');\r\n this.todayBtn = element.querySelector('.ds-calendar__nav--today');\r\n this._listeners = [];\r\n \r\n if (!this.titleEl || !this.daysEl) {\r\n throw new Error('Calendar: Missing required elements');\r\n }\r\n\r\n this.currentDate = new Date();\r\n this._init();\r\n }\r\n\r\n _init() {\r\n this.render();\r\n\r\n const prevHandler = () => {\r\n this.currentDate.setMonth(this.currentDate.getMonth() - 1);\r\n this.render();\r\n };\r\n\r\n const nextHandler = () => {\r\n this.currentDate.setMonth(this.currentDate.getMonth() + 1);\r\n this.render();\r\n };\r\n\r\n const todayHandler = () => {\r\n this.currentDate = new Date();\r\n this.render();\r\n };\r\n\r\n if (this.prevBtn) {\r\n this.prevBtn.addEventListener('click', prevHandler);\r\n this._listeners.push({ el: this.prevBtn, event: 'click', handler: prevHandler });\r\n }\r\n\r\n if (this.nextBtn) {\r\n this.nextBtn.addEventListener('click', nextHandler);\r\n this._listeners.push({ el: this.nextBtn, event: 'click', handler: nextHandler });\r\n }\r\n\r\n if (this.todayBtn) {\r\n this.todayBtn.addEventListener('click', todayHandler);\r\n this._listeners.push({ el: this.todayBtn, event: 'click', handler: todayHandler });\r\n }\r\n }\r\n\r\n render() {\r\n const year = this.currentDate.getFullYear();\r\n const month = this.currentDate.getMonth();\r\n \r\n this.titleEl.textContent = `${year} ${['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][month]}`;\r\n \r\n const firstDay = new Date(year, month, 1).getDay();\r\n const daysInMonth = new Date(year, month + 1, 0).getDate();\r\n \r\n this.daysEl.innerHTML = '';\r\n \r\n for (let i = 0; i < firstDay; i++) {\r\n const emptyDay = document.createElement('span');\r\n emptyDay.className = 'ds-calendar__day ds-calendar__day--empty';\r\n this.daysEl.appendChild(emptyDay);\r\n }\r\n \r\n const today = new Date();\r\n const todayStr = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}-${String(today.getDate()).padStart(2, '0')}`;\r\n \r\n for (let day = 1; day <= daysInMonth; day++) {\r\n const dayEl = document.createElement('button');\r\n dayEl.className = 'ds-calendar__day';\r\n dayEl.textContent = day;\r\n \r\n const dayStr = `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\r\n \r\n if (dayStr === todayStr) {\r\n dayEl.classList.add('is-today');\r\n }\r\n \r\n const clickHandler = () => {\r\n this.element.querySelectorAll('.ds-calendar__day').forEach(d => d.classList.remove('is-selected'));\r\n dayEl.classList.add('is-selected');\r\n this.$emit('select', { date: new Date(year, month, day), dateStr: dayStr });\r\n };\r\n \r\n dayEl.addEventListener('click', clickHandler);\r\n this._listeners.push({ el: dayEl, event: 'click', handler: clickHandler });\r\n \r\n this.daysEl.appendChild(dayEl);\r\n }\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.titleEl = null;\r\n this.daysEl = null;\r\n this.prevBtn = null;\r\n this.nextBtn = null;\r\n this.todayBtn = null;\r\n this.element = null;\r\n }\r\n\r\n setDate(date) {\r\n this.currentDate = new Date(date);\r\n this.render();\r\n }\r\n\r\n getDate() {\r\n return this.currentDate;\r\n }\r\n\r\n prevMonth() {\r\n this.currentDate.setMonth(this.currentDate.getMonth() - 1);\r\n this.render();\r\n }\r\n\r\n nextMonth() {\r\n this.currentDate.setMonth(this.currentDate.getMonth() + 1);\r\n this.render();\r\n }\r\n\r\n goToToday() {\r\n this.currentDate = new Date();\r\n this.render();\r\n }\r\n\r\n $emit(eventName, data) {\r\n if (this.element) {\r\n const customEvent = new CustomEvent(`kupola:calendar:${eventName}`, {\r\n detail: data,\r\n bubbles: true,\r\n cancelable: true\r\n });\r\n this.element.dispatchEvent(customEvent);\r\n }\r\n }\r\n}\r\n\r\nfunction initCalendar(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n try {\r\n const calendar = new Calendar(element);\r\n element.__kupolaInstance = calendar;\r\n element.__kupolaInitialized = true;\r\n } catch (error) {\r\n console.error('[Calendar] Error initializing:', error);\r\n }\r\n}\r\n\r\nfunction cleanupCalendar(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const calendar = element.__kupolaInstance;\r\n calendar.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initCalendars() {\r\n document.querySelectorAll('.ds-calendar').forEach(calendar => {\r\n initCalendar(calendar);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { Calendar, initCalendars, initCalendar, cleanupCalendar };\r\n} else {\r\n window.Calendar = Calendar;\r\n window.initCalendar = initCalendar;\r\n window.cleanupCalendar = cleanupCalendar;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('calendar', initCalendar, cleanupCalendar);\r\n}","class DynamicTags {\r\n constructor(element) {\r\n this.element = element;\r\n this.input = element.querySelector('.ds-dynamic-tags__input');\r\n this._listeners = [];\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.bindEvents();\r\n }\r\n\r\n bindEvents() {\r\n this.element.querySelectorAll('.ds-dynamic-tags__remove').forEach(removeBtn => {\r\n const removeHandler = (e) => {\r\n e.stopPropagation();\r\n const tag = removeBtn.closest('.ds-dynamic-tags__tag');\r\n if (tag) {\r\n tag.remove();\r\n this.dispatchChange();\r\n }\r\n };\r\n removeBtn.addEventListener('click', removeHandler);\r\n this._listeners.push({ el: removeBtn, event: 'click', handler: removeHandler });\r\n });\r\n\r\n if (this.input) {\r\n const addTag = () => {\r\n const value = this.input.value.trim();\r\n if (!value) return;\r\n\r\n const tag = document.createElement('span');\r\n tag.className = 'ds-dynamic-tags__tag';\r\n const textNode = document.createTextNode(value);\r\n tag.appendChild(textNode);\r\n const removeBtn = document.createElement('button');\r\n removeBtn.className = 'ds-dynamic-tags__remove';\r\n removeBtn.innerHTML = '<svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\r\n tag.appendChild(removeBtn);\r\n\r\n const tagRemoveHandler = (e) => {\r\n e.stopPropagation();\r\n tag.remove();\r\n this.dispatchChange();\r\n };\r\n removeBtn.addEventListener('click', tagRemoveHandler);\r\n this._listeners.push({ el: removeBtn, event: 'click', handler: tagRemoveHandler });\r\n\r\n this.element.insertBefore(tag, this.input);\r\n this.input.value = '';\r\n this.input.focus();\r\n this.dispatchChange();\r\n };\r\n\r\n const keydownHandler = (e) => {\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n addTag();\r\n }\r\n };\r\n this.input.addEventListener('keydown', keydownHandler);\r\n this._listeners.push({ el: this.input, event: 'keydown', handler: keydownHandler });\r\n\r\n const clickHandler = () => {\r\n this.input.focus();\r\n };\r\n this.element.addEventListener('click', clickHandler);\r\n this._listeners.push({ el: this.element, event: 'click', handler: clickHandler });\r\n }\r\n }\r\n\r\n addTag(value) {\r\n if (!value || !this.input) return;\r\n this.input.value = value;\r\n this.input.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }));\r\n }\r\n\r\n removeTag(index) {\r\n const tags = this.element.querySelectorAll('.ds-dynamic-tags__tag');\r\n const tag = tags[index];\r\n if (tag) {\r\n tag.remove();\r\n this.dispatchChange();\r\n }\r\n }\r\n\r\n getTags() {\r\n const tags = [];\r\n this.element.querySelectorAll('.ds-dynamic-tags__tag').forEach(tag => {\r\n tags.push(tag.textContent);\r\n });\r\n return tags;\r\n }\r\n\r\n clearTags() {\r\n this.element.querySelectorAll('.ds-dynamic-tags__tag').forEach(tag => {\r\n tag.remove();\r\n });\r\n this.dispatchChange();\r\n }\r\n\r\n dispatchChange() {\r\n this.element.dispatchEvent(new CustomEvent('ds-dynamic-tags-change', {\r\n detail: {\r\n tags: this.getTags(),\r\n count: this.getTags().length\r\n }\r\n }));\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.input = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initDynamicTags(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const instance = new DynamicTags(element);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupDynamicTags(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initDynamicTagsAll() {\r\n document.querySelectorAll('.ds-dynamic-tags').forEach(tags => {\r\n initDynamicTags(tags);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { DynamicTags, initDynamicTagsAll, initDynamicTags, cleanupDynamicTags };\r\n} else {\r\n window.DynamicTags = DynamicTags;\r\n window.initDynamicTags = initDynamicTags;\r\n window.cleanupDynamicTags = cleanupDynamicTags;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('dynamic-tags', initDynamicTags, cleanupDynamicTags);\r\n}","class ImagePreview {\r\n constructor(options = {}) {\r\n this.images = options.images || [];\r\n this.currentIndex = options.currentIndex || 0;\r\n this.overlay = null;\r\n this.closeHandler = this.close.bind(this);\r\n this.keyHandler = this.handleKeydown.bind(this);\r\n this.clickHandler = this.handleOverlayClick.bind(this);\r\n \r\n this.init();\r\n }\r\n\r\n init() {\r\n this.createOverlay();\r\n }\r\n\r\n createOverlay() {\r\n this.overlay = document.createElement('div');\r\n this.overlay.className = 'ds-image-preview-overlay';\r\n this.overlay.innerHTML = `\r\n <button class=\"ds-image-preview__close\" type=\"button\" aria-label=\"Close preview\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M18 6L6 18\"/>\r\n <path d=\"M6 6l12 12\"/>\r\n </svg>\r\n </button>\r\n <div class=\"ds-image-preview__nav\">\r\n <button class=\"ds-image-preview__nav-btn ds-image-preview__nav-btn--prev\" type=\"button\" aria-label=\"Previous image\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"15 18 9 12 15 6\"/>\r\n </svg>\r\n </button>\r\n <button class=\"ds-image-preview__nav-btn ds-image-preview__nav-btn--next\" type=\"button\" aria-label=\"Next image\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"9 18 15 12 9 6\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n <div class=\"ds-image-preview__content\">\r\n <img src=\"\" alt=\"\" />\r\n </div>\r\n <div class=\"ds-image-preview__info\">\r\n <div class=\"ds-image-preview__title\"></div>\r\n <div class=\"ds-image-preview__meta\"></div>\r\n </div>\r\n <div class=\"ds-image-preview__indicators\"></div>\r\n `;\r\n \r\n document.body.appendChild(this.overlay);\r\n \r\n this.bindEvents();\r\n }\r\n\r\n bindEvents() {\r\n const closeBtn = this.overlay.querySelector('.ds-image-preview__close');\r\n const prevBtn = this.overlay.querySelector('.ds-image-preview__nav-btn--prev');\r\n const nextBtn = this.overlay.querySelector('.ds-image-preview__nav-btn--next');\r\n \r\n this._prevHandler = () => this.prev();\r\n this._nextHandler = () => this.next();\r\n \r\n closeBtn.addEventListener('click', this.closeHandler);\r\n prevBtn.addEventListener('click', this._prevHandler);\r\n nextBtn.addEventListener('click', this._nextHandler);\r\n }\r\n\r\n handleKeydown(e) {\r\n if (!this.overlay.classList.contains('is-visible')) return;\r\n \r\n switch (e.key) {\r\n case 'Escape':\r\n this.close();\r\n break;\r\n case 'ArrowLeft':\r\n this.prev();\r\n break;\r\n case 'ArrowRight':\r\n this.next();\r\n break;\r\n }\r\n }\r\n\r\n handleOverlayClick(e) {\r\n if (e.target === this.overlay) {\r\n this.close();\r\n }\r\n }\r\n\r\n show(images, index = 0) {\r\n this.images = images;\r\n this.currentIndex = Math.min(Math.max(index, 0), images.length - 1);\r\n \r\n this.render();\r\n this.overlay.classList.add('is-visible');\r\n \r\n document.addEventListener('keydown', this.keyHandler);\r\n this.overlay.addEventListener('click', this.clickHandler);\r\n document.body.style.overflow = 'hidden';\r\n }\r\n\r\n close() {\r\n this.overlay.classList.remove('is-visible');\r\n \r\n document.removeEventListener('keydown', this.keyHandler);\r\n this.overlay.removeEventListener('click', this.clickHandler);\r\n document.body.style.overflow = '';\r\n }\r\n\r\n prev() {\r\n if (this.currentIndex > 0) {\r\n this.currentIndex--;\r\n this.render();\r\n }\r\n }\r\n\r\n next() {\r\n if (this.currentIndex < this.images.length - 1) {\r\n this.currentIndex++;\r\n this.render();\r\n }\r\n }\r\n\r\n goTo(index) {\r\n if (index >= 0 && index < this.images.length) {\r\n this.currentIndex = index;\r\n this.render();\r\n }\r\n }\r\n\r\n render() {\r\n const img = this.overlay.querySelector('.ds-image-preview__content img');\r\n const title = this.overlay.querySelector('.ds-image-preview__title');\r\n const meta = this.overlay.querySelector('.ds-image-preview__meta');\r\n const indicators = this.overlay.querySelector('.ds-image-preview__indicators');\r\n const prevBtn = this.overlay.querySelector('.ds-image-preview__nav-btn--prev');\r\n const nextBtn = this.overlay.querySelector('.ds-image-preview__nav-btn--next');\r\n \r\n const currentImage = this.images[this.currentIndex];\r\n \r\n img.src = currentImage.src;\r\n img.alt = currentImage.alt || '';\r\n title.textContent = currentImage.title || '';\r\n meta.textContent = currentImage.meta || `${this.currentIndex + 1} / ${this.images.length}`;\r\n \r\n prevBtn.disabled = this.currentIndex === 0;\r\n nextBtn.disabled = this.currentIndex === this.images.length - 1;\r\n \r\n indicators.innerHTML = this.images.map((_, i) => `\r\n <button class=\"ds-image-preview__indicator${i === this.currentIndex ? ' is-active' : ''}\" type=\"button\" data-index=\"${i}\" aria-label=\"Go to image ${i + 1}\"></button>\r\n `).join('');\r\n \r\n indicators.querySelectorAll('.ds-image-preview__indicator').forEach(indicator => {\r\n const clickHandler = () => {\r\n this.goTo(parseInt(indicator.dataset.index));\r\n };\r\n indicator.addEventListener('click', clickHandler);\r\n indicator._clickHandler = clickHandler;\r\n });\r\n }\r\n\r\n destroy() {\r\n this.close();\r\n \r\n const indicators = this.overlay?.querySelector('.ds-image-preview__indicators');\r\n if (indicators) {\r\n indicators.querySelectorAll('.ds-image-preview__indicator').forEach(indicator => {\r\n if (indicator._clickHandler) {\r\n indicator.removeEventListener('click', indicator._clickHandler);\r\n }\r\n });\r\n }\r\n \r\n const closeBtn = this.overlay?.querySelector('.ds-image-preview__close');\r\n const prevBtn = this.overlay?.querySelector('.ds-image-preview__nav-btn--prev');\r\n const nextBtn = this.overlay?.querySelector('.ds-image-preview__nav-btn--next');\r\n \r\n if (closeBtn) {\r\n closeBtn.removeEventListener('click', this.closeHandler);\r\n }\r\n if (prevBtn && this._prevHandler) {\r\n prevBtn.removeEventListener('click', this._prevHandler);\r\n }\r\n if (nextBtn && this._nextHandler) {\r\n nextBtn.removeEventListener('click', this._nextHandler);\r\n }\r\n \r\n if (this.overlay && this.overlay.parentNode) {\r\n this.overlay.parentNode.removeChild(this.overlay);\r\n }\r\n }\r\n}\r\n\r\nlet imagePreviewInstance = null;\r\n\r\nfunction initImagePreview() {\r\n if (!imagePreviewInstance) {\r\n imagePreviewInstance = new ImagePreview();\r\n }\r\n \r\n document.querySelectorAll('[data-image-preview]').forEach(trigger => {\r\n trigger.addEventListener('click', () => {\r\n const images = JSON.parse(trigger.getAttribute('data-image-preview'));\r\n const index = parseInt(trigger.getAttribute('data-image-index')) || 0;\r\n imagePreviewInstance.show(images, index);\r\n });\r\n });\r\n}\r\n\r\nfunction showImagePreview(images, index = 0) {\r\n if (!imagePreviewInstance) {\r\n imagePreviewInstance = new ImagePreview();\r\n }\r\n imagePreviewInstance.show(images, index);\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { ImagePreview, initImagePreview, showImagePreview };\r\n}","class Tag {\r\n constructor(element) {\r\n this.element = element;\r\n this.closeBtn = element.querySelector('.ds-tag__close');\r\n this._listeners = [];\r\n this.init();\r\n }\r\n\r\n init() {\r\n if (this.closeBtn) {\r\n const closeHandler = (e) => {\r\n e.stopPropagation();\r\n this.element.dispatchEvent(new CustomEvent('ds-tag-remove', {\r\n detail: { tag: this.element },\r\n bubbles: true\r\n }));\r\n this.element.remove();\r\n };\r\n this.closeBtn.addEventListener('click', closeHandler);\r\n this._listeners.push({ el: this.closeBtn, event: 'click', handler: closeHandler });\r\n }\r\n }\r\n\r\n setContent(content) {\r\n const textNodes = [];\r\n this.element.childNodes.forEach(node => {\r\n if (node.nodeType === Node.TEXT_NODE) {\r\n textNodes.push(node);\r\n }\r\n });\r\n textNodes.forEach(node => node.remove());\r\n this.element.insertBefore(document.createTextNode(content), this.closeBtn || null);\r\n }\r\n\r\n getContent() {\r\n return this.element.textContent.trim();\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.closeBtn = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initTag(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const instance = new Tag(element);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupTag(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initTags() {\r\n document.querySelectorAll('.ds-tag').forEach(tag => {\r\n initTag(tag);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { Tag, initTags, initTag, cleanupTag };\r\n} else {\r\n window.Tag = Tag;\r\n window.initTag = initTag;\r\n window.cleanupTag = cleanupTag;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('tag', initTag, cleanupTag);\r\n}","class StatCard {\r\n constructor(element) {\r\n this.element = element;\r\n this.valueElement = element.querySelector('.ds-statcard__value');\r\n this.progressFill = element.querySelector('.ds-statcard__progress-fill');\r\n this.animated = false;\r\n this._observer = null;\r\n \r\n this.init();\r\n }\r\n\r\n init() {\r\n this.animateValue();\r\n this.animateProgress();\r\n \r\n this._observer = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting && !this.animated) {\r\n this.animateValue();\r\n this.animateProgress();\r\n this.animated = true;\r\n }\r\n });\r\n }, { threshold: 0.3 });\r\n \r\n this._observer.observe(this.element);\r\n }\r\n\r\n animateValue() {\r\n if (!this.valueElement) return;\r\n \r\n const text = this.valueElement.textContent;\r\n const match = text.match(/[\\d.,]+/);\r\n if (!match) return;\r\n \r\n const targetValue = parseFloat(match[0].replace(',', ''));\r\n const prefix = text.substring(0, match.index);\r\n const suffix = text.substring(match.index + match[0].length);\r\n \r\n const duration = 1500;\r\n const startTime = performance.now();\r\n const startValue = 0;\r\n \r\n const animate = (currentTime) => {\r\n const elapsed = currentTime - startTime;\r\n const progress = Math.min(elapsed / duration, 1);\r\n const easeProgress = 1 - Math.pow(1 - progress, 3);\r\n \r\n const currentValue = startValue + (targetValue - startValue) * easeProgress;\r\n \r\n let formattedValue;\r\n if (targetValue >= 1000000) {\r\n formattedValue = (currentValue / 1000000).toFixed(1) + 'M';\r\n } else if (targetValue >= 1000) {\r\n formattedValue = (currentValue / 1000).toFixed(1) + 'K';\r\n } else if (Number.isInteger(targetValue)) {\r\n formattedValue = Math.floor(currentValue).toLocaleString();\r\n } else {\r\n formattedValue = currentValue.toFixed(2);\r\n }\r\n \r\n this.valueElement.textContent = prefix + formattedValue + suffix;\r\n \r\n if (progress < 1) {\r\n requestAnimationFrame(animate);\r\n }\r\n };\r\n \r\n requestAnimationFrame(animate);\r\n }\r\n\r\n animateProgress() {\r\n if (!this.progressFill) return;\r\n \r\n const width = this.progressFill.getAttribute('data-width') || '0%';\r\n this.progressFill.style.width = width;\r\n }\r\n\r\n updateValue(newValue, options = {}) {\r\n if (!this.valueElement) return;\r\n \r\n const duration = options.duration || 800;\r\n const text = this.valueElement.textContent;\r\n const match = text.match(/[\\d.,]+/);\r\n \r\n if (!match) {\r\n this.valueElement.textContent = newValue;\r\n return;\r\n }\r\n \r\n const prefix = text.substring(0, match.index);\r\n const suffix = text.substring(match.index + match[0].length);\r\n const startValue = parseFloat(match[0].replace(',', ''));\r\n const targetValue = parseFloat(newValue);\r\n \r\n const startTime = performance.now();\r\n \r\n const animate = (currentTime) => {\r\n const elapsed = currentTime - startTime;\r\n const progress = Math.min(elapsed / duration, 1);\r\n const easeProgress = 1 - Math.pow(1 - progress, 3);\r\n \r\n const currentValue = startValue + (targetValue - startValue) * easeProgress;\r\n \r\n let formattedValue;\r\n if (targetValue >= 1000000) {\r\n formattedValue = (currentValue / 1000000).toFixed(1) + 'M';\r\n } else if (targetValue >= 1000) {\r\n formattedValue = (currentValue / 1000).toFixed(1) + 'K';\r\n } else if (Number.isInteger(targetValue)) {\r\n formattedValue = Math.floor(currentValue).toLocaleString();\r\n } else {\r\n formattedValue = currentValue.toFixed(2);\r\n }\r\n \r\n this.valueElement.textContent = prefix + formattedValue + suffix;\r\n \r\n if (progress < 1) {\r\n requestAnimationFrame(animate);\r\n }\r\n };\r\n \r\n requestAnimationFrame(animate);\r\n }\r\n\r\n updateProgress(percent, options = {}) {\r\n if (!this.progressFill) return;\r\n \r\n const duration = options.duration || 600;\r\n const currentWidth = parseFloat(this.progressFill.style.width || '0');\r\n const targetWidth = Math.min(Math.max(percent, 0), 100);\r\n \r\n const startTime = performance.now();\r\n \r\n const animate = (currentTime) => {\r\n const elapsed = currentTime - startTime;\r\n const progress = Math.min(elapsed / duration, 1);\r\n const easeProgress = 1 - Math.pow(1 - progress, 3);\r\n \r\n const currentWidthValue = currentWidth + (targetWidth - currentWidth) * easeProgress;\r\n this.progressFill.style.width = currentWidthValue + '%';\r\n \r\n if (progress < 1) {\r\n requestAnimationFrame(animate);\r\n }\r\n };\r\n \r\n requestAnimationFrame(animate);\r\n }\r\n\r\n setTrend(direction, value) {\r\n const trendElement = this.element.querySelector('.ds-statcard__trend');\r\n if (!trendElement) return;\r\n \r\n trendElement.className = `ds-statcard__trend ds-statcard__trend--${direction}`;\r\n \r\n const iconSvg = direction === 'up' \r\n ? '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"23 6 13.5 15.5 8.5 10.5 1 18\"/></svg>'\r\n : direction === 'down'\r\n ? '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"1 18 10.5 8.5 15.5 13.5 23 6\"/></svg>'\r\n : '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"12 19 18 13 12 7 6 13\"/></svg>';\r\n \r\n trendElement.innerHTML = iconSvg + value;\r\n }\r\n\r\n destroy() {\r\n if (this._observer) {\r\n this._observer.disconnect();\r\n this._observer = null;\r\n }\r\n this.animated = false;\r\n this.valueElement = null;\r\n this.progressFill = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initStatCard(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const instance = new StatCard(element);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupStatCard(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initStatCards() {\r\n document.querySelectorAll('.ds-statcard').forEach(card => {\r\n initStatCard(card);\r\n });\r\n}\r\n\r\nfunction updateStatCard(selector, newValue) {\r\n const card = document.querySelector(selector);\r\n if (card && card.__kupolaInstance) {\r\n card.__kupolaInstance.updateValue(newValue);\r\n }\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { StatCard, initStatCards, initStatCard, cleanupStatCard, updateStatCard };\r\n} else {\r\n window.StatCard = StatCard;\r\n window.initStatCard = initStatCard;\r\n window.cleanupStatCard = cleanupStatCard;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('statcard', initStatCard, cleanupStatCard);\r\n}","class Heatmap {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.data = options.data || [];\r\n this.startDate = options.startDate || this.getOneYearAgo();\r\n this.endDate = options.endDate || new Date();\r\n this.cellSize = options.cellSize || 14;\r\n this.onCellClick = options.onCellClick || null;\r\n this.tooltip = null;\r\n this.baseColor = options.color || element.getAttribute('data-color') || '#22c55e';\r\n this._listeners = [];\r\n \r\n this.init();\r\n }\r\n\r\n getOneYearAgo() {\r\n const date = new Date();\r\n date.setFullYear(date.getFullYear() - 1);\r\n return date;\r\n }\r\n\r\n init() {\r\n this.render();\r\n this.createTooltip();\r\n }\r\n\r\n getDataByDate(date) {\r\n const dateStr = this.formatDate(date);\r\n const item = this.data.find(d => d.date === dateStr);\r\n return item ? item.value : 0;\r\n }\r\n\r\n formatDate(date) {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n getLevel(value, maxValue) {\r\n if (value === 0) return 0;\r\n if (!maxValue || maxValue === 0) maxValue = Math.max(...this.data.map(d => d.value), 1);\r\n const ratio = value / maxValue;\r\n if (ratio < 0.2) return 1;\r\n if (ratio < 0.4) return 2;\r\n if (ratio < 0.6) return 3;\r\n if (ratio < 0.8) return 4;\r\n return 5;\r\n }\r\n\r\n hexToRgb(hex) {\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n return result ? {\r\n r: parseInt(result[1], 16),\r\n g: parseInt(result[2], 16),\r\n b: parseInt(result[3], 16)\r\n } : { r: 34, g: 197, b: 94 };\r\n }\r\n\r\n getCellColor(level) {\r\n const rgb = this.hexToRgb(this.baseColor);\r\n if (level === 0) return 'rgba(0, 0, 0, 0.1)';\r\n const opacity = [0.2, 0.4, 0.6, 0.8, 1][level - 1];\r\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${opacity})`;\r\n }\r\n\r\n getWeekdayLabels() {\r\n return ['', '一', '', '三', '', '五', ''];\r\n }\r\n\r\n getMonthLabels() {\r\n const months = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'];\r\n const result = [];\r\n let currentMonth = -1;\r\n \r\n for (let d = new Date(this.startDate); d <= this.endDate; d.setDate(d.getDate() + 1)) {\r\n const month = d.getMonth();\r\n const day = d.getDate();\r\n if (month !== currentMonth && day === 1) {\r\n result.push({ month, label: months[month], offset: Math.floor((d - this.startDate) / (1000 * 60 * 60 * 24)) });\r\n currentMonth = month;\r\n }\r\n }\r\n \r\n return result;\r\n }\r\n\r\n getWeekCount() {\r\n let weeks = 0;\r\n let firstDate = new Date(this.startDate);\r\n const firstDayOfWeek = firstDate.getDay();\r\n \r\n for (let d = new Date(this.startDate); d <= this.endDate; d.setDate(d.getDate() + 1)) {\r\n if (d.getDay() === 0) {\r\n weeks++;\r\n }\r\n }\r\n \r\n if (firstDayOfWeek !== 0) {\r\n weeks++;\r\n }\r\n \r\n return weeks;\r\n }\r\n\r\n render() {\r\n const body = this.element.querySelector('.ds-heatmap__body');\r\n if (!body) return;\r\n \r\n body.innerHTML = '';\r\n \r\n const weeks = [];\r\n let currentWeek = [];\r\n \r\n let firstDate = new Date(this.startDate);\r\n const firstDayOfWeek = firstDate.getDay();\r\n for (let i = 1; i < firstDayOfWeek; i++) {\r\n currentWeek.push(null);\r\n }\r\n \r\n for (let d = new Date(this.startDate); d <= this.endDate; d.setDate(d.getDate() + 1)) {\r\n currentWeek.push(new Date(d));\r\n if (d.getDay() === 6 || d.getTime() === this.endDate.getTime()) {\r\n weeks.push(currentWeek);\r\n currentWeek = [];\r\n }\r\n }\r\n \r\n const weekCount = weeks.length;\r\n const cellWidth = this.element.classList.contains('ds-heatmap--compact') ? 12 : 16;\r\n const totalGridWidth = weekCount * cellWidth;\r\n \r\n const container = document.createElement('div');\r\n container.className = 'ds-heatmap__container';\r\n \r\n const labelsAndGrid = document.createElement('div');\r\n labelsAndGrid.className = 'ds-heatmap__labels-and-grid';\r\n \r\n const weekdayLabels = document.createElement('div');\r\n weekdayLabels.className = 'ds-heatmap__weekday-labels';\r\n const weekdayLabelHeight = this.element.classList.contains('ds-heatmap--compact') ? 12 : 16;\r\n this.getWeekdayLabels().forEach(label => {\r\n const el = document.createElement('div');\r\n el.className = 'ds-heatmap__weekday-label';\r\n el.textContent = label;\r\n el.style.height = weekdayLabelHeight + 'px';\r\n el.style.lineHeight = weekdayLabelHeight + 'px';\r\n weekdayLabels.appendChild(el);\r\n });\r\n labelsAndGrid.appendChild(weekdayLabels);\r\n \r\n const gridContainer = document.createElement('div');\r\n gridContainer.className = 'ds-heatmap__grid-container';\r\n \r\n const monthLabels = document.createElement('div');\r\n monthLabels.className = 'ds-heatmap__month-labels';\r\n monthLabels.style.width = totalGridWidth + 'px';\r\n \r\n const monthInfo = this.getMonthLabels();\r\n monthInfo.forEach((item, index) => {\r\n const el = document.createElement('div');\r\n el.className = 'ds-heatmap__month-label';\r\n el.textContent = item.label;\r\n \r\n const nextMonth = monthInfo[index + 1];\r\n let weekSpan;\r\n if (nextMonth) {\r\n weekSpan = Math.ceil((nextMonth.offset - item.offset) / 7);\r\n } else {\r\n weekSpan = weekCount - Math.floor(item.offset / 7);\r\n }\r\n \r\n el.style.width = (weekSpan * cellWidth) + 'px';\r\n monthLabels.appendChild(el);\r\n });\r\n gridContainer.appendChild(monthLabels);\r\n \r\n const grid = document.createElement('div');\r\n grid.className = 'ds-heatmap__grid';\r\n \r\n weeks.forEach((week) => {\r\n const weekColumn = document.createElement('div');\r\n weekColumn.className = 'ds-heatmap__week-column';\r\n \r\n week.forEach(date => {\r\n if (date === null) {\r\n const emptyCell = document.createElement('div');\r\n emptyCell.className = 'ds-heatmap__cell';\r\n emptyCell.style.visibility = 'hidden';\r\n weekColumn.appendChild(emptyCell);\r\n } else {\r\n const value = this.getDataByDate(date);\r\n const maxValue = Math.max(...this.data.map(d => d.value), 1);\r\n const level = this.getLevel(value, maxValue);\r\n \r\n const cell = document.createElement('div');\r\n cell.className = 'ds-heatmap__cell';\r\n cell.dataset.date = this.formatDate(date);\r\n cell.dataset.value = value;\r\n cell.style.backgroundColor = this.getCellColor(level);\r\n \r\n const mouseenterHandler = (e) => this.showTooltip(e, date, value);\r\n const mouseleaveHandler = () => this.hideTooltip();\r\n const clickHandler = () => {\r\n if (this.onCellClick) {\r\n this.onCellClick({ date: this.formatDate(date), value });\r\n }\r\n };\r\n \r\n cell.addEventListener('mouseenter', mouseenterHandler);\r\n cell.addEventListener('mouseleave', mouseleaveHandler);\r\n cell.addEventListener('click', clickHandler);\r\n \r\n this._listeners.push(\r\n { el: cell, event: 'mouseenter', handler: mouseenterHandler },\r\n { el: cell, event: 'mouseleave', handler: mouseleaveHandler },\r\n { el: cell, event: 'click', handler: clickHandler }\r\n );\r\n \r\n weekColumn.appendChild(cell);\r\n }\r\n });\r\n \r\n grid.appendChild(weekColumn);\r\n });\r\n \r\n gridContainer.appendChild(grid);\r\n labelsAndGrid.appendChild(gridContainer);\r\n container.appendChild(labelsAndGrid);\r\n \r\n body.appendChild(container);\r\n this.renderLegend(body);\r\n }\r\n\r\n renderLegend(parent) {\r\n const legend = document.createElement('div');\r\n legend.className = 'ds-heatmap__legend';\r\n \r\n const label = document.createElement('span');\r\n label.className = 'ds-heatmap__legend-label';\r\n label.textContent = '少';\r\n \r\n const cells = document.createElement('div');\r\n cells.className = 'ds-heatmap__legend-cells';\r\n \r\n for (let i = 0; i <= 5; i++) {\r\n const cell = document.createElement('div');\r\n cell.className = 'ds-heatmap__legend-cell';\r\n cell.style.backgroundColor = this.getCellColor(i);\r\n cells.appendChild(cell);\r\n }\r\n \r\n const label2 = document.createElement('span');\r\n label2.className = 'ds-heatmap__legend-label';\r\n label2.textContent = '多';\r\n \r\n legend.appendChild(label);\r\n legend.appendChild(cells);\r\n legend.appendChild(label2);\r\n parent.appendChild(legend);\r\n }\r\n\r\n createTooltip() {\r\n this.tooltip = document.createElement('div');\r\n this.tooltip.className = 'ds-heatmap__tooltip';\r\n document.body.appendChild(this.tooltip);\r\n }\r\n\r\n showTooltip(e, date, value) {\r\n const rect = e.target.getBoundingClientRect();\r\n const tooltipWidth = 150;\r\n \r\n this.tooltip.innerHTML = `\r\n <div class=\"ds-heatmap__tooltip-date\">${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日</div>\r\n <div class=\"ds-heatmap__tooltip-value\">${value} contributions</div>\r\n `;\r\n \r\n this.tooltip.style.left = Math.min(rect.left + rect.width / 2 - tooltipWidth / 2, window.innerWidth - tooltipWidth - 16) + 'px';\r\n this.tooltip.style.top = (rect.top - 50) + 'px';\r\n this.tooltip.classList.add('is-visible');\r\n }\r\n\r\n hideTooltip() {\r\n this.tooltip.classList.remove('is-visible');\r\n }\r\n\r\n updateData(data) {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = [];\r\n this.data = data;\r\n this.render();\r\n }\r\n\r\n setDateRange(startDate, endDate) {\r\n this.startDate = startDate;\r\n this.endDate = endDate;\r\n this.render();\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n \r\n if (this.tooltip && this.tooltip.parentNode) {\r\n this.tooltip.parentNode.removeChild(this.tooltip);\r\n }\r\n this.tooltip = null;\r\n this.data = [];\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initHeatmap(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const dataAttr = element.getAttribute('data-heatmap-data');\r\n let data = [];\r\n \r\n if (dataAttr) {\r\n try {\r\n data = JSON.parse(dataAttr);\r\n } catch (e) {\r\n data = generateMockHeatmapData();\r\n }\r\n } else {\r\n data = generateMockHeatmapData();\r\n }\r\n \r\n const instance = new Heatmap(element, {\r\n data: data,\r\n onCellClick: (info) => {\r\n }\r\n });\r\n \r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupHeatmap(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initHeatmaps() {\r\n document.querySelectorAll('.ds-heatmap').forEach(element => {\r\n initHeatmap(element);\r\n });\r\n}\r\n\r\nfunction generateMockHeatmapData() {\r\n const data = [];\r\n const today = new Date();\r\n const oneYearAgo = new Date();\r\n oneYearAgo.setFullYear(oneYearAgo.getFullYear() - 1);\r\n \r\n for (let d = new Date(oneYearAgo); d <= today; d.setDate(d.getDate() + 1)) {\r\n const year = d.getFullYear();\r\n const month = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n \r\n const isWeekend = d.getDay() === 0 || d.getDay() === 6;\r\n const baseValue = isWeekend ? Math.random() * 20 : Math.random() * 50;\r\n const value = Math.floor(baseValue);\r\n \r\n data.push({\r\n date: `${year}-${month}-${day}`,\r\n value: value > 0 ? value : Math.floor(Math.random() * 30) + 1\r\n });\r\n }\r\n \r\n return data;\r\n}\r\n\r\nfunction createHeatmap(selector, options = {}) {\r\n const element = document.querySelector(selector);\r\n if (element) {\r\n const data = options.data || generateMockHeatmapData();\r\n return new Heatmap(element, {\r\n data: data,\r\n ...options\r\n });\r\n }\r\n return null;\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { Heatmap, initHeatmaps, initHeatmap, cleanupHeatmap, createHeatmap, generateMockHeatmapData };\r\n} else {\r\n window.Heatmap = Heatmap;\r\n window.initHeatmap = initHeatmap;\r\n window.cleanupHeatmap = cleanupHeatmap;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('heatmap', initHeatmap, cleanupHeatmap);\r\n}","class Tooltip {\r\n constructor(element) {\r\n this.element = element;\r\n this.tooltipEl = null;\r\n \r\n this._showTooltip = null;\r\n this._hideTooltip = null;\r\n }\r\n\r\n init() {\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n this._showTooltip = () => {\r\n const text = this.element.getAttribute('data-tooltip');\r\n const position = this.element.getAttribute('data-tooltip-position') || 'top';\r\n if (!text) return;\r\n \r\n this.tooltipEl = document.createElement('div');\r\n this.tooltipEl.className = 'ds-tooltip is-visible';\r\n this.tooltipEl.textContent = text;\r\n \r\n document.body.appendChild(this.tooltipEl);\r\n \r\n requestAnimationFrame(() => {\r\n const rect = this.element.getBoundingClientRect();\r\n const tooltipRect = this.tooltipEl.getBoundingClientRect();\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n \r\n let left, top;\r\n \r\n switch (position) {\r\n case 'bottom':\r\n left = rect.left + rect.width / 2 - tooltipRect.width / 2;\r\n top = rect.bottom + 8;\r\n break;\r\n case 'right':\r\n left = rect.right + 8;\r\n top = rect.top + rect.height / 2 - tooltipRect.height / 2;\r\n break;\r\n case 'left':\r\n left = rect.left - tooltipRect.width - 8;\r\n top = rect.top + rect.height / 2 - tooltipRect.height / 2;\r\n break;\r\n case 'top':\r\n default:\r\n left = rect.left + rect.width / 2 - tooltipRect.width / 2;\r\n top = rect.top - tooltipRect.height - 8;\r\n break;\r\n }\r\n \r\n if (left < 8) left = 8;\r\n if (left + tooltipRect.width > viewportWidth) left = viewportWidth - tooltipRect.width - 8;\r\n if (top < 8) top = 8;\r\n if (top + tooltipRect.height > viewportHeight) top = viewportHeight - tooltipRect.height - 8;\r\n \r\n this.tooltipEl.style.left = `${left}px`;\r\n this.tooltipEl.style.top = `${top}px`;\r\n this.tooltipEl.style.position = 'fixed';\r\n });\r\n };\r\n\r\n this._hideTooltip = () => {\r\n if (this.tooltipEl) {\r\n this.tooltipEl.remove();\r\n this.tooltipEl = null;\r\n }\r\n };\r\n\r\n this.element.addEventListener('mouseenter', this._showTooltip);\r\n this.element.addEventListener('mouseleave', this._hideTooltip);\r\n this.element.addEventListener('focus', this._showTooltip);\r\n this.element.addEventListener('blur', this._hideTooltip);\r\n \r\n this.element.__kupolaInitialized = true;\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n if (this._showTooltip) {\r\n this.element.removeEventListener('mouseenter', this._showTooltip);\r\n this.element.removeEventListener('focus', this._showTooltip);\r\n }\r\n \r\n if (this._hideTooltip) {\r\n this.element.removeEventListener('mouseleave', this._hideTooltip);\r\n this.element.removeEventListener('blur', this._hideTooltip);\r\n }\r\n \r\n if (this._showTooltip && this._hideTooltip) {\r\n this._hideTooltip();\r\n }\r\n \r\n this._showTooltip = null;\r\n this._hideTooltip = null;\r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initTooltip(element) {\r\n const tooltip = new Tooltip(element);\r\n tooltip.init();\r\n element._kupolaTooltip = tooltip;\r\n}\r\n\r\nfunction initTooltips(root = document) {\r\n root.querySelectorAll('[data-tooltip]').forEach(element => {\r\n initTooltip(element);\r\n });\r\n}\r\n\r\nfunction cleanupTooltip(element) {\r\n if (element._kupolaTooltip) {\r\n element._kupolaTooltip.destroy();\r\n element._kupolaTooltip = null;\r\n }\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('tooltip', initTooltip, cleanupTooltip);\r\n}","class KupolaValidator {\r\n constructor() {\r\n this.validators = {\r\n required: this.validateRequired,\r\n email: this.validateEmail,\r\n url: this.validateUrl,\r\n minLength: this.validateMinLength,\r\n maxLength: this.validateMaxLength,\r\n pattern: this.validatePattern,\r\n min: this.validateMin,\r\n max: this.validateMax,\r\n equalTo: this.validateEqualTo,\r\n phone: this.validatePhone,\r\n date: this.validateDate,\r\n number: this.validateNumber\r\n };\r\n \r\n this.customValidators = {};\r\n this.asyncValidators = {};\r\n this.customAsyncValidators = {};\r\n this.formStates = {};\r\n this.submitting = new Set();\r\n }\r\n\r\n addValidator(name, callback) {\r\n this.customValidators[name] = callback;\r\n }\r\n\r\n addAsyncValidator(name, callback) {\r\n this.customAsyncValidators[name] = callback;\r\n }\r\n\r\n validate(form) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n const errors = {};\r\n const inputs = form.querySelectorAll('[data-validate]');\r\n let hasError = false;\r\n \r\n inputs.forEach(input => {\r\n const name = input.name || input.id;\r\n const rules = this.parseRules(input.getAttribute('data-validate'));\r\n const value = this.getValue(input);\r\n \r\n for (const [rule, params] of Object.entries(rules)) {\r\n const validatorFunc = this.customValidators[rule] || this.validators[rule];\r\n const isValid = validatorFunc?.(value, params);\r\n if (!isValid) {\r\n errors[name] = this.getErrorMessage(rule, params, input);\r\n this.showError(input, errors[name]);\r\n hasError = true;\r\n break;\r\n } else {\r\n this.clearError(input);\r\n }\r\n }\r\n });\r\n \r\n this.formStates[formId] = {\r\n valid: !hasError,\r\n errors: errors,\r\n errorCount: Object.keys(errors).length\r\n };\r\n \r\n this.updateFormState(form);\r\n \r\n return !hasError;\r\n }\r\n\r\n getValue(input) {\r\n if (input.classList.contains('ds-datepicker__input') || input.classList.contains('ds-timepicker__input')) {\r\n return input.value.trim();\r\n }\r\n \r\n if (input.closest('.ds-select')) {\r\n const select = input.closest('.ds-select');\r\n const valueEl = select.querySelector('.ds-select__value') || select.querySelector('.ds-select__trigger span');\r\n return valueEl ? valueEl.textContent.trim() : '';\r\n }\r\n \r\n if (input.closest('.ds-fileupload')) {\r\n const upload = input.closest('.ds-fileupload');\r\n const uploadInstance = upload.__fileUploadInstance;\r\n return uploadInstance && uploadInstance.getFiles().length > 0 ? 'has-files' : '';\r\n }\r\n \r\n return input.value.trim();\r\n }\r\n\r\n validateInput(input) {\r\n const rules = this.parseRules(input.getAttribute('data-validate'));\r\n const value = this.getValue(input);\r\n \r\n for (const [rule, params] of Object.entries(rules)) {\r\n const validatorFunc = this.customValidators[rule] || this.validators[rule];\r\n const isValid = validatorFunc?.(value, params);\r\n if (!isValid) {\r\n this.showError(input, this.getErrorMessage(rule, params, input));\r\n return false;\r\n }\r\n }\r\n \r\n this.clearError(input);\r\n return true;\r\n }\r\n\r\n validateAll() {\r\n const forms = document.querySelectorAll('form[data-validation]');\r\n let allValid = true;\r\n \r\n forms.forEach(form => {\r\n if (!this.validate(form)) {\r\n allValid = false;\r\n }\r\n });\r\n \r\n return allValid;\r\n }\r\n\r\n async validateAsync(form, options = {}) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n const errors = {};\r\n const group = options.group;\r\n const inputs = group \r\n ? form.querySelectorAll(`[data-validate][data-validate-group=\"${group}\"]`)\r\n : form.querySelectorAll('[data-validate]');\r\n \r\n let hasError = false;\r\n \r\n for (const input of inputs) {\r\n const isValid = await this.validateInputAsync(input);\r\n if (!isValid) {\r\n hasError = true;\r\n }\r\n }\r\n \r\n const formErrors = {};\r\n inputs.forEach(input => {\r\n const name = input.name || input.id;\r\n const errorElement = input.parentElement.querySelector('.ds-input__error');\r\n if (errorElement) {\r\n formErrors[name] = errorElement.textContent;\r\n }\r\n });\r\n \r\n this.formStates[formId] = {\r\n valid: !hasError,\r\n errors: formErrors,\r\n errorCount: Object.keys(formErrors).length\r\n };\r\n \r\n this.updateFormState(form);\r\n \r\n return !hasError;\r\n }\r\n\r\n async validateInputAsync(input) {\r\n const rules = this.parseRules(input.getAttribute('data-validate'));\r\n const asyncRules = this.parseRules(input.getAttribute('data-validate-async') || '');\r\n const value = this.getValue(input);\r\n \r\n for (const [rule, params] of Object.entries(rules)) {\r\n const validatorFunc = this.customValidators[rule] || this.validators[rule];\r\n const isValid = validatorFunc?.(value, params);\r\n if (!isValid) {\r\n this.showError(input, this.getErrorMessage(rule, params, input));\r\n return false;\r\n }\r\n }\r\n \r\n for (const [rule, params] of Object.entries(asyncRules)) {\r\n const validatorFunc = this.customAsyncValidators[rule] || this.asyncValidators[rule];\r\n if (validatorFunc) {\r\n try {\r\n const isValid = await validatorFunc(value, params, input);\r\n if (!isValid) {\r\n this.showError(input, this.getErrorMessage(rule, params, input));\r\n return false;\r\n }\r\n } catch (e) {\r\n this.showError(input, e.message || 'Validation error');\r\n return false;\r\n }\r\n }\r\n }\r\n \r\n this.clearError(input);\r\n return true;\r\n }\r\n\r\n async validateGroup(form, groupName) {\r\n const inputs = form.querySelectorAll(`[data-validate][data-validate-group=\"${groupName}\"]`);\r\n let hasError = false;\r\n \r\n for (const input of inputs) {\r\n const isValid = await this.validateInputAsync(input);\r\n if (!isValid) {\r\n hasError = true;\r\n }\r\n }\r\n \r\n return !hasError;\r\n }\r\n\r\n getGroups(form) {\r\n const groups = new Set();\r\n form.querySelectorAll('[data-validate-group]').forEach(input => {\r\n groups.add(input.getAttribute('data-validate-group'));\r\n });\r\n return Array.from(groups);\r\n }\r\n\r\n getFormState(form) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n return this.formStates[formId] || { valid: true, errors: {}, errorCount: 0, loading: false, submitting: false, disabled: false };\r\n }\r\n\r\n updateFormState(form) {\r\n const state = this.getFormState(form);\r\n \r\n if (state.valid) {\r\n form.classList.remove('ds-form--invalid');\r\n form.classList.add('ds-form--valid');\r\n } else {\r\n form.classList.remove('ds-form--valid');\r\n form.classList.add('ds-form--invalid');\r\n }\r\n \r\n if (state.loading) {\r\n form.classList.add('ds-form--loading');\r\n } else {\r\n form.classList.remove('ds-form--loading');\r\n }\r\n \r\n if (state.submitting) {\r\n form.classList.add('ds-form--submitting');\r\n } else {\r\n form.classList.remove('ds-form--submitting');\r\n }\r\n \r\n if (state.disabled) {\r\n form.classList.add('ds-form--disabled');\r\n form.querySelectorAll('input, select, textarea, button').forEach(el => el.disabled = true);\r\n } else {\r\n form.classList.remove('ds-form--disabled');\r\n form.querySelectorAll('input, select, textarea, button').forEach(el => {\r\n if (!el.hasAttribute('data-permanent-disabled')) {\r\n el.disabled = false;\r\n }\r\n });\r\n }\r\n \r\n const statusElement = form.querySelector('.ds-form__status');\r\n if (statusElement) {\r\n if (state.errorCount > 0) {\r\n statusElement.textContent = `${state.errorCount} ${state.errorCount === 1 ? 'error' : 'errors'} found`;\r\n statusElement.classList.add('ds-form__status--error');\r\n } else {\r\n statusElement.textContent = 'All fields are valid';\r\n statusElement.classList.remove('ds-form__status--error');\r\n }\r\n }\r\n }\r\n\r\n setFormLoading(form, loading) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n if (!this.formStates[formId]) {\r\n this.formStates[formId] = { valid: true, errors: {}, errorCount: 0, loading: false, submitting: false, disabled: false };\r\n }\r\n this.formStates[formId].loading = loading;\r\n this.updateFormState(form);\r\n }\r\n\r\n setFormSubmitting(form, submitting) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n if (!this.formStates[formId]) {\r\n this.formStates[formId] = { valid: true, errors: {}, errorCount: 0, loading: false, submitting: false, disabled: false };\r\n }\r\n this.formStates[formId].submitting = submitting;\r\n this.updateFormState(form);\r\n }\r\n\r\n setFormDisabled(form, disabled) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n if (!this.formStates[formId]) {\r\n this.formStates[formId] = { valid: true, errors: {}, errorCount: 0, loading: false, submitting: false, disabled: false };\r\n }\r\n this.formStates[formId].disabled = disabled;\r\n this.updateFormState(form);\r\n }\r\n\r\n resetForm(form) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n this.formStates[formId] = { valid: true, errors: {}, errorCount: 0, loading: false, submitting: false, disabled: false };\r\n form.reset();\r\n form.querySelectorAll('.ds-input--error').forEach(el => {\r\n el.classList.remove('ds-input--error');\r\n const errorElement = el.parentElement?.querySelector('.ds-input__error');\r\n if (errorElement) {\r\n errorElement.textContent = '';\r\n }\r\n });\r\n this.updateFormState(form);\r\n }\r\n\r\n parseRules(rulesString) {\r\n const rules = {};\r\n const parts = rulesString.split('|');\r\n \r\n parts.forEach(part => {\r\n const [rule, params] = part.split(':');\r\n rules[rule] = params ? params.split(',') : [];\r\n });\r\n \r\n return rules;\r\n }\r\n\r\n validateRequired(value) {\r\n return value !== '';\r\n }\r\n\r\n validateEmail(value) {\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n return emailRegex.test(value);\r\n }\r\n\r\n validateUrl(value) {\r\n const urlRegex = /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/;\r\n return urlRegex.test(value);\r\n }\r\n\r\n validateMinLength(value, [min]) {\r\n return value.length >= parseInt(min);\r\n }\r\n\r\n validateMaxLength(value, [max]) {\r\n return value.length <= parseInt(max);\r\n }\r\n\r\n validatePattern(value, [pattern]) {\r\n const regex = new RegExp(pattern);\r\n return regex.test(value);\r\n }\r\n\r\n validateMin(value, [min]) {\r\n return parseFloat(value) >= parseFloat(min);\r\n }\r\n\r\n validateMax(value, [max]) {\r\n return parseFloat(value) <= parseFloat(max);\r\n }\r\n\r\n validateEqualTo(value, [targetId]) {\r\n const target = document.getElementById(targetId);\r\n return target && value === target.value;\r\n }\r\n\r\n validatePhone(value) {\r\n const phoneRegex = /^[\\d\\s\\-\\+\\(\\)]{7,20}$/;\r\n return phoneRegex.test(value);\r\n }\r\n\r\n validateDate(value) {\r\n const dateRegex = /^\\d{4}[-/]\\d{2}[-/]\\d{2}$/;\r\n return dateRegex.test(value) && !isNaN(Date.parse(value));\r\n }\r\n\r\n validateNumber(value) {\r\n return !isNaN(parseFloat(value)) && isFinite(value);\r\n }\r\n\r\n showError(input, message) {\r\n input.classList.add('ds-input--error');\r\n input.classList.remove('ds-input--success');\r\n input.setAttribute('aria-invalid', 'true');\r\n \r\n let errorElement = input.parentElement.querySelector('.ds-input__error');\r\n if (!errorElement) {\r\n errorElement = document.createElement('span');\r\n errorElement.className = 'ds-input__error';\r\n errorElement.setAttribute('role', 'alert');\r\n errorElement.setAttribute('aria-live', 'polite');\r\n input.parentElement.appendChild(errorElement);\r\n }\r\n errorElement.textContent = message;\r\n \r\n this.removeStatusIcon(input);\r\n \r\n input.dispatchEvent(new CustomEvent('validation-error', { detail: { message } }));\r\n }\r\n\r\n clearError(input) {\r\n input.classList.remove('ds-input--error');\r\n input.setAttribute('aria-invalid', 'false');\r\n \r\n const errorElement = input.parentElement.querySelector('.ds-input__error');\r\n if (errorElement) {\r\n errorElement.remove();\r\n }\r\n \r\n input.dispatchEvent(new CustomEvent('validation-success'));\r\n }\r\n\r\n showSuccess(input) {\r\n input.classList.add('ds-input--success');\r\n input.classList.remove('ds-input--error');\r\n input.setAttribute('aria-invalid', 'false');\r\n \r\n this.removeStatusIcon(input);\r\n \r\n const icon = document.createElement('span');\r\n icon.className = 'ds-input__status-icon ds-input__status-icon--success';\r\n icon.innerHTML = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"20 6 9 17 4 12\"/></svg>';\r\n \r\n input.parentElement.appendChild(icon);\r\n }\r\n\r\n removeStatusIcon(input) {\r\n const icon = input.parentElement.querySelector('.ds-input__status-icon');\r\n if (icon) {\r\n icon.remove();\r\n }\r\n }\r\n\r\n getErrorMessage(rule, params, input) {\r\n const customMessage = input.getAttribute(`data-message-${rule}`);\r\n if (customMessage) return customMessage;\r\n \r\n const messages = {\r\n required: 'This field is required',\r\n email: 'Please enter a valid email address',\r\n url: 'Please enter a valid URL',\r\n minLength: `Minimum length is ${params[0]} characters`,\r\n maxLength: `Maximum length is ${params[0]} characters`,\r\n pattern: 'Please enter a valid value',\r\n min: `Minimum value is ${params[0]}`,\r\n max: `Maximum value is ${params[0]}`,\r\n equalTo: 'Values do not match',\r\n phone: 'Please enter a valid phone number',\r\n date: 'Please enter a valid date (YYYY-MM-DD)',\r\n number: 'Please enter a valid number'\r\n };\r\n return messages[rule] || 'Invalid input';\r\n }\r\n}\r\n\r\nconst validator = new KupolaValidator();\r\n\r\nif (!window.__kupolaValidationInitialized) {\r\n window.__kupolaValidationInitialized = true;\r\n document.addEventListener('DOMContentLoaded', () => {\r\n document.querySelectorAll('form[data-validation]').forEach(form => {\r\n form.addEventListener('submit', async (e) => {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n if (validator.submitting.has(formId)) {\r\n e.preventDefault();\r\n return;\r\n }\r\n \r\n e.preventDefault();\r\n \r\n const hasAsyncValidation = form.querySelector('[data-validate-async]') !== null;\r\n \r\n let isValid;\r\n if (hasAsyncValidation) {\r\n isValid = await validator.validateAsync(form);\r\n } else {\r\n isValid = validator.validate(form);\r\n }\r\n \r\n if (!isValid) {\r\n const firstError = form.querySelector('.ds-input--error');\r\n if (firstError) {\r\n firstError.focus();\r\n }\r\n } else {\r\n validator.submitting.add(formId);\r\n const submitBtn = form.querySelector('button[type=\"submit\"]');\r\n if (submitBtn) {\r\n const originalText = submitBtn.textContent;\r\n submitBtn.setAttribute('data-original-text', originalText);\r\n submitBtn.textContent = 'Submitting...';\r\n submitBtn.disabled = true;\r\n }\r\n \r\n try {\r\n const onSubmit = form.getAttribute('data-on-submit');\r\n if (onSubmit && window[onSubmit]) {\r\n await window[onSubmit](form);\r\n } else {\r\n form.submit();\r\n }\r\n } finally {\r\n validator.submitting.delete(formId);\r\n if (submitBtn) {\r\n submitBtn.textContent = submitBtn.getAttribute('data-original-text') || 'Submit';\r\n submitBtn.disabled = false;\r\n }\r\n }\r\n }\r\n });\r\n\r\n form.querySelectorAll('[data-validate]').forEach(input => {\r\n input.addEventListener('blur', () => {\r\n setTimeout(() => {\r\n const activeElement = document.activeElement;\r\n if (activeElement && activeElement.closest('.ds-select')) {\r\n return;\r\n }\r\n const isValid = validator.validateInput(input);\r\n if (isValid && input.value.trim()) {\r\n validator.showSuccess(input);\r\n }\r\n }, 50);\r\n });\r\n\r\n const debounce = (func, wait) => {\r\n let timeout;\r\n return (...args) => {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => func.apply(this, args), wait);\r\n };\r\n };\r\n\r\n const validateOnInput = debounce(() => {\r\n const value = validator.getValue(input);\r\n if (value.length > 0 || input.classList.contains('ds-input--error')) {\r\n const isValid = validator.validateInput(input);\r\n if (isValid && value) {\r\n validator.showSuccess(input);\r\n }\r\n } else {\r\n validator.removeStatusIcon(input);\r\n }\r\n }, 300);\r\n\r\n input.addEventListener('input', validateOnInput);\r\n\r\n input.addEventListener('keyup', (e) => {\r\n if (e.key === 'Enter') {\r\n const isValid = validator.validateInput(input);\r\n if (isValid && input.value.trim()) {\r\n validator.showSuccess(input);\r\n }\r\n }\r\n });\r\n });\r\n });\r\n});\r\n}\r\n\r\nwindow.KupolaValidator = KupolaValidator;\r\nwindow.kupolaValidator = validator;","class VirtualList {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.data = options.data || [];\r\n this.itemHeight = options.itemHeight || 48;\r\n this.itemWidth = options.itemWidth || 200;\r\n this.bufferSize = options.bufferSize || 5;\r\n this.renderItem = options.renderItem || this.defaultRenderItem;\r\n this.onItemClick = options.onItemClick || null;\r\n this.onItemSelect = options.onItemSelect || null;\r\n this.onScroll = options.onScroll || null;\r\n this.onScrollEnd = options.onScrollEnd || null;\r\n this.selectedKey = options.selectedKey || null;\r\n this.keyField = options.keyField || 'id';\r\n this.useDynamicHeight = options.useDynamicHeight || false;\r\n this.dynamicHeightCache = new Map();\r\n this.estimatedHeight = options.estimatedHeight || 48;\r\n \r\n this.container = null;\r\n this.scrollbarTrack = null;\r\n this.scrollbarThumb = null;\r\n this.totalHeight = 0;\r\n this.startIndex = 0;\r\n this.endIndex = 0;\r\n this.isScrolling = false;\r\n this.scrollTimeout = null;\r\n this.lastScrollTop = 0;\r\n this.lastScrollLeft = 0;\r\n \r\n this.init();\r\n }\r\n\r\n defaultRenderItem(item, index) {\r\n return `\r\n <div class=\"ds-virtual-list__item-content\">\r\n <div class=\"ds-virtual-list__item-icon\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/>\r\n <polyline points=\"14 2 14 8 20 8\"/>\r\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"/>\r\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"/>\r\n <polyline points=\"10 9 9 9 8 9\"/>\r\n </svg>\r\n </div>\r\n <div>\r\n <div class=\"ds-virtual-list__item-title\">${item.title || item.name || `Item ${index + 1}`}</div>\r\n <div class=\"ds-virtual-list__item-subtitle\">${item.subtitle || 'Subtitle'}</div>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n\r\n init() {\r\n this.createStructure();\r\n this.update();\r\n this.bindEvents();\r\n }\r\n\r\n createStructure() {\r\n this.element.innerHTML = `\r\n <div class=\"ds-virtual-list__scrollbar\">\r\n <div class=\"ds-virtual-list__scrollbar-track\">\r\n <div class=\"ds-virtual-list__scrollbar-thumb\"></div>\r\n </div>\r\n </div>\r\n <div class=\"ds-virtual-list__container\"></div>\r\n `;\r\n \r\n this.container = this.element.querySelector('.ds-virtual-list__container');\r\n this.scrollbarThumb = this.element.querySelector('.ds-virtual-list__scrollbar-thumb');\r\n }\r\n\r\n bindEvents() {\r\n this._scrollHandler = (e) => this.handleScroll(e);\r\n this._thumbDragStartHandler = (e) => this.handleThumbDragStart(e);\r\n this._thumbDragMoveHandler = (e) => this.handleThumbDragMove(e);\r\n this._thumbDragEndHandler = () => this.handleThumbDragEnd();\r\n this._wheelHandler = (e) => {\r\n e.preventDefault();\r\n \r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n \r\n if (isHorizontal) {\r\n this.element.scrollLeft += e.deltaX + e.deltaY;\r\n } else {\r\n this.element.scrollTop += e.deltaY + e.deltaX;\r\n }\r\n };\r\n \r\n this.element.addEventListener('scroll', this._scrollHandler);\r\n this.scrollbarThumb.addEventListener('mousedown', this._thumbDragStartHandler);\r\n \r\n document.addEventListener('mousemove', this._thumbDragMoveHandler);\r\n document.addEventListener('mouseup', this._thumbDragEndHandler);\r\n \r\n this.element.addEventListener('wheel', this._wheelHandler, { passive: false });\r\n \r\n this._listeners = [\r\n { el: this.element, event: 'scroll', handler: this._scrollHandler },\r\n { el: this.scrollbarThumb, event: 'mousedown', handler: this._thumbDragStartHandler },\r\n { el: document, event: 'mousemove', handler: this._thumbDragMoveHandler },\r\n { el: document, event: 'mouseup', handler: this._thumbDragEndHandler },\r\n { el: this.element, event: 'wheel', handler: this._wheelHandler }\r\n ];\r\n }\r\n\r\n handleScroll(e) {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const scrollOffset = isHorizontal ? this.element.scrollLeft : this.element.scrollTop;\r\n \r\n if (this.onScroll) {\r\n this.onScroll({ \r\n scrollOffset, \r\n isHorizontal,\r\n dataLength: this.data.length,\r\n startIndex: this.startIndex,\r\n endIndex: this.endIndex\r\n });\r\n }\r\n \r\n this.updateScrollState();\r\n this.renderVisibleItems();\r\n this.updateScrollbar();\r\n }\r\n\r\n updateScrollState() {\r\n this.isScrolling = true;\r\n this.element.classList.add('ds-virtual-list--scrolling');\r\n \r\n if (this.scrollTimeout) {\r\n clearTimeout(this.scrollTimeout);\r\n }\r\n \r\n this.scrollTimeout = setTimeout(() => {\r\n this.isScrolling = false;\r\n this.element.classList.remove('ds-virtual-list--scrolling');\r\n \r\n if (this.onScrollEnd) {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const scrollOffset = isHorizontal ? this.element.scrollLeft : this.element.scrollTop;\r\n this.onScrollEnd({ \r\n scrollOffset, \r\n isHorizontal,\r\n dataLength: this.data.length,\r\n startIndex: this.startIndex,\r\n endIndex: this.endIndex\r\n });\r\n }\r\n }, 200);\r\n }\r\n\r\n getItemSize(index) {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n \r\n if (this.useDynamicHeight) {\r\n const key = this.data[index][this.keyField] || index;\r\n if (this.dynamicHeightCache.has(key)) {\r\n return this.dynamicHeightCache.get(key);\r\n }\r\n }\r\n \r\n return isHorizontal ? this.itemWidth : this.itemHeight;\r\n }\r\n\r\n getItemPositions() {\r\n const positions = [];\r\n let currentPosition = 0;\r\n \r\n this.data.forEach((item, index) => {\r\n const size = this.getItemSize(index);\r\n positions.push({\r\n start: currentPosition,\r\n end: currentPosition + size,\r\n size\r\n });\r\n currentPosition += size;\r\n });\r\n \r\n return positions;\r\n }\r\n\r\n getTotalSize() {\r\n if (this.useDynamicHeight) {\r\n return this.data.reduce((total, item, index) => {\r\n return total + this.getItemSize(index);\r\n }, 0);\r\n }\r\n \r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const itemSize = isHorizontal ? this.itemWidth : this.itemHeight;\r\n return this.data.length * itemSize;\r\n }\r\n\r\n getIndexAtOffset(offset) {\r\n if (this.useDynamicHeight) {\r\n const positions = this.getItemPositions();\r\n for (let i = 0; i < positions.length; i++) {\r\n if (offset >= positions[i].start && offset < positions[i].end) {\r\n return i;\r\n }\r\n }\r\n return this.data.length - 1;\r\n }\r\n \r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const itemSize = isHorizontal ? this.itemWidth : this.itemHeight;\r\n return Math.floor(offset / itemSize);\r\n }\r\n\r\n renderVisibleItems() {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const scrollOffset = isHorizontal ? this.element.scrollLeft : this.element.scrollTop;\r\n const viewportSize = isHorizontal ? this.element.clientWidth : this.element.clientHeight;\r\n \r\n const startIndex = Math.max(0, this.getIndexAtOffset(scrollOffset) - this.bufferSize);\r\n let endIndex = Math.min(\r\n this.data.length - 1,\r\n this.getIndexAtOffset(scrollOffset + viewportSize) + this.bufferSize\r\n );\r\n \r\n if (endIndex < startIndex) endIndex = startIndex;\r\n \r\n this.startIndex = startIndex;\r\n this.endIndex = endIndex;\r\n \r\n const visibleData = this.data.slice(startIndex, endIndex + 1);\r\n \r\n let html = '';\r\n let currentPosition = 0;\r\n \r\n if (this.useDynamicHeight) {\r\n const positions = this.getItemPositions();\r\n currentPosition = positions[startIndex]?.start || 0;\r\n } else {\r\n const itemSize = isHorizontal ? this.itemWidth : this.itemHeight;\r\n currentPosition = startIndex * itemSize;\r\n }\r\n \r\n visibleData.forEach((item, i) => {\r\n const actualIndex = startIndex + i;\r\n const key = item[this.keyField] || actualIndex;\r\n const isSelected = this.selectedKey === key;\r\n const itemSize = this.getItemSize(actualIndex);\r\n const position = currentPosition;\r\n \r\n if (isHorizontal) {\r\n html += `\r\n <div \r\n class=\"ds-virtual-list__item${isSelected ? ' is-selected' : ''}\" \r\n style=\"position: absolute; top: 0; left: ${position}px; width: ${itemSize}px; height: 100%;\"\r\n data-index=\"${actualIndex}\"\r\n data-key=\"${key}\"\r\n >\r\n ${this.renderItem(item, actualIndex)}\r\n </div>\r\n `;\r\n } else {\r\n html += `\r\n <div \r\n class=\"ds-virtual-list__item${isSelected ? ' is-selected' : ''}\" \r\n style=\"position: absolute; top: ${position}px; left: 0; right: 0; height: ${itemSize}px;\"\r\n data-index=\"${actualIndex}\"\r\n data-key=\"${key}\"\r\n >\r\n ${this.renderItem(item, actualIndex)}\r\n </div>\r\n `;\r\n }\r\n \r\n currentPosition += itemSize;\r\n });\r\n \r\n this.container.innerHTML = html;\r\n \r\n if (this.useDynamicHeight) {\r\n this.updateDynamicHeights();\r\n }\r\n \r\n this.container.querySelectorAll('.ds-virtual-list__item').forEach(item => {\r\n item.addEventListener('click', () => this.handleItemClick(item));\r\n });\r\n }\r\n\r\n updateDynamicHeights() {\r\n if (this.isUpdating) return;\r\n \r\n let hasChanges = false;\r\n this.container.querySelectorAll('.ds-virtual-list__item').forEach(item => {\r\n const index = parseInt(item.dataset.index);\r\n const key = this.data[index][this.keyField] || index;\r\n const actualHeight = item.offsetHeight;\r\n \r\n if (actualHeight !== this.getItemSize(index)) {\r\n this.dynamicHeightCache.set(key, actualHeight);\r\n hasChanges = true;\r\n }\r\n });\r\n \r\n if (hasChanges) {\r\n this.isUpdating = true;\r\n this.update();\r\n this.isUpdating = false;\r\n }\r\n }\r\n\r\n handleItemClick(item) {\r\n const index = parseInt(item.dataset.index);\r\n const key = item.dataset.key;\r\n const dataItem = this.data[index];\r\n \r\n if (this.onItemClick) {\r\n this.onItemClick({ item: dataItem, index, key });\r\n }\r\n \r\n if (this.onItemSelect) {\r\n this.select(key);\r\n }\r\n }\r\n\r\n select(key) {\r\n this.selectedKey = key;\r\n \r\n if (this.onItemSelect) {\r\n const index = this.data.findIndex(item => item[this.keyField] === key);\r\n if (index !== -1) {\r\n this.onItemSelect({ item: this.data[index], index, key });\r\n }\r\n }\r\n \r\n this.renderVisibleItems();\r\n }\r\n\r\n updateScrollbar() {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const totalSize = this.getTotalSize();\r\n const viewportSize = isHorizontal ? this.element.clientWidth : this.element.clientHeight;\r\n const scrollOffset = isHorizontal ? this.element.scrollLeft : this.element.scrollTop;\r\n \r\n if (isHorizontal) {\r\n this.scrollbarThumb.style.display = 'none';\r\n return;\r\n }\r\n \r\n const thumbHeight = Math.max(20, (viewportSize / totalSize) * viewportSize);\r\n const maxTop = viewportSize - thumbHeight;\r\n const thumbTop = (scrollOffset / (totalSize - viewportSize || 1)) * maxTop;\r\n \r\n this.scrollbarThumb.style.height = thumbHeight + 'px';\r\n this.scrollbarThumb.style.top = thumbTop + 'px';\r\n }\r\n\r\n handleThumbDragStart(e) {\r\n e.preventDefault();\r\n this.isDragging = true;\r\n this.dragStartY = e.clientY;\r\n this.dragStartTop = parseFloat(this.scrollbarThumb.style.top) || 0;\r\n }\r\n\r\n handleThumbDragMove(e) {\r\n if (!this.isDragging) return;\r\n \r\n const viewportHeight = this.element.clientHeight;\r\n const totalHeight = this.getTotalSize();\r\n const thumbHeight = parseFloat(this.scrollbarThumb.style.height) || viewportHeight;\r\n const maxTop = viewportHeight - thumbHeight;\r\n \r\n const deltaY = e.clientY - this.dragStartY;\r\n let newTop = this.dragStartTop + deltaY;\r\n newTop = Math.max(0, Math.min(newTop, maxTop));\r\n \r\n this.scrollbarThumb.style.top = newTop + 'px';\r\n \r\n const scrollTop = (newTop / maxTop) * (totalHeight - viewportHeight || 0);\r\n this.element.scrollTop = scrollTop;\r\n }\r\n\r\n handleThumbDragEnd() {\r\n this.isDragging = false;\r\n }\r\n\r\n update() {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const totalSize = this.getTotalSize();\r\n \r\n if (isHorizontal) {\r\n this.container.style.width = totalSize + 'px';\r\n this.container.style.height = '100%';\r\n } else {\r\n this.container.style.height = totalSize + 'px';\r\n this.container.style.width = '100%';\r\n }\r\n \r\n this.renderVisibleItems();\r\n this.updateScrollbar();\r\n }\r\n\r\n setData(data) {\r\n this.data = data;\r\n if (this.useDynamicHeight) {\r\n this.dynamicHeightCache.clear();\r\n }\r\n this.update();\r\n }\r\n\r\n addItem(item) {\r\n this.data.push(item);\r\n this.update();\r\n }\r\n\r\n removeItem(index) {\r\n this.data.splice(index, 1);\r\n if (this.useDynamicHeight) {\r\n this.dynamicHeightCache.clear();\r\n }\r\n this.update();\r\n }\r\n\r\n insertItem(index, item) {\r\n this.data.splice(index, 0, item);\r\n if (this.useDynamicHeight) {\r\n this.dynamicHeightCache.clear();\r\n }\r\n this.update();\r\n }\r\n\r\n scrollTo(index, behavior = 'smooth') {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n \r\n let scrollOffset = 0;\r\n if (this.useDynamicHeight) {\r\n const positions = this.getItemPositions();\r\n scrollOffset = positions[index]?.start || 0;\r\n } else {\r\n const itemSize = isHorizontal ? this.itemWidth : this.itemHeight;\r\n scrollOffset = index * itemSize;\r\n }\r\n \r\n if (isHorizontal) {\r\n this.element.scrollTo({ left: scrollOffset, behavior });\r\n } else {\r\n this.element.scrollTo({ top: scrollOffset, behavior });\r\n }\r\n }\r\n\r\n scrollToKey(key, behavior = 'smooth') {\r\n const index = this.data.findIndex(item => item[this.keyField] === key);\r\n if (index !== -1) {\r\n this.scrollTo(index, behavior);\r\n }\r\n }\r\n\r\n scrollToTop(behavior = 'smooth') {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n this.element.scrollTo({ [isHorizontal ? 'left' : 'top']: 0, behavior });\r\n }\r\n\r\n scrollToBottom(behavior = 'smooth') {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const totalSize = this.getTotalSize();\r\n const viewportSize = isHorizontal ? this.element.clientWidth : this.element.clientHeight;\r\n this.element.scrollTo({ [isHorizontal ? 'left' : 'top']: totalSize - viewportSize, behavior });\r\n }\r\n\r\n getVisibleItems() {\r\n return this.data.slice(this.startIndex, this.endIndex + 1).map((item, i) => ({\r\n item,\r\n index: this.startIndex + i,\r\n key: item[this.keyField] || this.startIndex + i\r\n }));\r\n }\r\n\r\n getItemIndex(key) {\r\n return this.data.findIndex(item => item[this.keyField] === key);\r\n }\r\n\r\n getItem(key) {\r\n const index = this.getItemIndex(key);\r\n return index !== -1 ? this.data[index] : null;\r\n }\r\n\r\n refreshCache() {\r\n this.dynamicHeightCache.clear();\r\n this.update();\r\n }\r\n\r\n destroy() {\r\n if (this.scrollTimeout) {\r\n clearTimeout(this.scrollTimeout);\r\n }\r\n \r\n this._listeners?.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n \r\n this.data = [];\r\n this.dynamicHeightCache.clear();\r\n this.container.innerHTML = '';\r\n \r\n this._listeners = null;\r\n this._scrollHandler = null;\r\n this._thumbDragStartHandler = null;\r\n this._thumbDragMoveHandler = null;\r\n this._thumbDragEndHandler = null;\r\n this._wheelHandler = null;\r\n this.container = null;\r\n this.scrollbarThumb = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction generateMockVirtualListData(count = 1000) {\r\n const data = [];\r\n const titles = ['Document', 'Image', 'Video', 'Folder', 'Archive', 'Spreadsheet', 'Presentation', 'Code'];\r\n \r\n for (let i = 1; i <= count; i++) {\r\n const titleIndex = Math.floor(Math.random() * titles.length);\r\n const randomNum = Math.floor(Math.random() * 10000);\r\n \r\n data.push({\r\n id: i,\r\n title: `${titles[titleIndex]} ${randomNum}`,\r\n subtitle: `Last modified ${Math.floor(Math.random() * 30)} days ago`,\r\n type: titles[titleIndex].toLowerCase()\r\n });\r\n }\r\n \r\n return data;\r\n}\r\n\r\nfunction createVirtualList(selector, options = {}) {\r\n const element = document.querySelector(selector);\r\n if (element) {\r\n const data = options.data || generateMockVirtualListData(options.count || 1000);\r\n return new VirtualList(element, {\r\n data: data,\r\n ...options\r\n });\r\n }\r\n return null;\r\n}\r\n\r\nfunction initVirtualList(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const dataAttr = element.getAttribute('data-virtual-list');\r\n let data = [];\r\n \r\n if (dataAttr) {\r\n try {\r\n data = JSON.parse(dataAttr);\r\n } catch (e) {\r\n data = generateMockVirtualListData(1000);\r\n }\r\n } else {\r\n data = generateMockVirtualListData(1000);\r\n }\r\n \r\n const instance = new VirtualList(element, {\r\n data: data,\r\n onItemClick: (info) => {},\r\n onItemSelect: (info) => {}\r\n });\r\n \r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupVirtualList(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initVirtualLists() {\r\n document.querySelectorAll('.ds-virtual-list').forEach(element => {\r\n initVirtualList(element);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { VirtualList, initVirtualLists, initVirtualList, cleanupVirtualList, createVirtualList, generateMockVirtualListData };\r\n} else {\r\n window.initVirtualList = initVirtualList;\r\n window.cleanupVirtualList = cleanupVirtualList;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('virtual-list', initVirtualList, cleanupVirtualList);\r\n}","class KupolaDevTools {\r\n constructor(options = {}) {\r\n this.enabled = options.enabled ?? false;\r\n this.panel = null;\r\n this.isOpen = false;\r\n this.activeTab = 'storage';\r\n this.activeStorageType = 'cookies';\r\n this.requestHistory = [];\r\n this.maxHistorySize = 50;\r\n }\r\n\r\n init() {\r\n if (!this.enabled) return;\r\n try {\r\n this.createToggleButton();\r\n this.createPanel();\r\n this.setupNetworkInterceptor();\r\n } catch (error) {\r\n console.error('Error in init:', error);\r\n }\r\n }\r\n\r\n createToggleButton() {\r\n const button = document.createElement('button');\r\n button.className = 'kupola-devtools__toggle';\r\n button.textContent = '🛠️';\r\n button.style.cssText = `\r\n position: fixed;\r\n bottom: 28px;\r\n left: 50px;\r\n width: 48px;\r\n height: 48px;\r\n border-radius: 50%;\r\n background: #535164;\r\n color: white;\r\n border: none;\r\n cursor: pointer;\r\n z-index: 9999;\r\n font-size: 20px;\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\r\n transition: transform 0.2s;\r\n `;\r\n button.addEventListener('click', () => this.togglePanel());\r\n document.body.appendChild(button);\r\n this.toggleButton = button;\r\n }\r\n\r\n createPanel() {\r\n const panel = document.createElement('div');\r\n panel.className = 'kupola-devtools__panel';\r\n panel.style.cssText = `\r\n position: fixed;\r\n bottom: 80px;\r\n left: 28px;\r\n width: 550px;\r\n max-height: 650px;\r\n background: #1e1e1e;\r\n border-radius: 12px;\r\n box-shadow: 0 8px 32px rgba(0,0,0,0.4);\r\n z-index: 9998;\r\n display: none;\r\n flex-direction: column;\r\n overflow: hidden;\r\n border: 1px solid #333;\r\n `;\r\n \r\n panel.innerHTML = `\r\n <div class=\"kupola-devtools__header\">\r\n <span class=\"kupola-devtools__title\">DevTools</span>\r\n <button class=\"kupola-devtools__close\">✕</button>\r\n </div>\r\n <div class=\"kupola-devtools__tabs\">\r\n <button data-tab=\"storage\" class=\"kupola-devtools__tab active\">Storage</button>\r\n <button data-tab=\"network\" class=\"kupola-devtools__tab\">Network</button>\r\n </div>\r\n <div class=\"kupola-devtools__sub-tabs\" id=\"storage-sub-tabs\">\r\n <button class=\"kupola-devtools__sub-tab active\" data-storage=\"cookies\">Cookies</button>\r\n <button class=\"kupola-devtools__sub-tab\" data-storage=\"localStorage\">LocalStorage</button>\r\n <button class=\"kupola-devtools__sub-tab\" data-storage=\"sessionStorage\">SessionStorage</button>\r\n </div>\r\n <div class=\"kupola-devtools__sub-tabs\" id=\"network-sub-tabs\" style=\"display:none;\">\r\n <button class=\"kupola-devtools__network-action\" data-action=\"clear\">Clear</button>\r\n </div>\r\n <div class=\"kupola-devtools__content\">\r\n ${this.getStorageContent('cookies')}\r\n </div>\r\n `;\r\n \r\n document.body.appendChild(panel);\r\n this.panel = panel;\r\n \r\n panel.querySelector('.kupola-devtools__close').addEventListener('click', () => this.togglePanel());\r\n panel.querySelectorAll('.kupola-devtools__tab').forEach(tab => {\r\n tab.addEventListener('click', () => this.switchTab(tab.dataset.tab));\r\n });\r\n this.setupStorageListener();\r\n this.makeDraggable();\r\n this.injectStyles();\r\n }\r\n\r\n switchTab(tabName) {\r\n this.activeTab = tabName;\r\n \r\n this.panel.querySelectorAll('.kupola-devtools__tab').forEach(tab => {\r\n tab.classList.toggle('active', tab.dataset.tab === tabName);\r\n });\r\n \r\n const storageSubTabs = this.panel.querySelector('#storage-sub-tabs');\r\n const networkSubTabs = this.panel.querySelector('#network-sub-tabs');\r\n \r\n if (tabName === 'storage') {\r\n storageSubTabs.style.display = 'flex';\r\n networkSubTabs.style.display = 'none';\r\n this.renderStorageContent();\r\n } else {\r\n storageSubTabs.style.display = 'none';\r\n networkSubTabs.style.display = 'flex';\r\n this.renderNetworkContent();\r\n }\r\n }\r\n\r\n renderStorageContent() {\r\n const content = this.panel.querySelector('.kupola-devtools__content');\r\n if (content) {\r\n content.innerHTML = this.getStorageContent(this.activeStorageType);\r\n }\r\n }\r\n\r\n renderNetworkContent() {\r\n const content = this.panel.querySelector('.kupola-devtools__content');\r\n if (!content) return;\r\n \r\n if (this.requestHistory.length === 0) {\r\n content.innerHTML = '<div class=\"kupola-devtools__loading\">No network requests captured</div>';\r\n return;\r\n }\r\n \r\n let html = '';\r\n this.requestHistory.forEach((req, index) => {\r\n const statusClass = req.status >= 200 && req.status < 300 ? 'success' : \r\n req.status >= 400 ? 'error' : 'warning';\r\n const duration = req.duration ? `${req.duration}ms` : '-';\r\n \r\n html += `\r\n <div class=\"kupola-devtools__network-item\" data-index=\"${index}\">\r\n <div class=\"kupola-devtools__network-header\">\r\n <span class=\"kupola-devtools__network-method\">${req.method}</span>\r\n <span class=\"kupola-devtools__network-url\">${req.url}</span>\r\n <span class=\"kupola-devtools__network-status ${statusClass}\">${req.status}</span>\r\n <span class=\"kupola-devtools__network-duration\">${duration}</span>\r\n </div>\r\n <div class=\"kupola-devtools__network-details\" style=\"display:none;\">\r\n ${req.params ? `<div class=\"kupola-devtools__network-detail\"><strong>Params:</strong><pre>${this.truncateContent(JSON.stringify(req.params, null, 2), 1000)}</pre></div>` : ''}\r\n ${req.requestBody ? `<div class=\"kupola-devtools__network-detail\"><strong>Request Body:</strong><pre>${this.truncateContent(req.requestBody, 1000)}</pre></div>` : ''}\r\n ${req.response ? `<div class=\"kupola-devtools__network-detail\"><strong>Response:</strong><pre>${this.truncateContent(req.response, 1500)}</pre></div>` : ''}\r\n </div>\r\n </div>\r\n `;\r\n });\r\n \r\n content.innerHTML = html;\r\n \r\n content.querySelectorAll('.kupola-devtools__network-item').forEach(item => {\r\n item.addEventListener('click', () => {\r\n const details = item.querySelector('.kupola-devtools__network-details');\r\n details.style.display = details.style.display === 'none' ? 'block' : 'none';\r\n });\r\n });\r\n \r\n const clearBtn = this.panel.querySelector('[data-action=\"clear\"]');\r\n if (clearBtn) {\r\n clearBtn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n this.clearNetworkHistory();\r\n });\r\n }\r\n }\r\n\r\n clearNetworkHistory() {\r\n this.requestHistory = [];\r\n this.renderNetworkContent();\r\n }\r\n\r\n truncateContent(content, maxLength) {\r\n if (!content) return '-';\r\n const str = typeof content === 'string' ? content : JSON.stringify(content);\r\n if (str.length <= maxLength) return str;\r\n return str.substring(0, maxLength) + `... (truncated, ${str.length} chars)`;\r\n }\r\n\r\n setupNetworkInterceptor() {\r\n const devTools = this;\r\n \r\n const originalFetch = window.fetch;\r\n window.fetch = async function(url, options = {}) {\r\n const startTime = Date.now();\r\n const requestId = Date.now() + Math.random();\r\n \r\n let requestBody = null;\r\n if (options.body) {\r\n if (typeof options.body === 'string') {\r\n requestBody = options.body;\r\n } else if (options.body instanceof FormData) {\r\n try {\r\n requestBody = JSON.stringify(Object.fromEntries(options.body));\r\n } catch {}\r\n } else {\r\n try {\r\n requestBody = JSON.stringify(options.body);\r\n } catch {}\r\n }\r\n }\r\n \r\n let params = null;\r\n try {\r\n const urlObj = new URL(typeof url === 'string' ? url : url.href);\r\n if (urlObj.search) {\r\n params = Object.fromEntries(urlObj.searchParams);\r\n }\r\n } catch {}\r\n \r\n const entry = {\r\n id: requestId,\r\n method: options.method || 'GET',\r\n url: typeof url === 'string' ? url : url.href,\r\n params,\r\n requestBody,\r\n status: 0,\r\n response: null,\r\n duration: null\r\n };\r\n \r\n devTools.addRequest(entry);\r\n \r\n try {\r\n const response = await originalFetch.apply(this, arguments);\r\n \r\n entry.status = response.status;\r\n entry.duration = Date.now() - startTime;\r\n \r\n try {\r\n const clone = response.clone();\r\n const text = await clone.text();\r\n try {\r\n entry.response = JSON.parse(text);\r\n } catch {\r\n entry.response = text;\r\n }\r\n } catch {}\r\n \r\n devTools.updateRequest(entry);\r\n \r\n return response;\r\n } catch (error) {\r\n entry.status = -1;\r\n entry.response = error.message;\r\n entry.duration = Date.now() - startTime;\r\n devTools.updateRequest(entry);\r\n throw error;\r\n }\r\n };\r\n \r\n const originalOpen = XMLHttpRequest.prototype.open;\r\n XMLHttpRequest.prototype.open = function(method, url) {\r\n this.__kupolaRequest = {\r\n method,\r\n url,\r\n params: null,\r\n requestBody: null,\r\n status: 0,\r\n response: null,\r\n startTime: Date.now()\r\n };\r\n \r\n try {\r\n const urlObj = new URL(url);\r\n if (urlObj.search) {\r\n this.__kupolaRequest.params = Object.fromEntries(urlObj.searchParams);\r\n }\r\n } catch {}\r\n \r\n originalOpen.apply(this, arguments);\r\n };\r\n \r\n const originalSend = XMLHttpRequest.prototype.send;\r\n XMLHttpRequest.prototype.send = function(body) {\r\n if (this.__kupolaRequest) {\r\n if (body) {\r\n if (typeof body === 'string') {\r\n this.__kupolaRequest.requestBody = body;\r\n } else if (body instanceof FormData) {\r\n try {\r\n this.__kupolaRequest.requestBody = JSON.stringify(Object.fromEntries(body));\r\n } catch {}\r\n }\r\n }\r\n \r\n const entry = { ...this.__kupolaRequest };\r\n devTools.addRequest(entry);\r\n this.__kupolaEntry = entry;\r\n }\r\n \r\n originalSend.apply(this, arguments);\r\n };\r\n \r\n const originalOnReadyStateChange = XMLHttpRequest.prototype.onreadystatechange;\r\n XMLHttpRequest.prototype.onreadystatechange = function() {\r\n if (this.__kupolaEntry && this.readyState === 4) {\r\n this.__kupolaEntry.status = this.status;\r\n this.__kupolaEntry.duration = Date.now() - this.__kupolaRequest.startTime;\r\n \r\n try {\r\n const responseText = this.responseText;\r\n try {\r\n this.__kupolaEntry.response = JSON.parse(responseText);\r\n } catch {\r\n this.__kupolaEntry.response = responseText;\r\n }\r\n } catch {}\r\n \r\n devTools.updateRequest(this.__kupolaEntry);\r\n }\r\n \r\n if (typeof originalOnReadyStateChange === 'function') {\r\n originalOnReadyStateChange.apply(this, arguments);\r\n }\r\n };\r\n }\r\n\r\n addRequest(entry) {\r\n this.requestHistory.unshift(entry);\r\n if (this.requestHistory.length > this.maxHistorySize) {\r\n this.requestHistory.pop();\r\n }\r\n \r\n if (this.isOpen && this.activeTab === 'network') {\r\n this.renderNetworkContent();\r\n }\r\n }\r\n\r\n updateRequest(entry) {\r\n const index = this.requestHistory.findIndex(r => r.id === entry.id || \r\n (r.url === entry.url && r.method === entry.method && !r.status));\r\n if (index !== -1) {\r\n this.requestHistory[index] = entry;\r\n \r\n if (this.isOpen && this.activeTab === 'network') {\r\n this.renderNetworkContent();\r\n }\r\n }\r\n }\r\n \r\n setupStorageListener() {\r\n const devTools = this;\r\n \r\n window.addEventListener('storage', (e) => {\r\n if (devTools.isOpen && devTools.activeTab === 'storage') {\r\n const content = devTools.panel?.querySelector('.kupola-devtools__content');\r\n if (content) {\r\n const type = e.storageArea === localStorage ? 'localStorage' : 'sessionStorage';\r\n devTools.activeStorageType = type;\r\n devTools.updateStorageTabs();\r\n content.innerHTML = devTools.getStorageContent(type);\r\n }\r\n }\r\n });\r\n \r\n const originalSetItem = Storage.prototype.setItem;\r\n Storage.prototype.setItem = function(key, value) {\r\n const oldValue = this.getItem(key);\r\n originalSetItem.call(this, key, value);\r\n const event = new StorageEvent('storage', {\r\n key,\r\n oldValue,\r\n newValue: value,\r\n url: window.location.href,\r\n storageArea: this\r\n });\r\n window.dispatchEvent(event);\r\n };\r\n \r\n const originalRemoveItem = Storage.prototype.removeItem;\r\n Storage.prototype.removeItem = function(key) {\r\n const oldValue = this.getItem(key);\r\n originalRemoveItem.call(this, key);\r\n const event = new StorageEvent('storage', {\r\n key,\r\n oldValue,\r\n newValue: null,\r\n url: window.location.href,\r\n storageArea: this\r\n });\r\n window.dispatchEvent(event);\r\n };\r\n }\r\n\r\n injectStyles() {\r\n const styles = document.createElement('style');\r\n styles.textContent = `\r\n .kupola-devtools__header { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; background: #2d2d2d; border-bottom: 1px solid #333; }\r\n .kupola-devtools__title { color: #535164; font-weight: 600; font-size: 14px; }\r\n .kupola-devtools__close { background: none; border: none; color: #888; cursor: pointer; font-size: 14px; padding: 4px; }\r\n .kupola-devtools__close:hover { color: #fff; }\r\n .kupola-devtools__tabs { display: flex; background: #252525; border-bottom: 1px solid #333; }\r\n .kupola-devtools__tab { flex: 1; padding: 10px 8px; background: none; border: none; color: #888; cursor: pointer; font-size: 11px; border-bottom: 2px solid transparent; transition: all 0.2s; }\r\n .kupola-devtools__tab:hover { color: #fff; }\r\n .kupola-devtools__tab.active { color: #535164; border-bottom-color: #535164; }\r\n .kupola-devtools__sub-tabs { display: flex; gap: 4px; padding: 8px 12px; background: #1e1e1e; border-bottom: 1px solid #333; }\r\n .kupola-devtools__sub-tab { padding: 4px 8px; background: #333; border: none; color: #888; cursor: pointer; font-size: 11px; border-radius: 4px; }\r\n .kupola-devtools__sub-tab:hover { color: #fff; }\r\n .kupola-devtools__sub-tab.active { background: #535164; color: white; }\r\n .kupola-devtools__network-action { padding: 4px 8px; background: #333; border: none; color: #888; cursor: pointer; font-size: 11px; border-radius: 4px; }\r\n .kupola-devtools__network-action:hover { color: #fff; background: #444; }\r\n .kupola-devtools__content { flex: 1; overflow-y: auto; padding: 12px; font-family: 'Consolas', monospace; font-size: 12px; }\r\n .kupola-devtools__list-item { padding: 6px 8px; border-radius: 4px; margin-bottom: 4px; background: #2a2a2a; }\r\n .kupola-devtools__list-item:hover { background: #333; }\r\n .kupola-devtools__loading { display: flex; justify-content: center; align-items: center; height: 100px; color: #666; }\r\n .kupola-devtools__storage-key { color: #9cdcfe; margin-right: 8px; }\r\n .kupola-devtools__storage-value { color: #ce9178; word-break: break-all; }\r\n .kupola-devtools__network-item { padding: 6px 8px; border-radius: 4px; margin-bottom: 4px; background: #2a2a2a; cursor: pointer; }\r\n .kupola-devtools__network-item:hover { background: #333; }\r\n .kupola-devtools__network-header { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }\r\n .kupola-devtools__network-method { padding: 2px 6px; border-radius: 3px; font-weight: 600; font-size: 11px; color: white; }\r\n .kupola-devtools__network-method.GET { background: #4CAF50; }\r\n .kupola-devtools__network-method.POST { background: #2196F3; }\r\n .kupola-devtools__network-method.PUT { background: #FF9800; }\r\n .kupola-devtools__network-method.DELETE { background: #F44336; }\r\n .kupola-devtools__network-method.PATCH { background: #9C27B0; }\r\n .kupola-devtools__network-url { flex: 1; color: #9cdcfe; font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n .kupola-devtools__network-status { padding: 2px 6px; border-radius: 3px; font-size: 11px; font-weight: 600; }\r\n .kupola-devtools__network-status.success { background: #4CAF50; color: white; }\r\n .kupola-devtools__network-status.error { background: #F44336; color: white; }\r\n .kupola-devtools__network-status.warning { background: #FF9800; color: white; }\r\n .kupola-devtools__network-duration { color: #888; font-size: 11px; }\r\n .kupola-devtools__network-details { margin-top: 8px; padding-top: 8px; border-top: 1px solid #333; }\r\n .kupola-devtools__network-detail { margin-bottom: 8px; }\r\n .kupola-devtools__network-detail strong { color: #535164; display: block; margin-bottom: 4px; }\r\n .kupola-devtools__network-detail pre { margin: 0; color: #ce9178; white-space: pre-wrap; word-break: break-all; }\r\n `;\r\n document.head.appendChild(styles);\r\n }\r\n\r\n makeDraggable() {\r\n const header = this.panel.querySelector('.kupola-devtools__header');\r\n let isDragging = false;\r\n let startX, startY, startLeft, startTop;\r\n\r\n this._dragMouseDownHandler = (e) => {\r\n if (e.target.closest('.kupola-devtools__close')) return;\r\n isDragging = true;\r\n startX = e.clientX;\r\n startY = e.clientY;\r\n startLeft = this.panel.offsetLeft;\r\n startTop = this.panel.offsetTop;\r\n };\r\n\r\n this._dragMouseMoveHandler = (e) => {\r\n if (!isDragging) return;\r\n const dx = e.clientX - startX;\r\n const dy = e.clientY - startY;\r\n this.panel.style.left = `${startLeft + dx}px`;\r\n this.panel.style.right = 'auto';\r\n this.panel.style.top = `${Math.max(0, startTop + dy)}px`;\r\n };\r\n\r\n this._dragMouseUpHandler = () => { isDragging = false; };\r\n\r\n header.addEventListener('mousedown', this._dragMouseDownHandler);\r\n document.addEventListener('mousemove', this._dragMouseMoveHandler);\r\n document.addEventListener('mouseup', this._dragMouseUpHandler);\r\n }\r\n\r\n destroy() {\r\n const header = this.panel.querySelector('.kupola-devtools__header');\r\n \r\n if (header && this._dragMouseDownHandler) {\r\n header.removeEventListener('mousedown', this._dragMouseDownHandler);\r\n }\r\n \r\n if (this._dragMouseMoveHandler) {\r\n document.removeEventListener('mousemove', this._dragMouseMoveHandler);\r\n }\r\n \r\n if (this._dragMouseUpHandler) {\r\n document.removeEventListener('mouseup', this._dragMouseUpHandler);\r\n }\r\n \r\n if (this.panel && this.panel.parentNode) {\r\n this.panel.parentNode.removeChild(this.panel);\r\n }\r\n \r\n this._dragMouseDownHandler = null;\r\n this._dragMouseMoveHandler = null;\r\n this._dragMouseUpHandler = null;\r\n this.panel = null;\r\n }\r\n\r\n togglePanel() {\r\n this.isOpen = !this.isOpen;\r\n this.panel.style.display = this.isOpen ? 'flex' : 'none';\r\n \r\n if (this.isOpen && this.activeTab === 'network') {\r\n this.renderNetworkContent();\r\n }\r\n }\r\n\r\n updateStorageTabs() {\r\n this.panel.querySelectorAll('.kupola-devtools__sub-tab').forEach(tab => {\r\n tab.classList.toggle('active', tab.dataset.storage === this.activeStorageType);\r\n });\r\n }\r\n\r\n getStorageContent(type) {\r\n let items = [];\r\n \r\n try {\r\n if (type === 'cookies') {\r\n items = document.cookie.split(';').map(c => c.trim()).filter(c => c).map(c => {\r\n const [key, ...valueParts] = c.split('=');\r\n return { key, value: valueParts.join('=') };\r\n });\r\n } else if (type === 'localStorage') {\r\n for (let i = 0; i < localStorage.length; i++) {\r\n items.push({ key: localStorage.key(i), value: localStorage.getItem(localStorage.key(i)) });\r\n }\r\n } else if (type === 'sessionStorage') {\r\n for (let i = 0; i < sessionStorage.length; i++) {\r\n items.push({ key: sessionStorage.key(i), value: sessionStorage.getItem(sessionStorage.key(i)) });\r\n }\r\n }\r\n } catch (e) {\r\n console.error('Error reading storage:', e);\r\n return '<div class=\"kupola-devtools__loading\">Error reading storage</div>';\r\n }\r\n \r\n if (items.length === 0) return '<div class=\"kupola-devtools__loading\">No data</div>';\r\n \r\n let html = '';\r\n items.forEach(item => {\r\n let displayValue = item.value;\r\n if (displayValue && displayValue.length > 0 && displayValue.length < 2000) {\r\n try { \r\n const parsed = JSON.parse(displayValue);\r\n displayValue = JSON.stringify(parsed, null, 2); \r\n } catch {}\r\n } else if (displayValue && displayValue.length >= 2000) {\r\n displayValue = displayValue.substring(0, 500) + '... (truncated, ' + displayValue.length + ' chars)';\r\n }\r\n html += `<div class=\"kupola-devtools__list-item\"><div><span class=\"kupola-devtools__storage-key\">${item.key}</span></div><div class=\"kupola-devtools__storage-value\">${displayValue}</div></div>`;\r\n });\r\n \r\n return html;\r\n }\r\n\r\n handleStorageClick(e) {\r\n const target = e.target;\r\n if (target.classList.contains('kupola-devtools__sub-tab')) {\r\n e.stopPropagation();\r\n const type = target.dataset.storage;\r\n if (type) {\r\n this.activeStorageType = type;\r\n this.updateStorageTabs();\r\n const content = this.panel.querySelector('.kupola-devtools__content');\r\n if (content) {\r\n content.innerHTML = this.getStorageContent(type);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction initDevTools() {\r\n try {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const enabled = urlParams.has('dev') || urlParams.has('debug');\r\n \r\n if (enabled) {\r\n window.kupolaDevTools = new KupolaDevTools({ enabled: true });\r\n window.kupolaDevTools.init();\r\n \r\n window.addEventListener('click', (e) => {\r\n if (window.kupolaDevTools && window.kupolaDevTools.handleStorageClick) {\r\n window.kupolaDevTools.handleStorageClick(e);\r\n }\r\n });\r\n }\r\n } catch (error) {\r\n console.error('Error initializing Kupola DevTools:', error);\r\n }\r\n}\r\n\r\nif (document.readyState === 'loading') {\r\n document.addEventListener('DOMContentLoaded', initDevTools);\r\n} else {\r\n initDevTools();\r\n}\r\n\r\nwindow.KupolaDevTools = KupolaDevTools;","/**\r\n * Lightweight icon set inspired by Lucide / shadcn — square, 2px stroke,\r\n * butt caps, miter joins. Use <i data-icon=\"name\"></i> and call Icons.render().\r\n */\r\n(function (global) {\r\n const ATTRS = 'xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"butt\" stroke-linejoin=\"miter\"';\r\n\r\n const PATHS = {\r\n // navigation\r\n 'globe': '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M2 12h20\"/><path d=\"M12 2a15.3 15.3 0 0 1 0 20\"/><path d=\"M12 2a15.3 15.3 0 0 0 0 20\"/>',\r\n 'dashboard': '<rect x=\"3\" y=\"3\" width=\"7\" height=\"9\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"5\"/><rect x=\"14\" y=\"12\" width=\"7\" height=\"9\"/><rect x=\"3\" y=\"16\" width=\"7\" height=\"5\"/>',\r\n 'mouse': '<rect x=\"6\" y=\"2\" width=\"12\" height=\"20\" rx=\"6\"/><line x1=\"12\" y1=\"6\" x2=\"12\" y2=\"11\"/>',\r\n 'search': '<circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"m20 20-3.5-3.5\"/>',\r\n 'square': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/>',\r\n 'circle': '<circle cx=\"12\" cy=\"12\" r=\"9\"/>',\r\n 'list': '<line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"/><line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"/>',\r\n 'palette': '<rect x=\"3\" y=\"3\" width=\"8\" height=\"8\"/><rect x=\"13\" y=\"3\" width=\"8\" height=\"8\"/><rect x=\"3\" y=\"13\" width=\"8\" height=\"8\"/><rect x=\"13\" y=\"13\" width=\"8\" height=\"8\"/>',\r\n 'type': '<polyline points=\"4 7 4 4 20 4 20 7\"/><line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\"/><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\"/>',\r\n 'ruler': '<rect x=\"3\" y=\"9\" width=\"18\" height=\"6\" transform=\"rotate(-45 12 12)\"/><line x1=\"7.5\" y1=\"12.5\" x2=\"9\" y2=\"14\"/><line x1=\"11\" y1=\"9\" x2=\"12.5\" y2=\"10.5\"/><line x1=\"14.5\" y1=\"5.5\" x2=\"16\" y2=\"7\"/>',\r\n 'sparkles': '<path d=\"M12 3l1.8 4.2L18 9l-4.2 1.8L12 15l-1.8-4.2L6 9l4.2-1.8L12 3z\"/><path d=\"M19 14l1 2.2 2.2 1-2.2 1L19 20.4l-1-2.2-2.2-1 2.2-1L19 14z\"/>',\r\n // actions\r\n 'copy': '<rect x=\"8\" y=\"8\" width=\"13\" height=\"13\"/><path d=\"M16 8V4H4v13h4\"/>',\r\n 'download': '<path d=\"M12 3v12\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"21\"/>',\r\n 'refresh': '<polyline points=\"21 4 21 10 15 10\"/><polyline points=\"3 20 3 14 9 14\"/><path d=\"M20.5 9A9 9 0 0 0 5 5.5L3 7M3.5 15A9 9 0 0 0 19 18.5L21 17\"/>',\r\n 'external': '<polyline points=\"14 4 20 4 20 10\"/><line x1=\"20\" y1=\"4\" x2=\"11\" y2=\"13\"/><path d=\"M20 14v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h5\"/>',\r\n 'settings': '<circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z\"/>',\r\n 'sliders': '<line x1=\"4\" y1=\"21\" x2=\"4\" y2=\"14\"/><line x1=\"4\" y1=\"10\" x2=\"4\" y2=\"3\"/><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"3\"/><line x1=\"20\" y1=\"21\" x2=\"20\" y2=\"16\"/><line x1=\"20\" y1=\"12\" x2=\"20\" y2=\"3\"/><line x1=\"1\" y1=\"14\" x2=\"7\" y2=\"14\"/><line x1=\"9\" y1=\"8\" x2=\"15\" y2=\"8\"/><line x1=\"17\" y1=\"16\" x2=\"23\" y2=\"16\"/>',\r\n 'plus': '<line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>',\r\n 'minus': '<line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>',\r\n 'x': '<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>',\r\n 'github': '<path d=\"M9 19c-4.3 1.4-4.3-2.5-6-3m12 5v-3.5c0-1 .1-1.4-.5-2 2.8-.3 5.5-1.4 5.5-6a4.6 4.6 0 0 0-1.3-3.2 4.2 4.2 0 0 0-.1-3.2s-1.1-.3-3.5 1.3a12 12 0 0 0-6.2 0C6.5 2.8 5.4 3.1 5.4 3.1a4.2 4.2 0 0 0-.1 3.2A4.6 4.6 0 0 0 4 9.5c0 4.6 2.7 5.7 5.5 6-.6.6-.6 1.2-.5 2V21\"/>',\r\n 'message-circle':'<path d=\"M21 12a9 9 0 0 1-13.5 7.8L3 21l1.2-4.5A9 9 0 1 1 21 12z\"/>',\r\n // SOLO chat title-bar glyphs (Figma 2510_18334) — round bubble + plus,\r\n // 4-tooth gear with center circle, and person-in-circle account avatar.\r\n 'message-plus':'<path d=\"M21 12a9 9 0 0 1-13.5 7.8L3 21l1.2-4.5A9 9 0 1 1 21 12z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"15\"/><line x1=\"9\" y1=\"12\" x2=\"15\" y2=\"12\"/>',\r\n 'gear': '<path d=\"M9.3 5.7 6.375 5.025 5.025 6.375 5.7 9.3 3 11.1 3 12.9 5.7 14.7 5.025 17.625 6.375 18.975 9.3 18.3 11.1 21 12.9 21 14.7 18.3 17.625 18.975 18.975 17.625 18.3 14.7 21 12.9 21 11.1 18.3 9.3 18.975 6.375 17.625 5.025 14.7 5.7 12.9 3 11.1 3 9.3 5.7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>',\r\n 'user-circle': '<circle cx=\"12\" cy=\"12\" r=\"9\"/><circle cx=\"12\" cy=\"10\" r=\"2.5\"/><path d=\"M7 17.5a5 5 0 0 1 10 0\"/>',\r\n 'shield': '<path d=\"M12 3 4 6v6c0 5 3.5 8 8 9 4.5-1 8-4 8-9V6z\"/>',\r\n 'check': '<polyline points=\"4 12 10 18 20 6\"/>',\r\n 'arrow-right': '<line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><polyline points=\"14 6 20 12 14 18\"/>',\r\n 'arrow-up-right': '<line x1=\"6\" y1=\"18\" x2=\"18\" y2=\"6\"/><polyline points=\"9 6 18 6 18 15\"/>',\r\n 'chevron-right':'<polyline points=\"9 6 15 12 9 18\"/>',\r\n 'chevron-down':'<polyline points=\"6 9 12 15 18 9\"/>',\r\n // status — strict outline, 24x24, 2px stroke (no filled bowls)\r\n 'check-circle':'<circle cx=\"12\" cy=\"12\" r=\"9\"/><polyline points=\"8 12 11 15 16 9\"/>',\r\n 'alert-circle':'<circle cx=\"12\" cy=\"12\" r=\"9\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"16.01\"/>',\r\n 'alert-triangle':'<path d=\"M12 3 22 20 2 20 Z\"/><line x1=\"12\" y1=\"10\" x2=\"12\" y2=\"15\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"18.01\"/>',\r\n 'info-circle': '<circle cx=\"12\" cy=\"12\" r=\"9\"/><line x1=\"12\" y1=\"11\" x2=\"12\" y2=\"16\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"8.01\"/>',\r\n 'x-circle': '<circle cx=\"12\" cy=\"12\" r=\"9\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/>',\r\n // legacy aliases — kept outline, square frame\r\n 'alert': '<path d=\"M12 3 22 20 2 20 Z\"/><line x1=\"12\" y1=\"10\" x2=\"12\" y2=\"15\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"18.01\"/>',\r\n 'info': '<circle cx=\"12\" cy=\"12\" r=\"9\"/><line x1=\"12\" y1=\"11\" x2=\"12\" y2=\"16\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"8.01\"/>',\r\n // misc\r\n 'mail': '<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\"/><polyline points=\"3 6 12 13 21 6\"/>',\r\n 'user': '<path d=\"M4 21v-1a6 6 0 0 1 6-6h4a6 6 0 0 1 6 6v1\"/><circle cx=\"12\" cy=\"8\" r=\"4\"/>',\r\n 'users': '<path d=\"M2 21v-1a5 5 0 0 1 5-5h3a5 5 0 0 1 5 5v1\"/><circle cx=\"8.5\" cy=\"8\" r=\"3.5\"/><path d=\"M22 21v-1a5 5 0 0 0-4-4.9\"/><path d=\"M16 3.1A4 4 0 0 1 16 11\"/>',\r\n 'box': '<polyline points=\"3 7 12 2 21 7 21 17 12 22 3 17 3 7\"/><line x1=\"3\" y1=\"7\" x2=\"12\" y2=\"12\"/><line x1=\"21\" y1=\"7\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"22\" x2=\"12\" y2=\"12\"/>',\r\n 'zap': '<polygon points=\"13 2 4 14 12 14 11 22 20 10 12 10 13 2\"/>',\r\n 'moon': '<path d=\"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z\"/>',\r\n 'sun': '<circle cx=\"12\" cy=\"12\" r=\"4\"/><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"5\"/><line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"22\"/><line x1=\"2\" y1=\"12\" x2=\"5\" y2=\"12\"/><line x1=\"19\" y1=\"12\" x2=\"22\" y2=\"12\"/><line x1=\"4.6\" y1=\"4.6\" x2=\"6.7\" y2=\"6.7\"/><line x1=\"17.3\" y1=\"17.3\" x2=\"19.4\" y2=\"19.4\"/><line x1=\"4.6\" y1=\"19.4\" x2=\"6.7\" y2=\"17.3\"/><line x1=\"17.3\" y1=\"6.7\" x2=\"19.4\" y2=\"4.6\"/>',\r\n 'cmd': '<path d=\"M9 6h6v12H9z\"/><rect x=\"3\" y=\"3\" width=\"6\" height=\"6\"/><rect x=\"15\" y=\"3\" width=\"6\" height=\"6\"/><rect x=\"3\" y=\"15\" width=\"6\" height=\"6\"/><rect x=\"15\" y=\"15\" width=\"6\" height=\"6\"/>',\r\n 'key': '<circle cx=\"7.5\" cy=\"14.5\" r=\"3.5\"/><line x1=\"10\" y1=\"12\" x2=\"22\" y2=\"12\"/><line x1=\"22\" y1=\"12\" x2=\"22\" y2=\"16\"/><line x1=\"18\" y1=\"12\" x2=\"18\" y2=\"15\"/>',\r\n 'bell': '<path d=\"M6 8a6 6 0 0 1 12 0c0 7 3 8 3 8H3s3-1 3-8z\"/><path d=\"M10 21a2 2 0 0 0 4 0\"/>',\r\n 'arrow-up': '<line x1=\"12\" y1=\"20\" x2=\"12\" y2=\"4\"/><polyline points=\"6 10 12 4 18 10\"/>',\r\n 'chevron-up': '<polyline points=\"6 15 12 9 18 15\"/>',\r\n 'arrow-left': '<line x1=\"20\" y1=\"12\" x2=\"4\" y2=\"12\"/><polyline points=\"10 6 4 12 10 18\"/>',\r\n 'mic': '<rect x=\"9\" y=\"3\" width=\"6\" height=\"12\" rx=\"3\"/><path d=\"M5 11a7 7 0 0 0 14 0\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"22\"/>',\r\n 'at': '<circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8\"/>',\r\n 'hash': '<line x1=\"4\" y1=\"9\" x2=\"20\" y2=\"9\"/><line x1=\"4\" y1=\"15\" x2=\"20\" y2=\"15\"/><line x1=\"10\" y1=\"3\" x2=\"8\" y2=\"21\"/><line x1=\"16\" y1=\"3\" x2=\"14\" y2=\"21\"/>',\r\n 'sidebar-left': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"/>',\r\n 'sidebar-right': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\"/>',\r\n 'panel-bottom': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\"/>',\r\n /* ===== Activity-bar icon set =====================================\r\n * Lucide / shadcn-ui (MIT) — squared outline, 2px stroke. Every glyph\r\n * draws into the same standard 24-grid bbox (≈3..21) so they read at\r\n * identical optical size when sized via `data-size` alone, just like\r\n * every other glyph in this file. See skill.md §13.4. */\r\n 'git': '<circle cx=\"6\" cy=\"5\" r=\"3\"/><circle cx=\"6\" cy=\"19\" r=\"3\"/><circle cx=\"18\" cy=\"5\" r=\"3\"/><line x1=\"6\" y1=\"8\" x2=\"6\" y2=\"16\"/><path d=\"M18 8v3a4 4 0 0 1-4 4h-4\"/>',\r\n 'bug': '<rect x=\"8\" y=\"6\" width=\"8\" height=\"14\" rx=\"4\"/><line x1=\"12\" y1=\"11\" x2=\"12\" y2=\"20\"/><line x1=\"3\" y1=\"9\" x2=\"8\" y2=\"9\"/><line x1=\"3\" y1=\"14\" x2=\"8\" y2=\"14\"/><line x1=\"3\" y1=\"19\" x2=\"8\" y2=\"19\"/><line x1=\"16\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"16\" y1=\"14\" x2=\"21\" y2=\"14\"/><line x1=\"16\" y1=\"19\" x2=\"21\" y2=\"19\"/><line x1=\"9\" y1=\"6\" x2=\"9\" y2=\"3\"/><line x1=\"15\" y1=\"6\" x2=\"15\" y2=\"3\"/>',\r\n 'search-menu': '<circle cx=\"11\" cy=\"11\" r=\"6\"/><line x1=\"20\" y1=\"20\" x2=\"16\" y2=\"16\"/><line x1=\"3\" y1=\"20\" x2=\"13\" y2=\"20\"/>',\r\n 'extensions': '<rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"/><path d=\"M17.5 14v3.5H21a2 2 0 0 1 0 4h-3.5V21a2 2 0 0 1-4 0v-3.5H14a2 2 0 0 1 0-4h3.5z\"/>',\r\n // settings sidebar — squared, hard-edged outline (Lucide-ish), 2px stroke\r\n 'wrench': '<path d=\"M14.7 6.3a4 4 0 0 0 5 5L21 12.5l-7.5 7.5a3 3 0 0 1-4.2-4.2L16.7 8 14.7 6.3z\"/><path d=\"M14.7 6.3 12 9l-3-3 2.7-2.7a4 4 0 0 1 3 3z\"/>',\r\n 'message-square': '<path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/>',\r\n 'file-text': '<path d=\"M14 3H6v18h12V8z\"/><polyline points=\"14 3 14 8 18 8\"/><line x1=\"9\" y1=\"13\" x2=\"15\" y2=\"13\"/><line x1=\"9\" y1=\"17\" x2=\"15\" y2=\"17\"/>',\r\n 'scroll-text': '<path d=\"M5 4h11a3 3 0 0 1 3 3v10H8v3a1 1 0 0 1-1 1 3 3 0 0 1-3-3V7a3 3 0 0 1 1-3z\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"9\"/><line x1=\"9\" y1=\"13\" x2=\"15\" y2=\"13\"/>',\r\n 'atom': '<circle cx=\"12\" cy=\"12\" r=\"2\"/><ellipse cx=\"12\" cy=\"12\" rx=\"10\" ry=\"4\"/><ellipse cx=\"12\" cy=\"12\" rx=\"10\" ry=\"4\" transform=\"rotate(60 12 12)\"/><ellipse cx=\"12\" cy=\"12\" rx=\"10\" ry=\"4\" transform=\"rotate(120 12 12)\"/>',\r\n 'arrow-right-to-line': '<line x1=\"20\" y1=\"4\" x2=\"20\" y2=\"20\"/><line x1=\"3\" y1=\"12\" x2=\"17\" y2=\"12\"/><polyline points=\"11 6 17 12 11 18\"/>',\r\n 'info-square': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"12\" y1=\"11\" x2=\"12\" y2=\"16\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"8.01\"/>',\r\n /* Window-control glyphs for SOLO top bar (Figma 2510_20754):\r\n * .arrow-minimize → diagonal-in arrows (collapse to corners)\r\n * .icon-expand → diagonal-out arrows (expand to corners) */\r\n 'arrow-minimize': '<polyline points=\"20 4 14 10 20 10\"/><line x1=\"14\" y1=\"10\" x2=\"14\" y2=\"4\"/><polyline points=\"4 20 10 14 4 14\"/><line x1=\"10\" y1=\"14\" x2=\"10\" y2=\"20\"/>',\r\n 'arrow-expand': '<polyline points=\"14 4 20 4 20 10\"/><line x1=\"14\" y1=\"10\" x2=\"20\" y2=\"4\"/><polyline points=\"10 20 4 20 4 14\"/><line x1=\"10\" y1=\"14\" x2=\"4\" y2=\"20\"/>',\r\n 'arrow-down': '<line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\"/><polyline points=\"6 14 12 20 18 14\"/>',\r\n 'logo': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"/>',\r\n // additional UI\r\n 'more-h': '<circle cx=\"5\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"19\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/>',\r\n 'edit': '<path d=\"M4 20h4l10-10-4-4L4 16v4z\"/><path d=\"M14 6l4 4\"/>',\r\n 'trash': '<polyline points=\"4 6 20 6\"/><path d=\"M6 6v14h12V6\"/><path d=\"M9 6V4h6v2\"/><line x1=\"10\" y1=\"10\" x2=\"10\" y2=\"17\"/><line x1=\"14\" y1=\"10\" x2=\"14\" y2=\"17\"/>',\r\n 'file': '<path d=\"M14 3H6v18h12V7z\"/><polyline points=\"14 3 14 7 18 7\"/>',\r\n // Stacked documents — Lucide \"files\" (3..21).\r\n 'files': '<path d=\"M21 8v13H8V3h8z\"/><polyline points=\"16 3 16 8 21 8\"/><path d=\"M8 7H3v14h13v-3\"/>',\r\n // Pure 2×2 grid — Lucide \"layout-grid\" (3..21).\r\n 'grid-2x2': '<rect x=\"3\" y=\"3\" width=\"8\" height=\"8\"/><rect x=\"13\" y=\"3\" width=\"8\" height=\"8\"/><rect x=\"3\" y=\"13\" width=\"8\" height=\"8\"/><rect x=\"13\" y=\"13\" width=\"8\" height=\"8\"/>',\r\n 'folder': '<path d=\"M3 6h6l2 3h10v10H3z\"/>',\r\n 'layers': '<polygon points=\"12 3 22 8 12 13 2 8 12 3\"/><polyline points=\"2 13 12 18 22 13\"/>',\r\n 'layout': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"/>',\r\n 'terminal': '<polyline points=\"4 7 9 12 4 17\"/><line x1=\"12\" y1=\"17\" x2=\"20\" y2=\"17\"/>',\r\n 'image': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><circle cx=\"9\" cy=\"9\" r=\"1.5\" fill=\"currentColor\"/><polyline points=\"3 18 9 12 13 16 17 12 21 16\"/>',\r\n 'play': '<polygon points=\"6 4 20 12 6 20 6 4\"/>',\r\n 'pause': '<rect x=\"6\" y=\"4\" width=\"4\" height=\"16\"/><rect x=\"14\" y=\"4\" width=\"4\" height=\"16\"/>',\r\n 'help': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><path d=\"M9 9a3 3 0 0 1 6 0c0 2-3 2-3 4\"/><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"17.01\"/>',\r\n 'lock': '<rect x=\"4\" y=\"11\" width=\"16\" height=\"10\"/><path d=\"M8 11V8a4 4 0 0 1 8 0v3\"/>',\r\n // Lucide \"eye\" (2..22 horizontal, naturally short — eye shape).\r\n 'eye': '<path d=\"M2 12s4-7 10-7 10 7 10 7-4 7-10 7-10-7-10-7z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>',\r\n 'star': '<polygon points=\"12 3 15 9 22 10 17 14 18 21 12 18 6 21 7 14 2 10 9 9 12 3\"/>',\r\n 'heart': '<path d=\"M12 21s-7-5-7-11a4 4 0 0 1 7-2 4 4 0 0 1 7 2c0 6-7 11-7 11z\"/>',\r\n 'home': '<polygon points=\"3 11 12 3 21 11 21 21 14 21 14 14 10 14 10 21 3 21 3 11\"/>',\r\n 'calendar': '<rect x=\"3\" y=\"5\" width=\"18\" height=\"16\"/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"/><line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"7\"/><line x1=\"16\" y1=\"3\" x2=\"16\" y2=\"7\"/>',\r\n 'clock': '<circle cx=\"12\" cy=\"12\" r=\"9\"/><polyline points=\"12 7 12 12 16 14\"/>',\r\n 'filter': '<polygon points=\"3 4 21 4 14 12 14 20 10 18 10 12 3 4\"/>',\r\n 'send': '<polygon points=\"3 12 21 4 17 21 12 13 3 12\"/>',\r\n 'link': '<path d=\"M10 14a4 4 0 0 1 0-6l3-3a4 4 0 0 1 6 6l-1.5 1.5\"/><path d=\"M14 10a4 4 0 0 1 0 6l-3 3a4 4 0 0 1-6-6l1.5-1.5\"/>',\r\n 'upload': '<path d=\"M12 21V9\"/><polyline points=\"7 14 12 9 17 14\"/><line x1=\"3\" y1=\"3\" x2=\"21\" y2=\"3\"/>',\r\n 'log-out': '<path d=\"M14 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h9\"/><polyline points=\"16 16 21 12 16 8\"/><line x1=\"9\" y1=\"12\" x2=\"21\" y2=\"12\"/>',\r\n 'menu': '<line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\"/><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"/>',\r\n // data / charts\r\n 'dollar': '<line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"22\"/><path d=\"M17 6H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6\"/>',\r\n 'bar': '<line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"21\"/><rect x=\"5\" y=\"11\" width=\"3\" height=\"8\"/><rect x=\"10.5\" y=\"6\" width=\"3\" height=\"13\"/><rect x=\"16\" y=\"14\" width=\"3\" height=\"5\"/>',\r\n 'trending-up': '<polyline points=\"3 17 9 11 13 15 21 7\"/><polyline points=\"15 7 21 7 21 13\"/>',\r\n 'trending-down': '<polyline points=\"3 7 9 13 13 9 21 17\"/><polyline points=\"15 17 21 17 21 11\"/>',\r\n 'columns': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"/><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\"/>',\r\n // settings — framework rules\r\n 'plug': '<path d=\"M9 2v6\"/><path d=\"M15 2v6\"/><path d=\"M7 8h10v4a5 5 0 0 1-10 0V8z\"/><path d=\"M12 17v5\"/>',\r\n 'cpu': '<rect x=\"6\" y=\"6\" width=\"12\" height=\"12\"/><rect x=\"9\" y=\"9\" width=\"6\" height=\"6\"/><line x1=\"9\" y1=\"2\" x2=\"9\" y2=\"6\"/><line x1=\"15\" y1=\"2\" x2=\"15\" y2=\"6\"/><line x1=\"9\" y1=\"18\" x2=\"9\" y2=\"22\"/><line x1=\"15\" y1=\"18\" x2=\"15\" y2=\"22\"/><line x1=\"2\" y1=\"9\" x2=\"6\" y2=\"9\"/><line x1=\"2\" y1=\"15\" x2=\"6\" y2=\"15\"/><line x1=\"18\" y1=\"9\" x2=\"22\" y2=\"9\"/><line x1=\"18\" y1=\"15\" x2=\"22\" y2=\"15\"/>',\r\n 'code': '<polyline points=\"16 18 22 12 16 6\"/><polyline points=\"8 6 2 12 8 18\"/>',\r\n // brand — filled Apple glyph for download CTA\r\n 'apple': '<path fill=\"currentColor\" stroke=\"none\" d=\"M17.05 12.04c-.03-3.04 2.49-4.5 2.6-4.57-1.42-2.07-3.62-2.36-4.4-2.39-1.87-.19-3.65 1.1-4.6 1.1-.96 0-2.42-1.08-3.98-1.05-2.05.03-3.94 1.19-4.99 3.02-2.13 3.69-.54 9.13 1.53 12.12 1.01 1.46 2.21 3.1 3.78 3.04 1.52-.06 2.09-.98 3.93-.98 1.83 0 2.36.98 3.97.95 1.64-.03 2.68-1.49 3.68-2.96 1.16-1.7 1.64-3.35 1.66-3.43-.04-.02-3.18-1.22-3.21-4.85zM14.06 4.34c.83-1.01 1.39-2.41 1.24-3.81-1.2.05-2.65.8-3.51 1.8-.77.89-1.45 2.31-1.27 3.68 1.34.1 2.71-.68 3.54-1.67z\"/>',\r\n };\r\n\r\n function svg(name, size = 16, viewBox = '0 0 24 24') {\r\n const path = PATHS[name];\r\n if (!path) return '';\r\n const attrs = ATTRS\r\n .replace('width=\"16\"', `width=\"${size}\"`)\r\n .replace('height=\"16\"', `height=\"${size}\"`)\r\n .replace('viewBox=\"0 0 24 24\"', `viewBox=\"${viewBox}\"`);\r\n return `<svg ${attrs}>${path}</svg>`;\r\n }\r\n\r\n function render(root = document) {\r\n root.querySelectorAll('[data-icon]').forEach(el => {\r\n const name = el.getAttribute('data-icon');\r\n const size = +el.getAttribute('data-size') || 16;\r\n const vb = el.getAttribute('data-viewbox') || '0 0 24 24';\r\n el.innerHTML = svg(name, size, vb);\r\n el.classList.add('icon');\r\n });\r\n }\r\n\r\n global.Icons = { svg, render, PATHS };\r\n if (document.readyState !== 'loading') render();\r\n else document.addEventListener('DOMContentLoaded', () => render());\r\n})(typeof window !== 'undefined' ? window : globalThis);\r\n","class Countdown {\r\n constructor(element) {\r\n this.element = element;\r\n this.hoursEl = element.querySelector('.ds-countdown__item--hours .ds-countdown__value');\r\n this.minutesEl = element.querySelector('.ds-countdown__item--minutes .ds-countdown__value');\r\n this.secondsEl = element.querySelector('.ds-countdown__item--seconds .ds-countdown__value');\r\n \r\n this.endTime = this.parseEndTime();\r\n this.interval = null;\r\n \r\n this.init();\r\n }\r\n\r\n parseEndTime() {\r\n const dataEndTime = this.element.getAttribute('data-end-time');\r\n if (dataEndTime) {\r\n return new Date(dataEndTime).getTime();\r\n }\r\n \r\n const dataHours = parseInt(this.element.getAttribute('data-hours')) || 0;\r\n const dataMinutes = parseInt(this.element.getAttribute('data-minutes')) || 0;\r\n const dataSeconds = parseInt(this.element.getAttribute('data-seconds')) || 0;\r\n \r\n return new Date().getTime() + (dataHours * 3600 + dataMinutes * 60 + dataSeconds) * 1000;\r\n }\r\n\r\n init() {\r\n this.update();\r\n this.start();\r\n }\r\n\r\n start() {\r\n if (this.interval) {\r\n clearInterval(this.interval);\r\n }\r\n this.interval = setInterval(() => {\r\n this.update();\r\n }, 1000);\r\n }\r\n\r\n stop() {\r\n if (this.interval) {\r\n clearInterval(this.interval);\r\n this.interval = null;\r\n }\r\n }\r\n\r\n reset() {\r\n this.stop();\r\n this.endTime = this.parseEndTime();\r\n this.init();\r\n }\r\n\r\n update() {\r\n const now = new Date().getTime();\r\n const distance = this.endTime - now;\r\n \r\n if (distance <= 0) {\r\n this.stop();\r\n this.displayTime(0, 0, 0);\r\n this.dispatchComplete();\r\n return;\r\n }\r\n \r\n const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\r\n const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));\r\n const seconds = Math.floor((distance % (1000 * 60)) / 1000);\r\n \r\n this.displayTime(hours, minutes, seconds);\r\n }\r\n\r\n displayTime(hours, minutes, seconds) {\r\n if (this.hoursEl) {\r\n this.hoursEl.textContent = String(hours).padStart(2, '0');\r\n }\r\n if (this.minutesEl) {\r\n this.minutesEl.textContent = String(minutes).padStart(2, '0');\r\n }\r\n if (this.secondsEl) {\r\n this.secondsEl.textContent = String(seconds).padStart(2, '0');\r\n }\r\n }\r\n\r\n setEndTime(date) {\r\n this.endTime = date.getTime();\r\n this.update();\r\n }\r\n\r\n addTime(seconds) {\r\n this.endTime += seconds * 1000;\r\n this.update();\r\n }\r\n\r\n dispatchComplete() {\r\n this.element.dispatchEvent(new CustomEvent('ds-countdown-complete', {\r\n detail: {}\r\n }));\r\n }\r\n\r\n destroy() {\r\n this.stop();\r\n this.hoursEl = null;\r\n this.minutesEl = null;\r\n this.secondsEl = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initCountdown(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const instance = new Countdown(element);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupCountdown(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initCountdowns() {\r\n const countdowns = document.querySelectorAll('.ds-countdown');\r\n countdowns.forEach(el => {\r\n initCountdown(el);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { Countdown, initCountdowns, initCountdown, cleanupCountdown };\r\n} else {\r\n window.Countdown = Countdown;\r\n window.initCountdown = initCountdown;\r\n window.cleanupCountdown = cleanupCountdown;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('countdown', initCountdown, cleanupCountdown);\r\n}","class NumberInput {\r\n constructor(element) {\r\n this.element = element;\r\n this.minusBtn = element.querySelector('.ds-number-input__btn--decrease');\r\n this.plusBtn = element.querySelector('.ds-number-input__btn--increase');\r\n this.inputEl = element.querySelector('.ds-number-input__input');\r\n this._listeners = [];\r\n\r\n if (!this.minusBtn || !this.plusBtn || !this.inputEl) {\r\n throw new Error('NumberInput: Missing required elements');\r\n }\r\n\r\n this.min = parseInt(this.inputEl.getAttribute('min')) || -Infinity;\r\n this.max = parseInt(this.inputEl.getAttribute('max')) || Infinity;\r\n this.step = parseInt(this.inputEl.getAttribute('step')) || 1;\r\n\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.bindEvents();\r\n this.updateState();\r\n }\r\n\r\n bindEvents() {\r\n const minusHandler = () => this.updateValue(-this.step);\r\n const plusHandler = () => this.updateValue(this.step);\r\n const inputHandler = () => this.handleInput();\r\n\r\n this.minusBtn.addEventListener('click', minusHandler);\r\n this.plusBtn.addEventListener('click', plusHandler);\r\n this.inputEl.addEventListener('input', inputHandler);\r\n\r\n this._listeners.push(\r\n { el: this.minusBtn, event: 'click', handler: minusHandler },\r\n { el: this.plusBtn, event: 'click', handler: plusHandler },\r\n { el: this.inputEl, event: 'input', handler: inputHandler }\r\n );\r\n }\r\n\r\n updateValue(delta) {\r\n let value = parseInt(this.inputEl.value) || 0;\r\n value += delta;\r\n\r\n if (value < this.min) value = this.min;\r\n if (value > this.max) value = this.max;\r\n\r\n this.inputEl.value = value;\r\n this.inputEl.dispatchEvent(new Event('change'));\r\n this.updateState();\r\n this.dispatchChange();\r\n }\r\n\r\n handleInput() {\r\n let value = parseInt(this.inputEl.value);\r\n if (isNaN(value)) value = 0;\r\n if (value < this.min) value = this.min;\r\n if (value > this.max) value = this.max;\r\n this.inputEl.value = value;\r\n this.updateState();\r\n this.dispatchChange();\r\n }\r\n\r\n updateState() {\r\n const value = parseInt(this.inputEl.value) || 0;\r\n this.minusBtn.disabled = value <= this.min;\r\n this.plusBtn.disabled = value >= this.max;\r\n }\r\n\r\n setValue(value) {\r\n if (value < this.min) value = this.min;\r\n if (value > this.max) value = this.max;\r\n this.inputEl.value = value;\r\n this.updateState();\r\n this.dispatchChange();\r\n }\r\n\r\n getValue() {\r\n return parseInt(this.inputEl.value) || 0;\r\n }\r\n\r\n setRange(min, max) {\r\n this.min = min;\r\n this.max = max;\r\n this.updateState();\r\n }\r\n\r\n dispatchChange() {\r\n this.element.dispatchEvent(new CustomEvent('ds-number-input-change', {\r\n detail: {\r\n value: this.getValue()\r\n }\r\n }));\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.minusBtn = null;\r\n this.plusBtn = null;\r\n this.inputEl = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initNumberInput(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n try {\r\n const instance = new NumberInput(element);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n } catch (error) {\r\n console.error('[NumberInput] Error initializing:', error);\r\n }\r\n}\r\n\r\nfunction cleanupNumberInput(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initNumberInputs() {\r\n document.querySelectorAll('.ds-number-input').forEach(input => {\r\n initNumberInput(input);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { NumberInput, initNumberInputs, initNumberInput, cleanupNumberInput };\r\n} else {\r\n window.NumberInput = NumberInput;\r\n window.initNumberInput = initNumberInput;\r\n window.cleanupNumberInput = cleanupNumberInput;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('number-input', initNumberInput, cleanupNumberInput);\r\n}","class SlideCaptcha {\r\n constructor(container) {\r\n this.container = container;\r\n this.track = container.querySelector('.ds-slider-captcha__track');\r\n this.btn = container.querySelector('.ds-slider-captcha__btn');\r\n this.text = container.querySelector('.ds-slider-captcha__text');\r\n this.progress = container.querySelector('.ds-slider-captcha__progress');\r\n this.statusEl = container.querySelector('.ds-slider-captcha__status');\r\n this.refreshBtn = container.querySelector('.ds-slider-captcha__refresh');\r\n this.footerRefreshBtn = container.querySelector('.ds-slider-captcha__footer-refresh');\r\n \r\n this.config = {\r\n tolerance: 6,\r\n minPoints: 20,\r\n minDuration: 300,\r\n maxDuration: 10000,\r\n minSpeedDelta: 0.3,\r\n maxAttempts: 5\r\n };\r\n \r\n this.isDragging = false;\r\n this.startX = 0;\r\n this.startY = 0;\r\n this.currentX = 0;\r\n this.trackData = [];\r\n this.startTime = 0;\r\n this.isVerified = false;\r\n this.isProcessing = false;\r\n this.attempts = 0;\r\n \r\n this.targetX = 0;\r\n this.distractorX = 0;\r\n this.angle = 0;\r\n this.distractorAngle = 0;\r\n this.maxAngle = parseInt(container.getAttribute('data-angle')) || 30;\r\n this.shape = container.getAttribute('data-shape') || 'circle';\r\n this.hasDistractor = this.shape !== 'circle';\r\n \r\n this.scope = `slidecaptcha-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n this._mouseDownHandler = null;\r\n this._mouseMoveHandler = null;\r\n this._mouseUpHandler = null;\r\n this._touchStartHandler = null;\r\n this._touchMoveHandler = null;\r\n this._touchEndHandler = null;\r\n \r\n this._mouseMoveListener = null;\r\n this._mouseUpListener = null;\r\n this._touchMoveListener = null;\r\n this._touchEndListener = null;\r\n }\r\n\r\n init() {\r\n if (!this.track || !this.btn) return;\r\n if (this.container._initialized) return;\r\n\r\n this._mouseDownHandler = (e) => {\r\n if (this.isVerified || this.isProcessing) return;\r\n e.preventDefault();\r\n this.isDragging = true;\r\n this.startX = e.clientX;\r\n this.startY = e.clientY;\r\n this.startTime = Date.now();\r\n this.trackData = [];\r\n this.container.classList.add('is-active');\r\n if (this.text) {\r\n this.text.textContent = '拖动中...';\r\n this.text.style.color = 'var(--status-info-default)';\r\n }\r\n };\r\n\r\n this._mouseMoveHandler = (e) => {\r\n if (!this.isDragging) return;\r\n e.preventDefault();\r\n\r\n const trackWidth = this.track.offsetWidth;\r\n const btnWidth = this.btn.offsetWidth;\r\n const maxOffset = trackWidth - btnWidth - 8;\r\n\r\n let deltaX = e.clientX - this.startX;\r\n if (deltaX < 0) deltaX = 0;\r\n if (deltaX > maxOffset) deltaX = maxOffset;\r\n\r\n this.currentX = deltaX;\r\n this.btn.style.left = (14 + deltaX) + 'px';\r\n if (this.progress) this.progress.style.width = ((deltaX / maxOffset) * 100) + '%';\r\n\r\n this.collectTrack(e.clientX, e.clientY);\r\n };\r\n\r\n this._mouseUpHandler = () => {\r\n if (!this.isDragging) return;\r\n this.isDragging = false;\r\n this.container.classList.remove('is-active');\r\n this.verifyCaptcha();\r\n };\r\n\r\n this._touchStartHandler = (e) => {\r\n if (this.isVerified || this.isProcessing) return;\r\n e.preventDefault();\r\n this.isDragging = true;\r\n this.startX = e.touches[0].clientX;\r\n this.startY = e.touches[0].clientY;\r\n this.startTime = Date.now();\r\n this.trackData = [];\r\n this.container.classList.add('is-active');\r\n if (this.text) {\r\n this.text.textContent = '拖动中...';\r\n this.text.style.color = 'var(--status-info-default)';\r\n }\r\n };\r\n\r\n this._touchMoveHandler = (e) => {\r\n if (!this.isDragging) return;\r\n e.preventDefault();\r\n\r\n const trackWidth = this.track.offsetWidth;\r\n const btnWidth = this.btn.offsetWidth;\r\n const maxOffset = trackWidth - btnWidth - 8;\r\n\r\n let deltaX = e.touches[0].clientX - this.startX;\r\n if (deltaX < 0) deltaX = 0;\r\n if (deltaX > maxOffset) deltaX = maxOffset;\r\n\r\n this.currentX = deltaX;\r\n this.btn.style.left = (14 + deltaX) + 'px';\r\n if (this.progress) this.progress.style.width = ((deltaX / maxOffset) * 100) + '%';\r\n\r\n this.collectTrack(e.touches[0].clientX, e.touches[0].clientY);\r\n };\r\n\r\n this._touchEndHandler = () => {\r\n if (!this.isDragging) return;\r\n this.isDragging = false;\r\n this.container.classList.remove('is-active');\r\n this.verifyCaptcha();\r\n };\r\n\r\n this.btn.addEventListener('mousedown', this._mouseDownHandler);\r\n\r\n if (window.globalEvents) {\r\n this._mouseMoveListener = window.globalEvents.on(document, 'mousemove', this._mouseMoveHandler, { scope: this.scope });\r\n this._mouseUpListener = window.globalEvents.on(document, 'mouseup', this._mouseUpHandler, { scope: this.scope });\r\n this._touchMoveListener = window.globalEvents.on(document, 'touchmove', this._touchMoveHandler, { scope: this.scope, passive: false });\r\n this._touchEndListener = window.globalEvents.on(document, 'touchend', this._touchEndHandler, { scope: this.scope });\r\n } else {\r\n document.addEventListener('mousemove', this._mouseMoveHandler);\r\n document.addEventListener('mouseup', this._mouseUpHandler);\r\n document.addEventListener('touchmove', this._touchMoveHandler, { passive: false });\r\n document.addEventListener('touchend', this._touchEndHandler);\r\n }\r\n\r\n this.btn.addEventListener('touchstart', this._touchStartHandler, { passive: false });\r\n\r\n if (this.refreshBtn) {\r\n this.refreshBtn.addEventListener('click', () => this.loadCaptcha());\r\n }\r\n if (this.footerRefreshBtn) {\r\n this.footerRefreshBtn.addEventListener('click', () => this.loadCaptcha());\r\n }\r\n\r\n this.container._initialized = true;\r\n this.loadCaptcha();\r\n }\r\n\r\n generateTarget() {\r\n const trackWidth = this.track.offsetWidth;\r\n const btnWidth = this.btn.offsetWidth;\r\n const btnOffset = 14;\r\n const min = trackWidth * 0.35;\r\n const max = trackWidth * 0.85 - btnWidth;\r\n const mid = trackWidth * 0.6;\r\n\r\n this.angle = Math.floor(Math.random() * (this.maxAngle + 1));\r\n\r\n if (this.hasDistractor) {\r\n do {\r\n this.distractorAngle = Math.floor(Math.random() * (this.maxAngle + 1));\r\n } while (Math.abs(this.distractorAngle - this.angle) < 5);\r\n }\r\n\r\n if (this.hasDistractor) {\r\n const rand = Math.random();\r\n if (rand > 0.5) {\r\n this.targetX = Math.floor(min + Math.random() * (mid - min - btnWidth));\r\n this.distractorX = Math.floor(mid + Math.random() * (max - mid));\r\n } else {\r\n this.targetX = Math.floor(mid + Math.random() * (max - mid));\r\n this.distractorX = Math.floor(min + Math.random() * (mid - min - btnWidth));\r\n }\r\n } else {\r\n this.targetX = Math.floor(min + Math.random() * (max - min));\r\n }\r\n\r\n const target = this.container.querySelector('.ds-slider-captcha__target');\r\n if (target) {\r\n target.style.left = (this.targetX + btnOffset + btnWidth / 2) + 'px';\r\n target.style.transform = 'translate(-50%, -50%) rotate(' + this.angle + 'deg)';\r\n target.style.display = 'block';\r\n }\r\n\r\n if (this.hasDistractor) {\r\n const distractor = this.container.querySelector('.ds-slider-captcha__target--distractor');\r\n if (distractor) {\r\n distractor.style.left = (this.distractorX + btnOffset + btnWidth / 2) + 'px';\r\n distractor.style.transform = 'translate(-50%, -50%) rotate(' + this.distractorAngle + 'deg)';\r\n distractor.style.display = 'block';\r\n }\r\n } else {\r\n const distractor = this.container.querySelector('.ds-slider-captcha__target--distractor');\r\n if (distractor) {\r\n distractor.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n resetSlider() {\r\n this.btn.className = 'ds-slider-captcha__btn';\r\n this.btn.style.transform = 'rotate(' + this.angle + 'deg)';\r\n this.btn.innerHTML = '';\r\n this.btn.style.left = '14px';\r\n this.btn.style.display = 'block';\r\n if (this.progress) {\r\n this.progress.style.width = '0%';\r\n this.progress.style.display = 'block';\r\n }\r\n if (this.text) {\r\n this.text.textContent = '按住滑块,拖动到缺口位置';\r\n this.text.style.color = '';\r\n }\r\n if (this.refreshBtn) {\r\n this.refreshBtn.style.display = 'none';\r\n }\r\n this.currentX = 0;\r\n this.trackData = [];\r\n this.container.classList.remove('is-verified', 'is-error', 'is-disabled');\r\n }\r\n\r\n loadCaptcha() {\r\n this.isVerified = false;\r\n this.isProcessing = false;\r\n this.attempts = 0;\r\n this.generateTarget();\r\n this.resetSlider();\r\n if (this.statusEl) {\r\n this.statusEl.textContent = '请完成验证';\r\n this.statusEl.className = 'ds-slider-captcha__status';\r\n }\r\n }\r\n\r\n collectTrack(clientX, clientY) {\r\n const now = Date.now();\r\n const t = now - this.startTime;\r\n\r\n let velocity = 0;\r\n let acceleration = 0;\r\n\r\n if (this.trackData.length > 0) {\r\n const last = this.trackData[this.trackData.length - 1];\r\n const dx = this.currentX - last.x;\r\n const dt = t - last.t;\r\n if (dt > 0) {\r\n velocity = dx / dt;\r\n if (this.trackData.length > 1) {\r\n const prev = this.trackData[this.trackData.length - 2];\r\n const prevDt = last.t - prev.t;\r\n if (prevDt > 0) {\r\n const prevV = (last.x - prev.x) / prevDt;\r\n acceleration = velocity - prevV;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.trackData.push({\r\n x: this.currentX,\r\n y: clientY - this.startY,\r\n t: t,\r\n v: velocity,\r\n a: acceleration\r\n });\r\n\r\n const pointCountEl = this.container.querySelector('.ds-slider-captcha__point-count');\r\n if (pointCountEl) {\r\n pointCountEl.textContent = '轨迹点: ' + this.trackData.length;\r\n }\r\n }\r\n\r\n validateTrack() {\r\n if (!this.trackData || this.trackData.length < this.config.minPoints) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n const finalX = this.trackData[this.trackData.length - 1].x;\r\n const distractorDiff = this.hasDistractor ? Math.abs(finalX - this.distractorX) : Infinity;\r\n const targetDiff = Math.abs(finalX - this.targetX);\r\n\r\n if (this.hasDistractor && distractorDiff < targetDiff && distractorDiff <= this.config.tolerance) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n if (targetDiff > this.config.tolerance) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n const speeds = [];\r\n for (let i = 1; i < this.trackData.length; i++) {\r\n const dx = this.trackData[i].x - this.trackData[i - 1].x;\r\n const dt = this.trackData[i].t - this.trackData[i - 1].t;\r\n if (dt > 0 && dt < 500) {\r\n speeds.push(dx / dt);\r\n }\r\n }\r\n\r\n if (speeds.length < 3) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n const maxSpeed = Math.max(...speeds);\r\n const minSpeed = Math.min(...speeds);\r\n if (maxSpeed - minSpeed < this.config.minSpeedDelta) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n let hasYMovement = false;\r\n for (const p of this.trackData) {\r\n if (Math.abs(p.y) > 2) {\r\n hasYMovement = true;\r\n break;\r\n }\r\n }\r\n if (!hasYMovement && this.trackData.length > 20) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n const totalTime = this.trackData[this.trackData.length - 1].t;\r\n if (totalTime < this.config.minDuration) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n if (totalTime > this.config.maxDuration) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n const accelerations = [];\r\n for (let i = 1; i < speeds.length; i++) {\r\n accelerations.push(Math.abs(speeds[i] - speeds[i - 1]));\r\n }\r\n if (accelerations.length > 2) {\r\n const accAvg = accelerations.reduce((a, b) => a + b, 0) / accelerations.length;\r\n if (accAvg < 0.05) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n }\r\n\r\n return { passed: true, msg: '验证通过' };\r\n }\r\n\r\n verifyCaptcha() {\r\n if (this.isProcessing || this.isVerified) return;\r\n this.isProcessing = true;\r\n\r\n if (this.statusEl) {\r\n this.statusEl.textContent = '验证中...';\r\n this.statusEl.className = 'ds-slider-captcha__status is-loading';\r\n }\r\n this.btn.style.cursor = 'wait';\r\n this.container.classList.add('is-disabled');\r\n\r\n setTimeout(() => {\r\n const result = this.validateTrack();\r\n this.isProcessing = false;\r\n this.btn.style.cursor = '';\r\n\r\n if (result.passed) {\r\n this.isVerified = true;\r\n this.btn.style.display = 'none';\r\n if (this.progress) this.progress.style.display = 'none';\r\n \r\n const target = this.container.querySelector('.ds-slider-captcha__target');\r\n if (target) target.style.display = 'none';\r\n \r\n const distractor = this.container.querySelector('.ds-slider-captcha__target--distractor');\r\n if (distractor) distractor.style.display = 'none';\r\n\r\n if (this.text) {\r\n this.text.textContent = '验证通过';\r\n this.text.style.color = 'var(--status-success-default)';\r\n }\r\n if (this.statusEl) {\r\n this.statusEl.textContent = '验证成功';\r\n this.statusEl.className = 'ds-slider-captcha__status is-success';\r\n }\r\n this.container.classList.add('is-verified');\r\n this.container.classList.remove('is-disabled');\r\n\r\n const onVerified = this.container.getAttribute('data-on-verified');\r\n if (onVerified && typeof window[onVerified] === 'function') {\r\n window[onVerified](this.container);\r\n }\r\n } else {\r\n this.attempts++;\r\n\r\n if (this.text) {\r\n this.text.textContent = result.msg;\r\n this.text.style.color = 'var(--status-error-default)';\r\n }\r\n if (this.statusEl) {\r\n this.statusEl.textContent = result.msg;\r\n this.statusEl.className = 'ds-slider-captcha__status is-error';\r\n }\r\n\r\n const errRefresh = this.container.getAttribute('data-err-refresh');\r\n if (errRefresh === 'auto') {\r\n setTimeout(() => {\r\n this.loadCaptcha();\r\n }, 1200);\r\n } else {\r\n this.btn.style.display = 'none';\r\n if (this.progress) this.progress.style.display = 'none';\r\n \r\n const target = this.container.querySelector('.ds-slider-captcha__target');\r\n if (target) target.style.display = 'none';\r\n \r\n const distractor = this.container.querySelector('.ds-slider-captcha__target--distractor');\r\n if (distractor) distractor.style.display = 'none';\r\n\r\n if (this.refreshBtn) {\r\n this.refreshBtn.style.display = 'block';\r\n }\r\n }\r\n }\r\n }, 300);\r\n }\r\n\r\n destroy() {\r\n if (!this.container._initialized) return;\r\n\r\n if (this.btn && this._mouseDownHandler) {\r\n this.btn.removeEventListener('mousedown', this._mouseDownHandler);\r\n }\r\n if (this.btn && this._touchStartHandler) {\r\n this.btn.removeEventListener('touchstart', this._touchStartHandler);\r\n }\r\n\r\n if (this.refreshBtn) {\r\n this.refreshBtn.removeEventListener('click', () => this.loadCaptcha());\r\n }\r\n if (this.footerRefreshBtn) {\r\n this.footerRefreshBtn.removeEventListener('click', () => this.loadCaptcha());\r\n }\r\n\r\n if (this._mouseMoveListener && this._mouseMoveListener.unsubscribe) {\r\n this._mouseMoveListener.unsubscribe();\r\n } else if (this._mouseMoveHandler) {\r\n document.removeEventListener('mousemove', this._mouseMoveHandler);\r\n }\r\n\r\n if (this._mouseUpListener && this._mouseUpListener.unsubscribe) {\r\n this._mouseUpListener.unsubscribe();\r\n } else if (this._mouseUpHandler) {\r\n document.removeEventListener('mouseup', this._mouseUpHandler);\r\n }\r\n\r\n if (this._touchMoveListener && this._touchMoveListener.unsubscribe) {\r\n this._touchMoveListener.unsubscribe();\r\n } else if (this._touchMoveHandler) {\r\n document.removeEventListener('touchmove', this._touchMoveHandler);\r\n }\r\n\r\n if (this._touchEndListener && this._touchEndListener.unsubscribe) {\r\n this._touchEndListener.unsubscribe();\r\n } else if (this._touchEndHandler) {\r\n document.removeEventListener('touchend', this._touchEndHandler);\r\n }\r\n\r\n this.container._initialized = false;\r\n }\r\n}\r\n\r\nfunction initSlideCaptchas() {\r\n document.querySelectorAll('.ds-slider-captcha').forEach(container => {\r\n const captcha = new SlideCaptcha(container);\r\n captcha.init();\r\n container._kupolaSlideCaptcha = captcha;\r\n });\r\n}\r\n\r\nfunction cleanupSlideCaptcha(container) {\r\n if (container._kupolaSlideCaptcha) {\r\n container._kupolaSlideCaptcha.destroy();\r\n container._kupolaSlideCaptcha = null;\r\n }\r\n}\r\n\r\nfunction cleanupAllSlideCaptchas() {\r\n document.querySelectorAll('.ds-slider-captcha').forEach(container => {\r\n cleanupSlideCaptcha(container);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { initSlideCaptchas, cleanupSlideCaptcha, cleanupAllSlideCaptchas };\r\n}","(function(window) {\r\n let currentSetupContext = null;\r\n\r\n class SetupContext {\r\n constructor(component) {\r\n this.component = component;\r\n this.lifecycle = (component && component.lifecycle) || null;\r\n this._onMountedHandlers = [];\r\n this._onUnmountedHandlers = [];\r\n this._onUpdatedHandlers = [];\r\n this._watches = [];\r\n this._refs = new Map();\r\n this._computedDeps = new Map();\r\n }\r\n\r\n ref(initialValue = null) {\r\n if (window.kupolaData) {\r\n const key = `__ref_${Math.random().toString(36).slice(2, 11)}__`;\r\n window.kupolaData.set(key, initialValue);\r\n \r\n return {\r\n get value() {\r\n return window.kupolaData.get(key);\r\n },\r\n set value(newValue) {\r\n window.kupolaData.set(key, newValue);\r\n },\r\n _key: key\r\n };\r\n }\r\n\r\n const refObj = {\r\n _value: initialValue,\r\n _subscribers: new Set()\r\n };\r\n\r\n Object.defineProperty(refObj, 'value', {\r\n get() {\r\n return refObj._value;\r\n },\r\n set(newValue) {\r\n if (newValue !== refObj._value) {\r\n refObj._value = newValue;\r\n refObj._subscribers.forEach(sub => sub(newValue));\r\n }\r\n }\r\n });\r\n\r\n return refObj;\r\n }\r\n\r\n reactive(target) {\r\n if (window.kupolaData) {\r\n return window.kupolaData.createReactive(target);\r\n }\r\n\r\n const self = this;\r\n const handler = {\r\n get(target, key) {\r\n if (key === '__isReactive') return true;\r\n if (key === '__raw') return target;\r\n const result = target[key];\r\n if (typeof result === 'object' && result !== null && !result.__isReactive) {\r\n target[key] = self.reactive(result);\r\n }\r\n return target[key];\r\n },\r\n set(target, key, value) {\r\n if (target[key] === value) return true;\r\n target[key] = value;\r\n self._notifyWatchers(key, value);\r\n return true;\r\n },\r\n deleteProperty(target, key) {\r\n delete target[key];\r\n self._notifyWatchers(key, undefined);\r\n return true;\r\n }\r\n };\r\n\r\n const proxy = new Proxy(target, handler);\r\n proxy.__isReactive = true;\r\n return proxy;\r\n }\r\n\r\n onMounted(handler) {\r\n if (this.lifecycle) {\r\n this.lifecycle.on('mount', handler, { name: 'onMounted' });\r\n } else {\r\n this._onMountedHandlers.push(handler);\r\n }\r\n }\r\n\r\n onUnmounted(handler) {\r\n if (this.lifecycle) {\r\n this.lifecycle.on('unmount', handler, { name: 'onUnmounted' });\r\n } else {\r\n this._onUnmountedHandlers.push(handler);\r\n }\r\n }\r\n\r\n onUpdated(handler) {\r\n if (this.lifecycle) {\r\n this.lifecycle.on('update', handler, { name: 'onUpdated' });\r\n } else {\r\n this._onUpdatedHandlers.push(handler);\r\n }\r\n }\r\n\r\n watch(source, handler, options = {}) {\r\n if (typeof source === 'function') {\r\n const watcher = () => {\r\n const newValue = source();\r\n if (newValue !== watcher._oldValue) {\r\n handler(newValue, watcher._oldValue);\r\n watcher._oldValue = newValue;\r\n }\r\n };\r\n watcher._oldValue = undefined;\r\n this._watches.push(watcher);\r\n watcher();\r\n\r\n if (window.kupolaData) {\r\n const trackedPaths = [];\r\n const originalGet = window.kupolaData.get;\r\n window.kupolaData.get = function(k) {\r\n trackedPaths.push(k);\r\n return originalGet.call(this, k);\r\n };\r\n source();\r\n window.kupolaData.get = originalGet;\r\n \r\n trackedPaths.forEach(path => {\r\n window.kupolaData.observe(path, watcher);\r\n });\r\n }\r\n } else if (typeof source === 'object' && source !== null) {\r\n if (source._subscribers) {\r\n source._subscribers.add(handler);\r\n } else if (source._key && window.kupolaData) {\r\n window.kupolaData.observe(source._key, () => {\r\n handler(source.value);\r\n });\r\n }\r\n }\r\n }\r\n\r\n computed(getter) {\r\n const result = this.ref();\r\n const self = this;\r\n \r\n let update = () => {\r\n try {\r\n result.value = getter();\r\n } catch (e) {\r\n console.error('Computed property error:', e);\r\n }\r\n };\r\n\r\n const trackedPaths = [];\r\n if (window.kupolaData) {\r\n const originalGet = window.kupolaData.get;\r\n window.kupolaData.get = function(k) {\r\n trackedPaths.push(k);\r\n return originalGet.call(this, k);\r\n };\r\n \r\n update();\r\n \r\n window.kupolaData.get = originalGet;\r\n \r\n trackedPaths.forEach(path => {\r\n window.kupolaData.observe(path, update);\r\n });\r\n \r\n this._computedDeps.set(result, trackedPaths);\r\n } else {\r\n update();\r\n }\r\n\r\n let computedValue = result._value;\r\n \r\n Object.defineProperty(result, 'value', {\r\n get: () => computedValue,\r\n set: (newValue) => {\r\n console.warn('Cannot assign to a computed property');\r\n }\r\n });\r\n\r\n const originalUpdate = update;\r\n update = () => {\r\n try {\r\n computedValue = getter();\r\n } catch (e) {\r\n console.error('Computed property error:', e);\r\n }\r\n };\r\n\r\n return result;\r\n }\r\n\r\n emit(eventName, data) {\r\n if (this.component) {\r\n this.component.$emit(eventName, data);\r\n }\r\n }\r\n\r\n _notifyWatchers(key, value) {\r\n this._watches.forEach(watcher => {\r\n try { watcher(); } catch (e) { console.error(e); }\r\n });\r\n }\r\n\r\n _executeMounted() {\r\n this._onMountedHandlers.forEach(handler => {\r\n try { handler(); } catch (e) { console.error(e); }\r\n });\r\n }\r\n\r\n _executeUnmounted() {\r\n this._onUnmountedHandlers.forEach(handler => {\r\n try { handler(); } catch (e) { console.error(e); }\r\n });\r\n }\r\n\r\n _executeUpdated() {\r\n this._onUpdatedHandlers.forEach(handler => {\r\n try { handler(); } catch (e) { console.error(e); }\r\n });\r\n }\r\n\r\n destroy() {\r\n this._watches.forEach(watcher => {\r\n if (watcher._subscribers) {\r\n watcher._subscribers.clear();\r\n }\r\n });\r\n this._watches = [];\r\n \r\n this._computedDeps.forEach((paths, result) => {\r\n paths.forEach(path => {\r\n if (window.kupolaData) {\r\n window.kupolaData.unobserve(path);\r\n }\r\n });\r\n });\r\n this._computedDeps.clear();\r\n \r\n this._refs.clear();\r\n this._onMountedHandlers = [];\r\n this._onUnmountedHandlers = [];\r\n this._onUpdatedHandlers = [];\r\n \r\n this.component = null;\r\n this.lifecycle = null;\r\n }\r\n }\r\n\r\n function ref(initialValue = null) {\r\n if (currentSetupContext) {\r\n return currentSetupContext.ref(initialValue);\r\n }\r\n\r\n if (window.kupolaData) {\r\n const key = `__ref_${Math.random().toString(36).slice(2, 11)}__`;\r\n window.kupolaData.set(key, initialValue);\r\n\r\n return {\r\n get value() {\r\n return window.kupolaData.get(key);\r\n },\r\n set value(newValue) {\r\n window.kupolaData.set(key, newValue);\r\n },\r\n _key: key\r\n };\r\n }\r\n\r\n const refObj = {\r\n _value: initialValue,\r\n _subscribers: new Set()\r\n };\r\n\r\n Object.defineProperty(refObj, 'value', {\r\n get() {\r\n return refObj._value;\r\n },\r\n set(newValue) {\r\n if (newValue !== refObj._value) {\r\n refObj._value = newValue;\r\n refObj._subscribers.forEach(sub => sub(newValue));\r\n }\r\n }\r\n });\r\n\r\n return refObj;\r\n }\r\n\r\n function reactive(target) {\r\n if (currentSetupContext) {\r\n return currentSetupContext.reactive(target);\r\n }\r\n\r\n if (window.kupolaData) {\r\n return window.kupolaData.createReactive(target);\r\n }\r\n\r\n const handler = {\r\n get(target, key) {\r\n if (key === '__isReactive') return true;\r\n if (key === '__raw') return target;\r\n const result = target[key];\r\n if (typeof result === 'object' && result !== null && !result.__isReactive) {\r\n target[key] = new Proxy(result, handler);\r\n target[key].__isReactive = true;\r\n }\r\n return target[key];\r\n },\r\n set(target, key, value) {\r\n if (target[key] === value) return true;\r\n target[key] = value;\r\n if (currentSetupContext) {\r\n currentSetupContext._notifyWatchers(key, value);\r\n }\r\n return true;\r\n },\r\n deleteProperty(target, key) {\r\n delete target[key];\r\n if (currentSetupContext) {\r\n currentSetupContext._notifyWatchers(key, undefined);\r\n }\r\n return true;\r\n }\r\n };\r\n\r\n const proxy = new Proxy(target, handler);\r\n proxy.__isReactive = true;\r\n return proxy;\r\n }\r\n\r\n function onMounted(handler) {\r\n if (currentSetupContext) {\r\n currentSetupContext.onMounted(handler);\r\n } else {\r\n console.warn('onMounted called outside of setup()');\r\n }\r\n }\r\n\r\n function onUnmounted(handler) {\r\n if (currentSetupContext) {\r\n currentSetupContext.onUnmounted(handler);\r\n } else {\r\n console.warn('onUnmounted called outside of setup()');\r\n }\r\n }\r\n\r\n function onUpdated(handler) {\r\n if (currentSetupContext) {\r\n currentSetupContext.onUpdated(handler);\r\n } else {\r\n console.warn('onUpdated called outside of setup()');\r\n }\r\n }\r\n\r\n function watch(source, handler, options = {}) {\r\n if (currentSetupContext) {\r\n currentSetupContext.watch(source, handler, options);\r\n }\r\n }\r\n\r\n function computed(getter) {\r\n if (currentSetupContext) {\r\n return currentSetupContext.computed(getter);\r\n }\r\n\r\n const result = ref();\r\n\r\n let update = () => {\r\n try {\r\n result.value = getter();\r\n } catch (e) {\r\n console.error('Computed property error:', e);\r\n }\r\n };\r\n\r\n if (window.kupolaData) {\r\n const trackedPaths = [];\r\n const originalGet = window.kupolaData.get;\r\n window.kupolaData.get = function(k) {\r\n trackedPaths.push(k);\r\n return originalGet.call(this, k);\r\n };\r\n \r\n update();\r\n \r\n window.kupolaData.get = originalGet;\r\n \r\n trackedPaths.forEach(path => {\r\n window.kupolaData.observe(path, update);\r\n });\r\n } else {\r\n update();\r\n }\r\n\r\n let computedValue = result._value;\r\n \r\n Object.defineProperty(result, 'value', {\r\n get: () => computedValue,\r\n set: (newValue) => {\r\n console.warn('Cannot assign to a computed property');\r\n }\r\n });\r\n\r\n const originalUpdate = update;\r\n update = () => {\r\n try {\r\n computedValue = getter();\r\n } catch (e) {\r\n console.error('Computed property error:', e);\r\n }\r\n };\r\n\r\n return result;\r\n}\r\n\r\n function setup(setupFn) {\r\n if (typeof setupFn !== 'function') {\r\n console.error('setup() requires a function argument');\r\n return;\r\n }\r\n\r\n const setupContext = new SetupContext();\r\n const prevContext = currentSetupContext;\r\n currentSetupContext = setupContext;\r\n\r\n let result;\r\n try {\r\n result = setupFn(setupContext);\r\n } finally {\r\n currentSetupContext = prevContext;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n window.SetupContext = SetupContext;\r\n window.ref = ref;\r\n window.reactive = reactive;\r\n window.onMounted = onMounted;\r\n window.onUnmounted = onUnmounted;\r\n window.onUpdated = onUpdated;\r\n window.watch = watch;\r\n window.computed = computed;\r\n window.setup = setup;\r\n window._getCurrentSetupContext = () => currentSetupContext;\r\n window._setCurrentSetupContext = (ctx) => { currentSetupContext = ctx; };\r\n window._clearSetupContext = () => { currentSetupContext = null; };\r\n})(window);","(function(window) {\r\n class KupolaForm {\r\n constructor(formOrSelector, options = {}) {\r\n this.form = typeof formOrSelector === 'string'\r\n ? document.querySelector(formOrSelector)\r\n : formOrSelector;\r\n \r\n this.options = {\r\n validateOnSubmit: true,\r\n validateOnChange: false,\r\n validateOnBlur: false,\r\n preventDefault: true,\r\n ...options\r\n };\r\n\r\n this.submitHandlers = [];\r\n this.isSubmitting = false;\r\n this.errors = {};\r\n this.rules = {};\r\n this.validator = window.kupolaValidator || new window.KupolaValidator();\r\n\r\n if (!this.form || !(this.form instanceof HTMLFormElement)) {\r\n console.warn('[KupolaForm] Invalid form element');\r\n return;\r\n }\r\n\r\n this._init();\r\n }\r\n\r\n _init() {\r\n if (this.options.validateOnChange) {\r\n this.form.addEventListener('input', (e) => {\r\n this._validateField(e.target);\r\n });\r\n }\r\n\r\n if (this.options.validateOnBlur) {\r\n this.form.addEventListener('blur', (e) => {\r\n if (e.target.form === this.form) {\r\n this._validateField(e.target);\r\n }\r\n }, true);\r\n }\r\n }\r\n\r\n submit(handler) {\r\n const wrappedHandler = async (e) => {\r\n if (this.options.preventDefault) {\r\n e.preventDefault();\r\n }\r\n if (this.isSubmitting) return;\r\n this.isSubmitting = true;\r\n\r\n try {\r\n if (this.options.validateOnSubmit) {\r\n const validation = await this.validate();\r\n if (!validation.valid) {\r\n this._showErrors(validation.errors);\r\n return;\r\n }\r\n }\r\n\r\n const result = handler(e);\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n } finally {\r\n this.isSubmitting = false;\r\n }\r\n };\r\n\r\n this.submitHandlers.push(wrappedHandler);\r\n this.form.addEventListener('submit', wrappedHandler);\r\n\r\n return () => {\r\n const index = this.submitHandlers.indexOf(wrappedHandler);\r\n if (index > -1) {\r\n this.submitHandlers.splice(index, 1);\r\n this.form.removeEventListener('submit', wrappedHandler);\r\n }\r\n };\r\n }\r\n\r\n setRules(rules) {\r\n this.rules = { ...this.rules, ...rules };\r\n this._applyRulesToDOM();\r\n return this;\r\n }\r\n\r\n _applyRulesToDOM() {\r\n Object.keys(this.rules).forEach(name => {\r\n const input = this.form.querySelector(`[name=\"${name}\"]`);\r\n if (!input) return;\r\n\r\n const fieldRules = this.rules[name];\r\n const ruleString = this._rulesToString(fieldRules);\r\n input.setAttribute('data-validate', ruleString);\r\n });\r\n }\r\n\r\n _rulesToString(rules) {\r\n if (typeof rules === 'function') {\r\n return 'custom';\r\n }\r\n\r\n const parts = [];\r\n Object.keys(rules).forEach(rule => {\r\n const config = rules[rule];\r\n if (typeof config === 'object' && config !== null) {\r\n if (rule === 'pattern') {\r\n parts.push(`pattern:${config.source?.replace(/\\//g, '')}`);\r\n } else if (rule === 'equalTo') {\r\n parts.push(`equalTo:${config}`);\r\n } else {\r\n parts.push(rule);\r\n }\r\n } else if (typeof config === 'number' || typeof config === 'string') {\r\n parts.push(`${rule}:${config}`);\r\n } else if (config === true) {\r\n parts.push(rule);\r\n }\r\n });\r\n return parts.join('|');\r\n }\r\n\r\n async validate(fields = null) {\r\n this.errors = {};\r\n const allErrors = [];\r\n\r\n const inputs = fields\r\n ? Array.isArray(fields) ? fields : [fields]\r\n : this.form.querySelectorAll('input, select, textarea');\r\n\r\n for (const input of inputs) {\r\n const name = input.name;\r\n if (!name) continue;\r\n\r\n const errors = await this._validateField(input);\r\n if (errors.length > 0) {\r\n this.errors[name] = errors;\r\n allErrors.push(...errors);\r\n }\r\n }\r\n\r\n return {\r\n valid: allErrors.length === 0,\r\n errors: allErrors,\r\n fieldErrors: this.errors\r\n };\r\n }\r\n\r\n async _validateField(input) {\r\n const name = input.name;\r\n const rules = this.rules[name];\r\n\r\n if (typeof rules === 'function') {\r\n const result = rules(input.value.trim(), input);\r\n if (result instanceof Promise) {\r\n const asyncResult = await result;\r\n if (asyncResult !== true) {\r\n const displayName = input.getAttribute('data-label') || input.getAttribute('placeholder') || name;\r\n const message = typeof asyncResult === 'string' ? asyncResult : `${displayName} 验证失败`;\r\n this.validator.showError(input, message);\r\n return [message];\r\n }\r\n } else if (result !== true) {\r\n const displayName = input.getAttribute('data-label') || input.getAttribute('placeholder') || name;\r\n const message = typeof result === 'string' ? result : `${displayName} 验证失败`;\r\n this.validator.showError(input, message);\r\n return [message];\r\n }\r\n this.validator.clearError(input);\r\n return [];\r\n }\r\n\r\n const isValid = await this.validator.validateInputAsync(input);\r\n if (!isValid) {\r\n const errorElement = input.parentElement?.querySelector('.ds-input__error');\r\n return errorElement ? [errorElement.textContent] : ['Validation failed'];\r\n }\r\n return [];\r\n }\r\n\r\n _showErrors(errors) {\r\n if (typeof Message !== 'undefined') {\r\n Message.error(errors.join('\\n'));\r\n } else if (typeof console !== 'undefined') {\r\n console.error('Form validation errors:', errors);\r\n }\r\n }\r\n\r\n getValues() {\r\n const values = {};\r\n const inputs = this.form.querySelectorAll('input, select, textarea');\r\n\r\n inputs.forEach(input => {\r\n const name = input.name;\r\n if (!name) return;\r\n\r\n if (input.type === 'checkbox') {\r\n if (!values[name]) {\r\n values[name] = [];\r\n }\r\n if (input.checked) {\r\n values[name].push(input.value);\r\n }\r\n } else if (input.type === 'radio') {\r\n if (input.checked) {\r\n values[name] = input.value;\r\n }\r\n } else if (input.type === 'file') {\r\n values[name] = input.files;\r\n } else {\r\n values[name] = input.value;\r\n }\r\n });\r\n\r\n return values;\r\n }\r\n\r\n setValues(values) {\r\n Object.keys(values).forEach(key => {\r\n const input = this.form.querySelector(`[name=\"${key}\"]`);\r\n if (!input) return;\r\n\r\n if (input.type === 'checkbox') {\r\n const valuesArray = Array.isArray(values[key]) ? values[key] : [values[key]];\r\n input.checked = valuesArray.includes(input.value);\r\n } else if (input.type === 'radio') {\r\n const radio = this.form.querySelector(`[name=\"${key}\"][value=\"${values[key]}\"]`);\r\n if (radio) radio.checked = true;\r\n } else if (input.type === 'file') {\r\n const dataTransfer = new DataTransfer();\r\n if (values[key] instanceof FileList) {\r\n Array.from(values[key]).forEach(file => {\r\n dataTransfer.items.add(file);\r\n });\r\n }\r\n input.files = dataTransfer.files;\r\n } else {\r\n input.value = values[key];\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n reset() {\r\n this.form.reset();\r\n this.errors = {};\r\n this.validator.resetForm(this.form);\r\n return this;\r\n }\r\n\r\n clearErrors() {\r\n this.errors = {};\r\n this.form.querySelectorAll('.ds-input--error').forEach(input => {\r\n this.validator.clearError(input);\r\n });\r\n return this;\r\n }\r\n\r\n getError(fieldName) {\r\n return this.errors[fieldName] || [];\r\n }\r\n\r\n hasError(fieldName) {\r\n return this.errors[fieldName] && this.errors[fieldName].length > 0;\r\n }\r\n\r\n destroy() {\r\n this.submitHandlers.forEach(handler => {\r\n this.form.removeEventListener('submit', handler);\r\n });\r\n this.submitHandlers = [];\r\n this.errors = {};\r\n this.rules = {};\r\n }\r\n }\r\n\r\n function useForm(formOrSelector, options = {}) {\r\n return new KupolaForm(formOrSelector, options);\r\n }\r\n\r\n function createForm(formOrSelector, options = {}) {\r\n return new KupolaForm(formOrSelector, options);\r\n }\r\n\r\n window.KupolaForm = KupolaForm;\r\n window.useForm = useForm;\r\n window.createForm = createForm;\r\n})(window);","class KupolaTestUtils {\r\n static createElement(html) {\r\n const container = document.createElement('div');\r\n container.innerHTML = html;\r\n return container.firstElementChild;\r\n }\r\n\r\n static mountComponent(ComponentClass, props = {}, html = '') {\r\n const element = this.createElement(html);\r\n const component = new ComponentClass(element);\r\n Object.assign(component.props, props);\r\n return { component, element };\r\n }\r\n\r\n static async waitFor(condition, timeout = 1000) {\r\n const startTime = Date.now();\r\n return new Promise((resolve, reject) => {\r\n const check = async () => {\r\n try {\r\n const result = await condition();\r\n if (result) {\r\n resolve(result);\r\n } else if (Date.now() - startTime < timeout) {\r\n requestAnimationFrame(check);\r\n } else {\r\n reject(new Error('waitFor timeout'));\r\n }\r\n } catch (error) {\r\n if (Date.now() - startTime < timeout) {\r\n requestAnimationFrame(check);\r\n } else {\r\n reject(new Error('waitFor timeout'));\r\n }\r\n }\r\n };\r\n requestAnimationFrame(check);\r\n });\r\n }\r\n\r\n static async waitForElement(selector, parent = document, timeout = 1000) {\r\n return this.waitFor(() => parent.querySelector(selector), timeout);\r\n }\r\n\r\n static async waitForText(text, parent = document, timeout = 1000) {\r\n return this.waitFor(() => parent.textContent.includes(text), timeout);\r\n }\r\n\r\n static fireEvent(element, eventName, detail = {}) {\r\n const event = new CustomEvent(eventName, { \r\n bubbles: true, \r\n cancelable: true, \r\n detail \r\n });\r\n element.dispatchEvent(event);\r\n }\r\n\r\n static fireInput(element, value) {\r\n element.value = value;\r\n this.fireEvent(element, 'input');\r\n this.fireEvent(element, 'change');\r\n }\r\n\r\n static fireClick(element) {\r\n this.fireEvent(element, 'click');\r\n }\r\n\r\n static fireKeyDown(element, key) {\r\n const event = new KeyboardEvent('keydown', { key, bubbles: true });\r\n element.dispatchEvent(event);\r\n }\r\n\r\n static async nextTick() {\r\n return new Promise(resolve => requestAnimationFrame(resolve));\r\n }\r\n\r\n static mockDate(date) {\r\n const originalNow = Date.now;\r\n const originalDate = Date;\r\n \r\n Date.now = () => date.getTime();\r\n globalThis.Date = class extends Date {\r\n constructor(...args) {\r\n super(...args);\r\n if (args.length === 0) {\r\n return new Date(date);\r\n }\r\n return new originalDate(...args);\r\n }\r\n };\r\n \r\n return () => {\r\n Date.now = originalNow;\r\n globalThis.Date = originalDate;\r\n };\r\n }\r\n\r\n static mockFetch(mockResponses) {\r\n const originalFetch = fetch;\r\n \r\n globalThis.fetch = jest.fn(async (url, options) => {\r\n for (const mock of mockResponses) {\r\n if (typeof mock.url === 'string' && url === mock.url) {\r\n return mock.response();\r\n }\r\n if (mock.url instanceof RegExp && mock.url.test(url)) {\r\n return mock.response();\r\n }\r\n if (mock.method && options && options.method === mock.method) {\r\n return mock.response();\r\n }\r\n }\r\n return originalFetch(url, options);\r\n });\r\n \r\n return () => {\r\n globalThis.fetch = originalFetch;\r\n };\r\n }\r\n\r\n static async mountAndWait(ComponentClass, props = {}, html = '') {\r\n const { component, element } = this.mountComponent(ComponentClass, props, html);\r\n await component.mount();\r\n await this.nextTick();\r\n return { component, element };\r\n }\r\n\r\n static async unmountAndWait(component) {\r\n await component.unmount();\r\n await this.nextTick();\r\n }\r\n\r\n static getByText(parent, text) {\r\n const elements = parent.querySelectorAll('*');\r\n for (const element of elements) {\r\n if (element.textContent.trim() === text) {\r\n return element;\r\n }\r\n }\r\n throw new Error(`Element with text \"${text}\" not found`);\r\n }\r\n\r\n static queryByText(parent, text) {\r\n const elements = parent.querySelectorAll('*');\r\n for (const element of elements) {\r\n if (element.textContent.trim() === text) {\r\n return element;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static getByTestId(parent, testId) {\r\n const element = parent.querySelector(`[data-testid=\"${testId}\"]`);\r\n if (!element) {\r\n throw new Error(`Element with data-testid=\"${testId}\" not found`);\r\n }\r\n return element;\r\n }\r\n\r\n static queryByTestId(parent, testId) {\r\n return parent.querySelector(`[data-testid=\"${testId}\"]`);\r\n }\r\n\r\n static getByRole(parent, role) {\r\n const element = parent.querySelector(`[role=\"${role}\"]`);\r\n if (!element) {\r\n throw new Error(`Element with role=\"${role}\" not found`);\r\n }\r\n return element;\r\n }\r\n\r\n static queryByRole(parent, role) {\r\n return parent.querySelector(`[role=\"${role}\"]`);\r\n }\r\n\r\n static async simulateDrag(element, startX, startY, endX, endY) {\r\n this.fireEvent(element, 'dragstart', {\r\n clientX: startX,\r\n clientY: startY\r\n });\r\n \r\n this.fireEvent(element, 'drag', {\r\n clientX: (startX + endX) / 2,\r\n clientY: (startY + endY) / 2\r\n });\r\n \r\n this.fireEvent(element, 'dragend', {\r\n clientX: endX,\r\n clientY: endY\r\n });\r\n }\r\n\r\n static async simulateTouch(element, startX, startY, endX, endY) {\r\n const touchStart = new TouchEvent('touchstart', {\r\n touches: [{ clientX: startX, clientY: startY }],\r\n bubbles: true\r\n });\r\n element.dispatchEvent(touchStart);\r\n \r\n const touchMove = new TouchEvent('touchmove', {\r\n touches: [{ clientX: (startX + endX) / 2, clientY: (startY + endY) / 2 }],\r\n bubbles: true\r\n });\r\n element.dispatchEvent(touchMove);\r\n \r\n const touchEnd = new TouchEvent('touchend', {\r\n touches: [{ clientX: endX, clientY: endY }],\r\n bubbles: true\r\n });\r\n element.dispatchEvent(touchEnd);\r\n }\r\n\r\n static async waitForState(component, stateKey, expectedValue) {\r\n return this.waitFor(() => {\r\n return component.state[stateKey] === expectedValue;\r\n });\r\n }\r\n\r\n static async waitForProps(component, propKey, expectedValue) {\r\n return this.waitFor(() => {\r\n return component.props[propKey] === expectedValue;\r\n });\r\n }\r\n\r\n static async waitForEmitted(component, eventName) {\r\n return this.waitFor(() => {\r\n return component._emitted && component._emitted[eventName];\r\n });\r\n }\r\n\r\n static spyOn(obj, methodName) {\r\n const original = obj[methodName];\r\n const spy = function(...args) {\r\n spy.called = true;\r\n spy.callCount = (spy.callCount || 0) + 1;\r\n spy.args = (spy.args || []).concat([args]);\r\n return original.apply(this, args);\r\n };\r\n obj[methodName] = spy;\r\n return () => {\r\n obj[methodName] = original;\r\n };\r\n }\r\n\r\n static async flushPromises() {\r\n return new Promise(resolve => setImmediate(resolve));\r\n }\r\n}\r\n\r\nwindow.KupolaTestUtils = KupolaTestUtils;\r\nwindow.testUtils = KupolaTestUtils;","class KupolaI18n {\r\n constructor(options = {}) {\r\n this.locales = options.locales || {};\r\n this.currentLocale = options.defaultLocale || 'zh-CN';\r\n this.fallbackLocale = options.fallbackLocale || 'zh-CN';\r\n this.delimiter = options.delimiter || '.';\r\n this.missingHandler = options.missingHandler || ((key) => {\r\n console.warn(`Missing translation: ${key}`);\r\n return key;\r\n });\r\n \r\n this._initFromDOM();\r\n }\r\n\r\n _initFromDOM() {\r\n const scriptTags = document.querySelectorAll('script[type=\"application/json\"][data-kupola-i18n]');\r\n scriptTags.forEach(script => {\r\n const locale = script.dataset.kupolaI18n;\r\n if (locale) {\r\n try {\r\n const data = JSON.parse(script.textContent);\r\n this.addLocale(locale, data);\r\n } catch (e) {\r\n console.error('Failed to parse i18n data:', e);\r\n }\r\n }\r\n });\r\n\r\n const htmlLang = document.documentElement.lang;\r\n if (htmlLang && this.locales[htmlLang]) {\r\n this.currentLocale = htmlLang;\r\n }\r\n }\r\n\r\n addLocale(locale, data) {\r\n if (!this.locales[locale]) {\r\n this.locales[locale] = {};\r\n }\r\n this._mergeDeep(this.locales[locale], data);\r\n }\r\n\r\n _mergeDeep(target, source) {\r\n for (const key of Object.keys(source)) {\r\n if (source[key] instanceof Object && key in target) {\r\n this._mergeDeep(target[key], source[key]);\r\n } else {\r\n target[key] = source[key];\r\n }\r\n }\r\n }\r\n\r\n setLocale(locale) {\r\n if (this.locales[locale]) {\r\n this.currentLocale = locale;\r\n document.documentElement.lang = locale;\r\n this._emitChange();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n getLocale() {\r\n return this.currentLocale;\r\n }\r\n\r\n t(key, params = {}) {\r\n let value = this._getTranslation(key, this.currentLocale);\r\n \r\n if (!value) {\r\n value = this._getTranslation(key, this.fallbackLocale);\r\n }\r\n \r\n if (!value) {\r\n return this.missingHandler(key);\r\n }\r\n \r\n return this._interpolate(value, params);\r\n }\r\n\r\n _getTranslation(key, locale) {\r\n if (!this.locales[locale]) return null;\r\n \r\n const keys = key.split(this.delimiter);\r\n let value = this.locales[locale];\r\n \r\n for (const k of keys) {\r\n if (value && typeof value === 'object' && k in value) {\r\n value = value[k];\r\n } else {\r\n return null;\r\n }\r\n }\r\n \r\n return typeof value === 'string' ? value : null;\r\n }\r\n\r\n _interpolate(str, params) {\r\n return str.replace(/\\{(\\w+)\\}/g, (match, key) => {\r\n return params[key] !== undefined ? params[key] : match;\r\n });\r\n }\r\n\r\n n(key, count, params = {}) {\r\n const value = this.t(key, { ...params, count });\r\n \r\n if (!value) return value;\r\n \r\n const parts = value.split('|');\r\n \r\n if (parts.length === 1) {\r\n return value.replace('{count}', count);\r\n }\r\n \r\n if (parts.length === 2) {\r\n return count === 1 ? parts[0] : parts[1];\r\n }\r\n \r\n if (parts.length >= 3) {\r\n if (count === 0) return parts[0];\r\n if (count === 1) return parts[1];\r\n return parts[2];\r\n }\r\n \r\n return value;\r\n }\r\n\r\n _emitChange() {\r\n const event = new CustomEvent('kupola:i18n:change', {\r\n detail: { locale: this.currentLocale },\r\n bubbles: true\r\n });\r\n document.dispatchEvent(event);\r\n }\r\n\r\n async loadLocale(locale, url) {\r\n try {\r\n const response = await fetch(url);\r\n const data = await response.json();\r\n this.addLocale(locale, data);\r\n return true;\r\n } catch (error) {\r\n console.error('Failed to load locale:', error);\r\n return false;\r\n }\r\n }\r\n\r\n getAvailableLocales() {\r\n return Object.keys(this.locales);\r\n }\r\n\r\n hasLocale(locale) {\r\n return !!this.locales[locale];\r\n }\r\n\r\n formatDate(date, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n const dateObj = typeof date === 'string' ? new Date(date) : date;\r\n \r\n return new Intl.DateTimeFormat(locale, options).format(dateObj);\r\n }\r\n\r\n formatNumber(number, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n \r\n return new Intl.NumberFormat(locale, options).format(number);\r\n }\r\n\r\n formatCurrency(number, currency, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n \r\n return new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currency,\r\n ...options\r\n }).format(number);\r\n }\r\n\r\n formatRelativeTime(value, unit, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n \r\n return new Intl.RelativeTimeFormat(locale, options).format(value, unit);\r\n }\r\n}\r\n\r\nconst kupolaI18n = new KupolaI18n();\r\n\r\nfunction createI18n(options) {\r\n return new KupolaI18n(options);\r\n}\r\n\r\nfunction t(key, params = {}) {\r\n return kupolaI18n.t(key, params);\r\n}\r\n\r\nfunction n(key, count, params = {}) {\r\n return kupolaI18n.n(key, count, params);\r\n}\r\n\r\nfunction setLocale(locale) {\r\n return kupolaI18n.setLocale(locale);\r\n}\r\n\r\nfunction getLocale() {\r\n return kupolaI18n.getLocale();\r\n}\r\n\r\nfunction formatDate(date, options = {}) {\r\n return kupolaI18n.formatDate(date, options);\r\n}\r\n\r\nfunction formatNumber(number, options = {}) {\r\n return kupolaI18n.formatNumber(number, options);\r\n}\r\n\r\nfunction formatCurrency(number, currency, options = {}) {\r\n return kupolaI18n.formatCurrency(number, currency, options);\r\n}\r\n\r\nwindow.KupolaI18n = KupolaI18n;\r\nwindow.kupolaI18n = kupolaI18n;\r\nwindow.createI18n = createI18n;\r\nwindow.t = t;\r\nwindow.n = n;\r\nwindow.setLocale = setLocale;\r\nwindow.getLocale = getLocale;\r\nwindow.formatDate = formatDate;\r\nwindow.formatNumber = formatNumber;\r\nwindow.formatCurrency = formatCurrency;","class GlobalEventManager {\r\n constructor() {\r\n this.listeners = new Map();\r\n this.scopes = new Map();\r\n }\r\n\r\n on(target, eventType, handler, options = {}) {\r\n const key = this._getKey(target, eventType);\r\n \r\n if (!this.listeners.has(key)) {\r\n this.listeners.set(key, []);\r\n }\r\n \r\n const wrapper = (e) => {\r\n if (handler.before && typeof handler.before === 'function') {\r\n handler.before(e);\r\n }\r\n \r\n const result = handler(e);\r\n \r\n if (handler.after && typeof handler.after === 'function') {\r\n handler.after(e, result);\r\n }\r\n \r\n return result;\r\n };\r\n \r\n const listener = {\r\n handler,\r\n wrapper,\r\n options,\r\n active: true\r\n };\r\n \r\n this.listeners.get(key).push(listener);\r\n \r\n if (options.scope) {\r\n if (!this.scopes.has(options.scope)) {\r\n this.scopes.set(options.scope, []);\r\n }\r\n this.scopes.get(options.scope).push({ target, eventType, handler, wrapper });\r\n }\r\n \r\n target.addEventListener(eventType, wrapper, options);\r\n \r\n const unsubscribe = () => {\r\n target.removeEventListener(eventType, wrapper, options);\r\n if (this.listeners.has(key)) {\r\n const list = this.listeners.get(key);\r\n const idx = list.indexOf(listener);\r\n if (idx !== -1) {\r\n list.splice(idx, 1);\r\n }\r\n }\r\n if (options.scope && this.scopes.has(options.scope)) {\r\n const scopeList = this.scopes.get(options.scope);\r\n const idx = scopeList.findIndex(\r\n s => s.target === target && s.eventType === eventType && s.handler === handler\r\n );\r\n if (idx !== -1) {\r\n scopeList.splice(idx, 1);\r\n }\r\n }\r\n listener.active = false;\r\n };\r\n \r\n listener.unsubscribe = unsubscribe;\r\n \r\n return listener;\r\n }\r\n\r\n off(target, eventType, handler) {\r\n const key = this._getKey(target, eventType);\r\n \r\n if (!this.listeners.has(key)) return;\r\n \r\n const listenerList = this.listeners.get(key);\r\n const index = listenerList.findIndex(l => l.handler === handler);\r\n \r\n if (index !== -1) {\r\n const listener = listenerList[index];\r\n target.removeEventListener(eventType, listener.wrapper, listener.options);\r\n listener.active = false;\r\n listenerList.splice(index, 1);\r\n \r\n if (listener.options.scope) {\r\n this._removeFromScope(listener.options.scope, target, eventType, handler);\r\n }\r\n }\r\n }\r\n\r\n once(target, eventType, handler, options = {}) {\r\n const onceHandler = (e) => {\r\n this.off(target, eventType, onceHandler);\r\n return handler(e);\r\n };\r\n \r\n return this.on(target, eventType, onceHandler, options);\r\n }\r\n\r\n clearScope(scope) {\r\n if (!this.scopes.has(scope)) return;\r\n \r\n const scopeListeners = this.scopes.get(scope);\r\n \r\n scopeListeners.forEach(({ target, eventType, handler, wrapper }) => {\r\n target.removeEventListener(eventType, wrapper);\r\n \r\n const key = this._getKey(target, eventType);\r\n if (this.listeners.has(key)) {\r\n const listenerList = this.listeners.get(key);\r\n const index = listenerList.findIndex(l => l.handler === handler);\r\n if (index !== -1) {\r\n listenerList[index].active = false;\r\n listenerList.splice(index, 1);\r\n }\r\n }\r\n });\r\n \r\n this.scopes.delete(scope);\r\n }\r\n\r\n _removeFromScope(scope, target, eventType, handler) {\r\n if (!this.scopes.has(scope)) return;\r\n \r\n const scopeListeners = this.scopes.get(scope);\r\n const index = scopeListeners.findIndex(\r\n l => l.target === target && l.eventType === eventType && l.handler === handler\r\n );\r\n \r\n if (index !== -1) {\r\n scopeListeners.splice(index, 1);\r\n }\r\n }\r\n\r\n _getKey(target, eventType) {\r\n const targetName = target === document ? 'document' : \r\n target === window ? 'window' : \r\n target === document.body ? 'body' : \r\n target.nodeName ? target.nodeName : \r\n 'unknown';\r\n \r\n return `${targetName}:${eventType}`;\r\n }\r\n\r\n getListenerCount(target, eventType) {\r\n const key = this._getKey(target, eventType);\r\n return this.listeners.has(key) ? this.listeners.get(key).length : 0;\r\n }\r\n\r\n getAllListenerCounts() {\r\n const counts = {};\r\n this.listeners.forEach((listeners, key) => {\r\n counts[key] = listeners.filter(l => l.active).length;\r\n });\r\n return counts;\r\n }\r\n\r\n cleanup() {\r\n this.listeners.forEach((listenerList, key) => {\r\n const [targetName, eventType] = key.split(':');\r\n let target;\r\n \r\n if (targetName === 'document') target = document;\r\n else if (targetName === 'window') target = window;\r\n else if (targetName === 'body') target = document.body;\r\n \r\n if (target) {\r\n listenerList.forEach(listener => {\r\n target.removeEventListener(eventType, listener.wrapper, listener.options);\r\n });\r\n }\r\n });\r\n \r\n this.listeners.clear();\r\n this.scopes.clear();\r\n }\r\n}\r\n\r\nconst globalEvents = new GlobalEventManager();\r\n\r\nfunction on(target, eventType, handler, options) {\r\n return globalEvents.on(target, eventType, handler, options);\r\n}\r\n\r\nfunction off(target, eventType, handler) {\r\n globalEvents.off(target, eventType, handler);\r\n}\r\n\r\nfunction once(target, eventType, handler, options) {\r\n return globalEvents.once(target, eventType, handler, options);\r\n}\r\n\r\nfunction clearScope(scope) {\r\n globalEvents.clearScope(scope);\r\n}\r\n\r\nwindow.GlobalEventManager = GlobalEventManager;\r\nwindow.globalEvents = globalEvents;\r\nwindow.on = on;\r\nwindow.off = off;\r\nwindow.once = once;\r\nwindow.clearScope = clearScope;","class KupolaSecurity {\r\n constructor() {\r\n this.csrfToken = null;\r\n this.cspEnabled = false;\r\n }\r\n\r\n init() {\r\n this._initCSRF();\r\n this._initCSP();\r\n }\r\n\r\n _initCSRF() {\r\n const metaTag = document.querySelector('meta[name=\"csrf-token\"]');\r\n if (metaTag) {\r\n this.csrfToken = metaTag.getAttribute('content');\r\n }\r\n }\r\n\r\n _initCSP() {\r\n const metaTag = document.querySelector('meta[http-equiv=\"Content-Security-Policy\"]');\r\n if (metaTag) {\r\n this.cspEnabled = true;\r\n }\r\n }\r\n\r\n getCSRFToken() {\r\n return this.csrfToken;\r\n }\r\n\r\n setCSRFToken(token) {\r\n this.csrfToken = token;\r\n const metaTag = document.querySelector('meta[name=\"csrf-token\"]');\r\n if (metaTag) {\r\n metaTag.setAttribute('content', token);\r\n }\r\n }\r\n\r\n addCSRFHeader(config) {\r\n if (this.csrfToken) {\r\n config.headers = config.headers || {};\r\n config.headers['X-CSRF-Token'] = this.csrfToken;\r\n }\r\n return config;\r\n }\r\n\r\n escapeHtml(str) {\r\n if (!str || typeof str !== 'string') return str;\r\n const div = document.createElement('div');\r\n div.textContent = str;\r\n return div.innerHTML;\r\n }\r\n\r\n sanitize(html) {\r\n if (!html || typeof html !== 'string') return html;\r\n\r\n const allowedTags = [\r\n 'b', 'strong', 'i', 'em', 'u', 's', 'strike', 'sub', 'sup',\r\n 'a', 'br', 'p', 'span', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\r\n 'ul', 'ol', 'li', 'table', 'thead', 'tbody', 'tr', 'td', 'th',\r\n 'img', 'video', 'audio', 'iframe'\r\n ];\r\n\r\n const allowedAttributes = [\r\n 'href', 'src', 'alt', 'title', 'class', 'id', 'data-*',\r\n 'width', 'height', 'frameborder', 'allowfullscreen'\r\n ];\r\n\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = html;\r\n\r\n const walk = (node) => {\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n const tagName = node.tagName.toLowerCase();\r\n if (!allowedTags.includes(tagName)) {\r\n node.parentNode.replaceChild(document.createTextNode(node.textContent), node);\r\n return;\r\n }\r\n\r\n Array.from(node.attributes).forEach(attr => {\r\n const attrName = attr.name.toLowerCase();\r\n const isAllowed = allowedAttributes.includes(attrName) || \r\n attrName.startsWith('data-');\r\n \r\n if (!isAllowed) {\r\n node.removeAttribute(attr.name);\r\n } else if (attrName === 'href' || attrName === 'src') {\r\n if (!this._isSafeUrl(attr.value)) {\r\n node.removeAttribute(attr.name);\r\n }\r\n }\r\n });\r\n }\r\n\r\n for (let i = node.childNodes.length - 1; i >= 0; i--) {\r\n walk(node.childNodes[i]);\r\n }\r\n };\r\n\r\n walk(tempDiv);\r\n return tempDiv.innerHTML;\r\n }\r\n\r\n _isSafeUrl(url) {\r\n try {\r\n const parsed = new URL(url);\r\n const safeProtocols = ['http:', 'https:', 'data:', 'mailto:', 'tel:'];\r\n return safeProtocols.includes(parsed.protocol);\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n validateEmail(email) {\r\n const re = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n return re.test(email);\r\n }\r\n\r\n validateURL(url) {\r\n try {\r\n new URL(url);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n validatePhone(phone) {\r\n const re = /^[\\d\\s\\-\\+\\(\\)]{7,20}$/;\r\n return re.test(phone.replace(/\\s/g, ''));\r\n }\r\n\r\n generateSecureHash(str) {\r\n if (!str || typeof str !== 'string') return '';\r\n \r\n let hash = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n const char = str.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash;\r\n }\r\n return Math.abs(hash).toString(36);\r\n }\r\n\r\n isXSSAttack(str) {\r\n if (!str || typeof str !== 'string') return false;\r\n \r\n const xssPatterns = [\r\n /<script[^>]*>.*?<\\/script>/gi,\r\n /<img[^>]*onerror[^>]*>/gi,\r\n /javascript:/gi,\r\n /vbscript:/gi,\r\n /onload[^>]*=/gi,\r\n /onclick[^>]*=/gi,\r\n /onmouseover[^>]*=/gi,\r\n /<iframe[^>]*>/gi\r\n ];\r\n\r\n return xssPatterns.some(pattern => pattern.test(str));\r\n }\r\n\r\n protectForm(form) {\r\n if (!(form instanceof HTMLFormElement)) return;\r\n\r\n form.addEventListener('submit', (e) => {\r\n const inputs = form.querySelectorAll('input, textarea');\r\n let hasXSS = false;\r\n\r\n inputs.forEach(input => {\r\n if (this.isXSSAttack(input.value)) {\r\n hasXSS = true;\r\n input.classList.add('ds-input--error');\r\n } else {\r\n input.classList.remove('ds-input--error');\r\n }\r\n });\r\n\r\n if (hasXSS) {\r\n e.preventDefault();\r\n console.error('[KupolaSecurity] XSS attack detected in form');\r\n }\r\n });\r\n }\r\n}\r\n\r\nconst kupolaSecurity = new KupolaSecurity();\r\nwindow.kupolaSecurity = kupolaSecurity;\r\nwindow.KupolaSecurity = KupolaSecurity;\r\n\r\nexport default KupolaSecurity;","class KupolaErrorHandler {\r\n constructor() {\r\n this.handlers = new Map();\r\n this.errorLog = [];\r\n this.maxLogs = 100;\r\n this.globalHandler = null;\r\n }\r\n\r\n init() {\r\n this._installGlobalHandlers();\r\n }\r\n\r\n _installGlobalHandlers() {\r\n window.addEventListener('error', (event) => {\r\n this.handleError(event.error || event.message, {\r\n source: event.filename,\r\n line: event.lineno,\r\n column: event.colno,\r\n type: 'global'\r\n });\r\n });\r\n\r\n window.addEventListener('unhandledrejection', (event) => {\r\n this.handleError(event.reason, {\r\n type: 'promise',\r\n rejection: true\r\n });\r\n });\r\n }\r\n\r\n setGlobalHandler(handler) {\r\n if (typeof handler === 'function') {\r\n this.globalHandler = handler;\r\n }\r\n }\r\n\r\n handleError(error, context = {}) {\r\n const errorInfo = this._normalizeError(error, context);\r\n \r\n this._logError(errorInfo);\r\n this._notifyHandlers(errorInfo);\r\n \r\n if (this.globalHandler) {\r\n try {\r\n this.globalHandler(errorInfo);\r\n } catch (e) {\r\n console.error('[KupolaErrorHandler] Error in global handler:', e);\r\n }\r\n }\r\n \r\n return errorInfo;\r\n }\r\n\r\n _normalizeError(error, context) {\r\n const errorInfo = {\r\n id: this._generateId(),\r\n timestamp: Date.now(),\r\n message: '',\r\n stack: '',\r\n type: context.type || 'unknown',\r\n source: context.source || '',\r\n line: context.line || 0,\r\n column: context.column || 0,\r\n component: context.component || '',\r\n hook: context.hook || '',\r\n args: context.args || [],\r\n ...context\r\n };\r\n\r\n if (error instanceof Error) {\r\n errorInfo.message = error.message;\r\n errorInfo.stack = error.stack || '';\r\n errorInfo.name = error.name;\r\n } else if (typeof error === 'string') {\r\n errorInfo.message = error;\r\n } else if (error && typeof error === 'object') {\r\n errorInfo.message = error.message || JSON.stringify(error);\r\n errorInfo.stack = error.stack || '';\r\n errorInfo.name = error.name || '';\r\n }\r\n\r\n return errorInfo;\r\n }\r\n\r\n _generateId() {\r\n return `err-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n\r\n _logError(errorInfo) {\r\n this.errorLog.unshift(errorInfo);\r\n if (this.errorLog.length > this.maxLogs) {\r\n this.errorLog.pop();\r\n }\r\n \r\n console.error(`[KupolaError] [${errorInfo.type}] ${errorInfo.message}`, errorInfo);\r\n }\r\n\r\n _notifyHandlers(errorInfo) {\r\n this.handlers.forEach((handler, key) => {\r\n try {\r\n handler(errorInfo);\r\n } catch (e) {\r\n console.error(`[KupolaErrorHandler] Error in handler \"${key}\":`, e);\r\n }\r\n });\r\n }\r\n\r\n on(type, handler) {\r\n if (!this.handlers.has(type)) {\r\n this.handlers.set(type, []);\r\n }\r\n this.handlers.get(type).push(handler);\r\n }\r\n\r\n off(type, handler) {\r\n if (!this.handlers.has(type)) return;\r\n \r\n const handlers = this.handlers.get(type);\r\n const index = handlers.indexOf(handler);\r\n if (index > -1) {\r\n handlers.splice(index, 1);\r\n }\r\n }\r\n\r\n getErrorLog() {\r\n return [...this.errorLog];\r\n }\r\n\r\n clearErrorLog() {\r\n this.errorLog = [];\r\n }\r\n\r\n getErrorCount() {\r\n return this.errorLog.length;\r\n }\r\n\r\n getErrorByType(type) {\r\n return this.errorLog.filter(err => err.type === type);\r\n }\r\n\r\n captureErrors(target, methodNames) {\r\n if (!target || !methodNames || !Array.isArray(methodNames)) return;\r\n\r\n methodNames.forEach(methodName => {\r\n if (typeof target[methodName] === 'function') {\r\n const originalMethod = target[methodName];\r\n target[methodName] = function(...args) {\r\n try {\r\n const result = originalMethod.apply(this, args);\r\n if (result instanceof Promise) {\r\n return result.catch(error => {\r\n kupolaErrorHandler.handleError(error, {\r\n type: 'method',\r\n component: target.constructor?.name || '',\r\n hook: methodName,\r\n args\r\n });\r\n throw error;\r\n });\r\n }\r\n return result;\r\n } catch (error) {\r\n kupolaErrorHandler.handleError(error, {\r\n type: 'method',\r\n component: target.constructor?.name || '',\r\n hook: methodName,\r\n args\r\n });\r\n throw error;\r\n }\r\n };\r\n }\r\n });\r\n }\r\n}\r\n\r\nconst kupolaErrorHandler = new KupolaErrorHandler();\r\nwindow.kupolaErrorHandler = kupolaErrorHandler;\r\nwindow.KupolaErrorHandler = KupolaErrorHandler;\r\n\r\nexport default KupolaErrorHandler;","class KupolaPerformance {\r\n constructor() {\r\n this.metrics = new Map();\r\n this.timers = new Map();\r\n this.observers = [];\r\n this.enabled = false;\r\n this.thresholds = {\r\n render: 16,\r\n mount: 100,\r\n update: 50,\r\n http: 3000\r\n };\r\n }\r\n\r\n init() {\r\n this.enabled = true;\r\n this._setupObservers();\r\n this._measureNavigation();\r\n }\r\n\r\n _setupObservers() {\r\n if ('PerformanceObserver' in window) {\r\n const paintObserver = new PerformanceObserver((entryList) => {\r\n entryList.getEntries().forEach(entry => {\r\n this._recordMetric('paint', {\r\n name: entry.name,\r\n startTime: entry.startTime,\r\n duration: entry.duration\r\n });\r\n });\r\n });\r\n paintObserver.observe({ type: 'paint', buffered: true });\r\n this.observers.push(paintObserver);\r\n\r\n const resourceObserver = new PerformanceObserver((entryList) => {\r\n entryList.getEntries().forEach(entry => {\r\n this._recordMetric('resource', {\r\n name: entry.name,\r\n type: entry.initiatorType,\r\n duration: entry.duration,\r\n size: entry.transferSize,\r\n startTime: entry.startTime\r\n });\r\n });\r\n });\r\n resourceObserver.observe({ type: 'resource', buffered: true });\r\n this.observers.push(resourceObserver);\r\n\r\n const longTaskObserver = new PerformanceObserver((entryList) => {\r\n entryList.getEntries().forEach(entry => {\r\n this._recordMetric('longtask', {\r\n duration: entry.duration,\r\n startTime: entry.startTime\r\n });\r\n });\r\n });\r\n longTaskObserver.observe({ type: 'longtask', buffered: true });\r\n this.observers.push(longTaskObserver);\r\n }\r\n }\r\n\r\n _measureNavigation() {\r\n if ('performance' in window) {\r\n const nav = performance.getEntriesByType('navigation')[0];\r\n if (nav) {\r\n this._recordMetric('navigation', {\r\n domContentLoaded: nav.domContentLoadedEventEnd - nav.fetchStart,\r\n load: nav.loadEventEnd - nav.fetchStart,\r\n firstByte: nav.responseStart - nav.requestStart,\r\n redirectCount: nav.redirectCount\r\n });\r\n }\r\n }\r\n }\r\n\r\n startTimer(name, context = {}) {\r\n if (!this.enabled) return;\r\n \r\n this.timers.set(name, {\r\n startTime: performance.now(),\r\n context\r\n });\r\n }\r\n\r\n stopTimer(name) {\r\n if (!this.enabled) return null;\r\n \r\n const timer = this.timers.get(name);\r\n if (!timer) return null;\r\n \r\n const duration = performance.now() - timer.startTime;\r\n this.timers.delete(name);\r\n \r\n this._recordMetric('timer', {\r\n name,\r\n duration,\r\n ...timer.context\r\n });\r\n\r\n return duration;\r\n }\r\n\r\n _recordMetric(type, data) {\r\n if (!this.enabled) return;\r\n \r\n const metric = {\r\n type,\r\n timestamp: Date.now(),\r\n ...data\r\n };\r\n \r\n if (!this.metrics.has(type)) {\r\n this.metrics.set(type, []);\r\n }\r\n this.metrics.get(type).push(metric);\r\n }\r\n\r\n measure(fn, name, context = {}) {\r\n if (!this.enabled) return fn();\r\n \r\n this.startTimer(name, context);\r\n \r\n let result;\r\n let error;\r\n \r\n try {\r\n result = fn();\r\n } catch (e) {\r\n error = e;\r\n }\r\n \r\n const duration = this.stopTimer(name);\r\n \r\n if (error) {\r\n throw error;\r\n }\r\n \r\n return result;\r\n }\r\n\r\n measureAsync(fn, name, context = {}) {\r\n if (!this.enabled) return fn();\r\n \r\n this.startTimer(name, context);\r\n \r\n return fn().then(result => {\r\n this.stopTimer(name);\r\n return result;\r\n }).catch(error => {\r\n this.stopTimer(name);\r\n throw error;\r\n });\r\n }\r\n\r\n getMetrics(type) {\r\n if (type) {\r\n return this.metrics.get(type) || [];\r\n }\r\n return Array.from(this.metrics.entries());\r\n }\r\n\r\n getSummary() {\r\n const summary = {\r\n navigation: null,\r\n paint: null,\r\n timers: [],\r\n resources: [],\r\n longTasks: []\r\n };\r\n\r\n if (this.metrics.has('navigation')) {\r\n summary.navigation = this.metrics.get('navigation')[0];\r\n }\r\n \r\n if (this.metrics.has('paint')) {\r\n summary.paint = this.metrics.get('paint');\r\n }\r\n \r\n if (this.metrics.has('timer')) {\r\n summary.timers = this.metrics.get('timer');\r\n }\r\n \r\n if (this.metrics.has('resource')) {\r\n summary.resources = this.metrics.get('resource');\r\n }\r\n \r\n if (this.metrics.has('longtask')) {\r\n summary.longTasks = this.metrics.get('longtask');\r\n }\r\n\r\n return summary;\r\n }\r\n\r\n getPerformanceScore() {\r\n const summary = this.getSummary();\r\n let score = 100;\r\n \r\n if (summary.navigation) {\r\n if (summary.navigation.load > 3000) score -= 20;\r\n else if (summary.navigation.load > 2000) score -= 10;\r\n \r\n if (summary.navigation.domContentLoaded > 1500) score -= 15;\r\n else if (summary.navigation.domContentLoaded > 1000) score -= 5;\r\n }\r\n \r\n if (summary.paint) {\r\n const fcp = summary.paint.find(p => p.name === 'first-contentful-paint');\r\n if (fcp && fcp.startTime > 2000) score -= 20;\r\n else if (fcp && fcp.startTime > 1000) score -= 10;\r\n }\r\n \r\n if (summary.longTasks.length > 0) {\r\n score -= summary.longTasks.length * 10;\r\n }\r\n \r\n return Math.max(0, score);\r\n }\r\n\r\n logSummary() {\r\n const summary = this.getSummary();\r\n const score = this.getPerformanceScore();\r\n \r\n console.group('[KupolaPerformance] Summary');\r\n console.log('Score:', score);\r\n console.log('Navigation:', summary.navigation);\r\n console.log('Paint:', summary.paint);\r\n console.log('Long Tasks:', summary.longTasks.length);\r\n console.groupEnd();\r\n }\r\n\r\n clear() {\r\n this.metrics.clear();\r\n this.timers.clear();\r\n }\r\n\r\n destroy() {\r\n this.observers.forEach(observer => {\r\n observer.disconnect();\r\n });\r\n this.observers = [];\r\n this.clear();\r\n this.enabled = false;\r\n }\r\n}\r\n\r\nconst kupolaPerformance = new KupolaPerformance();\r\nwindow.kupolaPerformance = kupolaPerformance;\r\nwindow.KupolaPerformance = KupolaPerformance;\r\n\r\nexport default KupolaPerformance;","import '../js/component.js';\r\nimport '../js/registry.js';\r\nimport '../js/router.js';\r\nimport '../js/http.js';\r\nimport '../js/initializer.js';\r\nimport '../js/kupola-core.js';\r\nimport '../js/kupola-lifecycle.js';\r\nimport '../js/utils.js';\r\nimport '../js/data-bind.js';\r\nimport '../js/theme.js';\r\nimport '../js/dropdown.js';\r\nimport '../js/select.js';\r\nimport '../js/datepicker.js';\r\nimport '../js/timepicker.js';\r\nimport '../js/slider.js';\r\nimport '../js/carousel.js';\r\nimport '../js/drawer.js';\r\nimport '../js/modal.js';\r\nimport '../js/dialog.js';\r\nimport '../js/notification.js';\r\nimport '../js/message.js';\r\nimport '../js/fileupload.js';\r\nimport '../js/collapse.js';\r\nimport '../js/color-picker.js';\r\nimport '../js/calendar.js';\r\nimport '../js/dynamic-tags.js';\r\nimport '../js/image-preview.js';\r\nimport '../js/tag.js';\r\nimport '../js/statcard.js';\r\nimport '../js/heatmap.js';\r\nimport '../js/tooltip.js';\r\nimport '../js/validation.js';\r\nimport '../js/virtual-list.js';\r\nimport '../js/kupola-devtools.js';\r\nimport '../js/icons.js';\r\nimport '../js/countdown.js';\r\nimport '../js/numberinput.js';\r\nimport '../js/slide-captcha.js';\r\nimport '../js/composition-api.js';\r\nimport '../js/form.js';\r\nimport '../js/test-utils.js';\r\nimport '../js/i18n.js';\r\nimport '../js/global-events.js';\r\nimport '../js/security.js';\r\nimport '../js/error-handler.js';\r\nimport '../js/performance.js';\r\n\r\nexport const KupolaComponent = window.KupolaComponent;\r\nexport const KupolaComponentRegistry = window.KupolaComponentRegistry;\r\nexport const KupolaRouter = window.KupolaRouter;\r\nexport const KupolaHttp = window.KupolaHttp;\r\nexport const KupolaStatePersist = window.KupolaStatePersist;\r\nexport const KupolaLifecycle = window.KupolaLifecycle;\r\nexport const KupolaPluginManager = window.KupolaPluginManager;\r\nexport const KupolaDevTools = window.KupolaDevTools;\r\n\r\nexport const kupolaRegistry = window.kupolaRegistry;\r\nexport const kupolaPersist = window.kupolaPersist;\r\nexport const kupolaLifecycle = window.kupolaLifecycle;\r\nexport const kupolaPluginManager = window.kupolaPluginManager;\r\nexport const KupolaUtils = window.KupolaUtils;\r\n\r\nexport const createRouter = window.createRouter;\r\nexport const createHttp = window.createHttp;\r\nexport const createLifecycle = window.createLifecycle;\r\nexport const createStore = window.createStore;\r\nexport const getStore = window.getStore;\r\nexport const registerComponent = window.registerComponent;\r\nexport const registerLazyComponent = window.registerLazyComponent;\r\nexport const bootstrapComponents = window.bootstrapComponents;\r\nexport const defineMixin = window.defineMixin;\r\nexport const useMixin = window.useMixin;\r\n\r\nexport const initTheme = window.initTheme;\r\nexport const setTheme = window.setTheme;\r\nexport const getTheme = window.getTheme;\r\nexport const setBrand = window.setBrand;\r\nexport const getBrand = window.getBrand;\r\n\r\nexport const initDropdowns = window.initDropdowns;\r\nexport const initSelects = window.initSelects;\r\nexport const initDatePickers = window.initDatePickers;\r\nexport const initTimePickers = window.initTimePickers;\r\nexport const initSliders = window.initSliders;\r\nexport const initCarousels = window.initCarousels;\r\nexport const initDrawers = window.initDrawers;\r\nexport const initModals = window.initModals;\r\nexport const initDialogs = window.initDialogs;\r\nexport const initNotifications = window.initNotifications;\r\nexport const initMessages = window.initMessages;\r\nexport const initFileUploads = window.initFileUploads;\r\nexport const initCollapses = window.initCollapses;\r\nexport const initColorPickers = window.initColorPickers;\r\nexport const initCalendars = window.initCalendars;\r\nexport const initDynamicTags = window.initDynamicTags;\r\nexport const initImagePreviews = window.initImagePreviews;\r\nexport const initTags = window.initTags;\r\nexport const initStatCards = window.initStatCards;\r\nexport const initHeatmaps = window.initHeatmaps;\r\nexport const initTooltips = window.initTooltips;\r\nexport const initValidation = window.initValidation;\r\nexport const initVirtualLists = window.initVirtualLists;\r\nexport const initIcons = window.initIcons;\r\nexport const initCountdowns = window.initCountdowns;\r\nexport const initNumberInputs = window.initNumberInputs;\r\nexport const initSlideCaptchas = window.initSlideCaptchas;\r\n\r\nexport const setup = window.setup;\r\nexport const ref = window.ref;\r\nexport const reactive = window.reactive;\r\nexport const onMounted = window.onMounted;\r\nexport const onUnmounted = window.onUnmounted;\r\nexport const onUpdated = window.onUpdated;\r\nexport const watch = window.watch;\r\nexport const computed = window.computed;\r\n\r\nexport const KupolaForm = window.KupolaForm;\r\nexport const useForm = window.useForm;\r\nexport const createForm = window.createForm;\r\n\r\nexport const KupolaTestUtils = window.KupolaTestUtils;\r\nexport const testUtils = window.testUtils;\r\n\r\nexport const KupolaI18n = window.KupolaI18n;\r\nexport const kupolaI18n = window.kupolaI18n;\r\nexport const createI18n = window.createI18n;\r\nexport const t = window.t;\r\nexport const n = window.n;\r\nexport const setLocale = window.setLocale;\r\nexport const getLocale = window.getLocale;\r\nexport const formatDate = window.formatDate;\r\nexport const formatNumber = window.formatNumber;\r\nexport const formatCurrency = window.formatCurrency;\r\n\r\nexport const GlobalEventManager = window.GlobalEventManager;\r\nexport const globalEvents = window.globalEvents;\r\nexport const on = window.on;\r\nexport const off = window.off;\r\nexport const once = window.once;\r\nexport const clearScope = window.clearScope;\r\n\r\nexport const KupolaSecurity = window.KupolaSecurity;\r\nexport const kupolaSecurity = window.kupolaSecurity;\r\n\r\nexport const KupolaErrorHandler = window.KupolaErrorHandler;\r\nexport const kupolaErrorHandler = window.kupolaErrorHandler;\r\n\r\nexport const KupolaPerformance = window.KupolaPerformance;\r\nexport const kupolaPerformance = window.kupolaPerformance;\r\n\r\nexport default {\r\n KupolaComponent,\r\n KupolaComponentRegistry,\r\n KupolaRouter,\r\n KupolaHttp,\r\n KupolaStatePersist,\r\n KupolaLifecycle,\r\n KupolaPluginManager,\r\n KupolaDevTools,\r\n KupolaSecurity,\r\n KupolaErrorHandler,\r\n KupolaPerformance,\r\n kupolaRegistry,\r\n kupolaPersist,\r\n kupolaLifecycle,\r\n kupolaPluginManager,\r\n kupolaSecurity,\r\n kupolaErrorHandler,\r\n kupolaPerformance,\r\n KupolaUtils,\r\n createRouter,\r\n createHttp,\r\n createLifecycle,\r\n createStore,\r\n getStore,\r\n registerComponent,\r\n registerLazyComponent,\r\n bootstrapComponents,\r\n defineMixin,\r\n useMixin,\r\n initTheme,\r\n setTheme,\r\n getTheme,\r\n setBrand,\r\n getBrand,\r\n initDropdowns,\r\n initSelects,\r\n initDatePickers,\r\n initTimePickers,\r\n initSliders,\r\n initCarousels,\r\n initDrawers,\r\n initModals,\r\n initDialogs,\r\n initNotifications,\r\n initMessages,\r\n initFileUploads,\r\n initCollapses,\r\n initColorPickers,\r\n initCalendars,\r\n initDynamicTags,\r\n initImagePreviews,\r\n initTags,\r\n initStatCards,\r\n initHeatmaps,\r\n initTooltips,\r\n initValidation,\r\n initVirtualLists,\r\n initIcons,\r\n initCountdowns,\r\n initNumberInputs,\r\n initSlideCaptchas,\r\n setup,\r\n ref,\r\n reactive,\r\n onMounted,\r\n onUnmounted,\r\n onUpdated,\r\n watch,\r\n computed,\r\n KupolaForm,\r\n useForm,\r\n createForm,\r\n KupolaTestUtils,\r\n testUtils,\r\n KupolaI18n,\r\n kupolaI18n,\r\n createI18n,\r\n t,\r\n n,\r\n setLocale,\r\n getLocale,\r\n formatDate,\r\n formatNumber,\r\n formatCurrency,\r\n GlobalEventManager,\r\n globalEvents,\r\n on,\r\n off,\r\n once,\r\n clearScope\r\n};"],"names":["KupolaComponent","element","props","attr","name","value","slots","slotEl","slotName","eventName","data","handler","e","customEvent","cb","newProps","error","newState","result","hookMap","proto","registeredHooks","methodName","lifecyclePhase","phase","errorInfo","applyMixin","componentClass","mixin","key","original","args","module","KupolaComponentRegistry","loader","cached","loadingPromise","mixinNames","root","elements","promises","componentName","initializer","ComponentClass","instance","mutations","mutation","node","child","childInstance","KupolaRouter","options","routes","parentPath","route","fullPath","pathRegex","path","regexStr","replace","from","match","params","index","query","search","pair","url","container","componentElement","parentRoute","rootContainer","parentName","parentElement","component","cacheKey","delta","resolve","transitionDuration","cleanup","style","animationDuration","createRouter","KupolaHttp","config","method","dataKey","retryCount","headers","timeout","cache","controller","requestHeaders","requestConfig","urlObj","intercepted","response","axiosConfig","signal","timeoutPromise","_","reject","timerId","fetchPromise","contentType","useCache","useRetry","file","chunkSize","onProgress","parallel","totalChunks","uploadedChunks","progress","fileId","i","promise","chunkIndex","start","end","chunk","formData","fileName","hash","token","type","ttl","retries","createHttp","ComponentInitializerRegistry","initFn","cleanupFn","dataAttrs","className","classSelectors","selector","classNamePart","kupolaInitializer","require$$0","require$$1","require$$2","require$$3","kupolaCoreModule","kupolaBootstrap","KupolaLifecycle$1","scope","nextState","allowed","handlers","hook","hooks","a","b","h","depends","depName","depHook","emitId","startTime","hookStartTime","hookResult","hookError","hookDuration","totalDuration","stateMap","beforePhase","afterPhase","onReady","targetState","boundary","max","boundaryHandlers","KupolaPluginManager$1","plugin","KupolaLifecycle","pluginName","pluginHooks","unsubscribe","kupolaLifecycle","kupolaPluginManager","KupolaPluginManager","createLifecycle","KupolaUtils","str","c","length","padChar","maxLength","suffix","replacement","template","prefix","times","div","chars","r","arr","defaultValue","arg","separator","item","fromIndex","items","compareFn","order","valA","valB","predicate","fn","initialValue","depth","acc","seen","size","chunks","j","val","arr1","arr2","obj","current","keys","lastKey","map","set","clone","keyField","valueField","obj1","obj2","keys1","keys2","min","precision","factor","nums","decimals","currency","radix","num","now","date","formatStr","year","month","day","hours","minutes","seconds","milliseconds","weekDay","days","newDate","date1","date2","d1","d2","startOfYear","diff","startDay","birthDate","age","minute","hour","week","func","wait","lastArgs","lastThis","lastCallTime","leading","trailing","invokeFunc","leadingEdge","trailingEdge","remainingWait","timeSinceLastCall","limit","inThrottle","regex","cleanStr","sum","alternate","digit","g","len","str1","str2","substring","rules","errors","fieldRules","fieldErrors","rule","message","md5Array","K","S","leftRotate","shift","addPadding","bitLength","lowBytes","highBytes","processBlock","block","state","d","words","AA","BB","CC","DD","f","round","wordIndex","temp","paddedMessage","word","rightRotate","s0","s1","S1","ch","temp1","S0","maj","temp2","bytes","byte1","byte2","byte3","enc1","enc2","enc3","enc4","crossOrigin","img","urls","results","async","defer","script","media","link","fontFamily","src","weight","fontFace","TrieNode","PathTrie","parts","part","collectKeys","n","REACTIVE_SYMBOLS","KupolaDataBind","target","receiver","oldValue","parentKey","proxy","updatedKeys","subKey","subValue","dep","k","silent","parent","callback","binding","display","deps","prop","values","storageType","debounce","version","encrypt","encryptionKey","storage","newValue","dataToStore","serialized","e2","testKey","maxAge","text","ciphertext","persisted","stored","parsed","decrypted","snapshot","snapshotIndex","formElement","existingHandler","KupolaStore","initialState","payload","action","KupolaStoreManager","store","KupolaEventBus","onceCallback","listener","sel","kupolaData","kupolaEvents","kupolaStoreManager","createStore","getStore","THEME_KEY","BRAND_KEY","BRAND_OPTIONS","getTheme","setTheme","theme","toggleBtn","icon","iconPath","getBrand","setBrand","brandId","brand","brandToggle","brandIcon","brandName","btn","initTheme","savedTheme","savedBrand","newTheme","brandPicker","isHidden","closeBrandPicker","createThemeToggle","scripts","currentScript","scriptPath","createBrandPicker","closeBrandPickerAuto","loadDevTools","urlParams","themeScript","devToolsScript","runInit","readyStateHandler","Dropdown","isOpen","initDropdown","dropdown","cleanupDropdown","Select","option","initSelect","select","cleanupSelect","Datepicker","pickerRect","calendarRect","spaceBelow","spaceAbove","calendarHeight","isVisible","calendar","input","titleEl","daysEl","prevBtn","nextBtn","currentDate","renderCalendar","dayEl","firstDay","daysInMonth","emptyDay","dateStr","today","todayStr","dayClickHandler","prevClickHandler","nextClickHandler","initDatepicker","picker","cleanupDatepicker","Timepicker","panelRect","panelHeight","timeParts","displayHour","displayMinute","updateDisplay","updateInput","selectTimeAndClose","hourGrid","minuteGrid","initTimepicker","cleanupTimepicker","Slider","percentage","el","event","initSlider","slider","cleanupSlider","Carousel","indicator","offset","newIndex","initCarousel","carousel","initCarousels","cleanupCarousel","Drawer","closeBtn","cancelBtn","confirmBtn","initDrawer","drawer","cleanupDrawer","Modal","createModal","title","content","width","onConfirm","onCancel","modal","bodyEl","confirmHandler","cancelHandler","closeAndDestroy","originalClose","initModal","cleanupModal","initModals","Dialog","icons","mask","keydownHandler","close","maskClickHandler","confirmClickHandler","cancelClickHandler","FileUpload","clickHandler","changeHandler","files","dragoverHandler","dragleaveHandler","dropHandler","accept","types","t","fileType","fileIcon","removeBtn","removeHandler","extension","sizes","itemElement","errorElement","reader","previewItem","previewRemoveBtn","previewRemoveHandler","percent","bar","currentChunk","uploadInterval","initFileUpload","cleanupFileUpload","initFileUploads","Collapse","header","isActive","transitionHandler","headerInfo","initCollapse","collapse","cleanupCollapse","initCollapses","ColorPicker","color","colorBtn","initColorPicker","cleanupColorPicker","Calendar","prevHandler","nextHandler","todayHandler","dayStr","initCalendar","cleanupCalendar","initCalendars","DynamicTags","tag","addTag","textNode","tagRemoveHandler","tags","initDynamicTags","cleanupDynamicTags","initDynamicTagsAll","ImagePreview","images","meta","indicators","currentImage","imagePreviewInstance","initImagePreview","trigger","showImagePreview","Tag","closeHandler","textNodes","initTag","cleanupTag","initTags","StatCard","entries","entry","targetValue","duration","startValue","animate","currentTime","elapsed","easeProgress","currentValue","formattedValue","currentWidth","targetWidth","currentWidthValue","direction","trendElement","iconSvg","initStatCard","cleanupStatCard","initStatCards","card","updateStatCard","Heatmap","maxValue","ratio","hex","level","rgb","opacity","months","currentMonth","weeks","firstDayOfWeek","body","currentWeek","weekCount","cellWidth","totalGridWidth","labelsAndGrid","weekdayLabels","weekdayLabelHeight","label","gridContainer","monthLabels","monthInfo","nextMonth","weekSpan","grid","weekColumn","emptyCell","cell","mouseenterHandler","mouseleaveHandler","legend","cells","label2","rect","tooltipWidth","startDate","endDate","initHeatmap","dataAttr","generateMockHeatmapData","info","cleanupHeatmap","initHeatmaps","oneYearAgo","baseValue","createHeatmap","Tooltip","position","tooltipRect","viewportWidth","viewportHeight","left","top","initTooltip","tooltip","cleanupTooltip","KupolaValidator","form","formId","inputs","hasError","valueEl","uploadInstance","forms","allValid","group","formErrors","asyncRules","validatorFunc","groupName","groups","statusElement","loading","submitting","disabled","rulesString","pattern","targetId","customMessage","validator","hasAsyncValidation","isValid","submitBtn","originalText","onSubmit","firstError","activeElement","validateOnInput","this","VirtualList","isHorizontal","scrollOffset","positions","currentPosition","total","itemSize","viewportSize","startIndex","endIndex","visibleData","html","actualIndex","isSelected","hasChanges","actualHeight","dataItem","totalSize","thumbHeight","maxTop","thumbTop","totalHeight","deltaY","newTop","scrollTop","behavior","generateMockVirtualListData","count","titles","titleIndex","randomNum","createVirtualList","initVirtualList","cleanupVirtualList","initVirtualLists","KupolaDevTools$1","button","panel","tab","tabName","storageSubTabs","networkSubTabs","req","statusClass","details","clearBtn","devTools","originalFetch","requestId","requestBody","originalOpen","originalSend","originalOnReadyStateChange","responseText","originalSetItem","originalRemoveItem","styles","isDragging","startX","startY","startLeft","startTop","dx","dy","valueParts","displayValue","initDevTools","KupolaDevTools","global","ATTRS","PATHS","svg","viewBox","render","vb","Countdown","dataEndTime","dataHours","dataMinutes","dataSeconds","distance","initCountdown","cleanupCountdown","initCountdowns","NumberInput","minusHandler","plusHandler","inputHandler","initNumberInput","cleanupNumberInput","initNumberInputs","SlideCaptcha","trackWidth","btnWidth","maxOffset","deltaX","btnOffset","mid","distractor","clientX","clientY","velocity","acceleration","last","dt","prev","prevDt","prevV","pointCountEl","finalX","distractorDiff","targetDiff","speeds","maxSpeed","minSpeed","hasYMovement","p","totalTime","accelerations","onVerified","initSlideCaptchas","captcha","cleanupSlideCaptcha","cleanupAllSlideCaptchas","window","currentSetupContext","SetupContext","refObj","sub","self","source","watcher","trackedPaths","originalGet","getter","update","computedValue","paths","ref","reactive","onMounted","onUnmounted","onUpdated","watch","computed","setup","setupFn","setupContext","prevContext","ctx","KupolaForm","formOrSelector","wrappedHandler","validation","ruleString","fields","allErrors","asyncResult","displayName","valuesArray","radio","dataTransfer","fieldName","useForm","createForm","KupolaTestUtils$1","condition","check","detail","originalNow","originalDate","mockResponses","mock","testId","role","endX","endY","touchStart","touchMove","touchEnd","stateKey","expectedValue","propKey","spy","KupolaTestUtils","KupolaI18n$1","locale","htmlLang","dateObj","number","unit","kupolaI18n","KupolaI18n","createI18n","setLocale","getLocale","formatDate","formatNumber","formatCurrency","GlobalEventManager$1","eventType","wrapper","list","idx","scopeList","s","listenerList","l","onceHandler","scopeListeners","counts","listeners","targetName","globalEvents","GlobalEventManager","on","off","once","clearScope","KupolaSecurity$1","metaTag","allowedTags","allowedAttributes","tempDiv","walk","tagName","attrName","email","phone","char","hasXSS","kupolaSecurity","KupolaSecurity","KupolaErrorHandler$1","context","err","methodNames","originalMethod","kupolaErrorHandler","KupolaErrorHandler","KupolaPerformance$1","paintObserver","entryList","resourceObserver","longTaskObserver","nav","timer","metric","summary","score","fcp","observer","kupolaPerformance","KupolaPerformance","KupolaStatePersist","kupolaRegistry","kupolaPersist","registerComponent","registerLazyComponent","bootstrapComponents","defineMixin","useMixin","initDropdowns","initSelects","initDatePickers","initTimePickers","initSliders","initDrawers","initDialogs","initNotifications","initMessages","initColorPickers","initImagePreviews","initTooltips","initValidation","initIcons","testUtils"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"kupola.esm.js","sources":["../js/kupola-lifecycle.js","../js/utils.js","../js/data-bind.js","../js/theme.js","../js/initializer.js","../js/component.js","../js/registry.js","../js/kupola-core.js","../js/i18n.js","../js/dropdown.js","../js/select.js","../js/datepicker.js","../js/timepicker.js","../js/slider.js","../js/carousel.js","../js/drawer.js","../js/modal.js","../js/dialog.js","../js/notification.js","../js/message.js","../js/fileupload.js","../js/collapse.js","../js/color-picker.js","../js/calendar.js","../js/dynamic-tags.js","../js/image-preview.js","../js/tag.js","../js/statcard.js","../js/heatmap.js","../js/tooltip.js","../js/validation.js","../js/virtual-list.js","../js/icons.js","../js/countdown.js","../js/numberinput.js","../js/slide-captcha.js","../js/form.js","../js/global-events.js","../js/depends.js","../js/table.js","../js/pagination.js","../js/web-components.js"],"sourcesContent":["export class KupolaLifecycle {\r\n constructor(scope = 'app') {\r\n this.scope = scope;\r\n this.hooks = new Map();\r\n this.state = 'created';\r\n this.stateHistory = ['created'];\r\n this.transitions = new Map([\r\n ['created', ['bootstrapped', 'destroyed']],\r\n ['bootstrapped', ['mounted', 'destroyed']],\r\n ['mounted', ['updated', 'unmounted', 'destroyed']],\r\n ['updated', ['updated', 'unmounted', 'destroyed']],\r\n ['unmounted', ['mounted', 'destroyed']],\r\n ['destroyed', []]\r\n ]);\r\n \r\n this.phaseStateMap = {\r\n 'bootstrap': { from: 'created', to: 'bootstrapped' },\r\n 'mount': { from: ['bootstrapped', 'unmounted'], to: 'mounted' },\r\n 'update': { from: ['mounted', 'updated'], to: 'updated' },\r\n 'unmount': { from: ['mounted', 'updated'], to: 'unmounted' },\r\n 'destroy': { from: ['bootstrapped', 'mounted', 'updated', 'unmounted'], to: 'destroyed' }\r\n };\r\n\r\n this.basePhases = ['bootstrap', 'mount', 'update', 'unmount', 'destroy'];\r\n this.allPhases = ['error', 'errorBoundary'];\r\n \r\n this.basePhases.forEach(phase => {\r\n this.allPhases.push(`before${phase.charAt(0).toUpperCase() + phase.slice(1)}`);\r\n this.allPhases.push(phase);\r\n this.allPhases.push(`after${phase.charAt(0).toUpperCase() + phase.slice(1)}`);\r\n });\r\n \r\n this.allPhases.forEach(phase => {\r\n this.hooks.set(phase, []);\r\n });\r\n \r\n this.pendingHooks = new Set();\r\n this.trace = [];\r\n this.errorHandler = null;\r\n this.errorBoundary = null;\r\n this.lastError = null;\r\n this.errorCount = 0;\r\n this.maxErrors = 10;\r\n this._onErrorCallback = null;\r\n }\r\n\r\n _validateTransition(nextState) {\r\n const allowed = this.transitions.get(this.state);\r\n if (!allowed || !allowed.includes(nextState)) {\r\n throw new Error(`Invalid state transition: ${this.state} -> ${nextState}`);\r\n }\r\n return true;\r\n }\r\n\r\n _updateState(nextState) {\r\n this._validateTransition(nextState);\r\n this.state = nextState;\r\n this.stateHistory.push(nextState);\r\n }\r\n\r\n _resetResolved(phase) {\r\n const handlers = this.hooks.get(phase);\r\n if (handlers) {\r\n handlers.forEach(hook => {\r\n hook.resolved = false;\r\n });\r\n }\r\n }\r\n\r\n on(phase, handler, options = {}) {\r\n if (!this.allPhases.includes(phase)) {\r\n throw new Error(`Unknown lifecycle phase: ${phase}`);\r\n }\r\n \r\n const hooks = this.hooks.get(phase);\r\n hooks.push({\r\n handler,\r\n priority: options.priority || 0,\r\n depends: options.depends || [],\r\n name: options.name || handler.name || `anonymous_${hooks.length}`\r\n });\r\n \r\n hooks.sort((a, b) => b.priority - a.priority);\r\n \r\n return () => {\r\n const index = hooks.findIndex(h => h.handler === handler);\r\n if (index > -1) {\r\n hooks.splice(index, 1);\r\n }\r\n };\r\n }\r\n\r\n async _resolveDepends(depends, phase) {\r\n if (!depends || depends.length === 0) return;\r\n \r\n for (const depName of depends) {\r\n const phaseHooks = this.hooks.get(phase);\r\n const depHook = phaseHooks.find(h => h.name === depName);\r\n if (depHook && !depHook.resolved) {\r\n await depHook.handler();\r\n depHook.resolved = true;\r\n }\r\n }\r\n }\r\n\r\n async emit(phase, ...args) {\r\n if (this.state === 'destroyed' && phase !== 'error') return;\r\n \r\n const handlers = this.hooks.get(phase);\r\n if (!handlers || handlers.length === 0) return;\r\n\r\n const emitId = `${phase}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n this.pendingHooks.add(emitId);\r\n\r\n const startTime = performance.now();\r\n \r\n try {\r\n for (const hook of handlers) {\r\n await this._resolveDepends(hook.depends, phase);\r\n \r\n const hookStartTime = performance.now();\r\n let hookResult, hookError;\r\n \r\n try {\r\n hookResult = hook.handler(...args);\r\n if (hookResult instanceof Promise) {\r\n await hookResult;\r\n }\r\n hook.resolved = true;\r\n } catch (error) {\r\n hookError = error;\r\n console.error(`[KupolaLifecycle] Error in ${phase} hook \"${hook.name}\":`, error);\r\n \r\n if (phase !== 'error') {\r\n await this._handleError({ phase, hook: hook.name, error, args });\r\n }\r\n }\r\n \r\n const hookDuration = performance.now() - hookStartTime;\r\n \r\n this.trace.push({\r\n emitId,\r\n phase,\r\n hookName: hook.name,\r\n duration: hookDuration,\r\n status: hookError ? 'error' : 'success',\r\n error: hookError ? hookError.message : null,\r\n timestamp: Date.now()\r\n });\r\n }\r\n \r\n const totalDuration = performance.now() - startTime;\r\n console.debug(`[KupolaLifecycle] ${phase} completed in ${totalDuration.toFixed(2)}ms (${this.scope})`);\r\n } finally {\r\n this.pendingHooks.delete(emitId);\r\n }\r\n }\r\n\r\n async runPhase(phase, ...args) {\r\n if (!this.basePhases.includes(phase)) {\r\n throw new Error(`Unknown base phase: ${phase}`);\r\n }\r\n\r\n const stateMap = this.phaseStateMap[phase];\r\n if (stateMap) {\r\n if (Array.isArray(stateMap.from)) {\r\n if (!stateMap.from.includes(this.state)) {\r\n throw new Error(`Cannot ${phase} from state ${this.state}, expected one of: ${stateMap.from.join(', ')}`);\r\n }\r\n } else {\r\n if (this.state !== stateMap.from) {\r\n throw new Error(`Cannot ${phase} from state ${this.state}, expected ${stateMap.from}`);\r\n }\r\n }\r\n }\r\n\r\n const beforePhase = `before${phase.charAt(0).toUpperCase() + phase.slice(1)}`;\r\n const afterPhase = `after${phase.charAt(0).toUpperCase() + phase.slice(1)}`;\r\n \r\n this._resetResolved(beforePhase);\r\n this._resetResolved(phase);\r\n this._resetResolved(afterPhase);\r\n\r\n if (this.allPhases.includes(beforePhase)) {\r\n await this.emit(beforePhase, ...args);\r\n }\r\n\r\n await this.emit(phase, ...args);\r\n\r\n if (stateMap) {\r\n this._updateState(stateMap.to);\r\n }\r\n\r\n if (this.allPhases.includes(afterPhase)) {\r\n await this.emit(afterPhase, ...args);\r\n }\r\n }\r\n\r\n async bootstrap(...args) {\r\n await this.runPhase('bootstrap', ...args);\r\n }\r\n\r\n async _waitForDOMReady() {\r\n return new Promise((resolve) => {\r\n if (document.readyState === 'complete' || document.readyState === 'interactive') {\r\n resolve();\r\n return;\r\n }\r\n \r\n const onReady = () => {\r\n document.removeEventListener('DOMContentLoaded', onReady);\r\n window.removeEventListener('load', onReady);\r\n resolve();\r\n };\r\n \r\n document.addEventListener('DOMContentLoaded', onReady);\r\n window.addEventListener('load', onReady);\r\n });\r\n }\r\n\r\n async mount(...args) {\r\n await this.runPhase('mount', ...args);\r\n }\r\n\r\n async mountWithDOMReady(...args) {\r\n await this._waitForDOMReady();\r\n await this.runPhase('mount', ...args);\r\n }\r\n\r\n async update(...args) {\r\n await this.runPhase('update', ...args);\r\n }\r\n\r\n async unmount(...args) {\r\n await this.runPhase('unmount', ...args);\r\n }\r\n\r\n async destroy(...args) {\r\n await this.runPhase('destroy', ...args);\r\n \r\n this.hooks.forEach(handlers => {\r\n handlers.length = 0;\r\n });\r\n }\r\n\r\n getPhaseHandlers(phase) {\r\n return this.hooks.get(phase) || [];\r\n }\r\n\r\n hasHandlers(phase) {\r\n const handlers = this.hooks.get(phase);\r\n return handlers && handlers.length > 0;\r\n }\r\n\r\n getTrace() {\r\n return [...this.trace];\r\n }\r\n\r\n clearTrace() {\r\n this.trace = [];\r\n }\r\n\r\n getState() {\r\n return this.state;\r\n }\r\n\r\n getStateHistory() {\r\n return [...this.stateHistory];\r\n }\r\n\r\n isInState(targetState) {\r\n return this.state === targetState;\r\n }\r\n\r\n onError(handler) {\r\n this._onErrorCallback = handler;\r\n return this.on('error', handler);\r\n }\r\n\r\n setErrorBoundary(boundary) {\r\n this.errorBoundary = boundary;\r\n return this.on('errorBoundary', (errorInfo) => {\r\n if (typeof boundary === 'function') {\r\n return boundary(errorInfo);\r\n }\r\n return null;\r\n });\r\n }\r\n\r\n setMaxErrors(max) {\r\n this.maxErrors = max;\r\n }\r\n\r\n getErrorCount() {\r\n return this.errorCount;\r\n }\r\n\r\n getLastError() {\r\n return this.lastError;\r\n }\r\n\r\n resetErrorCount() {\r\n this.errorCount = 0;\r\n this.lastError = null;\r\n }\r\n\r\n async _handleError(errorInfo) {\r\n this.errorCount++;\r\n this.lastError = errorInfo.error;\r\n\r\n if (this.errorCount >= this.maxErrors) {\r\n console.error(`[KupolaLifecycle] Error limit reached (${this.maxErrors}), stopping error handling`);\r\n return;\r\n }\r\n\r\n await this.emit('error', errorInfo);\r\n\r\n if (typeof this._onErrorCallback === 'function') {\r\n try {\r\n await this._onErrorCallback(errorInfo);\r\n } catch (e) {\r\n console.error('[KupolaLifecycle] Error in onError callback:', e);\r\n }\r\n }\r\n\r\n const boundaryHandlers = this.hooks.get('errorBoundary');\r\n if (boundaryHandlers && boundaryHandlers.length > 0) {\r\n for (const hook of boundaryHandlers) {\r\n try {\r\n const result = hook.handler(errorInfo);\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n if (result === 'handled') {\r\n console.debug(`[KupolaLifecycle] Error handled by errorBoundary hook \"${hook.name}\"`);\r\n return;\r\n }\r\n } catch (e) {\r\n console.error(`[KupolaLifecycle] Error in errorBoundary hook \"${hook.name}\":`, e);\r\n }\r\n }\r\n }\r\n\r\n console.error(`[KupolaLifecycle] Unhandled error in ${errorInfo.phase}:`, errorInfo.error);\r\n }\r\n}\r\n\r\nexport class KupolaPluginManager {\r\n constructor() {\r\n this.plugins = new Map();\r\n this.enabledPlugins = new Set();\r\n this.pluginHooks = new Map();\r\n }\r\n\r\n register(name, plugin) {\r\n if (this.plugins.has(name)) {\r\n console.warn(`Plugin ${name} already registered, overriding`);\r\n }\r\n \r\n this.plugins.set(name, {\r\n ...plugin,\r\n name,\r\n enabled: false,\r\n instance: null,\r\n lifecycle: new KupolaLifecycle(`plugin:${name}`)\r\n });\r\n }\r\n\r\n async enable(name) {\r\n const plugin = this.plugins.get(name);\r\n if (!plugin) {\r\n throw new Error(`Plugin ${name} not found`);\r\n }\r\n \r\n if (plugin.enabled) return;\r\n \r\n try {\r\n await plugin.lifecycle.bootstrap();\r\n \r\n if (plugin.install) {\r\n plugin.instance = await plugin.install();\r\n }\r\n plugin.enabled = true;\r\n this.enabledPlugins.add(name);\r\n \r\n await plugin.lifecycle.mount();\r\n \r\n if (plugin.hooks) {\r\n this._registerPluginHooks(name, plugin.hooks);\r\n }\r\n \r\n console.log(`Plugin ${name} enabled`);\r\n } catch (error) {\r\n console.error(`Failed to enable plugin ${name}:`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n async disable(name) {\r\n const plugin = this.plugins.get(name);\r\n if (!plugin || !plugin.enabled) return;\r\n \r\n try {\r\n await plugin.lifecycle.unmount();\r\n \r\n if (plugin.uninstall) {\r\n await plugin.uninstall(plugin.instance);\r\n }\r\n \r\n if (plugin.hooks) {\r\n this._unregisterPluginHooks(name);\r\n }\r\n \r\n plugin.enabled = false;\r\n this.enabledPlugins.delete(name);\r\n plugin.instance = null;\r\n \r\n await plugin.lifecycle.destroy();\r\n \r\n console.log(`Plugin ${name} disabled`);\r\n } catch (error) {\r\n console.error(`Failed to disable plugin ${name}:`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n get(name) {\r\n const plugin = this.plugins.get(name);\r\n return plugin?.instance || null;\r\n }\r\n\r\n getAll() {\r\n const result = {};\r\n this.plugins.forEach((plugin, name) => {\r\n result[name] = {\r\n name: plugin.name,\r\n enabled: plugin.enabled,\r\n instance: plugin.instance,\r\n state: plugin.lifecycle.getState()\r\n };\r\n });\r\n return result;\r\n }\r\n\r\n getEnabled() {\r\n const result = {};\r\n this.enabledPlugins.forEach(name => {\r\n const plugin = this.plugins.get(name);\r\n if (plugin) {\r\n result[name] = plugin.instance;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n async enableAll() {\r\n const promises = [];\r\n this.plugins.forEach((_, name) => {\r\n promises.push(this.enable(name));\r\n });\r\n await Promise.all(promises);\r\n }\r\n\r\n async disableAll() {\r\n const promises = [];\r\n this.enabledPlugins.forEach(name => {\r\n promises.push(this.disable(name));\r\n });\r\n await Promise.all(promises);\r\n }\r\n\r\n _registerPluginHooks(pluginName, hooks) {\r\n if (!this.pluginHooks.has(pluginName)) {\r\n this.pluginHooks.set(pluginName, []);\r\n }\r\n \r\n const pluginHooks = this.pluginHooks.get(pluginName);\r\n \r\n Object.keys(hooks).forEach(phase => {\r\n const unsubscribe = typeof window !== 'undefined' && window.kupolaLifecycle?.on(phase, hooks[phase], { name: `${pluginName}:${phase}` });\r\n if (unsubscribe) {\r\n pluginHooks.push({ phase, unsubscribe });\r\n }\r\n });\r\n }\r\n\r\n _unregisterPluginHooks(pluginName) {\r\n const pluginHooks = this.pluginHooks.get(pluginName);\r\n if (!pluginHooks) return;\r\n \r\n pluginHooks.forEach(({ unsubscribe }) => {\r\n if (unsubscribe) unsubscribe();\r\n });\r\n \r\n this.pluginHooks.delete(pluginName);\r\n }\r\n}\r\n\r\nexport const kupolaLifecycle = new KupolaLifecycle('app');\r\nexport const kupolaPluginManager = new KupolaPluginManager();\r\n\r\nexport function createLifecycle(scope = 'app') {\r\n return new KupolaLifecycle(scope);\r\n}\r\n\r\nif (typeof window !== 'undefined') {\r\n window.KupolaLifecycle = KupolaLifecycle;\r\n window.KupolaPluginManager = KupolaPluginManager;\r\n window.kupolaLifecycle = kupolaLifecycle;\r\n window.kupolaPluginManager = kupolaPluginManager;\r\n window.createLifecycle = createLifecycle;\r\n}","const KupolaUtils = {\r\n string: {\r\n trim(str) {\r\n return str ? str.trim() : '';\r\n },\r\n trimLeft(str) {\r\n return str ? str.replace(/^\\s+/, '') : '';\r\n },\r\n trimRight(str) {\r\n return str ? str.replace(/\\s+$/, '') : '';\r\n },\r\n toUpperCase(str) {\r\n return str ? str.toUpperCase() : '';\r\n },\r\n toLowerCase(str) {\r\n return str ? str.toLowerCase() : '';\r\n },\r\n capitalize(str) {\r\n if (!str) return '';\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n },\r\n camelize(str) {\r\n if (!str) return '';\r\n return str.replace(/-(\\w)/g, (_, c) => c ? c.toUpperCase() : '');\r\n },\r\n hyphenate(str) {\r\n if (!str) return '';\r\n return str.replace(/([A-Z])/g, '-$1').toLowerCase().replace(/^-/, '');\r\n },\r\n padStart(str, length, padChar = ' ') {\r\n return (String(str) || '').padStart(length, padChar);\r\n },\r\n padEnd(str, length, padChar = ' ') {\r\n return (String(str) || '').padEnd(length, padChar);\r\n },\r\n truncate(str, maxLength, suffix = '...') {\r\n if (!str || str.length <= maxLength) return str || '';\r\n return str.slice(0, maxLength) + suffix;\r\n },\r\n replaceAll(str, search, replacement) {\r\n if (!str) return '';\r\n return str.split(search).join(replacement);\r\n },\r\n format(template, data) {\r\n if (!template) return '';\r\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => data[key] !== undefined ? data[key] : `{{${key}}}`);\r\n },\r\n startsWith(str, prefix) {\r\n return (str || '').startsWith(prefix);\r\n },\r\n endsWith(str, suffix) {\r\n return (str || '').endsWith(suffix);\r\n },\r\n includes(str, search) {\r\n return (str || '').includes(search);\r\n },\r\n repeat(str, times) {\r\n return (str || '').repeat(times);\r\n },\r\n reverse(str) {\r\n return (str || '').split('').reverse().join('');\r\n },\r\n countOccurrences(str, search) {\r\n if (!str || !search) return 0;\r\n return str.split(search).length - 1;\r\n },\r\n escapeHtml(str) {\r\n if (!str) return '';\r\n const div = document.createElement('div');\r\n div.textContent = str;\r\n return div.innerHTML;\r\n },\r\n unescapeHtml(str) {\r\n if (!str) return '';\r\n const div = document.createElement('div');\r\n div.innerHTML = str;\r\n return div.textContent;\r\n },\r\n generateRandom(length = 8) {\r\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n let result = '';\r\n for (let i = 0; i < length; i++) {\r\n result += chars.charAt(Math.floor(Math.random() * chars.length));\r\n }\r\n return result;\r\n },\r\n generateUUID() {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = Math.random() * 16 | 0;\r\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n }\r\n },\r\n\r\n array: {\r\n isArray(arr) {\r\n return Array.isArray(arr);\r\n },\r\n isEmpty(arr) {\r\n return !arr || arr.length === 0;\r\n },\r\n size(arr) {\r\n return arr ? arr.length : 0;\r\n },\r\n first(arr, defaultValue) {\r\n return arr && arr.length > 0 ? arr[0] : defaultValue;\r\n },\r\n last(arr, defaultValue) {\r\n return arr && arr.length > 0 ? arr[arr.length - 1] : defaultValue;\r\n },\r\n get(arr, index, defaultValue) {\r\n return arr && arr[index] !== undefined ? arr[index] : defaultValue;\r\n },\r\n slice(arr, start, end) {\r\n return arr ? arr.slice(start, end) : [];\r\n },\r\n concat(...args) {\r\n return args.reduce((result, arg) => result.concat(arg || []), []);\r\n },\r\n join(arr, separator = ',') {\r\n return arr ? arr.join(separator) : '';\r\n },\r\n indexOf(arr, item, fromIndex = 0) {\r\n return arr ? arr.indexOf(item, fromIndex) : -1;\r\n },\r\n lastIndexOf(arr, item, fromIndex) {\r\n return arr ? arr.lastIndexOf(item, fromIndex) : -1;\r\n },\r\n includes(arr, item) {\r\n return arr ? arr.includes(item) : false;\r\n },\r\n push(arr, ...items) {\r\n if (arr) arr.push(...items);\r\n return arr;\r\n },\r\n pop(arr) {\r\n return arr ? arr.pop() : undefined;\r\n },\r\n shift(arr) {\r\n return arr ? arr.shift() : undefined;\r\n },\r\n unshift(arr, ...items) {\r\n if (arr) arr.unshift(...items);\r\n return arr;\r\n },\r\n remove(arr, item) {\r\n if (!arr) return arr;\r\n const index = arr.indexOf(item);\r\n if (index > -1) arr.splice(index, 1);\r\n return arr;\r\n },\r\n removeAt(arr, index) {\r\n if (!arr || index < 0 || index >= arr.length) return arr;\r\n arr.splice(index, 1);\r\n return arr;\r\n },\r\n insert(arr, index, item) {\r\n if (!arr) return arr;\r\n arr.splice(index, 0, item);\r\n return arr;\r\n },\r\n reverse(arr) {\r\n return arr ? arr.slice().reverse() : [];\r\n },\r\n sort(arr, compareFn) {\r\n return arr ? arr.slice().sort(compareFn) : [];\r\n },\r\n sortBy(arr, key, order = 'asc') {\r\n if (!arr) return [];\r\n return arr.slice().sort((a, b) => {\r\n const valA = typeof a === 'object' ? a[key] : a;\r\n const valB = typeof b === 'object' ? b[key] : b;\r\n if (valA < valB) return order === 'asc' ? -1 : 1;\r\n if (valA > valB) return order === 'asc' ? 1 : -1;\r\n return 0;\r\n });\r\n },\r\n filter(arr, predicate) {\r\n return arr ? arr.filter(predicate) : [];\r\n },\r\n map(arr, fn) {\r\n return arr ? arr.map(fn) : [];\r\n },\r\n reduce(arr, fn, initialValue) {\r\n return arr ? arr.reduce(fn, initialValue) : initialValue;\r\n },\r\n forEach(arr, fn) {\r\n if (arr) arr.forEach(fn);\r\n },\r\n every(arr, predicate) {\r\n return arr ? arr.every(predicate) : true;\r\n },\r\n some(arr, predicate) {\r\n return arr ? arr.some(predicate) : false;\r\n },\r\n find(arr, predicate) {\r\n return arr ? arr.find(predicate) : undefined;\r\n },\r\n findIndex(arr, predicate) {\r\n return arr ? arr.findIndex(predicate) : -1;\r\n },\r\n flat(arr, depth = 1) {\r\n return arr ? arr.flat(depth) : [];\r\n },\r\n flattenDeep(arr) {\r\n return arr ? arr.reduce((acc, item) => \r\n Array.isArray(item) ? acc.concat(this.flattenDeep(item)) : acc.concat(item), []) : [];\r\n },\r\n unique(arr) {\r\n return arr ? [...new Set(arr)] : [];\r\n },\r\n uniqueBy(arr, key) {\r\n if (!arr) return [];\r\n const seen = new Set();\r\n return arr.filter(item => {\r\n const value = typeof item === 'object' ? item[key] : item;\r\n if (seen.has(value)) return false;\r\n seen.add(value);\r\n return true;\r\n });\r\n },\r\n chunk(arr, size) {\r\n if (!arr || size <= 0) return [];\r\n const chunks = [];\r\n for (let i = 0; i < arr.length; i += size) {\r\n chunks.push(arr.slice(i, i + size));\r\n }\r\n return chunks;\r\n },\r\n shuffle(arr) {\r\n if (!arr) return [];\r\n const result = arr.slice();\r\n for (let i = result.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [result[i], result[j]] = [result[j], result[i]];\r\n }\r\n return result;\r\n },\r\n sum(arr) {\r\n return arr ? arr.reduce((acc, val) => acc + (Number(val) || 0), 0) : 0;\r\n },\r\n average(arr) {\r\n if (!arr || arr.length === 0) return 0;\r\n return this.sum(arr) / arr.length;\r\n },\r\n max(arr) {\r\n return arr && arr.length > 0 ? Math.max(...arr) : -Infinity;\r\n },\r\n min(arr) {\r\n return arr && arr.length > 0 ? Math.min(...arr) : Infinity;\r\n },\r\n intersection(...args) {\r\n if (args.length === 0) return [];\r\n return args.reduce((result, arr) => \r\n result.filter(item => arr && arr.includes(item)));\r\n },\r\n union(...args) {\r\n return [...new Set(args.flat().filter(Boolean))];\r\n },\r\n difference(arr1, arr2) {\r\n return arr1 ? arr1.filter(item => !arr2 || !arr2.includes(item)) : [];\r\n },\r\n zip(...args) {\r\n if (args.length === 0) return [];\r\n const maxLength = Math.max(...args.map(arr => arr ? arr.length : 0));\r\n return Array.from({ length: maxLength }, (_, i) => \r\n args.map(arr => arr && arr[i]));\r\n }\r\n },\r\n\r\n object: {\r\n isObject(obj) {\r\n return obj !== null && typeof obj === 'object' && !Array.isArray(obj);\r\n },\r\n isEmpty(obj) {\r\n if (!obj || typeof obj !== 'object') return true;\r\n return Object.keys(obj).length === 0;\r\n },\r\n keys(obj) {\r\n return obj ? Object.keys(obj) : [];\r\n },\r\n values(obj) {\r\n return obj ? Object.values(obj) : [];\r\n },\r\n entries(obj) {\r\n return obj ? Object.entries(obj) : [];\r\n },\r\n has(obj, key) {\r\n return obj ? Object.prototype.hasOwnProperty.call(obj, key) : false;\r\n },\r\n get(obj, path, defaultValue) {\r\n if (!obj) return defaultValue;\r\n const keys = path.split('.');\r\n return keys.reduce((current, key) => current && current[key], obj) || defaultValue;\r\n },\r\n set(obj, path, value) {\r\n if (!obj || typeof obj !== 'object') return obj;\r\n const keys = path.split('.');\r\n const lastKey = keys.pop();\r\n let current = obj;\r\n keys.forEach(key => {\r\n if (!current[key]) current[key] = {};\r\n current = current[key];\r\n });\r\n current[lastKey] = value;\r\n return obj;\r\n },\r\n pick(obj, keys) {\r\n if (!obj) return {};\r\n return keys.reduce((result, key) => {\r\n if (obj[key] !== undefined) result[key] = obj[key];\r\n return result;\r\n }, {});\r\n },\r\n omit(obj, keys) {\r\n if (!obj) return {};\r\n return Object.keys(obj).reduce((result, key) => {\r\n if (!keys.includes(key)) result[key] = obj[key];\r\n return result;\r\n }, {});\r\n },\r\n merge(...args) {\r\n return args.reduce((result, obj) => {\r\n if (obj && typeof obj === 'object') {\r\n Object.keys(obj).forEach(key => {\r\n if (this.isObject(obj[key]) && this.isObject(result[key])) {\r\n result[key] = this.merge(result[key], obj[key]);\r\n } else {\r\n result[key] = obj[key];\r\n }\r\n });\r\n }\r\n return result;\r\n }, {});\r\n },\r\n clone(obj) {\r\n return obj ? JSON.parse(JSON.stringify(obj)) : obj;\r\n },\r\n deepClone(obj, hash = new WeakMap()) {\r\n if (!obj || typeof obj !== 'object') return obj;\r\n if (hash.has(obj)) return hash.get(obj);\r\n if (obj instanceof Date) return new Date(obj);\r\n if (obj instanceof RegExp) return new RegExp(obj);\r\n if (obj instanceof Map) {\r\n const map = new Map();\r\n hash.set(obj, map);\r\n obj.forEach((val, key) => map.set(key, this.deepClone(val, hash)));\r\n return map;\r\n }\r\n if (obj instanceof Set) {\r\n const set = new Set();\r\n hash.set(obj, set);\r\n obj.forEach(val => set.add(this.deepClone(val, hash)));\r\n return set;\r\n }\r\n if (Array.isArray(obj)) {\r\n const arr = [];\r\n hash.set(obj, arr);\r\n obj.forEach(item => arr.push(this.deepClone(item, hash)));\r\n return arr;\r\n }\r\n const clone = {};\r\n hash.set(obj, clone);\r\n Object.keys(obj).forEach(key => {\r\n clone[key] = this.deepClone(obj[key], hash);\r\n });\r\n return clone;\r\n },\r\n forEach(obj, fn) {\r\n if (!obj) return;\r\n Object.keys(obj).forEach(key => fn(obj[key], key, obj));\r\n },\r\n map(obj, fn) {\r\n if (!obj) return {};\r\n const result = {};\r\n Object.keys(obj).forEach(key => {\r\n result[key] = fn(obj[key], key, obj);\r\n });\r\n return result;\r\n },\r\n filter(obj, fn) {\r\n if (!obj) return {};\r\n const result = {};\r\n Object.keys(obj).forEach(key => {\r\n if (fn(obj[key], key, obj)) result[key] = obj[key];\r\n });\r\n return result;\r\n },\r\n reduce(obj, fn, initialValue) {\r\n if (!obj) return initialValue;\r\n return Object.keys(obj).reduce((acc, key) => \r\n fn(acc, obj[key], key, obj), initialValue);\r\n },\r\n toArray(obj) {\r\n if (!obj) return [];\r\n return Object.keys(obj).map(key => ({ key, value: obj[key] }));\r\n },\r\n fromArray(arr, keyField, valueField) {\r\n if (!arr) return {};\r\n return arr.reduce((result, item) => {\r\n const key = typeof item === 'object' ? item[keyField] : item;\r\n const value = valueField ? item[valueField] : item;\r\n if (key !== undefined) result[key] = value;\r\n return result;\r\n }, {});\r\n },\r\n size(obj) {\r\n return obj ? Object.keys(obj).length : 0;\r\n },\r\n invert(obj) {\r\n if (!obj) return {};\r\n const result = {};\r\n Object.keys(obj).forEach(key => {\r\n result[obj[key]] = key;\r\n });\r\n return result;\r\n },\r\n isEqual(obj1, obj2) {\r\n if (obj1 === obj2) return true;\r\n if (!obj1 || !obj2 || typeof obj1 !== 'object' || typeof obj2 !== 'object') return false;\r\n const keys1 = Object.keys(obj1);\r\n const keys2 = Object.keys(obj2);\r\n if (keys1.length !== keys2.length) return false;\r\n return keys1.every(key => this.isEqual(obj1[key], obj2[key]));\r\n },\r\n freeze(obj) {\r\n if (!obj) return obj;\r\n Object.freeze(obj);\r\n Object.keys(obj).forEach(key => {\r\n if (typeof obj[key] === 'object') this.freeze(obj[key]);\r\n });\r\n return obj;\r\n },\r\n seal(obj) {\r\n return obj ? Object.seal(obj) : obj;\r\n }\r\n },\r\n\r\n number: {\r\n isNumber(val) {\r\n return typeof val === 'number' && !isNaN(val);\r\n },\r\n isInteger(val) {\r\n return Number.isInteger(val);\r\n },\r\n isFloat(val) {\r\n return this.isNumber(val) && !Number.isInteger(val);\r\n },\r\n isPositive(val) {\r\n return this.isNumber(val) && val > 0;\r\n },\r\n isNegative(val) {\r\n return this.isNumber(val) && val < 0;\r\n },\r\n isZero(val) {\r\n return this.isNumber(val) && val === 0;\r\n },\r\n clamp(val, min, max) {\r\n if (!this.isNumber(val)) return val;\r\n return Math.min(Math.max(val, min), max);\r\n },\r\n round(val, precision = 0) {\r\n if (!this.isNumber(val)) return val;\r\n const factor = Math.pow(10, precision);\r\n return Math.round(val * factor) / factor;\r\n },\r\n floor(val) {\r\n return this.isNumber(val) ? Math.floor(val) : val;\r\n },\r\n ceil(val) {\r\n return this.isNumber(val) ? Math.ceil(val) : val;\r\n },\r\n abs(val) {\r\n return this.isNumber(val) ? Math.abs(val) : val;\r\n },\r\n min(...args) {\r\n const nums = args.filter(this.isNumber);\r\n return nums.length > 0 ? Math.min(...nums) : undefined;\r\n },\r\n max(...args) {\r\n const nums = args.filter(this.isNumber);\r\n return nums.length > 0 ? Math.max(...nums) : undefined;\r\n },\r\n sum(...args) {\r\n const nums = args.flat().filter(this.isNumber);\r\n return nums.reduce((acc, val) => acc + val, 0);\r\n },\r\n average(...args) {\r\n const nums = args.flat().filter(this.isNumber);\r\n return nums.length > 0 ? this.sum(nums) / nums.length : 0;\r\n },\r\n random(min = 0, max = 1) {\r\n return Math.random() * (max - min) + min;\r\n },\r\n randomInt(min, max) {\r\n return Math.floor(this.random(min, max + 1));\r\n },\r\n format(val, decimals = 2) {\r\n if (!this.isNumber(val)) return String(val);\r\n return val.toFixed(decimals);\r\n },\r\n formatCurrency(val, currency = 'CNY', decimals = 2) {\r\n if (!this.isNumber(val)) return String(val);\r\n const formatter = new Intl.NumberFormat('zh-CN', {\r\n style: 'currency',\r\n currency,\r\n minimumFractionDigits: decimals,\r\n maximumFractionDigits: decimals\r\n });\r\n return formatter.format(val);\r\n },\r\n formatPercent(val, decimals = 0) {\r\n if (!this.isNumber(val)) return String(val);\r\n return `${(val * 100).toFixed(decimals)}%`;\r\n },\r\n toFixed(val, decimals = 0) {\r\n if (!this.isNumber(val)) return String(val);\r\n return val.toFixed(decimals);\r\n },\r\n toPrecision(val, precision = 6) {\r\n if (!this.isNumber(val)) return String(val);\r\n return val.toPrecision(precision);\r\n },\r\n isNaN(val) {\r\n return Number.isNaN(val);\r\n },\r\n isFinite(val) {\r\n return Number.isFinite(val);\r\n },\r\n parseInt(val, radix = 10) {\r\n return Number.parseInt(val, radix);\r\n },\r\n parseFloat(val) {\r\n return Number.parseFloat(val);\r\n },\r\n toNumber(val, defaultValue = 0) {\r\n const num = Number(val);\r\n return isNaN(num) ? defaultValue : num;\r\n },\r\n safeDivide(a, b, defaultValue = 0) {\r\n if (!this.isNumber(a) || !this.isNumber(b) || b === 0) return defaultValue;\r\n return a / b;\r\n },\r\n safeMultiply(...args) {\r\n return args.reduce((result, val) => {\r\n if (!this.isNumber(result) || !this.isNumber(val)) return 0;\r\n return result * val;\r\n }, 1);\r\n }\r\n },\r\n\r\n date: {\r\n now() {\r\n return Date.now();\r\n },\r\n today() {\r\n const now = new Date();\r\n now.setHours(0, 0, 0, 0);\r\n return now;\r\n },\r\n tomorrow() {\r\n const date = this.today();\r\n date.setDate(date.getDate() + 1);\r\n return date;\r\n },\r\n yesterday() {\r\n const date = this.today();\r\n date.setDate(date.getDate() - 1);\r\n return date;\r\n },\r\n isDate(val) {\r\n return val instanceof Date && !isNaN(val.getTime());\r\n },\r\n isValid(date) {\r\n return this.isDate(date);\r\n },\r\n parse(str) {\r\n const date = new Date(str);\r\n return this.isValid(date) ? date : null;\r\n },\r\n format(date, formatStr = 'YYYY-MM-DD HH:mm:ss') {\r\n if (!this.isDate(date)) return '';\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const hours = String(date.getHours()).padStart(2, '0');\r\n const minutes = String(date.getMinutes()).padStart(2, '0');\r\n const seconds = String(date.getSeconds()).padStart(2, '0');\r\n const milliseconds = String(date.getMilliseconds()).padStart(3, '0');\r\n const weekDays = ['日', '一', '二', '三', '四', '五', '六'];\r\n const weekDay = weekDays[date.getDay()];\r\n \r\n return formatStr\r\n .replace('YYYY', year)\r\n .replace('MM', month)\r\n .replace('DD', day)\r\n .replace('HH', hours)\r\n .replace('mm', minutes)\r\n .replace('ss', seconds)\r\n .replace('SSS', milliseconds)\r\n .replace('D', date.getDate())\r\n .replace('M', date.getMonth() + 1)\r\n .replace('H', date.getHours())\r\n .replace('m', date.getMinutes())\r\n .replace('s', date.getSeconds())\r\n .replace('W', weekDay);\r\n },\r\n toISO(date) {\r\n return this.isDate(date) ? date.toISOString() : '';\r\n },\r\n toUTC(date) {\r\n return this.isDate(date) ? new Date(date.toUTCString()) : null;\r\n },\r\n addDays(date, days) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setDate(newDate.getDate() + days);\r\n return newDate;\r\n },\r\n addHours(date, hours) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setHours(newDate.getHours() + hours);\r\n return newDate;\r\n },\r\n addMinutes(date, minutes) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setMinutes(newDate.getMinutes() + minutes);\r\n return newDate;\r\n },\r\n addSeconds(date, seconds) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setSeconds(newDate.getSeconds() + seconds);\r\n return newDate;\r\n },\r\n diffDays(date1, date2) {\r\n if (!this.isDate(date1) || !this.isDate(date2)) return 0;\r\n const d1 = this.today();\r\n const d2 = this.today();\r\n d1.setTime(date1.getTime());\r\n d2.setTime(date2.getTime());\r\n return Math.floor((d1.getTime() - d2.getTime()) / (1000 * 60 * 60 * 24));\r\n },\r\n diffHours(date1, date2) {\r\n if (!this.isDate(date1) || !this.isDate(date2)) return 0;\r\n return Math.floor((date1.getTime() - date2.getTime()) / (1000 * 60 * 60));\r\n },\r\n diffMinutes(date1, date2) {\r\n if (!this.isDate(date1) || !this.isDate(date2)) return 0;\r\n return Math.floor((date1.getTime() - date2.getTime()) / (1000 * 60));\r\n },\r\n diffSeconds(date1, date2) {\r\n if (!this.isDate(date1) || !this.isDate(date2)) return 0;\r\n return Math.floor((date1.getTime() - date2.getTime()) / 1000);\r\n },\r\n isToday(date) {\r\n if (!this.isDate(date)) return false;\r\n return this.diffDays(date, this.today()) === 0;\r\n },\r\n isYesterday(date) {\r\n if (!this.isDate(date)) return false;\r\n return this.diffDays(date, this.today()) === -1;\r\n },\r\n isTomorrow(date) {\r\n if (!this.isDate(date)) return false;\r\n return this.diffDays(date, this.today()) === 1;\r\n },\r\n isFuture(date) {\r\n if (!this.isDate(date)) return false;\r\n return date.getTime() > this.now();\r\n },\r\n isPast(date) {\r\n if (!this.isDate(date)) return false;\r\n return date.getTime() < this.now();\r\n },\r\n isLeapYear(date) {\r\n if (!this.isDate(date)) return false;\r\n const year = date.getFullYear();\r\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\r\n },\r\n getDaysInMonth(date) {\r\n if (!this.isDate(date)) return 0;\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n return new Date(year, month + 1, 0).getDate();\r\n },\r\n getWeekOfYear(date) {\r\n if (!this.isDate(date)) return 0;\r\n const startOfYear = new Date(date.getFullYear(), 0, 1);\r\n const diff = date.getTime() - startOfYear.getTime();\r\n return Math.ceil(diff / (1000 * 60 * 60 * 24 * 7));\r\n },\r\n getQuarter(date) {\r\n if (!this.isDate(date)) return 0;\r\n return Math.ceil((date.getMonth() + 1) / 3);\r\n },\r\n startOfDay(date) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setHours(0, 0, 0, 0);\r\n return newDate;\r\n },\r\n endOfDay(date) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setHours(23, 59, 59, 999);\r\n return newDate;\r\n },\r\n startOfMonth(date) {\r\n if (!this.isDate(date)) return date;\r\n return new Date(date.getFullYear(), date.getMonth(), 1);\r\n },\r\n endOfMonth(date) {\r\n if (!this.isDate(date)) return date;\r\n return new Date(date.getFullYear(), date.getMonth() + 1, 0, 23, 59, 59, 999);\r\n },\r\n startOfWeek(date, startDay = 1) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n const day = newDate.getDay();\r\n const diff = day >= startDay ? day - startDay : day + (7 - startDay);\r\n newDate.setDate(newDate.getDate() - diff);\r\n newDate.setHours(0, 0, 0, 0);\r\n return newDate;\r\n },\r\n endOfWeek(date, startDay = 1) {\r\n if (!this.isDate(date)) return date;\r\n const start = this.startOfWeek(date, startDay);\r\n const end = new Date(start);\r\n end.setDate(end.getDate() + 6);\r\n end.setHours(23, 59, 59, 999);\r\n return end;\r\n },\r\n getAge(birthDate) {\r\n if (!this.isDate(birthDate)) return 0;\r\n const now = new Date();\r\n let age = now.getFullYear() - birthDate.getFullYear();\r\n if (now.getMonth() < birthDate.getMonth() || \r\n (now.getMonth() === birthDate.getMonth() && now.getDate() < birthDate.getDate())) {\r\n age--;\r\n }\r\n return Math.max(0, age);\r\n },\r\n fromNow(date) {\r\n if (!this.isDate(date)) return '';\r\n const now = this.now();\r\n const diff = now - date.getTime();\r\n const minute = 60 * 1000;\r\n const hour = 60 * minute;\r\n const day = 24 * hour;\r\n const week = 7 * day;\r\n const month = 30 * day;\r\n const year = 365 * day;\r\n \r\n if (diff < minute) return '刚刚';\r\n if (diff < hour) return `${Math.floor(diff / minute)}分钟前`;\r\n if (diff < day) return `${Math.floor(diff / hour)}小时前`;\r\n if (diff < week) return `${Math.floor(diff / day)}天前`;\r\n if (diff < month) return `${Math.floor(diff / week)}周前`;\r\n if (diff < year) return `${Math.floor(diff / month)}个月前`;\r\n return `${Math.floor(diff / year)}年前`;\r\n }\r\n },\r\n\r\n debounce(func, wait, options = {}) {\r\n let timeout = null;\r\n let lastArgs = null;\r\n let lastThis = null;\r\n let lastCallTime = 0;\r\n \r\n const leading = options.leading || false;\r\n const trailing = options.trailing !== false;\r\n \r\n function invokeFunc() {\r\n func.apply(lastThis, lastArgs);\r\n }\r\n \r\n function leadingEdge() {\r\n lastCallTime = Date.now();\r\n if (leading) {\r\n timeout = setTimeout(trailingEdge, wait);\r\n invokeFunc();\r\n } else {\r\n timeout = setTimeout(trailingEdge, wait);\r\n }\r\n }\r\n \r\n function trailingEdge() {\r\n timeout = null;\r\n if (trailing && lastArgs) {\r\n invokeFunc();\r\n }\r\n lastArgs = null;\r\n lastThis = null;\r\n }\r\n \r\n function remainingWait() {\r\n const timeSinceLastCall = Date.now() - lastCallTime;\r\n return Math.max(0, wait - timeSinceLastCall);\r\n }\r\n \r\n return function(...args) {\r\n lastArgs = args;\r\n lastThis = this;\r\n lastCallTime = Date.now();\r\n \r\n if (!timeout) {\r\n leadingEdge();\r\n } else {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(trailingEdge, remainingWait());\r\n }\r\n };\r\n },\r\n\r\n throttle(func, limit, options = {}) {\r\n let inThrottle = false;\r\n const trailing = options.trailing || false;\r\n let lastArgs = null;\r\n let lastThis = null;\r\n \r\n function invokeFunc() {\r\n func.apply(lastThis, lastArgs);\r\n lastArgs = null;\r\n lastThis = null;\r\n }\r\n \r\n return function(...args) {\r\n if (!inThrottle) {\r\n inThrottle = true;\r\n lastArgs = args;\r\n lastThis = this;\r\n invokeFunc();\r\n setTimeout(() => {\r\n inThrottle = false;\r\n if (trailing && lastArgs) {\r\n invokeFunc();\r\n }\r\n }, limit);\r\n } else if (trailing) {\r\n lastArgs = args;\r\n lastThis = this;\r\n }\r\n };\r\n },\r\n\r\n validator: {\r\n isEmail(str) {\r\n const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\r\n return regex.test(str || '');\r\n },\r\n isPhone(str) {\r\n const regex = /^1[3-9]\\d{9}$/;\r\n return regex.test(str || '');\r\n },\r\n isURL(str) {\r\n const regex = /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w.-]*)*\\/?$/;\r\n return regex.test(str || '');\r\n },\r\n isIPv4(str) {\r\n const regex = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\r\n return regex.test(str || '');\r\n },\r\n isIPv6(str) {\r\n const regex = /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/;\r\n return regex.test(str || '');\r\n },\r\n isIP(str) {\r\n return this.isIPv4(str) || this.isIPv6(str);\r\n },\r\n isIDCard(str) {\r\n const regex = /^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]$/;\r\n return regex.test(str || '');\r\n },\r\n isPassport(str) {\r\n const regex = /^[A-Z][0-9]{8}$|^[A-Z]{2}[0-9]{7}$/;\r\n return regex.test(str || '');\r\n },\r\n isCreditCard(str) {\r\n const regex = /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9]{2})[0-9]{12}|3[47][0-9]{13})$/;\r\n const cleanStr = str.replace(/\\s/g, '');\r\n if (!regex.test(cleanStr)) return false;\r\n let sum = 0;\r\n let alternate = false;\r\n for (let i = cleanStr.length - 1; i >= 0; i--) {\r\n let digit = parseInt(cleanStr[i], 10);\r\n if (alternate) {\r\n digit *= 2;\r\n if (digit > 9) digit -= 9;\r\n }\r\n sum += digit;\r\n alternate = !alternate;\r\n }\r\n return sum % 10 === 0;\r\n },\r\n isHexColor(str) {\r\n const regex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\r\n return regex.test(str || '');\r\n },\r\n isRGB(str) {\r\n const regex = /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/;\r\n const match = regex.exec(str || '');\r\n if (!match) return false;\r\n return match.slice(1).every(val => parseInt(val) >= 0 && parseInt(val) <= 255);\r\n },\r\n isRGBA(str) {\r\n const regex = /^rgba\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3}),\\s*([01]|0\\.\\d+)\\)$/;\r\n const match = regex.exec(str || '');\r\n if (!match) return false;\r\n const [, r, g, b, a] = match;\r\n return parseInt(r) >= 0 && parseInt(r) <= 255 &&\r\n parseInt(g) >= 0 && parseInt(g) <= 255 &&\r\n parseInt(b) >= 0 && parseInt(b) <= 255 &&\r\n parseFloat(a) >= 0 && parseFloat(a) <= 1;\r\n },\r\n isColor(str) {\r\n return this.isHexColor(str) || this.isRGB(str) || this.isRGBA(str);\r\n },\r\n isDate(str) {\r\n return !isNaN(new Date(str).getTime());\r\n },\r\n isJSON(str) {\r\n try {\r\n JSON.parse(str);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n },\r\n isEmpty(str) {\r\n return !str || str.trim() === '';\r\n },\r\n isWhitespace(str) {\r\n return /^\\s+$/.test(str || '');\r\n },\r\n isNumber(str) {\r\n return !isNaN(parseFloat(str)) && isFinite(str);\r\n },\r\n isInteger(str) {\r\n return /^-?\\d+$/.test(str || '');\r\n },\r\n isFloat(str) {\r\n return /^-?\\d+\\.\\d+$/.test(str || '');\r\n },\r\n isPositive(str) {\r\n const num = parseFloat(str);\r\n return !isNaN(num) && num > 0;\r\n },\r\n isNegative(str) {\r\n const num = parseFloat(str);\r\n return !isNaN(num) && num < 0;\r\n },\r\n isAlpha(str) {\r\n return /^[a-zA-Z]+$/.test(str || '');\r\n },\r\n isAlphaNumeric(str) {\r\n return /^[a-zA-Z0-9]+$/.test(str || '');\r\n },\r\n isChinese(str) {\r\n return /^[\\u4e00-\\u9fa5]+$/.test(str || '');\r\n },\r\n isLength(str, min, max) {\r\n const len = (str || '').length;\r\n return len >= min && (max === undefined || len <= max);\r\n },\r\n minLength(str, min) {\r\n return (str || '').length >= min;\r\n },\r\n maxLength(str, max) {\r\n return (str || '').length <= max;\r\n },\r\n matches(str, regex) {\r\n return (regex instanceof RegExp) ? regex.test(str || '') : false;\r\n },\r\n equals(str1, str2) {\r\n return String(str1) === String(str2);\r\n },\r\n contains(str, substring) {\r\n return (str || '').includes(substring);\r\n },\r\n notContains(str, substring) {\r\n return !this.contains(str, substring);\r\n },\r\n isArray(arr) {\r\n return Array.isArray(arr);\r\n },\r\n arrayLength(arr, min, max) {\r\n const len = arr ? arr.length : 0;\r\n return len >= min && (max === undefined || len <= max);\r\n },\r\n arrayMinLength(arr, min) {\r\n return arr ? arr.length >= min : false;\r\n },\r\n arrayMaxLength(arr, max) {\r\n return arr ? arr.length <= max : false;\r\n },\r\n isObject(obj) {\r\n return obj !== null && typeof obj === 'object' && !Array.isArray(obj);\r\n },\r\n hasKeys(obj, keys) {\r\n if (!obj || !keys || !Array.isArray(keys)) return false;\r\n return keys.every(key => Object.prototype.hasOwnProperty.call(obj, key));\r\n },\r\n validate(obj, rules) {\r\n const errors = {};\r\n Object.keys(rules).forEach(key => {\r\n const value = obj[key];\r\n const fieldRules = rules[key];\r\n const fieldErrors = [];\r\n \r\n fieldRules.forEach(rule => {\r\n if (typeof rule === 'string') {\r\n const [name, ...params] = rule.split(':');\r\n if (!this[name](value, ...params)) {\r\n fieldErrors.push(name);\r\n }\r\n } else if (typeof rule === 'function') {\r\n const result = rule(value, obj);\r\n if (result !== true) {\r\n fieldErrors.push(result || 'validation_failed');\r\n }\r\n }\r\n });\r\n \r\n if (fieldErrors.length > 0) {\r\n errors[key] = fieldErrors;\r\n }\r\n });\r\n \r\n return {\r\n valid: Object.keys(errors).length === 0,\r\n errors\r\n };\r\n }\r\n },\r\n\r\n crypto: {\r\n md5(str) {\r\n const message = str ? String(str) : '';\r\n const md5Array = [\r\n 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476\r\n ];\r\n \r\n const K = [\r\n 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,\r\n 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,\r\n 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,\r\n 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,\r\n 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,\r\n 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,\r\n 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,\r\n 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,\r\n 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,\r\n 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,\r\n 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,\r\n 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,\r\n 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,\r\n 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,\r\n 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,\r\n 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391\r\n ];\r\n \r\n const S = [\r\n [7, 12, 17, 22], [5, 9, 14, 20], [4, 11, 16, 23], [6, 10, 15, 21]\r\n ];\r\n \r\n function leftRotate(value, shift) {\r\n return (value << shift) | (value >>> (32 - shift));\r\n }\r\n \r\n function addPadding(message) {\r\n const bitLength = message.length * 8;\r\n message += '\\x80';\r\n while ((message.length % 64) !== 56) {\r\n message += '\\x00';\r\n }\r\n const lowBytes = bitLength & 0xffffffff;\r\n const highBytes = (bitLength >>> 32) & 0xffffffff;\r\n for (let i = 0; i < 4; i++) {\r\n message += String.fromCharCode((lowBytes >>> (8 * i)) & 0xff);\r\n }\r\n for (let i = 0; i < 4; i++) {\r\n message += String.fromCharCode((highBytes >>> (8 * i)) & 0xff);\r\n }\r\n return message;\r\n }\r\n \r\n function processBlock(block, state) {\r\n const [a, b, c, d] = state;\r\n const words = [];\r\n for (let i = 0; i < 16; i++) {\r\n words[i] = (block.charCodeAt(i * 4) & 0xff) |\r\n ((block.charCodeAt(i * 4 + 1) & 0xff) << 8) |\r\n ((block.charCodeAt(i * 4 + 2) & 0xff) << 16) |\r\n ((block.charCodeAt(i * 4 + 3) & 0xff) << 24);\r\n }\r\n \r\n let AA = a, BB = b, CC = c, DD = d;\r\n \r\n for (let i = 0; i < 64; i++) {\r\n let f, g;\r\n const round = Math.floor(i / 16);\r\n const wordIndex = i % 16;\r\n \r\n if (round === 0) {\r\n f = (BB & CC) | (~BB & DD);\r\n g = wordIndex;\r\n } else if (round === 1) {\r\n f = (DD & BB) | (~DD & CC);\r\n g = (5 * wordIndex + 1) % 16;\r\n } else if (round === 2) {\r\n f = BB ^ CC ^ DD;\r\n g = (3 * wordIndex + 5) % 16;\r\n } else {\r\n f = CC ^ (BB | ~DD);\r\n g = (7 * wordIndex) % 16;\r\n }\r\n \r\n const temp = DD;\r\n DD = CC;\r\n CC = BB;\r\n BB = BB + leftRotate((AA + f + K[i] + words[g]) & 0xffffffff, S[round][i % 4]);\r\n AA = temp;\r\n }\r\n \r\n return [\r\n (a + AA) & 0xffffffff,\r\n (b + BB) & 0xffffffff,\r\n (c + CC) & 0xffffffff,\r\n (d + DD) & 0xffffffff\r\n ];\r\n }\r\n \r\n const paddedMessage = addPadding(message);\r\n let state = [...md5Array];\r\n \r\n for (let i = 0; i < paddedMessage.length; i += 64) {\r\n state = processBlock(paddedMessage.substring(i, i + 64), state);\r\n }\r\n \r\n let result = '';\r\n state.forEach(word => {\r\n for (let i = 0; i < 4; i++) {\r\n result += ((word >>> (8 * i)) & 0xff).toString(16).padStart(2, '0');\r\n }\r\n });\r\n \r\n return result;\r\n },\r\n \r\n sha256(str) {\r\n const message = str ? String(str) : '';\r\n const K = [\r\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\r\n 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\r\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\r\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\r\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\r\n 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\r\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\r\n 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\r\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\r\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\r\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\r\n 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\r\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\r\n 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\r\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\r\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\r\n ];\r\n \r\n function rightRotate(value, shift) {\r\n return (value >>> shift) | (value << (32 - shift));\r\n }\r\n \r\n function addPadding(message) {\r\n const bitLength = message.length * 8;\r\n message += '\\x80';\r\n while ((message.length % 64) !== 56) {\r\n message += '\\x00';\r\n }\r\n const lowBytes = bitLength & 0xffffffff;\r\n const highBytes = (bitLength >>> 32) & 0xffffffff;\r\n for (let i = 0; i < 4; i++) {\r\n message += String.fromCharCode((highBytes >>> (8 * i)) & 0xff);\r\n }\r\n for (let i = 0; i < 4; i++) {\r\n message += String.fromCharCode((lowBytes >>> (8 * i)) & 0xff);\r\n }\r\n return message;\r\n }\r\n \r\n function processBlock(block, state) {\r\n const words = [];\r\n for (let i = 0; i < 16; i++) {\r\n words[i] = (block.charCodeAt(i * 4) & 0xff) |\r\n ((block.charCodeAt(i * 4 + 1) & 0xff) << 8) |\r\n ((block.charCodeAt(i * 4 + 2) & 0xff) << 16) |\r\n ((block.charCodeAt(i * 4 + 3) & 0xff) << 24);\r\n }\r\n \r\n for (let i = 16; i < 64; i++) {\r\n const s0 = rightRotate(words[i - 15], 7) ^ rightRotate(words[i - 15], 18) ^ (words[i - 15] >>> 3);\r\n const s1 = rightRotate(words[i - 2], 17) ^ rightRotate(words[i - 2], 19) ^ (words[i - 2] >>> 10);\r\n words[i] = (words[i - 16] + s0 + words[i - 7] + s1) & 0xffffffff;\r\n }\r\n \r\n let [a, b, c, d, e, f, g, h] = state;\r\n \r\n for (let i = 0; i < 64; i++) {\r\n const S1 = rightRotate(e, 6) ^ rightRotate(e, 11) ^ rightRotate(e, 25);\r\n const ch = (e & f) ^ (~e & g);\r\n const temp1 = (h + S1 + ch + K[i] + words[i]) & 0xffffffff;\r\n const S0 = rightRotate(a, 2) ^ rightRotate(a, 13) ^ rightRotate(a, 22);\r\n const maj = (a & b) ^ (a & c) ^ (b & c);\r\n const temp2 = (S0 + maj) & 0xffffffff;\r\n \r\n h = g;\r\n g = f;\r\n f = e;\r\n e = (d + temp1) & 0xffffffff;\r\n d = c;\r\n c = b;\r\n b = a;\r\n a = (temp1 + temp2) & 0xffffffff;\r\n }\r\n \r\n return [\r\n (state[0] + a) & 0xffffffff,\r\n (state[1] + b) & 0xffffffff,\r\n (state[2] + c) & 0xffffffff,\r\n (state[3] + d) & 0xffffffff,\r\n (state[4] + e) & 0xffffffff,\r\n (state[5] + f) & 0xffffffff,\r\n (state[6] + g) & 0xffffffff,\r\n (state[7] + h) & 0xffffffff\r\n ];\r\n }\r\n \r\n const paddedMessage = addPadding(message);\r\n let state = [\r\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\r\n 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\r\n ];\r\n \r\n for (let i = 0; i < paddedMessage.length; i += 64) {\r\n state = processBlock(paddedMessage.substring(i, i + 64), state);\r\n }\r\n \r\n let result = '';\r\n state.forEach(word => {\r\n for (let i = 3; i >= 0; i--) {\r\n result += ((word >>> (8 * i)) & 0xff).toString(16).padStart(2, '0');\r\n }\r\n });\r\n \r\n return result;\r\n },\r\n \r\n base64Encode(str) {\r\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\n let result = '';\r\n let i = 0;\r\n const bytes = str ? str.split('').map(c => c.charCodeAt(0)) : [];\r\n \r\n while (i < bytes.length) {\r\n const byte1 = bytes[i++];\r\n const byte2 = bytes[i++] || 0;\r\n const byte3 = bytes[i++] || 0;\r\n \r\n const enc1 = byte1 >> 2;\r\n const enc2 = ((byte1 & 3) << 4) | (byte2 >> 4);\r\n const enc3 = ((byte2 & 15) << 2) | (byte3 >> 6);\r\n const enc4 = byte3 & 63;\r\n \r\n result += chars[enc1] + chars[enc2] + \r\n (i > bytes.length + 1 ? '=' : chars[enc3]) + \r\n (i > bytes.length ? '=' : chars[enc4]);\r\n }\r\n \r\n return result;\r\n },\r\n \r\n base64Decode(str) {\r\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\n let result = '';\r\n let i = 0;\r\n str = str.replace(/[^A-Za-z0-9+/=]/g, '');\r\n \r\n while (i < str.length) {\r\n const enc1 = chars.indexOf(str.charAt(i++));\r\n const enc2 = chars.indexOf(str.charAt(i++));\r\n const enc3 = chars.indexOf(str.charAt(i++));\r\n const enc4 = chars.indexOf(str.charAt(i++));\r\n \r\n const byte1 = (enc1 << 2) | (enc2 >> 4);\r\n const byte2 = ((enc2 & 15) << 4) | (enc3 >> 2);\r\n const byte3 = ((enc3 & 3) << 6) | enc4;\r\n \r\n result += String.fromCharCode(byte1);\r\n if (enc3 !== 64) result += String.fromCharCode(byte2);\r\n if (enc4 !== 64) result += String.fromCharCode(byte3);\r\n }\r\n \r\n return result;\r\n },\r\n \r\n uuid() {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = Math.random() * 16 | 0;\r\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n }\r\n },\r\n\r\n preload: {\r\n cache: new Map(),\r\n\r\n async loadImage(url, options = {}) {\r\n const { crossOrigin = 'anonymous' } = options;\r\n \r\n if (this.cache.has(url)) {\r\n return this.cache.get(url);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.crossOrigin = crossOrigin;\r\n \r\n img.onload = () => {\r\n this.cache.set(url, img);\r\n resolve(img);\r\n };\r\n \r\n img.onerror = () => {\r\n reject(new Error(`Failed to load image: ${url}`));\r\n };\r\n \r\n img.src = url;\r\n });\r\n },\r\n\r\n async loadImages(urls, options = {}) {\r\n const { parallel = true } = options;\r\n \r\n if (parallel) {\r\n return Promise.all(urls.map(url => this.loadImage(url, options)));\r\n }\r\n \r\n const results = [];\r\n for (const url of urls) {\r\n results.push(await this.loadImage(url, options));\r\n }\r\n return results;\r\n },\r\n\r\n async loadScript(url, options = {}) {\r\n const { type = 'text/javascript', async = true, defer = false } = options;\r\n \r\n if (this.cache.has(url)) {\r\n return this.cache.get(url);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.type = type;\r\n script.async = async;\r\n script.defer = defer;\r\n \r\n script.onload = () => {\r\n this.cache.set(url, script);\r\n resolve(script);\r\n };\r\n \r\n script.onerror = () => {\r\n script.remove();\r\n reject(new Error(`Failed to load script: ${url}`));\r\n };\r\n \r\n script.src = url;\r\n document.head.appendChild(script);\r\n });\r\n },\r\n\r\n async loadStylesheet(url, options = {}) {\r\n const { media = 'all' } = options;\r\n \r\n if (this.cache.has(url)) {\r\n return this.cache.get(url);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = url;\r\n link.media = media;\r\n \r\n link.onload = () => {\r\n this.cache.set(url, link);\r\n resolve(link);\r\n };\r\n \r\n link.onerror = () => {\r\n link.remove();\r\n reject(new Error(`Failed to load stylesheet: ${url}`));\r\n };\r\n \r\n document.head.appendChild(link);\r\n });\r\n },\r\n\r\n async loadFont(fontFamily, src, options = {}) {\r\n const { weight = 'normal', style = 'normal' } = options;\r\n const fontFace = new FontFace(fontFamily, `url(${src})`, { weight, style });\r\n \r\n try {\r\n await fontFace.load();\r\n document.fonts.add(fontFace);\r\n return fontFace;\r\n } catch (e) {\r\n throw new Error(`Failed to load font: ${fontFamily}`);\r\n }\r\n },\r\n\r\n async preload(url, type = 'image') {\r\n switch (type) {\r\n case 'image':\r\n return this.loadImage(url);\r\n case 'script':\r\n return this.loadScript(url);\r\n case 'stylesheet':\r\n case 'style':\r\n return this.loadStylesheet(url);\r\n default:\r\n throw new Error(`Unsupported preload type: ${type}`);\r\n }\r\n },\r\n\r\n isLoaded(url) {\r\n return this.cache.has(url);\r\n },\r\n\r\n clearCache() {\r\n this.cache.clear();\r\n },\r\n\r\n clearCacheByUrl(url) {\r\n this.cache.delete(url);\r\n }\r\n }\r\n};\r\n\r\nexport { KupolaUtils };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.KupolaUtils = KupolaUtils;\r\n window.kupolaUtils = KupolaUtils;\r\n}","/**\r\n * Kupola Data Bind — Reactive data binding, event bus, and state management.\r\n * Provides KupolaDataBind (Proxy-based binding), KupolaEventBus, KupolaStore, and ref().\r\n * @module kupola/data-bind\r\n */\r\n\r\n/**\r\n * Basic HTML sanitizer — removes <script>, <iframe>, <object>, <embed>, and on* event attributes.\r\n * @param {string} html\r\n * @returns {string}\r\n */\r\nfunction sanitizeHtml(html) {\r\n if (!html) return '';\r\n const str = String(html);\r\n return str\r\n .replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '')\r\n .replace(/<iframe\\b[^<]*(?:(?!<\\/iframe>)<[^<]*)*<\\/iframe>/gi, '')\r\n .replace(/<object\\b[^<]*(?:(?!<\\/object>)<[^<]*)*<\\/object>/gi, '')\r\n .replace(/<embed\\b[^>]*\\/?>/gi, '')\r\n .replace(/\\bon\\w+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, '');\r\n}\r\n\r\nclass TrieNode {\r\n constructor() {\r\n this.children = {};\r\n this.keys = [];\r\n }\r\n}\r\n\r\nclass PathTrie {\r\n constructor() {\r\n this.root = new TrieNode();\r\n }\r\n\r\n insert(key) {\r\n let node = this.root;\r\n const parts = key.split('.');\r\n \r\n parts.forEach((part, index) => {\r\n if (!node.children[part]) {\r\n node.children[part] = new TrieNode();\r\n }\r\n node = node.children[part];\r\n if (index === parts.length - 1) {\r\n node.keys.push(key);\r\n }\r\n });\r\n }\r\n\r\n getSubKeys(key) {\r\n let node = this.root;\r\n const parts = key.split('.');\r\n const result = [];\r\n\r\n for (let i = 0; i < parts.length; i++) {\r\n const part = parts[i];\r\n if (!node.children[part]) {\r\n break;\r\n }\r\n node = node.children[part];\r\n \r\n const collectKeys = (n) => {\r\n if (n.keys.length > 0) {\r\n result.push(...n.keys);\r\n }\r\n Object.values(n.children).forEach(child => collectKeys(child));\r\n };\r\n collectKeys(node);\r\n }\r\n\r\n return [...new Set(result)];\r\n }\r\n\r\n getParentKeys(key) {\r\n const parts = key.split('.');\r\n const result = [];\r\n \r\n for (let i = 1; i <= parts.length; i++) {\r\n const parentPath = parts.slice(0, i).join('.');\r\n result.push(parentPath);\r\n }\r\n \r\n return result;\r\n }\r\n}\r\n\r\nconst REACTIVE_SYMBOLS = {\r\n parent: Symbol('reactive_parent'),\r\n path: Symbol('reactive_path'),\r\n isReactive: Symbol('reactive_is_reactive')\r\n};\r\n\r\nclass KupolaDataBind {\r\n constructor() {\r\n this.rawData = {};\r\n this.data = null;\r\n this.observers = {};\r\n this.elements = {};\r\n this.computedProperties = {};\r\n this.pathTrie = new PathTrie();\r\n this.updateQueue = new Map();\r\n this.isProcessing = false;\r\n this.pendingComputed = new Set();\r\n this.persistedKeys = new Map();\r\n this.snapshots = [];\r\n this.snapshotLimit = 10;\r\n this._proxyCache = new WeakMap();\r\n \r\n this.createReactiveData();\r\n }\r\n\r\n createReactiveData() {\r\n const handler = {\r\n get: (target, key, receiver) => {\r\n if (key === '__raw__') return target;\r\n const result = Reflect.get(target, key, receiver);\r\n if (result && typeof result === 'object' && !Array.isArray(result)) {\r\n return this.wrapReactive(result, key);\r\n }\r\n return result;\r\n },\r\n set: (target, key, value, receiver) => {\r\n const oldValue = Reflect.get(target, key, receiver);\r\n const result = Reflect.set(target, key, value, receiver);\r\n \r\n const fullPath = this.resolvePath(target, key);\r\n this.notify(fullPath, value, oldValue);\r\n this.queueUpdate(fullPath, value);\r\n \r\n return result;\r\n },\r\n deleteProperty: (target, key) => {\r\n const oldValue = Reflect.get(target, key, receiver);\r\n const result = Reflect.deleteProperty(target, key);\r\n \r\n const fullPath = this.resolvePath(target, key);\r\n this.notify(fullPath, undefined, oldValue);\r\n this.queueUpdate(fullPath, undefined);\r\n \r\n return result;\r\n }\r\n };\r\n\r\n this.data = new Proxy(this.rawData, handler);\r\n this.data.__parent__ = null;\r\n this.data.__path__ = '';\r\n }\r\n\r\n wrapReactive(obj, parentKey) {\r\n if (obj[REACTIVE_SYMBOLS.isReactive]) return obj;\r\n \r\n if (this._proxyCache.has(obj)) {\r\n return this._proxyCache.get(obj);\r\n }\r\n \r\n const handler = {\r\n get: (target, key, receiver) => {\r\n if (key === '__raw__') return target;\r\n if (key === REACTIVE_SYMBOLS.parent || key === '__parent__') return target[REACTIVE_SYMBOLS.parent];\r\n if (key === REACTIVE_SYMBOLS.path || key === '__path__') return target[REACTIVE_SYMBOLS.path];\r\n if (key === REACTIVE_SYMBOLS.isReactive || key === '__isReactive__') return true;\r\n \r\n const result = Reflect.get(target, key, receiver);\r\n if (result && typeof result === 'object' && !Array.isArray(result)) {\r\n return this.wrapReactive(result, `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`);\r\n }\r\n return result;\r\n },\r\n set: (target, key, value, receiver) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive ||\r\n key === '__parent__' ||\r\n key === '__path__' ||\r\n key === '__isReactive__') {\r\n return true;\r\n }\r\n \r\n const oldValue = Reflect.get(target, key, receiver);\r\n const result = Reflect.set(target, key, value, receiver);\r\n \r\n const fullPath = `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`;\r\n this.notify(fullPath, value, oldValue);\r\n this.queueUpdate(fullPath, value);\r\n \r\n return result;\r\n },\r\n deleteProperty: (target, key) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive) {\r\n return false;\r\n }\r\n \r\n const oldValue = Reflect.get(target, key);\r\n const result = Reflect.deleteProperty(target, key);\r\n \r\n const fullPath = `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`;\r\n this.notify(fullPath, undefined, oldValue);\r\n this.queueUpdate(fullPath, undefined);\r\n \r\n return result;\r\n },\r\n has: (target, key) => {\r\n if (key === '__raw__' || \r\n key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive ||\r\n key === '__parent__' ||\r\n key === '__path__' ||\r\n key === '__isReactive__') {\r\n return true;\r\n }\r\n return key in target;\r\n },\r\n ownKeys: (target) => {\r\n return Reflect.ownKeys(target).filter(key => \r\n key !== REACTIVE_SYMBOLS.parent && \r\n key !== REACTIVE_SYMBOLS.path && \r\n key !== REACTIVE_SYMBOLS.isReactive\r\n );\r\n },\r\n getOwnPropertyDescriptor: (target, key) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive) {\r\n return {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: target[key]\r\n };\r\n }\r\n return Reflect.getOwnPropertyDescriptor(target, key);\r\n }\r\n };\r\n \r\n const proxy = new Proxy(obj, handler);\r\n obj[REACTIVE_SYMBOLS.parent] = obj;\r\n obj[REACTIVE_SYMBOLS.path] = parentKey;\r\n obj[REACTIVE_SYMBOLS.isReactive] = true;\r\n this._proxyCache.set(obj, proxy);\r\n \r\n Object.keys(obj).forEach(key => {\r\n if (obj[key] && typeof obj[key] === 'object' && !Array.isArray(obj[key])) {\r\n obj[key] = this.wrapReactive(obj[key], `${parentKey}${parentKey ? '.' : ''}${key}`);\r\n }\r\n });\r\n \r\n return proxy;\r\n }\r\n\r\n resolvePath(target, key) {\r\n if (target[REACTIVE_SYMBOLS.path]) {\r\n return `${target[REACTIVE_SYMBOLS.path]}.${key}`;\r\n }\r\n return key;\r\n }\r\n\r\n queueUpdate(key, value) {\r\n this.updateQueue.set(key, value);\r\n \r\n if (!this.isProcessing) {\r\n this.isProcessing = true;\r\n requestAnimationFrame(() => {\r\n this.processQueue();\r\n });\r\n }\r\n }\r\n\r\n processQueue() {\r\n const updatedKeys = new Set();\r\n \r\n this.updateQueue.forEach((value, key) => {\r\n updatedKeys.add(key);\r\n this.updateElementsDirect(key, value);\r\n \r\n const subKeys = this.pathTrie.getSubKeys(key);\r\n subKeys.forEach(subKey => {\r\n if (!updatedKeys.has(subKey)) {\r\n const subValue = this.get(subKey);\r\n this.updateElementsDirect(subKey, subValue);\r\n updatedKeys.add(subKey);\r\n }\r\n });\r\n });\r\n \r\n this.updateQueue.clear();\r\n this.processComputed();\r\n this.isProcessing = false;\r\n }\r\n\r\n updateElementsDirect(key, value) {\r\n if (this.elements[key]) {\r\n this.elements[key].forEach(element => {\r\n this.updateElement(element, value);\r\n });\r\n }\r\n }\r\n\r\n processComputed() {\r\n const computedKeys = Object.keys(this.computedProperties);\r\n \r\n computedKeys.forEach(name => {\r\n const prop = this.computedProperties[name];\r\n const depsChanged = prop.deps.some(dep => {\r\n return this.updateQueue.has(dep) || \r\n this.pathTrie.getSubKeys(dep).some(k => this.updateQueue.has(k));\r\n });\r\n \r\n if (depsChanged) {\r\n this.updateComputedProperty(name);\r\n }\r\n });\r\n }\r\n\r\n set(key, value, silent = false) {\r\n const oldValue = this.get(key);\r\n \r\n if (typeof key === 'object') {\r\n Object.assign(this.rawData, key);\r\n Object.keys(key).forEach(k => {\r\n if (!silent) {\r\n this.notify(k, key[k], oldValue?.[k]);\r\n this.queueUpdate(k, key[k]);\r\n }\r\n });\r\n } else {\r\n if (key.includes('.')) {\r\n this.setNested(key, value);\r\n } else {\r\n this.rawData[key] = value;\r\n }\r\n \r\n if (!silent) {\r\n this.notify(key, value, oldValue);\r\n this.queueUpdate(key, value);\r\n }\r\n }\r\n \r\n if (!silent) {\r\n this.processComputed();\r\n }\r\n }\r\n\r\n get(key) {\r\n if (!key) return undefined;\r\n if (key.includes('.')) {\r\n return this.getNested(key);\r\n }\r\n return this.rawData[key];\r\n }\r\n\r\n getNested(path) {\r\n if (!path) return undefined;\r\n return path.split('.').reduce((obj, key) => obj?.[key], this.rawData);\r\n }\r\n\r\n setNested(path, value) {\r\n const keys = path.split('.');\r\n const lastKey = keys.pop();\r\n const parent = keys.reduce((obj, key) => {\r\n if (!obj[key]) obj[key] = {};\r\n return obj[key];\r\n }, this.rawData);\r\n \r\n const oldValue = parent[lastKey];\r\n parent[lastKey] = value;\r\n this.notify(path, value, oldValue);\r\n this.queueUpdate(path, value);\r\n }\r\n\r\n observe(key, callback) {\r\n if (!this.observers[key]) {\r\n this.observers[key] = [];\r\n }\r\n this.observers[key].push(callback);\r\n }\r\n\r\n unobserve(key, callback) {\r\n if (this.observers[key]) {\r\n this.observers[key] = this.observers[key].filter(cb => cb !== callback);\r\n }\r\n }\r\n\r\n notify(key, value, oldValue) {\r\n if (this.observers[key]) {\r\n this.observers[key].forEach(callback => {\r\n try {\r\n callback(value, oldValue);\r\n } catch (e) {\r\n console.error(`Observer error for ${key}:`, e);\r\n }\r\n });\r\n }\r\n \r\n this.observers['*']?.forEach(callback => {\r\n try {\r\n callback(key, value, oldValue);\r\n } catch (e) {\r\n console.error('Wildcard observer error:', e);\r\n }\r\n });\r\n }\r\n\r\n updateElement(element, value) {\r\n const binding = element.getAttribute('data-bind');\r\n if (!binding) return;\r\n\r\n const bindings = binding.split('|');\r\n \r\n bindings.forEach(b => {\r\n const parts = b.split(':');\r\n const type = parts[0].trim();\r\n const target = parts[1]?.trim();\r\n\r\n switch (type) {\r\n case 'text':\r\n if (element.textContent !== String(value ?? '')) {\r\n element.textContent = value ?? '';\r\n }\r\n break;\r\n case 'html':\r\n const sanitized = sanitizeHtml(value);\r\n if (element.innerHTML !== sanitized) {\r\n element.innerHTML = sanitized;\r\n }\r\n break;\r\n case 'value':\r\n if (element.type === 'checkbox') {\r\n if (element.checked !== !!value) {\r\n element.checked = !!value;\r\n }\r\n } else if (element.value !== String(value ?? '')) {\r\n element.value = value ?? '';\r\n }\r\n break;\r\n case 'checked':\r\n if (element.checked !== !!value) {\r\n element.checked = !!value;\r\n }\r\n break;\r\n case 'disabled':\r\n if (element.disabled !== !!value) {\r\n element.disabled = !!value;\r\n }\r\n break;\r\n case 'hidden':\r\n const display = value ? 'none' : '';\r\n if (element.style.display !== display) {\r\n element.style.display = display;\r\n }\r\n break;\r\n case 'class':\r\n if (target) {\r\n if (value) {\r\n element.classList.add(target);\r\n } else {\r\n element.classList.remove(target);\r\n }\r\n }\r\n break;\r\n case 'style':\r\n if (target && element.style[target] !== String(value ?? '')) {\r\n element.style[target] = value ?? '';\r\n }\r\n break;\r\n case 'attr':\r\n if (target) {\r\n const current = element.getAttribute(target);\r\n if (current !== String(value ?? '')) {\r\n element.setAttribute(target, value ?? '');\r\n }\r\n }\r\n break;\r\n case 'src':\r\n if (element.src !== String(value ?? '')) {\r\n element.src = value ?? '';\r\n }\r\n break;\r\n case 'href':\r\n if (element.href !== String(value ?? '')) {\r\n element.href = value ?? '';\r\n }\r\n break;\r\n case 'placeholder':\r\n if (element.placeholder !== String(value ?? '')) {\r\n element.placeholder = value ?? '';\r\n }\r\n break;\r\n }\r\n });\r\n }\r\n\r\n computed(name, deps, callback) {\r\n this.computedProperties[name] = { deps, callback };\r\n \r\n deps.forEach(dep => {\r\n this.pathTrie.insert(dep);\r\n });\r\n \r\n this.updateComputedProperty(name);\r\n }\r\n\r\n updateComputedProperty(name) {\r\n const prop = this.computedProperties[name];\r\n if (!prop) return;\r\n \r\n try {\r\n const values = prop.deps.map(dep => this.get(dep));\r\n const result = prop.callback(...values);\r\n this.set(name, result, true);\r\n } catch (e) {\r\n console.error(`Computed error for ${name}:`, e);\r\n }\r\n }\r\n\r\n load(data) {\r\n Object.keys(data).forEach(key => {\r\n if (data[key] && typeof data[key] === 'object' && !Array.isArray(data[key])) {\r\n this.rawData[key] = this.wrapReactive(data[key], key);\r\n } else {\r\n this.rawData[key] = data[key];\r\n }\r\n this.queueUpdate(key, this.rawData[key]);\r\n });\r\n \r\n this.processComputed();\r\n }\r\n\r\n reset() {\r\n this.rawData = {};\r\n this.observers = {};\r\n this.elements = {};\r\n this.computedProperties = {};\r\n this.pathTrie = new PathTrie();\r\n this.updateQueue.clear();\r\n this.snapshots = [];\r\n this.createReactiveData();\r\n this.bind();\r\n }\r\n\r\n persist(key, options = {}) {\r\n const {\r\n storage: storageType = 'local',\r\n debounce = 0,\r\n version = 1,\r\n encrypt = false,\r\n encryptionKey = null\r\n } = options;\r\n\r\n const storage = storageType === 'session' ? sessionStorage : localStorage;\r\n \r\n this.persistedKeys.set(key, { \r\n storage, \r\n debounce, \r\n timeout: null,\r\n version,\r\n encrypt,\r\n encryptionKey\r\n });\r\n \r\n const value = this.get(key);\r\n if (value !== undefined) {\r\n this._persistSave(key, value, storage, { version, encrypt, encryptionKey });\r\n }\r\n \r\n this.observe(key, (newValue) => {\r\n const config = this.persistedKeys.get(key);\r\n if (!config) return;\r\n \r\n if (config.debounce > 0) {\r\n if (config.timeout) clearTimeout(config.timeout);\r\n config.timeout = setTimeout(() => {\r\n this._persistSave(key, newValue, config.storage, { \r\n version: config.version, \r\n encrypt: config.encrypt, \r\n encryptionKey: config.encryptionKey \r\n });\r\n }, config.debounce);\r\n } else {\r\n this._persistSave(key, newValue, config.storage, { \r\n version: config.version, \r\n encrypt: config.encrypt, \r\n encryptionKey: config.encryptionKey \r\n });\r\n }\r\n });\r\n }\r\n\r\n _persistSave(key, value, storage, options = {}) {\r\n try {\r\n const { version = 1, encrypt = false, encryptionKey = null } = options;\r\n \r\n const dataToStore = {\r\n value,\r\n version,\r\n timestamp: Date.now()\r\n };\r\n \r\n let serialized = JSON.stringify(dataToStore);\r\n \r\n if (encrypt && encryptionKey) {\r\n serialized = this._encrypt(serialized, encryptionKey);\r\n }\r\n \r\n this._ensureStorageCapacity(storage);\r\n storage.setItem(`kupola:${key}`, serialized);\r\n } catch (e) {\r\n console.warn(`Failed to persist key ${key}:`, e);\r\n \r\n if (e.name === 'QuotaExceededError' && storage === localStorage) {\r\n console.warn(`localStorage quota exceeded, trying sessionStorage for key ${key}`);\r\n try {\r\n sessionStorage.setItem(`kupola:${key}`, JSON.stringify({ value, version: 1 }));\r\n } catch (e2) {\r\n console.warn(`sessionStorage also failed for key ${key}:`, e2);\r\n }\r\n }\r\n }\r\n }\r\n\r\n _ensureStorageCapacity(storage) {\r\n try {\r\n const testKey = `kupola:__storage_test__`;\r\n storage.setItem(testKey, 'test');\r\n storage.removeItem(testKey);\r\n } catch (e) {\r\n if (e.name === 'QuotaExceededError') {\r\n this._cleanupOldStorage(storage);\r\n }\r\n }\r\n }\r\n\r\n _cleanupOldStorage(storage) {\r\n const now = Date.now();\r\n const maxAge = 30 * 24 * 60 * 60 * 1000;\r\n \r\n for (let i = 0; i < storage.length; i++) {\r\n const key = storage.key(i);\r\n if (key?.startsWith('kupola:')) {\r\n try {\r\n const data = JSON.parse(storage.getItem(key));\r\n if (data.timestamp && now - data.timestamp > maxAge) {\r\n storage.removeItem(key);\r\n }\r\n } catch (e) {\r\n storage.removeItem(key);\r\n }\r\n }\r\n }\r\n }\r\n\r\n _encrypt(text, key) {\r\n if (!window.CryptoJS) {\r\n console.warn('CryptoJS not available, encryption skipped');\r\n return text;\r\n }\r\n return window.CryptoJS.AES.encrypt(text, key).toString();\r\n }\r\n\r\n _decrypt(ciphertext, key) {\r\n if (!window.CryptoJS) {\r\n console.warn('CryptoJS not available, decryption skipped');\r\n return ciphertext;\r\n }\r\n try {\r\n const bytes = window.CryptoJS.AES.decrypt(ciphertext, key);\r\n return bytes.toString(window.CryptoJS.enc.Utf8);\r\n } catch (e) {\r\n console.warn('Decryption failed:', e);\r\n return ciphertext;\r\n }\r\n }\r\n\r\n unpersist(key) {\r\n const config = this.persistedKeys.get(key);\r\n if (config) {\r\n if (config.timeout) clearTimeout(config.timeout);\r\n config.storage.removeItem(`kupola:${key}`);\r\n this.persistedKeys.delete(key);\r\n }\r\n }\r\n\r\n loadPersisted(options = {}) {\r\n const persisted = {};\r\n const { encryptionKey = null } = options;\r\n \r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key?.startsWith('kupola:')) {\r\n const dataKey = key.replace('kupola:', '');\r\n try {\r\n const stored = localStorage.getItem(key);\r\n let parsed;\r\n \r\n if (encryptionKey) {\r\n const decrypted = this._decrypt(stored, encryptionKey);\r\n parsed = JSON.parse(decrypted);\r\n } else {\r\n parsed = JSON.parse(stored);\r\n }\r\n \r\n if (parsed.version !== undefined && parsed.version !== options.version) {\r\n console.debug(`Skipping outdated data for ${dataKey} (version ${parsed.version})`);\r\n continue;\r\n }\r\n \r\n persisted[dataKey] = parsed.value !== undefined ? parsed.value : parsed;\r\n } catch (e) {\r\n console.warn(`Failed to load persisted key ${dataKey}:`, e);\r\n }\r\n }\r\n }\r\n \r\n for (let i = 0; i < sessionStorage.length; i++) {\r\n const key = sessionStorage.key(i);\r\n if (key?.startsWith('kupola:')) {\r\n const dataKey = key.replace('kupola:', '');\r\n try {\r\n const stored = sessionStorage.getItem(key);\r\n let parsed;\r\n \r\n if (encryptionKey) {\r\n const decrypted = this._decrypt(stored, encryptionKey);\r\n parsed = JSON.parse(decrypted);\r\n } else {\r\n parsed = JSON.parse(stored);\r\n }\r\n \r\n if (parsed.version !== undefined && parsed.version !== options.version) {\r\n console.debug(`Skipping outdated data for ${dataKey} (version ${parsed.version})`);\r\n continue;\r\n }\r\n \r\n persisted[dataKey] = parsed.value !== undefined ? parsed.value : parsed;\r\n } catch (e) {}\r\n }\r\n }\r\n \r\n if (Object.keys(persisted).length > 0) {\r\n this.load(persisted);\r\n }\r\n \r\n return persisted;\r\n }\r\n\r\n _clone(data) {\r\n if (typeof structuredClone === 'function') {\r\n try {\r\n return structuredClone(data);\r\n } catch (e) {\r\n console.warn('structuredClone failed, falling back to JSON:', e);\r\n }\r\n }\r\n return JSON.parse(JSON.stringify(data));\r\n }\r\n\r\n snapshot() {\r\n const snapshot = this._clone(this.rawData);\r\n this.snapshots.push(snapshot);\r\n if (this.snapshots.length > this.snapshotLimit) {\r\n this.snapshots.shift();\r\n }\r\n return this.snapshots.length - 1;\r\n }\r\n\r\n rollback(index = -1) {\r\n if (this.snapshots.length === 0) return false;\r\n \r\n const snapshotIndex = index >= 0 ? index : this.snapshots.length - 1;\r\n const snapshot = this.snapshots[snapshotIndex];\r\n \r\n if (!snapshot) return false;\r\n \r\n this.rawData = this._clone(snapshot);\r\n this.createReactiveData();\r\n \r\n Object.keys(this.rawData).forEach(key => {\r\n this.queueUpdate(key, this.rawData[key]);\r\n });\r\n \r\n this.processComputed();\r\n return true;\r\n }\r\n\r\n getSnapshotCount() {\r\n return this.snapshots.length;\r\n }\r\n\r\n clearSnapshots() {\r\n this.snapshots = [];\r\n }\r\n\r\n serializeForm(formElement) {\r\n const data = {};\r\n \r\n formElement.querySelectorAll('input, select, textarea').forEach(element => {\r\n const name = element.getAttribute('data-bind');\r\n if (!name) return;\r\n \r\n const parts = name.split(':');\r\n const key = parts[1]?.trim();\r\n if (!key) return;\r\n \r\n if (element.type === 'checkbox') {\r\n if (!data[key]) data[key] = [];\r\n if (element.checked) {\r\n data[key].push(element.value);\r\n }\r\n } else if (element.type === 'radio') {\r\n if (element.checked) {\r\n data[key] = element.value;\r\n }\r\n } else {\r\n data[key] = element.value;\r\n }\r\n });\r\n \r\n return data;\r\n }\r\n\r\n fillForm(formElement, data) {\r\n Object.keys(data).forEach(key => {\r\n formElement.querySelectorAll('[data-bind*=\":' + key + '\"]').forEach(element => {\r\n if (element.type === 'checkbox') {\r\n element.checked = Array.isArray(data[key]) \r\n ? data[key].includes(element.value) \r\n : !!data[key];\r\n } else if (element.type === 'radio') {\r\n element.checked = element.value === data[key];\r\n } else {\r\n element.value = data[key] ?? '';\r\n }\r\n });\r\n });\r\n }\r\n\r\n createReactive(target, path = '') {\r\n if (target[REACTIVE_SYMBOLS.isReactive]) return target;\r\n \r\n if (this._proxyCache.has(target)) {\r\n return this._proxyCache.get(target);\r\n }\r\n \r\n const handler = {\r\n get: (target, key, receiver) => {\r\n if (key === '__raw__') return target;\r\n if (key === REACTIVE_SYMBOLS.parent || key === '__parent__') return target[REACTIVE_SYMBOLS.parent];\r\n if (key === REACTIVE_SYMBOLS.path || key === '__path__') return target[REACTIVE_SYMBOLS.path];\r\n if (key === REACTIVE_SYMBOLS.isReactive || key === '__isReactive__') return true;\r\n \r\n const result = Reflect.get(target, key, receiver);\r\n if (result && typeof result === 'object' && !Array.isArray(result)) {\r\n return this.wrapReactive(result, `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`);\r\n }\r\n return result;\r\n },\r\n set: (target, key, value, receiver) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive ||\r\n key === '__parent__' ||\r\n key === '__path__' ||\r\n key === '__isReactive__') {\r\n return true;\r\n }\r\n \r\n const oldValue = Reflect.get(target, key, receiver);\r\n const result = Reflect.set(target, key, value, receiver);\r\n \r\n const fullPath = `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`;\r\n this.notify(fullPath, value, oldValue);\r\n this.queueUpdate(fullPath, value);\r\n \r\n return result;\r\n },\r\n deleteProperty: (target, key) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive) {\r\n return false;\r\n }\r\n \r\n const oldValue = Reflect.get(target, key);\r\n const result = Reflect.deleteProperty(target, key);\r\n \r\n const fullPath = `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`;\r\n this.notify(fullPath, undefined, oldValue);\r\n this.queueUpdate(fullPath, undefined);\r\n \r\n return result;\r\n },\r\n has: (target, key) => {\r\n if (key === '__raw__' || \r\n key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive ||\r\n key === '__parent__' ||\r\n key === '__path__' ||\r\n key === '__isReactive__') {\r\n return true;\r\n }\r\n return key in target;\r\n },\r\n ownKeys: (target) => {\r\n return Reflect.ownKeys(target).filter(key => \r\n key !== REACTIVE_SYMBOLS.parent && \r\n key !== REACTIVE_SYMBOLS.path && \r\n key !== REACTIVE_SYMBOLS.isReactive\r\n );\r\n },\r\n getOwnPropertyDescriptor: (target, key) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive) {\r\n return {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: target[key]\r\n };\r\n }\r\n return Reflect.getOwnPropertyDescriptor(target, key);\r\n }\r\n };\r\n \r\n const proxy = new Proxy(target, handler);\r\n target[REACTIVE_SYMBOLS.parent] = target;\r\n target[REACTIVE_SYMBOLS.path] = path;\r\n target[REACTIVE_SYMBOLS.isReactive] = true;\r\n this._proxyCache.set(target, proxy);\r\n \r\n Object.keys(target).forEach(key => {\r\n if (target[key] && typeof target[key] === 'object' && !Array.isArray(target[key])) {\r\n target[key] = this.wrapReactive(target[key], `${path}${path ? '.' : ''}${key}`);\r\n }\r\n });\r\n \r\n return proxy;\r\n }\r\n\r\n bind() {\r\n document.querySelectorAll('[data-bind]').forEach(element => {\r\n this._bindElement(element);\r\n });\r\n \r\n if (!this._mutationObserver) {\r\n this._mutationObserver = new MutationObserver((mutations) => {\r\n mutations.forEach(mutation => {\r\n mutation.addedNodes.forEach(node => {\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n const bindElements = node.querySelectorAll('[data-bind]');\r\n bindElements.forEach(element => this._bindElement(element));\r\n if (node.hasAttribute && node.hasAttribute('data-bind')) {\r\n this._bindElement(node);\r\n }\r\n }\r\n });\r\n });\r\n });\r\n \r\n this._mutationObserver.observe(document.body, {\r\n childList: true,\r\n subtree: true\r\n });\r\n }\r\n }\r\n\r\n _bindElement(element) {\r\n const binding = element.getAttribute('data-bind');\r\n const parts = binding.split(':');\r\n const typePart = parts[0].split('|')[0].trim();\r\n const key = parts[1]?.trim();\r\n \r\n if (!key) return;\r\n \r\n this.pathTrie.insert(key);\r\n \r\n if (!this.elements[key]) {\r\n this.elements[key] = [];\r\n }\r\n \r\n if (!this.elements[key].includes(element)) {\r\n this.elements[key].push(element);\r\n }\r\n \r\n if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA' || element.tagName === 'SELECT') {\r\n const existingHandler = element.__kupolaBindHandler;\r\n if (existingHandler) {\r\n element.removeEventListener('input', existingHandler);\r\n }\r\n \r\n const handler = () => {\r\n const value = element.type === 'checkbox' ? element.checked : element.value;\r\n if (key.includes('.')) {\r\n this.setNested(key, value);\r\n } else {\r\n this.set(key, value);\r\n }\r\n };\r\n \r\n element.__kupolaBindHandler = handler;\r\n element.addEventListener('input', handler);\r\n }\r\n \r\n if (this.rawData[key] !== undefined) {\r\n this.updateElement(element, this.rawData[key]);\r\n }\r\n }\r\n\r\n destroy() {\r\n if (this._mutationObserver) {\r\n this._mutationObserver.disconnect();\r\n this._mutationObserver = null;\r\n }\r\n \r\n Object.values(this.elements).forEach(elements => {\r\n elements.forEach(element => {\r\n const handler = element.__kupolaBindHandler;\r\n if (handler) {\r\n element.removeEventListener('input', handler);\r\n delete element.__kupolaBindHandler;\r\n }\r\n });\r\n });\r\n \r\n this.persistedKeys.forEach((config, key) => {\r\n if (config.timeout) clearTimeout(config.timeout);\r\n });\r\n this.persistedKeys.clear();\r\n \r\n this.rawData = {};\r\n this.observers = {};\r\n this.elements = {};\r\n this.computedProperties = {};\r\n this.pathTrie = new PathTrie();\r\n this.updateQueue.clear();\r\n this.snapshots = [];\r\n }\r\n}\r\n\r\nclass KupolaStore {\r\n constructor(name, options = {}) {\r\n this.name = name;\r\n this._stateKey = `__store_${name}__`;\r\n \r\n const initialState = options.state ? options.state() : {};\r\n this.getters = options.getters || {};\r\n this.actions = options.actions || {};\r\n this.mutations = options.mutations || {};\r\n \r\n this.observers = {};\r\n \r\n if (window.kupolaData) {\r\n window.kupolaData.set(this._stateKey, initialState);\r\n this.state = window.kupolaData.data?.[this._stateKey] || \r\n window.kupolaData.createReactive(initialState, this._stateKey);\r\n \r\n window.kupolaData.observe(this._stateKey, (newState) => {\r\n this.notify(newState);\r\n });\r\n } else {\r\n this.state = initialState;\r\n }\r\n \r\n this._bindGetters();\r\n this._bindActions();\r\n }\r\n\r\n _bindGetters() {\r\n Object.keys(this.getters).forEach(name => {\r\n Object.defineProperty(this, name, {\r\n get: () => this.getters[name](this.state),\r\n enumerable: true\r\n });\r\n });\r\n }\r\n\r\n _bindActions() {\r\n Object.keys(this.actions).forEach(name => {\r\n this[name] = (...args) => {\r\n return this.actions[name]({\r\n state: this.state,\r\n commit: this.commit.bind(this),\r\n dispatch: this.dispatch.bind(this),\r\n getters: this\r\n }, ...args);\r\n };\r\n });\r\n }\r\n\r\n commit(type, payload) {\r\n const mutation = this.mutations[type];\r\n if (!mutation) {\r\n console.warn(`Mutation ${type} not found in store ${this.name}`);\r\n return;\r\n }\r\n \r\n mutation(this.state, payload);\r\n }\r\n\r\n dispatch(type, payload) {\r\n const action = this.actions[type];\r\n if (!action) {\r\n console.warn(`Action ${type} not found in store ${this.name}`);\r\n return;\r\n }\r\n \r\n return action({\r\n state: this.state,\r\n commit: this.commit.bind(this),\r\n dispatch: this.dispatch.bind(this),\r\n getters: this\r\n }, payload);\r\n }\r\n\r\n observe(callback) {\r\n if (!this.observers['*']) {\r\n this.observers['*'] = [];\r\n }\r\n this.observers['*'].push(callback);\r\n return callback;\r\n }\r\n\r\n unobserve(callback) {\r\n if (this.observers['*']) {\r\n this.observers['*'] = this.observers['*'].filter(cb => cb !== callback);\r\n }\r\n }\r\n\r\n notify(newState) {\r\n if (this.observers['*']) {\r\n this.observers['*'].forEach(callback => {\r\n try {\r\n callback(newState);\r\n } catch (e) {\r\n console.error(`Observer error for store ${this.name}:`, e);\r\n }\r\n });\r\n }\r\n \r\n if (window.kupolaData) {\r\n window.kupolaData.set(this.name, newState);\r\n }\r\n }\r\n\r\n toJSON() {\r\n return {\r\n name: this.name,\r\n state: this.state,\r\n getters: Object.keys(this.getters).reduce((acc, name) => {\r\n acc[name] = this[name];\r\n return acc;\r\n }, {})\r\n };\r\n }\r\n}\r\n\r\nclass KupolaStoreManager {\r\n constructor() {\r\n this.stores = new Map();\r\n }\r\n\r\n createStore(name, options) {\r\n const store = new KupolaStore(name, options);\r\n this.stores.set(name, store);\r\n return store;\r\n }\r\n\r\n getStore(name) {\r\n return this.stores.get(name);\r\n }\r\n\r\n registerStore(store) {\r\n if (store instanceof KupolaStore) {\r\n this.stores.set(store.name, store);\r\n }\r\n }\r\n\r\n dispose() {\r\n this.stores.clear();\r\n }\r\n}\r\n\r\nclass KupolaEventBus {\r\n constructor() {\r\n this.events = {};\r\n this.delegatedEvents = {};\r\n this.eventListeners = {};\r\n }\r\n\r\n on(eventName, callback) {\r\n if (!this.events[eventName]) {\r\n this.events[eventName] = [];\r\n }\r\n this.events[eventName].push(callback);\r\n return callback;\r\n }\r\n\r\n off(eventName, callback) {\r\n if (this.events[eventName]) {\r\n this.events[eventName] = this.events[eventName].filter(cb => cb !== callback);\r\n }\r\n }\r\n\r\n emit(eventName, data) {\r\n if (this.events[eventName]) {\r\n this.events[eventName].forEach(callback => {\r\n try {\r\n callback(data);\r\n } catch (e) {\r\n console.error(`Error in event handler for ${eventName}:`, e);\r\n }\r\n });\r\n }\r\n \r\n this.events['*']?.forEach(callback => {\r\n try {\r\n callback(eventName, data);\r\n } catch (e) {\r\n console.error(`Error in wildcard event handler:`, e);\r\n }\r\n });\r\n }\r\n\r\n once(eventName, callback) {\r\n const onceCallback = (data) => {\r\n callback(data);\r\n this.off(eventName, onceCallback);\r\n };\r\n this.on(eventName, onceCallback);\r\n return onceCallback;\r\n }\r\n\r\n delegate(selector, eventName, callback) {\r\n if (!this.delegatedEvents[eventName]) {\r\n this.delegatedEvents[eventName] = [];\r\n \r\n const listener = (e) => {\r\n this.delegatedEvents[eventName].forEach(({ selector: sel, cb }) => {\r\n if (e.target.matches(sel) || e.target.closest(sel)) {\r\n cb(e);\r\n }\r\n });\r\n };\r\n \r\n document.addEventListener(eventName, listener);\r\n this.eventListeners[eventName] = listener;\r\n }\r\n \r\n this.delegatedEvents[eventName].push({ selector, cb: callback });\r\n return callback;\r\n }\r\n\r\n undelegate(selector, eventName) {\r\n if (this.delegatedEvents[eventName]) {\r\n this.delegatedEvents[eventName] = this.delegatedEvents[eventName].filter(\r\n item => item.selector !== selector\r\n );\r\n \r\n if (this.delegatedEvents[eventName].length === 0) {\r\n const listener = this.eventListeners[eventName];\r\n if (listener) {\r\n document.removeEventListener(eventName, listener);\r\n delete this.eventListeners[eventName];\r\n }\r\n delete this.delegatedEvents[eventName];\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n Object.entries(this.eventListeners).forEach(([eventName, listener]) => {\r\n document.removeEventListener(eventName, listener);\r\n });\r\n \r\n this.events = {};\r\n this.delegatedEvents = {};\r\n this.eventListeners = {};\r\n }\r\n}\r\n\r\n// ============================================================\r\n// Lightweight ref() — standalone reactive primitive\r\n// ============================================================\r\n\r\nfunction ref(initialValue = null) {\r\n const refObj = {\r\n _value: initialValue,\r\n _subscribers: new Set()\r\n };\r\n\r\n Object.defineProperty(refObj, 'value', {\r\n configurable: true,\r\n enumerable: true,\r\n get() { return refObj._value; },\r\n set(newValue) {\r\n if (newValue !== refObj._value) {\r\n refObj._value = newValue;\r\n refObj._subscribers.forEach(sub => sub(newValue));\r\n }\r\n }\r\n });\r\n\r\n return refObj;\r\n}\r\n\r\n/** @type {KupolaDataBind} Global data binding instance */\r\nconst kupolaData = new KupolaDataBind();\r\n/** @type {KupolaEventBus} Global event bus instance */\r\nconst kupolaEvents = new KupolaEventBus();\r\n/** @type {KupolaStoreManager} Global store manager instance */\r\nconst kupolaStoreManager = new KupolaStoreManager();\r\n\r\n/** Create a named reactive store with state, getters, mutations, and actions. */\r\nfunction createStore(name, options) {\r\n return kupolaStoreManager.createStore(name, options);\r\n}\r\n\r\n/** Get a previously created store by name. */\r\nfunction getStore(name) {\r\n return kupolaStoreManager.getStore(name);\r\n}\r\n\r\nexport { TrieNode, PathTrie, REACTIVE_SYMBOLS };\r\nexport { KupolaDataBind, KupolaEventBus, KupolaStore, KupolaStoreManager };\r\nexport { kupolaData, kupolaEvents, kupolaStoreManager };\r\nexport { createStore, getStore };\r\nexport { ref };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.KupolaDataBind = KupolaDataBind;\r\n window.KupolaEventBus = KupolaEventBus;\r\n window.KupolaStore = KupolaStore;\r\n window.KupolaStoreManager = KupolaStoreManager;\r\n window.kupolaData = kupolaData;\r\n window.kupolaEvents = kupolaEvents;\r\n window.kupolaStoreManager = kupolaStoreManager;\r\n window.createStore = createStore;\r\n window.getStore = getStore;\r\n window.kupolaRef = ref;\r\n}\r\n","const THEME_KEY = 'kupola-theme';\r\nconst BRAND_KEY = 'kupola-brand';\r\n\r\nconst BRAND_OPTIONS = [\r\n { id: 'green', name: '翠绿', color: '#32F08C' },\r\n { id: 'xionghuang', name: '雄黄', color: '#FF9900' },\r\n { id: 'jianghuang', name: '姜黄', color: '#E2C027' },\r\n { id: 'lanlv', name: '蓝绿', color: '#12A182' },\r\n { id: 'kongquelan', name: '孔雀蓝', color: '#0EB0C9' },\r\n { id: 'meiguizi', name: '玫瑰紫', color: '#BA2F7B' },\r\n { id: 'shihong', name: '柿红', color: '#F2481B' },\r\n { id: 'quhong', name: '紫云', color: '#B1A6CC' },\r\n { id: 'shanchahong', name: '山茶红', color: '#F05A46' },\r\n { id: 'zengqing', name: '曾青', color: '#535164' },\r\n { id: 'roulan', name: '柔蓝', color: '#106898' }\r\n];\r\n\r\nfunction getTheme() {\r\n return localStorage.getItem(THEME_KEY) || 'dark';\r\n}\r\n\r\nfunction setTheme(theme) {\r\n if (theme !== 'dark' && theme !== 'light') return;\r\n \r\n document.documentElement.setAttribute('data-theme', theme);\r\n localStorage.setItem(THEME_KEY, theme);\r\n \r\n const toggleBtn = document.querySelector('[data-theme-toggle]');\r\n if (toggleBtn) {\r\n toggleBtn.setAttribute('data-current-theme', theme);\r\n const icon = toggleBtn.querySelector('.theme-icon');\r\n if (icon) {\r\n const iconPath = icon.src.substring(0, icon.src.lastIndexOf('/') + 1);\r\n icon.src = theme === 'dark' \r\n ? iconPath + 'sun.svg' \r\n : iconPath + 'moon.svg';\r\n }\r\n }\r\n}\r\n\r\nfunction getBrand() {\r\n return localStorage.getItem(BRAND_KEY) || 'zengqing';\r\n}\r\n\r\nfunction setBrand(brandId) {\r\n const brand = BRAND_OPTIONS.find(b => b.id === brandId);\r\n if (!brand) return;\r\n \r\n document.documentElement.setAttribute('data-brand', brandId);\r\n localStorage.setItem(BRAND_KEY, brandId);\r\n \r\n const brandToggle = document.querySelector('[data-brand-toggle]');\r\n if (brandToggle) {\r\n brandToggle.setAttribute('data-current-brand', brandId);\r\n const brandIcon = brandToggle.querySelector('.brand-icon');\r\n if (brandIcon) {\r\n brandIcon.style.backgroundColor = brand.color;\r\n }\r\n const brandName = brandToggle.querySelector('.brand-name');\r\n if (brandName) {\r\n brandName.textContent = brand.name;\r\n }\r\n }\r\n \r\n const brandButtons = document.querySelectorAll('[data-brand-btn]');\r\n brandButtons.forEach(btn => {\r\n if (btn.getAttribute('data-brand-btn') === brandId) {\r\n btn.classList.add('is-active');\r\n } else {\r\n btn.classList.remove('is-active');\r\n }\r\n });\r\n}\r\n\r\nfunction initTheme() {\r\n \r\n const savedTheme = getTheme();\r\n setTheme(savedTheme);\r\n \r\n const savedBrand = getBrand();\r\n setBrand(savedBrand);\r\n \r\n const toggleBtn = document.querySelector('[data-theme-toggle]');\r\n if (toggleBtn) {\r\n toggleBtn.addEventListener('click', () => {\r\n const currentTheme = getTheme();\r\n const newTheme = currentTheme === 'dark' ? 'light' : 'dark';\r\n setTheme(newTheme);\r\n });\r\n }\r\n \r\n let brandPicker = document.getElementById('brand-picker');\r\n if (!brandPicker) {\r\n brandPicker = document.createElement('div');\r\n brandPicker.id = 'brand-picker';\r\n brandPicker.style.position = 'fixed';\r\n brandPicker.style.top = '64px';\r\n brandPicker.style.right = '16px';\r\n brandPicker.style.zIndex = '9998';\r\n brandPicker.style.display = 'none';\r\n brandPicker.style.padding = '12px';\r\n brandPicker.style.width = '200px';\r\n brandPicker.style.gridTemplateColumns = 'repeat(3, 1fr)';\r\n brandPicker.style.gap = '6px';\r\n brandPicker.style.backgroundColor = 'var(--bg-base-secondary)';\r\n brandPicker.style.border = '1px solid var(--border-neutral-l1)';\r\n brandPicker.style.borderRadius = '8px';\r\n brandPicker.style.boxShadow = '0 4px 20px rgba(0, 0, 0, 0.2)';\r\n brandPicker.style.overflow = 'hidden';\r\n \r\n BRAND_OPTIONS.forEach(brand => {\r\n const btn = document.createElement('button');\r\n btn.setAttribute('data-brand-btn', brand.id);\r\n btn.style.display = 'flex';\r\n btn.style.justifyContent = 'center';\r\n btn.style.alignItems = 'center';\r\n btn.style.height = '60px';\r\n btn.style.backgroundColor = brand.color;\r\n btn.style.color = ['#32F08C', '#FF9900', '#E2C027', '#0EB0C9', '#B1A6CC'].includes(brand.color) ? '#0C0C0D' : '#FFFFFF';\r\n btn.style.fontWeight = '500';\r\n btn.style.borderRadius = '4px';\r\n btn.style.border = 'none';\r\n btn.style.cursor = 'pointer';\r\n btn.style.margin = '0';\r\n btn.style.padding = '0';\r\n btn.textContent = brand.name;\r\n brandPicker.appendChild(btn);\r\n });\r\n \r\n document.body.appendChild(brandPicker);\r\n }\r\n \r\n const brandToggle = document.querySelector('[data-brand-toggle]');\r\n \r\n if (brandToggle && brandPicker) {\r\n brandToggle.onclick = function(e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n const isHidden = brandPicker.style.display === 'none';\r\n brandPicker.style.display = isHidden ? 'grid' : 'none';\r\n \r\n if (isHidden) {\r\n setTimeout(() => {\r\n document.addEventListener('click', closeBrandPicker, true);\r\n }, 0);\r\n } else {\r\n document.removeEventListener('click', closeBrandPicker, true);\r\n }\r\n };\r\n \r\n brandPicker.onclick = function(e) {\r\n e.stopPropagation();\r\n };\r\n }\r\n \r\n function closeBrandPicker(e) {\r\n if (brandPicker && brandToggle) {\r\n if (!brandPicker.contains(e.target) && !brandToggle.contains(e.target)) {\r\n brandPicker.style.display = 'none';\r\n document.removeEventListener('click', closeBrandPicker, true);\r\n }\r\n }\r\n }\r\n \r\n const brandButtons = document.querySelectorAll('[data-brand-btn]');\r\n \r\n brandButtons.forEach(btn => {\r\n btn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n const brandId = btn.getAttribute('data-brand-btn');\r\n setBrand(brandId);\r\n if (brandPicker) {\r\n brandPicker.style.display = 'none';\r\n }\r\n });\r\n });\r\n}\r\n\r\nfunction createThemeToggle() {\r\n const btn = document.createElement('button');\r\n btn.setAttribute('data-theme-toggle', '');\r\n btn.setAttribute('data-current-theme', getTheme());\r\n btn.className = 'ds-btn ds-btn--ghost ds-btn--sm ds-btn--icon';\r\n btn.style.position = 'fixed';\r\n btn.style.top = '16px';\r\n btn.style.right = '16px';\r\n btn.style.zIndex = '9999';\r\n \r\n const icon = document.createElement('img');\r\n icon.className = 'theme-icon';\r\n const scripts = document.getElementsByTagName('script');\r\n const currentScript = scripts[scripts.length - 1];\r\n const scriptPath = currentScript.src.substring(0, currentScript.src.lastIndexOf('/') + 1);\r\n icon.src = getTheme() === 'dark' \r\n ? scriptPath + '../icons/sun.svg' \r\n : scriptPath + '../icons/moon.svg';\r\n icon.width = 14;\r\n icon.height = 14;\r\n icon.alt = 'Toggle theme';\r\n \r\n btn.appendChild(icon);\r\n document.body.appendChild(btn);\r\n \r\n btn.addEventListener('click', () => {\r\n const currentTheme = getTheme();\r\n const newTheme = currentTheme === 'dark' ? 'light' : 'dark';\r\n setTheme(newTheme);\r\n });\r\n \r\n return btn;\r\n}\r\n\r\nfunction createBrandPicker() {\r\n const container = document.createElement('div');\r\n container.id = 'brand-picker-auto';\r\n container.style.position = 'fixed';\r\n container.style.top = '56px';\r\n container.style.right = '16px';\r\n container.style.zIndex = '9998';\r\n container.style.display = 'none';\r\n container.style.padding = '12px';\r\n container.style.width = '200px';\r\n container.style.gridTemplateColumns = 'repeat(3, 1fr)';\r\n container.style.gap = '6px';\r\n container.style.backgroundColor = 'var(--bg-base-secondary)';\r\n container.style.border = '1px solid var(--border-neutral-l1)';\r\n container.style.borderRadius = '8px';\r\n container.style.boxShadow = '0 4px 20px rgba(0, 0, 0, 0.2)';\r\n container.style.overflow = 'hidden';\r\n \r\n BRAND_OPTIONS.forEach(brand => {\r\n const btn = document.createElement('button');\r\n btn.setAttribute('data-brand-btn', brand.id);\r\n btn.style.display = 'flex';\r\n btn.style.justifyContent = 'center';\r\n btn.style.alignItems = 'center';\r\n btn.style.height = '60px';\r\n btn.style.backgroundColor = brand.color;\r\n btn.style.color = ['#32F08C', '#FF9900', '#E2C027', '#0EB0C9', '#B1A6CC'].includes(brand.color) ? '#0C0C0D' : '#FFFFFF';\r\n btn.style.fontWeight = '500';\r\n btn.style.borderRadius = '4px';\r\n btn.style.border = 'none';\r\n btn.style.cursor = 'pointer';\r\n btn.style.margin = '0';\r\n btn.style.padding = '0';\r\n btn.textContent = brand.name;\r\n container.appendChild(btn);\r\n });\r\n \r\n document.body.appendChild(container);\r\n \r\n const toggleBtn = document.createElement('button');\r\n toggleBtn.setAttribute('data-brand-toggle', '');\r\n toggleBtn.setAttribute('data-current-brand', getBrand());\r\n toggleBtn.className = 'ds-btn ds-btn--ghost ds-btn--sm';\r\n toggleBtn.style.position = 'fixed';\r\n toggleBtn.style.top = '16px';\r\n toggleBtn.style.right = '56px';\r\n toggleBtn.style.zIndex = '9999';\r\n toggleBtn.style.display = 'flex';\r\n toggleBtn.style.alignItems = 'center';\r\n toggleBtn.style.gap = '6px';\r\n \r\n const brandIcon = document.createElement('span');\r\n brandIcon.className = 'brand-icon';\r\n brandIcon.style.width = '12px';\r\n brandIcon.style.height = '12px';\r\n brandIcon.style.borderRadius = '50%';\r\n brandIcon.style.backgroundColor = BRAND_OPTIONS.find(b => b.id === getBrand()).color;\r\n \r\n const brandName = document.createElement('span');\r\n brandName.className = 'brand-name';\r\n brandName.style.fontSize = '11px';\r\n brandName.textContent = BRAND_OPTIONS.find(b => b.id === getBrand()).name;\r\n \r\n toggleBtn.appendChild(brandIcon);\r\n toggleBtn.appendChild(brandName);\r\n document.body.appendChild(toggleBtn);\r\n \r\n toggleBtn.onclick = function(e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n const isHidden = container.style.display === 'none';\r\n container.style.display = isHidden ? 'grid' : 'none';\r\n \r\n if (isHidden) {\r\n setTimeout(() => {\r\n document.addEventListener('click', closeBrandPickerAuto, true);\r\n }, 0);\r\n } else {\r\n document.removeEventListener('click', closeBrandPickerAuto, true);\r\n }\r\n };\r\n \r\n container.onclick = function(e) {\r\n e.stopPropagation();\r\n };\r\n \r\n function closeBrandPickerAuto(e) {\r\n if (!container.contains(e.target) && !toggleBtn.contains(e.target)) {\r\n container.style.display = 'none';\r\n document.removeEventListener('click', closeBrandPickerAuto, true);\r\n }\r\n }\r\n \r\n const brandButtons = container.querySelectorAll('[data-brand-btn]');\r\n brandButtons.forEach(btn => {\r\n btn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n const brandId = btn.getAttribute('data-brand-btn');\r\n setBrand(brandId);\r\n container.style.display = 'none';\r\n });\r\n });\r\n \r\n return { toggleBtn, container };\r\n}\r\n\r\nexport { \r\n getTheme, setTheme, initTheme, createThemeToggle,\r\n getBrand, setBrand, BRAND_OPTIONS, createBrandPicker,\r\n THEME_KEY, BRAND_KEY\r\n};\r\n\r\nif (typeof window !== 'undefined') {\r\n window.getTheme = getTheme;\r\n window.setTheme = setTheme;\r\n window.initTheme = initTheme;\r\n window.createThemeToggle = createThemeToggle;\r\n window.getBrand = getBrand;\r\n window.setBrand = setBrand;\r\n window.BRAND_OPTIONS = BRAND_OPTIONS;\r\n window.createBrandPicker = createBrandPicker;\r\n}","/**\r\n * Component Initializer Registry — auto-discovery and lifecycle management for declarative components.\r\n * Scans the DOM for `data-*` attributes or CSS classes, calls init functions,\r\n * and uses MutationObserver for dynamically added elements.\r\n */\r\nclass ComponentInitializerRegistry {\r\n constructor() {\r\n this.initializers = new Map();\r\n this.cleanupFunctions = new Map();\r\n this.processedElements = new WeakSet();\r\n // Single source of truth for selectors\r\n this._dataAttrs = ['data-component'];\r\n this._cssClasses = [];\r\n this._cachedSelector = null;\r\n }\r\n\r\n /**\r\n * Register a component initializer.\r\n * @param {string} name - Component name\r\n * @param {Function} initFn - Init function called with the DOM element\r\n * @param {Function} [cleanupFn] - Optional cleanup/destroy function\r\n * @param {Object} [options] - { dataAttribute, cssClass } for auto-discovery\r\n */\r\n register(name, initFn, cleanupFn = null, options = {}) {\r\n this.initializers.set(name, initFn);\r\n if (cleanupFn) {\r\n this.cleanupFunctions.set(name, cleanupFn);\r\n }\r\n // Auto-register selectors\r\n if (options.dataAttribute && !this._dataAttrs.includes(options.dataAttribute)) {\r\n this._dataAttrs.push(options.dataAttribute);\r\n this._cachedSelector = null;\r\n }\r\n if (options.cssClass && !this._cssClasses.includes(options.cssClass)) {\r\n this._cssClasses.push(options.cssClass);\r\n this._cachedSelector = null;\r\n }\r\n }\r\n\r\n unregister(name) {\r\n this.initializers.delete(name);\r\n this.cleanupFunctions.delete(name);\r\n }\r\n\r\n has(name) {\r\n return this.initializers.has(name);\r\n }\r\n\r\n get(name) {\r\n return this.initializers.get(name);\r\n }\r\n\r\n _buildSelector() {\r\n if (this._cachedSelector !== null) return this._cachedSelector;\r\n const parts = this._dataAttrs.map(a => `[${a}]`);\r\n for (const cls of this._cssClasses) {\r\n parts.push(`.${cls}`);\r\n }\r\n this._cachedSelector = parts.join(', ');\r\n return this._cachedSelector;\r\n }\r\n\r\n /** Initialize a single DOM element if it matches a registered component. */\r\n async initialize(element) {\r\n if (this.processedElements.has(element)) return;\r\n\r\n // Check data attributes\r\n for (const attr of this._dataAttrs) {\r\n const value = element.getAttribute(attr);\r\n if (value !== null) {\r\n const name = value || attr.replace('data-', '');\r\n const initFn = this.initializers.get(name) || this.initializers.get(attr.replace('data-', ''));\r\n if (initFn) {\r\n try {\r\n await initFn(element);\r\n this.processedElements.add(element);\r\n } catch (error) {\r\n console.error(`[ComponentInitializerRegistry] Error initializing \"${name}\":`, error);\r\n }\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // Check CSS classes\r\n const className = element.className;\r\n if (typeof className === 'string') {\r\n for (const cls of this._cssClasses) {\r\n if (className.includes(cls)) {\r\n const name = cls.replace('ds-', '');\r\n const initFn = this.initializers.get(name) || this.initializers.get(cls);\r\n if (initFn) {\r\n try {\r\n await initFn(element);\r\n this.processedElements.add(element);\r\n } catch (error) {\r\n console.error(`[ComponentInitializerRegistry] Error initializing \"${name}\":`, error);\r\n }\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Run cleanup/destroy for a single DOM element. */\r\n cleanup(element) {\r\n // Check data attributes\r\n for (const attr of this._dataAttrs) {\r\n const value = element.getAttribute(attr);\r\n if (value !== null) {\r\n const name = value || attr.replace('data-', '');\r\n const cleanupFn = this.cleanupFunctions.get(name) || this.cleanupFunctions.get(attr.replace('data-', ''));\r\n if (cleanupFn) {\r\n try {\r\n cleanupFn(element);\r\n } catch (error) {\r\n console.error(`[ComponentInitializerRegistry] Error cleaning up \"${name}\":`, error);\r\n }\r\n this.processedElements.delete(element);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // Check CSS classes\r\n const className = element.className;\r\n if (typeof className === 'string') {\r\n for (const cls of this._cssClasses) {\r\n if (className.includes(cls)) {\r\n const name = cls.replace('ds-', '');\r\n const cleanupFn = this.cleanupFunctions.get(name) || this.cleanupFunctions.get(cls);\r\n if (cleanupFn) {\r\n try {\r\n cleanupFn(element);\r\n } catch (error) {\r\n console.error(`[ComponentInitializerRegistry] Error cleaning up \"${name}\":`, error);\r\n }\r\n this.processedElements.delete(element);\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Scan and initialize all matching components. Uses MutationObserver for dynamic content. */\r\n async initializeAll(root = document) {\r\n const selector = this._buildSelector();\r\n if (!selector) return;\r\n\r\n const elements = root.querySelectorAll(selector);\r\n const promises = [];\r\n elements.forEach(element => {\r\n if (!this.processedElements.has(element)) {\r\n promises.push(this.initialize(element));\r\n }\r\n });\r\n await Promise.all(promises);\r\n }\r\n}\r\n\r\n/** @type {ComponentInitializerRegistry} Global initializer instance */\r\nconst kupolaInitializer = new ComponentInitializerRegistry();\r\n\r\n// Pre-register known component selectors\r\nconst knownComponents = [\r\n { attr: 'data-dropdown', cls: 'ds-dropdown' },\r\n { attr: 'data-select', cls: 'ds-select' },\r\n { attr: 'data-datepicker', cls: 'ds-datepicker' },\r\n { attr: 'data-timepicker', cls: 'ds-timepicker' },\r\n { attr: 'data-slider', cls: 'ds-slider' },\r\n { attr: 'data-carousel', cls: 'ds-carousel' },\r\n { attr: 'data-drawer', cls: 'ds-drawer' },\r\n { attr: 'data-modal', cls: 'ds-modal' },\r\n { attr: 'data-dialog', cls: 'ds-dialog' },\r\n { attr: 'data-color-picker', cls: 'ds-color-picker' },\r\n { attr: 'data-calendar', cls: 'ds-calendar' },\r\n { attr: 'data-slide-captcha', cls: 'ds-slide-captcha' },\r\n { attr: 'data-heatmap', cls: 'ds-heatmap' },\r\n { cls: 'ds-tooltip' },\r\n { cls: 'ds-tag' },\r\n { cls: 'ds-statcard' },\r\n { cls: 'ds-collapse' },\r\n { cls: 'ds-fileupload' },\r\n { cls: 'ds-notification' },\r\n { cls: 'ds-message' }\r\n];\r\n\r\nfor (const comp of knownComponents) {\r\n if (comp.attr && !kupolaInitializer._dataAttrs.includes(comp.attr)) {\r\n kupolaInitializer._dataAttrs.push(comp.attr);\r\n }\r\n if (comp.cls && !kupolaInitializer._cssClasses.includes(comp.cls)) {\r\n kupolaInitializer._cssClasses.push(comp.cls);\r\n }\r\n}\r\n\r\nexport { ComponentInitializerRegistry, kupolaInitializer };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.ComponentInitializerRegistry = ComponentInitializerRegistry;\r\n window.kupolaInitializer = kupolaInitializer;\r\n}","import { KupolaLifecycle } from './kupola-lifecycle.js';\r\n\r\nexport class KupolaComponent {\r\n constructor(element) {\r\n this.element = element;\r\n this.isMounted = false;\r\n this.isDestroyed = false;\r\n this.props = this._parseProps();\r\n this.state = {};\r\n this.slots = this._parseSlots();\r\n this._eventListeners = {};\r\n this._appliedMixins = [];\r\n this.lifecycle = new KupolaLifecycle();\r\n this.setupContext = null;\r\n }\r\n\r\n _parseProps() {\r\n const props = {};\r\n for (const attr of this.element.attributes) {\r\n if (attr.name.startsWith('data-prop-')) {\r\n const name = attr.name.replace('data-prop-', '');\r\n let value = attr.value;\r\n try {\r\n value = JSON.parse(value);\r\n } catch (e) {}\r\n props[name] = value;\r\n }\r\n }\r\n return props;\r\n }\r\n\r\n _parseSlots() {\r\n const slots = {};\r\n const slotElements = this.element.querySelectorAll('[data-slot]');\r\n \r\n slotElements.forEach(slotEl => {\r\n const slotName = slotEl.getAttribute('data-slot') || 'default';\r\n slots[slotName] = slotEl.innerHTML.trim();\r\n slotEl.remove();\r\n });\r\n \r\n if (!slots.default && this.element.children.length > 0) {\r\n slots.default = this.element.innerHTML.trim();\r\n }\r\n \r\n return slots;\r\n }\r\n\r\n $slot(name = 'default') {\r\n return this.slots[name] || '';\r\n }\r\n\r\n $emit(eventName, data) {\r\n const handlers = this._eventListeners[eventName] || [];\r\n handlers.forEach(handler => {\r\n try {\r\n handler(data);\r\n } catch (e) {\r\n console.error(`Error in event handler for ${eventName}:`, e);\r\n }\r\n });\r\n \r\n if (this.element) {\r\n const customEvent = new CustomEvent(`kupola:${eventName}`, {\r\n detail: data,\r\n bubbles: true,\r\n cancelable: true\r\n });\r\n this.element.dispatchEvent(customEvent);\r\n }\r\n }\r\n\r\n $on(eventName, handler) {\r\n if (!this._eventListeners[eventName]) {\r\n this._eventListeners[eventName] = [];\r\n }\r\n this._eventListeners[eventName].push(handler);\r\n return handler;\r\n }\r\n\r\n $off(eventName, handler) {\r\n if (this._eventListeners[eventName]) {\r\n this._eventListeners[eventName] = this._eventListeners[eventName].filter(cb => cb !== handler);\r\n }\r\n }\r\n\r\n async setProps(newProps) {\r\n try {\r\n this.props = { ...this.props, ...newProps };\r\n await this.lifecycle.update();\r\n this.setupContext?._executeUpdated();\r\n } catch (error) {\r\n console.error(`[KupolaComponent] Error in setProps for \"${this.constructor.name}\":`, error);\r\n \r\n if (this.lifecycle && typeof this.lifecycle._handleError === 'function') {\r\n await this.lifecycle._handleError({ phase: 'update', hook: 'setProps', error, args: [newProps] });\r\n }\r\n }\r\n }\r\n\r\n async setState(newState) {\r\n try {\r\n this.state = { ...this.state, ...newState };\r\n await this.lifecycle.update();\r\n this.setupContext?._executeUpdated();\r\n } catch (error) {\r\n console.error(`[KupolaComponent] Error in setState for \"${this.constructor.name}\":`, error);\r\n \r\n if (this.lifecycle && typeof this.lifecycle._handleError === 'function') {\r\n await this.lifecycle._handleError({ phase: 'update', hook: 'setState', error, args: [newState] });\r\n }\r\n }\r\n }\r\n\r\n async mount() {\r\n if (this.isMounted || this.isDestroyed) return;\r\n\r\n try {\r\n this._bindLifecycleHooks();\r\n\r\n await this.lifecycle.bootstrap();\r\n\r\n if (typeof window !== 'undefined' && window._setCurrentSetupContext && window.SetupContext) {\r\n this.setupContext = new window.SetupContext(this);\r\n window._setCurrentSetupContext(this.setupContext);\r\n \r\n if (typeof this.setup === 'function') {\r\n const result = this.setup();\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n }\r\n }\r\n\r\n this.isMounted = true;\r\n await this.lifecycle.mount();\r\n\r\n this.setupContext?._executeMounted();\r\n \r\n if (typeof window !== 'undefined' && window._clearSetupContext) {\r\n window._clearSetupContext();\r\n }\r\n } catch (error) {\r\n console.error(`[KupolaComponent] Error mounting component \"${this.constructor.name}\":`, error);\r\n \r\n if (this.lifecycle && typeof this.lifecycle._handleError === 'function') {\r\n await this.lifecycle._handleError({ phase: 'mount', hook: 'component', error, args: [] });\r\n }\r\n \r\n if (typeof this.renderError === 'function') {\r\n try {\r\n this.renderError(error);\r\n } catch (e) {\r\n console.error(`[KupolaComponent] Error in renderError for \"${this.constructor.name}\":`, e);\r\n }\r\n } else {\r\n this.element.innerHTML = `\r\n <div style=\"padding: 16px; background: #fee2e2; border: 1px solid #fecaca; border-radius: 8px; color: #991b1b;\">\r\n <div style=\"font-weight: bold; margin-bottom: 8px;\">Component Error</div>\r\n <div style=\"font-size: 12px; white-space: pre-wrap;\">${error.message}</div>\r\n </div>\r\n `;\r\n }\r\n }\r\n }\r\n\r\n _bindLifecycleHooks() {\r\n if (this._hooksBound) return;\r\n \r\n const hookMap = {\r\n beforeMount: 'beforeMount',\r\n render: ['mount', 'update'],\r\n afterMount: 'afterMount',\r\n updated: 'afterUpdate',\r\n beforeUnmount: 'beforeUnmount',\r\n afterUnmount: 'afterUnmount',\r\n renderError: 'errorBoundary'\r\n };\r\n \r\n let proto = Object.getPrototypeOf(this);\r\n const registeredHooks = new Set();\r\n \r\n while (proto && proto.constructor !== Object && proto.constructor !== KupolaComponent) {\r\n for (const [methodName, lifecyclePhase] of Object.entries(hookMap)) {\r\n if (registeredHooks.has(methodName)) continue;\r\n \r\n if (proto.hasOwnProperty(methodName)) {\r\n if (Array.isArray(lifecyclePhase)) {\r\n lifecyclePhase.forEach(phase => {\r\n if (methodName === 'render') {\r\n this.lifecycle.on(phase, () => this.render?.());\r\n }\r\n });\r\n } else if (methodName === 'renderError') {\r\n this.lifecycle.on(lifecyclePhase, (errorInfo) => {\r\n this.renderError(errorInfo.error);\r\n return 'handled';\r\n });\r\n } else {\r\n this.lifecycle.on(lifecyclePhase, () => this[methodName]?.());\r\n }\r\n registeredHooks.add(methodName);\r\n }\r\n }\r\n proto = Object.getPrototypeOf(proto);\r\n }\r\n \r\n this._hooksBound = true;\r\n }\r\n\r\n async unmount() {\r\n if (!this.isMounted || this.isDestroyed) return;\r\n\r\n try {\r\n this.setupContext?._executeUnmounted();\r\n \r\n await this.lifecycle.unmount();\r\n this.isMounted = false;\r\n this.isDestroyed = true;\r\n await this.lifecycle.destroy();\r\n } catch (error) {\r\n console.error(`[KupolaComponent] Error unmounting component \"${this.constructor.name}\":`, error);\r\n \r\n if (this.lifecycle && typeof this.lifecycle._handleError === 'function') {\r\n await this.lifecycle._handleError({ phase: 'unmount', hook: 'component', error, args: [] });\r\n }\r\n \r\n this.isMounted = false;\r\n this.isDestroyed = true;\r\n }\r\n }\r\n\r\n beforeMount() {}\r\n afterMount() {}\r\n beforeUnmount() {}\r\n afterUnmount() {}\r\n render() {}\r\n renderError(error) {}\r\n updated() {}\r\n setup() {}\r\n}\r\n\r\nexport function applyMixin(componentClass, mixin) {\r\n Object.keys(mixin).forEach(key => {\r\n if (key === 'constructor') return;\r\n if (typeof mixin[key] === 'function') {\r\n const original = componentClass.prototype[key];\r\n if (original) {\r\n componentClass.prototype[key] = function(...args) {\r\n mixin[key].apply(this, args);\r\n return original.apply(this, args);\r\n };\r\n } else {\r\n componentClass.prototype[key] = mixin[key];\r\n }\r\n } else {\r\n componentClass.prototype[key] = mixin[key];\r\n }\r\n });\r\n}\r\n\r\nif (typeof window !== 'undefined') {\r\n window.KupolaComponent = KupolaComponent;\r\n window.applyMixin = applyMixin;\r\n}","import { KupolaComponent, applyMixin } from './component.js';\r\nimport { kupolaInitializer } from './initializer.js';\r\n\r\nexport class KupolaComponentRegistry {\r\n constructor() {\r\n this.components = new Map();\r\n this.lazyComponents = new Map();\r\n this.loadedComponents = new Map();\r\n this.instances = new Map();\r\n this.observer = null;\r\n this.mixins = new Map();\r\n this.loadingPromises = new Map();\r\n }\r\n\r\n register(name, componentClass) {\r\n if (!(componentClass.prototype instanceof KupolaComponent)) {\r\n throw new Error(`Component ${name} must extend KupolaComponent`);\r\n }\r\n this.components.set(name, componentClass);\r\n }\r\n\r\n registerLazy(name, loader) {\r\n this.lazyComponents.set(name, loader);\r\n }\r\n\r\n unregister(name) {\r\n this.components.delete(name);\r\n this.lazyComponents.delete(name);\r\n this.loadedComponents.delete(name);\r\n this.loadingPromises.delete(name);\r\n }\r\n\r\n get(name) {\r\n return this.components.get(name) || this.loadedComponents.get(name);\r\n }\r\n\r\n async getAsync(name) {\r\n const cached = this.components.get(name) || this.loadedComponents.get(name);\r\n if (cached) return cached;\r\n\r\n if (this.loadingPromises.has(name)) {\r\n return this.loadingPromises.get(name);\r\n }\r\n\r\n const loader = this.lazyComponents.get(name);\r\n if (!loader) {\r\n throw new Error(`Component ${name} not found`);\r\n }\r\n\r\n const loadingPromise = (async () => {\r\n try {\r\n const result = await loader();\r\n const componentClass = result.default || result;\r\n if (!(componentClass.prototype instanceof KupolaComponent)) {\r\n throw new Error(`Component ${name} must extend KupolaComponent`);\r\n }\r\n this.loadedComponents.set(name, componentClass);\r\n return componentClass;\r\n } catch (e) {\r\n this.loadingPromises.delete(name);\r\n throw e;\r\n }\r\n })();\r\n\r\n this.loadingPromises.set(name, loadingPromise);\r\n return loadingPromise;\r\n }\r\n\r\n defineMixin(name, mixin) {\r\n this.mixins.set(name, mixin);\r\n }\r\n\r\n useMixin(componentClass, ...mixinNames) {\r\n mixinNames.forEach(name => {\r\n const mixin = this.mixins.get(name);\r\n if (mixin) {\r\n applyMixin(componentClass, mixin);\r\n }\r\n });\r\n }\r\n\r\n async bootstrap(root = document) {\r\n await this._upgradeElements(root);\r\n this._startObserver(root);\r\n }\r\n\r\n async _upgradeElements(root) {\r\n const elements = root.querySelectorAll('[data-component]');\r\n const promises = [];\r\n elements.forEach(element => {\r\n promises.push(this._upgradeElement(element));\r\n });\r\n await Promise.all(promises);\r\n }\r\n\r\n async _upgradeElement(element) {\r\n if (element.__kupolaInstance || element.__kupolaUpgrading) return;\r\n \r\n element.__kupolaUpgrading = true;\r\n \r\n try {\r\n const componentName = element.getAttribute('data-component');\r\n \r\n if (componentName) {\r\n const initializer = kupolaInitializer.get(componentName);\r\n if (initializer) {\r\n try {\r\n await initializer(element);\r\n return;\r\n } catch (e) {\r\n console.warn(`[KupolaComponentRegistry] Initializer for \"${componentName}\" failed, trying component class:`, e);\r\n }\r\n }\r\n }\r\n \r\n let ComponentClass = this.components.get(componentName);\r\n \r\n if (!ComponentClass) {\r\n try {\r\n ComponentClass = await this.getAsync(componentName);\r\n } catch (e) {\r\n console.error(`Failed to load component ${componentName}:`, e);\r\n return;\r\n }\r\n \r\n if (!element.isConnected) {\r\n return;\r\n }\r\n }\r\n \r\n const mixinNames = element.getAttribute('data-mixins');\r\n const componentClass = ComponentClass;\r\n if (mixinNames) {\r\n mixinNames.split(',').forEach(name => {\r\n const mixin = this.mixins.get(name.trim());\r\n if (mixin) {\r\n applyMixin(componentClass, mixin);\r\n }\r\n });\r\n }\r\n \r\n const instance = new componentClass(element);\r\n element.__kupolaInstance = instance;\r\n this.instances.set(element, instance);\r\n instance.mount();\r\n } finally {\r\n element.__kupolaUpgrading = false;\r\n }\r\n }\r\n\r\n _startObserver(root) {\r\n if (this.observer) return;\r\n \r\n this.observer = new MutationObserver((mutations) => {\r\n mutations.forEach(mutation => {\r\n mutation.addedNodes.forEach(node => {\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n // Try registry first (class components via data-component)\r\n if (node.hasAttribute('data-component')) {\r\n this._upgradeElement(node).catch(e => console.error(e));\r\n }\r\n this._upgradeElements(node).catch(e => console.error(e));\r\n // Also try initializer (function components via data-* attributes / CSS classes)\r\n kupolaInitializer.initialize(node).catch(() => {});\r\n // Check children too\r\n const selector = kupolaInitializer._buildSelector();\r\n if (selector) {\r\n node.querySelectorAll?.(selector).forEach(child => {\r\n kupolaInitializer.initialize(child).catch(() => {});\r\n });\r\n }\r\n }\r\n });\r\n \r\n mutation.removedNodes.forEach(node => {\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n // Cleanup registry instances\r\n const instance = this.instances.get(node);\r\n if (instance) {\r\n instance.unmount();\r\n this.instances.delete(node);\r\n }\r\n node.querySelectorAll('[data-component]').forEach(child => {\r\n const childInstance = this.instances.get(child);\r\n if (childInstance) {\r\n childInstance.unmount();\r\n this.instances.delete(child);\r\n }\r\n });\r\n // Cleanup initializer instances\r\n kupolaInitializer.cleanup(node);\r\n node.querySelectorAll?.('*').forEach(child => {\r\n kupolaInitializer.cleanup(child);\r\n });\r\n }\r\n });\r\n });\r\n });\r\n\r\n this.observer.observe(root, {\r\n childList: true,\r\n subtree: true\r\n });\r\n }\r\n\r\n destroy() {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n this.observer = null;\r\n }\r\n this.instances.forEach(instance => {\r\n instance.unmount();\r\n });\r\n this.instances.clear();\r\n this.components.clear();\r\n this.mixins.clear();\r\n }\r\n}\r\n\r\nif (typeof window !== 'undefined') {\r\n window.KupolaComponentRegistry = KupolaComponentRegistry;\r\n}","/**\r\n * Kupola Core — Component system bootstrap, registry, and lifecycle management.\r\n * @module kupola-core\r\n */\r\n\r\nimport { KupolaComponent, applyMixin } from './component.js';\r\nimport { KupolaComponentRegistry } from './registry.js';\r\nimport { KupolaLifecycle } from './kupola-lifecycle.js';\r\nimport { kupolaInitializer } from './initializer.js';\r\nimport { kupolaData } from './data-bind.js';\r\nimport { initTheme } from './theme.js';\r\n\r\nlet kupolaRegistry = null;\r\n\r\nif (typeof window !== 'undefined') {\r\n kupolaRegistry = new KupolaComponentRegistry();\r\n}\r\n\r\n/** Bootstrap the Kupola component system (data binding, theme, component discovery). */\r\nasync function kupolaBootstrap() {\r\n if (typeof window !== 'undefined') {\r\n // Load persisted data and bind data-bind elements\r\n kupolaData.loadPersisted();\r\n kupolaData.bind();\r\n // Initialize theme\r\n initTheme();\r\n // Initialize function-based components first\r\n await kupolaInitializer.initializeAll();\r\n // Then bootstrap class-based components\r\n if (kupolaRegistry) {\r\n await kupolaRegistry.bootstrap();\r\n }\r\n }\r\n}\r\n\r\nif (typeof document !== 'undefined' && document.readyState === 'loading') {\r\n document.addEventListener('DOMContentLoaded', kupolaBootstrap);\r\n} else if (typeof window !== 'undefined') {\r\n setTimeout(kupolaBootstrap, 0);\r\n}\r\n\r\n/** Register a class-based component. */\r\nfunction registerComponent(name, componentClass) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.register(name, componentClass);\r\n }\r\n}\r\n\r\n/** Register a lazy-loaded component (loaded on first use). */\r\nfunction registerLazyComponent(name, loader) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.registerLazy(name, loader);\r\n }\r\n}\r\n\r\n/** Manually bootstrap components within a specific root element. */\r\nfunction bootstrapComponents(root) {\r\n if (kupolaRegistry) {\r\n return kupolaRegistry.bootstrap(root);\r\n }\r\n return Promise.resolve();\r\n}\r\n\r\n/** Define a reusable mixin for component classes. */\r\nfunction defineMixin(name, mixin) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.defineMixin(name, mixin);\r\n }\r\n}\r\n\r\n/** Apply named mixins to a component class. */\r\nfunction useMixin(componentClass, ...mixinNames) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.useMixin(componentClass, ...mixinNames);\r\n }\r\n}\r\n\r\n/**\r\n * Unified component registration API.\r\n * @param {string} name - Component name\r\n * @param {object} options\r\n * @param {Function} [options.init] - Init function (for function-based components)\r\n * @param {Function} [options.cleanup] - Cleanup function\r\n * @param {Function} [options.componentClass] - Component class (for class-based components)\r\n * @param {Function} [options.lazy] - Lazy loader function\r\n * @param {string} [options.dataAttribute] - Custom data attribute (e.g. 'data-my-component')\r\n * @param {string} [options.cssClass] - CSS class selector (e.g. 'ds-my-component')\r\n */\r\nfunction defineComponent(name, options) {\r\n if (!options || typeof options !== 'object') {\r\n throw new Error(`defineComponent(\"${name}\"): options must be an object`);\r\n }\r\n // Register with registry (class or lazy)\r\n if (options.componentClass) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.register(name, options.componentClass);\r\n }\r\n } else if (options.lazy) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.registerLazy(name, options.lazy);\r\n }\r\n }\r\n // Register with initializer (function-based)\r\n if (options.init) {\r\n kupolaInitializer.register(name, options.init, options.cleanup || null, {\r\n dataAttribute: options.dataAttribute,\r\n cssClass: options.cssClass\r\n });\r\n } else if (options.dataAttribute || options.cssClass) {\r\n // Even without init, register selectors so MutationObserver can find them\r\n kupolaInitializer.register(name, () => {}, null, {\r\n dataAttribute: options.dataAttribute,\r\n cssClass: options.cssClass\r\n });\r\n }\r\n}\r\n\r\nexport {\r\n KupolaComponent,\r\n applyMixin,\r\n KupolaComponentRegistry,\r\n KupolaLifecycle,\r\n kupolaRegistry,\r\n kupolaInitializer,\r\n kupolaBootstrap,\r\n registerComponent,\r\n registerLazyComponent,\r\n bootstrapComponents,\r\n defineMixin,\r\n useMixin,\r\n defineComponent\r\n};\r\n\r\nif (typeof window !== 'undefined') {\r\n window.kupolaRegistry = kupolaRegistry;\r\n window.kupolaInitializer = kupolaInitializer;\r\n window.kupolaBootstrap = kupolaBootstrap;\r\n window.registerComponent = registerComponent;\r\n window.registerLazyComponent = registerLazyComponent;\r\n window.bootstrapComponents = bootstrapComponents;\r\n window.defineMixin = defineMixin;\r\n window.useMixin = useMixin;\r\n window.defineComponent = defineComponent;\r\n}","class KupolaI18n {\r\n constructor(options = {}) {\r\n this.locales = options.locales || {};\r\n this.currentLocale = options.defaultLocale || 'zh-CN';\r\n this.fallbackLocale = options.fallbackLocale || 'zh-CN';\r\n this.delimiter = options.delimiter || '.';\r\n this.missingHandler = options.missingHandler || ((key) => {\r\n console.warn(`Missing translation: ${key}`);\r\n return key;\r\n });\r\n \r\n this._initFromDOM();\r\n }\r\n\r\n _initFromDOM() {\r\n const scriptTags = document.querySelectorAll('script[type=\"application/json\"][data-kupola-i18n]');\r\n scriptTags.forEach(script => {\r\n const locale = script.dataset.kupolaI18n;\r\n if (locale) {\r\n try {\r\n const data = JSON.parse(script.textContent);\r\n this.addLocale(locale, data);\r\n } catch (e) {\r\n console.error('Failed to parse i18n data:', e);\r\n }\r\n }\r\n });\r\n\r\n const htmlLang = document.documentElement.lang;\r\n if (htmlLang && this.locales[htmlLang]) {\r\n this.currentLocale = htmlLang;\r\n }\r\n }\r\n\r\n addLocale(locale, data) {\r\n if (!this.locales[locale]) {\r\n this.locales[locale] = {};\r\n }\r\n this._mergeDeep(this.locales[locale], data);\r\n }\r\n\r\n _mergeDeep(target, source) {\r\n for (const key of Object.keys(source)) {\r\n if (source[key] instanceof Object && key in target) {\r\n this._mergeDeep(target[key], source[key]);\r\n } else {\r\n target[key] = source[key];\r\n }\r\n }\r\n }\r\n\r\n setLocale(locale) {\r\n if (this.locales[locale]) {\r\n this.currentLocale = locale;\r\n document.documentElement.lang = locale;\r\n this._emitChange();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n getLocale() {\r\n return this.currentLocale;\r\n }\r\n\r\n t(key, params = {}) {\r\n let value = this._getTranslation(key, this.currentLocale);\r\n \r\n if (!value) {\r\n value = this._getTranslation(key, this.fallbackLocale);\r\n }\r\n \r\n if (!value) {\r\n return this.missingHandler(key);\r\n }\r\n \r\n return this._interpolate(value, params);\r\n }\r\n\r\n _getTranslation(key, locale) {\r\n if (!this.locales[locale]) return null;\r\n \r\n const keys = key.split(this.delimiter);\r\n let value = this.locales[locale];\r\n \r\n for (const k of keys) {\r\n if (value && typeof value === 'object' && k in value) {\r\n value = value[k];\r\n } else {\r\n return null;\r\n }\r\n }\r\n \r\n return typeof value === 'string' ? value : null;\r\n }\r\n\r\n _interpolate(str, params) {\r\n return str.replace(/\\{(\\w+)\\}/g, (match, key) => {\r\n return params[key] !== undefined ? params[key] : match;\r\n });\r\n }\r\n\r\n n(key, count, params = {}) {\r\n const value = this.t(key, { ...params, count });\r\n \r\n if (!value) return value;\r\n \r\n const parts = value.split('|');\r\n \r\n if (parts.length === 1) {\r\n return value.replace('{count}', count);\r\n }\r\n \r\n if (parts.length === 2) {\r\n return count === 1 ? parts[0] : parts[1];\r\n }\r\n \r\n if (parts.length >= 3) {\r\n if (count === 0) return parts[0];\r\n if (count === 1) return parts[1];\r\n return parts[2];\r\n }\r\n \r\n return value;\r\n }\r\n\r\n _emitChange() {\r\n const event = new CustomEvent('kupola:i18n:change', {\r\n detail: { locale: this.currentLocale },\r\n bubbles: true\r\n });\r\n document.dispatchEvent(event);\r\n }\r\n\r\n async loadLocale(locale, url) {\r\n try {\r\n const response = await fetch(url);\r\n const data = await response.json();\r\n this.addLocale(locale, data);\r\n return true;\r\n } catch (error) {\r\n console.error('Failed to load locale:', error);\r\n return false;\r\n }\r\n }\r\n\r\n getAvailableLocales() {\r\n return Object.keys(this.locales);\r\n }\r\n\r\n hasLocale(locale) {\r\n return !!this.locales[locale];\r\n }\r\n\r\n formatDate(date, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n const dateObj = typeof date === 'string' ? new Date(date) : date;\r\n \r\n return new Intl.DateTimeFormat(locale, options).format(dateObj);\r\n }\r\n\r\n formatNumber(number, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n \r\n return new Intl.NumberFormat(locale, options).format(number);\r\n }\r\n\r\n formatCurrency(number, currency, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n \r\n return new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currency,\r\n ...options\r\n }).format(number);\r\n }\r\n\r\n formatRelativeTime(value, unit, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n \r\n return new Intl.RelativeTimeFormat(locale, options).format(value, unit);\r\n }\r\n}\r\n\r\nconst kupolaI18n = new KupolaI18n();\r\n\r\nfunction createI18n(options) {\r\n return new KupolaI18n(options);\r\n}\r\n\r\nfunction t(key, params = {}) {\r\n return kupolaI18n.t(key, params);\r\n}\r\n\r\nfunction n(key, count, params = {}) {\r\n return kupolaI18n.n(key, count, params);\r\n}\r\n\r\nfunction setLocale(locale) {\r\n return kupolaI18n.setLocale(locale);\r\n}\r\n\r\nfunction getLocale() {\r\n return kupolaI18n.getLocale();\r\n}\r\n\r\nfunction formatDate(date, options = {}) {\r\n return kupolaI18n.formatDate(date, options);\r\n}\r\n\r\nfunction formatNumber(number, options = {}) {\r\n return kupolaI18n.formatNumber(number, options);\r\n}\r\n\r\nfunction formatCurrency(number, currency, options = {}) {\r\n return kupolaI18n.formatCurrency(number, currency, options);\r\n}\r\n\r\nexport { \r\n KupolaI18n, kupolaI18n, createI18n, \r\n t, n, setLocale, getLocale,\r\n formatDate, formatNumber, formatCurrency \r\n};\r\n\r\nif (typeof window !== 'undefined') {\r\n window.KupolaI18n = KupolaI18n;\r\n window.kupolaI18n = kupolaI18n;\r\n window.createI18n = createI18n;\r\n window.t = t;\r\n window.n = n;\r\n window.setLocale = setLocale;\r\n window.getLocale = getLocale;\r\n window.formatDate = formatDate;\r\n window.formatNumber = formatNumber;\r\n window.formatCurrency = formatCurrency;\r\n}","class Dropdown {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.trigger = element.querySelector('.ds-dropdown__trigger');\r\n this.menu = element.querySelector('.ds-dropdown__menu');\r\n this.triggerText = this.trigger ? this.trigger.querySelector('span') : null;\r\n this.scope = `dropdown-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n // Options\r\n this.triggerMode = options.trigger || element.getAttribute('data-dropdown-trigger') || 'click'; // click | hover\r\n this.hoverDelay = options.hoverDelay || parseInt(element.getAttribute('data-dropdown-hover-delay')) || 150;\r\n this.disabled = options.disabled || element.hasAttribute('data-dropdown-disabled');\r\n this.keyboardNav = options.keyboardNav !== false;\r\n this.autoPosition = options.autoPosition !== false;\r\n this.onSelect = options.onSelect || null;\r\n this.onShow = options.onShow || null;\r\n this.onHide = options.onHide || null;\r\n \r\n this.isOpen = false;\r\n this.focusIndex = -1;\r\n this._hoverTimer = null;\r\n this._hoverLeaveTimer = null;\r\n \r\n this._triggerClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._itemClickHandler = null;\r\n this._keydownHandler = null;\r\n this._mouseenterHandler = null;\r\n this._mouseleaveHandler = null;\r\n this._triggerMouseenterHandler = null;\r\n this._triggerMouseleaveHandler = null;\r\n }\r\n\r\n init() {\r\n if (!this.trigger || !this.menu) return;\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n // Item click handler\r\n this._itemClickHandler = (e) => {\r\n const item = e.currentTarget;\r\n if (item.classList.contains('is-disabled') || item.classList.contains('ds-dropdown__divider')) return;\r\n \r\n if (this.triggerText && !item.hasAttribute('data-no-update-trigger')) {\r\n this.triggerText.textContent = item.textContent.trim();\r\n }\r\n \r\n if (this.onSelect) {\r\n this.onSelect({ item, value: item.getAttribute('data-value'), text: item.textContent.trim() });\r\n }\r\n \r\n this.hideMenu();\r\n this.trigger.focus();\r\n };\r\n\r\n this._bindMenuItems();\r\n\r\n // Trigger click\r\n this._triggerClickHandler = (e) => {\r\n e.stopPropagation();\r\n if (this.disabled) return;\r\n this.toggleMenu();\r\n };\r\n\r\n // Hover trigger\r\n this._triggerMouseenterHandler = () => {\r\n if (this.disabled || this.triggerMode !== 'hover') return;\r\n clearTimeout(this._hoverLeaveTimer);\r\n this._hoverTimer = setTimeout(() => this.showMenu(), this.hoverDelay);\r\n };\r\n\r\n this._triggerMouseleaveHandler = () => {\r\n if (this.triggerMode !== 'hover') return;\r\n clearTimeout(this._hoverTimer);\r\n this._hoverLeaveTimer = setTimeout(() => this.hideMenu(), this.hoverDelay);\r\n };\r\n\r\n this._mouseenterHandler = () => {\r\n if (this.disabled || this.triggerMode !== 'hover') return;\r\n clearTimeout(this._hoverLeaveTimer);\r\n };\r\n\r\n this._mouseleaveHandler = () => {\r\n if (this.triggerMode !== 'hover') return;\r\n this._hoverLeaveTimer = setTimeout(() => this.hideMenu(), this.hoverDelay);\r\n };\r\n\r\n // Keyboard navigation\r\n this._keydownHandler = (e) => {\r\n if (!this.isOpen || this.disabled) return;\r\n \r\n const items = this._getNavigableItems();\r\n if (!items.length) return;\r\n\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n this.focusIndex = Math.min(this.focusIndex + 1, items.length - 1);\r\n this._focusItem(items);\r\n break;\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n this.focusIndex = Math.max(this.focusIndex - 1, 0);\r\n this._focusItem(items);\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n e.preventDefault();\r\n if (this.focusIndex >= 0 && items[this.focusIndex]) {\r\n items[this.focusIndex].click();\r\n }\r\n break;\r\n case 'Escape':\r\n e.preventDefault();\r\n this.hideMenu();\r\n this.trigger.focus();\r\n break;\r\n case 'Home':\r\n e.preventDefault();\r\n this.focusIndex = 0;\r\n this._focusItem(items);\r\n break;\r\n case 'End':\r\n e.preventDefault();\r\n this.focusIndex = items.length - 1;\r\n this._focusItem(items);\r\n break;\r\n }\r\n };\r\n\r\n // Bind trigger events\r\n if (this.triggerMode === 'hover') {\r\n this.trigger.addEventListener('mouseenter', this._triggerMouseenterHandler);\r\n this.trigger.addEventListener('mouseleave', this._triggerMouseleaveHandler);\r\n this.menu.addEventListener('mouseenter', this._mouseenterHandler);\r\n this.menu.addEventListener('mouseleave', this._mouseleaveHandler);\r\n } else {\r\n this.trigger.addEventListener('click', this._triggerClickHandler);\r\n }\r\n\r\n // Keyboard on trigger\r\n this.trigger.addEventListener('keydown', (e) => {\r\n if (this.disabled) return;\r\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\r\n e.preventDefault();\r\n this.showMenu();\r\n }\r\n });\r\n\r\n document.addEventListener('keydown', this._keydownHandler);\r\n\r\n // Document click to close\r\n this._documentClickHandler = (e) => {\r\n if (!this.element.contains(e.target)) {\r\n this.hideMenu();\r\n }\r\n };\r\n\r\n if (window.globalEvents) {\r\n this._documentClickListener = window.globalEvents.on(document, 'click', this._documentClickHandler, { scope: this.scope });\r\n } else {\r\n document.addEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n this.menu.style.display = 'none';\r\n this.element.__kupolaInitialized = true;\r\n }\r\n\r\n _bindMenuItems() {\r\n this.menu.querySelectorAll('.ds-dropdown__item').forEach(item => {\r\n item.addEventListener('click', this._itemClickHandler);\r\n item._dropdownItemClickHandler = this._itemClickHandler;\r\n });\r\n }\r\n\r\n _getNavigableItems() {\r\n return Array.from(this.menu.querySelectorAll('.ds-dropdown__item'))\r\n .filter(item => !item.classList.contains('is-disabled') && !item.classList.contains('ds-dropdown__divider'));\r\n }\r\n\r\n _focusItem(items) {\r\n items.forEach(item => item.classList.remove('is-focused'));\r\n if (items[this.focusIndex]) {\r\n items[this.focusIndex].classList.add('is-focused');\r\n items[this.focusIndex].scrollIntoView({ block: 'nearest' });\r\n }\r\n }\r\n\r\n _calculatePosition() {\r\n if (!this.autoPosition) return;\r\n \r\n const triggerRect = this.element.getBoundingClientRect();\r\n const menuRect = this.menu.getBoundingClientRect();\r\n const viewportHeight = window.innerHeight;\r\n const viewportWidth = window.innerWidth;\r\n \r\n // Reset\r\n this.menu.classList.remove('ds-dropdown--top', 'ds-dropdown--right', 'ds-dropdown--dropup');\r\n \r\n // Vertical: prefer below, flip to above if needed\r\n const spaceBelow = viewportHeight - triggerRect.bottom;\r\n const spaceAbove = triggerRect.top;\r\n \r\n if (spaceBelow < menuRect.height && spaceAbove > spaceBelow) {\r\n this.menu.classList.add('ds-dropdown--dropup');\r\n this.menu.style.top = 'auto';\r\n this.menu.style.bottom = '100%';\r\n this.menu.style.marginBottom = '4px';\r\n } else {\r\n this.menu.style.top = '100%';\r\n this.menu.style.bottom = 'auto';\r\n this.menu.style.marginBottom = '0';\r\n }\r\n \r\n // Horizontal: prevent overflow right\r\n if (triggerRect.left + menuRect.width > viewportWidth) {\r\n this.menu.style.left = 'auto';\r\n this.menu.style.right = '0';\r\n } else {\r\n this.menu.style.left = '0';\r\n this.menu.style.right = 'auto';\r\n }\r\n }\r\n\r\n showMenu() {\r\n if (this.disabled || this.isOpen) return;\r\n this.isOpen = true;\r\n this.focusIndex = -1;\r\n this.menu.style.display = 'block';\r\n this.element.classList.add('is-open');\r\n this._calculatePosition();\r\n if (this.onShow) this.onShow();\r\n this.element.dispatchEvent(new CustomEvent('kupola:dropdown-show', { bubbles: true }));\r\n }\r\n\r\n hideMenu() {\r\n if (!this.isOpen) return;\r\n this.isOpen = false;\r\n this.menu.style.display = 'none';\r\n this.element.classList.remove('is-open');\r\n \r\n // Clear focus\r\n this.menu.querySelectorAll('.ds-dropdown__item').forEach(item => item.classList.remove('is-focused'));\r\n if (this.onHide) this.onHide();\r\n this.element.dispatchEvent(new CustomEvent('kupola:dropdown-hide', { bubbles: true }));\r\n }\r\n\r\n toggleMenu() {\r\n if (this.isOpen) {\r\n this.hideMenu();\r\n } else {\r\n this.showMenu();\r\n }\r\n }\r\n\r\n enable() {\r\n this.disabled = false;\r\n this.element.removeAttribute('data-dropdown-disabled');\r\n }\r\n\r\n disable() {\r\n this.disabled = true;\r\n this.element.setAttribute('data-dropdown-disabled', '');\r\n this.hideMenu();\r\n }\r\n\r\n // Update menu items dynamically\r\n setItems(items) {\r\n // Remove old item listeners\r\n this.menu.querySelectorAll('.ds-dropdown__item').forEach(item => {\r\n if (item._dropdownItemClickHandler) {\r\n item.removeEventListener('click', item._dropdownItemClickHandler);\r\n }\r\n });\r\n \r\n // Rebuild menu content\r\n this.menu.innerHTML = '';\r\n items.forEach(item => {\r\n if (item.type === 'divider') {\r\n const divider = document.createElement('div');\r\n divider.className = 'ds-dropdown__divider';\r\n this.menu.appendChild(divider);\r\n } else {\r\n const el = document.createElement('div');\r\n el.className = 'ds-dropdown__item' + (item.disabled ? ' is-disabled' : '') + (item.active ? ' is-selected' : '');\r\n el.textContent = item.text || item.label || '';\r\n if (item.value !== undefined) el.setAttribute('data-value', item.value);\r\n if (item.icon) el.innerHTML = item.icon + el.innerHTML;\r\n if (item.disabled) el.classList.add('is-disabled');\r\n this.menu.appendChild(el);\r\n }\r\n });\r\n \r\n this._bindMenuItems();\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n clearTimeout(this._hoverTimer);\r\n clearTimeout(this._hoverLeaveTimer);\r\n\r\n if (this.trigger) {\r\n if (this._triggerClickHandler) this.trigger.removeEventListener('click', this._triggerClickHandler);\r\n if (this._triggerMouseenterHandler) this.trigger.removeEventListener('mouseenter', this._triggerMouseenterHandler);\r\n if (this._triggerMouseleaveHandler) this.trigger.removeEventListener('mouseleave', this._triggerMouseleaveHandler);\r\n }\r\n\r\n if (this.menu) {\r\n this.menu.querySelectorAll('.ds-dropdown__item').forEach(item => {\r\n if (item._dropdownItemClickHandler) {\r\n item.removeEventListener('click', item._dropdownItemClickHandler);\r\n }\r\n });\r\n if (this._mouseenterHandler) this.menu.removeEventListener('mouseenter', this._mouseenterHandler);\r\n if (this._mouseleaveHandler) this.menu.removeEventListener('mouseleave', this._mouseleaveHandler);\r\n }\r\n\r\n if (this._keydownHandler) document.removeEventListener('keydown', this._keydownHandler);\r\n\r\n if (this._documentClickListener && this._documentClickListener.unsubscribe) {\r\n this._documentClickListener.unsubscribe();\r\n } else if (this._documentClickHandler) {\r\n document.removeEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._triggerClickHandler = null;\r\n this._itemClickHandler = null;\r\n this._keydownHandler = null;\r\n this._mouseenterHandler = null;\r\n this._mouseleaveHandler = null;\r\n this._triggerMouseenterHandler = null;\r\n this._triggerMouseleaveHandler = null;\r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initDropdown(element, options) {\r\n const dropdown = new Dropdown(element, options);\r\n dropdown.init();\r\n element._kupolaDropdown = dropdown;\r\n}\r\n\r\nfunction initDropdowns(root = document) {\r\n root.querySelectorAll('.ds-dropdown').forEach(dropdown => {\r\n initDropdown(dropdown);\r\n });\r\n}\r\n\r\nfunction cleanupDropdown(dropdown) {\r\n if (dropdown._kupolaDropdown) {\r\n dropdown._kupolaDropdown.destroy();\r\n dropdown._kupolaDropdown = null;\r\n }\r\n}\r\n\r\nfunction cleanupAllDropdowns() {\r\n document.querySelectorAll('.ds-dropdown').forEach(dropdown => {\r\n cleanupDropdown(dropdown);\r\n });\r\n}\r\n\r\nexport { Dropdown, initDropdown, initDropdowns, cleanupDropdown, cleanupAllDropdowns };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Dropdown = Dropdown;\r\n window.initDropdown = initDropdown;\r\n window.initDropdowns = initDropdowns;\r\n window.cleanupDropdown = cleanupDropdown;\r\n window.cleanupAllDropdowns = cleanupAllDropdowns;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('dropdown', initDropdown, cleanupDropdown);\r\n }\r\n}","class Select {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.trigger = element.querySelector('.ds-select__trigger');\r\n this.valueEl = element.querySelector('.ds-select__value') || element.querySelector('.ds-select__trigger span');\r\n this.optionsEl = element.querySelector('.ds-select__options') || element.querySelector('.ds-select__menu');\r\n this.nativeSelect = element.querySelector('select');\r\n this.icon = element.querySelector('.ds-select__icon');\r\n this.scope = `select-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n // Options\r\n this.multiple = options.multiple || element.hasAttribute('data-select-multiple');\r\n this.searchable = options.searchable || element.hasAttribute('data-select-search');\r\n this.clearable = options.clearable || element.hasAttribute('data-select-clear');\r\n this.placeholder = options.placeholder || element.getAttribute('data-select-placeholder') || '';\r\n this.disabled = options.disabled || element.hasAttribute('data-select-disabled');\r\n this.maxSelection = options.maxSelection || parseInt(element.getAttribute('data-select-max')) || Infinity;\r\n this.remoteMethod = options.remoteMethod || null;\r\n this.onChange = options.onChange || null;\r\n \r\n // State\r\n this.isOpen = false;\r\n this.selectedValues = new Set();\r\n this.allOptions = [];\r\n this.filteredOptions = [];\r\n this.focusIndex = -1;\r\n this.searchInput = null;\r\n this.clearBtn = null;\r\n this.tagsWrap = null;\r\n \r\n this._triggerClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._optionClickHandler = null;\r\n this._keydownHandler = null;\r\n }\r\n\r\n init() {\r\n if (!this.trigger || !this.optionsEl) return;\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n // Collect existing options\r\n this._collectOptions();\r\n \r\n // Build search input if searchable\r\n if (this.searchable) {\r\n this._createSearchInput();\r\n }\r\n \r\n // Build clear button if clearable\r\n if (this.clearable) {\r\n this._createClearButton();\r\n }\r\n \r\n // Build tags container for multiple mode\r\n if (this.multiple) {\r\n this._createTagsWrap();\r\n }\r\n \r\n // Set placeholder\r\n if (this.placeholder && this.valueEl) {\r\n this.valueEl.setAttribute('data-placeholder', this.placeholder);\r\n if (!this.selectedValues.size) {\r\n this.valueEl.classList.add('ds-select__value--placeholder');\r\n this.valueEl.textContent = this.placeholder;\r\n }\r\n }\r\n\r\n // Option click handler\r\n this._optionClickHandler = (e) => {\r\n const option = e.currentTarget;\r\n if (option.classList.contains('is-disabled')) return;\r\n \r\n const value = option.getAttribute('data-value');\r\n \r\n if (this.multiple) {\r\n this._toggleMultiOption(value, option);\r\n } else {\r\n this._selectSingleOption(value, option);\r\n }\r\n };\r\n\r\n this._bindOptionClicks();\r\n\r\n // Trigger click\r\n this._triggerClickHandler = (e) => {\r\n e.stopPropagation();\r\n if (this.disabled) return;\r\n this.toggleOptions();\r\n };\r\n\r\n this.trigger.addEventListener('click', this._triggerClickHandler);\r\n\r\n // Keyboard navigation\r\n this._keydownHandler = (e) => {\r\n if (!this.isOpen || this.disabled) return;\r\n const items = this._getVisibleOptions();\r\n if (!items.length) return;\r\n\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n this.focusIndex = Math.min(this.focusIndex + 1, items.length - 1);\r\n this._focusOption(items);\r\n break;\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n this.focusIndex = Math.max(this.focusIndex - 1, 0);\r\n this._focusOption(items);\r\n break;\r\n case 'Enter':\r\n e.preventDefault();\r\n if (this.focusIndex >= 0 && items[this.focusIndex]) {\r\n items[this.focusIndex].click();\r\n }\r\n break;\r\n case 'Escape':\r\n e.preventDefault();\r\n this.hideOptions();\r\n this.trigger.focus();\r\n break;\r\n }\r\n };\r\n document.addEventListener('keydown', this._keydownHandler);\r\n\r\n // Document click to close\r\n this._documentClickHandler = (e) => {\r\n if (!this.element.contains(e.target)) {\r\n this.hideOptions();\r\n }\r\n };\r\n\r\n if (window.globalEvents) {\r\n this._documentClickListener = window.globalEvents.on(document, 'click', this._documentClickHandler, { scope: this.scope });\r\n } else {\r\n document.addEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n // Restore selected state from native select or data attributes\r\n this._restoreSelectedState();\r\n\r\n this.optionsEl.style.display = 'none';\r\n this.element.__kupolaInitialized = true;\r\n }\r\n\r\n _collectOptions() {\r\n this.allOptions = [];\r\n this.optionsEl.querySelectorAll('.ds-select__option, .ds-select__item').forEach(opt => {\r\n this.allOptions.push({\r\n el: opt,\r\n value: opt.getAttribute('data-value'),\r\n text: opt.textContent.trim(),\r\n group: opt.closest('.ds-select__group')?.getAttribute('data-group') || '',\r\n disabled: opt.classList.contains('is-disabled')\r\n });\r\n });\r\n this.filteredOptions = [...this.allOptions];\r\n }\r\n\r\n _createSearchInput() {\r\n this.searchInput = document.createElement('input');\r\n this.searchInput.className = 'ds-select__search';\r\n this.searchInput.type = 'text';\r\n this.searchInput.placeholder = 'Search...';\r\n this.searchInput.setAttribute('autocomplete', 'off');\r\n \r\n this.searchInput.addEventListener('input', () => this._handleSearch());\r\n this.searchInput.addEventListener('click', (e) => e.stopPropagation());\r\n \r\n // Insert at top of options\r\n this.optionsEl.insertBefore(this.searchInput, this.optionsEl.firstChild);\r\n }\r\n\r\n _createClearButton() {\r\n this.clearBtn = document.createElement('button');\r\n this.clearBtn.className = 'ds-select__clear';\r\n this.clearBtn.type = 'button';\r\n this.clearBtn.innerHTML = '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\r\n this.clearBtn.style.display = 'none';\r\n \r\n this.clearBtn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n this.clear();\r\n });\r\n \r\n // Insert into trigger area\r\n const triggerParent = this.trigger.querySelector('.ds-select__value') || this.trigger;\r\n triggerParent.parentNode.insertBefore(this.clearBtn, triggerParent.nextSibling);\r\n }\r\n\r\n _createTagsWrap() {\r\n this.tagsWrap = document.createElement('div');\r\n this.tagsWrap.className = 'ds-select__tags';\r\n \r\n const triggerParent = this.valueEl || this.trigger;\r\n triggerParent.parentNode.insertBefore(this.tagsWrap, triggerParent.nextSibling);\r\n }\r\n\r\n _handleSearch() {\r\n const query = this.searchInput.value.toLowerCase().trim();\r\n \r\n if (this.remoteMethod) {\r\n this.remoteMethod(query, (options) => {\r\n this._renderRemoteOptions(options);\r\n });\r\n return;\r\n }\r\n \r\n this.filteredOptions = this.allOptions.filter(opt => \r\n opt.text.toLowerCase().includes(query)\r\n );\r\n \r\n // Hide non-matching options\r\n this.allOptions.forEach(opt => {\r\n const visible = this.filteredOptions.includes(opt);\r\n opt.el.style.display = visible ? '' : 'none';\r\n });\r\n \r\n // Show/hide group headers\r\n this.optionsEl.querySelectorAll('.ds-select__group-title').forEach(title => {\r\n const group = title.getAttribute('data-group');\r\n const hasVisible = this.filteredOptions.some(opt => opt.group === group);\r\n title.style.display = hasVisible ? '' : 'none';\r\n });\r\n \r\n this.focusIndex = -1;\r\n }\r\n\r\n _renderRemoteOptions(options) {\r\n this.optionsEl.querySelectorAll('.ds-select__option, .ds-select__item').forEach(opt => {\r\n if (opt._selectOptionClickHandler) {\r\n opt.removeEventListener('click', opt._selectOptionClickHandler);\r\n }\r\n opt.remove();\r\n });\r\n \r\n options.forEach(opt => {\r\n const el = document.createElement('div');\r\n el.className = 'ds-select__option';\r\n el.setAttribute('data-value', opt.value);\r\n el.textContent = opt.text || opt.label;\r\n if (opt.disabled) el.classList.add('is-disabled');\r\n if (this.selectedValues.has(opt.value)) el.classList.add('is-selected');\r\n \r\n el.addEventListener('click', this._optionClickHandler);\r\n el._selectOptionClickHandler = this._optionClickHandler;\r\n \r\n this.optionsEl.appendChild(el);\r\n });\r\n \r\n this.allOptions = options.map(opt => ({\r\n el: this.optionsEl.querySelector(`[data-value=\"${opt.value}\"]`),\r\n value: opt.value,\r\n text: opt.text || opt.label,\r\n group: '',\r\n disabled: !!opt.disabled\r\n }));\r\n this.filteredOptions = [...this.allOptions];\r\n }\r\n\r\n _selectSingleOption(value, optionEl) {\r\n // Deselect all\r\n this.optionsEl.querySelectorAll('.ds-select__option, .ds-select__item').forEach(o => o.classList.remove('is-selected'));\r\n optionEl.classList.add('is-selected');\r\n \r\n this.selectedValues.clear();\r\n this.selectedValues.add(value);\r\n \r\n this.updateValue(optionEl.textContent.trim());\r\n this._syncNativeSelect();\r\n this.hideOptions();\r\n this._updateClearBtn();\r\n this._fireChange();\r\n }\r\n\r\n _toggleMultiOption(value, optionEl) {\r\n if (this.selectedValues.has(value)) {\r\n this.selectedValues.delete(value);\r\n optionEl.classList.remove('is-selected');\r\n } else {\r\n if (this.selectedValues.size >= this.maxSelection) return;\r\n this.selectedValues.add(value);\r\n optionEl.classList.add('is-selected');\r\n }\r\n \r\n this._updateTags();\r\n this._updateValueDisplay();\r\n this._syncNativeSelect();\r\n this._updateClearBtn();\r\n this._fireChange();\r\n }\r\n\r\n _updateTags() {\r\n if (!this.tagsWrap) return;\r\n this.tagsWrap.innerHTML = '';\r\n \r\n this.selectedValues.forEach(value => {\r\n const opt = this.allOptions.find(o => o.value === value);\r\n if (!opt) return;\r\n \r\n const tag = document.createElement('span');\r\n tag.className = 'ds-select__tag';\r\n tag.textContent = opt.text;\r\n \r\n const removeBtn = document.createElement('button');\r\n removeBtn.className = 'ds-select__tag-close';\r\n removeBtn.type = 'button';\r\n removeBtn.innerHTML = '<svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\r\n removeBtn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n this.selectedValues.delete(value);\r\n const optEl = this.optionsEl.querySelector(`[data-value=\"${value}\"]`);\r\n if (optEl) optEl.classList.remove('is-selected');\r\n this._updateTags();\r\n this._updateValueDisplay();\r\n this._syncNativeSelect();\r\n this._updateClearBtn();\r\n this._fireChange();\r\n });\r\n \r\n tag.appendChild(removeBtn);\r\n this.tagsWrap.appendChild(tag);\r\n });\r\n }\r\n\r\n _updateValueDisplay() {\r\n if (!this.valueEl) return;\r\n \r\n if (this.multiple) {\r\n const count = this.selectedValues.size;\r\n if (count === 0) {\r\n this.valueEl.textContent = this.placeholder || '';\r\n this.valueEl.classList.add('ds-select__value--placeholder');\r\n } else {\r\n this.valueEl.textContent = `Selected ${count}`;\r\n this.valueEl.classList.remove('ds-select__value--placeholder');\r\n }\r\n // Hide trigger text when tags are shown\r\n if (this.tagsWrap) {\r\n this.valueEl.style.display = count > 0 ? 'none' : '';\r\n }\r\n } else {\r\n if (this.selectedValues.size === 0) {\r\n this.valueEl.textContent = this.placeholder || '';\r\n this.valueEl.classList.add('ds-select__value--placeholder');\r\n }\r\n }\r\n }\r\n\r\n _updateClearBtn() {\r\n if (!this.clearBtn) return;\r\n this.clearBtn.style.display = this.selectedValues.size > 0 ? '' : 'none';\r\n }\r\n\r\n _syncNativeSelect() {\r\n if (!this.nativeSelect) return;\r\n if (this.multiple) {\r\n Array.from(this.nativeSelect.options).forEach(opt => {\r\n opt.selected = this.selectedValues.has(opt.value);\r\n });\r\n } else {\r\n this.nativeSelect.value = Array.from(this.selectedValues)[0] || '';\r\n }\r\n }\r\n\r\n _fireChange() {\r\n if (this.nativeSelect) {\r\n this.nativeSelect.dispatchEvent(new Event('change', { bubbles: true }));\r\n }\r\n \r\n const values = this.multiple ? Array.from(this.selectedValues) : Array.from(this.selectedValues)[0];\r\n \r\n if (this.onChange) {\r\n this.onChange({ values, selectedOptions: this.getSelectedOptions() });\r\n }\r\n \r\n this.element.dispatchEvent(new CustomEvent('kupola:select-change', {\r\n detail: { values, selectedOptions: this.getSelectedOptions() },\r\n bubbles: true\r\n }));\r\n }\r\n\r\n _restoreSelectedState() {\r\n if (this.nativeSelect) {\r\n if (this.multiple) {\r\n Array.from(this.nativeSelect.selectedOptions).forEach(opt => {\r\n this.selectedValues.add(opt.value);\r\n const el = this.optionsEl.querySelector(`[data-value=\"${opt.value}\"]`);\r\n if (el) el.classList.add('is-selected');\r\n });\r\n this._updateTags();\r\n this._updateValueDisplay();\r\n } else if (this.nativeSelect.value) {\r\n this.selectedValues.add(this.nativeSelect.value);\r\n const el = this.optionsEl.querySelector(`[data-value=\"${this.nativeSelect.value}\"]`);\r\n if (el) {\r\n el.classList.add('is-selected');\r\n this.updateValue(el.textContent.trim());\r\n }\r\n }\r\n }\r\n this._updateClearBtn();\r\n }\r\n\r\n _bindOptionClicks() {\r\n this.optionsEl.querySelectorAll('.ds-select__option, .ds-select__item').forEach(option => {\r\n option.addEventListener('click', this._optionClickHandler);\r\n option._selectOptionClickHandler = this._optionClickHandler;\r\n });\r\n }\r\n\r\n _getVisibleOptions() {\r\n return Array.from(this.optionsEl.querySelectorAll('.ds-select__option, .ds-select__item'))\r\n .filter(el => el.style.display !== 'none' && !el.classList.contains('is-disabled'));\r\n }\r\n\r\n _focusOption(items) {\r\n items.forEach(item => item.classList.remove('is-focused'));\r\n if (items[this.focusIndex]) {\r\n items[this.focusIndex].classList.add('is-focused');\r\n items[this.focusIndex].scrollIntoView({ block: 'nearest' });\r\n }\r\n }\r\n\r\n updateValue(text) {\r\n if (this.valueEl) {\r\n this.valueEl.textContent = text || this.valueEl.textContent;\r\n this.valueEl.classList.remove('ds-select__value--placeholder');\r\n }\r\n }\r\n\r\n showOptions() {\r\n if (this.disabled || this.isOpen) return;\r\n this.isOpen = true;\r\n this.optionsEl.style.display = 'block';\r\n if (this.icon) this.icon.style.transform = 'rotate(180deg)';\r\n this.element.classList.add('is-open');\r\n this.focusIndex = -1;\r\n \r\n if (this.searchInput) {\r\n setTimeout(() => this.searchInput.focus(), 50);\r\n }\r\n }\r\n\r\n hideOptions() {\r\n if (!this.isOpen) return;\r\n this.isOpen = false;\r\n this.optionsEl.style.display = 'none';\r\n if (this.icon) this.icon.style.transform = 'rotate(0deg)';\r\n this.element.classList.remove('is-open');\r\n \r\n // Clear search\r\n if (this.searchInput) {\r\n this.searchInput.value = '';\r\n this._handleSearch();\r\n }\r\n \r\n // Clear focus\r\n this.optionsEl.querySelectorAll('.ds-select__option, .ds-select__item').forEach(o => o.classList.remove('is-focused'));\r\n }\r\n\r\n toggleOptions() {\r\n if (this.isOpen) {\r\n this.hideOptions();\r\n } else {\r\n this.showOptions();\r\n }\r\n }\r\n\r\n clear() {\r\n this.selectedValues.clear();\r\n this.optionsEl.querySelectorAll('.ds-select__option, .ds-select__item').forEach(o => o.classList.remove('is-selected'));\r\n this._updateTags();\r\n this._updateValueDisplay();\r\n this._syncNativeSelect();\r\n this._updateClearBtn();\r\n this._fireChange();\r\n }\r\n\r\n getSelectedOptions() {\r\n return Array.from(this.selectedValues).map(value => {\r\n const opt = this.allOptions.find(o => o.value === value);\r\n return opt ? { value: opt.value, text: opt.text } : { value, text: '' };\r\n });\r\n }\r\n\r\n getValue() {\r\n return this.multiple ? Array.from(this.selectedValues) : Array.from(this.selectedValues)[0] || '';\r\n }\r\n\r\n setValue(value) {\r\n if (this.multiple && Array.isArray(value)) {\r\n this.selectedValues.clear();\r\n value.forEach(v => this.selectedValues.add(v));\r\n this.optionsEl.querySelectorAll('.ds-select__option, .ds-select__item').forEach(o => {\r\n o.classList.toggle('is-selected', this.selectedValues.has(o.getAttribute('data-value')));\r\n });\r\n this._updateTags();\r\n this._updateValueDisplay();\r\n } else {\r\n this.selectedValues.clear();\r\n this.selectedValues.add(value);\r\n this.optionsEl.querySelectorAll('.ds-select__option, .ds-select__item').forEach(o => {\r\n const isSelected = o.getAttribute('data-value') === value;\r\n o.classList.toggle('is-selected', isSelected);\r\n if (isSelected) this.updateValue(o.textContent.trim());\r\n });\r\n }\r\n this._syncNativeSelect();\r\n this._updateClearBtn();\r\n }\r\n\r\n enable() {\r\n this.disabled = false;\r\n this.element.removeAttribute('data-select-disabled');\r\n }\r\n\r\n disable() {\r\n this.disabled = true;\r\n this.element.setAttribute('data-select-disabled', '');\r\n this.hideOptions();\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n if (this.trigger && this._triggerClickHandler) {\r\n this.trigger.removeEventListener('click', this._triggerClickHandler);\r\n }\r\n\r\n if (this.optionsEl) {\r\n this.optionsEl.querySelectorAll('.ds-select__option, .ds-select__item').forEach(option => {\r\n if (option._selectOptionClickHandler) {\r\n option.removeEventListener('click', option._selectOptionClickHandler);\r\n }\r\n });\r\n }\r\n\r\n if (this._keydownHandler) document.removeEventListener('keydown', this._keydownHandler);\r\n\r\n if (this._documentClickListener && this._documentClickListener.unsubscribe) {\r\n this._documentClickListener.unsubscribe();\r\n } else if (this._documentClickHandler) {\r\n document.removeEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n // Remove created elements\r\n if (this.searchInput) this.searchInput.remove();\r\n if (this.clearBtn) this.clearBtn.remove();\r\n if (this.tagsWrap) this.tagsWrap.remove();\r\n\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._triggerClickHandler = null;\r\n this._optionClickHandler = null;\r\n this._keydownHandler = null;\r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initSelect(element, options) {\r\n const select = new Select(element, options);\r\n select.init();\r\n element._kupolaSelect = select;\r\n}\r\n\r\nfunction initSelects(root = document) {\r\n root.querySelectorAll('.ds-select').forEach(select => {\r\n initSelect(select);\r\n });\r\n}\r\n\r\nfunction cleanupSelect(select) {\r\n if (select._kupolaSelect) {\r\n select._kupolaSelect.destroy();\r\n select._kupolaSelect = null;\r\n }\r\n}\r\n\r\nfunction cleanupAllSelects() {\r\n document.querySelectorAll('.ds-select').forEach(select => {\r\n cleanupSelect(select);\r\n });\r\n}\r\n\r\nexport { Select, initSelect, initSelects, cleanupSelect, cleanupAllSelects };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Select = Select;\r\n window.initSelect = initSelect;\r\n window.initSelects = initSelects;\r\n window.cleanupSelect = cleanupSelect;\r\n window.cleanupAllSelects = cleanupAllSelects;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('select', initSelect, cleanupSelect);\r\n }\r\n}","class Datepicker {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.input = element.querySelector('input');\r\n this.endInput = element.querySelector('.ds-datepicker__end-input');\r\n this.icon = element.querySelector('.ds-datepicker__icon');\r\n this.calendarEl = element.querySelector('.ds-datepicker__calendar');\r\n this.scope = `datepicker-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n // Options\r\n this.format = options.format || element.getAttribute('data-datepicker-format') || 'YYYY-MM-DD';\r\n this.range = options.range || element.hasAttribute('data-datepicker-range');\r\n this.minDate = options.minDate || element.getAttribute('data-datepicker-min') || null;\r\n this.maxDate = options.maxDate || element.getAttribute('data-datepicker-max') || null;\r\n this.disabledDate = options.disabledDate || null; // function(date) => boolean\r\n this.weekStart = options.weekStart || parseInt(element.getAttribute('data-datepicker-week-start')) || 0; // 0=Sun, 1=Mon\r\n this.placeholder = options.placeholder || element.getAttribute('data-datepicker-placeholder') || '';\r\n this.showToday = options.showToday !== false;\r\n this.showWeekNumber = options.showWeekNumber || element.hasAttribute('data-datepicker-week-number');\r\n this.onChange = options.onChange || null;\r\n \r\n // i18n\r\n this.months = options.months || ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\n this.weekDays = options.weekDays || ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\r\n this.todayText = options.todayText || 'Today';\r\n this.clearText = options.clearText || 'Clear';\r\n \r\n // State\r\n this.currentDate = new Date();\r\n this.viewMode = 'days'; // days | months | years\r\n this.selectedDate = null;\r\n this.rangeStart = null;\r\n this.rangeEnd = null;\r\n this.isSelectingEnd = false;\r\n \r\n this._iconClickHandler = null;\r\n this._inputClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._resizeHandler = null;\r\n this._resizeListener = null;\r\n this._keydownHandler = null;\r\n }\r\n\r\n init() {\r\n if (!this.calendarEl) return;\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n // Parse initial value\r\n if (this.input && this.input.value) {\r\n if (this.range) {\r\n const parts = this.input.value.split(' ~ ');\r\n if (parts.length === 2) {\r\n this.rangeStart = this._parseDate(parts[0].trim());\r\n this.rangeEnd = this._parseDate(parts[1].trim());\r\n this.currentDate = new Date(this.rangeStart);\r\n }\r\n } else {\r\n this.selectedDate = this._parseDate(this.input.value);\r\n this.currentDate = new Date(this.selectedDate);\r\n }\r\n }\r\n\r\n if (this.placeholder && this.input) {\r\n this.input.placeholder = this.placeholder;\r\n }\r\n\r\n this._iconClickHandler = (e) => this.toggleCalendar(e);\r\n this._inputClickHandler = (e) => this.toggleCalendar(e);\r\n\r\n if (this.icon) this.icon.addEventListener('click', this._iconClickHandler);\r\n if (this.input) this.input.addEventListener('click', this._inputClickHandler);\r\n if (this.endInput) this.endInput.addEventListener('click', (e) => {\r\n this.isSelectingEnd = true;\r\n this.toggleCalendar(e);\r\n });\r\n\r\n if (window.globalEvents) {\r\n this._documentClickListener = window.globalEvents.on(document, 'click', (e) => this.hideCalendar(e), { scope: this.scope });\r\n this._resizeListener = window.globalEvents.on(window, 'resize', () => this.resizeHandler(), { scope: this.scope });\r\n } else {\r\n document.addEventListener('click', (e) => this.hideCalendar(e));\r\n window.addEventListener('resize', () => this.resizeHandler());\r\n this._documentClickHandler = (e) => this.hideCalendar(e);\r\n this._resizeHandler = () => this.resizeHandler();\r\n }\r\n\r\n // Keyboard\r\n this._keydownHandler = (e) => {\r\n if (e.key === 'Escape' && this.calendarEl.style.display === 'block') {\r\n this.hideCalendar(e);\r\n }\r\n };\r\n document.addEventListener('keydown', this._keydownHandler);\r\n\r\n this.element.__kupolaInitialized = true;\r\n this._renderCalendar();\r\n }\r\n\r\n _parseDate(str) {\r\n if (!str) return null;\r\n const parts = str.split('-');\r\n if (parts.length === 3) return new Date(parseInt(parts[0]), parseInt(parts[1]) - 1, parseInt(parts[2]));\r\n return null;\r\n }\r\n\r\n _formatDate(date) {\r\n if (!date) return '';\r\n const y = date.getFullYear();\r\n const m = String(date.getMonth() + 1).padStart(2, '0');\r\n const d = String(date.getDate()).padStart(2, '0');\r\n \r\n return this.format\r\n .replace('YYYY', y)\r\n .replace('MM', m)\r\n .replace('DD', d);\r\n }\r\n\r\n _isDateDisabled(date) {\r\n if (this.minDate) {\r\n const min = typeof this.minDate === 'string' ? this._parseDate(this.minDate) : this.minDate;\r\n if (date < min) return true;\r\n }\r\n if (this.maxDate) {\r\n const max = typeof this.maxDate === 'string' ? this._parseDate(this.maxDate) : this.maxDate;\r\n if (date > max) return true;\r\n }\r\n if (this.disabledDate) {\r\n return this.disabledDate(date);\r\n }\r\n return false;\r\n }\r\n\r\n _isToday(date) {\r\n const today = new Date();\r\n return date.getFullYear() === today.getFullYear() && date.getMonth() === today.getMonth() && date.getDate() === today.getDate();\r\n }\r\n\r\n _isSameDay(d1, d2) {\r\n if (!d1 || !d2) return false;\r\n return d1.getFullYear() === d2.getFullYear() && d1.getMonth() === d2.getMonth() && d1.getDate() === d2.getDate();\r\n }\r\n\r\n _isInRange(date) {\r\n if (!this.range || !this.rangeStart || !this.rangeEnd) return false;\r\n const time = date.getTime();\r\n const start = Math.min(this.rangeStart.getTime(), this.rangeEnd.getTime());\r\n const end = Math.max(this.rangeStart.getTime(), this.rangeEnd.getTime());\r\n return time >= start && time <= end;\r\n }\r\n\r\n calculatePosition() {\r\n const pickerRect = this.element.getBoundingClientRect();\r\n const calendarRect = this.calendarEl.getBoundingClientRect();\r\n const viewportHeight = window.innerHeight;\r\n \r\n const spaceBelow = viewportHeight - pickerRect.bottom;\r\n const spaceAbove = pickerRect.top;\r\n const calendarHeight = calendarRect.height || 320;\r\n \r\n if (spaceBelow >= calendarHeight) {\r\n this.calendarEl.style.top = 'calc(100% + 4px)';\r\n this.calendarEl.style.bottom = 'auto';\r\n } else if (spaceAbove >= calendarHeight) {\r\n this.calendarEl.style.top = 'auto';\r\n this.calendarEl.style.bottom = 'calc(100% + 4px)';\r\n } else {\r\n this.calendarEl.style.top = 'calc(100% + 4px)';\r\n this.calendarEl.style.bottom = 'auto';\r\n }\r\n }\r\n\r\n toggleCalendar(e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n const isVisible = this.calendarEl.style.display === 'block';\r\n \r\n // Close all other datepickers\r\n document.querySelectorAll('.ds-datepicker__calendar').forEach(c => {\r\n if (c !== this.calendarEl) {\r\n c.style.display = 'none';\r\n c.setAttribute('hidden', '');\r\n }\r\n });\r\n \r\n if (!isVisible) {\r\n this.calendarEl.style.display = 'block';\r\n this.calendarEl.removeAttribute('hidden');\r\n this.calculatePosition();\r\n }\r\n }\r\n\r\n hideCalendar(e) {\r\n if (!this.element.contains(e.target)) {\r\n this.calendarEl.style.display = 'none';\r\n this.calendarEl.setAttribute('hidden', '');\r\n this.viewMode = 'days';\r\n }\r\n }\r\n\r\n resizeHandler() {\r\n if (this.calendarEl.style.display === 'block') {\r\n this.calculatePosition();\r\n }\r\n }\r\n\r\n _renderCalendar() {\r\n const calendar = this.calendarEl;\r\n if (!calendar) return;\r\n \r\n // Clean up old listeners\r\n calendar.querySelectorAll('.ds-datepicker__day').forEach(dayEl => {\r\n if (dayEl._dayClickHandler) dayEl.removeEventListener('click', dayEl._dayClickHandler);\r\n });\r\n \r\n if (this.viewMode === 'years') {\r\n this._renderYearsView();\r\n return;\r\n }\r\n if (this.viewMode === 'months') {\r\n this._renderMonthsView();\r\n return;\r\n }\r\n \r\n const year = this.currentDate.getFullYear();\r\n const month = this.currentDate.getMonth();\r\n \r\n calendar.innerHTML = '';\r\n \r\n // Header with navigation\r\n const header = document.createElement('div');\r\n header.className = 'ds-datepicker__header';\r\n \r\n const prevBtn = document.createElement('button');\r\n prevBtn.className = 'ds-datepicker__nav ds-datepicker__nav--prev';\r\n prevBtn.type = 'button';\r\n prevBtn.innerHTML = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"15 18 9 12 15 6\"/></svg>';\r\n prevBtn.addEventListener('click', (e) => { e.stopPropagation(); this._prevMonth(); });\r\n \r\n const titleBtn = document.createElement('button');\r\n titleBtn.className = 'ds-datepicker__title';\r\n titleBtn.type = 'button';\r\n titleBtn.textContent = `${year} ${this.months[month]}`;\r\n titleBtn.addEventListener('click', (e) => { e.stopPropagation(); this.viewMode = 'months'; this._renderCalendar(); });\r\n \r\n const nextBtn = document.createElement('button');\r\n nextBtn.className = 'ds-datepicker__nav ds-datepicker__nav--next';\r\n nextBtn.type = 'button';\r\n nextBtn.innerHTML = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"9 18 15 12 9 6\"/></svg>';\r\n nextBtn.addEventListener('click', (e) => { e.stopPropagation(); this._nextMonth(); });\r\n \r\n header.appendChild(prevBtn);\r\n header.appendChild(titleBtn);\r\n header.appendChild(nextBtn);\r\n calendar.appendChild(header);\r\n \r\n // Week day headers\r\n const weekHeader = document.createElement('div');\r\n weekHeader.className = 'ds-datepicker__weekdays';\r\n const orderedDays = [...this.weekDays.slice(this.weekStart), ...this.weekDays.slice(0, this.weekStart)];\r\n orderedDays.forEach(day => {\r\n const span = document.createElement('span');\r\n span.className = 'ds-datepicker__weekday';\r\n span.textContent = day;\r\n weekHeader.appendChild(span);\r\n });\r\n calendar.appendChild(weekHeader);\r\n \r\n // Days grid\r\n const daysEl = document.createElement('div');\r\n daysEl.className = 'ds-datepicker__days';\r\n \r\n const firstDay = new Date(year, month, 1).getDay();\r\n const daysInMonth = new Date(year, month + 1, 0).getDate();\r\n const offset = (firstDay - this.weekStart + 7) % 7;\r\n \r\n // Empty cells\r\n for (let i = 0; i < offset; i++) {\r\n const emptyDay = document.createElement('span');\r\n emptyDay.className = 'ds-datepicker__day ds-datepicker__day--empty';\r\n daysEl.appendChild(emptyDay);\r\n }\r\n \r\n // Day cells\r\n for (let day = 1; day <= daysInMonth; day++) {\r\n const date = new Date(year, month, day);\r\n const dayEl = document.createElement('button');\r\n dayEl.className = 'ds-datepicker__day';\r\n dayEl.type = 'button';\r\n dayEl.textContent = day;\r\n \r\n const dateStr = this._formatDate(date);\r\n \r\n if (this._isToday(date)) dayEl.classList.add('is-today');\r\n \r\n // Selected state\r\n if (this.range) {\r\n if (this._isSameDay(date, this.rangeStart) || this._isSameDay(date, this.rangeEnd)) {\r\n dayEl.classList.add('is-selected');\r\n }\r\n if (this._isInRange(date)) {\r\n dayEl.classList.add('is-in-range');\r\n }\r\n } else {\r\n if (this._isSameDay(date, this.selectedDate)) {\r\n dayEl.classList.add('is-selected');\r\n }\r\n }\r\n \r\n // Disabled state\r\n if (this._isDateDisabled(date)) {\r\n dayEl.classList.add('is-disabled');\r\n dayEl.disabled = true;\r\n }\r\n \r\n const clickHandler = () => this._selectDate(date);\r\n dayEl.addEventListener('click', clickHandler);\r\n dayEl._dayClickHandler = clickHandler;\r\n \r\n daysEl.appendChild(dayEl);\r\n }\r\n \r\n calendar.appendChild(daysEl);\r\n \r\n // Footer with Today / Clear buttons\r\n if (this.showToday) {\r\n const footer = document.createElement('div');\r\n footer.className = 'ds-datepicker__footer';\r\n \r\n const todayBtn = document.createElement('button');\r\n todayBtn.className = 'ds-datepicker__today-btn';\r\n todayBtn.type = 'button';\r\n todayBtn.textContent = this.todayText;\r\n todayBtn.addEventListener('click', (e) => { e.stopPropagation(); this._goToToday(); });\r\n \r\n const clearBtn = document.createElement('button');\r\n clearBtn.className = 'ds-datepicker__clear-btn';\r\n clearBtn.type = 'button';\r\n clearBtn.textContent = this.clearText;\r\n clearBtn.addEventListener('click', (e) => { e.stopPropagation(); this._clearDate(); });\r\n \r\n footer.appendChild(todayBtn);\r\n footer.appendChild(clearBtn);\r\n calendar.appendChild(footer);\r\n }\r\n }\r\n\r\n _renderYearsView() {\r\n const calendar = this.calendarEl;\r\n calendar.innerHTML = '';\r\n \r\n const currentYear = this.currentDate.getFullYear();\r\n const startYear = currentYear - 6;\r\n \r\n const header = document.createElement('div');\r\n header.className = 'ds-datepicker__header';\r\n \r\n const prevBtn = document.createElement('button');\r\n prevBtn.className = 'ds-datepicker__nav ds-datepicker__nav--prev';\r\n prevBtn.type = 'button';\r\n prevBtn.innerHTML = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"15 18 9 12 15 6\"/></svg>';\r\n prevBtn.addEventListener('click', (e) => { e.stopPropagation(); this.currentDate.setFullYear(this.currentDate.getFullYear() - 12); this._renderCalendar(); });\r\n \r\n const titleBtn = document.createElement('button');\r\n titleBtn.className = 'ds-datepicker__title';\r\n titleBtn.type = 'button';\r\n titleBtn.textContent = `${startYear} - ${startYear + 11}`;\r\n titleBtn.addEventListener('click', (e) => { e.stopPropagation(); });\r\n \r\n const nextBtn = document.createElement('button');\r\n nextBtn.className = 'ds-datepicker__nav ds-datepicker__nav--next';\r\n nextBtn.type = 'button';\r\n nextBtn.innerHTML = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"9 18 15 12 9 6\"/></svg>';\r\n nextBtn.addEventListener('click', (e) => { e.stopPropagation(); this.currentDate.setFullYear(this.currentDate.getFullYear() + 12); this._renderCalendar(); });\r\n \r\n header.appendChild(prevBtn);\r\n header.appendChild(titleBtn);\r\n header.appendChild(nextBtn);\r\n calendar.appendChild(header);\r\n \r\n const grid = document.createElement('div');\r\n grid.className = 'ds-datepicker__years-grid';\r\n \r\n for (let i = 0; i < 12; i++) {\r\n const year = startYear + i;\r\n const btn = document.createElement('button');\r\n btn.className = 'ds-datepicker__year-cell';\r\n btn.type = 'button';\r\n btn.textContent = year;\r\n if (year === currentYear) btn.classList.add('is-selected');\r\n btn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n this.currentDate.setFullYear(year);\r\n this.viewMode = 'months';\r\n this._renderCalendar();\r\n });\r\n grid.appendChild(btn);\r\n }\r\n \r\n calendar.appendChild(grid);\r\n }\r\n\r\n _renderMonthsView() {\r\n const calendar = this.calendarEl;\r\n calendar.innerHTML = '';\r\n \r\n const year = this.currentDate.getFullYear();\r\n \r\n const header = document.createElement('div');\r\n header.className = 'ds-datepicker__header';\r\n \r\n const prevBtn = document.createElement('button');\r\n prevBtn.className = 'ds-datepicker__nav ds-datepicker__nav--prev';\r\n prevBtn.type = 'button';\r\n prevBtn.innerHTML = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"15 18 9 12 15 6\"/></svg>';\r\n prevBtn.addEventListener('click', (e) => { e.stopPropagation(); this.currentDate.setFullYear(this.currentDate.getFullYear() - 1); this._renderCalendar(); });\r\n \r\n const titleBtn = document.createElement('button');\r\n titleBtn.className = 'ds-datepicker__title';\r\n titleBtn.type = 'button';\r\n titleBtn.textContent = year;\r\n titleBtn.addEventListener('click', (e) => { e.stopPropagation(); this.viewMode = 'years'; this._renderCalendar(); });\r\n \r\n const nextBtn = document.createElement('button');\r\n nextBtn.className = 'ds-datepicker__nav ds-datepicker__nav--next';\r\n nextBtn.type = 'button';\r\n nextBtn.innerHTML = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"9 18 15 12 9 6\"/></svg>';\r\n nextBtn.addEventListener('click', (e) => { e.stopPropagation(); this.currentDate.setFullYear(this.currentDate.getFullYear() + 1); this._renderCalendar(); });\r\n \r\n header.appendChild(prevBtn);\r\n header.appendChild(titleBtn);\r\n header.appendChild(nextBtn);\r\n calendar.appendChild(header);\r\n \r\n const grid = document.createElement('div');\r\n grid.className = 'ds-datepicker__months-grid';\r\n \r\n this.months.forEach((monthName, idx) => {\r\n const btn = document.createElement('button');\r\n btn.className = 'ds-datepicker__month-cell';\r\n btn.type = 'button';\r\n btn.textContent = monthName;\r\n if (idx === this.currentDate.getMonth()) btn.classList.add('is-selected');\r\n btn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n this.currentDate.setMonth(idx);\r\n this.viewMode = 'days';\r\n this._renderCalendar();\r\n });\r\n grid.appendChild(btn);\r\n });\r\n \r\n calendar.appendChild(grid);\r\n }\r\n\r\n _selectDate(date) {\r\n if (this._isDateDisabled(date)) return;\r\n \r\n if (this.range) {\r\n if (!this.isSelectingEnd || !this.rangeStart) {\r\n this.rangeStart = date;\r\n this.rangeEnd = null;\r\n this.isSelectingEnd = true;\r\n } else {\r\n this.rangeEnd = date;\r\n // Ensure start <= end\r\n if (this.rangeEnd < this.rangeStart) {\r\n [this.rangeStart, this.rangeEnd] = [this.rangeEnd, this.rangeStart];\r\n }\r\n this.isSelectingEnd = false;\r\n \r\n if (this.input) this.input.value = this._formatDate(this.rangeStart);\r\n if (this.endInput) this.endInput.value = this._formatDate(this.rangeEnd);\r\n \r\n this.calendarEl.style.display = 'none';\r\n this.calendarEl.setAttribute('hidden', '');\r\n this._fireChange();\r\n return;\r\n }\r\n } else {\r\n this.selectedDate = date;\r\n if (this.input) {\r\n this.input.value = this._formatDate(date);\r\n }\r\n this.calendarEl.style.display = 'none';\r\n this.calendarEl.setAttribute('hidden', '');\r\n this._fireChange();\r\n return;\r\n }\r\n \r\n this._renderCalendar();\r\n }\r\n\r\n _fireChange() {\r\n if (this.input) {\r\n this.input.dispatchEvent(new Event('change', { bubbles: true }));\r\n }\r\n \r\n if (this.onChange) {\r\n if (this.range) {\r\n this.onChange({ start: this.rangeStart, end: this.rangeEnd, startStr: this._formatDate(this.rangeStart), endStr: this._formatDate(this.rangeEnd) });\r\n } else {\r\n this.onChange({ date: this.selectedDate, dateStr: this._formatDate(this.selectedDate) });\r\n }\r\n }\r\n \r\n this.element.dispatchEvent(new CustomEvent('kupola:datepicker-change', {\r\n detail: {\r\n date: this.selectedDate,\r\n dateStr: this._formatDate(this.selectedDate),\r\n rangeStart: this.rangeStart,\r\n rangeEnd: this.rangeEnd\r\n },\r\n bubbles: true\r\n }));\r\n }\r\n\r\n _prevMonth() {\r\n this.currentDate.setMonth(this.currentDate.getMonth() - 1);\r\n this._renderCalendar();\r\n }\r\n\r\n _nextMonth() {\r\n this.currentDate.setMonth(this.currentDate.getMonth() + 1);\r\n this._renderCalendar();\r\n }\r\n\r\n _goToToday() {\r\n const today = new Date();\r\n this.currentDate = new Date(today);\r\n \r\n if (!this._isDateDisabled(today)) {\r\n this._selectDate(today);\r\n } else {\r\n this._renderCalendar();\r\n }\r\n }\r\n\r\n _clearDate() {\r\n this.selectedDate = null;\r\n this.rangeStart = null;\r\n this.rangeEnd = null;\r\n this.isSelectingEnd = false;\r\n if (this.input) this.input.value = '';\r\n if (this.endInput) this.endInput.value = '';\r\n this.calendarEl.style.display = 'none';\r\n this.calendarEl.setAttribute('hidden', '');\r\n this._fireChange();\r\n }\r\n\r\n // Public API\r\n setDate(date) {\r\n const d = typeof date === 'string' ? this._parseDate(date) : date;\r\n if (d) {\r\n this.selectedDate = d;\r\n this.currentDate = new Date(d);\r\n if (this.input) this.input.value = this._formatDate(d);\r\n this._renderCalendar();\r\n }\r\n }\r\n\r\n getDate() {\r\n return this.selectedDate;\r\n }\r\n\r\n setRange(start, end) {\r\n this.rangeStart = typeof start === 'string' ? this._parseDate(start) : start;\r\n this.rangeEnd = typeof end === 'string' ? this._parseDate(end) : end;\r\n if (this.input) this.input.value = this._formatDate(this.rangeStart);\r\n if (this.endInput) this.endInput.value = this._formatDate(this.rangeEnd);\r\n this._renderCalendar();\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n if (this.icon && this._iconClickHandler) this.icon.removeEventListener('click', this._iconClickHandler);\r\n if (this.input && this._inputClickHandler) this.input.removeEventListener('click', this._inputClickHandler);\r\n if (this._keydownHandler) document.removeEventListener('keydown', this._keydownHandler);\r\n\r\n if (this._documentClickListener && this._documentClickListener.unsubscribe) {\r\n this._documentClickListener.unsubscribe();\r\n } else if (this._documentClickHandler) {\r\n document.removeEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n if (this._resizeListener && this._resizeListener.unsubscribe) {\r\n this._resizeListener.unsubscribe();\r\n } else if (this._resizeHandler) {\r\n window.removeEventListener('resize', this._resizeHandler);\r\n }\r\n\r\n if (this.calendarEl) {\r\n this.calendarEl.querySelectorAll('.ds-datepicker__day').forEach(dayEl => {\r\n if (dayEl._dayClickHandler) dayEl.removeEventListener('click', dayEl._dayClickHandler);\r\n });\r\n }\r\n\r\n this._documentClickHandler = null;\r\n this._resizeHandler = null;\r\n this._documentClickListener = null;\r\n this._resizeListener = null;\r\n this._iconClickHandler = null;\r\n this._inputClickHandler = null;\r\n this._keydownHandler = null;\r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initDatepicker(element, options) {\r\n const picker = new Datepicker(element, options);\r\n picker.init();\r\n element._kupolaDatepicker = picker;\r\n}\r\n\r\nfunction initDatepickers(root = document) {\r\n root.querySelectorAll('.ds-datepicker').forEach(picker => {\r\n initDatepicker(picker);\r\n });\r\n}\r\n\r\nfunction cleanupDatepicker(picker) {\r\n if (picker._kupolaDatepicker) {\r\n picker._kupolaDatepicker.destroy();\r\n picker._kupolaDatepicker = null;\r\n }\r\n}\r\n\r\nfunction cleanupAllDatepickers() {\r\n document.querySelectorAll('.ds-datepicker').forEach(picker => {\r\n cleanupDatepicker(picker);\r\n });\r\n}\r\n\r\nexport { Datepicker, initDatepicker, initDatepickers, cleanupDatepicker, cleanupAllDatepickers };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Datepicker = Datepicker;\r\n window.initDatepicker = initDatepicker;\r\n window.initDatepickers = initDatepickers;\r\n window.cleanupDatepicker = cleanupDatepicker;\r\n window.cleanupAllDatepickers = cleanupAllDatepickers;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('datepicker', initDatepicker, cleanupDatepicker);\r\n }\r\n}\r\n","class Timepicker {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.input = element.querySelector('input');\r\n this.inputWrap = element.querySelector('.ds-timepicker__input-wrap');\r\n this.panelEl = null;\r\n this.scope = `timepicker-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n // Options\r\n this.showSeconds = options.showSeconds || element.hasAttribute('data-timepicker-seconds');\r\n this.use12Hour = options.use12Hour || element.hasAttribute('data-timepicker-12h');\r\n this.hourStep = options.hourStep || parseInt(element.getAttribute('data-timepicker-hour-step')) || 1;\r\n this.minuteStep = options.minuteStep || parseInt(element.getAttribute('data-timepicker-minute-step')) || 5;\r\n this.secondStep = options.secondStep || parseInt(element.getAttribute('data-timepicker-second-step')) || 5;\r\n this.minTime = options.minTime || element.getAttribute('data-timepicker-min') || null; // \"HH:MM\" or \"HH:MM:SS\"\r\n this.maxTime = options.maxTime || element.getAttribute('data-timepicker-max') || null;\r\n this.disabledTime = options.disabledTime || null; // function(hour, minute, second) => boolean\r\n this.placeholder = options.placeholder || element.getAttribute('data-timepicker-placeholder') || '';\r\n this.clearable = options.clearable || element.hasAttribute('data-timepicker-clear');\r\n this.onChange = options.onChange || null;\r\n \r\n this.selectedHour = 12;\r\n this.selectedMinute = 0;\r\n this.selectedSecond = 0;\r\n this.isPM = false;\r\n \r\n this._inputWrapClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._resizeHandler = null;\r\n this._resizeListener = null;\r\n this._keydownHandler = null;\r\n }\r\n\r\n init() {\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n if (this.placeholder && this.input) {\r\n this.input.placeholder = this.placeholder;\r\n }\r\n\r\n // Parse initial value\r\n if (this.input && this.input.value) {\r\n this._parseInputValue();\r\n }\r\n\r\n this._inputWrapClickHandler = (e) => {\r\n e.stopPropagation();\r\n if (this.panelEl && this.panelEl.style.display === 'block') {\r\n this.hideTimepicker();\r\n } else {\r\n this.showTimepicker();\r\n }\r\n };\r\n\r\n this.inputWrap.addEventListener('click', this._inputWrapClickHandler);\r\n\r\n if (window.globalEvents) {\r\n this._documentClickListener = window.globalEvents.on(document, 'click', (e) => this.hideTimepicker(e), { scope: this.scope });\r\n this._resizeListener = window.globalEvents.on(window, 'resize', () => this.resizeHandler(), { scope: this.scope });\r\n } else {\r\n document.addEventListener('click', (e) => this.hideTimepicker(e));\r\n window.addEventListener('resize', () => this.resizeHandler());\r\n this._documentClickHandler = (e) => this.hideTimepicker(e);\r\n this._resizeHandler = () => this.resizeHandler();\r\n }\r\n\r\n this._keydownHandler = (e) => {\r\n if (e.key === 'Escape' && this.panelEl && this.panelEl.style.display === 'block') {\r\n this.hideTimepicker();\r\n }\r\n };\r\n document.addEventListener('keydown', this._keydownHandler);\r\n\r\n this.element.__kupolaInitialized = true;\r\n }\r\n\r\n _parseInputValue() {\r\n const val = this.input.value.trim();\r\n if (!val) return;\r\n \r\n // Try 12h format: \"2:30 PM\"\r\n const ampmMatch = val.match(/^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?\\s*(AM|PM|am|pm)$/i);\r\n if (ampmMatch) {\r\n this.selectedHour = parseInt(ampmMatch[1]) % 12;\r\n if (ampmMatch[4].toUpperCase() === 'PM') this.selectedHour += 12;\r\n this.selectedMinute = parseInt(ampmMatch[2]);\r\n this.selectedSecond = ampmMatch[3] ? parseInt(ampmMatch[3]) : 0;\r\n return;\r\n }\r\n \r\n // 24h format: \"14:30\" or \"14:30:45\"\r\n const parts = val.split(':');\r\n if (parts.length >= 2) {\r\n this.selectedHour = parseInt(parts[0]) || 0;\r\n this.selectedMinute = parseInt(parts[1]) || 0;\r\n this.selectedSecond = parts[2] ? parseInt(parts[2]) || 0 : 0;\r\n }\r\n }\r\n\r\n _isTimeDisabled(hour, minute, second) {\r\n if (this.disabledTime) return this.disabledTime(hour, minute, second);\r\n \r\n const timeVal = hour * 3600 + minute * 60 + second;\r\n \r\n if (this.minTime) {\r\n const minParts = this.minTime.split(':');\r\n const minVal = parseInt(minParts[0]) * 3600 + parseInt(minParts[1]) * 60 + (parseInt(minParts[2]) || 0);\r\n if (timeVal < minVal) return true;\r\n }\r\n \r\n if (this.maxTime) {\r\n const maxParts = this.maxTime.split(':');\r\n const maxVal = parseInt(maxParts[0]) * 3600 + parseInt(maxParts[1]) * 60 + (parseInt(maxParts[2]) || 0);\r\n if (timeVal > maxVal) return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n _formatTime() {\r\n let h = this.selectedHour;\r\n let m = this.selectedMinute;\r\n let s = this.selectedSecond;\r\n \r\n if (this.use12Hour) {\r\n const period = h >= 12 ? 'PM' : 'AM';\r\n h = h % 12 || 12;\r\n if (this.showSeconds) {\r\n return `${h}:${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')} ${period}`;\r\n }\r\n return `${h}:${String(m).padStart(2, '0')} ${period}`;\r\n }\r\n \r\n if (this.showSeconds) {\r\n return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`;\r\n }\r\n return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`;\r\n }\r\n\r\n calculatePosition() {\r\n if (!this.panelEl) return;\r\n \r\n const pickerRect = this.element.getBoundingClientRect();\r\n const panelRect = this.panelEl.getBoundingClientRect();\r\n const viewportHeight = window.innerHeight;\r\n \r\n const spaceBelow = viewportHeight - pickerRect.bottom;\r\n const spaceAbove = pickerRect.top;\r\n const panelHeight = panelRect.height || 320;\r\n \r\n if (spaceBelow >= panelHeight) {\r\n this.panelEl.style.top = 'calc(100% + 4px)';\r\n this.panelEl.style.bottom = 'auto';\r\n } else if (spaceAbove >= panelHeight) {\r\n this.panelEl.style.top = 'auto';\r\n this.panelEl.style.bottom = 'calc(100% + 4px)';\r\n } else {\r\n this.panelEl.style.top = 'calc(100% + 4px)';\r\n this.panelEl.style.bottom = 'auto';\r\n }\r\n }\r\n\r\n showTimepicker() {\r\n if (this.panelEl) {\r\n this.panelEl.style.display = 'block';\r\n this._syncPanelSelection();\r\n this.calculatePosition();\r\n return;\r\n }\r\n \r\n this.panelEl = document.createElement('div');\r\n this.panelEl.className = 'ds-timepicker__panel';\r\n \r\n // Build panel HTML\r\n let sectionsHTML = '';\r\n \r\n // Hour section\r\n sectionsHTML += `<div class=\"ds-timepicker__section\">\r\n <div class=\"ds-timepicker__section-label\">Hour</div>\r\n <div class=\"ds-timepicker__grid ds-timepicker__grid--hour\" data-type=\"hour\"></div>\r\n </div>`;\r\n \r\n // Minute section\r\n sectionsHTML += `<div class=\"ds-timepicker__section\">\r\n <div class=\"ds-timepicker__section-label\">Min</div>\r\n <div class=\"ds-timepicker__grid ds-timepicker__grid--minute\" data-type=\"minute\"></div>\r\n </div>`;\r\n \r\n // Second section (optional)\r\n if (this.showSeconds) {\r\n sectionsHTML += `<div class=\"ds-timepicker__section\">\r\n <div class=\"ds-timepicker__section-label\">Sec</div>\r\n <div class=\"ds-timepicker__grid ds-timepicker__grid--second\" data-type=\"second\"></div>\r\n </div>`;\r\n }\r\n \r\n // AM/PM section (optional)\r\n if (this.use12Hour) {\r\n sectionsHTML += `<div class=\"ds-timepicker__section ds-timepicker__section--ampm\">\r\n <div class=\"ds-timepicker__grid ds-timepicker__grid--ampm\" data-type=\"ampm\"></div>\r\n </div>`;\r\n }\r\n \r\n this.panelEl.innerHTML = `\r\n <div class=\"ds-timepicker__header\">\r\n <div class=\"ds-timepicker__display\">\r\n <span class=\"ds-timepicker__display-hour\">${String(this.selectedHour).padStart(2, '0')}</span>\r\n <span class=\"ds-timepicker__separator\">:</span>\r\n <span class=\"ds-timepicker__display-minute\">${String(this.selectedMinute).padStart(2, '0')}</span>\r\n ${this.showSeconds ? '<span class=\"ds-timepicker__separator\">:</span><span class=\"ds-timepicker__display-second\">' + String(this.selectedSecond).padStart(2, '0') + '</span>' : ''}\r\n ${this.use12Hour ? '<span class=\"ds-timepicker__display-ampm\">' + (this.selectedHour >= 12 ? 'PM' : 'AM') + '</span>' : ''}\r\n </div>\r\n </div>\r\n <div class=\"ds-timepicker__body\">${sectionsHTML}</div>\r\n ${this.clearable ? '<div class=\"ds-timepicker__footer\"><button class=\"ds-timepicker__clear-btn\" type=\"button\">Clear</button></div>' : ''}\r\n `;\r\n \r\n this.element.appendChild(this.panelEl);\r\n \r\n // Populate grids\r\n this._populateHourGrid();\r\n this._populateMinuteGrid();\r\n if (this.showSeconds) this._populateSecondGrid();\r\n if (this.use12Hour) this._populateAmPmGrid();\r\n \r\n // Clear button\r\n if (this.clearable) {\r\n const clearBtn = this.panelEl.querySelector('.ds-timepicker__clear-btn');\r\n if (clearBtn) {\r\n clearBtn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n this.input.value = '';\r\n this.hideTimepicker();\r\n this.input.dispatchEvent(new Event('change'));\r\n });\r\n }\r\n }\r\n \r\n this.panelEl.addEventListener('click', (e) => e.stopPropagation());\r\n \r\n this._syncPanelSelection();\r\n \r\n setTimeout(() => {\r\n this.calculatePosition();\r\n // Scroll selected items into view\r\n this._scrollToSelection();\r\n }, 0);\r\n }\r\n\r\n _populateHourGrid() {\r\n const grid = this.panelEl.querySelector('[data-type=\"hour\"]');\r\n if (!grid) return;\r\n \r\n const max = this.use12Hour ? 12 : 24;\r\n const start = this.use12Hour ? 1 : 0;\r\n \r\n for (let i = start; i < (this.use12Hour ? 13 : 24); i += this.hourStep) {\r\n const btn = document.createElement('button');\r\n btn.type = 'button';\r\n btn.className = 'ds-timepicker__item';\r\n btn.textContent = String(i).padStart(2, '0');\r\n btn.dataset.value = i;\r\n \r\n btn.addEventListener('click', () => {\r\n let hour = i;\r\n if (this.use12Hour) {\r\n if (i === 12) hour = this.isPM ? 12 : 0;\r\n else hour = this.isPM ? i + 12 : i;\r\n }\r\n this.selectedHour = hour;\r\n this._updateDisplay();\r\n this._syncGridSelection('hour', i);\r\n this._confirmSelection();\r\n });\r\n \r\n grid.appendChild(btn);\r\n }\r\n }\r\n\r\n _populateMinuteGrid() {\r\n const grid = this.panelEl.querySelector('[data-type=\"minute\"]');\r\n if (!grid) return;\r\n \r\n for (let i = 0; i < 60; i += this.minuteStep) {\r\n const btn = document.createElement('button');\r\n btn.type = 'button';\r\n btn.className = 'ds-timepicker__item';\r\n btn.textContent = String(i).padStart(2, '0');\r\n btn.dataset.value = i;\r\n \r\n btn.addEventListener('click', () => {\r\n this.selectedMinute = i;\r\n this._updateDisplay();\r\n this._syncGridSelection('minute', i);\r\n this._confirmSelection();\r\n });\r\n \r\n grid.appendChild(btn);\r\n }\r\n }\r\n\r\n _populateSecondGrid() {\r\n const grid = this.panelEl.querySelector('[data-type=\"second\"]');\r\n if (!grid) return;\r\n \r\n for (let i = 0; i < 60; i += this.secondStep) {\r\n const btn = document.createElement('button');\r\n btn.type = 'button';\r\n btn.className = 'ds-timepicker__item';\r\n btn.textContent = String(i).padStart(2, '0');\r\n btn.dataset.value = i;\r\n \r\n btn.addEventListener('click', () => {\r\n this.selectedSecond = i;\r\n this._updateDisplay();\r\n this._syncGridSelection('second', i);\r\n this._confirmSelection();\r\n });\r\n \r\n grid.appendChild(btn);\r\n }\r\n }\r\n\r\n _populateAmPmGrid() {\r\n const grid = this.panelEl.querySelector('[data-type=\"ampm\"]');\r\n if (!grid) return;\r\n \r\n ['AM', 'PM'].forEach(label => {\r\n const btn = document.createElement('button');\r\n btn.type = 'button';\r\n btn.className = 'ds-timepicker__item';\r\n btn.textContent = label;\r\n btn.dataset.value = label;\r\n \r\n btn.addEventListener('click', () => {\r\n this.isPM = label === 'PM';\r\n if (this.isPM && this.selectedHour < 12) this.selectedHour += 12;\r\n if (!this.isPM && this.selectedHour >= 12) this.selectedHour -= 12;\r\n this._updateDisplay();\r\n grid.querySelectorAll('.ds-timepicker__item').forEach(b => b.classList.remove('is-selected'));\r\n btn.classList.add('is-selected');\r\n this._confirmSelection();\r\n });\r\n \r\n grid.appendChild(btn);\r\n });\r\n }\r\n\r\n _updateDisplay() {\r\n if (!this.panelEl) return;\r\n \r\n const displayHour = this.panelEl.querySelector('.ds-timepicker__display-hour');\r\n const displayMinute = this.panelEl.querySelector('.ds-timepicker__display-minute');\r\n const displaySecond = this.panelEl.querySelector('.ds-timepicker__display-second');\r\n const displayAmPm = this.panelEl.querySelector('.ds-timepicker__display-ampm');\r\n \r\n if (displayHour) {\r\n const h = this.use12Hour ? (this.selectedHour % 12 || 12) : this.selectedHour;\r\n displayHour.textContent = String(h).padStart(2, '0');\r\n }\r\n if (displayMinute) displayMinute.textContent = String(this.selectedMinute).padStart(2, '0');\r\n if (displaySecond) displaySecond.textContent = String(this.selectedSecond).padStart(2, '0');\r\n if (displayAmPm) displayAmPm.textContent = this.selectedHour >= 12 ? 'PM' : 'AM';\r\n }\r\n\r\n _syncPanelSelection() {\r\n if (!this.panelEl) return;\r\n \r\n // Sync hour grid\r\n const hourVal = this.use12Hour ? (this.selectedHour % 12 || 12) : this.selectedHour;\r\n this._syncGridSelection('hour', hourVal);\r\n this._syncGridSelection('minute', this.selectedMinute);\r\n this._syncGridSelection('second', this.selectedSecond);\r\n \r\n // Sync AM/PM\r\n const ampmGrid = this.panelEl.querySelector('[data-type=\"ampm\"]');\r\n if (ampmGrid) {\r\n ampmGrid.querySelectorAll('.ds-timepicker__item').forEach(b => {\r\n b.classList.toggle('is-selected', (b.dataset.value === 'PM') === (this.selectedHour >= 12));\r\n });\r\n }\r\n \r\n this._updateDisplay();\r\n }\r\n\r\n _syncGridSelection(type, value) {\r\n const grid = this.panelEl.querySelector(`[data-type=\"${type}\"]`);\r\n if (!grid) return;\r\n grid.querySelectorAll('.ds-timepicker__item').forEach(b => {\r\n b.classList.toggle('is-selected', parseInt(b.dataset.value) === value);\r\n });\r\n }\r\n\r\n _scrollToSelection() {\r\n ['hour', 'minute', 'second'].forEach(type => {\r\n const grid = this.panelEl.querySelector(`[data-type=\"${type}\"]`);\r\n if (!grid) return;\r\n const selected = grid.querySelector('.is-selected');\r\n if (selected) selected.scrollIntoView({ block: 'center' });\r\n });\r\n }\r\n\r\n _confirmSelection() {\r\n this.input.value = this._formatTime();\r\n }\r\n\r\n hideTimepicker(e) {\r\n if (this.panelEl && this.panelEl.style.display === 'block') {\r\n if (!this.element.contains(e.target)) {\r\n this.panelEl.style.display = 'none';\r\n this.input.value = this._formatTime();\r\n this.input.dispatchEvent(new Event('change'));\r\n if (this.onChange) {\r\n this.onChange({ hour: this.selectedHour, minute: this.selectedMinute, second: this.selectedSecond, timeStr: this._formatTime() });\r\n }\r\n }\r\n }\r\n }\r\n\r\n resizeHandler() {\r\n if (this.panelEl && this.panelEl.style.display === 'block') {\r\n this.calculatePosition();\r\n }\r\n }\r\n\r\n // Public API\r\n setTime(hour, minute, second) {\r\n this.selectedHour = Math.max(0, Math.min(23, hour));\r\n this.selectedMinute = Math.max(0, Math.min(59, minute));\r\n this.selectedSecond = Math.max(0, Math.min(59, second || 0));\r\n this.isPM = this.selectedHour >= 12;\r\n if (this.input) this.input.value = this._formatTime();\r\n if (this.panelEl) this._syncPanelSelection();\r\n }\r\n\r\n getTime() {\r\n return { hour: this.selectedHour, minute: this.selectedMinute, second: this.selectedSecond };\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n if (this.inputWrap && this._inputWrapClickHandler) {\r\n this.inputWrap.removeEventListener('click', this._inputWrapClickHandler);\r\n }\r\n\r\n if (this._documentClickListener && this._documentClickListener.unsubscribe) {\r\n this._documentClickListener.unsubscribe();\r\n } else if (this._documentClickHandler) {\r\n document.removeEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n if (this._resizeListener && this._resizeListener.unsubscribe) {\r\n this._resizeListener.unsubscribe();\r\n } else if (this._resizeHandler) {\r\n window.removeEventListener('resize', this._resizeHandler);\r\n }\r\n\r\n if (this._keydownHandler) document.removeEventListener('keydown', this._keydownHandler);\r\n\r\n if (this.panelEl) {\r\n this.panelEl.remove();\r\n this.panelEl = null;\r\n }\r\n\r\n this._inputWrapClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._resizeHandler = null;\r\n this._resizeListener = null;\r\n this._keydownHandler = null;\r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initTimepicker(element, options) {\r\n const picker = new Timepicker(element, options);\r\n picker.init();\r\n element._kupolaTimepicker = picker;\r\n}\r\n\r\nfunction initTimepickers(root = document) {\r\n root.querySelectorAll('.ds-timepicker').forEach(picker => {\r\n initTimepicker(picker);\r\n });\r\n}\r\n\r\nfunction cleanupTimepicker(element) {\r\n if (element._kupolaTimepicker) {\r\n element._kupolaTimepicker.destroy();\r\n element._kupolaTimepicker = null;\r\n }\r\n}\r\n\r\nexport { Timepicker, initTimepicker, initTimepickers, cleanupTimepicker };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Timepicker = Timepicker;\r\n window.initTimepicker = initTimepicker;\r\n window.initTimepickers = initTimepickers;\r\n window.cleanupTimepicker = cleanupTimepicker;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('timepicker', initTimepicker, cleanupTimepicker);\r\n }\r\n}\r\n","class Slider {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.track = element.querySelector('.ds-slider__track');\r\n this.fill = element.querySelector('.ds-slider__fill');\r\n this.input = element.querySelector('.ds-slider__input');\r\n this.valueEl = element.querySelector('.ds-slider__value');\r\n\r\n // Options\r\n this.range = options.range || element.hasAttribute('data-slider-range');\r\n this.vertical = options.vertical || element.hasAttribute('data-slider-vertical');\r\n this.disabled = options.disabled || element.hasAttribute('data-slider-disabled');\r\n this.showTooltip = options.showTooltip !== false;\r\n this.showMarks = options.marks || element.hasAttribute('data-slider-marks');\r\n this.markStep = options.markStep || parseInt(element.getAttribute('data-slider-mark-step')) || 10;\r\n this.tooltipFormat = options.tooltipFormat || ((v) => v);\r\n this.onChange = options.onChange || null;\r\n this.onInput = options.onInput || null;\r\n\r\n // Range mode\r\n this.inputEnd = element.querySelector('.ds-slider__input--end');\r\n this.fillEnd = null;\r\n this.thumbStart = null;\r\n this.thumbEnd = null;\r\n this.tooltipStart = null;\r\n this.tooltipEnd = null;\r\n this.marksEl = null;\r\n\r\n this._listeners = [];\r\n this._isDragging = false;\r\n this._activeThumb = null;\r\n\r\n if (!this.track || !this.fill) {\r\n throw new Error('Slider: Missing required elements');\r\n }\r\n\r\n this._build();\r\n this._bindEvents();\r\n this.updateSlider();\r\n }\r\n\r\n _build() {\r\n // Add vertical class\r\n if (this.vertical) {\r\n this.element.classList.add('ds-slider--vertical');\r\n }\r\n if (this.disabled) {\r\n this.element.classList.add('is-disabled');\r\n }\r\n\r\n // Create thumb elements for better interaction\r\n if (!this.element.querySelector('.ds-slider__thumb')) {\r\n this.thumbStart = document.createElement('div');\r\n this.thumbStart.className = 'ds-slider__thumb ds-slider__thumb--start';\r\n this.thumbStart.setAttribute('role', 'slider');\r\n this.thumbStart.setAttribute('tabindex', this.disabled ? '-1' : '0');\r\n this.track.appendChild(this.thumbStart);\r\n\r\n // Tooltip\r\n if (this.showTooltip) {\r\n this.tooltipStart = document.createElement('div');\r\n this.tooltipStart.className = 'ds-slider__tooltip';\r\n this.thumbStart.appendChild(this.tooltipStart);\r\n }\r\n } else {\r\n this.thumbStart = this.element.querySelector('.ds-slider__thumb--start');\r\n }\r\n\r\n // Range mode: second thumb\r\n if (this.range) {\r\n this.element.classList.add('ds-slider--range');\r\n \r\n if (!this.element.querySelector('.ds-slider__thumb--end')) {\r\n this.thumbEnd = document.createElement('div');\r\n this.thumbEnd.className = 'ds-slider__thumb ds-slider__thumb--end';\r\n this.thumbEnd.setAttribute('role', 'slider');\r\n this.thumbEnd.setAttribute('tabindex', this.disabled ? '-1' : '0');\r\n this.track.appendChild(this.thumbEnd);\r\n\r\n if (this.showTooltip) {\r\n this.tooltipEnd = document.createElement('div');\r\n this.tooltipEnd.className = 'ds-slider__tooltip';\r\n this.thumbEnd.appendChild(this.tooltipEnd);\r\n }\r\n } else {\r\n this.thumbEnd = this.element.querySelector('.ds-slider__thumb--end');\r\n }\r\n }\r\n\r\n // Marks\r\n if (this.showMarks) {\r\n this._renderMarks();\r\n }\r\n }\r\n\r\n _renderMarks() {\r\n if (this.marksEl) this.marksEl.remove();\r\n \r\n this.marksEl = document.createElement('div');\r\n this.marksEl.className = 'ds-slider__marks';\r\n \r\n const min = parseFloat(this.input?.min || 0);\r\n const max = parseFloat(this.input?.max || 100);\r\n \r\n for (let v = min; v <= max; v += this.markStep) {\r\n const mark = document.createElement('div');\r\n mark.className = 'ds-slider__mark';\r\n const pct = ((v - min) / (max - min)) * 100;\r\n \r\n if (this.vertical) {\r\n mark.style.bottom = pct + '%';\r\n } else {\r\n mark.style.left = pct + '%';\r\n }\r\n \r\n const label = document.createElement('span');\r\n label.className = 'ds-slider__mark-label';\r\n label.textContent = v;\r\n mark.appendChild(label);\r\n \r\n this.marksEl.appendChild(mark);\r\n }\r\n \r\n this.element.appendChild(this.marksEl);\r\n }\r\n\r\n _bindEvents() {\r\n // Native input events (backward compat)\r\n if (this.input) {\r\n const inputHandler = () => this.updateSlider();\r\n const changeHandler = () => this.updateSlider();\r\n this.input.addEventListener('input', inputHandler);\r\n this.input.addEventListener('change', changeHandler);\r\n this._listeners.push(\r\n { el: this.input, event: 'input', handler: inputHandler },\r\n { el: this.input, event: 'change', handler: changeHandler }\r\n );\r\n }\r\n\r\n if (this.inputEnd) {\r\n const inputHandler = () => this.updateSlider();\r\n this.inputEnd.addEventListener('input', inputHandler);\r\n this._listeners.push({ el: this.inputEnd, event: 'input', handler: inputHandler });\r\n }\r\n\r\n // Custom thumb drag\r\n if (this.thumbStart) {\r\n this._bindThumbDrag(this.thumbStart, 'start');\r\n }\r\n if (this.thumbEnd) {\r\n this._bindThumbDrag(this.thumbEnd, 'end');\r\n }\r\n\r\n // Track click\r\n if (this.track) {\r\n const trackClick = (e) => {\r\n if (this.disabled) return;\r\n this._handleTrackClick(e);\r\n };\r\n this.track.addEventListener('click', trackClick);\r\n this._listeners.push({ el: this.track, event: 'click', handler: trackClick });\r\n }\r\n\r\n // Keyboard\r\n if (this.thumbStart) {\r\n const keyHandler = (e) => this._handleKeyboard(e, 'start');\r\n this.thumbStart.addEventListener('keydown', keyHandler);\r\n this._listeners.push({ el: this.thumbStart, event: 'keydown', handler: keyHandler });\r\n }\r\n if (this.thumbEnd) {\r\n const keyHandler = (e) => this._handleKeyboard(e, 'end');\r\n this.thumbEnd.addEventListener('keydown', keyHandler);\r\n this._listeners.push({ el: this.thumbEnd, event: 'keydown', handler: keyHandler });\r\n }\r\n }\r\n\r\n _bindThumbDrag(thumb, which) {\r\n const startDrag = (e) => {\r\n if (this.disabled) return;\r\n e.preventDefault();\r\n this._isDragging = true;\r\n this._activeThumb = which;\r\n this.element.classList.add('is-dragging');\r\n document.addEventListener('mousemove', onDrag);\r\n document.addEventListener('mouseup', stopDrag);\r\n document.addEventListener('touchmove', onDrag, { passive: false });\r\n document.addEventListener('touchend', stopDrag);\r\n };\r\n\r\n const onDrag = (e) => {\r\n if (!this._isDragging) return;\r\n e.preventDefault();\r\n \r\n const clientX = e.touches ? e.touches[0].clientX : e.clientX;\r\n const clientY = e.touches ? e.touches[0].clientY : e.clientY;\r\n \r\n const rect = this.track.getBoundingClientRect();\r\n let percentage;\r\n \r\n if (this.vertical) {\r\n percentage = 1 - (clientY - rect.top) / rect.height;\r\n } else {\r\n percentage = (clientX - rect.left) / rect.width;\r\n }\r\n \r\n percentage = Math.max(0, Math.min(1, percentage));\r\n \r\n const min = parseFloat(this.input?.min || 0);\r\n const max = parseFloat(this.input?.max || 100);\r\n const step = parseFloat(this.input?.step || 1);\r\n let value = min + percentage * (max - min);\r\n value = Math.round(value / step) * step;\r\n value = Math.max(min, Math.min(max, value));\r\n \r\n if (which === 'start' && this.range && this.inputEnd) {\r\n const endVal = parseFloat(this.inputEnd.value);\r\n if (value > endVal) value = endVal;\r\n }\r\n if (which === 'end' && this.range && this.input) {\r\n const startVal = parseFloat(this.input.value);\r\n if (value < startVal) value = startVal;\r\n }\r\n \r\n if (which === 'start' && this.input) {\r\n this.input.value = value;\r\n } else if (which === 'end' && this.inputEnd) {\r\n this.inputEnd.value = value;\r\n }\r\n \r\n this.updateSlider();\r\n \r\n if (this.onInput) {\r\n this.onInput({ value: this.getValue(), percentage });\r\n }\r\n };\r\n\r\n const stopDrag = () => {\r\n this._isDragging = false;\r\n this._activeThumb = null;\r\n this.element.classList.remove('is-dragging');\r\n document.removeEventListener('mousemove', onDrag);\r\n document.removeEventListener('mouseup', stopDrag);\r\n document.removeEventListener('touchmove', onDrag);\r\n document.removeEventListener('touchend', stopDrag);\r\n \r\n if (this.onChange) {\r\n this.onChange({ value: this.getValue() });\r\n }\r\n this.element.dispatchEvent(new CustomEvent('kupola:slider-change', {\r\n detail: { value: this.getValue() },\r\n bubbles: true\r\n }));\r\n };\r\n\r\n thumb.addEventListener('mousedown', startDrag);\r\n thumb.addEventListener('touchstart', startDrag, { passive: false });\r\n this._listeners.push(\r\n { el: thumb, event: 'mousedown', handler: startDrag },\r\n { el: thumb, event: 'touchstart', handler: startDrag }\r\n );\r\n }\r\n\r\n _handleTrackClick(e) {\r\n if (e.target.classList.contains('ds-slider__thumb')) return;\r\n \r\n const rect = this.track.getBoundingClientRect();\r\n const clientX = e.clientX;\r\n const clientY = e.clientY;\r\n \r\n let percentage;\r\n if (this.vertical) {\r\n percentage = 1 - (clientY - rect.top) / rect.height;\r\n } else {\r\n percentage = (clientX - rect.left) / rect.width;\r\n }\r\n \r\n percentage = Math.max(0, Math.min(1, percentage));\r\n \r\n const min = parseFloat(this.input?.min || 0);\r\n const max = parseFloat(this.input?.max || 100);\r\n const step = parseFloat(this.input?.step || 1);\r\n let value = min + percentage * (max - min);\r\n value = Math.round(value / step) * step;\r\n \r\n if (this.range) {\r\n const startVal = parseFloat(this.input?.value || 0);\r\n const endVal = parseFloat(this.inputEnd?.value || 0);\r\n const distToStart = Math.abs(value - startVal);\r\n const distToEnd = Math.abs(value - endVal);\r\n \r\n if (distToStart <= distToEnd) {\r\n if (this.input) this.input.value = Math.min(value, endVal);\r\n } else {\r\n if (this.inputEnd) this.inputEnd.value = Math.max(value, startVal);\r\n }\r\n } else {\r\n if (this.input) this.input.value = value;\r\n }\r\n \r\n this.updateSlider();\r\n }\r\n\r\n _handleKeyboard(e, which) {\r\n if (this.disabled) return;\r\n \r\n const inputEl = which === 'start' ? this.input : this.inputEnd;\r\n if (!inputEl) return;\r\n \r\n const step = parseFloat(inputEl.step || 1);\r\n const min = parseFloat(inputEl.min || 0);\r\n const max = parseFloat(inputEl.max || 100);\r\n let value = parseFloat(inputEl.value);\r\n \r\n switch (e.key) {\r\n case 'ArrowRight':\r\n case 'ArrowUp':\r\n e.preventDefault();\r\n value = Math.min(max, value + step);\r\n break;\r\n case 'ArrowLeft':\r\n case 'ArrowDown':\r\n e.preventDefault();\r\n value = Math.max(min, value - step);\r\n break;\r\n case 'Home':\r\n e.preventDefault();\r\n value = min;\r\n break;\r\n case 'End':\r\n e.preventDefault();\r\n value = max;\r\n break;\r\n default:\r\n return;\r\n }\r\n \r\n inputEl.value = value;\r\n this.updateSlider();\r\n \r\n if (this.onChange) {\r\n this.onChange({ value: this.getValue() });\r\n }\r\n }\r\n\r\n updateSlider() {\r\n const min = parseFloat(this.input?.min || 0);\r\n const max = parseFloat(this.input?.max || 100);\r\n\r\n if (this.range && this.inputEnd) {\r\n const startVal = parseFloat(this.input?.value || 0);\r\n const endVal = parseFloat(this.inputEnd?.value || 0);\r\n const startPct = ((startVal - min) / (max - min)) * 100;\r\n const endPct = ((endVal - min) / (max - min)) * 100;\r\n \r\n if (this.vertical) {\r\n this.fill.style.bottom = startPct + '%';\r\n this.fill.style.height = (endPct - startPct) + '%';\r\n } else {\r\n this.fill.style.left = startPct + '%';\r\n this.fill.style.width = (endPct - startPct) + '%';\r\n }\r\n \r\n if (this.thumbStart) {\r\n if (this.vertical) {\r\n this.thumbStart.style.bottom = startPct + '%';\r\n } else {\r\n this.thumbStart.style.left = startPct + '%';\r\n }\r\n }\r\n if (this.thumbEnd) {\r\n if (this.vertical) {\r\n this.thumbEnd.style.bottom = endPct + '%';\r\n } else {\r\n this.thumbEnd.style.left = endPct + '%';\r\n }\r\n }\r\n \r\n if (this.tooltipStart) {\r\n this.tooltipStart.textContent = this.tooltipFormat(startVal);\r\n }\r\n if (this.tooltipEnd) {\r\n this.tooltipEnd.textContent = this.tooltipFormat(endVal);\r\n }\r\n \r\n if (this.valueEl) {\r\n this.valueEl.textContent = `${this.tooltipFormat(startVal)} - ${this.tooltipFormat(endVal)}`;\r\n }\r\n \r\n // ARIA\r\n if (this.thumbStart) this.thumbStart.setAttribute('aria-valuenow', startVal);\r\n if (this.thumbEnd) this.thumbEnd.setAttribute('aria-valuenow', endVal);\r\n } else {\r\n const value = this.input?.value || 0;\r\n const percentage = ((value - min) / (max - min)) * 100;\r\n\r\n if (this.vertical) {\r\n this.fill.style.height = `${percentage}%`;\r\n } else {\r\n this.fill.style.width = `${percentage}%`;\r\n }\r\n \r\n if (this.thumbStart) {\r\n if (this.vertical) {\r\n this.thumbStart.style.bottom = percentage + '%';\r\n } else {\r\n this.thumbStart.style.left = percentage + '%';\r\n }\r\n }\r\n \r\n if (this.tooltipStart) {\r\n this.tooltipStart.textContent = this.tooltipFormat(parseFloat(value));\r\n }\r\n \r\n if (this.valueEl) {\r\n this.valueEl.textContent = this.tooltipFormat(parseFloat(value));\r\n }\r\n \r\n if (this.thumbStart) {\r\n this.thumbStart.setAttribute('aria-valuenow', value);\r\n }\r\n this.element.setAttribute('aria-valuenow', value);\r\n }\r\n }\r\n\r\n destroy() {\r\n this._listeners?.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n if (this.marksEl) this.marksEl.remove();\r\n this.track = null;\r\n this.fill = null;\r\n this.input = null;\r\n this.inputEnd = null;\r\n this.valueEl = null;\r\n this.thumbStart = null;\r\n this.thumbEnd = null;\r\n this.tooltipStart = null;\r\n this.tooltipEnd = null;\r\n this.marksEl = null;\r\n this.element = null;\r\n }\r\n\r\n setValue(value, endValue) {\r\n if (this.input) {\r\n this.input.value = value;\r\n }\r\n if (endValue !== undefined && this.inputEnd) {\r\n this.inputEnd.value = endValue;\r\n }\r\n this.updateSlider();\r\n }\r\n\r\n getValue() {\r\n if (this.range && this.inputEnd) {\r\n return [parseFloat(this.input?.value || 0), parseFloat(this.inputEnd?.value || 0)];\r\n }\r\n return parseFloat(this.input?.value || 0);\r\n }\r\n\r\n enable() {\r\n this.disabled = false;\r\n this.element.classList.remove('is-disabled');\r\n }\r\n\r\n disable() {\r\n this.disabled = true;\r\n this.element.classList.add('is-disabled');\r\n }\r\n}\r\n\r\nfunction initSlider(element, options) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n try {\r\n const slider = new Slider(element, options);\r\n element.__kupolaInstance = slider;\r\n element.__kupolaInitialized = true;\r\n } catch (error) {\r\n console.error('[Slider] Error initializing:', error);\r\n }\r\n}\r\n\r\nfunction cleanupSlider(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const slider = element.__kupolaInstance;\r\n slider.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initSliders() {\r\n document.querySelectorAll('.ds-slider').forEach(slider => {\r\n initSlider(slider);\r\n });\r\n}\r\n\r\nexport { Slider, initSlider, initSliders, cleanupSlider };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Slider = Slider;\r\n window.initSlider = initSlider;\r\n window.initSliders = initSliders;\r\n window.cleanupSlider = cleanupSlider;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('slider', initSlider, cleanupSlider);\r\n }\r\n}\r\n","class Carousel {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.track = element.querySelector('.ds-carousel__track');\r\n this.items = element.querySelectorAll('.ds-carousel__item');\r\n this.prevBtn = element.querySelector('.ds-carousel__prev');\r\n this.nextBtn = element.querySelector('.ds-carousel__next');\r\n this.indicators = element.querySelectorAll('.ds-carousel__indicator');\r\n this.autoBtn = element.querySelector('.ds-carousel__auto');\r\n \r\n // Options\r\n this.mode = options.mode || element.getAttribute('data-carousel-mode') || 'slide'; // slide | fade\r\n this.vertical = options.vertical || element.hasAttribute('data-carousel-vertical');\r\n this.autoPlay = options.autoPlay !== false;\r\n this.interval = options.interval || parseInt(element.getAttribute('data-carousel-interval')) || 3000;\r\n this.transitionDuration = options.transitionDuration || parseInt(element.getAttribute('data-carousel-duration')) || 500;\r\n this.loop = options.loop !== false;\r\n this.pauseOnHover = options.pauseOnHover !== false;\r\n this.swipe = options.swipe !== false;\r\n this.swipeThreshold = options.swipeThreshold || 50;\r\n this.keyboardNav = options.keyboardNav || element.hasAttribute('data-carousel-keyboard');\r\n this.onChange = options.onChange || null;\r\n \r\n this.currentIndex = 0;\r\n this.totalItems = this.items.length;\r\n this.autoPlayTimer = null;\r\n this.isAutoPlaying = false;\r\n this.isTransitioning = false;\r\n \r\n // Touch state\r\n this.touchStartX = 0;\r\n this.touchStartY = 0;\r\n this.touchDeltaX = 0;\r\n this.touchDeltaY = 0;\r\n this.isSwiping = false;\r\n \r\n this._mouseEnterHandler = () => { if (this.pauseOnHover) this.stopAutoPlay(); };\r\n this._mouseLeaveHandler = () => { if (this.pauseOnHover && this.autoPlay) this.startAutoPlay(); };\r\n \r\n this.init();\r\n }\r\n \r\n init() {\r\n this._prevClickHandler = () => this.prev();\r\n this._nextClickHandler = () => this.next();\r\n this._autoClickHandler = () => this.toggleAutoPlay();\r\n this._indicatorClickHandlers = [];\r\n \r\n if (this.prevBtn) this.prevBtn.addEventListener('click', this._prevClickHandler);\r\n if (this.nextBtn) this.nextBtn.addEventListener('click', this._nextClickHandler);\r\n \r\n this.indicators.forEach((indicator, index) => {\r\n const handler = () => this.goTo(index);\r\n this._indicatorClickHandlers.push(handler);\r\n indicator.addEventListener('click', handler);\r\n });\r\n \r\n if (this.autoBtn) this.autoBtn.addEventListener('click', this._autoClickHandler);\r\n \r\n // Touch/swipe support\r\n if (this.swipe) {\r\n this._touchStartHandler = (e) => this._handleTouchStart(e);\r\n this._touchMoveHandler = (e) => this._handleTouchMove(e);\r\n this._touchEndHandler = () => this._handleTouchEnd();\r\n \r\n this.element.addEventListener('touchstart', this._touchStartHandler, { passive: true });\r\n this.element.addEventListener('touchmove', this._touchMoveHandler, { passive: false });\r\n this.element.addEventListener('touchend', this._touchEndHandler);\r\n }\r\n \r\n // Keyboard navigation\r\n if (this.keyboardNav) {\r\n this._keydownHandler = (e) => {\r\n if (!this.element.contains(document.activeElement)) return;\r\n if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n this.prev();\r\n } else if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\r\n e.preventDefault();\r\n this.next();\r\n }\r\n };\r\n this.element.addEventListener('keydown', this._keydownHandler);\r\n }\r\n \r\n // Apply mode class\r\n if (this.mode === 'fade') {\r\n this.element.classList.add('ds-carousel--fade');\r\n }\r\n if (this.vertical) {\r\n this.element.classList.add('ds-carousel--vertical');\r\n }\r\n \r\n // Set transition duration\r\n if (this.track) {\r\n this.track.style.transitionDuration = this.transitionDuration + 'ms';\r\n }\r\n \r\n this.updateIndicators();\r\n if (this.autoPlay) this.startAutoPlay();\r\n \r\n this.element.addEventListener('mouseenter', this._mouseEnterHandler);\r\n this.element.addEventListener('mouseleave', this._mouseLeaveHandler);\r\n }\r\n \r\n goTo(index) {\r\n if (this.isTransitioning) return;\r\n if (index < 0 || index >= this.totalItems) return;\r\n \r\n this.isTransitioning = true;\r\n const prevIndex = this.currentIndex;\r\n this.currentIndex = index;\r\n \r\n if (this.mode === 'fade') {\r\n this.items.forEach((item, i) => {\r\n item.style.opacity = i === index ? '1' : '0';\r\n item.style.zIndex = i === index ? '1' : '0';\r\n });\r\n } else if (this.vertical) {\r\n const offset = -index * 100;\r\n this.track.style.transform = `translateY(${offset}%)`;\r\n } else {\r\n const offset = -index * 100;\r\n this.track.style.transform = `translateX(${offset}%)`;\r\n }\r\n \r\n this.updateIndicators();\r\n \r\n setTimeout(() => {\r\n this.isTransitioning = false;\r\n }, this.transitionDuration);\r\n \r\n if (this.onChange) {\r\n this.onChange({ index, prevIndex, total: this.totalItems });\r\n }\r\n \r\n this.element.dispatchEvent(new CustomEvent('kupola:carousel-change', {\r\n detail: { index, prevIndex, total: this.totalItems },\r\n bubbles: true\r\n }));\r\n }\r\n \r\n prev() {\r\n if (this.currentIndex > 0) {\r\n this.goTo(this.currentIndex - 1);\r\n } else if (this.loop) {\r\n this.goTo(this.totalItems - 1);\r\n }\r\n }\r\n \r\n next() {\r\n if (this.currentIndex < this.totalItems - 1) {\r\n this.goTo(this.currentIndex + 1);\r\n } else if (this.loop) {\r\n this.goTo(0);\r\n }\r\n }\r\n \r\n updateIndicators() {\r\n this.indicators.forEach((indicator, index) => {\r\n indicator.classList.toggle('is-active', index === this.currentIndex);\r\n });\r\n \r\n // Update prev/next button states for non-loop mode\r\n if (!this.loop) {\r\n if (this.prevBtn) this.prevBtn.disabled = this.currentIndex === 0;\r\n if (this.nextBtn) this.nextBtn.disabled = this.currentIndex === this.totalItems - 1;\r\n }\r\n }\r\n \r\n startAutoPlay() {\r\n if (this.totalItems <= 1) return;\r\n this.stopAutoPlay();\r\n this.isAutoPlaying = true;\r\n if (this.autoBtn) this.autoBtn.classList.add('is-active');\r\n this.autoPlayTimer = setInterval(() => this.next(), this.interval);\r\n }\r\n \r\n stopAutoPlay() {\r\n if (this.autoPlayTimer) {\r\n clearInterval(this.autoPlayTimer);\r\n this.autoPlayTimer = null;\r\n }\r\n this.isAutoPlaying = false;\r\n if (this.autoBtn) this.autoBtn.classList.remove('is-active');\r\n }\r\n \r\n toggleAutoPlay() {\r\n if (this.isAutoPlaying) {\r\n this.stopAutoPlay();\r\n } else {\r\n this.startAutoPlay();\r\n }\r\n }\r\n \r\n // Touch handlers\r\n _handleTouchStart(e) {\r\n this.touchStartX = e.touches[0].clientX;\r\n this.touchStartY = e.touches[0].clientY;\r\n this.touchDeltaX = 0;\r\n this.touchDeltaY = 0;\r\n this.isSwiping = true;\r\n \r\n if (this.isAutoPlaying) {\r\n this.stopAutoPlay();\r\n this._wasAutoPlaying = true;\r\n }\r\n }\r\n \r\n _handleTouchMove(e) {\r\n if (!this.isSwiping) return;\r\n \r\n this.touchDeltaX = e.touches[0].clientX - this.touchStartX;\r\n this.touchDeltaY = e.touches[0].clientY - this.touchStartY;\r\n \r\n // Prevent page scroll if swiping horizontally\r\n const absDx = Math.abs(this.touchDeltaX);\r\n const absDy = Math.abs(this.touchDeltaY);\r\n \r\n if (absDx > absDy && absDx > 10) {\r\n e.preventDefault();\r\n }\r\n }\r\n \r\n _handleTouchEnd() {\r\n if (!this.isSwiping) return;\r\n this.isSwiping = false;\r\n \r\n const absDeltaX = Math.abs(this.touchDeltaX);\r\n const absDeltaY = Math.abs(this.touchDeltaY);\r\n \r\n if (absDeltaX > this.swipeThreshold && absDeltaX > absDeltaY) {\r\n if (this.touchDeltaX > 0) {\r\n this.prev();\r\n } else {\r\n this.next();\r\n }\r\n }\r\n \r\n if (this._wasAutoPlaying) {\r\n this.startAutoPlay();\r\n this._wasAutoPlaying = false;\r\n }\r\n }\r\n \r\n destroy() {\r\n this.stopAutoPlay();\r\n this.element.removeEventListener('mouseenter', this._mouseEnterHandler);\r\n this.element.removeEventListener('mouseleave', this._mouseLeaveHandler);\r\n \r\n if (this.prevBtn && this._prevClickHandler) this.prevBtn.removeEventListener('click', this._prevClickHandler);\r\n if (this.nextBtn && this._nextClickHandler) this.nextBtn.removeEventListener('click', this._nextClickHandler);\r\n if (this.autoBtn && this._autoClickHandler) this.autoBtn.removeEventListener('click', this._autoClickHandler);\r\n \r\n this.indicators.forEach((indicator, index) => {\r\n const handler = this._indicatorClickHandlers[index];\r\n if (handler) indicator.removeEventListener('click', handler);\r\n });\r\n \r\n if (this._touchStartHandler) this.element.removeEventListener('touchstart', this._touchStartHandler);\r\n if (this._touchMoveHandler) this.element.removeEventListener('touchmove', this._touchMoveHandler);\r\n if (this._touchEndHandler) this.element.removeEventListener('touchend', this._touchEndHandler);\r\n if (this._keydownHandler) this.element.removeEventListener('keydown', this._keydownHandler);\r\n \r\n this._prevClickHandler = null;\r\n this._nextClickHandler = null;\r\n this._autoClickHandler = null;\r\n this._indicatorClickHandlers = null;\r\n }\r\n}\r\n\r\nfunction initCarousel(element, options) {\r\n if (element.__kupolaInitialized) return;\r\n \r\n const carousel = new Carousel(element, options);\r\n element.__kupolaInstance = carousel;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction initCarousels(root = document) {\r\n root.querySelectorAll('.ds-carousel').forEach(carousel => {\r\n initCarousel(carousel);\r\n });\r\n}\r\n\r\nfunction cleanupCarousel(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n \r\n const carousel = element.__kupolaInstance;\r\n carousel.destroy();\r\n \r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nexport { Carousel, initCarousel, initCarousels, cleanupCarousel };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Carousel = Carousel;\r\n window.initCarousel = initCarousel;\r\n window.initCarousels = initCarousels;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('carousel', initCarousel, cleanupCarousel);\r\n }\r\n}\r\n\r\n","class Drawer {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.mask = element.querySelector('.ds-drawer-mask');\r\n this.drawerEl = element.querySelector('.ds-drawer');\r\n \r\n // Options\r\n this.placement = options.placement || element.getAttribute('data-drawer-placement') || 'right'; // right | left | top | bottom\r\n this.width = options.width || element.getAttribute('data-drawer-width') || '400px';\r\n this.height = options.height || element.getAttribute('data-drawer-height') || '400px';\r\n this.escClose = options.escClose !== false;\r\n this.maskClosable = options.maskClosable !== false;\r\n this.showMask = options.showMask !== false;\r\n this.onOpen = options.onOpen || null;\r\n this.onClose = options.onClose || null;\r\n this.onBeforeClose = options.onBeforeClose || null;\r\n \r\n this._keydownHandler = null;\r\n this._bindEvents();\r\n }\r\n\r\n _bindEvents() {\r\n const closeBtn = this.mask?.querySelector('.ds-drawer__close');\r\n const cancelBtn = this.mask?.querySelector('.ds-drawer__footer .ds-btn--ghost');\r\n const confirmBtn = this.mask?.querySelector('.ds-drawer__footer .ds-btn--brand');\r\n\r\n this.closeDrawer = () => {\r\n if (this.onBeforeClose) {\r\n const result = this.onBeforeClose();\r\n if (result === false) return;\r\n }\r\n \r\n if (this.mask) {\r\n this.mask.classList.remove('is-visible');\r\n }\r\n if (this.drawerEl) {\r\n this.drawerEl.classList.remove('is-visible');\r\n }\r\n document.body.style.overflow = '';\r\n \r\n if (this.onClose) this.onClose();\r\n this.element.dispatchEvent(new CustomEvent('kupola:drawer-close', { bubbles: true }));\r\n };\r\n\r\n this.handleMaskClick = (e) => {\r\n if (this.maskClosable && e.target === this.mask) {\r\n this.closeDrawer();\r\n }\r\n };\r\n\r\n if (this.mask) {\r\n this.mask.addEventListener('click', this.handleMaskClick);\r\n }\r\n\r\n if (closeBtn) {\r\n closeBtn.addEventListener('click', this.closeDrawer);\r\n }\r\n\r\n if (cancelBtn) {\r\n cancelBtn.addEventListener('click', this.closeDrawer);\r\n }\r\n\r\n if (confirmBtn) {\r\n confirmBtn.addEventListener('click', this.closeDrawer);\r\n }\r\n\r\n // ESC key\r\n if (this.escClose) {\r\n this._keydownHandler = (e) => {\r\n if (e.key === 'Escape' && this.drawerEl?.classList.contains('is-visible')) {\r\n this.closeDrawer();\r\n }\r\n };\r\n document.addEventListener('keydown', this._keydownHandler);\r\n }\r\n\r\n this._listeners = [\r\n { el: this.mask, event: 'click', handler: this.handleMaskClick },\r\n { el: closeBtn, event: 'click', handler: this.closeDrawer },\r\n { el: cancelBtn, event: 'click', handler: this.closeDrawer },\r\n { el: confirmBtn, event: 'click', handler: this.closeDrawer }\r\n ].filter(item => item.el);\r\n }\r\n\r\n _applyPlacement() {\r\n if (!this.drawerEl) return;\r\n \r\n // Set direction class\r\n this.drawerEl.classList.remove('ds-drawer--right', 'ds-drawer--left', 'ds-drawer--top', 'ds-drawer--bottom');\r\n this.drawerEl.classList.add(`ds-drawer--${this.placement}`);\r\n \r\n // Set size\r\n if (this.placement === 'left' || this.placement === 'right') {\r\n this.drawerEl.style.width = this.width;\r\n } else {\r\n this.drawerEl.style.height = this.height;\r\n }\r\n \r\n // Hide mask if configured\r\n if (!this.showMask && this.mask) {\r\n this.mask.style.background = 'transparent';\r\n this.mask.style.pointerEvents = 'none';\r\n this.drawerEl.style.boxShadow = '0 0 24px rgba(0,0,0,0.15)';\r\n }\r\n }\r\n\r\n destroy() {\r\n this._listeners?.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n if (this._keydownHandler) {\r\n document.removeEventListener('keydown', this._keydownHandler);\r\n }\r\n this._listeners = null;\r\n this.mask = null;\r\n this.drawerEl = null;\r\n this.element = null;\r\n }\r\n\r\n open() {\r\n this._applyPlacement();\r\n \r\n if (this.mask) {\r\n this.mask.classList.add('is-visible');\r\n }\r\n if (this.drawerEl) {\r\n this.drawerEl.classList.add('is-visible');\r\n }\r\n document.body.style.overflow = 'hidden';\r\n \r\n if (this.onOpen) this.onOpen();\r\n this.element.dispatchEvent(new CustomEvent('kupola:drawer-open', { bubbles: true }));\r\n }\r\n\r\n close() {\r\n this.closeDrawer();\r\n }\r\n\r\n isOpen() {\r\n return this.drawerEl?.classList.contains('is-visible') || false;\r\n }\r\n}\r\n\r\nfunction createDrawer(options = {}) {\r\n const {\r\n title = '',\r\n content = '',\r\n html = false,\r\n placement = 'right',\r\n width = '400px',\r\n height = '400px',\r\n closable = true,\r\n showMask = true,\r\n footer = null,\r\n onClose,\r\n onOpen\r\n } = options;\r\n \r\n const container = document.createElement('div');\r\n container.className = 'ds-drawer-container';\r\n \r\n let footerHTML = '';\r\n if (footer !== null) {\r\n if (typeof footer === 'string') {\r\n footerHTML = `<div class=\"ds-drawer__footer\">${footer}</div>`;\r\n } else {\r\n footerHTML = `<div class=\"ds-drawer__footer\">\r\n <button class=\"ds-btn ds-btn--ghost\" data-drawer-cancel>Cancel</button>\r\n <button class=\"ds-btn ds-btn--brand\" data-drawer-confirm>OK</button>\r\n </div>`;\r\n }\r\n }\r\n \r\n container.innerHTML = `\r\n <div class=\"ds-drawer-mask\">\r\n <div class=\"ds-drawer ds-drawer--${placement}\" style=\"${placement === 'left' || placement === 'right' ? 'width:' + width : 'height:' + height}\">\r\n <div class=\"ds-drawer__header\">\r\n <span class=\"ds-drawer__title\"></span>\r\n ${closable ? `<button class=\"ds-drawer__close\" aria-label=\"Close\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M18 6L6 18M6 6l12 12\"/>\r\n </svg>\r\n </button>` : ''}\r\n </div>\r\n <div class=\"ds-drawer__body\"></div>\r\n ${footerHTML}\r\n </div>\r\n </div>\r\n `;\r\n \r\n document.body.appendChild(container);\r\n \r\n const drawer = new Drawer(container, { placement, width, height, showMask, onClose, onOpen });\r\n \r\n const titleEl = container.querySelector('.ds-drawer__title');\r\n if (titleEl) titleEl.textContent = title;\r\n const bodyEl = container.querySelector('.ds-drawer__body');\r\n if (bodyEl) {\r\n if (html) bodyEl.innerHTML = content;\r\n else bodyEl.textContent = content;\r\n }\r\n \r\n const confirmBtn = container.querySelector('[data-drawer-confirm]');\r\n const cancelBtn = container.querySelector('[data-drawer-cancel]');\r\n \r\n if (cancelBtn) cancelBtn.addEventListener('click', () => drawer.close());\r\n if (confirmBtn) {\r\n confirmBtn.addEventListener('click', () => {\r\n if (options.onConfirm) options.onConfirm();\r\n drawer.close();\r\n });\r\n }\r\n \r\n const origClose = drawer.closeDrawer;\r\n drawer.closeDrawer = () => {\r\n origClose();\r\n setTimeout(() => {\r\n drawer.destroy();\r\n container.remove();\r\n }, 300);\r\n };\r\n \r\n drawer.open();\r\n return drawer;\r\n}\r\n\r\nfunction initDrawer(element, options) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const drawer = new Drawer(element, options);\r\n element.__kupolaInstance = drawer;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupDrawer(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const drawer = element.__kupolaInstance;\r\n drawer.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initDrawers() {\r\n document.querySelectorAll('[data-drawer]').forEach(trigger => {\r\n trigger.addEventListener('click', () => {\r\n const drawerId = trigger.getAttribute('data-drawer');\r\n const drawer = document.getElementById(drawerId);\r\n\r\n if (!drawer) return;\r\n\r\n initDrawer(drawer, {\r\n placement: trigger.getAttribute('data-drawer-placement') || 'right',\r\n width: trigger.getAttribute('data-drawer-width'),\r\n height: trigger.getAttribute('data-drawer-height')\r\n });\r\n drawer.__kupolaInstance?.open();\r\n });\r\n });\r\n\r\n document.querySelectorAll('.ds-drawer-mask').forEach(mask => {\r\n const drawerEl = mask.parentElement;\r\n if (drawerEl) {\r\n initDrawer(drawerEl);\r\n }\r\n });\r\n}\r\n\r\nexport { Drawer, initDrawer, initDrawers, cleanupDrawer, createDrawer };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Drawer = Drawer;\r\n window.initDrawer = initDrawer;\r\n window.initDrawers = initDrawers;\r\n window.cleanupDrawer = cleanupDrawer;\r\n window.createDrawer = createDrawer;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('drawer', initDrawer, cleanupDrawer);\r\n }\r\n}\r\n","class Modal {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.mask = element.querySelector('.ds-modal-mask');\r\n this.modal = element.querySelector('.ds-modal');\r\n this.closeBtn = element.querySelector('.ds-modal__close');\r\n \r\n // Options\r\n this.fullscreen = options.fullscreen || element.hasAttribute('data-modal-fullscreen');\r\n this.closableOnMask = options.closableOnMask !== false; // default true\r\n this.escClose = options.escClose !== false;\r\n this.width = options.width || element.getAttribute('data-modal-width') || '';\r\n this.center = options.center !== false;\r\n this.onBeforeOpen = options.onBeforeOpen || null;\r\n this.onBeforeClose = options.onBeforeClose || null;\r\n this.onOpened = options.onOpened || null;\r\n this.onClosed = options.onClosed || null;\r\n \r\n this._keydownHandler = (e) => {\r\n if (this.escClose && e.key === 'Escape' && this.isVisible()) {\r\n this.close();\r\n }\r\n };\r\n \r\n this._closeBtnClickHandler = () => this.close();\r\n \r\n this._maskClickHandler = (e) => {\r\n if (this.closableOnMask && e.target === this.mask) {\r\n this.close();\r\n }\r\n };\r\n \r\n this.init();\r\n }\r\n \r\n init() {\r\n if (this.closeBtn) {\r\n this.closeBtn.addEventListener('click', this._closeBtnClickHandler);\r\n }\r\n \r\n if (this.mask) {\r\n this.mask.addEventListener('click', this._maskClickHandler);\r\n }\r\n \r\n document.addEventListener('keydown', this._keydownHandler);\r\n \r\n // Apply fullscreen\r\n if (this.fullscreen && this.modal) {\r\n this.modal.classList.add('ds-modal--fullscreen');\r\n }\r\n \r\n // Apply custom width\r\n if (this.width && this.modal) {\r\n this.modal.style.maxWidth = this.width;\r\n }\r\n }\r\n \r\n open() {\r\n if (this.onBeforeOpen) {\r\n const result = this.onBeforeOpen();\r\n if (result === false) return;\r\n }\r\n \r\n if (this.mask) {\r\n this.mask.classList.add('is-visible');\r\n this.mask.classList.add('ds-modal-fade-enter');\r\n requestAnimationFrame(() => {\r\n this.mask.classList.add('ds-modal-fade-enter-active');\r\n });\r\n }\r\n if (this.modal) {\r\n this.modal.classList.add('ds-modal-zoom-enter');\r\n requestAnimationFrame(() => {\r\n this.modal.classList.add('ds-modal-zoom-enter-active');\r\n });\r\n }\r\n \r\n Modal._openCount = (Modal._openCount || 0) + 1;\r\n document.body.style.overflow = 'hidden';\r\n \r\n if (this.onOpened) {\r\n setTimeout(() => this.onOpened(), 300);\r\n }\r\n \r\n this.element.dispatchEvent(new CustomEvent('kupola:modal-open', { bubbles: true }));\r\n }\r\n \r\n close() {\r\n if (this.onBeforeClose) {\r\n const result = this.onBeforeClose();\r\n if (result === false) return;\r\n }\r\n \r\n if (this.mask) {\r\n this.mask.classList.remove('ds-modal-fade-enter-active');\r\n this.mask.classList.add('ds-modal-fade-leave-active');\r\n }\r\n if (this.modal) {\r\n this.modal.classList.remove('ds-modal-zoom-enter-active');\r\n this.modal.classList.add('ds-modal-zoom-leave-active');\r\n }\r\n \r\n setTimeout(() => {\r\n if (this.mask) {\r\n this.mask.classList.remove('is-visible', 'ds-modal-fade-enter', 'ds-modal-fade-leave-active');\r\n }\r\n if (this.modal) {\r\n this.modal.classList.remove('ds-modal-zoom-enter', 'ds-modal-zoom-leave-active');\r\n }\r\n }, 300);\r\n \r\n Modal._openCount = Math.max(0, (Modal._openCount || 0) - 1);\r\n if (Modal._openCount === 0) {\r\n document.body.style.overflow = '';\r\n }\r\n \r\n if (this.onClosed) {\r\n setTimeout(() => this.onClosed(), 300);\r\n }\r\n \r\n this.element.dispatchEvent(new CustomEvent('kupola:modal-close', { bubbles: true }));\r\n }\r\n \r\n toggleFullscreen() {\r\n this.fullscreen = !this.fullscreen;\r\n if (this.modal) {\r\n this.modal.classList.toggle('ds-modal--fullscreen', this.fullscreen);\r\n }\r\n }\r\n \r\n isVisible() {\r\n return this.mask && this.mask.classList.contains('is-visible');\r\n }\r\n \r\n destroy() {\r\n document.removeEventListener('keydown', this._keydownHandler);\r\n if (this.closeBtn) {\r\n this.closeBtn.removeEventListener('click', this._closeBtnClickHandler);\r\n }\r\n if (this.mask) {\r\n this.mask.removeEventListener('click', this._maskClickHandler);\r\n }\r\n if (this.isVisible()) {\r\n this.close();\r\n }\r\n }\r\n}\r\n\r\nModal._openCount = 0;\r\n\r\nfunction createModal(options = {}) {\r\n const {\r\n title = '',\r\n content = '',\r\n html = false,\r\n width = '480px',\r\n fullscreen = false,\r\n showCancel = true,\r\n showConfirm = true,\r\n confirmText = 'OK',\r\n cancelText = 'Cancel',\r\n confirmClass = 'ds-btn--brand',\r\n cancelClass = 'ds-btn--ghost',\r\n closable = true,\r\n maskClosable = true,\r\n onConfirm,\r\n onCancel,\r\n onOpen,\r\n onClose,\r\n footer = null\r\n } = options;\r\n \r\n const container = document.createElement('div');\r\n container.className = 'ds-modal-container';\r\n \r\n let footerHTML = '';\r\n if (footer !== null) {\r\n if (typeof footer === 'string') {\r\n footerHTML = `<div class=\"ds-modal__footer\">${footer}</div>`;\r\n } else if (showConfirm || showCancel) {\r\n footerHTML = `<div class=\"ds-modal__footer\">\r\n ${showCancel ? `<button class=\"ds-btn ${cancelClass}\" data-modal-cancel>${cancelText}</button>` : ''}\r\n ${showConfirm ? `<button class=\"ds-btn ${confirmClass}\" data-modal-confirm>${confirmText}</button>` : ''}\r\n </div>`;\r\n }\r\n }\r\n \r\n container.innerHTML = `\r\n <div class=\"ds-modal-mask\">\r\n <div class=\"ds-modal${fullscreen ? ' ds-modal--fullscreen' : ''}\" style=\"${!fullscreen ? 'max-width: ' + width : ''}\">\r\n <div class=\"ds-modal__header\">\r\n <span class=\"ds-modal__title\"></span>\r\n ${closable ? `<button class=\"ds-modal__close\" aria-label=\"Close\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M18 6L6 18M6 6l12 12\"/>\r\n </svg>\r\n </button>` : ''}\r\n </div>\r\n <div class=\"ds-modal__body\"></div>\r\n ${footerHTML}\r\n </div>\r\n </div>\r\n `;\r\n \r\n document.body.appendChild(container);\r\n \r\n const modal = new Modal(container, { fullscreen, closableOnMask: maskClosable });\r\n \r\n const titleEl = container.querySelector('.ds-modal__title');\r\n if (titleEl) titleEl.textContent = title;\r\n const bodyEl = container.querySelector('.ds-modal__body');\r\n if (bodyEl) {\r\n if (html) {\r\n bodyEl.innerHTML = content;\r\n } else {\r\n bodyEl.textContent = content;\r\n }\r\n }\r\n \r\n const confirmBtn = container.querySelector('[data-modal-confirm]');\r\n const cancelBtn = container.querySelector('[data-modal-cancel]');\r\n \r\n let isConfirming = false;\r\n \r\n const confirmHandler = async () => {\r\n if (onConfirm) {\r\n // Support async onConfirm\r\n confirmBtn.disabled = true;\r\n confirmBtn.classList.add('is-loading');\r\n try {\r\n const result = await onConfirm();\r\n if (result === false) {\r\n confirmBtn.disabled = false;\r\n confirmBtn.classList.remove('is-loading');\r\n return;\r\n }\r\n } catch(e) {\r\n confirmBtn.disabled = false;\r\n confirmBtn.classList.remove('is-loading');\r\n return;\r\n }\r\n }\r\n isConfirming = true;\r\n modal.close();\r\n };\r\n \r\n const cancelHandler = () => {\r\n if (onCancel) onCancel();\r\n modal.close();\r\n };\r\n \r\n if (confirmBtn) confirmBtn.addEventListener('click', confirmHandler);\r\n if (cancelBtn) cancelBtn.addEventListener('click', cancelHandler);\r\n \r\n const closeAndDestroy = () => {\r\n setTimeout(() => {\r\n if (confirmBtn) confirmBtn.removeEventListener('click', confirmHandler);\r\n if (cancelBtn) cancelBtn.removeEventListener('click', cancelHandler);\r\n modal.destroy();\r\n container.remove();\r\n if (onClose) onClose(isConfirming);\r\n }, 300);\r\n };\r\n \r\n const originalClose = modal.close.bind(modal);\r\n modal.close = () => {\r\n originalClose();\r\n closeAndDestroy();\r\n };\r\n \r\n modal.open();\r\n if (onOpen) setTimeout(() => onOpen(), 50);\r\n \r\n return modal;\r\n}\r\n\r\n// Convenience methods\r\nfunction confirmModal(options) {\r\n if (typeof options === 'string') {\r\n options = { content: options };\r\n }\r\n return createModal({\r\n ...options,\r\n showCancel: true,\r\n showConfirm: true\r\n });\r\n}\r\n\r\nfunction alertModal(options) {\r\n if (typeof options === 'string') {\r\n options = { content: options };\r\n }\r\n return createModal({\r\n ...options,\r\n showCancel: false,\r\n showConfirm: true\r\n });\r\n}\r\n\r\nfunction initModal(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const modal = new Modal(element);\r\n element.__kupolaInstance = modal;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupModal(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const modal = element.__kupolaInstance;\r\n modal.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initModals() {\r\n document.querySelectorAll('.ds-modal-container').forEach(container => {\r\n initModal(container);\r\n });\r\n}\r\n\r\nexport { Modal, initModals, initModal, cleanupModal, createModal, confirmModal, alertModal };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Modal = Modal;\r\n window.initModal = initModal;\r\n window.cleanupModal = cleanupModal;\r\n window.initModals = initModals;\r\n window.createModal = createModal;\r\n window.confirmModal = confirmModal;\r\n window.alertModal = alertModal;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('modal', initModal, cleanupModal);\r\n }\r\n}\r\n\r\n","class Dialog {\r\n static normal(options = {}) {\r\n return this._create({ type: 'normal', ...options });\r\n }\r\n \r\n static success(options = {}) {\r\n return this._create({ type: 'success', ...options });\r\n }\r\n \r\n static warning(options = {}) {\r\n return this._create({ type: 'warning', ...options });\r\n }\r\n \r\n static error(options = {}) {\r\n return this._create({ type: 'error', ...options });\r\n }\r\n \r\n static info(options = {}) {\r\n return this._create({ type: 'info', ...options });\r\n }\r\n \r\n static confirm(options = {}) {\r\n return this._create({ type: 'confirm', ...options });\r\n }\r\n \r\n static _create(options) {\r\n const {\r\n type = 'normal',\r\n title = '',\r\n content = '',\r\n onConfirm,\r\n onCancel\r\n } = options;\r\n \r\n const icons = {\r\n normal: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>`,\r\n success: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"20 6 9 17 4 12\"/></svg>`,\r\n warning: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 9v4M12 17h.01\"/><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\"/></svg>`,\r\n error: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/></svg>`,\r\n info: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>`,\r\n confirm: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 9v4M12 17h.01\"/><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\"/></svg>`\r\n };\r\n \r\n const container = document.createElement('div');\r\n container.className = 'ds-modal-container';\r\n container.innerHTML = `\r\n <div class=\"ds-modal-mask\">\r\n <div class=\"ds-modal\" style=\"max-width: 360px\">\r\n <div class=\"ds-modal__body\" style=\"text-align: center; padding: 24px 16px;\">\r\n <div class=\"ds-dialog__icon ds-dialog__icon--${type}\">${icons[type]}</div>\r\n ${title ? '<div class=\"ds-dialog__title\"></div>' : ''}\r\n <div class=\"ds-dialog__content\"></div>\r\n <div class=\"ds-dialog__actions\">\r\n ${type === 'confirm' || onCancel ? `<button class=\"ds-btn ds-btn--ghost\" data-dialog-cancel>Cancel</button>` : ''}\r\n <button class=\"ds-btn ${type === 'confirm' ? 'ds-btn--brand' : 'ds-btn--ghost'}\" data-dialog-confirm>\r\n ${type === 'confirm' ? 'Confirm' : 'OK'}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n \r\n document.body.appendChild(container);\r\n \r\n if (title) container.querySelector('.ds-dialog__title').textContent = title;\r\n container.querySelector('.ds-dialog__content').textContent = content;\r\n \r\n const mask = container.querySelector('.ds-modal-mask');\r\n const confirmBtn = container.querySelector('[data-dialog-confirm]');\r\n const cancelBtn = container.querySelector('[data-dialog-cancel]');\r\n \r\n const keydownHandler = function(e) {\r\n if (e.key === 'Escape') {\r\n if (onCancel) onCancel();\r\n close();\r\n }\r\n };\r\n \r\n const maskClickHandler = function(e) {\r\n if (e.target === mask) {\r\n if (onCancel) onCancel();\r\n close();\r\n }\r\n };\r\n \r\n const confirmClickHandler = function() {\r\n if (onConfirm) onConfirm();\r\n close();\r\n };\r\n \r\n const cancelClickHandler = function() {\r\n if (onCancel) onCancel();\r\n close();\r\n };\r\n \r\n const close = () => {\r\n mask.classList.remove('is-visible');\r\n document.body.style.overflow = '';\r\n document.removeEventListener('keydown', keydownHandler);\r\n mask.removeEventListener('click', maskClickHandler);\r\n if (confirmBtn) {\r\n confirmBtn.removeEventListener('click', confirmClickHandler);\r\n }\r\n if (cancelBtn) {\r\n cancelBtn.removeEventListener('click', cancelClickHandler);\r\n }\r\n setTimeout(() => container.remove(), 300);\r\n };\r\n \r\n mask.classList.add('is-visible');\r\n document.body.style.overflow = 'hidden';\r\n \r\n if (confirmBtn) {\r\n confirmBtn.addEventListener('click', confirmClickHandler);\r\n }\r\n \r\n if (cancelBtn) {\r\n cancelBtn.addEventListener('click', cancelClickHandler);\r\n }\r\n \r\n mask.addEventListener('click', maskClickHandler);\r\n document.addEventListener('keydown', keydownHandler);\r\n \r\n return { close };\r\n }\r\n}\r\n\r\nexport { Dialog };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Dialog = Dialog;\r\n}","const Notification = {\r\n normal: function(options) {\r\n this.show({ ...options, type: 'normal' });\r\n },\r\n success: function(options) {\r\n this.show({ ...options, type: 'success' });\r\n },\r\n error: function(options) {\r\n this.show({ ...options, type: 'error' });\r\n },\r\n warning: function(options) {\r\n this.show({ ...options, type: 'warning' });\r\n },\r\n info: function(options) {\r\n this.show({ ...options, type: 'info' });\r\n },\r\n show: function(options) {\r\n const { title, message, type = 'normal', duration = 4000 } = options;\r\n \r\n const notification = document.createElement('div');\r\n notification.className = `ds-notification__item ds-notification__item--${type}`;\r\n \r\n const icons = {\r\n normal: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>',\r\n success: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"20 6 9 17 4 12\"/></svg>',\r\n error: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/></svg>',\r\n warning: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><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\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/></svg>',\r\n info: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>'\r\n };\r\n \r\n notification.innerHTML = `\r\n <div class=\"ds-notification__icon ds-notification__icon--${type}\">${icons[type]}</div>\r\n <div class=\"ds-notification__content\">\r\n ${title ? '<div class=\"ds-notification__title\"></div>' : ''}\r\n ${message ? '<div class=\"ds-notification__message\"></div>' : ''}\r\n </div>\r\n <button class=\"ds-notification__close\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\r\n </button>\r\n `;\r\n if (title) notification.querySelector('.ds-notification__title').textContent = title;\r\n if (message) notification.querySelector('.ds-notification__message').textContent = message;\r\n \r\n let container = document.querySelector('.ds-notification');\r\n if (!container) {\r\n container = document.createElement('div');\r\n container.className = 'ds-notification';\r\n document.body.appendChild(container);\r\n }\r\n \r\n container.appendChild(notification);\r\n \r\n setTimeout(() => {\r\n notification.classList.add('is-visible');\r\n }, 10);\r\n \r\n notification.querySelector('.ds-notification__close').addEventListener('click', () => {\r\n notification.classList.remove('is-visible');\r\n notification.classList.add('is-exiting');\r\n setTimeout(() => notification.remove(), 300);\r\n });\r\n \r\n if (duration > 0) {\r\n setTimeout(() => {\r\n notification.classList.remove('is-visible');\r\n notification.classList.add('is-exiting');\r\n setTimeout(() => notification.remove(), 300);\r\n }, duration);\r\n }\r\n }\r\n};\r\n\r\nfunction initNotifications() {}\r\n\r\nexport { Notification, initNotifications };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Notification = Notification;\r\n window.initNotifications = initNotifications;\r\n}","const Message = {\r\n normal: function(message, options = {}) {\r\n this.show(message, 'normal', options);\r\n },\r\n success: function(message, options = {}) {\r\n this.show(message, 'success', options);\r\n },\r\n error: function(message, options = {}) {\r\n this.show(message, 'error', options);\r\n },\r\n warning: function(message, options = {}) {\r\n this.show(message, 'warning', options);\r\n },\r\n info: function(message, options = {}) {\r\n this.show(message, 'info', options);\r\n },\r\n show: function(message, type = 'normal', options = {}) {\r\n const { duration = 3000 } = options;\r\n \r\n const msg = document.createElement('div');\r\n msg.className = `ds-message__item ds-message__item--${type}`;\r\n \r\n const icons = {\r\n normal: '<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>',\r\n success: '<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"20 6 9 17 4 12\"/></svg>',\r\n error: '<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/></svg>',\r\n warning: '<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><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\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/></svg>',\r\n info: '<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>'\r\n };\r\n \r\n msg.innerHTML = `\r\n <div class=\"ds-message__icon ds-message__icon--${type}\">${icons[type]}</div>\r\n <div class=\"ds-message__content\"></div>\r\n `;\r\n msg.querySelector('.ds-message__content').textContent = message;\r\n \r\n let container = document.querySelector('.ds-message');\r\n if (!container) {\r\n container = document.createElement('div');\r\n container.className = 'ds-message';\r\n document.body.appendChild(container);\r\n }\r\n \r\n container.appendChild(msg);\r\n \r\n setTimeout(() => {\r\n msg.classList.add('is-visible');\r\n }, 10);\r\n \r\n if (duration > 0) {\r\n setTimeout(() => {\r\n msg.classList.remove('is-visible');\r\n msg.classList.add('is-exiting');\r\n setTimeout(() => msg.remove(), 300);\r\n }, duration);\r\n }\r\n }\r\n};\r\n\r\nfunction initMessages() {}\r\n\r\nexport { Message, initMessages };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Message = Message;\r\n window.initMessages = initMessages;\r\n}","class FileUpload {\r\n constructor(element) {\r\n this.element = element;\r\n this.dropzone = element.querySelector('.ds-fileupload__dropzone');\r\n this.input = element.querySelector('.ds-fileupload__input');\r\n this.list = element.querySelector('.ds-fileupload__list');\r\n this.progress = element.querySelector('.ds-fileupload__preview');\r\n \r\n this.files = [];\r\n this.maxSize = parseInt(element.getAttribute('data-max-size')) || 0;\r\n this.maxCount = parseInt(element.getAttribute('data-max-count')) || 0;\r\n this._listeners = [];\r\n \r\n this.init();\r\n }\r\n\r\n init() {\r\n this.bindEvents();\r\n }\r\n\r\n bindEvents() {\r\n const clickHandler = (e) => {\r\n if (e.target === this.input || this.input.contains(e.target)) return;\r\n this.input.click();\r\n };\r\n\r\n const changeHandler = (e) => {\r\n const files = Array.from(e.target.files);\r\n this.addFiles(files);\r\n e.target.value = '';\r\n };\r\n\r\n const dragoverHandler = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.dropzone.classList.add('is-dragging');\r\n };\r\n\r\n const dragleaveHandler = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.dropzone.classList.remove('is-dragging');\r\n };\r\n\r\n const dropHandler = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.dropzone.classList.remove('is-dragging');\r\n \r\n const files = Array.from(e.dataTransfer.files);\r\n this.addFiles(files);\r\n };\r\n\r\n this.dropzone.addEventListener('click', clickHandler);\r\n this.input.addEventListener('change', changeHandler);\r\n this.dropzone.addEventListener('dragover', dragoverHandler);\r\n this.dropzone.addEventListener('dragleave', dragleaveHandler);\r\n this.dropzone.addEventListener('drop', dropHandler);\r\n\r\n this._listeners.push(\r\n { el: this.dropzone, event: 'click', handler: clickHandler },\r\n { el: this.input, event: 'change', handler: changeHandler },\r\n { el: this.dropzone, event: 'dragover', handler: dragoverHandler },\r\n { el: this.dropzone, event: 'dragleave', handler: dragleaveHandler },\r\n { el: this.dropzone, event: 'drop', handler: dropHandler }\r\n );\r\n }\r\n\r\n addFiles(files) {\r\n files.forEach(file => {\r\n if (this.maxCount > 0 && this.files.length >= this.maxCount) {\r\n this.showError(`Maximum ${this.maxCount} files allowed`);\r\n return;\r\n }\r\n if (this.isValidFile(file)) {\r\n this.files.push(file);\r\n this.renderFileItem(file);\r\n this.showPreview(file);\r\n }\r\n });\r\n \r\n this.dispatchChange();\r\n }\r\n\r\n isValidFile(file) {\r\n const accept = this.input.getAttribute('accept');\r\n if (accept && accept !== '') {\r\n const types = accept.split(',').map(t => t.trim());\r\n const fileType = file.type;\r\n const fileName = file.name.toLowerCase();\r\n \r\n const isValidType = types.some(type => {\r\n if (type.startsWith('.')) {\r\n return fileName.endsWith(type);\r\n } else if (type.includes('/')) {\r\n if (type.endsWith('/*')) {\r\n return fileType.startsWith(type.replace('/*', ''));\r\n }\r\n return fileType === type;\r\n }\r\n return true;\r\n });\r\n \r\n if (!isValidType) {\r\n this.showError(`File type not allowed: ${file.type}`);\r\n return false;\r\n }\r\n }\r\n \r\n if (this.maxSize > 0 && file.size > this.maxSize) {\r\n this.showError(`File size exceeds ${this.formatSize(this.maxSize)}`);\r\n return false;\r\n }\r\n \r\n return true;\r\n }\r\n\r\n renderFileItem(file) {\r\n const item = document.createElement('div');\r\n item.className = 'ds-fileupload__item';\r\n item.dataset.filename = file.name;\r\n \r\n const fileIcon = this.getFileIcon(file.type);\r\n \r\n item.innerHTML = `\r\n <div class=\"ds-fileupload__icon\" style=\"width: 24px; height: 24px; border-radius: 4px;\">\r\n ${fileIcon}\r\n </div>\r\n <span class=\"ds-fileupload__filename\">${this.truncateFilename(file.name)}</span>\r\n <span class=\"ds-fileupload__size\">${this.formatSize(file.size)}</span>\r\n <button class=\"ds-fileupload__remove\" type=\"button\" aria-label=\"Remove file\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M18 6L6 18\"/>\r\n <path d=\"M6 6l12 12\"/>\r\n </svg>\r\n </button>\r\n `;\r\n \r\n const removeBtn = item.querySelector('.ds-fileupload__remove');\r\n const removeHandler = () => {\r\n this.removeFile(file, item);\r\n };\r\n removeBtn.addEventListener('click', removeHandler);\r\n \r\n this._listeners.push({ el: removeBtn, event: 'click', handler: removeHandler });\r\n \r\n if (!this.list) {\r\n this.list = document.createElement('div');\r\n this.list.className = 'ds-fileupload__list';\r\n this.element.appendChild(this.list);\r\n }\r\n \r\n this.list.appendChild(item);\r\n }\r\n\r\n getFileIcon(type) {\r\n if (type.startsWith('image/')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><polyline points=\"21 15 16 10 5 21\"/></svg>';\r\n }\r\n if (type.startsWith('video/')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polygon points=\"23 7 16 12 23 17 23 7\"/><rect x=\"1\" y=\"5\" width=\"15\" height=\"14\" rx=\"2\" ry=\"2\"/></svg>';\r\n }\r\n if (type.startsWith('audio/')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\"/><path d=\"M19.07 4.93a10 10 0 0 1 0 14.14M15.54 8.46a5 5 0 0 1 0 7.07\"/></svg>';\r\n }\r\n if (type.includes('pdf')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"/><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"/><polyline points=\"10 9 9 9 8 9\"/></svg>';\r\n }\r\n if (type.includes('document') || type.includes('text')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"/><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"/><polyline points=\"10 9 9 9 8 9\"/></svg>';\r\n }\r\n if (type.includes('zip') || type.includes('archive')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"/><path d=\"M16 11V7a4 4 0 0 0-8 0v4\"/><polyline points=\"10 14 8 16 6 14\"/></svg>';\r\n }\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/></svg>';\r\n }\r\n\r\n truncateFilename(name, maxLength = 20) {\r\n if (name.length <= maxLength) return name;\r\n const extension = name.substring(name.lastIndexOf('.'));\r\n const nameWithoutExt = name.substring(0, name.lastIndexOf('.'));\r\n const truncated = nameWithoutExt.substring(0, maxLength - extension.length - 3) + '...';\r\n return truncated + extension;\r\n }\r\n\r\n formatSize(bytes) {\r\n if (bytes === 0) return '0 B';\r\n const k = 1024;\r\n const sizes = ['B', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];\r\n }\r\n\r\n removeFile(file, itemElement) {\r\n this.files = this.files.filter(f => f !== file);\r\n if (itemElement) {\r\n itemElement.remove();\r\n }\r\n if (this.files.length === 0 && this.list) {\r\n this.list.remove();\r\n this.list = null;\r\n }\r\n this.dispatchChange();\r\n }\r\n\r\n clearFiles() {\r\n this.files = [];\r\n if (this.list) {\r\n this.list.remove();\r\n this.list = null;\r\n }\r\n if (this.preview) {\r\n this.preview.innerHTML = '';\r\n }\r\n this.clearError();\r\n this.dispatchChange();\r\n }\r\n\r\n showError(message) {\r\n this.clearError();\r\n this.dropzone.classList.add('is-error');\r\n \r\n const errorElement = document.createElement('div');\r\n errorElement.className = 'ds-fileupload__error';\r\n errorElement.textContent = message;\r\n errorElement.setAttribute('role', 'alert');\r\n errorElement.setAttribute('aria-live', 'polite');\r\n this.dropzone.appendChild(errorElement);\r\n \r\n setTimeout(() => {\r\n this.clearError();\r\n }, 5000);\r\n }\r\n\r\n clearError() {\r\n this.dropzone.classList.remove('is-error');\r\n const errorElement = this.dropzone.querySelector('.ds-fileupload__error');\r\n if (errorElement) {\r\n errorElement.remove();\r\n }\r\n }\r\n\r\n showPreview(file) {\r\n if (!file.type.startsWith('image/')) return;\r\n \r\n if (!this.preview) {\r\n this.preview = document.createElement('div');\r\n this.preview.className = 'ds-fileupload__preview';\r\n this.element.insertBefore(this.preview, this.list || null);\r\n }\r\n \r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n const previewItem = document.createElement('div');\r\n previewItem.className = 'ds-fileupload__preview-item';\r\n previewItem.innerHTML = `\r\n <img src=\"${e.target.result}\" alt=\"${file.name}\">\r\n <button class=\"ds-fileupload__preview-remove\" type=\"button\" aria-label=\"Remove preview\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M18 6L6 18\"/>\r\n <path d=\"M6 6l12 12\"/>\r\n </svg>\r\n </button>\r\n `;\r\n \r\n const previewRemoveBtn = previewItem.querySelector('.ds-fileupload__preview-remove');\r\n const previewRemoveHandler = () => {\r\n this.removeFile(file, this.list?.querySelector(`[data-filename=\"${file.name}\"]`));\r\n previewItem.remove();\r\n if (this.preview && this.preview.children.length === 0) {\r\n this.preview.remove();\r\n this.preview = null;\r\n }\r\n };\r\n previewRemoveBtn.addEventListener('click', previewRemoveHandler);\r\n this._listeners.push({ el: previewRemoveBtn, event: 'click', handler: previewRemoveHandler });\r\n \r\n this.preview.appendChild(previewItem);\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n\r\n updateProgress(percent) {\r\n if (!this.progress) {\r\n this.progress = document.createElement('div');\r\n this.progress.className = 'ds-fileupload__progress';\r\n this.element.insertBefore(this.progress, this.list || null);\r\n }\r\n \r\n this.progress.style.display = 'block';\r\n \r\n const bar = this.progress.querySelector('.ds-fileupload__progress-bar') || document.createElement('div');\r\n bar.className = 'ds-fileupload__progress-bar';\r\n bar.style.width = `${percent}%`;\r\n \r\n if (!this.progress.querySelector('.ds-fileupload__progress-bar')) {\r\n this.progress.appendChild(bar);\r\n }\r\n \r\n if (percent >= 100) {\r\n setTimeout(() => {\r\n if (this.progress) {\r\n this.progress.remove();\r\n this.progress = null;\r\n }\r\n }, 500);\r\n }\r\n }\r\n\r\n simulateUpload(file) {\r\n this.updateProgress(0);\r\n const totalChunks = 100;\r\n let currentChunk = 0;\r\n const chunkSize = Math.max(1, Math.floor(file.size / totalChunks));\r\n \r\n const uploadInterval = setInterval(() => {\r\n currentChunk++;\r\n const percent = Math.min(100, Math.floor((currentChunk / totalChunks) * 100));\r\n this.updateProgress(percent);\r\n \r\n if (currentChunk >= totalChunks) {\r\n clearInterval(uploadInterval);\r\n this.updateProgress(100);\r\n }\r\n }, Math.max(50, Math.floor(5000 / totalChunks)));\r\n \r\n return uploadInterval;\r\n }\r\n\r\n getFiles() {\r\n return [...this.files];\r\n }\r\n\r\n dispatchChange() {\r\n this.element.dispatchEvent(new CustomEvent('kupola:fileupload-change', {\r\n detail: {\r\n files: this.getFiles(),\r\n count: this.files.length\r\n }\r\n }));\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.files = [];\r\n this.dropzone = null;\r\n this.input = null;\r\n this.list = null;\r\n this.progress = null;\r\n this.preview = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initFileUpload(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const instance = new FileUpload(element);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupFileUpload(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initFileUploads() {\r\n document.querySelectorAll('.ds-fileupload').forEach(el => {\r\n initFileUpload(el);\r\n });\r\n}\r\n\r\nexport { FileUpload, initFileUploads, initFileUpload, cleanupFileUpload };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.FileUpload = FileUpload;\r\n window.initFileUpload = initFileUpload;\r\n window.cleanupFileUpload = cleanupFileUpload;\r\n window.initFileUploads = initFileUploads;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('fileupload', initFileUpload, cleanupFileUpload);\r\n }\r\n}","class Collapse {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.headers = [];\r\n this._listeners = [];\r\n \r\n // Options\r\n this.accordion = options.accordion || element.hasAttribute('data-collapse-accordion');\r\n this.animationDuration = options.animationDuration || parseInt(element.getAttribute('data-collapse-duration')) || 300;\r\n this.disabledItems = options.disabledItems || [];\r\n this.defaultExpanded = options.defaultExpanded || []; // indices or 'all'\r\n \r\n this._init();\r\n }\r\n\r\n _init() {\r\n const headers = this.element.querySelectorAll('.ds-collapse__header');\r\n \r\n headers.forEach((header, index) => {\r\n const item = header.closest('.ds-collapse__item');\r\n const content = header.nextElementSibling;\r\n \r\n if (!item || !content || !content.classList.contains('ds-collapse__content')) return;\r\n \r\n const isDisabled = item.hasAttribute('data-collapse-disabled') || this.disabledItems.includes(index);\r\n if (isDisabled) {\r\n item.classList.add('is-disabled');\r\n }\r\n \r\n // Handle default expanded\r\n let isActive = item.classList.contains('is-active');\r\n if (this.defaultExpanded === 'all') {\r\n isActive = true;\r\n } else if (Array.isArray(this.defaultExpanded) && this.defaultExpanded.includes(index)) {\r\n isActive = true;\r\n }\r\n \r\n if (isActive) {\r\n item.classList.add('is-active');\r\n content.style.height = content.scrollHeight + 'px';\r\n content.style.overflow = 'hidden';\r\n // After animation, allow overflow\r\n setTimeout(() => {\r\n if (item.classList.contains('is-active')) {\r\n content.style.height = 'auto';\r\n content.style.overflow = 'visible';\r\n }\r\n }, this.animationDuration);\r\n } else {\r\n item.classList.remove('is-active');\r\n content.style.height = '0';\r\n content.style.overflow = 'hidden';\r\n }\r\n \r\n const clickHandler = () => {\r\n if (isDisabled) return;\r\n const isExpanded = item.classList.contains('is-active');\r\n \r\n if (this.accordion && !isExpanded) {\r\n // Close all other items first\r\n this.headers.forEach((h, i) => {\r\n if (i !== index && h.item.classList.contains('is-active')) {\r\n this._collapseItem(h);\r\n }\r\n });\r\n }\r\n \r\n if (isExpanded) {\r\n this._collapseItem({ item, content });\r\n } else {\r\n this._expandItem({ item, content });\r\n }\r\n \r\n // Dispatch event\r\n this.element.dispatchEvent(new CustomEvent('kupola:collapse-toggle', {\r\n detail: { index, expanded: !isExpanded, item },\r\n bubbles: true\r\n }));\r\n };\r\n \r\n header.addEventListener('click', clickHandler);\r\n this.headers.push({ header, item, content, clickHandler, isDisabled });\r\n this._listeners.push({ el: header, event: 'click', handler: clickHandler });\r\n });\r\n }\r\n\r\n _expandItem(headerInfo) {\r\n const { item, content } = headerInfo;\r\n content.style.overflow = 'hidden';\r\n content.style.height = '0';\r\n \r\n // Force reflow\r\n content.offsetHeight;\r\n \r\n content.style.transition = `height ${this.animationDuration}ms ease`;\r\n content.style.height = content.scrollHeight + 'px';\r\n item.classList.add('is-active');\r\n \r\n const transitionHandler = () => {\r\n content.removeEventListener('transitionend', transitionHandler);\r\n if (item.classList.contains('is-active')) {\r\n content.style.height = 'auto';\r\n content.style.overflow = 'visible';\r\n }\r\n content.style.transition = '';\r\n };\r\n content.addEventListener('transitionend', transitionHandler);\r\n this._listeners.push({ el: content, event: 'transitionend', handler: transitionHandler });\r\n }\r\n\r\n _collapseItem(headerInfo) {\r\n const { item, content } = headerInfo;\r\n content.style.overflow = 'hidden';\r\n content.style.height = content.scrollHeight + 'px';\r\n \r\n // Force reflow\r\n content.offsetHeight;\r\n \r\n content.style.transition = `height ${this.animationDuration}ms ease`;\r\n content.style.height = '0';\r\n item.classList.remove('is-active');\r\n \r\n const transitionHandler = () => {\r\n content.removeEventListener('transitionend', transitionHandler);\r\n content.style.transition = '';\r\n };\r\n content.addEventListener('transitionend', transitionHandler);\r\n this._listeners.push({ el: content, event: 'transitionend', handler: transitionHandler });\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.headers = null;\r\n this.element = null;\r\n }\r\n\r\n toggle(index) {\r\n const headerInfo = this.headers[index];\r\n if (headerInfo && !headerInfo.isDisabled) {\r\n headerInfo.clickHandler();\r\n }\r\n }\r\n\r\n expand(index) {\r\n const headerInfo = this.headers[index];\r\n if (headerInfo && !headerInfo.item.classList.contains('is-active') && !headerInfo.isDisabled) {\r\n if (this.accordion) {\r\n this.headers.forEach((h, i) => {\r\n if (i !== index && h.item.classList.contains('is-active')) {\r\n this._collapseItem(h);\r\n }\r\n });\r\n }\r\n this._expandItem(headerInfo);\r\n }\r\n }\r\n\r\n collapse(index) {\r\n const headerInfo = this.headers[index];\r\n if (headerInfo && headerInfo.item.classList.contains('is-active')) {\r\n this._collapseItem(headerInfo);\r\n }\r\n }\r\n\r\n expandAll() {\r\n if (this.accordion) return; // Can't expand all in accordion mode\r\n this.headers.forEach((headerInfo, index) => {\r\n if (!headerInfo.item.classList.contains('is-active') && !headerInfo.isDisabled) {\r\n this._expandItem(headerInfo);\r\n }\r\n });\r\n }\r\n\r\n collapseAll() {\r\n this.headers.forEach((headerInfo) => {\r\n if (headerInfo.item.classList.contains('is-active')) {\r\n this._collapseItem(headerInfo);\r\n }\r\n });\r\n }\r\n\r\n getExpandedIndices() {\r\n return this.headers\r\n .map((h, i) => h.item.classList.contains('is-active') ? i : -1)\r\n .filter(i => i >= 0);\r\n }\r\n\r\n disable(index) {\r\n if (this.headers[index]) {\r\n this.headers[index].isDisabled = true;\r\n this.headers[index].item.classList.add('is-disabled');\r\n }\r\n }\r\n\r\n enable(index) {\r\n if (this.headers[index]) {\r\n this.headers[index].isDisabled = false;\r\n this.headers[index].item.classList.remove('is-disabled');\r\n }\r\n }\r\n}\r\n\r\nfunction initCollapse(element, options) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const collapse = new Collapse(element, options);\r\n element.__kupolaInstance = collapse;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupCollapse(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const collapse = element.__kupolaInstance;\r\n collapse.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initCollapses() {\r\n document.querySelectorAll('.ds-collapse').forEach(collapse => {\r\n initCollapse(collapse);\r\n });\r\n}\r\n\r\nexport { Collapse, initCollapses, initCollapse, cleanupCollapse };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Collapse = Collapse;\r\n window.initCollapse = initCollapse;\r\n window.cleanupCollapse = cleanupCollapse;\r\n window.initCollapses = initCollapses;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('collapse', initCollapse, cleanupCollapse);\r\n }\r\n}\r\n","class ColorPicker {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.trigger = element.querySelector('.ds-color-picker__trigger');\r\n this.panel = element.querySelector('.ds-color-picker__panel');\r\n this.valueSpan = element.querySelector('.ds-color-picker__value');\r\n this.customInput = element.querySelector('.ds-color-picker__input');\r\n this.scope = `colorpicker-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n this.options = options;\r\n this.value = options.value || '#007bff';\r\n this.showAlpha = options.showAlpha !== false;\r\n this.mode = options.mode || 'hex'; // hex | rgb | hsl\r\n this.previousColors = options.previousColors || this._getStoredColors();\r\n this.previousColorsLimit = options.previousColorsLimit || 12;\r\n \r\n this._triggerClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._colorClickHandler = null;\r\n this._inputInputHandler = null;\r\n this._alphaChangeHandler = null;\r\n this._modeChangeHandler = null;\r\n this._hueChangeHandler = null;\r\n this._saturationChangeHandler = null;\r\n this._valueChangeHandler = null;\r\n \r\n this.hue = 210;\r\n this.saturation = 100;\r\n this.brightness = 50;\r\n this.alpha = 100;\r\n \r\n this._colorStringToHSB(this.value);\r\n }\r\n\r\n _getStoredColors() {\r\n try {\r\n const stored = localStorage.getItem('kupola-color-picker-previous');\r\n return stored ? JSON.parse(stored) : [];\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n _storeColors() {\r\n try {\r\n localStorage.setItem('kupola-color-picker-previous', JSON.stringify(this.previousColors));\r\n } catch {}\r\n }\r\n\r\n _addPreviousColor(color) {\r\n const index = this.previousColors.indexOf(color);\r\n if (index !== -1) {\r\n this.previousColors.splice(index, 1);\r\n }\r\n this.previousColors.unshift(color);\r\n this.previousColors = this.previousColors.slice(0, this.previousColorsLimit);\r\n this._storeColors();\r\n this._renderPreviousColors();\r\n }\r\n\r\n _colorStringToHSB(color) {\r\n const hex = color.replace(/^#/, '');\r\n const r = parseInt(hex.substring(0, 2), 16) / 255;\r\n const g = parseInt(hex.substring(2, 4), 16) / 255;\r\n const b = parseInt(hex.substring(4, 6), 16) / 255;\r\n const a = hex.length === 8 ? parseInt(hex.substring(6, 8), 16) / 255 : 1;\r\n\r\n const max = Math.max(r, g, b);\r\n const min = Math.min(r, g, b);\r\n let h = 0, s = 0, v = max;\r\n\r\n const d = max - min;\r\n s = max === 0 ? 0 : d / max;\r\n\r\n if (max !== min) {\r\n switch (max) {\r\n case r: h = ((g - b) / d + (g < b ? 6 : 0)) / 6; break;\r\n case g: h = ((b - r) / d + 2) / 6; break;\r\n case b: h = ((r - g) / d + 4) / 6; break;\r\n }\r\n }\r\n\r\n this.hue = Math.round(h * 360);\r\n this.saturation = Math.round(s * 100);\r\n this.brightness = Math.round(v * 100);\r\n this.alpha = Math.round(a * 100);\r\n }\r\n\r\n _HSBToColorString(h, s, b, a = 1) {\r\n s /= 100;\r\n b /= 100;\r\n a /= 100;\r\n\r\n const k = n => (n + h / 60) % 6;\r\n const f = n => b * (1 - s * Math.max(0, Math.min(k(n), 4 - k(n), 1)));\r\n\r\n const r = Math.round(f(5) * 255);\r\n const g = Math.round(f(3) * 255);\r\n const bVal = Math.round(f(1) * 255);\r\n\r\n if (this.mode === 'rgb') {\r\n if (a < 1) {\r\n return `rgba(${r}, ${g}, ${bVal}, ${a.toFixed(2)})`;\r\n }\r\n return `rgb(${r}, ${g}, ${bVal})`;\r\n }\r\n\r\n if (this.mode === 'hsl') {\r\n if (a < 1) {\r\n return `hsla(${h}, ${Math.round(s * 100)}%, ${Math.round(b * 100)}%, ${a.toFixed(2)})`;\r\n }\r\n return `hsl(${h}, ${Math.round(s * 100)}%, ${Math.round(b * 100)}%)`;\r\n }\r\n\r\n const hex = `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${bVal.toString(16).padStart(2, '0')}`;\r\n if (a < 1) {\r\n return hex + Math.round(a * 255).toString(16).padStart(2, '0');\r\n }\r\n return hex;\r\n }\r\n\r\n _renderPreviousColors() {\r\n const container = this.panel.querySelector('.ds-color-picker__previous');\r\n if (!container) return;\r\n \r\n container.innerHTML = '';\r\n this.previousColors.forEach(color => {\r\n const btn = document.createElement('button');\r\n btn.className = 'ds-color-picker__color';\r\n btn.style.backgroundColor = color;\r\n btn.setAttribute('data-color', color);\r\n btn.addEventListener('click', this._colorClickHandler);\r\n container.appendChild(btn);\r\n });\r\n }\r\n\r\n _renderColorPanel() {\r\n const hueSlider = this.panel.querySelector('.ds-color-picker__hue');\r\n const svArea = this.panel.querySelector('.ds-color-picker__sv');\r\n const alphaSlider = this.panel.querySelector('.ds-color-picker__alpha');\r\n \r\n if (hueSlider) {\r\n hueSlider.value = this.hue;\r\n hueSlider.style.background = `linear-gradient(to right, hsl(0,100%,50%), hsl(60,100%,50%), hsl(120,100%,50%), hsl(180,100%,50%), hsl(240,100%,50%), hsl(300,100%,50%), hsl(360,100%,50%))`;\r\n }\r\n \r\n if (svArea) {\r\n svArea.style.background = `hsl(${this.hue}, 100%, 50%)`;\r\n }\r\n \r\n if (alphaSlider && this.showAlpha) {\r\n alphaSlider.value = this.alpha;\r\n alphaSlider.style.background = `linear-gradient(to right, transparent, ${this._HSBToColorString(this.hue, this.saturation, this.brightness, 1)})`;\r\n }\r\n }\r\n\r\n init() {\r\n if (!this.trigger || !this.panel) return;\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n this._triggerClickHandler = (e) => {\r\n e.stopPropagation();\r\n this.togglePanel();\r\n };\r\n\r\n this._colorClickHandler = (e) => {\r\n const colorBtn = e.currentTarget;\r\n const color = colorBtn.getAttribute('data-color');\r\n this.updateColor(color);\r\n this.hidePanel();\r\n };\r\n\r\n this._inputInputHandler = (e) => {\r\n const color = e.target.value;\r\n if (this._isValidColor(color)) {\r\n this.updateColor(color);\r\n }\r\n };\r\n\r\n this._alphaChangeHandler = (e) => {\r\n this.alpha = parseInt(e.target.value);\r\n this._updateFromHSB();\r\n };\r\n\r\n this._modeChangeHandler = (e) => {\r\n const btn = e.currentTarget;\r\n this.mode = btn.getAttribute('data-mode');\r\n this.panel.querySelectorAll('.ds-color-picker__mode-btn').forEach(b => b.classList.remove('is-active'));\r\n btn.classList.add('is-active');\r\n this._updateDisplay();\r\n };\r\n\r\n this._hueChangeHandler = (e) => {\r\n this.hue = parseInt(e.target.value);\r\n this._renderColorPanel();\r\n this._updateFromHSB();\r\n };\r\n\r\n this._saturationChangeHandler = (e) => {\r\n const rect = e.currentTarget.getBoundingClientRect();\r\n const x = e.clientX - rect.left;\r\n const y = e.clientY - rect.top;\r\n this.saturation = Math.round((x / rect.width) * 100);\r\n this.brightness = Math.round((1 - y / rect.height) * 100);\r\n this._updateFromHSB();\r\n };\r\n\r\n this._documentClickHandler = (e) => {\r\n if (!this.element.contains(e.target)) {\r\n this.hidePanel();\r\n }\r\n };\r\n\r\n this.trigger.addEventListener('click', this._triggerClickHandler);\r\n\r\n this.panel.querySelectorAll('.ds-color-picker__color').forEach(colorBtn => {\r\n colorBtn.addEventListener('click', this._colorClickHandler);\r\n colorBtn._colorPickerColorHandler = this._colorClickHandler;\r\n });\r\n\r\n if (this.customInput) {\r\n this.customInput.addEventListener('input', this._inputInputHandler);\r\n this.customInput._colorPickerInputHandler = this._inputInputHandler;\r\n }\r\n\r\n const hueSlider = this.panel.querySelector('.ds-color-picker__hue');\r\n if (hueSlider) {\r\n hueSlider.addEventListener('input', this._hueChangeHandler);\r\n }\r\n\r\n const svArea = this.panel.querySelector('.ds-color-picker__sv');\r\n if (svArea) {\r\n svArea.addEventListener('click', this._saturationChangeHandler);\r\n svArea.addEventListener('mousemove', (e) => {\r\n if (e.buttons === 1) {\r\n this._saturationChangeHandler(e);\r\n }\r\n });\r\n }\r\n\r\n const alphaSlider = this.panel.querySelector('.ds-color-picker__alpha');\r\n if (alphaSlider && this.showAlpha) {\r\n alphaSlider.addEventListener('input', this._alphaChangeHandler);\r\n }\r\n\r\n this.panel.querySelectorAll('.ds-color-picker__mode-btn').forEach(btn => {\r\n btn.addEventListener('click', this._modeChangeHandler);\r\n if (btn.getAttribute('data-mode') === this.mode) {\r\n btn.classList.add('is-active');\r\n }\r\n });\r\n\r\n if (window.globalEvents) {\r\n this._documentClickListener = window.globalEvents.on(document, 'click', this._documentClickHandler, { scope: this.scope });\r\n } else {\r\n document.addEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n this._renderPreviousColors();\r\n this._renderColorPanel();\r\n this._updateDisplay();\r\n\r\n this.element.__kupolaInitialized = true;\r\n }\r\n\r\n _isValidColor(color) {\r\n const s = new Option().style;\r\n s.color = color;\r\n return s.color !== '';\r\n }\r\n\r\n _updateFromHSB() {\r\n const color = this._HSBToColorString(this.hue, this.saturation, this.brightness, this.alpha);\r\n this.value = color;\r\n this._updateDisplay();\r\n this._addPreviousColor(color);\r\n this.element.dispatchEvent(new CustomEvent('kupola:color-picker-change', { \r\n detail: { \r\n color: this.value,\r\n hsb: { h: this.hue, s: this.saturation, b: this.brightness, a: this.alpha },\r\n mode: this.mode\r\n } \r\n }));\r\n }\r\n\r\n _updateDisplay() {\r\n this.trigger.style.backgroundColor = this.value;\r\n if (this.valueSpan) {\r\n this.valueSpan.textContent = this.value.toUpperCase();\r\n }\r\n if (this.customInput) {\r\n this.customInput.value = this.value;\r\n }\r\n this._renderColorPanel();\r\n }\r\n\r\n togglePanel() {\r\n this.panel.classList.toggle('is-visible');\r\n }\r\n\r\n hidePanel() {\r\n this.panel.classList.remove('is-visible');\r\n }\r\n\r\n showPanel() {\r\n this.panel.classList.add('is-visible');\r\n }\r\n\r\n updateColor(color) {\r\n if (!this._isValidColor(color)) return;\r\n \r\n this.value = color;\r\n this._colorStringToHSB(color);\r\n this._updateDisplay();\r\n this._addPreviousColor(color);\r\n \r\n this.element.dispatchEvent(new CustomEvent('kupola:color-picker-change', { \r\n detail: { \r\n color: this.value,\r\n hsb: { h: this.hue, s: this.saturation, b: this.brightness, a: this.alpha },\r\n mode: this.mode\r\n } \r\n }));\r\n }\r\n\r\n setValue(color) {\r\n this.updateColor(color);\r\n }\r\n\r\n getValue() {\r\n return this.value;\r\n }\r\n\r\n setMode(mode) {\r\n if (mode === 'hex' || mode === 'rgb' || mode === 'hsl') {\r\n this.mode = mode;\r\n this._updateDisplay();\r\n }\r\n }\r\n\r\n getMode() {\r\n return this.mode;\r\n }\r\n\r\n setAlpha(alpha) {\r\n this.alpha = Math.max(0, Math.min(100, alpha));\r\n this._updateFromHSB();\r\n }\r\n\r\n getAlpha() {\r\n return this.alpha;\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n if (this.trigger && this._triggerClickHandler) {\r\n this.trigger.removeEventListener('click', this._triggerClickHandler);\r\n }\r\n\r\n if (this.panel) {\r\n this.panel.querySelectorAll('.ds-color-picker__color').forEach(colorBtn => {\r\n if (colorBtn._colorPickerColorHandler) {\r\n colorBtn.removeEventListener('click', colorBtn._colorPickerColorHandler);\r\n }\r\n });\r\n }\r\n\r\n if (this.customInput && this._inputInputHandler) {\r\n this.customInput.removeEventListener('input', this._inputInputHandler);\r\n }\r\n\r\n const hueSlider = this.panel?.querySelector('.ds-color-picker__hue');\r\n if (hueSlider && this._hueChangeHandler) {\r\n hueSlider.removeEventListener('input', this._hueChangeHandler);\r\n }\r\n\r\n const svArea = this.panel?.querySelector('.ds-color-picker__sv');\r\n if (svArea && this._saturationChangeHandler) {\r\n svArea.removeEventListener('click', this._saturationChangeHandler);\r\n svArea.removeEventListener('mousemove', this._saturationChangeHandler);\r\n }\r\n\r\n const alphaSlider = this.panel?.querySelector('.ds-color-picker__alpha');\r\n if (alphaSlider && this._alphaChangeHandler) {\r\n alphaSlider.removeEventListener('input', this._alphaChangeHandler);\r\n }\r\n\r\n this.panel?.querySelectorAll('.ds-color-picker__mode-btn').forEach(btn => {\r\n btn.removeEventListener('click', this._modeChangeHandler);\r\n });\r\n\r\n if (this._documentClickListener && this._documentClickListener.unsubscribe) {\r\n this._documentClickListener.unsubscribe();\r\n } else if (this._documentClickHandler) {\r\n document.removeEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._triggerClickHandler = null;\r\n this._colorClickHandler = null;\r\n this._inputInputHandler = null;\r\n this._alphaChangeHandler = null;\r\n this._modeChangeHandler = null;\r\n this._hueChangeHandler = null;\r\n this._saturationChangeHandler = null;\r\n this._valueChangeHandler = null;\r\n \r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initColorPicker(element, options) {\r\n const picker = new ColorPicker(element, options);\r\n picker.init();\r\n element._kupolaColorPicker = picker;\r\n}\r\n\r\nfunction initColorPickers(root = document) {\r\n root.querySelectorAll('.ds-color-picker').forEach(picker => {\r\n initColorPicker(picker);\r\n });\r\n}\r\n\r\nfunction cleanupColorPicker(picker) {\r\n if (picker._kupolaColorPicker) {\r\n picker._kupolaColorPicker.destroy();\r\n picker._kupolaColorPicker = null;\r\n }\r\n}\r\n\r\nfunction cleanupAllColorPickers() {\r\n document.querySelectorAll('.ds-color-picker').forEach(picker => {\r\n cleanupColorPicker(picker);\r\n });\r\n}\r\n\r\nexport { ColorPicker, initColorPicker, initColorPickers, cleanupColorPicker, cleanupAllColorPickers };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.ColorPicker = ColorPicker;\r\n window.initColorPicker = initColorPicker;\r\n window.initColorPickers = initColorPickers;\r\n window.cleanupColorPicker = cleanupColorPicker;\r\n window.cleanupAllColorPickers = cleanupAllColorPickers;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('color-picker', initColorPicker, cleanupColorPicker);\r\n }\r\n}","class Calendar {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.titleEl = element.querySelector('.ds-calendar__title');\r\n this.daysEl = element.querySelector('.ds-calendar__days');\r\n this.prevBtn = element.querySelector('.ds-calendar__nav--prev');\r\n this.nextBtn = element.querySelector('.ds-calendar__nav--next');\r\n this.todayBtn = element.querySelector('.ds-calendar__nav--today');\r\n this._listeners = [];\r\n \r\n if (!this.titleEl || !this.daysEl) {\r\n throw new Error('Calendar: Missing required elements');\r\n }\r\n\r\n this.currentDate = new Date();\r\n this.selectedDate = options.selectedDate ? new Date(options.selectedDate) : null;\r\n this.rangeStart = options.rangeStart ? new Date(options.rangeStart) : null;\r\n this.rangeEnd = options.rangeEnd ? new Date(options.rangeEnd) : null;\r\n this.isRangeMode = options.rangeMode || element.hasAttribute('data-calendar-range');\r\n this.viewMode = options.viewMode || element.getAttribute('data-calendar-view') || 'month'; // month | week\r\n this.events = options.events || [];\r\n this.i18n = options.i18n || {\r\n months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\r\n shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\r\n weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\r\n shortWeekdays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\r\n today: 'Today',\r\n selectRangeStart: 'Select start date',\r\n selectRangeEnd: 'Select end date'\r\n };\r\n this.onSelect = options.onSelect || null;\r\n this.onRangeSelect = options.onRangeSelect || null;\r\n this.onChange = options.onChange || null;\r\n this.onEventClick = options.onEventClick || null;\r\n\r\n this._init();\r\n }\r\n\r\n _init() {\r\n this.render();\r\n\r\n const prevHandler = () => {\r\n if (this.viewMode === 'week') {\r\n this.currentDate.setDate(this.currentDate.getDate() - 7);\r\n } else {\r\n this.currentDate.setMonth(this.currentDate.getMonth() - 1);\r\n }\r\n this.render();\r\n this._emitChange();\r\n };\r\n\r\n const nextHandler = () => {\r\n if (this.viewMode === 'week') {\r\n this.currentDate.setDate(this.currentDate.getDate() + 7);\r\n } else {\r\n this.currentDate.setMonth(this.currentDate.getMonth() + 1);\r\n }\r\n this.render();\r\n this._emitChange();\r\n };\r\n\r\n const todayHandler = () => {\r\n this.currentDate = new Date();\r\n this.render();\r\n this._emitChange();\r\n };\r\n\r\n if (this.prevBtn) {\r\n this.prevBtn.addEventListener('click', prevHandler);\r\n this._listeners.push({ el: this.prevBtn, event: 'click', handler: prevHandler });\r\n }\r\n\r\n if (this.nextBtn) {\r\n this.nextBtn.addEventListener('click', nextHandler);\r\n this._listeners.push({ el: this.nextBtn, event: 'click', handler: nextHandler });\r\n }\r\n\r\n if (this.todayBtn) {\r\n this.todayBtn.addEventListener('click', todayHandler);\r\n this._listeners.push({ el: this.todayBtn, event: 'click', handler: todayHandler });\r\n }\r\n }\r\n\r\n _emitChange() {\r\n const data = {\r\n date: this.currentDate,\r\n selectedDate: this.selectedDate,\r\n rangeStart: this.rangeStart,\r\n rangeEnd: this.rangeEnd,\r\n viewMode: this.viewMode\r\n };\r\n if (this.onChange) this.onChange(data);\r\n this.element.dispatchEvent(new CustomEvent('kupola:calendar-change', { detail: data, bubbles: true }));\r\n }\r\n\r\n _formatDate(date) {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n _isSameDay(date1, date2) {\r\n if (!date1 || !date2) return false;\r\n return this._formatDate(date1) === this._formatDate(date2);\r\n }\r\n\r\n _isDateInRange(date) {\r\n if (!this.rangeStart || !this.rangeEnd) return false;\r\n const dateStr = this._formatDate(date);\r\n const startStr = this._formatDate(this.rangeStart);\r\n const endStr = this._formatDate(this.rangeEnd);\r\n return dateStr >= startStr && dateStr <= endStr;\r\n }\r\n\r\n _isRangeStart(date) {\r\n return this._isSameDay(date, this.rangeStart);\r\n }\r\n\r\n _isRangeEnd(date) {\r\n return this._isSameDay(date, this.rangeEnd);\r\n }\r\n\r\n _getEventsForDate(date) {\r\n const dateStr = this._formatDate(date);\r\n return this.events.filter(e => {\r\n const eventStart = e.date || e.start;\r\n const eventEnd = e.end;\r\n if (!eventStart) return false;\r\n const startStr = typeof eventStart === 'string' ? eventStart : this._formatDate(eventStart);\r\n if (!eventEnd) return startStr === dateStr;\r\n const endStr = typeof eventEnd === 'string' ? eventEnd : this._formatDate(eventEnd);\r\n return dateStr >= startStr && dateStr <= endStr;\r\n });\r\n }\r\n\r\n render() {\r\n const year = this.currentDate.getFullYear();\r\n const month = this.currentDate.getMonth();\r\n \r\n if (this.viewMode === 'week') {\r\n this._renderWeekView(year, month);\r\n } else {\r\n this._renderMonthView(year, month);\r\n }\r\n }\r\n\r\n _renderMonthView(year, month) {\r\n this.titleEl.textContent = `${year} ${this.i18n.months[month]}`;\r\n \r\n const firstDay = new Date(year, month, 1).getDay();\r\n const daysInMonth = new Date(year, month + 1, 0).getDate();\r\n \r\n this.daysEl.innerHTML = '';\r\n \r\n for (let i = 0; i < firstDay; i++) {\r\n const emptyDay = document.createElement('span');\r\n emptyDay.className = 'ds-calendar__day ds-calendar__day--empty';\r\n this.daysEl.appendChild(emptyDay);\r\n }\r\n \r\n const today = new Date();\r\n const todayStr = this._formatDate(today);\r\n \r\n for (let day = 1; day <= daysInMonth; day++) {\r\n const currentDate = new Date(year, month, day);\r\n const dayEl = document.createElement('button');\r\n dayEl.className = 'ds-calendar__day';\r\n dayEl.textContent = day;\r\n \r\n const dayStr = this._formatDate(currentDate);\r\n \r\n if (dayStr === todayStr) {\r\n dayEl.classList.add('is-today');\r\n }\r\n \r\n if (this._isSameDay(currentDate, this.selectedDate)) {\r\n dayEl.classList.add('is-selected');\r\n }\r\n \r\n if (this.isRangeMode) {\r\n if (this._isRangeStart(currentDate)) {\r\n dayEl.classList.add('is-range-start');\r\n }\r\n if (this._isRangeEnd(currentDate)) {\r\n dayEl.classList.add('is-range-end');\r\n }\r\n if (this._isDateInRange(currentDate)) {\r\n dayEl.classList.add('is-in-range');\r\n }\r\n }\r\n \r\n const dayEvents = this._getEventsForDate(currentDate);\r\n if (dayEvents.length > 0) {\r\n dayEl.classList.add('has-events');\r\n const eventDot = document.createElement('span');\r\n eventDot.className = 'ds-calendar__day-event';\r\n eventDot.style.backgroundColor = dayEvents[0].color || '#007bff';\r\n dayEl.appendChild(eventDot);\r\n }\r\n \r\n const clickHandler = () => {\r\n this.element.querySelectorAll('.ds-calendar__day').forEach(d => d.classList.remove('is-selected'));\r\n dayEl.classList.add('is-selected');\r\n \r\n if (this.isRangeMode) {\r\n if (!this.rangeStart || (this.rangeEnd && !this._isSameDay(currentDate, this.rangeEnd))) {\r\n this.rangeStart = currentDate;\r\n this.rangeEnd = null;\r\n } else if (this.rangeStart && !this.rangeEnd) {\r\n if (currentDate < this.rangeStart) {\r\n this.rangeEnd = this.rangeStart;\r\n this.rangeStart = currentDate;\r\n } else {\r\n this.rangeEnd = currentDate;\r\n }\r\n \r\n if (this.onRangeSelect) {\r\n this.onRangeSelect({ start: this.rangeStart, end: this.rangeEnd });\r\n }\r\n this.element.dispatchEvent(new CustomEvent('kupola:calendar-range-select', {\r\n detail: { start: this.rangeStart, end: this.rangeEnd },\r\n bubbles: true\r\n }));\r\n }\r\n } else {\r\n this.selectedDate = currentDate;\r\n if (this.onSelect) {\r\n this.onSelect({ date: currentDate, dateStr: dayStr });\r\n }\r\n this.element.dispatchEvent(new CustomEvent('kupola:calendar-select', {\r\n detail: { date: currentDate, dateStr: dayStr },\r\n bubbles: true\r\n }));\r\n }\r\n \r\n dayEvents.forEach(event => {\r\n if (this.onEventClick) {\r\n this.onEventClick(event, currentDate);\r\n }\r\n });\r\n \r\n this.render();\r\n };\r\n \r\n dayEl.addEventListener('click', clickHandler);\r\n this._listeners.push({ el: dayEl, event: 'click', handler: clickHandler });\r\n \r\n this.daysEl.appendChild(dayEl);\r\n }\r\n }\r\n\r\n _renderWeekView(year, month) {\r\n const dayOfWeek = this.currentDate.getDay();\r\n const monday = new Date(year, month, this.currentDate.getDate() - dayOfWeek + (dayOfWeek === 0 ? -6 : 1));\r\n \r\n const startDate = monday;\r\n const endDate = new Date(monday);\r\n endDate.setDate(monday.getDate() + 6);\r\n \r\n this.titleEl.textContent = `${this.i18n.shortMonths[startDate.getMonth()]} ${startDate.getDate()} - ${this.i18n.shortMonths[endDate.getMonth()]} ${endDate.getDate()} ${year}`;\r\n \r\n this.daysEl.innerHTML = '';\r\n \r\n const today = new Date();\r\n const todayStr = this._formatDate(today);\r\n \r\n for (let i = 0; i < 7; i++) {\r\n const currentDate = new Date(monday);\r\n currentDate.setDate(monday.getDate() + i);\r\n \r\n const dayEl = document.createElement('button');\r\n dayEl.className = 'ds-calendar__day ds-calendar__day--week';\r\n \r\n const dayHeader = document.createElement('span');\r\n dayHeader.className = 'ds-calendar__day-header';\r\n dayHeader.textContent = this.i18n.shortWeekdays[currentDate.getDay()];\r\n dayEl.appendChild(dayHeader);\r\n \r\n const dayNum = document.createElement('span');\r\n dayNum.className = 'ds-calendar__day-number';\r\n dayNum.textContent = currentDate.getDate();\r\n dayEl.appendChild(dayNum);\r\n \r\n const dayStr = this._formatDate(currentDate);\r\n \r\n if (dayStr === todayStr) {\r\n dayEl.classList.add('is-today');\r\n }\r\n \r\n if (this._isSameDay(currentDate, this.selectedDate)) {\r\n dayEl.classList.add('is-selected');\r\n }\r\n \r\n const dayEvents = this._getEventsForDate(currentDate);\r\n if (dayEvents.length > 0) {\r\n const eventsContainer = document.createElement('span');\r\n eventsContainer.className = 'ds-calendar__day-events';\r\n dayEvents.slice(0, 3).forEach(event => {\r\n const eventDot = document.createElement('span');\r\n eventDot.className = 'ds-calendar__day-event';\r\n eventDot.style.backgroundColor = event.color || '#007bff';\r\n eventsContainer.appendChild(eventDot);\r\n });\r\n dayEl.appendChild(eventsContainer);\r\n }\r\n \r\n const clickHandler = () => {\r\n this.element.querySelectorAll('.ds-calendar__day').forEach(d => d.classList.remove('is-selected'));\r\n dayEl.classList.add('is-selected');\r\n this.selectedDate = currentDate;\r\n \r\n if (this.onSelect) {\r\n this.onSelect({ date: currentDate, dateStr: dayStr });\r\n }\r\n this.element.dispatchEvent(new CustomEvent('kupola:calendar-select', {\r\n detail: { date: currentDate, dateStr: dayStr },\r\n bubbles: true\r\n }));\r\n \r\n this.render();\r\n };\r\n \r\n dayEl.addEventListener('click', clickHandler);\r\n this._listeners.push({ el: dayEl, event: 'click', handler: clickHandler });\r\n \r\n this.daysEl.appendChild(dayEl);\r\n }\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.titleEl = null;\r\n this.daysEl = null;\r\n this.prevBtn = null;\r\n this.nextBtn = null;\r\n this.todayBtn = null;\r\n this.element = null;\r\n }\r\n\r\n setDate(date) {\r\n this.currentDate = new Date(date);\r\n this.render();\r\n this._emitChange();\r\n }\r\n\r\n getDate() {\r\n return this.currentDate;\r\n }\r\n\r\n setSelectedDate(date) {\r\n this.selectedDate = date ? new Date(date) : null;\r\n this.render();\r\n }\r\n\r\n getSelectedDate() {\r\n return this.selectedDate;\r\n }\r\n\r\n setRange(start, end) {\r\n this.rangeStart = start ? new Date(start) : null;\r\n this.rangeEnd = end ? new Date(end) : null;\r\n this.render();\r\n \r\n if (this.onRangeSelect && this.rangeStart && this.rangeEnd) {\r\n this.onRangeSelect({ start: this.rangeStart, end: this.rangeEnd });\r\n }\r\n }\r\n\r\n getRange() {\r\n return { start: this.rangeStart, end: this.rangeEnd };\r\n }\r\n\r\n setEvents(events) {\r\n this.events = events || [];\r\n this.render();\r\n }\r\n\r\n addEvent(event) {\r\n this.events.push(event);\r\n this.render();\r\n }\r\n\r\n removeEvent(eventId) {\r\n this.events = this.events.filter(e => e.id !== eventId);\r\n this.render();\r\n }\r\n\r\n setViewMode(mode) {\r\n if (mode === 'month' || mode === 'week') {\r\n this.viewMode = mode;\r\n this.render();\r\n this._emitChange();\r\n }\r\n }\r\n\r\n getViewMode() {\r\n return this.viewMode;\r\n }\r\n\r\n setI18n(i18n) {\r\n this.i18n = { ...this.i18n, ...i18n };\r\n this.render();\r\n }\r\n\r\n prevMonth() {\r\n this.currentDate.setMonth(this.currentDate.getMonth() - 1);\r\n this.render();\r\n this._emitChange();\r\n }\r\n\r\n nextMonth() {\r\n this.currentDate.setMonth(this.currentDate.getMonth() + 1);\r\n this.render();\r\n this._emitChange();\r\n }\r\n\r\n prevWeek() {\r\n this.currentDate.setDate(this.currentDate.getDate() - 7);\r\n this.render();\r\n this._emitChange();\r\n }\r\n\r\n nextWeek() {\r\n this.currentDate.setDate(this.currentDate.getDate() + 7);\r\n this.render();\r\n this._emitChange();\r\n }\r\n\r\n goToToday() {\r\n this.currentDate = new Date();\r\n this.render();\r\n this._emitChange();\r\n }\r\n\r\n goToDate(date) {\r\n this.currentDate = new Date(date);\r\n this.render();\r\n this._emitChange();\r\n }\r\n\r\n toggleRangeMode() {\r\n this.isRangeMode = !this.isRangeMode;\r\n this.rangeStart = null;\r\n this.rangeEnd = null;\r\n this.render();\r\n this._emitChange();\r\n }\r\n}\r\n\r\nfunction initCalendar(element, options) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n try {\r\n const calendar = new Calendar(element, options);\r\n element.__kupolaInstance = calendar;\r\n element.__kupolaInitialized = true;\r\n } catch (error) {\r\n console.error('[Calendar] Error initializing:', error);\r\n }\r\n}\r\n\r\nfunction cleanupCalendar(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const calendar = element.__kupolaInstance;\r\n calendar.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initCalendars() {\r\n document.querySelectorAll('.ds-calendar').forEach(calendar => {\r\n initCalendar(calendar);\r\n });\r\n}\r\n\r\nexport { Calendar, initCalendars, initCalendar, cleanupCalendar };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Calendar = Calendar;\r\n window.initCalendar = initCalendar;\r\n window.cleanupCalendar = cleanupCalendar;\r\n window.initCalendars = initCalendars;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('calendar', initCalendar, cleanupCalendar);\r\n }\r\n}","class DynamicTags {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.input = element.querySelector('.ds-dynamic-tags__input');\r\n this._listeners = [];\r\n \r\n this.maxCount = options.maxCount || parseInt(element.getAttribute('data-dynamic-tags-max')) || Infinity;\r\n this.allowDuplicates = options.allowDuplicates !== false;\r\n this.color = options.color || element.getAttribute('data-dynamic-tags-color') || 'default';\r\n \r\n this.init();\r\n }\r\n\r\n init() {\r\n this.bindEvents();\r\n }\r\n\r\n bindEvents() {\r\n this.element.querySelectorAll('.ds-dynamic-tags__tag').forEach(tag => {\r\n const removeBtn = tag.querySelector('.ds-dynamic-tags__remove');\r\n if (removeBtn) {\r\n const removeHandler = (e) => {\r\n e.stopPropagation();\r\n tag.remove();\r\n this.dispatchChange();\r\n };\r\n removeBtn.addEventListener('click', removeHandler);\r\n this._listeners.push({ el: removeBtn, event: 'click', handler: removeHandler });\r\n }\r\n });\r\n\r\n if (this.input) {\r\n const addTag = () => {\r\n const value = this.input.value.trim();\r\n if (!value) return;\r\n\r\n if (!this.allowDuplicates && this.hasTag(value)) {\r\n this.input.value = '';\r\n return;\r\n }\r\n\r\n if (this.getTags().length >= this.maxCount) {\r\n this.input.value = '';\r\n this.element.dispatchEvent(new CustomEvent('kupola:dynamic-tags-max', {\r\n detail: { maxCount: this.maxCount }\r\n }));\r\n return;\r\n }\r\n\r\n const tag = this.createTag(value);\r\n this.element.insertBefore(tag, this.input);\r\n this.input.value = '';\r\n this.input.focus();\r\n this.dispatchChange();\r\n };\r\n\r\n const keydownHandler = (e) => {\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n addTag();\r\n }\r\n };\r\n this.input.addEventListener('keydown', keydownHandler);\r\n this._listeners.push({ el: this.input, event: 'keydown', handler: keydownHandler });\r\n\r\n const clickHandler = () => {\r\n this.input.focus();\r\n };\r\n this.element.addEventListener('click', clickHandler);\r\n this._listeners.push({ el: this.element, event: 'click', handler: clickHandler });\r\n }\r\n }\r\n\r\n createTag(value) {\r\n const tag = document.createElement('span');\r\n tag.className = `ds-dynamic-tags__tag ds-dynamic-tags__tag--${this.color}`;\r\n const textNode = document.createTextNode(value);\r\n tag.appendChild(textNode);\r\n const removeBtn = document.createElement('button');\r\n removeBtn.className = 'ds-dynamic-tags__remove';\r\n removeBtn.innerHTML = '<svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\r\n tag.appendChild(removeBtn);\r\n\r\n const tagRemoveHandler = (e) => {\r\n e.stopPropagation();\r\n tag.remove();\r\n this.dispatchChange();\r\n };\r\n removeBtn.addEventListener('click', tagRemoveHandler);\r\n this._listeners.push({ el: removeBtn, event: 'click', handler: tagRemoveHandler });\r\n\r\n return tag;\r\n }\r\n\r\n hasTag(value) {\r\n const tags = this.element.querySelectorAll('.ds-dynamic-tags__tag');\r\n for (const tag of tags) {\r\n if (tag.textContent.trim() === value) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n addTag(value, color) {\r\n if (!value || !this.input) return;\r\n \r\n if (!this.allowDuplicates && this.hasTag(value)) {\r\n return;\r\n }\r\n\r\n if (this.getTags().length >= this.maxCount) {\r\n this.element.dispatchEvent(new CustomEvent('kupola:dynamic-tags-max', {\r\n detail: { maxCount: this.maxCount }\r\n }));\r\n return;\r\n }\r\n\r\n const tag = this.createTag(value);\r\n if (color) {\r\n const colorClasses = ['ds-dynamic-tags__tag--default', 'ds-dynamic-tags__tag--primary', 'ds-dynamic-tags__tag--success', 'ds-dynamic-tags__tag--warning', 'ds-dynamic-tags__tag--danger', 'ds-dynamic-tags__tag--info'];\r\n colorClasses.forEach(cls => tag.classList.remove(cls));\r\n if (colorClasses.includes(`ds-dynamic-tags__tag--${color}`)) {\r\n tag.classList.add(`ds-dynamic-tags__tag--${color}`);\r\n }\r\n }\r\n this.element.insertBefore(tag, this.input);\r\n this.dispatchChange();\r\n }\r\n\r\n removeTag(index) {\r\n const tags = this.element.querySelectorAll('.ds-dynamic-tags__tag');\r\n const tag = tags[index];\r\n if (tag) {\r\n tag.remove();\r\n this.dispatchChange();\r\n }\r\n }\r\n\r\n removeTagByValue(value) {\r\n const tags = this.element.querySelectorAll('.ds-dynamic-tags__tag');\r\n for (const tag of tags) {\r\n if (tag.textContent.trim() === value) {\r\n tag.remove();\r\n this.dispatchChange();\r\n return;\r\n }\r\n }\r\n }\r\n\r\n getTags() {\r\n const tags = [];\r\n this.element.querySelectorAll('.ds-dynamic-tags__tag').forEach(tag => {\r\n tags.push(tag.textContent.trim());\r\n });\r\n return tags;\r\n }\r\n\r\n getTagsWithColor() {\r\n const tags = [];\r\n this.element.querySelectorAll('.ds-dynamic-tags__tag').forEach(tag => {\r\n const color = Array.from(tag.classList).find(cls => cls.startsWith('ds-dynamic-tags__tag--'))?.replace('ds-dynamic-tags__tag--', '') || 'default';\r\n tags.push({ value: tag.textContent.trim(), color });\r\n });\r\n return tags;\r\n }\r\n\r\n clearTags() {\r\n this.element.querySelectorAll('.ds-dynamic-tags__tag').forEach(tag => {\r\n tag.remove();\r\n });\r\n this.dispatchChange();\r\n }\r\n\r\n setTags(tags) {\r\n this.clearTags();\r\n tags.forEach(tag => {\r\n if (typeof tag === 'string') {\r\n this.addTag(tag);\r\n } else if (tag && typeof tag === 'object' && tag.value) {\r\n this.addTag(tag.value, tag.color);\r\n }\r\n });\r\n }\r\n\r\n setMaxCount(max) {\r\n this.maxCount = max;\r\n this.element.setAttribute('data-dynamic-tags-max', max);\r\n }\r\n\r\n getMaxCount() {\r\n return this.maxCount;\r\n }\r\n\r\n setAllowDuplicates(allow) {\r\n this.allowDuplicates = allow;\r\n }\r\n\r\n isAllowDuplicates() {\r\n return this.allowDuplicates;\r\n }\r\n\r\n setColor(color) {\r\n const validColors = ['default', 'primary', 'success', 'warning', 'danger', 'info'];\r\n if (validColors.includes(color)) {\r\n this.color = color;\r\n this.element.setAttribute('data-dynamic-tags-color', color);\r\n }\r\n }\r\n\r\n getColor() {\r\n return this.color;\r\n }\r\n\r\n dispatchChange() {\r\n this.element.dispatchEvent(new CustomEvent('kupola:dynamic-tags-change', {\r\n detail: {\r\n tags: this.getTags(),\r\n tagsWithColor: this.getTagsWithColor(),\r\n count: this.getTags().length,\r\n maxCount: this.maxCount\r\n }\r\n }));\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.input = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initDynamicTags(element, options) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const instance = new DynamicTags(element, options);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupDynamicTags(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initDynamicTagsAll() {\r\n document.querySelectorAll('.ds-dynamic-tags').forEach(tags => {\r\n initDynamicTags(tags);\r\n });\r\n}\r\n\r\nexport { DynamicTags, initDynamicTagsAll, initDynamicTags, cleanupDynamicTags };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.DynamicTags = DynamicTags;\r\n window.initDynamicTags = initDynamicTags;\r\n window.cleanupDynamicTags = cleanupDynamicTags;\r\n window.initDynamicTagsAll = initDynamicTagsAll;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('dynamic-tags', initDynamicTags, cleanupDynamicTags);\r\n }\r\n}","class ImagePreview {\r\n constructor(options = {}) {\r\n this.images = options.images || [];\r\n this.currentIndex = options.currentIndex || 0;\r\n this.overlay = null;\r\n this.closeHandler = this.close.bind(this);\r\n this.keyHandler = this.handleKeydown.bind(this);\r\n this.clickHandler = this.handleOverlayClick.bind(this);\r\n \r\n this.zoom = 1;\r\n this.rotation = 0;\r\n this.zoomStep = options.zoomStep || 0.2;\r\n this.minZoom = options.minZoom || 0.5;\r\n this.maxZoom = options.maxZoom || 3;\r\n \r\n this.init();\r\n }\r\n\r\n init() {\r\n this.createOverlay();\r\n }\r\n\r\n createOverlay() {\r\n this.overlay = document.createElement('div');\r\n this.overlay.className = 'ds-image-preview-overlay';\r\n this.overlay.innerHTML = `\r\n <button class=\"ds-image-preview__close\" type=\"button\" aria-label=\"Close preview\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M18 6L6 18\"/>\r\n <path d=\"M6 6l12 12\"/>\r\n </svg>\r\n </button>\r\n <div class=\"ds-image-preview__nav\">\r\n <button class=\"ds-image-preview__nav-btn ds-image-preview__nav-btn--prev\" type=\"button\" aria-label=\"Previous image\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"15 18 9 12 15 6\"/>\r\n </svg>\r\n </button>\r\n <button class=\"ds-image-preview__nav-btn ds-image-preview__nav-btn--next\" type=\"button\" aria-label=\"Next image\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"9 18 15 12 9 6\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n <div class=\"ds-image-preview__toolbar\">\r\n <button class=\"ds-image-preview__toolbar-btn\" type=\"button\" aria-label=\"Zoom in\" data-action=\"zoom-in\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/>\r\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>\r\n </svg>\r\n </button>\r\n <button class=\"ds-image-preview__toolbar-btn\" type=\"button\" aria-label=\"Zoom out\" data-action=\"zoom-out\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>\r\n </svg>\r\n </button>\r\n <button class=\"ds-image-preview__toolbar-btn\" type=\"button\" aria-label=\"Reset zoom\" data-action=\"zoom-reset\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0z\"/>\r\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/>\r\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>\r\n </svg>\r\n </button>\r\n <button class=\"ds-image-preview__toolbar-btn\" type=\"button\" aria-label=\"Rotate left\" data-action=\"rotate-left\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"1 4 1 10 7 10\"/>\r\n <path d=\"M3.51 15a9 9 0 1 0 2.13-9.36L1 10\"/>\r\n </svg>\r\n </button>\r\n <button class=\"ds-image-preview__toolbar-btn\" type=\"button\" aria-label=\"Rotate right\" data-action=\"rotate-right\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"23 4 23 10 17 10\"/>\r\n <path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n <div class=\"ds-image-preview__content\">\r\n <img src=\"\" alt=\"\" />\r\n </div>\r\n <div class=\"ds-image-preview__info\">\r\n <div class=\"ds-image-preview__title\"></div>\r\n <div class=\"ds-image-preview__meta\"></div>\r\n </div>\r\n <div class=\"ds-image-preview__indicators\"></div>\r\n `;\r\n \r\n document.body.appendChild(this.overlay);\r\n \r\n this.bindEvents();\r\n }\r\n\r\n bindEvents() {\r\n const closeBtn = this.overlay.querySelector('.ds-image-preview__close');\r\n const prevBtn = this.overlay.querySelector('.ds-image-preview__nav-btn--prev');\r\n const nextBtn = this.overlay.querySelector('.ds-image-preview__nav-btn--next');\r\n \r\n this._prevHandler = () => this.prev();\r\n this._nextHandler = () => this.next();\r\n \r\n closeBtn.addEventListener('click', this.closeHandler);\r\n prevBtn.addEventListener('click', this._prevHandler);\r\n nextBtn.addEventListener('click', this._nextHandler);\r\n\r\n const toolbarBtns = this.overlay.querySelectorAll('.ds-image-preview__toolbar-btn');\r\n toolbarBtns.forEach(btn => {\r\n btn.addEventListener('click', (e) => {\r\n const action = btn.getAttribute('data-action');\r\n this.handleToolbarAction(action);\r\n });\r\n });\r\n\r\n const content = this.overlay.querySelector('.ds-image-preview__content');\r\n content.addEventListener('wheel', (e) => {\r\n e.preventDefault();\r\n if (e.deltaY < 0) {\r\n this.zoomIn();\r\n } else {\r\n this.zoomOut();\r\n }\r\n }, { passive: false });\r\n }\r\n\r\n handleToolbarAction(action) {\r\n switch (action) {\r\n case 'zoom-in':\r\n this.zoomIn();\r\n break;\r\n case 'zoom-out':\r\n this.zoomOut();\r\n break;\r\n case 'zoom-reset':\r\n this.resetZoom();\r\n break;\r\n case 'rotate-left':\r\n this.rotate(-90);\r\n break;\r\n case 'rotate-right':\r\n this.rotate(90);\r\n break;\r\n }\r\n }\r\n\r\n zoomIn() {\r\n this.zoom = Math.min(this.maxZoom, this.zoom + this.zoomStep);\r\n this.updateTransform();\r\n }\r\n\r\n zoomOut() {\r\n this.zoom = Math.max(this.minZoom, this.zoom - this.zoomStep);\r\n this.updateTransform();\r\n }\r\n\r\n resetZoom() {\r\n this.zoom = 1;\r\n this.rotation = 0;\r\n this.updateTransform();\r\n }\r\n\r\n rotate(degrees) {\r\n this.rotation += degrees;\r\n this.updateTransform();\r\n }\r\n\r\n setRotation(degrees) {\r\n this.rotation = degrees;\r\n this.updateTransform();\r\n }\r\n\r\n setZoom(zoom) {\r\n this.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, zoom));\r\n this.updateTransform();\r\n }\r\n\r\n updateTransform() {\r\n const img = this.overlay.querySelector('.ds-image-preview__content img');\r\n if (img) {\r\n img.style.transform = `scale(${this.zoom}) rotate(${this.rotation}deg)`;\r\n }\r\n }\r\n\r\n handleKeydown(e) {\r\n if (!this.overlay.classList.contains('is-visible')) return;\r\n \r\n switch (e.key) {\r\n case 'Escape':\r\n this.close();\r\n break;\r\n case 'ArrowLeft':\r\n this.prev();\r\n break;\r\n case 'ArrowRight':\r\n this.next();\r\n break;\r\n case '+':\r\n case '=':\r\n e.preventDefault();\r\n this.zoomIn();\r\n break;\r\n case '-':\r\n case '_':\r\n e.preventDefault();\r\n this.zoomOut();\r\n break;\r\n case '0':\r\n e.preventDefault();\r\n this.resetZoom();\r\n break;\r\n case '[':\r\n e.preventDefault();\r\n this.rotate(-90);\r\n break;\r\n case ']':\r\n e.preventDefault();\r\n this.rotate(90);\r\n break;\r\n }\r\n }\r\n\r\n handleOverlayClick(e) {\r\n if (e.target === this.overlay) {\r\n this.close();\r\n }\r\n }\r\n\r\n show(images, index = 0) {\r\n this.images = images;\r\n this.currentIndex = Math.min(Math.max(index, 0), images.length - 1);\r\n \r\n this.resetZoom();\r\n this.render();\r\n this.overlay.classList.add('is-visible');\r\n \r\n document.addEventListener('keydown', this.keyHandler);\r\n this.overlay.addEventListener('click', this.clickHandler);\r\n document.body.style.overflow = 'hidden';\r\n }\r\n\r\n close() {\r\n this.overlay.classList.remove('is-visible');\r\n \r\n document.removeEventListener('keydown', this.keyHandler);\r\n this.overlay.removeEventListener('click', this.clickHandler);\r\n document.body.style.overflow = '';\r\n }\r\n\r\n prev() {\r\n if (this.currentIndex > 0) {\r\n this.currentIndex--;\r\n this.resetZoom();\r\n this.render();\r\n }\r\n }\r\n\r\n next() {\r\n if (this.currentIndex < this.images.length - 1) {\r\n this.currentIndex++;\r\n this.resetZoom();\r\n this.render();\r\n }\r\n }\r\n\r\n goTo(index) {\r\n if (index >= 0 && index < this.images.length) {\r\n this.currentIndex = index;\r\n this.resetZoom();\r\n this.render();\r\n }\r\n }\r\n\r\n render() {\r\n const img = this.overlay.querySelector('.ds-image-preview__content img');\r\n const title = this.overlay.querySelector('.ds-image-preview__title');\r\n const meta = this.overlay.querySelector('.ds-image-preview__meta');\r\n const indicators = this.overlay.querySelector('.ds-image-preview__indicators');\r\n const prevBtn = this.overlay.querySelector('.ds-image-preview__nav-btn--prev');\r\n const nextBtn = this.overlay.querySelector('.ds-image-preview__nav-btn--next');\r\n \r\n const currentImage = this.images[this.currentIndex];\r\n \r\n img.src = currentImage.src;\r\n img.alt = currentImage.alt || '';\r\n title.textContent = currentImage.title || '';\r\n meta.textContent = currentImage.meta || `${this.currentIndex + 1} / ${this.images.length}`;\r\n \r\n prevBtn.disabled = this.currentIndex === 0;\r\n nextBtn.disabled = this.currentIndex === this.images.length - 1;\r\n \r\n indicators.innerHTML = this.images.map((_, i) => `\r\n <button class=\"ds-image-preview__indicator${i === this.currentIndex ? ' is-active' : ''}\" type=\"button\" data-index=\"${i}\" aria-label=\"Go to image ${i + 1}\"></button>\r\n `).join('');\r\n \r\n indicators.querySelectorAll('.ds-image-preview__indicator').forEach(indicator => {\r\n const clickHandler = () => {\r\n this.goTo(parseInt(indicator.dataset.index));\r\n };\r\n indicator.addEventListener('click', clickHandler);\r\n indicator._clickHandler = clickHandler;\r\n });\r\n }\r\n\r\n destroy() {\r\n this.close();\r\n \r\n const indicators = this.overlay?.querySelector('.ds-image-preview__indicators');\r\n if (indicators) {\r\n indicators.querySelectorAll('.ds-image-preview__indicator').forEach(indicator => {\r\n if (indicator._clickHandler) {\r\n indicator.removeEventListener('click', indicator._clickHandler);\r\n }\r\n });\r\n }\r\n \r\n const closeBtn = this.overlay?.querySelector('.ds-image-preview__close');\r\n const prevBtn = this.overlay?.querySelector('.ds-image-preview__nav-btn--prev');\r\n const nextBtn = this.overlay?.querySelector('.ds-image-preview__nav-btn--next');\r\n \r\n if (closeBtn) {\r\n closeBtn.removeEventListener('click', this.closeHandler);\r\n }\r\n if (prevBtn && this._prevHandler) {\r\n prevBtn.removeEventListener('click', this._prevHandler);\r\n }\r\n if (nextBtn && this._nextHandler) {\r\n nextBtn.removeEventListener('click', this._nextHandler);\r\n }\r\n \r\n if (this.overlay && this.overlay.parentNode) {\r\n this.overlay.parentNode.removeChild(this.overlay);\r\n }\r\n }\r\n}\r\n\r\nlet imagePreviewInstance = null;\r\n\r\nfunction initImagePreview() {\r\n if (!imagePreviewInstance) {\r\n imagePreviewInstance = new ImagePreview();\r\n }\r\n \r\n document.querySelectorAll('[data-image-preview]').forEach(trigger => {\r\n trigger.addEventListener('click', () => {\r\n const images = JSON.parse(trigger.getAttribute('data-image-preview'));\r\n const index = parseInt(trigger.getAttribute('data-image-index')) || 0;\r\n imagePreviewInstance.show(images, index);\r\n });\r\n });\r\n}\r\n\r\nfunction showImagePreview(images, index = 0) {\r\n if (!imagePreviewInstance) {\r\n imagePreviewInstance = new ImagePreview();\r\n }\r\n imagePreviewInstance.show(images, index);\r\n}\r\n\r\nexport { ImagePreview, initImagePreview, showImagePreview };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.ImagePreview = ImagePreview;\r\n window.initImagePreview = initImagePreview;\r\n window.showImagePreview = showImagePreview;\r\n}","class Tag {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.closeBtn = element.querySelector('.ds-tag__close');\r\n this.checkbox = element.querySelector('.ds-tag__checkbox');\r\n this.editInput = element.querySelector('.ds-tag__input');\r\n \r\n this._listeners = [];\r\n \r\n this.color = options.color || element.getAttribute('data-tag-color') || 'default';\r\n this.size = options.size || element.getAttribute('data-tag-size') || 'default';\r\n this.checkable = options.checkable || element.hasAttribute('data-tag-checkable');\r\n this.checked = options.checked || element.hasAttribute('data-tag-checked');\r\n this.editable = options.editable || element.hasAttribute('data-tag-editable');\r\n this.maxLength = options.maxLength || parseInt(element.getAttribute('data-tag-maxlength')) || 50;\r\n \r\n this.init();\r\n }\r\n\r\n init() {\r\n this._applyStyles();\r\n \r\n if (this.closeBtn) {\r\n const closeHandler = (e) => {\r\n e.stopPropagation();\r\n this.element.dispatchEvent(new CustomEvent('kupola:tag-remove', {\r\n detail: { tag: this.element, content: this.getContent() },\r\n bubbles: true\r\n }));\r\n this.element.remove();\r\n };\r\n this.closeBtn.addEventListener('click', closeHandler);\r\n this._listeners.push({ el: this.closeBtn, event: 'click', handler: closeHandler });\r\n }\r\n \r\n if (this.checkable) {\r\n const clickHandler = (e) => {\r\n if (e.target !== this.checkbox && e.target !== this.closeBtn) {\r\n this.toggleChecked();\r\n }\r\n };\r\n this.element.addEventListener('click', clickHandler);\r\n this._listeners.push({ el: this.element, event: 'click', handler: clickHandler });\r\n \r\n if (this.checkbox) {\r\n const checkboxHandler = () => {\r\n this.toggleChecked();\r\n };\r\n this.checkbox.addEventListener('change', checkboxHandler);\r\n this._listeners.push({ el: this.checkbox, event: 'change', handler: checkboxHandler });\r\n }\r\n }\r\n \r\n if (this.editable) {\r\n const dblclickHandler = () => {\r\n this.startEdit();\r\n };\r\n this.element.addEventListener('dblclick', dblclickHandler);\r\n this._listeners.push({ el: this.element, event: 'dblclick', handler: dblclickHandler });\r\n \r\n if (this.editInput) {\r\n const blurHandler = () => {\r\n this.endEdit();\r\n };\r\n const keydownHandler = (e) => {\r\n if (e.key === 'Enter') {\r\n this.endEdit();\r\n } else if (e.key === 'Escape') {\r\n this.cancelEdit();\r\n }\r\n };\r\n this.editInput.addEventListener('blur', blurHandler);\r\n this.editInput.addEventListener('keydown', keydownHandler);\r\n this._listeners.push({ el: this.editInput, event: 'blur', handler: blurHandler });\r\n this._listeners.push({ el: this.editInput, event: 'keydown', handler: keydownHandler });\r\n }\r\n }\r\n }\r\n\r\n _applyStyles() {\r\n const colorClasses = ['ds-tag--default', 'ds-tag--primary', 'ds-tag--success', 'ds-tag--warning', 'ds-tag--danger', 'ds-tag--info'];\r\n const sizeClasses = ['ds-tag--default', 'ds-tag--small', 'ds-tag--large'];\r\n \r\n colorClasses.forEach(cls => this.element.classList.remove(cls));\r\n sizeClasses.forEach(cls => this.element.classList.remove(cls));\r\n \r\n if (colorClasses.includes(`ds-tag--${this.color}`)) {\r\n this.element.classList.add(`ds-tag--${this.color}`);\r\n }\r\n if (sizeClasses.includes(`ds-tag--${this.size}`)) {\r\n this.element.classList.add(`ds-tag--${this.size}`);\r\n }\r\n \r\n if (this.checkable) {\r\n this.element.classList.add('ds-tag--checkable');\r\n }\r\n if (this.checked) {\r\n this.element.classList.add('is-checked');\r\n }\r\n if (this.editable) {\r\n this.element.classList.add('ds-tag--editable');\r\n }\r\n }\r\n\r\n setContent(content) {\r\n if (this.editable && this.editInput) {\r\n this.editInput.value = content;\r\n }\r\n \r\n const textNodes = [];\r\n this.element.childNodes.forEach(node => {\r\n if (node.nodeType === Node.TEXT_NODE) {\r\n textNodes.push(node);\r\n }\r\n });\r\n textNodes.forEach(node => node.remove());\r\n \r\n const closeBtn = this.element.querySelector('.ds-tag__close');\r\n const checkbox = this.element.querySelector('.ds-tag__checkbox');\r\n const input = this.element.querySelector('.ds-tag__input');\r\n \r\n const insertBeforeEl = closeBtn || checkbox || input || null;\r\n this.element.insertBefore(document.createTextNode(content), insertBeforeEl);\r\n \r\n this.element.dispatchEvent(new CustomEvent('kupola:tag-change', {\r\n detail: { tag: this.element, content },\r\n bubbles: true\r\n }));\r\n }\r\n\r\n getContent() {\r\n if (this.editable && this.editInput && this.element.classList.contains('is-editing')) {\r\n return this.editInput.value;\r\n }\r\n return this.element.textContent.trim();\r\n }\r\n\r\n setColor(color) {\r\n const validColors = ['default', 'primary', 'success', 'warning', 'danger', 'info'];\r\n if (validColors.includes(color)) {\r\n this.color = color;\r\n this.element.setAttribute('data-tag-color', color);\r\n this._applyStyles();\r\n }\r\n }\r\n\r\n getColor() {\r\n return this.color;\r\n }\r\n\r\n setSize(size) {\r\n const validSizes = ['default', 'small', 'large'];\r\n if (validSizes.includes(size)) {\r\n this.size = size;\r\n this.element.setAttribute('data-tag-size', size);\r\n this._applyStyles();\r\n }\r\n }\r\n\r\n getSize() {\r\n return this.size;\r\n }\r\n\r\n toggleChecked() {\r\n this.checked = !this.checked;\r\n this.element.setAttribute('data-tag-checked', this.checked ? 'true' : 'false');\r\n this._applyStyles();\r\n \r\n if (this.checkbox) {\r\n this.checkbox.checked = this.checked;\r\n }\r\n \r\n this.element.dispatchEvent(new CustomEvent('kupola:tag-check', {\r\n detail: { tag: this.element, checked: this.checked, content: this.getContent() },\r\n bubbles: true\r\n }));\r\n }\r\n\r\n setChecked(checked) {\r\n this.checked = checked;\r\n this.element.setAttribute('data-tag-checked', checked ? 'true' : 'false');\r\n this._applyStyles();\r\n \r\n if (this.checkbox) {\r\n this.checkbox.checked = checked;\r\n }\r\n }\r\n\r\n isChecked() {\r\n return this.checked;\r\n }\r\n\r\n startEdit() {\r\n if (!this.editable) return;\r\n \r\n const content = this.getContent();\r\n \r\n if (!this.editInput) {\r\n const input = document.createElement('input');\r\n input.type = 'text';\r\n input.className = 'ds-tag__input';\r\n input.value = content;\r\n input.maxLength = this.maxLength;\r\n this.editInput = input;\r\n \r\n const closeBtn = this.element.querySelector('.ds-tag__close');\r\n this.element.insertBefore(input, closeBtn);\r\n \r\n const blurHandler = () => this.endEdit();\r\n const keydownHandler = (e) => {\r\n if (e.key === 'Enter') {\r\n this.endEdit();\r\n } else if (e.key === 'Escape') {\r\n this.cancelEdit();\r\n }\r\n };\r\n input.addEventListener('blur', blurHandler);\r\n input.addEventListener('keydown', keydownHandler);\r\n this._listeners.push({ el: input, event: 'blur', handler: blurHandler });\r\n this._listeners.push({ el: input, event: 'keydown', handler: keydownHandler });\r\n } else {\r\n this.editInput.value = content;\r\n }\r\n \r\n this.element.classList.add('is-editing');\r\n \r\n setTimeout(() => {\r\n if (this.editInput) {\r\n this.editInput.focus();\r\n this.editInput.select();\r\n }\r\n }, 0);\r\n }\r\n\r\n endEdit() {\r\n if (!this.editable || !this.element.classList.contains('is-editing')) return;\r\n \r\n const newContent = this.editInput.value.trim();\r\n this.element.classList.remove('is-editing');\r\n \r\n if (newContent && newContent !== this.getContent()) {\r\n this.setContent(newContent);\r\n this.element.dispatchEvent(new CustomEvent('kupola:tag-edit', {\r\n detail: { tag: this.element, content: newContent },\r\n bubbles: true\r\n }));\r\n }\r\n }\r\n\r\n cancelEdit() {\r\n if (!this.editable || !this.element.classList.contains('is-editing')) return;\r\n \r\n this.element.classList.remove('is-editing');\r\n if (this.editInput) {\r\n this.editInput.value = this.getContent();\r\n }\r\n }\r\n\r\n setEditable(editable) {\r\n this.editable = editable;\r\n if (editable) {\r\n this.element.setAttribute('data-tag-editable', '');\r\n } else {\r\n this.element.removeAttribute('data-tag-editable');\r\n }\r\n this._applyStyles();\r\n }\r\n\r\n isEditable() {\r\n return this.editable;\r\n }\r\n\r\n setCheckable(checkable) {\r\n if (this.checkable !== checkable) {\r\n this.destroy();\r\n this.checkable = checkable;\r\n if (checkable) {\r\n this.element.setAttribute('data-tag-checkable', '');\r\n } else {\r\n this.element.removeAttribute('data-tag-checkable');\r\n }\r\n this.init();\r\n }\r\n }\r\n\r\n isCheckable() {\r\n return this.checkable;\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = [];\r\n this.closeBtn = null;\r\n this.checkbox = null;\r\n this.editInput = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initTag(element, options) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const instance = new Tag(element, options);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupTag(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initTags() {\r\n document.querySelectorAll('.ds-tag').forEach(tag => {\r\n initTag(tag);\r\n });\r\n}\r\n\r\nexport { Tag, initTags, initTag, cleanupTag };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Tag = Tag;\r\n window.initTag = initTag;\r\n window.cleanupTag = cleanupTag;\r\n window.initTags = initTags;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('tag', initTag, cleanupTag);\r\n }\r\n}","class StatCard {\r\n constructor(element) {\r\n this.element = element;\r\n this.valueElement = element.querySelector('.ds-statcard__value');\r\n this.progressFill = element.querySelector('.ds-statcard__progress-fill');\r\n this.animated = false;\r\n this._observer = null;\r\n \r\n this.init();\r\n }\r\n\r\n init() {\r\n this.animateValue();\r\n this.animateProgress();\r\n \r\n this._observer = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting && !this.animated) {\r\n this.animateValue();\r\n this.animateProgress();\r\n this.animated = true;\r\n }\r\n });\r\n }, { threshold: 0.3 });\r\n \r\n this._observer.observe(this.element);\r\n }\r\n\r\n animateValue() {\r\n if (!this.valueElement) return;\r\n \r\n const text = this.valueElement.textContent;\r\n const match = text.match(/[\\d.,]+/);\r\n if (!match) return;\r\n \r\n const targetValue = parseFloat(match[0].replace(',', ''));\r\n const prefix = text.substring(0, match.index);\r\n const suffix = text.substring(match.index + match[0].length);\r\n \r\n const duration = 1500;\r\n const startTime = performance.now();\r\n const startValue = 0;\r\n \r\n const animate = (currentTime) => {\r\n const elapsed = currentTime - startTime;\r\n const progress = Math.min(elapsed / duration, 1);\r\n const easeProgress = 1 - Math.pow(1 - progress, 3);\r\n \r\n const currentValue = startValue + (targetValue - startValue) * easeProgress;\r\n \r\n let formattedValue;\r\n if (targetValue >= 1000000) {\r\n formattedValue = (currentValue / 1000000).toFixed(1) + 'M';\r\n } else if (targetValue >= 1000) {\r\n formattedValue = (currentValue / 1000).toFixed(1) + 'K';\r\n } else if (Number.isInteger(targetValue)) {\r\n formattedValue = Math.floor(currentValue).toLocaleString();\r\n } else {\r\n formattedValue = currentValue.toFixed(2);\r\n }\r\n \r\n this.valueElement.textContent = prefix + formattedValue + suffix;\r\n \r\n if (progress < 1) {\r\n requestAnimationFrame(animate);\r\n }\r\n };\r\n \r\n requestAnimationFrame(animate);\r\n }\r\n\r\n animateProgress() {\r\n if (!this.progressFill) return;\r\n \r\n const width = this.progressFill.getAttribute('data-width') || '0%';\r\n this.progressFill.style.width = width;\r\n }\r\n\r\n updateValue(newValue, options = {}) {\r\n if (!this.valueElement) return;\r\n \r\n const duration = options.duration || 800;\r\n const text = this.valueElement.textContent;\r\n const match = text.match(/[\\d.,]+/);\r\n \r\n if (!match) {\r\n this.valueElement.textContent = newValue;\r\n return;\r\n }\r\n \r\n const prefix = text.substring(0, match.index);\r\n const suffix = text.substring(match.index + match[0].length);\r\n const startValue = parseFloat(match[0].replace(',', ''));\r\n const targetValue = parseFloat(newValue);\r\n \r\n const startTime = performance.now();\r\n \r\n const animate = (currentTime) => {\r\n const elapsed = currentTime - startTime;\r\n const progress = Math.min(elapsed / duration, 1);\r\n const easeProgress = 1 - Math.pow(1 - progress, 3);\r\n \r\n const currentValue = startValue + (targetValue - startValue) * easeProgress;\r\n \r\n let formattedValue;\r\n if (targetValue >= 1000000) {\r\n formattedValue = (currentValue / 1000000).toFixed(1) + 'M';\r\n } else if (targetValue >= 1000) {\r\n formattedValue = (currentValue / 1000).toFixed(1) + 'K';\r\n } else if (Number.isInteger(targetValue)) {\r\n formattedValue = Math.floor(currentValue).toLocaleString();\r\n } else {\r\n formattedValue = currentValue.toFixed(2);\r\n }\r\n \r\n this.valueElement.textContent = prefix + formattedValue + suffix;\r\n \r\n if (progress < 1) {\r\n requestAnimationFrame(animate);\r\n }\r\n };\r\n \r\n requestAnimationFrame(animate);\r\n }\r\n\r\n updateProgress(percent, options = {}) {\r\n if (!this.progressFill) return;\r\n \r\n const duration = options.duration || 600;\r\n const currentWidth = parseFloat(this.progressFill.style.width || '0');\r\n const targetWidth = Math.min(Math.max(percent, 0), 100);\r\n \r\n const startTime = performance.now();\r\n \r\n const animate = (currentTime) => {\r\n const elapsed = currentTime - startTime;\r\n const progress = Math.min(elapsed / duration, 1);\r\n const easeProgress = 1 - Math.pow(1 - progress, 3);\r\n \r\n const currentWidthValue = currentWidth + (targetWidth - currentWidth) * easeProgress;\r\n this.progressFill.style.width = currentWidthValue + '%';\r\n \r\n if (progress < 1) {\r\n requestAnimationFrame(animate);\r\n }\r\n };\r\n \r\n requestAnimationFrame(animate);\r\n }\r\n\r\n setTrend(direction, value) {\r\n const trendElement = this.element.querySelector('.ds-statcard__trend');\r\n if (!trendElement) return;\r\n \r\n trendElement.className = `ds-statcard__trend ds-statcard__trend--${direction}`;\r\n \r\n const iconSvg = direction === 'up' \r\n ? '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"23 6 13.5 15.5 8.5 10.5 1 18\"/></svg>'\r\n : direction === 'down'\r\n ? '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"1 18 10.5 8.5 15.5 13.5 23 6\"/></svg>'\r\n : '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"12 19 18 13 12 7 6 13\"/></svg>';\r\n \r\n trendElement.innerHTML = iconSvg + value;\r\n }\r\n\r\n destroy() {\r\n if (this._observer) {\r\n this._observer.disconnect();\r\n this._observer = null;\r\n }\r\n this.animated = false;\r\n this.valueElement = null;\r\n this.progressFill = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initStatCard(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const instance = new StatCard(element);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupStatCard(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initStatCards() {\r\n document.querySelectorAll('.ds-statcard').forEach(card => {\r\n initStatCard(card);\r\n });\r\n}\r\n\r\nfunction updateStatCard(selector, newValue) {\r\n const card = document.querySelector(selector);\r\n if (card && card.__kupolaInstance) {\r\n card.__kupolaInstance.updateValue(newValue);\r\n }\r\n}\r\n\r\nexport { StatCard, initStatCards, initStatCard, cleanupStatCard, updateStatCard };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.StatCard = StatCard;\r\n window.initStatCard = initStatCard;\r\n window.cleanupStatCard = cleanupStatCard;\r\n window.initStatCards = initStatCards;\r\n window.updateStatCard = updateStatCard;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('statcard', initStatCard, cleanupStatCard);\r\n }\r\n}","class Heatmap {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.data = options.data || [];\r\n this.startDate = options.startDate || this.getOneYearAgo();\r\n this.endDate = options.endDate || new Date();\r\n this.cellSize = options.cellSize || 14;\r\n this.onCellClick = options.onCellClick || null;\r\n this.tooltip = null;\r\n this.baseColor = options.color || element.getAttribute('data-color') || '#22c55e';\r\n this._listeners = [];\r\n \r\n this.init();\r\n }\r\n\r\n getOneYearAgo() {\r\n const date = new Date();\r\n date.setFullYear(date.getFullYear() - 1);\r\n return date;\r\n }\r\n\r\n init() {\r\n this.render();\r\n this.createTooltip();\r\n }\r\n\r\n getDataByDate(date) {\r\n const dateStr = this.formatDate(date);\r\n const item = this.data.find(d => d.date === dateStr);\r\n return item ? item.value : 0;\r\n }\r\n\r\n formatDate(date) {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n getLevel(value, maxValue) {\r\n if (value === 0) return 0;\r\n if (!maxValue || maxValue === 0) maxValue = Math.max(...this.data.map(d => d.value), 1);\r\n const ratio = value / maxValue;\r\n if (ratio < 0.2) return 1;\r\n if (ratio < 0.4) return 2;\r\n if (ratio < 0.6) return 3;\r\n if (ratio < 0.8) return 4;\r\n return 5;\r\n }\r\n\r\n hexToRgb(hex) {\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n return result ? {\r\n r: parseInt(result[1], 16),\r\n g: parseInt(result[2], 16),\r\n b: parseInt(result[3], 16)\r\n } : { r: 34, g: 197, b: 94 };\r\n }\r\n\r\n getCellColor(level) {\r\n const rgb = this.hexToRgb(this.baseColor);\r\n if (level === 0) return 'rgba(0, 0, 0, 0.1)';\r\n const opacity = [0.2, 0.4, 0.6, 0.8, 1][level - 1];\r\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${opacity})`;\r\n }\r\n\r\n getWeekdayLabels() {\r\n return ['', '一', '', '三', '', '五', ''];\r\n }\r\n\r\n getMonthLabels() {\r\n const months = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'];\r\n const result = [];\r\n let currentMonth = -1;\r\n \r\n for (let d = new Date(this.startDate); d <= this.endDate; d.setDate(d.getDate() + 1)) {\r\n const month = d.getMonth();\r\n const day = d.getDate();\r\n if (month !== currentMonth && day === 1) {\r\n result.push({ month, label: months[month], offset: Math.floor((d - this.startDate) / (1000 * 60 * 60 * 24)) });\r\n currentMonth = month;\r\n }\r\n }\r\n \r\n return result;\r\n }\r\n\r\n getWeekCount() {\r\n let weeks = 0;\r\n let firstDate = new Date(this.startDate);\r\n const firstDayOfWeek = firstDate.getDay();\r\n \r\n for (let d = new Date(this.startDate); d <= this.endDate; d.setDate(d.getDate() + 1)) {\r\n if (d.getDay() === 0) {\r\n weeks++;\r\n }\r\n }\r\n \r\n if (firstDayOfWeek !== 0) {\r\n weeks++;\r\n }\r\n \r\n return weeks;\r\n }\r\n\r\n render() {\r\n const body = this.element.querySelector('.ds-heatmap__body');\r\n if (!body) return;\r\n \r\n body.innerHTML = '';\r\n \r\n const weeks = [];\r\n let currentWeek = [];\r\n \r\n let firstDate = new Date(this.startDate);\r\n const firstDayOfWeek = firstDate.getDay();\r\n for (let i = 1; i < firstDayOfWeek; i++) {\r\n currentWeek.push(null);\r\n }\r\n \r\n for (let d = new Date(this.startDate); d <= this.endDate; d.setDate(d.getDate() + 1)) {\r\n currentWeek.push(new Date(d));\r\n if (d.getDay() === 6 || d.getTime() === this.endDate.getTime()) {\r\n weeks.push(currentWeek);\r\n currentWeek = [];\r\n }\r\n }\r\n \r\n const weekCount = weeks.length;\r\n const cellWidth = this.element.classList.contains('ds-heatmap--compact') ? 12 : 16;\r\n const totalGridWidth = weekCount * cellWidth;\r\n \r\n const container = document.createElement('div');\r\n container.className = 'ds-heatmap__container';\r\n \r\n const labelsAndGrid = document.createElement('div');\r\n labelsAndGrid.className = 'ds-heatmap__labels-and-grid';\r\n \r\n const weekdayLabels = document.createElement('div');\r\n weekdayLabels.className = 'ds-heatmap__weekday-labels';\r\n const weekdayLabelHeight = this.element.classList.contains('ds-heatmap--compact') ? 12 : 16;\r\n this.getWeekdayLabels().forEach(label => {\r\n const el = document.createElement('div');\r\n el.className = 'ds-heatmap__weekday-label';\r\n el.textContent = label;\r\n el.style.height = weekdayLabelHeight + 'px';\r\n el.style.lineHeight = weekdayLabelHeight + 'px';\r\n weekdayLabels.appendChild(el);\r\n });\r\n labelsAndGrid.appendChild(weekdayLabels);\r\n \r\n const gridContainer = document.createElement('div');\r\n gridContainer.className = 'ds-heatmap__grid-container';\r\n \r\n const monthLabels = document.createElement('div');\r\n monthLabels.className = 'ds-heatmap__month-labels';\r\n monthLabels.style.width = totalGridWidth + 'px';\r\n \r\n const monthInfo = this.getMonthLabels();\r\n monthInfo.forEach((item, index) => {\r\n const el = document.createElement('div');\r\n el.className = 'ds-heatmap__month-label';\r\n el.textContent = item.label;\r\n \r\n const nextMonth = monthInfo[index + 1];\r\n let weekSpan;\r\n if (nextMonth) {\r\n weekSpan = Math.ceil((nextMonth.offset - item.offset) / 7);\r\n } else {\r\n weekSpan = weekCount - Math.floor(item.offset / 7);\r\n }\r\n \r\n el.style.width = (weekSpan * cellWidth) + 'px';\r\n monthLabels.appendChild(el);\r\n });\r\n gridContainer.appendChild(monthLabels);\r\n \r\n const grid = document.createElement('div');\r\n grid.className = 'ds-heatmap__grid';\r\n \r\n weeks.forEach((week) => {\r\n const weekColumn = document.createElement('div');\r\n weekColumn.className = 'ds-heatmap__week-column';\r\n \r\n week.forEach(date => {\r\n if (date === null) {\r\n const emptyCell = document.createElement('div');\r\n emptyCell.className = 'ds-heatmap__cell';\r\n emptyCell.style.visibility = 'hidden';\r\n weekColumn.appendChild(emptyCell);\r\n } else {\r\n const value = this.getDataByDate(date);\r\n const maxValue = Math.max(...this.data.map(d => d.value), 1);\r\n const level = this.getLevel(value, maxValue);\r\n \r\n const cell = document.createElement('div');\r\n cell.className = 'ds-heatmap__cell';\r\n cell.dataset.date = this.formatDate(date);\r\n cell.dataset.value = value;\r\n cell.style.backgroundColor = this.getCellColor(level);\r\n \r\n const mouseenterHandler = (e) => this.showTooltip(e, date, value);\r\n const mouseleaveHandler = () => this.hideTooltip();\r\n const clickHandler = () => {\r\n if (this.onCellClick) {\r\n this.onCellClick({ date: this.formatDate(date), value });\r\n }\r\n };\r\n \r\n cell.addEventListener('mouseenter', mouseenterHandler);\r\n cell.addEventListener('mouseleave', mouseleaveHandler);\r\n cell.addEventListener('click', clickHandler);\r\n \r\n this._listeners.push(\r\n { el: cell, event: 'mouseenter', handler: mouseenterHandler },\r\n { el: cell, event: 'mouseleave', handler: mouseleaveHandler },\r\n { el: cell, event: 'click', handler: clickHandler }\r\n );\r\n \r\n weekColumn.appendChild(cell);\r\n }\r\n });\r\n \r\n grid.appendChild(weekColumn);\r\n });\r\n \r\n gridContainer.appendChild(grid);\r\n labelsAndGrid.appendChild(gridContainer);\r\n container.appendChild(labelsAndGrid);\r\n \r\n body.appendChild(container);\r\n this.renderLegend(body);\r\n }\r\n\r\n renderLegend(parent) {\r\n const legend = document.createElement('div');\r\n legend.className = 'ds-heatmap__legend';\r\n \r\n const label = document.createElement('span');\r\n label.className = 'ds-heatmap__legend-label';\r\n label.textContent = '少';\r\n \r\n const cells = document.createElement('div');\r\n cells.className = 'ds-heatmap__legend-cells';\r\n \r\n for (let i = 0; i <= 5; i++) {\r\n const cell = document.createElement('div');\r\n cell.className = 'ds-heatmap__legend-cell';\r\n cell.style.backgroundColor = this.getCellColor(i);\r\n cells.appendChild(cell);\r\n }\r\n \r\n const label2 = document.createElement('span');\r\n label2.className = 'ds-heatmap__legend-label';\r\n label2.textContent = '多';\r\n \r\n legend.appendChild(label);\r\n legend.appendChild(cells);\r\n legend.appendChild(label2);\r\n parent.appendChild(legend);\r\n }\r\n\r\n createTooltip() {\r\n this.tooltip = document.createElement('div');\r\n this.tooltip.className = 'ds-heatmap__tooltip';\r\n document.body.appendChild(this.tooltip);\r\n }\r\n\r\n showTooltip(e, date, value) {\r\n const rect = e.target.getBoundingClientRect();\r\n const tooltipWidth = 150;\r\n \r\n this.tooltip.innerHTML = `\r\n <div class=\"ds-heatmap__tooltip-date\">${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日</div>\r\n <div class=\"ds-heatmap__tooltip-value\">${value} contributions</div>\r\n `;\r\n \r\n this.tooltip.style.left = Math.min(rect.left + rect.width / 2 - tooltipWidth / 2, window.innerWidth - tooltipWidth - 16) + 'px';\r\n this.tooltip.style.top = (rect.top - 50) + 'px';\r\n this.tooltip.classList.add('is-visible');\r\n }\r\n\r\n hideTooltip() {\r\n this.tooltip.classList.remove('is-visible');\r\n }\r\n\r\n updateData(data) {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = [];\r\n this.data = data;\r\n this.render();\r\n }\r\n\r\n setDateRange(startDate, endDate) {\r\n this.startDate = startDate;\r\n this.endDate = endDate;\r\n this.render();\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n \r\n if (this.tooltip && this.tooltip.parentNode) {\r\n this.tooltip.parentNode.removeChild(this.tooltip);\r\n }\r\n this.tooltip = null;\r\n this.data = [];\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initHeatmap(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const dataAttr = element.getAttribute('data-heatmap-data');\r\n let data = [];\r\n \r\n if (dataAttr) {\r\n try {\r\n data = JSON.parse(dataAttr);\r\n } catch (e) {\r\n data = generateMockHeatmapData();\r\n }\r\n } else {\r\n data = generateMockHeatmapData();\r\n }\r\n \r\n const instance = new Heatmap(element, {\r\n data: data,\r\n onCellClick: (info) => {\r\n }\r\n });\r\n \r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupHeatmap(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initHeatmaps() {\r\n document.querySelectorAll('.ds-heatmap').forEach(element => {\r\n initHeatmap(element);\r\n });\r\n}\r\n\r\nfunction generateMockHeatmapData() {\r\n const data = [];\r\n const today = new Date();\r\n const oneYearAgo = new Date();\r\n oneYearAgo.setFullYear(oneYearAgo.getFullYear() - 1);\r\n \r\n for (let d = new Date(oneYearAgo); d <= today; d.setDate(d.getDate() + 1)) {\r\n const year = d.getFullYear();\r\n const month = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n \r\n const isWeekend = d.getDay() === 0 || d.getDay() === 6;\r\n const baseValue = isWeekend ? Math.random() * 20 : Math.random() * 50;\r\n const value = Math.floor(baseValue);\r\n \r\n data.push({\r\n date: `${year}-${month}-${day}`,\r\n value: value > 0 ? value : Math.floor(Math.random() * 30) + 1\r\n });\r\n }\r\n \r\n return data;\r\n}\r\n\r\nfunction createHeatmap(selector, options = {}) {\r\n const element = document.querySelector(selector);\r\n if (element) {\r\n const data = options.data || generateMockHeatmapData();\r\n return new Heatmap(element, {\r\n data: data,\r\n ...options\r\n });\r\n }\r\n return null;\r\n}\r\n\r\nexport { Heatmap, initHeatmaps, initHeatmap, cleanupHeatmap, createHeatmap, generateMockHeatmapData };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Heatmap = Heatmap;\r\n window.initHeatmap = initHeatmap;\r\n window.cleanupHeatmap = cleanupHeatmap;\r\n window.initHeatmaps = initHeatmaps;\r\n window.createHeatmap = createHeatmap;\r\n window.generateMockHeatmapData = generateMockHeatmapData;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('heatmap', initHeatmap, cleanupHeatmap);\r\n }\r\n}","class Tooltip {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.tooltipEl = null;\r\n \r\n this.options = options;\r\n this.delay = options.delay || parseInt(element.getAttribute('data-tooltip-delay')) || 0;\r\n this.hideDelay = options.hideDelay || parseInt(element.getAttribute('data-tooltip-hide-delay')) || 0;\r\n this.trigger = options.trigger || element.getAttribute('data-tooltip-trigger') || 'hover'; // hover | click | focus | manual\r\n this.html = options.html || element.hasAttribute('data-tooltip-html');\r\n this.theme = options.theme || element.getAttribute('data-tooltip-theme') || 'default'; // default | dark | light\r\n this.position = options.position || element.getAttribute('data-tooltip-position') || 'top';\r\n this.animation = options.animation !== false;\r\n this.mouseFollow = options.mouseFollow || element.hasAttribute('data-tooltip-mouse-follow');\r\n \r\n this._showTooltip = null;\r\n this._hideTooltip = null;\r\n this._showTimer = null;\r\n this._hideTimer = null;\r\n this._clickHandler = null;\r\n this._focusHandler = null;\r\n this._blurHandler = null;\r\n this._mouseMoveHandler = null;\r\n \r\n this.isVisible = false;\r\n }\r\n\r\n init() {\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n this._showTooltip = () => {\r\n if (this.delay > 0) {\r\n this._showTimer = setTimeout(() => this.show(), this.delay);\r\n } else {\r\n this.show();\r\n }\r\n };\r\n\r\n this._hideTooltip = () => {\r\n if (this._showTimer) {\r\n clearTimeout(this._showTimer);\r\n this._showTimer = null;\r\n }\r\n if (this.hideDelay > 0) {\r\n this._hideTimer = setTimeout(() => this.hide(), this.hideDelay);\r\n } else {\r\n this.hide();\r\n }\r\n };\r\n\r\n this._clickHandler = () => {\r\n if (this.isVisible) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n };\r\n\r\n this._mouseMoveHandler = (e) => {\r\n if (!this.isVisible || !this.mouseFollow || !this.tooltipEl) return;\r\n \r\n const tooltipRect = this.tooltipEl.getBoundingClientRect();\r\n let left = e.clientX + 10;\r\n let top = e.clientY + 10;\r\n \r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n \r\n if (left + tooltipRect.width > viewportWidth) {\r\n left = e.clientX - tooltipRect.width - 10;\r\n }\r\n if (top + tooltipRect.height > viewportHeight) {\r\n top = e.clientY - tooltipRect.height - 10;\r\n }\r\n \r\n this.tooltipEl.style.left = `${left}px`;\r\n this.tooltipEl.style.top = `${top}px`;\r\n };\r\n\r\n if (this.trigger === 'hover' || this.trigger === 'focus') {\r\n this.element.addEventListener('mouseenter', this._showTooltip);\r\n this.element.addEventListener('mouseleave', this._hideTooltip);\r\n \r\n if (this.mouseFollow) {\r\n this.element.addEventListener('mousemove', this._mouseMoveHandler);\r\n }\r\n }\r\n \r\n if (this.trigger === 'click') {\r\n this.element.addEventListener('click', this._clickHandler);\r\n \r\n document.addEventListener('click', (e) => {\r\n if (this.isVisible && !this.element.contains(e.target) && !this.tooltipEl?.contains(e.target)) {\r\n this.hide();\r\n }\r\n });\r\n }\r\n \r\n if (this.trigger === 'focus' || this.trigger === 'hover') {\r\n this.element.addEventListener('focus', this._showTooltip);\r\n this.element.addEventListener('blur', this._hideTooltip);\r\n }\r\n \r\n this.element.__kupolaInitialized = true;\r\n }\r\n\r\n show() {\r\n if (this.isVisible) return;\r\n \r\n const text = this.element.getAttribute('data-tooltip');\r\n if (!text) return;\r\n \r\n this.tooltipEl = document.createElement('div');\r\n this.tooltipEl.className = `ds-tooltip ds-tooltip--${this.position} ds-tooltip--${this.theme}`;\r\n \r\n if (this.html) {\r\n this.tooltipEl.innerHTML = text;\r\n } else {\r\n this.tooltipEl.textContent = text;\r\n }\r\n \r\n document.body.appendChild(this.tooltipEl);\r\n \r\n requestAnimationFrame(() => {\r\n this.tooltipEl.classList.add('is-visible');\r\n \r\n if (!this.mouseFollow) {\r\n this._positionTooltip();\r\n }\r\n \r\n this.isVisible = true;\r\n this.element.dispatchEvent(new CustomEvent('kupola:tooltip-show', { \r\n detail: { tooltip: this.tooltipEl },\r\n bubbles: true \r\n }));\r\n });\r\n }\r\n\r\n hide() {\r\n if (!this.isVisible || !this.tooltipEl) return;\r\n \r\n this.tooltipEl.classList.remove('is-visible');\r\n \r\n const removeEl = this.tooltipEl;\r\n setTimeout(() => {\r\n if (removeEl === this.tooltipEl) {\r\n removeEl.remove();\r\n this.tooltipEl = null;\r\n }\r\n }, this.animation ? 200 : 0);\r\n \r\n this.isVisible = false;\r\n this.element.dispatchEvent(new CustomEvent('kupola:tooltip-hide', { \r\n detail: { tooltip: removeEl },\r\n bubbles: true \r\n }));\r\n }\r\n\r\n toggle() {\r\n if (this.isVisible) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n\r\n _positionTooltip() {\r\n if (!this.tooltipEl) return;\r\n \r\n const rect = this.element.getBoundingClientRect();\r\n const tooltipRect = this.tooltipEl.getBoundingClientRect();\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n \r\n let left, top;\r\n \r\n switch (this.position) {\r\n case 'bottom':\r\n left = rect.left + rect.width / 2 - tooltipRect.width / 2;\r\n top = rect.bottom + 8;\r\n break;\r\n case 'right':\r\n left = rect.right + 8;\r\n top = rect.top + rect.height / 2 - tooltipRect.height / 2;\r\n break;\r\n case 'left':\r\n left = rect.left - tooltipRect.width - 8;\r\n top = rect.top + rect.height / 2 - tooltipRect.height / 2;\r\n break;\r\n case 'top':\r\n default:\r\n left = rect.left + rect.width / 2 - tooltipRect.width / 2;\r\n top = rect.top - tooltipRect.height - 8;\r\n break;\r\n }\r\n \r\n if (left < 8) left = 8;\r\n if (left + tooltipRect.width > viewportWidth) left = viewportWidth - tooltipRect.width - 8;\r\n if (top < 8) top = 8;\r\n if (top + tooltipRect.height > viewportHeight) top = viewportHeight - tooltipRect.height - 8;\r\n \r\n this.tooltipEl.style.left = `${left}px`;\r\n this.tooltipEl.style.top = `${top}px`;\r\n this.tooltipEl.style.position = 'fixed';\r\n }\r\n\r\n updateContent(content, isHtml = false) {\r\n this.element.setAttribute('data-tooltip', content);\r\n if (isHtml) {\r\n this.element.setAttribute('data-tooltip-html', '');\r\n } else {\r\n this.element.removeAttribute('data-tooltip-html');\r\n }\r\n this.html = isHtml;\r\n \r\n if (this.isVisible && this.tooltipEl) {\r\n if (this.html) {\r\n this.tooltipEl.innerHTML = content;\r\n } else {\r\n this.tooltipEl.textContent = content;\r\n }\r\n this._positionTooltip();\r\n }\r\n }\r\n\r\n setPosition(position) {\r\n if (['top', 'bottom', 'left', 'right'].includes(position)) {\r\n this.position = position;\r\n this.element.setAttribute('data-tooltip-position', position);\r\n \r\n if (this.tooltipEl) {\r\n this.tooltipEl.className = `ds-tooltip ds-tooltip--${this.position} ds-tooltip--${this.theme}`;\r\n if (this.isVisible) {\r\n this._positionTooltip();\r\n }\r\n }\r\n }\r\n }\r\n\r\n setTheme(theme) {\r\n this.theme = theme;\r\n this.element.setAttribute('data-tooltip-theme', theme);\r\n \r\n if (this.tooltipEl) {\r\n this.tooltipEl.className = `ds-tooltip ds-tooltip--${this.position} ds-tooltip--${this.theme}`;\r\n }\r\n }\r\n\r\n setDelay(delay) {\r\n this.delay = delay;\r\n this.element.setAttribute('data-tooltip-delay', delay);\r\n }\r\n\r\n setHideDelay(delay) {\r\n this.hideDelay = delay;\r\n this.element.setAttribute('data-tooltip-hide-delay', delay);\r\n }\r\n\r\n setTrigger(trigger) {\r\n if (['hover', 'click', 'focus', 'manual'].includes(trigger)) {\r\n this.destroy();\r\n this.trigger = trigger;\r\n this.element.setAttribute('data-tooltip-trigger', trigger);\r\n this.init();\r\n }\r\n }\r\n\r\n enableMouseFollow(enable) {\r\n this.mouseFollow = enable;\r\n if (enable) {\r\n this.element.setAttribute('data-tooltip-mouse-follow', '');\r\n this.element.addEventListener('mousemove', this._mouseMoveHandler);\r\n } else {\r\n this.element.removeAttribute('data-tooltip-mouse-follow');\r\n this.element.removeEventListener('mousemove', this._mouseMoveHandler);\r\n }\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n if (this._showTimer) {\r\n clearTimeout(this._showTimer);\r\n this._showTimer = null;\r\n }\r\n if (this._hideTimer) {\r\n clearTimeout(this._hideTimer);\r\n this._hideTimer = null;\r\n }\r\n\r\n if (this.trigger === 'hover' || this.trigger === 'focus') {\r\n this.element.removeEventListener('mouseenter', this._showTooltip);\r\n this.element.removeEventListener('mouseleave', this._hideTooltip);\r\n }\r\n \r\n if (this.trigger === 'click') {\r\n this.element.removeEventListener('click', this._clickHandler);\r\n }\r\n \r\n if (this.trigger === 'focus' || this.trigger === 'hover') {\r\n this.element.removeEventListener('focus', this._showTooltip);\r\n this.element.removeEventListener('blur', this._hideTooltip);\r\n }\r\n \r\n if (this.mouseFollow) {\r\n this.element.removeEventListener('mousemove', this._mouseMoveHandler);\r\n }\r\n\r\n if (this.tooltipEl) {\r\n this.tooltipEl.remove();\r\n this.tooltipEl = null;\r\n }\r\n \r\n this.isVisible = false;\r\n this._showTooltip = null;\r\n this._hideTooltip = null;\r\n this._clickHandler = null;\r\n this._mouseMoveHandler = null;\r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initTooltip(element, options) {\r\n const tooltip = new Tooltip(element, options);\r\n tooltip.init();\r\n element._kupolaTooltip = tooltip;\r\n}\r\n\r\nfunction initTooltips(root = document) {\r\n root.querySelectorAll('[data-tooltip]').forEach(element => {\r\n initTooltip(element);\r\n });\r\n}\r\n\r\nfunction cleanupTooltip(element) {\r\n if (element._kupolaTooltip) {\r\n element._kupolaTooltip.destroy();\r\n element._kupolaTooltip = null;\r\n }\r\n}\r\n\r\nexport { Tooltip, initTooltip, initTooltips, cleanupTooltip };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Tooltip = Tooltip;\r\n window.initTooltip = initTooltip;\r\n window.initTooltips = initTooltips;\r\n window.cleanupTooltip = cleanupTooltip;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('tooltip', initTooltip, cleanupTooltip);\r\n }\r\n}","class KupolaValidator {\r\n constructor() {\r\n this.validators = {\r\n required: this.validateRequired,\r\n email: this.validateEmail,\r\n url: this.validateUrl,\r\n minLength: this.validateMinLength,\r\n maxLength: this.validateMaxLength,\r\n pattern: this.validatePattern,\r\n min: this.validateMin,\r\n max: this.validateMax,\r\n equalTo: this.validateEqualTo,\r\n phone: this.validatePhone,\r\n date: this.validateDate,\r\n number: this.validateNumber\r\n };\r\n \r\n this.customValidators = {};\r\n this.asyncValidators = {};\r\n this.customAsyncValidators = {};\r\n this.formStates = {};\r\n this.submitting = new Set();\r\n }\r\n\r\n addValidator(name, callback) {\r\n this.customValidators[name] = callback;\r\n }\r\n\r\n addAsyncValidator(name, callback) {\r\n this.customAsyncValidators[name] = callback;\r\n }\r\n\r\n validate(form) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n const errors = {};\r\n const inputs = form.querySelectorAll('[data-validate]');\r\n let hasError = false;\r\n \r\n inputs.forEach(input => {\r\n const name = input.name || input.id;\r\n const rules = this.parseRules(input.getAttribute('data-validate'));\r\n const value = this.getValue(input);\r\n \r\n for (const [rule, params] of Object.entries(rules)) {\r\n const validatorFunc = this.customValidators[rule] || this.validators[rule];\r\n const isValid = validatorFunc?.(value, params);\r\n if (!isValid) {\r\n errors[name] = this.getErrorMessage(rule, params, input);\r\n this.showError(input, errors[name]);\r\n hasError = true;\r\n break;\r\n } else {\r\n this.clearError(input);\r\n }\r\n }\r\n });\r\n \r\n this.formStates[formId] = {\r\n valid: !hasError,\r\n errors: errors,\r\n errorCount: Object.keys(errors).length\r\n };\r\n \r\n this.updateFormState(form);\r\n \r\n return !hasError;\r\n }\r\n\r\n getValue(input) {\r\n if (input.classList.contains('ds-datepicker__input') || input.classList.contains('ds-timepicker__input')) {\r\n return input.value.trim();\r\n }\r\n \r\n if (input.closest('.ds-select')) {\r\n const select = input.closest('.ds-select');\r\n const valueEl = select.querySelector('.ds-select__value') || select.querySelector('.ds-select__trigger span');\r\n return valueEl ? valueEl.textContent.trim() : '';\r\n }\r\n \r\n if (input.closest('.ds-fileupload')) {\r\n const upload = input.closest('.ds-fileupload');\r\n const uploadInstance = upload.__fileUploadInstance;\r\n return uploadInstance && uploadInstance.getFiles().length > 0 ? 'has-files' : '';\r\n }\r\n \r\n return input.value.trim();\r\n }\r\n\r\n validateInput(input) {\r\n const rules = this.parseRules(input.getAttribute('data-validate'));\r\n const value = this.getValue(input);\r\n \r\n for (const [rule, params] of Object.entries(rules)) {\r\n const validatorFunc = this.customValidators[rule] || this.validators[rule];\r\n const isValid = validatorFunc?.(value, params);\r\n if (!isValid) {\r\n this.showError(input, this.getErrorMessage(rule, params, input));\r\n return false;\r\n }\r\n }\r\n \r\n this.clearError(input);\r\n return true;\r\n }\r\n\r\n validateAll() {\r\n const forms = document.querySelectorAll('form[data-validation]');\r\n let allValid = true;\r\n \r\n forms.forEach(form => {\r\n if (!this.validate(form)) {\r\n allValid = false;\r\n }\r\n });\r\n \r\n return allValid;\r\n }\r\n\r\n async validateAsync(form, options = {}) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n const errors = {};\r\n const group = options.group;\r\n const inputs = group \r\n ? form.querySelectorAll(`[data-validate][data-validate-group=\"${group}\"]`)\r\n : form.querySelectorAll('[data-validate]');\r\n \r\n let hasError = false;\r\n \r\n for (const input of inputs) {\r\n const isValid = await this.validateInputAsync(input);\r\n if (!isValid) {\r\n hasError = true;\r\n }\r\n }\r\n \r\n const formErrors = {};\r\n inputs.forEach(input => {\r\n const name = input.name || input.id;\r\n const errorElement = input.parentElement.querySelector('.ds-input__error');\r\n if (errorElement) {\r\n formErrors[name] = errorElement.textContent;\r\n }\r\n });\r\n \r\n this.formStates[formId] = {\r\n valid: !hasError,\r\n errors: formErrors,\r\n errorCount: Object.keys(formErrors).length\r\n };\r\n \r\n this.updateFormState(form);\r\n \r\n return !hasError;\r\n }\r\n\r\n async validateInputAsync(input) {\r\n const rules = this.parseRules(input.getAttribute('data-validate'));\r\n const asyncRules = this.parseRules(input.getAttribute('data-validate-async') || '');\r\n const value = this.getValue(input);\r\n \r\n for (const [rule, params] of Object.entries(rules)) {\r\n const validatorFunc = this.customValidators[rule] || this.validators[rule];\r\n const isValid = validatorFunc?.(value, params);\r\n if (!isValid) {\r\n this.showError(input, this.getErrorMessage(rule, params, input));\r\n return false;\r\n }\r\n }\r\n \r\n for (const [rule, params] of Object.entries(asyncRules)) {\r\n const validatorFunc = this.customAsyncValidators[rule] || this.asyncValidators[rule];\r\n if (validatorFunc) {\r\n try {\r\n const isValid = await validatorFunc(value, params, input);\r\n if (!isValid) {\r\n this.showError(input, this.getErrorMessage(rule, params, input));\r\n return false;\r\n }\r\n } catch (e) {\r\n this.showError(input, e.message || 'Validation error');\r\n return false;\r\n }\r\n }\r\n }\r\n \r\n this.clearError(input);\r\n return true;\r\n }\r\n\r\n async validateGroup(form, groupName) {\r\n const inputs = form.querySelectorAll(`[data-validate][data-validate-group=\"${groupName}\"]`);\r\n let hasError = false;\r\n \r\n for (const input of inputs) {\r\n const isValid = await this.validateInputAsync(input);\r\n if (!isValid) {\r\n hasError = true;\r\n }\r\n }\r\n \r\n return !hasError;\r\n }\r\n\r\n getGroups(form) {\r\n const groups = new Set();\r\n form.querySelectorAll('[data-validate-group]').forEach(input => {\r\n groups.add(input.getAttribute('data-validate-group'));\r\n });\r\n return Array.from(groups);\r\n }\r\n\r\n getFormState(form) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n return this.formStates[formId] || { valid: true, errors: {}, errorCount: 0, loading: false, submitting: false, disabled: false };\r\n }\r\n\r\n updateFormState(form) {\r\n const state = this.getFormState(form);\r\n \r\n if (state.valid) {\r\n form.classList.remove('ds-form--invalid');\r\n form.classList.add('ds-form--valid');\r\n } else {\r\n form.classList.remove('ds-form--valid');\r\n form.classList.add('ds-form--invalid');\r\n }\r\n \r\n if (state.loading) {\r\n form.classList.add('ds-form--loading');\r\n } else {\r\n form.classList.remove('ds-form--loading');\r\n }\r\n \r\n if (state.submitting) {\r\n form.classList.add('ds-form--submitting');\r\n } else {\r\n form.classList.remove('ds-form--submitting');\r\n }\r\n \r\n if (state.disabled) {\r\n form.classList.add('ds-form--disabled');\r\n form.querySelectorAll('input, select, textarea, button').forEach(el => el.disabled = true);\r\n } else {\r\n form.classList.remove('ds-form--disabled');\r\n form.querySelectorAll('input, select, textarea, button').forEach(el => {\r\n if (!el.hasAttribute('data-permanent-disabled')) {\r\n el.disabled = false;\r\n }\r\n });\r\n }\r\n \r\n const statusElement = form.querySelector('.ds-form__status');\r\n if (statusElement) {\r\n if (state.errorCount > 0) {\r\n statusElement.textContent = `${state.errorCount} ${state.errorCount === 1 ? 'error' : 'errors'} found`;\r\n statusElement.classList.add('ds-form__status--error');\r\n } else {\r\n statusElement.textContent = 'All fields are valid';\r\n statusElement.classList.remove('ds-form__status--error');\r\n }\r\n }\r\n }\r\n\r\n setFormLoading(form, loading) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n if (!this.formStates[formId]) {\r\n this.formStates[formId] = { valid: true, errors: {}, errorCount: 0, loading: false, submitting: false, disabled: false };\r\n }\r\n this.formStates[formId].loading = loading;\r\n this.updateFormState(form);\r\n }\r\n\r\n setFormSubmitting(form, submitting) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n if (!this.formStates[formId]) {\r\n this.formStates[formId] = { valid: true, errors: {}, errorCount: 0, loading: false, submitting: false, disabled: false };\r\n }\r\n this.formStates[formId].submitting = submitting;\r\n this.updateFormState(form);\r\n }\r\n\r\n setFormDisabled(form, disabled) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n if (!this.formStates[formId]) {\r\n this.formStates[formId] = { valid: true, errors: {}, errorCount: 0, loading: false, submitting: false, disabled: false };\r\n }\r\n this.formStates[formId].disabled = disabled;\r\n this.updateFormState(form);\r\n }\r\n\r\n resetForm(form) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n this.formStates[formId] = { valid: true, errors: {}, errorCount: 0, loading: false, submitting: false, disabled: false };\r\n form.reset();\r\n form.querySelectorAll('.ds-input--error').forEach(el => {\r\n el.classList.remove('ds-input--error');\r\n const errorElement = el.parentElement?.querySelector('.ds-input__error');\r\n if (errorElement) {\r\n errorElement.textContent = '';\r\n }\r\n });\r\n this.updateFormState(form);\r\n }\r\n\r\n parseRules(rulesString) {\r\n const rules = {};\r\n const parts = rulesString.split('|');\r\n \r\n parts.forEach(part => {\r\n const [rule, params] = part.split(':');\r\n rules[rule] = params ? params.split(',') : [];\r\n });\r\n \r\n return rules;\r\n }\r\n\r\n validateRequired(value) {\r\n return value !== '';\r\n }\r\n\r\n validateEmail(value) {\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n return emailRegex.test(value);\r\n }\r\n\r\n validateUrl(value) {\r\n const urlRegex = /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/;\r\n return urlRegex.test(value);\r\n }\r\n\r\n validateMinLength(value, [min]) {\r\n return value.length >= parseInt(min);\r\n }\r\n\r\n validateMaxLength(value, [max]) {\r\n return value.length <= parseInt(max);\r\n }\r\n\r\n validatePattern(value, [pattern]) {\r\n const regex = new RegExp(pattern);\r\n return regex.test(value);\r\n }\r\n\r\n validateMin(value, [min]) {\r\n return parseFloat(value) >= parseFloat(min);\r\n }\r\n\r\n validateMax(value, [max]) {\r\n return parseFloat(value) <= parseFloat(max);\r\n }\r\n\r\n validateEqualTo(value, [targetId]) {\r\n const target = document.getElementById(targetId);\r\n return target && value === target.value;\r\n }\r\n\r\n validatePhone(value) {\r\n const phoneRegex = /^[\\d\\s\\-\\+\\(\\)]{7,20}$/;\r\n return phoneRegex.test(value);\r\n }\r\n\r\n validateDate(value) {\r\n const dateRegex = /^\\d{4}[-/]\\d{2}[-/]\\d{2}$/;\r\n return dateRegex.test(value) && !isNaN(Date.parse(value));\r\n }\r\n\r\n validateNumber(value) {\r\n return !isNaN(parseFloat(value)) && isFinite(value);\r\n }\r\n\r\n showError(input, message) {\r\n input.classList.add('ds-input--error');\r\n input.classList.remove('ds-input--success');\r\n input.setAttribute('aria-invalid', 'true');\r\n \r\n let errorElement = input.parentElement.querySelector('.ds-input__error');\r\n if (!errorElement) {\r\n errorElement = document.createElement('span');\r\n errorElement.className = 'ds-input__error';\r\n errorElement.setAttribute('role', 'alert');\r\n errorElement.setAttribute('aria-live', 'polite');\r\n input.parentElement.appendChild(errorElement);\r\n }\r\n errorElement.textContent = message;\r\n \r\n this.removeStatusIcon(input);\r\n \r\n input.dispatchEvent(new CustomEvent('validation-error', { detail: { message } }));\r\n }\r\n\r\n clearError(input) {\r\n input.classList.remove('ds-input--error');\r\n input.setAttribute('aria-invalid', 'false');\r\n \r\n const errorElement = input.parentElement.querySelector('.ds-input__error');\r\n if (errorElement) {\r\n errorElement.remove();\r\n }\r\n \r\n input.dispatchEvent(new CustomEvent('validation-success'));\r\n }\r\n\r\n showSuccess(input) {\r\n input.classList.add('ds-input--success');\r\n input.classList.remove('ds-input--error');\r\n input.setAttribute('aria-invalid', 'false');\r\n \r\n this.removeStatusIcon(input);\r\n \r\n const icon = document.createElement('span');\r\n icon.className = 'ds-input__status-icon ds-input__status-icon--success';\r\n icon.innerHTML = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"20 6 9 17 4 12\"/></svg>';\r\n \r\n input.parentElement.appendChild(icon);\r\n }\r\n\r\n removeStatusIcon(input) {\r\n const icon = input.parentElement.querySelector('.ds-input__status-icon');\r\n if (icon) {\r\n icon.remove();\r\n }\r\n }\r\n\r\n getErrorMessage(rule, params, input) {\r\n const customMessage = input.getAttribute(`data-message-${rule}`);\r\n if (customMessage) return customMessage;\r\n \r\n const messages = {\r\n required: 'This field is required',\r\n email: 'Please enter a valid email address',\r\n url: 'Please enter a valid URL',\r\n minLength: `Minimum length is ${params[0]} characters`,\r\n maxLength: `Maximum length is ${params[0]} characters`,\r\n pattern: 'Please enter a valid value',\r\n min: `Minimum value is ${params[0]}`,\r\n max: `Maximum value is ${params[0]}`,\r\n equalTo: 'Values do not match',\r\n phone: 'Please enter a valid phone number',\r\n date: 'Please enter a valid date (YYYY-MM-DD)',\r\n number: 'Please enter a valid number'\r\n };\r\n return messages[rule] || 'Invalid input';\r\n }\r\n}\r\n\r\nconst validator = new KupolaValidator();\r\n\r\nif (!window.__kupolaValidationInitialized) {\r\n window.__kupolaValidationInitialized = true;\r\n document.addEventListener('DOMContentLoaded', () => {\r\n document.querySelectorAll('form[data-validation]').forEach(form => {\r\n form.addEventListener('submit', async (e) => {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n if (validator.submitting.has(formId)) {\r\n e.preventDefault();\r\n return;\r\n }\r\n \r\n e.preventDefault();\r\n \r\n const hasAsyncValidation = form.querySelector('[data-validate-async]') !== null;\r\n \r\n let isValid;\r\n if (hasAsyncValidation) {\r\n isValid = await validator.validateAsync(form);\r\n } else {\r\n isValid = validator.validate(form);\r\n }\r\n \r\n if (!isValid) {\r\n const firstError = form.querySelector('.ds-input--error');\r\n if (firstError) {\r\n firstError.focus();\r\n }\r\n } else {\r\n validator.submitting.add(formId);\r\n const submitBtn = form.querySelector('button[type=\"submit\"]');\r\n if (submitBtn) {\r\n const originalText = submitBtn.textContent;\r\n submitBtn.setAttribute('data-original-text', originalText);\r\n submitBtn.textContent = 'Submitting...';\r\n submitBtn.disabled = true;\r\n }\r\n \r\n try {\r\n const onSubmit = form.getAttribute('data-on-submit');\r\n if (onSubmit && window[onSubmit]) {\r\n await window[onSubmit](form);\r\n } else {\r\n form.submit();\r\n }\r\n } finally {\r\n validator.submitting.delete(formId);\r\n if (submitBtn) {\r\n submitBtn.textContent = submitBtn.getAttribute('data-original-text') || 'Submit';\r\n submitBtn.disabled = false;\r\n }\r\n }\r\n }\r\n });\r\n\r\n form.querySelectorAll('[data-validate]').forEach(input => {\r\n input.addEventListener('blur', () => {\r\n setTimeout(() => {\r\n const activeElement = document.activeElement;\r\n if (activeElement && activeElement.closest('.ds-select')) {\r\n return;\r\n }\r\n const isValid = validator.validateInput(input);\r\n if (isValid && input.value.trim()) {\r\n validator.showSuccess(input);\r\n }\r\n }, 50);\r\n });\r\n\r\n const debounce = (func, wait) => {\r\n let timeout;\r\n return (...args) => {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => func.apply(this, args), wait);\r\n };\r\n };\r\n\r\n const validateOnInput = debounce(() => {\r\n const value = validator.getValue(input);\r\n if (value.length > 0 || input.classList.contains('ds-input--error')) {\r\n const isValid = validator.validateInput(input);\r\n if (isValid && value) {\r\n validator.showSuccess(input);\r\n }\r\n } else {\r\n validator.removeStatusIcon(input);\r\n }\r\n }, 300);\r\n\r\n input.addEventListener('input', validateOnInput);\r\n\r\n input.addEventListener('keyup', (e) => {\r\n if (e.key === 'Enter') {\r\n const isValid = validator.validateInput(input);\r\n if (isValid && input.value.trim()) {\r\n validator.showSuccess(input);\r\n }\r\n }\r\n });\r\n });\r\n });\r\n});\r\n}\r\n\r\nexport { KupolaValidator, validator };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.KupolaValidator = KupolaValidator;\r\n window.kupolaValidator = validator;\r\n}","class VirtualList {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.data = options.data || [];\r\n this.itemHeight = options.itemHeight || 48;\r\n this.itemWidth = options.itemWidth || 200;\r\n this.bufferSize = options.bufferSize || 5;\r\n this.renderItem = options.renderItem || this.defaultRenderItem;\r\n this.onItemClick = options.onItemClick || null;\r\n this.onItemSelect = options.onItemSelect || null;\r\n this.onScroll = options.onScroll || null;\r\n this.onScrollEnd = options.onScrollEnd || null;\r\n this.selectedKey = options.selectedKey || null;\r\n this.keyField = options.keyField || 'id';\r\n this.useDynamicHeight = options.useDynamicHeight || false;\r\n this.dynamicHeightCache = new Map();\r\n this.estimatedHeight = options.estimatedHeight || 48;\r\n \r\n this.container = null;\r\n this.scrollbarTrack = null;\r\n this.scrollbarThumb = null;\r\n this.totalHeight = 0;\r\n this.startIndex = 0;\r\n this.endIndex = 0;\r\n this.isScrolling = false;\r\n this.scrollTimeout = null;\r\n this.lastScrollTop = 0;\r\n this.lastScrollLeft = 0;\r\n \r\n this.init();\r\n }\r\n\r\n defaultRenderItem(item, index) {\r\n return `\r\n <div class=\"ds-virtual-list__item-content\">\r\n <div class=\"ds-virtual-list__item-icon\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/>\r\n <polyline points=\"14 2 14 8 20 8\"/>\r\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"/>\r\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"/>\r\n <polyline points=\"10 9 9 9 8 9\"/>\r\n </svg>\r\n </div>\r\n <div>\r\n <div class=\"ds-virtual-list__item-title\">${item.title || item.name || `Item ${index + 1}`}</div>\r\n <div class=\"ds-virtual-list__item-subtitle\">${item.subtitle || 'Subtitle'}</div>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n\r\n init() {\r\n this.createStructure();\r\n this.update();\r\n this.bindEvents();\r\n }\r\n\r\n createStructure() {\r\n this.element.innerHTML = `\r\n <div class=\"ds-virtual-list__scrollbar\">\r\n <div class=\"ds-virtual-list__scrollbar-track\">\r\n <div class=\"ds-virtual-list__scrollbar-thumb\"></div>\r\n </div>\r\n </div>\r\n <div class=\"ds-virtual-list__container\"></div>\r\n `;\r\n \r\n this.container = this.element.querySelector('.ds-virtual-list__container');\r\n this.scrollbarThumb = this.element.querySelector('.ds-virtual-list__scrollbar-thumb');\r\n }\r\n\r\n bindEvents() {\r\n this._scrollHandler = (e) => this.handleScroll(e);\r\n this._thumbDragStartHandler = (e) => this.handleThumbDragStart(e);\r\n this._thumbDragMoveHandler = (e) => this.handleThumbDragMove(e);\r\n this._thumbDragEndHandler = () => this.handleThumbDragEnd();\r\n this._wheelHandler = (e) => {\r\n e.preventDefault();\r\n \r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n \r\n if (isHorizontal) {\r\n this.element.scrollLeft += e.deltaX + e.deltaY;\r\n } else {\r\n this.element.scrollTop += e.deltaY + e.deltaX;\r\n }\r\n };\r\n \r\n this.element.addEventListener('scroll', this._scrollHandler);\r\n this.scrollbarThumb.addEventListener('mousedown', this._thumbDragStartHandler);\r\n \r\n document.addEventListener('mousemove', this._thumbDragMoveHandler);\r\n document.addEventListener('mouseup', this._thumbDragEndHandler);\r\n \r\n this.element.addEventListener('wheel', this._wheelHandler, { passive: false });\r\n \r\n this._listeners = [\r\n { el: this.element, event: 'scroll', handler: this._scrollHandler },\r\n { el: this.scrollbarThumb, event: 'mousedown', handler: this._thumbDragStartHandler },\r\n { el: document, event: 'mousemove', handler: this._thumbDragMoveHandler },\r\n { el: document, event: 'mouseup', handler: this._thumbDragEndHandler },\r\n { el: this.element, event: 'wheel', handler: this._wheelHandler }\r\n ];\r\n }\r\n\r\n handleScroll(e) {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const scrollOffset = isHorizontal ? this.element.scrollLeft : this.element.scrollTop;\r\n \r\n if (this.onScroll) {\r\n this.onScroll({ \r\n scrollOffset, \r\n isHorizontal,\r\n dataLength: this.data.length,\r\n startIndex: this.startIndex,\r\n endIndex: this.endIndex\r\n });\r\n }\r\n \r\n this.updateScrollState();\r\n this.renderVisibleItems();\r\n this.updateScrollbar();\r\n }\r\n\r\n updateScrollState() {\r\n this.isScrolling = true;\r\n this.element.classList.add('ds-virtual-list--scrolling');\r\n \r\n if (this.scrollTimeout) {\r\n clearTimeout(this.scrollTimeout);\r\n }\r\n \r\n this.scrollTimeout = setTimeout(() => {\r\n this.isScrolling = false;\r\n this.element.classList.remove('ds-virtual-list--scrolling');\r\n \r\n if (this.onScrollEnd) {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const scrollOffset = isHorizontal ? this.element.scrollLeft : this.element.scrollTop;\r\n this.onScrollEnd({ \r\n scrollOffset, \r\n isHorizontal,\r\n dataLength: this.data.length,\r\n startIndex: this.startIndex,\r\n endIndex: this.endIndex\r\n });\r\n }\r\n }, 200);\r\n }\r\n\r\n getItemSize(index) {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n \r\n if (this.useDynamicHeight) {\r\n const key = this.data[index][this.keyField] || index;\r\n if (this.dynamicHeightCache.has(key)) {\r\n return this.dynamicHeightCache.get(key);\r\n }\r\n }\r\n \r\n return isHorizontal ? this.itemWidth : this.itemHeight;\r\n }\r\n\r\n getItemPositions() {\r\n const positions = [];\r\n let currentPosition = 0;\r\n \r\n this.data.forEach((item, index) => {\r\n const size = this.getItemSize(index);\r\n positions.push({\r\n start: currentPosition,\r\n end: currentPosition + size,\r\n size\r\n });\r\n currentPosition += size;\r\n });\r\n \r\n return positions;\r\n }\r\n\r\n getTotalSize() {\r\n if (this.useDynamicHeight) {\r\n return this.data.reduce((total, item, index) => {\r\n return total + this.getItemSize(index);\r\n }, 0);\r\n }\r\n \r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const itemSize = isHorizontal ? this.itemWidth : this.itemHeight;\r\n return this.data.length * itemSize;\r\n }\r\n\r\n getIndexAtOffset(offset) {\r\n if (this.useDynamicHeight) {\r\n const positions = this.getItemPositions();\r\n for (let i = 0; i < positions.length; i++) {\r\n if (offset >= positions[i].start && offset < positions[i].end) {\r\n return i;\r\n }\r\n }\r\n return this.data.length - 1;\r\n }\r\n \r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const itemSize = isHorizontal ? this.itemWidth : this.itemHeight;\r\n return Math.floor(offset / itemSize);\r\n }\r\n\r\n renderVisibleItems() {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const scrollOffset = isHorizontal ? this.element.scrollLeft : this.element.scrollTop;\r\n const viewportSize = isHorizontal ? this.element.clientWidth : this.element.clientHeight;\r\n \r\n const startIndex = Math.max(0, this.getIndexAtOffset(scrollOffset) - this.bufferSize);\r\n let endIndex = Math.min(\r\n this.data.length - 1,\r\n this.getIndexAtOffset(scrollOffset + viewportSize) + this.bufferSize\r\n );\r\n \r\n if (endIndex < startIndex) endIndex = startIndex;\r\n \r\n this.startIndex = startIndex;\r\n this.endIndex = endIndex;\r\n \r\n const visibleData = this.data.slice(startIndex, endIndex + 1);\r\n \r\n let html = '';\r\n let currentPosition = 0;\r\n \r\n if (this.useDynamicHeight) {\r\n const positions = this.getItemPositions();\r\n currentPosition = positions[startIndex]?.start || 0;\r\n } else {\r\n const itemSize = isHorizontal ? this.itemWidth : this.itemHeight;\r\n currentPosition = startIndex * itemSize;\r\n }\r\n \r\n visibleData.forEach((item, i) => {\r\n const actualIndex = startIndex + i;\r\n const key = item[this.keyField] || actualIndex;\r\n const isSelected = this.selectedKey === key;\r\n const itemSize = this.getItemSize(actualIndex);\r\n const position = currentPosition;\r\n \r\n if (isHorizontal) {\r\n html += `\r\n <div \r\n class=\"ds-virtual-list__item${isSelected ? ' is-selected' : ''}\" \r\n style=\"position: absolute; top: 0; left: ${position}px; width: ${itemSize}px; height: 100%;\"\r\n data-index=\"${actualIndex}\"\r\n data-key=\"${key}\"\r\n >\r\n ${this.renderItem(item, actualIndex)}\r\n </div>\r\n `;\r\n } else {\r\n html += `\r\n <div \r\n class=\"ds-virtual-list__item${isSelected ? ' is-selected' : ''}\" \r\n style=\"position: absolute; top: ${position}px; left: 0; right: 0; height: ${itemSize}px;\"\r\n data-index=\"${actualIndex}\"\r\n data-key=\"${key}\"\r\n >\r\n ${this.renderItem(item, actualIndex)}\r\n </div>\r\n `;\r\n }\r\n \r\n currentPosition += itemSize;\r\n });\r\n \r\n this.container.innerHTML = html;\r\n \r\n if (this.useDynamicHeight) {\r\n this.updateDynamicHeights();\r\n }\r\n \r\n this.container.querySelectorAll('.ds-virtual-list__item').forEach(item => {\r\n item.addEventListener('click', () => this.handleItemClick(item));\r\n });\r\n }\r\n\r\n updateDynamicHeights() {\r\n if (this.isUpdating) return;\r\n \r\n let hasChanges = false;\r\n this.container.querySelectorAll('.ds-virtual-list__item').forEach(item => {\r\n const index = parseInt(item.dataset.index);\r\n const key = this.data[index][this.keyField] || index;\r\n const actualHeight = item.offsetHeight;\r\n \r\n if (actualHeight !== this.getItemSize(index)) {\r\n this.dynamicHeightCache.set(key, actualHeight);\r\n hasChanges = true;\r\n }\r\n });\r\n \r\n if (hasChanges) {\r\n this.isUpdating = true;\r\n this.update();\r\n this.isUpdating = false;\r\n }\r\n }\r\n\r\n handleItemClick(item) {\r\n const index = parseInt(item.dataset.index);\r\n const key = item.dataset.key;\r\n const dataItem = this.data[index];\r\n \r\n if (this.onItemClick) {\r\n this.onItemClick({ item: dataItem, index, key });\r\n }\r\n \r\n if (this.onItemSelect) {\r\n this.select(key);\r\n }\r\n }\r\n\r\n select(key) {\r\n this.selectedKey = key;\r\n \r\n if (this.onItemSelect) {\r\n const index = this.data.findIndex(item => item[this.keyField] === key);\r\n if (index !== -1) {\r\n this.onItemSelect({ item: this.data[index], index, key });\r\n }\r\n }\r\n \r\n this.renderVisibleItems();\r\n }\r\n\r\n updateScrollbar() {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const totalSize = this.getTotalSize();\r\n const viewportSize = isHorizontal ? this.element.clientWidth : this.element.clientHeight;\r\n const scrollOffset = isHorizontal ? this.element.scrollLeft : this.element.scrollTop;\r\n \r\n if (isHorizontal) {\r\n this.scrollbarThumb.style.display = 'none';\r\n return;\r\n }\r\n \r\n const thumbHeight = Math.max(20, (viewportSize / totalSize) * viewportSize);\r\n const maxTop = viewportSize - thumbHeight;\r\n const thumbTop = (scrollOffset / (totalSize - viewportSize || 1)) * maxTop;\r\n \r\n this.scrollbarThumb.style.height = thumbHeight + 'px';\r\n this.scrollbarThumb.style.top = thumbTop + 'px';\r\n }\r\n\r\n handleThumbDragStart(e) {\r\n e.preventDefault();\r\n this.isDragging = true;\r\n this.dragStartY = e.clientY;\r\n this.dragStartTop = parseFloat(this.scrollbarThumb.style.top) || 0;\r\n }\r\n\r\n handleThumbDragMove(e) {\r\n if (!this.isDragging) return;\r\n \r\n const viewportHeight = this.element.clientHeight;\r\n const totalHeight = this.getTotalSize();\r\n const thumbHeight = parseFloat(this.scrollbarThumb.style.height) || viewportHeight;\r\n const maxTop = viewportHeight - thumbHeight;\r\n \r\n const deltaY = e.clientY - this.dragStartY;\r\n let newTop = this.dragStartTop + deltaY;\r\n newTop = Math.max(0, Math.min(newTop, maxTop));\r\n \r\n this.scrollbarThumb.style.top = newTop + 'px';\r\n \r\n const scrollTop = (newTop / maxTop) * (totalHeight - viewportHeight || 0);\r\n this.element.scrollTop = scrollTop;\r\n }\r\n\r\n handleThumbDragEnd() {\r\n this.isDragging = false;\r\n }\r\n\r\n update() {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const totalSize = this.getTotalSize();\r\n \r\n if (isHorizontal) {\r\n this.container.style.width = totalSize + 'px';\r\n this.container.style.height = '100%';\r\n } else {\r\n this.container.style.height = totalSize + 'px';\r\n this.container.style.width = '100%';\r\n }\r\n \r\n this.renderVisibleItems();\r\n this.updateScrollbar();\r\n }\r\n\r\n setData(data) {\r\n this.data = data;\r\n if (this.useDynamicHeight) {\r\n this.dynamicHeightCache.clear();\r\n }\r\n this.update();\r\n }\r\n\r\n addItem(item) {\r\n this.data.push(item);\r\n this.update();\r\n }\r\n\r\n removeItem(index) {\r\n this.data.splice(index, 1);\r\n if (this.useDynamicHeight) {\r\n this.dynamicHeightCache.clear();\r\n }\r\n this.update();\r\n }\r\n\r\n insertItem(index, item) {\r\n this.data.splice(index, 0, item);\r\n if (this.useDynamicHeight) {\r\n this.dynamicHeightCache.clear();\r\n }\r\n this.update();\r\n }\r\n\r\n scrollTo(index, behavior = 'smooth') {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n \r\n let scrollOffset = 0;\r\n if (this.useDynamicHeight) {\r\n const positions = this.getItemPositions();\r\n scrollOffset = positions[index]?.start || 0;\r\n } else {\r\n const itemSize = isHorizontal ? this.itemWidth : this.itemHeight;\r\n scrollOffset = index * itemSize;\r\n }\r\n \r\n if (isHorizontal) {\r\n this.element.scrollTo({ left: scrollOffset, behavior });\r\n } else {\r\n this.element.scrollTo({ top: scrollOffset, behavior });\r\n }\r\n }\r\n\r\n scrollToKey(key, behavior = 'smooth') {\r\n const index = this.data.findIndex(item => item[this.keyField] === key);\r\n if (index !== -1) {\r\n this.scrollTo(index, behavior);\r\n }\r\n }\r\n\r\n scrollToTop(behavior = 'smooth') {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n this.element.scrollTo({ [isHorizontal ? 'left' : 'top']: 0, behavior });\r\n }\r\n\r\n scrollToBottom(behavior = 'smooth') {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const totalSize = this.getTotalSize();\r\n const viewportSize = isHorizontal ? this.element.clientWidth : this.element.clientHeight;\r\n this.element.scrollTo({ [isHorizontal ? 'left' : 'top']: totalSize - viewportSize, behavior });\r\n }\r\n\r\n getVisibleItems() {\r\n return this.data.slice(this.startIndex, this.endIndex + 1).map((item, i) => ({\r\n item,\r\n index: this.startIndex + i,\r\n key: item[this.keyField] || this.startIndex + i\r\n }));\r\n }\r\n\r\n getItemIndex(key) {\r\n return this.data.findIndex(item => item[this.keyField] === key);\r\n }\r\n\r\n getItem(key) {\r\n const index = this.getItemIndex(key);\r\n return index !== -1 ? this.data[index] : null;\r\n }\r\n\r\n refreshCache() {\r\n this.dynamicHeightCache.clear();\r\n this.update();\r\n }\r\n\r\n destroy() {\r\n if (this.scrollTimeout) {\r\n clearTimeout(this.scrollTimeout);\r\n }\r\n \r\n this._listeners?.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n \r\n this.data = [];\r\n this.dynamicHeightCache.clear();\r\n this.container.innerHTML = '';\r\n \r\n this._listeners = null;\r\n this._scrollHandler = null;\r\n this._thumbDragStartHandler = null;\r\n this._thumbDragMoveHandler = null;\r\n this._thumbDragEndHandler = null;\r\n this._wheelHandler = null;\r\n this.container = null;\r\n this.scrollbarThumb = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction generateMockVirtualListData(count = 1000) {\r\n const data = [];\r\n const titles = ['Document', 'Image', 'Video', 'Folder', 'Archive', 'Spreadsheet', 'Presentation', 'Code'];\r\n \r\n for (let i = 1; i <= count; i++) {\r\n const titleIndex = Math.floor(Math.random() * titles.length);\r\n const randomNum = Math.floor(Math.random() * 10000);\r\n \r\n data.push({\r\n id: i,\r\n title: `${titles[titleIndex]} ${randomNum}`,\r\n subtitle: `Last modified ${Math.floor(Math.random() * 30)} days ago`,\r\n type: titles[titleIndex].toLowerCase()\r\n });\r\n }\r\n \r\n return data;\r\n}\r\n\r\nfunction createVirtualList(selector, options = {}) {\r\n const element = document.querySelector(selector);\r\n if (element) {\r\n const data = options.data || generateMockVirtualListData(options.count || 1000);\r\n return new VirtualList(element, {\r\n data: data,\r\n ...options\r\n });\r\n }\r\n return null;\r\n}\r\n\r\nfunction initVirtualList(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const dataAttr = element.getAttribute('data-virtual-list');\r\n let data = [];\r\n \r\n if (dataAttr) {\r\n try {\r\n data = JSON.parse(dataAttr);\r\n } catch (e) {\r\n data = generateMockVirtualListData(1000);\r\n }\r\n } else {\r\n data = generateMockVirtualListData(1000);\r\n }\r\n \r\n const instance = new VirtualList(element, {\r\n data: data,\r\n onItemClick: (info) => {},\r\n onItemSelect: (info) => {}\r\n });\r\n \r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupVirtualList(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initVirtualLists() {\r\n document.querySelectorAll('.ds-virtual-list').forEach(element => {\r\n initVirtualList(element);\r\n });\r\n}\r\n\r\nexport { VirtualList, initVirtualLists, initVirtualList, cleanupVirtualList, createVirtualList, generateMockVirtualListData };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.VirtualList = VirtualList;\r\n window.initVirtualList = initVirtualList;\r\n window.cleanupVirtualList = cleanupVirtualList;\r\n window.initVirtualLists = initVirtualLists;\r\n window.createVirtualList = createVirtualList;\r\n window.generateMockVirtualListData = generateMockVirtualListData;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('virtual-list', initVirtualList, cleanupVirtualList);\r\n }\r\n}","const ATTRS = 'xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"butt\" stroke-linejoin=\"miter\"';\r\n\r\nconst PATHS = {\r\n 'globe': '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M2 12h20\"/><path d=\"M12 2a15.3 15.3 0 0 1 0 20\"/><path d=\"M12 2a15.3 15.3 0 0 0 0 20\"/>',\r\n 'dashboard': '<rect x=\"3\" y=\"3\" width=\"7\" height=\"9\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"5\"/><rect x=\"14\" y=\"12\" width=\"7\" height=\"9\"/><rect x=\"3\" y=\"16\" width=\"7\" height=\"5\"/>',\r\n 'mouse': '<rect x=\"6\" y=\"2\" width=\"12\" height=\"20\" rx=\"6\"/><line x1=\"12\" y1=\"6\" x2=\"12\" y2=\"11\"/>',\r\n 'search': '<circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"m20 20-3.5-3.5\"/>',\r\n 'square': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/>',\r\n 'circle': '<circle cx=\"12\" cy=\"12\" r=\"9\"/>',\r\n 'list': '<line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"/><line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"/>',\r\n 'palette': '<rect x=\"3\" y=\"3\" width=\"8\" height=\"8\"/><rect x=\"13\" y=\"3\" width=\"8\" height=\"8\"/><rect x=\"3\" y=\"13\" width=\"8\" height=\"8\"/><rect x=\"13\" y=\"13\" width=\"8\" height=\"8\"/>',\r\n 'type': '<polyline points=\"4 7 4 4 20 4 20 7\"/><line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\"/><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\"/>',\r\n 'ruler': '<rect x=\"3\" y=\"9\" width=\"18\" height=\"6\" transform=\"rotate(-45 12 12)\"/><line x1=\"7.5\" y1=\"12.5\" x2=\"9\" y2=\"14\"/><line x1=\"11\" y1=\"9\" x2=\"12.5\" y2=\"10.5\"/><line x1=\"14.5\" y1=\"5.5\" x2=\"16\" y2=\"7\"/>',\r\n 'sparkles': '<path d=\"M12 3l1.8 4.2L18 9l-4.2 1.8L12 15l-1.8-4.2L6 9l4.2-1.8L12 3z\"/><path d=\"M19 14l1 2.2 2.2 1-2.2 1L19 20.4l-1-2.2-2.2-1 2.2-1L19 14z\"/>',\r\n 'copy': '<rect x=\"8\" y=\"8\" width=\"13\" height=\"13\"/><path d=\"M16 8V4H4v13h4\"/>',\r\n 'download': '<path d=\"M12 3v12\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"21\"/>',\r\n 'refresh': '<polyline points=\"21 4 21 10 15 10\"/><polyline points=\"3 20 3 14 9 14\"/><path d=\"M20.5 9A9 9 0 0 0 5 5.5L3 7M3.5 15A9 9 0 0 0 19 18.5L21 17\"/>',\r\n 'external': '<polyline points=\"14 4 20 4 20 10\"/><line x1=\"20\" y1=\"4\" x2=\"11\" y2=\"13\"/><path d=\"M20 14v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h5\"/>',\r\n 'settings': '<circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z\"/>',\r\n 'sliders': '<line x1=\"4\" y1=\"21\" x2=\"4\" y2=\"14\"/><line x1=\"4\" y1=\"10\" x2=\"4\" y2=\"3\"/><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"3\"/><line x1=\"20\" y1=\"21\" x2=\"20\" y2=\"16\"/><line x1=\"20\" y1=\"12\" x2=\"20\" y2=\"3\"/><line x1=\"1\" y1=\"14\" x2=\"7\" y2=\"14\"/><line x1=\"9\" y1=\"8\" x2=\"15\" y2=\"8\"/><line x1=\"17\" y1=\"16\" x2=\"23\" y2=\"16\"/>',\r\n 'plus': '<line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>',\r\n 'minus': '<line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>',\r\n 'x': '<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>',\r\n 'github': '<path d=\"M9 19c-4.3 1.4-4.3-2.5-6-3m12 5v-3.5c0-1 .1-1.4-.5-2 2.8-.3 5.5-1.4 5.5-6a4.6 4.6 0 0 0-1.3-3.2 4.2 4.2 0 0 0-.1-3.2s-1.1-.3-3.5 1.3a12 12 0 0 0-6.2 0C6.5 2.8 5.4 3.1 5.4 3.1a4.2 4.2 0 0 0-.1 3.2A4.6 4.6 0 0 0 4 9.5c0 4.6 2.7 5.7 5.5 6-.6.6-.6 1.2-.5 2V21\"/>',\r\n 'message-circle':'<path d=\"M21 12a9 9 0 0 1-13.5 7.8L3 21l1.2-4.5A9 9 0 1 1 21 12z\"/>',\r\n 'message-plus':'<path d=\"M21 12a9 9 0 0 1-13.5 7.8L3 21l1.2-4.5A9 9 0 1 1 21 12z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"15\"/><line x1=\"9\" y1=\"12\" x2=\"15\" y2=\"12\"/>',\r\n 'gear': '<path d=\"M9.3 5.7 6.375 5.025 5.025 6.375 5.7 9.3 3 11.1 3 12.9 5.7 14.7 5.025 17.625 6.375 18.975 9.3 18.3 11.1 21 12.9 21 14.7 18.3 17.625 18.975 18.975 17.625 18.3 14.7 21 12.9 21 11.1 18.3 9.3 18.975 6.375 17.625 5.025 14.7 5.7 12.9 3 11.1 3 9.3 5.7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>',\r\n 'user-circle': '<circle cx=\"12\" cy=\"12\" r=\"9\"/><circle cx=\"12\" cy=\"10\" r=\"2.5\"/><path d=\"M7 17.5a5 5 0 0 1 10 0\"/>',\r\n 'shield': '<path d=\"M12 3 4 6v6c0 5 3.5 8 8 9 4.5-1 8-4 8-9V6z\"/>',\r\n 'check': '<polyline points=\"4 12 10 18 20 6\"/>',\r\n 'arrow-right': '<line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><polyline points=\"14 6 20 12 14 18\"/>',\r\n 'arrow-up-right': '<line x1=\"6\" y1=\"18\" x2=\"18\" y2=\"6\"/><polyline points=\"9 6 18 6 18 15\"/>',\r\n 'chevron-right':'<polyline points=\"9 6 15 12 9 18\"/>',\r\n 'chevron-down':'<polyline points=\"6 9 12 15 18 9\"/>',\r\n 'check-circle':'<circle cx=\"12\" cy=\"12\" r=\"9\"/><polyline points=\"8 12 11 15 16 9\"/>',\r\n 'alert-circle':'<circle cx=\"12\" cy=\"12\" r=\"9\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"16.01\"/>',\r\n 'alert-triangle':'<path d=\"M12 3 22 20 2 20 Z\"/><line x1=\"12\" y1=\"10\" x2=\"12\" y2=\"15\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"18.01\"/>',\r\n 'info-circle': '<circle cx=\"12\" cy=\"12\" r=\"9\"/><line x1=\"12\" y1=\"11\" x2=\"12\" y2=\"16\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"8.01\"/>',\r\n 'x-circle': '<circle cx=\"12\" cy=\"12\" r=\"9\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/>',\r\n 'alert': '<path d=\"M12 3 22 20 2 20 Z\"/><line x1=\"12\" y1=\"10\" x2=\"12\" y2=\"15\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"18.01\"/>',\r\n 'info': '<circle cx=\"12\" cy=\"12\" r=\"9\"/><line x1=\"12\" y1=\"11\" x2=\"12\" y2=\"16\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"8.01\"/>',\r\n 'mail': '<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\"/><polyline points=\"3 6 12 13 21 6\"/>',\r\n 'user': '<path d=\"M4 21v-1a6 6 0 0 1 6-6h4a6 6 0 0 1 6 6v1\"/><circle cx=\"12\" cy=\"8\" r=\"4\"/>',\r\n 'users': '<path d=\"M2 21v-1a5 5 0 0 1 5-5h3a5 5 0 0 1 5 5v1\"/><circle cx=\"8.5\" cy=\"8\" r=\"3.5\"/><path d=\"M22 21v-1a5 5 0 0 0-4-4.9\"/><path d=\"M16 3.1A4 4 0 0 1 16 11\"/>',\r\n 'box': '<polyline points=\"3 7 12 2 21 7 21 17 12 22 3 17 3 7\"/><line x1=\"3\" y1=\"7\" x2=\"12\" y2=\"12\"/><line x1=\"21\" y1=\"7\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"22\" x2=\"12\" y2=\"12\"/>',\r\n 'zap': '<polygon points=\"13 2 4 14 12 14 11 22 20 10 12 10 13 2\"/>',\r\n 'moon': '<path d=\"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z\"/>',\r\n 'sun': '<circle cx=\"12\" cy=\"12\" r=\"4\"/><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"5\"/><line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"22\"/><line x1=\"2\" y1=\"12\" x2=\"5\" y2=\"12\"/><line x1=\"19\" y1=\"12\" x2=\"22\" y2=\"12\"/><line x1=\"4.6\" y1=\"4.6\" x2=\"6.7\" y2=\"6.7\"/><line x1=\"17.3\" y1=\"17.3\" x2=\"19.4\" y2=\"19.4\"/><line x1=\"4.6\" y1=\"19.4\" x2=\"6.7\" y2=\"17.3\"/><line x1=\"17.3\" y1=\"6.7\" x2=\"19.4\" y2=\"4.6\"/>',\r\n 'cmd': '<path d=\"M9 6h6v12H9z\"/><rect x=\"3\" y=\"3\" width=\"6\" height=\"6\"/><rect x=\"15\" y=\"3\" width=\"6\" height=\"6\"/><rect x=\"3\" y=\"15\" width=\"6\" height=\"6\"/><rect x=\"15\" y=\"15\" width=\"6\" height=\"6\"/>',\r\n 'key': '<circle cx=\"7.5\" cy=\"14.5\" r=\"3.5\"/><line x1=\"10\" y1=\"12\" x2=\"22\" y2=\"12\"/><line x1=\"22\" y1=\"12\" x2=\"22\" y2=\"16\"/><line x1=\"18\" y1=\"12\" x2=\"18\" y2=\"15\"/>',\r\n 'bell': '<path d=\"M6 8a6 6 0 0 1 12 0c0 7 3 8 3 8H3s3-1 3-8z\"/><path d=\"M10 21a2 2 0 0 0 4 0\"/>',\r\n 'arrow-up': '<line x1=\"12\" y1=\"20\" x2=\"12\" y2=\"4\"/><polyline points=\"6 10 12 4 18 10\"/>',\r\n 'chevron-up': '<polyline points=\"6 15 12 9 18 15\"/>',\r\n 'arrow-left': '<line x1=\"20\" y1=\"12\" x2=\"4\" y2=\"12\"/><polyline points=\"10 6 4 12 10 18\"/>',\r\n 'mic': '<rect x=\"9\" y=\"3\" width=\"6\" height=\"12\" rx=\"3\"/><path d=\"M5 11a7 7 0 0 0 14 0\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"22\"/>',\r\n 'at': '<circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8\"/>',\r\n 'hash': '<line x1=\"4\" y1=\"9\" x2=\"20\" y2=\"9\"/><line x1=\"4\" y1=\"15\" x2=\"20\" y2=\"15\"/><line x1=\"10\" y1=\"3\" x2=\"8\" y2=\"21\"/><line x1=\"16\" y1=\"3\" x2=\"14\" y2=\"21\"/>',\r\n 'sidebar-left': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"/>',\r\n 'sidebar-right': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\"/>',\r\n 'panel-bottom': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\"/>',\r\n 'git': '<circle cx=\"6\" cy=\"5\" r=\"3\"/><circle cx=\"6\" cy=\"19\" r=\"3\"/><circle cx=\"18\" cy=\"5\" r=\"3\"/><line x1=\"6\" y1=\"8\" x2=\"6\" y2=\"16\"/><path d=\"M18 8v3a4 4 0 0 1-4 4h-4\"/>',\r\n 'bug': '<rect x=\"8\" y=\"6\" width=\"8\" height=\"14\" rx=\"4\"/><line x1=\"12\" y1=\"11\" x2=\"12\" y2=\"20\"/><line x1=\"3\" y1=\"9\" x2=\"8\" y2=\"9\"/><line x1=\"3\" y1=\"14\" x2=\"8\" y2=\"14\"/><line x1=\"3\" y1=\"19\" x2=\"8\" y2=\"19\"/><line x1=\"16\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"16\" y1=\"14\" x2=\"21\" y2=\"14\"/><line x1=\"16\" y1=\"19\" x2=\"21\" y2=\"19\"/><line x1=\"9\" y1=\"6\" x2=\"9\" y2=\"3\"/><line x1=\"15\" y1=\"6\" x2=\"15\" y2=\"3\"/>',\r\n 'search-menu': '<circle cx=\"11\" cy=\"11\" r=\"6\"/><line x1=\"20\" y1=\"20\" x2=\"16\" y2=\"16\"/><line x1=\"3\" y1=\"20\" x2=\"13\" y2=\"20\"/>',\r\n 'extensions': '<rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"/><path d=\"M17.5 14v3.5H21a2 2 0 0 1 0 4h-3.5V21a2 2 0 0 1-4 0v-3.5H14a2 2 0 0 1 0-4h3.5z\"/>',\r\n 'wrench': '<path d=\"M14.7 6.3a4 4 0 0 0 5 5L21 12.5l-7.5 7.5a3 3 0 0 1-4.2-4.2L16.7 8 14.7 6.3z\"/><path d=\"M14.7 6.3 12 9l-3-3 2.7-2.7a4 4 0 0 1 3 3z\"/>',\r\n 'message-square': '<path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/>',\r\n 'file-text': '<path d=\"M14 3H6v18h12V8z\"/><polyline points=\"14 3 14 8 18 8\"/><line x1=\"9\" y1=\"13\" x2=\"15\" y2=\"13\"/><line x1=\"9\" y1=\"17\" x2=\"15\" y2=\"17\"/>',\r\n 'scroll-text': '<path d=\"M5 4h11a3 3 0 0 1 3 3v10H8v3a1 1 0 0 1-1 1 3 3 0 0 1-3-3V7a3 3 0 0 1 1-3z\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"9\"/><line x1=\"9\" y1=\"13\" x2=\"15\" y2=\"13\"/>',\r\n 'atom': '<circle cx=\"12\" cy=\"12\" r=\"2\"/><ellipse cx=\"12\" cy=\"12\" rx=\"10\" ry=\"4\"/><ellipse cx=\"12\" cy=\"12\" rx=\"10\" ry=\"4\" transform=\"rotate(60 12 12)\"/><ellipse cx=\"12\" cy=\"12\" rx=\"10\" ry=\"4\" transform=\"rotate(120 12 12)\"/>',\r\n 'arrow-right-to-line': '<line x1=\"20\" y1=\"4\" x2=\"20\" y2=\"20\"/><line x1=\"3\" y1=\"12\" x2=\"17\" y2=\"12\"/><polyline points=\"11 6 17 12 11 18\"/>',\r\n 'info-square': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"12\" y1=\"11\" x2=\"12\" y2=\"16\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"8.01\"/>',\r\n 'arrow-minimize': '<polyline points=\"20 4 14 10 20 10\"/><line x1=\"14\" y1=\"10\" x2=\"14\" y2=\"4\"/><polyline points=\"4 20 10 14 4 14\"/><line x1=\"10\" y1=\"14\" x2=\"10\" y2=\"20\"/>',\r\n 'arrow-expand': '<polyline points=\"14 4 20 4 20 10\"/><line x1=\"14\" y1=\"10\" x2=\"20\" y2=\"4\"/><polyline points=\"10 20 4 20 4 14\"/><line x1=\"10\" y1=\"14\" x2=\"4\" y2=\"20\"/>',\r\n 'arrow-down': '<line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\"/><polyline points=\"6 14 12 20 18 14\"/>',\r\n 'logo': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"/>',\r\n 'more-h': '<circle cx=\"5\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"19\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/>',\r\n 'edit': '<path d=\"M4 20h4l10-10-4-4L4 16v4z\"/><path d=\"M14 6l4 4\"/>',\r\n 'trash': '<polyline points=\"4 6 20 6\"/><path d=\"M6 6v14h12V6\"/><path d=\"M9 6V4h6v2\"/><line x1=\"10\" y1=\"10\" x2=\"10\" y2=\"17\"/><line x1=\"14\" y1=\"10\" x2=\"14\" y2=\"17\"/>',\r\n 'file': '<path d=\"M14 3H6v18h12V7z\"/><polyline points=\"14 3 14 7 18 7\"/>',\r\n 'files': '<path d=\"M21 8v13H8V3h8z\"/><polyline points=\"16 3 16 8 21 8\"/><path d=\"M8 7H3v14h13v-3\"/>',\r\n 'grid-2x2': '<rect x=\"3\" y=\"3\" width=\"8\" height=\"8\"/><rect x=\"13\" y=\"3\" width=\"8\" height=\"8\"/><rect x=\"3\" y=\"13\" width=\"8\" height=\"8\"/><rect x=\"13\" y=\"13\" width=\"8\" height=\"8\"/>',\r\n 'folder': '<path d=\"M3 6h6l2 3h10v10H3z\"/>',\r\n 'layers': '<polygon points=\"12 3 22 8 12 13 2 8 12 3\"/><polyline points=\"2 13 12 18 22 13\"/>',\r\n 'layout': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"/>',\r\n 'terminal': '<polyline points=\"4 7 9 12 4 17\"/><line x1=\"12\" y1=\"17\" x2=\"20\" y2=\"17\"/>',\r\n 'image': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><circle cx=\"9\" cy=\"9\" r=\"1.5\" fill=\"currentColor\"/><polyline points=\"3 18 9 12 13 16 17 12 21 16\"/>',\r\n 'play': '<polygon points=\"6 4 20 12 6 20 6 4\"/>',\r\n 'pause': '<rect x=\"6\" y=\"4\" width=\"4\" height=\"16\"/><rect x=\"14\" y=\"4\" width=\"4\" height=\"16\"/>',\r\n 'help': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><path d=\"M9 9a3 3 0 0 1 6 0c0 2-3 2-3 4\"/><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"17.01\"/>',\r\n 'lock': '<rect x=\"4\" y=\"11\" width=\"16\" height=\"10\"/><path d=\"M8 11V8a4 4 0 0 1 8 0v3\"/>',\r\n 'eye': '<path d=\"M2 12s4-7 10-7 10 7 10 7-4 7-10 7-10-7-10-7z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>',\r\n 'star': '<polygon points=\"12 3 15 9 22 10 17 14 18 21 12 18 6 21 7 14 2 10 9 9 12 3\"/>',\r\n 'heart': '<path d=\"M12 21s-7-5-7-11a4 4 0 0 1 7-2 4 4 0 0 1 7 2c0 6-7 11-7 11z\"/>',\r\n 'home': '<polygon points=\"3 11 12 3 21 11 21 21 14 21 14 14 10 14 10 21 3 21 3 11\"/>',\r\n 'calendar': '<rect x=\"3\" y=\"5\" width=\"18\" height=\"16\"/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"/><line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"7\"/><line x1=\"16\" y1=\"3\" x2=\"16\" y2=\"7\"/>',\r\n 'clock': '<circle cx=\"12\" cy=\"12\" r=\"9\"/><polyline points=\"12 7 12 12 16 14\"/>',\r\n 'filter': '<polygon points=\"3 4 21 4 14 12 14 20 10 18 10 12 3 4\"/>',\r\n 'send': '<polygon points=\"3 12 21 4 17 21 12 13 3 12\"/>',\r\n 'link': '<path d=\"M10 14a4 4 0 0 1 0-6l3-3a4 4 0 0 1 6 6l-1.5 1.5\"/><path d=\"M14 10a4 4 0 0 1 0 6l-3 3a4 4 0 0 1-6-6l1.5-1.5\"/>',\r\n 'upload': '<path d=\"M12 21V9\"/><polyline points=\"7 14 12 9 17 14\"/><line x1=\"3\" y1=\"3\" x2=\"21\" y2=\"3\"/>',\r\n 'log-out': '<path d=\"M14 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h9\"/><polyline points=\"16 16 21 12 16 8\"/><line x1=\"9\" y1=\"12\" x2=\"21\" y2=\"12\"/>',\r\n 'menu': '<line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\"/><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"/>',\r\n 'dollar': '<line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"22\"/><path d=\"M17 6H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6\"/>',\r\n 'bar': '<line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"21\"/><rect x=\"5\" y=\"11\" width=\"3\" height=\"8\"/><rect x=\"10.5\" y=\"6\" width=\"3\" height=\"13\"/><rect x=\"16\" y=\"14\" width=\"3\" height=\"5\"/>',\r\n 'trending-up': '<polyline points=\"3 17 9 11 13 15 21 7\"/><polyline points=\"15 7 21 7 21 13\"/>',\r\n 'trending-down': '<polyline points=\"3 7 9 13 13 9 21 17\"/><polyline points=\"15 17 21 17 21 11\"/>',\r\n 'columns': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"/><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\"/>',\r\n 'plug': '<path d=\"M9 2v6\"/><path d=\"M15 2v6\"/><path d=\"M7 8h10v4a5 5 0 0 1-10 0V8z\"/><path d=\"M12 17v5\"/>',\r\n 'cpu': '<rect x=\"6\" y=\"6\" width=\"12\" height=\"12\"/><rect x=\"9\" y=\"9\" width=\"6\" height=\"6\"/><line x1=\"9\" y1=\"2\" x2=\"9\" y2=\"6\"/><line x1=\"15\" y1=\"2\" x2=\"15\" y2=\"6\"/><line x1=\"9\" y1=\"18\" x2=\"9\" y2=\"22\"/><line x1=\"15\" y1=\"18\" x2=\"15\" y2=\"22\"/><line x1=\"2\" y1=\"9\" x2=\"6\" y2=\"9\"/><line x1=\"2\" y1=\"15\" x2=\"6\" y2=\"15\"/><line x1=\"18\" y1=\"9\" x2=\"22\" y2=\"9\"/><line x1=\"18\" y1=\"15\" x2=\"22\" y2=\"15\"/>',\r\n 'code': '<polyline points=\"16 18 22 12 16 6\"/><polyline points=\"8 6 2 12 8 18\"/>',\r\n 'apple': '<path fill=\"currentColor\" stroke=\"none\" d=\"M17.05 12.04c-.03-3.04 2.49-4.5 2.6-4.57-1.42-2.07-3.62-2.36-4.4-2.39-1.87-.19-3.65 1.1-4.6 1.1-.96 0-2.42-1.08-3.98-1.05-2.05.03-3.94 1.19-4.99 3.02-2.13 3.69-.54 9.13 1.53 12.12 1.01 1.46 2.21 3.1 3.78 3.04 1.52-.06 2.09-.98 3.93-.98 1.83 0 2.36.98 3.97.95 1.64-.03 2.68-1.49 3.68-2.96 1.16-1.7 1.64-3.35 1.66-3.43-.04-.02-3.18-1.22-3.21-4.85zM14.06 4.34c.83-1.01 1.39-2.41 1.24-3.81-1.2.05-2.65.8-3.51 1.8-.77.89-1.45 2.31-1.27 3.68 1.34.1 2.71-.68 3.54-1.67z\"/>',\r\n};\r\n\r\nfunction svg(name, size = 16, viewBox = '0 0 24 24') {\r\n const path = PATHS[name];\r\n if (!path) return '';\r\n const attrs = ATTRS\r\n .replace('width=\"16\"', `width=\"${size}\"`)\r\n .replace('height=\"16\"', `height=\"${size}\"`)\r\n .replace('viewBox=\"0 0 24 24\"', `viewBox=\"${viewBox}\"`);\r\n return `<svg ${attrs}>${path}</svg>`;\r\n}\r\n\r\nfunction render(root = document) {\r\n root.querySelectorAll('[data-icon]').forEach(el => {\r\n const name = el.getAttribute('data-icon');\r\n const size = +el.getAttribute('data-size') || 16;\r\n const vb = el.getAttribute('data-viewbox') || '0 0 24 24';\r\n el.innerHTML = svg(name, size, vb);\r\n el.classList.add('icon');\r\n });\r\n}\r\n\r\nconst Icons = { svg, render, PATHS };\r\n\r\nexport { Icons, svg, render, PATHS };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Icons = Icons;\r\n if (document.readyState !== 'loading') {\r\n render();\r\n } else {\r\n document.addEventListener('DOMContentLoaded', () => render());\r\n }\r\n}","class Countdown {\r\n constructor(element) {\r\n this.element = element;\r\n this.hoursEl = element.querySelector('.ds-countdown__item--hours .ds-countdown__value');\r\n this.minutesEl = element.querySelector('.ds-countdown__item--minutes .ds-countdown__value');\r\n this.secondsEl = element.querySelector('.ds-countdown__item--seconds .ds-countdown__value');\r\n \r\n this.endTime = this.parseEndTime();\r\n this.interval = null;\r\n \r\n this.init();\r\n }\r\n\r\n parseEndTime() {\r\n const dataEndTime = this.element.getAttribute('data-end-time');\r\n if (dataEndTime) {\r\n return new Date(dataEndTime).getTime();\r\n }\r\n \r\n const dataHours = parseInt(this.element.getAttribute('data-hours')) || 0;\r\n const dataMinutes = parseInt(this.element.getAttribute('data-minutes')) || 0;\r\n const dataSeconds = parseInt(this.element.getAttribute('data-seconds')) || 0;\r\n \r\n return new Date().getTime() + (dataHours * 3600 + dataMinutes * 60 + dataSeconds) * 1000;\r\n }\r\n\r\n init() {\r\n this.update();\r\n this.start();\r\n }\r\n\r\n start() {\r\n if (this.interval) {\r\n clearInterval(this.interval);\r\n }\r\n this.interval = setInterval(() => {\r\n this.update();\r\n }, 1000);\r\n }\r\n\r\n stop() {\r\n if (this.interval) {\r\n clearInterval(this.interval);\r\n this.interval = null;\r\n }\r\n }\r\n\r\n reset() {\r\n this.stop();\r\n this.endTime = this.parseEndTime();\r\n this.init();\r\n }\r\n\r\n update() {\r\n const now = new Date().getTime();\r\n const distance = this.endTime - now;\r\n \r\n if (distance <= 0) {\r\n this.stop();\r\n this.displayTime(0, 0, 0);\r\n this.dispatchComplete();\r\n return;\r\n }\r\n \r\n const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\r\n const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));\r\n const seconds = Math.floor((distance % (1000 * 60)) / 1000);\r\n \r\n this.displayTime(hours, minutes, seconds);\r\n }\r\n\r\n displayTime(hours, minutes, seconds) {\r\n if (this.hoursEl) {\r\n this.hoursEl.textContent = String(hours).padStart(2, '0');\r\n }\r\n if (this.minutesEl) {\r\n this.minutesEl.textContent = String(minutes).padStart(2, '0');\r\n }\r\n if (this.secondsEl) {\r\n this.secondsEl.textContent = String(seconds).padStart(2, '0');\r\n }\r\n }\r\n\r\n setEndTime(date) {\r\n this.endTime = date.getTime();\r\n this.update();\r\n }\r\n\r\n addTime(seconds) {\r\n this.endTime += seconds * 1000;\r\n this.update();\r\n }\r\n\r\n dispatchComplete() {\r\n this.element.dispatchEvent(new CustomEvent('kupola:countdown-complete', {\r\n detail: {}\r\n }));\r\n }\r\n\r\n destroy() {\r\n this.stop();\r\n this.hoursEl = null;\r\n this.minutesEl = null;\r\n this.secondsEl = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initCountdown(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const instance = new Countdown(element);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupCountdown(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initCountdowns() {\r\n const countdowns = document.querySelectorAll('.ds-countdown');\r\n countdowns.forEach(el => {\r\n initCountdown(el);\r\n });\r\n}\r\n\r\nexport { Countdown, initCountdowns, initCountdown, cleanupCountdown };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.Countdown = Countdown;\r\n window.initCountdown = initCountdown;\r\n window.cleanupCountdown = cleanupCountdown;\r\n window.initCountdowns = initCountdowns;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('countdown', initCountdown, cleanupCountdown);\r\n }\r\n}","class NumberInput {\r\n constructor(element) {\r\n this.element = element;\r\n this.minusBtn = element.querySelector('.ds-number-input__btn--decrease');\r\n this.plusBtn = element.querySelector('.ds-number-input__btn--increase');\r\n this.inputEl = element.querySelector('.ds-number-input__input');\r\n this._listeners = [];\r\n\r\n if (!this.minusBtn || !this.plusBtn || !this.inputEl) {\r\n throw new Error('NumberInput: Missing required elements');\r\n }\r\n\r\n this.min = parseInt(this.inputEl.getAttribute('min')) || -Infinity;\r\n this.max = parseInt(this.inputEl.getAttribute('max')) || Infinity;\r\n this.step = parseInt(this.inputEl.getAttribute('step')) || 1;\r\n\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.bindEvents();\r\n this.updateState();\r\n }\r\n\r\n bindEvents() {\r\n const minusHandler = () => this.updateValue(-this.step);\r\n const plusHandler = () => this.updateValue(this.step);\r\n const inputHandler = () => this.handleInput();\r\n\r\n this.minusBtn.addEventListener('click', minusHandler);\r\n this.plusBtn.addEventListener('click', plusHandler);\r\n this.inputEl.addEventListener('input', inputHandler);\r\n\r\n this._listeners.push(\r\n { el: this.minusBtn, event: 'click', handler: minusHandler },\r\n { el: this.plusBtn, event: 'click', handler: plusHandler },\r\n { el: this.inputEl, event: 'input', handler: inputHandler }\r\n );\r\n }\r\n\r\n updateValue(delta) {\r\n let value = parseInt(this.inputEl.value) || 0;\r\n value += delta;\r\n\r\n if (value < this.min) value = this.min;\r\n if (value > this.max) value = this.max;\r\n\r\n this.inputEl.value = value;\r\n this.inputEl.dispatchEvent(new Event('change'));\r\n this.updateState();\r\n this.dispatchChange();\r\n }\r\n\r\n handleInput() {\r\n let value = parseInt(this.inputEl.value);\r\n if (isNaN(value)) value = 0;\r\n if (value < this.min) value = this.min;\r\n if (value > this.max) value = this.max;\r\n this.inputEl.value = value;\r\n this.updateState();\r\n this.dispatchChange();\r\n }\r\n\r\n updateState() {\r\n const value = parseInt(this.inputEl.value) || 0;\r\n this.minusBtn.disabled = value <= this.min;\r\n this.plusBtn.disabled = value >= this.max;\r\n }\r\n\r\n setValue(value) {\r\n if (value < this.min) value = this.min;\r\n if (value > this.max) value = this.max;\r\n this.inputEl.value = value;\r\n this.updateState();\r\n this.dispatchChange();\r\n }\r\n\r\n getValue() {\r\n return parseInt(this.inputEl.value) || 0;\r\n }\r\n\r\n setRange(min, max) {\r\n this.min = min;\r\n this.max = max;\r\n this.updateState();\r\n }\r\n\r\n dispatchChange() {\r\n this.element.dispatchEvent(new CustomEvent('kupola:number-input-change', {\r\n detail: {\r\n value: this.getValue()\r\n }\r\n }));\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.minusBtn = null;\r\n this.plusBtn = null;\r\n this.inputEl = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initNumberInput(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n try {\r\n const instance = new NumberInput(element);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n } catch (error) {\r\n console.error('[NumberInput] Error initializing:', error);\r\n }\r\n}\r\n\r\nfunction cleanupNumberInput(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initNumberInputs() {\r\n document.querySelectorAll('.ds-number-input').forEach(input => {\r\n initNumberInput(input);\r\n });\r\n}\r\n\r\nexport { NumberInput, initNumberInputs, initNumberInput, cleanupNumberInput };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.NumberInput = NumberInput;\r\n window.initNumberInput = initNumberInput;\r\n window.cleanupNumberInput = cleanupNumberInput;\r\n window.initNumberInputs = initNumberInputs;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('number-input', initNumberInput, cleanupNumberInput);\r\n }\r\n}","class SlideCaptcha {\r\n constructor(container) {\r\n this.container = container;\r\n this.track = container.querySelector('.ds-slider-captcha__track');\r\n this.btn = container.querySelector('.ds-slider-captcha__btn');\r\n this.text = container.querySelector('.ds-slider-captcha__text');\r\n this.progress = container.querySelector('.ds-slider-captcha__progress');\r\n this.statusEl = container.querySelector('.ds-slider-captcha__status');\r\n this.refreshBtn = container.querySelector('.ds-slider-captcha__refresh');\r\n this.footerRefreshBtn = container.querySelector('.ds-slider-captcha__footer-refresh');\r\n \r\n this.config = {\r\n tolerance: 6,\r\n minPoints: 20,\r\n minDuration: 300,\r\n maxDuration: 10000,\r\n minSpeedDelta: 0.3,\r\n maxAttempts: 5\r\n };\r\n \r\n this.isDragging = false;\r\n this.startX = 0;\r\n this.startY = 0;\r\n this.currentX = 0;\r\n this.trackData = [];\r\n this.startTime = 0;\r\n this.isVerified = false;\r\n this.isProcessing = false;\r\n this.attempts = 0;\r\n \r\n this.targetX = 0;\r\n this.distractorX = 0;\r\n this.angle = 0;\r\n this.distractorAngle = 0;\r\n this.maxAngle = parseInt(container.getAttribute('data-angle')) || 30;\r\n this.shape = container.getAttribute('data-shape') || 'circle';\r\n this.hasDistractor = this.shape !== 'circle';\r\n \r\n this.scope = `slidecaptcha-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n this._mouseDownHandler = null;\r\n this._mouseMoveHandler = null;\r\n this._mouseUpHandler = null;\r\n this._touchStartHandler = null;\r\n this._touchMoveHandler = null;\r\n this._touchEndHandler = null;\r\n \r\n this._mouseMoveListener = null;\r\n this._mouseUpListener = null;\r\n this._touchMoveListener = null;\r\n this._touchEndListener = null;\r\n }\r\n\r\n init() {\r\n if (!this.track || !this.btn) return;\r\n if (this.container._initialized) return;\r\n\r\n this._mouseDownHandler = (e) => {\r\n if (this.isVerified || this.isProcessing) return;\r\n e.preventDefault();\r\n this.isDragging = true;\r\n this.startX = e.clientX;\r\n this.startY = e.clientY;\r\n this.startTime = Date.now();\r\n this.trackData = [];\r\n this.container.classList.add('is-active');\r\n if (this.text) {\r\n this.text.textContent = '拖动中...';\r\n this.text.style.color = 'var(--status-info-default)';\r\n }\r\n };\r\n\r\n this._mouseMoveHandler = (e) => {\r\n if (!this.isDragging) return;\r\n e.preventDefault();\r\n\r\n const trackWidth = this.track.offsetWidth;\r\n const btnWidth = this.btn.offsetWidth;\r\n const maxOffset = trackWidth - btnWidth - 8;\r\n\r\n let deltaX = e.clientX - this.startX;\r\n if (deltaX < 0) deltaX = 0;\r\n if (deltaX > maxOffset) deltaX = maxOffset;\r\n\r\n this.currentX = deltaX;\r\n this.btn.style.left = (14 + deltaX) + 'px';\r\n if (this.progress) this.progress.style.width = ((deltaX / maxOffset) * 100) + '%';\r\n\r\n this.collectTrack(e.clientX, e.clientY);\r\n };\r\n\r\n this._mouseUpHandler = () => {\r\n if (!this.isDragging) return;\r\n this.isDragging = false;\r\n this.container.classList.remove('is-active');\r\n this.verifyCaptcha();\r\n };\r\n\r\n this._touchStartHandler = (e) => {\r\n if (this.isVerified || this.isProcessing) return;\r\n e.preventDefault();\r\n this.isDragging = true;\r\n this.startX = e.touches[0].clientX;\r\n this.startY = e.touches[0].clientY;\r\n this.startTime = Date.now();\r\n this.trackData = [];\r\n this.container.classList.add('is-active');\r\n if (this.text) {\r\n this.text.textContent = '拖动中...';\r\n this.text.style.color = 'var(--status-info-default)';\r\n }\r\n };\r\n\r\n this._touchMoveHandler = (e) => {\r\n if (!this.isDragging) return;\r\n e.preventDefault();\r\n\r\n const trackWidth = this.track.offsetWidth;\r\n const btnWidth = this.btn.offsetWidth;\r\n const maxOffset = trackWidth - btnWidth - 8;\r\n\r\n let deltaX = e.touches[0].clientX - this.startX;\r\n if (deltaX < 0) deltaX = 0;\r\n if (deltaX > maxOffset) deltaX = maxOffset;\r\n\r\n this.currentX = deltaX;\r\n this.btn.style.left = (14 + deltaX) + 'px';\r\n if (this.progress) this.progress.style.width = ((deltaX / maxOffset) * 100) + '%';\r\n\r\n this.collectTrack(e.touches[0].clientX, e.touches[0].clientY);\r\n };\r\n\r\n this._touchEndHandler = () => {\r\n if (!this.isDragging) return;\r\n this.isDragging = false;\r\n this.container.classList.remove('is-active');\r\n this.verifyCaptcha();\r\n };\r\n\r\n this.btn.addEventListener('mousedown', this._mouseDownHandler);\r\n\r\n if (window.globalEvents) {\r\n this._mouseMoveListener = window.globalEvents.on(document, 'mousemove', this._mouseMoveHandler, { scope: this.scope });\r\n this._mouseUpListener = window.globalEvents.on(document, 'mouseup', this._mouseUpHandler, { scope: this.scope });\r\n this._touchMoveListener = window.globalEvents.on(document, 'touchmove', this._touchMoveHandler, { scope: this.scope, passive: false });\r\n this._touchEndListener = window.globalEvents.on(document, 'touchend', this._touchEndHandler, { scope: this.scope });\r\n } else {\r\n document.addEventListener('mousemove', this._mouseMoveHandler);\r\n document.addEventListener('mouseup', this._mouseUpHandler);\r\n document.addEventListener('touchmove', this._touchMoveHandler, { passive: false });\r\n document.addEventListener('touchend', this._touchEndHandler);\r\n }\r\n\r\n this.btn.addEventListener('touchstart', this._touchStartHandler, { passive: false });\r\n\r\n if (this.refreshBtn) {\r\n this.refreshBtn.addEventListener('click', () => this.loadCaptcha());\r\n }\r\n if (this.footerRefreshBtn) {\r\n this.footerRefreshBtn.addEventListener('click', () => this.loadCaptcha());\r\n }\r\n\r\n this.container._initialized = true;\r\n this.loadCaptcha();\r\n }\r\n\r\n generateTarget() {\r\n const trackWidth = this.track.offsetWidth;\r\n const btnWidth = this.btn.offsetWidth;\r\n const btnOffset = 14;\r\n const min = trackWidth * 0.35;\r\n const max = trackWidth * 0.85 - btnWidth;\r\n const mid = trackWidth * 0.6;\r\n\r\n this.angle = Math.floor(Math.random() * (this.maxAngle + 1));\r\n\r\n if (this.hasDistractor) {\r\n do {\r\n this.distractorAngle = Math.floor(Math.random() * (this.maxAngle + 1));\r\n } while (Math.abs(this.distractorAngle - this.angle) < 5);\r\n }\r\n\r\n if (this.hasDistractor) {\r\n const rand = Math.random();\r\n if (rand > 0.5) {\r\n this.targetX = Math.floor(min + Math.random() * (mid - min - btnWidth));\r\n this.distractorX = Math.floor(mid + Math.random() * (max - mid));\r\n } else {\r\n this.targetX = Math.floor(mid + Math.random() * (max - mid));\r\n this.distractorX = Math.floor(min + Math.random() * (mid - min - btnWidth));\r\n }\r\n } else {\r\n this.targetX = Math.floor(min + Math.random() * (max - min));\r\n }\r\n\r\n const target = this.container.querySelector('.ds-slider-captcha__target');\r\n if (target) {\r\n target.style.left = (this.targetX + btnOffset + btnWidth / 2) + 'px';\r\n target.style.transform = 'translate(-50%, -50%) rotate(' + this.angle + 'deg)';\r\n target.style.display = 'block';\r\n }\r\n\r\n if (this.hasDistractor) {\r\n const distractor = this.container.querySelector('.ds-slider-captcha__target--distractor');\r\n if (distractor) {\r\n distractor.style.left = (this.distractorX + btnOffset + btnWidth / 2) + 'px';\r\n distractor.style.transform = 'translate(-50%, -50%) rotate(' + this.distractorAngle + 'deg)';\r\n distractor.style.display = 'block';\r\n }\r\n } else {\r\n const distractor = this.container.querySelector('.ds-slider-captcha__target--distractor');\r\n if (distractor) {\r\n distractor.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n resetSlider() {\r\n this.btn.className = 'ds-slider-captcha__btn';\r\n this.btn.style.transform = 'rotate(' + this.angle + 'deg)';\r\n this.btn.innerHTML = '';\r\n this.btn.style.left = '14px';\r\n this.btn.style.display = 'block';\r\n if (this.progress) {\r\n this.progress.style.width = '0%';\r\n this.progress.style.display = 'block';\r\n }\r\n if (this.text) {\r\n this.text.textContent = '按住滑块,拖动到缺口位置';\r\n this.text.style.color = '';\r\n }\r\n if (this.refreshBtn) {\r\n this.refreshBtn.style.display = 'none';\r\n }\r\n this.currentX = 0;\r\n this.trackData = [];\r\n this.container.classList.remove('is-verified', 'is-error', 'is-disabled');\r\n }\r\n\r\n loadCaptcha() {\r\n this.isVerified = false;\r\n this.isProcessing = false;\r\n this.attempts = 0;\r\n this.generateTarget();\r\n this.resetSlider();\r\n if (this.statusEl) {\r\n this.statusEl.textContent = '请完成验证';\r\n this.statusEl.className = 'ds-slider-captcha__status';\r\n }\r\n }\r\n\r\n collectTrack(clientX, clientY) {\r\n const now = Date.now();\r\n const t = now - this.startTime;\r\n\r\n let velocity = 0;\r\n let acceleration = 0;\r\n\r\n if (this.trackData.length > 0) {\r\n const last = this.trackData[this.trackData.length - 1];\r\n const dx = this.currentX - last.x;\r\n const dt = t - last.t;\r\n if (dt > 0) {\r\n velocity = dx / dt;\r\n if (this.trackData.length > 1) {\r\n const prev = this.trackData[this.trackData.length - 2];\r\n const prevDt = last.t - prev.t;\r\n if (prevDt > 0) {\r\n const prevV = (last.x - prev.x) / prevDt;\r\n acceleration = velocity - prevV;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.trackData.push({\r\n x: this.currentX,\r\n y: clientY - this.startY,\r\n t: t,\r\n v: velocity,\r\n a: acceleration\r\n });\r\n\r\n const pointCountEl = this.container.querySelector('.ds-slider-captcha__point-count');\r\n if (pointCountEl) {\r\n pointCountEl.textContent = '轨迹点: ' + this.trackData.length;\r\n }\r\n }\r\n\r\n validateTrack() {\r\n if (!this.trackData || this.trackData.length < this.config.minPoints) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n const finalX = this.trackData[this.trackData.length - 1].x;\r\n const distractorDiff = this.hasDistractor ? Math.abs(finalX - this.distractorX) : Infinity;\r\n const targetDiff = Math.abs(finalX - this.targetX);\r\n\r\n if (this.hasDistractor && distractorDiff < targetDiff && distractorDiff <= this.config.tolerance) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n if (targetDiff > this.config.tolerance) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n const speeds = [];\r\n for (let i = 1; i < this.trackData.length; i++) {\r\n const dx = this.trackData[i].x - this.trackData[i - 1].x;\r\n const dt = this.trackData[i].t - this.trackData[i - 1].t;\r\n if (dt > 0 && dt < 500) {\r\n speeds.push(dx / dt);\r\n }\r\n }\r\n\r\n if (speeds.length < 3) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n const maxSpeed = Math.max(...speeds);\r\n const minSpeed = Math.min(...speeds);\r\n if (maxSpeed - minSpeed < this.config.minSpeedDelta) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n let hasYMovement = false;\r\n for (const p of this.trackData) {\r\n if (Math.abs(p.y) > 2) {\r\n hasYMovement = true;\r\n break;\r\n }\r\n }\r\n if (!hasYMovement && this.trackData.length > 20) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n const totalTime = this.trackData[this.trackData.length - 1].t;\r\n if (totalTime < this.config.minDuration) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n if (totalTime > this.config.maxDuration) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n const accelerations = [];\r\n for (let i = 1; i < speeds.length; i++) {\r\n accelerations.push(Math.abs(speeds[i] - speeds[i - 1]));\r\n }\r\n if (accelerations.length > 2) {\r\n const accAvg = accelerations.reduce((a, b) => a + b, 0) / accelerations.length;\r\n if (accAvg < 0.05) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n }\r\n\r\n return { passed: true, msg: '验证通过' };\r\n }\r\n\r\n verifyCaptcha() {\r\n if (this.isProcessing || this.isVerified) return;\r\n this.isProcessing = true;\r\n\r\n if (this.statusEl) {\r\n this.statusEl.textContent = '验证中...';\r\n this.statusEl.className = 'ds-slider-captcha__status is-loading';\r\n }\r\n this.btn.style.cursor = 'wait';\r\n this.container.classList.add('is-disabled');\r\n\r\n setTimeout(() => {\r\n const result = this.validateTrack();\r\n this.isProcessing = false;\r\n this.btn.style.cursor = '';\r\n\r\n if (result.passed) {\r\n this.isVerified = true;\r\n this.btn.style.display = 'none';\r\n if (this.progress) this.progress.style.display = 'none';\r\n \r\n const target = this.container.querySelector('.ds-slider-captcha__target');\r\n if (target) target.style.display = 'none';\r\n \r\n const distractor = this.container.querySelector('.ds-slider-captcha__target--distractor');\r\n if (distractor) distractor.style.display = 'none';\r\n\r\n if (this.text) {\r\n this.text.textContent = '验证通过';\r\n this.text.style.color = 'var(--status-success-default)';\r\n }\r\n if (this.statusEl) {\r\n this.statusEl.textContent = '验证成功';\r\n this.statusEl.className = 'ds-slider-captcha__status is-success';\r\n }\r\n this.container.classList.add('is-verified');\r\n this.container.classList.remove('is-disabled');\r\n\r\n const onVerified = this.container.getAttribute('data-on-verified');\r\n if (onVerified && typeof window[onVerified] === 'function') {\r\n window[onVerified](this.container);\r\n }\r\n } else {\r\n this.attempts++;\r\n\r\n if (this.text) {\r\n this.text.textContent = result.msg;\r\n this.text.style.color = 'var(--status-error-default)';\r\n }\r\n if (this.statusEl) {\r\n this.statusEl.textContent = result.msg;\r\n this.statusEl.className = 'ds-slider-captcha__status is-error';\r\n }\r\n\r\n const errRefresh = this.container.getAttribute('data-err-refresh');\r\n if (errRefresh === 'auto') {\r\n setTimeout(() => {\r\n this.loadCaptcha();\r\n }, 1200);\r\n } else {\r\n this.btn.style.display = 'none';\r\n if (this.progress) this.progress.style.display = 'none';\r\n \r\n const target = this.container.querySelector('.ds-slider-captcha__target');\r\n if (target) target.style.display = 'none';\r\n \r\n const distractor = this.container.querySelector('.ds-slider-captcha__target--distractor');\r\n if (distractor) distractor.style.display = 'none';\r\n\r\n if (this.refreshBtn) {\r\n this.refreshBtn.style.display = 'block';\r\n }\r\n }\r\n }\r\n }, 300);\r\n }\r\n\r\n destroy() {\r\n if (!this.container._initialized) return;\r\n\r\n if (this.btn && this._mouseDownHandler) {\r\n this.btn.removeEventListener('mousedown', this._mouseDownHandler);\r\n }\r\n if (this.btn && this._touchStartHandler) {\r\n this.btn.removeEventListener('touchstart', this._touchStartHandler);\r\n }\r\n\r\n if (this.refreshBtn) {\r\n this.refreshBtn.removeEventListener('click', () => this.loadCaptcha());\r\n }\r\n if (this.footerRefreshBtn) {\r\n this.footerRefreshBtn.removeEventListener('click', () => this.loadCaptcha());\r\n }\r\n\r\n if (this._mouseMoveListener && this._mouseMoveListener.unsubscribe) {\r\n this._mouseMoveListener.unsubscribe();\r\n } else if (this._mouseMoveHandler) {\r\n document.removeEventListener('mousemove', this._mouseMoveHandler);\r\n }\r\n\r\n if (this._mouseUpListener && this._mouseUpListener.unsubscribe) {\r\n this._mouseUpListener.unsubscribe();\r\n } else if (this._mouseUpHandler) {\r\n document.removeEventListener('mouseup', this._mouseUpHandler);\r\n }\r\n\r\n if (this._touchMoveListener && this._touchMoveListener.unsubscribe) {\r\n this._touchMoveListener.unsubscribe();\r\n } else if (this._touchMoveHandler) {\r\n document.removeEventListener('touchmove', this._touchMoveHandler);\r\n }\r\n\r\n if (this._touchEndListener && this._touchEndListener.unsubscribe) {\r\n this._touchEndListener.unsubscribe();\r\n } else if (this._touchEndHandler) {\r\n document.removeEventListener('touchend', this._touchEndHandler);\r\n }\r\n\r\n this.container._initialized = false;\r\n }\r\n}\r\n\r\nfunction initSlideCaptchas() {\r\n document.querySelectorAll('.ds-slider-captcha').forEach(container => {\r\n const captcha = new SlideCaptcha(container);\r\n captcha.init();\r\n container._kupolaSlideCaptcha = captcha;\r\n });\r\n}\r\n\r\nfunction cleanupSlideCaptcha(container) {\r\n if (container._kupolaSlideCaptcha) {\r\n container._kupolaSlideCaptcha.destroy();\r\n container._kupolaSlideCaptcha = null;\r\n }\r\n}\r\n\r\nfunction cleanupAllSlideCaptchas() {\r\n document.querySelectorAll('.ds-slider-captcha').forEach(container => {\r\n cleanupSlideCaptcha(container);\r\n });\r\n}\r\n\r\nexport { SlideCaptcha, initSlideCaptchas, cleanupSlideCaptcha, cleanupAllSlideCaptchas };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.SlideCaptcha = SlideCaptcha;\r\n window.initSlideCaptchas = initSlideCaptchas;\r\n window.cleanupSlideCaptcha = cleanupSlideCaptcha;\r\n window.cleanupAllSlideCaptchas = cleanupAllSlideCaptchas;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('slide-captcha', initSlideCaptchas, cleanupAllSlideCaptchas);\r\n }\r\n}","class KupolaForm {\r\n constructor(formElement) {\r\n this.form = formElement;\r\n this.fields = [];\r\n this.validators = {};\r\n this.errorMessages = {};\r\n this._init();\r\n }\r\n\r\n _init() {\r\n this._setupValidators();\r\n this._collectFields();\r\n this._bindEvents();\r\n }\r\n\r\n _setupValidators() {\r\n this.validators = {\r\n required: (value) => {\r\n if (typeof value === 'string') {\r\n return value.trim() !== '';\r\n }\r\n if (Array.isArray(value)) {\r\n return value.length > 0;\r\n }\r\n return value !== null && value !== undefined;\r\n },\r\n email: (value) => {\r\n if (!value) return true;\r\n const regex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n return regex.test(value);\r\n },\r\n phone: (value) => {\r\n if (!value) return true;\r\n const regex = /^1[3-9]\\d{9}$/;\r\n return regex.test(value);\r\n },\r\n url: (value) => {\r\n if (!value) return true;\r\n try {\r\n new URL(value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n },\r\n number: (value) => {\r\n if (!value) return true;\r\n return !isNaN(parseFloat(value)) && isFinite(value);\r\n },\r\n minlength: (value, min) => {\r\n if (!value) return true;\r\n return value.length >= parseInt(min);\r\n },\r\n maxlength: (value, max) => {\r\n if (!value) return true;\r\n return value.length <= parseInt(max);\r\n },\r\n min: (value, min) => {\r\n if (!value) return true;\r\n return parseFloat(value) >= parseFloat(min);\r\n },\r\n max: (value, max) => {\r\n if (!value) return true;\r\n return parseFloat(value) <= parseFloat(max);\r\n },\r\n pattern: (value, pattern) => {\r\n if (!value) return true;\r\n const regex = new RegExp(pattern);\r\n return regex.test(value);\r\n },\r\n equalTo: (value, targetId) => {\r\n const target = document.getElementById(targetId);\r\n if (!target) return true;\r\n return value === target.value;\r\n }\r\n };\r\n\r\n this.errorMessages = {\r\n required: '该字段为必填项',\r\n email: '请输入有效的邮箱地址',\r\n phone: '请输入有效的手机号码',\r\n url: '请输入有效的URL地址',\r\n number: '请输入有效的数字',\r\n minlength: (param) => `至少需要${param}个字符`,\r\n maxlength: (param) => `最多允许${param}个字符`,\r\n min: (param) => `最小值为${param}`,\r\n max: (param) => `最大值为${param}`,\r\n pattern: '格式不正确',\r\n equalTo: '两次输入不一致'\r\n };\r\n }\r\n\r\n _collectFields() {\r\n const inputs = this.form.querySelectorAll('input, select, textarea');\r\n inputs.forEach(input => {\r\n if (!input.hasAttribute('data-kupola-ignore')) {\r\n this.fields.push(input);\r\n }\r\n });\r\n }\r\n\r\n _bindEvents() {\r\n this.form.addEventListener('submit', (e) => {\r\n if (!this.validate()) {\r\n e.preventDefault();\r\n }\r\n });\r\n\r\n this.fields.forEach(field => {\r\n field.addEventListener('blur', () => this.validateField(field));\r\n field.addEventListener('input', () => this.clearError(field));\r\n });\r\n }\r\n\r\n validate() {\r\n let isValid = true;\r\n this.fields.forEach(field => {\r\n if (!this.validateField(field)) {\r\n isValid = false;\r\n }\r\n });\r\n return isValid;\r\n }\r\n\r\n validateField(field) {\r\n const errors = this._getFieldErrors(field);\r\n \r\n if (errors.length > 0) {\r\n this.showError(field, errors[0]);\r\n return false;\r\n }\r\n \r\n this.clearError(field);\r\n return true;\r\n }\r\n\r\n _getFieldErrors(field) {\r\n const errors = [];\r\n const value = this._getFieldValue(field);\r\n \r\n for (const [validatorName, validator] of Object.entries(this.validators)) {\r\n const attrValue = field.getAttribute(`data-${validatorName}`);\r\n if (attrValue !== null) {\r\n const isValid = validator(value, attrValue);\r\n if (!isValid) {\r\n let message = this.errorMessages[validatorName];\r\n if (typeof message === 'function') {\r\n message = message(attrValue);\r\n }\r\n errors.push(message);\r\n }\r\n }\r\n }\r\n \r\n return errors;\r\n }\r\n\r\n _getFieldValue(field) {\r\n const type = field.type;\r\n \r\n if (type === 'checkbox') {\r\n return field.checked;\r\n }\r\n \r\n if (type === 'radio') {\r\n const name = field.name;\r\n const checked = this.form.querySelector(`input[name=\"${name}\"]:checked`);\r\n return checked ? checked.value : null;\r\n }\r\n \r\n if (type === 'select-multiple') {\r\n return Array.from(field.selectedOptions).map(option => option.value);\r\n }\r\n \r\n return field.value;\r\n }\r\n\r\n showError(field, message) {\r\n this.clearError(field);\r\n \r\n const errorElement = document.createElement('span');\r\n errorElement.className = 'ds-form-error';\r\n errorElement.textContent = message;\r\n \r\n field.classList.add('ds-form-field--error');\r\n \r\n const container = field.parentElement;\r\n if (container.classList.contains('ds-form-field')) {\r\n container.appendChild(errorElement);\r\n } else {\r\n field.parentNode.insertBefore(errorElement, field.nextSibling);\r\n }\r\n }\r\n\r\n clearError(field) {\r\n field.classList.remove('ds-form-field--error');\r\n \r\n const errorElement = field.parentElement.querySelector('.ds-form-error');\r\n if (errorElement) {\r\n errorElement.remove();\r\n }\r\n }\r\n\r\n addValidator(name, validator, message) {\r\n this.validators[name] = validator;\r\n this.errorMessages[name] = message;\r\n }\r\n\r\n getData() {\r\n const data = {};\r\n \r\n this.fields.forEach(field => {\r\n const name = field.name;\r\n if (!name) return;\r\n \r\n const value = this._getFieldValue(field);\r\n \r\n if (field.type === 'checkbox') {\r\n if (!data[name]) {\r\n data[name] = [];\r\n }\r\n if (field.checked) {\r\n data[name].push(field.value);\r\n }\r\n } else if (field.type === 'radio') {\r\n if (!data[name] && field.checked) {\r\n data[name] = field.value;\r\n }\r\n } else {\r\n data[name] = value;\r\n }\r\n });\r\n \r\n return data;\r\n }\r\n\r\n setData(data) {\r\n Object.keys(data).forEach(name => {\r\n const fields = this.form.querySelectorAll(`[name=\"${name}\"]`);\r\n \r\n fields.forEach(field => {\r\n const type = field.type;\r\n \r\n if (type === 'checkbox') {\r\n const values = Array.isArray(data[name]) ? data[name] : [data[name]];\r\n field.checked = values.includes(field.value);\r\n } else if (type === 'radio') {\r\n field.checked = field.value === data[name];\r\n } else if (type === 'select-multiple') {\r\n const values = Array.isArray(data[name]) ? data[name] : [data[name]];\r\n Array.from(field.options).forEach(option => {\r\n option.selected = values.includes(option.value);\r\n });\r\n } else {\r\n field.value = data[name] || '';\r\n }\r\n });\r\n });\r\n }\r\n\r\n reset() {\r\n this.form.reset();\r\n this.fields.forEach(field => this.clearError(field));\r\n }\r\n\r\n destroy() {\r\n this.fields.forEach(field => {\r\n field.removeEventListener('blur', () => this.validateField(field));\r\n field.removeEventListener('input', () => this.clearError(field));\r\n });\r\n \r\n this.form.removeEventListener('submit', () => {});\r\n \r\n this.fields = null;\r\n this.validators = null;\r\n this.errorMessages = null;\r\n this.form = null;\r\n }\r\n}\r\n\r\nfunction initFormValidation(formSelector) {\r\n const forms = document.querySelectorAll(formSelector || '.ds-form');\r\n \r\n forms.forEach(form => {\r\n if (form._kupolaForm) return;\r\n \r\n const instance = new KupolaForm(form);\r\n form._kupolaForm = instance;\r\n });\r\n \r\n return forms.length;\r\n}\r\n\r\nfunction getFormInstance(formElement) {\r\n return formElement._kupolaForm;\r\n}\r\n\r\nfunction validateForm(formElement) {\r\n const instance = formElement._kupolaForm;\r\n if (instance) {\r\n return instance.validate();\r\n }\r\n return false;\r\n}\r\n\r\nexport { KupolaForm, initFormValidation, getFormInstance, validateForm };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.KupolaForm = KupolaForm;\r\n window.initFormValidation = initFormValidation;\r\n window.getFormInstance = getFormInstance;\r\n window.validateForm = validateForm;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('form-validation', initFormValidation);\r\n }\r\n}","class GlobalEvents {\r\n constructor() {\r\n this._listeners = new Map();\r\n this._scopeListeners = new Map();\r\n }\r\n\r\n on(target, eventName, handler, options = {}) {\r\n const { scope = null, once = false, passive = false, capture = false } = options;\r\n \r\n const listenerId = this._generateId();\r\n \r\n const listener = {\r\n id: listenerId,\r\n target,\r\n eventName,\r\n handler,\r\n scope,\r\n once,\r\n wrappedHandler: null\r\n };\r\n\r\n listener.wrappedHandler = (event) => {\r\n if (once) {\r\n this.offById(listenerId);\r\n }\r\n handler.call(target, event);\r\n };\r\n\r\n const eventKey = this._getEventKey(target, eventName);\r\n \r\n if (!this._listeners.has(eventKey)) {\r\n this._listeners.set(eventKey, []);\r\n }\r\n this._listeners.get(eventKey).push(listener);\r\n\r\n if (scope) {\r\n if (!this._scopeListeners.has(scope)) {\r\n this._scopeListeners.set(scope, []);\r\n }\r\n this._scopeListeners.get(scope).push(listenerId);\r\n }\r\n\r\n target.addEventListener(eventName, listener.wrappedHandler, {\r\n passive,\r\n capture\r\n });\r\n\r\n return {\r\n unsubscribe: () => this.offById(listenerId)\r\n };\r\n }\r\n\r\n once(target, eventName, handler, options = {}) {\r\n return this.on(target, eventName, handler, { ...options, once: true });\r\n }\r\n\r\n off(target, eventName, handler) {\r\n const eventKey = this._getEventKey(target, eventName);\r\n \r\n if (!this._listeners.has(eventKey)) return;\r\n\r\n const listeners = this._listeners.get(eventKey);\r\n const filtered = listeners.filter(listener => listener.handler !== handler);\r\n \r\n listeners.forEach(listener => {\r\n if (listener.handler === handler) {\r\n target.removeEventListener(eventName, listener.wrappedHandler);\r\n this._removeFromScope(listener);\r\n }\r\n });\r\n\r\n if (filtered.length === 0) {\r\n this._listeners.delete(eventKey);\r\n } else {\r\n this._listeners.set(eventKey, filtered);\r\n }\r\n }\r\n\r\n offById(listenerId) {\r\n for (const [eventKey, listeners] of this._listeners) {\r\n const index = listeners.findIndex(l => l.id === listenerId);\r\n \r\n if (index !== -1) {\r\n const listener = listeners[index];\r\n listener.target.removeEventListener(listener.eventName, listener.wrappedHandler);\r\n \r\n listeners.splice(index, 1);\r\n \r\n if (listeners.length === 0) {\r\n this._listeners.delete(eventKey);\r\n }\r\n \r\n this._removeFromScope(listener);\r\n \r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n offByScope(scope) {\r\n if (!this._scopeListeners.has(scope)) return;\r\n\r\n const listenerIds = this._scopeListeners.get(scope);\r\n \r\n listenerIds.forEach(listenerId => {\r\n this.offById(listenerId);\r\n });\r\n \r\n this._scopeListeners.delete(scope);\r\n }\r\n\r\n offAll(target, eventName = null) {\r\n if (eventName) {\r\n const eventKey = this._getEventKey(target, eventName);\r\n \r\n if (!this._listeners.has(eventKey)) return;\r\n \r\n const listeners = this._listeners.get(eventKey);\r\n \r\n listeners.forEach(listener => {\r\n target.removeEventListener(eventName, listener.wrappedHandler);\r\n this._removeFromScope(listener);\r\n });\r\n \r\n this._listeners.delete(eventKey);\r\n } else {\r\n for (const [eventKey, listeners] of this._listeners) {\r\n const [targetId] = eventKey.split(':');\r\n \r\n if (this._getTargetId(target) === targetId) {\r\n listeners.forEach(listener => {\r\n target.removeEventListener(listener.eventName, listener.wrappedHandler);\r\n this._removeFromScope(listener);\r\n });\r\n \r\n this._listeners.delete(eventKey);\r\n }\r\n }\r\n }\r\n }\r\n\r\n emit(target, eventName, detail = {}) {\r\n const event = new CustomEvent(eventName, {\r\n detail,\r\n bubbles: true,\r\n cancelable: true\r\n });\r\n \r\n target.dispatchEvent(event);\r\n return event;\r\n }\r\n\r\n emitGlobal(eventName, detail = {}) {\r\n return this.emit(document, eventName, detail);\r\n }\r\n\r\n emitToScope(scope, eventName, detail = {}) {\r\n if (!this._scopeListeners.has(scope)) return;\r\n\r\n const listenerIds = this._scopeListeners.get(scope);\r\n const targets = new Set();\r\n \r\n for (const [eventKey, listeners] of this._listeners) {\r\n listeners.forEach(listener => {\r\n if (listenerIds.includes(listener.id)) {\r\n targets.add(listener.target);\r\n }\r\n });\r\n }\r\n \r\n targets.forEach(target => {\r\n this.emit(target, eventName, detail);\r\n });\r\n }\r\n\r\n getListenerCount(target, eventName = null) {\r\n if (eventName) {\r\n const eventKey = this._getEventKey(target, eventName);\r\n return this._listeners.has(eventKey) ? this._listeners.get(eventKey).length : 0;\r\n }\r\n \r\n let count = 0;\r\n const targetId = this._getTargetId(target);\r\n \r\n for (const [eventKey, listeners] of this._listeners) {\r\n const [keyTargetId] = eventKey.split(':');\r\n if (keyTargetId === targetId) {\r\n count += listeners.length;\r\n }\r\n }\r\n \r\n return count;\r\n }\r\n\r\n getScopeListenerCount(scope) {\r\n return this._scopeListeners.has(scope) ? this._scopeListeners.get(scope).length : 0;\r\n }\r\n\r\n hasListeners(target, eventName = null) {\r\n return this.getListenerCount(target, eventName) > 0;\r\n }\r\n\r\n _getEventKey(target, eventName) {\r\n return `${this._getTargetId(target)}:${eventName}`;\r\n }\r\n\r\n _getTargetId(target) {\r\n if (target === document) return 'document';\r\n if (target === window) return 'window';\r\n if (target === document.body) return 'body';\r\n if (target._kupolaId) return target._kupolaId;\r\n \r\n target._kupolaId = this._generateId();\r\n return target._kupolaId;\r\n }\r\n\r\n _generateId() {\r\n return `ge-${Math.random().toString(36).substr(2, 9)}-${Date.now()}`;\r\n }\r\n\r\n _removeFromScope(listener) {\r\n if (!listener.scope || !this._scopeListeners.has(listener.scope)) return;\r\n \r\n const scopeListeners = this._scopeListeners.get(listener.scope);\r\n const index = scopeListeners.indexOf(listener.id);\r\n \r\n if (index !== -1) {\r\n scopeListeners.splice(index, 1);\r\n \r\n if (scopeListeners.length === 0) {\r\n this._scopeListeners.delete(listener.scope);\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n for (const [eventKey, listeners] of this._listeners) {\r\n listeners.forEach(listener => {\r\n listener.target.removeEventListener(listener.eventName, listener.wrappedHandler);\r\n });\r\n }\r\n \r\n this._listeners.clear();\r\n this._scopeListeners.clear();\r\n }\r\n}\r\n\r\nconst globalEvents = new GlobalEvents();\r\n\r\nfunction on(target, eventName, handler, options) {\r\n return globalEvents.on(target, eventName, handler, options);\r\n}\r\n\r\nfunction once(target, eventName, handler, options) {\r\n return globalEvents.once(target, eventName, handler, options);\r\n}\r\n\r\nfunction off(target, eventName, handler) {\r\n globalEvents.off(target, eventName, handler);\r\n}\r\n\r\nfunction emit(target, eventName, detail) {\r\n return globalEvents.emit(target, eventName, detail);\r\n}\r\n\r\nfunction emitGlobal(eventName, detail) {\r\n return globalEvents.emitGlobal(eventName, detail);\r\n}\r\n\r\nfunction offByScope(scope) {\r\n globalEvents.offByScope(scope);\r\n}\r\n\r\nfunction offAll(target, eventName) {\r\n globalEvents.offAll(target, eventName);\r\n}\r\n\r\nfunction getListenerCount(target, eventName) {\r\n return globalEvents.getListenerCount(target, eventName);\r\n}\r\n\r\nexport { GlobalEvents, globalEvents, on, once, off, emit, emitGlobal, offByScope, offAll, getListenerCount };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.GlobalEvents = GlobalEvents;\r\n window.globalEvents = globalEvents;\r\n window.kupolaOn = on;\r\n window.kupolaOnce = once;\r\n window.kupolaOff = off;\r\n window.kupolaEmit = emit;\r\n window.kupolaEmitGlobal = emitGlobal;\r\n window.kupolaOffByScope = offByScope;\r\n window.kupolaOffAll = offAll;\r\n window.kupolaGetListenerCount = getListenerCount;\r\n}","import { ref } from './data-bind.js';\r\n\r\n// ============================================================\r\n// Scheduler - 批量更新、去重、微任务调度\r\n// ============================================================\r\n\r\nclass Scheduler {\r\n constructor() {\r\n this._queue = new Set();\r\n this._scheduled = false;\r\n }\r\n\r\n schedule(fn) {\r\n this._queue.add(fn);\r\n if (!this._scheduled) {\r\n this._scheduled = true;\r\n queueMicrotask(() => this._flush());\r\n }\r\n }\r\n\r\n _flush() {\r\n const tasks = Array.from(this._queue);\r\n this._queue.clear();\r\n this._scheduled = false;\r\n // Deduplicate: same function only runs once\r\n const seen = new Set();\r\n for (const task of tasks) {\r\n if (!seen.has(task)) {\r\n seen.add(task);\r\n try { task(); } catch (e) { console.error('[DependsScheduler]', e); }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst globalScheduler = new Scheduler();\r\n\r\n// ============================================================\r\n// Cache Manager - TTL + Stale-While-Revalidate\r\n// ============================================================\r\n\r\nclass CacheEntry {\r\n constructor(data, ttl) {\r\n this.data = data;\r\n this.createdAt = Date.now();\r\n this.ttl = ttl; // ms\r\n }\r\n\r\n get isFresh() {\r\n return Date.now() - this.createdAt < this.ttl;\r\n }\r\n\r\n get isStale() {\r\n return !this.isFresh;\r\n }\r\n}\r\n\r\nclass CacheManager {\r\n constructor() {\r\n this._store = new Map();\r\n }\r\n\r\n get(key) {\r\n const entry = this._store.get(key);\r\n if (!entry) return null;\r\n return entry;\r\n }\r\n\r\n set(key, data, ttl = 60000) {\r\n this._store.set(key, new CacheEntry(data, ttl));\r\n }\r\n\r\n has(key) {\r\n return this._store.has(key);\r\n }\r\n\r\n delete(key) {\r\n this._store.delete(key);\r\n }\r\n\r\n clear() {\r\n this._store.clear();\r\n }\r\n\r\n // Get data regardless of freshness (for stale-while-revalidate)\r\n getStale(key) {\r\n const entry = this._store.get(key);\r\n return entry ? entry.data : null;\r\n }\r\n}\r\n\r\n// ============================================================\r\n// Error types\r\n// ============================================================\r\n\r\nclass DependsError extends Error {\r\n constructor(message, code, cause) {\r\n super(message);\r\n this.name = 'DependsError';\r\n this.code = code;\r\n this.cause = cause;\r\n this.timestamp = Date.now();\r\n }\r\n}\r\n\r\n// ============================================================\r\n// HTTP Client Plugin System\r\n// ============================================================\r\n\r\n// Default: native fetch. Stored as direct function reference for performance\r\n// (avoids property lookup on every request).\r\nlet _httpClientFetch = typeof globalThis !== 'undefined' && globalThis.fetch\r\n ? globalThis.fetch.bind(globalThis)\r\n : (typeof window !== 'undefined' && window.fetch ? window.fetch.bind(window) : null);\r\n\r\n/**\r\n * Configure a custom HTTP client for all useDeps/useQuery requests.\r\n * \r\n * The client must provide a `fetch` function that returns a Response-like object:\r\n * { ok: boolean, status: number, headers: object, json(): Promise, text(): Promise }\r\n * \r\n * @param {Object} client - HTTP client object\r\n * @param {Function} client.fetch - fetch function (url, options) => Promise<Response>\r\n * \r\n * @example\r\n * // Use Axios\r\n * import { configureHttpClient } from 'kupola';\r\n * import { createAxiosAdapter } from 'kupola/adapters/axios';\r\n * import axios from 'axios';\r\n * configureHttpClient(createAxiosAdapter(axios));\r\n */\r\nexport function configureHttpClient(client) {\r\n if (!client || typeof client.fetch !== 'function') {\r\n throw new TypeError('[Kupola] configureHttpClient: client must provide a fetch function');\r\n }\r\n _httpClientFetch = client.fetch.bind(client);\r\n}\r\n\r\n/**\r\n * Get the current HTTP client fetch function.\r\n * @returns {Function}\r\n */\r\nexport function getHttpClient() {\r\n return _httpClientFetch;\r\n}\r\n\r\n/**\r\n * Reset HTTP client to native fetch (useful for testing).\r\n */\r\nexport function resetHttpClient() {\r\n _httpClientFetch = typeof globalThis !== 'undefined' && globalThis.fetch\r\n ? globalThis.fetch.bind(globalThis)\r\n : (typeof window !== 'undefined' && window.fetch ? window.fetch.bind(window) : null);\r\n}\r\n\r\n// ============================================================\r\n// Data Source Adapters\r\n// ============================================================\r\n\r\nclass DependsSource {\r\n constructor(config, cacheManager) {\r\n this.config = config;\r\n this.cacheKey = config.cacheKey || String(config.source);\r\n this.staleTime = config.staleTime ?? 60000;\r\n this.cache = cacheManager;\r\n this.subscribers = [];\r\n this.pending = null;\r\n this.retryCount = config.retry ?? 0;\r\n this.retryDelay = config.retryDelay ?? 1000;\r\n this.onError = config.onError || null;\r\n }\r\n\r\n subscribe(callback) {\r\n this.subscribers.push(callback);\r\n return () => {\r\n const idx = this.subscribers.indexOf(callback);\r\n if (idx > -1) this.subscribers.splice(idx, 1);\r\n };\r\n }\r\n\r\n notify() {\r\n // Use scheduler to batch notifications\r\n globalScheduler.schedule(() => {\r\n this.subscribers.forEach(cb => {\r\n try { cb(); } catch (e) { console.error('[DependsSource.notify]', e); }\r\n });\r\n });\r\n }\r\n\r\n async fetch(params) {\r\n throw new DependsError('Source fetch not implemented', 'NOT_IMPLEMENTED');\r\n }\r\n\r\n async getValue(params) {\r\n // 1. Check fresh cache\r\n const cached = this.cache.get(this.cacheKey);\r\n if (cached && cached.isFresh) {\r\n return cached.data;\r\n }\r\n\r\n // 2. Stale-while-revalidate: return stale data immediately, re-fetch in background\r\n if (cached && cached.isStale) {\r\n this._revalidate(params); // fire and forget\r\n return cached.data;\r\n }\r\n\r\n // 3. No cache - fetch with retry\r\n return this._fetchWithRetry(params);\r\n }\r\n\r\n async _fetchWithRetry(params, attempt = 0) {\r\n try {\r\n const result = await this.fetch(params);\r\n this.cache.set(this.cacheKey, result, this.staleTime);\r\n this.notify();\r\n return result;\r\n } catch (error) {\r\n if (attempt < this.retryCount) {\r\n const delay = this.retryDelay * Math.pow(2, attempt);\r\n await new Promise(resolve => setTimeout(resolve, delay));\r\n return this._fetchWithRetry(params, attempt + 1);\r\n }\r\n const depError = error instanceof DependsError\r\n ? error\r\n : new DependsError(error.message || 'Fetch failed', 'FETCH_ERROR', error);\r\n if (this.onError) {\r\n try { this.onError(depError); } catch (_) { /* ignore handler errors */ }\r\n }\r\n throw depError;\r\n }\r\n }\r\n\r\n async _revalidate(params) {\r\n try {\r\n await this._fetchWithRetry(params);\r\n } catch (_) {\r\n // Silently fail for background revalidation\r\n }\r\n }\r\n\r\n invalidate() {\r\n this.cache.delete(this.cacheKey);\r\n this.pending = null;\r\n }\r\n\r\n destroy() {\r\n this.subscribers = [];\r\n this.pending = null;\r\n }\r\n}\r\n\r\n// --- HTTP Source ---\r\nclass FetchedSource extends DependsSource {\r\n constructor(config, cacheManager) {\r\n super(config, cacheManager);\r\n this.method = config.method || 'GET';\r\n this.headers = config.headers || {};\r\n this.queryParams = config.query || {};\r\n }\r\n\r\n async fetch(params) {\r\n let url = this.config.source;\r\n\r\n // Replace path params (:id -> value)\r\n for (const key in params) {\r\n url = url.replace(`:${key}`, encodeURIComponent(params[key]));\r\n }\r\n\r\n // Build query string\r\n const queryParts = [];\r\n for (const [k, v] of Object.entries(this.queryParams || {})) {\r\n queryParts.push(`${encodeURIComponent(k)}=${encodeURIComponent(v)}`);\r\n }\r\n for (const key in params) {\r\n if (!this.config.source.includes(`:${key}`)) {\r\n queryParts.push(`${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`);\r\n }\r\n }\r\n if (queryParts.length > 0) {\r\n url += (url.includes('?') ? '&' : '?') + queryParts.join('&');\r\n }\r\n\r\n const fetchOptions = {\r\n method: this.method.toUpperCase(),\r\n headers: { 'Content-Type': 'application/json', ...this.headers }\r\n };\r\n\r\n if (['POST', 'PUT', 'PATCH'].includes(fetchOptions.method)) {\r\n fetchOptions.body = JSON.stringify(params);\r\n }\r\n\r\n // Use configurable HTTP client (defaults to native fetch)\r\n const clientFetch = _httpClientFetch;\r\n if (!clientFetch) {\r\n throw new DependsError('No HTTP client available. Use configureHttpClient() to set one.', 'NO_HTTP_CLIENT');\r\n }\r\n\r\n const response = await clientFetch(url, fetchOptions);\r\n\r\n // Normalize response: support both native Response and adapter format\r\n const ok = typeof response.ok === 'boolean' ? response.ok : (response.status >= 200 && response.status < 300);\r\n const status = typeof response.status === 'number' ? response.status : 0;\r\n\r\n if (!ok) {\r\n throw new DependsError(`HTTP ${status}`, 'HTTP_ERROR');\r\n }\r\n\r\n // Support both .json() method and plain objects (for adapters that pre-parse)\r\n const data = typeof response.json === 'function'\r\n ? await response.json()\r\n : response.data !== undefined ? response.data : response;\r\n return data;\r\n }\r\n}\r\n\r\n// --- localStorage Source ---\r\nclass StorageSource extends DependsSource {\r\n constructor(config, cacheManager) {\r\n super(config, cacheManager);\r\n this.storageKey = config.source.replace('localStorage:', '');\r\n this.defaultValue = config.default;\r\n this.sync = config.sync !== false; // multi-tab sync by default\r\n\r\n if (this.sync && typeof window !== 'undefined') {\r\n this._storageHandler = (e) => {\r\n if (e.key === this.storageKey) {\r\n this.cache.delete(this.cacheKey);\r\n this.notify();\r\n }\r\n };\r\n window.addEventListener('storage', this._storageHandler);\r\n }\r\n }\r\n\r\n async fetch() {\r\n try {\r\n const value = localStorage.getItem(this.storageKey);\r\n if (value === null) return this.defaultValue;\r\n // Try to parse JSON\r\n try { return JSON.parse(value); } catch (_) { return value; }\r\n } catch (e) {\r\n return this.defaultValue;\r\n }\r\n }\r\n\r\n setValue(value) {\r\n const serialized = typeof value === 'string' ? value : JSON.stringify(value);\r\n localStorage.setItem(this.storageKey, serialized);\r\n this.cache.delete(this.cacheKey);\r\n this.notify();\r\n }\r\n\r\n destroy() {\r\n super.destroy();\r\n if (this._storageHandler) {\r\n window.removeEventListener('storage', this._storageHandler);\r\n }\r\n }\r\n}\r\n\r\n// --- Route Source ---\r\nclass RouteSource extends DependsSource {\r\n constructor(config, cacheManager) {\r\n super(config, cacheManager);\r\n this.paramName = config.source.replace('route:', '');\r\n }\r\n\r\n async fetch() {\r\n if (typeof window === 'undefined') return '';\r\n // Support both hash and history mode\r\n const hash = location.hash.slice(1);\r\n const match = hash.match(new RegExp(`/${this.paramName}/([^/]+)`));\r\n if (match) return decodeURIComponent(match[1]);\r\n\r\n // Fallback to search params\r\n const urlParams = new URLSearchParams(location.search);\r\n return urlParams.get(this.paramName) || '';\r\n }\r\n}\r\n\r\n// --- Function Source ---\r\nclass FunctionSource extends DependsSource {\r\n async fetch(params) {\r\n const result = await this.config.source(params);\r\n return result;\r\n }\r\n}\r\n\r\n// --- Static Source ---\r\nclass StaticSource extends DependsSource {\r\n async fetch() {\r\n return this.config.source;\r\n }\r\n}\r\n\r\n// --- WebSocket Source ---\r\nclass WebSocketSource extends DependsSource {\r\n constructor(config, cacheManager) {\r\n super(config, cacheManager);\r\n this.ws = null;\r\n this.reconnect = config.reconnect !== false;\r\n this.reconnectDelay = config.reconnectDelay || 3000;\r\n this.messageHandler = null;\r\n this._connected = false;\r\n }\r\n\r\n async fetch() {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n this.ws = new WebSocket(this.config.source);\r\n\r\n this.ws.onopen = () => {\r\n this._connected = true;\r\n // Resolve with current cached data or null\r\n resolve(this.cache.getStale(this.cacheKey));\r\n };\r\n\r\n this.messageHandler = (event) => {\r\n let data;\r\n try { data = JSON.parse(event.data); } catch (_) { data = event.data; }\r\n this.cache.set(this.cacheKey, data, this.staleTime);\r\n this.notify();\r\n };\r\n\r\n this.ws.onmessage = this.messageHandler;\r\n\r\n this.ws.onerror = (error) => {\r\n if (!this._connected) {\r\n reject(new DependsError('WebSocket connection failed', 'WS_ERROR', error));\r\n }\r\n };\r\n\r\n this.ws.onclose = () => {\r\n this._connected = false;\r\n if (this.reconnect) {\r\n setTimeout(() => {\r\n this.fetch().catch(() => {});\r\n }, this.reconnectDelay);\r\n }\r\n };\r\n } catch (e) {\r\n reject(new DependsError('WebSocket creation failed', 'WS_ERROR', e));\r\n }\r\n });\r\n }\r\n\r\n send(data) {\r\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\r\n this.ws.send(typeof data === 'string' ? data : JSON.stringify(data));\r\n }\r\n }\r\n\r\n destroy() {\r\n super.destroy();\r\n if (this.ws) {\r\n this.ws.onmessage = null;\r\n this.ws.onclose = null;\r\n this.ws.close();\r\n this.ws = null;\r\n }\r\n }\r\n}\r\n\r\n// ============================================================\r\n// Source Factory\r\n// ============================================================\r\n\r\nfunction createSource(config, cacheManager) {\r\n const source = config.source;\r\n if (typeof source === 'function') {\r\n return new FunctionSource(config, cacheManager);\r\n } else if (typeof source === 'string' && (source.startsWith('ws://') || source.startsWith('wss://'))) {\r\n return new WebSocketSource(config, cacheManager);\r\n } else if (typeof source === 'string' && (source.startsWith('/') || source.startsWith('http'))) {\r\n return new FetchedSource(config, cacheManager);\r\n } else if (typeof source === 'string' && source.startsWith('localStorage:')) {\r\n return new StorageSource(config, cacheManager);\r\n } else if (typeof source === 'string' && source.startsWith('route:')) {\r\n return new RouteSource(config, cacheManager);\r\n } else {\r\n return new StaticSource(config, cacheManager);\r\n }\r\n}\r\n\r\n// ============================================================\r\n// useDeps - Core API\r\n// ============================================================\r\n\r\nexport function useDeps(props, depsConfig) {\r\n const result = {};\r\n const cacheManager = new CacheManager();\r\n const unsubscribers = [];\r\n\r\n for (const key in depsConfig) {\r\n let config = depsConfig[key];\r\n if (typeof config === 'string') {\r\n config = { source: config };\r\n }\r\n\r\n const depConfig = {\r\n ...config,\r\n cacheKey: config.cacheKey || `${key}-${JSON.stringify(_extractPropValues(props))}`\r\n };\r\n\r\n const source = createSource(depConfig, cacheManager);\r\n const data = ref(null);\r\n const loading = ref(true);\r\n const error = ref(null);\r\n const lastUpdated = ref(null);\r\n let _loadId = 0; // dedup concurrent loads\r\n\r\n function getParams() {\r\n return _extractPropValues(props);\r\n }\r\n\r\n async function load() {\r\n const thisLoadId = ++_loadId;\r\n loading.value = true;\r\n error.value = null;\r\n try {\r\n const value = await source.getValue(getParams());\r\n if (thisLoadId !== _loadId) return; // stale load\r\n data.value = value;\r\n lastUpdated.value = Date.now();\r\n } catch (e) {\r\n if (thisLoadId !== _loadId) return;\r\n error.value = e.message || 'Unknown error';\r\n } finally {\r\n if (thisLoadId === _loadId) {\r\n loading.value = false;\r\n }\r\n }\r\n }\r\n\r\n // Initial load\r\n load();\r\n\r\n // Subscribe to source notifications (e.g. WebSocket messages, storage events)\r\n const unsubscribeSource = source.subscribe(() => {\r\n const cached = cacheManager.getStale(source.cacheKey);\r\n if (cached !== null && cached !== undefined) {\r\n data.value = cached;\r\n lastUpdated.value = Date.now();\r\n }\r\n });\r\n unsubscribers.push(unsubscribeSource);\r\n\r\n // Watch prop changes -> invalidate & reload\r\n // Use direct ref subscription (works outside setup context)\r\n const propKeys = Object.keys(props);\r\n if (propKeys.length > 0) {\r\n propKeys.forEach(k => {\r\n const prop = props[k];\r\n if (prop && typeof prop === 'object' && 'value' in prop && prop._subscribers) {\r\n const handler = () => {\r\n source.invalidate();\r\n load();\r\n };\r\n prop._subscribers.add(handler);\r\n unsubscribers.push(() => prop._subscribers.delete(handler));\r\n }\r\n });\r\n }\r\n\r\n result[key] = {\r\n data,\r\n loading,\r\n error,\r\n lastUpdated,\r\n refresh() {\r\n source.invalidate();\r\n return load();\r\n },\r\n // For StorageSource\r\n setValue(value) {\r\n if (source instanceof StorageSource) {\r\n source.setValue(value);\r\n // Also update data ref immediately\r\n data.value = value;\r\n }\r\n },\r\n // For WebSocketSource\r\n send(msg) {\r\n if (source instanceof WebSocketSource) {\r\n source.send(msg);\r\n }\r\n },\r\n _source: source\r\n };\r\n }\r\n\r\n // Cleanup helper\r\n result._dispose = () => {\r\n unsubscribers.forEach(fn => fn());\r\n // Remove from DevTools tracking\r\n if (window.__kupolaDepInstances) {\r\n const idx = window.__kupolaDepInstances.indexOf(result);\r\n if (idx !== -1) window.__kupolaDepInstances.splice(idx, 1);\r\n }\r\n };\r\n\r\n // Register for DevTools tracking\r\n if (!window.__kupolaDepInstances) window.__kupolaDepInstances = [];\r\n window.__kupolaDepInstances.push(result);\r\n\r\n return result;\r\n}\r\n\r\n// ============================================================\r\n// useQuery - Single dependency convenience API\r\n// ============================================================\r\n\r\nexport function useQuery(config) {\r\n const cacheManager = new CacheManager();\r\n const source = createSource(config, cacheManager);\r\n const data = ref(null);\r\n const loading = ref(true);\r\n const error = ref(null);\r\n let _loadId = 0;\r\n\r\n async function load() {\r\n const thisLoadId = ++_loadId;\r\n loading.value = true;\r\n error.value = null;\r\n try {\r\n const value = await source.getValue(config.params || {});\r\n if (thisLoadId !== _loadId) return;\r\n data.value = value;\r\n } catch (e) {\r\n if (thisLoadId !== _loadId) return;\r\n error.value = e.message || 'Unknown error';\r\n } finally {\r\n if (thisLoadId === _loadId) loading.value = false;\r\n }\r\n }\r\n\r\n // Load immediately (works outside setup context)\r\n load();\r\n\r\n source.subscribe(() => {\r\n const cached = cacheManager.getStale(source.cacheKey);\r\n if (cached !== null && cached !== undefined) {\r\n data.value = cached;\r\n }\r\n });\r\n\r\n return {\r\n data,\r\n loading,\r\n error,\r\n refresh() {\r\n source.invalidate();\r\n return load();\r\n }\r\n };\r\n}\r\n\r\n// ============================================================\r\n// Utilities\r\n// ============================================================\r\n\r\nfunction _extractPropValues(props) {\r\n const result = {};\r\n for (const key in props) {\r\n const value = props[key];\r\n if (value && typeof value === 'object' && 'value' in value) {\r\n result[key] = value.value;\r\n } else {\r\n result[key] = value;\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport function clearCache() {\r\n // Global cache clear is no longer applicable; each useDeps has its own cache\r\n}\r\n\r\n// ============================================================\r\n// Exports\r\n// ============================================================\r\n\r\nexport {\r\n Scheduler,\r\n CacheManager,\r\n CacheEntry,\r\n DependsError,\r\n DependsSource,\r\n FetchedSource,\r\n StorageSource,\r\n RouteSource,\r\n FunctionSource,\r\n StaticSource,\r\n WebSocketSource,\r\n createSource\r\n};\r\n\r\n// HTTP Client Plugin System exports are above (configureHttpClient, getHttpClient, resetHttpClient)\r\n\r\nif (typeof window !== 'undefined') {\r\n window.useDeps = useDeps;\r\n window.useQuery = useQuery;\r\n window.clearCache = clearCache;\r\n window.DependsError = DependsError;\r\n window.CacheManager = CacheManager;\r\n window.Scheduler = Scheduler;\r\n window.configureHttpClient = configureHttpClient;\r\n window.getHttpClient = getHttpClient;\r\n window.resetHttpClient = resetHttpClient;\r\n}\r\n","/**\r\n * KupolaTable - Full-featured headless table component\r\n * Features: sort, filter, pagination, selection, expand, inline-edit,\r\n * column-resize, row-drag, sticky columns, tree data,\r\n * virtual scroll, merge cells, multi-sort, CSV export\r\n */\r\n\r\nimport { ref } from './data-bind.js';\r\n\r\nclass KupolaTable {\r\n constructor(element, options = {}) {\r\n this.element = typeof element === 'string' ? document.querySelector(element) : element;\r\n this.options = options;\r\n\r\n // Columns & data\r\n this.columns = (options.columns || []).map((c, i) => ({ ...c, _index: i }));\r\n this.rowKey = options.rowKey || 'id';\r\n this._data = [];\r\n this._loading = false;\r\n\r\n // Display\r\n this.striped = options.striped !== false;\r\n this.bordered = options.bordered || false;\r\n this.hoverable = options.hoverable !== false;\r\n this.compact = options.compact || false;\r\n this.emptyText = options.emptyText || '暂无数据';\r\n this.loadingText = options.loadingText || '加载中...';\r\n\r\n // Sort (multi-sort: array of {key, order})\r\n this.multiSort = options.multiSort || false;\r\n this._sorts = []; // [{key, order}]\r\n\r\n // Filter\r\n this._filterText = '';\r\n\r\n // Pagination\r\n this._showPagination = options.pagination !== false;\r\n this._pageSizes = options.pageSizes || [10, 20, 50, 100];\r\n this._pageSize = options.pageSize || 10;\r\n this._currentPage = 1;\r\n this._total = 0;\r\n\r\n // Selection\r\n this.selection = options.selection || null; // 'checkbox' | 'radio'\r\n this._selectedKeys = new Set();\r\n this.selectionColumnTitle = options.selectionColumnTitle || '';\r\n\r\n // Expand\r\n this.expandable = options.expandable || null; // function(row) => HTML/DOM\r\n this._expandedKeys = new Set();\r\n this.expandColumnTitle = options.expandColumnTitle || '';\r\n\r\n // Inline edit\r\n this.editable = options.editable || false; // true or { onSave, onCancel }\r\n this._editingCell = null; // { rowKey, colKey }\r\n this._editBuffer = {}; // { colKey: value }\r\n\r\n // Column resize\r\n this.resizable = options.resizable || false;\r\n\r\n // Row drag\r\n this.draggable = options.draggable || false;\r\n this._dragState = null;\r\n\r\n // Tree data\r\n this.tree = options.tree || null; // { childrenKey: 'children', defaultExpandAll: false }\r\n this._treeExpandedKeys = new Set();\r\n if (options.tree?.defaultExpandAll) this._treeExpandAll = true;\r\n\r\n // Virtual scroll\r\n this.virtualScroll = options.virtualScroll || null; // { rowHeight: 40, overscan: 5 }\r\n this._scrollContainer = null;\r\n\r\n // Merge cells\r\n this.mergeCells = options.mergeCells || null; // function(data) => [{row, col, rowSpan, colSpan}]\r\n\r\n // Callbacks\r\n this.onSort = options.onSort || null;\r\n this.onPageChange = options.onPageChange || null;\r\n this.onRowClick = options.onRowClick || null;\r\n this.onFilter = options.onFilter || null;\r\n this.onSelect = options.onSelect || null;\r\n this.onExpand = options.onExpand || null;\r\n this.onEditSave = options.onEditSave || null;\r\n this.onEditCancel = options.onEditCancel || null;\r\n this.onRowDragEnd = options.onRowDragEnd || null;\r\n this.onColumnResize = options.onColumnResize || null;\r\n\r\n // Reactive refs\r\n this.sortKey = ref(null);\r\n this.sortOrder = ref(null);\r\n this.currentPage = ref(1);\r\n this.filterText = ref('');\r\n this.selectedKeys = ref([]);\r\n\r\n this._init();\r\n }\r\n\r\n _init() {\r\n this.element.classList.add('kupola-table-wrapper');\r\n if (this.virtualScroll) this.element.classList.add('kupola-table-virtual-wrapper');\r\n this.render();\r\n }\r\n\r\n // ================================================================\r\n // DATA\r\n // ================================================================\r\n\r\n setData(data) {\r\n if (data && typeof data === 'object' && 'value' in data) {\r\n this._data = Array.isArray(data.value) ? data.value : [];\r\n data._subscribers?.add((newVal) => {\r\n this._data = Array.isArray(newVal) ? newVal : [];\r\n this._total = this._data.length;\r\n this.render();\r\n });\r\n } else if (Array.isArray(data)) {\r\n this._data = data;\r\n } else {\r\n this._data = [];\r\n }\r\n if (this.tree && this._treeExpandAll) {\r\n this._flattenForExpand(this._data);\r\n }\r\n this._total = this._getFlatData(this._data).length;\r\n this.render();\r\n }\r\n\r\n setLoading(loading) {\r\n if (loading && typeof loading === 'object' && 'value' in loading) {\r\n this._loading = loading.value;\r\n loading._subscribers?.add((val) => { this._loading = val; this.render(); });\r\n } else {\r\n this._loading = !!loading;\r\n }\r\n this.render();\r\n }\r\n\r\n // ================================================================\r\n // TREE HELPERS\r\n // ================================================================\r\n\r\n _flattenForExpand(data, level = 0, parentKey = null) {\r\n const ck = this.tree?.childrenKey || 'children';\r\n const result = [];\r\n for (const row of data) {\r\n const key = row[this.rowKey];\r\n result.push({ ...row, _level: level, _parentKey: parentKey, _hasChildren: !!(row[ck] && row[ck].length) });\r\n if (row[ck] && row[ck].length) {\r\n result.push(...this._flattenForExpand(row[ck], level + 1, key));\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n _getFlatData(data) {\r\n if (!this.tree) return data;\r\n return this._flattenVisible(data, 0);\r\n }\r\n\r\n _flattenVisible(data, level) {\r\n const ck = this.tree?.childrenKey || 'children';\r\n const result = [];\r\n for (const row of data) {\r\n const key = row[this.rowKey];\r\n result.push({ ...row, _level: level, _hasChildren: !!(row[ck] && row[ck].length) });\r\n if (row[ck] && row[ck].length && this._treeExpandedKeys.has(key)) {\r\n result.push(...this._flattenVisible(row[ck], level + 1));\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n // ================================================================\r\n // PROCESSING: filter → sort → paginate\r\n // ================================================================\r\n\r\n getProcessedData() {\r\n let data = this.tree ? [...this._data] : [...this._data];\r\n\r\n // Filter\r\n if (this._filterText) {\r\n const text = this._filterText.toLowerCase();\r\n if (this.tree) {\r\n data = this._filterTree(data, text);\r\n } else {\r\n data = data.filter(row =>\r\n this.columns.some(col => {\r\n const val = row[col.key];\r\n return val != null && String(val).toLowerCase().includes(text);\r\n })\r\n );\r\n }\r\n }\r\n\r\n // Sort\r\n if (this._sorts.length > 0) {\r\n if (this.tree) {\r\n data = this._sortTree(data);\r\n } else {\r\n data = this._sortFlat(data);\r\n }\r\n }\r\n\r\n const flatData = this.tree ? this._flattenVisible(data) : data;\r\n this._total = flatData.length;\r\n\r\n // Paginate\r\n let pageData = flatData;\r\n if (this._showPagination && this._pageSize > 0) {\r\n const start = (this._currentPage - 1) * this._pageSize;\r\n pageData = flatData.slice(start, start + this._pageSize);\r\n }\r\n\r\n return pageData;\r\n }\r\n\r\n _filterTree(data, text) {\r\n const ck = this.tree?.childrenKey || 'children';\r\n return data.reduce((acc, row) => {\r\n const children = row[ck] ? this._filterTree(row[ck], text) : [];\r\n const selfMatch = this.columns.some(col => {\r\n const v = row[col.key];\r\n return v != null && String(v).toLowerCase().includes(text);\r\n });\r\n if (selfMatch || children.length > 0) {\r\n acc.push({ ...row, [ck]: children });\r\n if (children.length > 0) this._treeExpandedKeys.add(row[this.rowKey]);\r\n }\r\n return acc;\r\n }, []);\r\n }\r\n\r\n _sortFlat(data) {\r\n return [...data].sort((a, b) => {\r\n for (const s of this._sorts) {\r\n const col = this.columns.find(c => c.key === s.key);\r\n let va = a[s.key], vb = b[s.key];\r\n let cmp = 0;\r\n if (col?.sorter) { cmp = col.sorter(va, vb, s.order); }\r\n else {\r\n if (va == null) cmp = 1;\r\n else if (vb == null) cmp = -1;\r\n else if (typeof va === 'number' && typeof vb === 'number') cmp = s.order === 'asc' ? va - vb : vb - va;\r\n else cmp = s.order === 'asc' ? String(va).localeCompare(String(vb)) : String(vb).localeCompare(String(va));\r\n }\r\n if (cmp !== 0) return cmp;\r\n }\r\n return 0;\r\n });\r\n }\r\n\r\n _sortTree(data) {\r\n const sorted = this._sortFlat(data);\r\n const ck = this.tree?.childrenKey || 'children';\r\n return sorted.map(row => row[ck]?.length ? { ...row, [ck]: this._sortTree(row[ck]) } : row);\r\n }\r\n\r\n // ================================================================\r\n // RENDER\r\n // ================================================================\r\n\r\n render() {\r\n const data = this.getProcessedData();\r\n const wrapper = this.element;\r\n wrapper.innerHTML = '';\r\n\r\n // Toolbar\r\n if (this.options.showFilter || this.options.showToolbar) {\r\n wrapper.appendChild(this._renderToolbar());\r\n }\r\n\r\n // Table container (for virtual scroll)\r\n const tableContainer = document.createElement('div');\r\n tableContainer.className = 'kupola-table-container';\r\n\r\n const table = document.createElement('table');\r\n table.className = this._getTableClass();\r\n\r\n // Thead\r\n table.appendChild(this._renderThead());\r\n\r\n // Tbody\r\n if (this.virtualScroll) {\r\n table.appendChild(this._renderVirtualTbody(data));\r\n } else {\r\n table.appendChild(this._renderTbody(data));\r\n }\r\n\r\n tableContainer.appendChild(table);\r\n wrapper.appendChild(tableContainer);\r\n\r\n // Pagination\r\n if (this._showPagination && this._total > 0) {\r\n wrapper.appendChild(this._renderPagination());\r\n }\r\n\r\n // Post-render hooks\r\n if (this.resizable) this._initColumnResize();\r\n if (this.draggable) this._initRowDrag();\r\n this._applyStickyColumns();\r\n }\r\n\r\n _renderThead() {\r\n const thead = document.createElement('thead');\r\n const tr = document.createElement('tr');\r\n\r\n // Selection column\r\n if (this.selection) {\r\n const th = document.createElement('th');\r\n th.className = 'kupola-table-col-selection';\r\n if (this.selection === 'checkbox') {\r\n const cb = document.createElement('input');\r\n cb.type = 'checkbox';\r\n const pageData = this.getProcessedData();\r\n const allKeys = pageData.map(r => r[this.rowKey]);\r\n cb.checked = allKeys.length > 0 && allKeys.every(k => this._selectedKeys.has(k));\r\n cb.addEventListener('change', () => cb.checked ? this.selectAll() : this.deselectAll());\r\n th.appendChild(cb);\r\n }\r\n tr.appendChild(th);\r\n }\r\n\r\n // Expand column\r\n if (this.expandable) {\r\n const th = document.createElement('th');\r\n th.className = 'kupola-table-col-expand';\r\n tr.appendChild(th);\r\n }\r\n\r\n // Data columns\r\n this.columns.forEach(col => {\r\n const th = document.createElement('th');\r\n th.textContent = col.title || col.key;\r\n if (col.width) th.style.width = typeof col.width === 'number' ? col.width + 'px' : col.width;\r\n if (col.minWidth) th.style.minWidth = typeof col.minWidth === 'number' ? col.minWidth + 'px' : col.minWidth;\r\n if (col.align) th.style.textAlign = col.align;\r\n if (col.fixed) th.setAttribute('data-fixed', col.fixed);\r\n\r\n // Sortable\r\n if (col.sortable) {\r\n th.classList.add('kupola-table-sortable');\r\n const sortInfo = this._sorts.find(s => s.key === col.key);\r\n if (sortInfo) th.classList.add(`kupola-table-sort-${sortInfo.order}`);\r\n th.addEventListener('click', (e) => {\r\n if (this.resizable && e.target.classList.contains('kupola-table-resize-handle')) return;\r\n this._handleSort(col.key);\r\n });\r\n const indicator = document.createElement('span');\r\n indicator.className = 'kupola-table-sort-icon';\r\n if (sortInfo) {\r\n indicator.textContent = this.multiSort\r\n ? ` ${this._sorts.indexOf(sortInfo) + 1}${sortInfo.order === 'asc' ? '▲' : '▼'}`\r\n : (sortInfo.order === 'asc' ? ' ▲' : ' ▼');\r\n } else {\r\n indicator.textContent = ' ⇅';\r\n }\r\n th.appendChild(indicator);\r\n }\r\n\r\n // Resize handle\r\n if (this.resizable && col.key !== this.columns[this.columns.length - 1]?.key) {\r\n const handle = document.createElement('span');\r\n handle.className = 'kupola-table-resize-handle';\r\n handle.setAttribute('data-col-key', col.key);\r\n th.appendChild(handle);\r\n }\r\n\r\n tr.appendChild(th);\r\n });\r\n\r\n thead.appendChild(tr);\r\n return thead;\r\n }\r\n\r\n _renderTbody(data) {\r\n const tbody = document.createElement('tbody');\r\n\r\n if (this._loading) {\r\n tbody.appendChild(this._renderStatusRow(this.loadingText, 'kupola-table-loading'));\r\n } else if (data.length === 0) {\r\n tbody.appendChild(this._renderStatusRow(this.emptyText, 'kupola-table-empty'));\r\n } else {\r\n // Merge cells config\r\n const mergeConfig = this.mergeCells ? this.mergeCells(data) : [];\r\n const mergeMap = new Map();\r\n mergeConfig.forEach(m => mergeMap.set(`${m.row}-${m.col}`, m));\r\n const skipCells = new Set();\r\n\r\n data.forEach((row, rowIndex) => {\r\n const key = row[this.rowKey] ?? rowIndex;\r\n const isSelected = this._selectedKeys.has(key);\r\n const isExpanded = this._expandedKeys.has(key);\r\n\r\n // Data row\r\n const tr = this._renderDataRow(row, rowIndex, key, isSelected, skipCells, mergeMap);\r\n tbody.appendChild(tr);\r\n\r\n // Expand row\r\n if (this.expandable && isExpanded) {\r\n const expandTr = document.createElement('tr');\r\n expandTr.className = 'kupola-table-expand-row';\r\n const expandTd = document.createElement('td');\r\n const totalCols = this.columns.length + (this.selection ? 1 : 0) + 1;\r\n expandTd.colSpan = totalCols;\r\n expandTd.className = 'kupola-table-expand-content';\r\n const content = this.expandable(row);\r\n if (typeof content === 'string') expandTd.innerHTML = content;\r\n else if (content instanceof HTMLElement) expandTd.appendChild(content);\r\n expandTr.appendChild(expandTd);\r\n tbody.appendChild(expandTr);\r\n }\r\n });\r\n }\r\n return tbody;\r\n }\r\n\r\n _renderDataRow(row, rowIndex, key, isSelected, skipCells, mergeMap) {\r\n const tr = document.createElement('tr');\r\n tr.setAttribute('data-row-key', key);\r\n if (isSelected) tr.classList.add('kupola-table-row-selected');\r\n if (this.draggable) {\r\n tr.draggable = true;\r\n tr.classList.add('kupola-table-draggable');\r\n }\r\n\r\n // Selection cell\r\n if (this.selection) {\r\n const td = document.createElement('td');\r\n td.className = 'kupola-table-col-selection';\r\n const input = document.createElement('input');\r\n input.type = this.selection;\r\n input.checked = isSelected;\r\n input.addEventListener('change', () => {\r\n if (this.selection === 'radio') {\r\n this._selectedKeys.clear();\r\n this._selectedKeys.add(key);\r\n } else {\r\n isSelected ? this._selectedKeys.delete(key) : this._selectedKeys.add(key);\r\n }\r\n this.selectedKeys.value = [...this._selectedKeys];\r\n if (this.onSelect) this.onSelect([...this._selectedKeys], this.getSelectedRows());\r\n this.render();\r\n });\r\n td.appendChild(input);\r\n tr.appendChild(td);\r\n }\r\n\r\n // Expand cell\r\n if (this.expandable) {\r\n const td = document.createElement('td');\r\n td.className = 'kupola-table-col-expand';\r\n const btn = document.createElement('button');\r\n btn.className = 'kupola-table-expand-btn';\r\n const isExpanded = this._expandedKeys.has(key);\r\n btn.textContent = isExpanded ? '▼' : '▶';\r\n btn.type = 'button';\r\n btn.addEventListener('click', () => this._toggleExpand(key));\r\n td.appendChild(btn);\r\n tr.appendChild(td);\r\n }\r\n\r\n // Data cells\r\n this.columns.forEach((col, colIndex) => {\r\n // Skip merged cells\r\n if (skipCells.has(`${rowIndex}-${colIndex}`)) return;\r\n\r\n const td = document.createElement('td');\r\n if (col.align) td.style.textAlign = col.align;\r\n if (col.fixed) {\r\n td.setAttribute('data-fixed', col.fixed);\r\n td.classList.add(`kupola-table-fixed-${col.fixed}`);\r\n }\r\n\r\n // Merge cells\r\n const mergeInfo = mergeMap.get(`${rowIndex}-${colIndex}`);\r\n if (mergeInfo) {\r\n if (mergeInfo.rowSpan > 1) td.rowSpan = mergeInfo.rowSpan;\r\n if (mergeInfo.colSpan > 1) td.colSpan = mergeInfo.colSpan;\r\n for (let r = 0; r < (mergeInfo.rowSpan || 1); r++) {\r\n for (let c = 0; c < (mergeInfo.colSpan || 1); c++) {\r\n if (r === 0 && c === 0) continue;\r\n skipCells.add(`${rowIndex + r}-${colIndex + c}`);\r\n }\r\n }\r\n }\r\n\r\n // Tree indent\r\n if (this.tree && colIndex === 0 && row._level > 0) {\r\n const indent = document.createElement('span');\r\n indent.className = 'kupola-table-tree-indent';\r\n indent.style.paddingLeft = (row._level * 20) + 'px';\r\n td.appendChild(indent);\r\n if (row._hasChildren) {\r\n const toggle = document.createElement('button');\r\n toggle.className = 'kupola-table-tree-toggle';\r\n toggle.textContent = this._treeExpandedKeys.has(row[this.rowKey]) ? '▼' : '▶';\r\n toggle.type = 'button';\r\n toggle.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n this._toggleTreeExpand(row[this.rowKey]);\r\n });\r\n td.appendChild(toggle);\r\n } else {\r\n const spacer = document.createElement('span');\r\n spacer.className = 'kupola-table-tree-toggle-placeholder';\r\n td.appendChild(spacer);\r\n }\r\n }\r\n\r\n // Editable cell\r\n const isEditing = this._editingCell &&\r\n this._editingCell.rowKey === key && this._editingCell.colKey === col.key;\r\n\r\n if (isEditing) {\r\n td.appendChild(this._renderEditCell(col, row));\r\n } else if (col.render) {\r\n const content = col.render(row[col.key], row, rowIndex);\r\n if (typeof content === 'string') td.innerHTML = content;\r\n else if (content instanceof HTMLElement) td.appendChild(content);\r\n } else {\r\n td.textContent = row[col.key] ?? '';\r\n }\r\n\r\n // Double-click to edit\r\n if (this.editable && !isEditing && col.editable !== false) {\r\n td.classList.add('kupola-table-editable-cell');\r\n td.addEventListener('dblclick', () => this._startEdit(key, col.key, row[col.key]));\r\n }\r\n\r\n tr.appendChild(td);\r\n });\r\n\r\n if (this.onRowClick) {\r\n tr.style.cursor = 'pointer';\r\n tr.addEventListener('click', (e) => {\r\n if (e.target.closest('.kupola-table-expand-btn, .kupola-table-tree-toggle, input, button')) return;\r\n this.onRowClick(row, rowIndex, e);\r\n });\r\n }\r\n\r\n return tr;\r\n }\r\n\r\n _renderStatusRow(text, className) {\r\n const tr = document.createElement('tr');\r\n const td = document.createElement('td');\r\n td.colSpan = this.columns.length + (this.selection ? 1 : 0) + (this.expandable ? 1 : 0);\r\n td.className = className;\r\n td.textContent = text;\r\n tr.appendChild(td);\r\n return tr;\r\n }\r\n\r\n // ================================================================\r\n // VIRTUAL SCROLL\r\n // ================================================================\r\n\r\n _renderVirtualTbody(data) {\r\n const tbody = document.createElement('tbody');\r\n const { rowHeight = 40, overscan = 5 } = this.virtualScroll;\r\n const totalHeight = data.length * rowHeight;\r\n\r\n if (this._loading) {\r\n return this._renderTbody(data);\r\n }\r\n if (data.length === 0) {\r\n return this._renderTbody(data);\r\n }\r\n\r\n // Create spacer rows for total height\r\n const topSpacer = document.createElement('tr');\r\n topSpacer.className = 'kupola-table-virtual-spacer-top';\r\n topSpacer.style.height = '0px';\r\n tbody.appendChild(topSpacer);\r\n\r\n // We'll update positions in _updateVirtualScroll\r\n this._virtualData = { data, rowHeight, overscan, totalHeight, tbody, topSpacer };\r\n this._updateVirtualScroll();\r\n\r\n const bottomSpacer = document.createElement('tr');\r\n bottomSpacer.className = 'kupola-table-virtual-spacer-bottom';\r\n bottomSpacer.style.height = '0px';\r\n tbody.appendChild(bottomSpacer);\r\n\r\n // Attach scroll listener\r\n const wrapper = this.element.querySelector('.kupola-table-container');\r\n if (wrapper) {\r\n wrapper.style.maxHeight = this.virtualScroll.maxHeight || '400px';\r\n wrapper.style.overflowY = 'auto';\r\n wrapper.addEventListener('scroll', () => this._updateVirtualScroll());\r\n }\r\n\r\n return tbody;\r\n }\r\n\r\n _updateVirtualScroll() {\r\n if (!this._virtualData) return;\r\n const { data, rowHeight, overscan, tbody, topSpacer } = this._virtualData;\r\n const wrapper = this.element.querySelector('.kupola-table-container');\r\n if (!wrapper) return;\r\n\r\n const scrollTop = wrapper.scrollTop;\r\n const viewHeight = wrapper.clientHeight;\r\n const startIdx = Math.max(0, Math.floor(scrollTop / rowHeight) - overscan);\r\n const endIdx = Math.min(data.length, Math.ceil((scrollTop + viewHeight) / rowHeight) + overscan);\r\n\r\n // Remove existing data rows\r\n const existingRows = tbody.querySelectorAll('.kupola-table-virtual-row');\r\n existingRows.forEach(r => r.remove());\r\n\r\n // Insert visible rows\r\n const fragment = document.createDocumentFragment();\r\n for (let i = startIdx; i < endIdx; i++) {\r\n const row = data[i];\r\n const key = row[this.rowKey] ?? i;\r\n const tr = this._renderDataRow(row, i, key, this._selectedKeys.has(key), new Set(), new Map());\r\n tr.classList.add('kupola-table-virtual-row');\r\n tr.style.height = rowHeight + 'px';\r\n fragment.appendChild(tr);\r\n }\r\n\r\n topSpacer.style.height = (startIdx * rowHeight) + 'px';\r\n const bottomSpacer = tbody.querySelector('.kupola-table-virtual-spacer-bottom');\r\n if (bottomSpacer) bottomSpacer.style.height = ((data.length - endIdx) * rowHeight) + 'px';\r\n\r\n topSpacer.after(fragment);\r\n }\r\n\r\n // ================================================================\r\n // INLINE EDIT\r\n // ================================================================\r\n\r\n _renderEditCell(col, row) {\r\n const container = document.createElement('div');\r\n container.className = 'kupola-table-edit-cell';\r\n\r\n const input = document.createElement('input');\r\n input.type = col.editType || 'text';\r\n input.className = 'ds-input kupola-table-edit-input';\r\n input.value = this._editBuffer[col.key] ?? row[col.key] ?? '';\r\n if (col.editOptions) {\r\n // Select dropdown\r\n const select = document.createElement('select');\r\n select.className = 'ds-input kupola-table-edit-input';\r\n col.editOptions.forEach(opt => {\r\n const o = document.createElement('option');\r\n o.value = typeof opt === 'object' ? opt.value : opt;\r\n o.textContent = typeof opt === 'object' ? opt.label : opt;\r\n if (String(o.value) === String(input.value)) o.selected = true;\r\n select.appendChild(o);\r\n });\r\n select.addEventListener('change', () => { this._editBuffer[col.key] = select.value; });\r\n container.appendChild(select);\r\n } else {\r\n input.addEventListener('input', () => { this._editBuffer[col.key] = input.value; });\r\n container.appendChild(input);\r\n }\r\n\r\n // Save / Cancel buttons\r\n const actions = document.createElement('div');\r\n actions.className = 'kupola-table-edit-actions';\r\n const saveBtn = document.createElement('button');\r\n saveBtn.className = 'kupola-table-edit-save';\r\n saveBtn.textContent = '✓';\r\n saveBtn.type = 'button';\r\n saveBtn.addEventListener('click', () => this._saveEdit(row, col));\r\n const cancelBtn = document.createElement('button');\r\n cancelBtn.className = 'kupola-table-edit-cancel';\r\n cancelBtn.textContent = '✗';\r\n cancelBtn.type = 'button';\r\n cancelBtn.addEventListener('click', () => this._cancelEdit());\r\n actions.appendChild(saveBtn);\r\n actions.appendChild(cancelBtn);\r\n container.appendChild(actions);\r\n\r\n // Enter to save, Escape to cancel\r\n input.addEventListener('keydown', (e) => {\r\n if (e.key === 'Enter') this._saveEdit(row, col);\r\n if (e.key === 'Escape') this._cancelEdit();\r\n });\r\n\r\n setTimeout(() => input.focus?.(), 0);\r\n return container;\r\n }\r\n\r\n _startEdit(rowKey, colKey, currentValue) {\r\n this._editingCell = { rowKey, colKey };\r\n this._editBuffer = { [colKey]: currentValue };\r\n this.render();\r\n }\r\n\r\n _saveEdit(row, col) {\r\n const newValue = this._editBuffer[col.key];\r\n if (this.onEditSave) {\r\n this.onEditSave(row, col.key, newValue, this._data);\r\n } else {\r\n row[col.key] = newValue;\r\n }\r\n this._editingCell = null;\r\n this._editBuffer = {};\r\n this.render();\r\n }\r\n\r\n _cancelEdit() {\r\n if (this.onEditCancel) this.onEditCancel(this._editingCell);\r\n this._editingCell = null;\r\n this._editBuffer = {};\r\n this.render();\r\n }\r\n\r\n // ================================================================\r\n // SORT\r\n // ================================================================\r\n\r\n _handleSort(key) {\r\n if (this.multiSort) {\r\n const existing = this._sorts.findIndex(s => s.key === key);\r\n if (existing >= 0) {\r\n const s = this._sorts[existing];\r\n if (s.order === 'asc') s.order = 'desc';\r\n else this._sorts.splice(existing, 1);\r\n } else {\r\n this._sorts.push({ key, order: 'asc' });\r\n }\r\n } else {\r\n const existing = this._sorts.find(s => s.key === key);\r\n if (existing) {\r\n if (existing.order === 'asc') existing.order = 'desc';\r\n else this._sorts = [];\r\n } else {\r\n this._sorts = [{ key, order: 'asc' }];\r\n }\r\n }\r\n this.sortKey.value = this._sorts.map(s => s.key).join(',');\r\n this.sortOrder.value = this._sorts.map(s => s.order).join(',');\r\n this._currentPage = 1;\r\n if (this.onSort) this.onSort(this._sorts);\r\n this.render();\r\n }\r\n\r\n // ================================================================\r\n // EXPAND\r\n // ================================================================\r\n\r\n _toggleExpand(key) {\r\n this._expandedKeys.has(key) ? this._expandedKeys.delete(key) : this._expandedKeys.add(key);\r\n if (this.onExpand) this.onExpand(key, this._expandedKeys.has(key));\r\n this.render();\r\n }\r\n\r\n _toggleTreeExpand(key) {\r\n this._treeExpandedKeys.has(key) ? this._treeExpandedKeys.delete(key) : this._treeExpandedKeys.add(key);\r\n this.render();\r\n }\r\n\r\n // ================================================================\r\n // SELECTION API\r\n // ================================================================\r\n\r\n selectRow(key) { this._selectedKeys.add(key); this._syncSelected(); this.render(); }\r\n deselectRow(key) { this._selectedKeys.delete(key); this._syncSelected(); this.render(); }\r\n selectAll() {\r\n this.getProcessedData().forEach(r => this._selectedKeys.add(r[this.rowKey]));\r\n this._syncSelected(); this.render();\r\n }\r\n deselectAll() { this._selectedKeys.clear(); this._syncSelected(); this.render(); }\r\n invertSelection() {\r\n const pageData = this.getProcessedData();\r\n pageData.forEach(r => {\r\n const k = r[this.rowKey];\r\n this._selectedKeys.has(k) ? this._selectedKeys.delete(k) : this._selectedKeys.add(k);\r\n });\r\n this._syncSelected(); this.render();\r\n }\r\n getSelectedKeys() { return [...this._selectedKeys]; }\r\n getSelectedRows() {\r\n const all = this.tree ? this._flattenForExpand(this._data) : this._data;\r\n return all.filter(r => this._selectedKeys.has(r[this.rowKey]));\r\n }\r\n _syncSelected() { this.selectedKeys.value = [...this._selectedKeys]; }\r\n\r\n // ================================================================\r\n // COLUMN RESIZE\r\n // ================================================================\r\n\r\n _initColumnResize() {\r\n const handles = this.element.querySelectorAll('.kupola-table-resize-handle');\r\n handles.forEach(handle => {\r\n handle.addEventListener('mousedown', (e) => {\r\n e.preventDefault();\r\n const colKey = handle.getAttribute('data-col-key');\r\n const th = handle.parentElement;\r\n const startX = e.clientX;\r\n const startWidth = th.offsetWidth;\r\n\r\n const onMouseMove = (ev) => {\r\n const newWidth = Math.max(50, startWidth + (ev.clientX - startX));\r\n th.style.width = newWidth + 'px';\r\n const col = this.columns.find(c => c.key === colKey);\r\n if (col) col.width = newWidth;\r\n if (this.onColumnResize) this.onColumnResize(colKey, newWidth);\r\n };\r\n const onMouseUp = () => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n });\r\n });\r\n }\r\n\r\n // ================================================================\r\n // ROW DRAG\r\n // ================================================================\r\n\r\n _initRowDrag() {\r\n const rows = this.element.querySelectorAll('tbody tr[data-row-key]');\r\n rows.forEach(row => {\r\n row.addEventListener('dragstart', (e) => {\r\n this._dragState = { fromKey: row.getAttribute('data-row-key') };\r\n row.classList.add('kupola-table-dragging');\r\n e.dataTransfer.effectAllowed = 'move';\r\n });\r\n row.addEventListener('dragover', (e) => {\r\n e.preventDefault();\r\n e.dataTransfer.dropEffect = 'move';\r\n row.classList.add('kupola-table-drag-over');\r\n });\r\n row.addEventListener('dragleave', () => row.classList.remove('kupola-table-drag-over'));\r\n row.addEventListener('drop', (e) => {\r\n e.preventDefault();\r\n row.classList.remove('kupola-table-drag-over');\r\n if (!this._dragState) return;\r\n const toKey = row.getAttribute('data-row-key');\r\n if (this._dragState.fromKey === toKey) return;\r\n const fromIdx = this._data.findIndex(r => String(r[this.rowKey]) === this._dragState.fromKey);\r\n const toIdx = this._data.findIndex(r => String(r[this.rowKey]) === toKey);\r\n if (fromIdx >= 0 && toIdx >= 0) {\r\n const [moved] = this._data.splice(fromIdx, 1);\r\n this._data.splice(toIdx, 0, moved);\r\n if (this.onRowDragEnd) this.onRowDragEnd(moved, fromIdx, toIdx, this._data);\r\n this.render();\r\n }\r\n });\r\n row.addEventListener('dragend', () => {\r\n row.classList.remove('kupola-table-dragging');\r\n this._dragState = null;\r\n });\r\n });\r\n }\r\n\r\n // ================================================================\r\n // STICKY COLUMNS\r\n // ================================================================\r\n\r\n _applyStickyColumns() {\r\n let leftOffset = 0;\r\n const fixedLeft = this.columns.filter(c => c.fixed === 'left');\r\n if (this.selection) leftOffset += 40;\r\n if (this.expandable) leftOffset += 40;\r\n\r\n fixedLeft.forEach(col => {\r\n const ths = this.element.querySelectorAll(`th[data-fixed=\"left\"]`);\r\n const tds = this.element.querySelectorAll(`td[data-fixed=\"left\"]`);\r\n // Apply offset per column\r\n const colIdx = this.columns.indexOf(col);\r\n let offset = (this.selection ? 40 : 0) + (this.expandable ? 40 : 0);\r\n for (let i = 0; i < colIdx; i++) {\r\n if (this.columns[i].fixed === 'left') offset += (this.columns[i]._resolvedWidth || 120);\r\n }\r\n ths.forEach(th => {\r\n if (th.textContent.startsWith(col.title || col.key)) {\r\n th.style.position = 'sticky';\r\n th.style.left = offset + 'px';\r\n th.style.zIndex = '2';\r\n col._resolvedWidth = th.offsetWidth;\r\n }\r\n });\r\n tds.forEach(td => {\r\n td.style.position = 'sticky';\r\n td.style.left = offset + 'px';\r\n td.style.zIndex = '1';\r\n td.style.background = 'inherit';\r\n });\r\n });\r\n\r\n // Fixed right\r\n let rightOffset = 0;\r\n const fixedRight = [...this.columns].filter(c => c.fixed === 'right').reverse();\r\n fixedRight.forEach(col => {\r\n const tds = this.element.querySelectorAll(`td[data-fixed=\"right\"]`);\r\n tds.forEach(td => {\r\n td.style.position = 'sticky';\r\n td.style.right = rightOffset + 'px';\r\n td.style.zIndex = '1';\r\n });\r\n rightOffset += (col._resolvedWidth || col.width || 120);\r\n });\r\n }\r\n\r\n // ================================================================\r\n // TOOLBAR\r\n // ================================================================\r\n\r\n _renderToolbar() {\r\n const toolbar = document.createElement('div');\r\n toolbar.className = 'kupola-table-toolbar';\r\n\r\n if (this.options.showFilter) {\r\n const filterInput = document.createElement('input');\r\n filterInput.type = 'text';\r\n filterInput.className = 'ds-input kupola-table-filter-input';\r\n filterInput.placeholder = this.options.filterPlaceholder || '搜索...';\r\n filterInput.value = this._filterText;\r\n let debounceTimer;\r\n filterInput.addEventListener('input', () => {\r\n clearTimeout(debounceTimer);\r\n debounceTimer = setTimeout(() => {\r\n this._filterText = filterInput.value;\r\n this._currentPage = 1;\r\n this.filterText.value = this._filterText;\r\n if (this.onFilter) this.onFilter(this._filterText);\r\n this.render();\r\n }, 300);\r\n });\r\n toolbar.appendChild(filterInput);\r\n }\r\n\r\n const right = document.createElement('div');\r\n right.className = 'kupola-table-toolbar-right';\r\n\r\n // Selection info\r\n if (this.selection && this._selectedKeys.size > 0) {\r\n const info = document.createElement('span');\r\n info.className = 'kupola-table-selection-info';\r\n info.textContent = `已选 ${this._selectedKeys.size} 项`;\r\n right.appendChild(info);\r\n\r\n const invertBtn = document.createElement('button');\r\n invertBtn.className = 'ds-btn ds-btn--sm';\r\n invertBtn.textContent = '反选';\r\n invertBtn.type = 'button';\r\n invertBtn.addEventListener('click', () => this.invertSelection());\r\n right.appendChild(invertBtn);\r\n }\r\n\r\n // Export button\r\n if (this.options.showExport) {\r\n const exportBtn = document.createElement('button');\r\n exportBtn.className = 'ds-btn ds-btn--sm ds-btn--secondary';\r\n exportBtn.textContent = '导出 CSV';\r\n exportBtn.type = 'button';\r\n exportBtn.addEventListener('click', () => this.exportCSV());\r\n right.appendChild(exportBtn);\r\n }\r\n\r\n // Total count\r\n const totalInfo = document.createElement('span');\r\n totalInfo.className = 'kupola-table-info';\r\n totalInfo.textContent = `共 ${this._total} 条`;\r\n right.appendChild(totalInfo);\r\n\r\n toolbar.appendChild(right);\r\n return toolbar;\r\n }\r\n\r\n // ================================================================\r\n // PAGINATION\r\n // ================================================================\r\n\r\n _renderPagination() {\r\n const totalPages = Math.ceil(this._total / this._pageSize);\r\n if (totalPages <= 1) return document.createElement('div');\r\n\r\n const nav = document.createElement('div');\r\n nav.className = 'kupola-table-pagination';\r\n\r\n if (this.options.showPageSize) {\r\n const sizeSelect = document.createElement('select');\r\n sizeSelect.className = 'kupola-table-page-size';\r\n this._pageSizes.forEach(size => {\r\n const opt = document.createElement('option');\r\n opt.value = size;\r\n opt.textContent = `${size} 条/页`;\r\n if (size === this._pageSize) opt.selected = true;\r\n sizeSelect.appendChild(opt);\r\n });\r\n sizeSelect.addEventListener('change', () => {\r\n this._pageSize = parseInt(sizeSelect.value);\r\n this._currentPage = 1;\r\n this.currentPage.value = 1;\r\n this.render();\r\n });\r\n nav.appendChild(sizeSelect);\r\n }\r\n\r\n const pages = document.createElement('div');\r\n pages.className = 'kupola-table-pages';\r\n\r\n const prevBtn = this._createPageBtn('‹', () => this._goToPage(this._currentPage - 1));\r\n prevBtn.disabled = this._currentPage <= 1;\r\n pages.appendChild(prevBtn);\r\n\r\n this._getPageRange(this._currentPage, totalPages).forEach(p => {\r\n if (p === '...') {\r\n const span = document.createElement('span');\r\n span.className = 'kupola-table-page-ellipsis';\r\n span.textContent = '...';\r\n pages.appendChild(span);\r\n } else {\r\n const btn = this._createPageBtn(p, () => this._goToPage(p));\r\n if (p === this._currentPage) btn.classList.add('active');\r\n pages.appendChild(btn);\r\n }\r\n });\r\n\r\n const nextBtn = this._createPageBtn('›', () => this._goToPage(this._currentPage + 1));\r\n nextBtn.disabled = this._currentPage >= totalPages;\r\n pages.appendChild(nextBtn);\r\n\r\n nav.appendChild(pages);\r\n\r\n const info = document.createElement('span');\r\n info.className = 'kupola-table-page-info';\r\n info.textContent = `${this._currentPage} / ${totalPages}`;\r\n nav.appendChild(info);\r\n\r\n return nav;\r\n }\r\n\r\n _createPageBtn(text, onClick) {\r\n const btn = document.createElement('button');\r\n btn.className = 'kupola-table-page-btn';\r\n btn.textContent = text;\r\n btn.type = 'button';\r\n btn.addEventListener('click', onClick);\r\n return btn;\r\n }\r\n\r\n _goToPage(page) {\r\n const totalPages = Math.ceil(this._total / this._pageSize);\r\n if (page < 1 || page > totalPages) return;\r\n this._currentPage = page;\r\n this.currentPage.value = page;\r\n if (this.onPageChange) this.onPageChange(page, this._pageSize);\r\n this.render();\r\n }\r\n\r\n _getPageRange(current, total) {\r\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\r\n const range = [];\r\n if (current <= 3) { for (let i = 1; i <= 5; i++) range.push(i); range.push('...', total); }\r\n else if (current >= total - 2) { range.push(1, '...'); for (let i = total - 4; i <= total; i++) range.push(i); }\r\n else { range.push(1, '...'); for (let i = current - 1; i <= current + 1; i++) range.push(i); range.push('...', total); }\r\n return range;\r\n }\r\n\r\n // ================================================================\r\n // EXPORT CSV\r\n // ================================================================\r\n\r\n exportCSV(filename = 'export.csv') {\r\n const data = this.getProcessedData();\r\n const headers = this.columns.map(c => c.title || c.key);\r\n const rows = data.map(row =>\r\n this.columns.map(col => {\r\n let val = row[col.key];\r\n if (val == null) val = '';\r\n val = String(val).replace(/\"/g, '\"\"');\r\n return `\"${val}\"`;\r\n }).join(',')\r\n );\r\n const csv = '\\uFEFF' + [headers.join(','), ...rows].join('\\n');\r\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = filename;\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n }\r\n\r\n // ================================================================\r\n // HELPERS\r\n // ================================================================\r\n\r\n _getTableClass() {\r\n const classes = ['kupola-table'];\r\n if (this.striped) classes.push('kupola-table-striped');\r\n if (this.bordered) classes.push('kupola-table-bordered');\r\n if (this.hoverable) classes.push('kupola-table-hover');\r\n if (this.compact) classes.push('kupola-table-compact');\r\n return classes.join(' ');\r\n }\r\n\r\n refresh() { this.render(); }\r\n\r\n getPage() { return { current: this._currentPage, pageSize: this._pageSize, total: this._total }; }\r\n\r\n setColumns(columns) {\r\n this.columns = columns.map((c, i) => ({ ...c, _index: i }));\r\n this.render();\r\n }\r\n\r\n destroy() {\r\n this.element.innerHTML = '';\r\n this.element.classList.remove('kupola-table-wrapper', 'kupola-table-virtual-wrapper');\r\n }\r\n}\r\n\r\n// ================================================================\r\n// CSS\r\n// ================================================================\r\n\r\nlet stylesInjected = false;\r\nfunction injectTableStyles() {\r\n if (stylesInjected || typeof document === 'undefined') return;\r\n const style = document.createElement('style');\r\n style.textContent = `\r\n .kupola-table-wrapper { width: 100%; }\r\n .kupola-table-container { overflow-x: auto; }\r\n .kupola-table { width: 100%; border-collapse: collapse; font-size: 14px; }\r\n .kupola-table th, .kupola-table td { padding: 12px 16px; text-align: left; border-bottom: 1px solid #e8e8e8; }\r\n .kupola-table th { background: #fafafa; font-weight: 600; color: #333; white-space: nowrap; }\r\n .kupola-table-striped tbody tr:nth-child(even) { background: #fafafa; }\r\n .kupola-table-hover tbody tr:hover { background: #f0f7ff; }\r\n .kupola-table-bordered { border: 1px solid #e8e8e8; }\r\n .kupola-table-bordered th, .kupola-table-bordered td { border: 1px solid #e8e8e8; }\r\n .kupola-table-compact th, .kupola-table-compact td { padding: 8px 12px; }\r\n .kupola-table-sortable { cursor: pointer; user-select: none; position: relative; }\r\n .kupola-table-sortable:hover { background: #f0f0f0; }\r\n .kupola-table-sort-icon { font-size: 12px; opacity: 0.5; margin-left: 4px; }\r\n .kupola-table-sort-asc .kupola-table-sort-icon,\r\n .kupola-table-sort-desc .kupola-table-sort-icon { opacity: 1; color: #1890ff; }\r\n .kupola-table-empty, .kupola-table-loading { text-align: center; padding: 40px 16px !important; color: #999; }\r\n .kupola-table-toolbar { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; flex-wrap: wrap; gap: 8px; }\r\n .kupola-table-toolbar-right { display: flex; align-items: center; gap: 8px; }\r\n .kupola-table-filter-input { padding: 6px 12px; border: 1px solid #d9d9d9; border-radius: 4px; font-size: 14px; width: 240px; }\r\n .kupola-table-filter-input:focus { outline: none; border-color: #1890ff; box-shadow: 0 0 0 2px rgba(24,144,255,0.1); }\r\n .kupola-table-info { color: #999; font-size: 13px; }\r\n .kupola-table-selection-info { color: #1890ff; font-size: 13px; font-weight: 500; }\r\n .kupola-table-col-selection { width: 40px; text-align: center; }\r\n .kupola-table-col-expand { width: 40px; text-align: center; }\r\n .kupola-table-expand-btn { background: none; border: none; cursor: pointer; font-size: 12px; padding: 2px 6px; color: #666; }\r\n .kupola-table-expand-btn:hover { color: #1890ff; }\r\n .kupola-table-expand-row td { background: #fafafa; padding: 16px; }\r\n .kupola-table-row-selected { background: #e6f7ff !important; }\r\n .kupola-table-row-selected:hover { background: #bae7ff !important; }\r\n /* Resize */\r\n .kupola-table-resize-handle { position: absolute; right: 0; top: 0; bottom: 0; width: 6px; cursor: col-resize; background: transparent; }\r\n .kupola-table-resize-handle:hover { background: #1890ff; opacity: 0.3; }\r\n /* Drag */\r\n .kupola-table-draggable { transition: opacity 0.2s; }\r\n .kupola-table-dragging { opacity: 0.4; }\r\n .kupola-table-drag-over { border-top: 2px solid #1890ff !important; }\r\n /* Edit */\r\n .kupola-table-editable-cell { cursor: text; }\r\n .kupola-table-editable-cell:hover { background: #e6f7ff; }\r\n .kupola-table-edit-cell { display: flex; gap: 4px; align-items: center; }\r\n .kupola-table-edit-input { flex: 1; padding: 2px 6px; font-size: 13px; }\r\n .kupola-table-edit-actions { display: flex; gap: 2px; }\r\n .kupola-table-edit-save, .kupola-table-edit-cancel { background: none; border: 1px solid #d9d9d9; border-radius: 3px; cursor: pointer; padding: 2px 6px; font-size: 12px; }\r\n .kupola-table-edit-save { color: #52c41a; border-color: #52c41a; }\r\n .kupola-table-edit-cancel { color: #ff4d4f; border-color: #ff4d4f; }\r\n .kupola-table-edit-save:hover { background: #f6ffed; }\r\n .kupola-table-edit-cancel:hover { background: #fff2f0; }\r\n /* Tree */\r\n .kupola-table-tree-indent { display: inline-block; }\r\n .kupola-table-tree-toggle { background: none; border: none; cursor: pointer; font-size: 10px; padding: 0 4px; color: #666; }\r\n .kupola-table-tree-toggle:hover { color: #1890ff; }\r\n .kupola-table-tree-toggle-placeholder { display: inline-block; width: 18px; }\r\n /* Virtual */\r\n .kupola-table-virtual-wrapper .kupola-table-container { overflow-y: auto; }\r\n /* Pagination */\r\n .kupola-table-pagination { display: flex; justify-content: flex-end; align-items: center; gap: 12px; margin-top: 16px; padding: 8px 0; }\r\n .kupola-table-pages { display: flex; gap: 4px; align-items: center; }\r\n .kupola-table-page-btn { min-width: 32px; height: 32px; border: 1px solid #d9d9d9; border-radius: 4px; background: #fff; cursor: pointer; font-size: 14px; display: flex; align-items: center; justify-content: center; }\r\n .kupola-table-page-btn:hover:not(:disabled):not(.active) { border-color: #1890ff; color: #1890ff; }\r\n .kupola-table-page-btn.active { background: #1890ff; color: #fff; border-color: #1890ff; }\r\n .kupola-table-page-btn:disabled { opacity: 0.4; cursor: not-allowed; }\r\n .kupola-table-page-ellipsis { padding: 0 4px; color: #999; }\r\n .kupola-table-page-size { padding: 4px 8px; border: 1px solid #d9d9d9; border-radius: 4px; font-size: 13px; }\r\n .kupola-table-page-info { color: #999; font-size: 13px; }\r\n `;\r\n document.head.appendChild(style);\r\n stylesInjected = true;\r\n}\r\n\r\nfunction initTable(element, options) {\r\n injectTableStyles();\r\n return new KupolaTable(element, options);\r\n}\r\n\r\nfunction initAllTables() {\r\n document.querySelectorAll('[data-kupola-table]').forEach(el => {\r\n const config = el.getAttribute('data-kupola-table');\r\n let options = {};\r\n if (config) { try { options = JSON.parse(config); } catch (_) { } }\r\n initTable(el, options);\r\n });\r\n}\r\n\r\nexport { KupolaTable, initTable, initAllTables };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.KupolaTable = KupolaTable;\r\n window.initTable = initTable;\r\n}\r\n","/**\r\n * KupolaPagination - Standalone pagination component\r\n * Works with useDeps or plain data\r\n */\r\n\r\nimport { ref } from './data-bind.js';\r\n\r\nclass KupolaPagination {\r\n constructor(element, options = {}) {\r\n this.element = typeof element === 'string' ? document.querySelector(element) : element;\r\n this.options = options;\r\n\r\n // State\r\n this._current = options.current || 1;\r\n this._total = options.total || 0;\r\n this._pageSize = options.pageSize || 10;\r\n this._maxPages = options.maxPages || 7;\r\n this._showTotal = options.showTotal !== false;\r\n this._showSizeChanger = options.showSizeChanger || false;\r\n this._pageSizes = options.pageSizes || [10, 20, 50, 100];\r\n this._simple = options.simple || false;\r\n\r\n // Refs for reactive integration\r\n this.current = ref(this._current);\r\n this.total = ref(this._total);\r\n\r\n // Callbacks\r\n this.onChange = options.onChange || null;\r\n this.onPageSizeChange = options.onPageSizeChange || null;\r\n\r\n this._init();\r\n }\r\n\r\n _init() {\r\n this.element.classList.add('kupola-pagination');\r\n this.render();\r\n }\r\n\r\n get totalPages() {\r\n return Math.max(1, Math.ceil(this._total / this._pageSize));\r\n }\r\n\r\n setCurrent(page) {\r\n page = Math.max(1, Math.min(page, this.totalPages));\r\n if (page === this._current) return;\r\n this._current = page;\r\n this.current.value = page;\r\n if (this.onChange) this.onChange(page, this._pageSize);\r\n this.render();\r\n }\r\n\r\n setTotal(total) {\r\n if (total && typeof total === 'object' && 'value' in total) {\r\n this._total = total.value || 0;\r\n total._subscribers?.add((val) => {\r\n this._total = val || 0;\r\n if (this._current > this.totalPages) {\r\n this.setCurrent(this.totalPages);\r\n } else {\r\n this.render();\r\n }\r\n });\r\n } else {\r\n this._total = total;\r\n }\r\n this.total.value = this._total;\r\n this.render();\r\n }\r\n\r\n setPageSize(size) {\r\n this._pageSize = size;\r\n this._current = 1;\r\n this.current.value = 1;\r\n if (this.onPageSizeChange) this.onPageSizeChange(size, this._current);\r\n this.render();\r\n }\r\n\r\n render() {\r\n const el = this.element;\r\n el.innerHTML = '';\r\n\r\n if (this._total <= 0) return;\r\n\r\n if (this._simple) {\r\n this._renderSimple(el);\r\n } else {\r\n this._renderFull(el);\r\n }\r\n }\r\n\r\n _renderSimple(el) {\r\n const total = this.totalPages;\r\n\r\n const prev = this._btn('‹', () => this.setCurrent(this._current - 1));\r\n prev.disabled = this._current <= 1;\r\n el.appendChild(prev);\r\n\r\n const info = document.createElement('span');\r\n info.className = 'kupola-pagination-simple-info';\r\n info.textContent = `${this._current} / ${total}`;\r\n el.appendChild(info);\r\n\r\n const next = this._btn('›', () => this.setCurrent(this._current + 1));\r\n next.disabled = this._current >= total;\r\n el.appendChild(next);\r\n }\r\n\r\n _renderFull(el) {\r\n const total = this.totalPages;\r\n\r\n // Total info\r\n if (this._showTotal) {\r\n const info = document.createElement('span');\r\n info.className = 'kupola-pagination-total';\r\n info.textContent = `共 ${this._total} 条`;\r\n el.appendChild(info);\r\n }\r\n\r\n // Size changer\r\n if (this._showSizeChanger) {\r\n const select = document.createElement('select');\r\n select.className = 'kupola-pagination-size';\r\n this._pageSizes.forEach(size => {\r\n const opt = document.createElement('option');\r\n opt.value = size;\r\n opt.textContent = `${size} 条/页`;\r\n if (size === this._pageSize) opt.selected = true;\r\n select.appendChild(opt);\r\n });\r\n select.addEventListener('change', () => this.setPageSize(parseInt(select.value)));\r\n el.appendChild(select);\r\n }\r\n\r\n // Page buttons container\r\n const pages = document.createElement('div');\r\n pages.className = 'kupola-pagination-pages';\r\n\r\n // Prev\r\n const prev = this._btn('‹', () => this.setCurrent(this._current - 1));\r\n prev.disabled = this._current <= 1;\r\n pages.appendChild(prev);\r\n\r\n // Page numbers\r\n this._getPageRange().forEach(p => {\r\n if (p === '...') {\r\n const span = document.createElement('span');\r\n span.className = 'kupola-pagination-ellipsis';\r\n span.textContent = '···';\r\n pages.appendChild(span);\r\n } else {\r\n const btn = this._btn(p, () => this.setCurrent(p));\r\n if (p === this._current) btn.classList.add('active');\r\n pages.appendChild(btn);\r\n }\r\n });\r\n\r\n // Next\r\n const next = this._btn('›', () => this.setCurrent(this._current + 1));\r\n next.disabled = this._current >= total;\r\n pages.appendChild(next);\r\n\r\n el.appendChild(pages);\r\n\r\n // Jumper\r\n if (total > 10) {\r\n const jumper = document.createElement('span');\r\n jumper.className = 'kupola-pagination-jumper';\r\n jumper.innerHTML = '跳至 <input type=\"number\" min=\"1\" max=\"' + total + '\" value=\"' + this._current + '\"> 页';\r\n const input = jumper.querySelector('input');\r\n input.addEventListener('change', () => {\r\n const page = parseInt(input.value);\r\n if (page >= 1 && page <= total) {\r\n this.setCurrent(page);\r\n }\r\n });\r\n input.addEventListener('keydown', (e) => {\r\n if (e.key === 'Enter') {\r\n const page = parseInt(input.value);\r\n if (page >= 1 && page <= total) {\r\n this.setCurrent(page);\r\n }\r\n }\r\n });\r\n el.appendChild(jumper);\r\n }\r\n }\r\n\r\n _btn(text, onClick) {\r\n const btn = document.createElement('button');\r\n btn.className = 'kupola-pagination-btn';\r\n btn.textContent = text;\r\n btn.type = 'button';\r\n btn.addEventListener('click', onClick);\r\n return btn;\r\n }\r\n\r\n _getPageRange() {\r\n const total = this.totalPages;\r\n const max = this._maxPages;\r\n\r\n if (total <= max) {\r\n return Array.from({ length: total }, (_, i) => i + 1);\r\n }\r\n\r\n const range = [];\r\n const half = Math.floor(max / 2);\r\n\r\n if (this._current <= half + 1) {\r\n for (let i = 1; i <= max - 2; i++) range.push(i);\r\n range.push('...', total);\r\n } else if (this._current >= total - half) {\r\n range.push(1, '...');\r\n for (let i = total - max + 3; i <= total; i++) range.push(i);\r\n } else {\r\n range.push(1, '...');\r\n for (let i = this._current - half + 2; i <= this._current + half - 2; i++) range.push(i);\r\n range.push('...', total);\r\n }\r\n\r\n return range;\r\n }\r\n\r\n destroy() {\r\n this.element.innerHTML = '';\r\n this.element.classList.remove('kupola-pagination');\r\n }\r\n}\r\n\r\n// CSS styles\r\nlet stylesInjected = false;\r\nfunction injectPaginationStyles() {\r\n if (stylesInjected || typeof document === 'undefined') return;\r\n const style = document.createElement('style');\r\n style.textContent = `\r\n .kupola-pagination { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }\r\n .kupola-pagination-pages { display: flex; gap: 4px; align-items: center; }\r\n .kupola-pagination-btn { min-width: 32px; height: 32px; border: 1px solid #d9d9d9; border-radius: 4px; background: #fff; cursor: pointer; font-size: 14px; display: flex; align-items: center; justify-content: center; transition: all 0.2s; }\r\n .kupola-pagination-btn:hover:not(:disabled):not(.active) { border-color: #1890ff; color: #1890ff; }\r\n .kupola-pagination-btn.active { background: #1890ff; color: #fff; border-color: #1890ff; }\r\n .kupola-pagination-btn:disabled { opacity: 0.4; cursor: not-allowed; }\r\n .kupola-pagination-ellipsis { padding: 0 4px; color: #999; user-select: none; }\r\n .kupola-pagination-total { color: #666; font-size: 14px; }\r\n .kupola-pagination-size { padding: 4px 8px; border: 1px solid #d9d9d9; border-radius: 4px; font-size: 13px; }\r\n .kupola-pagination-simple-info { padding: 0 8px; font-size: 14px; color: #333; }\r\n .kupola-pagination-jumper { font-size: 14px; color: #666; }\r\n .kupola-pagination-jumper input { width: 50px; height: 28px; margin: 0 4px; padding: 0 8px; border: 1px solid #d9d9d9; border-radius: 4px; text-align: center; font-size: 13px; }\r\n .kupola-pagination-jumper input:focus { outline: none; border-color: #1890ff; }\r\n `;\r\n document.head.appendChild(style);\r\n stylesInjected = true;\r\n}\r\n\r\nfunction initPagination(element, options) {\r\n injectPaginationStyles();\r\n return new KupolaPagination(element, options);\r\n}\r\n\r\nexport { KupolaPagination, initPagination };\r\n\r\nif (typeof window !== 'undefined') {\r\n window.KupolaPagination = KupolaPagination;\r\n window.initPagination = initPagination;\r\n}\r\n","/**\r\n * Kupola Web Components — Custom Elements wrapper for core Kupola components.\r\n *\r\n * Usage:\r\n * import { registerWebComponents } from '@kupola/kupola';\r\n * registerWebComponents();\r\n *\r\n * Then in HTML:\r\n * <k-dropdown>\r\n * <button slot=\"trigger\">Open</button>\r\n * <a slot=\"item\">Option A</a>\r\n * <a slot=\"item\">Option B</a>\r\n * </k-dropdown>\r\n *\r\n * <k-tooltip title=\"Hello!\">\r\n * <button>Hover me</button>\r\n * </k-tooltip>\r\n *\r\n * <k-collapse>\r\n * <k-collapse-item title=\"Section 1\">Content 1</k-collapse-item>\r\n * <k-collapse-item title=\"Section 2\">Content 2</k-collapse-item>\r\n * </k-collapse>\r\n */\r\n\r\nlet registered = false;\r\n\r\n/**\r\n * <k-dropdown> — Wraps Kupola dropdown\r\n * Slots: trigger (button), item (menu items)\r\n */\r\nclass KupolaDropdownElement extends HTMLElement {\r\n static get observedAttributes() { return ['open']; }\r\n\r\n connectedCallback() {\r\n this._render();\r\n }\r\n\r\n _render() {\r\n const trigger = this.querySelector('[slot=\"trigger\"]');\r\n const items = this.querySelectorAll('[slot=\"item\"]');\r\n\r\n // Build dropdown DOM structure\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'ds-dropdown';\r\n wrapper.setAttribute('data-dropdown', '');\r\n\r\n if (trigger) {\r\n trigger.setAttribute('class', (trigger.getAttribute('class') || '') + ' ds-dropdown__trigger');\r\n wrapper.appendChild(trigger);\r\n }\r\n\r\n const menu = document.createElement('div');\r\n menu.className = 'ds-dropdown__menu';\r\n items.forEach(item => {\r\n item.className = 'ds-dropdown__item';\r\n menu.appendChild(item);\r\n });\r\n wrapper.appendChild(menu);\r\n\r\n this.innerHTML = '';\r\n this.appendChild(wrapper);\r\n }\r\n\r\n attributeChangedCallback(name, oldVal, newVal) {\r\n if (name === 'open') {\r\n const menu = this.querySelector('.ds-dropdown__menu');\r\n if (menu) menu.style.display = newVal !== null ? 'block' : '';\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * <k-tooltip title=\"text\"> — Wraps Kupola tooltip\r\n * Default slot: the trigger element\r\n */\r\nclass KupolaTooltipElement extends HTMLElement {\r\n static get observedAttributes() { return ['title', 'position']; }\r\n\r\n connectedCallback() {\r\n const trigger = this.firstElementChild;\r\n if (trigger) {\r\n trigger.setAttribute('data-title', this.getAttribute('title') || '');\r\n if (this.getAttribute('position')) {\r\n trigger.setAttribute('data-tooltip-position', this.getAttribute('position'));\r\n }\r\n }\r\n }\r\n\r\n attributeChangedCallback(name, oldVal, newVal) {\r\n if (name === 'title') {\r\n const trigger = this.firstElementChild;\r\n if (trigger) trigger.setAttribute('data-title', newVal || '');\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * <k-collapse> — Wraps Kupola collapse/accordion\r\n * Children: <k-collapse-item title=\"...\">content</k-collapse-item>\r\n */\r\nclass KupolaCollapseElement extends HTMLElement {\r\n connectedCallback() {\r\n this._render();\r\n }\r\n\r\n _render() {\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'ds-collapse';\r\n wrapper.setAttribute('data-collapse', '');\r\n\r\n const items = this.querySelectorAll('k-collapse-item');\r\n items.forEach(item => {\r\n const title = item.getAttribute('title') || '';\r\n const content = item.innerHTML;\r\n\r\n const collapseItem = document.createElement('div');\r\n collapseItem.className = 'ds-collapse__item';\r\n collapseItem.innerHTML = `\r\n <button class=\"ds-collapse__header\">\r\n <span>${title}</span>\r\n <svg class=\"icon ds-collapse__chevron\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"6 9 12 15 18 9\"/></svg>\r\n </button>\r\n <div class=\"ds-collapse__body\"><div class=\"ds-collapse__content\">${content}</div></div>\r\n `;\r\n wrapper.appendChild(collapseItem);\r\n });\r\n\r\n this.innerHTML = '';\r\n this.appendChild(wrapper);\r\n }\r\n}\r\n\r\n/**\r\n * <k-collapse-item title=\"...\"> — Child of <k-collapse>\r\n * Not registered as a standalone custom element, just a data container.\r\n */\r\nclass KupolaCollapseItemElement extends HTMLElement {\r\n static get observedAttributes() { return ['title']; }\r\n // Content is read by parent <k-collapse> during its connectedCallback\r\n}\r\n\r\n/**\r\n * <k-drawer> — Wraps Kupola drawer\r\n * Attributes: position (left|right|top|bottom), open\r\n */\r\nclass KupolaDrawerElement extends HTMLElement {\r\n static get observedAttributes() { return ['position', 'open']; }\r\n\r\n connectedCallback() {\r\n this._render();\r\n }\r\n\r\n _render() {\r\n const position = this.getAttribute('position') || 'left';\r\n const wrapper = document.createElement('div');\r\n wrapper.className = `ds-drawer ds-drawer--${position}`;\r\n wrapper.setAttribute('data-drawer', '');\r\n wrapper.innerHTML = this.innerHTML;\r\n this.innerHTML = '';\r\n this.appendChild(wrapper);\r\n }\r\n\r\n attributeChangedCallback(name, oldVal, newVal) {\r\n if (name === 'open') {\r\n const drawer = this.querySelector('.ds-drawer');\r\n if (drawer) {\r\n drawer.classList.toggle('is-open', newVal !== null);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * <k-modal> — Wraps Kupola modal dialog\r\n * Attributes: title, open\r\n */\r\nclass KupolaModalElement extends HTMLElement {\r\n static get observedAttributes() { return ['title', 'open']; }\r\n\r\n connectedCallback() {\r\n this._render();\r\n }\r\n\r\n _render() {\r\n const title = this.getAttribute('title') || '';\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'ds-backdrop';\r\n wrapper.style.display = 'none';\r\n wrapper.innerHTML = `\r\n <div class=\"ds-dialog\">\r\n <div class=\"ds-dialog__head\">\r\n <span class=\"ds-dialog__title\">${title}</span>\r\n <button class=\"ds-dialog__close\" aria-label=\"Close\">\r\n <svg class=\"icon\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\r\n </button>\r\n </div>\r\n <div class=\"ds-dialog__body\"></div>\r\n <div class=\"ds-dialog__foot\"></div>\r\n </div>\r\n `;\r\n\r\n // Move slotted content into dialog body\r\n const body = wrapper.querySelector('.ds-dialog__body');\r\n const content = this.querySelector('[slot=\"body\"]');\r\n if (content) {\r\n body.appendChild(content);\r\n }\r\n\r\n // Move footer content\r\n const foot = wrapper.querySelector('.ds-dialog__foot');\r\n const footer = this.querySelector('[slot=\"footer\"]');\r\n if (footer) {\r\n foot.appendChild(footer);\r\n }\r\n\r\n // Close button handler\r\n const closeBtn = wrapper.querySelector('.ds-dialog__close');\r\n if (closeBtn) {\r\n closeBtn.addEventListener('click', () => this.close());\r\n }\r\n // Backdrop click handler\r\n wrapper.addEventListener('click', (e) => {\r\n if (e.target === wrapper) this.close();\r\n });\r\n\r\n this.innerHTML = '';\r\n this.appendChild(wrapper);\r\n }\r\n\r\n attributeChangedCallback(name, oldVal, newVal) {\r\n if (name === 'open') {\r\n const backdrop = this.querySelector('.ds-backdrop');\r\n if (backdrop) {\r\n backdrop.style.display = newVal !== null ? 'flex' : 'none';\r\n }\r\n }\r\n }\r\n\r\n open() {\r\n this.setAttribute('open', '');\r\n }\r\n\r\n close() {\r\n this.removeAttribute('open');\r\n }\r\n}\r\n\r\n/**\r\n * Register all Kupola Web Components.\r\n * Safe to call multiple times — will only register once.\r\n */\r\nexport function registerWebComponents() {\r\n if (registered || typeof customElements === 'undefined') return;\r\n registered = true;\r\n\r\n const components = [\r\n ['k-dropdown', KupolaDropdownElement],\r\n ['k-tooltip', KupolaTooltipElement],\r\n ['k-collapse', KupolaCollapseElement],\r\n ['k-collapse-item', KupolaCollapseItemElement],\r\n ['k-drawer', KupolaDrawerElement],\r\n ['k-modal', KupolaModalElement]\r\n ];\r\n\r\n for (const [tag, cls] of components) {\r\n if (!customElements.get(tag)) {\r\n customElements.define(tag, cls);\r\n }\r\n }\r\n}\r\n\r\nexport {\r\n KupolaDropdownElement,\r\n KupolaTooltipElement,\r\n KupolaCollapseElement,\r\n KupolaCollapseItemElement,\r\n KupolaDrawerElement,\r\n KupolaModalElement\r\n};\r\n\r\nif (typeof window !== 'undefined') {\r\n window.registerWebComponents = registerWebComponents;\r\n window.KupolaDropdownElement = KupolaDropdownElement;\r\n window.KupolaTooltipElement = KupolaTooltipElement;\r\n window.KupolaCollapseElement = KupolaCollapseElement;\r\n window.KupolaDrawerElement = KupolaDrawerElement;\r\n window.KupolaModalElement = KupolaModalElement;\r\n}\r\n"],"names":["KupolaLifecycle","scope","phase","nextState","allowed","handlers","hook","handler","options","hooks","a","b","index","h","depends","depName","depHook","args","emitId","startTime","hookStartTime","hookResult","hookError","error","hookDuration","totalDuration","stateMap","beforePhase","afterPhase","resolve","onReady","targetState","boundary","errorInfo","max","e","boundaryHandlers","result","KupolaPluginManager","name","plugin","promises","_","pluginName","pluginHooks","unsubscribe","kupolaLifecycle","kupolaPluginManager","createLifecycle","KupolaUtils","str","c","length","padChar","maxLength","suffix","search","replacement","template","data","key","prefix","times","div","chars","r","arr","defaultValue","start","end","arg","separator","item","fromIndex","items","compareFn","order","valA","valB","predicate","fn","initialValue","depth","acc","seen","value","size","chunks","i","j","val","arr1","arr2","obj","path","current","keys","lastKey","hash","map","set","clone","keyField","valueField","obj1","obj2","keys1","keys2","min","precision","factor","nums","decimals","currency","radix","num","now","date","formatStr","year","month","day","hours","minutes","seconds","milliseconds","weekDay","days","newDate","date1","date2","d1","d2","startOfYear","diff","startDay","birthDate","age","minute","hour","week","func","wait","timeout","lastArgs","lastThis","lastCallTime","leading","trailing","invokeFunc","leadingEdge","trailingEdge","remainingWait","timeSinceLastCall","limit","inThrottle","regex","cleanStr","sum","alternate","digit","match","g","len","str1","str2","substring","rules","errors","fieldRules","fieldErrors","rule","params","message","md5Array","K","S","leftRotate","shift","addPadding","bitLength","lowBytes","highBytes","processBlock","block","state","d","words","AA","BB","CC","DD","f","round","wordIndex","temp","paddedMessage","word","rightRotate","s0","s1","S1","ch","temp1","S0","maj","temp2","bytes","byte1","byte2","byte3","enc1","enc2","enc3","enc4","url","crossOrigin","reject","img","urls","parallel","results","type","async","defer","script","media","link","fontFamily","src","weight","style","fontFace","sanitizeHtml","html","TrieNode","PathTrie","node","parts","part","collectKeys","n","child","parentPath","REACTIVE_SYMBOLS","KupolaDataBind","target","receiver","oldValue","fullPath","parentKey","proxy","updatedKeys","subKey","subValue","element","dep","k","silent","parent","callback","cb","binding","sanitized","display","deps","prop","values","storageType","debounce","version","encrypt","encryptionKey","storage","newValue","config","dataToStore","serialized","e2","testKey","maxAge","text","ciphertext","persisted","dataKey","stored","parsed","decrypted","snapshot","snapshotIndex","formElement","mutations","mutation","existingHandler","elements","KupolaStore","initialState","newState","payload","action","KupolaStoreManager","store","KupolaEventBus","eventName","onceCallback","selector","listener","sel","ref","refObj","sub","kupolaData","kupolaEvents","kupolaStoreManager","createStore","getStore","THEME_KEY","BRAND_KEY","BRAND_OPTIONS","getTheme","setTheme","theme","toggleBtn","icon","iconPath","getBrand","setBrand","brandId","brand","brandToggle","brandIcon","brandName","btn","initTheme","savedTheme","savedBrand","newTheme","brandPicker","isHidden","closeBrandPicker","createThemeToggle","scripts","currentScript","scriptPath","createBrandPicker","container","closeBrandPickerAuto","ComponentInitializerRegistry","initFn","cleanupFn","cls","attr","className","root","kupolaInitializer","knownComponents","comp","KupolaComponent","props","slots","slotEl","slotName","customEvent","newProps","hookMap","proto","registeredHooks","methodName","lifecyclePhase","applyMixin","componentClass","mixin","original","KupolaComponentRegistry","loader","cached","loadingPromise","mixinNames","componentName","initializer","ComponentClass","instance","childInstance","kupolaRegistry","kupolaBootstrap","registerComponent","registerLazyComponent","bootstrapComponents","defineMixin","useMixin","defineComponent","KupolaI18n","locale","htmlLang","source","count","event","dateObj","number","unit","kupolaI18n","createI18n","t","setLocale","getLocale","formatDate","formatNumber","formatCurrency","Dropdown","triggerRect","menuRect","viewportHeight","viewportWidth","spaceBelow","spaceAbove","divider","el","initDropdown","dropdown","initDropdowns","cleanupDropdown","cleanupAllDropdowns","Select","option","opt","triggerParent","query","visible","title","group","hasVisible","optionEl","o","tag","removeBtn","optEl","v","isSelected","initSelect","select","initSelects","cleanupSelect","cleanupAllSelects","Datepicker","y","m","today","time","pickerRect","calendarRect","calendarHeight","isVisible","calendar","dayEl","header","prevBtn","titleBtn","nextBtn","weekHeader","span","daysEl","firstDay","daysInMonth","offset","emptyDay","clickHandler","footer","todayBtn","clearBtn","currentYear","startYear","grid","monthName","idx","initDatepicker","picker","initDatepickers","cleanupDatepicker","cleanupAllDatepickers","Timepicker","ampmMatch","second","timeVal","minParts","minVal","maxParts","maxVal","s","period","panelRect","panelHeight","sectionsHTML","label","displayHour","displayMinute","displaySecond","displayAmPm","hourVal","ampmGrid","selected","initTimepicker","initTimepickers","cleanupTimepicker","Slider","mark","pct","inputHandler","changeHandler","trackClick","keyHandler","thumb","which","startDrag","onDrag","stopDrag","clientX","clientY","rect","percentage","step","endVal","startVal","distToStart","distToEnd","inputEl","startPct","endPct","endValue","initSlider","slider","cleanupSlider","initSliders","Carousel","indicator","prevIndex","absDx","absDy","absDeltaX","absDeltaY","initCarousel","carousel","initCarousels","cleanupCarousel","Drawer","closeBtn","cancelBtn","confirmBtn","createDrawer","content","placement","width","height","closable","showMask","onClose","onOpen","footerHTML","drawer","titleEl","bodyEl","origClose","initDrawer","cleanupDrawer","initDrawers","trigger","drawerId","mask","drawerEl","Modal","createModal","fullscreen","showCancel","showConfirm","confirmText","cancelText","confirmClass","cancelClass","maskClosable","onConfirm","onCancel","modal","isConfirming","confirmHandler","cancelHandler","closeAndDestroy","originalClose","confirmModal","alertModal","initModal","cleanupModal","initModals","Dialog","icons","keydownHandler","close","maskClickHandler","confirmClickHandler","cancelClickHandler","Notification","duration","notification","initNotifications","Message","msg","initMessages","FileUpload","files","dragoverHandler","dragleaveHandler","dropHandler","file","accept","types","fileType","fileName","fileIcon","removeHandler","extension","sizes","itemElement","errorElement","reader","previewItem","previewRemoveBtn","previewRemoveHandler","percent","bar","totalChunks","currentChunk","uploadInterval","initFileUpload","cleanupFileUpload","initFileUploads","Collapse","isDisabled","isActive","isExpanded","headerInfo","transitionHandler","initCollapse","collapse","cleanupCollapse","initCollapses","ColorPicker","color","hex","bVal","hueSlider","svArea","alphaSlider","x","colorBtn","mode","alpha","initColorPicker","initColorPickers","cleanupColorPicker","cleanupAllColorPickers","Calendar","prevHandler","nextHandler","todayHandler","dateStr","startStr","endStr","eventStart","eventEnd","todayStr","currentDate","dayStr","dayEvents","eventDot","dayOfWeek","monday","startDate","endDate","dayHeader","dayNum","eventsContainer","events","eventId","i18n","initCalendar","cleanupCalendar","initCalendars","DynamicTags","addTag","textNode","tagRemoveHandler","tags","colorClasses","allow","initDynamicTags","cleanupDynamicTags","initDynamicTagsAll","ImagePreview","degrees","zoom","images","meta","indicators","currentImage","imagePreviewInstance","initImagePreview","showImagePreview","Tag","closeHandler","checkboxHandler","dblclickHandler","blurHandler","sizeClasses","textNodes","checkbox","input","insertBeforeEl","checked","newContent","editable","checkable","initTag","cleanupTag","initTags","StatCard","entries","entry","targetValue","startValue","animate","currentTime","elapsed","progress","easeProgress","currentValue","formattedValue","currentWidth","targetWidth","currentWidthValue","direction","trendElement","iconSvg","initStatCard","cleanupStatCard","initStatCards","card","updateStatCard","Heatmap","maxValue","ratio","level","rgb","opacity","months","currentMonth","weeks","firstDayOfWeek","body","currentWeek","weekCount","cellWidth","totalGridWidth","labelsAndGrid","weekdayLabels","weekdayLabelHeight","gridContainer","monthLabels","monthInfo","nextMonth","weekSpan","weekColumn","emptyCell","cell","mouseenterHandler","mouseleaveHandler","legend","cells","label2","tooltipWidth","initHeatmap","dataAttr","generateMockHeatmapData","info","cleanupHeatmap","initHeatmaps","oneYearAgo","baseValue","createHeatmap","Tooltip","tooltipRect","left","top","removeEl","isHtml","position","delay","enable","initTooltip","tooltip","initTooltips","cleanupTooltip","KupolaValidator","form","formId","inputs","hasError","valueEl","uploadInstance","forms","allValid","formErrors","asyncRules","validatorFunc","groupName","groups","statusElement","loading","submitting","disabled","rulesString","pattern","targetId","customMessage","validator","hasAsyncValidation","isValid","submitBtn","originalText","onSubmit","firstError","activeElement","validateOnInput","this","VirtualList","isHorizontal","scrollOffset","positions","currentPosition","total","itemSize","viewportSize","startIndex","endIndex","visibleData","actualIndex","hasChanges","actualHeight","dataItem","totalSize","thumbHeight","maxTop","thumbTop","totalHeight","deltaY","newTop","scrollTop","behavior","generateMockVirtualListData","titles","titleIndex","randomNum","createVirtualList","initVirtualList","cleanupVirtualList","initVirtualLists","ATTRS","PATHS","svg","viewBox","render","vb","Icons","Countdown","dataEndTime","dataHours","dataMinutes","dataSeconds","distance","initCountdown","cleanupCountdown","initCountdowns","NumberInput","minusHandler","plusHandler","delta","initNumberInput","cleanupNumberInput","initNumberInputs","SlideCaptcha","trackWidth","btnWidth","maxOffset","deltaX","btnOffset","mid","distractor","velocity","acceleration","last","dx","dt","prev","prevDt","prevV","pointCountEl","finalX","distractorDiff","targetDiff","speeds","maxSpeed","minSpeed","hasYMovement","p","totalTime","accelerations","onVerified","initSlideCaptchas","captcha","cleanupSlideCaptcha","cleanupAllSlideCaptchas","KupolaForm","param","field","validatorName","attrValue","initFormValidation","formSelector","getFormInstance","validateForm","GlobalEvents","once","passive","capture","listenerId","eventKey","listeners","filtered","l","detail","listenerIds","targets","keyTargetId","scopeListeners","globalEvents","on","off","emit","emitGlobal","offByScope","offAll","getListenerCount","Scheduler","tasks","task","globalScheduler","CacheEntry","ttl","CacheManager","DependsError","code","cause","_httpClientFetch","configureHttpClient","client","getHttpClient","resetHttpClient","DependsSource","cacheManager","attempt","depError","FetchedSource","queryParts","fetchOptions","clientFetch","response","ok","status","StorageSource","RouteSource","FunctionSource","StaticSource","WebSocketSource","createSource","useDeps","depsConfig","unsubscribers","getParams","_extractPropValues","depConfig","lastUpdated","_loadId","load","thisLoadId","unsubscribeSource","propKeys","useQuery","clearCache","KupolaTable","newVal","ck","row","col","flatData","pageData","children","va","cmp","sorted","wrapper","tableContainer","table","thead","tr","th","allKeys","sortInfo","handle","tbody","mergeConfig","mergeMap","skipCells","rowIndex","expandTr","expandTd","totalCols","td","colIndex","mergeInfo","indent","toggle","spacer","isEditing","rowHeight","overscan","topSpacer","bottomSpacer","viewHeight","startIdx","endIdx","fragment","actions","saveBtn","rowKey","colKey","existing","startX","startWidth","onMouseMove","ev","newWidth","onMouseUp","toKey","fromIdx","toIdx","moved","fixedLeft","ths","tds","colIdx","rightOffset","toolbar","filterInput","debounceTimer","right","invertBtn","exportBtn","totalInfo","totalPages","nav","sizeSelect","pages","onClick","page","range","filename","headers","rows","csv","blob","classes","columns","stylesInjected","injectTableStyles","initTable","initAllTables","KupolaPagination","next","jumper","half","injectPaginationStyles","initPagination","registered","KupolaDropdownElement","menu","oldVal","KupolaTooltipElement","KupolaCollapseElement","collapseItem","KupolaCollapseItemElement","KupolaDrawerElement","KupolaModalElement","foot","backdrop","registerWebComponents","components"],"mappings":"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"}
|