@blcklab/freedom 0.1.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/events.ts","../src/core/math.ts","../src/engine/constraints.ts","../src/engine/drag.ts","../src/engine/resize.ts","../src/core/interaction-manager.ts","../src/dom/render.ts","../src/dom/handles.ts","../src/dom/scheduler.ts","../src/runtime/window.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["type Handler<T> = (data: T) => void;\n\nexport class Emitter<EventMap extends object> {\n private readonly listeners = new Map<keyof EventMap, Set<Handler<unknown>>>();\n\n on<K extends keyof EventMap>(event: K, handler: Handler<EventMap[K]>): () => void {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(handler as Handler<unknown>);\n return () => this.off(event, handler);\n }\n\n off<K extends keyof EventMap>(event: K, handler: Handler<EventMap[K]>): void {\n this.listeners.get(event)?.delete(handler as Handler<unknown>);\n }\n\n emit<K extends keyof EventMap>(event: K, data: EventMap[K]): void {\n const set = this.listeners.get(event);\n if (!set || set.size === 0) return;\n\n // Snapshot so listeners can unsubscribe during emit.\n for (const handler of [...set]) {\n (handler as Handler<EventMap[K]>)(data);\n }\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import type { Bounds, Point, Size } from './types';\n\nexport function clamp(value: number, min: number, max: number): number {\n if (min > max) return min;\n return Math.min(Math.max(value, min), max);\n}\n\nexport interface SizeLimits {\n minWidth: number;\n minHeight: number;\n maxWidth: number;\n maxHeight: number;\n}\n\nexport function clampSize(size: Size, limits: SizeLimits): Size {\n return {\n width: clamp(size.width, limits.minWidth, Math.max(limits.minWidth, limits.maxWidth)),\n height: clamp(size.height, limits.minHeight, Math.max(limits.minHeight, limits.maxHeight)),\n };\n}\n\nexport function clampPointToBounds(point: Point, size: Size, bounds: Bounds): Point {\n const maxX = Math.max(bounds.minX, bounds.maxX - size.width);\n const maxY = Math.max(bounds.minY, bounds.maxY - size.height);\n return {\n x: clamp(point.x, bounds.minX, maxX),\n y: clamp(point.y, bounds.minY, maxY),\n };\n}\n","import type { Bounds, BoundsOption, Point, Size } from '../core/types';\nimport { clampPointToBounds, clampSize, type SizeLimits } from '../core/math';\n\nexport { clampPointToBounds, clampSize };\nexport type { SizeLimits };\n\nexport function resolveBounds(\n option: BoundsOption | undefined,\n element: HTMLElement\n): Bounds | null {\n if (!option || option === 'none') return null;\n\n if (option === 'viewport') {\n return { minX: 0, minY: 0, maxX: window.innerWidth, maxY: window.innerHeight };\n }\n\n if (option === 'parent') {\n const parent = element.offsetParent as HTMLElement | null;\n if (!parent) return null;\n return { minX: 0, minY: 0, maxX: parent.clientWidth, maxY: parent.clientHeight };\n }\n\n return {\n minX: option.x,\n minY: option.y,\n maxX: option.x + option.width,\n maxY: option.y + option.height,\n };\n}\n\nexport function constrainToBounds(\n point: Point,\n size: Size,\n option: BoundsOption | undefined,\n element: HTMLElement\n): Point {\n const bounds = resolveBounds(option, element);\n return bounds ? clampPointToBounds(point, size, bounds) : point;\n}\n","import type {\n BoundsOption,\n DragEventData,\n FreedomPlugin,\n Point,\n PluginContext,\n Size,\n} from '../core/types';\nimport { constrainToBounds } from './constraints';\n\nexport interface DragEngineOptions {\n element: HTMLElement;\n bounds: BoundsOption | undefined;\n plugins: readonly FreedomPlugin[];\n pluginContext: PluginContext;\n getPosition(): Point;\n getSize(): Size;\n}\n\nexport interface DragMoveResult {\n position: Point;\n data: DragEventData;\n}\n\nexport interface DragEngine {\n begin(pointer: Point, pointerEvent: PointerEvent): DragEventData;\n move(pointer: Point, pointerEvent: PointerEvent): DragMoveResult;\n end(pointer: Point, pointerEvent: PointerEvent): DragEventData;\n}\n\nexport function createDragEngine(options: DragEngineOptions): DragEngine {\n let startPointer: Point = { x: 0, y: 0 };\n let startPosition: Point = { x: 0, y: 0 };\n\n return {\n begin(pointer, pointerEvent) {\n startPointer = pointer;\n startPosition = options.getPosition();\n return { position: startPosition, delta: { x: 0, y: 0 }, pointerEvent };\n },\n\n move(pointer, pointerEvent) {\n const delta: Point = {\n x: pointer.x - startPointer.x,\n y: pointer.y - startPointer.y,\n };\n\n let next: Point = { x: startPosition.x + delta.x, y: startPosition.y + delta.y };\n next = constrainToBounds(next, options.getSize(), options.bounds, options.element);\n\n for (const plugin of options.plugins) {\n if (!plugin.onDrag) continue;\n const result = plugin.onDrag(\n { position: next, delta, pointerEvent },\n options.pluginContext\n );\n if (result) next = result;\n }\n\n return { position: next, data: { position: next, delta, pointerEvent } };\n },\n\n end(pointer, pointerEvent) {\n const delta: Point = {\n x: pointer.x - startPointer.x,\n y: pointer.y - startPointer.y,\n };\n return { position: options.getPosition(), delta, pointerEvent };\n },\n };\n}\n","import type {\n BoundsOption,\n FreedomPlugin,\n Point,\n PluginContext,\n ResizeEventData,\n ResizeHandle,\n Size,\n} from '../core/types';\nimport { clamp } from '../core/math';\nimport { constrainToBounds, type SizeLimits } from './constraints';\n\nexport interface ResizeEngineOptions extends SizeLimits {\n element: HTMLElement;\n bounds: BoundsOption | undefined;\n plugins: readonly FreedomPlugin[];\n pluginContext: PluginContext;\n getPosition(): Point;\n getSize(): Size;\n}\n\nexport interface ResizeMoveResult {\n position: Point;\n size: Size;\n data: ResizeEventData;\n}\n\nexport interface ResizeEngine {\n begin(handle: ResizeHandle, pointer: Point, pointerEvent: PointerEvent): ResizeEventData;\n move(pointer: Point, pointerEvent: PointerEvent): ResizeMoveResult;\n end(pointer: Point, pointerEvent: PointerEvent): ResizeEventData;\n}\n\nconst WEST_HANDLES: readonly ResizeHandle[] = ['nw', 'w', 'sw'];\nconst NORTH_HANDLES: readonly ResizeHandle[] = ['nw', 'n', 'ne'];\nconst VERTICAL_ONLY_HANDLES: readonly ResizeHandle[] = ['n', 's'];\nconst HORIZONTAL_ONLY_HANDLES: readonly ResizeHandle[] = ['e', 'w'];\n\nexport function createResizeEngine(options: ResizeEngineOptions): ResizeEngine {\n let activeHandle: ResizeHandle = 'se';\n let startPointer: Point = { x: 0, y: 0 };\n let startPosition: Point = { x: 0, y: 0 };\n let startSize: Size = { width: 0, height: 0 };\n let affectsWest = false;\n let affectsNorth = false;\n let affectsWidth = true;\n let affectsHeight = true;\n\n return {\n begin(handle, pointer, pointerEvent) {\n activeHandle = handle;\n affectsWest = WEST_HANDLES.includes(handle);\n affectsNorth = NORTH_HANDLES.includes(handle);\n affectsWidth = !VERTICAL_ONLY_HANDLES.includes(handle);\n affectsHeight = !HORIZONTAL_ONLY_HANDLES.includes(handle);\n startPointer = pointer;\n startPosition = options.getPosition();\n startSize = options.getSize();\n return { size: startSize, position: startPosition, handle, pointerEvent };\n },\n\n move(pointer, pointerEvent) {\n const dx = pointer.x - startPointer.x;\n const dy = pointer.y - startPointer.y;\n\n let x = startPosition.x;\n let y = startPosition.y;\n\n const width = affectsWidth\n ? (affectsWest ? startSize.width - dx : startSize.width + dx)\n : startSize.width;\n const height = affectsHeight\n ? (affectsNorth ? startSize.height - dy : startSize.height + dy)\n : startSize.height;\n\n const clampedWidth = clamp(width, options.minWidth, Math.max(options.minWidth, options.maxWidth));\n const clampedHeight = clamp(height, options.minHeight, Math.max(options.minHeight, options.maxHeight));\n\n // Keep the opposite edge visually anchored after size clamping.\n if (affectsWest) x = startPosition.x + (startSize.width - clampedWidth);\n if (affectsNorth) y = startPosition.y + (startSize.height - clampedHeight);\n\n let nextSize: Size = { width: clampedWidth, height: clampedHeight };\n let nextPosition: Point = constrainToBounds({ x, y }, nextSize, options.bounds, options.element);\n\n for (const plugin of options.plugins) {\n if (!plugin.onResize) continue;\n const result = plugin.onResize(\n { size: nextSize, position: nextPosition, handle: activeHandle, pointerEvent },\n options.pluginContext\n );\n if (result) {\n nextSize = result.size;\n nextPosition = result.position;\n }\n }\n\n return {\n position: nextPosition,\n size: nextSize,\n data: { size: nextSize, position: nextPosition, handle: activeHandle, pointerEvent },\n };\n },\n\n end(pointer, pointerEvent) {\n return {\n size: options.getSize(),\n position: options.getPosition(),\n handle: activeHandle,\n pointerEvent,\n };\n },\n };\n}\n","import type { Point, ResizeHandle, DragEventData, ResizeEventData } from './types';\nimport type { DragEngine, DragMoveResult } from '../engine/drag';\nimport type { ResizeEngine, ResizeMoveResult } from '../engine/resize';\n\nexport type ActiveInteraction = 'drag' | 'resize' | null;\n\nexport interface InteractionManagerOptions {\n element: HTMLElement;\n\n dragEngine: DragEngine;\n resizeEngine: ResizeEngine;\n\n resolveResizeHandle(target: EventTarget | null): ResizeHandle | null;\n isDragTarget(target: EventTarget | null): boolean;\n\n onDragStart(data: DragEventData): void;\n onDragMove(result: DragMoveResult): void;\n onDragEnd(data: DragEventData): void;\n\n onResizeStart(data: ResizeEventData): void;\n onResizeMove(result: ResizeMoveResult): void;\n onResizeEnd(data: ResizeEventData): void;\n}\n\nfunction toPoint(event: PointerEvent): Point {\n return { x: event.clientX, y: event.clientY };\n}\n\nexport class InteractionManager {\n private readonly options: InteractionManagerOptions;\n private activePointerId: number | null = null;\n private captureTarget: Element | null = null;\n private _active: ActiveInteraction = null;\n private destroyed = false;\n\n constructor(options: InteractionManagerOptions) {\n this.options = options;\n this.options.element.addEventListener('pointerdown', this.handlePointerDown);\n }\n\n get active(): ActiveInteraction {\n return this._active;\n }\n\n startDrag(event: PointerEvent): void {\n if (this.destroyed || this._active !== null) return;\n this._active = 'drag';\n this.captureGesture(event);\n const data = this.options.dragEngine.begin(toPoint(event), event);\n this.options.onDragStart(data);\n }\n\n startResize(handle: ResizeHandle, event: PointerEvent): void {\n if (this.destroyed || this._active !== null) return;\n this._active = 'resize';\n this.captureGesture(event);\n const data = this.options.resizeEngine.begin(handle, toPoint(event), event);\n this.options.onResizeStart(data);\n }\n\n cancel(): void {\n this.teardown();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.options.element.removeEventListener('pointerdown', this.handlePointerDown);\n this.teardown();\n }\n\n private captureGesture(event: PointerEvent): void {\n this.activePointerId = event.pointerId;\n this.captureTarget = event.target instanceof Element ? event.target : this.options.element;\n\n try {\n this.captureTarget.setPointerCapture?.(event.pointerId);\n } catch {\n // Capture can fail after cancel/detach; window listeners still continue.\n }\n\n window.addEventListener('pointermove', this.handlePointerMove);\n window.addEventListener('pointerup', this.handlePointerUp);\n window.addEventListener('pointercancel', this.handlePointerUp);\n }\n\n private teardown(): void {\n if (this.activePointerId !== null && this.captureTarget) {\n try {\n this.captureTarget.releasePointerCapture?.(this.activePointerId);\n } catch {\n // Release must stay best-effort during teardown.\n }\n }\n\n this.activePointerId = null;\n this.captureTarget = null;\n this._active = null;\n\n window.removeEventListener('pointermove', this.handlePointerMove);\n window.removeEventListener('pointerup', this.handlePointerUp);\n window.removeEventListener('pointercancel', this.handlePointerUp);\n }\n\n private handlePointerDown = (event: PointerEvent): void => {\n if (this.destroyed || this._active !== null) return;\n if (event.pointerType === 'mouse' && event.button !== 0) return;\n\n // Resize handles must win over drag handles.\n const resizeHandle = this.options.resolveResizeHandle(event.target);\n if (resizeHandle) {\n event.preventDefault();\n event.stopPropagation();\n this.startResize(resizeHandle, event);\n return;\n }\n\n if (this.options.isDragTarget(event.target)) {\n this.startDrag(event);\n }\n };\n\n private handlePointerMove = (event: PointerEvent): void => {\n if (this.destroyed || event.pointerId !== this.activePointerId) return;\n\n if (this._active === 'drag') {\n this.options.onDragMove(this.options.dragEngine.move(toPoint(event), event));\n } else if (this._active === 'resize') {\n this.options.onResizeMove(this.options.resizeEngine.move(toPoint(event), event));\n }\n };\n\n private handlePointerUp = (event: PointerEvent): void => {\n if (this.destroyed || event.pointerId !== this.activePointerId) return;\n\n if (this._active === 'drag') {\n this.options.onDragEnd(this.options.dragEngine.end(toPoint(event), event));\n } else if (this._active === 'resize') {\n this.options.onResizeEnd(this.options.resizeEngine.end(toPoint(event), event));\n }\n\n this.teardown();\n };\n}\n\nexport function createInteractionManager(options: InteractionManagerOptions): InteractionManager {\n return new InteractionManager(options);\n}\n","import type { Point, PositioningMode, Size } from '../core/types';\n\nexport interface BaseStyleOptions {\n positioning: PositioningMode;\n forcePositioning?: boolean;\n}\n\nexport interface PositionRenderer {\n positioning: PositioningMode;\n origin: Point;\n baseTransform: string;\n flowRelative: boolean;\n}\n\nexport function applyBaseStyles(element: HTMLElement, options: BaseStyleOptions): void {\n const style = element.style;\n const computedPosition = window.getComputedStyle?.(element).position ?? style.position;\n\n if (options.forcePositioning || computedPosition === 'static') {\n style.position = options.positioning;\n }\n\n if (!style.touchAction) style.touchAction = 'none';\n if (!style.userSelect) style.userSelect = 'none';\n if (!style.boxSizing) style.boxSizing = 'border-box';\n if (!style.willChange) style.willChange = 'transform';\n}\n\nexport function readRenderedPosition(element: HTMLElement, positioning: PositioningMode): Point {\n const rect = element.getBoundingClientRect();\n\n if (positioning === 'fixed') {\n return { x: rect.left || 0, y: rect.top || 0 };\n }\n\n if (positioning === 'absolute') {\n const parent = element.offsetParent as HTMLElement | null;\n\n if (parent) {\n const parentRect = parent.getBoundingClientRect();\n return {\n x: (rect.left || 0) - (parentRect.left || 0) + (parent.scrollLeft || 0),\n y: (rect.top || 0) - (parentRect.top || 0) + (parent.scrollTop || 0),\n };\n }\n\n return {\n x: (rect.left || 0) + (window.scrollX || 0),\n y: (rect.top || 0) + (window.scrollY || 0),\n };\n }\n\n // Normal-flow windows move relative to their original rendered position.\n return { x: rect.left || 0, y: rect.top || 0 };\n}\n\nexport function createPositionRenderer(\n element: HTMLElement,\n positioning: PositioningMode,\n initialPosition: Point\n): PositionRenderer {\n const baseTransform = normalizeTransform(element.style.transform);\n\n if (positioning === 'relative') {\n return {\n positioning,\n origin: readRenderedPosition(element, positioning),\n baseTransform,\n flowRelative: true,\n };\n }\n\n // Normalize right/bottom anchored CSS to left/top once for stable resizing.\n element.style.left = `${initialPosition.x}px`;\n element.style.top = `${initialPosition.y}px`;\n element.style.right = 'auto';\n element.style.bottom = 'auto';\n\n return {\n positioning,\n origin: { ...initialPosition },\n baseTransform: '',\n flowRelative: false,\n };\n}\n\nexport function writePosition(element: HTMLElement, point: Point, renderer: PositionRenderer): void {\n const dx = point.x - renderer.origin.x;\n const dy = point.y - renderer.origin.y;\n const translate = dx === 0 && dy === 0 ? '' : `translate3d(${dx}px, ${dy}px, 0)`;\n element.style.transform = joinTransforms(renderer.baseTransform, translate);\n}\n\nexport function writeSize(element: HTMLElement, size: Size): void {\n element.style.width = `${size.width}px`;\n element.style.height = `${size.height}px`;\n}\n\nfunction normalizeTransform(value: string | undefined): string {\n if (!value || value === 'none') return '';\n return value.trim();\n}\n\nfunction joinTransforms(base: string, translate: string): string {\n if (base && translate) return `${base} ${translate}`;\n if (base) return base;\n return translate;\n}\n","import type { ResizeHandle } from '../core/types';\n\nconst CORNER_SIZE_PX = 14;\nconst EDGE_THICKNESS_PX = 8;\n\nconst EDGE_STYLES: Record<ResizeHandle, Partial<CSSStyleDeclaration>> = {\n nw: { top: '0', left: '0', width: `${CORNER_SIZE_PX}px`, height: `${CORNER_SIZE_PX}px`, cursor: 'nwse-resize' },\n ne: { top: '0', right: '0', width: `${CORNER_SIZE_PX}px`, height: `${CORNER_SIZE_PX}px`, cursor: 'nesw-resize' },\n sw: { bottom: '0', left: '0', width: `${CORNER_SIZE_PX}px`, height: `${CORNER_SIZE_PX}px`, cursor: 'nesw-resize' },\n se: { bottom: '0', right: '0', width: `${CORNER_SIZE_PX}px`, height: `${CORNER_SIZE_PX}px`, cursor: 'nwse-resize' },\n\n n: { top: '0', left: `${CORNER_SIZE_PX}px`, right: `${CORNER_SIZE_PX}px`, height: `${EDGE_THICKNESS_PX}px`, cursor: 'ns-resize' },\n s: { bottom: '0', left: `${CORNER_SIZE_PX}px`, right: `${CORNER_SIZE_PX}px`, height: `${EDGE_THICKNESS_PX}px`, cursor: 'ns-resize' },\n e: { right: '0', top: `${CORNER_SIZE_PX}px`, bottom: `${CORNER_SIZE_PX}px`, width: `${EDGE_THICKNESS_PX}px`, cursor: 'ew-resize' },\n w: { left: '0', top: `${CORNER_SIZE_PX}px`, bottom: `${CORNER_SIZE_PX}px`, width: `${EDGE_THICKNESS_PX}px`, cursor: 'ew-resize' },\n};\n\nexport function createResizeHandle(handle: ResizeHandle): HTMLElement {\n const el = document.createElement('div');\n el.dataset.freedomResizeHandle = handle;\n el.className = `freedom-resize-handle freedom-resize-handle--${handle}`;\n\n Object.assign(el.style, {\n position: 'absolute',\n boxSizing: 'border-box',\n touchAction: 'none',\n userSelect: 'none',\n pointerEvents: 'auto',\n zIndex: '1',\n ...EDGE_STYLES[handle],\n });\n\n return el;\n}\n","export interface FrameScheduler {\n schedule(): void;\n cancel(): void;\n}\n\nexport function createFrameScheduler(flush: () => void): FrameScheduler {\n let frameHandle: number | null = null;\n\n return {\n schedule(): void {\n if (frameHandle !== null) return;\n frameHandle = requestAnimationFrame(() => {\n frameHandle = null;\n flush();\n });\n },\n cancel(): void {\n if (frameHandle !== null) {\n cancelAnimationFrame(frameHandle);\n frameHandle = null;\n }\n },\n };\n}\n","import type {\n BoundsOption,\n FreedomPlugin,\n FreedomWindow,\n FreedomWindowOptions,\n InitialPosition,\n Point,\n PositioningMode,\n PluginContext,\n ResizeHandle,\n Size,\n WindowEventMap,\n} from '../core/types';\nimport { Emitter } from '../core/events';\nimport { clampSize, type SizeLimits } from '../core/math';\nimport { createDragEngine } from '../engine/drag';\nimport { createResizeEngine } from '../engine/resize';\nimport { createInteractionManager } from '../core/interaction-manager';\nimport {\n applyBaseStyles,\n createPositionRenderer,\n readRenderedPosition,\n writePosition,\n writeSize,\n} from '../dom/render';\nimport { createResizeHandle } from '../dom/handles';\nimport { createFrameScheduler } from '../dom/scheduler';\n\nconst ALL_HANDLES: readonly ResizeHandle[] = ['n', 's', 'e', 'w', 'nw', 'ne', 'sw', 'se'];\nconst instances = new WeakMap<HTMLElement, FreedomWindow>();\n\nlet autoId = 0;\n\nexport function createWindow(element: HTMLElement, options: FreedomWindowOptions = {}): FreedomWindow {\n if (typeof document === 'undefined' || typeof window === 'undefined') {\n throw new Error('freedom.window() requires a browser environment. Importing is SSR-safe, but creating a window must run in the browser.');\n }\n\n assertHTMLElement(element);\n\n if (instances.has(element)) {\n throw new Error('freedom.window() was called more than once for the same element. Destroy the existing instance before creating a new one.');\n }\n\n const id = options.id ?? `freedom-window-${++autoId}`;\n const emitter = new Emitter<WindowEventMap>();\n const plugins: readonly FreedomPlugin[] = options.plugins ?? [];\n const limits = normalizeSizeLimits(options);\n const positioning = resolvePositioning(element, options);\n\n // Initialization stays synchronous to prevent top-left first paint.\n applyBaseStyles(element, {\n positioning,\n forcePositioning: shouldForcePositioning(element, options),\n });\n\n let size: Size = clampSize(sanitizeSize(options.initialSize ?? readInitialSize(element), 'initialSize'), limits);\n let position: Point = resolveInitialPosition(options.initialPosition, element, size, options.bounds, positioning);\n const renderer = createPositionRenderer(element, positioning, position);\n let zIndex = normalizeZIndex(options.zIndex ?? 0);\n let focused = false;\n let isDraggable = options.draggable ?? true;\n let isDestroyed = false;\n\n writeSize(element, size);\n writePosition(element, position, renderer);\n if (zIndex) element.style.zIndex = String(zIndex);\n revealIfRequested(element, options);\n\n let pendingPosition: Point | null = null;\n let pendingSize: Size | null = null;\n\n const scheduler = createFrameScheduler(() => {\n if (isDestroyed) return;\n\n if (pendingPosition) {\n writePosition(element, pendingPosition, renderer);\n pendingPosition = null;\n }\n if (pendingSize) {\n writeSize(element, pendingSize);\n pendingSize = null;\n }\n });\n\n function paint(nextPosition?: Point, nextSize?: Size): void {\n if (nextPosition) pendingPosition = nextPosition;\n if (nextSize) pendingSize = nextSize;\n scheduler.schedule();\n }\n\n function assertAlive(method: string): void {\n if (isDestroyed) {\n throw new Error(`Cannot call ${method}() on a destroyed freedom window.`);\n }\n }\n\n const pluginContext: PluginContext = {\n element,\n get window(): FreedomWindow {\n return api;\n },\n };\n\n const dragHandleElement = resolveDragHandle(element, options.dragHandle);\n\n function isDragTarget(target: EventTarget | null): boolean {\n if (!isDraggable || !dragHandleElement) return false;\n if (!(target instanceof Node)) return false;\n return dragHandleElement === target || dragHandleElement.contains(target);\n }\n\n const dragEngine = createDragEngine({\n element,\n bounds: options.bounds,\n plugins,\n pluginContext,\n getPosition: () => position,\n getSize: () => size,\n });\n\n const resizeHandleElements = new Map<ResizeHandle, HTMLElement>();\n\n function resolveResizeHandle(target: EventTarget | null): ResizeHandle | null {\n if (!(target instanceof Element)) return null;\n const handleEl = target.closest<HTMLElement>('.freedom-resize-handle');\n if (!handleEl) return null;\n\n for (const [handle, el] of resizeHandleElements) {\n if (el === handleEl) return handle;\n }\n\n return null;\n }\n\n const resizeEngine = createResizeEngine({\n element,\n bounds: options.bounds,\n ...limits,\n plugins,\n pluginContext,\n getPosition: () => position,\n getSize: () => size,\n });\n\n function setupResizeHandles(handles: readonly ResizeHandle[]): void {\n const normalizedHandles = normalizeResizeHandles(handles);\n for (const handle of normalizedHandles) {\n if (resizeHandleElements.has(handle)) continue;\n const handleEl = createResizeHandle(handle);\n element.appendChild(handleEl);\n resizeHandleElements.set(handle, handleEl);\n }\n }\n\n function teardownResizeHandles(handles: readonly ResizeHandle[] = ALL_HANDLES): void {\n for (const handle of handles) {\n const handleEl = resizeHandleElements.get(handle);\n if (handleEl) {\n handleEl.remove();\n resizeHandleElements.delete(handle);\n }\n }\n }\n\n const interactionManager = createInteractionManager({\n element,\n dragEngine,\n resizeEngine,\n resolveResizeHandle,\n isDragTarget,\n\n onDragStart(data) {\n element.classList.add('freedom-dragging');\n emitter.emit('dragstart', data);\n },\n onDragMove({ position: next, data }) {\n position = next;\n paint(position);\n emitter.emit('drag', data);\n },\n onDragEnd(data) {\n element.classList.remove('freedom-dragging');\n emitter.emit('dragend', data);\n },\n\n onResizeStart(data) {\n element.classList.add('freedom-resizing');\n emitter.emit('resizestart', data);\n },\n onResizeMove({ position: nextPosition, size: nextSize, data }) {\n position = nextPosition;\n size = nextSize;\n paint(position, size);\n emitter.emit('resize', data);\n },\n onResizeEnd(data) {\n element.classList.remove('freedom-resizing');\n emitter.emit('resizeend', data);\n },\n });\n\n const initialResizeHandles = resolveEnabledHandles(options.resizable ?? true);\n if (initialResizeHandles.length > 0) setupResizeHandles(initialResizeHandles);\n\n const api: FreedomWindow = {\n id,\n element,\n\n getPosition(): Point {\n assertAlive('getPosition');\n return { ...position };\n },\n\n getSize(): Size {\n assertAlive('getSize');\n return { ...size };\n },\n\n setPosition(point: Point): void {\n assertAlive('setPosition');\n position = sanitizePoint(point, 'setPosition');\n paint(position);\n },\n\n setSize(nextSize: Size): void {\n assertAlive('setSize');\n size = clampSize(sanitizeSize(nextSize, 'setSize'), limits);\n paint(undefined, size);\n },\n\n focus(): void {\n assertAlive('focus');\n if (focused) return;\n focused = true;\n element.classList.add('freedom-focused');\n emitter.emit('focus', undefined);\n options.onFocus?.();\n },\n\n blur(): void {\n assertAlive('blur');\n if (!focused) return;\n focused = false;\n element.classList.remove('freedom-focused');\n emitter.emit('blur', undefined);\n options.onBlur?.();\n },\n\n isFocused(): boolean {\n assertAlive('isFocused');\n return focused;\n },\n\n setZIndex(next: number): void {\n assertAlive('setZIndex');\n zIndex = normalizeZIndex(next);\n element.style.zIndex = String(zIndex);\n },\n\n getZIndex(): number {\n assertAlive('getZIndex');\n return zIndex;\n },\n\n enableDrag(): void {\n assertAlive('enableDrag');\n isDraggable = true;\n },\n\n disableDrag(): void {\n assertAlive('disableDrag');\n isDraggable = false;\n if (interactionManager.active === 'drag') {\n interactionManager.cancel();\n element.classList.remove('freedom-dragging');\n }\n },\n\n enableResize(handles: ResizeHandle[] = ALL_HANDLES as ResizeHandle[]): void {\n assertAlive('enableResize');\n setupResizeHandles(handles);\n },\n\n disableResize(): void {\n assertAlive('disableResize');\n if (interactionManager.active === 'resize') {\n interactionManager.cancel();\n element.classList.remove('freedom-resizing');\n }\n teardownResizeHandles();\n },\n\n destroy(): void {\n if (isDestroyed) return;\n isDestroyed = true;\n interactionManager.destroy();\n teardownResizeHandles();\n scheduler.cancel();\n element.classList.remove('freedom-dragging', 'freedom-resizing', 'freedom-focused');\n for (const plugin of plugins) plugin.onDestroy?.(pluginContext);\n emitter.emit('destroy', undefined);\n emitter.clear();\n instances.delete(element);\n },\n\n on(event, handler) {\n assertAlive('on');\n return emitter.on(event, handler);\n },\n };\n\n instances.set(element, api);\n\n if (options.onDragStart) api.on('dragstart', options.onDragStart);\n if (options.onDrag) api.on('drag', options.onDrag);\n if (options.onDragEnd) api.on('dragend', options.onDragEnd);\n if (options.onResizeStart) api.on('resizestart', options.onResizeStart);\n if (options.onResize) api.on('resize', options.onResize);\n if (options.onResizeEnd) api.on('resizeend', options.onResizeEnd);\n\n for (const plugin of plugins) plugin.onInit?.(pluginContext);\n\n return api;\n}\n\nfunction assertHTMLElement(element: unknown): asserts element is HTMLElement {\n const maybeElement = element as Partial<HTMLElement> | null | undefined;\n const isUsableElement =\n !!maybeElement &&\n typeof maybeElement === 'object' &&\n (maybeElement as { nodeType?: number }).nodeType === 1 &&\n typeof maybeElement.getBoundingClientRect === 'function' &&\n !!maybeElement.style &&\n typeof maybeElement.addEventListener === 'function' &&\n typeof maybeElement.removeEventListener === 'function';\n\n if (!isUsableElement) {\n throw new TypeError('freedom.window(element) expected a real HTMLElement. Received null, undefined, or a non-element value.');\n }\n}\n\nfunction normalizeSizeLimits(options: FreedomWindowOptions): SizeLimits {\n const minWidth = finiteNonNegative(options.minWidth, 0);\n const minHeight = finiteNonNegative(options.minHeight, 0);\n const maxWidth = finitePositiveOrInfinity(options.maxWidth, Infinity);\n const maxHeight = finitePositiveOrInfinity(options.maxHeight, Infinity);\n\n return {\n minWidth,\n minHeight,\n maxWidth: Math.max(minWidth, maxWidth),\n maxHeight: Math.max(minHeight, maxHeight),\n };\n}\n\nfunction finiteNonNegative(value: number | undefined, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : fallback;\n}\n\nfunction finitePositiveOrInfinity(value: number | undefined, fallback: number): number {\n if (value === Infinity) return Infinity;\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : fallback;\n}\n\nfunction normalizeZIndex(value: number): number {\n return Number.isFinite(value) ? Math.trunc(value) : 0;\n}\n\nfunction sanitizePoint(point: Point, source: string): Point {\n if (!point || typeof point.x !== 'number' || typeof point.y !== 'number' || !Number.isFinite(point.x) || !Number.isFinite(point.y)) {\n throw new TypeError(`freedom.window(): ${source} expected a finite { x, y } point.`);\n }\n return { x: point.x, y: point.y };\n}\n\nfunction sanitizeSize(size: Size, source: string): Size {\n if (!size || typeof size.width !== 'number' || typeof size.height !== 'number' || !Number.isFinite(size.width) || !Number.isFinite(size.height)) {\n throw new TypeError(`freedom.window(): ${source} expected a finite { width, height } size.`);\n }\n return { width: Math.max(0, size.width), height: Math.max(0, size.height) };\n}\n\nfunction shouldForcePositioning(element: HTMLElement, options: FreedomWindowOptions): boolean {\n const computed = window.getComputedStyle(element).position;\n return Boolean(options.positioning) || computed === 'static';\n}\n\nfunction resolvePositioning(element: HTMLElement, options: FreedomWindowOptions): PositioningMode {\n if (options.positioning) return options.positioning;\n\n const computed = window.getComputedStyle(element);\n if (computed.position === 'fixed') return 'fixed';\n if (computed.position === 'absolute') return 'absolute';\n if (computed.position === 'relative' || computed.position === 'sticky') return 'relative';\n\n if (hasAuthoredInset(computed)) return 'fixed';\n\n if (options.initialPosition !== undefined) {\n return options.bounds === 'parent' ? 'absolute' : 'fixed';\n }\n\n return 'relative';\n}\n\nfunction hasAuthoredInset(style: CSSStyleDeclaration): boolean {\n return [style.top, style.right, style.bottom, style.left].some((value) => {\n if (!value || value === 'auto') return false;\n return value !== '0px' && value !== '0';\n });\n}\n\nfunction resolveInitialPosition(\n initialPosition: InitialPosition | undefined,\n element: HTMLElement,\n size: Size,\n bounds: BoundsOption | undefined,\n positioning: PositioningMode\n): Point {\n if (initialPosition === 'center') {\n return centerPosition(element, size, bounds, positioning);\n }\n\n if (initialPosition) {\n return sanitizePoint(initialPosition, 'initialPosition');\n }\n\n return readRenderedPosition(element, positioning);\n}\n\nfunction centerPosition(\n element: HTMLElement,\n size: Size,\n bounds: BoundsOption | undefined,\n positioning: PositioningMode\n): Point {\n const box = resolveCenterBox(element, bounds, positioning);\n\n return {\n x: Math.round(box.x + Math.max(0, box.width - size.width) / 2),\n y: Math.round(box.y + Math.max(0, box.height - size.height) / 2),\n };\n}\n\nfunction resolveCenterBox(\n element: HTMLElement,\n bounds: BoundsOption | undefined,\n positioning: PositioningMode\n): { x: number; y: number; width: number; height: number } {\n if (bounds && typeof bounds === 'object') {\n return { x: bounds.x, y: bounds.y, width: bounds.width, height: bounds.height };\n }\n\n if (bounds === 'parent') {\n const parent = element.offsetParent as HTMLElement | null;\n if (parent) return { x: 0, y: 0, width: parent.clientWidth, height: parent.clientHeight };\n }\n\n if (positioning === 'absolute' && bounds !== 'viewport') {\n const parent = element.offsetParent as HTMLElement | null;\n if (parent) return { x: 0, y: 0, width: parent.clientWidth, height: parent.clientHeight };\n }\n\n const root = document.documentElement;\n return {\n x: 0,\n y: 0,\n width: window.innerWidth || root.clientWidth,\n height: window.innerHeight || root.clientHeight,\n };\n}\n\nfunction readInitialSize(element: HTMLElement): Size {\n const rect = element.getBoundingClientRect();\n return {\n width: rect.width || element.offsetWidth || 0,\n height: rect.height || element.offsetHeight || 0,\n };\n}\n\nfunction revealIfRequested(element: HTMLElement, options: FreedomWindowOptions): void {\n if (options.autoReveal === false) return;\n const visibility = window.getComputedStyle(element).visibility;\n if (visibility === 'hidden') {\n element.style.visibility = 'visible';\n }\n}\n\nfunction resolveDragHandle(\n element: HTMLElement,\n handleOption: FreedomWindowOptions['dragHandle']\n): HTMLElement | null {\n if (handleOption === null) return null;\n if (handleOption === undefined) return element;\n if (typeof handleOption === 'string') return element.querySelector<HTMLElement>(handleOption);\n return handleOption;\n}\n\nfunction resolveEnabledHandles(option: NonNullable<FreedomWindowOptions['resizable']>): ResizeHandle[] {\n if (option === false) return [];\n if (option === true) return [...ALL_HANDLES];\n return normalizeResizeHandles(option);\n}\n\nfunction normalizeResizeHandles(handles: readonly ResizeHandle[]): ResizeHandle[] {\n const unique = new Set<ResizeHandle>();\n\n for (const handle of handles) {\n if (!ALL_HANDLES.includes(handle)) {\n throw new TypeError(`freedom.window(): invalid resize handle \"${String(handle)}\".`);\n }\n unique.add(handle);\n }\n\n return [...unique];\n}\n","import { createWindow } from './runtime/window';\n\nexport const freedom = {\n window: createWindow,\n};\n\nexport default freedom;\n\nexport { createWindow };\nexport { createWindow as window };\n\nexport type {\n Point,\n Size,\n Rect,\n Bounds,\n BoundsOption,\n ResizeHandle,\n InitialPosition,\n PositioningMode,\n DragEventData,\n ResizeEventData,\n WindowEventMap,\n ManagerEventMap,\n FreedomPlugin,\n PluginContext,\n FreedomWindow,\n FreedomWindowOptions,\n FreedomManager,\n FreedomManagerOptions,\n} from './core/types';\n"]}
@@ -0,0 +1,94 @@
1
+ 'use strict';
2
+
3
+ // src/core/events.ts
4
+ var Emitter = class {
5
+ listeners = /* @__PURE__ */ new Map();
6
+ on(event, handler) {
7
+ let set = this.listeners.get(event);
8
+ if (!set) {
9
+ set = /* @__PURE__ */ new Set();
10
+ this.listeners.set(event, set);
11
+ }
12
+ set.add(handler);
13
+ return () => this.off(event, handler);
14
+ }
15
+ off(event, handler) {
16
+ this.listeners.get(event)?.delete(handler);
17
+ }
18
+ emit(event, data) {
19
+ const set = this.listeners.get(event);
20
+ if (!set || set.size === 0) return;
21
+ for (const handler of [...set]) {
22
+ handler(data);
23
+ }
24
+ }
25
+ clear() {
26
+ this.listeners.clear();
27
+ }
28
+ };
29
+
30
+ // src/manager/manager.ts
31
+ function createManager(options = {}) {
32
+ const baseZIndex = options.baseZIndex ?? 1;
33
+ const windows = [];
34
+ const unsubscribeDestroy = /* @__PURE__ */ new Map();
35
+ const emitter = new Emitter();
36
+ let topZIndex = baseZIndex;
37
+ let focused = null;
38
+ function register(win) {
39
+ if (windows.includes(win)) return;
40
+ windows.push(win);
41
+ topZIndex += 1;
42
+ win.setZIndex(topZIndex);
43
+ const off = win.on("destroy", () => unregister(win));
44
+ unsubscribeDestroy.set(win, off);
45
+ emitter.emit("register", win);
46
+ }
47
+ function unregister(win) {
48
+ const index = windows.indexOf(win);
49
+ if (index === -1) return;
50
+ windows.splice(index, 1);
51
+ unsubscribeDestroy.get(win)?.();
52
+ unsubscribeDestroy.delete(win);
53
+ if (focused === win) {
54
+ focused = null;
55
+ win.blur();
56
+ }
57
+ emitter.emit("unregister", win);
58
+ }
59
+ function focus(win) {
60
+ if (!windows.includes(win) || focused === win) return;
61
+ const previous = focused;
62
+ topZIndex += 1;
63
+ win.setZIndex(topZIndex);
64
+ win.focus();
65
+ focused = win;
66
+ if (previous) {
67
+ previous.blur();
68
+ emitter.emit("blur", previous);
69
+ }
70
+ emitter.emit("focus", win);
71
+ }
72
+ function destroy() {
73
+ for (const win of windows) unsubscribeDestroy.get(win)?.();
74
+ windows.length = 0;
75
+ unsubscribeDestroy.clear();
76
+ focused = null;
77
+ emitter.clear();
78
+ }
79
+ return {
80
+ register,
81
+ unregister,
82
+ focus,
83
+ bringToFront: focus,
84
+ getFocused: () => focused,
85
+ list: () => [...windows],
86
+ on: (event, handler) => emitter.on(event, handler),
87
+ destroy
88
+ };
89
+ }
90
+
91
+ exports.createManager = createManager;
92
+ exports.manager = createManager;
93
+ //# sourceMappingURL=manager.cjs.map
94
+ //# sourceMappingURL=manager.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/events.ts","../src/manager/manager.ts"],"names":[],"mappings":"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","file":"manager.cjs","sourcesContent":["type Handler<T> = (data: T) => void;\n\nexport class Emitter<EventMap extends object> {\n private readonly listeners = new Map<keyof EventMap, Set<Handler<unknown>>>();\n\n on<K extends keyof EventMap>(event: K, handler: Handler<EventMap[K]>): () => void {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(handler as Handler<unknown>);\n return () => this.off(event, handler);\n }\n\n off<K extends keyof EventMap>(event: K, handler: Handler<EventMap[K]>): void {\n this.listeners.get(event)?.delete(handler as Handler<unknown>);\n }\n\n emit<K extends keyof EventMap>(event: K, data: EventMap[K]): void {\n const set = this.listeners.get(event);\n if (!set || set.size === 0) return;\n\n // Snapshot so listeners can unsubscribe during emit.\n for (const handler of [...set]) {\n (handler as Handler<EventMap[K]>)(data);\n }\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import type {\n FreedomManager,\n FreedomManagerOptions,\n FreedomWindow,\n ManagerEventMap,\n} from '../core/types';\nimport { Emitter } from '../core/events';\n\nexport function createManager(options: FreedomManagerOptions = {}): FreedomManager {\n const baseZIndex = options.baseZIndex ?? 1;\n\n const windows: FreedomWindow[] = [];\n const unsubscribeDestroy = new Map<FreedomWindow, () => void>();\n const emitter = new Emitter<ManagerEventMap>();\n\n let topZIndex = baseZIndex;\n let focused: FreedomWindow | null = null;\n\n function register(win: FreedomWindow): void {\n if (windows.includes(win)) return;\n\n windows.push(win);\n topZIndex += 1;\n win.setZIndex(topZIndex);\n\n const off = win.on('destroy', () => unregister(win));\n unsubscribeDestroy.set(win, off);\n\n emitter.emit('register', win);\n }\n\n function unregister(win: FreedomWindow): void {\n const index = windows.indexOf(win);\n if (index === -1) return;\n\n windows.splice(index, 1);\n unsubscribeDestroy.get(win)?.();\n unsubscribeDestroy.delete(win);\n\n if (focused === win) {\n focused = null;\n win.blur();\n }\n\n emitter.emit('unregister', win);\n }\n\n function focus(win: FreedomWindow): void {\n if (!windows.includes(win) || focused === win) return;\n\n const previous = focused;\n topZIndex += 1;\n win.setZIndex(topZIndex);\n win.focus();\n focused = win;\n\n if (previous) {\n previous.blur();\n emitter.emit('blur', previous);\n }\n emitter.emit('focus', win);\n }\n\n function destroy(): void {\n for (const win of windows) unsubscribeDestroy.get(win)?.();\n windows.length = 0;\n unsubscribeDestroy.clear();\n focused = null;\n emitter.clear();\n }\n\n return {\n register,\n unregister,\n focus,\n bringToFront: focus,\n getFocused: () => focused,\n list: () => [...windows],\n on: (event, handler) => emitter.on(event, handler),\n destroy,\n };\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import { b as FreedomManagerOptions, F as FreedomManager } from './types-tH0wv_P8.cjs';
2
+ export { d as FreedomWindow, M as ManagerEventMap } from './types-tH0wv_P8.cjs';
3
+
4
+ declare function createManager(options?: FreedomManagerOptions): FreedomManager;
5
+
6
+ export { FreedomManager, FreedomManagerOptions, createManager, createManager as manager };
@@ -0,0 +1,6 @@
1
+ import { b as FreedomManagerOptions, F as FreedomManager } from './types-tH0wv_P8.js';
2
+ export { d as FreedomWindow, M as ManagerEventMap } from './types-tH0wv_P8.js';
3
+
4
+ declare function createManager(options?: FreedomManagerOptions): FreedomManager;
5
+
6
+ export { FreedomManager, FreedomManagerOptions, createManager, createManager as manager };
@@ -0,0 +1,91 @@
1
+ // src/core/events.ts
2
+ var Emitter = class {
3
+ listeners = /* @__PURE__ */ new Map();
4
+ on(event, handler) {
5
+ let set = this.listeners.get(event);
6
+ if (!set) {
7
+ set = /* @__PURE__ */ new Set();
8
+ this.listeners.set(event, set);
9
+ }
10
+ set.add(handler);
11
+ return () => this.off(event, handler);
12
+ }
13
+ off(event, handler) {
14
+ this.listeners.get(event)?.delete(handler);
15
+ }
16
+ emit(event, data) {
17
+ const set = this.listeners.get(event);
18
+ if (!set || set.size === 0) return;
19
+ for (const handler of [...set]) {
20
+ handler(data);
21
+ }
22
+ }
23
+ clear() {
24
+ this.listeners.clear();
25
+ }
26
+ };
27
+
28
+ // src/manager/manager.ts
29
+ function createManager(options = {}) {
30
+ const baseZIndex = options.baseZIndex ?? 1;
31
+ const windows = [];
32
+ const unsubscribeDestroy = /* @__PURE__ */ new Map();
33
+ const emitter = new Emitter();
34
+ let topZIndex = baseZIndex;
35
+ let focused = null;
36
+ function register(win) {
37
+ if (windows.includes(win)) return;
38
+ windows.push(win);
39
+ topZIndex += 1;
40
+ win.setZIndex(topZIndex);
41
+ const off = win.on("destroy", () => unregister(win));
42
+ unsubscribeDestroy.set(win, off);
43
+ emitter.emit("register", win);
44
+ }
45
+ function unregister(win) {
46
+ const index = windows.indexOf(win);
47
+ if (index === -1) return;
48
+ windows.splice(index, 1);
49
+ unsubscribeDestroy.get(win)?.();
50
+ unsubscribeDestroy.delete(win);
51
+ if (focused === win) {
52
+ focused = null;
53
+ win.blur();
54
+ }
55
+ emitter.emit("unregister", win);
56
+ }
57
+ function focus(win) {
58
+ if (!windows.includes(win) || focused === win) return;
59
+ const previous = focused;
60
+ topZIndex += 1;
61
+ win.setZIndex(topZIndex);
62
+ win.focus();
63
+ focused = win;
64
+ if (previous) {
65
+ previous.blur();
66
+ emitter.emit("blur", previous);
67
+ }
68
+ emitter.emit("focus", win);
69
+ }
70
+ function destroy() {
71
+ for (const win of windows) unsubscribeDestroy.get(win)?.();
72
+ windows.length = 0;
73
+ unsubscribeDestroy.clear();
74
+ focused = null;
75
+ emitter.clear();
76
+ }
77
+ return {
78
+ register,
79
+ unregister,
80
+ focus,
81
+ bringToFront: focus,
82
+ getFocused: () => focused,
83
+ list: () => [...windows],
84
+ on: (event, handler) => emitter.on(event, handler),
85
+ destroy
86
+ };
87
+ }
88
+
89
+ export { createManager, createManager as manager };
90
+ //# sourceMappingURL=manager.js.map
91
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/events.ts","../src/manager/manager.ts"],"names":[],"mappings":";AAEO,IAAM,UAAN,MAAuC;AAAA,EAC3B,SAAA,uBAAgB,GAAA,EAA2C;AAAA,EAE5E,EAAA,CAA6B,OAAU,OAAA,EAA2C;AAChF,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAClC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,uBAAU,GAAA,EAAI;AACd,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAAA,IAC/B;AACA,IAAA,GAAA,CAAI,IAAI,OAA2B,CAAA;AACnC,IAAA,OAAO,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,OAAO,CAAA;AAAA,EACtC;AAAA,EAEA,GAAA,CAA8B,OAAU,OAAA,EAAqC;AAC3E,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,OAA2B,CAAA;AAAA,EAC/D;AAAA,EAEA,IAAA,CAA+B,OAAU,IAAA,EAAyB;AAChE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,IAAA,KAAS,CAAA,EAAG;AAG5B,IAAA,KAAA,MAAW,OAAA,IAAW,CAAC,GAAG,GAAG,CAAA,EAAG;AAC9B,MAAC,QAAiC,IAAI,CAAA;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AACF,CAAA;;;ACxBO,SAAS,aAAA,CAAc,OAAA,GAAiC,EAAC,EAAmB;AACjF,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,CAAA;AAEzC,EAAA,MAAM,UAA2B,EAAC;AAClC,EAAA,MAAM,kBAAA,uBAAyB,GAAA,EAA+B;AAC9D,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAyB;AAE7C,EAAA,IAAI,SAAA,GAAY,UAAA;AAChB,EAAA,IAAI,OAAA,GAAgC,IAAA;AAEpC,EAAA,SAAS,SAAS,GAAA,EAA0B;AAC1C,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAE3B,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAChB,IAAA,SAAA,IAAa,CAAA;AACb,IAAA,GAAA,CAAI,UAAU,SAAS,CAAA;AAEvB,IAAA,MAAM,MAAM,GAAA,CAAI,EAAA,CAAG,WAAW,MAAM,UAAA,CAAW,GAAG,CAAC,CAAA;AACnD,IAAA,kBAAA,CAAmB,GAAA,CAAI,KAAK,GAAG,CAAA;AAE/B,IAAA,OAAA,CAAQ,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,EAC9B;AAEA,EAAA,SAAS,WAAW,GAAA,EAA0B;AAC5C,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACjC,IAAA,IAAI,UAAU,EAAA,EAAI;AAElB,IAAA,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAC,CAAA;AACvB,IAAA,kBAAA,CAAmB,GAAA,CAAI,GAAG,CAAA,IAAI;AAC9B,IAAA,kBAAA,CAAmB,OAAO,GAAG,CAAA;AAE7B,IAAA,IAAI,YAAY,GAAA,EAAK;AACnB,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACX;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK,cAAc,GAAG,CAAA;AAAA,EAChC;AAEA,EAAA,SAAS,MAAM,GAAA,EAA0B;AACvC,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,IAAK,YAAY,GAAA,EAAK;AAE/C,IAAA,MAAM,QAAA,GAAW,OAAA;AACjB,IAAA,SAAA,IAAa,CAAA;AACb,IAAA,GAAA,CAAI,UAAU,SAAS,CAAA;AACvB,IAAA,GAAA,CAAI,KAAA,EAAM;AACV,IAAA,OAAA,GAAU,GAAA;AAEV,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,IAAA,EAAK;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAAA,IAC/B;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,GAAG,CAAA;AAAA,EAC3B;AAEA,EAAA,SAAS,OAAA,GAAgB;AACvB,IAAA,KAAA,MAAW,GAAA,IAAO,OAAA,EAAS,kBAAA,CAAmB,GAAA,CAAI,GAAG,CAAA,IAAI;AACzD,IAAA,OAAA,CAAQ,MAAA,GAAS,CAAA;AACjB,IAAA,kBAAA,CAAmB,KAAA,EAAM;AACzB,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,EAChB;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA,EAAc,KAAA;AAAA,IACd,YAAY,MAAM,OAAA;AAAA,IAClB,IAAA,EAAM,MAAM,CAAC,GAAG,OAAO,CAAA;AAAA,IACvB,IAAI,CAAC,KAAA,EAAO,YAAY,OAAA,CAAQ,EAAA,CAAG,OAAO,OAAO,CAAA;AAAA,IACjD;AAAA,GACF;AACF","file":"manager.js","sourcesContent":["type Handler<T> = (data: T) => void;\n\nexport class Emitter<EventMap extends object> {\n private readonly listeners = new Map<keyof EventMap, Set<Handler<unknown>>>();\n\n on<K extends keyof EventMap>(event: K, handler: Handler<EventMap[K]>): () => void {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(handler as Handler<unknown>);\n return () => this.off(event, handler);\n }\n\n off<K extends keyof EventMap>(event: K, handler: Handler<EventMap[K]>): void {\n this.listeners.get(event)?.delete(handler as Handler<unknown>);\n }\n\n emit<K extends keyof EventMap>(event: K, data: EventMap[K]): void {\n const set = this.listeners.get(event);\n if (!set || set.size === 0) return;\n\n // Snapshot so listeners can unsubscribe during emit.\n for (const handler of [...set]) {\n (handler as Handler<EventMap[K]>)(data);\n }\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import type {\n FreedomManager,\n FreedomManagerOptions,\n FreedomWindow,\n ManagerEventMap,\n} from '../core/types';\nimport { Emitter } from '../core/events';\n\nexport function createManager(options: FreedomManagerOptions = {}): FreedomManager {\n const baseZIndex = options.baseZIndex ?? 1;\n\n const windows: FreedomWindow[] = [];\n const unsubscribeDestroy = new Map<FreedomWindow, () => void>();\n const emitter = new Emitter<ManagerEventMap>();\n\n let topZIndex = baseZIndex;\n let focused: FreedomWindow | null = null;\n\n function register(win: FreedomWindow): void {\n if (windows.includes(win)) return;\n\n windows.push(win);\n topZIndex += 1;\n win.setZIndex(topZIndex);\n\n const off = win.on('destroy', () => unregister(win));\n unsubscribeDestroy.set(win, off);\n\n emitter.emit('register', win);\n }\n\n function unregister(win: FreedomWindow): void {\n const index = windows.indexOf(win);\n if (index === -1) return;\n\n windows.splice(index, 1);\n unsubscribeDestroy.get(win)?.();\n unsubscribeDestroy.delete(win);\n\n if (focused === win) {\n focused = null;\n win.blur();\n }\n\n emitter.emit('unregister', win);\n }\n\n function focus(win: FreedomWindow): void {\n if (!windows.includes(win) || focused === win) return;\n\n const previous = focused;\n topZIndex += 1;\n win.setZIndex(topZIndex);\n win.focus();\n focused = win;\n\n if (previous) {\n previous.blur();\n emitter.emit('blur', previous);\n }\n emitter.emit('focus', win);\n }\n\n function destroy(): void {\n for (const win of windows) unsubscribeDestroy.get(win)?.();\n windows.length = 0;\n unsubscribeDestroy.clear();\n focused = null;\n emitter.clear();\n }\n\n return {\n register,\n unregister,\n focus,\n bringToFront: focus,\n getFocused: () => focused,\n list: () => [...windows],\n on: (event, handler) => emitter.on(event, handler),\n destroy,\n };\n}\n"]}
package/dist/snap.cjs ADDED
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+
3
+ // src/plugins/snap.ts
4
+ function snapPlugin(options = {}) {
5
+ const threshold = options.threshold ?? 8;
6
+ const snapToViewport = options.snapToViewport ?? true;
7
+ return {
8
+ name: "freedom-snap",
9
+ onDrag(data, ctx) {
10
+ const size = ctx.window.getSize();
11
+ let { x, y } = data.position;
12
+ const targets = [];
13
+ if (snapToViewport && typeof window !== "undefined") {
14
+ targets.push({ x: 0, y: 0, width: window.innerWidth, height: window.innerHeight });
15
+ }
16
+ if (options.getSnapTargets) targets.push(...options.getSnapTargets());
17
+ for (const target of targets) {
18
+ if (Math.abs(x - target.x) <= threshold) x = target.x;
19
+ if (Math.abs(x + size.width - (target.x + target.width)) <= threshold) {
20
+ x = target.x + target.width - size.width;
21
+ }
22
+ if (Math.abs(y - target.y) <= threshold) y = target.y;
23
+ if (Math.abs(y + size.height - (target.y + target.height)) <= threshold) {
24
+ y = target.y + target.height - size.height;
25
+ }
26
+ }
27
+ return { x, y };
28
+ }
29
+ };
30
+ }
31
+
32
+ exports.snapPlugin = snapPlugin;
33
+ //# sourceMappingURL=snap.cjs.map
34
+ //# sourceMappingURL=snap.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/snap.ts"],"names":[],"mappings":";;;AAQO,SAAS,UAAA,CAAW,OAAA,GAA6B,EAAC,EAAkB;AACzE,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,CAAA;AACvC,EAAA,MAAM,cAAA,GAAiB,QAAQ,cAAA,IAAkB,IAAA;AAEjD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IAEN,MAAA,CAAO,MAAM,GAAA,EAAK;AAChB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,CAAO,OAAA,EAAQ;AAChC,MAAA,IAAI,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,IAAA,CAAK,QAAA;AAEpB,MAAA,MAAM,UAAkB,EAAC;AACzB,MAAA,IAAI,cAAA,IAAkB,OAAO,MAAA,KAAW,WAAA,EAAa;AACnD,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,UAAA,EAAY,MAAA,EAAQ,MAAA,CAAO,WAAA,EAAa,CAAA;AAAA,MACnF;AACA,MAAA,IAAI,QAAQ,cAAA,EAAgB,OAAA,CAAQ,KAAK,GAAG,OAAA,CAAQ,gBAAgB,CAAA;AAEpE,MAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,QAAA,IAAI,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,IAAK,SAAA,MAAe,MAAA,CAAO,CAAA;AACpD,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,KAAA,IAAS,OAAO,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAA,IAAK,SAAA,EAAW;AACrE,UAAA,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,KAAA;AAAA,QACrC;AACA,QAAA,IAAI,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,IAAK,SAAA,MAAe,MAAA,CAAO,CAAA;AACpD,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU,OAAO,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,CAAA,IAAK,SAAA,EAAW;AACvE,UAAA,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,MAAA;AAAA,QACtC;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,GAAG,CAAA,EAAE;AAAA,IAChB;AAAA,GACF;AACF","file":"snap.cjs","sourcesContent":["import type { FreedomPlugin, Rect } from '../core/types';\n\nexport interface SnapPluginOptions {\n threshold?: number;\n snapToViewport?: boolean;\n getSnapTargets?(): Rect[];\n}\n\nexport function snapPlugin(options: SnapPluginOptions = {}): FreedomPlugin {\n const threshold = options.threshold ?? 8;\n const snapToViewport = options.snapToViewport ?? true;\n\n return {\n name: 'freedom-snap',\n\n onDrag(data, ctx) {\n const size = ctx.window.getSize();\n let { x, y } = data.position;\n\n const targets: Rect[] = [];\n if (snapToViewport && typeof window !== 'undefined') {\n targets.push({ x: 0, y: 0, width: window.innerWidth, height: window.innerHeight });\n }\n if (options.getSnapTargets) targets.push(...options.getSnapTargets());\n\n for (const target of targets) {\n if (Math.abs(x - target.x) <= threshold) x = target.x;\n if (Math.abs(x + size.width - (target.x + target.width)) <= threshold) {\n x = target.x + target.width - size.width;\n }\n if (Math.abs(y - target.y) <= threshold) y = target.y;\n if (Math.abs(y + size.height - (target.y + target.height)) <= threshold) {\n y = target.y + target.height - size.height;\n }\n }\n\n return { x, y };\n },\n };\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import { R as Rect, c as FreedomPlugin } from './types-tH0wv_P8.cjs';
2
+
3
+ interface SnapPluginOptions {
4
+ threshold?: number;
5
+ snapToViewport?: boolean;
6
+ getSnapTargets?(): Rect[];
7
+ }
8
+ declare function snapPlugin(options?: SnapPluginOptions): FreedomPlugin;
9
+
10
+ export { type SnapPluginOptions, snapPlugin };
package/dist/snap.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import { R as Rect, c as FreedomPlugin } from './types-tH0wv_P8.js';
2
+
3
+ interface SnapPluginOptions {
4
+ threshold?: number;
5
+ snapToViewport?: boolean;
6
+ getSnapTargets?(): Rect[];
7
+ }
8
+ declare function snapPlugin(options?: SnapPluginOptions): FreedomPlugin;
9
+
10
+ export { type SnapPluginOptions, snapPlugin };
package/dist/snap.js ADDED
@@ -0,0 +1,32 @@
1
+ // src/plugins/snap.ts
2
+ function snapPlugin(options = {}) {
3
+ const threshold = options.threshold ?? 8;
4
+ const snapToViewport = options.snapToViewport ?? true;
5
+ return {
6
+ name: "freedom-snap",
7
+ onDrag(data, ctx) {
8
+ const size = ctx.window.getSize();
9
+ let { x, y } = data.position;
10
+ const targets = [];
11
+ if (snapToViewport && typeof window !== "undefined") {
12
+ targets.push({ x: 0, y: 0, width: window.innerWidth, height: window.innerHeight });
13
+ }
14
+ if (options.getSnapTargets) targets.push(...options.getSnapTargets());
15
+ for (const target of targets) {
16
+ if (Math.abs(x - target.x) <= threshold) x = target.x;
17
+ if (Math.abs(x + size.width - (target.x + target.width)) <= threshold) {
18
+ x = target.x + target.width - size.width;
19
+ }
20
+ if (Math.abs(y - target.y) <= threshold) y = target.y;
21
+ if (Math.abs(y + size.height - (target.y + target.height)) <= threshold) {
22
+ y = target.y + target.height - size.height;
23
+ }
24
+ }
25
+ return { x, y };
26
+ }
27
+ };
28
+ }
29
+
30
+ export { snapPlugin };
31
+ //# sourceMappingURL=snap.js.map
32
+ //# sourceMappingURL=snap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/snap.ts"],"names":[],"mappings":";AAQO,SAAS,UAAA,CAAW,OAAA,GAA6B,EAAC,EAAkB;AACzE,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,CAAA;AACvC,EAAA,MAAM,cAAA,GAAiB,QAAQ,cAAA,IAAkB,IAAA;AAEjD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IAEN,MAAA,CAAO,MAAM,GAAA,EAAK;AAChB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,CAAO,OAAA,EAAQ;AAChC,MAAA,IAAI,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,IAAA,CAAK,QAAA;AAEpB,MAAA,MAAM,UAAkB,EAAC;AACzB,MAAA,IAAI,cAAA,IAAkB,OAAO,MAAA,KAAW,WAAA,EAAa;AACnD,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,UAAA,EAAY,MAAA,EAAQ,MAAA,CAAO,WAAA,EAAa,CAAA;AAAA,MACnF;AACA,MAAA,IAAI,QAAQ,cAAA,EAAgB,OAAA,CAAQ,KAAK,GAAG,OAAA,CAAQ,gBAAgB,CAAA;AAEpE,MAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,QAAA,IAAI,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,IAAK,SAAA,MAAe,MAAA,CAAO,CAAA;AACpD,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,KAAA,IAAS,OAAO,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAA,IAAK,SAAA,EAAW;AACrE,UAAA,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,KAAA;AAAA,QACrC;AACA,QAAA,IAAI,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,IAAK,SAAA,MAAe,MAAA,CAAO,CAAA;AACpD,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU,OAAO,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,CAAA,IAAK,SAAA,EAAW;AACvE,UAAA,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,MAAA;AAAA,QACtC;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,GAAG,CAAA,EAAE;AAAA,IAChB;AAAA,GACF;AACF","file":"snap.js","sourcesContent":["import type { FreedomPlugin, Rect } from '../core/types';\n\nexport interface SnapPluginOptions {\n threshold?: number;\n snapToViewport?: boolean;\n getSnapTargets?(): Rect[];\n}\n\nexport function snapPlugin(options: SnapPluginOptions = {}): FreedomPlugin {\n const threshold = options.threshold ?? 8;\n const snapToViewport = options.snapToViewport ?? true;\n\n return {\n name: 'freedom-snap',\n\n onDrag(data, ctx) {\n const size = ctx.window.getSize();\n let { x, y } = data.position;\n\n const targets: Rect[] = [];\n if (snapToViewport && typeof window !== 'undefined') {\n targets.push({ x: 0, y: 0, width: window.innerWidth, height: window.innerHeight });\n }\n if (options.getSnapTargets) targets.push(...options.getSnapTargets());\n\n for (const target of targets) {\n if (Math.abs(x - target.x) <= threshold) x = target.x;\n if (Math.abs(x + size.width - (target.x + target.width)) <= threshold) {\n x = target.x + target.width - size.width;\n }\n if (Math.abs(y - target.y) <= threshold) y = target.y;\n if (Math.abs(y + size.height - (target.y + target.height)) <= threshold) {\n y = target.y + target.height - size.height;\n }\n }\n\n return { x, y };\n },\n };\n}\n"]}
@@ -0,0 +1,121 @@
1
+ interface Point {
2
+ x: number;
3
+ y: number;
4
+ }
5
+ interface Size {
6
+ width: number;
7
+ height: number;
8
+ }
9
+ interface Rect extends Point, Size {
10
+ }
11
+ interface Bounds {
12
+ minX: number;
13
+ minY: number;
14
+ maxX: number;
15
+ maxY: number;
16
+ }
17
+ type BoundsOption = 'none' | 'viewport' | 'parent' | Rect;
18
+ type ResizeHandle = 'n' | 's' | 'e' | 'w' | 'nw' | 'ne' | 'sw' | 'se';
19
+ type InitialPosition = Point | 'center';
20
+ type PositioningMode = 'absolute' | 'fixed' | 'relative';
21
+ interface DragEventData {
22
+ position: Point;
23
+ delta: Point;
24
+ pointerEvent: PointerEvent;
25
+ }
26
+ interface ResizeEventData {
27
+ size: Size;
28
+ position: Point;
29
+ handle: ResizeHandle;
30
+ pointerEvent: PointerEvent;
31
+ }
32
+ interface WindowEventMap {
33
+ dragstart: DragEventData;
34
+ drag: DragEventData;
35
+ dragend: DragEventData;
36
+ resizestart: ResizeEventData;
37
+ resize: ResizeEventData;
38
+ resizeend: ResizeEventData;
39
+ focus: undefined;
40
+ blur: undefined;
41
+ destroy: undefined;
42
+ }
43
+ interface ManagerEventMap {
44
+ register: FreedomWindow;
45
+ unregister: FreedomWindow;
46
+ focus: FreedomWindow;
47
+ blur: FreedomWindow;
48
+ }
49
+ interface FreedomPlugin {
50
+ readonly name: string;
51
+ onInit?(ctx: PluginContext): void;
52
+ onDrag?(data: DragEventData, ctx: PluginContext): Point | void;
53
+ onResize?(data: ResizeEventData, ctx: PluginContext): {
54
+ position: Point;
55
+ size: Size;
56
+ } | void;
57
+ onDestroy?(ctx: PluginContext): void;
58
+ }
59
+ interface PluginContext {
60
+ readonly window: FreedomWindow;
61
+ readonly element: HTMLElement;
62
+ }
63
+ interface FreedomWindowOptions {
64
+ id?: string;
65
+ initialPosition?: InitialPosition;
66
+ initialSize?: Size;
67
+ positioning?: PositioningMode;
68
+ autoReveal?: boolean;
69
+ minWidth?: number;
70
+ minHeight?: number;
71
+ maxWidth?: number;
72
+ maxHeight?: number;
73
+ draggable?: boolean;
74
+ resizable?: boolean | ResizeHandle[];
75
+ dragHandle?: string | HTMLElement | null;
76
+ bounds?: BoundsOption;
77
+ zIndex?: number;
78
+ plugins?: FreedomPlugin[];
79
+ onDragStart?(data: DragEventData): void;
80
+ onDrag?(data: DragEventData): void;
81
+ onDragEnd?(data: DragEventData): void;
82
+ onResizeStart?(data: ResizeEventData): void;
83
+ onResize?(data: ResizeEventData): void;
84
+ onResizeEnd?(data: ResizeEventData): void;
85
+ onFocus?(): void;
86
+ onBlur?(): void;
87
+ }
88
+ interface FreedomWindow {
89
+ readonly id: string;
90
+ readonly element: HTMLElement;
91
+ getPosition(): Point;
92
+ getSize(): Size;
93
+ setPosition(point: Point): void;
94
+ setSize(size: Size): void;
95
+ focus(): void;
96
+ blur(): void;
97
+ isFocused(): boolean;
98
+ setZIndex(zIndex: number): void;
99
+ getZIndex(): number;
100
+ enableDrag(): void;
101
+ disableDrag(): void;
102
+ enableResize(handles?: ResizeHandle[]): void;
103
+ disableResize(): void;
104
+ destroy(): void;
105
+ on<K extends keyof WindowEventMap>(event: K, handler: (data: WindowEventMap[K]) => void): () => void;
106
+ }
107
+ interface FreedomManagerOptions {
108
+ baseZIndex?: number;
109
+ }
110
+ interface FreedomManager {
111
+ register(win: FreedomWindow): void;
112
+ unregister(win: FreedomWindow): void;
113
+ focus(win: FreedomWindow): void;
114
+ bringToFront(win: FreedomWindow): void;
115
+ getFocused(): FreedomWindow | null;
116
+ list(): FreedomWindow[];
117
+ on<K extends keyof ManagerEventMap>(event: K, handler: (data: ManagerEventMap[K]) => void): () => void;
118
+ destroy(): void;
119
+ }
120
+
121
+ export type { Bounds as B, DragEventData as D, FreedomManager as F, InitialPosition as I, ManagerEventMap as M, PluginContext as P, Rect as R, Size as S, WindowEventMap as W, BoundsOption as a, FreedomManagerOptions as b, FreedomPlugin as c, FreedomWindow as d, FreedomWindowOptions as e, Point as f, PositioningMode as g, ResizeEventData as h, ResizeHandle as i };