@alekstar79/draggable-resizable-container 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/utils/Notifications.ts","../src/utils/ContainerInitializer.ts","../src/utils/ContentCreator.ts","../src/utils/StatsManager.ts","../node_modules/@alekstar79/template-loader/dist/index.es.js","../src/utils/TemplateLoader.ts","../src/utils/BoundaryTracker.ts","../src/utils/helpers.ts","../src/core/ContainerManager.ts","../src/plugins/SnappingPlugin.ts","../src/plugins/EdgeDockingPlugin.ts","../src/plugins/StatePersistencePlugin.ts","../src/plugins/LoggingPlugin.ts","../src/demo/templates/media.html?raw","../src/demo/templates/stats.html?raw","../src/demo/templates/tasks.html?raw"],"sourcesContent":["// src/utils/notifications.ts\n\n/**\n * Notification system for displaying toast messages\n * Adapted for TypeScript with improved functionality\n */\nexport class NotificationSystem\n{\n private container: HTMLElement\n\n constructor(container?: HTMLElement)\n {\n this.container = container || this.createContainer()\n }\n\n /**\n * Create notifications container\n */\n private createContainer(): HTMLElement\n {\n const existingContainer = document.querySelector('.notifications') as HTMLElement\n if (existingContainer) {\n return existingContainer\n }\n\n const container = document.createElement('div')\n container.className = 'notifications'\n document.body.appendChild(container)\n return container\n }\n\n /**\n * Show notification toast\n */\n show(text: string, type: 'success' | 'error' | 'warning' | 'info' = 'info'): void\n {\n const toast = document.createElement('li')\n const remove = this.removeToast.bind(this, toast)\n\n toast.innerHTML = this.getToastHTML(text, type)\n toast.className = `toast ${type}`;\n\n (toast as any).timeoutId = window.setTimeout(remove, 4000)\n\n const closeIcon = toast.querySelector('.icon')\n if (closeIcon) {\n closeIcon.addEventListener('click', remove)\n }\n\n // Add new toast to the bottom of the container\n this.container.appendChild(toast)\n }\n\n /**\n * Generate toast HTML based on type\n */\n private getToastHTML(text: string, type: 'success' | 'error' | 'warning' | 'info'): string\n {\n const icons = {\n success: 'fa-circle-check',\n error: 'fa-circle-xmark',\n warning: 'fa-triangle-exclamation',\n info: 'fa-circle-info'\n }\n\n return `\n <div class=\"column\">\n <i class=\"fa-solid ${icons[type]}\"></i>\n <span>${text}</span>\n </div>\n <i class=\"icon fa-solid fa-xmark\"></i>\n `\n }\n\n /**\n * Remove toast with animation\n */\n private removeToast(toast: HTMLLIElement): void\n {\n toast.classList.add('hide')\n\n // Use any for timeoutId property\n if ((toast as any).timeoutId) {\n clearTimeout((toast as any).timeoutId)\n }\n\n setTimeout(() => {\n if (toast.parentNode) {\n toast.parentNode.removeChild(toast)\n }\n }, 300)\n }\n\n /**\n * Clear all notifications\n */\n clear(): void\n {\n while (this.container.firstChild) {\n this.container.removeChild(this.container.firstChild)\n }\n }\n}\n\n// Default instance for convenience\nexport const defaultNotificationSystem = new NotificationSystem()\n","// src/utils/ContainerInitializer.ts\n\n/**\n * Utility for proper container initialization and state synchronization\n */\nexport class ContainerInitializer\n{\n /**\n * Create container element with proper initialization\n */\n static createContainerElement(\n width: number,\n height: number,\n x?: number,\n y?: number,\n color?: string\n ): HTMLElement {\n const container = document.createElement('div')\n container.className = 'container advanced-container new'\n\n container.style.position = 'absolute'\n container.style.width = `${width}px`\n container.style.height = `${height}px`\n\n if (x !== undefined) container.style.left = `${x}px`\n if (y !== undefined) container.style.top = `${y}px`\n if (color) container.style.borderColor = color\n\n return container\n }\n}\n","import { TemplateLoader } from './index'\n\n/**\n * Content creator utility for flexible content handling\n * Supports strings, DOM elements, and template loading\n */\nexport class ContentCreator\n{\n private templateLoader: TemplateLoader\n\n constructor(templateLoader: TemplateLoader)\n {\n this.templateLoader = templateLoader\n }\n\n /**\n * Create content from various sources\n * @param content - String, HTMLElement, or template name\n * @param container - Container element to append content to\n */\n async createContent(\n content: string | HTMLElement | { template: string },\n container: HTMLElement\n ): Promise<HTMLElement> {\n try {\n // Checking if the container is already container-content\n const isAlreadyContentContainer = container.classList.contains('container-content')\n\n // Find or create a target element for your content\n let targetElement: HTMLElement\n\n if (isAlreadyContentContainer) {\n // If the container is already a container-content, use it directly\n targetElement = container\n } else {\n // Searching for existing container-content inside a container\n targetElement = container.querySelector('.container-content') as HTMLElement\n\n if (!targetElement) {\n targetElement = document.createElement('div')\n targetElement.className = 'container-content'\n container.appendChild(targetElement)\n }\n }\n\n targetElement.innerHTML = ''\n\n if (typeof content === 'string') {\n // String content\n targetElement.innerHTML = content\n } else if (content instanceof HTMLElement) {\n // DOM element\n targetElement.appendChild(content)\n } else if (content.template) {\n // Template content\n try {\n targetElement.innerHTML = await this.templateLoader.loadTemplate(content.template)\n } catch (error) {\n console.error(`[ContentCreator] Failed to load template: ${content.template}`, error)\n targetElement.innerHTML = `<div class=\"template-error\">Failed to load template: ${content.template}</div>`\n }\n }\n\n return targetElement\n } catch (error) {\n console.error('[ContentCreator] Error creating content:', error)\n throw error\n }\n }\n\n /**\n * Set template loader instance\n */\n setTemplateLoader(loader: TemplateLoader): void\n {\n this.templateLoader = loader\n }\n}\n","// src/utils/statsManager.ts\n\nimport type { DirectionMode } from '../core/types'\n\n/**\n * Interface for container statistics\n */\nexport interface ContainerStats {\n activeBlock: string\n lock: 'opened' | 'locked'\n direction: DirectionMode\n step?: number\n hasSnapping: boolean\n}\n\n/**\n * Interface for global statistics\n */\nexport interface GlobalStats {\n containerCount: number\n contentTypes: string\n pinnedMode: string\n snappingCount: number\n}\n\n/**\n * Statistics manager for handling both global and per-container stats\n */\nexport class StatsManager\n{\n private globalStatsElement: HTMLElement | null = null\n\n /**\n * Initialize stats manager\n */\n initialize(globalStatsElement: HTMLElement): void\n {\n this.globalStatsElement = globalStatsElement\n }\n\n /**\n * Show container-specific statistics\n */\n showContainerStats(containerStats: ContainerStats): void\n {\n if (!this.globalStatsElement) return\n\n this.updateStatsPanel(this.generateContainerStatsHTML(containerStats))\n }\n\n /**\n * Show global statistics\n */\n showGlobalStats(globalStats: GlobalStats): void\n {\n if (!this.globalStatsElement) return\n\n this.updateStatsPanel(this.generateGlobalStatsHTML(globalStats))\n }\n\n /**\n * Generate HTML for container statistics\n */\n private generateContainerStatsHTML(stats: ContainerStats): string\n {\n const stepDisplay = stats.hasSnapping && stats.step !== undefined\n ? `<div class=\"stat-item\">\n <span class=\"stat-label\">Step:</span>\n <span class=\"stat-value\">${stats.step}</span>\n </div>`\n : ''\n\n return `\n <h4>Block Stats</h4>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Active Block:</span>\n <span class=\"stat-value\">${stats.activeBlock}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Lock:</span>\n <span class=\"stat-value\">${stats.lock}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Direction:</span>\n <span class=\"stat-value\">${stats.direction}</span>\n </div>\n ${stepDisplay}`\n }\n\n /**\n * Generate HTML for global statistics\n */\n private generateGlobalStatsHTML(stats: GlobalStats): string\n {\n return `\n <h4>Global Stats</h4>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Containers:</span>\n <span class=\"stat-value\">${stats.containerCount}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Content Types:</span>\n <span class=\"stat-value\">${stats.contentTypes}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Pinned Mode:</span>\n <span class=\"stat-value\">${stats.pinnedMode}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">With Snapping:</span>\n <span class=\"stat-value\">${stats.snappingCount}</span>\n </div>`\n }\n\n /**\n * Update stats panel with new HTML content\n */\n private updateStatsPanel(html: string): void\n {\n if (this.globalStatsElement) {\n this.globalStatsElement.innerHTML = html\n }\n }\n}\n","var t=Object.defineProperty,e=(e,r,s)=>r in e?t(e,r,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[r]=s,r=(t,r,s)=>e(t,\"symbol\"!=typeof r?r+\"\":r,s);class s{constructor(){r(this,\"templates\",new Map),r(this,\"lastUpdated\",new Map)}register(t){if(!t.name.trim())throw new Error(\"Template name cannot be empty\");this.templates.set(t.name,t),this.lastUpdated.set(t.name,Date.now())}async registerBulk(t){for(const[e,r]of Object.entries(t))this.register({name:e,source:r})}get(t){return this.templates.get(t)}has(t){return this.templates.has(t)}remove(t){this.templates.delete(t),this.lastUpdated.delete(t)}list(){return Array.from(this.templates.keys())}clear(){this.templates.clear(),this.lastUpdated.clear()}getMetadata(t){return this.templates.get(t)?.metadata}}class a{constructor(t=36e5){r(this,\"cache\",new Map),r(this,\"ttl\"),this.ttl=t}set(t,e){this.cache.set(t,{content:e,timestamp:Date.now()})}get(t){const e=this.cache.get(t);return e?this.ttl<=0||Date.now()-e.timestamp>this.ttl?(this.cache.delete(t),null):e.content:null}has(t){return null!==this.get(t)}clear(){this.cache.clear()}size(){return this.cache.size}}class i{constructor(t,e={}){r(this,\"cache\"),r(this,\"config\"),r(this,\"metrics\"),r(this,\"retryQueue\",new Map),r(this,\"registry\"),this.registry=t??new s,this.cache=new a(e?.cacheTTL),this.config=this.normalizeConfig(e),this.metrics={totalLoads:0,totalHits:0,totalMisses:0,totalErrors:0,averageLoadTime:0,cacheHitRate:0}}normalizeConfig(t={}){const e=t||{};return{environment:\"auto\"===e.environment?typeof process<\"u\"&&\"production\"===process.env?.NODE_ENV?\"production\":\"development\":e.environment??\"development\",cache:e.cache??!0,cacheTTL:e.cacheTTL??36e5,enableMetrics:e.enableMetrics??!0,onError:e.onError??(()=>{}),onWarn:e.onWarn??(()=>{}),fallbackTemplate:e.fallbackTemplate??'<div class=\"template-error\">Template load failed</div>'}}async loadTemplate(t,e=2){const r=performance.now(),s=this.retryQueue.get(t)??0;if(this.metrics.totalLoads++,this.config.cache){const e=this.cache.get(t);if(e)return this.metrics.totalHits++,this.updateCacheHitRate(),e}this.metrics.totalMisses++;const a=this.registry.get(t);if(!a){const e=this.createError(`Template \"${t}\" not found. Available: ${this.registry.list().join(\", \")}`,t,s);return this.metrics.totalErrors++,this.config.onError(e),this.config.fallbackTemplate}try{let e=\"function\"==typeof a.source?await a.source():a.source;if(\"string\"!=typeof e){const r=this.createError(\"Template source must return a string, got \"+typeof e,t,s);return this.metrics.totalErrors++,this.config.onError(r),this.config.fallbackTemplate}return this.config.cache&&this.cache.set(t,e),this.retryQueue.delete(t),this.recordLoadTime(r),e}catch(r){const a=r instanceof Error?r:new Error(String(r));if(s<e)return this.retryQueue.set(t,s+1),this.config.onWarn(`Retrying template \"${t}\" (attempt ${s+1}/${e})`),await new Promise(t=>setTimeout(t,100*Math.pow(2,s))),this.loadTemplate(t,e);const i=this.createError(`Failed to load template \"${t}\": ${a.message}`,t,s);return this.metrics.totalErrors++,this.config.onError(i),this.retryQueue.delete(t),this.config.fallbackTemplate}}async loadTemplates(t){const e={};return await Promise.all(t.map(async t=>{e[t]=await this.loadTemplate(t)})),e}getMetrics(){return{...this.metrics}}clearCache(){this.cache.clear()}resetMetrics(){this.metrics={totalLoads:0,totalHits:0,totalMisses:0,totalErrors:0,averageLoadTime:0,cacheHitRate:0}}has(t){return this.registry.has(t)}list(){return this.registry.list()}info(t){return this.registry.get(t)}createError(t,e,r){return Object.assign(new Error(t),{name:\"TemplateLoadError\",templateName:e,timestamp:new Date,retryCount:r})}recordLoadTime(t){if(this.config.enableMetrics){const e=performance.now()-t,r=this.metrics.averageLoadTime*(this.metrics.totalLoads-1)+e;this.metrics.averageLoadTime=r/this.metrics.totalLoads}}updateCacheHitRate(){this.config.enableMetrics&&(this.metrics.cacheHitRate=this.metrics.totalHits/this.metrics.totalLoads)}}function o(){const t=new s;return new i(t,{environment:\"production\",cache:!0,cacheTTL:36e5,enableMetrics:!1,onWarn:t=>{},onError:t=>{}})}export{a as TemplateCache,i as TemplateLoader,s as TemplateRegistry,o as createTemplateLoader};","import type { LoaderConfig, LoaderMetrics, TemplateConfig, TemplateSource } from '@alekstar79/template-loader'\nimport { TemplateCache, TemplateLoader, TemplateRegistry } from '@alekstar79/template-loader'\n\nlet globalTemplateLoader: TemplateLoader\n\n/**\n * Create a fully functional loader for the demo\n */\nexport async function createDemoLoader(\n fallbackTemplates: { name: string; source: string }[] = []\n): Promise<TemplateLoader> {\n const registry = new TemplateRegistry()\n\n let templates: Record<string, TemplateSource> = {}\n\n try {\n // @ts-ignore\n templates = import.meta.glob<string>(\n '../demo/templates/*.html',\n {\n import: 'default',\n query: '?raw',\n eager: false\n }\n )\n\n // Converting for registration\n const sources: Record<string, TemplateSource> = {}\n Object.entries(templates)\n .forEach(([path, loader]) => {\n const name = path.split('/').pop()?.replace(/\\.html$/, '')\n\n if (name) {\n sources[name] = async () => {\n if (typeof loader === 'function') {\n return await loader()\n }\n return String(loader)\n }\n }\n })\n\n await registry.registerBulk(sources)\n\n } catch (error) {\n console.error('[TemplateLoader] Failed to load templates:', error)\n\n // Minimal fallback templates in case of an error\n fallbackTemplates.forEach(({ name, source }) => {\n registry.register({ name, source })\n })\n }\n\n return new TemplateLoader(registry, {\n environment: 'development',\n cache: true,\n cacheTTL: 3600000,\n enableMetrics: true,\n fallbackTemplate: '<div class=\"template-error\">Template not found</div>',\n onError: (error) => console.error(`[TemplateLoader Error] ${error.templateName}:`, error.message),\n onWarn: (message) => console.warn(`[TemplateLoader] ${message}`)\n })\n}\n\n/**\n * Create a loader for the library\n */\nexport function createLibraryLoader(): TemplateLoader & { registry: TemplateRegistry }\n{\n const registry = new TemplateRegistry()\n\n return new TemplateLoader(registry, {\n environment: 'production',\n cache: true,\n cacheTTL: 3600000,\n enableMetrics: false,\n onWarn: (message) => console.warn(`[TemplateLoader] ${message}`),\n onError: (error) => {\n console.warn(`Template load failed: ${error.templateName}`)\n }\n })\n}\n\n/**\n * System initialization (called in main.ts or app initialization)\n */\nexport async function initializeTemplateSystem(): Promise<TemplateLoader>\n{\n if (globalTemplateLoader) return globalTemplateLoader\n\n const isDevMode =\n // @ts-ignore - Vite environment variable\n (typeof import.meta !== 'undefined' && import.meta.env && import.meta.env.DEV) ||\n (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'development')\n\n if (isDevMode) {\n globalTemplateLoader = await createDemoLoader()\n } else {\n globalTemplateLoader = createLibraryLoader()\n\n globalTemplateLoader.registry.register({\n name: 'media',\n source: async () => {\n const res = await fetch('./templates/media.html')\n return res.text()\n },\n metadata: {\n version: '1.0',\n description: 'Media card',\n cached: true\n }\n })\n\n globalTemplateLoader.registry.register({\n name: 'userProfile',\n source: '<div class=\"user-profile\"><h2>Profile</h2></div>',\n metadata: {\n version: '1.0',\n description: 'User profile card',\n cached: true\n }\n })\n }\n\n return globalTemplateLoader\n}\n\n/**\n * Get a global instance\n */\nexport function getTemplateLoader(): TemplateLoader\n{\n if (!globalTemplateLoader) {\n throw new Error('Template system not initialized. Call initializeTemplateSystem() first.')\n }\n\n return globalTemplateLoader\n}\n\nexport {\n LoaderConfig,\n LoaderMetrics,\n TemplateConfig,\n TemplateSource,\n TemplateCache,\n TemplateLoader,\n TemplateRegistry\n}\n","/**\n * BoundaryTracker.ts\n * Tracks the approach of the dragged element to the edges of the viewport\n * The element remains inside the viewport, and the detection zones are also inside\n */\n\nexport type Event = 'edge:enter' | 'edge:leave' | 'cursor:enter' | 'cursor:leave'\nexport type Edge = 'top' | 'right' | 'bottom' | 'left'\n\nexport interface Options {\n emitter?: EventEmitter | boolean,\n edgeThreshold?: number,\n}\n\nexport interface EdgeZoneInfo {\n top: boolean\n right: boolean\n bottom: boolean\n left: boolean\n edge: Edge | null\n}\n\nexport interface SourceEdgeInfo extends EdgeZoneInfo {\n source: 'element' | 'cursor'\n element: HTMLElement | null\n}\n\nexport interface IBoundaryTracker {\n start(): void\n stop(): void\n addTarget(element: HTMLElement): void\n removeTarget(element: HTMLElement): void\n onChange(callback: EdgeChangeCallback): () => void\n getCursorEdgeInfo(): EdgeZoneInfo\n setEdgeThreshold(threshold: number): void\n destroy(): void\n}\n\nexport interface IEdgeController extends IBoundaryTracker{\n getCurrentEdge(): Partial<SourceEdgeInfo>\n on(event: Event, callback: EdgeChangeCallback): void\n onCursorEnter(data: SourceEdgeInfo): void\n onCursorLeave(data: SourceEdgeInfo): void\n onEdgeEnter(data: SourceEdgeInfo): void\n onEdgeLeave(data: SourceEdgeInfo): void\n setEmitter(emitter: EventEmitter): void\n}\n\nexport type EdgeChangeCallback = (data: Partial<SourceEdgeInfo>) => void\nexport type EventCallback<T = any> = (data?: T) => void\nexport type EventMap = Record<string, any>\n\nfunction reducer(acc: Partial<SourceEdgeInfo>, [k, v]: [string, any]): Partial<SourceEdgeInfo>\n{\n return v ? { ...acc, [k]: v } : acc\n}\n\nexport class EdgeInfo implements SourceEdgeInfo\n{\n public source: 'element' | 'cursor' = 'cursor'\n public element: HTMLElement | null = null\n public top: boolean = false\n public right: boolean = false\n public bottom: boolean = false\n public left: boolean = false\n public edge: Edge | null = null\n\n constructor(info: SourceEdgeInfo)\n {\n Object.assign(this, info)\n }\n}\n\nexport class EventEmitter<T extends EventMap = any>\n{\n private listeners: Partial<{ [K in keyof T]: Set<EventCallback<T[K]>> }> = {}\n\n on<K extends keyof T>(event: K, callback: EventCallback<T[K]>): () => void\n {\n if (!this.listeners[event]) {\n this.listeners[event] = new Set()\n }\n\n this.listeners[event].add(callback)\n\n return () => {\n this.off?.(event, callback)\n }\n }\n\n emit<K extends keyof T>(event: K, data?: T[K]): void\n {\n this.listeners[event]?.forEach(callback => {\n try {\n callback(data)\n } catch (error) {\n console.error(`Error in event listener for ${String(event)}:`, error)\n }\n })\n }\n\n off?<K extends keyof T>(event: K, callback: EventCallback<T[K]>): void\n {\n this.listeners[event]?.delete(callback)\n }\n\n destroy?(): void\n {\n this.listeners = {}\n }\n}\n\n/**\n * The main class for tracking borders\n * Uses requestAnimationFrame for accurate tracking during drag\n */\nexport class InternalBoundaryTracker implements IBoundaryTracker\n{\n private readonly root: HTMLElement | null\n private edgeThreshold: number\n private targets: Set<HTMLElement> = new Set()\n private currentEdges: Map<HTMLElement, EdgeZoneInfo> = new Map()\n private rafId: number | null = null\n private isActive: boolean = false\n private callbacks: Set<EdgeChangeCallback> = new Set()\n private currentMousePos: { x: number; y: number } = { x: 0, y: 0 }\n private currentCursorEdge: EdgeZoneInfo = {\n top: false,\n right: false,\n bottom: false,\n left: false,\n edge: null\n }\n\n constructor(\n edgeThreshold: number = 50,\n targets?: HTMLElement[] | Set<HTMLElement>,\n root: HTMLElement | null = null\n ) {\n this.edgeThreshold = edgeThreshold\n this.targets = targets instanceof Set ? targets : new Set(targets)\n this.root = root\n\n if (targets) {\n targets.forEach(t => this.targets.add(t))\n }\n\n this.checkBoundaries = this.checkBoundaries.bind(this)\n }\n\n /**\n * Start tracking the approach to the edges\n */\n public start(): void\n {\n if (this.isActive) return\n\n this.isActive = true\n this.setupMouseTracking()\n this.checkBoundaries()\n }\n\n /**\n * Stop tracking\n */\n public stop(): void\n {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId)\n this.rafId = null\n }\n\n this.isActive = false\n }\n\n public addTarget(element: HTMLElement): void\n {\n this.targets.add(element)\n }\n\n public removeTarget(element: HTMLElement): void\n {\n this.targets.delete(element)\n this.currentEdges.delete(element)\n }\n\n /**\n * Subscribe to boundary changes\n */\n public onChange(callback: EdgeChangeCallback): () => void\n {\n this.callbacks.add(callback)\n\n return () => {\n this.callbacks.delete(callback)\n }\n }\n\n /**\n * Get current information about cursor boundaries\n */\n public getCursorEdgeInfo(): EdgeZoneInfo\n {\n return { ...this.currentCursorEdge }\n }\n\n /**\n * Update threshold (distance to edge)\n */\n public setEdgeThreshold(threshold: number): void\n {\n if (threshold < 0) {\n throw new Error('Edge threshold must be non-negative')\n }\n\n this.edgeThreshold = threshold\n }\n\n /**\n * Set up Mouse Tracking\n */\n private setupMouseTracking(): void\n {\n document.addEventListener('mousemove', (e: MouseEvent) => {\n this.currentMousePos = { x: e.clientX, y: e.clientY }\n })\n }\n\n private getViewportSize(): { width: number; height: number }\n {\n return this.root\n ? { width: this.root.clientWidth, height: this.root.clientHeight }\n : { width: window.innerWidth, height: window.innerHeight }\n }\n\n private getRelativeRect(target: HTMLElement): DOMRect\n {\n const targetRect = target.getBoundingClientRect()\n if (!this.root) return targetRect\n\n const rootRect = this.root.getBoundingClientRect()\n\n return {\n x: targetRect.left - rootRect.left,\n y: targetRect.top - rootRect.top,\n top: targetRect.top - rootRect.top,\n bottom: targetRect.bottom - rootRect.top,\n left: targetRect.left - rootRect.left,\n right: targetRect.right - rootRect.left,\n height: targetRect.height,\n width: targetRect.width,\n toJSON: () => {}\n }\n }\n\n private getCursorPosition(): { x: number; y: number }\n {\n if (!this.root) return this.currentMousePos\n\n const rootRect = this.root.getBoundingClientRect()\n\n return {\n x: this.currentMousePos.x - rootRect.left,\n y: this.currentMousePos.y - rootRect.top\n }\n }\n\n /**\n * Check the proximity to the borders (element and cursor)\n */\n private checkBoundaries(): void\n {\n // Checking elements\n this.targets.forEach((target: HTMLElement) => {\n const elementInfo = this.checkElementBoundaries(target)\n const prevEdge = this.currentEdges.get(target)\n\n if (!prevEdge || this.hasEdgeChanged(prevEdge, elementInfo)) {\n this.currentEdges.set(target, elementInfo)\n this.notifyCallbacks(new EdgeInfo({ ...elementInfo, source: 'element', element: target }))\n }\n })\n\n // Checking cursor\n const cursorInfo = this.checkCursorBoundaries()\n if (this.hasEdgeChanged(this.currentCursorEdge, cursorInfo)) {\n this.currentCursorEdge = cursorInfo\n this.notifyCallbacks(new EdgeInfo({ ...cursorInfo, source: 'cursor', element: null }))\n }\n\n if (this.isActive) {\n this.rafId = requestAnimationFrame(\n this.checkBoundaries\n )\n }\n }\n\n /**\n * Emulating Bounding Rect for cursor\n */\n private getCursorBoundingClientRect(): DOMRect\n {\n const { x, y } = this.getCursorPosition()\n\n return {\n x, y,\n top: y, bottom: y, left: x, right: x,\n width: 0, height: 0,\n toJSON: () => {}\n }\n }\n\n /**\n * Check the boundaries of an element\n */\n private checkElementBoundaries(target: HTMLElement): EdgeZoneInfo\n {\n const { width: vw, height: vh } = this.getViewportSize()\n const rect = this.getRelativeRect(target)\n\n const edge: EdgeZoneInfo = {\n top: rect.top < this.edgeThreshold,\n right: rect.right > vw - this.edgeThreshold,\n bottom: rect.bottom > vh - this.edgeThreshold,\n left: rect.left < this.edgeThreshold,\n edge: null,\n }\n\n this.determineEdge(edge, rect, vw, vh)\n\n return edge\n }\n\n /**\n * Check the boundaries of a cursor\n */\n private checkCursorBoundaries(): EdgeZoneInfo\n {\n const rect = this.getCursorBoundingClientRect()\n const vw = window.innerWidth\n const vh = window.innerHeight\n\n const cursorEdge: EdgeZoneInfo = {\n top: rect.top < this.edgeThreshold,\n right: rect.right > vw - this.edgeThreshold,\n bottom: rect.bottom > vh - this.edgeThreshold,\n left: rect.left < this.edgeThreshold,\n edge: null\n }\n\n this.determineEdge(cursorEdge, rect, vw, vh)\n\n return cursorEdge\n }\n\n /**\n * Check if the state has changed\n */\n private hasEdgeChanged(oldEdge: EdgeZoneInfo, newEdge: EdgeZoneInfo): boolean\n {\n return (\n oldEdge.top !== newEdge.top ||\n oldEdge.right !== newEdge.right ||\n oldEdge.bottom !== newEdge.bottom ||\n oldEdge.left !== newEdge.left\n )\n }\n\n /**\n * Determine a priority edge-side (or several)\n */\n private determineEdge(\n edge: EdgeZoneInfo,\n rect: DOMRect,\n vw: number,\n vh: number\n ): void {\n const edges: Edge[] = []\n\n if (edge.top) edges.push('top')\n if (edge.right) edges.push('right')\n if (edge.bottom) edges.push('bottom')\n if (edge.left) edges.push('left')\n\n if (edges.length === 0) {\n edge.edge = null\n } else if (edges.length === 1) {\n edge.edge = edges[0]\n } else {\n const distances = {\n top: rect.top,\n right: vw - rect.right,\n bottom: vh - rect.bottom,\n left: rect.left\n }\n\n // In the corner, the nearest edge is selected\n edge.edge = edges.reduce((prev, curr) =>\n distances[curr] < distances[prev] ? curr : prev\n ) as Edge\n }\n }\n\n /**\n * Notify all subscribers of the change\n */\n private notifyCallbacks(edge: SourceEdgeInfo): void\n {\n this.callbacks.forEach(callback => {\n try {\n callback(edge)\n } catch (error) {\n console.error('Error in boundary change callback:', error)\n }\n })\n }\n\n /**\n * Clear resources\n */\n public destroy(): void\n {\n this.stop()\n this.callbacks.clear()\n }\n}\n\nexport class EdgeController extends InternalBoundaryTracker implements IEdgeController\n{\n private static instance: IEdgeController\n\n public static init(edgeThreshold?: number, elements?: HTMLElement[])\n {\n return EdgeController.instance ??= new EdgeController(edgeThreshold, elements)\n }\n\n private lastEdge: Partial<SourceEdgeInfo> = {}\n public emitter: EventEmitter | null = null\n\n constructor(edgeThreshold?: number, elements?: HTMLElement[])\n {\n super(edgeThreshold, elements)\n\n this.onChange(this.onBoundaryChange.bind(this))\n this.start()\n }\n\n private changed({ edge, source, element }: Partial<SourceEdgeInfo>): boolean\n {\n return edge !== this.lastEdge.edge || source !== this.lastEdge.source || element !== this.lastEdge.element\n }\n\n private onBoundaryChange({ edge, source, element }: Partial<SourceEdgeInfo>): void\n {\n if (!this.changed({ edge, source, element })) return\n\n this.lastEdge = Object.entries({ edge, source, element }).reduce(reducer, {})\n\n if (!element) {\n edge\n ? this.onCursorEnter({ edge, source })\n : this.onCursorLeave(this.lastEdge)\n } else {\n edge\n ? this.onEdgeEnter({ edge, source, element })\n : this.onEdgeLeave(this.lastEdge)\n }\n }\n\n public onEdgeEnter(data: Partial<SourceEdgeInfo>): void\n {\n this.emitter?.emit('edge:enter', data)\n }\n\n public onEdgeLeave(data: Partial<SourceEdgeInfo>): void\n {\n this.emitter?.emit('edge:leave', data)\n }\n\n public onCursorEnter(data: Partial<SourceEdgeInfo>): void\n {\n this.emitter?.emit('cursor:enter', data)\n }\n\n public onCursorLeave(data: Partial<SourceEdgeInfo>): void\n {\n this.emitter?.emit('cursor:leave', data)\n }\n\n setEmitter(emitter: EventEmitter): void\n {\n this.emitter = emitter\n }\n\n on(event: Event, callback: EdgeChangeCallback): void\n {\n this.emitter?.on(event, callback)\n }\n\n getCurrentEdge(): Partial<SourceEdgeInfo>\n {\n return this.lastEdge\n }\n}\n\nexport function createTracker(\n options = {} as Options,\n elements: HTMLElement[] = []\n): IEdgeController {\n const controller = EdgeController.init(options.edgeThreshold, elements)\n\n if (options.emitter) {\n controller.setEmitter(\n options.emitter instanceof EventEmitter ? options.emitter : new EventEmitter()\n )\n }\n\n return controller\n}\n","// src/utuls/dom.ts\n\nexport interface StateInterface {\n zIndex(uid: string): string;\n push(uid: string): this;\n remove(uid: string): this;\n sort(uid: string): this;\n}\n\nexport class State implements StateInterface\n{\n static inatance: StateInterface\n\n static highestZIndex = 1000\n\n static init = () => State.inatance ??= new State()\n\n private draggable: string[] = []\n\n zIndex(uid: string): string\n {\n return `${State.highestZIndex + this.draggable.findIndex(id => id === uid)}`\n }\n\n push(uid: string): this\n {\n this.draggable = [...new Set<string>([...this.draggable, uid])]\n\n return this\n }\n\n remove(uid: string): this\n {\n this.draggable = this.draggable.filter(id => id !== uid)\n\n return this\n }\n\n sort(uid: string): this\n {\n this.draggable.sort(($1: number | string, $2: number | string) => {\n return $1 === uid ? 1 : $2 === uid ? -1 : 0\n })\n\n return this\n }\n}\n\n/**\n * Check if element is within viewport boundaries\n */\nexport function isInViewport(element: HTMLElement): boolean\n{\n const rect = element.getBoundingClientRect()\n\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n )\n}\n\n/**\n * Get viewport dimensions\n */\nexport function getViewportDimensions(): { width: number; height: number }\n{\n return {\n width: window.innerWidth || document.documentElement.clientWidth,\n height: window.innerHeight || document.documentElement.clientHeight\n }\n}\n\n/**\n * @returns {State} - Класс вычисляющий z-index позиции контейнеров\n */\nexport function getState(): StateInterface\n{\n return State.init()\n}\n","// src/core/ContainerManager.ts\n\nimport ReactiveEventSystem from '@alekstar79/reactive-event-system'\nimport { computed, effect, reactive } from '@alekstar79/reactive-event-system'\nimport { clamp, deepMerge } from '@alekstar79/utility'\n\nimport { getState, getViewportDimensions } from '../utils'\nimport type { StateInterface } from '../utils'\n\nimport {\n AutoAdjustConfig,\n Boundaries,\n ContainerManagerInterface,\n Plugin,\n ContainerConfig,\n ContainerEvent,\n ContainerState,\n DirectionMode,\n MovementMode,\n PluginMiddleware,\n ResizeConfig,\n ResizeDirection\n} from './types'\n\n/**\n * Main container management class for drag and resize operations\n * Implements ContainerManagerInterface for plugin compatibility\n * Now with reactive state management using @alekstar79/reactivity\n */\nexport class ContainerManager implements ContainerManagerInterface\n{\n private static MINWIDTH: number = 200\n private static MINHEIGHT: number = 45\n\n // Streams for reactive event handling\n private dragStream: ReturnType<ReactiveEventSystem<ContainerEvent>['stream']>\n private resizeStream: ReturnType<ReactiveEventSystem<ContainerEvent>['stream']>\n private readonly stateChangeStream: ReturnType<ReactiveEventSystem<ContainerEvent>['stream']>\n private readonly eventEmitter: ReactiveEventSystem<ContainerEvent>\n private readonly pluginEventEmitter: ReactiveEventSystem\n\n private readonly config: ContainerConfig\n private readonly container: HTMLElement\n private dragHandle!: HTMLElement\n private resizeHandles: Map<ResizeDirection, HTMLElement> = new Map()\n private installedPlugins: Set<Plugin> = new Set()\n private reactiveEffects: (() => void)[] = []\n\n private isDragging: boolean = false\n private isResizing: boolean = false\n private resizeDirection: ResizeDirection | null = null\n private startX: number = 0\n private startY: number = 0\n private startState: ContainerState\n private resizeObserver: ResizeObserver | null = null\n private parentResizeObserver: ResizeObserver | null = null\n public zIndexState: StateInterface\n\n private reactiveState = reactive({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n mode: 'smooth' as MovementMode,\n draggingDirection: 'all' as DirectionMode\n })\n\n // Computed state with applied constraints\n private constrainedState = computed(() => {\n const state = this.reactiveState\n\n if (!this.config) return { ...state }\n\n let constrained: ContainerState = { ...state }\n\n // Apply boundaries constraints\n const { boundaries } = this.config\n constrained.width = clamp(\n state.width,\n boundaries.minWidth || ContainerManager.MINWIDTH,\n boundaries.maxWidth || Infinity\n )\n constrained.height = clamp(\n state.height,\n boundaries.minHeight || ContainerManager.MINHEIGHT,\n boundaries.maxHeight || Infinity\n )\n\n // Apply viewport constraints if needed\n if (this.shouldConstrainToViewport()) {\n const viewport = getViewportDimensions()\n constrained.x = clamp(state.x, 0, viewport.width - constrained.width)\n constrained.y = clamp(state.y, 0, viewport.height - constrained.height)\n }\n\n // Apply parent constraints if enabled\n if (this.config?.constrainToParent) {\n constrained = this.constrainToParent(constrained)\n }\n\n return constrained\n })\n\n // Automatic DOM updates with reactive effect\n private domUpdateEffect = effect(() => {\n const state = this.constrainedState.value\n\n if (!this.container) return\n\n this.container.style.left = `${state.x}px`\n this.container.style.top = `${state.y}px`\n this.container.style.width = `${state.width}px`\n this.container.style.height = `${state.height}px`\n\n this.eventEmitter?.emit('stateChange', {\n type: 'stateChange',\n state: { ...state },\n mode: this.reactiveState.mode,\n element: this.container\n })\n })\n\n /**\n * Create a new container manager instance with reactive state management\n * @param container - HTML element to manage\n * @param config - Configuration options\n */\n constructor(container: HTMLElement, config: Partial<ContainerConfig> = {})\n {\n this.config = deepMerge<ContainerConfig>({\n _uid: '',\n mode: 'smooth',\n constrainToViewport: false,\n draggingDirection: 'all',\n constrainToParent: false,\n boundaries: {\n minWidth: ContainerManager.MINWIDTH,\n minHeight: ContainerManager.MINHEIGHT\n },\n autoAdjust: {\n enabled: false,\n width: false,\n height: false\n },\n resize: {\n enabled: true,\n directions: ['se']\n }\n }, config)\n\n this.container = container\n this.zIndexState = getState()\n\n // Initialize reactive state from DOM\n const currentState = this.getCurrentState()\n this.reactiveState.x = currentState.x\n this.reactiveState.y = currentState.y\n this.reactiveState.width = currentState.width\n this.reactiveState.height = currentState.height\n this.reactiveState.mode = this.config.mode\n this.reactiveState.draggingDirection = this.config.draggingDirection\n\n // Initialize enhanced event emitters with metrics\n this.eventEmitter = new ReactiveEventSystem<ContainerEvent>({ enableMetrics: true })\n this.pluginEventEmitter = new ReactiveEventSystem({ enableMetrics: true })\n\n // Create reactive streams for common events\n this.stateChangeStream = this.eventEmitter.stream('stateChange')\n this.dragStream = this.eventEmitter.stream('drag')\n this.resizeStream = this.eventEmitter.stream('resize')\n\n this.startState = this.getState()\n\n this.setupEventMiddleware()\n this.initializeHandles()\n this.bindEvents()\n this.setupResizeObservers()\n this.setupReactiveMonitoring()\n }\n\n /**\n * Set up ResizeObserver to track viewport and parent size changes\n */\n private setupResizeObservers(): void\n {\n // Setup viewport resize observer if viewport constraints should be applied\n if (this.shouldConstrainToViewport()) {\n this.setupViewportResizeObserver()\n }\n\n // Setup parent element observer if auto-adjust is enabled\n if (this.config.autoAdjust?.enabled) {\n this.setupParentResizeObserver()\n }\n }\n\n /**\n * Determine if viewport constraints should be applied\n */\n private shouldConstrainToViewport(): boolean\n {\n return !this.config.constrainToParent || this.config.constrainToViewport\n }\n\n /**\n * Set up ResizeObserver to track viewport size changes\n */\n private setupViewportResizeObserver(): void\n {\n let rAFTimeout: number | null = null\n\n this.resizeObserver = new ResizeObserver(() => {\n rAFTimeout && cancelAnimationFrame(rAFTimeout)\n rAFTimeout = requestAnimationFrame(() => {\n this.handleViewportResize()\n })\n })\n\n this.resizeObserver.observe(document.body)\n }\n\n /**\n * Handle viewport resize event with reactive state updates\n */\n private handleViewportResize(): void\n {\n if (!this.shouldConstrainToViewport()) return\n\n const viewport = getViewportDimensions()\n const currentState = this.getState()\n const newState = { ...currentState }\n\n let needsUpdate = false\n\n // Check if container is outside viewport on right edge\n if (newState.x + newState.width > viewport.width) {\n newState.x = Math.max(0, viewport.width - newState.width)\n needsUpdate = true\n }\n\n // Check if container is outside viewport on bottom edge\n if (newState.y + newState.height > viewport.height) {\n newState.y = Math.max(0, viewport.height - newState.height)\n needsUpdate = true\n }\n\n // Check if container is outside viewport on left edge\n if (newState.x < 0) {\n newState.x = 0\n needsUpdate = true\n }\n\n // Check if container is outside viewport on top edge\n if (newState.y < 0) {\n newState.y = 0\n needsUpdate = true\n }\n\n if (needsUpdate) {\n this.setState(newState)\n\n this.eventEmitter.emit('viewportResize', {\n type: 'viewportResize',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container\n })\n }\n }\n\n /**\n * Set up ResizeObserver for parent element auto-adjustment\n */\n private setupParentResizeObserver(): void\n {\n const parentElement = this.container.parentElement\n if (!parentElement) return\n\n this.parentResizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n this.handleParentResize(entry)\n }\n })\n\n this.parentResizeObserver.observe(parentElement)\n }\n\n /**\n * Handle parent element resize for auto-adjustment with reactive updates\n */\n private handleParentResize(entry: ResizeObserverEntry): void\n {\n const { autoAdjust } = this.config\n if (!autoAdjust?.enabled) return\n\n const parentRect = entry.contentRect\n const currentState = this.getState()\n const newState = { ...currentState }\n\n let needsUpdate = false\n\n if (autoAdjust.width) {\n const maxWidth = this.getMaxWidthConstraint()\n const newWidth = Math.min(parentRect.width, maxWidth)\n\n if (Math.abs(newState.width - newWidth) > 1) {\n newState.width = newWidth\n needsUpdate = true\n }\n }\n\n if (autoAdjust.height) {\n const maxHeight = this.getMaxHeightConstraint()\n const newHeight = Math.min(parentRect.height, maxHeight)\n\n if (Math.abs(newState.height - newHeight) > 1) {\n newState.height = newHeight\n needsUpdate = true\n }\n }\n\n if (needsUpdate) {\n this.setState(newState)\n\n this.eventEmitter.emit('autoAdjust', {\n type: 'autoAdjust',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container\n })\n }\n }\n\n /**\n * Initialize drag and resize handles based on configuration\n */\n private initializeHandles(): void\n {\n this.initializeDragHandle()\n\n if (this.config.resize?.enabled) {\n this.initializeResizeHandles()\n }\n }\n\n /**\n * Initialize drag handle\n */\n private initializeDragHandle(): void\n {\n this.dragHandle = this.container.querySelector('[data-drag-handle]') as HTMLElement\n if (!this.dragHandle) {\n this.dragHandle = document.createElement('div')\n this.dragHandle.className = 'drag-handle'\n this.dragHandle.setAttribute('data-drag-handle', 'true')\n this.dragHandle.setAttribute('oncontextmenu', 'return false')\n this.container.prepend(this.dragHandle)\n } else {\n this.dragHandle.setAttribute('oncontextmenu', 'return false')\n }\n }\n\n /**\n * Initialize resize handles for all configured directions\n */\n private initializeResizeHandles(): void\n {\n const directions = this.config.resize?.directions || ['se']\n\n directions.forEach(direction => {\n const handle = this.createResizeHandle(direction)\n this.resizeHandles.set(direction, handle)\n this.container.appendChild(handle)\n })\n }\n\n /**\n * Create individual resize handle for specific direction\n */\n private createResizeHandle(direction: ResizeDirection): HTMLElement\n {\n const handle = document.createElement('div')\n handle.className = `resize-handle resize-${direction}`\n handle.setAttribute('data-resize-handle', direction)\n handle.setAttribute('data-resize-direction', direction)\n\n // Add context menu prevention for resize handles\n handle.addEventListener('contextmenu', this.onContextMenu)\n\n this.applyResizeHandleStyles(handle, direction)\n\n return handle\n }\n\n /**\n * Apply styles and cursor for resize handle based on direction\n */\n private applyResizeHandleStyles(handle: HTMLElement, direction: ResizeDirection): void\n {\n const cursorMap: Record<ResizeDirection, string> = {\n 'n': 'ns-resize', 's': 'ns-resize', 'e': 'ew-resize', 'w': 'ew-resize',\n 'ne': 'nesw-resize', 'nw': 'nwse-resize', 'se': 'nwse-resize', 'sw': 'nesw-resize'\n }\n\n handle.style.position = 'absolute'\n handle.style.cursor = cursorMap[direction]\n\n this.positionResizeHandle(handle, direction)\n }\n\n /**\n * Position resize handle based on direction\n */\n private positionResizeHandle(handle: HTMLElement, direction: ResizeDirection): void\n {\n const size = 12\n\n switch (direction) {\n case 'n':\n handle.style.top = '0'\n handle.style.left = '0'\n handle.style.right = '0'\n handle.style.height = `${size}px`\n break\n case 's':\n handle.style.bottom = '0'\n handle.style.left = '0'\n handle.style.right = '0'\n handle.style.height = `${size}px`\n break\n case 'e':\n handle.style.right = '0'\n handle.style.top = '0'\n handle.style.bottom = '0'\n handle.style.width = `${size}px`\n break\n case 'w':\n handle.style.left = '0'\n handle.style.top = '0'\n handle.style.bottom = '0'\n handle.style.width = `${size}px`\n break\n case 'ne':\n handle.style.top = '0'\n handle.style.right = '0'\n handle.style.width = `${size}px`\n handle.style.height = `${size}px`\n break\n case 'nw':\n handle.style.top = '0'\n handle.style.left = '0'\n handle.style.width = `${size}px`\n handle.style.height = `${size}px`\n break\n case 'se':\n handle.style.bottom = '0'\n handle.style.right = '0'\n handle.style.width = `${size}px`\n handle.style.height = `${size}px`\n break\n case 'sw':\n handle.style.bottom = '0'\n handle.style.left = '0'\n handle.style.width = `${size}px`\n handle.style.height = `${size}px`\n break\n }\n }\n\n /**\n * Bind event listeners to handles\n */\n private bindEvents(): void\n {\n this.onDragStart = this.onDragStart.bind(this)\n this.onDragMove = this.onDragMove.bind(this)\n this.onDragEnd = this.onDragEnd.bind(this)\n\n this.onResizeStart = this.onResizeStart.bind(this)\n this.onResizeMove = this.onResizeMove.bind(this)\n this.onResizeEnd = this.onResizeEnd.bind(this)\n\n this.onContextMenu = this.onContextMenu.bind(this)\n\n // Only bind default drag events if no snapping plugin is installed\n if (!this.hasPluginByName('SnappingPlugin')) {\n this.dragHandle.addEventListener('mousedown', this.onDragStart)\n this.dragHandle.addEventListener('touchstart', this.onDragStart)\n }\n\n // Bind resize events for all resize handles\n if (this.config.resize?.enabled) {\n this.resizeHandles.forEach((handle, direction) => {\n handle.addEventListener('mousedown', (e) => this.onResizeStart(e, direction))\n handle.addEventListener('touchstart', (e) => this.onResizeStart(e, direction))\n })\n }\n\n // Disable context menu on drag handle\n this.dragHandle.addEventListener('contextmenu', this.onContextMenu)\n }\n\n /**\n * Apply movement mode to coordinates\n */\n private applyMovementMode(deltaX: number, deltaY: number): ContainerState\n {\n const newState = { ...this.startState }\n\n if (this.reactiveState.mode === 'smooth') {\n newState.x = this.startState.x + deltaX\n newState.y = this.startState.y + deltaY\n }\n\n return newState\n }\n\n /**\n * Calculate new state based on resize direction and deltas\n */\n private calculateResizeState(deltaX: number, deltaY: number, direction: ResizeDirection): ContainerState\n {\n const newState = { ...this.startState }\n\n switch (direction) {\n case 'e': // East - right only\n newState.width = this.startState.width + deltaX\n break\n case 'w': // West - left only\n newState.width = this.startState.width - deltaX\n newState.x = this.startState.x + deltaX\n break\n case 'n': // North - top only\n newState.height = this.startState.height - deltaY\n newState.y = this.startState.y + deltaY\n break\n case 's': // South - bottom only\n newState.height = this.startState.height + deltaY\n break\n case 'ne': // Northeast - top-right\n newState.width = this.startState.width + deltaX\n newState.height = this.startState.height - deltaY\n newState.y = this.startState.y + deltaY\n break\n case 'nw': // Northwest - top-left\n newState.width = this.startState.width - deltaX\n newState.height = this.startState.height - deltaY\n newState.x = this.startState.x + deltaX\n newState.y = this.startState.y + deltaY\n break\n case 'se': // Southeast - bottom-right\n newState.width = this.startState.width + deltaX\n newState.height = this.startState.height + deltaY\n break\n case 'sw': // Southwest - bottom-left\n newState.width = this.startState.width - deltaX\n newState.height = this.startState.height + deltaY\n newState.x = this.startState.x + deltaX\n break\n }\n\n return newState\n }\n\n /**\n * Constrain container to parent element boundaries (both position and size)\n */\n private constrainToParent(state: ContainerState): ContainerState\n {\n const parentElement = this.container.parentElement\n if (!parentElement) return state\n\n const parentRect = parentElement.getBoundingClientRect()\n\n // If the container has not yet been added to the DOM or the parent has a zero size,\n // return to the original state\n if (parentRect.width === 0 || parentRect.height === 0) {\n return state\n }\n\n // Calculating the maximum allowable coordinates\n const maxX = Math.max(0, parentRect.width - state.width)\n const maxY = Math.max(0, parentRect.height - state.height)\n\n // Calculating the maximum allowable sizes\n const maxWidth = parentRect.width - state.x\n const maxHeight = parentRect.height - state.y\n\n return {\n x: clamp(state.x, 0, maxX),\n y: clamp(state.y, 0, maxY),\n width: clamp(state.width, 0, maxWidth),\n height: clamp(state.height, 0, maxHeight)\n }\n }\n\n /**\n * Get maximum width constraint considering parent and boundaries\n */\n private getMaxWidthConstraint(): number\n {\n const { boundaries } = this.config\n let maxWidth = boundaries.maxWidth || Infinity\n\n if (this.config.constrainToParent && this.container.parentElement) {\n const parentWidth = this.container.parentElement.getBoundingClientRect().width\n maxWidth = Math.min(maxWidth, parentWidth)\n }\n\n return maxWidth\n }\n\n /**\n * Get maximum height constraint considering parent and boundaries\n */\n private getMaxHeightConstraint(): number\n {\n const { boundaries } = this.config\n let maxHeight = boundaries.maxHeight || Infinity\n\n if (this.config.constrainToParent && this.container.parentElement) {\n const parentHeight = this.container.parentElement.getBoundingClientRect().height\n maxHeight = Math.min(maxHeight, parentHeight)\n }\n\n return maxHeight\n }\n\n /**\n * Handle context menu event on drag handle\n */\n private onContextMenu(e: MouseEvent): void\n {\n e.preventDefault()\n e.stopPropagation()\n }\n\n /**\n * Check if snapping plugin is installed\n */\n private hasPluginByName(pluginName: string): boolean\n {\n return Array.from(this.installedPlugins)\n .some(plugin => plugin.constructor.name === pluginName)\n }\n\n /**\n * Get current container state from DOM\n */\n private getCurrentState(): ContainerState\n {\n const rect = this.container.getBoundingClientRect()\n const style = window.getComputedStyle(this.container)\n\n const styleWidth = parseFloat(style.width) || rect.width\n const styleHeight = parseFloat(style.height) || rect.height\n\n return {\n x: rect.left,\n y: rect.top,\n width: styleWidth,\n height: styleHeight\n }\n }\n\n /**\n * Setup event middleware for enhanced event processing\n */\n private setupEventMiddleware(): void\n {\n // Add logging middleware for all events\n this.eventEmitter.use('*', (data, event) => {\n if (typeof window !== 'undefined' && (window as any).DEBUG_CONTAINER_MANAGER) {\n console.log(`[ContainerManager] ${event}:`, data)\n }\n return data\n })\n\n // TODO Add validation middleware for drag events\n this.eventEmitter.use('dragStart', (data, _event) => {\n if (this.reactiveState.mode === 'pinned') {\n throw new Error('Cannot drag in pinned mode')\n }\n return data\n })\n\n // Add performance monitoring middleware\n this.eventEmitter.use('drag', (data, _event) => {\n // console.log(`[ContainerManager] ${event}:`, data)\n return data\n })\n }\n\n /**\n * Setup reactive monitoring for container metrics\n */\n private setupReactiveMonitoring(): void\n {\n // Monitor state changes reactively\n const stateMonitor = effect(() => {\n const { state } = this.stateChangeStream\n // Intentional side-effect-free access\n // We don't need to do anything here\n void state\n })\n\n this.reactiveEffects.push(stateMonitor)\n\n // Monitor emitter metrics\n const metricsMonitor = effect(() => {\n const metrics = this.eventEmitter.getMetrics()\n // Monitor event system health\n if (metrics.state.errorCount > 10) {\n console.warn('[ContainerManager] High error count in event system:', metrics.state.errorCount)\n }\n })\n\n this.reactiveEffects.push(metricsMonitor)\n }\n\n // Public API Implementation\n\n /**\n * Subscribe to container events\n * @param event - Event name\n * @param callback - Callback function\n */\n on(event: string, callback: (data: ContainerEvent) => void): void\n {\n this.eventEmitter.on(event, callback)\n }\n\n /**\n * Unsubscribe from container events\n * @param event - Event name\n * @param callback - Callback function\n */\n off(event: string, callback: (data: ContainerEvent) => void): void\n {\n this.eventEmitter.off(event, callback)\n }\n\n /**\n * Wait for specific container event\n * @example\n * // Wait for drag to complete\n * const dragResult = await manager.waitFor('dragEnd')\n * console.log('Drag completed:', dragResult.state)\n */\n waitFor(event: string, timeout?: number): Promise<ContainerEvent>\n {\n return this.eventEmitter.waitFor(event, timeout)\n }\n\n /**\n * Get reactive stream for specific event type\n * @example\n * // Get state change stream\n * const stateStream = manager.getStream('stateChange')\n * stateStream.subscribe((data) => {\n * console.log('State changed:', data.state)\n * })\n */\n getStream(event: string): ReturnType<ReactiveEventSystem<ContainerEvent>['stream']>\n {\n return this.eventEmitter.stream(event)\n }\n\n /**\n * Pipe container events to another emitter\n * @example\n * // Pipe all events to analytics emitter\n * manager.pipe('*', analyticsEmitter)\n */\n pipe(event: string, targetEmitter: ReactiveEventSystem<ContainerEvent>, targetEvent?: string): () => void\n {\n return this.eventEmitter.pipe(event, targetEmitter, targetEvent)\n }\n\n /**\n * Get event system metrics for monitoring\n */\n getEventMetrics(): ReturnType<ReactiveEventSystem<ContainerEvent>['getMetrics']>\n {\n return this.eventEmitter.getMetrics()\n }\n\n /**\n * Plugin-specific event emission\n */\n emitPluginEvent(event: string, data: any): void\n {\n this.pluginEventEmitter.emit(event, data)\n }\n\n /**\n * Listen to plugin-specific events\n */\n onPluginEvent(event: string, listener: (data: any) => void): void\n {\n this.pluginEventEmitter.on(event, listener)\n }\n\n /**\n * Remove plugin event listener\n */\n offPluginEvent(event: string, listener: (data: any) => void): void\n {\n this.pluginEventEmitter.off(event, listener)\n }\n\n /**\n * Add middleware for plugin events\n */\n usePluginMiddleware(event: string, middleware: PluginMiddleware): () => void\n {\n return this.pluginEventEmitter.use(event, middleware)\n }\n\n /**\n * Handle drag start event\n */\n onDragStart(e: MouseEvent | TouchEvent): void\n {\n // Don't allow dragging in pinned mode\n if (this.reactiveState.mode === 'pinned') return\n\n e.preventDefault()\n this.bringToFront()\n\n this.isDragging = true\n\n const clientX = e instanceof MouseEvent ? e.clientX : e.touches[0].clientX\n const clientY = e instanceof MouseEvent ? e.clientY : e.touches[0].clientY\n\n this.startX = clientX\n this.startY = clientY\n this.startState = this.getState()\n\n this.eventEmitter.emit('dragStart', {\n type: 'drag',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container\n })\n\n document.addEventListener('mousemove', this.onDragMove)\n document.addEventListener('mouseup', this.onDragEnd)\n document.addEventListener('touchmove', this.onDragMove)\n document.addEventListener('touchend', this.onDragEnd)\n }\n\n /**\n * Handle drag movement with reactive state updates\n */\n onDragMove(e: MouseEvent | TouchEvent): void\n {\n if (!this.isDragging) return\n\n const { clientX, clientY } = this.directionResolver(\n e instanceof MouseEvent ? e.clientX : e.touches[0].clientX,\n e instanceof MouseEvent ? e.clientY : e.touches[0].clientY\n )\n\n const deltaX = clientX - this.startX\n const deltaY = clientY - this.startY\n\n // Apply movement mode and update reactive state\n const newState = this.applyMovementMode(deltaX, deltaY)\n this.setState(newState)\n\n this.eventEmitter.emit('drag', {\n type: 'drag',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container\n })\n }\n\n /**\n * Handle drag end event\n */\n onDragEnd(): void\n {\n this.isDragging = false\n\n document.removeEventListener('mousemove', this.onDragMove)\n document.removeEventListener('mouseup', this.onDragEnd)\n document.removeEventListener('touchmove', this.onDragMove)\n document.removeEventListener('touchend', this.onDragEnd)\n\n this.eventEmitter.emit('dragEnd', {\n type: 'drag',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container\n })\n }\n\n /**\n * Handle resize start event with direction\n */\n onResizeStart(e: MouseEvent | TouchEvent, direction: ResizeDirection): void\n {\n e.preventDefault()\n e.stopPropagation()\n\n this.bringToFront()\n this.isResizing = true\n this.resizeDirection = direction\n\n const clientX = e instanceof MouseEvent ? e.clientX : e.touches[0].clientX\n const clientY = e instanceof MouseEvent ? e.clientY : e.touches[0].clientY\n\n this.startX = clientX\n this.startY = clientY\n this.startState = this.getState()\n\n document.addEventListener('mousemove', this.onResizeMove)\n document.addEventListener('mouseup', this.onResizeEnd)\n document.addEventListener('touchmove', this.onResizeMove)\n document.addEventListener('touchend', this.onResizeEnd)\n\n this.eventEmitter.emit('resizeStart', {\n type: 'resize',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container,\n direction\n })\n }\n\n /**\n * Handle resize movement with multi-direction support and reactive updates\n */\n onResizeMove(e: MouseEvent | TouchEvent): void\n {\n if (!this.isResizing || !this.resizeDirection) return\n\n const clientX = e instanceof MouseEvent ? e.clientX : e.touches[0].clientX\n const clientY = e instanceof MouseEvent ? e.clientY : e.touches[0].clientY\n\n const deltaX = clientX - this.startX\n const deltaY = clientY - this.startY\n\n const newState = this.calculateResizeState(deltaX, deltaY, this.resizeDirection)\n\n // Use reactive state update which will automatically apply constraints\n this.setState(newState)\n\n this.eventEmitter.emit('resize', {\n type: 'resize',\n state: this.getState(),\n mode: this.reactiveState.mode,\n direction: this.resizeDirection,\n element: this.container\n })\n }\n\n /**\n * Handle resize end event\n */\n onResizeEnd(): void\n {\n this.isResizing = false\n this.resizeDirection = null\n\n document.removeEventListener('mousemove', this.onResizeMove)\n document.removeEventListener('mouseup', this.onResizeEnd)\n document.removeEventListener('touchmove', this.onResizeMove)\n document.removeEventListener('touchend', this.onResizeEnd)\n\n this.eventEmitter.emit('resizeEnd', {\n type: 'resize',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container\n })\n }\n\n /**\n * Set movement direction\n */\n setDirection(direction: DirectionMode): void\n {\n this.reactiveState.draggingDirection = direction\n\n this.emitPluginEvent('directionChanged', { direction })\n }\n\n /**\n * Get current movement direction\n */\n getDirection(): DirectionMode\n {\n return this.reactiveState.draggingDirection\n }\n\n /**\n * Resolve coordinates based on current direction mode\n */\n directionResolver(x: number, y: number)\n {\n const direction = this.reactiveState.draggingDirection\n\n // Determine which coordinates to lock based on direction mode\n const lockX = direction === 'vertical'\n const lockY = direction === 'horizontal'\n\n return {\n clientX: lockX ? this.startX : x,\n clientY: lockY ? this.startY : y\n }\n }\n\n /**\n * Get current movement mode\n */\n getMode(): MovementMode\n {\n return this.reactiveState.mode\n }\n\n /**\n * Set movement mode with reactive update\n */\n setMode(mode: MovementMode): void\n {\n this.reactiveState.mode = mode\n\n this.eventEmitter.emit('modeChange', {\n type: 'modeChange',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container\n })\n }\n\n /**\n * Update container boundaries\n */\n setBoundaries(boundaries: Partial<Boundaries>): void\n {\n this.config.boundaries = { ...this.config.boundaries, ...boundaries }\n }\n\n /**\n * Get current container state (reactive)\n */\n getState(): ContainerState\n {\n return {\n x: this.reactiveState.x,\n y: this.reactiveState.y,\n width: this.reactiveState.width,\n height: this.reactiveState.height\n }\n }\n\n /**\n * Update container position and size with reactive state\n */\n setState(state: Partial<ContainerState>): void\n {\n // Update reactive state directly\n if (state.height !== undefined) this.reactiveState.height = state.height\n if (state.width !== undefined) this.reactiveState.width = state.width\n if (state.x !== undefined) this.reactiveState.x = state.x\n if (state.y !== undefined) this.reactiveState.y = state.y\n\n this.applyStateToDOM()\n }\n\n /**\n * Apply current state to DOM immediately for synchronization\n */\n private applyStateToDOM(): void\n {\n const state = this.getState()\n\n this.container.style.left = `${state.x}px`\n this.container.style.top = `${state.y}px`\n this.container.style.width = `${state.width}px`\n this.container.style.height = `${state.height}px`\n }\n\n /**\n * Bring container to front programmatically\n */\n bringToFront(): void\n {\n const { _uid } = this.config\n this.container.style.zIndex = this.zIndexState.sort(_uid).zIndex(_uid)\n }\n\n /**\n * Get container DOM element\n */\n getContainer(): HTMLElement\n {\n return this.container\n }\n\n /**\n * Update auto-adjust configuration\n */\n setAutoAdjust(config: AutoAdjustConfig): void\n {\n this.config.autoAdjust = { ...this.config.autoAdjust, ...config }\n\n // Restart parent observer if auto-adjust is enabled\n if (this.parentResizeObserver) {\n this.parentResizeObserver.disconnect()\n this.parentResizeObserver = null\n }\n\n if (this.config.autoAdjust?.enabled) {\n this.setupParentResizeObserver()\n }\n }\n\n /**\n * Update resize configuration\n */\n setResizeConfig(config: ResizeConfig): void\n {\n this.config.resize = { ...this.config.resize, ...config }\n\n // Remove existing resize handles\n this.resizeHandles.forEach(handle => handle.remove())\n this.resizeHandles.clear()\n\n // Initialize new resize handles if enabled\n if (this.config.resize?.enabled) {\n this.initializeResizeHandles()\n this.bindEvents()\n }\n }\n\n /**\n * Set constrain to parent configuration\n */\n setConstrainToParent(enabled: boolean): void\n {\n this.config.constrainToParent = enabled\n\n // Update viewport observer based on new constraint configuration\n if (this.resizeObserver) {\n this.resizeObserver.disconnect()\n this.resizeObserver = null\n }\n\n if (this.shouldConstrainToViewport()) {\n this.setupViewportResizeObserver()\n }\n }\n\n /**\n * Set constrain to viewport configuration\n */\n setConstrainToViewport(enabled: boolean): void\n {\n this.config.constrainToViewport = enabled\n\n // Restart viewport observer if enabled\n if (this.resizeObserver) {\n this.resizeObserver.disconnect()\n this.resizeObserver = null\n }\n\n if (this.shouldConstrainToViewport()) {\n this.setupViewportResizeObserver()\n }\n }\n\n /**\n * Recalculate container state relative to parent element\n */\n recalculateForParent(): void\n {\n if (!this.config.constrainToParent || !this.container.parentElement) {\n return\n }\n\n const parentRect = this.container.parentElement.getBoundingClientRect()\n const currentState = this.getState()\n\n // If the parent has zero dimensions, exit\n if (parentRect.width === 0 || parentRect.height === 0) {\n return\n }\n\n // Keep the desired dimensions, but limit them to the parent dimensions\n const desiredWidth = currentState.width\n const desiredHeight = currentState.height\n\n const newWidth = Math.min(desiredWidth, parentRect.width)\n const newHeight = Math.min(desiredHeight, parentRect.height)\n\n // Save the desired coordinates, but limit them to the parent dimensions\n const desiredX = currentState.x\n const desiredY = currentState.y\n\n const newX = Math.min(desiredX, parentRect.width - newWidth)\n const newY = Math.min(desiredY, parentRect.height - newHeight)\n\n // Use reactive state update\n this.setState({\n x: newX,\n y: newY,\n width: newWidth,\n height: newHeight\n })\n\n this.eventEmitter.emit('parentRecalculated', {\n type: 'parentRecalculated',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container\n })\n }\n\n /**\n * Install plugin on this container manager instance\n */\n use(plugin: Plugin, options?: any): ContainerManagerInterface\n {\n // Prevent duplicate plugin installation\n if (this.installedPlugins.has(plugin)) return this\n\n try {\n plugin.install(this, options)\n this.installedPlugins.add(plugin)\n } catch (error) {\n console.error('[ContainerManager] Failed to install plugin:', error)\n }\n\n return this\n }\n\n /**\n * Check if plugin is installed on this instance\n */\n hasPlugin(plugin: Plugin): boolean\n {\n return this.installedPlugins.has(plugin)\n }\n\n /**\n * Get all installed plugins on this instance\n */\n getInstalledPlugins(): Plugin[]\n {\n return Array.from(this.installedPlugins)\n }\n\n /**\n * Destroy container manager with proper cleanup\n */\n destroy(): void\n {\n // Clean up reactive effects\n this.reactiveEffects.forEach(effect => effect())\n this.reactiveEffects = []\n\n // Destroy reactive streams\n this.stateChangeStream.destroy()\n this.dragStream.destroy()\n this.resizeStream.destroy()\n\n this.eventEmitter.destroy()\n this.pluginEventEmitter.destroy()\n this.domUpdateEffect()\n\n // Remove event listeners\n this.dragHandle.removeEventListener('mousedown', this.onDragStart)\n this.dragHandle.removeEventListener('touchstart', this.onDragStart)\n this.dragHandle.removeEventListener('contextmenu', this.onContextMenu)\n\n // Remove resize handle events\n this.resizeHandles.forEach((handle, direction) => {\n handle.removeEventListener('mousedown', (e) => this.onResizeStart(e, direction))\n handle.removeEventListener('touchstart', (e) => this.onResizeStart(e, direction))\n })\n\n // Clean up ResizeObservers\n if (this.resizeObserver) {\n this.resizeObserver.disconnect()\n this.resizeObserver = null\n }\n\n if (this.parentResizeObserver) {\n this.parentResizeObserver.disconnect()\n this.parentResizeObserver = null\n }\n\n // Clear installed plugins\n this.installedPlugins.clear()\n\n this.zIndexState.remove(this.config._uid)\n }\n}\n","// src/plugins/SnappingPlugin.ts\n\nimport type { ContainerManagerInterface, Plugin, ContainerState } from '../core/types'\nimport { reactive } from '@alekstar79/reactive-event-system'\n\n/**\n * Configuration options for SnappingPlugin\n */\nexport interface SnappingPluginOptions {\n snapStep?: number\n enabled?: boolean\n}\n\n/**\n * Extended container manager interface with plugin methods\n */\nexport interface SnappingContainerManager extends ContainerManagerInterface {\n setSnapStep?(step: number): void\n setSnappingEnabled?(enabled: boolean): void\n getSnappingConfig?(): SnappingPluginOptions\n}\n\n/**\n * Reactive state for snapping plugin\n */\ninterface SnappingPluginState {\n snapStep: number\n enabled: boolean\n isActive: boolean\n lastPosition: { x: number; y: number } | null\n}\n\n/**\n * Snapping plugin for Container Manager\n */\nexport class SnappingPlugin implements Plugin\n{\n private static _pluginId: Symbol = Symbol('SnappingPlugin')\n\n get pluginId(): Symbol {\n return SnappingPlugin._pluginId\n }\n\n // Plugin state\n private reactiveState = reactive<SnappingPluginState>({\n snapStep: 10,\n enabled: true,\n isActive: false,\n lastPosition: null\n })\n\n private manager!: ContainerManagerInterface & SnappingContainerManager\n private startState: ContainerState | null = null\n private startX: number = 0\n private startY: number = 0\n\n constructor(options: SnappingPluginOptions = {})\n {\n // Initialize with options\n this.reactiveState.snapStep = options.snapStep ?? 10\n this.reactiveState.enabled = options.enabled ?? true\n\n this.onDragMove = this.onDragMove.bind(this)\n this.onDragEnd = this.onDragEnd.bind(this)\n }\n\n /**\n * Install plugin on container manager instance with reactive state\n */\n install(manager: ContainerManagerInterface, options?: SnappingPluginOptions): void\n {\n this.manager = manager as ContainerManagerInterface & SnappingContainerManager\n\n // Update configuration if provided during installation\n if (options) {\n this.reactiveState.snapStep = options.snapStep ?? this.reactiveState.snapStep\n this.reactiveState.enabled = options.enabled ?? this.reactiveState.enabled\n }\n\n // Override drag handling methods\n this.overrideDragMethods()\n // Add plugin methods to manager for dynamic control\n this.addPluginMethods()\n }\n\n /**\n * Override drag handling methods to add snapping functionality\n */\n private overrideDragMethods(): void\n {\n if (!this.manager) return\n\n // Create new drag handle with snapping support\n const dragHandle = this.manager.getContainer().querySelector('.drag-handle') as HTMLElement\n if (dragHandle) {\n // Add our own event listeners\n dragHandle.onmousedown = (e: MouseEvent) => {\n this.onDragStart(e)\n }\n\n // Add touch support\n dragHandle.ontouchstart = (e: TouchEvent) => {\n this.onDragStart(e)\n }\n }\n }\n\n /**\n * Handle drag start event with snapping support\n */\n private onDragStart(e: MouseEvent | TouchEvent): void\n {\n if (!this.manager || this.manager.getMode() === 'pinned') return\n\n e.preventDefault()\n this.manager.bringToFront?.()\n\n // Update state\n this.reactiveState.isActive = true\n\n const clientX = e instanceof MouseEvent ? e.clientX : e.touches[0].clientX\n const clientY = e instanceof MouseEvent ? e.clientY : e.touches[0].clientY\n\n this.startX = clientX\n this.startY = clientY\n this.startState = this.manager.getState()\n\n // Store last position\n this.reactiveState.lastPosition = { x: this.startState.x, y: this.startState.y }\n\n // Add event listeners for drag movement and end\n document.addEventListener('mousemove', this.onDragMove)\n document.addEventListener('mouseup', this.onDragEnd)\n document.addEventListener('touchmove', this.onDragMove)\n document.addEventListener('touchend', this.onDragEnd)\n\n this.manager.emitPluginEvent('dragStart', {\n type: 'drag',\n state: this.startState,\n mode: this.manager.getMode()\n })\n }\n\n /**\n * Handle drag movement with reactive snapping\n */\n private onDragMove(e: MouseEvent | TouchEvent): void\n {\n if (!this.reactiveState.isActive || !this.manager || !this.startState) return\n\n const { clientX, clientY } = this.manager.directionResolver(\n e instanceof MouseEvent ? e.clientX : e.touches[0].clientX,\n e instanceof MouseEvent ? e.clientY : e.touches[0].clientY\n )\n\n let deltaX = clientX - this.startX\n let deltaY = clientY - this.startY\n\n // Apply snapping if enabled\n if (this.reactiveState.enabled) {\n const snappedDeltas = this.applySnapping(deltaX, deltaY)\n deltaX = snappedDeltas.deltaX\n deltaY = snappedDeltas.deltaY\n }\n\n const newState: ContainerState = {\n x: this.startState.x + deltaX,\n y: this.startState.y + deltaY,\n width: this.startState.width,\n height: this.startState.height\n }\n\n // Constrain to viewport if enabled\n const config = (this.manager as any).config\n if (config?.constrainToViewport) {\n this.constrainToViewport(newState)\n }\n\n this.manager.setState(newState)\n\n // Update last position\n this.reactiveState.lastPosition = { x: newState.x, y: newState.y }\n\n this.manager.emitPluginEvent('drag', {\n type: 'drag',\n state: newState,\n mode: this.manager.getMode()\n })\n }\n\n /**\n * Handle drag end event\n */\n private onDragEnd(): void\n {\n if (!this.manager) return\n\n // Update state\n this.reactiveState.isActive = false\n this.reactiveState.lastPosition = null\n this.startState = null\n\n // Remove event listeners\n document.removeEventListener('mousemove', this.onDragMove)\n document.removeEventListener('mouseup', this.onDragEnd)\n document.removeEventListener('touchmove', this.onDragMove)\n document.removeEventListener('touchend', this.onDragEnd)\n\n this.manager.emitPluginEvent('dragEnd', {\n type: 'drag',\n state: this.manager.getState(),\n mode: this.manager.getMode()\n })\n }\n\n /**\n * Apply snapping to drag movement based on current mode\n */\n private applySnapping(deltaX: number, deltaY: number): { deltaX: number; deltaY: number }\n {\n return {\n deltaX: this.snapToGrid(deltaX, this.reactiveState.snapStep),\n deltaY: this.snapToGrid(deltaY, this.reactiveState.snapStep)\n }\n }\n\n /**\n * Snap value to grid using reactive step\n */\n private snapToGrid(value: number, step: number): number\n {\n return Math.round(value / step) * step\n }\n\n /**\n * Constrain container to viewport boundaries\n */\n private constrainToViewport(state: ContainerState): void\n {\n const viewportWidth = window.innerWidth || document.documentElement.clientWidth\n const viewportHeight = window.innerHeight || document.documentElement.clientHeight\n\n state.x = Math.max(0, Math.min(state.x, viewportWidth - state.width))\n state.y = Math.max(0, Math.min(state.y, viewportHeight - state.height))\n }\n\n /**\n * Add plugin methods to container manager\n */\n private addPluginMethods(): void\n {\n // Methods that update reactive state\n this.manager.setSnapStep = (step: number): void => {\n this.reactiveState.snapStep = step\n this.manager.emitPluginEvent('snapStepChanged', { snapStep: step })\n }\n\n this.manager.setSnappingEnabled = (enabled: boolean): void => {\n this.reactiveState.enabled = enabled\n this.manager.emitPluginEvent('snappingEnabledChanged', { enabled })\n }\n\n this.manager.getSnappingConfig = (): SnappingPluginOptions => {\n return {\n snapStep: this.reactiveState.snapStep,\n enabled: this.reactiveState.enabled\n }\n }\n }\n\n /**\n * Clean up plugin resources\n */\n destroy(): void\n {\n // Clean up reactive state\n this.reactiveState.isActive = false\n this.reactiveState.lastPosition = null\n }\n}\n","// src/plugins/EdgeDockingPlugin.ts\n\nimport { Plugin, ContainerManagerInterface } from '../core/types'\nimport { type IEdgeController, createTracker } from '../utils'\n\nexport type Edge = 'top' | 'bottom' | 'left' | 'right'\n\nexport interface DockedContainer {\n element: HTMLElement\n originalPosition: {\n top: number\n left: number\n width: number\n height: number\n transform: string\n position: string\n }\n edge: Edge\n screenPosition: {\n x: number\n y: number\n }\n}\n\nexport interface EdgeDockingConfig {\n edgeThreshold?: number\n visiblePeek?: number\n animationDuration?: number\n enabled?: boolean\n}\n\nexport class EdgeDockingPlugin implements Plugin\n{\n private static _pluginId: Symbol = Symbol('EdgeDockingPlugin')\n\n get pluginId(): Symbol {\n return EdgeDockingPlugin._pluginId\n }\n\n private dockedContainers = new Map<HTMLElement, DockedContainer>()\n private occupiedEdges = new Map<Edge, HTMLElement | null>()\n private tracker: IEdgeController = createTracker({ emitter: true, edgeThreshold: 20 })\n private manager!: ContainerManagerInterface\n\n private readonly edgeThreshold: number\n\n constructor(config: EdgeDockingConfig = {})\n {\n this.edgeThreshold = config.edgeThreshold ?? 30\n\n // Initialize all edges as available\n this.occupiedEdges.set('top', null)\n this.occupiedEdges.set('bottom', null)\n this.occupiedEdges.set('left', null)\n this.occupiedEdges.set('right', null)\n }\n\n install(manager: ContainerManagerInterface): void\n {\n this.manager = manager\n\n // Set up edge tracking\n this.tracker.addTarget(this.manager.getContainer())\n\n // Subscribe to edge events for visual feedback\n this.tracker.on('edge:enter', (data) => {\n if (data.source === 'element' && data.element === this.manager.getContainer()) {\n this.handleEdgeEnter(data.edge!)\n }\n })\n\n this.tracker.on('edge:leave', (data) => {\n if (data.source === 'element' && data.element === this.manager.getContainer()) {\n this.handleEdgeLeave(data.edge!)\n }\n })\n\n this.attachEventHandlers()\n }\n\n /**\n * Handle edge enter for visual feedback\n */\n private handleEdgeEnter(edge: Edge): void\n {\n const element = this.manager.getContainer()\n\n if (this.isEdgeOccupied(edge)) {\n // Edge is occupied - show blocked hint\n element.classList.add('edge-dock-hint', `edge-dock-hint-${edge}`, 'edge-dock-blocked')\n } else {\n // Edge is available - show available hint\n element.classList.add('edge-dock-hint', `edge-dock-hint-${edge}`)\n }\n }\n\n /**\n * Handle edge leave - remove visual feedback\n */\n private handleEdgeLeave(edge: Edge): void\n {\n const element = this.manager.getContainer()\n element.classList.remove('edge-dock-hint', `edge-dock-hint-${edge}`, 'edge-dock-blocked')\n }\n\n /**\n * Check if an edge is occupied by another container\n */\n private isEdgeOccupied(edge: Edge): boolean\n {\n return this.occupiedEdges.get(edge) !== null\n }\n\n /**\n * Attach event handlers to container manager\n */\n private attachEventHandlers(): void\n {\n // Add mouse events for hover behavior\n const container = this.manager.getContainer()\n container.addEventListener('mouseenter', this.onMouseEnter.bind(this))\n container.addEventListener('mouseleave', this.onMouseLeave.bind(this))\n\n this.manager.on('dragStart', (data: any) => {\n this.onDragStart(data.element)\n })\n\n this.manager.on('drag', (data: any) => {\n this.onDrag(data.element)\n })\n\n this.manager.on('dragEnd', (data: any) => {\n this.onDragEnd(data.element)\n })\n }\n\n /**\n * Handle mouse enter - show docked container\n */\n private onMouseEnter(): void\n {\n const element = this.manager.getContainer()\n if (this.isContainerDocked(element)) {\n element.classList.add('edge-docked-visible')\n }\n }\n\n /**\n * Handle mouse leave - hide docked container\n */\n private onMouseLeave(): void\n {\n const element = this.manager.getContainer()\n if (this.isContainerDocked(element)) {\n element.classList.remove('edge-docked-visible')\n }\n }\n\n /**\n * Handle drag start - undock if docked\n */\n private onDragStart(element: HTMLElement): void\n {\n // Remove any edge hints and visibility\n element.classList.remove(\n 'edge-dock-hint', 'edge-dock-blocked', 'edge-docked-visible',\n 'edge-dock-hint-top', 'edge-dock-hint-bottom',\n 'edge-dock-hint-left', 'edge-dock-hint-right'\n )\n\n const docked = this.dockedContainers.get(element)\n if (docked) {\n this.undockContainer(element, docked)\n }\n }\n\n /**\n * Handle drag - update edge hints based on position\n */\n private onDrag(element: HTMLElement): void\n {\n const rect = element.getBoundingClientRect()\n const edge = this.getClosestEdge(rect)\n\n // Update visual hints based on current position\n this.updateEdgeHints(element, edge)\n }\n\n /**\n * Handle drag end - dock if close to edge\n */\n private onDragEnd(element: HTMLElement): void\n {\n const rect = element.getBoundingClientRect()\n const edge = this.getClosestEdge(rect)\n\n // Remove all hints\n element.classList.remove(\n 'edge-dock-hint', 'edge-dock-blocked',\n 'edge-dock-hint-top', 'edge-dock-hint-bottom',\n 'edge-dock-hint-left', 'edge-dock-hint-right'\n )\n\n if (edge && !this.isEdgeOccupied(edge)) {\n this.dockContainer(element, edge)\n }\n }\n\n /**\n * Update visual hints for edge docking\n */\n private updateEdgeHints(element: HTMLElement, activeEdge: Edge | null): void\n {\n // Remove all existing hints\n element.classList.remove(\n 'edge-dock-hint', 'edge-dock-blocked',\n 'edge-dock-hint-top', 'edge-dock-hint-bottom',\n 'edge-dock-hint-left', 'edge-dock-hint-right'\n )\n\n if (activeEdge) {\n if (this.isEdgeOccupied(activeEdge)) {\n element.classList.add('edge-dock-hint', `edge-dock-hint-${activeEdge}`, 'edge-dock-blocked')\n } else {\n element.classList.add('edge-dock-hint', `edge-dock-hint-${activeEdge}`)\n }\n }\n }\n\n /**\n * Get the closest edge to the container\n */\n private getClosestEdge(rect: DOMRect): Edge | null\n {\n const distTop = rect.top\n const distLeft = rect.left\n const distBottom = window.innerHeight - rect.bottom\n const distRight = window.innerWidth - rect.right\n\n const distances = {\n top: distTop,\n bottom: distBottom,\n left: distLeft,\n right: distRight\n }\n\n const validEdges = Object.entries(distances)\n .filter(([_, dist]) => dist >= -this.edgeThreshold && dist <= this.edgeThreshold)\n .sort((a, b) => a[1] - b[1])\n\n return validEdges.length > 0\n ? validEdges[0][0] as Edge\n : null\n }\n\n /**\n * Dock container to specified edge\n */\n private dockContainer(element: HTMLElement, edge: Edge): void\n {\n // Save current state before any modifications\n const style = window.getComputedStyle(element)\n const rect = element.getBoundingClientRect()\n\n // Save screen position for proper restoration\n const screenPosition = {\n x: rect.left,\n y: rect.top\n }\n\n this.dockedContainers.set(element, {\n element,\n edge,\n screenPosition,\n originalPosition: {\n top: parseFloat(style.top) || rect.top,\n left: parseFloat(style.left) || rect.left,\n width: rect.width,\n height: rect.height,\n transform: style.transform,\n position: style.position\n }\n })\n\n // Mark edge as occupied\n this.occupiedEdges.set(edge, element)\n\n // Clear any existing positioning styles that might interfere\n element.style.top = ''\n element.style.bottom = ''\n element.style.left = ''\n element.style.right = ''\n element.style.width = ''\n element.style.height = ''\n element.style.transform = ''\n\n // Apply docking styles based on edge with proper positioning\n element.classList.add('edge-docked', `edge-docked-${edge}`)\n\n // Set proper positioning for each edge to prevent shifting\n this.applyEdgePositioning(element, edge, screenPosition)\n\n // Set data attribute for CSS targeting\n element.setAttribute('data-docked', 'true')\n element.setAttribute('data-docked-edge', edge)\n }\n\n /**\n * Apply proper positioning for each edge to prevent shifting\n */\n private applyEdgePositioning(\n element: HTMLElement,\n edge: Edge,\n screenPosition: { x: number; y: number }\n ): void {\n const rect = element.getBoundingClientRect()\n\n switch (edge) {\n case 'top':\n // For top edge - preserve horizontal position\n element.style.left = `${screenPosition.x}px`\n element.style.width = `${rect.width}px`\n break\n case 'bottom':\n // For bottom edge - preserve horizontal position\n element.style.left = `${screenPosition.x}px`\n element.style.width = `${rect.width}px`\n break\n case 'left':\n // For left edge - preserve vertical position\n element.style.top = `${screenPosition.y}px`\n element.style.height = `${rect.height}px`\n break\n case 'right':\n // For right edge - preserve vertical position\n element.style.top = `${screenPosition.y}px`\n element.style.height = `${rect.height}px`\n break\n }\n }\n\n /**\n * Undock container from edge\n */\n private undockContainer(element: HTMLElement, docked: DockedContainer): void\n {\n // Remove from docked containers\n this.dockedContainers.delete(element)\n\n // Free the edge\n this.occupiedEdges.set(docked.edge, null)\n\n // Remove all docking classes and attributes\n element.classList.remove(\n 'edge-docked', 'edge-docked-visible',\n 'edge-docked-top', 'edge-docked-bottom',\n 'edge-docked-left', 'edge-docked-right'\n )\n\n element.removeAttribute('data-docked')\n element.removeAttribute('data-docked-edge')\n\n // Clear all positioning styles\n element.style.top = ''\n element.style.bottom = ''\n element.style.left = ''\n element.style.right = ''\n element.style.width = ''\n element.style.height = ''\n element.style.transform = ''\n element.style.position = ''\n\n // Restore position using saved screen coordinates to avoid shifting\n this.restoreOriginalPosition(element, docked)\n }\n\n /**\n * Restore container to its original position without shifting\n */\n private restoreOriginalPosition(_element: HTMLElement, docked: DockedContainer): void\n {\n // Use saved screen coordinates for precise position restoration\n this.manager.setState({\n x: docked.screenPosition.x,\n y: docked.screenPosition.y,\n width: docked.originalPosition.width,\n height: docked.originalPosition.height\n })\n }\n\n /**\n * Get the docked container for a specific edge\n */\n getDockedContainer(edge: Edge): DockedContainer | null\n {\n const container = this.occupiedEdges.get(edge)\n return container ? this.dockedContainers.get(container) || null : null\n }\n\n /**\n * Check if container is docked\n */\n isContainerDocked(element: HTMLElement): boolean\n {\n return this.dockedContainers.has(element)\n }\n\n /**\n * Get the edge where container is docked\n */\n getContainerDockEdge(element: HTMLElement): Edge | null\n {\n const docked = this.dockedContainers.get(element)\n return docked ? docked.edge : null\n }\n\n /**\n * Clean up resources\n */\n destroy(): void\n {\n const container = this.manager.getContainer()\n container.removeEventListener('mouseenter', this.onMouseEnter.bind(this))\n container.removeEventListener('mouseleave', this.onMouseLeave.bind(this))\n\n // Undock all containers\n this.dockedContainers.forEach((docked, element) => {\n this.undockContainer(element, docked)\n })\n\n this.dockedContainers.clear()\n\n // Reset occupied edges\n this.occupiedEdges.forEach((_, edge) => {\n this.occupiedEdges.set(edge, null)\n })\n }\n}\n","// src/plugins/StatePersistencePlugin.ts\n\nimport { batch, effect, reactive } from '@alekstar79/reactive-event-system'\nimport { debounce } from '@alekstar79/utility'\n\nimport {\n ContainerManagerInterface,\n Plugin,\n DirectionMode,\n MovementMode,\n ResizeConfig,\n} from '../core/types'\n\n/**\n * Saved state for a container\n */\nexport interface SavedContainerState {\n x: number\n y: number\n width: number\n height: number\n mode: MovementMode\n draggingDirection: DirectionMode\n isMaximized: boolean\n containerType: string\n title?: string\n color?: string\n useSnapping?: boolean\n isClosed?: boolean\n parentElementId?: string\n closedTimestamp?: number\n resize?: ResizeConfig\n storable?: boolean\n [p: string]: any\n}\n\n/**\n * Reactive state for persistence plugin\n */\ninterface PersistencePluginState {\n isSaving: boolean\n lastSaved: number | null\n pendingChanges: boolean\n containerStates: Record<string, SavedContainerState>\n closedQueue: string[]\n storableContainers: string[]\n}\n\n/**\n * State persistence plugin for Container Manager\n */\nexport class StatePersistencePlugin implements Plugin\n{\n private static _pluginId: Symbol = Symbol('StatePersistencePlugin')\n\n get pluginId(): Symbol {\n return StatePersistencePlugin._pluginId\n }\n\n private static readonly STORAGE_KEY = 'containerManagerState'\n private static readonly CLOSED_QUEUE_KEY = 'containerManagerClosedQueue'\n private static readonly STORABLE_CONTAINERS_KEY = 'containerManagerStorableContainers'\n\n // Статическое реактивное состояние для всех плагинов\n private static reactiveState = reactive<PersistencePluginState>({\n isSaving: false,\n lastSaved: null,\n pendingChanges: false,\n containerStates: {},\n closedQueue: [],\n storableContainers: []\n })\n\n // Вычисляемое свойство для доступа к состояниям\n private static get containerStates() {\n return StatePersistencePlugin.reactiveState.containerStates\n }\n\n private static get closedQueue() {\n return StatePersistencePlugin.reactiveState.closedQueue\n }\n\n private static get storableContainers() {\n return StatePersistencePlugin.reactiveState.storableContainers\n }\n\n private static isGlobalEventsInitialized = false\n private manager?: ContainerManagerInterface\n private containerId?: string\n private storable: boolean = true\n\n // Эффект для автоматического сохранения при изменении состояния\n private autoSaveEffect?: () => void\n\n static containers: {\n manager: ContainerManagerInterface,\n containerId: string,\n storable?: boolean\n }[] = []\n\n /**\n * Install plugin on container manager instance with reactive state management\n */\n install(\n manager: ContainerManagerInterface,\n options?: { containerId: string; storable?: boolean }\n ): void {\n this.manager = manager\n this.containerId = options?.containerId\n this.storable = options?.storable ?? true\n\n if (!this.containerId) {\n console.warn('[StatePersistencePlugin] containerId is required for state persistence')\n return\n }\n\n // Register container for global event handling\n StatePersistencePlugin.containers.push({\n manager,\n containerId: this.containerId,\n storable: this.storable\n })\n\n // Register demo container if it's a demo\n if (this.storable) {\n StatePersistencePlugin.registerContainer(this.containerId)\n }\n\n // Initialize global events only once\n if (!StatePersistencePlugin.isGlobalEventsInitialized) {\n StatePersistencePlugin.initializeGlobalEvents()\n StatePersistencePlugin.isGlobalEventsInitialized = true\n }\n\n // Set up auto-save effect for demo containers\n if (this.storable) {\n this.setupAutoSaveEffect()\n }\n\n this.bindContainerEvents()\n }\n\n /**\n * Set up reactive auto-save effect for container state changes\n */\n private setupAutoSaveEffect(): void\n {\n if (!this.manager || !this.containerId) return\n\n // Create debounced auto-save effect\n const debouncedSave = debounce(() => {\n if (this.storable) {\n this.saveState()\n }\n }, 300)\n\n // Effect that triggers on container state changes\n this.autoSaveEffect = effect(() => {\n // Access manager state and mode to create dependency\n const state = this.manager!.getState()\n const mode = this.manager!.getMode()\n\n void { state, mode }\n\n // This effect will re-run whenever state or mode changes\n // We use debouncing to avoid too frequent saves\n debouncedSave()\n })\n }\n\n /**\n * Bind to container-specific events to save state on changes\n * Simplified since most saving handled using effects\n */\n private bindContainerEvents(): void\n {\n if (!this.manager) return\n\n // Only bind critical events that aren't covered by reactive effects\n this.manager.on('dragStart', () => {\n // Drag start might need immediate save for some cases\n })\n\n this.manager.on('dragEnd', () => {\n // Force save on drag end for immediate persistence\n if (this.storable) this.saveState()\n })\n\n this.manager.on('resizeEnd', () => {\n // Force save on resize end for immediate persistence\n if (this.storable) this.saveState()\n })\n\n // Listen for maximize/restore events\n this.manager.onPluginEvent('maximizeChanged', () => {\n if (this.storable) this.saveState()\n })\n\n // Listen for direction changes\n this.manager.onPluginEvent('directionChanged', () => {\n if (this.storable) this.saveState()\n })\n }\n\n /**\n * Initialize global event handlers for all containers\n */\n private static initializeGlobalEvents(): void\n {\n // Save state when page is about to unload\n window.addEventListener('beforeunload', () => {\n StatePersistencePlugin.saveAllContainers()\n })\n\n // Save state when page becomes hidden\n document.addEventListener('visibilitychange', () => {\n if (document.hidden) {\n StatePersistencePlugin.saveAllContainers()\n }\n })\n\n // Save state when window is resized\n window.addEventListener('resize', debounce(() => {\n StatePersistencePlugin.saveAllContainers()\n }, 500))\n }\n\n /**\n * Register a container as a demo container\n */\n static registerContainer(containerId: string): void\n {\n try {\n // Update reactive state\n if (!StatePersistencePlugin.storableContainers.includes(containerId)) {\n StatePersistencePlugin.storableContainers.push(containerId)\n StatePersistencePlugin.saveContainersToStorage()\n }\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to register container:', error)\n }\n }\n\n /**\n * Save demo containers to localStorage\n */\n private static saveContainersToStorage(): void\n {\n try {\n localStorage.setItem(\n StatePersistencePlugin.STORABLE_CONTAINERS_KEY,\n JSON.stringify(StatePersistencePlugin.storableContainers)\n )\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to save containers:', error)\n }\n }\n\n /**\n * Get list of all demo containers\n */\n private static getContainers(): string[]\n {\n try {\n const stored = localStorage.getItem(StatePersistencePlugin.STORABLE_CONTAINERS_KEY)\n return stored ? JSON.parse(stored) : []\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to parse containers:', error)\n return []\n }\n }\n\n /**\n * Check if a container is a demo container\n */\n static isStorableContainer(containerId: string): boolean\n {\n const containers = StatePersistencePlugin.getContainers()\n return containers.includes(containerId)\n }\n\n /**\n * Get all saved states from localStorage\n */\n private static getAllStates(): Record<string, SavedContainerState>\n {\n try {\n const stored = localStorage.getItem(StatePersistencePlugin.STORAGE_KEY)\n return stored ? JSON.parse(stored) : {}\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to parse stored states:', error)\n return {}\n }\n }\n\n /**\n * Add container ID to closed containers queue\n */\n static addToClosedQueue(containerId: string): void\n {\n // Only add demo containers to the closed queue\n if (!StatePersistencePlugin.isStorableContainer(containerId)) {\n console.log(`[StatePersistencePlugin] Skipping closed queue for non-storable container: ${containerId}`)\n return\n }\n\n // Verify that the container state exists before adding to queue\n const containerState = StatePersistencePlugin.getContainerState(containerId)\n if (!containerState) {\n console.error(`[StatePersistencePlugin] Cannot add ${containerId} to closed queue: state not found`)\n return\n }\n\n // Update reactive state\n const closedQueue = StatePersistencePlugin.closedQueue\n\n // Remove if already exists (to avoid duplicates)\n const existingIndex = closedQueue.indexOf(containerId)\n if (existingIndex > -1) {\n closedQueue.splice(existingIndex, 1)\n }\n\n // Add to the end (most recent closed)\n closedQueue.push(containerId)\n StatePersistencePlugin.saveClosedQueueToStorage()\n }\n\n /**\n * Save closed queue to localStorage\n */\n private static saveClosedQueueToStorage(): void\n {\n try {\n localStorage.setItem(\n StatePersistencePlugin.CLOSED_QUEUE_KEY,\n JSON.stringify(StatePersistencePlugin.closedQueue)\n )\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to save closed queue:', error)\n }\n }\n\n /**\n * Get closed containers queue (LIFO - last in first out)\n */\n static getClosedQueue(): string[]\n {\n try {\n const stored = localStorage.getItem(StatePersistencePlugin.CLOSED_QUEUE_KEY)\n return stored ? JSON.parse(stored) : []\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to parse closed queue:', error)\n return []\n }\n }\n\n private saveState(): void\n {\n if (!this.manager || !this.containerId || !this.storable) return\n\n // Use batch updates for multiple state changes\n batch(() => {\n StatePersistencePlugin.reactiveState.isSaving = true\n StatePersistencePlugin.reactiveState.pendingChanges = true\n\n const container = this.manager!.getContainer()\n const isMaximized = container.dataset.maximized === 'true'\n\n // Getting the current state\n const state = this.manager!.getState()\n const mode = this.manager!.getMode()\n const draggingDirection = this.manager!.getDirection()\n const containerType = container.dataset.containerType || 'unknown'\n const title = container.dataset.title\n const color = container.dataset.color\n const useSnapping = container.dataset.useSnapping === 'true'\n const resizeConfig = (this.manager as any).config?.resize\n\n // Get parent element ID if exists\n const parentElement = container.parentElement\n const parentElementId = parentElement && parentElement !== document.body\n ? (parentElement.id || `parent-${this.containerId}`)\n : undefined\n\n const savedState: SavedContainerState = {\n ...state,\n mode,\n draggingDirection,\n isMaximized,\n containerType,\n title,\n color,\n useSnapping,\n isClosed: false,\n parentElementId,\n closedTimestamp: 0,\n resize: resizeConfig,\n storable: true\n }\n\n // Update reactive state\n StatePersistencePlugin.reactiveState.containerStates[this.containerId!] = savedState\n\n // Get ALL current states and update only the needed one\n const allStates = StatePersistencePlugin.getAllStates()\n allStates[this.containerId!] = savedState\n\n // Save to localStorage\n localStorage.setItem(\n StatePersistencePlugin.STORAGE_KEY,\n JSON.stringify(allStates)\n )\n\n StatePersistencePlugin.reactiveState.lastSaved = Date.now()\n StatePersistencePlugin.reactiveState.isSaving = false\n })\n }\n\n /**\n * Save container state with current manager state before closing\n */\n static saveContainerStateBeforeClose(manager: ContainerManagerInterface, containerId: string): void\n {\n // Check if this is a storable container\n const isStorableContainer = StatePersistencePlugin.isStorableContainer(containerId)\n\n // Only save state for storable containers\n if (!isStorableContainer) {\n StatePersistencePlugin.containers = StatePersistencePlugin.containers.filter(\n c => c.containerId !== containerId\n )\n return\n }\n\n const state = manager.getState()\n const mode = manager.getMode()\n\n // Get additional container data from the container element\n const container = manager.getContainer()\n const draggingDirection = manager.getDirection()\n const isMaximized = container.dataset.maximized === 'true'\n const containerType = container.dataset.containerType || 'unknown'\n const title = container.dataset.title\n const color = container.dataset.color\n const useSnapping = container.dataset.useSnapping === 'true'\n const resizeConfig = (manager as any).config?.resize\n\n // Get edge docking state\n const isEdgeDocked = (manager as any).isEdgeDocked?.() || false\n const dockEdge = (manager as any).getDockEdge?.() || null\n\n // Get parent element ID if exists\n const parentElement = container.parentElement\n const parentElementId = parentElement && parentElement !== document.body\n ? (parentElement.id || `parent-${containerId}`)\n : undefined\n\n // Create the closed container state\n const closedState: SavedContainerState = {\n ...state,\n mode,\n draggingDirection,\n isMaximized,\n isEdgeDocked,\n dockEdge: dockEdge || undefined,\n containerType,\n title,\n color,\n useSnapping,\n isClosed: true,\n parentElementId,\n closedTimestamp: Date.now(),\n resize: resizeConfig,\n storable: true\n }\n\n // Get ALL current states from localStorage\n const allStates = StatePersistencePlugin.getAllStates()\n\n // Update the state for this container\n allStates[containerId] = closedState\n\n try {\n // Save all states back to localStorage\n localStorage.setItem(\n StatePersistencePlugin.STORAGE_KEY,\n JSON.stringify(allStates)\n )\n } catch (error) {\n console.error(`[StatePersistencePlugin] Failed to save to localStorage:`, error)\n }\n\n // Update reactive state for consistency\n StatePersistencePlugin.reactiveState.containerStates[containerId] = closedState\n // Remove container from tracked containers\n StatePersistencePlugin.containers = StatePersistencePlugin.containers.filter(\n c => c.containerId !== containerId\n )\n // Add to closed containers queue - only for demo containers\n StatePersistencePlugin.addToClosedQueue(containerId)\n }\n\n /**\n * Save all containers state (for global events) - including closed ones\n */\n static saveAllContainers(): void\n {\n // Use batch update for multiple container states\n batch(() => {\n // Get current states from localStorage to preserve closed containers\n const allStates = StatePersistencePlugin.getAllStates()\n\n // Update only the open demo containers\n StatePersistencePlugin.containers\n .filter((options) => !('storable' in options && options.storable === false))\n .forEach(({ manager, containerId }) => {\n const state = manager.getState()\n const mode = manager.getMode()\n\n const container = manager.getContainer()\n const draggingDirection = manager.getDirection()\n const isMaximized = container.dataset.maximized === 'true'\n const containerType = container.dataset.containerType || 'unknown'\n const title = container.dataset.title\n const color = container.dataset.color\n const useSnapping = container.dataset.useSnapping === 'true'\n const resizeConfig = (manager as any).config?.resize\n\n const parentElement = container.parentElement\n const parentElementId = parentElement && parentElement !== document.body\n ? (parentElement.id || `parent-${containerId}`)\n : undefined\n\n allStates[containerId] = {\n ...state,\n mode,\n draggingDirection,\n isMaximized,\n containerType,\n title,\n color,\n useSnapping,\n isClosed: false,\n parentElementId,\n closedTimestamp: 0,\n resize: resizeConfig,\n storable: true\n }\n })\n\n StatePersistencePlugin.reactiveState.containerStates = allStates\n\n localStorage.setItem(\n StatePersistencePlugin.STORAGE_KEY,\n JSON.stringify(allStates)\n )\n\n StatePersistencePlugin.reactiveState.lastSaved = Date.now()\n })\n }\n\n /**\n * Remove the most recently closed container from queue and return its ID\n */\n static popLastClosedContainer(): string | null\n {\n try {\n // Update reactive state\n const closedQueue = StatePersistencePlugin.closedQueue\n\n if (closedQueue.length === 0) return null\n\n const lastContainerId = closedQueue.pop()!\n StatePersistencePlugin.saveClosedQueueToStorage()\n\n return lastContainerId\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to pop last closed container:', error)\n return null\n }\n }\n\n /**\n * Check if there are any closed containers that can be restored\n */\n static hasClosedContainers(): boolean\n {\n return StatePersistencePlugin.closedQueue.length > 0\n }\n\n /**\n * Get saved state for specific container (including closed ones)\n */\n static getContainerState(containerId: string): SavedContainerState | null\n {\n try {\n // First check reactive state\n const stateFromReactive = StatePersistencePlugin.containerStates[containerId]\n if (stateFromReactive) return stateFromReactive\n\n // If not found in reactive state, check localStorage directly\n const states = StatePersistencePlugin.getAllStates()\n const stateFromStorage = states[containerId]\n\n if (stateFromStorage) {\n // Update reactive state for consistency\n StatePersistencePlugin.reactiveState.containerStates[containerId] = stateFromStorage\n return stateFromStorage\n }\n\n return null\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to get container state:', error)\n return null\n }\n }\n\n /**\n * Get all container states including closed ones\n */\n static getAllContainerStates(): Record<string, SavedContainerState>\n {\n return StatePersistencePlugin.getAllStates()\n }\n\n /**\n * Check if container state exists (including closed)\n */\n static hasContainerState(containerId: string): boolean\n {\n return StatePersistencePlugin.getContainerState(containerId) !== null\n }\n\n /**\n * Update container state in storage\n */\n static updateContainerState(containerId: string, updates: Partial<SavedContainerState>): void\n {\n try {\n // Getting the current states from localStorage\n const currentStates = StatePersistencePlugin.getAllStates()\n\n // Updating the status for a specific container\n const currentState = currentStates[containerId]\n if (currentState) {\n const updatedState = { ...currentState, ...updates }\n currentStates[containerId] = updatedState\n\n // Saving all states in localStorage\n localStorage.setItem(\n StatePersistencePlugin.STORAGE_KEY,\n JSON.stringify(currentStates)\n )\n\n // Also update the reactive state for consistency\n StatePersistencePlugin.reactiveState.containerStates[containerId] = updatedState\n } else {\n console.warn(`[StatePersistencePlugin] No state found for container ${containerId}, creating new state`)\n\n // Create new state if it doesn't exist\n const newState: SavedContainerState = {\n x: 0,\n y: 0,\n width: 300,\n height: 200,\n mode: 'smooth',\n draggingDirection: 'all',\n isMaximized: false,\n containerType: 'unknown',\n isClosed: false,\n storable: StatePersistencePlugin.isStorableContainer(containerId),\n ...updates\n }\n\n currentStates[containerId] = newState\n\n localStorage.setItem(\n StatePersistencePlugin.STORAGE_KEY,\n JSON.stringify(currentStates)\n )\n\n StatePersistencePlugin.reactiveState.containerStates[containerId] = newState\n }\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to update container state:', error)\n }\n }\n\n /**\n * Clear all saved states from localStorage\n */\n static clearStorage(): void\n {\n // Reset all reactive state\n batch(() => {\n StatePersistencePlugin.reactiveState.containerStates = {}\n StatePersistencePlugin.closedQueue.length = 0\n StatePersistencePlugin.storableContainers.length = 0\n StatePersistencePlugin.reactiveState.isSaving = false\n StatePersistencePlugin.reactiveState.lastSaved = null\n StatePersistencePlugin.reactiveState.pendingChanges = false\n })\n\n localStorage.removeItem(StatePersistencePlugin.STORAGE_KEY)\n localStorage.removeItem(StatePersistencePlugin.CLOSED_QUEUE_KEY)\n localStorage.removeItem(StatePersistencePlugin.STORABLE_CONTAINERS_KEY)\n StatePersistencePlugin.containers = []\n }\n\n /**\n * Initialize reactive state from localStorage on plugin load\n */\n static initializeReactiveState(): void\n {\n try {\n // Load initial state from localStorage\n const storedStates = StatePersistencePlugin.getAllStates()\n const closedQueue = StatePersistencePlugin.getClosedQueue()\n const containers = StatePersistencePlugin.getContainers()\n\n // Update reactive state\n batch(() => {\n StatePersistencePlugin.reactiveState.containerStates = storedStates\n\n // Update closedQueue and storableContainers\n StatePersistencePlugin.closedQueue.length = 0\n StatePersistencePlugin.closedQueue.push(...closedQueue)\n\n StatePersistencePlugin.storableContainers.length = 0\n StatePersistencePlugin.storableContainers.push(...containers)\n })\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to initialize reactive state:', error)\n }\n }\n\n /**\n * Get plugin metrics and statistics\n */\n static getMetrics(): {\n totalContainers: number\n demoContainers: number\n closedContainers: number\n lastSaved: number | null\n isSaving: boolean\n } {\n return {\n totalContainers: Object.keys(StatePersistencePlugin.containerStates).length,\n demoContainers: StatePersistencePlugin.storableContainers.length,\n closedContainers: StatePersistencePlugin.closedQueue.length,\n lastSaved: StatePersistencePlugin.reactiveState.lastSaved,\n isSaving: StatePersistencePlugin.reactiveState.isSaving\n }\n }\n\n /**\n * Debug method to check the current state of localStorage\n */\n static debugStorage(): void\n {\n console.log(`[StatePersistencePlugin] === START DEBUG INFO ===`)\n\n try {\n const stored = localStorage.getItem(StatePersistencePlugin.STORAGE_KEY)\n if (stored) {\n const states = JSON.parse(stored)\n console.log(`[StatePersistencePlugin] Number of states: ${Object.keys(states).length}`)\n console.log(`[StatePersistencePlugin] State keys:`, Object.keys(states))\n\n for (const [key, state] of Object.entries(states)) {\n console.log(`[StatePersistencePlugin] State ${key}:`, {\n storable: (state as any).storable,\n isClosed: (state as any).isClosed,\n title: (state as any).title\n })\n }\n }\n\n const closedQueue = localStorage.getItem(StatePersistencePlugin.CLOSED_QUEUE_KEY)\n console.log(`[StatePersistencePlugin] Closed queue:`, closedQueue ? JSON.parse(closedQueue) : [])\n\n const storableContainers = localStorage.getItem(StatePersistencePlugin.STORABLE_CONTAINERS_KEY)\n console.log(`[StatePersistencePlugin] Storable containers:`, storableContainers ? JSON.parse(storableContainers) : [])\n\n } catch (error) {\n console.error(`[StatePersistencePlugin] Debug error:`, error)\n }\n\n console.log(`[StatePersistencePlugin] === END DEBUG INFO ===`)\n }\n\n /**\n * Clean up plugin resources\n */\n destroy(): void\n {\n // Clean up reactive effect\n if (this.autoSaveEffect) {\n this.autoSaveEffect()\n this.autoSaveEffect = undefined\n }\n\n // Remove this container from tracked containers\n if (this.containerId) {\n StatePersistencePlugin.containers = StatePersistencePlugin.containers.filter(\n c => c.containerId !== this.containerId\n )\n }\n }\n}\n\n// Initialize reactive state when module loads\nStatePersistencePlugin.initializeReactiveState()\n","// src/plugins/LoggingPlugin.ts\n\nimport { ContainerManagerInterface, Plugin, ContainerEvent } from '../core/types'\nimport { debounce } from '@alekstar79/utility'\n\n/**\n * Logging plugin for Container Manager\n * Logs container events and displays notifications\n */\nexport class LoggingPlugin implements Plugin\n{\n private static _pluginId: Symbol = Symbol('LoggingPlugin')\n\n get pluginId(): Symbol {\n return LoggingPlugin._pluginId\n }\n\n private manager?: ContainerManagerInterface\n private containerName: string = ''\n private notificationSystem: any = null\n\n /**\n * Install plugin on container manager instance\n */\n install(manager: ContainerManagerInterface, options?: any): void\n {\n this.manager = manager\n this.containerName = options?.containerName || `Container-${Math.random().toString(36).substring(2, 11)}`\n this.notificationSystem = options?.notificationSystem\n this.bindEvents()\n }\n\n /**\n * Bind to container events\n */\n private bindEvents(): void\n {\n if (!this.manager) return\n\n this.logResize = debounce(this.logResize.bind(this), 250)\n this.logDrag = debounce(this.logDrag.bind(this), 250)\n this.logViewportResize = debounce(this.logViewportResize.bind(this), 250)\n this.logSnapStep = debounce(this.logSnapStep.bind(this), 250)\n\n // Mode change events\n this.manager.on('modeChange', (event: ContainerEvent) => {\n this.logModeChange(event.mode)\n })\n\n // Resize events with debounce\n this.manager.on('resize', (event: ContainerEvent) => {\n this.logResize(event.state)\n })\n\n this.manager.on('resizeEnd', (event: ContainerEvent) => {\n this.logResize(event.state)\n })\n\n // Drag events with debounce\n this.manager.on('drag', (event: ContainerEvent) => {\n this.logDrag(event.state)\n })\n\n this.manager.on('dragEnd', (event: ContainerEvent) => {\n this.logDrag(event.state)\n })\n\n // Viewport resize events\n this.manager.on('viewportResize', (event: ContainerEvent) => {\n this.logViewportResize(event.state)\n })\n\n // Plugin events for snapping\n this.manager.onPluginEvent('snappingEnabledChanged', (data: any) => {\n this.logSnappingEnabled(data.enabled)\n })\n\n this.manager.onPluginEvent('snapStepChanged', (data: any) => {\n this.logSnapStep(data.snapStep)\n })\n\n // Direction change events\n this.manager.onPluginEvent('directionChanged', (data: any) => {\n this.logDirectionChange(data.direction)\n })\n }\n\n /**\n * Log resize event\n */\n private logResize(state: any): void\n {\n const message = `Resized to ${Math.round(state.width)}×${Math.round(state.height)}`\n this.showNotification(message, 'info')\n }\n\n /**\n * Log drag event\n */\n private logDrag(state: any): void\n {\n const message = `Moved to (${Math.round(state.x)}, ${Math.round(state.y)})`\n this.showNotification(message, 'info')\n }\n\n /**\n * Log mode change event\n */\n private logModeChange(mode: string): void\n {\n const message = `Mode changed to ${mode}`\n this.showNotification(message, 'warning')\n }\n\n /**\n * Log viewport resize adjustment event\n */\n private logViewportResize(state: any): void\n {\n const message = `Adjusted position to (${Math.round(state.x)}, ${Math.round(state.y)}) due to window resize`\n this.showNotification(message, 'info')\n }\n\n /**\n * Log snapping enabled/disabled\n */\n private logSnappingEnabled(enabled: boolean): void\n {\n const message = `Snapping ${enabled ? 'enabled' : 'disabled'}`\n this.showNotification(message, enabled ? 'success' : 'warning')\n }\n\n /**\n * Log snap step change\n */\n private logSnapStep(step: number): void\n {\n const message = `Snap step changed to ${step}px`\n this.showNotification(message, 'info')\n }\n\n /**\n * Log direction change\n */\n private logDirectionChange(direction: string): void\n {\n const message = `Drag direction: ${direction}`\n this.showNotification(message, 'info')\n }\n\n /**\n * Show notification using notification system\n */\n private showNotification(message: string, type: 'success' | 'error' | 'warning' | 'info'): void\n {\n if (this.notificationSystem) {\n const fullMessage = `${this.containerName}: ${message}`\n this.notificationSystem.show(fullMessage, type)\n }\n }\n}\n","export default \"<div class=\\\"media-content\\\">\\n <h4>🎬 Media Gallery</h4>\\n <div class=\\\"media-grid\\\">\\n <div class=\\\"media-item\\\" style=\\\"background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\\\">\\n <span>Image 1</span>\\n </div>\\n <div class=\\\"media-item\\\" style=\\\"background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\\\">\\n <span>Image 2</span>\\n </div>\\n <div class=\\\"media-item\\\" style=\\\"background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);\\\">\\n <span>Image 3</span>\\n </div>\\n </div>\\n <p class=\\\"media-description\\\">\\n This content is loaded from a template file! Templates allow you to separate content structure from logic.\\n </p>\\n <div class=\\\"template-info\\\">\\n <small>📁 Template: media.html</small>\\n </div>\\n</div>\\n\"","export default \"<div class=\\\"stats-content\\\">\\n <h4>📊 Statistics Panel</h4>\\n <div class=\\\"stats-grid\\\">\\n <div class=\\\"stat-card\\\">\\n <div class=\\\"stat-value\\\">42</div>\\n <div class=\\\"stat-label\\\">Views</div>\\n </div>\\n <div class=\\\"stat-card\\\">\\n <div class=\\\"stat-value\\\">18</div>\\n <div class=\\\"stat-label\\\">Likes</div>\\n </div>\\n <div class=\\\"stat-card\\\">\\n <div class=\\\"stat-value\\\">7</div>\\n <div class=\\\"stat-label\\\">Shares</div>\\n </div>\\n </div>\\n <div class=\\\"progress-section\\\">\\n <div class=\\\"progress-item\\\">\\n <label>Performance</label>\\n <div class=\\\"progress-bar\\\">\\n <div class=\\\"progress-fill\\\" style=\\\"width: 75%\\\"></div>\\n </div>\\n </div>\\n <div class=\\\"progress-item\\\">\\n <label>Engagement</label>\\n <div class=\\\"progress-bar\\\">\\n <div class=\\\"progress-fill\\\" style=\\\"width: 60%\\\"></div>\\n </div>\\n </div>\\n </div>\\n <p>This template demonstrates dynamic content structure with CSS styling.</p>\\n</div>\"","export default \"<div class=\\\"tasks-content\\\">\\n <h4>✅ Task Manager</h4>\\n <div class=\\\"task-list\\\">\\n <div class=\\\"task-item completed\\\">\\n <span class=\\\"task-checkbox\\\">✓</span>\\n <span class=\\\"task-text\\\">Implement template system</span>\\n </div>\\n <div class=\\\"task-item completed\\\">\\n <span class=\\\"task-checkbox\\\">✓</span>\\n <span class=\\\"task-text\\\">Add individual mode controls</span>\\n </div>\\n <div class=\\\"task-item current\\\">\\n <span class=\\\"task-checkbox\\\">○</span>\\n <span class=\\\"task-text\\\">Create demo examples</span>\\n </div>\\n <div class=\\\"task-item\\\">\\n <span class=\\\"task-checkbox\\\">○</span>\\n <span class=\\\"task-text\\\">Write documentation</span>\\n </div>\\n </div>\\n <div class=\\\"task-stats\\\">\\n <div class=\\\"task-progress\\\">\\n <span>Progress: 2/4 tasks</span>\\n <div class=\\\"progress-bar\\\">\\n <div class=\\\"progress-fill\\\" style=\\\"width: 50%\\\"></div>\\n </div>\\n </div>\\n </div>\\n <p>Template content can include interactive elements and dynamic data.</p>\\n</div>\""],"names":["NotificationSystem","container","__publicField","existingContainer","text","type","toast","remove","closeIcon","ContainerInitializer","width","height","x","y","color","ContentCreator","templateLoader","content","isAlreadyContentContainer","targetElement","error","loader","StatsManager","globalStatsElement","containerStats","globalStats","stats","stepDisplay","html","t","e","r","s","_a","a","i","globalTemplateLoader","createDemoLoader","fallbackTemplates","registry","TemplateRegistry","templates","media$1","m","stats$1","tasks$1","sources","path","name","source","TemplateLoader","message","createLibraryLoader","initializeTemplateSystem","getTemplateLoader","reducer","acc","k","v","EdgeInfo","info","EventEmitter","event","callback","data","InternalBoundaryTracker","edgeThreshold","targets","root","element","threshold","target","targetRect","rootRect","elementInfo","prevEdge","cursorInfo","vw","vh","rect","edge","cursorEdge","oldEdge","newEdge","edges","distances","prev","curr","_EdgeController","elements","emitter","EdgeController","createTracker","options","controller","_State","uid","id","$1","$2","State","getViewportDimensions","getState","_ContainerManager","config","reactive","computed","state","constrained","boundaries","clamp","viewport","effect","deepMerge","currentState","ReactiveEventSystem","rAFTimeout","newState","needsUpdate","parentElement","entries","entry","autoAdjust","parentRect","maxWidth","newWidth","maxHeight","newHeight","direction","handle","cursorMap","deltaX","deltaY","maxX","maxY","parentWidth","parentHeight","pluginName","plugin","style","styleWidth","styleHeight","_event","stateMonitor","metricsMonitor","metrics","timeout","targetEmitter","targetEvent","listener","middleware","clientX","clientY","lockX","lockY","mode","_uid","enabled","desiredWidth","desiredHeight","desiredX","desiredY","newX","newY","ContainerManager","_SnappingPlugin","manager","dragHandle","_b","snappedDeltas","value","step","viewportWidth","viewportHeight","SnappingPlugin","_EdgeDockingPlugin","docked","activeEdge","distTop","distLeft","distBottom","distRight","validEdges","_","dist","b","screenPosition","_element","EdgeDockingPlugin","_StatePersistencePlugin","debouncedSave","debounce","containerId","stored","closedQueue","existingIndex","batch","isMaximized","draggingDirection","containerType","title","useSnapping","resizeConfig","parentElementId","savedState","allStates","c","isEdgeDocked","dockEdge","_c","closedState","lastContainerId","stateFromReactive","stateFromStorage","updates","currentStates","updatedState","storedStates","containers","states","key","storableContainers","StatePersistencePlugin","_LoggingPlugin","fullMessage","LoggingPlugin"],"mappings":"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","x_google_ignoreList":[4]}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/utils/Notifications.ts","../src/utils/ContainerInitializer.ts","../src/utils/ContentCreator.ts","../src/utils/StatsManager.ts","../node_modules/@alekstar79/template-loader/dist/index.es.js","../src/utils/TemplateLoader.ts","../src/utils/BoundaryTracker.ts","../src/utils/helpers.ts","../src/core/ContainerManager.ts","../src/plugins/SnappingPlugin.ts","../src/plugins/EdgeDockingPlugin.ts","../src/plugins/StatePersistencePlugin.ts","../src/plugins/LoggingPlugin.ts","../src/demo/templates/media.html?raw","../src/demo/templates/stats.html?raw","../src/demo/templates/tasks.html?raw"],"sourcesContent":["// src/utils/notifications.ts\n\n/**\n * Notification system for displaying toast messages\n * Adapted for TypeScript with improved functionality\n */\nexport class NotificationSystem\n{\n private container: HTMLElement\n\n constructor(container?: HTMLElement)\n {\n this.container = container || this.createContainer()\n }\n\n /**\n * Create notifications container\n */\n private createContainer(): HTMLElement\n {\n const existingContainer = document.querySelector('.notifications') as HTMLElement\n if (existingContainer) {\n return existingContainer\n }\n\n const container = document.createElement('div')\n container.className = 'notifications'\n document.body.appendChild(container)\n return container\n }\n\n /**\n * Show notification toast\n */\n show(text: string, type: 'success' | 'error' | 'warning' | 'info' = 'info'): void\n {\n const toast = document.createElement('li')\n const remove = this.removeToast.bind(this, toast)\n\n toast.innerHTML = this.getToastHTML(text, type)\n toast.className = `toast ${type}`;\n\n (toast as any).timeoutId = window.setTimeout(remove, 4000)\n\n const closeIcon = toast.querySelector('.icon')\n if (closeIcon) {\n closeIcon.addEventListener('click', remove)\n }\n\n // Add new toast to the bottom of the container\n this.container.appendChild(toast)\n }\n\n /**\n * Generate toast HTML based on type\n */\n private getToastHTML(text: string, type: 'success' | 'error' | 'warning' | 'info'): string\n {\n const icons = {\n success: 'fa-circle-check',\n error: 'fa-circle-xmark',\n warning: 'fa-triangle-exclamation',\n info: 'fa-circle-info'\n }\n\n return `\n <div class=\"column\">\n <i class=\"fa-solid ${icons[type]}\"></i>\n <span>${text}</span>\n </div>\n <i class=\"icon fa-solid fa-xmark\"></i>\n `\n }\n\n /**\n * Remove toast with animation\n */\n private removeToast(toast: HTMLLIElement): void\n {\n toast.classList.add('hide')\n\n // Use any for timeoutId property\n if ((toast as any).timeoutId) {\n clearTimeout((toast as any).timeoutId)\n }\n\n setTimeout(() => {\n if (toast.parentNode) {\n toast.parentNode.removeChild(toast)\n }\n }, 300)\n }\n\n /**\n * Clear all notifications\n */\n clear(): void\n {\n while (this.container.firstChild) {\n this.container.removeChild(this.container.firstChild)\n }\n }\n}\n\n// Default instance for convenience\nexport const defaultNotificationSystem = new NotificationSystem()\n","// src/utils/ContainerInitializer.ts\n\n/**\n * Utility for proper container initialization and state synchronization\n */\nexport class ContainerInitializer\n{\n /**\n * Create container element with proper initialization\n */\n static createContainerElement(\n width: number,\n height: number,\n x?: number,\n y?: number,\n color?: string\n ): HTMLElement {\n const container = document.createElement('div')\n container.className = 'container advanced-container new'\n\n container.style.position = 'absolute'\n container.style.width = `${width}px`\n container.style.height = `${height}px`\n\n if (x !== undefined) container.style.left = `${x}px`\n if (y !== undefined) container.style.top = `${y}px`\n if (color) container.style.borderColor = color\n\n return container\n }\n}\n","import { TemplateLoader } from './index'\n\n/**\n * Content creator utility for flexible content handling\n * Supports strings, DOM elements, and template loading\n */\nexport class ContentCreator\n{\n private templateLoader: TemplateLoader\n\n constructor(templateLoader: TemplateLoader)\n {\n this.templateLoader = templateLoader\n }\n\n /**\n * Create content from various sources\n * @param content - String, HTMLElement, or template name\n * @param container - Container element to append content to\n */\n async createContent(\n content: string | HTMLElement | { template: string },\n container: HTMLElement\n ): Promise<HTMLElement> {\n try {\n // Checking if the container is already container-content\n const isAlreadyContentContainer = container.classList.contains('container-content')\n\n // Find or create a target element for your content\n let targetElement: HTMLElement\n\n if (isAlreadyContentContainer) {\n // If the container is already a container-content, use it directly\n targetElement = container\n } else {\n // Searching for existing container-content inside a container\n targetElement = container.querySelector('.container-content') as HTMLElement\n\n if (!targetElement) {\n targetElement = document.createElement('div')\n targetElement.className = 'container-content'\n container.appendChild(targetElement)\n }\n }\n\n targetElement.innerHTML = ''\n\n if (typeof content === 'string') {\n // String content\n targetElement.innerHTML = content\n } else if (content instanceof HTMLElement) {\n // DOM element\n targetElement.appendChild(content)\n } else if (content.template) {\n // Template content\n try {\n targetElement.innerHTML = await this.templateLoader.loadTemplate(content.template)\n } catch (error) {\n console.error(`[ContentCreator] Failed to load template: ${content.template}`, error)\n targetElement.innerHTML = `<div class=\"template-error\">Failed to load template: ${content.template}</div>`\n }\n }\n\n return targetElement\n } catch (error) {\n console.error('[ContentCreator] Error creating content:', error)\n throw error\n }\n }\n\n /**\n * Set template loader instance\n */\n setTemplateLoader(loader: TemplateLoader): void\n {\n this.templateLoader = loader\n }\n}\n","// src/utils/statsManager.ts\n\nimport type { DirectionMode } from '../core/types'\n\n/**\n * Interface for container statistics\n */\nexport interface ContainerStats {\n activeBlock: string\n lock: 'opened' | 'locked'\n direction: DirectionMode\n step?: number\n hasSnapping: boolean\n}\n\n/**\n * Interface for global statistics\n */\nexport interface GlobalStats {\n containerCount: number\n contentTypes: string\n pinnedMode: string\n snappingCount: number\n}\n\n/**\n * Statistics manager for handling both global and per-container stats\n */\nexport class StatsManager\n{\n private globalStatsElement: HTMLElement | null = null\n\n /**\n * Initialize stats manager\n */\n initialize(globalStatsElement: HTMLElement): void\n {\n this.globalStatsElement = globalStatsElement\n }\n\n /**\n * Show container-specific statistics\n */\n showContainerStats(containerStats: ContainerStats): void\n {\n if (!this.globalStatsElement) return\n\n this.updateStatsPanel(this.generateContainerStatsHTML(containerStats))\n }\n\n /**\n * Show global statistics\n */\n showGlobalStats(globalStats: GlobalStats): void\n {\n if (!this.globalStatsElement) return\n\n this.updateStatsPanel(this.generateGlobalStatsHTML(globalStats))\n }\n\n /**\n * Generate HTML for container statistics\n */\n private generateContainerStatsHTML(stats: ContainerStats): string\n {\n const stepDisplay = stats.hasSnapping && stats.step !== undefined\n ? `<div class=\"stat-item\">\n <span class=\"stat-label\">Step:</span>\n <span class=\"stat-value\">${stats.step}</span>\n </div>`\n : ''\n\n return `\n <h4>Block Stats</h4>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Active Block:</span>\n <span class=\"stat-value\">${stats.activeBlock}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Lock:</span>\n <span class=\"stat-value\">${stats.lock}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Direction:</span>\n <span class=\"stat-value\">${stats.direction}</span>\n </div>\n ${stepDisplay}`\n }\n\n /**\n * Generate HTML for global statistics\n */\n private generateGlobalStatsHTML(stats: GlobalStats): string\n {\n return `\n <h4>Global Stats</h4>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Containers:</span>\n <span class=\"stat-value\">${stats.containerCount}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Content Types:</span>\n <span class=\"stat-value\">${stats.contentTypes}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Pinned Mode:</span>\n <span class=\"stat-value\">${stats.pinnedMode}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">With Snapping:</span>\n <span class=\"stat-value\">${stats.snappingCount}</span>\n </div>`\n }\n\n /**\n * Update stats panel with new HTML content\n */\n private updateStatsPanel(html: string): void\n {\n if (this.globalStatsElement) {\n this.globalStatsElement.innerHTML = html\n }\n }\n}\n","var t=Object.defineProperty,e=(e,r,s)=>r in e?t(e,r,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[r]=s,r=(t,r,s)=>e(t,\"symbol\"!=typeof r?r+\"\":r,s);class s{constructor(){r(this,\"templates\",new Map),r(this,\"lastUpdated\",new Map)}register(t){if(!t.name.trim())throw new Error(\"Template name cannot be empty\");this.templates.set(t.name,t),this.lastUpdated.set(t.name,Date.now())}async registerBulk(t){for(const[e,r]of Object.entries(t))this.register({name:e,source:r})}get(t){return this.templates.get(t)}has(t){return this.templates.has(t)}remove(t){this.templates.delete(t),this.lastUpdated.delete(t)}list(){return Array.from(this.templates.keys())}clear(){this.templates.clear(),this.lastUpdated.clear()}getMetadata(t){return this.templates.get(t)?.metadata}}class a{constructor(t=36e5){r(this,\"cache\",new Map),r(this,\"ttl\"),this.ttl=t}set(t,e){this.cache.set(t,{content:e,timestamp:Date.now()})}get(t){const e=this.cache.get(t);return e?this.ttl<=0||Date.now()-e.timestamp>this.ttl?(this.cache.delete(t),null):e.content:null}has(t){return null!==this.get(t)}clear(){this.cache.clear()}size(){return this.cache.size}}class i{constructor(t,e={}){r(this,\"cache\"),r(this,\"config\"),r(this,\"metrics\"),r(this,\"retryQueue\",new Map),r(this,\"registry\"),this.registry=t??new s,this.cache=new a(e?.cacheTTL),this.config=this.normalizeConfig(e),this.metrics={totalLoads:0,totalHits:0,totalMisses:0,totalErrors:0,averageLoadTime:0,cacheHitRate:0}}normalizeConfig(t={}){const e=t||{};return{environment:\"auto\"===e.environment?typeof process<\"u\"&&\"production\"===process.env?.NODE_ENV?\"production\":\"development\":e.environment??\"development\",cache:e.cache??!0,cacheTTL:e.cacheTTL??36e5,enableMetrics:e.enableMetrics??!0,onError:e.onError??(()=>{}),onWarn:e.onWarn??(()=>{}),fallbackTemplate:e.fallbackTemplate??'<div class=\"template-error\">Template load failed</div>'}}async loadTemplate(t,e=2){const r=performance.now(),s=this.retryQueue.get(t)??0;if(this.metrics.totalLoads++,this.config.cache){const e=this.cache.get(t);if(e)return this.metrics.totalHits++,this.updateCacheHitRate(),e}this.metrics.totalMisses++;const a=this.registry.get(t);if(!a){const e=this.createError(`Template \"${t}\" not found. Available: ${this.registry.list().join(\", \")}`,t,s);return this.metrics.totalErrors++,this.config.onError(e),this.config.fallbackTemplate}try{let e=\"function\"==typeof a.source?await a.source():a.source;if(\"string\"!=typeof e){const r=this.createError(\"Template source must return a string, got \"+typeof e,t,s);return this.metrics.totalErrors++,this.config.onError(r),this.config.fallbackTemplate}return this.config.cache&&this.cache.set(t,e),this.retryQueue.delete(t),this.recordLoadTime(r),e}catch(r){const a=r instanceof Error?r:new Error(String(r));if(s<e)return this.retryQueue.set(t,s+1),this.config.onWarn(`Retrying template \"${t}\" (attempt ${s+1}/${e})`),await new Promise(t=>setTimeout(t,100*Math.pow(2,s))),this.loadTemplate(t,e);const i=this.createError(`Failed to load template \"${t}\": ${a.message}`,t,s);return this.metrics.totalErrors++,this.config.onError(i),this.retryQueue.delete(t),this.config.fallbackTemplate}}async loadTemplates(t){const e={};return await Promise.all(t.map(async t=>{e[t]=await this.loadTemplate(t)})),e}getMetrics(){return{...this.metrics}}clearCache(){this.cache.clear()}resetMetrics(){this.metrics={totalLoads:0,totalHits:0,totalMisses:0,totalErrors:0,averageLoadTime:0,cacheHitRate:0}}has(t){return this.registry.has(t)}list(){return this.registry.list()}info(t){return this.registry.get(t)}createError(t,e,r){return Object.assign(new Error(t),{name:\"TemplateLoadError\",templateName:e,timestamp:new Date,retryCount:r})}recordLoadTime(t){if(this.config.enableMetrics){const e=performance.now()-t,r=this.metrics.averageLoadTime*(this.metrics.totalLoads-1)+e;this.metrics.averageLoadTime=r/this.metrics.totalLoads}}updateCacheHitRate(){this.config.enableMetrics&&(this.metrics.cacheHitRate=this.metrics.totalHits/this.metrics.totalLoads)}}function o(){const t=new s;return new i(t,{environment:\"production\",cache:!0,cacheTTL:36e5,enableMetrics:!1,onWarn:t=>{},onError:t=>{}})}export{a as TemplateCache,i as TemplateLoader,s as TemplateRegistry,o as createTemplateLoader};","import type { LoaderConfig, LoaderMetrics, TemplateConfig, TemplateSource } from '@alekstar79/template-loader'\nimport { TemplateCache, TemplateLoader, TemplateRegistry } from '@alekstar79/template-loader'\n\nlet globalTemplateLoader: TemplateLoader\n\n/**\n * Create a fully functional loader for the demo\n */\nexport async function createDemoLoader(\n fallbackTemplates: { name: string; source: string }[] = []\n): Promise<TemplateLoader> {\n const registry = new TemplateRegistry()\n\n let templates: Record<string, TemplateSource> = {}\n\n try {\n // @ts-ignore\n templates = import.meta.glob<string>(\n '../demo/templates/*.html',\n {\n import: 'default',\n query: '?raw',\n eager: false\n }\n )\n\n // Converting for registration\n const sources: Record<string, TemplateSource> = {}\n Object.entries(templates)\n .forEach(([path, loader]) => {\n const name = path.split('/').pop()?.replace(/\\.html$/, '')\n\n if (name) {\n sources[name] = async () => {\n if (typeof loader === 'function') {\n return await loader()\n }\n return String(loader)\n }\n }\n })\n\n await registry.registerBulk(sources)\n\n } catch (error) {\n console.error('[TemplateLoader] Failed to load templates:', error)\n\n // Minimal fallback templates in case of an error\n fallbackTemplates.forEach(({ name, source }) => {\n registry.register({ name, source })\n })\n }\n\n return new TemplateLoader(registry, {\n environment: 'development',\n cache: true,\n cacheTTL: 3600000,\n enableMetrics: true,\n fallbackTemplate: '<div class=\"template-error\">Template not found</div>',\n onError: (error) => console.error(`[TemplateLoader Error] ${error.templateName}:`, error.message),\n onWarn: (message) => console.warn(`[TemplateLoader] ${message}`)\n })\n}\n\n/**\n * Create a loader for the library\n */\nexport function createLibraryLoader(): TemplateLoader & { registry: TemplateRegistry }\n{\n const registry = new TemplateRegistry()\n\n return new TemplateLoader(registry, {\n environment: 'production',\n cache: true,\n cacheTTL: 3600000,\n enableMetrics: false,\n onWarn: (message) => console.warn(`[TemplateLoader] ${message}`),\n onError: (error) => {\n console.warn(`Template load failed: ${error.templateName}`)\n }\n })\n}\n\n/**\n * System initialization (called in main.ts or app initialization)\n */\nexport async function initializeTemplateSystem(): Promise<TemplateLoader>\n{\n if (globalTemplateLoader) return globalTemplateLoader\n\n const isDevMode =\n // @ts-ignore - Vite environment variable\n (typeof import.meta !== 'undefined' && import.meta.env && import.meta.env.DEV) ||\n (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'development')\n\n if (isDevMode) {\n globalTemplateLoader = await createDemoLoader()\n } else {\n globalTemplateLoader = createLibraryLoader()\n\n globalTemplateLoader.registry.register({\n name: 'media',\n source: async () => {\n const res = await fetch('./templates/media.html')\n return res.text()\n },\n metadata: {\n version: '1.0',\n description: 'Media card',\n cached: true\n }\n })\n\n globalTemplateLoader.registry.register({\n name: 'userProfile',\n source: '<div class=\"user-profile\"><h2>Profile</h2></div>',\n metadata: {\n version: '1.0',\n description: 'User profile card',\n cached: true\n }\n })\n }\n\n return globalTemplateLoader\n}\n\n/**\n * Get a global instance\n */\nexport function getTemplateLoader(): TemplateLoader\n{\n if (!globalTemplateLoader) {\n throw new Error('Template system not initialized. Call initializeTemplateSystem() first.')\n }\n\n return globalTemplateLoader\n}\n\nexport {\n LoaderConfig,\n LoaderMetrics,\n TemplateConfig,\n TemplateSource,\n TemplateCache,\n TemplateLoader,\n TemplateRegistry\n}\n","/**\n * BoundaryTracker.ts\n * Tracks the approach of the dragged element to the edges of the viewport\n * The element remains inside the viewport, and the detection zones are also inside\n */\n\nexport type Event = 'edge:enter' | 'edge:leave' | 'cursor:enter' | 'cursor:leave'\nexport type Edge = 'top' | 'right' | 'bottom' | 'left'\n\nexport interface Options {\n emitter?: EventEmitter | boolean,\n edgeThreshold?: number,\n}\n\nexport interface EdgeZoneInfo {\n top: boolean\n right: boolean\n bottom: boolean\n left: boolean\n edge: Edge | null\n}\n\nexport interface SourceEdgeInfo extends EdgeZoneInfo {\n source: 'element' | 'cursor'\n element: HTMLElement | null\n}\n\nexport interface IBoundaryTracker {\n start(): void\n stop(): void\n addTarget(element: HTMLElement): void\n removeTarget(element: HTMLElement): void\n onChange(callback: EdgeChangeCallback): () => void\n getCursorEdgeInfo(): EdgeZoneInfo\n setEdgeThreshold(threshold: number): void\n destroy(): void\n}\n\nexport interface IEdgeController extends IBoundaryTracker{\n getCurrentEdge(): Partial<SourceEdgeInfo>\n on(event: Event, callback: EdgeChangeCallback): void\n onCursorEnter(data: SourceEdgeInfo): void\n onCursorLeave(data: SourceEdgeInfo): void\n onEdgeEnter(data: SourceEdgeInfo): void\n onEdgeLeave(data: SourceEdgeInfo): void\n setEmitter(emitter: EventEmitter): void\n}\n\nexport type EdgeChangeCallback = (data: Partial<SourceEdgeInfo>) => void\nexport type EventCallback<T = any> = (data?: T) => void\nexport type EventMap = Record<string, any>\n\nfunction reducer(acc: Partial<SourceEdgeInfo>, [k, v]: [string, any]): Partial<SourceEdgeInfo>\n{\n return v ? { ...acc, [k]: v } : acc\n}\n\nexport class EdgeInfo implements SourceEdgeInfo\n{\n public source: 'element' | 'cursor' = 'cursor'\n public element: HTMLElement | null = null\n public top: boolean = false\n public right: boolean = false\n public bottom: boolean = false\n public left: boolean = false\n public edge: Edge | null = null\n\n constructor(info: SourceEdgeInfo)\n {\n Object.assign(this, info)\n }\n}\n\nexport class EventEmitter<T extends EventMap = any>\n{\n private listeners: Partial<{ [K in keyof T]: Set<EventCallback<T[K]>> }> = {}\n\n on<K extends keyof T>(event: K, callback: EventCallback<T[K]>): () => void\n {\n if (!this.listeners[event]) {\n this.listeners[event] = new Set()\n }\n\n this.listeners[event].add(callback)\n\n return () => {\n this.off?.(event, callback)\n }\n }\n\n emit<K extends keyof T>(event: K, data?: T[K]): void\n {\n this.listeners[event]?.forEach(callback => {\n try {\n callback(data)\n } catch (error) {\n console.error(`Error in event listener for ${String(event)}:`, error)\n }\n })\n }\n\n off?<K extends keyof T>(event: K, callback: EventCallback<T[K]>): void\n {\n this.listeners[event]?.delete(callback)\n }\n\n destroy?(): void\n {\n this.listeners = {}\n }\n}\n\n/**\n * The main class for tracking borders\n * Uses requestAnimationFrame for accurate tracking during drag\n */\nexport class InternalBoundaryTracker implements IBoundaryTracker\n{\n private readonly root: HTMLElement | null\n private edgeThreshold: number\n private targets: Set<HTMLElement> = new Set()\n private currentEdges: Map<HTMLElement, EdgeZoneInfo> = new Map()\n private rafId: number | null = null\n private isActive: boolean = false\n private callbacks: Set<EdgeChangeCallback> = new Set()\n private currentMousePos: { x: number; y: number } = { x: 0, y: 0 }\n private currentCursorEdge: EdgeZoneInfo = {\n top: false,\n right: false,\n bottom: false,\n left: false,\n edge: null\n }\n\n constructor(\n edgeThreshold: number = 50,\n targets?: HTMLElement[] | Set<HTMLElement>,\n root: HTMLElement | null = null\n ) {\n this.edgeThreshold = edgeThreshold\n this.targets = targets instanceof Set ? targets : new Set(targets)\n this.root = root\n\n if (targets) {\n targets.forEach(t => this.targets.add(t))\n }\n\n this.checkBoundaries = this.checkBoundaries.bind(this)\n }\n\n /**\n * Start tracking the approach to the edges\n */\n public start(): void\n {\n if (this.isActive) return\n\n this.isActive = true\n this.setupMouseTracking()\n this.checkBoundaries()\n }\n\n /**\n * Stop tracking\n */\n public stop(): void\n {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId)\n this.rafId = null\n }\n\n this.isActive = false\n }\n\n public addTarget(element: HTMLElement): void\n {\n this.targets.add(element)\n }\n\n public removeTarget(element: HTMLElement): void\n {\n this.targets.delete(element)\n this.currentEdges.delete(element)\n }\n\n /**\n * Subscribe to boundary changes\n */\n public onChange(callback: EdgeChangeCallback): () => void\n {\n this.callbacks.add(callback)\n\n return () => {\n this.callbacks.delete(callback)\n }\n }\n\n /**\n * Get current information about cursor boundaries\n */\n public getCursorEdgeInfo(): EdgeZoneInfo\n {\n return { ...this.currentCursorEdge }\n }\n\n /**\n * Update threshold (distance to edge)\n */\n public setEdgeThreshold(threshold: number): void\n {\n if (threshold < 0) {\n throw new Error('Edge threshold must be non-negative')\n }\n\n this.edgeThreshold = threshold\n }\n\n /**\n * Set up Mouse Tracking\n */\n private setupMouseTracking(): void\n {\n document.addEventListener('mousemove', (e: MouseEvent) => {\n this.currentMousePos = { x: e.clientX, y: e.clientY }\n })\n }\n\n private getViewportSize(): { width: number; height: number }\n {\n return this.root\n ? { width: this.root.clientWidth, height: this.root.clientHeight }\n : { width: window.innerWidth, height: window.innerHeight }\n }\n\n private getRelativeRect(target: HTMLElement): DOMRect\n {\n const targetRect = target.getBoundingClientRect()\n if (!this.root) return targetRect\n\n const rootRect = this.root.getBoundingClientRect()\n\n return {\n x: targetRect.left - rootRect.left,\n y: targetRect.top - rootRect.top,\n top: targetRect.top - rootRect.top,\n bottom: targetRect.bottom - rootRect.top,\n left: targetRect.left - rootRect.left,\n right: targetRect.right - rootRect.left,\n height: targetRect.height,\n width: targetRect.width,\n toJSON: () => {}\n }\n }\n\n private getCursorPosition(): { x: number; y: number }\n {\n if (!this.root) return this.currentMousePos\n\n const rootRect = this.root.getBoundingClientRect()\n\n return {\n x: this.currentMousePos.x - rootRect.left,\n y: this.currentMousePos.y - rootRect.top\n }\n }\n\n /**\n * Check the proximity to the borders (element and cursor)\n */\n private checkBoundaries(): void\n {\n // Checking elements\n this.targets.forEach((target: HTMLElement) => {\n const elementInfo = this.checkElementBoundaries(target)\n const prevEdge = this.currentEdges.get(target)\n\n if (!prevEdge || this.hasEdgeChanged(prevEdge, elementInfo)) {\n this.currentEdges.set(target, elementInfo)\n this.notifyCallbacks(new EdgeInfo({ ...elementInfo, source: 'element', element: target }))\n }\n })\n\n // Checking cursor\n const cursorInfo = this.checkCursorBoundaries()\n if (this.hasEdgeChanged(this.currentCursorEdge, cursorInfo)) {\n this.currentCursorEdge = cursorInfo\n this.notifyCallbacks(new EdgeInfo({ ...cursorInfo, source: 'cursor', element: null }))\n }\n\n if (this.isActive) {\n this.rafId = requestAnimationFrame(\n this.checkBoundaries\n )\n }\n }\n\n /**\n * Emulating Bounding Rect for cursor\n */\n private getCursorBoundingClientRect(): DOMRect\n {\n const { x, y } = this.getCursorPosition()\n\n return {\n x, y,\n top: y, bottom: y, left: x, right: x,\n width: 0, height: 0,\n toJSON: () => {}\n }\n }\n\n /**\n * Check the boundaries of an element\n */\n private checkElementBoundaries(target: HTMLElement): EdgeZoneInfo\n {\n const { width: vw, height: vh } = this.getViewportSize()\n const rect = this.getRelativeRect(target)\n\n const edge: EdgeZoneInfo = {\n top: rect.top < this.edgeThreshold,\n right: rect.right > vw - this.edgeThreshold,\n bottom: rect.bottom > vh - this.edgeThreshold,\n left: rect.left < this.edgeThreshold,\n edge: null,\n }\n\n this.determineEdge(edge, rect, vw, vh)\n\n return edge\n }\n\n /**\n * Check the boundaries of a cursor\n */\n private checkCursorBoundaries(): EdgeZoneInfo\n {\n const rect = this.getCursorBoundingClientRect()\n const vw = window.innerWidth\n const vh = window.innerHeight\n\n const cursorEdge: EdgeZoneInfo = {\n top: rect.top < this.edgeThreshold,\n right: rect.right > vw - this.edgeThreshold,\n bottom: rect.bottom > vh - this.edgeThreshold,\n left: rect.left < this.edgeThreshold,\n edge: null\n }\n\n this.determineEdge(cursorEdge, rect, vw, vh)\n\n return cursorEdge\n }\n\n /**\n * Check if the state has changed\n */\n private hasEdgeChanged(oldEdge: EdgeZoneInfo, newEdge: EdgeZoneInfo): boolean\n {\n return (\n oldEdge.top !== newEdge.top ||\n oldEdge.right !== newEdge.right ||\n oldEdge.bottom !== newEdge.bottom ||\n oldEdge.left !== newEdge.left\n )\n }\n\n /**\n * Determine a priority edge-side (or several)\n */\n private determineEdge(\n edge: EdgeZoneInfo,\n rect: DOMRect,\n vw: number,\n vh: number\n ): void {\n const edges: Edge[] = []\n\n if (edge.top) edges.push('top')\n if (edge.right) edges.push('right')\n if (edge.bottom) edges.push('bottom')\n if (edge.left) edges.push('left')\n\n if (edges.length === 0) {\n edge.edge = null\n } else if (edges.length === 1) {\n edge.edge = edges[0]\n } else {\n const distances = {\n top: rect.top,\n right: vw - rect.right,\n bottom: vh - rect.bottom,\n left: rect.left\n }\n\n // In the corner, the nearest edge is selected\n edge.edge = edges.reduce((prev, curr) =>\n distances[curr] < distances[prev] ? curr : prev\n ) as Edge\n }\n }\n\n /**\n * Notify all subscribers of the change\n */\n private notifyCallbacks(edge: SourceEdgeInfo): void\n {\n this.callbacks.forEach(callback => {\n try {\n callback(edge)\n } catch (error) {\n console.error('Error in boundary change callback:', error)\n }\n })\n }\n\n /**\n * Clear resources\n */\n public destroy(): void\n {\n this.stop()\n this.callbacks.clear()\n }\n}\n\nexport class EdgeController extends InternalBoundaryTracker implements IEdgeController\n{\n private static instance: IEdgeController\n\n public static init(edgeThreshold?: number, elements?: HTMLElement[])\n {\n return EdgeController.instance ??= new EdgeController(edgeThreshold, elements)\n }\n\n private lastEdge: Partial<SourceEdgeInfo> = {}\n public emitter: EventEmitter | null = null\n\n constructor(edgeThreshold?: number, elements?: HTMLElement[])\n {\n super(edgeThreshold, elements)\n\n this.onChange(this.onBoundaryChange.bind(this))\n this.start()\n }\n\n private changed({ edge, source, element }: Partial<SourceEdgeInfo>): boolean\n {\n return edge !== this.lastEdge.edge || source !== this.lastEdge.source || element !== this.lastEdge.element\n }\n\n private onBoundaryChange({ edge, source, element }: Partial<SourceEdgeInfo>): void\n {\n if (!this.changed({ edge, source, element })) return\n\n this.lastEdge = Object.entries({ edge, source, element }).reduce(reducer, {})\n\n if (!element) {\n edge\n ? this.onCursorEnter({ edge, source })\n : this.onCursorLeave(this.lastEdge)\n } else {\n edge\n ? this.onEdgeEnter({ edge, source, element })\n : this.onEdgeLeave(this.lastEdge)\n }\n }\n\n public onEdgeEnter(data: Partial<SourceEdgeInfo>): void\n {\n this.emitter?.emit('edge:enter', data)\n }\n\n public onEdgeLeave(data: Partial<SourceEdgeInfo>): void\n {\n this.emitter?.emit('edge:leave', data)\n }\n\n public onCursorEnter(data: Partial<SourceEdgeInfo>): void\n {\n this.emitter?.emit('cursor:enter', data)\n }\n\n public onCursorLeave(data: Partial<SourceEdgeInfo>): void\n {\n this.emitter?.emit('cursor:leave', data)\n }\n\n setEmitter(emitter: EventEmitter): void\n {\n this.emitter = emitter\n }\n\n on(event: Event, callback: EdgeChangeCallback): void\n {\n this.emitter?.on(event, callback)\n }\n\n getCurrentEdge(): Partial<SourceEdgeInfo>\n {\n return this.lastEdge\n }\n}\n\nexport function createTracker(\n options = {} as Options,\n elements: HTMLElement[] = []\n): IEdgeController {\n const controller = EdgeController.init(options.edgeThreshold, elements)\n\n if (options.emitter) {\n controller.setEmitter(\n options.emitter instanceof EventEmitter ? options.emitter : new EventEmitter()\n )\n }\n\n return controller\n}\n","// src/utuls/dom.ts\n\nexport interface StateInterface {\n zIndex(uid: string): string;\n push(uid: string): this;\n remove(uid: string): this;\n sort(uid: string): this;\n}\n\nexport class State implements StateInterface\n{\n static inatance: StateInterface\n\n static highestZIndex = 1000\n\n static init = () => State.inatance ??= new State()\n\n private draggable: string[] = []\n\n zIndex(uid: string): string\n {\n return `${State.highestZIndex + this.draggable.findIndex(id => id === uid)}`\n }\n\n push(uid: string): this\n {\n this.draggable = [...new Set<string>([...this.draggable, uid])]\n\n return this\n }\n\n remove(uid: string): this\n {\n this.draggable = this.draggable.filter(id => id !== uid)\n\n return this\n }\n\n sort(uid: string): this\n {\n this.draggable.sort(($1: number | string, $2: number | string) => {\n return $1 === uid ? 1 : $2 === uid ? -1 : 0\n })\n\n return this\n }\n}\n\n/**\n * Check if element is within viewport boundaries\n */\nexport function isInViewport(element: HTMLElement): boolean\n{\n const rect = element.getBoundingClientRect()\n\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n )\n}\n\n/**\n * Get viewport dimensions\n */\nexport function getViewportDimensions(): { width: number; height: number }\n{\n return {\n width: window.innerWidth || document.documentElement.clientWidth,\n height: window.innerHeight || document.documentElement.clientHeight\n }\n}\n\n/**\n * @returns {State} - Класс вычисляющий z-index позиции контейнеров\n */\nexport function getState(): StateInterface\n{\n return State.init()\n}\n","// src/core/ContainerManager.ts\n\nimport ReactiveEventSystem from '@alekstar79/reactive-event-system'\nimport { computed, effect, reactive } from '@alekstar79/reactive-event-system'\nimport { clamp, deepMerge } from '@alekstar79/utility'\n\nimport { getState, getViewportDimensions } from '../utils'\nimport type { StateInterface } from '../utils'\n\nimport {\n AutoAdjustConfig,\n Boundaries,\n ContainerManagerInterface,\n Plugin,\n ContainerConfig,\n ContainerEvent,\n ContainerState,\n DirectionMode,\n MovementMode,\n PluginMiddleware,\n ResizeConfig,\n ResizeDirection\n} from './types'\n\n/**\n * Main container management class for drag and resize operations\n * Implements ContainerManagerInterface for plugin compatibility\n * Now with reactive state management using @alekstar79/reactivity\n */\nexport class ContainerManager implements ContainerManagerInterface\n{\n private static MINWIDTH: number = 200\n private static MINHEIGHT: number = 45\n\n // Streams for reactive event handling\n private dragStream: ReturnType<ReactiveEventSystem<ContainerEvent>['stream']>\n private resizeStream: ReturnType<ReactiveEventSystem<ContainerEvent>['stream']>\n private readonly stateChangeStream: ReturnType<ReactiveEventSystem<ContainerEvent>['stream']>\n private readonly eventEmitter: ReactiveEventSystem<ContainerEvent>\n private readonly pluginEventEmitter: ReactiveEventSystem\n\n private readonly config: ContainerConfig\n private readonly container: HTMLElement\n private dragHandle!: HTMLElement\n private resizeHandles: Map<ResizeDirection, HTMLElement> = new Map()\n private installedPlugins: Set<Plugin> = new Set()\n private reactiveEffects: (() => void)[] = []\n\n private isDragging: boolean = false\n private isResizing: boolean = false\n private resizeDirection: ResizeDirection | null = null\n private startX: number = 0\n private startY: number = 0\n private startState: ContainerState\n private resizeObserver: ResizeObserver | null = null\n private parentResizeObserver: ResizeObserver | null = null\n public zIndexState: StateInterface\n\n private reactiveState = reactive({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n mode: 'smooth' as MovementMode,\n draggingDirection: 'all' as DirectionMode\n })\n\n // Computed state with applied constraints\n private constrainedState = computed(() => {\n const state = this.reactiveState\n\n if (!this.config) return { ...state }\n\n let constrained: ContainerState = { ...state }\n\n // Apply boundaries constraints\n const { boundaries } = this.config\n constrained.width = clamp(\n state.width,\n boundaries.minWidth || ContainerManager.MINWIDTH,\n boundaries.maxWidth || Infinity\n )\n constrained.height = clamp(\n state.height,\n boundaries.minHeight || ContainerManager.MINHEIGHT,\n boundaries.maxHeight || Infinity\n )\n\n // Apply viewport constraints if needed\n if (this.shouldConstrainToViewport()) {\n const viewport = getViewportDimensions()\n constrained.x = clamp(state.x, 0, viewport.width - constrained.width)\n constrained.y = clamp(state.y, 0, viewport.height - constrained.height)\n }\n\n // Apply parent constraints if enabled\n if (this.config?.constrainToParent) {\n constrained = this.constrainToParent(constrained)\n }\n\n return constrained\n })\n\n // Automatic DOM updates with reactive effect\n private domUpdateEffect = effect(() => {\n const state = this.constrainedState.value\n\n if (!this.container) return\n\n this.container.style.left = `${state.x}px`\n this.container.style.top = `${state.y}px`\n this.container.style.width = `${state.width}px`\n this.container.style.height = `${state.height}px`\n\n this.eventEmitter?.emit('stateChange', {\n type: 'stateChange',\n state: { ...state },\n mode: this.reactiveState.mode,\n element: this.container\n })\n })\n\n /**\n * Create a new container manager instance with reactive state management\n * @param container - HTML element to manage\n * @param config - Configuration options\n */\n constructor(container: HTMLElement, config: Partial<ContainerConfig> = {})\n {\n this.config = deepMerge<ContainerConfig>({\n _uid: '',\n mode: 'smooth',\n constrainToViewport: false,\n draggingDirection: 'all',\n constrainToParent: false,\n boundaries: {\n minWidth: ContainerManager.MINWIDTH,\n minHeight: ContainerManager.MINHEIGHT\n },\n autoAdjust: {\n enabled: false,\n width: false,\n height: false\n },\n resize: {\n enabled: true,\n directions: ['se']\n }\n }, config)\n\n this.container = container\n this.zIndexState = getState()\n\n // Initialize reactive state from DOM\n const currentState = this.getCurrentState()\n this.reactiveState.x = currentState.x\n this.reactiveState.y = currentState.y\n this.reactiveState.width = currentState.width\n this.reactiveState.height = currentState.height\n this.reactiveState.mode = this.config.mode\n this.reactiveState.draggingDirection = this.config.draggingDirection\n\n // Initialize enhanced event emitters with metrics\n this.eventEmitter = new ReactiveEventSystem<ContainerEvent>({ enableMetrics: true })\n this.pluginEventEmitter = new ReactiveEventSystem({ enableMetrics: true })\n\n // Create reactive streams for common events\n this.stateChangeStream = this.eventEmitter.stream('stateChange')\n this.dragStream = this.eventEmitter.stream('drag')\n this.resizeStream = this.eventEmitter.stream('resize')\n\n this.startState = this.getState()\n\n this.setupEventMiddleware()\n this.initializeHandles()\n this.bindEvents()\n this.setupResizeObservers()\n this.setupReactiveMonitoring()\n }\n\n /**\n * Set up ResizeObserver to track viewport and parent size changes\n */\n private setupResizeObservers(): void\n {\n // Setup viewport resize observer if viewport constraints should be applied\n if (this.shouldConstrainToViewport()) {\n this.setupViewportResizeObserver()\n }\n\n // Setup parent element observer if auto-adjust is enabled\n if (this.config.autoAdjust?.enabled) {\n this.setupParentResizeObserver()\n }\n }\n\n /**\n * Determine if viewport constraints should be applied\n */\n private shouldConstrainToViewport(): boolean\n {\n return !this.config.constrainToParent || this.config.constrainToViewport\n }\n\n /**\n * Set up ResizeObserver to track viewport size changes\n */\n private setupViewportResizeObserver(): void\n {\n let rAFTimeout: number | null = null\n\n this.resizeObserver = new ResizeObserver(() => {\n rAFTimeout && cancelAnimationFrame(rAFTimeout)\n rAFTimeout = requestAnimationFrame(() => {\n this.handleViewportResize()\n })\n })\n\n this.resizeObserver.observe(document.body)\n }\n\n /**\n * Handle viewport resize event with reactive state updates\n */\n private handleViewportResize(): void\n {\n if (!this.shouldConstrainToViewport()) return\n\n const viewport = getViewportDimensions()\n const currentState = this.getState()\n const newState = { ...currentState }\n\n let needsUpdate = false\n\n // Check if container is outside viewport on right edge\n if (newState.x + newState.width > viewport.width) {\n newState.x = Math.max(0, viewport.width - newState.width)\n needsUpdate = true\n }\n\n // Check if container is outside viewport on bottom edge\n if (newState.y + newState.height > viewport.height) {\n newState.y = Math.max(0, viewport.height - newState.height)\n needsUpdate = true\n }\n\n // Check if container is outside viewport on left edge\n if (newState.x < 0) {\n newState.x = 0\n needsUpdate = true\n }\n\n // Check if container is outside viewport on top edge\n if (newState.y < 0) {\n newState.y = 0\n needsUpdate = true\n }\n\n if (needsUpdate) {\n this.setState(newState)\n\n this.eventEmitter.emit('viewportResize', {\n type: 'viewportResize',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container\n })\n }\n }\n\n /**\n * Set up ResizeObserver for parent element auto-adjustment\n */\n private setupParentResizeObserver(): void\n {\n const parentElement = this.container.parentElement\n if (!parentElement) return\n\n this.parentResizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n this.handleParentResize(entry)\n }\n })\n\n this.parentResizeObserver.observe(parentElement)\n }\n\n /**\n * Handle parent element resize for auto-adjustment with reactive updates\n */\n private handleParentResize(entry: ResizeObserverEntry): void\n {\n const { autoAdjust } = this.config\n if (!autoAdjust?.enabled) return\n\n const parentRect = entry.contentRect\n const currentState = this.getState()\n const newState = { ...currentState }\n\n let needsUpdate = false\n\n if (autoAdjust.width) {\n const maxWidth = this.getMaxWidthConstraint()\n const newWidth = Math.min(parentRect.width, maxWidth)\n\n if (Math.abs(newState.width - newWidth) > 1) {\n newState.width = newWidth\n needsUpdate = true\n }\n }\n\n if (autoAdjust.height) {\n const maxHeight = this.getMaxHeightConstraint()\n const newHeight = Math.min(parentRect.height, maxHeight)\n\n if (Math.abs(newState.height - newHeight) > 1) {\n newState.height = newHeight\n needsUpdate = true\n }\n }\n\n if (needsUpdate) {\n this.setState(newState)\n\n this.eventEmitter.emit('autoAdjust', {\n type: 'autoAdjust',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container\n })\n }\n }\n\n /**\n * Initialize drag and resize handles based on configuration\n */\n private initializeHandles(): void\n {\n this.initializeDragHandle()\n\n if (this.config.resize?.enabled) {\n this.initializeResizeHandles()\n }\n }\n\n /**\n * Initialize drag handle\n */\n private initializeDragHandle(): void\n {\n this.dragHandle = this.container.querySelector('[data-drag-handle]') as HTMLElement\n if (!this.dragHandle) {\n this.dragHandle = document.createElement('div')\n this.dragHandle.className = 'drag-handle'\n this.dragHandle.setAttribute('data-drag-handle', 'true')\n this.dragHandle.setAttribute('oncontextmenu', 'return false')\n this.container.prepend(this.dragHandle)\n } else {\n this.dragHandle.setAttribute('oncontextmenu', 'return false')\n }\n }\n\n /**\n * Initialize resize handles for all configured directions\n */\n private initializeResizeHandles(): void\n {\n const directions = this.config.resize?.directions || ['se']\n\n directions.forEach(direction => {\n const handle = this.createResizeHandle(direction)\n this.resizeHandles.set(direction, handle)\n this.container.appendChild(handle)\n })\n }\n\n /**\n * Create individual resize handle for specific direction\n */\n private createResizeHandle(direction: ResizeDirection): HTMLElement\n {\n const handle = document.createElement('div')\n handle.className = `resize-handle resize-${direction}`\n handle.setAttribute('data-resize-handle', direction)\n handle.setAttribute('data-resize-direction', direction)\n\n // Add context menu prevention for resize handles\n handle.addEventListener('contextmenu', this.onContextMenu)\n\n this.applyResizeHandleStyles(handle, direction)\n\n return handle\n }\n\n /**\n * Apply styles and cursor for resize handle based on direction\n */\n private applyResizeHandleStyles(handle: HTMLElement, direction: ResizeDirection): void\n {\n const cursorMap: Record<ResizeDirection, string> = {\n 'n': 'ns-resize', 's': 'ns-resize', 'e': 'ew-resize', 'w': 'ew-resize',\n 'ne': 'nesw-resize', 'nw': 'nwse-resize', 'se': 'nwse-resize', 'sw': 'nesw-resize'\n }\n\n handle.style.position = 'absolute'\n handle.style.cursor = cursorMap[direction]\n\n this.positionResizeHandle(handle, direction)\n }\n\n /**\n * Position resize handle based on direction\n */\n private positionResizeHandle(handle: HTMLElement, direction: ResizeDirection): void\n {\n const size = 12\n\n switch (direction) {\n case 'n':\n handle.style.top = '0'\n handle.style.left = '0'\n handle.style.right = '0'\n handle.style.height = `${size}px`\n break\n case 's':\n handle.style.bottom = '0'\n handle.style.left = '0'\n handle.style.right = '0'\n handle.style.height = `${size}px`\n break\n case 'e':\n handle.style.right = '0'\n handle.style.top = '0'\n handle.style.bottom = '0'\n handle.style.width = `${size}px`\n break\n case 'w':\n handle.style.left = '0'\n handle.style.top = '0'\n handle.style.bottom = '0'\n handle.style.width = `${size}px`\n break\n case 'ne':\n handle.style.top = '0'\n handle.style.right = '0'\n handle.style.width = `${size}px`\n handle.style.height = `${size}px`\n break\n case 'nw':\n handle.style.top = '0'\n handle.style.left = '0'\n handle.style.width = `${size}px`\n handle.style.height = `${size}px`\n break\n case 'se':\n handle.style.bottom = '0'\n handle.style.right = '0'\n handle.style.width = `${size}px`\n handle.style.height = `${size}px`\n break\n case 'sw':\n handle.style.bottom = '0'\n handle.style.left = '0'\n handle.style.width = `${size}px`\n handle.style.height = `${size}px`\n break\n }\n }\n\n /**\n * Bind event listeners to handles\n */\n private bindEvents(): void\n {\n this.onDragStart = this.onDragStart.bind(this)\n this.onDragMove = this.onDragMove.bind(this)\n this.onDragEnd = this.onDragEnd.bind(this)\n\n this.onResizeStart = this.onResizeStart.bind(this)\n this.onResizeMove = this.onResizeMove.bind(this)\n this.onResizeEnd = this.onResizeEnd.bind(this)\n\n this.onContextMenu = this.onContextMenu.bind(this)\n\n // Only bind default drag events if no snapping plugin is installed\n if (!this.hasPluginByName('SnappingPlugin')) {\n this.dragHandle.addEventListener('mousedown', this.onDragStart)\n this.dragHandle.addEventListener('touchstart', this.onDragStart)\n }\n\n // Bind resize events for all resize handles\n if (this.config.resize?.enabled) {\n this.resizeHandles.forEach((handle, direction) => {\n handle.addEventListener('mousedown', (e) => this.onResizeStart(e, direction))\n handle.addEventListener('touchstart', (e) => this.onResizeStart(e, direction))\n })\n }\n\n // Disable context menu on drag handle\n this.dragHandle.addEventListener('contextmenu', this.onContextMenu)\n }\n\n /**\n * Apply movement mode to coordinates\n */\n private applyMovementMode(deltaX: number, deltaY: number): ContainerState\n {\n const newState = { ...this.startState }\n\n if (this.reactiveState.mode === 'smooth') {\n newState.x = this.startState.x + deltaX\n newState.y = this.startState.y + deltaY\n }\n\n return newState\n }\n\n /**\n * Calculate new state based on resize direction and deltas\n */\n private calculateResizeState(deltaX: number, deltaY: number, direction: ResizeDirection): ContainerState\n {\n const newState = { ...this.startState }\n\n switch (direction) {\n case 'e': // East - right only\n newState.width = this.startState.width + deltaX\n break\n case 'w': // West - left only\n newState.width = this.startState.width - deltaX\n newState.x = this.startState.x + deltaX\n break\n case 'n': // North - top only\n newState.height = this.startState.height - deltaY\n newState.y = this.startState.y + deltaY\n break\n case 's': // South - bottom only\n newState.height = this.startState.height + deltaY\n break\n case 'ne': // Northeast - top-right\n newState.width = this.startState.width + deltaX\n newState.height = this.startState.height - deltaY\n newState.y = this.startState.y + deltaY\n break\n case 'nw': // Northwest - top-left\n newState.width = this.startState.width - deltaX\n newState.height = this.startState.height - deltaY\n newState.x = this.startState.x + deltaX\n newState.y = this.startState.y + deltaY\n break\n case 'se': // Southeast - bottom-right\n newState.width = this.startState.width + deltaX\n newState.height = this.startState.height + deltaY\n break\n case 'sw': // Southwest - bottom-left\n newState.width = this.startState.width - deltaX\n newState.height = this.startState.height + deltaY\n newState.x = this.startState.x + deltaX\n break\n }\n\n return newState\n }\n\n /**\n * Constrain container to parent element boundaries (both position and size)\n */\n private constrainToParent(state: ContainerState): ContainerState\n {\n const parentElement = this.container.parentElement\n if (!parentElement) return state\n\n const parentRect = parentElement.getBoundingClientRect()\n\n // If the container has not yet been added to the DOM or the parent has a zero size,\n // return to the original state\n if (parentRect.width === 0 || parentRect.height === 0) {\n return state\n }\n\n // Calculating the maximum allowable coordinates\n const maxX = Math.max(0, parentRect.width - state.width)\n const maxY = Math.max(0, parentRect.height - state.height)\n\n // Calculating the maximum allowable sizes\n const maxWidth = parentRect.width - state.x\n const maxHeight = parentRect.height - state.y\n\n return {\n x: clamp(state.x, 0, maxX),\n y: clamp(state.y, 0, maxY),\n width: clamp(state.width, 0, maxWidth),\n height: clamp(state.height, 0, maxHeight)\n }\n }\n\n /**\n * Get maximum width constraint considering parent and boundaries\n */\n private getMaxWidthConstraint(): number\n {\n const { boundaries } = this.config\n let maxWidth = boundaries.maxWidth || Infinity\n\n if (this.config.constrainToParent && this.container.parentElement) {\n const parentWidth = this.container.parentElement.getBoundingClientRect().width\n maxWidth = Math.min(maxWidth, parentWidth)\n }\n\n return maxWidth\n }\n\n /**\n * Get maximum height constraint considering parent and boundaries\n */\n private getMaxHeightConstraint(): number\n {\n const { boundaries } = this.config\n let maxHeight = boundaries.maxHeight || Infinity\n\n if (this.config.constrainToParent && this.container.parentElement) {\n const parentHeight = this.container.parentElement.getBoundingClientRect().height\n maxHeight = Math.min(maxHeight, parentHeight)\n }\n\n return maxHeight\n }\n\n /**\n * Handle context menu event on drag handle\n */\n private onContextMenu(e: MouseEvent): void\n {\n e.preventDefault()\n e.stopPropagation()\n }\n\n /**\n * Check if snapping plugin is installed\n */\n private hasPluginByName(pluginName: string): boolean\n {\n return Array.from(this.installedPlugins)\n .some(plugin => plugin.constructor.name === pluginName)\n }\n\n /**\n * Get current container state from DOM\n */\n private getCurrentState(): ContainerState\n {\n const rect = this.container.getBoundingClientRect()\n const style = window.getComputedStyle(this.container)\n\n const styleWidth = parseFloat(style.width) || rect.width\n const styleHeight = parseFloat(style.height) || rect.height\n\n return {\n x: rect.left,\n y: rect.top,\n width: styleWidth,\n height: styleHeight\n }\n }\n\n /**\n * Setup event middleware for enhanced event processing\n */\n private setupEventMiddleware(): void\n {\n // Add logging middleware for all events\n this.eventEmitter.use('*', (data, event) => {\n if (typeof window !== 'undefined' && (window as any).DEBUG_CONTAINER_MANAGER) {\n console.log(`[ContainerManager] ${event}:`, data)\n }\n return data\n })\n\n // TODO Add validation middleware for drag events\n this.eventEmitter.use('dragStart', (data, _event) => {\n if (this.reactiveState.mode === 'pinned') {\n throw new Error('Cannot drag in pinned mode')\n }\n return data\n })\n\n // Add performance monitoring middleware\n this.eventEmitter.use('drag', (data, _event) => {\n // console.log(`[ContainerManager] ${event}:`, data)\n return data\n })\n }\n\n /**\n * Setup reactive monitoring for container metrics\n */\n private setupReactiveMonitoring(): void\n {\n // Monitor state changes reactively\n const stateMonitor = effect(() => {\n const { state } = this.stateChangeStream\n // Intentional side-effect-free access\n // We don't need to do anything here\n void state\n })\n\n this.reactiveEffects.push(stateMonitor)\n\n // Monitor emitter metrics\n const metricsMonitor = effect(() => {\n const metrics = this.eventEmitter.getMetrics()\n // Monitor event system health\n if (metrics.state.errorCount > 10) {\n console.warn('[ContainerManager] High error count in event system:', metrics.state.errorCount)\n }\n })\n\n this.reactiveEffects.push(metricsMonitor)\n }\n\n // Public API Implementation\n\n /**\n * Subscribe to container events\n * @param event - Event name\n * @param callback - Callback function\n */\n on(event: string, callback: (data: ContainerEvent) => void): void\n {\n this.eventEmitter.on(event, callback)\n }\n\n /**\n * Unsubscribe from container events\n * @param event - Event name\n * @param callback - Callback function\n */\n off(event: string, callback: (data: ContainerEvent) => void): void\n {\n this.eventEmitter.off(event, callback)\n }\n\n /**\n * Wait for specific container event\n * @example\n * // Wait for drag to complete\n * const dragResult = await manager.waitFor('dragEnd')\n * console.log('Drag completed:', dragResult.state)\n */\n waitFor(event: string, timeout?: number): Promise<ContainerEvent>\n {\n return this.eventEmitter.waitFor(event, timeout)\n }\n\n /**\n * Get reactive stream for specific event type\n * @example\n * // Get state change stream\n * const stateStream = manager.getStream('stateChange')\n * stateStream.subscribe((data) => {\n * console.log('State changed:', data.state)\n * })\n */\n getStream(event: string): ReturnType<ReactiveEventSystem<ContainerEvent>['stream']>\n {\n return this.eventEmitter.stream(event)\n }\n\n /**\n * Pipe container events to another emitter\n * @example\n * // Pipe all events to analytics emitter\n * manager.pipe('*', analyticsEmitter)\n */\n pipe(event: string, targetEmitter: ReactiveEventSystem<ContainerEvent>, targetEvent?: string): () => void\n {\n return this.eventEmitter.pipe(event, targetEmitter, targetEvent)\n }\n\n /**\n * Get event system metrics for monitoring\n */\n getEventMetrics(): ReturnType<ReactiveEventSystem<ContainerEvent>['getMetrics']>\n {\n return this.eventEmitter.getMetrics()\n }\n\n /**\n * Plugin-specific event emission\n */\n emitPluginEvent(event: string, data: any): void\n {\n this.pluginEventEmitter.emit(event, data)\n }\n\n /**\n * Listen to plugin-specific events\n */\n onPluginEvent(event: string, listener: (data: any) => void): void\n {\n this.pluginEventEmitter.on(event, listener)\n }\n\n /**\n * Remove plugin event listener\n */\n offPluginEvent(event: string, listener: (data: any) => void): void\n {\n this.pluginEventEmitter.off(event, listener)\n }\n\n /**\n * Add middleware for plugin events\n */\n usePluginMiddleware(event: string, middleware: PluginMiddleware): () => void\n {\n return this.pluginEventEmitter.use(event, middleware)\n }\n\n /**\n * Handle drag start event\n */\n onDragStart(e: MouseEvent | TouchEvent): void\n {\n // Don't allow dragging in pinned mode\n if (this.reactiveState.mode === 'pinned') return\n\n e.preventDefault()\n this.bringToFront()\n\n this.isDragging = true\n\n const clientX = e instanceof MouseEvent ? e.clientX : e.touches[0].clientX\n const clientY = e instanceof MouseEvent ? e.clientY : e.touches[0].clientY\n\n this.startX = clientX\n this.startY = clientY\n this.startState = this.getState()\n\n this.eventEmitter.emit('dragStart', {\n type: 'drag',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container\n })\n\n document.addEventListener('mousemove', this.onDragMove)\n document.addEventListener('mouseup', this.onDragEnd)\n document.addEventListener('touchmove', this.onDragMove)\n document.addEventListener('touchend', this.onDragEnd)\n }\n\n /**\n * Handle drag movement with reactive state updates\n */\n onDragMove(e: MouseEvent | TouchEvent): void\n {\n if (!this.isDragging) return\n\n const { clientX, clientY } = this.directionResolver(\n e instanceof MouseEvent ? e.clientX : e.touches[0].clientX,\n e instanceof MouseEvent ? e.clientY : e.touches[0].clientY\n )\n\n const deltaX = clientX - this.startX\n const deltaY = clientY - this.startY\n\n // Apply movement mode and update reactive state\n const newState = this.applyMovementMode(deltaX, deltaY)\n this.setState(newState)\n\n this.eventEmitter.emit('drag', {\n type: 'drag',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container\n })\n }\n\n /**\n * Handle drag end event\n */\n onDragEnd(): void\n {\n this.isDragging = false\n\n document.removeEventListener('mousemove', this.onDragMove)\n document.removeEventListener('mouseup', this.onDragEnd)\n document.removeEventListener('touchmove', this.onDragMove)\n document.removeEventListener('touchend', this.onDragEnd)\n\n this.eventEmitter.emit('dragEnd', {\n type: 'drag',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container\n })\n }\n\n /**\n * Handle resize start event with direction\n */\n onResizeStart(e: MouseEvent | TouchEvent, direction: ResizeDirection): void\n {\n e.preventDefault()\n e.stopPropagation()\n\n this.bringToFront()\n this.isResizing = true\n this.resizeDirection = direction\n\n const clientX = e instanceof MouseEvent ? e.clientX : e.touches[0].clientX\n const clientY = e instanceof MouseEvent ? e.clientY : e.touches[0].clientY\n\n this.startX = clientX\n this.startY = clientY\n this.startState = this.getState()\n\n document.addEventListener('mousemove', this.onResizeMove)\n document.addEventListener('mouseup', this.onResizeEnd)\n document.addEventListener('touchmove', this.onResizeMove)\n document.addEventListener('touchend', this.onResizeEnd)\n\n this.eventEmitter.emit('resizeStart', {\n type: 'resize',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container,\n direction\n })\n }\n\n /**\n * Handle resize movement with multi-direction support and reactive updates\n */\n onResizeMove(e: MouseEvent | TouchEvent): void\n {\n if (!this.isResizing || !this.resizeDirection) return\n\n const clientX = e instanceof MouseEvent ? e.clientX : e.touches[0].clientX\n const clientY = e instanceof MouseEvent ? e.clientY : e.touches[0].clientY\n\n const deltaX = clientX - this.startX\n const deltaY = clientY - this.startY\n\n const newState = this.calculateResizeState(deltaX, deltaY, this.resizeDirection)\n\n // Use reactive state update which will automatically apply constraints\n this.setState(newState)\n\n this.eventEmitter.emit('resize', {\n type: 'resize',\n state: this.getState(),\n mode: this.reactiveState.mode,\n direction: this.resizeDirection,\n element: this.container\n })\n }\n\n /**\n * Handle resize end event\n */\n onResizeEnd(): void\n {\n this.isResizing = false\n this.resizeDirection = null\n\n document.removeEventListener('mousemove', this.onResizeMove)\n document.removeEventListener('mouseup', this.onResizeEnd)\n document.removeEventListener('touchmove', this.onResizeMove)\n document.removeEventListener('touchend', this.onResizeEnd)\n\n this.eventEmitter.emit('resizeEnd', {\n type: 'resize',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container\n })\n }\n\n /**\n * Set movement direction\n */\n setDirection(direction: DirectionMode): void\n {\n this.reactiveState.draggingDirection = direction\n\n this.emitPluginEvent('directionChanged', { direction })\n }\n\n /**\n * Get current movement direction\n */\n getDirection(): DirectionMode\n {\n return this.reactiveState.draggingDirection\n }\n\n /**\n * Resolve coordinates based on current direction mode\n */\n directionResolver(x: number, y: number)\n {\n const direction = this.reactiveState.draggingDirection\n\n // Determine which coordinates to lock based on direction mode\n const lockX = direction === 'vertical'\n const lockY = direction === 'horizontal'\n\n return {\n clientX: lockX ? this.startX : x,\n clientY: lockY ? this.startY : y\n }\n }\n\n /**\n * Get current movement mode\n */\n getMode(): MovementMode\n {\n return this.reactiveState.mode\n }\n\n /**\n * Set movement mode with reactive update\n */\n setMode(mode: MovementMode): void\n {\n this.reactiveState.mode = mode\n\n this.eventEmitter.emit('modeChange', {\n type: 'modeChange',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container\n })\n }\n\n /**\n * Update container boundaries\n */\n setBoundaries(boundaries: Partial<Boundaries>): void\n {\n this.config.boundaries = { ...this.config.boundaries, ...boundaries }\n }\n\n /**\n * Get current container state (reactive)\n */\n getState(): ContainerState\n {\n return {\n x: this.reactiveState.x,\n y: this.reactiveState.y,\n width: this.reactiveState.width,\n height: this.reactiveState.height\n }\n }\n\n /**\n * Update container position and size with reactive state\n */\n setState(state: Partial<ContainerState>): void\n {\n // Update reactive state directly\n if (state.height !== undefined) this.reactiveState.height = state.height\n if (state.width !== undefined) this.reactiveState.width = state.width\n if (state.x !== undefined) this.reactiveState.x = state.x\n if (state.y !== undefined) this.reactiveState.y = state.y\n\n this.applyStateToDOM()\n }\n\n /**\n * Apply current state to DOM immediately for synchronization\n */\n private applyStateToDOM(): void\n {\n const state = this.getState()\n\n this.container.style.left = `${state.x}px`\n this.container.style.top = `${state.y}px`\n this.container.style.width = `${state.width}px`\n this.container.style.height = `${state.height}px`\n }\n\n /**\n * Bring container to front programmatically\n */\n bringToFront(): void\n {\n const { _uid } = this.config\n this.container.style.zIndex = this.zIndexState.sort(_uid).zIndex(_uid)\n }\n\n /**\n * Get container DOM element\n */\n getContainer(): HTMLElement\n {\n return this.container\n }\n\n /**\n * Update auto-adjust configuration\n */\n setAutoAdjust(config: AutoAdjustConfig): void\n {\n this.config.autoAdjust = { ...this.config.autoAdjust, ...config }\n\n // Restart parent observer if auto-adjust is enabled\n if (this.parentResizeObserver) {\n this.parentResizeObserver.disconnect()\n this.parentResizeObserver = null\n }\n\n if (this.config.autoAdjust?.enabled) {\n this.setupParentResizeObserver()\n }\n }\n\n /**\n * Update resize configuration\n */\n setResizeConfig(config: ResizeConfig): void\n {\n this.config.resize = { ...this.config.resize, ...config }\n\n // Remove existing resize handles\n this.resizeHandles.forEach(handle => handle.remove())\n this.resizeHandles.clear()\n\n // Initialize new resize handles if enabled\n if (this.config.resize?.enabled) {\n this.initializeResizeHandles()\n this.bindEvents()\n }\n }\n\n /**\n * Set constrain to parent configuration\n */\n setConstrainToParent(enabled: boolean): void\n {\n this.config.constrainToParent = enabled\n\n // Update viewport observer based on new constraint configuration\n if (this.resizeObserver) {\n this.resizeObserver.disconnect()\n this.resizeObserver = null\n }\n\n if (this.shouldConstrainToViewport()) {\n this.setupViewportResizeObserver()\n }\n }\n\n /**\n * Set constrain to viewport configuration\n */\n setConstrainToViewport(enabled: boolean): void\n {\n this.config.constrainToViewport = enabled\n\n // Restart viewport observer if enabled\n if (this.resizeObserver) {\n this.resizeObserver.disconnect()\n this.resizeObserver = null\n }\n\n if (this.shouldConstrainToViewport()) {\n this.setupViewportResizeObserver()\n }\n }\n\n /**\n * Recalculate container state relative to parent element\n */\n recalculateForParent(): void\n {\n if (!this.config.constrainToParent || !this.container.parentElement) {\n return\n }\n\n const parentRect = this.container.parentElement.getBoundingClientRect()\n const currentState = this.getState()\n\n // If the parent has zero dimensions, exit\n if (parentRect.width === 0 || parentRect.height === 0) {\n return\n }\n\n // Keep the desired dimensions, but limit them to the parent dimensions\n const desiredWidth = currentState.width\n const desiredHeight = currentState.height\n\n const newWidth = Math.min(desiredWidth, parentRect.width)\n const newHeight = Math.min(desiredHeight, parentRect.height)\n\n // Save the desired coordinates, but limit them to the parent dimensions\n const desiredX = currentState.x\n const desiredY = currentState.y\n\n const newX = Math.min(desiredX, parentRect.width - newWidth)\n const newY = Math.min(desiredY, parentRect.height - newHeight)\n\n // Use reactive state update\n this.setState({\n x: newX,\n y: newY,\n width: newWidth,\n height: newHeight\n })\n\n this.eventEmitter.emit('parentRecalculated', {\n type: 'parentRecalculated',\n state: this.getState(),\n mode: this.reactiveState.mode,\n element: this.container\n })\n }\n\n /**\n * Install plugin on this container manager instance\n */\n use(plugin: Plugin, options?: any): ContainerManagerInterface\n {\n // Prevent duplicate plugin installation\n if (this.installedPlugins.has(plugin)) return this\n\n try {\n plugin.install(this, options)\n this.installedPlugins.add(plugin)\n } catch (error) {\n console.error('[ContainerManager] Failed to install plugin:', error)\n }\n\n return this\n }\n\n /**\n * Check if plugin is installed on this instance\n */\n hasPlugin(plugin: Plugin): boolean\n {\n return this.installedPlugins.has(plugin)\n }\n\n /**\n * Get all installed plugins on this instance\n */\n getInstalledPlugins(): Plugin[]\n {\n return Array.from(this.installedPlugins)\n }\n\n /**\n * Destroy container manager with proper cleanup\n */\n destroy(): void\n {\n // Clean up reactive effects\n this.reactiveEffects.forEach(effect => effect())\n this.reactiveEffects = []\n\n // Destroy reactive streams\n this.stateChangeStream.destroy()\n this.dragStream.destroy()\n this.resizeStream.destroy()\n\n this.eventEmitter.destroy()\n this.pluginEventEmitter.destroy()\n this.domUpdateEffect()\n\n // Remove event listeners\n this.dragHandle.removeEventListener('mousedown', this.onDragStart)\n this.dragHandle.removeEventListener('touchstart', this.onDragStart)\n this.dragHandle.removeEventListener('contextmenu', this.onContextMenu)\n\n // Remove resize handle events\n this.resizeHandles.forEach((handle, direction) => {\n handle.removeEventListener('mousedown', (e) => this.onResizeStart(e, direction))\n handle.removeEventListener('touchstart', (e) => this.onResizeStart(e, direction))\n })\n\n // Clean up ResizeObservers\n if (this.resizeObserver) {\n this.resizeObserver.disconnect()\n this.resizeObserver = null\n }\n\n if (this.parentResizeObserver) {\n this.parentResizeObserver.disconnect()\n this.parentResizeObserver = null\n }\n\n // Clear installed plugins\n this.installedPlugins.clear()\n\n this.zIndexState.remove(this.config._uid)\n }\n}\n","// src/plugins/SnappingPlugin.ts\n\nimport type { ContainerManagerInterface, Plugin, ContainerState } from '../core/types'\nimport { reactive } from '@alekstar79/reactive-event-system'\n\n/**\n * Configuration options for SnappingPlugin\n */\nexport interface SnappingPluginOptions {\n snapStep?: number\n enabled?: boolean\n}\n\n/**\n * Extended container manager interface with plugin methods\n */\nexport interface SnappingContainerManager extends ContainerManagerInterface {\n setSnapStep?(step: number): void\n setSnappingEnabled?(enabled: boolean): void\n getSnappingConfig?(): SnappingPluginOptions\n}\n\n/**\n * Reactive state for snapping plugin\n */\ninterface SnappingPluginState {\n snapStep: number\n enabled: boolean\n isActive: boolean\n lastPosition: { x: number; y: number } | null\n}\n\n/**\n * Snapping plugin for Container Manager\n */\nexport class SnappingPlugin implements Plugin\n{\n private static _pluginId: Symbol = Symbol('SnappingPlugin')\n\n get pluginId(): Symbol {\n return SnappingPlugin._pluginId\n }\n\n // Plugin state\n private reactiveState = reactive<SnappingPluginState>({\n snapStep: 10,\n enabled: true,\n isActive: false,\n lastPosition: null\n })\n\n private manager!: ContainerManagerInterface & SnappingContainerManager\n private startState: ContainerState | null = null\n private startX: number = 0\n private startY: number = 0\n\n constructor(options: SnappingPluginOptions = {})\n {\n // Initialize with options\n this.reactiveState.snapStep = options.snapStep ?? 10\n this.reactiveState.enabled = options.enabled ?? true\n\n this.onDragMove = this.onDragMove.bind(this)\n this.onDragEnd = this.onDragEnd.bind(this)\n }\n\n /**\n * Install plugin on container manager instance with reactive state\n */\n install(manager: ContainerManagerInterface, options?: SnappingPluginOptions): void\n {\n this.manager = manager as ContainerManagerInterface & SnappingContainerManager\n\n // Update configuration if provided during installation\n if (options) {\n this.reactiveState.snapStep = options.snapStep ?? this.reactiveState.snapStep\n this.reactiveState.enabled = options.enabled ?? this.reactiveState.enabled\n }\n\n // Override drag handling methods\n this.overrideDragMethods()\n // Add plugin methods to manager for dynamic control\n this.addPluginMethods()\n }\n\n /**\n * Override drag handling methods to add snapping functionality\n */\n private overrideDragMethods(): void\n {\n if (!this.manager) return\n\n // Create new drag handle with snapping support\n const dragHandle = this.manager.getContainer().querySelector('.drag-handle') as HTMLElement\n if (dragHandle) {\n // Add our own event listeners\n dragHandle.onmousedown = (e: MouseEvent) => {\n this.onDragStart(e)\n }\n\n // Add touch support\n dragHandle.ontouchstart = (e: TouchEvent) => {\n this.onDragStart(e)\n }\n }\n }\n\n /**\n * Handle drag start event with snapping support\n */\n private onDragStart(e: MouseEvent | TouchEvent): void\n {\n if (!this.manager || this.manager.getMode() === 'pinned') return\n\n e.preventDefault()\n this.manager.bringToFront?.()\n\n // Update state\n this.reactiveState.isActive = true\n\n const clientX = e instanceof MouseEvent ? e.clientX : e.touches[0].clientX\n const clientY = e instanceof MouseEvent ? e.clientY : e.touches[0].clientY\n\n this.startX = clientX\n this.startY = clientY\n this.startState = this.manager.getState()\n\n // Store last position\n this.reactiveState.lastPosition = { x: this.startState.x, y: this.startState.y }\n\n // Add event listeners for drag movement and end\n document.addEventListener('mousemove', this.onDragMove)\n document.addEventListener('mouseup', this.onDragEnd)\n document.addEventListener('touchmove', this.onDragMove)\n document.addEventListener('touchend', this.onDragEnd)\n\n this.manager.emitPluginEvent('dragStart', {\n type: 'drag',\n state: this.startState,\n mode: this.manager.getMode()\n })\n }\n\n /**\n * Handle drag movement with reactive snapping\n */\n private onDragMove(e: MouseEvent | TouchEvent): void\n {\n if (!this.reactiveState.isActive || !this.manager || !this.startState) return\n\n const { clientX, clientY } = this.manager.directionResolver(\n e instanceof MouseEvent ? e.clientX : e.touches[0].clientX,\n e instanceof MouseEvent ? e.clientY : e.touches[0].clientY\n )\n\n let deltaX = clientX - this.startX\n let deltaY = clientY - this.startY\n\n // Apply snapping if enabled\n if (this.reactiveState.enabled) {\n const snappedDeltas = this.applySnapping(deltaX, deltaY)\n deltaX = snappedDeltas.deltaX\n deltaY = snappedDeltas.deltaY\n }\n\n const newState: ContainerState = {\n x: this.startState.x + deltaX,\n y: this.startState.y + deltaY,\n width: this.startState.width,\n height: this.startState.height\n }\n\n // Constrain to viewport if enabled\n const config = (this.manager as any).config\n if (config?.constrainToViewport) {\n this.constrainToViewport(newState)\n }\n\n this.manager.setState(newState)\n\n // Update last position\n this.reactiveState.lastPosition = { x: newState.x, y: newState.y }\n\n this.manager.emitPluginEvent('drag', {\n type: 'drag',\n state: newState,\n mode: this.manager.getMode()\n })\n }\n\n /**\n * Handle drag end event\n */\n private onDragEnd(): void\n {\n if (!this.manager) return\n\n // Update state\n this.reactiveState.isActive = false\n this.reactiveState.lastPosition = null\n this.startState = null\n\n // Remove event listeners\n document.removeEventListener('mousemove', this.onDragMove)\n document.removeEventListener('mouseup', this.onDragEnd)\n document.removeEventListener('touchmove', this.onDragMove)\n document.removeEventListener('touchend', this.onDragEnd)\n\n this.manager.emitPluginEvent('dragEnd', {\n type: 'drag',\n state: this.manager.getState(),\n mode: this.manager.getMode()\n })\n }\n\n /**\n * Apply snapping to drag movement based on current mode\n */\n private applySnapping(deltaX: number, deltaY: number): { deltaX: number; deltaY: number }\n {\n return {\n deltaX: this.snapToGrid(deltaX, this.reactiveState.snapStep),\n deltaY: this.snapToGrid(deltaY, this.reactiveState.snapStep)\n }\n }\n\n /**\n * Snap value to grid using reactive step\n */\n private snapToGrid(value: number, step: number): number\n {\n return Math.round(value / step) * step\n }\n\n /**\n * Constrain container to viewport boundaries\n */\n private constrainToViewport(state: ContainerState): void\n {\n const viewportWidth = window.innerWidth || document.documentElement.clientWidth\n const viewportHeight = window.innerHeight || document.documentElement.clientHeight\n\n state.x = Math.max(0, Math.min(state.x, viewportWidth - state.width))\n state.y = Math.max(0, Math.min(state.y, viewportHeight - state.height))\n }\n\n /**\n * Add plugin methods to container manager\n */\n private addPluginMethods(): void\n {\n // Methods that update reactive state\n this.manager.setSnapStep = (step: number): void => {\n this.reactiveState.snapStep = step\n this.manager.emitPluginEvent('snapStepChanged', { snapStep: step })\n }\n\n this.manager.setSnappingEnabled = (enabled: boolean): void => {\n this.reactiveState.enabled = enabled\n this.manager.emitPluginEvent('snappingEnabledChanged', { enabled })\n }\n\n this.manager.getSnappingConfig = (): SnappingPluginOptions => {\n return {\n snapStep: this.reactiveState.snapStep,\n enabled: this.reactiveState.enabled\n }\n }\n }\n\n /**\n * Clean up plugin resources\n */\n destroy(): void\n {\n // Clean up reactive state\n this.reactiveState.isActive = false\n this.reactiveState.lastPosition = null\n }\n}\n","// src/plugins/EdgeDockingPlugin.ts\n\nimport { Plugin, ContainerManagerInterface } from '../core/types'\nimport { type IEdgeController, createTracker } from '../utils'\n\nexport type Edge = 'top' | 'bottom' | 'left' | 'right'\n\nexport interface DockedContainer {\n element: HTMLElement\n originalPosition: {\n top: number\n left: number\n width: number\n height: number\n transform: string\n position: string\n }\n edge: Edge\n screenPosition: {\n x: number\n y: number\n }\n}\n\nexport interface EdgeDockingConfig {\n edgeThreshold?: number\n visiblePeek?: number\n animationDuration?: number\n enabled?: boolean\n}\n\nexport class EdgeDockingPlugin implements Plugin\n{\n private static _pluginId: Symbol = Symbol('EdgeDockingPlugin')\n\n get pluginId(): Symbol {\n return EdgeDockingPlugin._pluginId\n }\n\n private dockedContainers = new Map<HTMLElement, DockedContainer>()\n private occupiedEdges = new Map<Edge, HTMLElement | null>()\n private tracker: IEdgeController = createTracker({ emitter: true, edgeThreshold: 20 })\n private manager!: ContainerManagerInterface\n\n private readonly edgeThreshold: number\n\n constructor(config: EdgeDockingConfig = {})\n {\n this.edgeThreshold = config.edgeThreshold ?? 30\n\n // Initialize all edges as available\n this.occupiedEdges.set('top', null)\n this.occupiedEdges.set('bottom', null)\n this.occupiedEdges.set('left', null)\n this.occupiedEdges.set('right', null)\n }\n\n install(manager: ContainerManagerInterface): void\n {\n this.manager = manager\n\n // Set up edge tracking\n this.tracker.addTarget(this.manager.getContainer())\n\n // Subscribe to edge events for visual feedback\n this.tracker.on('edge:enter', (data) => {\n if (data.source === 'element' && data.element === this.manager.getContainer()) {\n this.handleEdgeEnter(data.edge!)\n }\n })\n\n this.tracker.on('edge:leave', (data) => {\n if (data.source === 'element' && data.element === this.manager.getContainer()) {\n this.handleEdgeLeave(data.edge!)\n }\n })\n\n this.attachEventHandlers()\n }\n\n /**\n * Handle edge enter for visual feedback\n */\n private handleEdgeEnter(edge: Edge): void\n {\n const element = this.manager.getContainer()\n\n if (this.isEdgeOccupied(edge)) {\n // Edge is occupied - show blocked hint\n element.classList.add('edge-dock-hint', `edge-dock-hint-${edge}`, 'edge-dock-blocked')\n } else {\n // Edge is available - show available hint\n element.classList.add('edge-dock-hint', `edge-dock-hint-${edge}`)\n }\n }\n\n /**\n * Handle edge leave - remove visual feedback\n */\n private handleEdgeLeave(edge: Edge): void\n {\n const element = this.manager.getContainer()\n element.classList.remove('edge-dock-hint', `edge-dock-hint-${edge}`, 'edge-dock-blocked')\n }\n\n /**\n * Check if an edge is occupied by another container\n */\n private isEdgeOccupied(edge: Edge): boolean\n {\n return this.occupiedEdges.get(edge) !== null\n }\n\n /**\n * Attach event handlers to container manager\n */\n private attachEventHandlers(): void\n {\n // Add mouse events for hover behavior\n const container = this.manager.getContainer()\n container.addEventListener('mouseenter', this.onMouseEnter.bind(this))\n container.addEventListener('mouseleave', this.onMouseLeave.bind(this))\n\n this.manager.on('dragStart', (data: any) => {\n this.onDragStart(data.element)\n })\n\n this.manager.on('drag', (data: any) => {\n this.onDrag(data.element)\n })\n\n this.manager.on('dragEnd', (data: any) => {\n this.onDragEnd(data.element)\n })\n }\n\n /**\n * Handle mouse enter - show docked container\n */\n private onMouseEnter(): void\n {\n const element = this.manager.getContainer()\n if (this.isContainerDocked(element)) {\n element.classList.add('edge-docked-visible')\n }\n }\n\n /**\n * Handle mouse leave - hide docked container\n */\n private onMouseLeave(): void\n {\n const element = this.manager.getContainer()\n if (this.isContainerDocked(element)) {\n element.classList.remove('edge-docked-visible')\n }\n }\n\n /**\n * Handle drag start - undock if docked\n */\n private onDragStart(element: HTMLElement): void\n {\n // Remove any edge hints and visibility\n element.classList.remove(\n 'edge-dock-hint', 'edge-dock-blocked', 'edge-docked-visible',\n 'edge-dock-hint-top', 'edge-dock-hint-bottom',\n 'edge-dock-hint-left', 'edge-dock-hint-right'\n )\n\n const docked = this.dockedContainers.get(element)\n if (docked) {\n this.undockContainer(element, docked)\n }\n }\n\n /**\n * Handle drag - update edge hints based on position\n */\n private onDrag(element: HTMLElement): void\n {\n const rect = element.getBoundingClientRect()\n const edge = this.getClosestEdge(rect)\n\n // Update visual hints based on current position\n this.updateEdgeHints(element, edge)\n }\n\n /**\n * Handle drag end - dock if close to edge\n */\n private onDragEnd(element: HTMLElement): void\n {\n const rect = element.getBoundingClientRect()\n const edge = this.getClosestEdge(rect)\n\n // Remove all hints\n element.classList.remove(\n 'edge-dock-hint', 'edge-dock-blocked',\n 'edge-dock-hint-top', 'edge-dock-hint-bottom',\n 'edge-dock-hint-left', 'edge-dock-hint-right'\n )\n\n if (edge && !this.isEdgeOccupied(edge)) {\n this.dockContainer(element, edge)\n }\n }\n\n /**\n * Update visual hints for edge docking\n */\n private updateEdgeHints(element: HTMLElement, activeEdge: Edge | null): void\n {\n // Remove all existing hints\n element.classList.remove(\n 'edge-dock-hint', 'edge-dock-blocked',\n 'edge-dock-hint-top', 'edge-dock-hint-bottom',\n 'edge-dock-hint-left', 'edge-dock-hint-right'\n )\n\n if (activeEdge) {\n if (this.isEdgeOccupied(activeEdge)) {\n element.classList.add('edge-dock-hint', `edge-dock-hint-${activeEdge}`, 'edge-dock-blocked')\n } else {\n element.classList.add('edge-dock-hint', `edge-dock-hint-${activeEdge}`)\n }\n }\n }\n\n /**\n * Get the closest edge to the container\n */\n private getClosestEdge(rect: DOMRect): Edge | null\n {\n const distTop = rect.top\n const distLeft = rect.left\n const distBottom = window.innerHeight - rect.bottom\n const distRight = window.innerWidth - rect.right\n\n const distances = {\n top: distTop,\n bottom: distBottom,\n left: distLeft,\n right: distRight\n }\n\n const validEdges = Object.entries(distances)\n .filter(([_, dist]) => dist >= -this.edgeThreshold && dist <= this.edgeThreshold)\n .sort((a, b) => a[1] - b[1])\n\n return validEdges.length > 0\n ? validEdges[0][0] as Edge\n : null\n }\n\n /**\n * Dock container to specified edge\n */\n private dockContainer(element: HTMLElement, edge: Edge): void\n {\n // Save current state before any modifications\n const style = window.getComputedStyle(element)\n const rect = element.getBoundingClientRect()\n\n // Save screen position for proper restoration\n const screenPosition = {\n x: rect.left,\n y: rect.top\n }\n\n this.dockedContainers.set(element, {\n element,\n edge,\n screenPosition,\n originalPosition: {\n top: parseFloat(style.top) || rect.top,\n left: parseFloat(style.left) || rect.left,\n width: rect.width,\n height: rect.height,\n transform: style.transform,\n position: style.position\n }\n })\n\n // Mark edge as occupied\n this.occupiedEdges.set(edge, element)\n\n // Clear any existing positioning styles that might interfere\n element.style.top = ''\n element.style.bottom = ''\n element.style.left = ''\n element.style.right = ''\n element.style.width = ''\n element.style.height = ''\n element.style.transform = ''\n\n // Apply docking styles based on edge with proper positioning\n element.classList.add('edge-docked', `edge-docked-${edge}`)\n\n // Set proper positioning for each edge to prevent shifting\n this.applyEdgePositioning(element, edge, screenPosition)\n\n // Set data attribute for CSS targeting\n element.setAttribute('data-docked', 'true')\n element.setAttribute('data-docked-edge', edge)\n }\n\n /**\n * Apply proper positioning for each edge to prevent shifting\n */\n private applyEdgePositioning(\n element: HTMLElement,\n edge: Edge,\n screenPosition: { x: number; y: number }\n ): void {\n const rect = element.getBoundingClientRect()\n\n switch (edge) {\n case 'top':\n // For top edge - preserve horizontal position\n element.style.left = `${screenPosition.x}px`\n element.style.width = `${rect.width}px`\n break\n case 'bottom':\n // For bottom edge - preserve horizontal position\n element.style.left = `${screenPosition.x}px`\n element.style.width = `${rect.width}px`\n break\n case 'left':\n // For left edge - preserve vertical position\n element.style.top = `${screenPosition.y}px`\n element.style.height = `${rect.height}px`\n break\n case 'right':\n // For right edge - preserve vertical position\n element.style.top = `${screenPosition.y}px`\n element.style.height = `${rect.height}px`\n break\n }\n }\n\n /**\n * Undock container from edge\n */\n private undockContainer(element: HTMLElement, docked: DockedContainer): void\n {\n // Remove from docked containers\n this.dockedContainers.delete(element)\n\n // Free the edge\n this.occupiedEdges.set(docked.edge, null)\n\n // Remove all docking classes and attributes\n element.classList.remove(\n 'edge-docked', 'edge-docked-visible',\n 'edge-docked-top', 'edge-docked-bottom',\n 'edge-docked-left', 'edge-docked-right'\n )\n\n element.removeAttribute('data-docked')\n element.removeAttribute('data-docked-edge')\n\n // Clear all positioning styles\n element.style.top = ''\n element.style.bottom = ''\n element.style.left = ''\n element.style.right = ''\n element.style.width = ''\n element.style.height = ''\n element.style.transform = ''\n element.style.position = ''\n\n // Restore position using saved screen coordinates to avoid shifting\n this.restoreOriginalPosition(element, docked)\n }\n\n /**\n * Restore container to its original position without shifting\n */\n private restoreOriginalPosition(_element: HTMLElement, docked: DockedContainer): void\n {\n // Use saved screen coordinates for precise position restoration\n this.manager.setState({\n x: docked.screenPosition.x,\n y: docked.screenPosition.y,\n width: docked.originalPosition.width,\n height: docked.originalPosition.height\n })\n }\n\n /**\n * Get the docked container for a specific edge\n */\n getDockedContainer(edge: Edge): DockedContainer | null\n {\n const container = this.occupiedEdges.get(edge)\n return container ? this.dockedContainers.get(container) || null : null\n }\n\n /**\n * Check if container is docked\n */\n isContainerDocked(element: HTMLElement): boolean\n {\n return this.dockedContainers.has(element)\n }\n\n /**\n * Get the edge where container is docked\n */\n getContainerDockEdge(element: HTMLElement): Edge | null\n {\n const docked = this.dockedContainers.get(element)\n return docked ? docked.edge : null\n }\n\n /**\n * Clean up resources\n */\n destroy(): void\n {\n const container = this.manager.getContainer()\n container.removeEventListener('mouseenter', this.onMouseEnter.bind(this))\n container.removeEventListener('mouseleave', this.onMouseLeave.bind(this))\n\n // Undock all containers\n this.dockedContainers.forEach((docked, element) => {\n this.undockContainer(element, docked)\n })\n\n this.dockedContainers.clear()\n\n // Reset occupied edges\n this.occupiedEdges.forEach((_, edge) => {\n this.occupiedEdges.set(edge, null)\n })\n }\n}\n","// src/plugins/StatePersistencePlugin.ts\n\nimport { batch, effect, reactive } from '@alekstar79/reactive-event-system'\nimport { debounce } from '@alekstar79/utility'\n\nimport {\n ContainerManagerInterface,\n Plugin,\n DirectionMode,\n MovementMode,\n ResizeConfig,\n} from '../core/types'\n\n/**\n * Saved state for a container\n */\nexport interface SavedContainerState {\n x: number\n y: number\n width: number\n height: number\n mode: MovementMode\n draggingDirection: DirectionMode\n isMaximized: boolean\n containerType: string\n title?: string\n color?: string\n useSnapping?: boolean\n isClosed?: boolean\n parentElementId?: string\n closedTimestamp?: number\n resize?: ResizeConfig\n storable?: boolean\n [p: string]: any\n}\n\n/**\n * Reactive state for persistence plugin\n */\ninterface PersistencePluginState {\n isSaving: boolean\n lastSaved: number | null\n pendingChanges: boolean\n containerStates: Record<string, SavedContainerState>\n closedQueue: string[]\n storableContainers: string[]\n}\n\n/**\n * State persistence plugin for Container Manager\n */\nexport class StatePersistencePlugin implements Plugin\n{\n private static _pluginId: Symbol = Symbol('StatePersistencePlugin')\n\n get pluginId(): Symbol {\n return StatePersistencePlugin._pluginId\n }\n\n private static readonly STORAGE_KEY = 'containerManagerState'\n private static readonly CLOSED_QUEUE_KEY = 'containerManagerClosedQueue'\n private static readonly STORABLE_CONTAINERS_KEY = 'containerManagerStorableContainers'\n\n // Статическое реактивное состояние для всех плагинов\n private static reactiveState = reactive<PersistencePluginState>({\n isSaving: false,\n lastSaved: null,\n pendingChanges: false,\n containerStates: {},\n closedQueue: [],\n storableContainers: []\n })\n\n // Вычисляемое свойство для доступа к состояниям\n private static get containerStates() {\n return StatePersistencePlugin.reactiveState.containerStates\n }\n\n private static get closedQueue() {\n return StatePersistencePlugin.reactiveState.closedQueue\n }\n\n private static get storableContainers() {\n return StatePersistencePlugin.reactiveState.storableContainers\n }\n\n private static isGlobalEventsInitialized = false\n private manager?: ContainerManagerInterface\n private containerId?: string\n private storable: boolean = true\n\n // Эффект для автоматического сохранения при изменении состояния\n private autoSaveEffect?: () => void\n\n static containers: {\n manager: ContainerManagerInterface,\n containerId: string,\n storable?: boolean\n }[] = []\n\n /**\n * Install plugin on container manager instance with reactive state management\n */\n install(\n manager: ContainerManagerInterface,\n options?: { containerId: string; storable?: boolean }\n ): void {\n this.manager = manager\n this.containerId = options?.containerId\n this.storable = options?.storable ?? true\n\n if (!this.containerId) {\n console.warn('[StatePersistencePlugin] containerId is required for state persistence')\n return\n }\n\n // Register container for global event handling\n StatePersistencePlugin.containers.push({\n manager,\n containerId: this.containerId,\n storable: this.storable\n })\n\n // Register demo container if it's a demo\n if (this.storable) {\n StatePersistencePlugin.registerContainer(this.containerId)\n }\n\n // Initialize global events only once\n if (!StatePersistencePlugin.isGlobalEventsInitialized) {\n StatePersistencePlugin.initializeGlobalEvents()\n StatePersistencePlugin.isGlobalEventsInitialized = true\n }\n\n // Set up auto-save effect for demo containers\n if (this.storable) {\n this.setupAutoSaveEffect()\n }\n\n this.bindContainerEvents()\n }\n\n /**\n * Set up reactive auto-save effect for container state changes\n */\n private setupAutoSaveEffect(): void\n {\n if (!this.manager || !this.containerId) return\n\n // Create debounced auto-save effect\n const debouncedSave = debounce(() => {\n if (this.storable) {\n this.saveState()\n }\n }, 300)\n\n // Effect that triggers on container state changes\n this.autoSaveEffect = effect(() => {\n // Access manager state and mode to create dependency\n const state = this.manager!.getState()\n const mode = this.manager!.getMode()\n\n void { state, mode }\n\n // This effect will re-run whenever state or mode changes\n // We use debouncing to avoid too frequent saves\n debouncedSave()\n })\n }\n\n /**\n * Bind to container-specific events to save state on changes\n * Simplified since most saving handled using effects\n */\n private bindContainerEvents(): void\n {\n if (!this.manager) return\n\n // Only bind critical events that aren't covered by reactive effects\n this.manager.on('dragStart', () => {\n // Drag start might need immediate save for some cases\n })\n\n this.manager.on('dragEnd', () => {\n // Force save on drag end for immediate persistence\n if (this.storable) this.saveState()\n })\n\n this.manager.on('resizeEnd', () => {\n // Force save on resize end for immediate persistence\n if (this.storable) this.saveState()\n })\n\n // Listen for maximize/restore events\n this.manager.onPluginEvent('maximizeChanged', () => {\n if (this.storable) this.saveState()\n })\n\n // Listen for direction changes\n this.manager.onPluginEvent('directionChanged', () => {\n if (this.storable) this.saveState()\n })\n }\n\n /**\n * Initialize global event handlers for all containers\n */\n private static initializeGlobalEvents(): void\n {\n // Save state when page is about to unload\n window.addEventListener('beforeunload', () => {\n StatePersistencePlugin.saveAllContainers()\n })\n\n // Save state when page becomes hidden\n document.addEventListener('visibilitychange', () => {\n if (document.hidden) {\n StatePersistencePlugin.saveAllContainers()\n }\n })\n\n // Save state when window is resized\n window.addEventListener('resize', debounce(() => {\n StatePersistencePlugin.saveAllContainers()\n }, 500))\n }\n\n /**\n * Register a container as a demo container\n */\n static registerContainer(containerId: string): void\n {\n try {\n // Update reactive state\n if (!StatePersistencePlugin.storableContainers.includes(containerId)) {\n StatePersistencePlugin.storableContainers.push(containerId)\n StatePersistencePlugin.saveContainersToStorage()\n }\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to register container:', error)\n }\n }\n\n /**\n * Save demo containers to localStorage\n */\n private static saveContainersToStorage(): void\n {\n try {\n localStorage.setItem(\n StatePersistencePlugin.STORABLE_CONTAINERS_KEY,\n JSON.stringify(StatePersistencePlugin.storableContainers)\n )\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to save containers:', error)\n }\n }\n\n /**\n * Get list of all demo containers\n */\n private static getContainers(): string[]\n {\n try {\n const stored = localStorage.getItem(StatePersistencePlugin.STORABLE_CONTAINERS_KEY)\n return stored ? JSON.parse(stored) : []\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to parse containers:', error)\n return []\n }\n }\n\n /**\n * Check if a container is a demo container\n */\n static isStorableContainer(containerId: string): boolean\n {\n const containers = StatePersistencePlugin.getContainers()\n return containers.includes(containerId)\n }\n\n /**\n * Get all saved states from localStorage\n */\n private static getAllStates(): Record<string, SavedContainerState>\n {\n try {\n const stored = localStorage.getItem(StatePersistencePlugin.STORAGE_KEY)\n return stored ? JSON.parse(stored) : {}\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to parse stored states:', error)\n return {}\n }\n }\n\n /**\n * Add container ID to closed containers queue\n */\n static addToClosedQueue(containerId: string): void\n {\n // Only add demo containers to the closed queue\n if (!StatePersistencePlugin.isStorableContainer(containerId)) {\n console.log(`[StatePersistencePlugin] Skipping closed queue for non-storable container: ${containerId}`)\n return\n }\n\n // Verify that the container state exists before adding to queue\n const containerState = StatePersistencePlugin.getContainerState(containerId)\n if (!containerState) {\n console.error(`[StatePersistencePlugin] Cannot add ${containerId} to closed queue: state not found`)\n return\n }\n\n // Update reactive state\n const closedQueue = StatePersistencePlugin.closedQueue\n\n // Remove if already exists (to avoid duplicates)\n const existingIndex = closedQueue.indexOf(containerId)\n if (existingIndex > -1) {\n closedQueue.splice(existingIndex, 1)\n }\n\n // Add to the end (most recent closed)\n closedQueue.push(containerId)\n StatePersistencePlugin.saveClosedQueueToStorage()\n }\n\n /**\n * Save closed queue to localStorage\n */\n private static saveClosedQueueToStorage(): void\n {\n try {\n localStorage.setItem(\n StatePersistencePlugin.CLOSED_QUEUE_KEY,\n JSON.stringify(StatePersistencePlugin.closedQueue)\n )\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to save closed queue:', error)\n }\n }\n\n /**\n * Get closed containers queue (LIFO - last in first out)\n */\n static getClosedQueue(): string[]\n {\n try {\n const stored = localStorage.getItem(StatePersistencePlugin.CLOSED_QUEUE_KEY)\n return stored ? JSON.parse(stored) : []\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to parse closed queue:', error)\n return []\n }\n }\n\n private saveState(): void\n {\n if (!this.manager || !this.containerId || !this.storable) return\n\n // Use batch updates for multiple state changes\n batch(() => {\n StatePersistencePlugin.reactiveState.isSaving = true\n StatePersistencePlugin.reactiveState.pendingChanges = true\n\n const container = this.manager!.getContainer()\n const isMaximized = container.dataset.maximized === 'true'\n\n // Getting the current state\n const state = this.manager!.getState()\n const mode = this.manager!.getMode()\n const draggingDirection = this.manager!.getDirection()\n const containerType = container.dataset.containerType || 'unknown'\n const title = container.dataset.title\n const color = container.dataset.color\n const useSnapping = container.dataset.useSnapping === 'true'\n const resizeConfig = (this.manager as any).config?.resize\n\n // Get parent element ID if exists\n const parentElement = container.parentElement\n const parentElementId = parentElement && parentElement !== document.body\n ? (parentElement.id || `parent-${this.containerId}`)\n : undefined\n\n const savedState: SavedContainerState = {\n ...state,\n mode,\n draggingDirection,\n isMaximized,\n containerType,\n title,\n color,\n useSnapping,\n isClosed: false,\n parentElementId,\n closedTimestamp: 0,\n resize: resizeConfig,\n storable: true\n }\n\n // Update reactive state\n StatePersistencePlugin.reactiveState.containerStates[this.containerId!] = savedState\n\n // Get ALL current states and update only the needed one\n const allStates = StatePersistencePlugin.getAllStates()\n allStates[this.containerId!] = savedState\n\n // Save to localStorage\n localStorage.setItem(\n StatePersistencePlugin.STORAGE_KEY,\n JSON.stringify(allStates)\n )\n\n StatePersistencePlugin.reactiveState.lastSaved = Date.now()\n StatePersistencePlugin.reactiveState.isSaving = false\n })\n }\n\n /**\n * Save container state with current manager state before closing\n */\n static saveContainerStateBeforeClose(manager: ContainerManagerInterface, containerId: string): void\n {\n // Check if this is a storable container\n const isStorableContainer = StatePersistencePlugin.isStorableContainer(containerId)\n\n // Only save state for storable containers\n if (!isStorableContainer) {\n StatePersistencePlugin.containers = StatePersistencePlugin.containers.filter(\n c => c.containerId !== containerId\n )\n return\n }\n\n const state = manager.getState()\n const mode = manager.getMode()\n\n // Get additional container data from the container element\n const container = manager.getContainer()\n const draggingDirection = manager.getDirection()\n const isMaximized = container.dataset.maximized === 'true'\n const containerType = container.dataset.containerType || 'unknown'\n const title = container.dataset.title\n const color = container.dataset.color\n const useSnapping = container.dataset.useSnapping === 'true'\n const resizeConfig = (manager as any).config?.resize\n\n // Get edge docking state\n const isEdgeDocked = (manager as any).isEdgeDocked?.() || false\n const dockEdge = (manager as any).getDockEdge?.() || null\n\n // Get parent element ID if exists\n const parentElement = container.parentElement\n const parentElementId = parentElement && parentElement !== document.body\n ? (parentElement.id || `parent-${containerId}`)\n : undefined\n\n // Create the closed container state\n const closedState: SavedContainerState = {\n ...state,\n mode,\n draggingDirection,\n isMaximized,\n isEdgeDocked,\n dockEdge: dockEdge || undefined,\n containerType,\n title,\n color,\n useSnapping,\n isClosed: true,\n parentElementId,\n closedTimestamp: Date.now(),\n resize: resizeConfig,\n storable: true\n }\n\n // Get ALL current states from localStorage\n const allStates = StatePersistencePlugin.getAllStates()\n\n // Update the state for this container\n allStates[containerId] = closedState\n\n try {\n // Save all states back to localStorage\n localStorage.setItem(\n StatePersistencePlugin.STORAGE_KEY,\n JSON.stringify(allStates)\n )\n } catch (error) {\n console.error(`[StatePersistencePlugin] Failed to save to localStorage:`, error)\n }\n\n // Update reactive state for consistency\n StatePersistencePlugin.reactiveState.containerStates[containerId] = closedState\n // Remove container from tracked containers\n StatePersistencePlugin.containers = StatePersistencePlugin.containers.filter(\n c => c.containerId !== containerId\n )\n // Add to closed containers queue - only for demo containers\n StatePersistencePlugin.addToClosedQueue(containerId)\n }\n\n /**\n * Save all containers state (for global events) - including closed ones\n */\n static saveAllContainers(): void\n {\n // Use batch update for multiple container states\n batch(() => {\n // Get current states from localStorage to preserve closed containers\n const allStates = StatePersistencePlugin.getAllStates()\n\n // Update only the open demo containers\n StatePersistencePlugin.containers\n .filter((options) => !('storable' in options && options.storable === false))\n .forEach(({ manager, containerId }) => {\n const state = manager.getState()\n const mode = manager.getMode()\n\n const container = manager.getContainer()\n const draggingDirection = manager.getDirection()\n const isMaximized = container.dataset.maximized === 'true'\n const containerType = container.dataset.containerType || 'unknown'\n const title = container.dataset.title\n const color = container.dataset.color\n const useSnapping = container.dataset.useSnapping === 'true'\n const resizeConfig = (manager as any).config?.resize\n\n const parentElement = container.parentElement\n const parentElementId = parentElement && parentElement !== document.body\n ? (parentElement.id || `parent-${containerId}`)\n : undefined\n\n allStates[containerId] = {\n ...state,\n mode,\n draggingDirection,\n isMaximized,\n containerType,\n title,\n color,\n useSnapping,\n isClosed: false,\n parentElementId,\n closedTimestamp: 0,\n resize: resizeConfig,\n storable: true\n }\n })\n\n StatePersistencePlugin.reactiveState.containerStates = allStates\n\n localStorage.setItem(\n StatePersistencePlugin.STORAGE_KEY,\n JSON.stringify(allStates)\n )\n\n StatePersistencePlugin.reactiveState.lastSaved = Date.now()\n })\n }\n\n /**\n * Remove the most recently closed container from queue and return its ID\n */\n static popLastClosedContainer(): string | null\n {\n try {\n // Update reactive state\n const closedQueue = StatePersistencePlugin.closedQueue\n\n if (closedQueue.length === 0) return null\n\n const lastContainerId = closedQueue.pop()!\n StatePersistencePlugin.saveClosedQueueToStorage()\n\n return lastContainerId\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to pop last closed container:', error)\n return null\n }\n }\n\n /**\n * Check if there are any closed containers that can be restored\n */\n static hasClosedContainers(): boolean\n {\n return StatePersistencePlugin.closedQueue.length > 0\n }\n\n /**\n * Get saved state for specific container (including closed ones)\n */\n static getContainerState(containerId: string): SavedContainerState | null\n {\n try {\n // First check reactive state\n const stateFromReactive = StatePersistencePlugin.containerStates[containerId]\n if (stateFromReactive) return stateFromReactive\n\n // If not found in reactive state, check localStorage directly\n const states = StatePersistencePlugin.getAllStates()\n const stateFromStorage = states[containerId]\n\n if (stateFromStorage) {\n // Update reactive state for consistency\n StatePersistencePlugin.reactiveState.containerStates[containerId] = stateFromStorage\n return stateFromStorage\n }\n\n return null\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to get container state:', error)\n return null\n }\n }\n\n /**\n * Get all container states including closed ones\n */\n static getAllContainerStates(): Record<string, SavedContainerState>\n {\n return StatePersistencePlugin.getAllStates()\n }\n\n /**\n * Check if container state exists (including closed)\n */\n static hasContainerState(containerId: string): boolean\n {\n return StatePersistencePlugin.getContainerState(containerId) !== null\n }\n\n /**\n * Update container state in storage\n */\n static updateContainerState(containerId: string, updates: Partial<SavedContainerState>): void\n {\n try {\n // Getting the current states from localStorage\n const currentStates = StatePersistencePlugin.getAllStates()\n\n // Updating the status for a specific container\n const currentState = currentStates[containerId]\n if (currentState) {\n const updatedState = { ...currentState, ...updates }\n currentStates[containerId] = updatedState\n\n // Saving all states in localStorage\n localStorage.setItem(\n StatePersistencePlugin.STORAGE_KEY,\n JSON.stringify(currentStates)\n )\n\n // Also update the reactive state for consistency\n StatePersistencePlugin.reactiveState.containerStates[containerId] = updatedState\n } else {\n console.warn(`[StatePersistencePlugin] No state found for container ${containerId}, creating new state`)\n\n // Create new state if it doesn't exist\n const newState: SavedContainerState = {\n x: 0,\n y: 0,\n width: 300,\n height: 200,\n mode: 'smooth',\n draggingDirection: 'all',\n isMaximized: false,\n containerType: 'unknown',\n isClosed: false,\n storable: StatePersistencePlugin.isStorableContainer(containerId),\n ...updates\n }\n\n currentStates[containerId] = newState\n\n localStorage.setItem(\n StatePersistencePlugin.STORAGE_KEY,\n JSON.stringify(currentStates)\n )\n\n StatePersistencePlugin.reactiveState.containerStates[containerId] = newState\n }\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to update container state:', error)\n }\n }\n\n /**\n * Clear all saved states from localStorage\n */\n static clearStorage(): void\n {\n // Reset all reactive state\n batch(() => {\n StatePersistencePlugin.reactiveState.containerStates = {}\n StatePersistencePlugin.closedQueue.length = 0\n StatePersistencePlugin.storableContainers.length = 0\n StatePersistencePlugin.reactiveState.isSaving = false\n StatePersistencePlugin.reactiveState.lastSaved = null\n StatePersistencePlugin.reactiveState.pendingChanges = false\n })\n\n localStorage.removeItem(StatePersistencePlugin.STORAGE_KEY)\n localStorage.removeItem(StatePersistencePlugin.CLOSED_QUEUE_KEY)\n localStorage.removeItem(StatePersistencePlugin.STORABLE_CONTAINERS_KEY)\n StatePersistencePlugin.containers = []\n }\n\n /**\n * Initialize reactive state from localStorage on plugin load\n */\n static initializeReactiveState(): void\n {\n try {\n // Load initial state from localStorage\n const storedStates = StatePersistencePlugin.getAllStates()\n const closedQueue = StatePersistencePlugin.getClosedQueue()\n const containers = StatePersistencePlugin.getContainers()\n\n // Update reactive state\n batch(() => {\n StatePersistencePlugin.reactiveState.containerStates = storedStates\n\n // Update closedQueue and storableContainers\n StatePersistencePlugin.closedQueue.length = 0\n StatePersistencePlugin.closedQueue.push(...closedQueue)\n\n StatePersistencePlugin.storableContainers.length = 0\n StatePersistencePlugin.storableContainers.push(...containers)\n })\n } catch (error) {\n console.error('[StatePersistencePlugin] Failed to initialize reactive state:', error)\n }\n }\n\n /**\n * Get plugin metrics and statistics\n */\n static getMetrics(): {\n totalContainers: number\n demoContainers: number\n closedContainers: number\n lastSaved: number | null\n isSaving: boolean\n } {\n return {\n totalContainers: Object.keys(StatePersistencePlugin.containerStates).length,\n demoContainers: StatePersistencePlugin.storableContainers.length,\n closedContainers: StatePersistencePlugin.closedQueue.length,\n lastSaved: StatePersistencePlugin.reactiveState.lastSaved,\n isSaving: StatePersistencePlugin.reactiveState.isSaving\n }\n }\n\n /**\n * Debug method to check the current state of localStorage\n */\n static debugStorage(): void\n {\n console.log(`[StatePersistencePlugin] === START DEBUG INFO ===`)\n\n try {\n const stored = localStorage.getItem(StatePersistencePlugin.STORAGE_KEY)\n if (stored) {\n const states = JSON.parse(stored)\n console.log(`[StatePersistencePlugin] Number of states: ${Object.keys(states).length}`)\n console.log(`[StatePersistencePlugin] State keys:`, Object.keys(states))\n\n for (const [key, state] of Object.entries(states)) {\n console.log(`[StatePersistencePlugin] State ${key}:`, {\n storable: (state as any).storable,\n isClosed: (state as any).isClosed,\n title: (state as any).title\n })\n }\n }\n\n const closedQueue = localStorage.getItem(StatePersistencePlugin.CLOSED_QUEUE_KEY)\n console.log(`[StatePersistencePlugin] Closed queue:`, closedQueue ? JSON.parse(closedQueue) : [])\n\n const storableContainers = localStorage.getItem(StatePersistencePlugin.STORABLE_CONTAINERS_KEY)\n console.log(`[StatePersistencePlugin] Storable containers:`, storableContainers ? JSON.parse(storableContainers) : [])\n\n } catch (error) {\n console.error(`[StatePersistencePlugin] Debug error:`, error)\n }\n\n console.log(`[StatePersistencePlugin] === END DEBUG INFO ===`)\n }\n\n /**\n * Clean up plugin resources\n */\n destroy(): void\n {\n // Clean up reactive effect\n if (this.autoSaveEffect) {\n this.autoSaveEffect()\n this.autoSaveEffect = undefined\n }\n\n // Remove this container from tracked containers\n if (this.containerId) {\n StatePersistencePlugin.containers = StatePersistencePlugin.containers.filter(\n c => c.containerId !== this.containerId\n )\n }\n }\n}\n\n// Initialize reactive state when module loads\nStatePersistencePlugin.initializeReactiveState()\n","// src/plugins/LoggingPlugin.ts\n\nimport { ContainerManagerInterface, Plugin, ContainerEvent } from '../core/types'\nimport { debounce } from '@alekstar79/utility'\n\n/**\n * Logging plugin for Container Manager\n * Logs container events and displays notifications\n */\nexport class LoggingPlugin implements Plugin\n{\n private static _pluginId: Symbol = Symbol('LoggingPlugin')\n\n get pluginId(): Symbol {\n return LoggingPlugin._pluginId\n }\n\n private manager?: ContainerManagerInterface\n private containerName: string = ''\n private notificationSystem: any = null\n\n /**\n * Install plugin on container manager instance\n */\n install(manager: ContainerManagerInterface, options?: any): void\n {\n this.manager = manager\n this.containerName = options?.containerName || `Container-${Math.random().toString(36).substring(2, 11)}`\n this.notificationSystem = options?.notificationSystem\n this.bindEvents()\n }\n\n /**\n * Bind to container events\n */\n private bindEvents(): void\n {\n if (!this.manager) return\n\n this.logResize = debounce(this.logResize.bind(this), 250)\n this.logDrag = debounce(this.logDrag.bind(this), 250)\n this.logViewportResize = debounce(this.logViewportResize.bind(this), 250)\n this.logSnapStep = debounce(this.logSnapStep.bind(this), 250)\n\n // Mode change events\n this.manager.on('modeChange', (event: ContainerEvent) => {\n this.logModeChange(event.mode)\n })\n\n // Resize events with debounce\n this.manager.on('resize', (event: ContainerEvent) => {\n this.logResize(event.state)\n })\n\n this.manager.on('resizeEnd', (event: ContainerEvent) => {\n this.logResize(event.state)\n })\n\n // Drag events with debounce\n this.manager.on('drag', (event: ContainerEvent) => {\n this.logDrag(event.state)\n })\n\n this.manager.on('dragEnd', (event: ContainerEvent) => {\n this.logDrag(event.state)\n })\n\n // Viewport resize events\n this.manager.on('viewportResize', (event: ContainerEvent) => {\n this.logViewportResize(event.state)\n })\n\n // Plugin events for snapping\n this.manager.onPluginEvent('snappingEnabledChanged', (data: any) => {\n this.logSnappingEnabled(data.enabled)\n })\n\n this.manager.onPluginEvent('snapStepChanged', (data: any) => {\n this.logSnapStep(data.snapStep)\n })\n\n // Direction change events\n this.manager.onPluginEvent('directionChanged', (data: any) => {\n this.logDirectionChange(data.direction)\n })\n }\n\n /**\n * Log resize event\n */\n private logResize(state: any): void\n {\n const message = `Resized to ${Math.round(state.width)}×${Math.round(state.height)}`\n this.showNotification(message, 'info')\n }\n\n /**\n * Log drag event\n */\n private logDrag(state: any): void\n {\n const message = `Moved to (${Math.round(state.x)}, ${Math.round(state.y)})`\n this.showNotification(message, 'info')\n }\n\n /**\n * Log mode change event\n */\n private logModeChange(mode: string): void\n {\n const message = `Mode changed to ${mode}`\n this.showNotification(message, 'warning')\n }\n\n /**\n * Log viewport resize adjustment event\n */\n private logViewportResize(state: any): void\n {\n const message = `Adjusted position to (${Math.round(state.x)}, ${Math.round(state.y)}) due to window resize`\n this.showNotification(message, 'info')\n }\n\n /**\n * Log snapping enabled/disabled\n */\n private logSnappingEnabled(enabled: boolean): void\n {\n const message = `Snapping ${enabled ? 'enabled' : 'disabled'}`\n this.showNotification(message, enabled ? 'success' : 'warning')\n }\n\n /**\n * Log snap step change\n */\n private logSnapStep(step: number): void\n {\n const message = `Snap step changed to ${step}px`\n this.showNotification(message, 'info')\n }\n\n /**\n * Log direction change\n */\n private logDirectionChange(direction: string): void\n {\n const message = `Drag direction: ${direction}`\n this.showNotification(message, 'info')\n }\n\n /**\n * Show notification using notification system\n */\n private showNotification(message: string, type: 'success' | 'error' | 'warning' | 'info'): void\n {\n if (this.notificationSystem) {\n const fullMessage = `${this.containerName}: ${message}`\n this.notificationSystem.show(fullMessage, type)\n }\n }\n}\n","export default \"<div class=\\\"media-content\\\">\\n <h4>🎬 Media Gallery</h4>\\n <div class=\\\"media-grid\\\">\\n <div class=\\\"media-item\\\" style=\\\"background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\\\">\\n <span>Image 1</span>\\n </div>\\n <div class=\\\"media-item\\\" style=\\\"background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\\\">\\n <span>Image 2</span>\\n </div>\\n <div class=\\\"media-item\\\" style=\\\"background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);\\\">\\n <span>Image 3</span>\\n </div>\\n </div>\\n <p class=\\\"media-description\\\">\\n This content is loaded from a template file! Templates allow you to separate content structure from logic.\\n </p>\\n <div class=\\\"template-info\\\">\\n <small>📁 Template: media.html</small>\\n </div>\\n</div>\\n\"","export default \"<div class=\\\"stats-content\\\">\\n <h4>📊 Statistics Panel</h4>\\n <div class=\\\"stats-grid\\\">\\n <div class=\\\"stat-card\\\">\\n <div class=\\\"stat-value\\\">42</div>\\n <div class=\\\"stat-label\\\">Views</div>\\n </div>\\n <div class=\\\"stat-card\\\">\\n <div class=\\\"stat-value\\\">18</div>\\n <div class=\\\"stat-label\\\">Likes</div>\\n </div>\\n <div class=\\\"stat-card\\\">\\n <div class=\\\"stat-value\\\">7</div>\\n <div class=\\\"stat-label\\\">Shares</div>\\n </div>\\n </div>\\n <div class=\\\"progress-section\\\">\\n <div class=\\\"progress-item\\\">\\n <label>Performance</label>\\n <div class=\\\"progress-bar\\\">\\n <div class=\\\"progress-fill\\\" style=\\\"width: 75%\\\"></div>\\n </div>\\n </div>\\n <div class=\\\"progress-item\\\">\\n <label>Engagement</label>\\n <div class=\\\"progress-bar\\\">\\n <div class=\\\"progress-fill\\\" style=\\\"width: 60%\\\"></div>\\n </div>\\n </div>\\n </div>\\n <p>This template demonstrates dynamic content structure with CSS styling.</p>\\n</div>\"","export default \"<div class=\\\"tasks-content\\\">\\n <h4>✅ Task Manager</h4>\\n <div class=\\\"task-list\\\">\\n <div class=\\\"task-item completed\\\">\\n <span class=\\\"task-checkbox\\\">✓</span>\\n <span class=\\\"task-text\\\">Implement template system</span>\\n </div>\\n <div class=\\\"task-item completed\\\">\\n <span class=\\\"task-checkbox\\\">✓</span>\\n <span class=\\\"task-text\\\">Add individual mode controls</span>\\n </div>\\n <div class=\\\"task-item current\\\">\\n <span class=\\\"task-checkbox\\\">○</span>\\n <span class=\\\"task-text\\\">Create demo examples</span>\\n </div>\\n <div class=\\\"task-item\\\">\\n <span class=\\\"task-checkbox\\\">○</span>\\n <span class=\\\"task-text\\\">Write documentation</span>\\n </div>\\n </div>\\n <div class=\\\"task-stats\\\">\\n <div class=\\\"task-progress\\\">\\n <span>Progress: 2/4 tasks</span>\\n <div class=\\\"progress-bar\\\">\\n <div class=\\\"progress-fill\\\" style=\\\"width: 50%\\\"></div>\\n </div>\\n </div>\\n </div>\\n <p>Template content can include interactive elements and dynamic data.</p>\\n</div>\""],"names":["NotificationSystem","container","__publicField","existingContainer","text","type","toast","remove","closeIcon","ContainerInitializer","width","height","x","y","color","ContentCreator","templateLoader","content","isAlreadyContentContainer","targetElement","error","loader","StatsManager","globalStatsElement","containerStats","globalStats","stats","stepDisplay","html","t","e","r","s","_a","a","i","globalTemplateLoader","createDemoLoader","fallbackTemplates","registry","TemplateRegistry","templates","media$1","m","stats$1","tasks$1","sources","path","name","source","TemplateLoader","message","createLibraryLoader","initializeTemplateSystem","getTemplateLoader","reducer","acc","k","v","EdgeInfo","info","EventEmitter","event","callback","data","InternalBoundaryTracker","edgeThreshold","targets","root","element","threshold","target","targetRect","rootRect","elementInfo","prevEdge","cursorInfo","vw","vh","rect","edge","cursorEdge","oldEdge","newEdge","edges","distances","prev","curr","_EdgeController","elements","emitter","EdgeController","createTracker","options","controller","_State","uid","id","$1","$2","State","getViewportDimensions","getState","_ContainerManager","config","reactive","computed","state","constrained","boundaries","clamp","viewport","effect","deepMerge","currentState","ReactiveEventSystem","rAFTimeout","newState","needsUpdate","parentElement","entries","entry","autoAdjust","parentRect","maxWidth","newWidth","maxHeight","newHeight","direction","handle","cursorMap","deltaX","deltaY","maxX","maxY","parentWidth","parentHeight","pluginName","plugin","style","styleWidth","styleHeight","_event","stateMonitor","metricsMonitor","metrics","timeout","targetEmitter","targetEvent","listener","middleware","clientX","clientY","lockX","lockY","mode","_uid","enabled","desiredWidth","desiredHeight","desiredX","desiredY","newX","newY","ContainerManager","_SnappingPlugin","manager","dragHandle","_b","snappedDeltas","value","step","viewportWidth","viewportHeight","SnappingPlugin","_EdgeDockingPlugin","docked","activeEdge","distTop","distLeft","distBottom","distRight","validEdges","_","dist","b","screenPosition","_element","EdgeDockingPlugin","_StatePersistencePlugin","debouncedSave","debounce","containerId","stored","closedQueue","existingIndex","batch","isMaximized","draggingDirection","containerType","title","useSnapping","resizeConfig","parentElementId","savedState","allStates","c","isEdgeDocked","dockEdge","_c","closedState","lastContainerId","stateFromReactive","stateFromStorage","updates","currentStates","updatedState","storedStates","containers","states","key","storableContainers","StatePersistencePlugin","_LoggingPlugin","fullMessage","LoggingPlugin"],"mappings":"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","x_google_ignoreList":[4]}