@kupola/kupola 1.5.2 → 1.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"kupola.umd.js","sources":["../js/kupola-lifecycle.js","../js/utils.js","../js/data-bind.js","../js/kupola-config.js","../js/theme.js","../js/security.js","../js/initializer.js","../js/component.js","../js/registry.js","../js/kupola-core.js","../js/i18n.js","../js/global-events.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/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 = 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}","// Prototype Pollution guard: reject keys that can access the prototype chain\r\nconst _UNSAFE_KEYS = new Set(['__proto__', 'prototype', 'constructor']);\r\nfunction _isUnsafeKey(key) {\r\n return _UNSAFE_KEYS.has(key);\r\n}\r\n\r\n// === String Utilities ===\r\nfunction trim(str) { return str ? str.trim() : ''; }\r\nfunction trimLeft(str) { return str ? str.replace(/^\\s+/, '') : ''; }\r\nfunction trimRight(str) { return str ? str.replace(/\\s+$/, '') : ''; }\r\nfunction toUpperCase(str) { return str ? str.toUpperCase() : ''; }\r\nfunction toLowerCase(str) { return str ? str.toLowerCase() : ''; }\r\nfunction capitalize(str) { if (!str) return ''; return str.charAt(0).toUpperCase() + str.slice(1); }\r\nfunction camelize(str) { if (!str) return ''; return str.replace(/-(\\w)/g, (_, c) => c ? c.toUpperCase() : ''); }\r\nfunction hyphenate(str) { if (!str) return ''; return str.replace(/([A-Z])/g, '-$1').toLowerCase().replace(/^-/, ''); }\r\nfunction padStart(str, length, padChar = ' ') { return (String(str) || '').padStart(length, padChar); }\r\nfunction padEnd(str, length, padChar = ' ') { return (String(str) || '').padEnd(length, padChar); }\r\nfunction truncate(str, maxLength, suffix = '...') { if (!str || str.length <= maxLength) return str || ''; return str.slice(0, maxLength) + suffix; }\r\nfunction replaceAll(str, search, replacement) { if (!str) return ''; return str.split(search).join(replacement); }\r\nfunction format(template, data) { if (!template) return ''; return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => data[key] !== undefined ? data[key] : `{{${key}}}`); }\r\nfunction startsWith(str, prefix) { return (str || '').startsWith(prefix); }\r\nfunction endsWith(str, suffix) { return (str || '').endsWith(suffix); }\r\nfunction includesStr(str, search) { return (str || '').includes(search); }\r\nfunction repeat(str, times) { return (str || '').repeat(times); }\r\nfunction reverse(str) { return (str || '').split('').reverse().join(''); }\r\nfunction countOccurrences(str, search) { if (!str || !search) return 0; return str.split(search).length - 1; }\r\nfunction escapeHtml(str) { if (!str) return ''; const div = document.createElement('div'); div.textContent = str; return div.innerHTML; }\r\nfunction unescapeHtml(str) { if (!str) return ''; const div = document.createElement('div'); div.innerHTML = str; return div.textContent; }\r\nfunction generateRandom(length = 8) { const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let result = ''; for (let i = 0; i < length; i++) { result += chars.charAt(Math.floor(Math.random() * chars.length)); } return result; }\r\nfunction generateUUID() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { const r = Math.random() * 16 | 0; const v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); }\r\n\r\nconst stringUtils = { trim, trimLeft, trimRight, toUpperCase, toLowerCase, capitalize, camelize, hyphenate, padStart, padEnd, truncate, replaceAll, format, startsWith, endsWith, includes: includesStr, repeat, reverse, countOccurrences, escapeHtml, unescapeHtml, generateRandom, generateUUID };\r\n\r\n// === Array Utilities ===\r\nfunction isArray(arr) { return Array.isArray(arr); }\r\nfunction isEmpty(arr) { return !arr || arr.length === 0; }\r\nfunction size(arr) { return arr ? arr.length : 0; }\r\nfunction first(arr, defaultValue) { return arr && arr.length > 0 ? arr[0] : defaultValue; }\r\nfunction last(arr, defaultValue) { return arr && arr.length > 0 ? arr[arr.length - 1] : defaultValue; }\r\nfunction get(arr, index, defaultValue) { return arr && arr[index] !== undefined ? arr[index] : defaultValue; }\r\nfunction slice(arr, start, end) { return arr ? arr.slice(start, end) : []; }\r\nfunction concat(...args) { return args.reduce((result, arg) => result.concat(arg || []), []); }\r\nfunction join(arr, separator = ',') { return arr ? arr.join(separator) : ''; }\r\nfunction indexOf(arr, item, fromIndex = 0) { if (!arr) return -1; if (Number.isNaN(item)) { for (let i = fromIndex; i < arr.length; i++) { if (Number.isNaN(arr[i])) return i; } return -1; } return arr.indexOf(item, fromIndex); }\r\nfunction lastIndexOf(arr, item, fromIndex) { if (!arr) return -1; if (Number.isNaN(item)) { const start = fromIndex !== undefined ? fromIndex : arr.length - 1; for (let i = start; i >= 0; i--) { if (Number.isNaN(arr[i])) return i; } return -1; } return arr.lastIndexOf(item, fromIndex); }\r\nfunction includes(arr, item) { return arr ? arr.includes(item) : false; }\r\nfunction push(arr, ...items) { if (arr) arr.push(...items); return arr; }\r\nfunction pop(arr) { return arr ? arr.pop() : undefined; }\r\nfunction shift(arr) { return arr ? arr.shift() : undefined; }\r\nfunction unshift(arr, ...items) { if (arr) arr.unshift(...items); return arr; }\r\nfunction remove(arr, item) { if (!arr) return arr; const index = Number.isNaN(item) ? arr.findIndex(v => Number.isNaN(v)) : arr.indexOf(item); if (index > -1) arr.splice(index, 1); return arr; }\r\nfunction removeAt(arr, index) { if (!arr || index < 0 || index >= arr.length) return arr; arr.splice(index, 1); return arr; }\r\nfunction insert(arr, index, item) { if (!arr) return arr; arr.splice(index, 0, item); return arr; }\r\nfunction reverseArr(arr) { return arr ? arr.slice().reverse() : []; }\r\nfunction sort(arr, compareFn) { return arr ? arr.slice().sort(compareFn) : []; }\r\nfunction sortBy(arr, key, order = 'asc') { if (!arr) return []; return arr.slice().sort((a, b) => { const valA = typeof a === 'object' ? a[key] : a; const valB = typeof b === 'object' ? b[key] : b; if (valA < valB) return order === 'asc' ? -1 : 1; if (valA > valB) return order === 'asc' ? 1 : -1; return 0; }); }\r\nfunction filter(arr, predicate) { return arr ? arr.filter(predicate) : []; }\r\nfunction map(arr, fn) { return arr ? arr.map(fn) : []; }\r\nfunction reduce(arr, fn, initialValue) { return arr ? arr.reduce(fn, initialValue) : initialValue; }\r\nfunction forEach(arr, fn) { if (arr) arr.forEach(fn); }\r\nfunction every(arr, predicate) { return arr ? arr.every(predicate) : true; }\r\nfunction some(arr, predicate) { return arr ? arr.some(predicate) : false; }\r\nfunction find(arr, predicate) { return arr ? arr.find(predicate) : undefined; }\r\nfunction findIndex(arr, predicate) { return arr ? arr.findIndex(predicate) : -1; }\r\nfunction flat(arr, depth = 1) { return arr ? arr.flat(depth) : []; }\r\nfunction flattenDeep(arr) { return arr ? arr.reduce((acc, item) => Array.isArray(item) ? acc.concat(flattenDeep(item)) : acc.concat(item), []) : []; }\r\nfunction unique(arr) { return arr ? [...new Set(arr)] : []; }\r\nfunction uniqueBy(arr, key) { if (!arr) return []; const seen = new Set(); return arr.filter(item => { const value = typeof item === 'object' ? item[key] : item; if (seen.has(value)) return false; seen.add(value); return true; }); }\r\nfunction chunk(arr, chunkSize) { if (!arr || chunkSize <= 0) return []; const chunks = []; for (let i = 0; i < arr.length; i += chunkSize) { chunks.push(arr.slice(i, i + chunkSize)); } return chunks; }\r\nfunction shuffle(arr) { if (!arr) return []; const result = arr.slice(); for (let i = result.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [result[i], result[j]] = [result[j], result[i]]; } return result; }\r\nfunction sum(arr) { return arr ? arr.reduce((acc, val) => acc + (Number(val) || 0), 0) : 0; }\r\nfunction average(arr) { if (!arr || arr.length === 0) return 0; return sum(arr) / arr.length; }\r\nfunction max(arr) { return arr && arr.length > 0 ? Math.max(...arr) : -Infinity; }\r\nfunction min(arr) { return arr && arr.length > 0 ? Math.min(...arr) : Infinity; }\r\nfunction intersection(...args) { if (args.length === 0) return []; return args.reduce((result, a) => result.filter(item => a && a.includes(item))); }\r\nfunction union(...args) { return [...new Set(args.flat().filter(Boolean))]; }\r\nfunction difference(arr1, arr2) { return arr1 ? arr1.filter(item => !arr2 || !arr2.includes(item)) : []; }\r\nfunction zip(...args) { if (args.length === 0) return []; const maxLength = Math.max(...args.map(a => a ? a.length : 0)); return Array.from({ length: maxLength }, (_, i) => args.map(a => a && a[i])); }\r\n\r\nconst arrayUtils = { isArray, isEmpty, size, first, last, get, slice, concat, join, indexOf, lastIndexOf, includes, push, pop, shift, unshift, remove, removeAt, insert, reverse: reverseArr, sort, sortBy, filter, map, reduce, forEach, every, some, find, findIndex, flat, flattenDeep, unique, uniqueBy, chunk, shuffle, sum, average, max, min, intersection, union, difference, zip };\r\n\r\n// === Object Utilities ===\r\nfunction isObject(obj) { return obj !== null && typeof obj === 'object' && !Array.isArray(obj); }\r\nfunction isEmptyObj(obj) { if (!obj || typeof obj !== 'object') return true; return Object.keys(obj).length === 0; }\r\nfunction keys(obj) { return obj ? Object.keys(obj) : []; }\r\nfunction values(obj) { return obj ? Object.values(obj) : []; }\r\nfunction entries(obj) { return obj ? Object.entries(obj) : []; }\r\nfunction has(obj, key) { return obj ? Object.prototype.hasOwnProperty.call(obj, key) : false; }\r\nfunction getObj(obj, path, defaultValue) { if (!obj) return defaultValue; const k = path.split('.'); if (k.some(_isUnsafeKey)) return defaultValue; return k.reduce((current, key) => current && current[key], obj) ?? defaultValue; }\r\nfunction setObj(obj, path, value) { if (!obj || typeof obj !== 'object') return obj; const k = path.split('.'); if (k.some(_isUnsafeKey)) return obj; const lastKey = k.pop(); let current = obj; k.forEach(key => { if (!current[key] || typeof current[key] !== 'object') current[key] = {}; current = current[key]; }); current[lastKey] = value; return obj; }\r\nfunction pick(obj, keys) { if (!obj) return {}; return keys.reduce((result, key) => { if (obj[key] !== undefined) result[key] = obj[key]; return result; }, {}); }\r\nfunction omit(obj, keys) { if (!obj) return {}; return Object.keys(obj).reduce((result, key) => { if (!keys.includes(key)) result[key] = obj[key]; return result; }, {}); }\r\nfunction merge(...args) { return args.reduce((result, obj) => { if (obj && typeof obj === 'object') { Object.keys(obj).forEach(key => { if (_isUnsafeKey(key)) return; if (isObject(obj[key]) && isObject(result[key])) { result[key] = merge(result[key], obj[key]); } else { result[key] = obj[key]; } }); } return result; }, {}); }\r\nfunction clone(obj) { return obj ? JSON.parse(JSON.stringify(obj)) : obj; }\r\nfunction deepClone(obj, hash = new WeakMap()) { if (!obj || typeof obj !== 'object') return obj; if (hash.has(obj)) return hash.get(obj); if (obj instanceof Date) return new Date(obj); if (obj instanceof RegExp) return new RegExp(obj); if (obj instanceof Map) { const m = new Map(); hash.set(obj, m); obj.forEach((val, key) => m.set(key, deepClone(val, hash))); return m; } if (obj instanceof Set) { const s = new Set(); hash.set(obj, s); obj.forEach(val => s.add(deepClone(val, hash))); return s; } if (Array.isArray(obj)) { const a = []; hash.set(obj, a); obj.forEach(item => a.push(deepClone(item, hash))); return a; } const c = {}; hash.set(obj, c); Object.keys(obj).forEach(key => { if (!_isUnsafeKey(key)) { c[key] = deepClone(obj[key], hash); } }); return c; }\r\nfunction forEachObj(obj, fn) { if (!obj) return; Object.keys(obj).forEach(key => fn(obj[key], key, obj)); }\r\nfunction mapObj(obj, fn) { if (!obj) return {}; const result = {}; Object.keys(obj).forEach(key => { result[key] = fn(obj[key], key, obj); }); return result; }\r\nfunction filterObj(obj, fn) { if (!obj) return {}; const result = {}; Object.keys(obj).forEach(key => { if (fn(obj[key], key, obj)) result[key] = obj[key]; }); return result; }\r\nfunction reduceObj(obj, fn, initialValue) { if (!obj) return initialValue; return Object.keys(obj).reduce((acc, key) => fn(acc, obj[key], key, obj), initialValue); }\r\nfunction toArray(obj) { if (!obj) return []; return Object.keys(obj).map(key => ({ key, value: obj[key] })); }\r\nfunction fromArray(arr, keyField, valueField) { if (!arr) return {}; return arr.reduce((result, item) => { const key = typeof item === 'object' ? item[keyField] : item; const value = valueField ? item[valueField] : item; if (key !== undefined) result[key] = value; return result; }, {}); }\r\nfunction sizeObj(obj) { return obj ? Object.keys(obj).length : 0; }\r\nfunction invert(obj) { if (!obj) return {}; const result = {}; Object.keys(obj).forEach(key => { result[obj[key]] = key; }); return result; }\r\nfunction isEqual(obj1, obj2) { if (obj1 === obj2) return true; if (!obj1 || !obj2 || typeof obj1 !== 'object' || typeof obj2 !== 'object') return false; const keys1 = Object.keys(obj1); const keys2 = Object.keys(obj2); if (keys1.length !== keys2.length) return false; return keys1.every(key => isEqual(obj1[key], obj2[key])); }\r\nfunction freeze(obj) { if (!obj) return obj; Object.freeze(obj); Object.keys(obj).forEach(key => { if (typeof obj[key] === 'object') freeze(obj[key]); }); return obj; }\r\nfunction seal(obj) { return obj ? Object.seal(obj) : obj; }\r\n\r\nconst objectUtils = { isObject, isEmpty: isEmptyObj, keys, values, entries, has, get: getObj, set: setObj, pick, omit, merge, clone, deepClone, forEach: forEachObj, map: mapObj, filter: filterObj, reduce: reduceObj, toArray, fromArray, size: sizeObj, invert, isEqual, freeze, seal };\r\n\r\n// === Number Utilities ===\r\nfunction isNumber(val) { return typeof val === 'number' && !isNaN(val); }\r\nfunction isInteger(val) { return Number.isInteger(val); }\r\nfunction isFloat(val) { return isNumber(val) && !Number.isInteger(val); }\r\nfunction isPositive(val) { return isNumber(val) && val > 0; }\r\nfunction isNegative(val) { return isNumber(val) && val < 0; }\r\nfunction isZero(val) { return isNumber(val) && val === 0; }\r\nfunction clamp(val, minVal, maxVal) { if (!isNumber(val)) return val; return Math.min(Math.max(val, minVal), maxVal); }\r\nfunction round(val, precision = 0) { if (!isNumber(val)) return val; const factor = Math.pow(10, precision); return Math.round(val * factor) / factor; }\r\nfunction floor(val) { return isNumber(val) ? Math.floor(val) : val; }\r\nfunction ceil(val) { return isNumber(val) ? Math.ceil(val) : val; }\r\nfunction abs(val) { return isNumber(val) ? Math.abs(val) : val; }\r\nfunction minNum(...args) { const nums = args.filter(isNumber); return nums.length > 0 ? Math.min(...nums) : undefined; }\r\nfunction maxNum(...args) { const nums = args.filter(isNumber); return nums.length > 0 ? Math.max(...nums) : undefined; }\r\nfunction sumNum(...args) { const nums = args.flat().filter(isNumber); return nums.reduce((acc, val) => acc + val, 0); }\r\nfunction averageNum(...args) { const nums = args.flat().filter(isNumber); return nums.length > 0 ? sumNum(nums) / nums.length : 0; }\r\nfunction random(minVal = 0, maxVal = 1) { return Math.random() * (maxVal - minVal) + minVal; }\r\nfunction randomInt(minVal, maxVal) { return Math.floor(random(minVal, maxVal + 1)); }\r\nfunction formatNum(val, decimals = 2) { if (!isNumber(val)) return String(val); return val.toFixed(decimals); }\r\nfunction formatCurrency(val, currency = 'CNY', decimals = 2) { if (!isNumber(val)) return String(val); const formatter = new Intl.NumberFormat('zh-CN', { style: 'currency', currency, minimumFractionDigits: decimals, maximumFractionDigits: decimals }); return formatter.format(val); }\r\nfunction formatPercent(val, decimals = 0) { if (!isNumber(val)) return String(val); return `${(val * 100).toFixed(decimals)}%`; }\r\nfunction toFixed(val, decimals = 0) { if (!isNumber(val)) return String(val); return val.toFixed(decimals); }\r\nfunction toPrecision(val, precision = 6) { if (!isNumber(val)) return String(val); return val.toPrecision(precision); }\r\nfunction isNaNVal(val) { return Number.isNaN(val); }\r\nfunction isFiniteVal(val) { return Number.isFinite(val); }\r\nfunction parseIntSafe(val, radix = 10) { return Number.parseInt(val, radix); }\r\nfunction parseFloatSafe(val) { return Number.parseFloat(val); }\r\nfunction toNumber(val, defaultValue = 0) { const num = Number(val); return isNaN(num) ? defaultValue : num; }\r\nfunction safeDivide(a, b, defaultValue = 0) { if (!isNumber(a) || !isNumber(b) || b === 0) return defaultValue; return a / b; }\r\nfunction safeMultiply(...args) { return args.reduce((result, val) => { if (!isNumber(result) || !isNumber(val)) return 0; return result * val; }, 1); }\r\n\r\nconst numberUtils = { isNumber, isInteger, isFloat, isPositive, isNegative, isZero, clamp, round, floor, ceil, abs, min: minNum, max: maxNum, sum: sumNum, average: averageNum, random, randomInt, format: formatNum, formatCurrency, formatPercent, toFixed, toPrecision, isNaN: isNaNVal, isFinite: isFiniteVal, parseInt: parseIntSafe, parseFloat: parseFloatSafe, toNumber, safeDivide, safeMultiply };\r\n\r\n// === Date Utilities ===\r\nfunction now() { return Date.now(); }\r\nfunction today() { const d = new Date(); d.setHours(0, 0, 0, 0); return d; }\r\nfunction tomorrow() { const d = today(); d.setDate(d.getDate() + 1); return d; }\r\nfunction yesterday() { const d = today(); d.setDate(d.getDate() - 1); return d; }\r\nfunction isDate(val) { return val instanceof Date && !isNaN(val.getTime()); }\r\nfunction isValidDate(date) { return isDate(date); }\r\nfunction parseDate(str) { const d = new Date(str); return isValidDate(d) ? d : null; }\r\nfunction formatDate(date, formatStr = 'YYYY-MM-DD HH:mm:ss') { if (!isDate(date)) return ''; const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); const milliseconds = String(date.getMilliseconds()).padStart(3, '0'); const weekDays = ['日', '一', '二', '三', '四', '五', '六']; const weekDay = weekDays[date.getDay()]; return formatStr.replace('YYYY', year).replace('MM', month).replace('DD', day).replace('HH', hours).replace('mm', minutes).replace('ss', seconds).replace('SSS', milliseconds).replace('D', date.getDate()).replace('M', date.getMonth() + 1).replace('H', date.getHours()).replace('m', date.getMinutes()).replace('s', date.getSeconds()).replace('W', weekDay); }\r\nfunction toISO(date) { return isDate(date) ? date.toISOString() : ''; }\r\nfunction toUTC(date) { return isDate(date) ? new Date(date.toUTCString()) : null; }\r\nfunction addDays(date, days) { if (!isDate(date)) return date; const d = new Date(date); d.setDate(d.getDate() + days); return d; }\r\nfunction addHours(date, hours) { if (!isDate(date)) return date; const d = new Date(date); d.setHours(d.getHours() + hours); return d; }\r\nfunction addMinutes(date, minutes) { if (!isDate(date)) return date; const d = new Date(date); d.setMinutes(d.getMinutes() + minutes); return d; }\r\nfunction addSeconds(date, seconds) { if (!isDate(date)) return date; const d = new Date(date); d.setSeconds(d.getSeconds() + seconds); return d; }\r\nfunction diffDays(date1, date2) { if (!isDate(date1) || !isDate(date2)) return 0; const d1 = new Date(date1); d1.setHours(0,0,0,0); const d2 = new Date(date2); d2.setHours(0,0,0,0); return Math.floor((d1.getTime() - d2.getTime()) / (1000 * 60 * 60 * 24)); }\r\nfunction diffHours(date1, date2) { if (!isDate(date1) || !isDate(date2)) return 0; return Math.floor((date1.getTime() - date2.getTime()) / (1000 * 60 * 60)); }\r\nfunction diffMinutes(date1, date2) { if (!isDate(date1) || !isDate(date2)) return 0; return Math.floor((date1.getTime() - date2.getTime()) / (1000 * 60)); }\r\nfunction diffSeconds(date1, date2) { if (!isDate(date1) || !isDate(date2)) return 0; return Math.floor((date1.getTime() - date2.getTime()) / 1000); }\r\nfunction isToday(date) { if (!isDate(date)) return false; return diffDays(date, today()) === 0; }\r\nfunction isYesterday(date) { if (!isDate(date)) return false; return diffDays(date, today()) === -1; }\r\nfunction isTomorrow(date) { if (!isDate(date)) return false; return diffDays(date, today()) === 1; }\r\nfunction isFuture(date) { if (!isDate(date)) return false; return date.getTime() > now(); }\r\nfunction isPast(date) { if (!isDate(date)) return false; return date.getTime() < now(); }\r\nfunction isLeapYear(date) { if (!isDate(date)) return false; const year = date.getFullYear(); return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); }\r\nfunction getDaysInMonth(date) { if (!isDate(date)) return 0; return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate(); }\r\nfunction getWeekOfYear(date) { if (!isDate(date)) return 0; const startOfYear = new Date(date.getFullYear(), 0, 1); const diff = date.getTime() - startOfYear.getTime(); return Math.ceil(diff / (1000 * 60 * 60 * 24 * 7)); }\r\nfunction getQuarter(date) { if (!isDate(date)) return 0; return Math.ceil((date.getMonth() + 1) / 3); }\r\nfunction startOfDay(date) { if (!isDate(date)) return date; const d = new Date(date); d.setHours(0, 0, 0, 0); return d; }\r\nfunction endOfDay(date) { if (!isDate(date)) return date; const d = new Date(date); d.setHours(23, 59, 59, 999); return d; }\r\nfunction startOfMonth(date) { if (!isDate(date)) return date; return new Date(date.getFullYear(), date.getMonth(), 1); }\r\nfunction endOfMonth(date) { if (!isDate(date)) return date; return new Date(date.getFullYear(), date.getMonth() + 1, 0, 23, 59, 59, 999); }\r\nfunction startOfWeek(date, startDay = 1) { if (!isDate(date)) return date; const d = new Date(date); const day = d.getDay(); const diff = day >= startDay ? day - startDay : day + (7 - startDay); d.setDate(d.getDate() - diff); d.setHours(0, 0, 0, 0); return d; }\r\nfunction endOfWeek(date, startDay = 1) { if (!isDate(date)) return date; const start = startOfWeek(date, startDay); const end = new Date(start); end.setDate(end.getDate() + 6); end.setHours(23, 59, 59, 999); return end; }\r\nfunction getAge(birthDate) { if (!isDate(birthDate)) return 0; const n = new Date(); let age = n.getFullYear() - birthDate.getFullYear(); if (n.getMonth() < birthDate.getMonth() || (n.getMonth() === birthDate.getMonth() && n.getDate() < birthDate.getDate())) { age--; } return Math.max(0, age); }\r\nfunction fromNow(date) { if (!isDate(date)) return ''; const n = now(); const diff = n - date.getTime(); const minute = 60 * 1000; const hour = 60 * minute; const day = 24 * hour; const week = 7 * day; const month = 30 * day; const year = 365 * day; if (diff < minute) return '刚刚'; if (diff < hour) return `${Math.floor(diff / minute)}分钟前`; if (diff < day) return `${Math.floor(diff / hour)}小时前`; if (diff < week) return `${Math.floor(diff / day)}天前`; if (diff < month) return `${Math.floor(diff / week)}周前`; if (diff < year) return `${Math.floor(diff / month)}个月前`; return `${Math.floor(diff / year)}年前`; }\r\n\r\nconst dateUtils = { now, today, tomorrow, yesterday, isDate, isValid: isValidDate, parse: parseDate, format: formatDate, toISO, toUTC, addDays, addHours, addMinutes, addSeconds, diffDays, diffHours, diffMinutes, diffSeconds, isToday, isYesterday, isTomorrow, isFuture, isPast, isLeapYear, getDaysInMonth, getWeekOfYear, getQuarter, startOfDay, endOfDay, startOfMonth, endOfMonth, startOfWeek, endOfWeek, getAge, fromNow };\r\n\r\n// === Timing Utilities ===\r\nfunction debounce(func, wait, options = {}) {\r\n let timeout = null, lastArgs = null, lastThis = null, lastCallTime = 0;\r\n const leading = options.leading || false;\r\n const trailing = options.trailing !== false;\r\n function invokeFunc() { func.apply(lastThis, lastArgs); }\r\n function leadingEdge() { lastCallTime = Date.now(); if (leading) { timeout = setTimeout(trailingEdge, wait); invokeFunc(); } else { timeout = setTimeout(trailingEdge, wait); } }\r\n function trailingEdge() { timeout = null; if (trailing && lastArgs) { invokeFunc(); } lastArgs = null; lastThis = null; }\r\n function remainingWait() { return Math.max(0, wait - (Date.now() - lastCallTime)); }\r\n return function(...args) { lastArgs = args; lastThis = this; lastCallTime = Date.now(); if (!timeout) { leadingEdge(); } else { clearTimeout(timeout); timeout = setTimeout(trailingEdge, remainingWait()); } };\r\n}\r\n\r\nfunction throttle(func, limit, options = {}) {\r\n let inThrottle = false;\r\n const trailing = options.trailing || false;\r\n let lastArgs = null, lastThis = null;\r\n function invokeFunc() { func.apply(lastThis, lastArgs); lastArgs = null; lastThis = null; }\r\n return function(...args) { if (!inThrottle) { inThrottle = true; lastArgs = args; lastThis = this; invokeFunc(); setTimeout(() => { inThrottle = false; if (trailing && lastArgs) { invokeFunc(); } }, limit); } else if (trailing) { lastArgs = args; lastThis = this; } };\r\n}\r\n\r\n// === Validator Utilities ===\r\nfunction isEmail(str) { return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(str || ''); }\r\nfunction isPhone(str) { return /^1[3-9]\\d{9}$/.test(str || ''); }\r\nfunction isURL(str) { return /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w.-]*)*\\/?$/.test(str || ''); }\r\nfunction isIPv4(str) { return /^((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]?)$/.test(str || ''); }\r\nfunction isIPv6(str) { return /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/.test(str || ''); }\r\nfunction isIP(str) { return isIPv4(str) || isIPv6(str); }\r\nfunction isIDCard(str) { return /^[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]$/.test(str || ''); }\r\nfunction isPassport(str) { return /^[A-Z][0-9]{8}$|^[A-Z]{2}[0-9]{7}$/.test(str || ''); }\r\nfunction isCreditCard(str) { 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})$/; const cleanStr = str.replace(/\\s/g, ''); if (!regex.test(cleanStr)) return false; let s = 0, alt = false; for (let i = cleanStr.length - 1; i >= 0; i--) { let digit = parseInt(cleanStr[i], 10); if (alt) { digit *= 2; if (digit > 9) digit -= 9; } s += digit; alt = !alt; } return s % 10 === 0; }\r\nfunction isHexColor(str) { return /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(str || ''); }\r\nfunction isRGB(str) { const m = /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/.exec(str || ''); if (!m) return false; return m.slice(1).every(v => parseInt(v) >= 0 && parseInt(v) <= 255); }\r\nfunction isRGBA(str) { const m = /^rgba\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3}),\\s*([01]|0\\.\\d+)\\)$/.exec(str || ''); if (!m) return false; const [, r, g, b, a] = m; return parseInt(r) >= 0 && parseInt(r) <= 255 && parseInt(g) >= 0 && parseInt(g) <= 255 && parseInt(b) >= 0 && parseInt(b) <= 255 && parseFloat(a) >= 0 && parseFloat(a) <= 1; }\r\nfunction isColor(str) { return isHexColor(str) || isRGB(str) || isRGBA(str); }\r\nfunction isDateStr(str) { return !isNaN(new Date(str).getTime()); }\r\nfunction isJSON(str) { try { JSON.parse(str); return true; } catch { return false; } }\r\nfunction isEmptyStr(str) { return !str || str.trim() === ''; }\r\nfunction isWhitespace(str) { return /^\\s+$/.test(str || ''); }\r\nfunction isNumberStr(str) { return !isNaN(parseFloat(str)) && isFinite(str); }\r\nfunction isIntegerStr(str) { return /^-?\\d+$/.test(str || ''); }\r\nfunction isFloatStr(str) { return /^-?\\d+\\.\\d+$/.test(str || ''); }\r\nfunction isPositiveStr(str) { const num = parseFloat(str); return !isNaN(num) && num > 0; }\r\nfunction isNegativeStr(str) { const num = parseFloat(str); return !isNaN(num) && num < 0; }\r\nfunction isAlpha(str) { return /^[a-zA-Z]+$/.test(str || ''); }\r\nfunction isAlphaNumeric(str) { return /^[a-zA-Z0-9]+$/.test(str || ''); }\r\nfunction isChinese(str) { return /^[\\u4e00-\\u9fa5]+$/.test(str || ''); }\r\nfunction isLength(str, minVal, maxVal) { const len = (str || '').length; return len >= minVal && (maxVal === undefined || len <= maxVal); }\r\nfunction minLength(str, minVal) { return (str || '').length >= minVal; }\r\nfunction maxLength(str, maxVal) { return (str || '').length <= maxVal; }\r\nfunction matches(str, regex) { return (regex instanceof RegExp) ? regex.test(str || '') : false; }\r\nfunction equals(str1, str2) { return String(str1) === String(str2); }\r\nfunction contains(str, substring) { return (str || '').includes(substring); }\r\nfunction notContains(str, substring) { return !contains(str, substring); }\r\nfunction isArrayVal(arr) { return Array.isArray(arr); }\r\nfunction arrayLength(arr, minVal, maxVal) { const len = arr ? arr.length : 0; return len >= minVal && (maxVal === undefined || len <= maxVal); }\r\nfunction arrayMinLength(arr, minVal) { return arr ? arr.length >= minVal : false; }\r\nfunction arrayMaxLength(arr, maxVal) { return arr ? arr.length <= maxVal : false; }\r\nfunction isObjectVal(obj) { return obj !== null && typeof obj === 'object' && !Array.isArray(obj); }\r\nfunction hasKeys(obj, keys) { if (!obj || !keys || !Array.isArray(keys)) return false; return keys.every(key => Object.prototype.hasOwnProperty.call(obj, key)); }\r\nfunction validate(obj, rules) { const errors = {}; Object.keys(rules).forEach(key => { const value = obj[key]; const fieldRules = rules[key]; const fieldErrors = []; fieldRules.forEach(rule => { if (typeof rule === 'string') { const [name, ...params] = rule.split(':'); if (!validatorUtils[name](value, ...params)) { fieldErrors.push(name); } } else if (typeof rule === 'function') { const result = rule(value, obj); if (result !== true) { fieldErrors.push(result || 'validation_failed'); } } }); if (fieldErrors.length > 0) { errors[key] = fieldErrors; } }); return { valid: Object.keys(errors).length === 0, errors }; }\r\n\r\nconst validatorUtils = { isEmail, isPhone, isURL, isIPv4, isIPv6, isIP, isIDCard, isPassport, isCreditCard, isHexColor, isRGB, isRGBA, isColor, isDate: isDateStr, isJSON, isEmpty: isEmptyStr, isWhitespace, isNumber: isNumberStr, isInteger: isIntegerStr, isFloat: isFloatStr, isPositive: isPositiveStr, isNegative: isNegativeStr, isAlpha, isAlphaNumeric, isChinese, isLength, minLength, maxLength, matches, equals, contains, notContains, isArray: isArrayVal, arrayLength, arrayMinLength, arrayMaxLength, isObject: isObjectVal, hasKeys, validate };\r\n\r\n// === Crypto Utilities ===\r\nfunction md5(str) {\r\n const message = str ? String(str) : '';\r\n const md5Array = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476];\r\n const K = [0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391];\r\n const S = [[7,12,17,22],[5,9,14,20],[4,11,16,23],[6,10,15,21]];\r\n function leftRotate(value, shift) { return (value << shift) | (value >>> (32 - shift)); }\r\n function addPadding(msg) { const bitLength = msg.length * 8; msg += '\\x80'; while ((msg.length % 64) !== 56) { msg += '\\x00'; } const lowBytes = bitLength & 0xffffffff; const highBytes = (bitLength >>> 32) & 0xffffffff; for (let i = 0; i < 4; i++) { msg += String.fromCharCode((lowBytes >>> (8 * i)) & 0xff); } for (let i = 0; i < 4; i++) { msg += String.fromCharCode((highBytes >>> (8 * i)) & 0xff); } return msg; }\r\n function processBlock(block, state) { const [a, b, c, d] = state; const words = []; for (let i = 0; i < 16; i++) { words[i] = (block.charCodeAt(i * 4) & 0xff) | ((block.charCodeAt(i * 4 + 1) & 0xff) << 8) | ((block.charCodeAt(i * 4 + 2) & 0xff) << 16) | ((block.charCodeAt(i * 4 + 3) & 0xff) << 24); } let AA = a, BB = b, CC = c, DD = d; for (let i = 0; i < 64; i++) { let f, g; const r = Math.floor(i / 16); const wi = i % 16; if (r === 0) { f = (BB & CC) | (~BB & DD); g = wi; } else if (r === 1) { f = (DD & BB) | (~DD & CC); g = (5 * wi + 1) % 16; } else if (r === 2) { f = BB ^ CC ^ DD; g = (3 * wi + 5) % 16; } else { f = CC ^ (BB | ~DD); g = (7 * wi) % 16; } const temp = DD; DD = CC; CC = BB; BB = BB + leftRotate((AA + f + K[i] + words[g]) & 0xffffffff, S[r][i % 4]); AA = temp; } return [(a + AA) & 0xffffffff, (b + BB) & 0xffffffff, (c + CC) & 0xffffffff, (d + DD) & 0xffffffff]; }\r\n const paddedMessage = addPadding(message); let state = [...md5Array]; for (let i = 0; i < paddedMessage.length; i += 64) { state = processBlock(paddedMessage.substring(i, i + 64), state); } let result = ''; state.forEach(word => { for (let i = 0; i < 4; i++) { result += ((word >>> (8 * i)) & 0xff).toString(16).padStart(2, '0'); } }); return result;\r\n}\r\n\r\nfunction sha256(str) {\r\n const message = str ? String(str) : '';\r\n const K = [0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2];\r\n function rightRotate(value, shift) { return (value >>> shift) | (value << (32 - shift)); }\r\n function addPadding(msg) { const bitLength = msg.length * 8; msg += '\\x80'; while ((msg.length % 64) !== 56) { msg += '\\x00'; } const lowBytes = bitLength & 0xffffffff; const highBytes = (bitLength >>> 32) & 0xffffffff; for (let i = 0; i < 4; i++) { msg += String.fromCharCode((highBytes >>> (8 * i)) & 0xff); } for (let i = 0; i < 4; i++) { msg += String.fromCharCode((lowBytes >>> (8 * i)) & 0xff); } return msg; }\r\n function processBlock(block, state) { const words = []; for (let i = 0; i < 16; i++) { words[i] = (block.charCodeAt(i * 4) & 0xff) | ((block.charCodeAt(i * 4 + 1) & 0xff) << 8) | ((block.charCodeAt(i * 4 + 2) & 0xff) << 16) | ((block.charCodeAt(i * 4 + 3) & 0xff) << 24); } for (let i = 16; i < 64; i++) { const s0 = rightRotate(words[i-15],7) ^ rightRotate(words[i-15],18) ^ (words[i-15]>>>3); const s1 = rightRotate(words[i-2],17) ^ rightRotate(words[i-2],19) ^ (words[i-2]>>>10); words[i] = (words[i-16]+s0+words[i-7]+s1) & 0xffffffff; } let [a,b,c,d,e,f,g,h] = state; for (let i = 0; i < 64; i++) { const S1 = rightRotate(e,6)^rightRotate(e,11)^rightRotate(e,25); const ch = (e&f)^(~e&g); const temp1 = (h+S1+ch+K[i]+words[i]) & 0xffffffff; const S0 = rightRotate(a,2)^rightRotate(a,13)^rightRotate(a,22); const maj = (a&b)^(a&c)^(b&c); const temp2 = (S0+maj) & 0xffffffff; h=g; g=f; f=e; e=(d+temp1)&0xffffffff; d=c; c=b; b=a; a=(temp1+temp2)&0xffffffff; } return [(state[0]+a)&0xffffffff,(state[1]+b)&0xffffffff,(state[2]+c)&0xffffffff,(state[3]+d)&0xffffffff,(state[4]+e)&0xffffffff,(state[5]+f)&0xffffffff,(state[6]+g)&0xffffffff,(state[7]+h)&0xffffffff]; }\r\n const paddedMessage = addPadding(message); let state = [0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19]; for (let i = 0; i < paddedMessage.length; i += 64) { state = processBlock(paddedMessage.substring(i, i + 64), state); } let result = ''; state.forEach(word => { for (let i = 3; i >= 0; i--) { result += ((word >>> (8 * i)) & 0xff).toString(16).padStart(2, '0'); } }); return result;\r\n}\r\n\r\nfunction base64Encode(str) { const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; let result = ''; let i = 0; const bytes = str ? str.split('').map(c => c.charCodeAt(0)) : []; while (i < bytes.length) { const byte1 = bytes[i++]; const byte2 = bytes[i++] || 0; const byte3 = bytes[i++] || 0; const enc1 = byte1 >> 2; const enc2 = ((byte1 & 3) << 4) | (byte2 >> 4); const enc3 = ((byte2 & 15) << 2) | (byte3 >> 6); const enc4 = byte3 & 63; result += chars[enc1] + chars[enc2] + (i > bytes.length + 1 ? '=' : chars[enc3]) + (i > bytes.length ? '=' : chars[enc4]); } return result; }\r\nfunction base64Decode(str) { const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; let result = ''; let i = 0; str = str.replace(/[^A-Za-z0-9+/=]/g, ''); while (i < str.length) { const enc1 = chars.indexOf(str.charAt(i++)); const enc2 = chars.indexOf(str.charAt(i++)); const enc3 = chars.indexOf(str.charAt(i++)); const enc4 = chars.indexOf(str.charAt(i++)); const byte1 = (enc1 << 2) | (enc2 >> 4); const byte2 = ((enc2 & 15) << 4) | (enc3 >> 2); const byte3 = ((enc3 & 3) << 6) | enc4; result += String.fromCharCode(byte1); if (enc3 !== 64) result += String.fromCharCode(byte2); if (enc4 !== 64) result += String.fromCharCode(byte3); } return result; }\r\nfunction uuid() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { const r = Math.random() * 16 | 0; const v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); }\r\n\r\nconst cryptoUtils = { md5, sha256, base64Encode, base64Decode, uuid };\r\n\r\n// === Preload Utilities ===\r\nconst _preloadCache = new Map();\r\nasync function loadImage(url, options = {}) { const { crossOrigin = 'anonymous' } = options; if (_preloadCache.has(url)) return _preloadCache.get(url); return new Promise((resolve, reject) => { const img = new Image(); img.crossOrigin = crossOrigin; img.onload = () => { _preloadCache.set(url, img); resolve(img); }; img.onerror = () => { reject(new Error(`Failed to load image: ${url}`)); }; img.src = url; }); }\r\nasync function loadImages(urls, options = {}) { const { parallel = true } = options; if (parallel) return Promise.all(urls.map(url => loadImage(url, options))); const results = []; for (const url of urls) { results.push(await loadImage(url, options)); } return results; }\r\nasync function loadScript(url, options = {}) { const { type = 'text/javascript', async: isAsync = true, defer = false } = options; if (_preloadCache.has(url)) return _preloadCache.get(url); return new Promise((resolve, reject) => { const script = document.createElement('script'); script.type = type; script.async = isAsync; script.defer = defer; script.onload = () => { _preloadCache.set(url, script); resolve(script); }; script.onerror = () => { script.remove(); reject(new Error(`Failed to load script: ${url}`)); }; script.src = url; document.head.appendChild(script); }); }\r\nasync function loadStylesheet(url, options = {}) { const { media = 'all' } = options; if (_preloadCache.has(url)) return _preloadCache.get(url); return new Promise((resolve, reject) => { const link = document.createElement('link'); link.rel = 'stylesheet'; link.href = url; link.media = media; link.onload = () => { _preloadCache.set(url, link); resolve(link); }; link.onerror = () => { link.remove(); reject(new Error(`Failed to load stylesheet: ${url}`)); }; document.head.appendChild(link); }); }\r\nasync function loadFont(fontFamily, src, options = {}) { const { weight = 'normal', style = 'normal' } = options; const fontFace = new FontFace(fontFamily, `url(${src})`, { weight, style }); try { await fontFace.load(); document.fonts.add(fontFace); return fontFace; } catch (e) { throw new Error(`Failed to load font: ${fontFamily}`); } }\r\nasync function preload(url, type = 'image') { switch (type) { case 'image': return loadImage(url); case 'script': return loadScript(url); case 'stylesheet': case 'style': return loadStylesheet(url); default: throw new Error(`Unsupported preload type: ${type}`); } }\r\nfunction isLoaded(url) { return _preloadCache.has(url); }\r\nfunction clearPreloadCache() { _preloadCache.clear(); }\r\nfunction clearCacheByUrl(url) { _preloadCache.delete(url); }\r\n\r\nconst preloadUtils = { loadImage, loadImages, loadScript, loadStylesheet, loadFont, preload, isLoaded, clearCache: clearPreloadCache, clearCacheByUrl };\r\n\r\n// === Backward-compatible facade ===\r\nconst KupolaUtils = {\r\n string: stringUtils,\r\n array: arrayUtils,\r\n object: objectUtils,\r\n number: numberUtils,\r\n date: dateUtils,\r\n debounce,\r\n throttle,\r\n validator: validatorUtils,\r\n crypto: cryptoUtils,\r\n preload: preloadUtils\r\n};\r\n\r\nexport {\r\n KupolaUtils,\r\n stringUtils, arrayUtils, objectUtils, numberUtils, dateUtils,\r\n debounce, throttle, validatorUtils, cryptoUtils, preloadUtils\r\n};\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 let str = String(html);\r\n\r\n // Iteratively remove dangerous tags (handles nested attempts like <scr<script>ipt>)\r\n const dangerousTags = /<\\s*(script|iframe|object|embed|applet|form|base|link|meta|style)\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*\\1\\s*>|<\\s*(script|iframe|object|embed|applet|form|base|link|meta|style)\\b[^>]*\\/?>/gi;\r\n let prev;\r\n do {\r\n prev = str;\r\n str = str.replace(dangerousTags, '');\r\n } while (str !== prev);\r\n\r\n // Remove event handler attributes (on* = ...)\r\n str = str.replace(/\\bon\\w+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, '');\r\n\r\n // Remove javascript:, vbscript:, data: URIs in href/src/action attributes\r\n str = str.replace(/(href|src|action|background)\\s*=\\s*(?:\"[^\"]*(?:javascript|vbscript|data)\\s*:[^\"]*\"|'[^']*(?:javascript|vbscript|data)\\s*:[^']*'|[^\\s>]*(?:javascript|vbscript|data)\\s*:[^\\s>]*)/gi, '$1=\"\"');\r\n\r\n // Remove expression() in style attributes (IE CSS expression)\r\n str = str.replace(/expression\\s*\\([^)]*\\)/gi, '');\r\n\r\n return str;\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._isObserving = false;\r\n this._mutationObserver = new MutationObserver((mutations) => {\r\n // Re-entry guard: skip mutations caused by _bindElement itself\r\n if (this._isObserving) return;\r\n this._isObserving = true;\r\n try {\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 } finally {\r\n this._isObserving = false;\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 (kupolaData) {\r\n kupolaData.set(this._stateKey, initialState);\r\n this.state = kupolaData.data?.[this._stateKey] || \r\n kupolaData.createReactive(initialState, this._stateKey);\r\n \r\n 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 (kupolaData) {\r\n 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 /**\r\n * Subscribe to value changes.\r\n * @param {Function} callback - Called with new value on change\r\n * @returns {{ unsubscribe: Function }} Unsubscribe handle\r\n */\r\n refObj.subscribe = (callback) => {\r\n refObj._subscribers.add(callback);\r\n return {\r\n unsubscribe() { refObj._subscribers.delete(callback); }\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","const config = {\n paths: {\n icons: '/icons/',\n base: '/'\n },\n theme: {\n default: 'dark',\n brand: 'zengqing'\n },\n i18n: {\n locale: 'zh-CN',\n fallbackLocale: 'en-US'\n },\n http: {\n baseURL: '',\n timeout: 10000,\n headers: {},\n withCredentials: false\n },\n ui: {\n defaultSize: 'md',\n defaultVariant: 'default'\n },\n performance: {\n lazyLoad: true,\n debounceDelay: 300,\n throttleDelay: 100,\n animationEnabled: true\n },\n security: {\n xssProtection: true,\n sanitizeHtml: {\n enabled: true,\n allowedTags: ['b', 'i', 'u', 'em', 'strong', 'a', 'br', 'p', 'span', 'div', 'img'],\n allowedAttributes: {\n 'a': ['href', 'target', 'rel'],\n 'img': ['src', 'alt', 'width', 'height'],\n 'span': ['class', 'style'],\n 'div': ['class', 'style']\n }\n }\n },\n dev: {\n debug: false,\n logLevel: 'warn'\n },\n extend: {\n themeVariables: {}\n },\n components: {\n autoInit: true,\n silentErrors: false\n },\n store: {\n persist: true,\n prefix: 'kupola-'\n },\n events: {\n global: true\n }\n};\n\nexport function setConfig(options) {\n mergeDeep(config, options);\n}\n\nexport function getConfig(key) {\n if (!key) return config;\n return getNestedValue(config, key);\n}\n\nexport function getIconsPath() {\n return config.paths.base + config.paths.icons.replace(/^\\//, '');\n}\n\nexport function getBasePath() {\n return config.paths.base;\n}\n\nexport function getDefaultTheme() {\n return config.theme.default;\n}\n\nexport function getDefaultBrand() {\n return config.theme.brand;\n}\n\nexport function getHttpConfig() {\n return config.http;\n}\n\nexport function getUiConfig() {\n return config.ui;\n}\n\nexport function getSecurityConfig() {\n return config.security;\n}\n\nexport function getDevConfig() {\n return config.dev;\n}\n\nexport function getPerformanceConfig() {\n return config.performance;\n}\n\nexport function getExtendConfig() {\n return config.extend;\n}\n\nfunction mergeDeep(target, source) {\n for (const key in source) {\n if (source[key] instanceof Object && key in target && target[key] instanceof Object) {\n mergeDeep(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n }\n return target;\n}\n\nfunction getNestedValue(obj, key) {\n return key.split('.').reduce((o, k) => (o && o[k]) !== undefined ? o[k] : undefined, obj);\n}","import { getIconsPath, getDefaultTheme, getDefaultBrand } from './kupola-config.js';\r\n\r\nconst 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) || getDefaultTheme();\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) || getDefaultBrand();\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 updateThemeIcon(toggleBtn) {\r\n const iconEl = toggleBtn.querySelector('.theme-icon');\r\n if (iconEl) {\r\n const currentTheme = getTheme();\r\n const iconsPath = getIconsPath();\r\n iconEl.src = currentTheme === 'dark' ? iconsPath + 'sun.svg' : iconsPath + 'moon.svg';\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 updateThemeIcon(toggleBtn);\r\n const existingOnClick = toggleBtn.onclick;\r\n toggleBtn.onclick = function(e) {\r\n e.preventDefault();\r\n const currentTheme = getTheme();\r\n const newTheme = currentTheme === 'dark' ? 'light' : 'dark';\r\n setTheme(newTheme);\r\n updateThemeIcon(toggleBtn);\r\n if (typeof existingOnClick === 'function') {\r\n existingOnClick.call(this, e);\r\n }\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 iconsPath = getIconsPath();\r\n icon.src = getTheme() === 'dark' \r\n ? iconsPath + 'sun.svg' \r\n : iconsPath + '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.onclick = function(e) {\r\n e.preventDefault();\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};","import { getSecurityConfig } from './kupola-config.js';\n\nexport function sanitizeHtml(html, options = {}) {\n const securityConfig = getSecurityConfig();\n const sanitizeConfig = securityConfig?.sanitizeHtml || {};\n \n if (!sanitizeConfig.enabled && !options.force) {\n return html;\n }\n \n const allowedTags = options.allowedTags || sanitizeConfig.allowedTags || [];\n const allowedAttributes = options.allowedAttributes || sanitizeConfig.allowedAttributes || {};\n \n if (typeof html !== 'string') {\n return html;\n }\n \n const domParser = new DOMParser();\n const doc = domParser.parseFromString(html, 'text/html');\n const elements = doc.body.querySelectorAll('*');\n \n elements.forEach(element => {\n const tagName = element.tagName.toLowerCase();\n \n if (!allowedTags.includes(tagName)) {\n element.remove();\n return;\n }\n \n Array.from(element.attributes).forEach(attr => {\n const attrName = attr.name.toLowerCase();\n const tagAllowedAttrs = allowedAttributes[tagName] || [];\n \n if (!tagAllowedAttrs.includes(attrName)) {\n element.removeAttribute(attr.name);\n }\n });\n });\n \n return doc.body.innerHTML;\n}\n\nexport function escapeHtml(text) {\n if (typeof text !== 'string') {\n return text;\n }\n \n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n}\n\nexport function stripHtml(html) {\n if (typeof html !== 'string') {\n return html;\n }\n \n const domParser = new DOMParser();\n const doc = domParser.parseFromString(html, 'text/html');\n return doc.body.textContent || '';\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","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 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 this.isMounted = true;\r\n await this.lifecycle.mount();\r\n\r\n this.setupContext?._executeMounted();\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}","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 * 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\nimport { getConfig, getSecurityConfig } from './kupola-config.js';\r\n\r\nlet kupolaRegistry = null;\r\n\r\nif (typeof window !== 'undefined') {\r\n kupolaRegistry = new KupolaComponentRegistry();\r\n}\r\n\r\nfunction _applySecurityHeaders() {\r\n const securityConfig = getSecurityConfig();\r\n \r\n if (securityConfig.xssProtection && typeof document !== 'undefined') {\r\n let metaTag = document.querySelector('meta[http-equiv=\"X-XSS-Protection\"]');\r\n if (!metaTag) {\r\n metaTag = document.createElement('meta');\r\n metaTag.setAttribute('http-equiv', 'X-XSS-Protection');\r\n metaTag.setAttribute('content', '1; mode=block');\r\n document.head.insertBefore(metaTag, document.head.firstChild);\r\n }\r\n \r\n metaTag = document.querySelector('meta[http-equiv=\"X-Content-Type-Options\"]');\r\n if (!metaTag) {\r\n metaTag = document.createElement('meta');\r\n metaTag.setAttribute('http-equiv', 'X-Content-Type-Options');\r\n metaTag.setAttribute('content', 'nosniff');\r\n document.head.insertBefore(metaTag, document.head.firstChild);\r\n }\r\n \r\n metaTag = document.querySelector('meta[http-equiv=\"X-Frame-Options\"]');\r\n if (!metaTag) {\r\n metaTag = document.createElement('meta');\r\n metaTag.setAttribute('http-equiv', 'X-Frame-Options');\r\n metaTag.setAttribute('content', 'SAMEORIGIN');\r\n document.head.insertBefore(metaTag, document.head.firstChild);\r\n }\r\n }\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 _applySecurityHeaders();\r\n \r\n const config = getConfig();\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 \r\n if (config.components?.autoInit !== false) {\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\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};","import { getConfig } from './kupola-config.js';\r\n\r\nclass KupolaI18n {\r\n constructor(options = {}) {\r\n const config = getConfig();\r\n this.locales = options.locales || {};\r\n this.currentLocale = options.defaultLocale || config.i18n?.locale || 'zh-CN';\r\n this.fallbackLocale = options.fallbackLocale || config.i18n?.fallbackLocale || 'en-US';\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};","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 };","import { globalEvents } from './global-events.js';\r\nimport { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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 this._triggerKeydownHandler = 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._triggerKeydownHandler = (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 this.trigger.addEventListener('keydown', this._triggerKeydownHandler);\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 this._documentClickListener = globalEvents.on(document, 'click', this._documentClickHandler, { scope: this.scope });\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 if (this._triggerKeydownHandler) this.trigger.removeEventListener('keydown', this._triggerKeydownHandler);\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._triggerKeydownHandler = 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\nkupolaInitializer.register('dropdown', initDropdown, cleanupDropdown);","import { globalEvents } from './global-events.js';\r\nimport { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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 this._documentClickListener = globalEvents.on(document, 'click', this._documentClickHandler, { scope: this.scope });\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\nkupolaInitializer.register('select', initSelect, cleanupSelect);","import { globalEvents } from './global-events.js';\r\nimport { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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._endInputClickHandler = 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) {\r\n this._endInputClickHandler = (e) => {\r\n this.isSelectingEnd = true;\r\n this.toggleCalendar(e);\r\n };\r\n this.endInput.addEventListener('click', this._endInputClickHandler);\r\n }\r\n\r\n this._documentClickListener = globalEvents.on(document, 'click', (e) => this.hideCalendar(e), { scope: this.scope });\r\n this._resizeListener = globalEvents.on(window, 'resize', () => this.resizeHandler(), { scope: this.scope });\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.endInput && this._endInputClickHandler) this.endInput.removeEventListener('click', this._endInputClickHandler);\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._endInputClickHandler = 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\nkupolaInitializer.register('datepicker', initDatepicker, cleanupDatepicker);\r\n","import { globalEvents } from './global-events.js';\r\nimport { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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 this._documentClickListener = globalEvents.on(document, 'click', (e) => this.hideTimepicker(e), { scope: this.scope });\r\n this._resizeListener = globalEvents.on(window, 'resize', () => this.resizeHandler(), { scope: this.scope });\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\nkupolaInitializer.register('timepicker', initTimepicker, cleanupTimepicker);\r\n","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('slider', initSlider, cleanupSlider);\r\n","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('carousel', initCarousel, cleanupCarousel);\r\n","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('drawer', initDrawer, cleanupDrawer);\r\n","import { kupolaInitializer } from './initializer.js';\r\nimport { getUiConfig } from './kupola-config.js';\r\n\r\nclass 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._isOpen = false; // 实例级跟踪,防止 _openCount 不匹配\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 if (!this._isOpen) {\r\n Modal._openCount = (Modal._openCount || 0) + 1;\r\n this._isOpen = true;\r\n }\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 if (this._isOpen) {\r\n Modal._openCount = Math.max(0, (Modal._openCount || 0) - 1);\r\n this._isOpen = false;\r\n if (Modal._openCount === 0) {\r\n document.body.style.overflow = '';\r\n }\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 // 防御性:如果 destroy 时 modal 仍处于打开状态,强制修正计数\r\n if (this._isOpen) {\r\n Modal._openCount = Math.max(0, (Modal._openCount || 0) - 1);\r\n this._isOpen = false;\r\n if (Modal._openCount === 0) {\r\n document.body.style.overflow = '';\r\n }\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 size = getUiConfig().defaultSize\r\n } = options;\r\n \r\n const sizeClass = size === 'sm' ? 'ds-btn--sm' : size === 'lg' ? 'ds-btn--lg' : '';\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 ${sizeClass} ${cancelClass}\" data-modal-cancel>${cancelText}</button>` : ''}\r\n ${showConfirm ? `<button class=\"ds-btn ${sizeClass} ${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\nkupolaInitializer.register('modal', initModal, cleanupModal);\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 };","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 };","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 };","import { kupolaInitializer } from './initializer.js';\r\n\r\nfunction _escapeHtml(str) {\r\n if (!str) return '';\r\n return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#39;');\r\n}\r\n\r\nclass 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(_escapeHtml(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=\"${_escapeHtml(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\nkupolaInitializer.register('fileupload', initFileUpload, cleanupFileUpload);","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('collapse', initCollapse, cleanupCollapse);\r\n","import { globalEvents } from './global-events.js';\r\nimport { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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 this._documentClickListener = globalEvents.on(document, 'click', this._documentClickHandler, { scope: this.scope });\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\nkupolaInitializer.register('color-picker', initColorPicker, cleanupColorPicker);","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('calendar', initCalendar, cleanupCalendar);","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('dynamic-tags', initDynamicTags, cleanupDynamicTags);","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 };","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('tag', initTag, cleanupTag);","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('statcard', initStatCard, cleanupStatCard);","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('heatmap', initHeatmap, cleanupHeatmap);","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('tooltip', initTooltip, cleanupTooltip);","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(...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 };","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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 html += this._buildItemHtml(item, actualIndex, key, isSelected, itemSize, currentPosition, isHorizontal);\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 _buildItemHtml(item, index, key, isSelected, size, position, isHorizontal) {\r\n const selectedClass = isSelected ? ' is-selected' : '';\r\n const content = this.renderItem(item, index);\r\n if (isHorizontal) {\r\n return `<div class=\"ds-virtual-list__item${selectedClass}\" style=\"position: absolute; top: 0; left: ${position}px; width: ${size}px; height: 100%;\" data-index=\"${index}\" data-key=\"${key}\">${content}</div>`;\r\n }\r\n return `<div class=\"ds-virtual-list__item${selectedClass}\" style=\"position: absolute; top: ${position}px; left: 0; right: 0; height: ${size}px;\" data-index=\"${index}\" data-key=\"${key}\">${content}</div>`;\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\nkupolaInitializer.register('virtual-list', initVirtualList, cleanupVirtualList);","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\n// Auto-render SVG sprite on DOM ready\r\nif (typeof document !== 'undefined') {\r\n if (document.readyState !== 'loading') {\r\n render();\r\n } else {\r\n document.addEventListener('DOMContentLoaded', () => render());\r\n }\r\n}","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('countdown', initCountdown, cleanupCountdown);","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('number-input', initNumberInput, cleanupNumberInput);","import { globalEvents } from './global-events.js';\r\nimport { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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 this._mouseMoveListener = globalEvents.on(document, 'mousemove', this._mouseMoveHandler, { scope: this.scope });\r\n this._mouseUpListener = globalEvents.on(document, 'mouseup', this._mouseUpHandler, { scope: this.scope });\r\n this._touchMoveListener = globalEvents.on(document, 'touchmove', this._touchMoveHandler, { scope: this.scope, passive: false });\r\n this._touchEndListener = globalEvents.on(document, 'touchend', this._touchEndHandler, { scope: this.scope });\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\nkupolaInitializer.register('slide-captcha', initSlideCaptchas, cleanupAllSlideCaptchas);","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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._submitHandler = null;\r\n this._fieldHandlers = new Map(); // field → { blur, input }\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._submitHandler = (e) => {\r\n if (!this.validate()) {\r\n e.preventDefault();\r\n }\r\n };\r\n this.form.addEventListener('submit', this._submitHandler);\r\n\r\n this.fields.forEach(field => {\r\n const blurHandler = () => this.validateField(field);\r\n const inputHandler = () => this.clearError(field);\r\n this._fieldHandlers.set(field, { blur: blurHandler, input: inputHandler });\r\n field.addEventListener('blur', blurHandler);\r\n field.addEventListener('input', inputHandler);\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 // 移除 submit handler\r\n if (this._submitHandler && this.form) {\r\n this.form.removeEventListener('submit', this._submitHandler);\r\n }\r\n\r\n // 移除每个字段的 blur/input handlers\r\n this._fieldHandlers.forEach((handlers, field) => {\r\n field.removeEventListener('blur', handlers.blur);\r\n field.removeEventListener('input', handlers.input);\r\n });\r\n\r\n this._submitHandler = null;\r\n this._fieldHandlers.clear();\r\n this._fieldHandlers = null;\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\nkupolaInitializer.register('form-validation', initFormValidation);","import { ref } from './data-bind.js';\r\nimport { getConfig } from './kupola-config.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 this._flushDepth = 0;\r\n this._maxDepth = 10;\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 if (this._flushDepth >= this._maxDepth) {\r\n console.warn('[Kupola Scheduler] Max flush depth reached, possible infinite loop detected');\r\n this._queue.clear();\r\n this._scheduled = false;\r\n return;\r\n }\r\n const tasks = Array.from(this._queue);\r\n this._queue.clear();\r\n this._scheduled = false;\r\n this._flushDepth++;\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 this._flushDepth--;\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 // Exponential backoff + random jitter to prevent thundering herd\r\n const baseDelay = this.retryDelay * Math.pow(2, attempt);\r\n const jitter = Math.random() * baseDelay * 0.5;\r\n const delay = baseDelay + jitter;\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 const httpConfig = getConfig('http');\r\n \r\n if (httpConfig?.baseURL && !url.startsWith('http://') && !url.startsWith('https://')) {\r\n url = httpConfig.baseURL + url.replace(/^\\//, '');\r\n }\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 globalHeaders = httpConfig?.headers || {};\r\n const fetchOptions = {\r\n method: this.method.toUpperCase(),\r\n headers: { 'Content-Type': 'application/json', ...globalHeaders, ...this.headers }\r\n };\r\n\r\n if (httpConfig?.withCredentials) {\r\n fetchOptions.credentials = 'include';\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._reconnectAttempt = 0;\r\n this._maxReconnectDelay = config.maxReconnectDelay || 30000;\r\n this.messageHandler = null;\r\n this._connected = false;\r\n this._destroyed = 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 this._reconnectAttempt = 0; // Reset on successful connection\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 && !this._destroyed) {\r\n // Exponential backoff + jitter for reconnection\r\n const baseDelay = this.reconnectDelay * Math.pow(2, this._reconnectAttempt);\r\n const jitter = Math.random() * baseDelay * 0.3;\r\n const delay = Math.min(baseDelay + jitter, this._maxReconnectDelay);\r\n this._reconnectAttempt++;\r\n setTimeout(() => {\r\n if (!this._destroyed) this.fetch().catch(() => {});\r\n }, delay);\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 this._destroyed = true;\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\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\nimport { kupolaInitializer } from './initializer.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 this._scrollHandler = null; // 保存引用以便 destroy 移除\r\n this._resizeCleanups = []; // 列宽拖拽清理函数\r\n this._filterDebounceTimer = null;\r\n this._reactiveCleanups = []; // ref() subscribe 清理\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 if (data.subscribe) {\r\n this._reactiveCleanups.push(\r\n data.subscribe((newVal) => {\r\n this._data = Array.isArray(newVal) ? newVal : [];\r\n this._total = this._data.length;\r\n this.render();\r\n })\r\n );\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 if (loading.subscribe) {\r\n this._reactiveCleanups.push(\r\n loading.subscribe((val) => { this._loading = val; this.render(); })\r\n );\r\n }\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 if (this.selection) this._renderSelectionHeader(tr);\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 this.columns.forEach(col => {\r\n const th = this._renderColumnHeader(col);\r\n tr.appendChild(th);\r\n });\r\n\r\n thead.appendChild(tr);\r\n return thead;\r\n }\r\n\r\n _renderSelectionHeader(tr) {\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 _renderColumnHeader(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 if (col.sortable) this._renderSortIndicator(th, col);\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 return th;\r\n }\r\n\r\n _renderSortIndicator(th, col) {\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 _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 if (this.selection) this._renderSelectionCell(tr, key, isSelected);\r\n if (this.expandable) this._renderExpandCell(tr, key);\r\n\r\n // Data cells\r\n this.columns.forEach((col, colIndex) => {\r\n if (skipCells.has(`${rowIndex}-${colIndex}`)) return;\r\n const td = this._renderDataCell(row, rowIndex, key, col, colIndex, skipCells, mergeMap);\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 _renderSelectionCell(tr, key, isSelected) {\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 _renderExpandCell(tr, key) {\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 btn.textContent = this._expandedKeys.has(key) ? '▼' : '▶';\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 _renderDataCell(row, rowIndex, key, col, colIndex, skipCells, mergeMap) {\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 (first column only)\r\n if (this.tree && colIndex === 0 && row._level > 0) {\r\n this._renderTreeIndent(td, row);\r\n }\r\n\r\n // Cell content: editing / custom render / plain text\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 return td;\r\n }\r\n\r\n _renderTreeIndent(td, row) {\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 _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 if (this._scrollHandler) {\r\n wrapper.removeEventListener('scroll', this._scrollHandler);\r\n }\r\n this._scrollHandler = () => this._updateVirtualScroll();\r\n wrapper.addEventListener('scroll', this._scrollHandler);\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 // 注册清理函数,destroy 时可强制移除\r\n this._resizeCleanups.push(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) => this._handleRowDrop(e, row));\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 _handleRowDrop(e, targetRow) {\r\n e.preventDefault();\r\n targetRow.classList.remove('kupola-table-drag-over');\r\n if (!this._dragState) return;\r\n const toKey = targetRow.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\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 filterInput.addEventListener('input', () => {\r\n clearTimeout(this._filterDebounceTimer);\r\n this._filterDebounceTimer = 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 // 移除虚拟滚动 scroll listener\r\n if (this._scrollHandler) {\r\n const wrapper = this.element.querySelector('.kupola-table-container');\r\n if (wrapper) wrapper.removeEventListener('scroll', this._scrollHandler);\r\n this._scrollHandler = null;\r\n }\r\n\r\n // 清除 filter debounce timer\r\n if (this._filterDebounceTimer) {\r\n clearTimeout(this._filterDebounceTimer);\r\n this._filterDebounceTimer = null;\r\n }\r\n\r\n // 清理列宽拖拽残留的 document listener\r\n this._resizeCleanups.forEach(fn => fn());\r\n this._resizeCleanups = [];\r\n\r\n // 清理 ref() 订阅\r\n this._reactiveCleanups.forEach(sub => sub.unsubscribe());\r\n this._reactiveCleanups = [];\r\n\r\n // 清理 DOM 和 class\r\n this.element.innerHTML = '';\r\n this.element.classList.remove('kupola-table-wrapper', 'kupola-table-virtual-wrapper');\r\n\r\n // 清理数据引用\r\n this._data = [];\r\n this._virtualData = null;\r\n this._dragState = null;\r\n this._editingCell = null;\r\n this._editBuffer = {};\r\n }\r\n}\r\n\r\nfunction initTable(element, options) {\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\nkupolaInitializer.register('table', initTable);\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\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"],"names":["KupolaLifecycle","scope","phase","nextState","allowed","handlers","hook","handler","options","hooks","a","b","index","h","depends","depName","depHook","args","emitId","startTime","hookStartTime","hookResult","hookError","error","hookDuration","totalDuration","stateMap","beforePhase","afterPhase","resolve","onReady","targetState","boundary","errorInfo","max","e","boundaryHandlers","result","kupolaLifecycle","createLifecycle","_UNSAFE_KEYS","_isUnsafeKey","key","trim","str","trimLeft","trimRight","toUpperCase","toLowerCase","capitalize","camelize","_","c","hyphenate","padStart","length","padChar","padEnd","truncate","maxLength","suffix","replaceAll","search","replacement","format","template","data","startsWith","prefix","endsWith","includesStr","repeat","times","reverse","countOccurrences","escapeHtml","div","unescapeHtml","generateRandom","chars","i","generateUUID","r","stringUtils","isArray","arr","isEmpty","size","first","defaultValue","last","get","slice","start","end","concat","arg","join","separator","indexOf","item","fromIndex","lastIndexOf","includes","push","items","pop","shift","unshift","remove","v","removeAt","insert","reverseArr","sort","compareFn","sortBy","order","valA","valB","filter","predicate","map","fn","reduce","initialValue","forEach","every","some","find","findIndex","flat","depth","flattenDeep","acc","unique","uniqueBy","seen","value","chunk","chunkSize","chunks","shuffle","j","sum","val","average","min","intersection","union","difference","arr1","arr2","zip","arrayUtils","isObject","obj","isEmptyObj","keys","values","entries","has","getObj","path","k","current","setObj","lastKey","pick","omit","merge","clone","deepClone","hash","m","forEachObj","mapObj","filterObj","reduceObj","toArray","fromArray","keyField","valueField","sizeObj","invert","isEqual","obj1","obj2","keys1","keys2","freeze","seal","objectUtils","isNumber","isInteger","isFloat","isPositive","isNegative","isZero","clamp","minVal","maxVal","round","precision","factor","floor","ceil","abs","minNum","nums","maxNum","sumNum","averageNum","random","randomInt","formatNum","decimals","formatCurrency","currency","formatPercent","toFixed","toPrecision","isNaNVal","isFiniteVal","parseIntSafe","radix","parseFloatSafe","toNumber","num","safeDivide","safeMultiply","numberUtils","now","today","d","tomorrow","yesterday","isDate","isValidDate","date","parseDate","formatDate","formatStr","year","month","day","hours","minutes","seconds","milliseconds","weekDay","toISO","toUTC","addDays","days","addHours","addMinutes","addSeconds","diffDays","date1","date2","d1","d2","diffHours","diffMinutes","diffSeconds","isToday","isYesterday","isTomorrow","isFuture","isPast","isLeapYear","getDaysInMonth","getWeekOfYear","startOfYear","diff","getQuarter","startOfDay","endOfDay","startOfMonth","endOfMonth","startOfWeek","startDay","endOfWeek","getAge","birthDate","n","age","fromNow","minute","hour","week","dateUtils","debounce","func","wait","timeout","lastArgs","lastThis","lastCallTime","leading","trailing","invokeFunc","leadingEdge","trailingEdge","remainingWait","throttle","limit","inThrottle","isEmail","isPhone","isURL","isIPv4","isIPv6","isIP","isIDCard","isPassport","isCreditCard","regex","cleanStr","alt","digit","isHexColor","isRGB","isRGBA","g","isColor","isDateStr","isJSON","isEmptyStr","isWhitespace","isNumberStr","isIntegerStr","isFloatStr","isPositiveStr","isNegativeStr","isAlpha","isAlphaNumeric","isChinese","isLength","len","minLength","matches","equals","str1","str2","contains","substring","notContains","isArrayVal","arrayLength","arrayMinLength","arrayMaxLength","isObjectVal","hasKeys","validate","rules","errors","fieldRules","fieldErrors","rule","name","params","validatorUtils","md5","message","md5Array","K","S","leftRotate","addPadding","msg","bitLength","lowBytes","highBytes","processBlock","block","state","words","AA","BB","CC","DD","f","wi","temp","paddedMessage","word","sha256","rightRotate","s0","s1","S1","ch","temp1","S0","maj","temp2","base64Encode","bytes","byte1","byte2","byte3","enc1","enc2","enc3","enc4","base64Decode","uuid","cryptoUtils","_preloadCache","loadImage","url","crossOrigin","reject","img","loadImages","urls","parallel","results","loadScript","type","isAsync","defer","script","loadStylesheet","media","link","loadFont","fontFamily","src","weight","style","fontFace","preload","isLoaded","clearPreloadCache","clearCacheByUrl","preloadUtils","KupolaUtils","sanitizeHtml","html","dangerousTags","prev","TrieNode","PathTrie","node","parts","part","collectKeys","child","parentPath","REACTIVE_SYMBOLS","KupolaDataBind","target","receiver","oldValue","fullPath","parentKey","proxy","updatedKeys","subKey","subValue","element","dep","silent","parent","callback","cb","binding","sanitized","display","deps","prop","storageType","version","encrypt","encryptionKey","storage","newValue","config","dataToStore","serialized","e2","testKey","maxAge","text","ciphertext","persisted","dataKey","stored","parsed","decrypted","snapshot","snapshotIndex","formElement","mutations","mutation","existingHandler","elements","KupolaStore","initialState","kupolaData","newState","payload","action","KupolaStoreManager","store","KupolaEventBus","eventName","onceCallback","selector","listener","sel","ref","refObj","sub","kupolaEvents","kupolaStoreManager","createStore","getStore","setConfig","mergeDeep","getConfig","getNestedValue","getIconsPath","getBasePath","getDefaultTheme","getDefaultBrand","getHttpConfig","getUiConfig","getSecurityConfig","getDevConfig","getPerformanceConfig","getExtendConfig","source","o","THEME_KEY","BRAND_KEY","BRAND_OPTIONS","getTheme","setTheme","theme","toggleBtn","icon","iconPath","getBrand","setBrand","brandId","brand","brandToggle","brandIcon","brandName","btn","updateThemeIcon","iconEl","currentTheme","iconsPath","initTheme","savedTheme","savedBrand","existingOnClick","newTheme","brandPicker","isHidden","closeBrandPicker","createThemeToggle","createBrandPicker","container","closeBrandPickerAuto","sanitizeConfig","allowedTags","allowedAttributes","doc","tagName","attr","attrName","stripHtml","ComponentInitializerRegistry","initFn","cleanupFn","cls","className","root","promises","kupolaInitializer","knownComponents","comp","KupolaComponent","props","slots","slotEl","slotName","customEvent","newProps","hookMap","proto","registeredHooks","methodName","lifecyclePhase","applyMixin","componentClass","mixin","original","KupolaComponentRegistry","loader","cached","loadingPromise","mixinNames","componentName","initializer","ComponentClass","instance","childInstance","kupolaRegistry","_applySecurityHeaders","metaTag","kupolaBootstrap","registerComponent","registerLazyComponent","bootstrapComponents","defineMixin","useMixin","defineComponent","KupolaI18n","locale","htmlLang","match","count","event","dateObj","number","unit","kupolaI18n","createI18n","t","setLocale","getLocale","formatNumber","GlobalEvents","once","passive","capture","listenerId","eventKey","listeners","filtered","l","targetId","detail","listenerIds","targets","keyTargetId","scopeListeners","globalEvents","on","off","emit","emitGlobal","offByScope","offAll","getListenerCount","Dropdown","triggerRect","menuRect","viewportHeight","viewportWidth","spaceBelow","spaceAbove","divider","el","initDropdown","dropdown","initDropdowns","cleanupDropdown","cleanupAllDropdowns","Select","option","opt","triggerParent","query","visible","title","group","hasVisible","optionEl","tag","removeBtn","optEl","isSelected","initSelect","select","initSelects","cleanupSelect","Datepicker","y","time","pickerRect","calendarRect","calendarHeight","isVisible","calendar","dayEl","header","prevBtn","titleBtn","nextBtn","weekHeader","span","daysEl","firstDay","daysInMonth","offset","emptyDay","clickHandler","footer","todayBtn","clearBtn","currentYear","startYear","grid","monthName","idx","initDatepicker","picker","initDatepickers","cleanupDatepicker","Timepicker","ampmMatch","second","timeVal","minParts","maxParts","period","panelRect","panelHeight","sectionsHTML","label","displayHour","displayMinute","displaySecond","displayAmPm","hourVal","ampmGrid","selected","initTimepicker","initTimepickers","cleanupTimepicker","Slider","mark","pct","inputHandler","changeHandler","trackClick","keyHandler","thumb","which","startDrag","onDrag","stopDrag","clientX","clientY","rect","percentage","step","endVal","startVal","distToStart","distToEnd","inputEl","startPct","endPct","endValue","initSlider","slider","cleanupSlider","initSliders","Carousel","indicator","prevIndex","absDx","absDy","absDeltaX","absDeltaY","initCarousel","carousel","initCarousels","cleanupCarousel","Drawer","closeBtn","cancelBtn","confirmBtn","initDrawer","drawer","cleanupDrawer","initDrawers","trigger","drawerId","mask","drawerEl","Modal","createModal","content","width","fullscreen","showCancel","showConfirm","confirmText","cancelText","confirmClass","cancelClass","closable","maskClosable","onConfirm","onCancel","onOpen","onClose","sizeClass","footerHTML","modal","titleEl","bodyEl","isConfirming","confirmHandler","cancelHandler","closeAndDestroy","originalClose","confirmModal","alertModal","initModal","cleanupModal","initModals","Dialog","icons","keydownHandler","close","maskClickHandler","confirmClickHandler","cancelClickHandler","Notification","duration","notification","initNotifications","Message","initMessages","_escapeHtml","FileUpload","files","dragoverHandler","dragleaveHandler","dropHandler","file","accept","types","fileType","fileName","fileIcon","removeHandler","extension","sizes","itemElement","errorElement","reader","previewItem","previewRemoveBtn","previewRemoveHandler","percent","bar","totalChunks","currentChunk","uploadInterval","initFileUpload","cleanupFileUpload","initFileUploads","Collapse","isDisabled","isActive","isExpanded","headerInfo","transitionHandler","initCollapse","collapse","cleanupCollapse","initCollapses","ColorPicker","color","hex","s","bVal","hueSlider","svArea","alphaSlider","x","colorBtn","mode","alpha","initColorPicker","initColorPickers","cleanupColorPicker","Calendar","prevHandler","nextHandler","todayHandler","dateStr","startStr","endStr","eventStart","eventEnd","todayStr","currentDate","dayStr","dayEvents","eventDot","dayOfWeek","monday","startDate","endDate","dayHeader","dayNum","eventsContainer","events","eventId","i18n","initCalendar","cleanupCalendar","initCalendars","DynamicTags","addTag","textNode","tagRemoveHandler","tags","colorClasses","allow","initDynamicTags","cleanupDynamicTags","initDynamicTagsAll","ImagePreview","degrees","zoom","images","meta","indicators","currentImage","imagePreviewInstance","initImagePreview","showImagePreview","Tag","closeHandler","checkboxHandler","dblclickHandler","blurHandler","sizeClasses","textNodes","checkbox","input","insertBeforeEl","checked","newContent","editable","checkable","initTag","cleanupTag","initTags","StatCard","entry","targetValue","startValue","animate","currentTime","elapsed","progress","easeProgress","currentValue","formattedValue","currentWidth","targetWidth","currentWidthValue","direction","trendElement","iconSvg","initStatCard","cleanupStatCard","initStatCards","card","Heatmap","maxValue","ratio","level","rgb","opacity","months","currentMonth","weeks","firstDayOfWeek","body","currentWeek","weekCount","cellWidth","totalGridWidth","labelsAndGrid","weekdayLabels","weekdayLabelHeight","gridContainer","monthLabels","monthInfo","nextMonth","weekSpan","weekColumn","emptyCell","cell","mouseenterHandler","mouseleaveHandler","legend","cells","label2","tooltipWidth","initHeatmap","dataAttr","generateMockHeatmapData","info","cleanupHeatmap","initHeatmaps","oneYearAgo","baseValue","Tooltip","tooltipRect","left","top","removeEl","isHtml","position","delay","enable","initTooltip","tooltip","initTooltips","cleanupTooltip","KupolaValidator","form","formId","inputs","hasError","valueEl","uploadInstance","forms","allValid","formErrors","asyncRules","validatorFunc","groupName","groups","statusElement","loading","submitting","disabled","rulesString","pattern","customMessage","validator","hasAsyncValidation","isValid","submitBtn","originalText","onSubmit","firstError","activeElement","validateOnInput","VirtualList","isHorizontal","scrollOffset","positions","currentPosition","total","itemSize","viewportSize","startIndex","endIndex","visibleData","actualIndex","selectedClass","hasChanges","actualHeight","dataItem","totalSize","thumbHeight","maxTop","thumbTop","totalHeight","deltaY","newTop","scrollTop","behavior","generateMockVirtualListData","titles","titleIndex","randomNum","initVirtualList","cleanupVirtualList","ATTRS","PATHS","svg","viewBox","render","vb","Icons","Countdown","dataEndTime","dataHours","dataMinutes","dataSeconds","distance","initCountdown","cleanupCountdown","initCountdowns","NumberInput","minusHandler","plusHandler","delta","initNumberInput","cleanupNumberInput","initNumberInputs","SlideCaptcha","trackWidth","btnWidth","maxOffset","deltaX","btnOffset","mid","distractor","velocity","acceleration","dx","dt","prevDt","prevV","pointCountEl","finalX","distractorDiff","targetDiff","speeds","maxSpeed","minSpeed","hasYMovement","p","totalTime","accelerations","onVerified","initSlideCaptchas","captcha","cleanupSlideCaptcha","cleanupAllSlideCaptchas","KupolaForm","param","field","validatorName","attrValue","initFormValidation","formSelector","getFormInstance","validateForm","Scheduler","tasks","task","globalScheduler","CacheEntry","ttl","CacheManager","DependsError","code","cause","_httpClientFetch","configureHttpClient","client","getHttpClient","resetHttpClient","DependsSource","cacheManager","attempt","baseDelay","jitter","depError","FetchedSource","httpConfig","queryParts","globalHeaders","fetchOptions","clientFetch","response","ok","status","StorageSource","RouteSource","FunctionSource","StaticSource","WebSocketSource","createSource","useDeps","depsConfig","unsubscribers","getParams","_extractPropValues","depConfig","lastUpdated","_loadId","load","thisLoadId","unsubscribeSource","propKeys","useQuery","clearCache","KupolaTable","newVal","ck","row","col","flatData","pageData","children","va","cmp","sorted","wrapper","tableContainer","table","thead","tr","th","allKeys","handle","sortInfo","tbody","mergeConfig","mergeMap","skipCells","rowIndex","expandTr","expandTd","totalCols","colIndex","td","mergeInfo","isEditing","indent","toggle","spacer","rowHeight","overscan","topSpacer","bottomSpacer","viewHeight","startIdx","endIdx","fragment","actions","saveBtn","rowKey","colKey","existing","startX","startWidth","onMouseMove","ev","newWidth","onMouseUp","targetRow","toKey","fromIdx","toIdx","moved","fixedLeft","ths","tds","colIdx","rightOffset","toolbar","filterInput","right","invertBtn","exportBtn","totalInfo","totalPages","nav","sizeSelect","pages","onClick","page","range","filename","headers","rows","csv","blob","classes","columns","initTable","initAllTables","KupolaPagination","next","jumper","half","stylesInjected","injectPaginationStyles","initPagination","registered","KupolaDropdownElement","menu","oldVal","KupolaTooltipElement","KupolaCollapseElement","collapseItem","KupolaCollapseItemElement","KupolaDrawerElement","KupolaModalElement","foot","backdrop","registerWebComponents","components"],"mappings":"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"}
1
+ {"version":3,"file":"kupola.umd.js","sources":["../js/kupola-lifecycle.js","../js/utils.js","../js/data-bind.js","../js/kupola-config.js","../js/theme.js","../js/security.js","../js/initializer.js","../js/component.js","../js/registry.js","../js/kupola-core.js","../js/i18n.js","../js/global-events.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/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 = 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}","// Prototype Pollution guard: reject keys that can access the prototype chain\r\nconst _UNSAFE_KEYS = new Set(['__proto__', 'prototype', 'constructor']);\r\nfunction _isUnsafeKey(key) {\r\n return _UNSAFE_KEYS.has(key);\r\n}\r\n\r\n// === String Utilities ===\r\nfunction trim(str) { return str ? str.trim() : ''; }\r\nfunction trimLeft(str) { return str ? str.replace(/^\\s+/, '') : ''; }\r\nfunction trimRight(str) { return str ? str.replace(/\\s+$/, '') : ''; }\r\nfunction toUpperCase(str) { return str ? str.toUpperCase() : ''; }\r\nfunction toLowerCase(str) { return str ? str.toLowerCase() : ''; }\r\nfunction capitalize(str) { if (!str) return ''; return str.charAt(0).toUpperCase() + str.slice(1); }\r\nfunction camelize(str) { if (!str) return ''; return str.replace(/-(\\w)/g, (_, c) => c ? c.toUpperCase() : ''); }\r\nfunction hyphenate(str) { if (!str) return ''; return str.replace(/([A-Z])/g, '-$1').toLowerCase().replace(/^-/, ''); }\r\nfunction padStart(str, length, padChar = ' ') { return (String(str) || '').padStart(length, padChar); }\r\nfunction padEnd(str, length, padChar = ' ') { return (String(str) || '').padEnd(length, padChar); }\r\nfunction truncate(str, maxLength, suffix = '...') { if (!str || str.length <= maxLength) return str || ''; return str.slice(0, maxLength) + suffix; }\r\nfunction replaceAll(str, search, replacement) { if (!str) return ''; return str.split(search).join(replacement); }\r\nfunction format(template, data) { if (!template) return ''; return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => data[key] !== undefined ? data[key] : `{{${key}}}`); }\r\nfunction startsWith(str, prefix) { return (str || '').startsWith(prefix); }\r\nfunction endsWith(str, suffix) { return (str || '').endsWith(suffix); }\r\nfunction includesStr(str, search) { return (str || '').includes(search); }\r\nfunction repeat(str, times) { return (str || '').repeat(times); }\r\nfunction reverse(str) { return (str || '').split('').reverse().join(''); }\r\nfunction countOccurrences(str, search) { if (!str || !search) return 0; return str.split(search).length - 1; }\r\nfunction escapeHtml(str) { if (!str) return ''; const div = document.createElement('div'); div.textContent = str; return div.innerHTML; }\r\nfunction unescapeHtml(str) { if (!str) return ''; const div = document.createElement('div'); div.innerHTML = str; return div.textContent; }\r\nfunction generateRandom(length = 8) { const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let result = ''; for (let i = 0; i < length; i++) { result += chars.charAt(Math.floor(Math.random() * chars.length)); } return result; }\r\nfunction generateUUID() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { const r = Math.random() * 16 | 0; const v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); }\r\n\r\nconst stringUtils = { trim, trimLeft, trimRight, toUpperCase, toLowerCase, capitalize, camelize, hyphenate, padStart, padEnd, truncate, replaceAll, format, startsWith, endsWith, includes: includesStr, repeat, reverse, countOccurrences, escapeHtml, unescapeHtml, generateRandom, generateUUID };\r\n\r\n// === Array Utilities ===\r\nfunction isArray(arr) { return Array.isArray(arr); }\r\nfunction isEmpty(arr) { return !arr || arr.length === 0; }\r\nfunction size(arr) { return arr ? arr.length : 0; }\r\nfunction first(arr, defaultValue) { return arr && arr.length > 0 ? arr[0] : defaultValue; }\r\nfunction last(arr, defaultValue) { return arr && arr.length > 0 ? arr[arr.length - 1] : defaultValue; }\r\nfunction get(arr, index, defaultValue) { return arr && arr[index] !== undefined ? arr[index] : defaultValue; }\r\nfunction slice(arr, start, end) { return arr ? arr.slice(start, end) : []; }\r\nfunction concat(...args) { return args.reduce((result, arg) => result.concat(arg || []), []); }\r\nfunction join(arr, separator = ',') { return arr ? arr.join(separator) : ''; }\r\nfunction indexOf(arr, item, fromIndex = 0) { if (!arr) return -1; if (Number.isNaN(item)) { for (let i = fromIndex; i < arr.length; i++) { if (Number.isNaN(arr[i])) return i; } return -1; } return arr.indexOf(item, fromIndex); }\r\nfunction lastIndexOf(arr, item, fromIndex) { if (!arr) return -1; if (Number.isNaN(item)) { const start = fromIndex !== undefined ? fromIndex : arr.length - 1; for (let i = start; i >= 0; i--) { if (Number.isNaN(arr[i])) return i; } return -1; } return arr.lastIndexOf(item, fromIndex); }\r\nfunction includes(arr, item) { return arr ? arr.includes(item) : false; }\r\nfunction push(arr, ...items) { if (arr) arr.push(...items); return arr; }\r\nfunction pop(arr) { return arr ? arr.pop() : undefined; }\r\nfunction shift(arr) { return arr ? arr.shift() : undefined; }\r\nfunction unshift(arr, ...items) { if (arr) arr.unshift(...items); return arr; }\r\nfunction remove(arr, item) { if (!arr) return arr; const index = Number.isNaN(item) ? arr.findIndex(v => Number.isNaN(v)) : arr.indexOf(item); if (index > -1) arr.splice(index, 1); return arr; }\r\nfunction removeAt(arr, index) { if (!arr || index < 0 || index >= arr.length) return arr; arr.splice(index, 1); return arr; }\r\nfunction insert(arr, index, item) { if (!arr) return arr; arr.splice(index, 0, item); return arr; }\r\nfunction reverseArr(arr) { return arr ? arr.slice().reverse() : []; }\r\nfunction sort(arr, compareFn) { return arr ? arr.slice().sort(compareFn) : []; }\r\nfunction sortBy(arr, key, order = 'asc') { if (!arr) return []; return arr.slice().sort((a, b) => { const valA = typeof a === 'object' ? a[key] : a; const valB = typeof b === 'object' ? b[key] : b; if (valA < valB) return order === 'asc' ? -1 : 1; if (valA > valB) return order === 'asc' ? 1 : -1; return 0; }); }\r\nfunction filter(arr, predicate) { return arr ? arr.filter(predicate) : []; }\r\nfunction map(arr, fn) { return arr ? arr.map(fn) : []; }\r\nfunction reduce(arr, fn, initialValue) { return arr ? arr.reduce(fn, initialValue) : initialValue; }\r\nfunction forEach(arr, fn) { if (arr) arr.forEach(fn); }\r\nfunction every(arr, predicate) { return arr ? arr.every(predicate) : true; }\r\nfunction some(arr, predicate) { return arr ? arr.some(predicate) : false; }\r\nfunction find(arr, predicate) { return arr ? arr.find(predicate) : undefined; }\r\nfunction findIndex(arr, predicate) { return arr ? arr.findIndex(predicate) : -1; }\r\nfunction flat(arr, depth = 1) { return arr ? arr.flat(depth) : []; }\r\nfunction flattenDeep(arr) { return arr ? arr.reduce((acc, item) => Array.isArray(item) ? acc.concat(flattenDeep(item)) : acc.concat(item), []) : []; }\r\nfunction unique(arr) { return arr ? [...new Set(arr)] : []; }\r\nfunction uniqueBy(arr, key) { if (!arr) return []; const seen = new Set(); return arr.filter(item => { const value = typeof item === 'object' ? item[key] : item; if (seen.has(value)) return false; seen.add(value); return true; }); }\r\nfunction chunk(arr, chunkSize) { if (!arr || chunkSize <= 0) return []; const chunks = []; for (let i = 0; i < arr.length; i += chunkSize) { chunks.push(arr.slice(i, i + chunkSize)); } return chunks; }\r\nfunction shuffle(arr) { if (!arr) return []; const result = arr.slice(); for (let i = result.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [result[i], result[j]] = [result[j], result[i]]; } return result; }\r\nfunction sum(arr) { return arr ? arr.reduce((acc, val) => acc + (Number(val) || 0), 0) : 0; }\r\nfunction average(arr) { if (!arr || arr.length === 0) return 0; return sum(arr) / arr.length; }\r\nfunction max(arr) { return arr && arr.length > 0 ? Math.max(...arr) : -Infinity; }\r\nfunction min(arr) { return arr && arr.length > 0 ? Math.min(...arr) : Infinity; }\r\nfunction intersection(...args) { if (args.length === 0) return []; return args.reduce((result, a) => result.filter(item => a && a.includes(item))); }\r\nfunction union(...args) { return [...new Set(args.flat().filter(Boolean))]; }\r\nfunction difference(arr1, arr2) { return arr1 ? arr1.filter(item => !arr2 || !arr2.includes(item)) : []; }\r\nfunction zip(...args) { if (args.length === 0) return []; const maxLength = Math.max(...args.map(a => a ? a.length : 0)); return Array.from({ length: maxLength }, (_, i) => args.map(a => a && a[i])); }\r\n\r\nconst arrayUtils = { isArray, isEmpty, size, first, last, get, slice, concat, join, indexOf, lastIndexOf, includes, push, pop, shift, unshift, remove, removeAt, insert, reverse: reverseArr, sort, sortBy, filter, map, reduce, forEach, every, some, find, findIndex, flat, flattenDeep, unique, uniqueBy, chunk, shuffle, sum, average, max, min, intersection, union, difference, zip };\r\n\r\n// === Object Utilities ===\r\nfunction isObject(obj) { return obj !== null && typeof obj === 'object' && !Array.isArray(obj); }\r\nfunction isEmptyObj(obj) { if (!obj || typeof obj !== 'object') return true; return Object.keys(obj).length === 0; }\r\nfunction keys(obj) { return obj ? Object.keys(obj) : []; }\r\nfunction values(obj) { return obj ? Object.values(obj) : []; }\r\nfunction entries(obj) { return obj ? Object.entries(obj) : []; }\r\nfunction has(obj, key) { return obj ? Object.prototype.hasOwnProperty.call(obj, key) : false; }\r\nfunction getObj(obj, path, defaultValue) { if (!obj) return defaultValue; const k = path.split('.'); if (k.some(_isUnsafeKey)) return defaultValue; return k.reduce((current, key) => current && current[key], obj) ?? defaultValue; }\r\nfunction setObj(obj, path, value) { if (!obj || typeof obj !== 'object') return obj; const k = path.split('.'); if (k.some(_isUnsafeKey)) return obj; const lastKey = k.pop(); let current = obj; k.forEach(key => { if (!current[key] || typeof current[key] !== 'object') current[key] = {}; current = current[key]; }); current[lastKey] = value; return obj; }\r\nfunction pick(obj, keys) { if (!obj) return {}; return keys.reduce((result, key) => { if (obj[key] !== undefined) result[key] = obj[key]; return result; }, {}); }\r\nfunction omit(obj, keys) { if (!obj) return {}; return Object.keys(obj).reduce((result, key) => { if (!keys.includes(key)) result[key] = obj[key]; return result; }, {}); }\r\nfunction merge(...args) { return args.reduce((result, obj) => { if (obj && typeof obj === 'object') { Object.keys(obj).forEach(key => { if (_isUnsafeKey(key)) return; if (isObject(obj[key]) && isObject(result[key])) { result[key] = merge(result[key], obj[key]); } else { result[key] = obj[key]; } }); } return result; }, {}); }\r\nfunction clone(obj) { return obj ? JSON.parse(JSON.stringify(obj)) : obj; }\r\nfunction deepClone(obj, hash = new WeakMap()) { if (!obj || typeof obj !== 'object') return obj; if (hash.has(obj)) return hash.get(obj); if (obj instanceof Date) return new Date(obj); if (obj instanceof RegExp) return new RegExp(obj); if (obj instanceof Map) { const m = new Map(); hash.set(obj, m); obj.forEach((val, key) => m.set(key, deepClone(val, hash))); return m; } if (obj instanceof Set) { const s = new Set(); hash.set(obj, s); obj.forEach(val => s.add(deepClone(val, hash))); return s; } if (Array.isArray(obj)) { const a = []; hash.set(obj, a); obj.forEach(item => a.push(deepClone(item, hash))); return a; } const c = {}; hash.set(obj, c); Object.keys(obj).forEach(key => { if (!_isUnsafeKey(key)) { c[key] = deepClone(obj[key], hash); } }); return c; }\r\nfunction forEachObj(obj, fn) { if (!obj) return; Object.keys(obj).forEach(key => fn(obj[key], key, obj)); }\r\nfunction mapObj(obj, fn) { if (!obj) return {}; const result = {}; Object.keys(obj).forEach(key => { result[key] = fn(obj[key], key, obj); }); return result; }\r\nfunction filterObj(obj, fn) { if (!obj) return {}; const result = {}; Object.keys(obj).forEach(key => { if (fn(obj[key], key, obj)) result[key] = obj[key]; }); return result; }\r\nfunction reduceObj(obj, fn, initialValue) { if (!obj) return initialValue; return Object.keys(obj).reduce((acc, key) => fn(acc, obj[key], key, obj), initialValue); }\r\nfunction toArray(obj) { if (!obj) return []; return Object.keys(obj).map(key => ({ key, value: obj[key] })); }\r\nfunction fromArray(arr, keyField, valueField) { if (!arr) return {}; return arr.reduce((result, item) => { const key = typeof item === 'object' ? item[keyField] : item; const value = valueField ? item[valueField] : item; if (key !== undefined) result[key] = value; return result; }, {}); }\r\nfunction sizeObj(obj) { return obj ? Object.keys(obj).length : 0; }\r\nfunction invert(obj) { if (!obj) return {}; const result = {}; Object.keys(obj).forEach(key => { result[obj[key]] = key; }); return result; }\r\nfunction isEqual(obj1, obj2) { if (obj1 === obj2) return true; if (!obj1 || !obj2 || typeof obj1 !== 'object' || typeof obj2 !== 'object') return false; const keys1 = Object.keys(obj1); const keys2 = Object.keys(obj2); if (keys1.length !== keys2.length) return false; return keys1.every(key => isEqual(obj1[key], obj2[key])); }\r\nfunction freeze(obj) { if (!obj) return obj; Object.freeze(obj); Object.keys(obj).forEach(key => { if (typeof obj[key] === 'object') freeze(obj[key]); }); return obj; }\r\nfunction seal(obj) { return obj ? Object.seal(obj) : obj; }\r\n\r\nconst objectUtils = { isObject, isEmpty: isEmptyObj, keys, values, entries, has, get: getObj, set: setObj, pick, omit, merge, clone, deepClone, forEach: forEachObj, map: mapObj, filter: filterObj, reduce: reduceObj, toArray, fromArray, size: sizeObj, invert, isEqual, freeze, seal };\r\n\r\n// === Number Utilities ===\r\nfunction isNumber(val) { return typeof val === 'number' && !isNaN(val); }\r\nfunction isInteger(val) { return Number.isInteger(val); }\r\nfunction isFloat(val) { return isNumber(val) && !Number.isInteger(val); }\r\nfunction isPositive(val) { return isNumber(val) && val > 0; }\r\nfunction isNegative(val) { return isNumber(val) && val < 0; }\r\nfunction isZero(val) { return isNumber(val) && val === 0; }\r\nfunction clamp(val, minVal, maxVal) { if (!isNumber(val)) return val; return Math.min(Math.max(val, minVal), maxVal); }\r\nfunction round(val, precision = 0) { if (!isNumber(val)) return val; const factor = Math.pow(10, precision); return Math.round(val * factor) / factor; }\r\nfunction floor(val) { return isNumber(val) ? Math.floor(val) : val; }\r\nfunction ceil(val) { return isNumber(val) ? Math.ceil(val) : val; }\r\nfunction abs(val) { return isNumber(val) ? Math.abs(val) : val; }\r\nfunction minNum(...args) { const nums = args.filter(isNumber); return nums.length > 0 ? Math.min(...nums) : undefined; }\r\nfunction maxNum(...args) { const nums = args.filter(isNumber); return nums.length > 0 ? Math.max(...nums) : undefined; }\r\nfunction sumNum(...args) { const nums = args.flat().filter(isNumber); return nums.reduce((acc, val) => acc + val, 0); }\r\nfunction averageNum(...args) { const nums = args.flat().filter(isNumber); return nums.length > 0 ? sumNum(nums) / nums.length : 0; }\r\nfunction random(minVal = 0, maxVal = 1) { return Math.random() * (maxVal - minVal) + minVal; }\r\nfunction randomInt(minVal, maxVal) { return Math.floor(random(minVal, maxVal + 1)); }\r\nfunction formatNum(val, decimals = 2) { if (!isNumber(val)) return String(val); return val.toFixed(decimals); }\r\nfunction formatCurrency(val, currency = 'CNY', decimals = 2) { if (!isNumber(val)) return String(val); const formatter = new Intl.NumberFormat('zh-CN', { style: 'currency', currency, minimumFractionDigits: decimals, maximumFractionDigits: decimals }); return formatter.format(val); }\r\nfunction formatPercent(val, decimals = 0) { if (!isNumber(val)) return String(val); return `${(val * 100).toFixed(decimals)}%`; }\r\nfunction toFixed(val, decimals = 0) { if (!isNumber(val)) return String(val); return val.toFixed(decimals); }\r\nfunction toPrecision(val, precision = 6) { if (!isNumber(val)) return String(val); return val.toPrecision(precision); }\r\nfunction isNaNVal(val) { return Number.isNaN(val); }\r\nfunction isFiniteVal(val) { return Number.isFinite(val); }\r\nfunction parseIntSafe(val, radix = 10) { return Number.parseInt(val, radix); }\r\nfunction parseFloatSafe(val) { return Number.parseFloat(val); }\r\nfunction toNumber(val, defaultValue = 0) { const num = Number(val); return isNaN(num) ? defaultValue : num; }\r\nfunction safeDivide(a, b, defaultValue = 0) { if (!isNumber(a) || !isNumber(b) || b === 0) return defaultValue; return a / b; }\r\nfunction safeMultiply(...args) { return args.reduce((result, val) => { if (!isNumber(result) || !isNumber(val)) return 0; return result * val; }, 1); }\r\n\r\nconst numberUtils = { isNumber, isInteger, isFloat, isPositive, isNegative, isZero, clamp, round, floor, ceil, abs, min: minNum, max: maxNum, sum: sumNum, average: averageNum, random, randomInt, format: formatNum, formatCurrency, formatPercent, toFixed, toPrecision, isNaN: isNaNVal, isFinite: isFiniteVal, parseInt: parseIntSafe, parseFloat: parseFloatSafe, toNumber, safeDivide, safeMultiply };\r\n\r\n// === Date Utilities ===\r\nfunction now() { return Date.now(); }\r\nfunction today() { const d = new Date(); d.setHours(0, 0, 0, 0); return d; }\r\nfunction tomorrow() { const d = today(); d.setDate(d.getDate() + 1); return d; }\r\nfunction yesterday() { const d = today(); d.setDate(d.getDate() - 1); return d; }\r\nfunction isDate(val) { return val instanceof Date && !isNaN(val.getTime()); }\r\nfunction isValidDate(date) { return isDate(date); }\r\nfunction parseDate(str) { const d = new Date(str); return isValidDate(d) ? d : null; }\r\nfunction formatDate(date, formatStr = 'YYYY-MM-DD HH:mm:ss') { if (!isDate(date)) return ''; const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); const milliseconds = String(date.getMilliseconds()).padStart(3, '0'); const weekDays = ['日', '一', '二', '三', '四', '五', '六']; const weekDay = weekDays[date.getDay()]; return formatStr.replace('YYYY', year).replace('MM', month).replace('DD', day).replace('HH', hours).replace('mm', minutes).replace('ss', seconds).replace('SSS', milliseconds).replace('D', date.getDate()).replace('M', date.getMonth() + 1).replace('H', date.getHours()).replace('m', date.getMinutes()).replace('s', date.getSeconds()).replace('W', weekDay); }\r\nfunction toISO(date) { return isDate(date) ? date.toISOString() : ''; }\r\nfunction toUTC(date) { return isDate(date) ? new Date(date.toUTCString()) : null; }\r\nfunction addDays(date, days) { if (!isDate(date)) return date; const d = new Date(date); d.setDate(d.getDate() + days); return d; }\r\nfunction addHours(date, hours) { if (!isDate(date)) return date; const d = new Date(date); d.setHours(d.getHours() + hours); return d; }\r\nfunction addMinutes(date, minutes) { if (!isDate(date)) return date; const d = new Date(date); d.setMinutes(d.getMinutes() + minutes); return d; }\r\nfunction addSeconds(date, seconds) { if (!isDate(date)) return date; const d = new Date(date); d.setSeconds(d.getSeconds() + seconds); return d; }\r\nfunction diffDays(date1, date2) { if (!isDate(date1) || !isDate(date2)) return 0; const d1 = new Date(date1); d1.setHours(0,0,0,0); const d2 = new Date(date2); d2.setHours(0,0,0,0); return Math.floor((d1.getTime() - d2.getTime()) / (1000 * 60 * 60 * 24)); }\r\nfunction diffHours(date1, date2) { if (!isDate(date1) || !isDate(date2)) return 0; return Math.floor((date1.getTime() - date2.getTime()) / (1000 * 60 * 60)); }\r\nfunction diffMinutes(date1, date2) { if (!isDate(date1) || !isDate(date2)) return 0; return Math.floor((date1.getTime() - date2.getTime()) / (1000 * 60)); }\r\nfunction diffSeconds(date1, date2) { if (!isDate(date1) || !isDate(date2)) return 0; return Math.floor((date1.getTime() - date2.getTime()) / 1000); }\r\nfunction isToday(date) { if (!isDate(date)) return false; return diffDays(date, today()) === 0; }\r\nfunction isYesterday(date) { if (!isDate(date)) return false; return diffDays(date, today()) === -1; }\r\nfunction isTomorrow(date) { if (!isDate(date)) return false; return diffDays(date, today()) === 1; }\r\nfunction isFuture(date) { if (!isDate(date)) return false; return date.getTime() > now(); }\r\nfunction isPast(date) { if (!isDate(date)) return false; return date.getTime() < now(); }\r\nfunction isLeapYear(date) { if (!isDate(date)) return false; const year = date.getFullYear(); return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); }\r\nfunction getDaysInMonth(date) { if (!isDate(date)) return 0; return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate(); }\r\nfunction getWeekOfYear(date) { if (!isDate(date)) return 0; const startOfYear = new Date(date.getFullYear(), 0, 1); const diff = date.getTime() - startOfYear.getTime(); return Math.ceil(diff / (1000 * 60 * 60 * 24 * 7)); }\r\nfunction getQuarter(date) { if (!isDate(date)) return 0; return Math.ceil((date.getMonth() + 1) / 3); }\r\nfunction startOfDay(date) { if (!isDate(date)) return date; const d = new Date(date); d.setHours(0, 0, 0, 0); return d; }\r\nfunction endOfDay(date) { if (!isDate(date)) return date; const d = new Date(date); d.setHours(23, 59, 59, 999); return d; }\r\nfunction startOfMonth(date) { if (!isDate(date)) return date; return new Date(date.getFullYear(), date.getMonth(), 1); }\r\nfunction endOfMonth(date) { if (!isDate(date)) return date; return new Date(date.getFullYear(), date.getMonth() + 1, 0, 23, 59, 59, 999); }\r\nfunction startOfWeek(date, startDay = 1) { if (!isDate(date)) return date; const d = new Date(date); const day = d.getDay(); const diff = day >= startDay ? day - startDay : day + (7 - startDay); d.setDate(d.getDate() - diff); d.setHours(0, 0, 0, 0); return d; }\r\nfunction endOfWeek(date, startDay = 1) { if (!isDate(date)) return date; const start = startOfWeek(date, startDay); const end = new Date(start); end.setDate(end.getDate() + 6); end.setHours(23, 59, 59, 999); return end; }\r\nfunction getAge(birthDate) { if (!isDate(birthDate)) return 0; const n = new Date(); let age = n.getFullYear() - birthDate.getFullYear(); if (n.getMonth() < birthDate.getMonth() || (n.getMonth() === birthDate.getMonth() && n.getDate() < birthDate.getDate())) { age--; } return Math.max(0, age); }\r\nfunction fromNow(date) { if (!isDate(date)) return ''; const n = now(); const diff = n - date.getTime(); const minute = 60 * 1000; const hour = 60 * minute; const day = 24 * hour; const week = 7 * day; const month = 30 * day; const year = 365 * day; if (diff < minute) return '刚刚'; if (diff < hour) return `${Math.floor(diff / minute)}分钟前`; if (diff < day) return `${Math.floor(diff / hour)}小时前`; if (diff < week) return `${Math.floor(diff / day)}天前`; if (diff < month) return `${Math.floor(diff / week)}周前`; if (diff < year) return `${Math.floor(diff / month)}个月前`; return `${Math.floor(diff / year)}年前`; }\r\n\r\nconst dateUtils = { now, today, tomorrow, yesterday, isDate, isValid: isValidDate, parse: parseDate, format: formatDate, toISO, toUTC, addDays, addHours, addMinutes, addSeconds, diffDays, diffHours, diffMinutes, diffSeconds, isToday, isYesterday, isTomorrow, isFuture, isPast, isLeapYear, getDaysInMonth, getWeekOfYear, getQuarter, startOfDay, endOfDay, startOfMonth, endOfMonth, startOfWeek, endOfWeek, getAge, fromNow };\r\n\r\n// === Timing Utilities ===\r\nfunction debounce(func, wait, options = {}) {\r\n let timeout = null, lastArgs = null, lastThis = null, lastCallTime = 0;\r\n const leading = options.leading || false;\r\n const trailing = options.trailing !== false;\r\n function invokeFunc() { func.apply(lastThis, lastArgs); }\r\n function leadingEdge() { lastCallTime = Date.now(); if (leading) { timeout = setTimeout(trailingEdge, wait); invokeFunc(); } else { timeout = setTimeout(trailingEdge, wait); } }\r\n function trailingEdge() { timeout = null; if (trailing && lastArgs) { invokeFunc(); } lastArgs = null; lastThis = null; }\r\n function remainingWait() { return Math.max(0, wait - (Date.now() - lastCallTime)); }\r\n return function(...args) { lastArgs = args; lastThis = this; lastCallTime = Date.now(); if (!timeout) { leadingEdge(); } else { clearTimeout(timeout); timeout = setTimeout(trailingEdge, remainingWait()); } };\r\n}\r\n\r\nfunction throttle(func, limit, options = {}) {\r\n let inThrottle = false;\r\n const trailing = options.trailing || false;\r\n let lastArgs = null, lastThis = null;\r\n function invokeFunc() { func.apply(lastThis, lastArgs); lastArgs = null; lastThis = null; }\r\n return function(...args) { if (!inThrottle) { inThrottle = true; lastArgs = args; lastThis = this; invokeFunc(); setTimeout(() => { inThrottle = false; if (trailing && lastArgs) { invokeFunc(); } }, limit); } else if (trailing) { lastArgs = args; lastThis = this; } };\r\n}\r\n\r\n// === Validator Utilities ===\r\nfunction isEmail(str) { return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(str || ''); }\r\nfunction isPhone(str) { return /^1[3-9]\\d{9}$/.test(str || ''); }\r\nfunction isURL(str) { return /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w.-]*)*\\/?$/.test(str || ''); }\r\nfunction isIPv4(str) { return /^((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]?)$/.test(str || ''); }\r\nfunction isIPv6(str) { return /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/.test(str || ''); }\r\nfunction isIP(str) { return isIPv4(str) || isIPv6(str); }\r\nfunction isIDCard(str) { return /^[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]$/.test(str || ''); }\r\nfunction isPassport(str) { return /^[A-Z][0-9]{8}$|^[A-Z]{2}[0-9]{7}$/.test(str || ''); }\r\nfunction isCreditCard(str) { 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})$/; const cleanStr = str.replace(/\\s/g, ''); if (!regex.test(cleanStr)) return false; let s = 0, alt = false; for (let i = cleanStr.length - 1; i >= 0; i--) { let digit = parseInt(cleanStr[i], 10); if (alt) { digit *= 2; if (digit > 9) digit -= 9; } s += digit; alt = !alt; } return s % 10 === 0; }\r\nfunction isHexColor(str) { return /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(str || ''); }\r\nfunction isRGB(str) { const m = /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/.exec(str || ''); if (!m) return false; return m.slice(1).every(v => parseInt(v) >= 0 && parseInt(v) <= 255); }\r\nfunction isRGBA(str) { const m = /^rgba\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3}),\\s*([01]|0\\.\\d+)\\)$/.exec(str || ''); if (!m) return false; const [, r, g, b, a] = m; return parseInt(r) >= 0 && parseInt(r) <= 255 && parseInt(g) >= 0 && parseInt(g) <= 255 && parseInt(b) >= 0 && parseInt(b) <= 255 && parseFloat(a) >= 0 && parseFloat(a) <= 1; }\r\nfunction isColor(str) { return isHexColor(str) || isRGB(str) || isRGBA(str); }\r\nfunction isDateStr(str) { return !isNaN(new Date(str).getTime()); }\r\nfunction isJSON(str) { try { JSON.parse(str); return true; } catch { return false; } }\r\nfunction isEmptyStr(str) { return !str || str.trim() === ''; }\r\nfunction isWhitespace(str) { return /^\\s+$/.test(str || ''); }\r\nfunction isNumberStr(str) { return !isNaN(parseFloat(str)) && isFinite(str); }\r\nfunction isIntegerStr(str) { return /^-?\\d+$/.test(str || ''); }\r\nfunction isFloatStr(str) { return /^-?\\d+\\.\\d+$/.test(str || ''); }\r\nfunction isPositiveStr(str) { const num = parseFloat(str); return !isNaN(num) && num > 0; }\r\nfunction isNegativeStr(str) { const num = parseFloat(str); return !isNaN(num) && num < 0; }\r\nfunction isAlpha(str) { return /^[a-zA-Z]+$/.test(str || ''); }\r\nfunction isAlphaNumeric(str) { return /^[a-zA-Z0-9]+$/.test(str || ''); }\r\nfunction isChinese(str) { return /^[\\u4e00-\\u9fa5]+$/.test(str || ''); }\r\nfunction isLength(str, minVal, maxVal) { const len = (str || '').length; return len >= minVal && (maxVal === undefined || len <= maxVal); }\r\nfunction minLength(str, minVal) { return (str || '').length >= minVal; }\r\nfunction maxLength(str, maxVal) { return (str || '').length <= maxVal; }\r\nfunction matches(str, regex) { return (regex instanceof RegExp) ? regex.test(str || '') : false; }\r\nfunction equals(str1, str2) { return String(str1) === String(str2); }\r\nfunction contains(str, substring) { return (str || '').includes(substring); }\r\nfunction notContains(str, substring) { return !contains(str, substring); }\r\nfunction isArrayVal(arr) { return Array.isArray(arr); }\r\nfunction arrayLength(arr, minVal, maxVal) { const len = arr ? arr.length : 0; return len >= minVal && (maxVal === undefined || len <= maxVal); }\r\nfunction arrayMinLength(arr, minVal) { return arr ? arr.length >= minVal : false; }\r\nfunction arrayMaxLength(arr, maxVal) { return arr ? arr.length <= maxVal : false; }\r\nfunction isObjectVal(obj) { return obj !== null && typeof obj === 'object' && !Array.isArray(obj); }\r\nfunction hasKeys(obj, keys) { if (!obj || !keys || !Array.isArray(keys)) return false; return keys.every(key => Object.prototype.hasOwnProperty.call(obj, key)); }\r\nfunction validate(obj, rules) { const errors = {}; Object.keys(rules).forEach(key => { const value = obj[key]; const fieldRules = rules[key]; const fieldErrors = []; fieldRules.forEach(rule => { if (typeof rule === 'string') { const [name, ...params] = rule.split(':'); if (!validatorUtils[name](value, ...params)) { fieldErrors.push(name); } } else if (typeof rule === 'function') { const result = rule(value, obj); if (result !== true) { fieldErrors.push(result || 'validation_failed'); } } }); if (fieldErrors.length > 0) { errors[key] = fieldErrors; } }); return { valid: Object.keys(errors).length === 0, errors }; }\r\n\r\nconst validatorUtils = { isEmail, isPhone, isURL, isIPv4, isIPv6, isIP, isIDCard, isPassport, isCreditCard, isHexColor, isRGB, isRGBA, isColor, isDate: isDateStr, isJSON, isEmpty: isEmptyStr, isWhitespace, isNumber: isNumberStr, isInteger: isIntegerStr, isFloat: isFloatStr, isPositive: isPositiveStr, isNegative: isNegativeStr, isAlpha, isAlphaNumeric, isChinese, isLength, minLength, maxLength, matches, equals, contains, notContains, isArray: isArrayVal, arrayLength, arrayMinLength, arrayMaxLength, isObject: isObjectVal, hasKeys, validate };\r\n\r\n// === Crypto Utilities ===\r\nfunction md5(str) {\r\n const message = str ? String(str) : '';\r\n const md5Array = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476];\r\n const K = [0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391];\r\n const S = [[7,12,17,22],[5,9,14,20],[4,11,16,23],[6,10,15,21]];\r\n function leftRotate(value, shift) { return (value << shift) | (value >>> (32 - shift)); }\r\n function addPadding(msg) { const bitLength = msg.length * 8; msg += '\\x80'; while ((msg.length % 64) !== 56) { msg += '\\x00'; } const lowBytes = bitLength & 0xffffffff; const highBytes = (bitLength >>> 32) & 0xffffffff; for (let i = 0; i < 4; i++) { msg += String.fromCharCode((lowBytes >>> (8 * i)) & 0xff); } for (let i = 0; i < 4; i++) { msg += String.fromCharCode((highBytes >>> (8 * i)) & 0xff); } return msg; }\r\n function processBlock(block, state) { const [a, b, c, d] = state; const words = []; for (let i = 0; i < 16; i++) { words[i] = (block.charCodeAt(i * 4) & 0xff) | ((block.charCodeAt(i * 4 + 1) & 0xff) << 8) | ((block.charCodeAt(i * 4 + 2) & 0xff) << 16) | ((block.charCodeAt(i * 4 + 3) & 0xff) << 24); } let AA = a, BB = b, CC = c, DD = d; for (let i = 0; i < 64; i++) { let f, g; const r = Math.floor(i / 16); const wi = i % 16; if (r === 0) { f = (BB & CC) | (~BB & DD); g = wi; } else if (r === 1) { f = (DD & BB) | (~DD & CC); g = (5 * wi + 1) % 16; } else if (r === 2) { f = BB ^ CC ^ DD; g = (3 * wi + 5) % 16; } else { f = CC ^ (BB | ~DD); g = (7 * wi) % 16; } const temp = DD; DD = CC; CC = BB; BB = BB + leftRotate((AA + f + K[i] + words[g]) & 0xffffffff, S[r][i % 4]); AA = temp; } return [(a + AA) & 0xffffffff, (b + BB) & 0xffffffff, (c + CC) & 0xffffffff, (d + DD) & 0xffffffff]; }\r\n const paddedMessage = addPadding(message); let state = [...md5Array]; for (let i = 0; i < paddedMessage.length; i += 64) { state = processBlock(paddedMessage.substring(i, i + 64), state); } let result = ''; state.forEach(word => { for (let i = 0; i < 4; i++) { result += ((word >>> (8 * i)) & 0xff).toString(16).padStart(2, '0'); } }); return result;\r\n}\r\n\r\nfunction sha256(str) {\r\n const message = str ? String(str) : '';\r\n const K = [0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2];\r\n function rightRotate(value, shift) { return (value >>> shift) | (value << (32 - shift)); }\r\n function addPadding(msg) { const bitLength = msg.length * 8; msg += '\\x80'; while ((msg.length % 64) !== 56) { msg += '\\x00'; } const lowBytes = bitLength & 0xffffffff; const highBytes = (bitLength >>> 32) & 0xffffffff; for (let i = 0; i < 4; i++) { msg += String.fromCharCode((highBytes >>> (8 * i)) & 0xff); } for (let i = 0; i < 4; i++) { msg += String.fromCharCode((lowBytes >>> (8 * i)) & 0xff); } return msg; }\r\n function processBlock(block, state) { const words = []; for (let i = 0; i < 16; i++) { words[i] = (block.charCodeAt(i * 4) & 0xff) | ((block.charCodeAt(i * 4 + 1) & 0xff) << 8) | ((block.charCodeAt(i * 4 + 2) & 0xff) << 16) | ((block.charCodeAt(i * 4 + 3) & 0xff) << 24); } for (let i = 16; i < 64; i++) { const s0 = rightRotate(words[i-15],7) ^ rightRotate(words[i-15],18) ^ (words[i-15]>>>3); const s1 = rightRotate(words[i-2],17) ^ rightRotate(words[i-2],19) ^ (words[i-2]>>>10); words[i] = (words[i-16]+s0+words[i-7]+s1) & 0xffffffff; } let [a,b,c,d,e,f,g,h] = state; for (let i = 0; i < 64; i++) { const S1 = rightRotate(e,6)^rightRotate(e,11)^rightRotate(e,25); const ch = (e&f)^(~e&g); const temp1 = (h+S1+ch+K[i]+words[i]) & 0xffffffff; const S0 = rightRotate(a,2)^rightRotate(a,13)^rightRotate(a,22); const maj = (a&b)^(a&c)^(b&c); const temp2 = (S0+maj) & 0xffffffff; h=g; g=f; f=e; e=(d+temp1)&0xffffffff; d=c; c=b; b=a; a=(temp1+temp2)&0xffffffff; } return [(state[0]+a)&0xffffffff,(state[1]+b)&0xffffffff,(state[2]+c)&0xffffffff,(state[3]+d)&0xffffffff,(state[4]+e)&0xffffffff,(state[5]+f)&0xffffffff,(state[6]+g)&0xffffffff,(state[7]+h)&0xffffffff]; }\r\n const paddedMessage = addPadding(message); let state = [0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19]; for (let i = 0; i < paddedMessage.length; i += 64) { state = processBlock(paddedMessage.substring(i, i + 64), state); } let result = ''; state.forEach(word => { for (let i = 3; i >= 0; i--) { result += ((word >>> (8 * i)) & 0xff).toString(16).padStart(2, '0'); } }); return result;\r\n}\r\n\r\nfunction base64Encode(str) { const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; let result = ''; let i = 0; const bytes = str ? str.split('').map(c => c.charCodeAt(0)) : []; while (i < bytes.length) { const byte1 = bytes[i++]; const byte2 = bytes[i++] || 0; const byte3 = bytes[i++] || 0; const enc1 = byte1 >> 2; const enc2 = ((byte1 & 3) << 4) | (byte2 >> 4); const enc3 = ((byte2 & 15) << 2) | (byte3 >> 6); const enc4 = byte3 & 63; result += chars[enc1] + chars[enc2] + (i > bytes.length + 1 ? '=' : chars[enc3]) + (i > bytes.length ? '=' : chars[enc4]); } return result; }\r\nfunction base64Decode(str) { const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; let result = ''; let i = 0; str = str.replace(/[^A-Za-z0-9+/=]/g, ''); while (i < str.length) { const enc1 = chars.indexOf(str.charAt(i++)); const enc2 = chars.indexOf(str.charAt(i++)); const enc3 = chars.indexOf(str.charAt(i++)); const enc4 = chars.indexOf(str.charAt(i++)); const byte1 = (enc1 << 2) | (enc2 >> 4); const byte2 = ((enc2 & 15) << 4) | (enc3 >> 2); const byte3 = ((enc3 & 3) << 6) | enc4; result += String.fromCharCode(byte1); if (enc3 !== 64) result += String.fromCharCode(byte2); if (enc4 !== 64) result += String.fromCharCode(byte3); } return result; }\r\nfunction uuid() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { const r = Math.random() * 16 | 0; const v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); }\r\n\r\nconst cryptoUtils = { md5, sha256, base64Encode, base64Decode, uuid };\r\n\r\n// === Preload Utilities ===\r\nconst _preloadCache = new Map();\r\nasync function loadImage(url, options = {}) { const { crossOrigin = 'anonymous' } = options; if (_preloadCache.has(url)) return _preloadCache.get(url); return new Promise((resolve, reject) => { const img = new Image(); img.crossOrigin = crossOrigin; img.onload = () => { _preloadCache.set(url, img); resolve(img); }; img.onerror = () => { reject(new Error(`Failed to load image: ${url}`)); }; img.src = url; }); }\r\nasync function loadImages(urls, options = {}) { const { parallel = true } = options; if (parallel) return Promise.all(urls.map(url => loadImage(url, options))); const results = []; for (const url of urls) { results.push(await loadImage(url, options)); } return results; }\r\nasync function loadScript(url, options = {}) { const { type = 'text/javascript', async: isAsync = true, defer = false } = options; if (_preloadCache.has(url)) return _preloadCache.get(url); return new Promise((resolve, reject) => { const script = document.createElement('script'); script.type = type; script.async = isAsync; script.defer = defer; script.onload = () => { _preloadCache.set(url, script); resolve(script); }; script.onerror = () => { script.remove(); reject(new Error(`Failed to load script: ${url}`)); }; script.src = url; document.head.appendChild(script); }); }\r\nasync function loadStylesheet(url, options = {}) { const { media = 'all' } = options; if (_preloadCache.has(url)) return _preloadCache.get(url); return new Promise((resolve, reject) => { const link = document.createElement('link'); link.rel = 'stylesheet'; link.href = url; link.media = media; link.onload = () => { _preloadCache.set(url, link); resolve(link); }; link.onerror = () => { link.remove(); reject(new Error(`Failed to load stylesheet: ${url}`)); }; document.head.appendChild(link); }); }\r\nasync function loadFont(fontFamily, src, options = {}) { const { weight = 'normal', style = 'normal' } = options; const fontFace = new FontFace(fontFamily, `url(${src})`, { weight, style }); try { await fontFace.load(); document.fonts.add(fontFace); return fontFace; } catch (e) { throw new Error(`Failed to load font: ${fontFamily}`); } }\r\nasync function preload(url, type = 'image') { switch (type) { case 'image': return loadImage(url); case 'script': return loadScript(url); case 'stylesheet': case 'style': return loadStylesheet(url); default: throw new Error(`Unsupported preload type: ${type}`); } }\r\nfunction isLoaded(url) { return _preloadCache.has(url); }\r\nfunction clearPreloadCache() { _preloadCache.clear(); }\r\nfunction clearCacheByUrl(url) { _preloadCache.delete(url); }\r\n\r\nconst preloadUtils = { loadImage, loadImages, loadScript, loadStylesheet, loadFont, preload, isLoaded, clearCache: clearPreloadCache, clearCacheByUrl };\r\n\r\n// === Backward-compatible facade ===\r\nconst KupolaUtils = {\r\n string: stringUtils,\r\n array: arrayUtils,\r\n object: objectUtils,\r\n number: numberUtils,\r\n date: dateUtils,\r\n debounce,\r\n throttle,\r\n validator: validatorUtils,\r\n crypto: cryptoUtils,\r\n preload: preloadUtils\r\n};\r\n\r\nexport {\r\n KupolaUtils,\r\n stringUtils, arrayUtils, objectUtils, numberUtils, dateUtils,\r\n debounce, throttle, validatorUtils, cryptoUtils, preloadUtils\r\n};\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 let str = String(html);\r\n\r\n // Iteratively remove dangerous tags (handles nested attempts like <scr<script>ipt>)\r\n const dangerousTags = /<\\s*(script|iframe|object|embed|applet|form|base|link|meta|style)\\b[^>]*>[\\s\\S]*?<\\s*\\/\\s*\\1\\s*>|<\\s*(script|iframe|object|embed|applet|form|base|link|meta|style)\\b[^>]*\\/?>/gi;\r\n let prev;\r\n do {\r\n prev = str;\r\n str = str.replace(dangerousTags, '');\r\n } while (str !== prev);\r\n\r\n // Remove event handler attributes (on* = ...)\r\n str = str.replace(/\\bon\\w+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, '');\r\n\r\n // Remove javascript:, vbscript:, data: URIs in href/src/action attributes\r\n str = str.replace(/(href|src|action|background)\\s*=\\s*(?:\"[^\"]*(?:javascript|vbscript|data)\\s*:[^\"]*\"|'[^']*(?:javascript|vbscript|data)\\s*:[^']*'|[^\\s>]*(?:javascript|vbscript|data)\\s*:[^\\s>]*)/gi, '$1=\"\"');\r\n\r\n // Remove expression() in style attributes (IE CSS expression)\r\n str = str.replace(/expression\\s*\\([^)]*\\)/gi, '');\r\n\r\n return str;\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._isObserving = false;\r\n this._mutationObserver = new MutationObserver((mutations) => {\r\n // Re-entry guard: skip mutations caused by _bindElement itself\r\n if (this._isObserving) return;\r\n this._isObserving = true;\r\n try {\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 } finally {\r\n this._isObserving = false;\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 (kupolaData) {\r\n kupolaData.set(this._stateKey, initialState);\r\n this.state = kupolaData.data?.[this._stateKey] || \r\n kupolaData.createReactive(initialState, this._stateKey);\r\n \r\n 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 (kupolaData) {\r\n 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 /**\r\n * Subscribe to value changes.\r\n * @param {Function} callback - Called with new value on change\r\n * @returns {{ unsubscribe: Function }} Unsubscribe handle\r\n */\r\n refObj.subscribe = (callback) => {\r\n refObj._subscribers.add(callback);\r\n return {\r\n unsubscribe() { refObj._subscribers.delete(callback); }\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","const config = {\n paths: {\n icons: '/icons/',\n base: '/'\n },\n theme: {\n default: 'dark',\n brand: 'zengqing'\n },\n i18n: {\n locale: 'zh-CN',\n fallbackLocale: 'en-US'\n },\n http: {\n baseURL: '',\n timeout: 10000,\n headers: {},\n withCredentials: false\n },\n ui: {\n defaultSize: 'md',\n defaultVariant: 'default'\n },\n performance: {\n lazyLoad: true,\n debounceDelay: 300,\n throttleDelay: 100,\n animationEnabled: true\n },\n security: {\n xssProtection: true,\n sanitizeHtml: {\n enabled: true,\n allowedTags: ['b', 'i', 'u', 'em', 'strong', 'a', 'br', 'p', 'span', 'div', 'img'],\n allowedAttributes: {\n 'a': ['href', 'target', 'rel'],\n 'img': ['src', 'alt', 'width', 'height'],\n 'span': ['class', 'style'],\n 'div': ['class', 'style']\n }\n },\n maskData: {\n enabled: true,\n patterns: {\n phone: { regex: '^(\\\\d{3})\\\\d{4}(\\\\d{4})$', replace: '$1****$2' },\n email: { regex: '^(.)(.*)(@.*)$', replace: '$1***$3' },\n idCard: { regex: '^(\\\\d{6})\\\\d{8}(\\\\d{4})$', replace: '$1********$2' },\n bankCard: { regex: '^(\\\\d{4})\\\\d{8}(\\\\d{4})$', replace: '$1 **** **** $2' }\n }\n },\n secureId: {\n length: 16,\n charset: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n }\n },\n dev: {\n debug: false,\n logLevel: 'warn'\n },\n extend: {\n themeVariables: {}\n },\n components: {\n autoInit: true,\n silentErrors: false\n },\n store: {\n persist: true,\n prefix: 'kupola-'\n },\n events: {\n global: true\n }\n};\n\nexport function setConfig(options) {\n mergeDeep(config, options);\n}\n\nexport function getConfig(key) {\n if (!key) return config;\n return getNestedValue(config, key);\n}\n\nexport function getIconsPath() {\n return config.paths.base + config.paths.icons.replace(/^\\//, '');\n}\n\nexport function getBasePath() {\n return config.paths.base;\n}\n\nexport function getDefaultTheme() {\n return config.theme.default;\n}\n\nexport function getDefaultBrand() {\n return config.theme.brand;\n}\n\nexport function getHttpConfig() {\n return config.http;\n}\n\nexport function getUiConfig() {\n return config.ui;\n}\n\nexport function getSecurityConfig() {\n return config.security;\n}\n\nexport function getDevConfig() {\n return config.dev;\n}\n\nexport function getPerformanceConfig() {\n return config.performance;\n}\n\nexport function getExtendConfig() {\n return config.extend;\n}\n\nfunction mergeDeep(target, source) {\n for (const key in source) {\n if (source[key] instanceof Object && key in target && target[key] instanceof Object) {\n mergeDeep(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n }\n return target;\n}\n\nfunction getNestedValue(obj, key) {\n return key.split('.').reduce((o, k) => (o && o[k]) !== undefined ? o[k] : undefined, obj);\n}","import { getIconsPath, getDefaultTheme, getDefaultBrand } from './kupola-config.js';\r\n\r\nconst 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) || getDefaultTheme();\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) || getDefaultBrand();\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 updateThemeIcon(toggleBtn) {\r\n const iconEl = toggleBtn.querySelector('.theme-icon');\r\n if (iconEl) {\r\n const currentTheme = getTheme();\r\n const iconsPath = getIconsPath();\r\n iconEl.src = currentTheme === 'dark' ? iconsPath + 'sun.svg' : iconsPath + 'moon.svg';\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 updateThemeIcon(toggleBtn);\r\n const existingOnClick = toggleBtn.onclick;\r\n toggleBtn.onclick = function(e) {\r\n e.preventDefault();\r\n const currentTheme = getTheme();\r\n const newTheme = currentTheme === 'dark' ? 'light' : 'dark';\r\n setTheme(newTheme);\r\n updateThemeIcon(toggleBtn);\r\n if (typeof existingOnClick === 'function') {\r\n existingOnClick.call(this, e);\r\n }\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 iconsPath = getIconsPath();\r\n icon.src = getTheme() === 'dark' \r\n ? iconsPath + 'sun.svg' \r\n : iconsPath + '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.onclick = function(e) {\r\n e.preventDefault();\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};","import { getSecurityConfig } from './kupola-config.js';\n\nexport function sanitizeHtml(html, options = {}) {\n const securityConfig = getSecurityConfig();\n const sanitizeConfig = securityConfig?.sanitizeHtml || {};\n \n if (!sanitizeConfig.enabled && !options.force) {\n return html;\n }\n \n const allowedTags = options.allowedTags || sanitizeConfig.allowedTags || [];\n const allowedAttributes = options.allowedAttributes || sanitizeConfig.allowedAttributes || {};\n \n if (typeof html !== 'string') {\n return html;\n }\n \n const domParser = new DOMParser();\n const doc = domParser.parseFromString(html, 'text/html');\n const elements = doc.body.querySelectorAll('*');\n \n elements.forEach(element => {\n const tagName = element.tagName.toLowerCase();\n \n if (!allowedTags.includes(tagName)) {\n element.remove();\n return;\n }\n \n Array.from(element.attributes).forEach(attr => {\n const attrName = attr.name.toLowerCase();\n const tagAllowedAttrs = allowedAttributes[tagName] || [];\n \n if (!tagAllowedAttrs.includes(attrName)) {\n element.removeAttribute(attr.name);\n }\n });\n });\n \n return doc.body.innerHTML;\n}\n\nexport function escapeHtml(text) {\n if (typeof text !== 'string') {\n return text;\n }\n \n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n}\n\nexport function stripHtml(html) {\n if (typeof html !== 'string') {\n return html;\n }\n \n const domParser = new DOMParser();\n const doc = domParser.parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n}\n\nexport function maskData(value, type, options = {}) {\n const securityConfig = getSecurityConfig();\n const maskConfig = securityConfig?.maskData || {};\n \n if (!maskConfig.enabled && !options.force) {\n return value;\n }\n \n if (value === null || value === undefined) {\n return value;\n }\n \n const patterns = options.patterns || maskConfig.patterns || {};\n const pattern = patterns[type];\n \n if (!pattern) {\n return value;\n }\n \n const regex = typeof pattern.regex === 'string' \n ? new RegExp(pattern.regex) \n : pattern.regex;\n \n return String(value).replace(regex, pattern.replace);\n}\n\nexport function generateSecureId(length, prefix) {\n const securityConfig = getSecurityConfig();\n const secureIdConfig = securityConfig?.secureId || {};\n \n const idLength = length || secureIdConfig.length || 16;\n const charset = secureIdConfig.charset || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n \n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n let result = '';\n for (let i = 0; i < idLength; i++) {\n result += charset[Math.floor(Math.random() * charset.length)];\n }\n return prefix ? `${prefix}_${result}` : result;\n }\n \n const array = new Uint32Array(idLength);\n crypto.getRandomValues(array);\n \n let result = '';\n for (let i = 0; i < idLength; i++) {\n result += charset[array[i] % charset.length];\n }\n \n return prefix ? `${prefix}_${result}` : result;\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","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 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 this.isMounted = true;\r\n await this.lifecycle.mount();\r\n\r\n this.setupContext?._executeMounted();\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}","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 * 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\nimport { getConfig, getSecurityConfig } from './kupola-config.js';\r\n\r\nlet kupolaRegistry = null;\r\n\r\nif (typeof window !== 'undefined') {\r\n kupolaRegistry = new KupolaComponentRegistry();\r\n}\r\n\r\nfunction _applySecurityHeaders() {\r\n const securityConfig = getSecurityConfig();\r\n \r\n if (securityConfig.xssProtection && typeof document !== 'undefined') {\r\n let metaTag = document.querySelector('meta[http-equiv=\"X-XSS-Protection\"]');\r\n if (!metaTag) {\r\n metaTag = document.createElement('meta');\r\n metaTag.setAttribute('http-equiv', 'X-XSS-Protection');\r\n metaTag.setAttribute('content', '1; mode=block');\r\n document.head.insertBefore(metaTag, document.head.firstChild);\r\n }\r\n \r\n metaTag = document.querySelector('meta[http-equiv=\"X-Content-Type-Options\"]');\r\n if (!metaTag) {\r\n metaTag = document.createElement('meta');\r\n metaTag.setAttribute('http-equiv', 'X-Content-Type-Options');\r\n metaTag.setAttribute('content', 'nosniff');\r\n document.head.insertBefore(metaTag, document.head.firstChild);\r\n }\r\n \r\n metaTag = document.querySelector('meta[http-equiv=\"X-Frame-Options\"]');\r\n if (!metaTag) {\r\n metaTag = document.createElement('meta');\r\n metaTag.setAttribute('http-equiv', 'X-Frame-Options');\r\n metaTag.setAttribute('content', 'SAMEORIGIN');\r\n document.head.insertBefore(metaTag, document.head.firstChild);\r\n }\r\n }\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 _applySecurityHeaders();\r\n \r\n const config = getConfig();\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 \r\n if (config.components?.autoInit !== false) {\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\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};","import { getConfig } from './kupola-config.js';\r\n\r\nclass KupolaI18n {\r\n constructor(options = {}) {\r\n const config = getConfig();\r\n this.locales = options.locales || {};\r\n this.currentLocale = options.defaultLocale || config.i18n?.locale || 'zh-CN';\r\n this.fallbackLocale = options.fallbackLocale || config.i18n?.fallbackLocale || 'en-US';\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};","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 };","import { globalEvents } from './global-events.js';\r\nimport { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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 this._triggerKeydownHandler = 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._triggerKeydownHandler = (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 this.trigger.addEventListener('keydown', this._triggerKeydownHandler);\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 this._documentClickListener = globalEvents.on(document, 'click', this._documentClickHandler, { scope: this.scope });\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 if (this._triggerKeydownHandler) this.trigger.removeEventListener('keydown', this._triggerKeydownHandler);\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._triggerKeydownHandler = 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\nkupolaInitializer.register('dropdown', initDropdown, cleanupDropdown);","import { globalEvents } from './global-events.js';\r\nimport { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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 this._documentClickListener = globalEvents.on(document, 'click', this._documentClickHandler, { scope: this.scope });\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\nkupolaInitializer.register('select', initSelect, cleanupSelect);","import { globalEvents } from './global-events.js';\r\nimport { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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._endInputClickHandler = 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) {\r\n this._endInputClickHandler = (e) => {\r\n this.isSelectingEnd = true;\r\n this.toggleCalendar(e);\r\n };\r\n this.endInput.addEventListener('click', this._endInputClickHandler);\r\n }\r\n\r\n this._documentClickListener = globalEvents.on(document, 'click', (e) => this.hideCalendar(e), { scope: this.scope });\r\n this._resizeListener = globalEvents.on(window, 'resize', () => this.resizeHandler(), { scope: this.scope });\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.endInput && this._endInputClickHandler) this.endInput.removeEventListener('click', this._endInputClickHandler);\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._endInputClickHandler = 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\nkupolaInitializer.register('datepicker', initDatepicker, cleanupDatepicker);\r\n","import { globalEvents } from './global-events.js';\r\nimport { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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 this._documentClickListener = globalEvents.on(document, 'click', (e) => this.hideTimepicker(e), { scope: this.scope });\r\n this._resizeListener = globalEvents.on(window, 'resize', () => this.resizeHandler(), { scope: this.scope });\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\nkupolaInitializer.register('timepicker', initTimepicker, cleanupTimepicker);\r\n","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('slider', initSlider, cleanupSlider);\r\n","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('carousel', initCarousel, cleanupCarousel);\r\n","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('drawer', initDrawer, cleanupDrawer);\r\n","import { kupolaInitializer } from './initializer.js';\r\nimport { getUiConfig } from './kupola-config.js';\r\n\r\nclass 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._isOpen = false; // 实例级跟踪,防止 _openCount 不匹配\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 if (!this._isOpen) {\r\n Modal._openCount = (Modal._openCount || 0) + 1;\r\n this._isOpen = true;\r\n }\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 if (this._isOpen) {\r\n Modal._openCount = Math.max(0, (Modal._openCount || 0) - 1);\r\n this._isOpen = false;\r\n if (Modal._openCount === 0) {\r\n document.body.style.overflow = '';\r\n }\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 // 防御性:如果 destroy 时 modal 仍处于打开状态,强制修正计数\r\n if (this._isOpen) {\r\n Modal._openCount = Math.max(0, (Modal._openCount || 0) - 1);\r\n this._isOpen = false;\r\n if (Modal._openCount === 0) {\r\n document.body.style.overflow = '';\r\n }\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 size = getUiConfig().defaultSize\r\n } = options;\r\n \r\n const sizeClass = size === 'sm' ? 'ds-btn--sm' : size === 'lg' ? 'ds-btn--lg' : '';\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 ${sizeClass} ${cancelClass}\" data-modal-cancel>${cancelText}</button>` : ''}\r\n ${showConfirm ? `<button class=\"ds-btn ${sizeClass} ${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\nkupolaInitializer.register('modal', initModal, cleanupModal);\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 };","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 };","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 };","import { kupolaInitializer } from './initializer.js';\r\n\r\nfunction _escapeHtml(str) {\r\n if (!str) return '';\r\n return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#39;');\r\n}\r\n\r\nclass 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(_escapeHtml(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=\"${_escapeHtml(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\nkupolaInitializer.register('fileupload', initFileUpload, cleanupFileUpload);","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('collapse', initCollapse, cleanupCollapse);\r\n","import { globalEvents } from './global-events.js';\r\nimport { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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 this._documentClickListener = globalEvents.on(document, 'click', this._documentClickHandler, { scope: this.scope });\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\nkupolaInitializer.register('color-picker', initColorPicker, cleanupColorPicker);","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('calendar', initCalendar, cleanupCalendar);","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('dynamic-tags', initDynamicTags, cleanupDynamicTags);","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 };","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('tag', initTag, cleanupTag);","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('statcard', initStatCard, cleanupStatCard);","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('heatmap', initHeatmap, cleanupHeatmap);","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('tooltip', initTooltip, cleanupTooltip);","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(...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 };","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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 html += this._buildItemHtml(item, actualIndex, key, isSelected, itemSize, currentPosition, isHorizontal);\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 _buildItemHtml(item, index, key, isSelected, size, position, isHorizontal) {\r\n const selectedClass = isSelected ? ' is-selected' : '';\r\n const content = this.renderItem(item, index);\r\n if (isHorizontal) {\r\n return `<div class=\"ds-virtual-list__item${selectedClass}\" style=\"position: absolute; top: 0; left: ${position}px; width: ${size}px; height: 100%;\" data-index=\"${index}\" data-key=\"${key}\">${content}</div>`;\r\n }\r\n return `<div class=\"ds-virtual-list__item${selectedClass}\" style=\"position: absolute; top: ${position}px; left: 0; right: 0; height: ${size}px;\" data-index=\"${index}\" data-key=\"${key}\">${content}</div>`;\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\nkupolaInitializer.register('virtual-list', initVirtualList, cleanupVirtualList);","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\n// Auto-render SVG sprite on DOM ready\r\nif (typeof document !== 'undefined') {\r\n if (document.readyState !== 'loading') {\r\n render();\r\n } else {\r\n document.addEventListener('DOMContentLoaded', () => render());\r\n }\r\n}","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('countdown', initCountdown, cleanupCountdown);","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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\nkupolaInitializer.register('number-input', initNumberInput, cleanupNumberInput);","import { globalEvents } from './global-events.js';\r\nimport { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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 this._mouseMoveListener = globalEvents.on(document, 'mousemove', this._mouseMoveHandler, { scope: this.scope });\r\n this._mouseUpListener = globalEvents.on(document, 'mouseup', this._mouseUpHandler, { scope: this.scope });\r\n this._touchMoveListener = globalEvents.on(document, 'touchmove', this._touchMoveHandler, { scope: this.scope, passive: false });\r\n this._touchEndListener = globalEvents.on(document, 'touchend', this._touchEndHandler, { scope: this.scope });\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\nkupolaInitializer.register('slide-captcha', initSlideCaptchas, cleanupAllSlideCaptchas);","import { kupolaInitializer } from './initializer.js';\r\n\r\nclass 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._submitHandler = null;\r\n this._fieldHandlers = new Map(); // field → { blur, input }\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._submitHandler = (e) => {\r\n if (!this.validate()) {\r\n e.preventDefault();\r\n }\r\n };\r\n this.form.addEventListener('submit', this._submitHandler);\r\n\r\n this.fields.forEach(field => {\r\n const blurHandler = () => this.validateField(field);\r\n const inputHandler = () => this.clearError(field);\r\n this._fieldHandlers.set(field, { blur: blurHandler, input: inputHandler });\r\n field.addEventListener('blur', blurHandler);\r\n field.addEventListener('input', inputHandler);\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 // 移除 submit handler\r\n if (this._submitHandler && this.form) {\r\n this.form.removeEventListener('submit', this._submitHandler);\r\n }\r\n\r\n // 移除每个字段的 blur/input handlers\r\n this._fieldHandlers.forEach((handlers, field) => {\r\n field.removeEventListener('blur', handlers.blur);\r\n field.removeEventListener('input', handlers.input);\r\n });\r\n\r\n this._submitHandler = null;\r\n this._fieldHandlers.clear();\r\n this._fieldHandlers = null;\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\nkupolaInitializer.register('form-validation', initFormValidation);","import { ref } from './data-bind.js';\r\nimport { getConfig } from './kupola-config.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 this._flushDepth = 0;\r\n this._maxDepth = 10;\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 if (this._flushDepth >= this._maxDepth) {\r\n console.warn('[Kupola Scheduler] Max flush depth reached, possible infinite loop detected');\r\n this._queue.clear();\r\n this._scheduled = false;\r\n return;\r\n }\r\n const tasks = Array.from(this._queue);\r\n this._queue.clear();\r\n this._scheduled = false;\r\n this._flushDepth++;\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 this._flushDepth--;\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 // Exponential backoff + random jitter to prevent thundering herd\r\n const baseDelay = this.retryDelay * Math.pow(2, attempt);\r\n const jitter = Math.random() * baseDelay * 0.5;\r\n const delay = baseDelay + jitter;\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 const httpConfig = getConfig('http');\r\n \r\n if (httpConfig?.baseURL && !url.startsWith('http://') && !url.startsWith('https://')) {\r\n url = httpConfig.baseURL + url.replace(/^\\//, '');\r\n }\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 globalHeaders = httpConfig?.headers || {};\r\n const fetchOptions = {\r\n method: this.method.toUpperCase(),\r\n headers: { 'Content-Type': 'application/json', ...globalHeaders, ...this.headers }\r\n };\r\n\r\n if (httpConfig?.withCredentials) {\r\n fetchOptions.credentials = 'include';\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._reconnectAttempt = 0;\r\n this._maxReconnectDelay = config.maxReconnectDelay || 30000;\r\n this.messageHandler = null;\r\n this._connected = false;\r\n this._destroyed = 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 this._reconnectAttempt = 0; // Reset on successful connection\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 && !this._destroyed) {\r\n // Exponential backoff + jitter for reconnection\r\n const baseDelay = this.reconnectDelay * Math.pow(2, this._reconnectAttempt);\r\n const jitter = Math.random() * baseDelay * 0.3;\r\n const delay = Math.min(baseDelay + jitter, this._maxReconnectDelay);\r\n this._reconnectAttempt++;\r\n setTimeout(() => {\r\n if (!this._destroyed) this.fetch().catch(() => {});\r\n }, delay);\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 this._destroyed = true;\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\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\nimport { kupolaInitializer } from './initializer.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 this._scrollHandler = null; // 保存引用以便 destroy 移除\r\n this._resizeCleanups = []; // 列宽拖拽清理函数\r\n this._filterDebounceTimer = null;\r\n this._reactiveCleanups = []; // ref() subscribe 清理\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 if (data.subscribe) {\r\n this._reactiveCleanups.push(\r\n data.subscribe((newVal) => {\r\n this._data = Array.isArray(newVal) ? newVal : [];\r\n this._total = this._data.length;\r\n this.render();\r\n })\r\n );\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 if (loading.subscribe) {\r\n this._reactiveCleanups.push(\r\n loading.subscribe((val) => { this._loading = val; this.render(); })\r\n );\r\n }\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 if (this.selection) this._renderSelectionHeader(tr);\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 this.columns.forEach(col => {\r\n const th = this._renderColumnHeader(col);\r\n tr.appendChild(th);\r\n });\r\n\r\n thead.appendChild(tr);\r\n return thead;\r\n }\r\n\r\n _renderSelectionHeader(tr) {\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 _renderColumnHeader(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 if (col.sortable) this._renderSortIndicator(th, col);\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 return th;\r\n }\r\n\r\n _renderSortIndicator(th, col) {\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 _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 if (this.selection) this._renderSelectionCell(tr, key, isSelected);\r\n if (this.expandable) this._renderExpandCell(tr, key);\r\n\r\n // Data cells\r\n this.columns.forEach((col, colIndex) => {\r\n if (skipCells.has(`${rowIndex}-${colIndex}`)) return;\r\n const td = this._renderDataCell(row, rowIndex, key, col, colIndex, skipCells, mergeMap);\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 _renderSelectionCell(tr, key, isSelected) {\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 _renderExpandCell(tr, key) {\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 btn.textContent = this._expandedKeys.has(key) ? '▼' : '▶';\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 _renderDataCell(row, rowIndex, key, col, colIndex, skipCells, mergeMap) {\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 (first column only)\r\n if (this.tree && colIndex === 0 && row._level > 0) {\r\n this._renderTreeIndent(td, row);\r\n }\r\n\r\n // Cell content: editing / custom render / plain text\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 return td;\r\n }\r\n\r\n _renderTreeIndent(td, row) {\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 _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 if (this._scrollHandler) {\r\n wrapper.removeEventListener('scroll', this._scrollHandler);\r\n }\r\n this._scrollHandler = () => this._updateVirtualScroll();\r\n wrapper.addEventListener('scroll', this._scrollHandler);\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 // 注册清理函数,destroy 时可强制移除\r\n this._resizeCleanups.push(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) => this._handleRowDrop(e, row));\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 _handleRowDrop(e, targetRow) {\r\n e.preventDefault();\r\n targetRow.classList.remove('kupola-table-drag-over');\r\n if (!this._dragState) return;\r\n const toKey = targetRow.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\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 filterInput.addEventListener('input', () => {\r\n clearTimeout(this._filterDebounceTimer);\r\n this._filterDebounceTimer = 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 // 移除虚拟滚动 scroll listener\r\n if (this._scrollHandler) {\r\n const wrapper = this.element.querySelector('.kupola-table-container');\r\n if (wrapper) wrapper.removeEventListener('scroll', this._scrollHandler);\r\n this._scrollHandler = null;\r\n }\r\n\r\n // 清除 filter debounce timer\r\n if (this._filterDebounceTimer) {\r\n clearTimeout(this._filterDebounceTimer);\r\n this._filterDebounceTimer = null;\r\n }\r\n\r\n // 清理列宽拖拽残留的 document listener\r\n this._resizeCleanups.forEach(fn => fn());\r\n this._resizeCleanups = [];\r\n\r\n // 清理 ref() 订阅\r\n this._reactiveCleanups.forEach(sub => sub.unsubscribe());\r\n this._reactiveCleanups = [];\r\n\r\n // 清理 DOM 和 class\r\n this.element.innerHTML = '';\r\n this.element.classList.remove('kupola-table-wrapper', 'kupola-table-virtual-wrapper');\r\n\r\n // 清理数据引用\r\n this._data = [];\r\n this._virtualData = null;\r\n this._dragState = null;\r\n this._editingCell = null;\r\n this._editBuffer = {};\r\n }\r\n}\r\n\r\nfunction initTable(element, options) {\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\nkupolaInitializer.register('table', initTable);\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\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"],"names":["KupolaLifecycle","scope","phase","nextState","allowed","handlers","hook","handler","options","hooks","a","b","index","h","depends","depName","depHook","args","emitId","startTime","hookStartTime","hookResult","hookError","error","hookDuration","totalDuration","stateMap","beforePhase","afterPhase","resolve","onReady","targetState","boundary","errorInfo","max","e","boundaryHandlers","result","kupolaLifecycle","createLifecycle","_UNSAFE_KEYS","_isUnsafeKey","key","trim","str","trimLeft","trimRight","toUpperCase","toLowerCase","capitalize","camelize","_","c","hyphenate","padStart","length","padChar","padEnd","truncate","maxLength","suffix","replaceAll","search","replacement","format","template","data","startsWith","prefix","endsWith","includesStr","repeat","times","reverse","countOccurrences","escapeHtml","div","unescapeHtml","generateRandom","chars","i","generateUUID","r","stringUtils","isArray","arr","isEmpty","size","first","defaultValue","last","get","slice","start","end","concat","arg","join","separator","indexOf","item","fromIndex","lastIndexOf","includes","push","items","pop","shift","unshift","remove","v","removeAt","insert","reverseArr","sort","compareFn","sortBy","order","valA","valB","filter","predicate","map","fn","reduce","initialValue","forEach","every","some","find","findIndex","flat","depth","flattenDeep","acc","unique","uniqueBy","seen","value","chunk","chunkSize","chunks","shuffle","j","sum","val","average","min","intersection","union","difference","arr1","arr2","zip","arrayUtils","isObject","obj","isEmptyObj","keys","values","entries","has","getObj","path","k","current","setObj","lastKey","pick","omit","merge","clone","deepClone","hash","m","forEachObj","mapObj","filterObj","reduceObj","toArray","fromArray","keyField","valueField","sizeObj","invert","isEqual","obj1","obj2","keys1","keys2","freeze","seal","objectUtils","isNumber","isInteger","isFloat","isPositive","isNegative","isZero","clamp","minVal","maxVal","round","precision","factor","floor","ceil","abs","minNum","nums","maxNum","sumNum","averageNum","random","randomInt","formatNum","decimals","formatCurrency","currency","formatPercent","toFixed","toPrecision","isNaNVal","isFiniteVal","parseIntSafe","radix","parseFloatSafe","toNumber","num","safeDivide","safeMultiply","numberUtils","now","today","d","tomorrow","yesterday","isDate","isValidDate","date","parseDate","formatDate","formatStr","year","month","day","hours","minutes","seconds","milliseconds","weekDay","toISO","toUTC","addDays","days","addHours","addMinutes","addSeconds","diffDays","date1","date2","d1","d2","diffHours","diffMinutes","diffSeconds","isToday","isYesterday","isTomorrow","isFuture","isPast","isLeapYear","getDaysInMonth","getWeekOfYear","startOfYear","diff","getQuarter","startOfDay","endOfDay","startOfMonth","endOfMonth","startOfWeek","startDay","endOfWeek","getAge","birthDate","n","age","fromNow","minute","hour","week","dateUtils","debounce","func","wait","timeout","lastArgs","lastThis","lastCallTime","leading","trailing","invokeFunc","leadingEdge","trailingEdge","remainingWait","throttle","limit","inThrottle","isEmail","isPhone","isURL","isIPv4","isIPv6","isIP","isIDCard","isPassport","isCreditCard","regex","cleanStr","alt","digit","isHexColor","isRGB","isRGBA","g","isColor","isDateStr","isJSON","isEmptyStr","isWhitespace","isNumberStr","isIntegerStr","isFloatStr","isPositiveStr","isNegativeStr","isAlpha","isAlphaNumeric","isChinese","isLength","len","minLength","matches","equals","str1","str2","contains","substring","notContains","isArrayVal","arrayLength","arrayMinLength","arrayMaxLength","isObjectVal","hasKeys","validate","rules","errors","fieldRules","fieldErrors","rule","name","params","validatorUtils","md5","message","md5Array","K","S","leftRotate","addPadding","msg","bitLength","lowBytes","highBytes","processBlock","block","state","words","AA","BB","CC","DD","f","wi","temp","paddedMessage","word","sha256","rightRotate","s0","s1","S1","ch","temp1","S0","maj","temp2","base64Encode","bytes","byte1","byte2","byte3","enc1","enc2","enc3","enc4","base64Decode","uuid","cryptoUtils","_preloadCache","loadImage","url","crossOrigin","reject","img","loadImages","urls","parallel","results","loadScript","type","isAsync","defer","script","loadStylesheet","media","link","loadFont","fontFamily","src","weight","style","fontFace","preload","isLoaded","clearPreloadCache","clearCacheByUrl","preloadUtils","KupolaUtils","sanitizeHtml","html","dangerousTags","prev","TrieNode","PathTrie","node","parts","part","collectKeys","child","parentPath","REACTIVE_SYMBOLS","KupolaDataBind","target","receiver","oldValue","fullPath","parentKey","proxy","updatedKeys","subKey","subValue","element","dep","silent","parent","callback","cb","binding","sanitized","display","deps","prop","storageType","version","encrypt","encryptionKey","storage","newValue","config","dataToStore","serialized","e2","testKey","maxAge","text","ciphertext","persisted","dataKey","stored","parsed","decrypted","snapshot","snapshotIndex","formElement","mutations","mutation","existingHandler","elements","KupolaStore","initialState","kupolaData","newState","payload","action","KupolaStoreManager","store","KupolaEventBus","eventName","onceCallback","selector","listener","sel","ref","refObj","sub","kupolaEvents","kupolaStoreManager","createStore","getStore","setConfig","mergeDeep","getConfig","getNestedValue","getIconsPath","getBasePath","getDefaultTheme","getDefaultBrand","getHttpConfig","getUiConfig","getSecurityConfig","getDevConfig","getPerformanceConfig","getExtendConfig","source","o","THEME_KEY","BRAND_KEY","BRAND_OPTIONS","getTheme","setTheme","theme","toggleBtn","icon","iconPath","getBrand","setBrand","brandId","brand","brandToggle","brandIcon","brandName","btn","updateThemeIcon","iconEl","currentTheme","iconsPath","initTheme","savedTheme","savedBrand","existingOnClick","newTheme","brandPicker","isHidden","closeBrandPicker","createThemeToggle","createBrandPicker","container","closeBrandPickerAuto","sanitizeConfig","allowedTags","allowedAttributes","doc","tagName","attr","attrName","stripHtml","maskData","maskConfig","pattern","generateSecureId","secureIdConfig","idLength","charset","array","ComponentInitializerRegistry","initFn","cleanupFn","cls","className","root","promises","kupolaInitializer","knownComponents","comp","KupolaComponent","props","slots","slotEl","slotName","customEvent","newProps","hookMap","proto","registeredHooks","methodName","lifecyclePhase","applyMixin","componentClass","mixin","original","KupolaComponentRegistry","loader","cached","loadingPromise","mixinNames","componentName","initializer","ComponentClass","instance","childInstance","kupolaRegistry","_applySecurityHeaders","metaTag","kupolaBootstrap","registerComponent","registerLazyComponent","bootstrapComponents","defineMixin","useMixin","defineComponent","KupolaI18n","locale","htmlLang","match","count","event","dateObj","number","unit","kupolaI18n","createI18n","t","setLocale","getLocale","formatNumber","GlobalEvents","once","passive","capture","listenerId","eventKey","listeners","filtered","l","targetId","detail","listenerIds","targets","keyTargetId","scopeListeners","globalEvents","on","off","emit","emitGlobal","offByScope","offAll","getListenerCount","Dropdown","triggerRect","menuRect","viewportHeight","viewportWidth","spaceBelow","spaceAbove","divider","el","initDropdown","dropdown","initDropdowns","cleanupDropdown","cleanupAllDropdowns","Select","option","opt","triggerParent","query","visible","title","group","hasVisible","optionEl","tag","removeBtn","optEl","isSelected","initSelect","select","initSelects","cleanupSelect","Datepicker","y","time","pickerRect","calendarRect","calendarHeight","isVisible","calendar","dayEl","header","prevBtn","titleBtn","nextBtn","weekHeader","span","daysEl","firstDay","daysInMonth","offset","emptyDay","clickHandler","footer","todayBtn","clearBtn","currentYear","startYear","grid","monthName","idx","initDatepicker","picker","initDatepickers","cleanupDatepicker","Timepicker","ampmMatch","second","timeVal","minParts","maxParts","period","panelRect","panelHeight","sectionsHTML","label","displayHour","displayMinute","displaySecond","displayAmPm","hourVal","ampmGrid","selected","initTimepicker","initTimepickers","cleanupTimepicker","Slider","mark","pct","inputHandler","changeHandler","trackClick","keyHandler","thumb","which","startDrag","onDrag","stopDrag","clientX","clientY","rect","percentage","step","endVal","startVal","distToStart","distToEnd","inputEl","startPct","endPct","endValue","initSlider","slider","cleanupSlider","initSliders","Carousel","indicator","prevIndex","absDx","absDy","absDeltaX","absDeltaY","initCarousel","carousel","initCarousels","cleanupCarousel","Drawer","closeBtn","cancelBtn","confirmBtn","initDrawer","drawer","cleanupDrawer","initDrawers","trigger","drawerId","mask","drawerEl","Modal","createModal","content","width","fullscreen","showCancel","showConfirm","confirmText","cancelText","confirmClass","cancelClass","closable","maskClosable","onConfirm","onCancel","onOpen","onClose","sizeClass","footerHTML","modal","titleEl","bodyEl","isConfirming","confirmHandler","cancelHandler","closeAndDestroy","originalClose","confirmModal","alertModal","initModal","cleanupModal","initModals","Dialog","icons","keydownHandler","close","maskClickHandler","confirmClickHandler","cancelClickHandler","Notification","duration","notification","initNotifications","Message","initMessages","_escapeHtml","FileUpload","files","dragoverHandler","dragleaveHandler","dropHandler","file","accept","types","fileType","fileName","fileIcon","removeHandler","extension","sizes","itemElement","errorElement","reader","previewItem","previewRemoveBtn","previewRemoveHandler","percent","bar","totalChunks","currentChunk","uploadInterval","initFileUpload","cleanupFileUpload","initFileUploads","Collapse","isDisabled","isActive","isExpanded","headerInfo","transitionHandler","initCollapse","collapse","cleanupCollapse","initCollapses","ColorPicker","color","hex","s","bVal","hueSlider","svArea","alphaSlider","x","colorBtn","mode","alpha","initColorPicker","initColorPickers","cleanupColorPicker","Calendar","prevHandler","nextHandler","todayHandler","dateStr","startStr","endStr","eventStart","eventEnd","todayStr","currentDate","dayStr","dayEvents","eventDot","dayOfWeek","monday","startDate","endDate","dayHeader","dayNum","eventsContainer","events","eventId","i18n","initCalendar","cleanupCalendar","initCalendars","DynamicTags","addTag","textNode","tagRemoveHandler","tags","colorClasses","allow","initDynamicTags","cleanupDynamicTags","initDynamicTagsAll","ImagePreview","degrees","zoom","images","meta","indicators","currentImage","imagePreviewInstance","initImagePreview","showImagePreview","Tag","closeHandler","checkboxHandler","dblclickHandler","blurHandler","sizeClasses","textNodes","checkbox","input","insertBeforeEl","checked","newContent","editable","checkable","initTag","cleanupTag","initTags","StatCard","entry","targetValue","startValue","animate","currentTime","elapsed","progress","easeProgress","currentValue","formattedValue","currentWidth","targetWidth","currentWidthValue","direction","trendElement","iconSvg","initStatCard","cleanupStatCard","initStatCards","card","Heatmap","maxValue","ratio","level","rgb","opacity","months","currentMonth","weeks","firstDayOfWeek","body","currentWeek","weekCount","cellWidth","totalGridWidth","labelsAndGrid","weekdayLabels","weekdayLabelHeight","gridContainer","monthLabels","monthInfo","nextMonth","weekSpan","weekColumn","emptyCell","cell","mouseenterHandler","mouseleaveHandler","legend","cells","label2","tooltipWidth","initHeatmap","dataAttr","generateMockHeatmapData","info","cleanupHeatmap","initHeatmaps","oneYearAgo","baseValue","Tooltip","tooltipRect","left","top","removeEl","isHtml","position","delay","enable","initTooltip","tooltip","initTooltips","cleanupTooltip","KupolaValidator","form","formId","inputs","hasError","valueEl","uploadInstance","forms","allValid","formErrors","asyncRules","validatorFunc","groupName","groups","statusElement","loading","submitting","disabled","rulesString","customMessage","validator","hasAsyncValidation","isValid","submitBtn","originalText","onSubmit","firstError","activeElement","validateOnInput","VirtualList","isHorizontal","scrollOffset","positions","currentPosition","total","itemSize","viewportSize","startIndex","endIndex","visibleData","actualIndex","selectedClass","hasChanges","actualHeight","dataItem","totalSize","thumbHeight","maxTop","thumbTop","totalHeight","deltaY","newTop","scrollTop","behavior","generateMockVirtualListData","titles","titleIndex","randomNum","initVirtualList","cleanupVirtualList","ATTRS","PATHS","svg","viewBox","render","vb","Icons","Countdown","dataEndTime","dataHours","dataMinutes","dataSeconds","distance","initCountdown","cleanupCountdown","initCountdowns","NumberInput","minusHandler","plusHandler","delta","initNumberInput","cleanupNumberInput","initNumberInputs","SlideCaptcha","trackWidth","btnWidth","maxOffset","deltaX","btnOffset","mid","distractor","velocity","acceleration","dx","dt","prevDt","prevV","pointCountEl","finalX","distractorDiff","targetDiff","speeds","maxSpeed","minSpeed","hasYMovement","p","totalTime","accelerations","onVerified","initSlideCaptchas","captcha","cleanupSlideCaptcha","cleanupAllSlideCaptchas","KupolaForm","param","field","validatorName","attrValue","initFormValidation","formSelector","getFormInstance","validateForm","Scheduler","tasks","task","globalScheduler","CacheEntry","ttl","CacheManager","DependsError","code","cause","_httpClientFetch","configureHttpClient","client","getHttpClient","resetHttpClient","DependsSource","cacheManager","attempt","baseDelay","jitter","depError","FetchedSource","httpConfig","queryParts","globalHeaders","fetchOptions","clientFetch","response","ok","status","StorageSource","RouteSource","FunctionSource","StaticSource","WebSocketSource","createSource","useDeps","depsConfig","unsubscribers","getParams","_extractPropValues","depConfig","lastUpdated","_loadId","load","thisLoadId","unsubscribeSource","propKeys","useQuery","clearCache","KupolaTable","newVal","ck","row","col","flatData","pageData","children","va","cmp","sorted","wrapper","tableContainer","table","thead","tr","th","allKeys","handle","sortInfo","tbody","mergeConfig","mergeMap","skipCells","rowIndex","expandTr","expandTd","totalCols","colIndex","td","mergeInfo","isEditing","indent","toggle","spacer","rowHeight","overscan","topSpacer","bottomSpacer","viewHeight","startIdx","endIdx","fragment","actions","saveBtn","rowKey","colKey","existing","startX","startWidth","onMouseMove","ev","newWidth","onMouseUp","targetRow","toKey","fromIdx","toIdx","moved","fixedLeft","ths","tds","colIdx","rightOffset","toolbar","filterInput","right","invertBtn","exportBtn","totalInfo","totalPages","nav","sizeSelect","pages","onClick","page","range","filename","headers","rows","csv","blob","classes","columns","initTable","initAllTables","KupolaPagination","next","jumper","half","stylesInjected","injectPaginationStyles","initPagination","registered","KupolaDropdownElement","menu","oldVal","KupolaTooltipElement","KupolaCollapseElement","collapseItem","KupolaCollapseItemElement","KupolaDrawerElement","KupolaModalElement","foot","backdrop","registerWebComponents","components"],"mappings":"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"}