@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.
- package/README.md +37 -2
- package/README.ru.md +37 -2
- package/dist/angular.cjs +4 -3
- package/dist/angular.cjs.map +1 -1
- package/dist/angular.d.cts +2 -1
- package/dist/angular.d.ts +2 -1
- package/dist/angular.js +2 -1
- package/dist/angular.js.map +1 -1
- package/dist/binder-B625OrjD.d.cts +13 -0
- package/dist/binder-CpGY8Wye.d.ts +13 -0
- package/dist/chunk-5XVIC5LH.js +140 -0
- package/dist/chunk-5XVIC5LH.js.map +1 -0
- package/dist/chunk-BDHFXEJN.cjs +149 -0
- package/dist/chunk-BDHFXEJN.cjs.map +1 -0
- package/dist/{chunk-NJAI5R4J.cjs → chunk-DINVOL6Z.cjs} +48 -170
- package/dist/chunk-DINVOL6Z.cjs.map +1 -0
- package/dist/{chunk-FOWW4LXS.js → chunk-MGWCKHTZ.js} +29 -143
- package/dist/chunk-MGWCKHTZ.js.map +1 -0
- package/dist/devtools.cjs +330 -0
- package/dist/devtools.cjs.map +1 -0
- package/dist/devtools.d.cts +43 -0
- package/dist/devtools.d.ts +43 -0
- package/dist/devtools.js +326 -0
- package/dist/devtools.js.map +1 -0
- package/dist/gestures.cjs +219 -0
- package/dist/gestures.cjs.map +1 -0
- package/dist/gestures.d.cts +19 -0
- package/dist/gestures.d.ts +19 -0
- package/dist/gestures.js +215 -0
- package/dist/gestures.js.map +1 -0
- package/dist/index.cjs +35 -34
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -1
- package/dist/react.cjs +4 -3
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +2 -1
- package/dist/react.d.ts +2 -1
- package/dist/react.js +2 -1
- package/dist/react.js.map +1 -1
- package/dist/{binder-DvQFmO3K.d.ts → shared-BBXgEeIa.d.ts} +22 -8
- package/dist/{binder-_L3Iww0u.d.cts → shared-DU_87nY9.d.cts} +22 -8
- package/dist/solid.cjs +4 -3
- package/dist/solid.cjs.map +1 -1
- package/dist/solid.d.cts +2 -1
- package/dist/solid.d.ts +2 -1
- package/dist/solid.js +2 -1
- package/dist/solid.js.map +1 -1
- package/dist/svelte.cjs +4 -3
- package/dist/svelte.cjs.map +1 -1
- package/dist/svelte.d.cts +2 -1
- package/dist/svelte.d.ts +2 -1
- package/dist/svelte.js +2 -1
- package/dist/svelte.js.map +1 -1
- package/dist/themes/amber.css +316 -0
- package/dist/themes/aqua.css +285 -0
- package/dist/themes/blueprint.css +303 -0
- package/dist/themes/brutalist.css +307 -0
- package/dist/themes/candy.css +277 -0
- package/dist/themes/carbon.css +297 -0
- package/dist/themes/forest.css +278 -0
- package/dist/themes/frost.css +279 -0
- package/dist/themes/glass.css +2 -1
- package/dist/themes/light.css +2 -1
- package/dist/themes/neon.css +289 -0
- package/dist/themes/noir.css +282 -0
- package/dist/themes/paper.css +258 -0
- package/dist/themes/synth.css +283 -0
- package/dist/themes/terminal.css +273 -0
- package/dist/vue.cjs +4 -3
- package/dist/vue.cjs.map +1 -1
- package/dist/vue.d.cts +2 -1
- package/dist/vue.d.ts +2 -1
- package/dist/vue.js +2 -1
- package/dist/vue.js.map +1 -1
- package/package.json +37 -1
- package/dist/chunk-FOWW4LXS.js.map +0 -1
- package/dist/chunk-NJAI5R4J.cjs.map +0 -1
package/dist/devtools.js
ADDED
|
@@ -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-DU_87nY9.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 };
|