vintage-frames 0.14.1 → 0.15.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/custom-elements.json +94 -14
- package/dist/components/vf-button.d.ts +5 -1
- package/dist/components/vf-button.js +1 -1
- package/dist/components/vf-dialog.d.ts +7 -1
- package/dist/events.d.ts +3 -2
- package/dist/events.js +3 -3
- package/dist/index.d.ts +1 -1
- package/dist/modal-dialog.d.ts +31 -4
- package/dist/modal-dialog.js +98 -82
- package/dist/position.js +25 -20
- package/dist/shell/alert.d.ts +17 -9
- package/dist/shell/alert.js +25 -28
- package/dist/shell/finder.d.ts +41 -1
- package/dist/shell/finder.js +212 -178
- package/dist/shell/index.d.ts +1 -3
- package/dist/shell/index.js +5 -6
- package/dist/shell/shell.d.ts +25 -11
- package/dist/shell/shell.js +143 -122
- package/dist/shell/windows.d.ts +21 -2
- package/dist/shell/windows.js +169 -125
- package/dist/text-control.d.ts +6 -0
- package/dist/text-control.js +2 -2
- package/docs/SPEC.md +5 -5
- package/editor/vscode.html-custom-data.json +2 -2
- package/editor/web-types.json +11 -6
- package/package.json +1 -1
package/dist/shell/finder.js
CHANGED
|
@@ -6,8 +6,14 @@ import { FOLDER as i, TRASH as a, childrenOf as o, enclosingFolders as s, isCont
|
|
|
6
6
|
import { cleanUp as ee, collisions as te, desktopLattice as ne, fieldExtent as re, fillOrder as ie, folderLattice as ae, frameOf as oe, nextFreeCell as se, pinOf as ce, pinTo as le, trashCell as ue } from "./geometry.js";
|
|
7
7
|
import { appIdOf as de, defineApp as p } from "./shell.js";
|
|
8
8
|
import { fileByDrag as fe } from "./filing.js";
|
|
9
|
+
import { composeAlert as pe } from "./alert.js";
|
|
9
10
|
//#region src/shell/finder.ts
|
|
10
|
-
var m = "finder",
|
|
11
|
+
var m = "finder", me = 306, he = 300, ge = {
|
|
12
|
+
"new-folder": "New Folder",
|
|
13
|
+
"empty-trash": "Empty Trash",
|
|
14
|
+
paste: "Paste",
|
|
15
|
+
"add-file": "Adding the file"
|
|
16
|
+
}, _e = 20, ve = 18, h = {
|
|
11
17
|
left: 8,
|
|
12
18
|
top: 2
|
|
13
19
|
}, g = {
|
|
@@ -16,7 +22,7 @@ var m = "finder", pe = 306, me = 300, he = 20, ge = 18, h = {
|
|
|
16
22
|
}, _ = {
|
|
17
23
|
left: h.left - 1,
|
|
18
24
|
top: h.top
|
|
19
|
-
},
|
|
25
|
+
}, ye = {
|
|
20
26
|
left: _.left + g.width + 3,
|
|
21
27
|
top: h.top
|
|
22
28
|
}, v = [
|
|
@@ -79,17 +85,17 @@ function y(e) {
|
|
|
79
85
|
return i.length ? `<vf-menu data-menu="${t}" label="${n}">${i.join("")}</vf-menu>` : "";
|
|
80
86
|
}).join("");
|
|
81
87
|
}
|
|
82
|
-
var
|
|
83
|
-
function
|
|
88
|
+
var be = (e) => e.localName === "vf-icon" && e.dataset.app != null || e instanceof HTMLTemplateElement && e.dataset.folder != null;
|
|
89
|
+
function xe(e) {
|
|
84
90
|
let t = (e, t) => e != null && t != null && Number.isFinite(+e) && Number.isFinite(+t) ? {
|
|
85
91
|
left: +e,
|
|
86
92
|
top: +t
|
|
87
93
|
} : void 0, n = [];
|
|
88
|
-
for (let r of [...e.children].filter(
|
|
94
|
+
for (let r of [...e.children].filter(be)) r instanceof HTMLTemplateElement ? n.push({
|
|
89
95
|
kind: i,
|
|
90
96
|
name: r.dataset.folder ?? null,
|
|
91
97
|
at: t(r.dataset.left, r.dataset.top),
|
|
92
|
-
children:
|
|
98
|
+
children: xe(r.content)
|
|
93
99
|
}) : n.push({
|
|
94
100
|
kind: "app",
|
|
95
101
|
name: r.getAttribute("label"),
|
|
@@ -100,12 +106,12 @@ function ye(e) {
|
|
|
100
106
|
return n;
|
|
101
107
|
}
|
|
102
108
|
function b(i) {
|
|
103
|
-
let b = i.volumes?.trash !== !1, x = (e) => i.commands?.[e] !== !1 && (e !== "empty-trash" || b),
|
|
109
|
+
let b = i.volumes?.trash !== !1, x = (e) => i.commands?.[e] !== !1 && (e !== "empty-trash" || b), Se = [], Ce = (e) => e, S = i.seed === "markup" ? async (e) => {
|
|
104
110
|
let t = Date.now(), n = async (r, i) => {
|
|
105
111
|
for (let a of r) {
|
|
106
112
|
let r = await e.create({
|
|
107
113
|
kind: a.kind,
|
|
108
|
-
name: a.name ?? (a.app == null ? void 0 :
|
|
114
|
+
name: a.name ?? (a.app == null ? void 0 : Ce(a.app)),
|
|
109
115
|
parent: i,
|
|
110
116
|
...a.at,
|
|
111
117
|
...a.app == null ? {} : { data: { app: a.app } },
|
|
@@ -114,12 +120,13 @@ function b(i) {
|
|
|
114
120
|
r && a.children.length && await n(a.children, r.id);
|
|
115
121
|
}
|
|
116
122
|
};
|
|
117
|
-
await n(
|
|
123
|
+
await n(Se, null);
|
|
118
124
|
} : i.seed;
|
|
119
125
|
return p({
|
|
120
126
|
id: m,
|
|
121
127
|
name: "Finder",
|
|
122
128
|
menus: y(x),
|
|
129
|
+
dialogs: i.dialogs,
|
|
123
130
|
catalog: {
|
|
124
131
|
storage: i.storage,
|
|
125
132
|
volumes: i.volumes,
|
|
@@ -127,53 +134,76 @@ function b(i) {
|
|
|
127
134
|
},
|
|
128
135
|
init(p) {
|
|
129
136
|
let { desktop: y, windows: S } = p, C = p.catalog, w = i.art;
|
|
130
|
-
|
|
131
|
-
let T = i.lattice?.desktop?.cell ?? 64,
|
|
137
|
+
Ce = (e) => p.app(e)?.name ?? e;
|
|
138
|
+
let T = i.lattice?.desktop?.cell ?? 64, we = i.lattice?.folder?.cell ?? 64, Te = i.window ?? {
|
|
132
139
|
width: 320,
|
|
133
140
|
height: 223
|
|
134
141
|
}, E = r({
|
|
135
142
|
scrollbars: "both",
|
|
136
|
-
headerHeight:
|
|
137
|
-
}),
|
|
138
|
-
|
|
139
|
-
|
|
143
|
+
headerHeight: _e
|
|
144
|
+
}), Ee = /* @__PURE__ */ new Map();
|
|
145
|
+
async function D(e, t, n, r = {}) {
|
|
146
|
+
let i = Ee.get(e);
|
|
147
|
+
if (i) return i(t);
|
|
148
|
+
let a = pe(n, {
|
|
149
|
+
art: w.caution ?? null,
|
|
150
|
+
...r
|
|
151
|
+
});
|
|
152
|
+
p.hold(a.dialog);
|
|
153
|
+
try {
|
|
154
|
+
await a.rendered();
|
|
155
|
+
let e = p.ask(a.dialog);
|
|
156
|
+
return a.fit(), await e;
|
|
157
|
+
} finally {
|
|
158
|
+
p.release(a.dialog);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
let O = (e) => (t) => {
|
|
162
|
+
let n = t;
|
|
163
|
+
D("failed", {
|
|
164
|
+
action: e,
|
|
165
|
+
error: n
|
|
166
|
+
}, `${ge[e]} failed: ${n.message}.`);
|
|
167
|
+
}, k = y.querySelector(":scope > vf-icon-field"), De = !k;
|
|
168
|
+
if (!k) {
|
|
169
|
+
k = document.createElement("vf-icon-field"), k.label = "Desktop", k.toggleAttribute("fill-width", !0), k.toggleAttribute("fill-height", !0);
|
|
140
170
|
let e = y.querySelector(":scope > vf-menu-bar");
|
|
141
|
-
e ? e.after(
|
|
171
|
+
e ? e.after(k) : y.prepend(k);
|
|
142
172
|
}
|
|
143
|
-
let
|
|
144
|
-
|
|
145
|
-
for (let e of
|
|
146
|
-
let
|
|
147
|
-
let n =
|
|
173
|
+
let A = k, Oe = [...A.children].filter(be);
|
|
174
|
+
Se = xe(A);
|
|
175
|
+
for (let e of Oe) e.remove();
|
|
176
|
+
let j = () => S.windowsOf(m).map((e) => [S.itemOf(e), e]).filter((e) => e[0] != null), M = (e) => e.querySelector(":scope > vf-icon-field"), N = () => [[null, A], ...j().flatMap(([e, t]) => {
|
|
177
|
+
let n = M(t);
|
|
148
178
|
return n ? [[e, n]] : [];
|
|
149
|
-
})],
|
|
179
|
+
})], ke = (e) => N().find(([t]) => t === e)?.[1] ?? null, P = (e) => [...e.querySelectorAll(":scope > vf-icon[data-id]")], F = () => N().flatMap(([, e]) => P(e)), I = (e) => e.dataset.id, L = (e) => F().find((t) => I(t) === e) ?? null, R = (e) => ({
|
|
150
180
|
left: e.left ?? 0,
|
|
151
181
|
top: e.top ?? 0
|
|
152
|
-
}),
|
|
182
|
+
}), Ae = (e) => S.itemOf(e.closest("vf-window")), je = (e) => ({
|
|
153
183
|
width: Math.max(0, (e.width ?? 0) - E.left - E.right),
|
|
154
184
|
height: Math.max(0, (e.height ?? 0) - E.top - E.bottom)
|
|
155
|
-
}),
|
|
185
|
+
}), Me = (e) => {
|
|
156
186
|
if (e == null) return ne(y.workArea, i.lattice?.desktop);
|
|
157
187
|
let t = S.windowFor(e);
|
|
158
|
-
return ae(t ?
|
|
159
|
-
},
|
|
160
|
-
let t = S.windowFor(e), n = t &&
|
|
188
|
+
return ae(t ? je(t).width : 0, i.lattice?.folder);
|
|
189
|
+
}, Ne = (e) => {
|
|
190
|
+
let t = S.windowFor(e), n = t && M(t);
|
|
161
191
|
if (!t || !n) return;
|
|
162
|
-
let r = re(
|
|
192
|
+
let r = re(P(n).map(R), je(t), { cell: we });
|
|
163
193
|
n.width !== r.width && (n.width = r.width), n.height !== r.height && (n.height = r.height);
|
|
164
|
-
},
|
|
194
|
+
}, Pe = (n, r, i) => {
|
|
165
195
|
if (r == null) {
|
|
166
196
|
let r = y.workArea, a = t(n), o = (e) => Math.floor(e / a) * a, s = Math.ceil(r.top / a) * a, c = Math.max(r.left, o(r.left + r.width - T)), l = Math.max(s, o(r.top + r.height - T));
|
|
167
197
|
n.left = Math.min(Math.max(e(i.left, n), r.left), c), n.top = Math.min(Math.max(e(i.top, n), s), l);
|
|
168
198
|
} else n.left = e(Math.max(0, i.left), n), n.top = e(Math.max(0, i.top), n);
|
|
169
|
-
},
|
|
199
|
+
}, Fe = (e) => {
|
|
170
200
|
if (e.kind === "folder") return w.folder;
|
|
171
201
|
if (e.kind === "trash") return f(C.get(), "trash") ? w.trashFull : w.trash;
|
|
172
202
|
if (e.kind === "disk") return w.disk ?? w.folder;
|
|
173
203
|
let t = p.kind(e.kind);
|
|
174
204
|
return (typeof t?.art == "function" ? t.art(e) : t?.art) || w.document;
|
|
175
205
|
};
|
|
176
|
-
function
|
|
206
|
+
function Ie(e, t) {
|
|
177
207
|
let n = e.querySelector(":scope > vf-img > img");
|
|
178
208
|
if (!n) {
|
|
179
209
|
let t = document.createElement("vf-img");
|
|
@@ -181,82 +211,82 @@ function b(i) {
|
|
|
181
211
|
}
|
|
182
212
|
n.getAttribute("src") !== t && (n.src = t);
|
|
183
213
|
}
|
|
184
|
-
function
|
|
214
|
+
function Le(e) {
|
|
185
215
|
let t = document.createElement("vf-icon");
|
|
186
216
|
return t.dataset.id = e.id, t.label = e.name, t.width = T, t.selectable = !0, t.movable = !0, c(e.kind) && (t.dataset.folder = e.id), t;
|
|
187
217
|
}
|
|
188
|
-
let
|
|
189
|
-
function
|
|
218
|
+
let z = /* @__PURE__ */ new Set(), B = /* @__PURE__ */ new WeakMap();
|
|
219
|
+
function Re(e, t, n, r) {
|
|
190
220
|
if (t.left != null && t.top != null) {
|
|
191
221
|
let r = `${t.left},${t.top}`;
|
|
192
|
-
if (
|
|
193
|
-
|
|
222
|
+
if (B.get(e) === r) return;
|
|
223
|
+
B.set(e, r), (e.left !== t.left || e.top !== t.top) && Pe(e, n, {
|
|
194
224
|
left: t.left,
|
|
195
225
|
top: t.top
|
|
196
226
|
});
|
|
197
227
|
return;
|
|
198
228
|
}
|
|
199
|
-
let a =
|
|
200
|
-
|
|
229
|
+
let a = P(r).filter((t) => t !== e && t.left != null && t.top != null).map(R), o = n == null && t.id === "trash" ? ue(y.workArea, i.lattice?.desktop) : se(Me(n), a, n == null ? T : we);
|
|
230
|
+
Pe(e, n, o), z.add(e);
|
|
201
231
|
}
|
|
202
|
-
let
|
|
203
|
-
function
|
|
204
|
-
if (!
|
|
205
|
-
|
|
232
|
+
let V = !1;
|
|
233
|
+
function H() {
|
|
234
|
+
if (!V) {
|
|
235
|
+
V = !0;
|
|
206
236
|
try {
|
|
207
|
-
let e = C.get(), t = new Map(
|
|
208
|
-
for (let [a, s] of
|
|
209
|
-
let e = t.get(c.id) ??
|
|
210
|
-
e.parentElement !== s && (s.append(e), e.left = void 0, e.top = void 0,
|
|
237
|
+
let e = C.get(), t = new Map(F().map((e) => [I(e), e])), n = /* @__PURE__ */ new Set(), r = [], i = [];
|
|
238
|
+
for (let [a, s] of N()) for (let c of o(e, a)) {
|
|
239
|
+
let e = t.get(c.id) ?? Le(c);
|
|
240
|
+
e.parentElement !== s && (s.append(e), e.left = void 0, e.top = void 0, B.delete(e)), n.add(e), e.label !== c.name && (e.label = c.name), e.editable = !d(c.id) && p.kind(c.kind)?.editable !== !1, Ie(e, Fe(c));
|
|
211
241
|
let o = c.kind === "app" ? S.hasWindows(de(c) ?? "") : S.isOpen(c.id);
|
|
212
242
|
e.open !== o && (e.open = o);
|
|
213
|
-
let l = () =>
|
|
243
|
+
let l = () => Re(e, c, a, s);
|
|
214
244
|
c.left != null && c.top != null ? r.push(l) : i.push(l);
|
|
215
245
|
}
|
|
216
246
|
for (let e of t.values()) n.has(e) || e.remove();
|
|
217
247
|
for (let e of [...r, ...i]) e();
|
|
218
|
-
for (let [e, t] of
|
|
219
|
-
let n =
|
|
220
|
-
n && r != null && n.label !== r && (n.label = r),
|
|
248
|
+
for (let [e, t] of j()) {
|
|
249
|
+
let n = M(t), r = C.item(e)?.name;
|
|
250
|
+
n && r != null && n.label !== r && (n.label = r), Ve(e), Ne(e);
|
|
221
251
|
}
|
|
222
252
|
} finally {
|
|
223
|
-
|
|
253
|
+
V = !1;
|
|
224
254
|
}
|
|
225
|
-
|
|
255
|
+
ze();
|
|
226
256
|
}
|
|
227
257
|
}
|
|
228
|
-
let
|
|
229
|
-
function
|
|
230
|
-
if (
|
|
258
|
+
let U = !1;
|
|
259
|
+
function ze() {
|
|
260
|
+
if (U = !1, !z.size) return;
|
|
231
261
|
let e = /* @__PURE__ */ new Map();
|
|
232
|
-
for (let t of
|
|
233
|
-
|
|
262
|
+
for (let t of z) t.isConnected && t.left != null && t.top != null && e.set(I(t), R(t));
|
|
263
|
+
z.clear(), C.place(e);
|
|
234
264
|
}
|
|
235
265
|
p.on(y, "vf-placement-change", (e) => {
|
|
236
266
|
let t = e.target;
|
|
237
|
-
t.localName === "vf-icon" && t.dataset.id != null && (
|
|
238
|
-
}), p.onDispose(C.subscribe(
|
|
239
|
-
function
|
|
267
|
+
t.localName === "vf-icon" && t.dataset.id != null && (z.add(t), !U && (U = !0, queueMicrotask(ze)));
|
|
268
|
+
}), p.onDispose(C.subscribe(H)), p.onDispose(S.onWindows(H));
|
|
269
|
+
function Be() {
|
|
240
270
|
let e = document.createElement("vf-img");
|
|
241
271
|
e.dataset.trashMark = "", e.width = g.width, e.height = g.height, e.left = _.left, e.top = _.top;
|
|
242
272
|
let t = document.createElement("img");
|
|
243
273
|
return t.alt = "in the Trash", t.src = w.trashMark, e.append(t), e;
|
|
244
274
|
}
|
|
245
|
-
function
|
|
275
|
+
function Ve(e) {
|
|
246
276
|
let t = S.windowFor(e)?.querySelector(":scope > [slot=\"header\"]"), n = t?.querySelector(":scope > vf-label[data-count]");
|
|
247
277
|
if (!t || !n) return;
|
|
248
278
|
let r = C.get(), i = f(r, e), a = `${i} item${i === 1 ? "" : "s"}`;
|
|
249
279
|
n.textContent !== a && (n.textContent = a);
|
|
250
280
|
let o = !!w.trashMark && u(r, e), s = t.querySelector(":scope > vf-img[data-trash-mark]");
|
|
251
|
-
o && !s ? t.prepend(
|
|
252
|
-
let c = o ?
|
|
281
|
+
o && !s ? t.prepend(Be()) : !o && s && s.remove();
|
|
282
|
+
let c = o ? ye : h;
|
|
253
283
|
n.left !== c.left && (n.left = c.left);
|
|
254
284
|
}
|
|
255
|
-
function
|
|
285
|
+
function He(e) {
|
|
256
286
|
let t = C.item(e)?.name ?? "", n = document.createElement("vf-window");
|
|
257
|
-
n.heading = t, n.movable = !0, n.outlineDrag = !0, n.resizable = !0, n.scrollbars = "both", n.headerHeight =
|
|
287
|
+
n.heading = t, n.movable = !0, n.outlineDrag = !0, n.resizable = !0, n.scrollbars = "both", n.headerHeight = _e, n.width = Te.width, n.height = Te.height;
|
|
258
288
|
let r = document.createElement("vf-container");
|
|
259
|
-
r.slot = "header", r.toggleAttribute("fill-width", !0), r.height =
|
|
289
|
+
r.slot = "header", r.toggleAttribute("fill-width", !0), r.height = ve, r.rule = "bottom";
|
|
260
290
|
let i = document.createElement("vf-label");
|
|
261
291
|
i.face = "body", i.dataset.count = "", i.left = h.left, i.top = h.top, r.append(i);
|
|
262
292
|
let a = document.createElement("vf-icon-field");
|
|
@@ -265,64 +295,64 @@ function b(i) {
|
|
|
265
295
|
p.on(y, "vf-resize", (e) => {
|
|
266
296
|
if (!e.detail?.commit || S.appOf(e.target) !== "finder") return;
|
|
267
297
|
let t = S.itemOf(e.target);
|
|
268
|
-
t != null &&
|
|
298
|
+
t != null && Ne(t);
|
|
269
299
|
});
|
|
270
|
-
function
|
|
300
|
+
function W(e, t) {
|
|
271
301
|
let n = C.item(e);
|
|
272
302
|
n && (c(n.kind) ? S.open({
|
|
273
303
|
app: m,
|
|
274
304
|
item: e,
|
|
275
305
|
from: t,
|
|
276
|
-
create: () =>
|
|
306
|
+
create: () => He(e)
|
|
277
307
|
}) : p.kind(n.kind)?.open(n, t));
|
|
278
308
|
}
|
|
279
309
|
p.on(y, "vf-open", (e) => {
|
|
280
310
|
let t = e.target;
|
|
281
|
-
t.localName === "vf-icon" && t.dataset.id != null && (t.selected &&
|
|
311
|
+
t.localName === "vf-icon" && t.dataset.id != null && (t.selected && J().length > 1 ? Ke() : W(I(t), t.cellRect()));
|
|
282
312
|
});
|
|
283
|
-
let
|
|
313
|
+
let Ue = (e) => {
|
|
284
314
|
let t = C.get().items.filter((t) => t.kind === "app" && de(t) === e);
|
|
285
|
-
return t.find((e) =>
|
|
286
|
-
},
|
|
315
|
+
return t.find((e) => L(e.id)) ?? t[0] ?? null;
|
|
316
|
+
}, We = (e, t) => C.item(e) ?? (t == null ? null : Ue(t));
|
|
287
317
|
p.onDispose(S.setHome((e, t) => {
|
|
288
|
-
let n =
|
|
318
|
+
let n = We(e, t);
|
|
289
319
|
if (!n) return null;
|
|
290
|
-
let r =
|
|
320
|
+
let r = L(n.id)?.cellRect();
|
|
291
321
|
if (r) return r;
|
|
292
322
|
for (let e of s(C.get(), n.parent)) {
|
|
293
|
-
let t =
|
|
323
|
+
let t = L(e)?.cellRect();
|
|
294
324
|
if (t) return t;
|
|
295
325
|
}
|
|
296
326
|
return null;
|
|
297
327
|
}, (e, t) => {
|
|
298
|
-
let n = e == null && t == null ? null :
|
|
328
|
+
let n = e == null && t == null ? null : We(e, t), r = P(A), i = n ? L(n.id) : r.find((e) => e.selected) ?? r[0] ?? null;
|
|
299
329
|
return i?.checkVisibility() ? (i.focus({ preventScroll: !0 }), !0) : !1;
|
|
300
|
-
})), p.on(
|
|
301
|
-
let
|
|
330
|
+
})), p.on(A, "pointerdown", () => y.clearActive());
|
|
331
|
+
let G = (e) => {
|
|
302
332
|
let t = e.target;
|
|
303
333
|
return t.localName === "vf-icon" && t.dataset.id != null;
|
|
304
334
|
};
|
|
305
335
|
p.on(y, "vf-change", (e) => {
|
|
306
|
-
if (!
|
|
336
|
+
if (!G(e)) return;
|
|
307
337
|
let t = e.target, { label: n, previous: r } = e.detail;
|
|
308
|
-
C.rename(
|
|
338
|
+
C.rename(I(t), n).catch(() => {
|
|
309
339
|
t.label = r;
|
|
310
340
|
});
|
|
311
341
|
});
|
|
312
|
-
let
|
|
342
|
+
let K = !1;
|
|
313
343
|
p.on(y, "vf-name-too-long", (e) => {
|
|
314
|
-
if (!
|
|
315
|
-
|
|
344
|
+
if (!G(e) || K) return;
|
|
345
|
+
K = !0;
|
|
316
346
|
let { limit: t } = e.detail;
|
|
317
|
-
|
|
318
|
-
|
|
347
|
+
D("name-too-long", { limit: t }, `That name is too long. A name can have up to ${t} characters.`).finally(() => {
|
|
348
|
+
K = !1;
|
|
319
349
|
});
|
|
320
350
|
}), p.on(y, "vf-name-rejected", (e) => {
|
|
321
|
-
|
|
351
|
+
G(e) && D("name-rejected", {}, "An item needs a name.");
|
|
322
352
|
}), p.onDispose(fe(y, {
|
|
323
353
|
folderOfWindow: (e) => S.appOf(e) === "finder" ? S.itemOf(e) ?? void 0 : void 0,
|
|
324
354
|
folderOfIcon: (e) => e.dataset.folder,
|
|
325
|
-
containerOf: (e) => e.dataset.id == null ? void 0 :
|
|
355
|
+
containerOf: (e) => e.dataset.id == null ? void 0 : Ae(e),
|
|
326
356
|
canFile: (e, t) => {
|
|
327
357
|
let n = C.get();
|
|
328
358
|
return e.every((e) => {
|
|
@@ -331,75 +361,78 @@ function b(i) {
|
|
|
331
361
|
});
|
|
332
362
|
},
|
|
333
363
|
file: (e, t, n) => {
|
|
334
|
-
let r = new Map([...n].map(([e, t]) => [
|
|
335
|
-
C.move(e.map(
|
|
336
|
-
|
|
364
|
+
let r = new Map([...n].map(([e, t]) => [I(e), t]));
|
|
365
|
+
C.move(e.map(I), t, r).catch((e) => {
|
|
366
|
+
D("move-failed", { error: e }, `The items couldn’t be moved: ${e.message}.`);
|
|
337
367
|
});
|
|
338
368
|
}
|
|
339
369
|
}));
|
|
340
|
-
let
|
|
370
|
+
let Ge = /* @__PURE__ */ new WeakMap(), q = 0;
|
|
341
371
|
p.onDispose(S.onRaster((t, n) => {
|
|
342
|
-
|
|
372
|
+
A.dragIcons([]);
|
|
343
373
|
let r = {
|
|
344
374
|
width: T,
|
|
345
375
|
height: T
|
|
346
376
|
}, a = oe(y.workArea.top);
|
|
347
|
-
for (let i of
|
|
377
|
+
for (let i of P(A)) {
|
|
348
378
|
let o = {
|
|
349
|
-
...
|
|
379
|
+
...R(i),
|
|
350
380
|
...r
|
|
351
|
-
}, s =
|
|
352
|
-
i.left = e(l.left, i), i.top = e(l.top, i),
|
|
381
|
+
}, s = Ge.get(i), c = !s || s.left !== o.left || s.top !== o.top ? ce(o, t, a) : s.pin, l = le(c, n, a, { size: r });
|
|
382
|
+
i.left = e(l.left, i), i.top = e(l.top, i), Ge.set(i, {
|
|
353
383
|
pin: c,
|
|
354
384
|
left: i.left,
|
|
355
385
|
top: i.top
|
|
356
386
|
});
|
|
357
387
|
}
|
|
358
|
-
i.cleanUpAfterResize && (window.clearTimeout(
|
|
359
|
-
|
|
360
|
-
...
|
|
388
|
+
i.cleanUpAfterResize && (window.clearTimeout(q), q = window.setTimeout(() => {
|
|
389
|
+
q = 0, te(P(A).map((e) => ({
|
|
390
|
+
...R(e),
|
|
361
391
|
...r
|
|
362
|
-
}))).size &&
|
|
363
|
-
},
|
|
364
|
-
})), p.onDispose(() => window.clearTimeout(
|
|
365
|
-
let
|
|
366
|
-
let e = new Set(
|
|
392
|
+
}))).size && Z(null);
|
|
393
|
+
}, he));
|
|
394
|
+
})), p.onDispose(() => window.clearTimeout(q));
|
|
395
|
+
let J = () => {
|
|
396
|
+
let e = new Set(F().filter((e) => e.selected).map(I));
|
|
367
397
|
return C.get().items.filter((t) => e.has(t.id));
|
|
368
|
-
},
|
|
398
|
+
}, Y = (e) => {
|
|
369
399
|
let t = new Set(e);
|
|
370
|
-
for (let e of
|
|
371
|
-
},
|
|
400
|
+
for (let e of F()) e.setSelected(t.has(I(e)));
|
|
401
|
+
}, X = () => {
|
|
372
402
|
let e = y.activeWindow;
|
|
373
403
|
return e && S.appOf(e) === "finder" ? S.itemOf(e) : null;
|
|
374
404
|
};
|
|
375
|
-
async function
|
|
376
|
-
let t =
|
|
405
|
+
async function Z(e) {
|
|
406
|
+
let t = ke(e);
|
|
377
407
|
if (!t) return;
|
|
378
|
-
let n =
|
|
408
|
+
let n = Me(e), r = P(t), i = ee(n, r.map(R)), a = r.map((e, t) => ({
|
|
379
409
|
icon: e,
|
|
380
410
|
...i[t]
|
|
381
411
|
})).sort((e, t) => ie(n, e, t));
|
|
382
412
|
await t.dragIcons(a);
|
|
383
413
|
}
|
|
384
|
-
async function
|
|
385
|
-
let e = n() ? 0 :
|
|
386
|
-
for (let [t, n] of
|
|
414
|
+
async function Ke() {
|
|
415
|
+
let e = n() ? 0 : me;
|
|
416
|
+
for (let [t, n] of J().entries()) t && e && await new Promise((t) => setTimeout(t, e)), W(n.id, L(n.id)?.cellRect() ?? null);
|
|
387
417
|
}
|
|
388
|
-
async function
|
|
389
|
-
let t =
|
|
390
|
-
t && (
|
|
418
|
+
async function qe(e) {
|
|
419
|
+
let t = L(e);
|
|
420
|
+
t && (Y([e]), await t.updateComplete, t.startEditing());
|
|
391
421
|
}
|
|
392
|
-
let
|
|
393
|
-
async function
|
|
394
|
-
if (!
|
|
395
|
-
let e = await C.create({ parent:
|
|
396
|
-
e && await
|
|
422
|
+
let Je = () => C.get().available ? !0 : (D("storage-unavailable", {}, "Files can’t be saved in this browser session. A private window, perhaps.", { label: "Storage Unavailable" }), !1);
|
|
423
|
+
async function Ye() {
|
|
424
|
+
if (!Je()) return;
|
|
425
|
+
let e = await C.create({ parent: X() }).catch(O("new-folder"));
|
|
426
|
+
e && await qe(e.id);
|
|
397
427
|
}
|
|
398
|
-
async function
|
|
428
|
+
async function Xe() {
|
|
399
429
|
let e = f(C.get(), a);
|
|
400
430
|
if (!b || !e) return;
|
|
401
|
-
let t =
|
|
402
|
-
await
|
|
431
|
+
let t = C.trashSize(), n = Math.ceil(t / 1024), r = e === 1 ? `The Trash contains 1 item, which uses ${n}K of disk space. Are you sure you want to permanently remove it?` : `The Trash contains ${e} items, which use ${n}K of disk space. Are you sure you want to permanently remove these items?`;
|
|
432
|
+
await D("empty-trash", {
|
|
433
|
+
count: e,
|
|
434
|
+
bytes: t
|
|
435
|
+
}, r, {
|
|
403
436
|
label: "Empty Trash",
|
|
404
437
|
buttons: [{
|
|
405
438
|
label: "Cancel",
|
|
@@ -409,14 +442,14 @@ function b(i) {
|
|
|
409
442
|
value: "ok",
|
|
410
443
|
default: !0
|
|
411
444
|
}]
|
|
412
|
-
}) === "ok" && await C.emptyTrash().catch(
|
|
445
|
+
}) === "ok" && await C.emptyTrash().catch(O("empty-trash"));
|
|
413
446
|
}
|
|
414
447
|
let Q = {
|
|
415
448
|
ids: [],
|
|
416
449
|
text: ""
|
|
417
|
-
},
|
|
418
|
-
async function
|
|
419
|
-
let e =
|
|
450
|
+
}, Ze = (e) => e.replace(/\r\n?/g, "\n").trimEnd();
|
|
451
|
+
async function Qe() {
|
|
452
|
+
let e = J().filter((e) => !d(e.id));
|
|
420
453
|
if (!e.length) return;
|
|
421
454
|
let t = e.map((e) => e.name).join("\n");
|
|
422
455
|
Q = {
|
|
@@ -438,12 +471,12 @@ function b(i) {
|
|
|
438
471
|
await navigator.clipboard?.writeText(t);
|
|
439
472
|
} catch {}
|
|
440
473
|
}
|
|
441
|
-
async function
|
|
474
|
+
async function $e(e, t) {
|
|
442
475
|
for (let n of p.kinds.values()) if (n.claim && await n.claim(e, t)) return !0;
|
|
443
476
|
return !1;
|
|
444
477
|
}
|
|
445
|
-
let
|
|
446
|
-
async function
|
|
478
|
+
let et = () => [...p.kinds.values()].some((e) => e.claim);
|
|
479
|
+
async function tt() {
|
|
447
480
|
try {
|
|
448
481
|
if (navigator.clipboard?.read) {
|
|
449
482
|
let e = null, t = [];
|
|
@@ -463,100 +496,101 @@ function b(i) {
|
|
|
463
496
|
} catch {}
|
|
464
497
|
return null;
|
|
465
498
|
}
|
|
466
|
-
async function
|
|
467
|
-
if (!
|
|
468
|
-
let t =
|
|
499
|
+
async function nt(e) {
|
|
500
|
+
if (!Je()) return;
|
|
501
|
+
let t = X();
|
|
469
502
|
if (u(C.get(), t)) return;
|
|
470
|
-
let n = e === void 0 ? await
|
|
503
|
+
let n = e === void 0 ? await tt() : e, r = Q.ids.length > 0 && (n == null || n.text != null && Ze(n.text) === Ze(Q.text));
|
|
471
504
|
try {
|
|
472
505
|
if (r) {
|
|
473
506
|
let e = await C.copy(Q.ids, t);
|
|
474
|
-
e.length &&
|
|
475
|
-
} else for (let e of n?.files ?? []) await
|
|
507
|
+
e.length && Y(e.map((e) => e.id));
|
|
508
|
+
} else for (let e of n?.files ?? []) await $e(e, t);
|
|
476
509
|
} catch (e) {
|
|
477
|
-
|
|
510
|
+
O("paste")(e);
|
|
478
511
|
}
|
|
479
512
|
}
|
|
480
513
|
p.on(document, "paste", (e) => {
|
|
481
514
|
if (!x("paste") || S.front !== "finder" || p.modalOpen() || p.typing()) return;
|
|
482
515
|
let t = e.clipboardData;
|
|
483
|
-
t && (e.preventDefault(),
|
|
516
|
+
t && (e.preventDefault(), nt({
|
|
484
517
|
text: t.getData("text/plain") || null,
|
|
485
518
|
files: [...t.files]
|
|
486
519
|
}));
|
|
487
520
|
});
|
|
488
|
-
let
|
|
521
|
+
let rt = (e) => [...e.dataTransfer?.types ?? []].includes("Files");
|
|
489
522
|
p.on(y, "dragover", (e) => {
|
|
490
|
-
|
|
523
|
+
rt(e) && et() && e.preventDefault();
|
|
491
524
|
}), p.on(y, "drop", (e) => {
|
|
492
|
-
if (
|
|
525
|
+
if (!rt(e) || !et()) return;
|
|
493
526
|
e.preventDefault();
|
|
494
|
-
let t = e, n = [...t.dataTransfer?.files ?? []];
|
|
495
|
-
if (!
|
|
496
|
-
let r = document.elementsFromPoint(t.clientX, t.clientY).find((e) => e.localName === "vf-window");
|
|
497
|
-
if (r && S.appOf(r) !== "finder") return;
|
|
527
|
+
let t = e, n = [...t.dataTransfer?.files ?? []], r = document.elementsFromPoint(t.clientX, t.clientY).find((e) => e.localName === "vf-window");
|
|
528
|
+
if (r && S.appOf(r) !== "finder" || (r ? y.bringToFront(r) : y.clearActive(), !Je())) return;
|
|
498
529
|
let i = r ? S.itemOf(r) : null;
|
|
499
530
|
u(C.get(), i) || (async () => {
|
|
500
|
-
for (let e of n) await
|
|
501
|
-
})().catch(
|
|
531
|
+
for (let e of n) await $e(e, i);
|
|
532
|
+
})().catch(O("add-file"));
|
|
502
533
|
});
|
|
503
|
-
let
|
|
504
|
-
open: () => void
|
|
505
|
-
"new-folder": () => void
|
|
534
|
+
let it = {
|
|
535
|
+
open: () => void Ke(),
|
|
536
|
+
"new-folder": () => void Ye(),
|
|
506
537
|
close: () => {
|
|
507
|
-
let e =
|
|
538
|
+
let e = X(), t = e == null ? null : S.windowFor(e);
|
|
508
539
|
t && S.requestClose(t);
|
|
509
540
|
},
|
|
510
|
-
copy: () => void
|
|
511
|
-
paste: () => void
|
|
541
|
+
copy: () => void Qe(),
|
|
542
|
+
paste: () => void nt(),
|
|
512
543
|
"select-all": () => {
|
|
513
|
-
let e =
|
|
514
|
-
e &&
|
|
544
|
+
let e = ke(X());
|
|
545
|
+
e && Y(P(e).map(I));
|
|
515
546
|
},
|
|
516
547
|
arrange: () => S.arrange(),
|
|
517
|
-
"clean-up": () => void X(
|
|
518
|
-
"empty-trash": () => void
|
|
548
|
+
"clean-up": () => void Z(X()),
|
|
549
|
+
"empty-trash": () => void Xe()
|
|
519
550
|
}, $ = (e, t) => {
|
|
520
551
|
x(e) && p.gate(p.item(e), t);
|
|
521
552
|
};
|
|
522
|
-
if ($("open", () => !p.typing() &&
|
|
553
|
+
if ($("open", () => !p.typing() && J().length > 0), $("new-folder", () => !u(C.get(), X())), $("close", () => X() != null), $("copy", () => !p.typing() && J().some((e) => !d(e.id))), $("paste", () => !p.typing() && !u(C.get(), X())), $("select-all", () => !p.typing()), $("arrange", () => !S.arranged()), $("empty-trash", () => f(C.get(), a) > 0), x("clean-up")) {
|
|
523
554
|
let e = p.item("clean-up");
|
|
524
555
|
p.gate(e, () => {
|
|
525
|
-
let t =
|
|
556
|
+
let t = X() == null ? "Clean Up Desktop" : "Clean Up Window";
|
|
526
557
|
return e.textContent !== t && (e.textContent = t), !0;
|
|
527
558
|
});
|
|
528
559
|
}
|
|
529
|
-
let
|
|
560
|
+
let at = !0, ot = (e) => {
|
|
530
561
|
let t = p.menus.find((t) => t.dataset.menu === e);
|
|
531
562
|
if (t) return t;
|
|
532
|
-
if (!
|
|
563
|
+
if (!at) throw Error(`vintage-frames/shell (finder): no ${e} menu; add to it from extend`);
|
|
533
564
|
let n = document.createElement("vf-menu");
|
|
534
565
|
n.dataset.menu = e, n.label = v.find((t) => t.menu === e).label;
|
|
535
566
|
let r = v.map((e) => e.menu), i = p.menus.findIndex((t) => r.indexOf(t.dataset.menu) > r.indexOf(e));
|
|
536
567
|
return p.menus.splice(i < 0 ? p.menus.length : i, 0, n), n;
|
|
537
|
-
},
|
|
568
|
+
}, st = {
|
|
538
569
|
catalog: C,
|
|
539
|
-
selection:
|
|
540
|
-
select:
|
|
541
|
-
activeFolder:
|
|
570
|
+
selection: J,
|
|
571
|
+
select: Y,
|
|
572
|
+
activeFolder: X,
|
|
542
573
|
open: ({ item: e, from: t = null } = {}) => {
|
|
543
|
-
e != null &&
|
|
574
|
+
e != null && W(e, t);
|
|
544
575
|
},
|
|
545
|
-
rename:
|
|
546
|
-
cleanUp:
|
|
547
|
-
iconFor:
|
|
576
|
+
rename: qe,
|
|
577
|
+
cleanUp: Z,
|
|
578
|
+
iconFor: L,
|
|
548
579
|
addCommand(e) {
|
|
549
|
-
let t =
|
|
580
|
+
let t = ot(e.menu);
|
|
550
581
|
e.separator && t.append(document.createElement("vf-separator"));
|
|
551
582
|
let n = document.createElement("vf-menu-item");
|
|
552
|
-
return n.setAttribute("value", e.value), e.shortcut && n.setAttribute("shortcut", e.shortcut), n.textContent = e.label, t.append(n),
|
|
583
|
+
return n.setAttribute("value", e.value), e.shortcut && n.setAttribute("shortcut", e.shortcut), n.textContent = e.label, t.append(n), it[e.value] = e.run, e.enabled && p.gate(n, e.enabled), n;
|
|
584
|
+
},
|
|
585
|
+
alertWith(e, t) {
|
|
586
|
+
Ee.set(e, t);
|
|
553
587
|
}
|
|
554
588
|
};
|
|
555
|
-
return i.extend?.(
|
|
556
|
-
for (let [, e] of
|
|
557
|
-
for (let e of
|
|
558
|
-
|
|
559
|
-
}),
|
|
589
|
+
return i.extend?.(st, p), at = !1, p.onMenu((e) => it[e]?.()), p.onDispose(() => {
|
|
590
|
+
for (let [, e] of j()) e.remove();
|
|
591
|
+
for (let e of P(A)) e.remove();
|
|
592
|
+
De ? A.remove() : A.append(...Oe);
|
|
593
|
+
}), H(), st;
|
|
560
594
|
}
|
|
561
595
|
});
|
|
562
596
|
}
|