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