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