@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.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kupola.cjs.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.cjs.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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"}
|