@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,326 @@
1
+ // src/plugins/devtools/messages.ts
2
+ var EN_STAGES = {
3
+ normal: "normal",
4
+ minimized: "minimized",
5
+ maximized: "maximized",
6
+ snapped: "snapped"
7
+ };
8
+ var RU_STAGES = {
9
+ normal: "\u043E\u0431\u044B\u0447\u043D\u043E\u0435",
10
+ minimized: "\u0441\u0432\u0451\u0440\u043D\u0443\u0442\u043E",
11
+ maximized: "\u0440\u0430\u0437\u0432\u0451\u0440\u043D\u0443\u0442\u043E",
12
+ snapped: "\u043F\u0440\u0438\u043B\u0438\u043F\u043B\u043E"
13
+ };
14
+ var devtoolsMessages = {
15
+ title: "wmkit devtools",
16
+ windows: "windows",
17
+ events: "events",
18
+ empty: "no windows open",
19
+ quiet: "nothing has happened yet",
20
+ focus: "focus",
21
+ minimize: "minimize",
22
+ maximize: "maximize",
23
+ close: "close",
24
+ undo: "undo",
25
+ redo: "redo",
26
+ copyState: "copy state",
27
+ copied: "copied",
28
+ workspace: (index) => `workspace ${index + 1}`,
29
+ stage: (stage) => EN_STAGES[stage]
30
+ };
31
+ var devtoolsMessagesRu = {
32
+ title: "wmkit devtools",
33
+ windows: "\u043E\u043A\u043D\u0430",
34
+ events: "\u0441\u043E\u0431\u044B\u0442\u0438\u044F",
35
+ empty: "\u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0445 \u043E\u043A\u043E\u043D \u043D\u0435\u0442",
36
+ quiet: "\u043F\u043E\u043A\u0430 \u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043F\u0440\u043E\u0438\u0441\u0445\u043E\u0434\u0438\u043B\u043E",
37
+ focus: "\u0444\u043E\u043A\u0443\u0441",
38
+ minimize: "\u0441\u0432\u0435\u0440\u043D\u0443\u0442\u044C",
39
+ maximize: "\u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C",
40
+ close: "\u0437\u0430\u043A\u0440\u044B\u0442\u044C",
41
+ undo: "\u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C",
42
+ redo: "\u0432\u0435\u0440\u043D\u0443\u0442\u044C",
43
+ copyState: "\u0441\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435",
44
+ copied: "\u0441\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u043E",
45
+ workspace: (index) => `\u0440\u0430\u0431\u043E\u0447\u0438\u0439 \u0441\u0442\u043E\u043B ${index + 1}`,
46
+ stage: (stage) => RU_STAGES[stage]
47
+ };
48
+
49
+ // src/plugins/devtools/view.ts
50
+ var STYLE_ID = "wm-devtools-style";
51
+ var CSS = `[data-wm-devtools]{position:fixed;right:16px;bottom:16px;z-index:2147483646;width:340px;max-width:calc(100vw - 32px);max-height:min(70vh,560px);display:flex;flex-direction:column;overflow:hidden;border-radius:10px;border:1px solid rgba(255,255,255,.14);background:#14161c;color:#e7e9f0;font:12px/1.5 ui-monospace,"SF Mono",Menlo,Consolas,monospace;box-shadow:0 18px 48px rgba(0,0,0,.45)}
52
+ [data-wm-devtools] h2{margin:0;font-size:11px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:#9aa0b5}
53
+ [data-wm-devtools] header{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid rgba(255,255,255,.1)}
54
+ [data-wm-devtools] header h2{flex:1}
55
+ [data-wm-devtools] button{font:inherit;color:inherit;background:transparent;border:1px solid rgba(255,255,255,.18);border-radius:5px;padding:3px 7px;min-height:24px;cursor:pointer}
56
+ [data-wm-devtools] button:hover:not(:disabled){border-color:#7c6cff}
57
+ [data-wm-devtools] button:disabled{opacity:.45;cursor:not-allowed}
58
+ [data-wm-devtools] button:focus-visible{outline:2px solid #7c6cff;outline-offset:2px}
59
+ [data-wm-devtools] section{padding:10px 12px;overflow:auto}
60
+ [data-wm-devtools] section+section{border-top:1px solid rgba(255,255,255,.1)}
61
+ [data-wm-devtools] ul{list-style:none;margin:6px 0 0;padding:0;display:flex;flex-direction:column;gap:6px}
62
+ [data-wm-devtools] [data-wm-devtools-row]{display:grid;grid-template-columns:1fr auto;gap:4px 8px;padding:7px 8px;border:1px solid rgba(255,255,255,.1);border-radius:6px}
63
+ [data-wm-devtools] [data-wm-devtools-row][data-focused]{border-color:#7c6cff}
64
+ [data-wm-devtools] .wm-dt-id{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
65
+ [data-wm-devtools] .wm-dt-meta{grid-column:1/-1;color:#9aa0b5;font-size:11px}
66
+ [data-wm-devtools] .wm-dt-acts{display:flex;gap:4px}
67
+ [data-wm-devtools] .wm-dt-log{gap:2px}
68
+ [data-wm-devtools] .wm-dt-log li{display:flex;gap:8px;color:#9aa0b5}
69
+ [data-wm-devtools] .wm-dt-log b{color:#e7e9f0;font-weight:600;min-width:88px}
70
+ [data-wm-devtools] p{margin:6px 0 0;color:#9aa0b5}
71
+ @media (prefers-reduced-motion:reduce){[data-wm-devtools] *{transition:none!important}}`;
72
+ function acquireStyle(doc) {
73
+ const existing = doc.getElementById(STYLE_ID);
74
+ if (existing instanceof HTMLStyleElement) {
75
+ existing.dataset.owners = String(Number(existing.dataset.owners) + 1);
76
+ return existing;
77
+ }
78
+ const style = doc.createElement("style");
79
+ style.id = STYLE_ID;
80
+ style.dataset.owners = "1";
81
+ style.textContent = CSS;
82
+ doc.head.append(style);
83
+ return style;
84
+ }
85
+ function releaseStyle(style) {
86
+ const left = Number(style.dataset.owners) - 1;
87
+ if (left > 0) style.dataset.owners = String(left);
88
+ else style.remove();
89
+ }
90
+ function box(win) {
91
+ const { x, y, width, height } = win.bounds;
92
+ return `${Math.round(x)},${Math.round(y)} ${Math.round(width)}\xD7${Math.round(height)}`;
93
+ }
94
+ function createDevtoolsView(doc, messages) {
95
+ const style = acquireStyle(doc);
96
+ const root = doc.createElement("aside");
97
+ root.dataset.wmDevtools = "";
98
+ root.setAttribute("role", "complementary");
99
+ const heading = doc.createElement("h2");
100
+ heading.id = `wm-devtools-title-${Math.round(performance.now())}`;
101
+ heading.textContent = messages.title;
102
+ root.setAttribute("aria-labelledby", heading.id);
103
+ const undo = doc.createElement("button");
104
+ undo.type = "button";
105
+ undo.dataset.wmDevtoolsGlobal = "undo";
106
+ undo.textContent = messages.undo;
107
+ const redo = doc.createElement("button");
108
+ redo.type = "button";
109
+ redo.dataset.wmDevtoolsGlobal = "redo";
110
+ redo.textContent = messages.redo;
111
+ const copy = doc.createElement("button");
112
+ copy.type = "button";
113
+ copy.dataset.wmDevtoolsGlobal = "copy";
114
+ copy.textContent = messages.copyState;
115
+ const header = doc.createElement("header");
116
+ header.append(heading, undo, redo, copy);
117
+ const windowsHead = doc.createElement("h2");
118
+ windowsHead.textContent = messages.windows;
119
+ const windowList = doc.createElement("ul");
120
+ const windowsEmpty = doc.createElement("p");
121
+ windowsEmpty.textContent = messages.empty;
122
+ const windowsSection = doc.createElement("section");
123
+ windowsSection.append(windowsHead, windowsEmpty, windowList);
124
+ const eventsHead = doc.createElement("h2");
125
+ eventsHead.textContent = messages.events;
126
+ const logList = doc.createElement("ul");
127
+ logList.className = "wm-dt-log";
128
+ const logEmpty = doc.createElement("p");
129
+ logEmpty.textContent = messages.quiet;
130
+ const eventsSection = doc.createElement("section");
131
+ eventsSection.append(eventsHead, logEmpty, logList);
132
+ const status = doc.createElement("p");
133
+ status.setAttribute("role", "status");
134
+ status.setAttribute("aria-live", "polite");
135
+ eventsSection.append(status);
136
+ root.append(header, windowsSection, eventsSection);
137
+ let windowHandler = null;
138
+ let globalHandler = null;
139
+ const onClick = (event) => {
140
+ const target = event.target?.closest("button");
141
+ if (!target) return;
142
+ const global = target.dataset.wmDevtoolsGlobal;
143
+ if (global) {
144
+ globalHandler?.(global);
145
+ return;
146
+ }
147
+ const action = target.dataset.wmDevtoolsAction;
148
+ const id = target.dataset.wmDevtoolsId;
149
+ if (action && id) windowHandler?.(action, id);
150
+ };
151
+ root.addEventListener("click", onClick);
152
+ const rows = /* @__PURE__ */ new Map();
153
+ let listOrder = "";
154
+ function buildRow(win) {
155
+ const node = doc.createElement("li");
156
+ node.dataset.wmDevtoolsRow = win.id;
157
+ const id = doc.createElement("span");
158
+ id.className = "wm-dt-id";
159
+ const acts = doc.createElement("span");
160
+ acts.className = "wm-dt-acts";
161
+ const buttons = [
162
+ ["focus", messages.focus],
163
+ ["minimize", messages.minimize],
164
+ ["maximize", messages.maximize],
165
+ ["close", messages.close]
166
+ ];
167
+ for (const [action, label] of buttons) {
168
+ const button = doc.createElement("button");
169
+ button.type = "button";
170
+ button.dataset.wmDevtoolsAction = action;
171
+ button.dataset.wmDevtoolsId = win.id;
172
+ button.textContent = label.slice(0, 1);
173
+ button.setAttribute("aria-label", `${label} ${win.id}`);
174
+ acts.append(button);
175
+ }
176
+ const meta = doc.createElement("span");
177
+ meta.className = "wm-dt-meta";
178
+ node.append(id, acts, meta);
179
+ return { node, id, meta };
180
+ }
181
+ function paintRow(row, win, focused) {
182
+ const label = win.title ? `${win.id} \xB7 ${win.title}` : win.id;
183
+ if (row.id.textContent !== label) row.id.textContent = label;
184
+ const meta = `${messages.stage(win.stage)} \xB7 ${win.layer} \xB7 ${messages.workspace(
185
+ win.workspace
186
+ )} \xB7 ${box(win)}`;
187
+ if (row.meta.textContent !== meta) row.meta.textContent = meta;
188
+ if (focused) row.node.dataset.focused = "";
189
+ else delete row.node.dataset.focused;
190
+ }
191
+ return {
192
+ root,
193
+ onWindowAction(handler) {
194
+ windowHandler = handler;
195
+ },
196
+ onGlobalAction(handler) {
197
+ globalHandler = handler;
198
+ },
199
+ render(state, log, history) {
200
+ const windows = state.order.map((id) => state.windows[id]).filter(Boolean);
201
+ windowsEmpty.hidden = windows.length > 0;
202
+ const ordered = [];
203
+ const live = /* @__PURE__ */ new Set();
204
+ for (let index = windows.length - 1; index >= 0; index -= 1) {
205
+ const win = windows[index];
206
+ live.add(win.id);
207
+ let entry = rows.get(win.id);
208
+ if (!entry) {
209
+ entry = buildRow(win);
210
+ rows.set(win.id, entry);
211
+ }
212
+ paintRow(entry, win, win.id === state.focusedId);
213
+ ordered.push(entry.node);
214
+ }
215
+ for (const [id, entry] of rows) {
216
+ if (live.has(id)) continue;
217
+ entry.node.remove();
218
+ rows.delete(id);
219
+ }
220
+ const key = ordered.map((node) => node.dataset.wmDevtoolsRow).join("|");
221
+ if (key !== listOrder) {
222
+ listOrder = key;
223
+ windowList.replaceChildren(...ordered);
224
+ }
225
+ logEmpty.hidden = log.length > 0;
226
+ logList.replaceChildren(
227
+ ...[...log].reverse().map((entry) => {
228
+ const item = doc.createElement("li");
229
+ const type = doc.createElement("b");
230
+ type.textContent = entry.type;
231
+ const detail = doc.createElement("span");
232
+ detail.textContent = entry.detail;
233
+ item.append(type, detail);
234
+ return item;
235
+ })
236
+ );
237
+ undo.disabled = !history.canUndo;
238
+ redo.disabled = !history.canRedo;
239
+ },
240
+ flash(message) {
241
+ status.textContent = message;
242
+ },
243
+ destroy() {
244
+ root.removeEventListener("click", onClick);
245
+ root.remove();
246
+ releaseStyle(style);
247
+ }
248
+ };
249
+ }
250
+
251
+ // src/plugins/devtools/index.ts
252
+ var DEFAULT_EVENTS = [
253
+ "open",
254
+ "close",
255
+ "focus",
256
+ "stage",
257
+ "workspace",
258
+ "group",
259
+ "modalblocked"
260
+ ];
261
+ function detailOf(type, payload) {
262
+ const data = payload;
263
+ const win = data.window;
264
+ if (win?.id) return type === "stage" ? `${win.id} \u2192 ${win.stage}` : win.id;
265
+ if (typeof data.workspace === "number") return String(data.workspace + 1);
266
+ if (typeof data.groupId === "string") return data.groupId;
267
+ return "";
268
+ }
269
+ function createDevtools(wm, options = {}) {
270
+ const container = options.container ?? document.body;
271
+ const doc = container.ownerDocument;
272
+ const messages = { ...devtoolsMessages, ...options.messages };
273
+ const limit = Math.max(1, options.logLimit ?? 50);
274
+ const watched = options.events ?? DEFAULT_EVENTS;
275
+ const view = createDevtoolsView(doc, messages);
276
+ const log = [];
277
+ let seq = 0;
278
+ function draw() {
279
+ view.render(wm.getState(), log, { canUndo: wm.canUndo(), canRedo: wm.canRedo() });
280
+ }
281
+ function record(type, payload) {
282
+ seq += 1;
283
+ log.push({ seq, type, detail: detailOf(type, payload) });
284
+ if (log.length > limit) log.shift();
285
+ draw();
286
+ }
287
+ const stops = watched.map(
288
+ (type) => wm.on(type, (payload) => {
289
+ record(type, payload);
290
+ })
291
+ );
292
+ stops.push(wm.subscribe(() => draw()));
293
+ view.onWindowAction((action, id) => {
294
+ if (action === "focus") wm.focus(id);
295
+ else if (action === "minimize") wm.minimize(id);
296
+ else if (action === "maximize") wm.toggleMaximize(id);
297
+ else wm.close(id);
298
+ });
299
+ view.onGlobalAction((action) => {
300
+ if (action === "undo") {
301
+ wm.undo();
302
+ return;
303
+ }
304
+ if (action === "redo") {
305
+ wm.redo();
306
+ return;
307
+ }
308
+ const json = JSON.stringify(wm.serialize());
309
+ const clipboard = doc.defaultView?.navigator.clipboard;
310
+ if (clipboard) void clipboard.writeText(json);
311
+ view.flash(clipboard ? messages.copied : json);
312
+ });
313
+ container.append(view.root);
314
+ draw();
315
+ return {
316
+ element: view.root,
317
+ destroy() {
318
+ for (const stop of stops) stop();
319
+ view.destroy();
320
+ }
321
+ };
322
+ }
323
+
324
+ export { createDevtools, devtoolsMessages, devtoolsMessagesRu };
325
+ //# sourceMappingURL=devtools.js.map
326
+ //# sourceMappingURL=devtools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/devtools/messages.ts","../src/plugins/devtools/view.ts","../src/plugins/devtools/index.ts"],"names":[],"mappings":"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","file":"devtools.js","sourcesContent":["import type { WindowStage } from '../../core/types'\n\nexport interface DevtoolsMessages {\n title: string\n windows: string\n events: string\n empty: string\n quiet: string\n focus: string\n minimize: string\n maximize: string\n close: string\n undo: string\n redo: string\n copyState: string\n copied: string\n workspace(index: number): string\n stage(stage: WindowStage): string\n}\n\nconst EN_STAGES: Record<WindowStage, string> = {\n normal: 'normal',\n minimized: 'minimized',\n maximized: 'maximized',\n snapped: 'snapped',\n}\n\nconst RU_STAGES: Record<WindowStage, string> = {\n normal: 'обычное',\n minimized: 'свёрнуто',\n maximized: 'развёрнуто',\n snapped: 'прилипло',\n}\n\nexport const devtoolsMessages: DevtoolsMessages = {\n title: 'wmkit devtools',\n windows: 'windows',\n events: 'events',\n empty: 'no windows open',\n quiet: 'nothing has happened yet',\n focus: 'focus',\n minimize: 'minimize',\n maximize: 'maximize',\n close: 'close',\n undo: 'undo',\n redo: 'redo',\n copyState: 'copy state',\n copied: 'copied',\n workspace: (index) => `workspace ${index + 1}`,\n stage: (stage) => EN_STAGES[stage],\n}\n\nexport const devtoolsMessagesRu: DevtoolsMessages = {\n title: 'wmkit devtools',\n windows: 'окна',\n events: 'события',\n empty: 'открытых окон нет',\n quiet: 'пока ничего не происходило',\n focus: 'фокус',\n minimize: 'свернуть',\n maximize: 'развернуть',\n close: 'закрыть',\n undo: 'отменить',\n redo: 'вернуть',\n copyState: 'скопировать состояние',\n copied: 'скопировано',\n workspace: (index) => `рабочий стол ${index + 1}`,\n stage: (stage) => RU_STAGES[stage],\n}\n","import type { ManagerState, WindowState } from '../../core/types'\nimport type { DevtoolsMessages } from './messages'\n\nexport type DevtoolsAction = 'focus' | 'minimize' | 'maximize' | 'close'\n\nexport type DevtoolsGlobal = 'undo' | 'redo' | 'copy'\n\nexport interface DevtoolsHistory {\n canUndo: boolean\n canRedo: boolean\n}\n\nexport interface DevtoolsLogEntry {\n seq: number\n type: string\n detail: string\n}\n\nexport interface DevtoolsView {\n root: HTMLElement\n onWindowAction(handler: (action: DevtoolsAction, id: string) => void): void\n onGlobalAction(handler: (action: DevtoolsGlobal) => void): void\n render(state: ManagerState, log: readonly DevtoolsLogEntry[], history: DevtoolsHistory): void\n flash(message: string): void\n destroy(): void\n}\n\nconst STYLE_ID = 'wm-devtools-style'\n\nconst CSS = `[data-wm-devtools]{position:fixed;right:16px;bottom:16px;z-index:2147483646;width:340px;max-width:calc(100vw - 32px);max-height:min(70vh,560px);display:flex;flex-direction:column;overflow:hidden;border-radius:10px;border:1px solid rgba(255,255,255,.14);background:#14161c;color:#e7e9f0;font:12px/1.5 ui-monospace,\"SF Mono\",Menlo,Consolas,monospace;box-shadow:0 18px 48px rgba(0,0,0,.45)}\n[data-wm-devtools] h2{margin:0;font-size:11px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:#9aa0b5}\n[data-wm-devtools] header{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid rgba(255,255,255,.1)}\n[data-wm-devtools] header h2{flex:1}\n[data-wm-devtools] button{font:inherit;color:inherit;background:transparent;border:1px solid rgba(255,255,255,.18);border-radius:5px;padding:3px 7px;min-height:24px;cursor:pointer}\n[data-wm-devtools] button:hover:not(:disabled){border-color:#7c6cff}\n[data-wm-devtools] button:disabled{opacity:.45;cursor:not-allowed}\n[data-wm-devtools] button:focus-visible{outline:2px solid #7c6cff;outline-offset:2px}\n[data-wm-devtools] section{padding:10px 12px;overflow:auto}\n[data-wm-devtools] section+section{border-top:1px solid rgba(255,255,255,.1)}\n[data-wm-devtools] ul{list-style:none;margin:6px 0 0;padding:0;display:flex;flex-direction:column;gap:6px}\n[data-wm-devtools] [data-wm-devtools-row]{display:grid;grid-template-columns:1fr auto;gap:4px 8px;padding:7px 8px;border:1px solid rgba(255,255,255,.1);border-radius:6px}\n[data-wm-devtools] [data-wm-devtools-row][data-focused]{border-color:#7c6cff}\n[data-wm-devtools] .wm-dt-id{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n[data-wm-devtools] .wm-dt-meta{grid-column:1/-1;color:#9aa0b5;font-size:11px}\n[data-wm-devtools] .wm-dt-acts{display:flex;gap:4px}\n[data-wm-devtools] .wm-dt-log{gap:2px}\n[data-wm-devtools] .wm-dt-log li{display:flex;gap:8px;color:#9aa0b5}\n[data-wm-devtools] .wm-dt-log b{color:#e7e9f0;font-weight:600;min-width:88px}\n[data-wm-devtools] p{margin:6px 0 0;color:#9aa0b5}\n@media (prefers-reduced-motion:reduce){[data-wm-devtools] *{transition:none!important}}`\n\nfunction acquireStyle(doc: Document): HTMLStyleElement {\n const existing = doc.getElementById(STYLE_ID)\n if (existing instanceof HTMLStyleElement) {\n existing.dataset.owners = String(Number(existing.dataset.owners) + 1)\n return existing\n }\n const style = doc.createElement('style')\n style.id = STYLE_ID\n style.dataset.owners = '1'\n style.textContent = CSS\n doc.head.append(style)\n return style\n}\n\nfunction releaseStyle(style: HTMLStyleElement): void {\n const left = Number(style.dataset.owners) - 1\n if (left > 0) style.dataset.owners = String(left)\n else style.remove()\n}\n\nfunction box(win: WindowState): string {\n const { x, y, width, height } = win.bounds\n return `${Math.round(x)},${Math.round(y)} ${Math.round(width)}×${Math.round(height)}`\n}\n\nexport function createDevtoolsView(doc: Document, messages: DevtoolsMessages): DevtoolsView {\n const style = acquireStyle(doc)\n\n const root = doc.createElement('aside')\n root.dataset.wmDevtools = ''\n root.setAttribute('role', 'complementary')\n\n const heading = doc.createElement('h2')\n heading.id = `wm-devtools-title-${Math.round(performance.now())}`\n heading.textContent = messages.title\n root.setAttribute('aria-labelledby', heading.id)\n\n const undo = doc.createElement('button')\n undo.type = 'button'\n undo.dataset.wmDevtoolsGlobal = 'undo'\n undo.textContent = messages.undo\n\n const redo = doc.createElement('button')\n redo.type = 'button'\n redo.dataset.wmDevtoolsGlobal = 'redo'\n redo.textContent = messages.redo\n\n const copy = doc.createElement('button')\n copy.type = 'button'\n copy.dataset.wmDevtoolsGlobal = 'copy'\n copy.textContent = messages.copyState\n\n const header = doc.createElement('header')\n header.append(heading, undo, redo, copy)\n\n const windowsHead = doc.createElement('h2')\n windowsHead.textContent = messages.windows\n const windowList = doc.createElement('ul')\n const windowsEmpty = doc.createElement('p')\n windowsEmpty.textContent = messages.empty\n const windowsSection = doc.createElement('section')\n windowsSection.append(windowsHead, windowsEmpty, windowList)\n\n const eventsHead = doc.createElement('h2')\n eventsHead.textContent = messages.events\n const logList = doc.createElement('ul')\n logList.className = 'wm-dt-log'\n const logEmpty = doc.createElement('p')\n logEmpty.textContent = messages.quiet\n const eventsSection = doc.createElement('section')\n eventsSection.append(eventsHead, logEmpty, logList)\n\n const status = doc.createElement('p')\n status.setAttribute('role', 'status')\n status.setAttribute('aria-live', 'polite')\n eventsSection.append(status)\n\n root.append(header, windowsSection, eventsSection)\n\n let windowHandler: ((action: DevtoolsAction, id: string) => void) | null = null\n let globalHandler: ((action: DevtoolsGlobal) => void) | null = null\n\n const onClick = (event: MouseEvent) => {\n const target = (event.target as Element | null)?.closest<HTMLElement>('button')\n if (!target) return\n const global = target.dataset.wmDevtoolsGlobal\n if (global) {\n globalHandler?.(global as DevtoolsGlobal)\n return\n }\n const action = target.dataset.wmDevtoolsAction\n const id = target.dataset.wmDevtoolsId\n if (action && id) windowHandler?.(action as DevtoolsAction, id)\n }\n root.addEventListener('click', onClick)\n\n interface Row {\n node: HTMLElement\n id: HTMLElement\n meta: HTMLElement\n }\n\n const rows = new Map<string, Row>()\n let listOrder = ''\n\n function buildRow(win: WindowState): Row {\n const node = doc.createElement('li')\n node.dataset.wmDevtoolsRow = win.id\n\n const id = doc.createElement('span')\n id.className = 'wm-dt-id'\n\n const acts = doc.createElement('span')\n acts.className = 'wm-dt-acts'\n const buttons: Array<[DevtoolsAction, string]> = [\n ['focus', messages.focus],\n ['minimize', messages.minimize],\n ['maximize', messages.maximize],\n ['close', messages.close],\n ]\n for (const [action, label] of buttons) {\n const button = doc.createElement('button')\n button.type = 'button'\n button.dataset.wmDevtoolsAction = action\n button.dataset.wmDevtoolsId = win.id\n button.textContent = label.slice(0, 1)\n button.setAttribute('aria-label', `${label} ${win.id}`)\n acts.append(button)\n }\n\n const meta = doc.createElement('span')\n meta.className = 'wm-dt-meta'\n\n node.append(id, acts, meta)\n return { node, id, meta }\n }\n\n function paintRow(row: Row, win: WindowState, focused: boolean): void {\n const label = win.title ? `${win.id} · ${win.title}` : win.id\n if (row.id.textContent !== label) row.id.textContent = label\n const meta = `${messages.stage(win.stage)} · ${win.layer} · ${messages.workspace(\n win.workspace,\n )} · ${box(win)}`\n if (row.meta.textContent !== meta) row.meta.textContent = meta\n if (focused) row.node.dataset.focused = ''\n else delete row.node.dataset.focused\n }\n\n return {\n root,\n onWindowAction(handler) {\n windowHandler = handler\n },\n onGlobalAction(handler) {\n globalHandler = handler\n },\n render(state, log, history) {\n const windows = state.order.map((id) => state.windows[id]).filter(Boolean) as WindowState[]\n windowsEmpty.hidden = windows.length > 0\n\n const ordered: HTMLElement[] = []\n const live = new Set<string>()\n for (let index = windows.length - 1; index >= 0; index -= 1) {\n const win = windows[index] as WindowState\n live.add(win.id)\n let entry = rows.get(win.id)\n if (!entry) {\n entry = buildRow(win)\n rows.set(win.id, entry)\n }\n paintRow(entry, win, win.id === state.focusedId)\n ordered.push(entry.node)\n }\n for (const [id, entry] of rows) {\n if (live.has(id)) continue\n entry.node.remove()\n rows.delete(id)\n }\n const key = ordered.map((node) => node.dataset.wmDevtoolsRow).join('|')\n if (key !== listOrder) {\n listOrder = key\n windowList.replaceChildren(...ordered)\n }\n logEmpty.hidden = log.length > 0\n logList.replaceChildren(\n ...[...log].reverse().map((entry) => {\n const item = doc.createElement('li')\n const type = doc.createElement('b')\n type.textContent = entry.type\n const detail = doc.createElement('span')\n detail.textContent = entry.detail\n item.append(type, detail)\n return item\n }),\n )\n undo.disabled = !history.canUndo\n redo.disabled = !history.canRedo\n },\n flash(message) {\n status.textContent = message\n },\n destroy() {\n root.removeEventListener('click', onClick)\n root.remove()\n releaseStyle(style)\n },\n }\n}\n","import type { ManagerEvents, WindowManager } from '../../core/types'\nimport { type DevtoolsMessages, devtoolsMessages } from './messages'\nimport { createDevtoolsView, type DevtoolsLogEntry } from './view'\n\nexport type { DevtoolsMessages } from './messages'\nexport { devtoolsMessages, devtoolsMessagesRu } from './messages'\nexport type { DevtoolsAction, DevtoolsLogEntry } from './view'\n\nexport type DevtoolsEvent = keyof ManagerEvents\n\nexport interface DevtoolsOptions {\n container?: HTMLElement\n messages?: Partial<DevtoolsMessages>\n logLimit?: number\n events?: readonly DevtoolsEvent[]\n}\n\nexport interface DevtoolsController {\n element: HTMLElement\n destroy(): void\n}\n\nconst DEFAULT_EVENTS: readonly DevtoolsEvent[] = [\n 'open',\n 'close',\n 'focus',\n 'stage',\n 'workspace',\n 'group',\n 'modalblocked',\n]\n\nfunction detailOf(type: DevtoolsEvent, payload: unknown): string {\n const data = payload as Record<string, unknown>\n const win = data.window as { id?: string; stage?: string } | undefined\n if (win?.id) return type === 'stage' ? `${win.id} → ${win.stage}` : win.id\n if (typeof data.workspace === 'number') return String(data.workspace + 1)\n if (typeof data.groupId === 'string') return data.groupId\n return ''\n}\n\nexport function createDevtools(\n wm: WindowManager,\n options: DevtoolsOptions = {},\n): DevtoolsController {\n const container = options.container ?? document.body\n const doc = container.ownerDocument\n const messages: DevtoolsMessages = { ...devtoolsMessages, ...options.messages }\n const limit = Math.max(1, options.logLimit ?? 50)\n const watched = options.events ?? DEFAULT_EVENTS\n\n const view = createDevtoolsView(doc, messages)\n const log: DevtoolsLogEntry[] = []\n let seq = 0\n\n function draw(): void {\n view.render(wm.getState(), log, { canUndo: wm.canUndo(), canRedo: wm.canRedo() })\n }\n\n function record(type: DevtoolsEvent, payload: unknown): void {\n seq += 1\n log.push({ seq, type, detail: detailOf(type, payload) })\n if (log.length > limit) log.shift()\n draw()\n }\n\n const stops = watched.map((type) =>\n wm.on(type, (payload: unknown) => {\n record(type, payload)\n }),\n )\n stops.push(wm.subscribe(() => draw()))\n\n view.onWindowAction((action, id) => {\n if (action === 'focus') wm.focus(id)\n else if (action === 'minimize') wm.minimize(id)\n else if (action === 'maximize') wm.toggleMaximize(id)\n else wm.close(id)\n })\n\n view.onGlobalAction((action) => {\n if (action === 'undo') {\n wm.undo()\n return\n }\n if (action === 'redo') {\n wm.redo()\n return\n }\n const json = JSON.stringify(wm.serialize())\n const clipboard = doc.defaultView?.navigator.clipboard\n if (clipboard) void clipboard.writeText(json)\n view.flash(clipboard ? messages.copied : json)\n })\n\n container.append(view.root)\n draw()\n\n return {\n element: view.root,\n destroy() {\n for (const stop of stops) stop()\n view.destroy()\n },\n }\n}\n"]}
@@ -0,0 +1,219 @@
1
+ 'use strict';
2
+
3
+ var chunkBDHFXEJN_cjs = require('./chunk-BDHFXEJN.cjs');
4
+
5
+ // src/plugins/gestures.ts
6
+ function spreadOf(a, b) {
7
+ return Math.hypot(a.x - b.x, a.y - b.y);
8
+ }
9
+ function watch(ctx, options) {
10
+ const { wm, doc, view } = ctx;
11
+ const element = ctx.desktop;
12
+ const fingers = /* @__PURE__ */ new Map();
13
+ let armed = false;
14
+ let target = null;
15
+ let startSpread = 0;
16
+ let startMid = { x: 0, y: 0 };
17
+ let session = null;
18
+ let releaseRect = null;
19
+ let raf = 0;
20
+ let pending = null;
21
+ function windowIdAt(event) {
22
+ const host = event.target?.closest("[data-wm-window]");
23
+ return host?.dataset.wmWindow ?? null;
24
+ }
25
+ function pair() {
26
+ if (fingers.size !== 2) return null;
27
+ const [first, second] = [...fingers.values()];
28
+ return [first, second];
29
+ }
30
+ function disarm() {
31
+ armed = false;
32
+ target = null;
33
+ pending = null;
34
+ if (raf !== 0) {
35
+ view.cancelAnimationFrame(raf);
36
+ raf = 0;
37
+ }
38
+ }
39
+ function endPinch(cancelled) {
40
+ const active = session;
41
+ if (!active) return;
42
+ session = null;
43
+ if (cancelled) wm.resize(active.id, active.startBounds);
44
+ ctx.release(active);
45
+ releaseRect?.();
46
+ releaseRect = null;
47
+ const host = ctx.windowElement(active.id);
48
+ if (host) delete host.dataset.wmPinching;
49
+ if (cancelled) wm.abortInteraction();
50
+ else wm.endInteraction();
51
+ }
52
+ function beginPinch(id, mid) {
53
+ const win = wm.get(id);
54
+ if (!win) return;
55
+ const claimed = {
56
+ id,
57
+ finish: (cancelled) => endPinch(cancelled),
58
+ startBounds: win.bounds,
59
+ midX: mid.x,
60
+ midY: mid.y
61
+ };
62
+ session = claimed;
63
+ ctx.claim(claimed);
64
+ wm.beginInteraction();
65
+ releaseRect = ctx.trackRect();
66
+ const host = ctx.windowElement(id);
67
+ if (host) host.dataset.wmPinching = "";
68
+ }
69
+ function applyPinch(active, win, spread) {
70
+ const start = active.startBounds;
71
+ const ratio = spread / startSpread;
72
+ const raw = { width: start.width * ratio, height: start.height * ratio };
73
+ const size = win.aspectRatio === null ? chunkBDHFXEJN_cjs.clampSize(raw, win.minSize, win.maxSize) : chunkBDHFXEJN_cjs.applyAspect(raw, win.aspectRatio, win.minSize, win.maxSize, "width");
74
+ const sx = size.width / start.width;
75
+ const sy = size.height / start.height;
76
+ wm.resize(active.id, {
77
+ x: active.midX - (active.midX - start.x) * sx,
78
+ y: active.midY - (active.midY - start.y) * sy,
79
+ ...size
80
+ });
81
+ }
82
+ function flush() {
83
+ raf = 0;
84
+ const points = pending;
85
+ pending = null;
86
+ if (!points) return;
87
+ const [a, b] = points;
88
+ const spread = spreadOf(a, b);
89
+ const mid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };
90
+ const pinch2 = options.pinch;
91
+ if (session) {
92
+ const win = wm.get(session.id);
93
+ if (win) applyPinch(session, win, spread);
94
+ return;
95
+ }
96
+ if (pinch2 !== null && target !== null && Math.abs(spread - startSpread) > pinch2.threshold) {
97
+ const win = wm.get(target);
98
+ if (!win) return;
99
+ beginPinch(target, startMid);
100
+ if (session) applyPinch(session, win, spread);
101
+ return;
102
+ }
103
+ const swipe2 = options.swipe;
104
+ if (swipe2 === null) return;
105
+ const dx = mid.x - startMid.x;
106
+ const dy = mid.y - startMid.y;
107
+ if (Math.abs(dx) < swipe2.threshold || Math.abs(dx) <= 2 * Math.abs(dy)) return;
108
+ disarm();
109
+ const next = wm.workspace() + (dx < 0 ? 1 : -1);
110
+ if (swipe2.workspaces > 0 && next > swipe2.workspaces - 1) return;
111
+ wm.setWorkspace(next);
112
+ }
113
+ function onDown(event) {
114
+ if (event.pointerType !== "touch") return;
115
+ if (fingers.size >= 2) {
116
+ disarm();
117
+ return;
118
+ }
119
+ fingers.set(event.pointerId, { point: ctx.toLocal(event), windowId: windowIdAt(event) });
120
+ const both = pair();
121
+ if (!both) return;
122
+ if (ctx.busy()) return;
123
+ const [first, second] = both;
124
+ startSpread = spreadOf(first.point, second.point);
125
+ if (startSpread === 0) return;
126
+ startMid = {
127
+ x: (first.point.x + second.point.x) / 2,
128
+ y: (first.point.y + second.point.y) / 2
129
+ };
130
+ const shared = first.windowId === second.windowId ? first.windowId : null;
131
+ const state = shared === null ? void 0 : wm.get(shared);
132
+ target = state?.resizable && state.stage === "normal" ? state.id : null;
133
+ armed = true;
134
+ }
135
+ function onMove(event) {
136
+ const finger = fingers.get(event.pointerId);
137
+ if (!finger) return;
138
+ finger.point = ctx.toLocal(event);
139
+ if (!armed) return;
140
+ const both = pair();
141
+ if (!both) return;
142
+ pending = [both[0].point, both[1].point];
143
+ if (raf === 0) raf = view.requestAnimationFrame(flush);
144
+ }
145
+ function onRelease(event) {
146
+ if (!fingers.delete(event.pointerId)) return;
147
+ if (pending) {
148
+ if (raf !== 0) {
149
+ view.cancelAnimationFrame(raf);
150
+ raf = 0;
151
+ }
152
+ flush();
153
+ }
154
+ if (session) endPinch(false);
155
+ disarm();
156
+ }
157
+ function onCancel(event) {
158
+ if (!fingers.delete(event.pointerId)) return;
159
+ if (session) endPinch(true);
160
+ disarm();
161
+ }
162
+ function onKeydown(event) {
163
+ if (event.key !== "Escape" || !session) return;
164
+ event.preventDefault();
165
+ endPinch(true);
166
+ disarm();
167
+ }
168
+ const previousTouchAction = element.style.touchAction;
169
+ if (options.pinch) {
170
+ element.style.touchAction = options.pinch.lockTouchAction ? "none" : "pan-x pan-y";
171
+ }
172
+ element.addEventListener("pointerdown", onDown);
173
+ element.addEventListener("pointermove", onMove);
174
+ element.addEventListener("pointerup", onRelease);
175
+ element.addEventListener("pointercancel", onCancel);
176
+ doc.addEventListener("keydown", onKeydown, true);
177
+ return () => {
178
+ if (session) endPinch(true);
179
+ disarm();
180
+ fingers.clear();
181
+ element.style.touchAction = previousTouchAction;
182
+ element.removeEventListener("pointerdown", onDown);
183
+ element.removeEventListener("pointermove", onMove);
184
+ element.removeEventListener("pointerup", onRelease);
185
+ element.removeEventListener("pointercancel", onCancel);
186
+ doc.removeEventListener("keydown", onKeydown, true);
187
+ };
188
+ }
189
+ function pinch(options = {}) {
190
+ const settings = {
191
+ threshold: options.threshold ?? 12,
192
+ lockTouchAction: options.lockTouchAction === true
193
+ };
194
+ return (ctx) => watch(ctx, { pinch: settings, swipe: null });
195
+ }
196
+ function swipe(options = {}) {
197
+ const settings = {
198
+ threshold: options.threshold ?? 72,
199
+ workspaces: options.workspaces ?? 0
200
+ };
201
+ return (ctx) => watch(ctx, { pinch: null, swipe: settings });
202
+ }
203
+ function touchGestures(options = {}) {
204
+ const pinchSettings = {
205
+ threshold: options.pinch?.threshold ?? 12,
206
+ lockTouchAction: options.pinch?.lockTouchAction === true
207
+ };
208
+ const swipeSettings = {
209
+ threshold: options.swipe?.threshold ?? 72,
210
+ workspaces: options.swipe?.workspaces ?? 0
211
+ };
212
+ return (ctx) => watch(ctx, { pinch: pinchSettings, swipe: swipeSettings });
213
+ }
214
+
215
+ exports.pinch = pinch;
216
+ exports.swipe = swipe;
217
+ exports.touchGestures = touchGestures;
218
+ //# sourceMappingURL=gestures.cjs.map
219
+ //# sourceMappingURL=gestures.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/gestures.ts"],"names":["clampSize","applyAspect","pinch","swipe"],"mappings":"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","file":"gestures.cjs","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"]}
@@ -0,0 +1,19 @@
1
+ import { d as DesktopGesture } from './shared-DdGFz3oy.cjs';
2
+ import './types-jG2lHGcA.cjs';
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 };