@surdeddd/wmkit 0.7.2 → 0.8.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 (78) hide show
  1. package/README.md +37 -2
  2. package/README.ru.md +37 -2
  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-B625OrjD.d.cts +13 -0
  10. package/dist/binder-CpGY8Wye.d.ts +13 -0
  11. package/dist/chunk-5XVIC5LH.js +140 -0
  12. package/dist/chunk-5XVIC5LH.js.map +1 -0
  13. package/dist/chunk-BDHFXEJN.cjs +149 -0
  14. package/dist/chunk-BDHFXEJN.cjs.map +1 -0
  15. package/dist/{chunk-NJAI5R4J.cjs → chunk-DINVOL6Z.cjs} +48 -170
  16. package/dist/chunk-DINVOL6Z.cjs.map +1 -0
  17. package/dist/{chunk-FOWW4LXS.js → chunk-MGWCKHTZ.js} +29 -143
  18. package/dist/chunk-MGWCKHTZ.js.map +1 -0
  19. package/dist/devtools.cjs +330 -0
  20. package/dist/devtools.cjs.map +1 -0
  21. package/dist/devtools.d.cts +43 -0
  22. package/dist/devtools.d.ts +43 -0
  23. package/dist/devtools.js +326 -0
  24. package/dist/devtools.js.map +1 -0
  25. package/dist/gestures.cjs +219 -0
  26. package/dist/gestures.cjs.map +1 -0
  27. package/dist/gestures.d.cts +19 -0
  28. package/dist/gestures.d.ts +19 -0
  29. package/dist/gestures.js +215 -0
  30. package/dist/gestures.js.map +1 -0
  31. package/dist/index.cjs +35 -34
  32. package/dist/index.d.cts +3 -2
  33. package/dist/index.d.ts +3 -2
  34. package/dist/index.js +2 -1
  35. package/dist/react.cjs +4 -3
  36. package/dist/react.cjs.map +1 -1
  37. package/dist/react.d.cts +2 -1
  38. package/dist/react.d.ts +2 -1
  39. package/dist/react.js +2 -1
  40. package/dist/react.js.map +1 -1
  41. package/dist/{binder-DvQFmO3K.d.ts → shared-BBXgEeIa.d.ts} +22 -8
  42. package/dist/{binder-_L3Iww0u.d.cts → shared-DU_87nY9.d.cts} +22 -8
  43. package/dist/solid.cjs +4 -3
  44. package/dist/solid.cjs.map +1 -1
  45. package/dist/solid.d.cts +2 -1
  46. package/dist/solid.d.ts +2 -1
  47. package/dist/solid.js +2 -1
  48. package/dist/solid.js.map +1 -1
  49. package/dist/svelte.cjs +4 -3
  50. package/dist/svelte.cjs.map +1 -1
  51. package/dist/svelte.d.cts +2 -1
  52. package/dist/svelte.d.ts +2 -1
  53. package/dist/svelte.js +2 -1
  54. package/dist/svelte.js.map +1 -1
  55. package/dist/themes/amber.css +316 -0
  56. package/dist/themes/aqua.css +285 -0
  57. package/dist/themes/blueprint.css +303 -0
  58. package/dist/themes/brutalist.css +307 -0
  59. package/dist/themes/candy.css +277 -0
  60. package/dist/themes/carbon.css +297 -0
  61. package/dist/themes/forest.css +278 -0
  62. package/dist/themes/frost.css +279 -0
  63. package/dist/themes/glass.css +2 -1
  64. package/dist/themes/light.css +2 -1
  65. package/dist/themes/neon.css +289 -0
  66. package/dist/themes/noir.css +282 -0
  67. package/dist/themes/paper.css +258 -0
  68. package/dist/themes/synth.css +283 -0
  69. package/dist/themes/terminal.css +273 -0
  70. package/dist/vue.cjs +4 -3
  71. package/dist/vue.cjs.map +1 -1
  72. package/dist/vue.d.cts +2 -1
  73. package/dist/vue.d.ts +2 -1
  74. package/dist/vue.js +2 -1
  75. package/dist/vue.js.map +1 -1
  76. package/package.json +37 -1
  77. package/dist/chunk-FOWW4LXS.js.map +0 -1
  78. package/dist/chunk-NJAI5R4J.cjs.map +0 -1
@@ -0,0 +1,19 @@
1
+ import { d as DesktopGesture } from './shared-BBXgEeIa.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 chunkDINVOL6Z_cjs = require('./chunk-DINVOL6Z.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 chunkDINVOL6Z_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 chunkDINVOL6Z_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 chunkDINVOL6Z_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 chunkDINVOL6Z_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 chunkDINVOL6Z_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 chunkDINVOL6Z_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 chunkDINVOL6Z_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 chunkDINVOL6Z_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 chunkDINVOL6Z_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-DU_87nY9.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, S as SnapDetectOptions, W as WindowAttachOptions, h as applyAspect, i as boundsEqual, j as clamp, k as clampSize, l as clampToViewport, m as createAnnouncer, n as defaultMessages, o as detectSnapZone, p as magnetize, z as zoneBounds } from './shared-DU_87nY9.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-B625OrjD.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-BBXgEeIa.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, S as SnapDetectOptions, W as WindowAttachOptions, h as applyAspect, i as boundsEqual, j as clamp, k as clampSize, l as clampToViewport, m as createAnnouncer, n as defaultMessages, o as detectSnapZone, p as magnetize, z as zoneBounds } from './shared-BBXgEeIa.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-CpGY8Wye.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-MGWCKHTZ.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 chunkDINVOL6Z_cjs = require('./chunk-DINVOL6Z.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(() => chunkDINVOL6Z_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(() => chunkDINVOL6Z_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-B625OrjD.cjs';
3
+ import { a as DesktopController, D as DesktopOptions, W as WindowAttachOptions } from './shared-DU_87nY9.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-CpGY8Wye.js';
3
+ import { a as DesktopController, D as DesktopOptions, W as WindowAttachOptions } from './shared-BBXgEeIa.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-MGWCKHTZ.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"]}
@@ -37,6 +37,10 @@ interface Announcer {
37
37
  }
38
38
  declare function createAnnouncer(wm: WindowManager, container: HTMLElement, messages?: Partial<AnnouncerMessages>): Announcer;
39
39
 
40
+ interface Point {
41
+ x: number;
42
+ y: number;
43
+ }
40
44
  interface DesktopSnapOptions extends SnapDetectOptions {
41
45
  preview?: boolean;
42
46
  topEdge?: 'maximize' | 'top' | 'none';
@@ -72,9 +76,11 @@ interface DesktopOptions {
72
76
  magnetism?: boolean | MagnetismOptions;
73
77
  stacking?: StackingOptions;
74
78
  animation?: boolean | AnimationOptions;
79
+ gestures?: readonly DesktopGesture[];
75
80
  interactiveSelector?: string;
76
81
  beforeClose?: (window: WindowState) => boolean | void;
77
82
  minimizeTarget?: (window: WindowState) => Element | null;
83
+ windowVariant?: (window: WindowState) => string | null;
78
84
  onTitlebarContextMenu?: (window: WindowState, event: MouseEvent) => void;
79
85
  }
80
86
  interface AnimationOptions {
@@ -92,14 +98,22 @@ interface DesktopController {
92
98
  attachWindow(id: string, element: HTMLElement, options?: WindowAttachOptions): () => void;
93
99
  destroy(): void;
94
100
  }
95
-
96
- interface DesktopBinder {
101
+ interface ActiveGesture {
102
+ id: string;
103
+ finish(cancelled: boolean): void;
104
+ }
105
+ interface GestureContext {
97
106
  wm: WindowManager;
98
- controller(): DesktopController | null;
99
- bindDesktop(element: HTMLElement): () => void;
100
- bindWindow(id: string, element: HTMLElement, options?: WindowAttachOptions): () => void;
101
- destroy(): void;
107
+ doc: Document;
108
+ view: Window & typeof globalThis;
109
+ desktop: HTMLElement;
110
+ toLocal(event: PointerEvent): Point;
111
+ trackRect(): () => void;
112
+ windowElement(id: string): HTMLElement | undefined;
113
+ busy(): boolean;
114
+ claim(gesture: ActiveGesture): void;
115
+ release(gesture: ActiveGesture): void;
102
116
  }
103
- declare function createDesktopBinder(wm: WindowManager, options?: DesktopOptions): DesktopBinder;
117
+ type DesktopGesture = (ctx: GestureContext) => () => void;
104
118
 
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 };
119
+ export { type ActiveGesture as A, type DesktopOptions as D, type GestureContext as G, type HitAreaOptions as H, type MagnetResult as M, type SnapDetectOptions 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, applyAspect as h, boundsEqual as i, clamp as j, clampSize as k, clampToViewport as l, createAnnouncer as m, defaultMessages as n, detectSnapZone as o, magnetize as p, zoneBounds as z };
@@ -37,6 +37,10 @@ interface Announcer {
37
37
  }
38
38
  declare function createAnnouncer(wm: WindowManager, container: HTMLElement, messages?: Partial<AnnouncerMessages>): Announcer;
39
39
 
40
+ interface Point {
41
+ x: number;
42
+ y: number;
43
+ }
40
44
  interface DesktopSnapOptions extends SnapDetectOptions {
41
45
  preview?: boolean;
42
46
  topEdge?: 'maximize' | 'top' | 'none';
@@ -72,9 +76,11 @@ interface DesktopOptions {
72
76
  magnetism?: boolean | MagnetismOptions;
73
77
  stacking?: StackingOptions;
74
78
  animation?: boolean | AnimationOptions;
79
+ gestures?: readonly DesktopGesture[];
75
80
  interactiveSelector?: string;
76
81
  beforeClose?: (window: WindowState) => boolean | void;
77
82
  minimizeTarget?: (window: WindowState) => Element | null;
83
+ windowVariant?: (window: WindowState) => string | null;
78
84
  onTitlebarContextMenu?: (window: WindowState, event: MouseEvent) => void;
79
85
  }
80
86
  interface AnimationOptions {
@@ -92,14 +98,22 @@ interface DesktopController {
92
98
  attachWindow(id: string, element: HTMLElement, options?: WindowAttachOptions): () => void;
93
99
  destroy(): void;
94
100
  }
95
-
96
- interface DesktopBinder {
101
+ interface ActiveGesture {
102
+ id: string;
103
+ finish(cancelled: boolean): void;
104
+ }
105
+ interface GestureContext {
97
106
  wm: WindowManager;
98
- controller(): DesktopController | null;
99
- bindDesktop(element: HTMLElement): () => void;
100
- bindWindow(id: string, element: HTMLElement, options?: WindowAttachOptions): () => void;
101
- destroy(): void;
107
+ doc: Document;
108
+ view: Window & typeof globalThis;
109
+ desktop: HTMLElement;
110
+ toLocal(event: PointerEvent): Point;
111
+ trackRect(): () => void;
112
+ windowElement(id: string): HTMLElement | undefined;
113
+ busy(): boolean;
114
+ claim(gesture: ActiveGesture): void;
115
+ release(gesture: ActiveGesture): void;
102
116
  }
103
- declare function createDesktopBinder(wm: WindowManager, options?: DesktopOptions): DesktopBinder;
117
+ type DesktopGesture = (ctx: GestureContext) => () => void;
104
118
 
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 };
119
+ export { type ActiveGesture as A, type DesktopOptions as D, type GestureContext as G, type HitAreaOptions as H, type MagnetResult as M, type SnapDetectOptions 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, applyAspect as h, boundsEqual as i, clamp as j, clampSize as k, clampToViewport as l, createAnnouncer as m, defaultMessages as n, detectSnapZone as o, magnetize as p, zoneBounds as z };