@kupola/kupola 1.4.7 → 1.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/kupola.cjs.js +17 -17
- package/dist/kupola.cjs.js.map +1 -1
- package/dist/kupola.esm.js +745 -737
- package/dist/kupola.esm.js.map +1 -1
- package/dist/kupola.umd.js +17 -17
- package/dist/kupola.umd.js.map +1 -1
- package/js/theme.js +10 -0
- package/package.json +3 -3
- package/dist/kupola.css +0 -9139
- package/dist/kupola.min.css +0 -1
package/dist/kupola.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kupola.esm.js","sources":["../js/kupola-lifecycle.js","../js/utils.js","../js/data-bind.js","../js/theme.js","../js/initializer.js","../js/component.js","../js/registry.js","../js/kupola-core.js","../js/i18n.js","../js/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 THEME_KEY = 'kupola-theme';\r\nconst BRAND_KEY = 'kupola-brand';\r\n\r\nconst BRAND_OPTIONS = [\r\n { id: 'green', name: '翠绿', color: '#32F08C' },\r\n { id: 'xionghuang', name: '雄黄', color: '#FF9900' },\r\n { id: 'jianghuang', name: '姜黄', color: '#E2C027' },\r\n { id: 'lanlv', name: '蓝绿', color: '#12A182' },\r\n { id: 'kongquelan', name: '孔雀蓝', color: '#0EB0C9' },\r\n { id: 'meiguizi', name: '玫瑰紫', color: '#BA2F7B' },\r\n { id: 'shihong', name: '柿红', color: '#F2481B' },\r\n { id: 'quhong', name: '紫云', color: '#B1A6CC' },\r\n { id: 'shanchahong', name: '山茶红', color: '#F05A46' },\r\n { id: 'zengqing', name: '曾青', color: '#535164' },\r\n { id: 'roulan', name: '柔蓝', color: '#106898' }\r\n];\r\n\r\nfunction getTheme() {\r\n return localStorage.getItem(THEME_KEY) || 'dark';\r\n}\r\n\r\nfunction setTheme(theme) {\r\n if (theme !== 'dark' && theme !== 'light') return;\r\n \r\n document.documentElement.setAttribute('data-theme', theme);\r\n localStorage.setItem(THEME_KEY, theme);\r\n \r\n const toggleBtn = document.querySelector('[data-theme-toggle]');\r\n if (toggleBtn) {\r\n toggleBtn.setAttribute('data-current-theme', theme);\r\n const icon = toggleBtn.querySelector('.theme-icon');\r\n if (icon) {\r\n const iconPath = icon.src.substring(0, icon.src.lastIndexOf('/') + 1);\r\n icon.src = theme === 'dark' \r\n ? iconPath + 'sun.svg' \r\n : iconPath + 'moon.svg';\r\n }\r\n }\r\n}\r\n\r\nfunction getBrand() {\r\n return localStorage.getItem(BRAND_KEY) || 'zengqing';\r\n}\r\n\r\nfunction setBrand(brandId) {\r\n const brand = BRAND_OPTIONS.find(b => b.id === brandId);\r\n if (!brand) return;\r\n \r\n document.documentElement.setAttribute('data-brand', brandId);\r\n localStorage.setItem(BRAND_KEY, brandId);\r\n \r\n const brandToggle = document.querySelector('[data-brand-toggle]');\r\n if (brandToggle) {\r\n brandToggle.setAttribute('data-current-brand', brandId);\r\n const brandIcon = brandToggle.querySelector('.brand-icon');\r\n if (brandIcon) {\r\n brandIcon.style.backgroundColor = brand.color;\r\n }\r\n const brandName = brandToggle.querySelector('.brand-name');\r\n if (brandName) {\r\n brandName.textContent = brand.name;\r\n }\r\n }\r\n \r\n const brandButtons = document.querySelectorAll('[data-brand-btn]');\r\n brandButtons.forEach(btn => {\r\n if (btn.getAttribute('data-brand-btn') === brandId) {\r\n btn.classList.add('is-active');\r\n } else {\r\n btn.classList.remove('is-active');\r\n }\r\n });\r\n}\r\n\r\nfunction initTheme() {\r\n \r\n const savedTheme = getTheme();\r\n setTheme(savedTheme);\r\n \r\n const savedBrand = getBrand();\r\n setBrand(savedBrand);\r\n \r\n const toggleBtn = document.querySelector('[data-theme-toggle]');\r\n if (toggleBtn) {\r\n 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 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 scripts = document.getElementsByTagName('script');\r\n const currentScript = scripts[scripts.length - 1];\r\n const scriptPath = currentScript.src.substring(0, currentScript.src.lastIndexOf('/') + 1);\r\n icon.src = getTheme() === 'dark' \r\n ? scriptPath + '../icons/sun.svg' \r\n : scriptPath + '../icons/moon.svg';\r\n icon.width = 14;\r\n icon.height = 14;\r\n icon.alt = 'Toggle theme';\r\n \r\n btn.appendChild(icon);\r\n document.body.appendChild(btn);\r\n \r\n btn.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};","/**\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\n\r\nlet kupolaRegistry = null;\r\n\r\nif (typeof window !== 'undefined') {\r\n kupolaRegistry = new KupolaComponentRegistry();\r\n}\r\n\r\n/** Bootstrap the Kupola component system (data binding, theme, component discovery). */\r\nasync function kupolaBootstrap() {\r\n if (typeof window !== 'undefined') {\r\n // Load persisted data and bind data-bind elements\r\n kupolaData.loadPersisted();\r\n kupolaData.bind();\r\n // Initialize theme\r\n initTheme();\r\n // Initialize function-based components first\r\n await kupolaInitializer.initializeAll();\r\n // Then bootstrap class-based components\r\n if (kupolaRegistry) {\r\n await kupolaRegistry.bootstrap();\r\n }\r\n }\r\n}\r\n\r\nif (typeof document !== 'undefined' && document.readyState === 'loading') {\r\n document.addEventListener('DOMContentLoaded', kupolaBootstrap);\r\n} else if (typeof window !== 'undefined') {\r\n setTimeout(kupolaBootstrap, 0);\r\n}\r\n\r\n/** Register a class-based component. */\r\nfunction registerComponent(name, componentClass) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.register(name, componentClass);\r\n }\r\n}\r\n\r\n/** Register a lazy-loaded component (loaded on first use). */\r\nfunction registerLazyComponent(name, loader) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.registerLazy(name, loader);\r\n }\r\n}\r\n\r\n/** Manually bootstrap components within a specific root element. */\r\nfunction bootstrapComponents(root) {\r\n if (kupolaRegistry) {\r\n return kupolaRegistry.bootstrap(root);\r\n }\r\n return Promise.resolve();\r\n}\r\n\r\n/** Define a reusable mixin for component classes. */\r\nfunction defineMixin(name, mixin) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.defineMixin(name, mixin);\r\n }\r\n}\r\n\r\n/** Apply named mixins to a component class. */\r\nfunction useMixin(componentClass, ...mixinNames) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.useMixin(componentClass, ...mixinNames);\r\n }\r\n}\r\n\r\n/**\r\n * Unified component registration API.\r\n * @param {string} name - Component name\r\n * @param {object} options\r\n * @param {Function} [options.init] - Init function (for function-based components)\r\n * @param {Function} [options.cleanup] - Cleanup function\r\n * @param {Function} [options.componentClass] - Component class (for class-based components)\r\n * @param {Function} [options.lazy] - Lazy loader function\r\n * @param {string} [options.dataAttribute] - Custom data attribute (e.g. 'data-my-component')\r\n * @param {string} [options.cssClass] - CSS class selector (e.g. 'ds-my-component')\r\n */\r\nfunction defineComponent(name, options) {\r\n if (!options || typeof options !== 'object') {\r\n throw new Error(`defineComponent(\"${name}\"): options must be an object`);\r\n }\r\n // Register with registry (class or lazy)\r\n if (options.componentClass) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.register(name, options.componentClass);\r\n }\r\n } else if (options.lazy) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.registerLazy(name, options.lazy);\r\n }\r\n }\r\n // Register with initializer (function-based)\r\n if (options.init) {\r\n kupolaInitializer.register(name, options.init, options.cleanup || null, {\r\n dataAttribute: options.dataAttribute,\r\n cssClass: options.cssClass\r\n });\r\n } else if (options.dataAttribute || options.cssClass) {\r\n // Even without init, register selectors so MutationObserver can find them\r\n kupolaInitializer.register(name, () => {}, null, {\r\n dataAttribute: options.dataAttribute,\r\n cssClass: options.cssClass\r\n });\r\n }\r\n}\r\n\r\nexport {\r\n KupolaComponent,\r\n applyMixin,\r\n KupolaComponentRegistry,\r\n KupolaLifecycle,\r\n kupolaRegistry,\r\n kupolaInitializer,\r\n kupolaBootstrap,\r\n registerComponent,\r\n registerLazyComponent,\r\n bootstrapComponents,\r\n defineMixin,\r\n useMixin,\r\n defineComponent\r\n};","class KupolaI18n {\r\n constructor(options = {}) {\r\n this.locales = options.locales || {};\r\n this.currentLocale = options.defaultLocale || 'zh-CN';\r\n this.fallbackLocale = options.fallbackLocale || 'zh-CN';\r\n this.delimiter = options.delimiter || '.';\r\n this.missingHandler = options.missingHandler || ((key) => {\r\n console.warn(`Missing translation: ${key}`);\r\n return key;\r\n });\r\n \r\n this._initFromDOM();\r\n }\r\n\r\n _initFromDOM() {\r\n const scriptTags = document.querySelectorAll('script[type=\"application/json\"][data-kupola-i18n]');\r\n scriptTags.forEach(script => {\r\n const locale = script.dataset.kupolaI18n;\r\n if (locale) {\r\n try {\r\n const data = JSON.parse(script.textContent);\r\n this.addLocale(locale, data);\r\n } catch (e) {\r\n console.error('Failed to parse i18n data:', e);\r\n }\r\n }\r\n });\r\n\r\n const htmlLang = document.documentElement.lang;\r\n if (htmlLang && this.locales[htmlLang]) {\r\n this.currentLocale = htmlLang;\r\n }\r\n }\r\n\r\n addLocale(locale, data) {\r\n if (!this.locales[locale]) {\r\n this.locales[locale] = {};\r\n }\r\n this._mergeDeep(this.locales[locale], data);\r\n }\r\n\r\n _mergeDeep(target, source) {\r\n for (const key of Object.keys(source)) {\r\n if (source[key] instanceof Object && key in target) {\r\n this._mergeDeep(target[key], source[key]);\r\n } else {\r\n target[key] = source[key];\r\n }\r\n }\r\n }\r\n\r\n setLocale(locale) {\r\n if (this.locales[locale]) {\r\n this.currentLocale = locale;\r\n document.documentElement.lang = locale;\r\n this._emitChange();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n getLocale() {\r\n return this.currentLocale;\r\n }\r\n\r\n t(key, params = {}) {\r\n let value = this._getTranslation(key, this.currentLocale);\r\n \r\n if (!value) {\r\n value = this._getTranslation(key, this.fallbackLocale);\r\n }\r\n \r\n if (!value) {\r\n return this.missingHandler(key);\r\n }\r\n \r\n return this._interpolate(value, params);\r\n }\r\n\r\n _getTranslation(key, locale) {\r\n if (!this.locales[locale]) return null;\r\n \r\n const keys = key.split(this.delimiter);\r\n let value = this.locales[locale];\r\n \r\n for (const k of keys) {\r\n if (value && typeof value === 'object' && k in value) {\r\n value = value[k];\r\n } else {\r\n return null;\r\n }\r\n }\r\n \r\n return typeof value === 'string' ? value : null;\r\n }\r\n\r\n _interpolate(str, params) {\r\n return str.replace(/\\{(\\w+)\\}/g, (match, key) => {\r\n return params[key] !== undefined ? params[key] : match;\r\n });\r\n }\r\n\r\n n(key, count, params = {}) {\r\n const value = this.t(key, { ...params, count });\r\n \r\n if (!value) return value;\r\n \r\n const parts = value.split('|');\r\n \r\n if (parts.length === 1) {\r\n return value.replace('{count}', count);\r\n }\r\n \r\n if (parts.length === 2) {\r\n return count === 1 ? parts[0] : parts[1];\r\n }\r\n \r\n if (parts.length >= 3) {\r\n if (count === 0) return parts[0];\r\n if (count === 1) return parts[1];\r\n return parts[2];\r\n }\r\n \r\n return value;\r\n }\r\n\r\n _emitChange() {\r\n const event = new CustomEvent('kupola:i18n:change', {\r\n detail: { locale: this.currentLocale },\r\n bubbles: true\r\n });\r\n document.dispatchEvent(event);\r\n }\r\n\r\n async loadLocale(locale, url) {\r\n try {\r\n const response = await fetch(url);\r\n const data = await response.json();\r\n this.addLocale(locale, data);\r\n return true;\r\n } catch (error) {\r\n console.error('Failed to load locale:', error);\r\n return false;\r\n }\r\n }\r\n\r\n getAvailableLocales() {\r\n return Object.keys(this.locales);\r\n }\r\n\r\n hasLocale(locale) {\r\n return !!this.locales[locale];\r\n }\r\n\r\n formatDate(date, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n const dateObj = typeof date === 'string' ? new Date(date) : date;\r\n \r\n return new Intl.DateTimeFormat(locale, options).format(dateObj);\r\n }\r\n\r\n formatNumber(number, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n \r\n return new Intl.NumberFormat(locale, options).format(number);\r\n }\r\n\r\n formatCurrency(number, currency, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n \r\n return new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currency,\r\n ...options\r\n }).format(number);\r\n }\r\n\r\n formatRelativeTime(value, unit, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n \r\n return new Intl.RelativeTimeFormat(locale, options).format(value, unit);\r\n }\r\n}\r\n\r\nconst kupolaI18n = new KupolaI18n();\r\n\r\nfunction createI18n(options) {\r\n return new KupolaI18n(options);\r\n}\r\n\r\nfunction t(key, params = {}) {\r\n return kupolaI18n.t(key, params);\r\n}\r\n\r\nfunction n(key, count, params = {}) {\r\n return kupolaI18n.n(key, count, params);\r\n}\r\n\r\nfunction setLocale(locale) {\r\n return kupolaI18n.setLocale(locale);\r\n}\r\n\r\nfunction getLocale() {\r\n return kupolaI18n.getLocale();\r\n}\r\n\r\nfunction formatDate(date, options = {}) {\r\n return kupolaI18n.formatDate(date, options);\r\n}\r\n\r\nfunction formatNumber(number, options = {}) {\r\n return kupolaI18n.formatNumber(number, options);\r\n}\r\n\r\nfunction formatCurrency(number, currency, options = {}) {\r\n return kupolaI18n.formatCurrency(number, currency, options);\r\n}\r\n\r\nexport { \r\n KupolaI18n, kupolaI18n, createI18n, \r\n t, n, setLocale, getLocale,\r\n formatDate, formatNumber, formatCurrency \r\n};","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\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 } = options;\r\n \r\n const container = document.createElement('div');\r\n container.className = 'ds-modal-container';\r\n \r\n let footerHTML = '';\r\n if (footer !== null) {\r\n if (typeof footer === 'string') {\r\n footerHTML = `<div class=\"ds-modal__footer\">${footer}</div>`;\r\n } else if (showConfirm || showCancel) {\r\n footerHTML = `<div class=\"ds-modal__footer\">\r\n ${showCancel ? `<button class=\"ds-btn ${cancelClass}\" data-modal-cancel>${cancelText}</button>` : ''}\r\n ${showConfirm ? `<button class=\"ds-btn ${confirmClass}\" data-modal-confirm>${confirmText}</button>` : ''}\r\n </div>`;\r\n }\r\n }\r\n \r\n container.innerHTML = `\r\n <div class=\"ds-modal-mask\">\r\n <div class=\"ds-modal${fullscreen ? ' ds-modal--fullscreen' : ''}\" style=\"${!fullscreen ? 'max-width: ' + width : ''}\">\r\n <div class=\"ds-modal__header\">\r\n <span class=\"ds-modal__title\"></span>\r\n ${closable ? `<button class=\"ds-modal__close\" aria-label=\"Close\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M18 6L6 18M6 6l12 12\"/>\r\n </svg>\r\n </button>` : ''}\r\n </div>\r\n <div class=\"ds-modal__body\"></div>\r\n ${footerHTML}\r\n </div>\r\n </div>\r\n `;\r\n \r\n document.body.appendChild(container);\r\n \r\n const modal = new Modal(container, { fullscreen, closableOnMask: maskClosable });\r\n \r\n const titleEl = container.querySelector('.ds-modal__title');\r\n if (titleEl) titleEl.textContent = title;\r\n const bodyEl = container.querySelector('.ds-modal__body');\r\n if (bodyEl) {\r\n if (html) {\r\n bodyEl.innerHTML = content;\r\n } else {\r\n bodyEl.textContent = content;\r\n }\r\n }\r\n \r\n const confirmBtn = container.querySelector('[data-modal-confirm]');\r\n const cancelBtn = container.querySelector('[data-modal-cancel]');\r\n \r\n let isConfirming = false;\r\n \r\n const confirmHandler = async () => {\r\n if (onConfirm) {\r\n // Support async onConfirm\r\n confirmBtn.disabled = true;\r\n confirmBtn.classList.add('is-loading');\r\n try {\r\n const result = await onConfirm();\r\n if (result === false) {\r\n confirmBtn.disabled = false;\r\n confirmBtn.classList.remove('is-loading');\r\n return;\r\n }\r\n } catch(e) {\r\n confirmBtn.disabled = false;\r\n confirmBtn.classList.remove('is-loading');\r\n return;\r\n }\r\n }\r\n isConfirming = true;\r\n modal.close();\r\n };\r\n \r\n const cancelHandler = () => {\r\n if (onCancel) onCancel();\r\n modal.close();\r\n };\r\n \r\n if (confirmBtn) confirmBtn.addEventListener('click', confirmHandler);\r\n if (cancelBtn) cancelBtn.addEventListener('click', cancelHandler);\r\n \r\n const closeAndDestroy = () => {\r\n setTimeout(() => {\r\n if (confirmBtn) confirmBtn.removeEventListener('click', confirmHandler);\r\n if (cancelBtn) cancelBtn.removeEventListener('click', cancelHandler);\r\n modal.destroy();\r\n container.remove();\r\n if (onClose) onClose(isConfirming);\r\n }, 300);\r\n };\r\n \r\n const originalClose = modal.close.bind(modal);\r\n modal.close = () => {\r\n originalClose();\r\n closeAndDestroy();\r\n };\r\n \r\n modal.open();\r\n if (onOpen) setTimeout(() => onOpen(), 50);\r\n \r\n return modal;\r\n}\r\n\r\n// Convenience methods\r\nfunction confirmModal(options) {\r\n if (typeof options === 'string') {\r\n options = { content: options };\r\n }\r\n return createModal({\r\n ...options,\r\n showCancel: true,\r\n showConfirm: true\r\n });\r\n}\r\n\r\nfunction alertModal(options) {\r\n if (typeof options === 'string') {\r\n options = { content: options };\r\n }\r\n return createModal({\r\n ...options,\r\n showCancel: false,\r\n showConfirm: true\r\n });\r\n}\r\n\r\nfunction initModal(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const modal = new Modal(element);\r\n element.__kupolaInstance = modal;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupModal(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const modal = element.__kupolaInstance;\r\n modal.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initModals() {\r\n document.querySelectorAll('.ds-modal-container').forEach(container => {\r\n initModal(container);\r\n });\r\n}\r\n\r\nexport { Modal, initModals, initModal, cleanupModal, createModal, confirmModal, alertModal };\r\n\r\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, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"').replace(/'/g, ''');\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\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\r\n // Replace path params (:id -> value)\r\n for (const key in params) {\r\n url = url.replace(`:${key}`, encodeURIComponent(params[key]));\r\n }\r\n\r\n // Build query string\r\n const queryParts = [];\r\n for (const [k, v] of Object.entries(this.queryParams || {})) {\r\n queryParts.push(`${encodeURIComponent(k)}=${encodeURIComponent(v)}`);\r\n }\r\n for (const key in params) {\r\n if (!this.config.source.includes(`:${key}`)) {\r\n queryParts.push(`${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`);\r\n }\r\n }\r\n if (queryParts.length > 0) {\r\n url += (url.includes('?') ? '&' : '?') + queryParts.join('&');\r\n }\r\n\r\n const fetchOptions = {\r\n method: this.method.toUpperCase(),\r\n headers: { 'Content-Type': 'application/json', ...this.headers }\r\n };\r\n\r\n if (['POST', 'PUT', 'PATCH'].includes(fetchOptions.method)) {\r\n fetchOptions.body = JSON.stringify(params);\r\n }\r\n\r\n // Use configurable HTTP client (defaults to native fetch)\r\n const clientFetch = _httpClientFetch;\r\n if (!clientFetch) {\r\n throw new DependsError('No HTTP client available. Use configureHttpClient() to set one.', 'NO_HTTP_CLIENT');\r\n }\r\n\r\n const response = await clientFetch(url, fetchOptions);\r\n\r\n // Normalize response: support both native Response and adapter format\r\n const ok = typeof response.ok === 'boolean' ? response.ok : (response.status >= 200 && response.status < 300);\r\n const status = typeof response.status === 'number' ? response.status : 0;\r\n\r\n if (!ok) {\r\n throw new DependsError(`HTTP ${status}`, 'HTTP_ERROR');\r\n }\r\n\r\n // Support both .json() method and plain objects (for adapters that pre-parse)\r\n const data = typeof response.json === 'function'\r\n ? await response.json()\r\n : response.data !== undefined ? response.data : response;\r\n return data;\r\n }\r\n}\r\n\r\n// --- localStorage Source ---\r\nclass StorageSource extends DependsSource {\r\n constructor(config, cacheManager) {\r\n super(config, cacheManager);\r\n this.storageKey = config.source.replace('localStorage:', '');\r\n this.defaultValue = config.default;\r\n this.sync = config.sync !== false; // multi-tab sync by default\r\n\r\n if (this.sync && typeof window !== 'undefined') {\r\n this._storageHandler = (e) => {\r\n if (e.key === this.storageKey) {\r\n this.cache.delete(this.cacheKey);\r\n this.notify();\r\n }\r\n };\r\n window.addEventListener('storage', this._storageHandler);\r\n }\r\n }\r\n\r\n async fetch() {\r\n try {\r\n const value = localStorage.getItem(this.storageKey);\r\n if (value === null) return this.defaultValue;\r\n // Try to parse JSON\r\n try { return JSON.parse(value); } catch (_) { return value; }\r\n } catch (e) {\r\n return this.defaultValue;\r\n }\r\n }\r\n\r\n setValue(value) {\r\n const serialized = typeof value === 'string' ? value : JSON.stringify(value);\r\n localStorage.setItem(this.storageKey, serialized);\r\n this.cache.delete(this.cacheKey);\r\n this.notify();\r\n }\r\n\r\n destroy() {\r\n super.destroy();\r\n if (this._storageHandler) {\r\n window.removeEventListener('storage', this._storageHandler);\r\n }\r\n }\r\n}\r\n\r\n// --- Route Source ---\r\nclass RouteSource extends DependsSource {\r\n constructor(config, cacheManager) {\r\n super(config, cacheManager);\r\n this.paramName = config.source.replace('route:', '');\r\n }\r\n\r\n async fetch() {\r\n if (typeof window === 'undefined') return '';\r\n // Support both hash and history mode\r\n const hash = location.hash.slice(1);\r\n const match = hash.match(new RegExp(`/${this.paramName}/([^/]+)`));\r\n if (match) return decodeURIComponent(match[1]);\r\n\r\n // Fallback to search params\r\n const urlParams = new URLSearchParams(location.search);\r\n return urlParams.get(this.paramName) || '';\r\n }\r\n}\r\n\r\n// --- Function Source ---\r\nclass FunctionSource extends DependsSource {\r\n async fetch(params) {\r\n const result = await this.config.source(params);\r\n return result;\r\n }\r\n}\r\n\r\n// --- Static Source ---\r\nclass StaticSource extends DependsSource {\r\n async fetch() {\r\n return this.config.source;\r\n }\r\n}\r\n\r\n// --- WebSocket Source ---\r\nclass WebSocketSource extends DependsSource {\r\n constructor(config, cacheManager) {\r\n super(config, cacheManager);\r\n this.ws = null;\r\n this.reconnect = config.reconnect !== false;\r\n this.reconnectDelay = config.reconnectDelay || 3000;\r\n this._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","THEME_KEY","BRAND_KEY","BRAND_OPTIONS","getTheme","setTheme","theme","toggleBtn","icon","iconPath","getBrand","setBrand","brandId","brand","brandToggle","brandIcon","brandName","btn","initTheme","savedTheme","savedBrand","existingOnClick","newTheme","brandPicker","isHidden","closeBrandPicker","createThemeToggle","scripts","currentScript","scriptPath","createBrandPicker","container","closeBrandPickerAuto","ComponentInitializerRegistry","initFn","cleanupFn","cls","attr","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","kupolaBootstrap","registerComponent","registerLazyComponent","bootstrapComponents","defineMixin","useMixin","defineComponent","KupolaI18n","locale","htmlLang","source","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","o","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","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","queryParts","fetchOptions","clientFetch","response","ok","status","StorageSource","RouteSource","FunctionSource","StaticSource","WebSocketSource","createSource","useDeps","depsConfig","unsubscribers","getParams","_extractPropValues","depConfig","lastUpdated","_loadId","load","thisLoadId","unsubscribeSource","propKeys","useQuery","clearCache","KupolaTable","newVal","ck","row","col","flatData","pageData","children","va","cmp","sorted","wrapper","tableContainer","table","thead","tr","th","allKeys","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.esm.js","sources":["../js/kupola-lifecycle.js","../js/utils.js","../js/data-bind.js","../js/theme.js","../js/initializer.js","../js/component.js","../js/registry.js","../js/kupola-core.js","../js/i18n.js","../js/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 THEME_KEY = 'kupola-theme';\r\nconst BRAND_KEY = 'kupola-brand';\r\n\r\nconst BRAND_OPTIONS = [\r\n { id: 'green', name: '翠绿', color: '#32F08C' },\r\n { id: 'xionghuang', name: '雄黄', color: '#FF9900' },\r\n { id: 'jianghuang', name: '姜黄', color: '#E2C027' },\r\n { id: 'lanlv', name: '蓝绿', color: '#12A182' },\r\n { id: 'kongquelan', name: '孔雀蓝', color: '#0EB0C9' },\r\n { id: 'meiguizi', name: '玫瑰紫', color: '#BA2F7B' },\r\n { id: 'shihong', name: '柿红', color: '#F2481B' },\r\n { id: 'quhong', name: '紫云', color: '#B1A6CC' },\r\n { id: 'shanchahong', name: '山茶红', color: '#F05A46' },\r\n { id: 'zengqing', name: '曾青', color: '#535164' },\r\n { id: 'roulan', name: '柔蓝', color: '#106898' }\r\n];\r\n\r\nfunction getTheme() {\r\n return localStorage.getItem(THEME_KEY) || 'dark';\r\n}\r\n\r\nfunction setTheme(theme) {\r\n if (theme !== 'dark' && theme !== 'light') return;\r\n \r\n document.documentElement.setAttribute('data-theme', theme);\r\n localStorage.setItem(THEME_KEY, theme);\r\n \r\n const toggleBtn = document.querySelector('[data-theme-toggle]');\r\n if (toggleBtn) {\r\n toggleBtn.setAttribute('data-current-theme', theme);\r\n const icon = toggleBtn.querySelector('.theme-icon');\r\n if (icon) {\r\n const iconPath = icon.src.substring(0, icon.src.lastIndexOf('/') + 1);\r\n icon.src = theme === 'dark' \r\n ? iconPath + 'sun.svg' \r\n : iconPath + 'moon.svg';\r\n }\r\n }\r\n}\r\n\r\nfunction getBrand() {\r\n return localStorage.getItem(BRAND_KEY) || 'zengqing';\r\n}\r\n\r\nfunction setBrand(brandId) {\r\n const brand = BRAND_OPTIONS.find(b => b.id === brandId);\r\n if (!brand) return;\r\n \r\n document.documentElement.setAttribute('data-brand', brandId);\r\n localStorage.setItem(BRAND_KEY, brandId);\r\n \r\n const brandToggle = document.querySelector('[data-brand-toggle]');\r\n if (brandToggle) {\r\n brandToggle.setAttribute('data-current-brand', brandId);\r\n const brandIcon = brandToggle.querySelector('.brand-icon');\r\n if (brandIcon) {\r\n brandIcon.style.backgroundColor = brand.color;\r\n }\r\n const brandName = brandToggle.querySelector('.brand-name');\r\n if (brandName) {\r\n brandName.textContent = brand.name;\r\n }\r\n }\r\n \r\n const brandButtons = document.querySelectorAll('[data-brand-btn]');\r\n brandButtons.forEach(btn => {\r\n if (btn.getAttribute('data-brand-btn') === brandId) {\r\n btn.classList.add('is-active');\r\n } else {\r\n btn.classList.remove('is-active');\r\n }\r\n });\r\n}\r\n\r\nfunction updateThemeIcon(toggleBtn) {\r\n const iconEl = toggleBtn.querySelector('.theme-icon');\r\n if (iconEl) {\r\n const currentTheme = getTheme();\r\n iconEl.src = currentTheme === 'dark' ? '/icons/sun.svg' : '/icons/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 scripts = document.getElementsByTagName('script');\r\n const currentScript = scripts[scripts.length - 1];\r\n const scriptPath = currentScript.src.substring(0, currentScript.src.lastIndexOf('/') + 1);\r\n icon.src = getTheme() === 'dark' \r\n ? scriptPath + '../icons/sun.svg' \r\n : scriptPath + '../icons/moon.svg';\r\n icon.width = 14;\r\n icon.height = 14;\r\n icon.alt = 'Toggle theme';\r\n \r\n btn.appendChild(icon);\r\n document.body.appendChild(btn);\r\n \r\n btn.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};","/**\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\n\r\nlet kupolaRegistry = null;\r\n\r\nif (typeof window !== 'undefined') {\r\n kupolaRegistry = new KupolaComponentRegistry();\r\n}\r\n\r\n/** Bootstrap the Kupola component system (data binding, theme, component discovery). */\r\nasync function kupolaBootstrap() {\r\n if (typeof window !== 'undefined') {\r\n // Load persisted data and bind data-bind elements\r\n kupolaData.loadPersisted();\r\n kupolaData.bind();\r\n // Initialize theme\r\n initTheme();\r\n // Initialize function-based components first\r\n await kupolaInitializer.initializeAll();\r\n // Then bootstrap class-based components\r\n if (kupolaRegistry) {\r\n await kupolaRegistry.bootstrap();\r\n }\r\n }\r\n}\r\n\r\nif (typeof document !== 'undefined' && document.readyState === 'loading') {\r\n document.addEventListener('DOMContentLoaded', kupolaBootstrap);\r\n} else if (typeof window !== 'undefined') {\r\n setTimeout(kupolaBootstrap, 0);\r\n}\r\n\r\n/** Register a class-based component. */\r\nfunction registerComponent(name, componentClass) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.register(name, componentClass);\r\n }\r\n}\r\n\r\n/** Register a lazy-loaded component (loaded on first use). */\r\nfunction registerLazyComponent(name, loader) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.registerLazy(name, loader);\r\n }\r\n}\r\n\r\n/** Manually bootstrap components within a specific root element. */\r\nfunction bootstrapComponents(root) {\r\n if (kupolaRegistry) {\r\n return kupolaRegistry.bootstrap(root);\r\n }\r\n return Promise.resolve();\r\n}\r\n\r\n/** Define a reusable mixin for component classes. */\r\nfunction defineMixin(name, mixin) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.defineMixin(name, mixin);\r\n }\r\n}\r\n\r\n/** Apply named mixins to a component class. */\r\nfunction useMixin(componentClass, ...mixinNames) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.useMixin(componentClass, ...mixinNames);\r\n }\r\n}\r\n\r\n/**\r\n * Unified component registration API.\r\n * @param {string} name - Component name\r\n * @param {object} options\r\n * @param {Function} [options.init] - Init function (for function-based components)\r\n * @param {Function} [options.cleanup] - Cleanup function\r\n * @param {Function} [options.componentClass] - Component class (for class-based components)\r\n * @param {Function} [options.lazy] - Lazy loader function\r\n * @param {string} [options.dataAttribute] - Custom data attribute (e.g. 'data-my-component')\r\n * @param {string} [options.cssClass] - CSS class selector (e.g. 'ds-my-component')\r\n */\r\nfunction defineComponent(name, options) {\r\n if (!options || typeof options !== 'object') {\r\n throw new Error(`defineComponent(\"${name}\"): options must be an object`);\r\n }\r\n // Register with registry (class or lazy)\r\n if (options.componentClass) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.register(name, options.componentClass);\r\n }\r\n } else if (options.lazy) {\r\n if (kupolaRegistry) {\r\n kupolaRegistry.registerLazy(name, options.lazy);\r\n }\r\n }\r\n // Register with initializer (function-based)\r\n if (options.init) {\r\n kupolaInitializer.register(name, options.init, options.cleanup || null, {\r\n dataAttribute: options.dataAttribute,\r\n cssClass: options.cssClass\r\n });\r\n } else if (options.dataAttribute || options.cssClass) {\r\n // Even without init, register selectors so MutationObserver can find them\r\n kupolaInitializer.register(name, () => {}, null, {\r\n dataAttribute: options.dataAttribute,\r\n cssClass: options.cssClass\r\n });\r\n }\r\n}\r\n\r\nexport {\r\n KupolaComponent,\r\n applyMixin,\r\n KupolaComponentRegistry,\r\n KupolaLifecycle,\r\n kupolaRegistry,\r\n kupolaInitializer,\r\n kupolaBootstrap,\r\n registerComponent,\r\n registerLazyComponent,\r\n bootstrapComponents,\r\n defineMixin,\r\n useMixin,\r\n defineComponent\r\n};","class KupolaI18n {\r\n constructor(options = {}) {\r\n this.locales = options.locales || {};\r\n this.currentLocale = options.defaultLocale || 'zh-CN';\r\n this.fallbackLocale = options.fallbackLocale || 'zh-CN';\r\n this.delimiter = options.delimiter || '.';\r\n this.missingHandler = options.missingHandler || ((key) => {\r\n console.warn(`Missing translation: ${key}`);\r\n return key;\r\n });\r\n \r\n this._initFromDOM();\r\n }\r\n\r\n _initFromDOM() {\r\n const scriptTags = document.querySelectorAll('script[type=\"application/json\"][data-kupola-i18n]');\r\n scriptTags.forEach(script => {\r\n const locale = script.dataset.kupolaI18n;\r\n if (locale) {\r\n try {\r\n const data = JSON.parse(script.textContent);\r\n this.addLocale(locale, data);\r\n } catch (e) {\r\n console.error('Failed to parse i18n data:', e);\r\n }\r\n }\r\n });\r\n\r\n const htmlLang = document.documentElement.lang;\r\n if (htmlLang && this.locales[htmlLang]) {\r\n this.currentLocale = htmlLang;\r\n }\r\n }\r\n\r\n addLocale(locale, data) {\r\n if (!this.locales[locale]) {\r\n this.locales[locale] = {};\r\n }\r\n this._mergeDeep(this.locales[locale], data);\r\n }\r\n\r\n _mergeDeep(target, source) {\r\n for (const key of Object.keys(source)) {\r\n if (source[key] instanceof Object && key in target) {\r\n this._mergeDeep(target[key], source[key]);\r\n } else {\r\n target[key] = source[key];\r\n }\r\n }\r\n }\r\n\r\n setLocale(locale) {\r\n if (this.locales[locale]) {\r\n this.currentLocale = locale;\r\n document.documentElement.lang = locale;\r\n this._emitChange();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n getLocale() {\r\n return this.currentLocale;\r\n }\r\n\r\n t(key, params = {}) {\r\n let value = this._getTranslation(key, this.currentLocale);\r\n \r\n if (!value) {\r\n value = this._getTranslation(key, this.fallbackLocale);\r\n }\r\n \r\n if (!value) {\r\n return this.missingHandler(key);\r\n }\r\n \r\n return this._interpolate(value, params);\r\n }\r\n\r\n _getTranslation(key, locale) {\r\n if (!this.locales[locale]) return null;\r\n \r\n const keys = key.split(this.delimiter);\r\n let value = this.locales[locale];\r\n \r\n for (const k of keys) {\r\n if (value && typeof value === 'object' && k in value) {\r\n value = value[k];\r\n } else {\r\n return null;\r\n }\r\n }\r\n \r\n return typeof value === 'string' ? value : null;\r\n }\r\n\r\n _interpolate(str, params) {\r\n return str.replace(/\\{(\\w+)\\}/g, (match, key) => {\r\n return params[key] !== undefined ? params[key] : match;\r\n });\r\n }\r\n\r\n n(key, count, params = {}) {\r\n const value = this.t(key, { ...params, count });\r\n \r\n if (!value) return value;\r\n \r\n const parts = value.split('|');\r\n \r\n if (parts.length === 1) {\r\n return value.replace('{count}', count);\r\n }\r\n \r\n if (parts.length === 2) {\r\n return count === 1 ? parts[0] : parts[1];\r\n }\r\n \r\n if (parts.length >= 3) {\r\n if (count === 0) return parts[0];\r\n if (count === 1) return parts[1];\r\n return parts[2];\r\n }\r\n \r\n return value;\r\n }\r\n\r\n _emitChange() {\r\n const event = new CustomEvent('kupola:i18n:change', {\r\n detail: { locale: this.currentLocale },\r\n bubbles: true\r\n });\r\n document.dispatchEvent(event);\r\n }\r\n\r\n async loadLocale(locale, url) {\r\n try {\r\n const response = await fetch(url);\r\n const data = await response.json();\r\n this.addLocale(locale, data);\r\n return true;\r\n } catch (error) {\r\n console.error('Failed to load locale:', error);\r\n return false;\r\n }\r\n }\r\n\r\n getAvailableLocales() {\r\n return Object.keys(this.locales);\r\n }\r\n\r\n hasLocale(locale) {\r\n return !!this.locales[locale];\r\n }\r\n\r\n formatDate(date, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n const dateObj = typeof date === 'string' ? new Date(date) : date;\r\n \r\n return new Intl.DateTimeFormat(locale, options).format(dateObj);\r\n }\r\n\r\n formatNumber(number, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n \r\n return new Intl.NumberFormat(locale, options).format(number);\r\n }\r\n\r\n formatCurrency(number, currency, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n \r\n return new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currency,\r\n ...options\r\n }).format(number);\r\n }\r\n\r\n formatRelativeTime(value, unit, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n \r\n return new Intl.RelativeTimeFormat(locale, options).format(value, unit);\r\n }\r\n}\r\n\r\nconst kupolaI18n = new KupolaI18n();\r\n\r\nfunction createI18n(options) {\r\n return new KupolaI18n(options);\r\n}\r\n\r\nfunction t(key, params = {}) {\r\n return kupolaI18n.t(key, params);\r\n}\r\n\r\nfunction n(key, count, params = {}) {\r\n return kupolaI18n.n(key, count, params);\r\n}\r\n\r\nfunction setLocale(locale) {\r\n return kupolaI18n.setLocale(locale);\r\n}\r\n\r\nfunction getLocale() {\r\n return kupolaI18n.getLocale();\r\n}\r\n\r\nfunction formatDate(date, options = {}) {\r\n return kupolaI18n.formatDate(date, options);\r\n}\r\n\r\nfunction formatNumber(number, options = {}) {\r\n return kupolaI18n.formatNumber(number, options);\r\n}\r\n\r\nfunction formatCurrency(number, currency, options = {}) {\r\n return kupolaI18n.formatCurrency(number, currency, options);\r\n}\r\n\r\nexport { \r\n KupolaI18n, kupolaI18n, createI18n, \r\n t, n, setLocale, getLocale,\r\n formatDate, formatNumber, formatCurrency \r\n};","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\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 } = options;\r\n \r\n const container = document.createElement('div');\r\n container.className = 'ds-modal-container';\r\n \r\n let footerHTML = '';\r\n if (footer !== null) {\r\n if (typeof footer === 'string') {\r\n footerHTML = `<div class=\"ds-modal__footer\">${footer}</div>`;\r\n } else if (showConfirm || showCancel) {\r\n footerHTML = `<div class=\"ds-modal__footer\">\r\n ${showCancel ? `<button class=\"ds-btn ${cancelClass}\" data-modal-cancel>${cancelText}</button>` : ''}\r\n ${showConfirm ? `<button class=\"ds-btn ${confirmClass}\" data-modal-confirm>${confirmText}</button>` : ''}\r\n </div>`;\r\n }\r\n }\r\n \r\n container.innerHTML = `\r\n <div class=\"ds-modal-mask\">\r\n <div class=\"ds-modal${fullscreen ? ' ds-modal--fullscreen' : ''}\" style=\"${!fullscreen ? 'max-width: ' + width : ''}\">\r\n <div class=\"ds-modal__header\">\r\n <span class=\"ds-modal__title\"></span>\r\n ${closable ? `<button class=\"ds-modal__close\" aria-label=\"Close\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M18 6L6 18M6 6l12 12\"/>\r\n </svg>\r\n </button>` : ''}\r\n </div>\r\n <div class=\"ds-modal__body\"></div>\r\n ${footerHTML}\r\n </div>\r\n </div>\r\n `;\r\n \r\n document.body.appendChild(container);\r\n \r\n const modal = new Modal(container, { fullscreen, closableOnMask: maskClosable });\r\n \r\n const titleEl = container.querySelector('.ds-modal__title');\r\n if (titleEl) titleEl.textContent = title;\r\n const bodyEl = container.querySelector('.ds-modal__body');\r\n if (bodyEl) {\r\n if (html) {\r\n bodyEl.innerHTML = content;\r\n } else {\r\n bodyEl.textContent = content;\r\n }\r\n }\r\n \r\n const confirmBtn = container.querySelector('[data-modal-confirm]');\r\n const cancelBtn = container.querySelector('[data-modal-cancel]');\r\n \r\n let isConfirming = false;\r\n \r\n const confirmHandler = async () => {\r\n if (onConfirm) {\r\n // Support async onConfirm\r\n confirmBtn.disabled = true;\r\n confirmBtn.classList.add('is-loading');\r\n try {\r\n const result = await onConfirm();\r\n if (result === false) {\r\n confirmBtn.disabled = false;\r\n confirmBtn.classList.remove('is-loading');\r\n return;\r\n }\r\n } catch(e) {\r\n confirmBtn.disabled = false;\r\n confirmBtn.classList.remove('is-loading');\r\n return;\r\n }\r\n }\r\n isConfirming = true;\r\n modal.close();\r\n };\r\n \r\n const cancelHandler = () => {\r\n if (onCancel) onCancel();\r\n modal.close();\r\n };\r\n \r\n if (confirmBtn) confirmBtn.addEventListener('click', confirmHandler);\r\n if (cancelBtn) cancelBtn.addEventListener('click', cancelHandler);\r\n \r\n const closeAndDestroy = () => {\r\n setTimeout(() => {\r\n if (confirmBtn) confirmBtn.removeEventListener('click', confirmHandler);\r\n if (cancelBtn) cancelBtn.removeEventListener('click', cancelHandler);\r\n modal.destroy();\r\n container.remove();\r\n if (onClose) onClose(isConfirming);\r\n }, 300);\r\n };\r\n \r\n const originalClose = modal.close.bind(modal);\r\n modal.close = () => {\r\n originalClose();\r\n closeAndDestroy();\r\n };\r\n \r\n modal.open();\r\n if (onOpen) setTimeout(() => onOpen(), 50);\r\n \r\n return modal;\r\n}\r\n\r\n// Convenience methods\r\nfunction confirmModal(options) {\r\n if (typeof options === 'string') {\r\n options = { content: options };\r\n }\r\n return createModal({\r\n ...options,\r\n showCancel: true,\r\n showConfirm: true\r\n });\r\n}\r\n\r\nfunction alertModal(options) {\r\n if (typeof options === 'string') {\r\n options = { content: options };\r\n }\r\n return createModal({\r\n ...options,\r\n showCancel: false,\r\n showConfirm: true\r\n });\r\n}\r\n\r\nfunction initModal(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const modal = new Modal(element);\r\n element.__kupolaInstance = modal;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupModal(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const modal = element.__kupolaInstance;\r\n modal.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initModals() {\r\n document.querySelectorAll('.ds-modal-container').forEach(container => {\r\n initModal(container);\r\n });\r\n}\r\n\r\nexport { Modal, initModals, initModal, cleanupModal, createModal, confirmModal, alertModal };\r\n\r\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, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"').replace(/'/g, ''');\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\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\r\n // Replace path params (:id -> value)\r\n for (const key in params) {\r\n url = url.replace(`:${key}`, encodeURIComponent(params[key]));\r\n }\r\n\r\n // Build query string\r\n const queryParts = [];\r\n for (const [k, v] of Object.entries(this.queryParams || {})) {\r\n queryParts.push(`${encodeURIComponent(k)}=${encodeURIComponent(v)}`);\r\n }\r\n for (const key in params) {\r\n if (!this.config.source.includes(`:${key}`)) {\r\n queryParts.push(`${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`);\r\n }\r\n }\r\n if (queryParts.length > 0) {\r\n url += (url.includes('?') ? '&' : '?') + queryParts.join('&');\r\n }\r\n\r\n const fetchOptions = {\r\n method: this.method.toUpperCase(),\r\n headers: { 'Content-Type': 'application/json', ...this.headers }\r\n };\r\n\r\n if (['POST', 'PUT', 'PATCH'].includes(fetchOptions.method)) {\r\n fetchOptions.body = JSON.stringify(params);\r\n }\r\n\r\n // Use configurable HTTP client (defaults to native fetch)\r\n const clientFetch = _httpClientFetch;\r\n if (!clientFetch) {\r\n throw new DependsError('No HTTP client available. Use configureHttpClient() to set one.', 'NO_HTTP_CLIENT');\r\n }\r\n\r\n const response = await clientFetch(url, fetchOptions);\r\n\r\n // Normalize response: support both native Response and adapter format\r\n const ok = typeof response.ok === 'boolean' ? response.ok : (response.status >= 200 && response.status < 300);\r\n const status = typeof response.status === 'number' ? response.status : 0;\r\n\r\n if (!ok) {\r\n throw new DependsError(`HTTP ${status}`, 'HTTP_ERROR');\r\n }\r\n\r\n // Support both .json() method and plain objects (for adapters that pre-parse)\r\n const data = typeof response.json === 'function'\r\n ? await response.json()\r\n : response.data !== undefined ? response.data : response;\r\n return data;\r\n }\r\n}\r\n\r\n// --- localStorage Source ---\r\nclass StorageSource extends DependsSource {\r\n constructor(config, cacheManager) {\r\n super(config, cacheManager);\r\n this.storageKey = config.source.replace('localStorage:', '');\r\n this.defaultValue = config.default;\r\n this.sync = config.sync !== false; // multi-tab sync by default\r\n\r\n if (this.sync && typeof window !== 'undefined') {\r\n this._storageHandler = (e) => {\r\n if (e.key === this.storageKey) {\r\n this.cache.delete(this.cacheKey);\r\n this.notify();\r\n }\r\n };\r\n window.addEventListener('storage', this._storageHandler);\r\n }\r\n }\r\n\r\n async fetch() {\r\n try {\r\n const value = localStorage.getItem(this.storageKey);\r\n if (value === null) return this.defaultValue;\r\n // Try to parse JSON\r\n try { return JSON.parse(value); } catch (_) { return value; }\r\n } catch (e) {\r\n return this.defaultValue;\r\n }\r\n }\r\n\r\n setValue(value) {\r\n const serialized = typeof value === 'string' ? value : JSON.stringify(value);\r\n localStorage.setItem(this.storageKey, serialized);\r\n this.cache.delete(this.cacheKey);\r\n this.notify();\r\n }\r\n\r\n destroy() {\r\n super.destroy();\r\n if (this._storageHandler) {\r\n window.removeEventListener('storage', this._storageHandler);\r\n }\r\n }\r\n}\r\n\r\n// --- Route Source ---\r\nclass RouteSource extends DependsSource {\r\n constructor(config, cacheManager) {\r\n super(config, cacheManager);\r\n this.paramName = config.source.replace('route:', '');\r\n }\r\n\r\n async fetch() {\r\n if (typeof window === 'undefined') return '';\r\n // Support both hash and history mode\r\n const hash = location.hash.slice(1);\r\n const match = hash.match(new RegExp(`/${this.paramName}/([^/]+)`));\r\n if (match) return decodeURIComponent(match[1]);\r\n\r\n // Fallback to search params\r\n const urlParams = new URLSearchParams(location.search);\r\n return urlParams.get(this.paramName) || '';\r\n }\r\n}\r\n\r\n// --- Function Source ---\r\nclass FunctionSource extends DependsSource {\r\n async fetch(params) {\r\n const result = await this.config.source(params);\r\n return result;\r\n }\r\n}\r\n\r\n// --- Static Source ---\r\nclass StaticSource extends DependsSource {\r\n async fetch() {\r\n return this.config.source;\r\n }\r\n}\r\n\r\n// --- WebSocket Source ---\r\nclass WebSocketSource extends DependsSource {\r\n constructor(config, cacheManager) {\r\n super(config, cacheManager);\r\n this.ws = null;\r\n this.reconnect = config.reconnect !== false;\r\n this.reconnectDelay = config.reconnectDelay || 3000;\r\n this._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","THEME_KEY","BRAND_KEY","BRAND_OPTIONS","getTheme","setTheme","theme","toggleBtn","icon","iconPath","getBrand","setBrand","brandId","brand","brandToggle","brandIcon","brandName","btn","updateThemeIcon","iconEl","currentTheme","initTheme","savedTheme","savedBrand","existingOnClick","newTheme","brandPicker","isHidden","closeBrandPicker","createThemeToggle","scripts","currentScript","scriptPath","createBrandPicker","container","closeBrandPickerAuto","ComponentInitializerRegistry","initFn","cleanupFn","cls","attr","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","kupolaBootstrap","registerComponent","registerLazyComponent","bootstrapComponents","defineMixin","useMixin","defineComponent","KupolaI18n","locale","htmlLang","source","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","o","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","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","queryParts","fetchOptions","clientFetch","response","ok","status","StorageSource","RouteSource","FunctionSource","StaticSource","WebSocketSource","createSource","useDeps","depsConfig","unsubscribers","getParams","_extractPropValues","depConfig","lastUpdated","_loadId","load","thisLoadId","unsubscribeSource","propKeys","useQuery","clearCache","KupolaTable","newVal","ck","row","col","flatData","pageData","children","va","cmp","sorted","wrapper","tableContainer","table","thead","tr","th","allKeys","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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"}
|