@surdeddd/wmkit 0.1.0 → 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.
package/README.md CHANGED
@@ -2,12 +2,16 @@
2
2
 
3
3
  **Headless window manager for the web.** Draggable, resizable, snappable windows with a taskbar model, keyboard accessibility and state persistence — for vanilla JS and every major framework.
4
4
 
5
- [Русская версия](./README.ru.md) · [Live demo](https://surdeddd.github.io/wmkit/) · [GitHub](https://github.com/Surdeddd/wmkit)
5
+ [Русская версия](./README.ru.md) · [Live demo](https://wmkit.vercel.app) · [Mirror (Pages)](https://surdeddd.github.io/wmkit/) · [GitHub](https://github.com/Surdeddd/wmkit)
6
6
 
7
7
  [![CI](https://github.com/Surdeddd/wmkit/actions/workflows/ci.yml/badge.svg)](https://github.com/Surdeddd/wmkit/actions/workflows/ci.yml)
8
8
  [![npm](https://img.shields.io/npm/v/@surdeddd/wmkit)](https://www.npmjs.com/package/@surdeddd/wmkit)
9
9
  [![license](https://img.shields.io/badge/license-MIT-2dd4a8)](./LICENSE)
10
10
 
11
+ [![wmkit — live demo desktop](https://raw.githubusercontent.com/Surdeddd/wmkit/main/.github/assets/hero.png)](https://surdeddd.github.io/wmkit/)
12
+
13
+ <p align="center"><em>Every window above is real — <a href="https://surdeddd.github.io/wmkit/">open the demo</a> and drag one.</em></p>
14
+
11
15
  - 🪟 **Full window lifecycle** — open, close, focus, minimize, maximize, restore, drag, 8-direction resize
12
16
  - 🧠 **Headless core** — a serializable state machine plus a DOM controller; bring your own markup or use the glass theme
13
17
  - ⚛️ **Official adapters** — `@surdeddd/wmkit/react`, `@surdeddd/wmkit/vue`, `@surdeddd/wmkit/svelte`, `@surdeddd/wmkit/solid`, all thin sugar over one core
@@ -50,7 +54,13 @@ el.innerHTML = `
50
54
  <div data-wm-content>Anything you want.</div>
51
55
  `
52
56
  document.querySelector('#desktop').append(el)
53
- desktop.attachWindow(win.id, el)
57
+ const detach = desktop.attachWindow(win.id, el)
58
+
59
+ wm.on('close', ({ window: closed }) => {
60
+ if (closed.id !== win.id) return
61
+ detach()
62
+ el.remove()
63
+ })
54
64
  ```
55
65
 
56
66
  The desktop element becomes the coordinate space. Your markup stays yours — wmkit wires behavior onto `data-wm-*` attributes:
@@ -184,6 +194,12 @@ function Desktop() {
184
194
  }
185
195
  ```
186
196
 
197
+ ## Snap zones in action
198
+
199
+ [![Snap zones — window tiled to the left half](https://raw.githubusercontent.com/Surdeddd/wmkit/main/.github/assets/snap.png)](https://surdeddd.github.io/wmkit/)
200
+
201
+ Throw a window against an edge or corner — a live preview shows the target zone, releasing tiles it. Halves, quarters, and drag-to-top maximize.
202
+
187
203
  ## Core API
188
204
 
189
205
  ### `createWindowManager(options?)`
package/README.ru.md CHANGED
@@ -2,7 +2,11 @@
2
2
 
3
3
  **Headless оконный менеджер для веба.** Перетаскиваемые окна с ресайзом, снэпом, таскбаром, клавиатурной доступностью и персистом состояния — для vanilla JS и всех основных фреймворков.
4
4
 
5
- [English version](./README.md) · [Живое демо](https://surdeddd.github.io/wmkit/) · [GitHub](https://github.com/Surdeddd/wmkit)
5
+ [English version](./README.md) · [Живое демо](https://wmkit.vercel.app) · [Зеркало (Pages)](https://surdeddd.github.io/wmkit/) · [GitHub](https://github.com/Surdeddd/wmkit)
6
+
7
+ [![wmkit — живой демо-десктоп](https://raw.githubusercontent.com/Surdeddd/wmkit/main/.github/assets/hero.png)](https://surdeddd.github.io/wmkit/)
8
+
9
+ <p align="center"><em>Все окна выше настоящие — <a href="https://surdeddd.github.io/wmkit/">откройте демо</a> и потаскайте.</em></p>
6
10
 
7
11
  - 🪟 **Полный жизненный цикл окна** — открытие, закрытие, фокус, сворачивание, разворачивание, восстановление, drag, ресайз в 8 направлениях
8
12
  - 🧠 **Headless-ядро** — сериализуемая стейт-машина плюс DOM-контроллер; своя разметка или готовая стеклянная тема
@@ -46,7 +50,13 @@ el.innerHTML = `
46
50
  <div data-wm-content>Что угодно.</div>
47
51
  `
48
52
  document.querySelector('#desktop').append(el)
49
- desktop.attachWindow(win.id, el)
53
+ const detach = desktop.attachWindow(win.id, el)
54
+
55
+ wm.on('close', ({ window: closed }) => {
56
+ if (closed.id !== win.id) return
57
+ detach()
58
+ el.remove()
59
+ })
50
60
  ```
51
61
 
52
62
  Элемент рабочего стола становится системой координат. Разметка остаётся вашей — wmkit вешает поведение на `data-wm-*` атрибуты:
@@ -139,12 +139,7 @@ function createWindowManager(options = {}) {
139
139
  }
140
140
  function commit() {
141
141
  snapshot = null;
142
- if (batchDepth > 0) {
143
- batchDirty = true;
144
- return;
145
- }
146
- flushEvents();
147
- emitter.emit("change", { state: getState() });
142
+ batchDirty = true;
148
143
  }
149
144
  function flushEvents() {
150
145
  while (pendingEvents.length > 0) {
@@ -153,7 +148,6 @@ function createWindowManager(options = {}) {
153
148
  }
154
149
  function queueEvent(emit) {
155
150
  pendingEvents.push(emit);
156
- if (batchDepth === 0) flushEvents();
157
151
  }
158
152
  function setWindow(next) {
159
153
  windows = { ...windows, [next.id]: next };
@@ -217,7 +211,12 @@ function createWindowManager(options = {}) {
217
211
  return { x: init.x ?? base.x, y: init.y ?? base.y };
218
212
  }
219
213
  function open(init = {}) {
220
- const id = init.id ?? `${idPrefix}-${++idCounter}`;
214
+ let id = init.id;
215
+ if (id === void 0) {
216
+ do {
217
+ id = `${idPrefix}-${++idCounter}`;
218
+ } while (windows[id]);
219
+ }
221
220
  if (windows[id]) throw new Error(`wmkit: window id "${id}" already exists`);
222
221
  const minSize = { width: init.minWidth ?? 160, height: init.minHeight ?? 100 };
223
222
  const maxSize = init.maxWidth !== void 0 || init.maxHeight !== void 0 ? {
@@ -295,9 +294,7 @@ function createWindowManager(options = {}) {
295
294
  return true;
296
295
  }
297
296
  function closeAll() {
298
- batch(() => {
299
- for (const id of [...order]) close(id);
300
- });
297
+ for (const id of [...order]) close(id);
301
298
  }
302
299
  function focus(id) {
303
300
  const win = windows[id];
@@ -504,6 +501,11 @@ function createWindowManager(options = {}) {
504
501
  if (patch.layer && patch.layer !== win.layer) {
505
502
  order = sortByLayer(order);
506
503
  queueEvent(() => emitter.emit("order", { order }));
504
+ if (patch.layer === "modal" && topModalId() === id && focusedId !== id) {
505
+ const previous = focusedId;
506
+ focusedId = id;
507
+ emitFocus(finalWin, previous);
508
+ }
507
509
  }
508
510
  queueEvent(() => emitter.emit("update", { window: finalWin }));
509
511
  if (resized) queueEvent(() => emitter.emit("resize", { window: finalWin }));
@@ -513,7 +515,7 @@ function createWindowManager(options = {}) {
513
515
  function setViewport(next) {
514
516
  if (next.width === viewport.width && next.height === viewport.height) return;
515
517
  viewport = { ...next };
516
- batch(() => {
518
+ transact(() => {
517
519
  for (const id of order) {
518
520
  const win = windows[id];
519
521
  if (win.stage === "maximized") {
@@ -540,10 +542,10 @@ function createWindowManager(options = {}) {
540
542
  function minimized() {
541
543
  return Object.values(windows).filter((win) => win.stage === "minimized").sort((a, b) => a.openedSeq - b.openedSeq);
542
544
  }
543
- function batch(run) {
545
+ function transact(run) {
544
546
  batchDepth += 1;
545
547
  try {
546
- run();
548
+ return run();
547
549
  } finally {
548
550
  batchDepth -= 1;
549
551
  if (batchDepth === 0 && batchDirty) {
@@ -562,7 +564,10 @@ function createWindowManager(options = {}) {
562
564
  bounds: { ...win.bounds },
563
565
  restoreBounds: win.restoreBounds ? { ...win.restoreBounds } : null,
564
566
  minSize: { ...win.minSize },
565
- maxSize: win.maxSize ? { ...win.maxSize } : null,
567
+ maxSize: win.maxSize ? {
568
+ width: Number.isFinite(win.maxSize.width) ? win.maxSize.width : null,
569
+ height: Number.isFinite(win.maxSize.height) ? win.maxSize.height : null
570
+ } : null,
566
571
  meta: { ...win.meta }
567
572
  })),
568
573
  order: [...order],
@@ -579,6 +584,19 @@ function createWindowManager(options = {}) {
579
584
  const size = value;
580
585
  return typeof size.width === "number" && typeof size.height === "number";
581
586
  }
587
+ function isSizeAxis(value) {
588
+ return value === null || typeof value === "number";
589
+ }
590
+ function readMaxSize(value) {
591
+ if (typeof value !== "object" || value === null) return null;
592
+ const size = value;
593
+ if (!isSizeAxis(size.width) || !isSizeAxis(size.height)) return null;
594
+ if (size.width === null && size.height === null) return null;
595
+ return {
596
+ width: size.width ?? Number.POSITIVE_INFINITY,
597
+ height: size.height ?? Number.POSITIVE_INFINITY
598
+ };
599
+ }
582
600
  function isSerializedWindow(value) {
583
601
  if (typeof value !== "object" || value === null) return false;
584
602
  const win = value;
@@ -602,7 +620,7 @@ function createWindowManager(options = {}) {
602
620
  snapZone: ZONES.includes(raw.snapZone) ? raw.snapZone : null,
603
621
  layer: raw.layer,
604
622
  minSize: isSize(raw.minSize) ? { ...raw.minSize } : { width: 160, height: 100 },
605
- maxSize: isSize(raw.maxSize) ? { ...raw.maxSize } : null,
623
+ maxSize: readMaxSize(raw.maxSize),
606
624
  openedSeq: typeof raw.openedSeq === "number" ? raw.openedSeq : ++maxSeq,
607
625
  draggable: raw.draggable !== false,
608
626
  resizable: raw.resizable !== false,
@@ -634,6 +652,11 @@ function createWindowManager(options = {}) {
634
652
  focusedId = data.focusedId && windows[data.focusedId] ? data.focusedId : null;
635
653
  if (focusedId && windows[focusedId]?.stage === "minimized") focusedId = null;
636
654
  if (!focusedId) focusTop();
655
+ const modal = topModalId();
656
+ if (modal) {
657
+ const focusedWin = focusedId ? windows[focusedId] : null;
658
+ if (focusedWin?.layer !== "modal") focusedId = modal;
659
+ }
637
660
  commit();
638
661
  return true;
639
662
  }
@@ -641,29 +664,29 @@ function createWindowManager(options = {}) {
641
664
  emitter.clear();
642
665
  }
643
666
  return {
644
- open,
645
- close,
646
- closeAll,
647
- focus,
648
- blur,
649
- cycleFocus,
650
- minimize,
651
- maximize,
652
- toggleMaximize,
653
- restore,
654
- restoreTo,
655
- snap,
656
- move,
657
- moveBy,
658
- resize,
659
- update,
667
+ open: (init) => transact(() => open(init)),
668
+ close: (id) => transact(() => close(id)),
669
+ closeAll: () => transact(closeAll),
670
+ focus: (id) => transact(() => focus(id)),
671
+ blur: () => transact(blur),
672
+ cycleFocus: (direction) => transact(() => cycleFocus(direction)),
673
+ minimize: (id) => transact(() => minimize(id)),
674
+ maximize: (id) => transact(() => maximize(id)),
675
+ toggleMaximize: (id) => transact(() => toggleMaximize(id)),
676
+ restore: (id) => transact(() => restore(id)),
677
+ restoreTo: (id, bounds) => transact(() => restoreTo(id, bounds)),
678
+ snap: (id, zone) => transact(() => snap(id, zone)),
679
+ move: (id, x, y) => transact(() => move(id, x, y)),
680
+ moveBy: (id, dx, dy) => transact(() => moveBy(id, dx, dy)),
681
+ resize: (id, patch) => transact(() => resize(id, patch)),
682
+ update: (id, patch) => transact(() => update(id, patch)),
660
683
  get: (id) => windows[id],
661
684
  getState,
662
685
  minimized,
663
- setViewport,
664
- batch,
686
+ setViewport: (next) => transact(() => setViewport(next)),
687
+ batch: (run) => transact(run),
665
688
  serialize,
666
- hydrate,
689
+ hydrate: (data) => transact(() => hydrate(data)),
667
690
  subscribe: (listener) => emitter.on("change", ({ state }) => listener(state)),
668
691
  on: (event, listener) => emitter.on(event, listener),
669
692
  destroy
@@ -928,6 +951,9 @@ function attachDesktop(wm, element, options = {}) {
928
951
  grabDY: point.y - startBounds.y,
929
952
  grabRatio: clamp((point.x - startBounds.x) / startBounds.width, 0.05, 0.95),
930
953
  startBounds,
954
+ startStage: win.stage,
955
+ startZone: win.snapZone,
956
+ startRestoreBounds: win.restoreBounds,
931
957
  restored: win.stage === "normal",
932
958
  moved: false,
933
959
  zone: null,
@@ -1027,7 +1053,15 @@ function attachDesktop(wm, element, options = {}) {
1027
1053
  hidePreview();
1028
1054
  if (cancelled) {
1029
1055
  if (session.moved && session.restored) {
1030
- wm.move(id, session.startBounds.x, session.startBounds.y);
1056
+ if (session.startStage === "maximized") {
1057
+ wm.restoreTo(id, session.startRestoreBounds ?? session.startBounds);
1058
+ wm.maximize(id);
1059
+ } else if (session.startStage === "snapped" && session.startZone) {
1060
+ wm.restoreTo(id, session.startRestoreBounds ?? session.startBounds);
1061
+ wm.snap(id, session.startZone);
1062
+ } else {
1063
+ wm.move(id, session.startBounds.x, session.startBounds.y);
1064
+ }
1031
1065
  }
1032
1066
  return;
1033
1067
  }
@@ -1330,5 +1364,5 @@ function createDesktopBinder(wm, options = {}) {
1330
1364
  }
1331
1365
 
1332
1366
  export { attachDesktop, boundsEqual, clamp, clampSize, clampToViewport, createAnnouncer, createDesktopBinder, createEmitter, createWindowManager, defaultMessages, detectSnapZone, flipToTarget, prefersReducedMotion, zoneBounds };
1333
- //# sourceMappingURL=chunk-7HHDQEBI.js.map
1334
- //# sourceMappingURL=chunk-7HHDQEBI.js.map
1367
+ //# sourceMappingURL=chunk-N5KNWRKU.js.map
1368
+ //# sourceMappingURL=chunk-N5KNWRKU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/emitter.ts","../src/core/geometry.ts","../src/core/manager.ts","../src/dom/animate.ts","../src/dom/announcer.ts","../src/dom/controller.ts"],"names":[],"mappings":"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","file":"chunk-N5KNWRKU.js","sourcesContent":["export type Listener<T> = (payload: T) => void\n\nexport interface Emitter<Events extends Record<keyof Events, unknown>> {\n on<K extends keyof Events>(event: K, listener: Listener<Events[K]>): () => void\n emit<K extends keyof Events>(event: K, payload: Events[K]): void\n clear(): void\n}\n\nexport function createEmitter<Events extends Record<keyof Events, unknown>>(): Emitter<Events> {\n const listeners = new Map<keyof Events, Set<Listener<never>>>()\n\n return {\n on(event, listener) {\n let set = listeners.get(event)\n if (!set) {\n set = new Set()\n listeners.set(event, set)\n }\n set.add(listener as Listener<never>)\n return () => {\n set.delete(listener as Listener<never>)\n }\n },\n emit(event, payload) {\n const set = listeners.get(event)\n if (!set) return\n for (const listener of [...set]) {\n ;(listener as Listener<Events[typeof event]>)(payload)\n }\n },\n clear() {\n listeners.clear()\n },\n }\n}\n","import type { Bounds, Size, SnapZone } from './types'\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max)\n}\n\nexport function clampSize(size: Size, min: Size, max: Size | null): Size {\n return {\n width: clamp(size.width, min.width, max ? max.width : Number.POSITIVE_INFINITY),\n height: clamp(size.height, min.height, max ? max.height : Number.POSITIVE_INFINITY),\n }\n}\n\nexport function clampToViewport(bounds: Bounds, viewport: Size, minVisible: number): Bounds {\n if (viewport.width <= 0 || viewport.height <= 0) return bounds\n const x = clamp(bounds.x, minVisible - bounds.width, viewport.width - minVisible)\n const y = clamp(bounds.y, 0, Math.max(0, viewport.height - minVisible))\n return x === bounds.x && y === bounds.y ? bounds : { ...bounds, x, y }\n}\n\nexport function boundsEqual(a: Bounds, b: Bounds): boolean {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height\n}\n\nexport function zoneBounds(zone: SnapZone, viewport: Size): Bounds {\n const w = viewport.width\n const h = viewport.height\n const halfW = Math.round(w / 2)\n const halfH = Math.round(h / 2)\n switch (zone) {\n case 'left':\n return { x: 0, y: 0, width: halfW, height: h }\n case 'right':\n return { x: halfW, y: 0, width: w - halfW, height: h }\n case 'top':\n return { x: 0, y: 0, width: w, height: halfH }\n case 'bottom':\n return { x: 0, y: halfH, width: w, height: h - halfH }\n case 'top-left':\n return { x: 0, y: 0, width: halfW, height: halfH }\n case 'top-right':\n return { x: halfW, y: 0, width: w - halfW, height: halfH }\n case 'bottom-left':\n return { x: 0, y: halfH, width: halfW, height: h - halfH }\n case 'bottom-right':\n return { x: halfW, y: halfH, width: w - halfW, height: h - halfH }\n }\n}\n\nexport interface SnapDetectOptions {\n threshold?: number\n cornerSize?: number\n}\n\nexport function detectSnapZone(\n x: number,\n y: number,\n viewport: Size,\n options: SnapDetectOptions = {},\n): SnapZone | null {\n const threshold = options.threshold ?? 12\n const cornerSize = options.cornerSize ?? 64\n const w = viewport.width\n const h = viewport.height\n if (w <= 0 || h <= 0) return null\n\n const nearLeft = x <= threshold\n const nearRight = x >= w - threshold\n const nearTop = y <= threshold\n const nearBottom = y >= h - threshold\n\n if (nearLeft || nearRight) {\n const side = nearLeft ? 'left' : 'right'\n if (y <= cornerSize) return `top-${side}` as SnapZone\n if (y >= h - cornerSize) return `bottom-${side}` as SnapZone\n return side\n }\n if (nearTop) {\n if (x <= cornerSize) return 'top-left'\n if (x >= w - cornerSize) return 'top-right'\n return 'top'\n }\n if (nearBottom) {\n if (x <= cornerSize) return 'bottom-left'\n if (x >= w - cornerSize) return 'bottom-right'\n return 'bottom'\n }\n return null\n}\n","import { createEmitter } from './emitter'\nimport { boundsEqual, clampSize, clampToViewport, zoneBounds } from './geometry'\nimport type {\n Bounds,\n ManagerEvents,\n ManagerOptions,\n ManagerState,\n SerializedState,\n SerializedWindowState,\n Size,\n SnapZone,\n WindowInit,\n WindowLayer,\n WindowManager,\n WindowStage,\n WindowState,\n WindowUpdate,\n} from './types'\n\nconst LAYER_RANK: Record<WindowLayer, number> = { normal: 0, floating: 1, modal: 2 }\nconst STAGES: readonly WindowStage[] = ['normal', 'minimized', 'maximized', 'snapped']\nconst LAYERS: readonly WindowLayer[] = ['normal', 'floating', 'modal']\nconst ZONES: readonly SnapZone[] = [\n 'left',\n 'right',\n 'top',\n 'bottom',\n 'top-left',\n 'top-right',\n 'bottom-left',\n 'bottom-right',\n]\n\nexport function createWindowManager(options: ManagerOptions = {}): WindowManager {\n const emitter = createEmitter<ManagerEvents>()\n const keepInViewport = options.keepInViewport ?? true\n const minVisible = options.minVisible ?? 48\n const defaultSize = options.defaultSize ?? { width: 480, height: 320 }\n const cascadeOffset = options.cascadeOffset ?? 32\n const cascadeOrigin = options.cascadeOrigin ?? { x: 32, y: 32 }\n const idPrefix = options.idPrefix ?? 'wm'\n\n let windows: Record<string, WindowState> = {}\n let order: string[] = []\n let focusedId: string | null = null\n let viewport: Size = options.viewport ?? { width: 0, height: 0 }\n let seq = 0\n let idCounter = 0\n let cascadeIndex = 0\n let snapshot: ManagerState | null = null\n let batchDepth = 0\n let batchDirty = false\n const pendingEvents: Array<() => void> = []\n\n function getState(): ManagerState {\n if (!snapshot) {\n snapshot = { windows, order, focusedId, viewport }\n }\n return snapshot\n }\n\n function commit(): void {\n snapshot = null\n batchDirty = true\n }\n\n function flushEvents(): void {\n while (pendingEvents.length > 0) {\n for (const emit of pendingEvents.splice(0)) emit()\n }\n }\n\n function queueEvent(emit: () => void): void {\n pendingEvents.push(emit)\n }\n\n function setWindow(next: WindowState): void {\n windows = { ...windows, [next.id]: next }\n }\n\n function removeWindow(id: string): void {\n const { [id]: _removed, ...rest } = windows\n windows = rest\n order = order.filter((entry) => entry !== id)\n }\n\n function layerRankOf(id: string): number {\n return LAYER_RANK[(windows[id] as WindowState).layer]\n }\n\n function sortByLayer(ids: string[]): string[] {\n return ids\n .map((id, index) => ({ id, index, rank: layerRankOf(id) }))\n .sort((a, b) => (a.rank !== b.rank ? a.rank - b.rank : a.index - b.index))\n .map((entry) => entry.id)\n }\n\n function raise(id: string): boolean {\n const win = windows[id] as WindowState\n const without = order.filter((entry) => entry !== id)\n const rank = LAYER_RANK[win.layer]\n let insertAt = without.length\n for (let i = without.length - 1; i >= 0; i -= 1) {\n if (layerRankOf(without[i] as string) > rank) insertAt = i\n else break\n }\n const next = [...without.slice(0, insertAt), id, ...without.slice(insertAt)]\n const changed = next.length !== order.length || next.some((entry, i) => entry !== order[i])\n order = next\n return changed\n }\n\n function topModalId(): string | null {\n for (let i = order.length - 1; i >= 0; i -= 1) {\n const win = windows[order[i] as string] as WindowState\n if (win.layer === 'modal' && win.stage !== 'minimized') return win.id\n }\n return null\n }\n\n function focusTargets(): string[] {\n const modal = topModalId()\n return order.filter((id) => {\n const win = windows[id] as WindowState\n if (win.stage === 'minimized') return false\n if (modal && win.layer !== 'modal') return false\n return true\n })\n }\n\n function focusTop(): void {\n const targets = focusTargets()\n focusedId = targets.length > 0 ? (targets[targets.length - 1] as string) : null\n }\n\n function emitFocus(win: WindowState, previous: string | null): void {\n queueEvent(() => emitter.emit('focus', { window: win, previous }))\n }\n\n function normalizeSize(size: Size, win: Pick<WindowState, 'minSize' | 'maxSize'>): Size {\n return clampSize(size, win.minSize, win.maxSize)\n }\n\n function positionForOpen(init: WindowInit): { x: number; y: number } {\n if (init.x !== undefined && init.y !== undefined) return { x: init.x, y: init.y }\n const offset = (cascadeIndex % 10) * cascadeOffset\n cascadeIndex += 1\n const base = { x: cascadeOrigin.x + offset, y: cascadeOrigin.y + offset }\n return { x: init.x ?? base.x, y: init.y ?? base.y }\n }\n\n function open(init: WindowInit = {}): WindowState {\n let id = init.id\n if (id === undefined) {\n do {\n id = `${idPrefix}-${++idCounter}`\n } while (windows[id])\n }\n if (windows[id]) throw new Error(`wmkit: window id \"${id}\" already exists`)\n\n const minSize = { width: init.minWidth ?? 160, height: init.minHeight ?? 100 }\n const maxSize =\n init.maxWidth !== undefined || init.maxHeight !== undefined\n ? {\n width: init.maxWidth ?? Number.POSITIVE_INFINITY,\n height: init.maxHeight ?? Number.POSITIVE_INFINITY,\n }\n : null\n const size = clampSize(\n { width: init.width ?? defaultSize.width, height: init.height ?? defaultSize.height },\n minSize,\n maxSize,\n )\n const position = positionForOpen(init)\n let bounds: Bounds = { ...position, ...size }\n if (keepInViewport) bounds = clampToViewport(bounds, viewport, minVisible)\n\n const requestedStage = init.stage ?? 'normal'\n const stage: WindowStage = requestedStage === 'snapped' ? 'normal' : requestedStage\n\n let win: WindowState = {\n id,\n title: init.title ?? 'Window',\n bounds,\n restoreBounds: null,\n restoreStage: null,\n stage: 'normal',\n snapZone: null,\n layer: init.layer ?? 'normal',\n minSize,\n maxSize,\n openedSeq: ++seq,\n draggable: init.draggable ?? true,\n resizable: init.resizable ?? true,\n closable: init.closable ?? true,\n minimizable: init.minimizable ?? true,\n maximizable: init.maximizable ?? true,\n snappable: init.snappable ?? true,\n meta: init.meta ?? {},\n }\n\n if (stage === 'maximized') {\n win = { ...win, stage, restoreBounds: bounds, bounds: fullBounds() }\n } else if (stage === 'minimized') {\n win = { ...win, stage, restoreStage: 'normal' }\n }\n\n setWindow(win)\n raise(id)\n let focusPayload: { window: WindowState; previous: string | null } | null = null\n if (stage !== 'minimized') {\n const previous = focusedId\n const modal = topModalId()\n if (!modal || win.layer === 'modal') {\n focusedId = id\n focusPayload = { window: win, previous }\n } else {\n focusTop()\n }\n }\n queueEvent(() => emitter.emit('open', { window: win }))\n if (focusPayload) {\n const payload = focusPayload\n queueEvent(() => emitter.emit('focus', payload))\n }\n queueEvent(() => emitter.emit('order', { order }))\n commit()\n return win\n }\n\n function close(id: string): boolean {\n const win = windows[id]\n if (!win) return false\n removeWindow(id)\n queueEvent(() => emitter.emit('close', { window: win }))\n if (focusedId === id) {\n focusTop()\n if (focusedId) emitFocus(windows[focusedId] as WindowState, id)\n }\n queueEvent(() => emitter.emit('order', { order }))\n commit()\n return true\n }\n\n function closeAll(): void {\n for (const id of [...order]) close(id)\n }\n\n function focus(id: string): boolean {\n const win = windows[id]\n if (!win) return false\n const modal = topModalId()\n if (modal && modal !== id && win.layer !== 'modal') {\n const modalWin = windows[modal]\n if (modalWin) queueEvent(() => emitter.emit('modalblocked', { window: modalWin }))\n commit()\n return false\n }\n if (win.stage === 'minimized') {\n restore(id)\n return focusedId === id\n }\n const previous = focusedId\n const raised = raise(id)\n const changed = focusedId !== id || raised\n focusedId = id\n if (changed) {\n emitFocus(win, previous)\n if (raised) queueEvent(() => emitter.emit('order', { order }))\n commit()\n }\n return true\n }\n\n function blur(): void {\n if (focusedId === null) return\n focusedId = null\n commit()\n }\n\n function cycleFocus(direction: 1 | -1 = 1): string | null {\n const targets = focusTargets()\n if (targets.length === 0) return null\n const current = focusedId ? targets.indexOf(focusedId) : -1\n const nextIndex =\n current === -1\n ? direction === 1\n ? 0\n : targets.length - 1\n : (current + direction + targets.length) % targets.length\n const id = targets[nextIndex] as string\n focus(id)\n return id\n }\n\n function fullBounds(): Bounds {\n return { x: 0, y: 0, width: viewport.width, height: viewport.height }\n }\n\n function applyStage(id: string, build: (win: WindowState) => WindowState | null): boolean {\n const win = windows[id]\n if (!win) return false\n const next = build(win)\n if (!next) return false\n setWindow(next)\n queueEvent(() => emitter.emit('stage', { window: next, previous: win.stage }))\n commit()\n return true\n }\n\n function minimize(id: string): boolean {\n const result = applyStage(id, (win) => {\n if (win.stage === 'minimized') return null\n return { ...win, stage: 'minimized', restoreStage: win.stage }\n })\n if (result && focusedId === id) {\n const previous = focusedId\n focusTop()\n if (focusedId) emitFocus(windows[focusedId] as WindowState, previous)\n commit()\n }\n return result\n }\n\n function maximize(id: string): boolean {\n const result = applyStage(id, (win) => {\n if (win.stage === 'maximized') return null\n const restoreBounds = win.stage === 'normal' ? win.bounds : win.restoreBounds\n return {\n ...win,\n stage: 'maximized',\n snapZone: null,\n restoreBounds,\n restoreStage: null,\n bounds: fullBounds(),\n }\n })\n if (result) focus(id)\n return result\n }\n\n function toggleMaximize(id: string): boolean {\n const win = windows[id]\n if (!win) return false\n return win.stage === 'maximized' ? restore(id) : maximize(id)\n }\n\n function restore(id: string): boolean {\n const result = applyStage(id, (win) => {\n if (win.stage === 'minimized') {\n const target = win.restoreStage ?? 'normal'\n if (target === 'maximized') {\n return { ...win, stage: 'maximized', restoreStage: null, bounds: fullBounds() }\n }\n if (target === 'snapped' && win.snapZone) {\n return {\n ...win,\n stage: 'snapped',\n restoreStage: null,\n bounds: zoneBounds(win.snapZone, viewport),\n }\n }\n return { ...win, stage: 'normal', restoreStage: null }\n }\n if (win.stage === 'normal') return null\n const bounds = win.restoreBounds ?? win.bounds\n return {\n ...win,\n stage: 'normal',\n snapZone: null,\n restoreBounds: null,\n restoreStage: null,\n bounds: keepInViewport ? clampToViewport(bounds, viewport, minVisible) : bounds,\n }\n })\n if (result) focus(id)\n return result\n }\n\n function restoreTo(id: string, bounds: Bounds): boolean {\n const result = applyStage(id, (win) => {\n const size = normalizeSize(bounds, win)\n const next: Bounds = { x: bounds.x, y: bounds.y, ...size }\n return {\n ...win,\n stage: 'normal',\n snapZone: null,\n restoreBounds: null,\n restoreStage: null,\n bounds: keepInViewport ? clampToViewport(next, viewport, minVisible) : next,\n }\n })\n if (result) focus(id)\n return result\n }\n\n function snap(id: string, zone: SnapZone): boolean {\n const result = applyStage(id, (win) => {\n const restoreBounds = win.stage === 'normal' ? win.bounds : win.restoreBounds\n return {\n ...win,\n stage: 'snapped',\n snapZone: zone,\n restoreBounds,\n restoreStage: null,\n bounds: zoneBounds(zone, viewport),\n }\n })\n if (result) focus(id)\n return result\n }\n\n function move(id: string, x: number, y: number): boolean {\n const win = windows[id]\n if (win?.stage !== 'normal') return false\n let bounds: Bounds = { ...win.bounds, x, y }\n if (keepInViewport) bounds = clampToViewport(bounds, viewport, minVisible)\n if (boundsEqual(bounds, win.bounds)) return true\n const next = { ...win, bounds }\n setWindow(next)\n queueEvent(() => emitter.emit('move', { window: next }))\n commit()\n return true\n }\n\n function moveBy(id: string, dx: number, dy: number): boolean {\n const win = windows[id]\n if (!win) return false\n return move(id, win.bounds.x + dx, win.bounds.y + dy)\n }\n\n function resize(id: string, patch: Partial<Bounds>): boolean {\n const win = windows[id]\n if (!win || win.stage === 'maximized' || win.stage === 'minimized') return false\n const merged: Bounds = { ...win.bounds, ...patch }\n const size = normalizeSize(merged, win)\n let bounds: Bounds = { x: merged.x, y: merged.y, ...size }\n if (keepInViewport) bounds = clampToViewport(bounds, viewport, minVisible)\n const becameNormal = win.stage === 'snapped'\n if (boundsEqual(bounds, win.bounds) && !becameNormal) return true\n const next: WindowState = becameNormal\n ? { ...win, stage: 'normal', snapZone: null, restoreBounds: null, bounds }\n : { ...win, bounds }\n setWindow(next)\n if (becameNormal) queueEvent(() => emitter.emit('stage', { window: next, previous: 'snapped' }))\n queueEvent(() => emitter.emit('resize', { window: next }))\n commit()\n return true\n }\n\n function update(id: string, patch: WindowUpdate): boolean {\n const win = windows[id]\n if (!win) return false\n const next: WindowState = {\n ...win,\n title: patch.title ?? win.title,\n layer: patch.layer ?? win.layer,\n minSize: patch.minSize ?? win.minSize,\n maxSize: patch.maxSize === undefined ? win.maxSize : patch.maxSize,\n draggable: patch.draggable ?? win.draggable,\n resizable: patch.resizable ?? win.resizable,\n closable: patch.closable ?? win.closable,\n minimizable: patch.minimizable ?? win.minimizable,\n maximizable: patch.maximizable ?? win.maximizable,\n snappable: patch.snappable ?? win.snappable,\n meta: patch.meta ? { ...win.meta, ...patch.meta } : win.meta,\n }\n const size = normalizeSize(next.bounds, next)\n const resized = size.width !== next.bounds.width || size.height !== next.bounds.height\n const finalWin = resized ? { ...next, bounds: { ...next.bounds, ...size } } : next\n setWindow(finalWin)\n if (patch.layer && patch.layer !== win.layer) {\n order = sortByLayer(order)\n queueEvent(() => emitter.emit('order', { order }))\n if (patch.layer === 'modal' && topModalId() === id && focusedId !== id) {\n const previous = focusedId\n focusedId = id\n emitFocus(finalWin, previous)\n }\n }\n queueEvent(() => emitter.emit('update', { window: finalWin }))\n if (resized) queueEvent(() => emitter.emit('resize', { window: finalWin }))\n commit()\n return true\n }\n\n function setViewport(next: Size): void {\n if (next.width === viewport.width && next.height === viewport.height) return\n viewport = { ...next }\n transact(() => {\n for (const id of order) {\n const win = windows[id] as WindowState\n if (win.stage === 'maximized') {\n const updated = { ...win, bounds: fullBounds() }\n setWindow(updated)\n queueEvent(() => emitter.emit('resize', { window: updated }))\n } else if (win.stage === 'snapped' && win.snapZone) {\n const updated = { ...win, bounds: zoneBounds(win.snapZone, viewport) }\n setWindow(updated)\n queueEvent(() => emitter.emit('resize', { window: updated }))\n } else if (win.stage === 'normal' && keepInViewport) {\n const bounds = clampToViewport(win.bounds, viewport, minVisible)\n if (!boundsEqual(bounds, win.bounds)) {\n const updated = { ...win, bounds }\n setWindow(updated)\n queueEvent(() => emitter.emit('move', { window: updated }))\n }\n }\n }\n snapshot = null\n batchDirty = true\n })\n }\n\n function minimized(): readonly WindowState[] {\n return Object.values(windows)\n .filter((win) => win.stage === 'minimized')\n .sort((a, b) => a.openedSeq - b.openedSeq)\n }\n\n function transact<T>(run: () => T): T {\n batchDepth += 1\n try {\n return run()\n } finally {\n batchDepth -= 1\n if (batchDepth === 0 && batchDirty) {\n batchDirty = false\n snapshot = null\n flushEvents()\n emitter.emit('change', { state: getState() })\n }\n }\n }\n\n function serialize(): SerializedState {\n return {\n version: 1,\n windows: order\n .map((id) => windows[id] as WindowState)\n .map((win) => ({\n ...win,\n bounds: { ...win.bounds },\n restoreBounds: win.restoreBounds ? { ...win.restoreBounds } : null,\n minSize: { ...win.minSize },\n maxSize: win.maxSize\n ? {\n width: Number.isFinite(win.maxSize.width) ? win.maxSize.width : null,\n height: Number.isFinite(win.maxSize.height) ? win.maxSize.height : null,\n }\n : null,\n meta: { ...win.meta },\n })),\n order: [...order],\n focusedId,\n }\n }\n\n function isBounds(value: unknown): value is Bounds {\n if (typeof value !== 'object' || value === null) return false\n const bounds = value as Record<string, unknown>\n return (\n typeof bounds.x === 'number' &&\n typeof bounds.y === 'number' &&\n typeof bounds.width === 'number' &&\n typeof bounds.height === 'number'\n )\n }\n\n function isSize(value: unknown): value is Size {\n if (typeof value !== 'object' || value === null) return false\n const size = value as Record<string, unknown>\n return typeof size.width === 'number' && typeof size.height === 'number'\n }\n\n function isSizeAxis(value: unknown): value is number | null {\n return value === null || typeof value === 'number'\n }\n\n function readMaxSize(value: unknown): Size | null {\n if (typeof value !== 'object' || value === null) return null\n const size = value as Record<string, unknown>\n if (!isSizeAxis(size.width) || !isSizeAxis(size.height)) return null\n if (size.width === null && size.height === null) return null\n return {\n width: size.width ?? Number.POSITIVE_INFINITY,\n height: size.height ?? Number.POSITIVE_INFINITY,\n }\n }\n\n function isSerializedWindow(value: unknown): value is SerializedWindowState {\n if (typeof value !== 'object' || value === null) return false\n const win = value as Record<string, unknown>\n return (\n typeof win.id === 'string' &&\n win.id.length > 0 &&\n isBounds(win.bounds) &&\n STAGES.includes(win.stage as WindowStage) &&\n LAYERS.includes(win.layer as WindowLayer)\n )\n }\n\n function hydrate(data: SerializedState): boolean {\n if (typeof data !== 'object' || data === null) return false\n if (data.version !== 1 || !Array.isArray(data.windows)) return false\n if (!data.windows.every(isSerializedWindow)) return false\n\n const nextWindows: Record<string, WindowState> = {}\n let maxSeq = 0\n for (const raw of data.windows) {\n if (nextWindows[raw.id]) return false\n const win: WindowState = {\n id: raw.id,\n title: typeof raw.title === 'string' ? raw.title : 'Window',\n bounds: { ...raw.bounds },\n restoreBounds:\n raw.restoreBounds && isBounds(raw.restoreBounds) ? { ...raw.restoreBounds } : null,\n restoreStage: STAGES.includes(raw.restoreStage as WindowStage) ? raw.restoreStage : null,\n stage: raw.stage,\n snapZone: ZONES.includes(raw.snapZone as SnapZone) ? raw.snapZone : null,\n layer: raw.layer,\n minSize: isSize(raw.minSize) ? { ...raw.minSize } : { width: 160, height: 100 },\n maxSize: readMaxSize(raw.maxSize),\n openedSeq: typeof raw.openedSeq === 'number' ? raw.openedSeq : ++maxSeq,\n draggable: raw.draggable !== false,\n resizable: raw.resizable !== false,\n closable: raw.closable !== false,\n minimizable: raw.minimizable !== false,\n maximizable: raw.maximizable !== false,\n snappable: raw.snappable !== false,\n meta: raw.meta && typeof raw.meta === 'object' ? raw.meta : {},\n }\n maxSeq = Math.max(maxSeq, win.openedSeq)\n nextWindows[win.id] = win\n }\n\n const requestedOrder = Array.isArray(data.order) ? data.order : []\n const seen = new Set<string>()\n const nextOrder: string[] = []\n for (const id of requestedOrder) {\n if (typeof id === 'string' && nextWindows[id] && !seen.has(id)) {\n seen.add(id)\n nextOrder.push(id)\n }\n }\n for (const id of Object.keys(nextWindows)) {\n if (!seen.has(id)) nextOrder.push(id)\n }\n\n windows = nextWindows\n order = nextOrder\n order = sortByLayer(order)\n seq = maxSeq\n focusedId = data.focusedId && windows[data.focusedId] ? data.focusedId : null\n if (focusedId && windows[focusedId]?.stage === 'minimized') focusedId = null\n if (!focusedId) focusTop()\n const modal = topModalId()\n if (modal) {\n const focusedWin = focusedId ? (windows[focusedId] as WindowState) : null\n if (focusedWin?.layer !== 'modal') focusedId = modal\n }\n commit()\n return true\n }\n\n function destroy(): void {\n emitter.clear()\n }\n\n return {\n open: (init) => transact(() => open(init)),\n close: (id) => transact(() => close(id)),\n closeAll: () => transact(closeAll),\n focus: (id) => transact(() => focus(id)),\n blur: () => transact(blur),\n cycleFocus: (direction) => transact(() => cycleFocus(direction)),\n minimize: (id) => transact(() => minimize(id)),\n maximize: (id) => transact(() => maximize(id)),\n toggleMaximize: (id) => transact(() => toggleMaximize(id)),\n restore: (id) => transact(() => restore(id)),\n restoreTo: (id, bounds) => transact(() => restoreTo(id, bounds)),\n snap: (id, zone) => transact(() => snap(id, zone)),\n move: (id, x, y) => transact(() => move(id, x, y)),\n moveBy: (id, dx, dy) => transact(() => moveBy(id, dx, dy)),\n resize: (id, patch) => transact(() => resize(id, patch)),\n update: (id, patch) => transact(() => update(id, patch)),\n get: (id) => windows[id],\n getState,\n minimized,\n setViewport: (next) => transact(() => setViewport(next)),\n batch: (run) => transact(run),\n serialize,\n hydrate: (data) => transact(() => hydrate(data)),\n subscribe: (listener) => emitter.on('change', ({ state }) => listener(state)),\n on: (event, listener) => emitter.on(event, listener),\n destroy,\n }\n}\n","export function prefersReducedMotion(win: Window): boolean {\n return win.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\nexport interface FlipGhostOptions {\n duration?: number\n easing?: string\n}\n\nexport function flipToTarget(\n source: HTMLElement,\n target: Element,\n options: FlipGhostOptions = {},\n): void {\n const view = source.ownerDocument.defaultView\n if (!view || prefersReducedMotion(view)) return\n if (typeof source.animate !== 'function') return\n\n const from = source.getBoundingClientRect()\n const to = target.getBoundingClientRect()\n if (from.width === 0 || to.width === 0) return\n\n const ghost = source.ownerDocument.createElement('div')\n const style = view.getComputedStyle(source)\n ghost.style.cssText = `position:fixed;left:${from.left}px;top:${from.top}px;width:${from.width}px;height:${from.height}px;margin:0;pointer-events:none;z-index:2147483647;border-radius:${style.borderRadius};background:${style.backgroundColor};box-shadow:${style.boxShadow};transform-origin:top left;will-change:transform,opacity`\n source.ownerDocument.body.append(ghost)\n\n const dx = to.left + to.width / 2 - (from.left + from.width / 2)\n const dy = to.top + to.height / 2 - (from.top + from.height / 2)\n const scaleX = Math.max(to.width / from.width, 0.05)\n const scaleY = Math.max(to.height / from.height, 0.05)\n\n const animation = ghost.animate(\n [\n { transform: 'translate(0, 0) scale(1, 1)', opacity: 0.9 },\n { transform: `translate(${dx}px, ${dy}px) scale(${scaleX}, ${scaleY})`, opacity: 0.2 },\n ],\n {\n duration: options.duration ?? 260,\n easing: options.easing ?? 'cubic-bezier(0.32, 0.72, 0, 1)',\n },\n )\n animation.onfinish = () => ghost.remove()\n animation.oncancel = () => ghost.remove()\n}\n","import type { WindowManager } from '../core/types'\n\nexport interface AnnouncerMessages {\n opened(title: string): string\n closed(title: string): string\n minimized(title: string): string\n restored(title: string): string\n maximized(title: string): string\n snapped(title: string, zone: string): string\n focused(title: string): string\n}\n\nexport const defaultMessages: AnnouncerMessages = {\n opened: (title) => `${title} window opened`,\n closed: (title) => `${title} window closed`,\n minimized: (title) => `${title} minimized`,\n restored: (title) => `${title} restored`,\n maximized: (title) => `${title} maximized`,\n snapped: (title, zone) => `${title} snapped to ${zone.replace('-', ' ')}`,\n focused: (title) => `${title} focused`,\n}\n\nexport interface Announcer {\n element: HTMLElement\n announce(message: string): void\n destroy(): void\n}\n\nexport function createAnnouncer(\n wm: WindowManager,\n container: HTMLElement,\n messages: Partial<AnnouncerMessages> = {},\n): Announcer {\n const dict: AnnouncerMessages = { ...defaultMessages, ...messages }\n const element = container.ownerDocument.createElement('div')\n element.setAttribute('role', 'status')\n element.setAttribute('aria-live', 'polite')\n element.dataset.wmAnnouncer = ''\n element.style.cssText =\n 'position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0'\n container.append(element)\n\n let clearTimer: ReturnType<typeof setTimeout> | undefined\n\n function announce(message: string): void {\n element.textContent = message\n if (clearTimer !== undefined) clearTimeout(clearTimer)\n clearTimer = setTimeout(() => {\n element.textContent = ''\n }, 2000)\n }\n\n const unsubscribers = [\n wm.on('open', ({ window: win }) => announce(dict.opened(win.title))),\n wm.on('close', ({ window: win }) => announce(dict.closed(win.title))),\n wm.on('stage', ({ window: win, previous }) => {\n if (win.stage === 'minimized') announce(dict.minimized(win.title))\n else if (win.stage === 'maximized') announce(dict.maximized(win.title))\n else if (win.stage === 'snapped' && win.snapZone)\n announce(dict.snapped(win.title, win.snapZone))\n else if (win.stage === 'normal' && previous !== 'normal') announce(dict.restored(win.title))\n }),\n ]\n\n return {\n element,\n announce,\n destroy() {\n for (const unsubscribe of unsubscribers) unsubscribe()\n if (clearTimer !== undefined) clearTimeout(clearTimer)\n element.remove()\n },\n }\n}\n","import { clamp, detectSnapZone, type SnapDetectOptions, zoneBounds } from '../core/geometry'\nimport type { Bounds, SnapZone, WindowManager, WindowStage, WindowState } from '../core/types'\nimport { flipToTarget } from './animate'\nimport { type Announcer, type AnnouncerMessages, createAnnouncer } from './announcer'\n\nconst RESIZE_DIRECTIONS = ['n', 'e', 's', 'w', 'ne', 'nw', 'se', 'sw'] as const\ntype ResizeDirection = (typeof RESIZE_DIRECTIONS)[number]\n\nconst RESIZE_CURSORS: Record<ResizeDirection, string> = {\n n: 'ns-resize',\n s: 'ns-resize',\n e: 'ew-resize',\n w: 'ew-resize',\n ne: 'nesw-resize',\n sw: 'nesw-resize',\n nw: 'nwse-resize',\n se: 'nwse-resize',\n}\n\nconst INTERACTIVE_SELECTOR =\n 'button, input, select, textarea, a[href], [contenteditable], [data-wm-close], [data-wm-minimize], [data-wm-maximize]'\n\nexport interface DesktopSnapOptions extends SnapDetectOptions {\n preview?: boolean\n topEdge?: 'maximize' | 'top' | 'none'\n}\n\nexport interface DesktopKeyboardOptions {\n moveStep?: number\n cycle?: boolean\n}\n\nexport interface DesktopOptions {\n snap?: boolean | DesktopSnapOptions\n keyboard?: boolean | DesktopKeyboardOptions\n announce?: boolean | Partial<AnnouncerMessages>\n autoViewport?: boolean\n minimizeTarget?: (window: WindowState) => Element | null\n}\n\nexport interface WindowAttachOptions {\n handle?: HTMLElement | string\n resizeHandles?: boolean\n}\n\nexport interface DesktopController {\n element: HTMLElement\n wm: WindowManager\n attachWindow(id: string, element: HTMLElement, options?: WindowAttachOptions): () => void\n destroy(): void\n}\n\ninterface AttachedWindow {\n element: HTMLElement\n handle: HTMLElement | null\n handles: HTMLElement[]\n lastState: WindowState | null\n cleanup: Array<() => void>\n}\n\ninterface DragSession {\n id: string\n pointerId: number\n grabDX: number\n grabDY: number\n grabRatio: number\n startBounds: Bounds\n startStage: WindowStage\n startZone: SnapZone | null\n startRestoreBounds: Bounds | null\n restored: boolean\n moved: boolean\n zone: SnapZone | 'maximize' | null\n raf: number\n pendingX: number\n pendingY: number\n hasPending: boolean\n finish(cancelled: boolean): void\n}\n\nfunction windowOf(element: HTMLElement): Window {\n const view = element.ownerDocument.defaultView\n if (!view) throw new Error('wmkit: desktop element is not attached to a document')\n return view\n}\n\nexport function attachDesktop(\n wm: WindowManager,\n element: HTMLElement,\n options: DesktopOptions = {},\n): DesktopController {\n const doc = element.ownerDocument\n const view = windowOf(element)\n\n const snapEnabled = options.snap !== false\n const snapOptions: DesktopSnapOptions = typeof options.snap === 'object' ? options.snap : {}\n const snapPreviewEnabled = snapOptions.preview !== false\n const topEdge = snapOptions.topEdge ?? 'maximize'\n const keyboardEnabled = options.keyboard !== false\n const keyboardOptions: DesktopKeyboardOptions =\n typeof options.keyboard === 'object' ? options.keyboard : {}\n const moveStep = keyboardOptions.moveStep ?? 16\n const cycleEnabled = keyboardOptions.cycle !== false\n\n element.dataset.wmDesktop = ''\n if (view.getComputedStyle(element).position === 'static') {\n element.style.position = 'relative'\n }\n\n const registry = new Map<string, AttachedWindow>()\n const cleanup: Array<() => void> = []\n let lastOrder: readonly string[] | null = null\n let lastFocused: string | null = null\n let drag: DragSession | null = null\n\n let announcer: Announcer | null = null\n if (options.announce !== false) {\n announcer = createAnnouncer(\n wm,\n element,\n typeof options.announce === 'object' ? options.announce : {},\n )\n cleanup.push(() => announcer?.destroy())\n }\n\n let preview: HTMLElement | null = null\n function showPreview(bounds: Bounds): void {\n if (!snapPreviewEnabled) return\n if (!preview) {\n preview = doc.createElement('div')\n preview.dataset.wmSnapPreview = ''\n preview.style.cssText =\n 'position:absolute;left:0;top:0;pointer-events:none;display:none;z-index:2147483646'\n element.append(preview)\n }\n preview.style.display = 'block'\n preview.style.transform = `translate3d(${bounds.x}px, ${bounds.y}px, 0)`\n preview.style.width = `${bounds.width}px`\n preview.style.height = `${bounds.height}px`\n }\n\n function hidePreview(): void {\n if (preview) preview.style.display = 'none'\n }\n\n if (options.autoViewport !== false) {\n const applyViewport = () =>\n wm.setViewport({ width: element.clientWidth, height: element.clientHeight })\n applyViewport()\n const observer = new ResizeObserver(applyViewport)\n observer.observe(element)\n cleanup.push(() => observer.disconnect())\n }\n\n function syncWindow(attached: AttachedWindow, win: WindowState, zIndex: number): void {\n const el = attached.element\n const firstSync = attached.lastState === null\n if (firstSync) el.style.transition = 'none'\n if (attached.lastState !== win) {\n el.style.transform = `translate3d(${win.bounds.x}px, ${win.bounds.y}px, 0)`\n el.style.width = `${win.bounds.width}px`\n el.style.height = `${win.bounds.height}px`\n el.dataset.wmStage = win.stage\n el.dataset.wmLayer = win.layer\n el.hidden = win.stage === 'minimized'\n el.setAttribute('aria-label', win.title)\n if (win.layer === 'modal') el.setAttribute('aria-modal', 'true')\n else el.removeAttribute('aria-modal')\n for (const handle of attached.handles) {\n handle.style.display = win.resizable && win.stage === 'normal' ? '' : 'none'\n }\n attached.lastState = win\n }\n el.style.zIndex = String(zIndex + 1)\n if (firstSync) {\n void el.offsetWidth\n el.style.transition = ''\n }\n }\n\n function syncAll(): void {\n const state = wm.getState()\n const orderChanged = state.order !== lastOrder\n state.order.forEach((id, index) => {\n const attached = registry.get(id)\n const win = state.windows[id]\n if (!attached || !win) return\n if (orderChanged || attached.lastState !== win) syncWindow(attached, win, index)\n })\n if (state.focusedId !== lastFocused) {\n if (lastFocused) {\n const prev = registry.get(lastFocused)\n if (prev) delete prev.element.dataset.wmFocused\n }\n if (state.focusedId) {\n const next = registry.get(state.focusedId)\n if (next) next.element.dataset.wmFocused = ''\n }\n lastFocused = state.focusedId\n }\n lastOrder = state.order\n }\n\n cleanup.push(wm.subscribe(syncAll))\n\n cleanup.push(\n wm.on('focus', ({ window: win }) => {\n const attached = registry.get(win.id)\n if (!attached) return\n if (!attached.element.contains(doc.activeElement)) {\n attached.element.focus({ preventScroll: true })\n }\n }),\n )\n\n cleanup.push(\n wm.on('modalblocked', ({ window: win }) => {\n const attached = registry.get(win.id)\n if (!attached) return\n delete attached.element.dataset.wmFlash\n void attached.element.offsetWidth\n attached.element.dataset.wmFlash = ''\n }),\n )\n\n cleanup.push(\n wm.on('stage', ({ window: win, previous }) => {\n if (win.stage !== 'minimized' || previous === 'minimized') return\n const attached = registry.get(win.id)\n const target = options.minimizeTarget?.(win)\n if (attached && target) flipToTarget(attached.element, target)\n }),\n )\n\n if (keyboardEnabled && cycleEnabled) {\n const onDesktopKeydown = (event: KeyboardEvent) => {\n if (event.key === 'F6') {\n event.preventDefault()\n wm.cycleFocus(event.shiftKey ? -1 : 1)\n }\n }\n element.addEventListener('keydown', onDesktopKeydown)\n cleanup.push(() => element.removeEventListener('keydown', onDesktopKeydown))\n }\n\n function desktopPoint(event: PointerEvent): { x: number; y: number } {\n const rect = element.getBoundingClientRect()\n return { x: event.clientX - rect.left, y: event.clientY - rect.top }\n }\n\n function endDrag(cancelled: boolean): void {\n if (drag) drag.finish(cancelled)\n }\n\n function startDrag(id: string, handle: HTMLElement, event: PointerEvent): void {\n const win = wm.get(id)\n if (!win?.draggable || event.button !== 0 || drag) return\n const target = event.target as Element | null\n if (target?.closest(INTERACTIVE_SELECTOR)) return\n event.preventDefault()\n\n const point = desktopPoint(event)\n const startBounds = win.bounds\n const session: DragSession = {\n id,\n pointerId: event.pointerId,\n grabDX: point.x - startBounds.x,\n grabDY: point.y - startBounds.y,\n grabRatio: clamp((point.x - startBounds.x) / startBounds.width, 0.05, 0.95),\n startBounds,\n startStage: win.stage,\n startZone: win.snapZone,\n startRestoreBounds: win.restoreBounds,\n restored: win.stage === 'normal',\n moved: false,\n zone: null,\n raf: 0,\n pendingX: 0,\n pendingY: 0,\n hasPending: false,\n finish: () => {},\n }\n\n const attached = registry.get(id)\n const el = attached?.element\n\n function flush(): void {\n if (!session.hasPending || drag !== session) return\n session.hasPending = false\n session.raf = 0\n const current = wm.get(id)\n if (!current) return\n\n if (!session.restored) {\n const source = current.restoreBounds ?? session.startBounds\n const width = source.width\n const height = source.height\n wm.restoreTo(id, {\n x: session.pendingX - width * session.grabRatio,\n y: session.pendingY - Math.min(session.grabDY, 24),\n width,\n height,\n })\n session.restored = true\n const restoredWin = wm.get(id)\n if (restoredWin) {\n session.grabDX = session.pendingX - restoredWin.bounds.x\n session.grabDY = session.pendingY - restoredWin.bounds.y\n }\n return\n }\n\n wm.move(id, session.pendingX - session.grabDX, session.pendingY - session.grabDY)\n\n if (snapEnabled && current.snappable) {\n const viewport = wm.getState().viewport\n const rawZone = detectSnapZone(session.pendingX, session.pendingY, viewport, snapOptions)\n let zone: DragSession['zone'] = rawZone\n if (rawZone === 'top') {\n if (topEdge === 'maximize') zone = current.maximizable ? 'maximize' : null\n else if (topEdge === 'none') zone = null\n }\n session.zone = zone\n if (zone) {\n showPreview(\n zone === 'maximize'\n ? { x: 0, y: 0, width: viewport.width, height: viewport.height }\n : zoneBounds(zone, viewport),\n )\n } else {\n hidePreview()\n }\n }\n }\n\n function onMove(moveEvent: PointerEvent): void {\n if (moveEvent.pointerId !== session.pointerId) return\n const movePoint = desktopPoint(moveEvent)\n if (!session.moved) {\n const travelled =\n Math.abs(movePoint.x - (session.startBounds.x + session.grabDX)) +\n Math.abs(movePoint.y - (session.startBounds.y + session.grabDY))\n if (travelled < 3 && session.restored) return\n session.moved = true\n if (el) el.dataset.wmDragging = ''\n }\n session.pendingX = movePoint.x\n session.pendingY = movePoint.y\n session.hasPending = true\n if (session.raf === 0) session.raf = view.requestAnimationFrame(flush)\n }\n\n function onUp(upEvent: PointerEvent): void {\n if (upEvent.pointerId !== session.pointerId) return\n finish(false)\n }\n\n function onCancel(cancelEvent: PointerEvent): void {\n if (cancelEvent.pointerId !== session.pointerId) return\n finish(true)\n }\n\n function onKeydown(keyEvent: KeyboardEvent): void {\n if (keyEvent.key === 'Escape') {\n keyEvent.preventDefault()\n finish(true)\n }\n }\n\n function finish(cancelled: boolean): void {\n if (drag !== session) return\n if (session.raf !== 0) view?.cancelAnimationFrame(session.raf)\n if (session.hasPending && !cancelled) flush()\n drag = null\n handle.removeEventListener('pointermove', onMove)\n handle.removeEventListener('pointerup', onUp)\n handle.removeEventListener('pointercancel', onCancel)\n doc.removeEventListener('keydown', onKeydown, true)\n if (handle.hasPointerCapture(session.pointerId)) {\n handle.releasePointerCapture(session.pointerId)\n }\n if (el) delete el.dataset.wmDragging\n hidePreview()\n\n if (cancelled) {\n if (session.moved && session.restored) {\n if (session.startStage === 'maximized') {\n wm.restoreTo(id, session.startRestoreBounds ?? session.startBounds)\n wm.maximize(id)\n } else if (session.startStage === 'snapped' && session.startZone) {\n wm.restoreTo(id, session.startRestoreBounds ?? session.startBounds)\n wm.snap(id, session.startZone)\n } else {\n wm.move(id, session.startBounds.x, session.startBounds.y)\n }\n }\n return\n }\n if (session.moved && session.zone) {\n if (session.zone === 'maximize') wm.maximize(id)\n else wm.snap(id, session.zone)\n }\n }\n\n session.finish = finish\n drag = session\n handle.setPointerCapture(event.pointerId)\n handle.addEventListener('pointermove', onMove)\n handle.addEventListener('pointerup', onUp)\n handle.addEventListener('pointercancel', onCancel)\n doc.addEventListener('keydown', onKeydown, true)\n }\n\n function startResize(id: string, direction: ResizeDirection, event: PointerEvent): void {\n const win = wm.get(id)\n if (!win?.resizable || event.button !== 0 || drag) return\n event.preventDefault()\n event.stopPropagation()\n\n const handleEl = event.currentTarget as HTMLElement\n const startPoint = desktopPoint(event)\n const start = win.bounds\n const minSize = win.minSize\n const maxSize = win.maxSize\n let raf = 0\n let pendingX = 0\n let pendingY = 0\n let hasPending = false\n const attached = registry.get(id)\n if (attached) attached.element.dataset.wmResizing = direction\n\n function clampWidth(width: number): number {\n return clamp(width, minSize.width, maxSize ? maxSize.width : Number.POSITIVE_INFINITY)\n }\n\n function clampHeight(height: number): number {\n return clamp(height, minSize.height, maxSize ? maxSize.height : Number.POSITIVE_INFINITY)\n }\n\n function flush(): void {\n if (!hasPending) return\n hasPending = false\n raf = 0\n const dx = pendingX - startPoint.x\n const dy = pendingY - startPoint.y\n const next: Bounds = { ...start }\n if (direction.includes('e')) next.width = clampWidth(start.width + dx)\n if (direction.includes('s')) next.height = clampHeight(start.height + dy)\n if (direction.includes('w')) {\n next.width = clampWidth(start.width - dx)\n next.x = start.x + (start.width - next.width)\n }\n if (direction.includes('n')) {\n next.height = clampHeight(start.height - dy)\n next.y = start.y + (start.height - next.height)\n }\n wm.resize(id, next)\n }\n\n function onMove(moveEvent: PointerEvent): void {\n if (moveEvent.pointerId !== event.pointerId) return\n const movePoint = desktopPoint(moveEvent)\n pendingX = movePoint.x\n pendingY = movePoint.y\n hasPending = true\n if (raf === 0) raf = view?.requestAnimationFrame(flush) ?? 0\n }\n\n function finish(cancelled: boolean): void {\n if (raf !== 0) view?.cancelAnimationFrame(raf)\n if (hasPending && !cancelled) flush()\n handleEl.removeEventListener('pointermove', onMove)\n handleEl.removeEventListener('pointerup', onUp)\n handleEl.removeEventListener('pointercancel', onCancelPointer)\n doc.removeEventListener('keydown', onKeydown, true)\n if (handleEl.hasPointerCapture(event.pointerId)) {\n handleEl.releasePointerCapture(event.pointerId)\n }\n if (attached) delete attached.element.dataset.wmResizing\n if (cancelled) wm.resize(id, start)\n }\n\n function onUp(upEvent: PointerEvent): void {\n if (upEvent.pointerId !== event.pointerId) return\n finish(false)\n }\n\n function onCancelPointer(cancelEvent: PointerEvent): void {\n if (cancelEvent.pointerId !== event.pointerId) return\n finish(true)\n }\n\n function onKeydown(keyEvent: KeyboardEvent): void {\n if (keyEvent.key === 'Escape') {\n keyEvent.preventDefault()\n finish(true)\n }\n }\n\n handleEl.setPointerCapture(event.pointerId)\n handleEl.addEventListener('pointermove', onMove)\n handleEl.addEventListener('pointerup', onUp)\n handleEl.addEventListener('pointercancel', onCancelPointer)\n doc.addEventListener('keydown', onKeydown, true)\n }\n\n function attachWindow(\n id: string,\n windowElement: HTMLElement,\n windowOptions: WindowAttachOptions = {},\n ): () => void {\n const win = wm.get(id)\n if (!win) throw new Error(`wmkit: cannot attach unknown window \"${id}\"`)\n if (registry.has(id)) throw new Error(`wmkit: window \"${id}\" is already attached`)\n\n const attached: AttachedWindow = {\n element: windowElement,\n handle: null,\n handles: [],\n lastState: null,\n cleanup: [],\n }\n\n windowElement.dataset.wmWindow = id\n windowElement.setAttribute('role', 'dialog')\n windowElement.tabIndex = -1\n windowElement.style.position = 'absolute'\n windowElement.style.left = '0'\n windowElement.style.top = '0'\n\n const titleEl = windowElement.querySelector('[data-wm-title]')\n if (titleEl) {\n if (!titleEl.id) titleEl.id = `wmkit-title-${id}`\n windowElement.setAttribute('aria-labelledby', titleEl.id)\n }\n\n const handle =\n typeof windowOptions.handle === 'string'\n ? windowElement.querySelector<HTMLElement>(windowOptions.handle)\n : (windowOptions.handle ?? windowElement.querySelector<HTMLElement>('[data-wm-drag]'))\n attached.handle = handle\n\n const onPointerDownFocus = () => {\n wm.focus(id)\n }\n windowElement.addEventListener('pointerdown', onPointerDownFocus, true)\n attached.cleanup.push(() =>\n windowElement.removeEventListener('pointerdown', onPointerDownFocus, true),\n )\n\n const onClick = (event: MouseEvent) => {\n const target = event.target as Element | null\n if (!target) return\n const current = wm.get(id)\n if (!current) return\n if (target.closest('[data-wm-close]')) {\n if (current.closable) wm.close(id)\n } else if (target.closest('[data-wm-minimize]')) {\n if (current.minimizable) wm.minimize(id)\n } else if (target.closest('[data-wm-maximize]')) {\n if (current.maximizable) wm.toggleMaximize(id)\n }\n }\n windowElement.addEventListener('click', onClick)\n attached.cleanup.push(() => windowElement.removeEventListener('click', onClick))\n\n if (handle) {\n handle.style.touchAction = 'none'\n const onHandleDown = (event: PointerEvent) => startDrag(id, handle, event)\n handle.addEventListener('pointerdown', onHandleDown)\n attached.cleanup.push(() => handle.removeEventListener('pointerdown', onHandleDown))\n\n const onDoubleClick = (event: MouseEvent) => {\n const target = event.target as Element | null\n if (target?.closest(INTERACTIVE_SELECTOR)) return\n const current = wm.get(id)\n if (current?.maximizable) wm.toggleMaximize(id)\n }\n handle.addEventListener('dblclick', onDoubleClick)\n attached.cleanup.push(() => handle.removeEventListener('dblclick', onDoubleClick))\n }\n\n if (windowOptions.resizeHandles !== false) {\n for (const direction of RESIZE_DIRECTIONS) {\n const resizeHandle = doc.createElement('div')\n resizeHandle.dataset.wmResize = direction\n resizeHandle.setAttribute('aria-hidden', 'true')\n const base =\n 'position:absolute;touch-action:none;user-select:none;-webkit-user-select:none;'\n const size = 8\n const corner = 12\n const styles: Record<ResizeDirection, string> = {\n n: `top:${-size / 2}px;left:${corner}px;right:${corner}px;height:${size}px`,\n s: `bottom:${-size / 2}px;left:${corner}px;right:${corner}px;height:${size}px`,\n e: `right:${-size / 2}px;top:${corner}px;bottom:${corner}px;width:${size}px`,\n w: `left:${-size / 2}px;top:${corner}px;bottom:${corner}px;width:${size}px`,\n ne: `top:${-size / 2}px;right:${-size / 2}px;width:${corner}px;height:${corner}px`,\n nw: `top:${-size / 2}px;left:${-size / 2}px;width:${corner}px;height:${corner}px`,\n se: `bottom:${-size / 2}px;right:${-size / 2}px;width:${corner}px;height:${corner}px`,\n sw: `bottom:${-size / 2}px;left:${-size / 2}px;width:${corner}px;height:${corner}px`,\n }\n resizeHandle.style.cssText = `${base}${styles[direction]};cursor:${RESIZE_CURSORS[direction]}`\n const onResizeDown = (event: PointerEvent) => startResize(id, direction, event)\n resizeHandle.addEventListener('pointerdown', onResizeDown)\n attached.cleanup.push(() => resizeHandle.removeEventListener('pointerdown', onResizeDown))\n windowElement.append(resizeHandle)\n attached.handles.push(resizeHandle)\n }\n }\n\n const onWindowKeydown = (event: KeyboardEvent) => {\n const target = event.target as Element | null\n if (target?.closest(INTERACTIVE_SELECTOR)) return\n const current = wm.get(id)\n if (!current) return\n const arrows: Record<string, [number, number]> = {\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0],\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n }\n const vector = arrows[event.key]\n if (!vector || !keyboardEnabled) return\n event.preventDefault()\n const step = event.altKey ? 1 : moveStep\n const [dx, dy] = vector\n if (event.shiftKey) {\n if (current.resizable) {\n wm.resize(id, {\n width: current.bounds.width + dx * step,\n height: current.bounds.height + dy * step,\n })\n }\n } else if (current.draggable && current.stage === 'normal') {\n wm.moveBy(id, dx * step, dy * step)\n }\n }\n windowElement.addEventListener('keydown', onWindowKeydown)\n attached.cleanup.push(() => windowElement.removeEventListener('keydown', onWindowKeydown))\n\n const onModalTrap = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return\n const current = wm.get(id)\n if (current?.layer !== 'modal') return\n const focusables = windowElement.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n )\n if (focusables.length === 0) return\n const first = focusables[0]\n const last = focusables[focusables.length - 1]\n if (!first || !last) return\n if (event.shiftKey && doc.activeElement === first) {\n event.preventDefault()\n last.focus()\n } else if (!event.shiftKey && doc.activeElement === last) {\n event.preventDefault()\n first.focus()\n }\n }\n windowElement.addEventListener('keydown', onModalTrap)\n attached.cleanup.push(() => windowElement.removeEventListener('keydown', onModalTrap))\n\n registry.set(id, attached)\n lastOrder = null\n lastFocused = null\n syncAll()\n\n return () => {\n if (drag?.id === id) endDrag(true)\n for (const dispose of attached.cleanup) dispose()\n for (const resizeHandle of attached.handles) resizeHandle.remove()\n registry.delete(id)\n }\n }\n\n return {\n element,\n wm,\n attachWindow,\n destroy() {\n endDrag(true)\n for (const [, attached] of registry) {\n for (const dispose of attached.cleanup) dispose()\n for (const resizeHandle of attached.handles) resizeHandle.remove()\n }\n registry.clear()\n for (const dispose of cleanup) dispose()\n preview?.remove()\n delete element.dataset.wmDesktop\n },\n }\n}\n\nexport interface DesktopBinder {\n wm: WindowManager\n controller(): DesktopController | null\n bindDesktop(element: HTMLElement): () => void\n bindWindow(id: string, element: HTMLElement, options?: WindowAttachOptions): () => void\n}\n\ninterface PendingWindow {\n id: string\n element: HTMLElement\n options: WindowAttachOptions | undefined\n detach: (() => void) | null\n}\n\nexport function createDesktopBinder(\n wm: WindowManager,\n options: DesktopOptions = {},\n): DesktopBinder {\n let controller: DesktopController | null = null\n const entries = new Set<PendingWindow>()\n\n function attachEntry(entry: PendingWindow): void {\n if (controller && !entry.detach && wm.get(entry.id)) {\n entry.detach = controller.attachWindow(entry.id, entry.element, entry.options)\n }\n }\n\n wm.on('open', ({ window: win }) => {\n for (const entry of entries) {\n if (entry.id === win.id) attachEntry(entry)\n }\n })\n\n return {\n wm,\n controller: () => controller,\n bindDesktop(element) {\n if (controller) throw new Error('wmkit: desktop is already bound')\n controller = attachDesktop(wm, element, options)\n for (const entry of entries) attachEntry(entry)\n return () => {\n for (const entry of entries) entry.detach = null\n controller?.destroy()\n controller = null\n }\n },\n bindWindow(id, element, windowOptions) {\n const entry: PendingWindow = { id, element, options: windowOptions, detach: null }\n entries.add(entry)\n attachEntry(entry)\n return () => {\n entry.detach?.()\n entry.detach = null\n entries.delete(entry)\n }\n },\n }\n}\n"]}