@kupola/kupola 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/css/components-ext.css +157 -0
- package/css/components.css +69 -0
- package/css/theme-dark.css +5 -5
- package/css/utilities.css +119 -1
- 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/kupola.css +1 -12
- package/dist/css/kupola.min.css +1 -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/icons.svg +284 -0
- package/dist/kupola.cjs.js +17409 -257
- package/dist/kupola.cjs.js.map +1 -1
- package/dist/kupola.css +9000 -0
- package/dist/kupola.esm.js +17183 -7597
- package/dist/kupola.esm.js.map +1 -1
- package/dist/kupola.min.css +1 -0
- package/dist/kupola.min.js +2 -0
- package/dist/kupola.min.js.map +1 -0
- package/dist/kupola.umd.js +17415 -257
- 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 +151 -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-standalone.js +88 -0
- 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 +81 -67
- package/plugins/vite-plugin-kupola.js +120 -0
- package/scripts/build-css.cjs +113 -0
- package/scripts/build-svg-sprite.cjs +107 -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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kupola.min.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\n/**\r\n * Kupola global namespace — convenience API for external consumers.\r\n * Provides Kupola.refresh(root) to re-initialize dynamically inserted DOM.\r\n */\r\nif (typeof window !== 'undefined') {\r\n window.Kupola = window.Kupola || {};\r\n\r\n /**\r\n * Re-scan and initialize components within a given scope.\r\n * @param {Element|Document} [root=document] - Scope to scan\r\n * @returns {Promise<void>}\r\n */\r\n window.Kupola.refresh = async function refresh(root) {\r\n return kupolaInitializer.initializeAll(root || document);\r\n };\r\n\r\n /**\r\n * Initialize a single element or container.\r\n * @param {Element} element\r\n * @returns {Promise<void>}\r\n */\r\n window.Kupola.init = async function init(element) {\r\n return kupolaInitializer.initialize(element);\r\n };\r\n\r\n /**\r\n * Cleanup a single element.\r\n * @param {Element} element\r\n */\r\n window.Kupola.cleanup = function cleanup(element) {\r\n return kupolaInitializer.cleanup(element);\r\n };\r\n\r\n /** Expose the initializer registry directly */\r\n window.Kupola.initializer = kupolaInitializer;\r\n window.Kupola.ComponentInitializerRegistry = ComponentInitializerRegistry;\r\n}\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","constructor","scope","this","hooks","Map","state","stateHistory","transitions","phaseStateMap","bootstrap","from","to","mount","update","unmount","destroy","basePhases","allPhases","forEach","phase","push","charAt","toUpperCase","slice","set","pendingHooks","Set","trace","errorHandler","errorBoundary","lastError","errorCount","maxErrors","_onErrorCallback","_validateTransition","nextState","allowed","get","includes","Error","_updateState","_resetResolved","handlers","hook","resolved","on","handler","options","priority","depends","name","length","sort","a","b","index","findIndex","h","splice","_resolveDepends","depName","depHook","find","emit","args","emitId","Date","now","Math","random","toString","substr","add","startTime","performance","hookStartTime","hookResult","hookError","Promise","error","console","_handleError","hookDuration","hookName","duration","status","message","timestamp","totalDuration","debug","toFixed","delete","runPhase","stateMap","Array","isArray","join","beforePhase","afterPhase","_waitForDOMReady","resolve","document","readyState","onReady","removeEventListener","window","addEventListener","mountWithDOMReady","getPhaseHandlers","hasHandlers","getTrace","clearTrace","getState","getStateHistory","isInState","targetState","onError","setErrorBoundary","boundary","errorInfo","setMaxErrors","max","getErrorCount","getLastError","resetErrorCount","e","boundaryHandlers","result","KupolaPluginManager","plugins","enabledPlugins","pluginHooks","register","plugin","has","warn","enabled","instance","lifecycle","enable","install","_registerPluginHooks","log","disable","uninstall","_unregisterPluginHooks","getAll","getEnabled","enableAll","promises","_","all","disableAll","pluginName","Object","keys","unsubscribe","kupolaLifecycle","kupolaPluginManager","createLifecycle","KupolaUtils","string","trim","str","trimLeft","replace","trimRight","toLowerCase","capitalize","camelize","c","hyphenate","padStart","padChar","String","padEnd","truncate","maxLength","suffix","replaceAll","search","replacement","split","format","template","data","key","undefined","startsWith","prefix","endsWith","repeat","times","reverse","countOccurrences","escapeHtml","div","createElement","textContent","innerHTML","unescapeHtml","generateRandom","chars","i","floor","generateUUID","r","array","arr","isEmpty","size","first","defaultValue","last","start","end","concat","reduce","arg","separator","indexOf","item","fromIndex","lastIndexOf","items","pop","shift","unshift","remove","removeAt","insert","compareFn","sortBy","order","valA","valB","filter","predicate","map","fn","initialValue","every","some","flat","depth","flattenDeep","acc","unique","uniqueBy","seen","value","chunk","chunks","shuffle","j","sum","val","Number","average","Infinity","min","intersection","union","Boolean","difference","arr1","arr2","zip","object","isObject","obj","values","entries","prototype","hasOwnProperty","call","path","current","lastKey","pick","omit","merge","clone","JSON","parse","stringify","deepClone","hash","WeakMap","RegExp","toArray","fromArray","keyField","valueField","invert","isEqual","obj1","obj2","keys1","keys2","freeze","seal","number","isNumber","isNaN","isInteger","isFloat","isPositive","isNegative","isZero","clamp","round","precision","factor","pow","ceil","abs","nums","randomInt","decimals","formatCurrency","currency","Intl","NumberFormat","style","minimumFractionDigits","maximumFractionDigits","formatPercent","toPrecision","isFinite","parseInt","radix","parseFloat","toNumber","num","safeDivide","safeMultiply","date","today","setHours","tomorrow","setDate","getDate","yesterday","isDate","getTime","isValid","formatStr","year","getFullYear","month","getMonth","day","hours","getHours","minutes","getMinutes","seconds","getSeconds","milliseconds","getMilliseconds","weekDay","getDay","toISO","toISOString","toUTC","toUTCString","addDays","days","newDate","addHours","addMinutes","setMinutes","addSeconds","setSeconds","diffDays","date1","date2","d1","d2","setTime","diffHours","diffMinutes","diffSeconds","isToday","isYesterday","isTomorrow","isFuture","isPast","isLeapYear","getDaysInMonth","getWeekOfYear","startOfYear","diff","getQuarter","startOfDay","endOfDay","startOfMonth","endOfMonth","startOfWeek","startDay","endOfWeek","getAge","birthDate","age","fromNow","minute","hour","week","debounce","func","wait","timeout","lastArgs","lastThis","lastCallTime","leading","trailing","invokeFunc","apply","trailingEdge","clearTimeout","setTimeout","timeSinceLastCall","remainingWait","throttle","limit","inThrottle","validator","isEmail","test","isPhone","isURL","isIPv4","isIPv6","isIP","isIDCard","isPassport","isCreditCard","cleanStr","alternate","digit","isHexColor","isRGB","match","exec","isRGBA","g","isColor","isJSON","isWhitespace","isAlpha","isAlphaNumeric","isChinese","isLength","len","minLength","matches","regex","equals","str1","str2","contains","substring","notContains","arrayLength","arrayMinLength","arrayMaxLength","hasKeys","validate","rules","errors","fieldRules","fieldErrors","rule","params","valid","crypto","md5","K","S","leftRotate","processBlock","block","d","words","charCodeAt","AA","BB","CC","DD","f","wordIndex","temp","paddedMessage","bitLength","lowBytes","highBytes","fromCharCode","addPadding","word","sha256","rightRotate","s0","s1","temp1","maj","base64Encode","bytes","byte1","byte2","byte3","enc3","enc4","base64Decode","enc1","enc2","uuid","preload","cache","loadImage","url","crossOrigin","reject","img","Image","onload","onerror","src","loadImages","urls","parallel","results","loadScript","type","async","defer","script","head","appendChild","loadStylesheet","media","link","rel","href","loadFont","fontFamily","weight","fontFace","FontFace","load","fonts","isLoaded","clearCache","clear","clearCacheByUrl","kupolaUtils","TrieNode","children","PathTrie","root","node","parts","part","getSubKeys","collectKeys","n","child","getParentKeys","parentPath","REACTIVE_SYMBOLS","Symbol","KupolaDataBind","rawData","observers","elements","computedProperties","pathTrie","updateQueue","isProcessing","pendingComputed","persistedKeys","snapshots","snapshotLimit","_proxyCache","createReactiveData","target","receiver","Reflect","wrapReactive","oldValue","fullPath","resolvePath","notify","queueUpdate","deleteProperty","Proxy","__parent__","__path__","parentKey","proxy","ownKeys","getOwnPropertyDescriptor","configurable","enumerable","writable","requestAnimationFrame","processQueue","updatedKeys","updateElementsDirect","subKey","subValue","processComputed","element","updateElement","deps","dep","k","updateComputedProperty","silent","assign","setNested","getNested","parent","observe","callback","unobserve","cb","binding","getAttribute","sanitized","html","checked","disabled","display","classList","setAttribute","placeholder","computed","prop","reset","bind","persist","storage","storageType","version","encrypt","encryptionKey","sessionStorage","localStorage","_persistSave","newValue","config","dataToStore","serialized","_encrypt","_ensureStorageCapacity","setItem","e2","testKey","removeItem","_cleanupOldStorage","getItem","text","CryptoJS","AES","_decrypt","ciphertext","decrypt","enc","Utf8","unpersist","loadPersisted","persisted","dataKey","stored","parsed","decrypted","_clone","structuredClone","snapshot","rollback","snapshotIndex","getSnapshotCount","clearSnapshots","serializeForm","formElement","querySelectorAll","fillForm","createReactive","_bindElement","_mutationObserver","MutationObserver","mutations","mutation","addedNodes","nodeType","Node","ELEMENT_NODE","hasAttribute","body","childList","subtree","tagName","existingHandler","__kupolaBindHandler","disconnect","KupolaStore","_stateKey","initialState","getters","actions","kupolaData","newState","_bindGetters","_bindActions","defineProperty","commit","dispatch","payload","action","toJSON","KupolaStoreManager","stores","createStore","store","getStore","registerStore","dispose","KupolaEventBus","events","delegatedEvents","eventListeners","eventName","off","once","onceCallback","delegate","selector","listener","sel","closest","undelegate","ref","refObj","_value","_subscribers","sub","kupolaEvents","kupolaStoreManager","kupolaRef","THEME_KEY","BRAND_KEY","BRAND_OPTIONS","id","color","getTheme","setTheme","theme","documentElement","toggleBtn","querySelector","icon","iconPath","getBrand","setBrand","brandId","brand","brandToggle","brandIcon","backgroundColor","brandName","btn","initTheme","brandPicker","getElementById","position","top","right","zIndex","padding","width","gridTemplateColumns","gap","border","borderRadius","boxShadow","overflow","justifyContent","alignItems","height","fontWeight","cursor","margin","closeBrandPicker","onclick","stopPropagation","preventDefault","isHidden","createThemeToggle","className","scripts","getElementsByTagName","currentScript","scriptPath","alt","createBrandPicker","container","closeBrandPickerAuto","fontSize","ComponentInitializerRegistry","initializers","cleanupFunctions","processedElements","WeakSet","_dataAttrs","_cssClasses","_cachedSelector","initFn","cleanupFn","dataAttribute","cssClass","unregister","_buildSelector","cls","initialize","attr","cleanup","initializeAll","kupolaInitializer","knownComponents","comp","Kupola","refresh","init","initializer","KupolaComponent","isMounted","isDestroyed","props","_parseProps","slots","_parseSlots","_eventListeners","_appliedMixins","setupContext","attributes","slotEl","slotName","default","$slot","$emit","customEvent","CustomEvent","detail","bubbles","cancelable","dispatchEvent","$on","$off","setProps","newProps","_executeUpdated","setState","_bindLifecycleHooks","_setCurrentSetupContext","SetupContext","setup","_executeMounted","_clearSetupContext","renderError","_hooksBound","hookMap","beforeMount","render","afterMount","updated","beforeUnmount","afterUnmount","proto","getPrototypeOf","registeredHooks","methodName","lifecyclePhase","_executeUnmounted","applyMixin","componentClass","mixin","original","KupolaComponentRegistry","components","lazyComponents","loadedComponents","instances","observer","mixins","loadingPromises","registerLazy","loader","getAsync","cached","loadingPromise","defineMixin","useMixin","mixinNames","_upgradeElements","_startObserver","_upgradeElement","__kupolaInstance","__kupolaUpgrading","componentName","ComponentClass","isConnected","catch","removedNodes","childInstance","kupolaBootstrap","kupolaRegistry","registerComponent","registerLazyComponent","bootstrapComponents","defineComponent","lazy","KupolaI18n","locales","currentLocale","defaultLocale","fallbackLocale","delimiter","missingHandler","_initFromDOM","locale","dataset","kupolaI18n","addLocale","htmlLang","lang","_mergeDeep","source","setLocale","_emitChange","getLocale","t","_getTranslation","_interpolate","count","event","loadLocale","response","fetch","json","getAvailableLocales","hasLocale","formatDate","dateObj","DateTimeFormat","formatNumber","formatRelativeTime","unit","RelativeTimeFormat","createI18n","Dropdown","trigger","menu","triggerText","triggerMode","hoverDelay","keyboardNav","autoPosition","onSelect","onShow","onHide","isOpen","focusIndex","_hoverTimer","_hoverLeaveTimer","_triggerClickHandler","_documentClickHandler","_documentClickListener","_itemClickHandler","_keydownHandler","_mouseenterHandler","_mouseleaveHandler","_triggerMouseenterHandler","_triggerMouseleaveHandler","__kupolaInitialized","currentTarget","hideMenu","focus","_bindMenuItems","toggleMenu","showMenu","_getNavigableItems","_focusItem","click","globalEvents","_dropdownItemClickHandler","scrollIntoView","_calculatePosition","triggerRect","getBoundingClientRect","menuRect","viewportHeight","innerHeight","viewportWidth","innerWidth","spaceBelow","bottom","spaceAbove","marginBottom","left","removeAttribute","setItems","divider","el","active","label","initDropdown","dropdown","_kupolaDropdown","initDropdowns","cleanupDropdown","cleanupAllDropdowns","Select","valueEl","optionsEl","nativeSelect","multiple","searchable","clearable","maxSelection","remoteMethod","onChange","selectedValues","allOptions","filteredOptions","searchInput","clearBtn","tagsWrap","_optionClickHandler","_collectOptions","_createSearchInput","_createClearButton","_createTagsWrap","option","_toggleMultiOption","_selectSingleOption","_bindOptionClicks","toggleOptions","_getVisibleOptions","_focusOption","hideOptions","_restoreSelectedState","opt","group","_handleSearch","insertBefore","firstChild","triggerParent","parentNode","nextSibling","query","_renderRemoteOptions","visible","title","hasVisible","_selectOptionClickHandler","optionEl","o","updateValue","_syncNativeSelect","_updateClearBtn","_fireChange","_updateTags","_updateValueDisplay","tag","removeBtn","optEl","selected","Event","selectedOptions","getSelectedOptions","showOptions","transform","getValue","setValue","v","toggle","isSelected","initSelect","select","_kupolaSelect","initSelects","cleanupSelect","cleanupAllSelects","Datepicker","input","endInput","calendarEl","range","minDate","maxDate","disabledDate","weekStart","showToday","showWeekNumber","months","weekDays","todayText","clearText","currentDate","viewMode","selectedDate","rangeStart","rangeEnd","isSelectingEnd","_iconClickHandler","_inputClickHandler","_resizeHandler","_resizeListener","_parseDate","toggleCalendar","hideCalendar","resizeHandler","_renderCalendar","_formatDate","y","m","_isDateDisabled","_isToday","_isSameDay","_isInRange","time","calculatePosition","pickerRect","calendarRect","calendarHeight","isVisible","calendar","dayEl","_dayClickHandler","_renderYearsView","_renderMonthsView","header","prevBtn","_prevMonth","titleBtn","nextBtn","_nextMonth","weekHeader","span","daysEl","firstDay","daysInMonth","offset","emptyDay","clickHandler","_selectDate","footer","todayBtn","_goToToday","_clearDate","currentYear","startYear","setFullYear","grid","monthName","idx","setMonth","startStr","endStr","dateStr","setRange","initDatepicker","picker","_kupolaDatepicker","initDatepickers","cleanupDatepicker","cleanupAllDatepickers","Timepicker","inputWrap","panelEl","showSeconds","use12Hour","hourStep","minuteStep","secondStep","minTime","maxTime","disabledTime","selectedHour","selectedMinute","selectedSecond","isPM","_inputWrapClickHandler","_parseInputValue","hideTimepicker","showTimepicker","ampmMatch","_isTimeDisabled","second","timeVal","minParts","maxParts","_formatTime","s","period","panelRect","panelHeight","_syncPanelSelection","sectionsHTML","_populateHourGrid","_populateMinuteGrid","_populateSecondGrid","_populateAmPmGrid","_scrollToSelection","_updateDisplay","_syncGridSelection","_confirmSelection","displayHour","displayMinute","displaySecond","displayAmPm","hourVal","ampmGrid","timeStr","initTimepicker","_kupolaTimepicker","initTimepickers","cleanupTimepicker","Slider","track","fill","vertical","showTooltip","showMarks","marks","markStep","tooltipFormat","onInput","inputEnd","fillEnd","thumbStart","thumbEnd","tooltipStart","tooltipEnd","marksEl","_listeners","_isDragging","_activeThumb","_build","_bindEvents","updateSlider","_renderMarks","mark","pct","inputHandler","changeHandler","_bindThumbDrag","trackClick","_handleTrackClick","keyHandler","_handleKeyboard","thumb","which","startDrag","onDrag","stopDrag","passive","clientX","touches","clientY","rect","percentage","step","endVal","startVal","inputEl","startPct","endPct","endValue","initSlider","slider","cleanupSlider","initSliders","Carousel","indicators","autoBtn","mode","autoPlay","interval","transitionDuration","loop","pauseOnHover","swipe","swipeThreshold","currentIndex","totalItems","autoPlayTimer","isAutoPlaying","isTransitioning","touchStartX","touchStartY","touchDeltaX","touchDeltaY","isSwiping","_mouseEnterHandler","stopAutoPlay","_mouseLeaveHandler","startAutoPlay","_prevClickHandler","prev","_nextClickHandler","next","_autoClickHandler","toggleAutoPlay","_indicatorClickHandlers","indicator","goTo","_touchStartHandler","_handleTouchStart","_touchMoveHandler","_handleTouchMove","_touchEndHandler","_handleTouchEnd","activeElement","updateIndicators","prevIndex","opacity","total","setInterval","clearInterval","_wasAutoPlaying","absDx","absDeltaX","absDeltaY","initCarousel","carousel","initCarousels","cleanupCarousel","Drawer","mask","drawerEl","placement","escClose","maskClosable","showMask","onOpen","onClose","onBeforeClose","closeBtn","cancelBtn","confirmBtn","closeDrawer","handleMaskClick","_applyPlacement","background","pointerEvents","open","close","initDrawer","drawer","cleanupDrawer","initDrawers","drawerId","parentElement","createDrawer","content","closable","footerHTML","titleEl","bodyEl","onConfirm","origClose","Modal","modal","fullscreen","closableOnMask","center","onBeforeOpen","onOpened","onClosed","_closeBtnClickHandler","_maskClickHandler","maxWidth","_openCount","toggleFullscreen","createModal","showCancel","showConfirm","confirmText","cancelText","confirmClass","cancelClass","onCancel","isConfirming","confirmHandler","cancelHandler","originalClose","confirmModal","alertModal","initModal","cleanupModal","initModals","Dialog","normal","_create","success","warning","info","confirm","icons","keydownHandler","maskClickHandler","confirmClickHandler","cancelClickHandler","Notification","show","notification","initNotifications","Message","msg","initMessages","FileUpload","dropzone","list","progress","files","maxSize","maxCount","bindEvents","addFiles","dragoverHandler","dragleaveHandler","dropHandler","dataTransfer","file","showError","isValidFile","renderFileItem","showPreview","dispatchChange","accept","types","fileType","fileName","formatSize","filename","fileIcon","getFileIcon","truncateFilename","removeHandler","removeFile","extension","itemElement","clearFiles","preview","clearError","errorElement","reader","FileReader","previewItem","previewRemoveBtn","previewRemoveHandler","readAsDataURL","updateProgress","percent","bar","simulateUpload","totalChunks","currentChunk","uploadInterval","getFiles","initFileUpload","cleanupFileUpload","initFileUploads","Collapse","headers","accordion","animationDuration","disabledItems","defaultExpanded","_init","nextElementSibling","isDisabled","isActive","scrollHeight","isExpanded","_collapseItem","_expandItem","expanded","headerInfo","offsetHeight","transition","transitionHandler","expand","collapse","expandAll","collapseAll","getExpandedIndices","initCollapse","cleanupCollapse","initCollapses","ColorPicker","panel","valueSpan","customInput","showAlpha","previousColors","_getStoredColors","previousColorsLimit","_colorClickHandler","_inputInputHandler","_alphaChangeHandler","_modeChangeHandler","_hueChangeHandler","_saturationChangeHandler","_valueChangeHandler","hue","saturation","brightness","alpha","_colorStringToHSB","_storeColors","_addPreviousColor","_renderPreviousColors","hex","_HSBToColorString","bVal","_renderColorPanel","hueSlider","svArea","alphaSlider","togglePanel","updateColor","hidePanel","_isValidColor","_updateFromHSB","x","colorBtn","_colorPickerColorHandler","_colorPickerInputHandler","buttons","Option","hsb","showPanel","setMode","getMode","setAlpha","getAlpha","initColorPicker","_kupolaColorPicker","initColorPickers","cleanupColorPicker","cleanupAllColorPickers","Calendar","isRangeMode","rangeMode","i18n","shortMonths","weekdays","shortWeekdays","selectRangeStart","selectRangeEnd","onRangeSelect","onEventClick","prevHandler","nextHandler","todayHandler","_isDateInRange","_isRangeStart","_isRangeEnd","_getEventsForDate","eventStart","eventEnd","_renderWeekView","_renderMonthView","todayStr","dayStr","dayEvents","eventDot","dayOfWeek","monday","startDate","endDate","dayHeader","dayNum","eventsContainer","setSelectedDate","getSelectedDate","getRange","setEvents","addEvent","removeEvent","eventId","setViewMode","getViewMode","setI18n","prevMonth","nextMonth","prevWeek","nextWeek","goToToday","goToDate","toggleRangeMode","initCalendar","cleanupCalendar","initCalendars","DynamicTags","allowDuplicates","addTag","hasTag","getTags","createTag","textNode","createTextNode","tagRemoveHandler","tags","colorClasses","removeTag","removeTagByValue","getTagsWithColor","clearTags","setTags","setMaxCount","getMaxCount","setAllowDuplicates","allow","isAllowDuplicates","setColor","getColor","tagsWithColor","initDynamicTags","cleanupDynamicTags","initDynamicTagsAll","ImagePreview","images","overlay","closeHandler","handleKeydown","handleOverlayClick","zoom","rotation","zoomStep","minZoom","maxZoom","createOverlay","_prevHandler","_nextHandler","handleToolbarAction","deltaY","zoomIn","zoomOut","resetZoom","rotate","updateTransform","degrees","setRotation","setZoom","meta","currentImage","_clickHandler","removeChild","imagePreviewInstance","initImagePreview","showImagePreview","Tag","checkbox","editInput","checkable","editable","_applyStyles","getContent","toggleChecked","checkboxHandler","dblclickHandler","startEdit","blurHandler","endEdit","cancelEdit","sizeClasses","setContent","textNodes","childNodes","TEXT_NODE","insertBeforeEl","setSize","getSize","setChecked","isChecked","newContent","setEditable","isEditable","setCheckable","isCheckable","initTag","cleanupTag","initTags","StatCard","valueElement","progressFill","animated","_observer","animateValue","animateProgress","IntersectionObserver","entry","isIntersecting","threshold","targetValue","animate","currentTime","elapsed","easeProgress","currentValue","formattedValue","toLocaleString","startValue","currentWidth","targetWidth","currentWidthValue","setTrend","direction","trendElement","iconSvg","initStatCard","cleanupStatCard","initStatCards","card","updateStatCard","Heatmap","getOneYearAgo","cellSize","onCellClick","tooltip","baseColor","createTooltip","getDataByDate","getLevel","maxValue","ratio","hexToRgb","getCellColor","level","rgb","getWeekdayLabels","getMonthLabels","currentMonth","getWeekCount","weeks","firstDayOfWeek","currentWeek","weekCount","cellWidth","totalGridWidth","labelsAndGrid","weekdayLabels","weekdayLabelHeight","lineHeight","gridContainer","monthLabels","monthInfo","weekSpan","weekColumn","emptyCell","visibility","cell","mouseenterHandler","mouseleaveHandler","hideTooltip","renderLegend","legend","cells","label2","tooltipWidth","updateData","setDateRange","initHeatmap","dataAttr","generateMockHeatmapData","cleanupHeatmap","initHeatmaps","oneYearAgo","baseValue","createHeatmap","Tooltip","tooltipEl","delay","hideDelay","animation","mouseFollow","_showTooltip","_hideTooltip","_showTimer","_hideTimer","_focusHandler","_blurHandler","_mouseMoveHandler","hide","tooltipRect","_positionTooltip","removeEl","updateContent","isHtml","setPosition","setDelay","setHideDelay","setTrigger","enableMouseFollow","initTooltip","_kupolaTooltip","initTooltips","cleanupTooltip","KupolaValidator","validators","required","validateRequired","email","validateEmail","validateUrl","validateMinLength","validateMaxLength","pattern","validatePattern","validateMin","validateMax","equalTo","validateEqualTo","phone","validatePhone","validateDate","validateNumber","customValidators","asyncValidators","customAsyncValidators","formStates","submitting","addValidator","addAsyncValidator","form","formId","inputs","hasError","parseRules","validatorFunc","getErrorMessage","updateFormState","uploadInstance","__fileUploadInstance","validateInput","validateAll","forms","allValid","validateAsync","validateInputAsync","formErrors","asyncRules","validateGroup","groupName","getGroups","groups","getFormState","loading","statusElement","setFormLoading","setFormSubmitting","setFormDisabled","resetForm","rulesString","targetId","removeStatusIcon","showSuccess","customMessage","__kupolaValidationInitialized","submitBtn","originalText","onSubmit","submit","firstError","validateOnInput","kupolaValidator","VirtualList","itemHeight","itemWidth","bufferSize","renderItem","defaultRenderItem","onItemClick","onItemSelect","onScroll","onScrollEnd","selectedKey","useDynamicHeight","dynamicHeightCache","estimatedHeight","scrollbarTrack","scrollbarThumb","totalHeight","startIndex","endIndex","isScrolling","scrollTimeout","lastScrollTop","lastScrollLeft","subtitle","createStructure","_scrollHandler","handleScroll","_thumbDragStartHandler","handleThumbDragStart","_thumbDragMoveHandler","handleThumbDragMove","_thumbDragEndHandler","handleThumbDragEnd","_wheelHandler","scrollLeft","deltaX","scrollTop","isHorizontal","scrollOffset","dataLength","updateScrollState","renderVisibleItems","updateScrollbar","getItemSize","getItemPositions","positions","currentPosition","getTotalSize","itemSize","getIndexAtOffset","viewportSize","clientWidth","clientHeight","visibleData","actualIndex","updateDynamicHeights","handleItemClick","isUpdating","hasChanges","actualHeight","dataItem","totalSize","thumbHeight","thumbTop","isDragging","dragStartY","dragStartTop","maxTop","newTop","setData","addItem","insertItem","scrollTo","behavior","scrollToKey","scrollToTop","scrollToBottom","getVisibleItems","getItemIndex","refreshCache","generateMockVirtualListData","titles","titleIndex","randomNum","initVirtualList","cleanupVirtualList","initVirtualLists","createVirtualList","PATHS","globe","dashboard","mouse","square","circle","palette","ruler","sparkles","copy","download","external","settings","sliders","plus","minus","github","gear","shield","check","alert","mail","user","users","box","zap","moon","sun","cmd","bell","mic","at","git","bug","extensions","wrench","atom","logo","edit","trash","folder","layers","layout","terminal","image","play","pause","help","lock","eye","star","heart","home","clock","send","upload","dollar","columns","plug","cpu","code","apple","svg","viewBox","vb","Icons","Countdown","hoursEl","minutesEl","secondsEl","endTime","parseEndTime","dataEndTime","dataHours","dataMinutes","dataSeconds","stop","distance","displayTime","dispatchComplete","setEndTime","addTime","initCountdown","cleanupCountdown","initCountdowns","NumberInput","minusBtn","plusBtn","updateState","minusHandler","plusHandler","handleInput","delta","initNumberInput","cleanupNumberInput","initNumberInputs","SlideCaptcha","statusEl","refreshBtn","footerRefreshBtn","tolerance","minPoints","minDuration","maxDuration","minSpeedDelta","maxAttempts","startX","startY","currentX","trackData","isVerified","attempts","targetX","distractorX","angle","distractorAngle","maxAngle","shape","hasDistractor","_mouseDownHandler","_mouseUpHandler","_mouseMoveListener","_mouseUpListener","_touchMoveListener","_touchEndListener","_initialized","maxOffset","offsetWidth","collectTrack","verifyCaptcha","loadCaptcha","generateTarget","trackWidth","btnWidth","mid","distractor","resetSlider","velocity","acceleration","dx","dt","prevDt","pointCountEl","validateTrack","passed","finalX","distractorDiff","targetDiff","speeds","hasYMovement","p","totalTime","accelerations","onVerified","initSlideCaptchas","captcha","_kupolaSlideCaptcha","cleanupSlideCaptcha","cleanupAllSlideCaptchas","KupolaForm","fields","errorMessages","_setupValidators","_collectFields","URL","minlength","maxlength","param","field","validateField","_getFieldErrors","_getFieldValue","validatorName","attrValue","getData","initFormValidation","formSelector","_kupolaForm","getFormInstance","validateForm","GlobalEvents","_scopeListeners","capture","listenerId","_generateId","wrappedHandler","offById","eventKey","_getEventKey","listeners","filtered","_removeFromScope","l","offByScope","offAll","_getTargetId","emitGlobal","emitToScope","listenerIds","targets","getListenerCount","keyTargetId","getScopeListenerCount","hasListeners","_kupolaId","scopeListeners","kupolaOn","kupolaOnce","kupolaOff","kupolaEmit","kupolaEmitGlobal","kupolaOffByScope","kupolaOffAll","kupolaGetListenerCount","Scheduler","_queue","_scheduled","schedule","queueMicrotask","_flush","tasks","task","globalScheduler","CacheEntry","ttl","createdAt","isFresh","isStale","CacheManager","_store","getStale","DependsError","cause","super","_httpClientFetch","globalThis","configureHttpClient","client","TypeError","getHttpClient","resetHttpClient","DependsSource","cacheManager","cacheKey","staleTime","subscribers","pending","retryCount","retry","retryDelay","subscribe","_revalidate","_fetchWithRetry","attempt","depError","invalidate","FetchedSource","method","queryParams","encodeURIComponent","queryParts","fetchOptions","clientFetch","ok","StorageSource","storageKey","sync","_storageHandler","RouteSource","paramName","location","decodeURIComponent","URLSearchParams","FunctionSource","StaticSource","WebSocketSource","ws","reconnect","reconnectDelay","messageHandler","_connected","WebSocket","onopen","onmessage","onclose","OPEN","createSource","useDeps","depsConfig","unsubscribers","_extractPropValues","lastUpdated","_loadId","thisLoadId","unsubscribeSource","propKeys","_source","_dispose","__kupolaDepInstances","useQuery","KupolaTable","_index","rowKey","_data","_loading","striped","bordered","hoverable","compact","emptyText","loadingText","multiSort","_sorts","_filterText","_showPagination","pagination","_pageSizes","pageSizes","_pageSize","pageSize","_currentPage","_total","selection","_selectedKeys","selectionColumnTitle","expandable","_expandedKeys","expandColumnTitle","_editingCell","_editBuffer","resizable","draggable","_dragState","tree","_treeExpandedKeys","defaultExpandAll","_treeExpandAll","virtualScroll","_scrollContainer","mergeCells","onSort","onPageChange","onRowClick","onFilter","onExpand","onEditSave","onEditCancel","onRowDragEnd","onColumnResize","sortKey","sortOrder","currentPage","filterText","selectedKeys","newVal","_flattenForExpand","_getFlatData","setLoading","ck","childrenKey","row","_level","_parentKey","_hasChildren","_flattenVisible","getProcessedData","_filterTree","col","_sortTree","_sortFlat","flatData","pageData","va","cmp","sorter","localeCompare","sorted","wrapper","showFilter","showToolbar","_renderToolbar","tableContainer","table","_getTableClass","_renderThead","_renderVirtualTbody","_renderTbody","_renderPagination","_initColumnResize","_initRowDrag","_applyStickyColumns","thead","tr","th","allKeys","selectAll","deselectAll","minWidth","align","textAlign","fixed","sortable","sortInfo","_handleSort","handle","tbody","_renderStatusRow","mergeConfig","mergeMap","skipCells","rowIndex","_renderDataRow","expandTr","expandTd","totalCols","colSpan","HTMLElement","td","getSelectedRows","_toggleExpand","colIndex","mergeInfo","rowSpan","indent","paddingLeft","_toggleTreeExpand","spacer","isEditing","colKey","_renderEditCell","_startEdit","rowHeight","overscan","topSpacer","_virtualData","_updateVirtualScroll","bottomSpacer","maxHeight","overflowY","viewHeight","startIdx","endIdx","fragment","createDocumentFragment","after","editType","editOptions","saveBtn","_saveEdit","_cancelEdit","existing","selectRow","_syncSelected","deselectRow","invertSelection","getSelectedKeys","startWidth","onMouseMove","ev","newWidth","onMouseUp","fromKey","effectAllowed","dropEffect","toKey","fromIdx","toIdx","moved","fixedLeft","ths","tds","colIdx","_resolvedWidth","rightOffset","toolbar","filterInput","debounceTimer","filterPlaceholder","invertBtn","showExport","exportBtn","exportCSV","totalInfo","totalPages","nav","showPageSize","sizeSelect","pages","_createPageBtn","_goToPage","_getPageRange","onClick","page","rows","csv","blob","Blob","createObjectURL","revokeObjectURL","classes","getPage","setColumns","stylesInjected","initTable","injectTableStyles","KupolaPagination","_current","_maxPages","maxPages","_showTotal","showTotal","_showSizeChanger","showSizeChanger","_simple","simple","onPageSizeChange","setCurrent","setTotal","setPageSize","_renderSimple","_renderFull","_btn","jumper","half","initPagination","injectPaginationStyles","registered","KupolaDropdownElement","observedAttributes","connectedCallback","_render","attributeChangedCallback","oldVal","KupolaTooltipElement","firstElementChild","KupolaCollapseElement","collapseItem","KupolaCollapseItemElement","KupolaDrawerElement","KupolaModalElement","foot","backdrop","registerWebComponents","customElements","define"],"mappings":"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"}
|