@surdeddd/wmkit 0.7.2 → 0.9.0

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.
Files changed (91) hide show
  1. package/README.md +60 -3
  2. package/README.ru.md +60 -3
  3. package/dist/angular.cjs +4 -3
  4. package/dist/angular.cjs.map +1 -1
  5. package/dist/angular.d.cts +2 -1
  6. package/dist/angular.d.ts +2 -1
  7. package/dist/angular.js +2 -1
  8. package/dist/angular.js.map +1 -1
  9. package/dist/binder-DGoj0xG1.d.cts +13 -0
  10. package/dist/binder-Lo13iTVB.d.ts +13 -0
  11. package/dist/chrome.cjs +122 -0
  12. package/dist/chrome.cjs.map +1 -0
  13. package/dist/chrome.d.cts +25 -0
  14. package/dist/chrome.d.ts +25 -0
  15. package/dist/chrome.js +114 -0
  16. package/dist/chrome.js.map +1 -0
  17. package/dist/chunk-5XVIC5LH.js +140 -0
  18. package/dist/chunk-5XVIC5LH.js.map +1 -0
  19. package/dist/chunk-BDHFXEJN.cjs +149 -0
  20. package/dist/chunk-BDHFXEJN.cjs.map +1 -0
  21. package/dist/{chunk-NJAI5R4J.cjs → chunk-TUGQX3CX.js} +205 -175
  22. package/dist/chunk-TUGQX3CX.js.map +1 -0
  23. package/dist/{chunk-FOWW4LXS.js → chunk-ZWUVWRUS.cjs} +236 -178
  24. package/dist/chunk-ZWUVWRUS.cjs.map +1 -0
  25. package/dist/devtools.cjs +330 -0
  26. package/dist/devtools.cjs.map +1 -0
  27. package/dist/devtools.d.cts +43 -0
  28. package/dist/devtools.d.ts +43 -0
  29. package/dist/devtools.js +326 -0
  30. package/dist/devtools.js.map +1 -0
  31. package/dist/gestures.cjs +219 -0
  32. package/dist/gestures.cjs.map +1 -0
  33. package/dist/gestures.d.cts +19 -0
  34. package/dist/gestures.d.ts +19 -0
  35. package/dist/gestures.js +215 -0
  36. package/dist/gestures.js.map +1 -0
  37. package/dist/index.cjs +35 -34
  38. package/dist/index.d.cts +3 -2
  39. package/dist/index.d.ts +3 -2
  40. package/dist/index.js +2 -1
  41. package/dist/react.cjs +4 -3
  42. package/dist/react.cjs.map +1 -1
  43. package/dist/react.d.cts +2 -1
  44. package/dist/react.d.ts +2 -1
  45. package/dist/react.js +2 -1
  46. package/dist/react.js.map +1 -1
  47. package/dist/{binder-DvQFmO3K.d.ts → shared-BoHXlPCu.d.ts} +55 -8
  48. package/dist/{binder-_L3Iww0u.d.cts → shared-DdGFz3oy.d.cts} +55 -8
  49. package/dist/solid.cjs +4 -3
  50. package/dist/solid.cjs.map +1 -1
  51. package/dist/solid.d.cts +2 -1
  52. package/dist/solid.d.ts +2 -1
  53. package/dist/solid.js +2 -1
  54. package/dist/solid.js.map +1 -1
  55. package/dist/svelte.cjs +4 -3
  56. package/dist/svelte.cjs.map +1 -1
  57. package/dist/svelte.d.cts +2 -1
  58. package/dist/svelte.d.ts +2 -1
  59. package/dist/svelte.js +2 -1
  60. package/dist/svelte.js.map +1 -1
  61. package/dist/themes/amber.css +316 -0
  62. package/dist/themes/aqua.css +285 -0
  63. package/dist/themes/blueprint.css +303 -0
  64. package/dist/themes/brutalist.css +307 -0
  65. package/dist/themes/candy.css +277 -0
  66. package/dist/themes/carbon.css +297 -0
  67. package/dist/themes/forest.css +278 -0
  68. package/dist/themes/frost.css +279 -0
  69. package/dist/themes/glass.css +2 -1
  70. package/dist/themes/light.css +2 -1
  71. package/dist/themes/neon.css +289 -0
  72. package/dist/themes/noir.css +282 -0
  73. package/dist/themes/paper.css +258 -0
  74. package/dist/themes/retro.css +8 -0
  75. package/dist/themes/synth.css +283 -0
  76. package/dist/themes/terminal.css +273 -0
  77. package/dist/themes.cjs +8747 -0
  78. package/dist/themes.cjs.map +1 -0
  79. package/dist/themes.d.cts +12 -0
  80. package/dist/themes.d.ts +12 -0
  81. package/dist/themes.js +8742 -0
  82. package/dist/themes.js.map +1 -0
  83. package/dist/vue.cjs +4 -3
  84. package/dist/vue.cjs.map +1 -1
  85. package/dist/vue.d.cts +2 -1
  86. package/dist/vue.d.ts +2 -1
  87. package/dist/vue.js +2 -1
  88. package/dist/vue.js.map +1 -1
  89. package/package.json +80 -7
  90. package/dist/chunk-FOWW4LXS.js.map +0 -1
  91. package/dist/chunk-NJAI5R4J.cjs.map +0 -1
@@ -0,0 +1,19 @@
1
+ import { d as DesktopGesture } from './shared-BoHXlPCu.js';
2
+ import './types-jG2lHGcA.js';
3
+
4
+ interface PinchOptions {
5
+ threshold?: number;
6
+ lockTouchAction?: boolean;
7
+ }
8
+ interface SwipeOptions {
9
+ threshold?: number;
10
+ workspaces?: number;
11
+ }
12
+ declare function pinch(options?: PinchOptions): DesktopGesture;
13
+ declare function swipe(options?: SwipeOptions): DesktopGesture;
14
+ declare function touchGestures(options?: {
15
+ pinch?: PinchOptions;
16
+ swipe?: SwipeOptions;
17
+ }): DesktopGesture;
18
+
19
+ export { type PinchOptions, type SwipeOptions, pinch, swipe, touchGestures };
@@ -0,0 +1,215 @@
1
+ import { clampSize, applyAspect } from './chunk-5XVIC5LH.js';
2
+
3
+ // src/plugins/gestures.ts
4
+ function spreadOf(a, b) {
5
+ return Math.hypot(a.x - b.x, a.y - b.y);
6
+ }
7
+ function watch(ctx, options) {
8
+ const { wm, doc, view } = ctx;
9
+ const element = ctx.desktop;
10
+ const fingers = /* @__PURE__ */ new Map();
11
+ let armed = false;
12
+ let target = null;
13
+ let startSpread = 0;
14
+ let startMid = { x: 0, y: 0 };
15
+ let session = null;
16
+ let releaseRect = null;
17
+ let raf = 0;
18
+ let pending = null;
19
+ function windowIdAt(event) {
20
+ const host = event.target?.closest("[data-wm-window]");
21
+ return host?.dataset.wmWindow ?? null;
22
+ }
23
+ function pair() {
24
+ if (fingers.size !== 2) return null;
25
+ const [first, second] = [...fingers.values()];
26
+ return [first, second];
27
+ }
28
+ function disarm() {
29
+ armed = false;
30
+ target = null;
31
+ pending = null;
32
+ if (raf !== 0) {
33
+ view.cancelAnimationFrame(raf);
34
+ raf = 0;
35
+ }
36
+ }
37
+ function endPinch(cancelled) {
38
+ const active = session;
39
+ if (!active) return;
40
+ session = null;
41
+ if (cancelled) wm.resize(active.id, active.startBounds);
42
+ ctx.release(active);
43
+ releaseRect?.();
44
+ releaseRect = null;
45
+ const host = ctx.windowElement(active.id);
46
+ if (host) delete host.dataset.wmPinching;
47
+ if (cancelled) wm.abortInteraction();
48
+ else wm.endInteraction();
49
+ }
50
+ function beginPinch(id, mid) {
51
+ const win = wm.get(id);
52
+ if (!win) return;
53
+ const claimed = {
54
+ id,
55
+ finish: (cancelled) => endPinch(cancelled),
56
+ startBounds: win.bounds,
57
+ midX: mid.x,
58
+ midY: mid.y
59
+ };
60
+ session = claimed;
61
+ ctx.claim(claimed);
62
+ wm.beginInteraction();
63
+ releaseRect = ctx.trackRect();
64
+ const host = ctx.windowElement(id);
65
+ if (host) host.dataset.wmPinching = "";
66
+ }
67
+ function applyPinch(active, win, spread) {
68
+ const start = active.startBounds;
69
+ const ratio = spread / startSpread;
70
+ const raw = { width: start.width * ratio, height: start.height * ratio };
71
+ const size = win.aspectRatio === null ? clampSize(raw, win.minSize, win.maxSize) : applyAspect(raw, win.aspectRatio, win.minSize, win.maxSize, "width");
72
+ const sx = size.width / start.width;
73
+ const sy = size.height / start.height;
74
+ wm.resize(active.id, {
75
+ x: active.midX - (active.midX - start.x) * sx,
76
+ y: active.midY - (active.midY - start.y) * sy,
77
+ ...size
78
+ });
79
+ }
80
+ function flush() {
81
+ raf = 0;
82
+ const points = pending;
83
+ pending = null;
84
+ if (!points) return;
85
+ const [a, b] = points;
86
+ const spread = spreadOf(a, b);
87
+ const mid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };
88
+ const pinch2 = options.pinch;
89
+ if (session) {
90
+ const win = wm.get(session.id);
91
+ if (win) applyPinch(session, win, spread);
92
+ return;
93
+ }
94
+ if (pinch2 !== null && target !== null && Math.abs(spread - startSpread) > pinch2.threshold) {
95
+ const win = wm.get(target);
96
+ if (!win) return;
97
+ beginPinch(target, startMid);
98
+ if (session) applyPinch(session, win, spread);
99
+ return;
100
+ }
101
+ const swipe2 = options.swipe;
102
+ if (swipe2 === null) return;
103
+ const dx = mid.x - startMid.x;
104
+ const dy = mid.y - startMid.y;
105
+ if (Math.abs(dx) < swipe2.threshold || Math.abs(dx) <= 2 * Math.abs(dy)) return;
106
+ disarm();
107
+ const next = wm.workspace() + (dx < 0 ? 1 : -1);
108
+ if (swipe2.workspaces > 0 && next > swipe2.workspaces - 1) return;
109
+ wm.setWorkspace(next);
110
+ }
111
+ function onDown(event) {
112
+ if (event.pointerType !== "touch") return;
113
+ if (fingers.size >= 2) {
114
+ disarm();
115
+ return;
116
+ }
117
+ fingers.set(event.pointerId, { point: ctx.toLocal(event), windowId: windowIdAt(event) });
118
+ const both = pair();
119
+ if (!both) return;
120
+ if (ctx.busy()) return;
121
+ const [first, second] = both;
122
+ startSpread = spreadOf(first.point, second.point);
123
+ if (startSpread === 0) return;
124
+ startMid = {
125
+ x: (first.point.x + second.point.x) / 2,
126
+ y: (first.point.y + second.point.y) / 2
127
+ };
128
+ const shared = first.windowId === second.windowId ? first.windowId : null;
129
+ const state = shared === null ? void 0 : wm.get(shared);
130
+ target = state?.resizable && state.stage === "normal" ? state.id : null;
131
+ armed = true;
132
+ }
133
+ function onMove(event) {
134
+ const finger = fingers.get(event.pointerId);
135
+ if (!finger) return;
136
+ finger.point = ctx.toLocal(event);
137
+ if (!armed) return;
138
+ const both = pair();
139
+ if (!both) return;
140
+ pending = [both[0].point, both[1].point];
141
+ if (raf === 0) raf = view.requestAnimationFrame(flush);
142
+ }
143
+ function onRelease(event) {
144
+ if (!fingers.delete(event.pointerId)) return;
145
+ if (pending) {
146
+ if (raf !== 0) {
147
+ view.cancelAnimationFrame(raf);
148
+ raf = 0;
149
+ }
150
+ flush();
151
+ }
152
+ if (session) endPinch(false);
153
+ disarm();
154
+ }
155
+ function onCancel(event) {
156
+ if (!fingers.delete(event.pointerId)) return;
157
+ if (session) endPinch(true);
158
+ disarm();
159
+ }
160
+ function onKeydown(event) {
161
+ if (event.key !== "Escape" || !session) return;
162
+ event.preventDefault();
163
+ endPinch(true);
164
+ disarm();
165
+ }
166
+ const previousTouchAction = element.style.touchAction;
167
+ if (options.pinch) {
168
+ element.style.touchAction = options.pinch.lockTouchAction ? "none" : "pan-x pan-y";
169
+ }
170
+ element.addEventListener("pointerdown", onDown);
171
+ element.addEventListener("pointermove", onMove);
172
+ element.addEventListener("pointerup", onRelease);
173
+ element.addEventListener("pointercancel", onCancel);
174
+ doc.addEventListener("keydown", onKeydown, true);
175
+ return () => {
176
+ if (session) endPinch(true);
177
+ disarm();
178
+ fingers.clear();
179
+ element.style.touchAction = previousTouchAction;
180
+ element.removeEventListener("pointerdown", onDown);
181
+ element.removeEventListener("pointermove", onMove);
182
+ element.removeEventListener("pointerup", onRelease);
183
+ element.removeEventListener("pointercancel", onCancel);
184
+ doc.removeEventListener("keydown", onKeydown, true);
185
+ };
186
+ }
187
+ function pinch(options = {}) {
188
+ const settings = {
189
+ threshold: options.threshold ?? 12,
190
+ lockTouchAction: options.lockTouchAction === true
191
+ };
192
+ return (ctx) => watch(ctx, { pinch: settings, swipe: null });
193
+ }
194
+ function swipe(options = {}) {
195
+ const settings = {
196
+ threshold: options.threshold ?? 72,
197
+ workspaces: options.workspaces ?? 0
198
+ };
199
+ return (ctx) => watch(ctx, { pinch: null, swipe: settings });
200
+ }
201
+ function touchGestures(options = {}) {
202
+ const pinchSettings = {
203
+ threshold: options.pinch?.threshold ?? 12,
204
+ lockTouchAction: options.pinch?.lockTouchAction === true
205
+ };
206
+ const swipeSettings = {
207
+ threshold: options.swipe?.threshold ?? 72,
208
+ workspaces: options.swipe?.workspaces ?? 0
209
+ };
210
+ return (ctx) => watch(ctx, { pinch: pinchSettings, swipe: swipeSettings });
211
+ }
212
+
213
+ export { pinch, swipe, touchGestures };
214
+ //# sourceMappingURL=gestures.js.map
215
+ //# sourceMappingURL=gestures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/gestures.ts"],"names":["pinch","swipe"],"mappings":"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","file":"gestures.js","sourcesContent":["import { applyAspect, clampSize } from '../core/geometry'\nimport type { Bounds, Size, WindowState } from '../core/types'\nimport type { ActiveGesture, DesktopGesture, GestureContext, Point } from '../dom/shared'\n\nexport interface PinchOptions {\n threshold?: number\n lockTouchAction?: boolean\n}\n\nexport interface SwipeOptions {\n threshold?: number\n workspaces?: number\n}\n\ninterface Finger {\n point: Point\n windowId: string | null\n}\n\ninterface PinchSession extends ActiveGesture {\n startBounds: Bounds\n midX: number\n midY: number\n}\n\nfunction spreadOf(a: Point, b: Point): number {\n return Math.hypot(a.x - b.x, a.y - b.y)\n}\n\nfunction watch(\n ctx: GestureContext,\n options: { pinch: Required<PinchOptions> | null; swipe: Required<SwipeOptions> | null },\n): () => void {\n const { wm, doc, view } = ctx\n const element = ctx.desktop\n const fingers = new Map<number, Finger>()\n let armed = false\n let target: string | null = null\n let startSpread = 0\n let startMid: Point = { x: 0, y: 0 }\n let session: PinchSession | null = null\n let releaseRect: (() => void) | null = null\n let raf = 0\n let pending: [Point, Point] | null = null\n\n function windowIdAt(event: PointerEvent): string | null {\n const host = (event.target as Element | null)?.closest<HTMLElement>('[data-wm-window]')\n return host?.dataset.wmWindow ?? null\n }\n\n function pair(): [Finger, Finger] | null {\n if (fingers.size !== 2) return null\n const [first, second] = [...fingers.values()] as [Finger, Finger]\n return [first, second]\n }\n\n function disarm(): void {\n armed = false\n target = null\n pending = null\n if (raf !== 0) {\n view.cancelAnimationFrame(raf)\n raf = 0\n }\n }\n\n function endPinch(cancelled: boolean): void {\n const active = session\n if (!active) return\n session = null\n if (cancelled) wm.resize(active.id, active.startBounds)\n ctx.release(active)\n releaseRect?.()\n releaseRect = null\n const host = ctx.windowElement(active.id)\n if (host) delete host.dataset.wmPinching\n if (cancelled) wm.abortInteraction()\n else wm.endInteraction()\n }\n\n function beginPinch(id: string, mid: Point): void {\n const win = wm.get(id)\n if (!win) return\n const claimed: PinchSession = {\n id,\n finish: (cancelled: boolean) => endPinch(cancelled),\n startBounds: win.bounds,\n midX: mid.x,\n midY: mid.y,\n }\n session = claimed\n ctx.claim(claimed)\n wm.beginInteraction()\n releaseRect = ctx.trackRect()\n const host = ctx.windowElement(id)\n if (host) host.dataset.wmPinching = ''\n }\n\n function applyPinch(active: PinchSession, win: WindowState, spread: number): void {\n const start = active.startBounds\n const ratio = spread / startSpread\n const raw: Size = { width: start.width * ratio, height: start.height * ratio }\n const size =\n win.aspectRatio === null\n ? clampSize(raw, win.minSize, win.maxSize)\n : applyAspect(raw, win.aspectRatio, win.minSize, win.maxSize, 'width')\n const sx = size.width / start.width\n const sy = size.height / start.height\n wm.resize(active.id, {\n x: active.midX - (active.midX - start.x) * sx,\n y: active.midY - (active.midY - start.y) * sy,\n ...size,\n })\n }\n\n function flush(): void {\n raf = 0\n const points = pending\n pending = null\n if (!points) return\n const [a, b] = points\n const spread = spreadOf(a, b)\n const mid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 }\n const pinch = options.pinch\n\n if (session) {\n const win = wm.get(session.id)\n if (win) applyPinch(session, win, spread)\n return\n }\n if (pinch !== null && target !== null && Math.abs(spread - startSpread) > pinch.threshold) {\n const win = wm.get(target)\n if (!win) return\n beginPinch(target, startMid)\n if (session) applyPinch(session, win, spread)\n return\n }\n const swipe = options.swipe\n if (swipe === null) return\n const dx = mid.x - startMid.x\n const dy = mid.y - startMid.y\n if (Math.abs(dx) < swipe.threshold || Math.abs(dx) <= 2 * Math.abs(dy)) return\n disarm()\n const next = wm.workspace() + (dx < 0 ? 1 : -1)\n if (swipe.workspaces > 0 && next > swipe.workspaces - 1) return\n wm.setWorkspace(next)\n }\n\n function onDown(event: PointerEvent): void {\n if (event.pointerType !== 'touch') return\n if (fingers.size >= 2) {\n disarm()\n return\n }\n fingers.set(event.pointerId, { point: ctx.toLocal(event), windowId: windowIdAt(event) })\n const both = pair()\n if (!both) return\n if (ctx.busy()) return\n const [first, second] = both\n startSpread = spreadOf(first.point, second.point)\n if (startSpread === 0) return\n startMid = {\n x: (first.point.x + second.point.x) / 2,\n y: (first.point.y + second.point.y) / 2,\n }\n const shared = first.windowId === second.windowId ? first.windowId : null\n const state = shared === null ? undefined : wm.get(shared)\n target = state?.resizable && state.stage === 'normal' ? state.id : null\n armed = true\n }\n\n function onMove(event: PointerEvent): void {\n const finger = fingers.get(event.pointerId)\n if (!finger) return\n finger.point = ctx.toLocal(event)\n if (!armed) return\n const both = pair()\n if (!both) return\n pending = [both[0].point, both[1].point]\n if (raf === 0) raf = view.requestAnimationFrame(flush)\n }\n\n function onRelease(event: PointerEvent): void {\n if (!fingers.delete(event.pointerId)) return\n if (pending) {\n if (raf !== 0) {\n view.cancelAnimationFrame(raf)\n raf = 0\n }\n flush()\n }\n if (session) endPinch(false)\n disarm()\n }\n\n function onCancel(event: PointerEvent): void {\n if (!fingers.delete(event.pointerId)) return\n if (session) endPinch(true)\n disarm()\n }\n\n function onKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Escape' || !session) return\n event.preventDefault()\n endPinch(true)\n disarm()\n }\n\n const previousTouchAction = element.style.touchAction\n if (options.pinch) {\n element.style.touchAction = options.pinch.lockTouchAction ? 'none' : 'pan-x pan-y'\n }\n element.addEventListener('pointerdown', onDown)\n element.addEventListener('pointermove', onMove)\n element.addEventListener('pointerup', onRelease)\n element.addEventListener('pointercancel', onCancel)\n doc.addEventListener('keydown', onKeydown, true)\n\n return () => {\n if (session) endPinch(true)\n disarm()\n fingers.clear()\n element.style.touchAction = previousTouchAction\n element.removeEventListener('pointerdown', onDown)\n element.removeEventListener('pointermove', onMove)\n element.removeEventListener('pointerup', onRelease)\n element.removeEventListener('pointercancel', onCancel)\n doc.removeEventListener('keydown', onKeydown, true)\n }\n}\n\nexport function pinch(options: PinchOptions = {}): DesktopGesture {\n const settings: Required<PinchOptions> = {\n threshold: options.threshold ?? 12,\n lockTouchAction: options.lockTouchAction === true,\n }\n return (ctx) => watch(ctx, { pinch: settings, swipe: null })\n}\n\nexport function swipe(options: SwipeOptions = {}): DesktopGesture {\n const settings: Required<SwipeOptions> = {\n threshold: options.threshold ?? 72,\n workspaces: options.workspaces ?? 0,\n }\n return (ctx) => watch(ctx, { pinch: null, swipe: settings })\n}\n\nexport function touchGestures(\n options: { pinch?: PinchOptions; swipe?: SwipeOptions } = {},\n): DesktopGesture {\n const pinchSettings: Required<PinchOptions> = {\n threshold: options.pinch?.threshold ?? 12,\n lockTouchAction: options.pinch?.lockTouchAction === true,\n }\n const swipeSettings: Required<SwipeOptions> = {\n threshold: options.swipe?.threshold ?? 72,\n workspaces: options.swipe?.workspaces ?? 0,\n }\n return (ctx) => watch(ctx, { pinch: pinchSettings, swipe: swipeSettings })\n}\n"]}
package/dist/index.cjs CHANGED
@@ -1,76 +1,77 @@
1
1
  'use strict';
2
2
 
3
- var chunkNJAI5R4J_cjs = require('./chunk-NJAI5R4J.cjs');
3
+ var chunkZWUVWRUS_cjs = require('./chunk-ZWUVWRUS.cjs');
4
+ var chunkBDHFXEJN_cjs = require('./chunk-BDHFXEJN.cjs');
4
5
 
5
6
 
6
7
 
7
- Object.defineProperty(exports, "applyAspect", {
8
+ Object.defineProperty(exports, "attachDesktop", {
8
9
  enumerable: true,
9
- get: function () { return chunkNJAI5R4J_cjs.applyAspect; }
10
+ get: function () { return chunkZWUVWRUS_cjs.attachDesktop; }
10
11
  });
11
- Object.defineProperty(exports, "attachDesktop", {
12
+ Object.defineProperty(exports, "createAnnouncer", {
12
13
  enumerable: true,
13
- get: function () { return chunkNJAI5R4J_cjs.attachDesktop; }
14
+ get: function () { return chunkZWUVWRUS_cjs.createAnnouncer; }
14
15
  });
15
- Object.defineProperty(exports, "boundsEqual", {
16
+ Object.defineProperty(exports, "createDesktopBinder", {
16
17
  enumerable: true,
17
- get: function () { return chunkNJAI5R4J_cjs.boundsEqual; }
18
+ get: function () { return chunkZWUVWRUS_cjs.createDesktopBinder; }
18
19
  });
19
- Object.defineProperty(exports, "clamp", {
20
+ Object.defineProperty(exports, "createEmitter", {
20
21
  enumerable: true,
21
- get: function () { return chunkNJAI5R4J_cjs.clamp; }
22
+ get: function () { return chunkZWUVWRUS_cjs.createEmitter; }
22
23
  });
23
- Object.defineProperty(exports, "clampSize", {
24
+ Object.defineProperty(exports, "createWindowManager", {
24
25
  enumerable: true,
25
- get: function () { return chunkNJAI5R4J_cjs.clampSize; }
26
+ get: function () { return chunkZWUVWRUS_cjs.createWindowManager; }
26
27
  });
27
- Object.defineProperty(exports, "clampToViewport", {
28
+ Object.defineProperty(exports, "defaultMessages", {
28
29
  enumerable: true,
29
- get: function () { return chunkNJAI5R4J_cjs.clampToViewport; }
30
+ get: function () { return chunkZWUVWRUS_cjs.defaultMessages; }
30
31
  });
31
- Object.defineProperty(exports, "createAnnouncer", {
32
+ Object.defineProperty(exports, "flipFromTarget", {
32
33
  enumerable: true,
33
- get: function () { return chunkNJAI5R4J_cjs.createAnnouncer; }
34
+ get: function () { return chunkZWUVWRUS_cjs.flipFromTarget; }
34
35
  });
35
- Object.defineProperty(exports, "createDesktopBinder", {
36
+ Object.defineProperty(exports, "flipToTarget", {
36
37
  enumerable: true,
37
- get: function () { return chunkNJAI5R4J_cjs.createDesktopBinder; }
38
+ get: function () { return chunkZWUVWRUS_cjs.flipToTarget; }
38
39
  });
39
- Object.defineProperty(exports, "createEmitter", {
40
+ Object.defineProperty(exports, "prefersReducedMotion", {
40
41
  enumerable: true,
41
- get: function () { return chunkNJAI5R4J_cjs.createEmitter; }
42
+ get: function () { return chunkZWUVWRUS_cjs.prefersReducedMotion; }
42
43
  });
43
- Object.defineProperty(exports, "createWindowManager", {
44
+ Object.defineProperty(exports, "applyAspect", {
44
45
  enumerable: true,
45
- get: function () { return chunkNJAI5R4J_cjs.createWindowManager; }
46
+ get: function () { return chunkBDHFXEJN_cjs.applyAspect; }
46
47
  });
47
- Object.defineProperty(exports, "defaultMessages", {
48
+ Object.defineProperty(exports, "boundsEqual", {
48
49
  enumerable: true,
49
- get: function () { return chunkNJAI5R4J_cjs.defaultMessages; }
50
+ get: function () { return chunkBDHFXEJN_cjs.boundsEqual; }
50
51
  });
51
- Object.defineProperty(exports, "detectSnapZone", {
52
+ Object.defineProperty(exports, "clamp", {
52
53
  enumerable: true,
53
- get: function () { return chunkNJAI5R4J_cjs.detectSnapZone; }
54
+ get: function () { return chunkBDHFXEJN_cjs.clamp; }
54
55
  });
55
- Object.defineProperty(exports, "flipFromTarget", {
56
+ Object.defineProperty(exports, "clampSize", {
56
57
  enumerable: true,
57
- get: function () { return chunkNJAI5R4J_cjs.flipFromTarget; }
58
+ get: function () { return chunkBDHFXEJN_cjs.clampSize; }
58
59
  });
59
- Object.defineProperty(exports, "flipToTarget", {
60
+ Object.defineProperty(exports, "clampToViewport", {
60
61
  enumerable: true,
61
- get: function () { return chunkNJAI5R4J_cjs.flipToTarget; }
62
+ get: function () { return chunkBDHFXEJN_cjs.clampToViewport; }
62
63
  });
63
- Object.defineProperty(exports, "magnetize", {
64
+ Object.defineProperty(exports, "detectSnapZone", {
64
65
  enumerable: true,
65
- get: function () { return chunkNJAI5R4J_cjs.magnetize; }
66
+ get: function () { return chunkBDHFXEJN_cjs.detectSnapZone; }
66
67
  });
67
- Object.defineProperty(exports, "prefersReducedMotion", {
68
+ Object.defineProperty(exports, "magnetize", {
68
69
  enumerable: true,
69
- get: function () { return chunkNJAI5R4J_cjs.prefersReducedMotion; }
70
+ get: function () { return chunkBDHFXEJN_cjs.magnetize; }
70
71
  });
71
72
  Object.defineProperty(exports, "zoneBounds", {
72
73
  enumerable: true,
73
- get: function () { return chunkNJAI5R4J_cjs.zoneBounds; }
74
+ get: function () { return chunkBDHFXEJN_cjs.zoneBounds; }
74
75
  });
75
76
  //# sourceMappingURL=index.cjs.map
76
77
  //# sourceMappingURL=index.cjs.map
package/dist/index.d.cts CHANGED
@@ -1,7 +1,8 @@
1
- import { a as DesktopOptions, b as DesktopController } from './binder-_L3Iww0u.cjs';
2
- export { A as Announcer, c as AnnouncerMessages, D as DesktopBinder, d as DesktopKeyboardOptions, e as DesktopSnapOptions, H as HitAreaOptions, M as MagnetResult, f as MagnetismOptions, S as SnapDetectOptions, W as WindowAttachOptions, g as applyAspect, h as boundsEqual, i as clamp, j as clampSize, k as clampToViewport, l as createAnnouncer, m as createDesktopBinder, n as defaultMessages, o as detectSnapZone, p as magnetize, z as zoneBounds } from './binder-_L3Iww0u.cjs';
1
+ import { D as DesktopOptions, a as DesktopController } from './shared-DdGFz3oy.cjs';
2
+ export { A as ActiveGesture, b as Announcer, c as AnnouncerMessages, d as DesktopGesture, e as DesktopKeyboardOptions, f as DesktopSnapOptions, G as GestureContext, H as HitAreaOptions, M as MagnetResult, g as MagnetismOptions, h as MountedWindow, S as SkinContext, i as SkinMount, j as SnapDetectOptions, k as WindowActions, W as WindowAttachOptions, l as WindowSkin, m as applyAspect, n as boundsEqual, o as clamp, p as clampSize, q as clampToViewport, r as createAnnouncer, s as defaultMessages, t as detectSnapZone, u as magnetize, z as zoneBounds } from './shared-DdGFz3oy.cjs';
3
3
  import { M as ManagerOptions, W as WindowManager } from './types-jG2lHGcA.cjs';
4
4
  export { A as ArrangeMode, B as Bounds, c as ManagerEvents, a as ManagerState, S as SerializedMaxSize, d as SerializedState, e as SerializedWindowState, f as Size, g as SnapZone, h as WindowFlags, i as WindowInit, j as WindowLayer, k as WindowStage, b as WindowState, l as WindowUpdate } from './types-jG2lHGcA.cjs';
5
+ export { D as DesktopBinder, c as createDesktopBinder } from './binder-DGoj0xG1.cjs';
5
6
 
6
7
  type Listener<T> = (payload: T) => void;
7
8
  interface Emitter<Events extends Record<keyof Events, unknown>> {
package/dist/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
- import { a as DesktopOptions, b as DesktopController } from './binder-DvQFmO3K.js';
2
- export { A as Announcer, c as AnnouncerMessages, D as DesktopBinder, d as DesktopKeyboardOptions, e as DesktopSnapOptions, H as HitAreaOptions, M as MagnetResult, f as MagnetismOptions, S as SnapDetectOptions, W as WindowAttachOptions, g as applyAspect, h as boundsEqual, i as clamp, j as clampSize, k as clampToViewport, l as createAnnouncer, m as createDesktopBinder, n as defaultMessages, o as detectSnapZone, p as magnetize, z as zoneBounds } from './binder-DvQFmO3K.js';
1
+ import { D as DesktopOptions, a as DesktopController } from './shared-BoHXlPCu.js';
2
+ export { A as ActiveGesture, b as Announcer, c as AnnouncerMessages, d as DesktopGesture, e as DesktopKeyboardOptions, f as DesktopSnapOptions, G as GestureContext, H as HitAreaOptions, M as MagnetResult, g as MagnetismOptions, h as MountedWindow, S as SkinContext, i as SkinMount, j as SnapDetectOptions, k as WindowActions, W as WindowAttachOptions, l as WindowSkin, m as applyAspect, n as boundsEqual, o as clamp, p as clampSize, q as clampToViewport, r as createAnnouncer, s as defaultMessages, t as detectSnapZone, u as magnetize, z as zoneBounds } from './shared-BoHXlPCu.js';
3
3
  import { M as ManagerOptions, W as WindowManager } from './types-jG2lHGcA.js';
4
4
  export { A as ArrangeMode, B as Bounds, c as ManagerEvents, a as ManagerState, S as SerializedMaxSize, d as SerializedState, e as SerializedWindowState, f as Size, g as SnapZone, h as WindowFlags, i as WindowInit, j as WindowLayer, k as WindowStage, b as WindowState, l as WindowUpdate } from './types-jG2lHGcA.js';
5
+ export { D as DesktopBinder, c as createDesktopBinder } from './binder-Lo13iTVB.js';
5
6
 
6
7
  type Listener<T> = (payload: T) => void;
7
8
  interface Emitter<Events extends Record<keyof Events, unknown>> {
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
- export { applyAspect, attachDesktop, boundsEqual, clamp, clampSize, clampToViewport, createAnnouncer, createDesktopBinder, createEmitter, createWindowManager, defaultMessages, detectSnapZone, flipFromTarget, flipToTarget, magnetize, prefersReducedMotion, zoneBounds } from './chunk-FOWW4LXS.js';
1
+ export { attachDesktop, createAnnouncer, createDesktopBinder, createEmitter, createWindowManager, defaultMessages, flipFromTarget, flipToTarget, prefersReducedMotion } from './chunk-TUGQX3CX.js';
2
+ export { applyAspect, boundsEqual, clamp, clampSize, clampToViewport, detectSnapZone, magnetize, zoneBounds } from './chunk-5XVIC5LH.js';
2
3
  //# sourceMappingURL=index.js.map
3
4
  //# sourceMappingURL=index.js.map
package/dist/react.cjs CHANGED
@@ -1,10 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunkNJAI5R4J_cjs = require('./chunk-NJAI5R4J.cjs');
3
+ var chunkZWUVWRUS_cjs = require('./chunk-ZWUVWRUS.cjs');
4
+ require('./chunk-BDHFXEJN.cjs');
4
5
  var react = require('react');
5
6
 
6
7
  function useWindowManager(options) {
7
- const [wm] = react.useState(() => chunkNJAI5R4J_cjs.createWindowManager(options));
8
+ const [wm] = react.useState(() => chunkZWUVWRUS_cjs.createWindowManager(options));
8
9
  react.useEffect(() => () => wm.destroy(), [wm]);
9
10
  return wm;
10
11
  }
@@ -17,7 +18,7 @@ function useWmWindow(wm, id) {
17
18
  }
18
19
  function useDesktop(wm, options) {
19
20
  const optionsRef = react.useRef(options);
20
- const binder = react.useMemo(() => chunkNJAI5R4J_cjs.createDesktopBinder(wm, optionsRef.current), [wm]);
21
+ const binder = react.useMemo(() => chunkZWUVWRUS_cjs.createDesktopBinder(wm, optionsRef.current), [wm]);
21
22
  react.useEffect(() => () => binder.destroy(), [binder]);
22
23
  const cleanupRef = react.useRef(null);
23
24
  const ref = react.useCallback(
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/react.ts"],"names":["useState","createWindowManager","useEffect","useSyncExternalStore","useCallback","useRef","useMemo","createDesktopBinder"],"mappings":";;;;;AAQO,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,MAAM,CAAC,EAAE,CAAA,GAAIA,eAAS,MAAMC,qCAAA,CAAoB,OAAO,CAAC,CAAA;AACxD,EAAAC,eAAA,CAAU,MAAM,MAAM,EAAA,CAAG,SAAQ,EAAG,CAAC,EAAE,CAAC,CAAA;AACxC,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,WAAW,EAAA,EAAiC;AAC1D,EAAA,OAAOC,2BAAqB,EAAA,CAAG,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,GAAG,QAAQ,CAAA;AACpE;AAEO,SAAS,WAAA,CAAY,IAAmB,EAAA,EAAqC;AAClF,EAAA,MAAM,WAAA,GAAcC,iBAAA,CAAY,MAAM,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA;AAC1D,EAAA,OAAOD,0BAAA,CAAqB,EAAA,CAAG,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AACpE;AAQO,SAAS,UAAA,CAAW,IAAmB,OAAA,EAA4C;AACxF,EAAA,MAAM,UAAA,GAAaE,aAAO,OAAO,CAAA;AACjC,EAAA,MAAM,MAAA,GAASC,aAAA,CAAQ,MAAMC,qCAAA,CAAoB,EAAA,EAAI,WAAW,OAAO,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AAC9E,EAAAL,eAAA,CAAU,MAAM,MAAM,MAAA,CAAO,SAAQ,EAAG,CAAC,MAAM,CAAC,CAAA;AAChD,EAAA,MAAM,UAAA,GAAaG,aAA4B,IAAI,CAAA;AACnD,EAAA,MAAM,GAAA,GAAMD,iBAAA;AAAA,IACV,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA;AAAA,MAC9C,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,IAAU;AACrB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,UAAA,EAAY,OAAO,UAAA,EAAW;AACtD;AAEO,SAAS,cAAA,CACd,MAAA,EACA,EAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,UAAA,GAAaC,aAAO,OAAO,CAAA;AACjC,EAAA,MAAM,UAAA,GAAaA,aAA4B,IAAI,CAAA;AACnD,EAAA,OAAOD,iBAAA;AAAA,IACL,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,UAAU,MAAA,CAAO,UAAA,CAAW,EAAA,EAAI,IAAA,EAAM,WAAW,OAAO,CAAA;AAAA,MACrE,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,IAAU;AACrB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,EAAE;AAAA,GACb;AACF","file":"react.cjs","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport { createWindowManager } from '../core/manager'\nimport type { ManagerOptions, ManagerState, WindowManager, WindowState } from '../core/types'\nimport { createDesktopBinder, type DesktopBinder } from '../dom/binder'\nimport type { DesktopController, DesktopOptions, WindowAttachOptions } from '../dom/shared'\n\nexport type ElementRef = (node: HTMLElement | null) => void\n\nexport function useWindowManager(options?: ManagerOptions): WindowManager {\n const [wm] = useState(() => createWindowManager(options))\n useEffect(() => () => wm.destroy(), [wm])\n return wm\n}\n\nexport function useWmState(wm: WindowManager): ManagerState {\n return useSyncExternalStore(wm.subscribe, wm.getState, wm.getState)\n}\n\nexport function useWmWindow(wm: WindowManager, id: string): WindowState | undefined {\n const getSnapshot = useCallback(() => wm.get(id), [wm, id])\n return useSyncExternalStore(wm.subscribe, getSnapshot, getSnapshot)\n}\n\nexport interface UseDesktopResult {\n ref: ElementRef\n binder: DesktopBinder\n controller(): DesktopController | null\n}\n\nexport function useDesktop(wm: WindowManager, options?: DesktopOptions): UseDesktopResult {\n const optionsRef = useRef(options)\n const binder = useMemo(() => createDesktopBinder(wm, optionsRef.current), [wm])\n useEffect(() => () => binder.destroy(), [binder])\n const cleanupRef = useRef<(() => void) | null>(null)\n const ref = useCallback<ElementRef>(\n (node) => {\n if (node) {\n cleanupRef.current = binder.bindDesktop(node)\n } else {\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n },\n [binder],\n )\n return { ref, binder, controller: binder.controller }\n}\n\nexport function useWmWindowRef(\n binder: DesktopBinder,\n id: string,\n options?: WindowAttachOptions,\n): ElementRef {\n const optionsRef = useRef(options)\n const cleanupRef = useRef<(() => void) | null>(null)\n return useCallback<ElementRef>(\n (node) => {\n if (node) {\n cleanupRef.current = binder.bindWindow(id, node, optionsRef.current)\n } else {\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n },\n [binder, id],\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/adapters/react.ts"],"names":["useState","createWindowManager","useEffect","useSyncExternalStore","useCallback","useRef","useMemo","createDesktopBinder"],"mappings":";;;;;;AAQO,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,MAAM,CAAC,EAAE,CAAA,GAAIA,eAAS,MAAMC,qCAAA,CAAoB,OAAO,CAAC,CAAA;AACxD,EAAAC,eAAA,CAAU,MAAM,MAAM,EAAA,CAAG,SAAQ,EAAG,CAAC,EAAE,CAAC,CAAA;AACxC,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,WAAW,EAAA,EAAiC;AAC1D,EAAA,OAAOC,2BAAqB,EAAA,CAAG,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,GAAG,QAAQ,CAAA;AACpE;AAEO,SAAS,WAAA,CAAY,IAAmB,EAAA,EAAqC;AAClF,EAAA,MAAM,WAAA,GAAcC,iBAAA,CAAY,MAAM,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA;AAC1D,EAAA,OAAOD,0BAAA,CAAqB,EAAA,CAAG,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AACpE;AAQO,SAAS,UAAA,CAAW,IAAmB,OAAA,EAA4C;AACxF,EAAA,MAAM,UAAA,GAAaE,aAAO,OAAO,CAAA;AACjC,EAAA,MAAM,MAAA,GAASC,aAAA,CAAQ,MAAMC,qCAAA,CAAoB,EAAA,EAAI,WAAW,OAAO,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AAC9E,EAAAL,eAAA,CAAU,MAAM,MAAM,MAAA,CAAO,SAAQ,EAAG,CAAC,MAAM,CAAC,CAAA;AAChD,EAAA,MAAM,UAAA,GAAaG,aAA4B,IAAI,CAAA;AACnD,EAAA,MAAM,GAAA,GAAMD,iBAAA;AAAA,IACV,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA;AAAA,MAC9C,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,IAAU;AACrB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,UAAA,EAAY,OAAO,UAAA,EAAW;AACtD;AAEO,SAAS,cAAA,CACd,MAAA,EACA,EAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,UAAA,GAAaC,aAAO,OAAO,CAAA;AACjC,EAAA,MAAM,UAAA,GAAaA,aAA4B,IAAI,CAAA;AACnD,EAAA,OAAOD,iBAAA;AAAA,IACL,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,UAAU,MAAA,CAAO,UAAA,CAAW,EAAA,EAAI,IAAA,EAAM,WAAW,OAAO,CAAA;AAAA,MACrE,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,IAAU;AACrB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,EAAE;AAAA,GACb;AACF","file":"react.cjs","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport { createWindowManager } from '../core/manager'\nimport type { ManagerOptions, ManagerState, WindowManager, WindowState } from '../core/types'\nimport { createDesktopBinder, type DesktopBinder } from '../dom/binder'\nimport type { DesktopController, DesktopOptions, WindowAttachOptions } from '../dom/shared'\n\nexport type ElementRef = (node: HTMLElement | null) => void\n\nexport function useWindowManager(options?: ManagerOptions): WindowManager {\n const [wm] = useState(() => createWindowManager(options))\n useEffect(() => () => wm.destroy(), [wm])\n return wm\n}\n\nexport function useWmState(wm: WindowManager): ManagerState {\n return useSyncExternalStore(wm.subscribe, wm.getState, wm.getState)\n}\n\nexport function useWmWindow(wm: WindowManager, id: string): WindowState | undefined {\n const getSnapshot = useCallback(() => wm.get(id), [wm, id])\n return useSyncExternalStore(wm.subscribe, getSnapshot, getSnapshot)\n}\n\nexport interface UseDesktopResult {\n ref: ElementRef\n binder: DesktopBinder\n controller(): DesktopController | null\n}\n\nexport function useDesktop(wm: WindowManager, options?: DesktopOptions): UseDesktopResult {\n const optionsRef = useRef(options)\n const binder = useMemo(() => createDesktopBinder(wm, optionsRef.current), [wm])\n useEffect(() => () => binder.destroy(), [binder])\n const cleanupRef = useRef<(() => void) | null>(null)\n const ref = useCallback<ElementRef>(\n (node) => {\n if (node) {\n cleanupRef.current = binder.bindDesktop(node)\n } else {\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n },\n [binder],\n )\n return { ref, binder, controller: binder.controller }\n}\n\nexport function useWmWindowRef(\n binder: DesktopBinder,\n id: string,\n options?: WindowAttachOptions,\n): ElementRef {\n const optionsRef = useRef(options)\n const cleanupRef = useRef<(() => void) | null>(null)\n return useCallback<ElementRef>(\n (node) => {\n if (node) {\n cleanupRef.current = binder.bindWindow(id, node, optionsRef.current)\n } else {\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n },\n [binder, id],\n )\n}\n"]}
package/dist/react.d.cts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { W as WindowManager, M as ManagerOptions, a as ManagerState, b as WindowState } from './types-jG2lHGcA.cjs';
2
- import { D as DesktopBinder, b as DesktopController, a as DesktopOptions, W as WindowAttachOptions } from './binder-_L3Iww0u.cjs';
2
+ import { D as DesktopBinder } from './binder-DGoj0xG1.cjs';
3
+ import { a as DesktopController, D as DesktopOptions, W as WindowAttachOptions } from './shared-DdGFz3oy.cjs';
3
4
 
4
5
  type ElementRef = (node: HTMLElement | null) => void;
5
6
  declare function useWindowManager(options?: ManagerOptions): WindowManager;
package/dist/react.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { W as WindowManager, M as ManagerOptions, a as ManagerState, b as WindowState } from './types-jG2lHGcA.js';
2
- import { D as DesktopBinder, b as DesktopController, a as DesktopOptions, W as WindowAttachOptions } from './binder-DvQFmO3K.js';
2
+ import { D as DesktopBinder } from './binder-Lo13iTVB.js';
3
+ import { a as DesktopController, D as DesktopOptions, W as WindowAttachOptions } from './shared-BoHXlPCu.js';
3
4
 
4
5
  type ElementRef = (node: HTMLElement | null) => void;
5
6
  declare function useWindowManager(options?: ManagerOptions): WindowManager;
package/dist/react.js CHANGED
@@ -1,4 +1,5 @@
1
- import { createWindowManager, createDesktopBinder } from './chunk-FOWW4LXS.js';
1
+ import { createWindowManager, createDesktopBinder } from './chunk-TUGQX3CX.js';
2
+ import './chunk-5XVIC5LH.js';
2
3
  import { useState, useEffect, useSyncExternalStore, useCallback, useRef, useMemo } from 'react';
3
4
 
4
5
  function useWindowManager(options) {
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/react.ts"],"names":[],"mappings":";;;AAQO,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,MAAM,CAAC,EAAE,CAAA,GAAI,SAAS,MAAM,mBAAA,CAAoB,OAAO,CAAC,CAAA;AACxD,EAAA,SAAA,CAAU,MAAM,MAAM,EAAA,CAAG,SAAQ,EAAG,CAAC,EAAE,CAAC,CAAA;AACxC,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,WAAW,EAAA,EAAiC;AAC1D,EAAA,OAAO,qBAAqB,EAAA,CAAG,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,GAAG,QAAQ,CAAA;AACpE;AAEO,SAAS,WAAA,CAAY,IAAmB,EAAA,EAAqC;AAClF,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,MAAM,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA;AAC1D,EAAA,OAAO,oBAAA,CAAqB,EAAA,CAAG,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AACpE;AAQO,SAAS,UAAA,CAAW,IAAmB,OAAA,EAA4C;AACxF,EAAA,MAAM,UAAA,GAAa,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAM,mBAAA,CAAoB,EAAA,EAAI,WAAW,OAAO,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AAC9E,EAAA,SAAA,CAAU,MAAM,MAAM,MAAA,CAAO,SAAQ,EAAG,CAAC,MAAM,CAAC,CAAA;AAChD,EAAA,MAAM,UAAA,GAAa,OAA4B,IAAI,CAAA;AACnD,EAAA,MAAM,GAAA,GAAM,WAAA;AAAA,IACV,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA;AAAA,MAC9C,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,IAAU;AACrB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,UAAA,EAAY,OAAO,UAAA,EAAW;AACtD;AAEO,SAAS,cAAA,CACd,MAAA,EACA,EAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,UAAA,GAAa,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,UAAA,GAAa,OAA4B,IAAI,CAAA;AACnD,EAAA,OAAO,WAAA;AAAA,IACL,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,UAAU,MAAA,CAAO,UAAA,CAAW,EAAA,EAAI,IAAA,EAAM,WAAW,OAAO,CAAA;AAAA,MACrE,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,IAAU;AACrB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,EAAE;AAAA,GACb;AACF","file":"react.js","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport { createWindowManager } from '../core/manager'\nimport type { ManagerOptions, ManagerState, WindowManager, WindowState } from '../core/types'\nimport { createDesktopBinder, type DesktopBinder } from '../dom/binder'\nimport type { DesktopController, DesktopOptions, WindowAttachOptions } from '../dom/shared'\n\nexport type ElementRef = (node: HTMLElement | null) => void\n\nexport function useWindowManager(options?: ManagerOptions): WindowManager {\n const [wm] = useState(() => createWindowManager(options))\n useEffect(() => () => wm.destroy(), [wm])\n return wm\n}\n\nexport function useWmState(wm: WindowManager): ManagerState {\n return useSyncExternalStore(wm.subscribe, wm.getState, wm.getState)\n}\n\nexport function useWmWindow(wm: WindowManager, id: string): WindowState | undefined {\n const getSnapshot = useCallback(() => wm.get(id), [wm, id])\n return useSyncExternalStore(wm.subscribe, getSnapshot, getSnapshot)\n}\n\nexport interface UseDesktopResult {\n ref: ElementRef\n binder: DesktopBinder\n controller(): DesktopController | null\n}\n\nexport function useDesktop(wm: WindowManager, options?: DesktopOptions): UseDesktopResult {\n const optionsRef = useRef(options)\n const binder = useMemo(() => createDesktopBinder(wm, optionsRef.current), [wm])\n useEffect(() => () => binder.destroy(), [binder])\n const cleanupRef = useRef<(() => void) | null>(null)\n const ref = useCallback<ElementRef>(\n (node) => {\n if (node) {\n cleanupRef.current = binder.bindDesktop(node)\n } else {\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n },\n [binder],\n )\n return { ref, binder, controller: binder.controller }\n}\n\nexport function useWmWindowRef(\n binder: DesktopBinder,\n id: string,\n options?: WindowAttachOptions,\n): ElementRef {\n const optionsRef = useRef(options)\n const cleanupRef = useRef<(() => void) | null>(null)\n return useCallback<ElementRef>(\n (node) => {\n if (node) {\n cleanupRef.current = binder.bindWindow(id, node, optionsRef.current)\n } else {\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n },\n [binder, id],\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/adapters/react.ts"],"names":[],"mappings":";;;;AAQO,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,MAAM,CAAC,EAAE,CAAA,GAAI,SAAS,MAAM,mBAAA,CAAoB,OAAO,CAAC,CAAA;AACxD,EAAA,SAAA,CAAU,MAAM,MAAM,EAAA,CAAG,SAAQ,EAAG,CAAC,EAAE,CAAC,CAAA;AACxC,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,WAAW,EAAA,EAAiC;AAC1D,EAAA,OAAO,qBAAqB,EAAA,CAAG,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,GAAG,QAAQ,CAAA;AACpE;AAEO,SAAS,WAAA,CAAY,IAAmB,EAAA,EAAqC;AAClF,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,MAAM,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA;AAC1D,EAAA,OAAO,oBAAA,CAAqB,EAAA,CAAG,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AACpE;AAQO,SAAS,UAAA,CAAW,IAAmB,OAAA,EAA4C;AACxF,EAAA,MAAM,UAAA,GAAa,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAM,mBAAA,CAAoB,EAAA,EAAI,WAAW,OAAO,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AAC9E,EAAA,SAAA,CAAU,MAAM,MAAM,MAAA,CAAO,SAAQ,EAAG,CAAC,MAAM,CAAC,CAAA;AAChD,EAAA,MAAM,UAAA,GAAa,OAA4B,IAAI,CAAA;AACnD,EAAA,MAAM,GAAA,GAAM,WAAA;AAAA,IACV,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA;AAAA,MAC9C,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,IAAU;AACrB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,UAAA,EAAY,OAAO,UAAA,EAAW;AACtD;AAEO,SAAS,cAAA,CACd,MAAA,EACA,EAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,UAAA,GAAa,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,UAAA,GAAa,OAA4B,IAAI,CAAA;AACnD,EAAA,OAAO,WAAA;AAAA,IACL,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,UAAU,MAAA,CAAO,UAAA,CAAW,EAAA,EAAI,IAAA,EAAM,WAAW,OAAO,CAAA;AAAA,MACrE,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,OAAA,IAAU;AACrB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,EAAE;AAAA,GACb;AACF","file":"react.js","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport { createWindowManager } from '../core/manager'\nimport type { ManagerOptions, ManagerState, WindowManager, WindowState } from '../core/types'\nimport { createDesktopBinder, type DesktopBinder } from '../dom/binder'\nimport type { DesktopController, DesktopOptions, WindowAttachOptions } from '../dom/shared'\n\nexport type ElementRef = (node: HTMLElement | null) => void\n\nexport function useWindowManager(options?: ManagerOptions): WindowManager {\n const [wm] = useState(() => createWindowManager(options))\n useEffect(() => () => wm.destroy(), [wm])\n return wm\n}\n\nexport function useWmState(wm: WindowManager): ManagerState {\n return useSyncExternalStore(wm.subscribe, wm.getState, wm.getState)\n}\n\nexport function useWmWindow(wm: WindowManager, id: string): WindowState | undefined {\n const getSnapshot = useCallback(() => wm.get(id), [wm, id])\n return useSyncExternalStore(wm.subscribe, getSnapshot, getSnapshot)\n}\n\nexport interface UseDesktopResult {\n ref: ElementRef\n binder: DesktopBinder\n controller(): DesktopController | null\n}\n\nexport function useDesktop(wm: WindowManager, options?: DesktopOptions): UseDesktopResult {\n const optionsRef = useRef(options)\n const binder = useMemo(() => createDesktopBinder(wm, optionsRef.current), [wm])\n useEffect(() => () => binder.destroy(), [binder])\n const cleanupRef = useRef<(() => void) | null>(null)\n const ref = useCallback<ElementRef>(\n (node) => {\n if (node) {\n cleanupRef.current = binder.bindDesktop(node)\n } else {\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n },\n [binder],\n )\n return { ref, binder, controller: binder.controller }\n}\n\nexport function useWmWindowRef(\n binder: DesktopBinder,\n id: string,\n options?: WindowAttachOptions,\n): ElementRef {\n const optionsRef = useRef(options)\n const cleanupRef = useRef<(() => void) | null>(null)\n return useCallback<ElementRef>(\n (node) => {\n if (node) {\n cleanupRef.current = binder.bindWindow(id, node, optionsRef.current)\n } else {\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n },\n [binder, id],\n )\n}\n"]}
@@ -19,6 +19,19 @@ interface MagnetResult {
19
19
  }
20
20
  declare function magnetize(bounds: Bounds, targets: readonly Bounds[], threshold: number): MagnetResult;
21
21
 
22
+ interface WindowActions {
23
+ focus(): boolean;
24
+ close(): boolean;
25
+ minimize(): boolean;
26
+ maximize(): boolean;
27
+ toggleMaximize(): boolean;
28
+ restore(): boolean;
29
+ center(): boolean;
30
+ sendToBack(): boolean;
31
+ snap(zone: SnapZone): boolean;
32
+ moveToWorkspace(workspace: number): boolean;
33
+ }
34
+
22
35
  interface AnnouncerMessages {
23
36
  opened(title: string): string;
24
37
  closed(title: string): string;
@@ -37,6 +50,10 @@ interface Announcer {
37
50
  }
38
51
  declare function createAnnouncer(wm: WindowManager, container: HTMLElement, messages?: Partial<AnnouncerMessages>): Announcer;
39
52
 
53
+ interface Point {
54
+ x: number;
55
+ y: number;
56
+ }
40
57
  interface DesktopSnapOptions extends SnapDetectOptions {
41
58
  preview?: boolean;
42
59
  topEdge?: 'maximize' | 'top' | 'none';
@@ -72,9 +89,12 @@ interface DesktopOptions {
72
89
  magnetism?: boolean | MagnetismOptions;
73
90
  stacking?: StackingOptions;
74
91
  animation?: boolean | AnimationOptions;
92
+ gestures?: readonly DesktopGesture[];
93
+ skins?: Readonly<Record<string, WindowSkin>>;
75
94
  interactiveSelector?: string;
76
95
  beforeClose?: (window: WindowState) => boolean | void;
77
96
  minimizeTarget?: (window: WindowState) => Element | null;
97
+ windowVariant?: (window: WindowState) => string | null;
78
98
  onTitlebarContextMenu?: (window: WindowState, event: MouseEvent) => void;
79
99
  }
80
100
  interface AnimationOptions {
@@ -86,20 +106,47 @@ interface WindowAttachOptions {
86
106
  resizeHandles?: boolean;
87
107
  removeOnClose?: boolean;
88
108
  }
109
+ interface SkinContext {
110
+ doc: Document;
111
+ id: string;
112
+ window: WindowState;
113
+ actions: WindowActions;
114
+ }
115
+ interface SkinMount {
116
+ element: HTMLElement;
117
+ content: HTMLElement;
118
+ destroy?(): void;
119
+ }
120
+ type WindowSkin = (ctx: SkinContext) => SkinMount;
121
+ interface MountedWindow {
122
+ element: HTMLElement;
123
+ content: HTMLElement;
124
+ detach(): void;
125
+ }
89
126
  interface DesktopController {
90
127
  element: HTMLElement;
91
128
  wm: WindowManager;
92
129
  attachWindow(id: string, element: HTMLElement, options?: WindowAttachOptions): () => void;
130
+ mountWindow(id: string, skin: WindowSkin | string, options?: WindowAttachOptions): MountedWindow;
131
+ actions(id: string): WindowActions;
93
132
  destroy(): void;
94
133
  }
95
-
96
- interface DesktopBinder {
134
+ interface ActiveGesture {
135
+ id: string;
136
+ finish(cancelled: boolean): void;
137
+ }
138
+ interface GestureContext {
97
139
  wm: WindowManager;
98
- controller(): DesktopController | null;
99
- bindDesktop(element: HTMLElement): () => void;
100
- bindWindow(id: string, element: HTMLElement, options?: WindowAttachOptions): () => void;
101
- destroy(): void;
140
+ doc: Document;
141
+ view: Window & typeof globalThis;
142
+ desktop: HTMLElement;
143
+ toLocal(event: PointerEvent): Point;
144
+ trackRect(): () => void;
145
+ windowElement(id: string): HTMLElement | undefined;
146
+ busy(): boolean;
147
+ claim(gesture: ActiveGesture): void;
148
+ release(gesture: ActiveGesture): void;
102
149
  }
103
- declare function createDesktopBinder(wm: WindowManager, options?: DesktopOptions): DesktopBinder;
150
+ type DesktopGesture = (ctx: GestureContext) => () => void;
104
151
 
105
- export { type Announcer as A, type DesktopBinder as D, type HitAreaOptions as H, type MagnetResult as M, type SnapDetectOptions as S, type WindowAttachOptions as W, type DesktopOptions as a, type DesktopController as b, type AnnouncerMessages as c, type DesktopKeyboardOptions as d, type DesktopSnapOptions as e, type MagnetismOptions as f, applyAspect as g, boundsEqual as h, clamp as i, clampSize as j, clampToViewport as k, createAnnouncer as l, createDesktopBinder as m, defaultMessages as n, detectSnapZone as o, magnetize as p, zoneBounds as z };
152
+ export { type ActiveGesture as A, type DesktopOptions as D, type GestureContext as G, type HitAreaOptions as H, type MagnetResult as M, type SkinContext as S, type WindowAttachOptions as W, type DesktopController as a, type Announcer as b, type AnnouncerMessages as c, type DesktopGesture as d, type DesktopKeyboardOptions as e, type DesktopSnapOptions as f, type MagnetismOptions as g, type MountedWindow as h, type SkinMount as i, type SnapDetectOptions as j, type WindowActions as k, type WindowSkin as l, applyAspect as m, boundsEqual as n, clamp as o, clampSize as p, clampToViewport as q, createAnnouncer as r, defaultMessages as s, detectSnapZone as t, magnetize as u, zoneBounds as z };