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.
@@ -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", pe = 306, me = 300, he = 20, ge = 18, h = {
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
- }, _e = {
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 ve = (e) => e.localName === "vf-icon" && e.dataset.app != null || e instanceof HTMLTemplateElement && e.dataset.folder != null;
83
- function ye(e) {
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(ve)) r instanceof HTMLTemplateElement ? n.push({
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: ye(r.content)
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), be = [], xe = (e) => e, S = i.seed === "markup" ? async (e) => {
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 : xe(a.app)),
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(be, null);
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
- xe = (e) => p.app(e)?.name ?? e;
131
- let T = i.lattice?.desktop?.cell ?? 64, Se = i.lattice?.folder?.cell ?? 64, Ce = i.window ?? {
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: he
137
- }), D = (e) => (t) => void p.alert(`${e} failed: ${t.message}.`), O = y.querySelector(":scope > vf-icon-field"), we = !O;
138
- if (!O) {
139
- O = document.createElement("vf-icon-field"), O.label = "Desktop", O.toggleAttribute("fill-width", !0), O.toggleAttribute("fill-height", !0);
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(O) : y.prepend(O);
171
+ e ? e.after(k) : y.prepend(k);
142
172
  }
143
- let k = O, Te = [...k.children].filter(ve);
144
- be = ye(k);
145
- for (let e of Te) e.remove();
146
- let A = () => S.windowsOf(m).map((e) => [S.itemOf(e), e]).filter((e) => e[0] != null), j = (e) => e.querySelector(":scope > vf-icon-field"), M = () => [[null, k], ...A().flatMap(([e, t]) => {
147
- let n = j(t);
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
- })], Ee = (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) => ({
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
- }), De = (e) => S.itemOf(e.closest("vf-window")), Oe = (e) => ({
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
- }), ke = (e) => {
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 ? Oe(t).width : 0, i.lattice?.folder);
159
- }, Ae = (e) => {
160
- let t = S.windowFor(e), n = t && j(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(N(n).map(L), Oe(t), { cell: Se });
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
- }, je = (n, r, i) => {
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
- }, Me = (e) => {
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 Ne(e, t) {
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 Pe(e) {
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 R = /* @__PURE__ */ new Set(), z = /* @__PURE__ */ new WeakMap();
189
- function Fe(e, t, n, r) {
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 (z.get(e) === r) return;
193
- z.set(e, r), (e.left !== t.left || e.top !== t.top) && je(e, n, {
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 = 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(ke(n), a, n == null ? T : Se);
200
- je(e, n, o), R.add(e);
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 B = !1;
203
- function V() {
204
- if (!B) {
205
- B = !0;
232
+ let V = !1;
233
+ function H() {
234
+ if (!V) {
235
+ V = !0;
206
236
  try {
207
- let e = C.get(), t = new Map(P().map((e) => [F(e), e])), n = /* @__PURE__ */ new Set(), r = [], i = [];
208
- for (let [a, s] of M()) for (let c of o(e, a)) {
209
- let e = t.get(c.id) ?? Pe(c);
210
- 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, Ne(e, Me(c));
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 = () => Fe(e, c, a, s);
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 A()) {
219
- let n = j(t), r = C.item(e)?.name;
220
- n && r != null && n.label !== r && (n.label = r), Re(e), Ae(e);
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
- B = !1;
253
+ V = !1;
224
254
  }
225
- Ie();
255
+ ze();
226
256
  }
227
257
  }
228
- let H = !1;
229
- function Ie() {
230
- if (H = !1, !R.size) return;
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 R) t.isConnected && t.left != null && t.top != null && e.set(F(t), L(t));
233
- R.clear(), C.place(e);
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 && (R.add(t), !H && (H = !0, queueMicrotask(Ie)));
238
- }), p.onDispose(C.subscribe(V)), p.onDispose(S.onWindows(V));
239
- function Le() {
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 Re(e) {
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(Le()) : !o && s && s.remove();
252
- let c = o ? _e : h;
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 ze(e) {
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 = he, n.width = Ce.width, n.height = Ce.height;
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 = ge, r.rule = "bottom";
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 && Ae(t);
298
+ t != null && Ne(t);
269
299
  });
270
- function U(e, t) {
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: () => ze(e)
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 && q().length > 1 ? Ue() : U(F(t), t.cellRect()));
311
+ t.localName === "vf-icon" && t.dataset.id != null && (t.selected && J().length > 1 ? Ke() : W(I(t), t.cellRect()));
282
312
  });
283
- let Be = (e) => {
313
+ let Ue = (e) => {
284
314
  let t = C.get().items.filter((t) => t.kind === "app" && de(t) === e);
285
- return t.find((e) => I(e.id)) ?? t[0] ?? null;
286
- }, Ve = (e, t) => C.item(e) ?? (t == null ? null : Be(t));
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 = Ve(e, t);
318
+ let n = We(e, t);
289
319
  if (!n) return null;
290
- let r = I(n.id)?.cellRect();
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 = I(e)?.cellRect();
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 : Ve(e, t), r = N(k), i = n ? I(n.id) : r.find((e) => e.selected) ?? r[0] ?? 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(k, "pointerdown", () => y.clearActive());
301
- let W = (e) => {
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 (!W(e)) return;
336
+ if (!G(e)) return;
307
337
  let t = e.target, { label: n, previous: r } = e.detail;
308
- C.rename(F(t), n).catch(() => {
338
+ C.rename(I(t), n).catch(() => {
309
339
  t.label = r;
310
340
  });
311
341
  });
312
- let G = !1;
342
+ let K = !1;
313
343
  p.on(y, "vf-name-too-long", (e) => {
314
- if (!W(e) || G) return;
315
- G = !0;
344
+ if (!G(e) || K) return;
345
+ K = !0;
316
346
  let { limit: t } = e.detail;
317
- p.alert(`That name is too long. A name can have up to ${t} characters.`).finally(() => {
318
- G = !1;
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
- W(e) && p.alert("An item needs a name.");
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 : De(e),
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]) => [F(e), t]));
335
- C.move(e.map(F), t, r).catch((e) => {
336
- p.alert(`The items couldn’t be moved: ${e.message}.`);
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 He = /* @__PURE__ */ new WeakMap(), K = 0;
370
+ let Ge = /* @__PURE__ */ new WeakMap(), q = 0;
341
371
  p.onDispose(S.onRaster((t, n) => {
342
- k.dragIcons([]);
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 N(k)) {
377
+ for (let i of P(A)) {
348
378
  let o = {
349
- ...L(i),
379
+ ...R(i),
350
380
  ...r
351
- }, s = He.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 });
352
- i.left = e(l.left, i), i.top = e(l.top, i), He.set(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(K), K = window.setTimeout(() => {
359
- K = 0, te(N(k).map((e) => ({
360
- ...L(e),
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 && X(null);
363
- }, me));
364
- })), p.onDispose(() => window.clearTimeout(K));
365
- let q = () => {
366
- let e = new Set(P().filter((e) => e.selected).map(F));
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
- }, J = (e) => {
398
+ }, Y = (e) => {
369
399
  let t = new Set(e);
370
- for (let e of P()) e.setSelected(t.has(F(e)));
371
- }, Y = () => {
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 X(e) {
376
- let t = Ee(e);
405
+ async function Z(e) {
406
+ let t = ke(e);
377
407
  if (!t) return;
378
- let n = ke(e), r = N(t), i = ee(n, r.map(L)), a = r.map((e, t) => ({
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 Ue() {
385
- let e = n() ? 0 : pe;
386
- for (let [t, n] of q().entries()) t && e && await new Promise((t) => setTimeout(t, e)), U(n.id, I(n.id)?.cellRect() ?? null);
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 We(e) {
389
- let t = I(e);
390
- t && (J([e]), await t.updateComplete, t.startEditing());
418
+ async function qe(e) {
419
+ let t = L(e);
420
+ t && (Y([e]), await t.updateComplete, t.startEditing());
391
421
  }
392
- let Z = () => C.get().available ? !0 : (p.alert("Files can’t be saved in this browser session. A private window, perhaps.", { label: "Storage Unavailable" }), !1);
393
- async function Ge() {
394
- if (!Z()) return;
395
- let e = await C.create({ parent: Y() }).catch(D("New Folder"));
396
- e && await We(e.id);
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 Ke() {
428
+ async function Xe() {
399
429
  let e = f(C.get(), a);
400
430
  if (!b || !e) return;
401
- let t = Math.ceil(C.trashSize() / 1024), n = e === 1 ? `The Trash contains 1 item, which uses ${t}K of disk space. Are you sure you want to permanently remove it?` : `The Trash contains ${e} items, which use ${t}K of disk space. Are you sure you want to permanently remove these items?`;
402
- await p.alert(n, {
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(D("Empty Trash"));
445
+ }) === "ok" && await C.emptyTrash().catch(O("empty-trash"));
413
446
  }
414
447
  let Q = {
415
448
  ids: [],
416
449
  text: ""
417
- }, qe = (e) => e.replace(/\r\n?/g, "\n").trimEnd();
418
- async function Je() {
419
- let e = q().filter((e) => !d(e.id));
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 Ye(e, t) {
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 Xe = () => [...p.kinds.values()].some((e) => e.claim);
446
- async function Ze() {
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 Qe(e) {
467
- if (!Z()) return;
468
- let t = Y();
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 Ze() : e, r = Q.ids.length > 0 && (n == null || n.text != null && qe(n.text) === qe(Q.text));
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 && J(e.map((e) => e.id));
475
- } else for (let e of n?.files ?? []) await Ye(e, t);
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
- D("Paste")(e);
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(), Qe({
516
+ t && (e.preventDefault(), nt({
484
517
  text: t.getData("text/plain") || null,
485
518
  files: [...t.files]
486
519
  }));
487
520
  });
488
- let $e = (e) => [...e.dataTransfer?.types ?? []].includes("Files");
521
+ let rt = (e) => [...e.dataTransfer?.types ?? []].includes("Files");
489
522
  p.on(y, "dragover", (e) => {
490
- $e(e) && Xe() && e.preventDefault();
523
+ rt(e) && et() && e.preventDefault();
491
524
  }), p.on(y, "drop", (e) => {
492
- if (!$e(e) || !Xe()) return;
525
+ if (!rt(e) || !et()) return;
493
526
  e.preventDefault();
494
- let t = e, n = [...t.dataTransfer?.files ?? []];
495
- if (!Z()) return;
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 Ye(e, i);
501
- })().catch(D("Adding the file"));
531
+ for (let e of n) await $e(e, i);
532
+ })().catch(O("add-file"));
502
533
  });
503
- let et = {
504
- open: () => void Ue(),
505
- "new-folder": () => void Ge(),
534
+ let it = {
535
+ open: () => void Ke(),
536
+ "new-folder": () => void Ye(),
506
537
  close: () => {
507
- let e = Y(), t = e == null ? null : S.windowFor(e);
538
+ let e = X(), t = e == null ? null : S.windowFor(e);
508
539
  t && S.requestClose(t);
509
540
  },
510
- copy: () => void Je(),
511
- paste: () => void Qe(),
541
+ copy: () => void Qe(),
542
+ paste: () => void nt(),
512
543
  "select-all": () => {
513
- let e = Ee(Y());
514
- e && J(N(e).map(F));
544
+ let e = ke(X());
545
+ e && Y(P(e).map(I));
515
546
  },
516
547
  arrange: () => S.arrange(),
517
- "clean-up": () => void X(Y()),
518
- "empty-trash": () => void Ke()
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() && 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")) {
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 = Y() == null ? "Clean Up Desktop" : "Clean Up Window";
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 tt = !0, nt = (e) => {
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 (!tt) throw Error(`vintage-frames/shell (finder): no ${e} menu; add to it from extend`);
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
- }, rt = {
568
+ }, st = {
538
569
  catalog: C,
539
- selection: q,
540
- select: J,
541
- activeFolder: Y,
570
+ selection: J,
571
+ select: Y,
572
+ activeFolder: X,
542
573
  open: ({ item: e, from: t = null } = {}) => {
543
- e != null && U(e, t);
574
+ e != null && W(e, t);
544
575
  },
545
- rename: We,
546
- cleanUp: X,
547
- iconFor: I,
576
+ rename: qe,
577
+ cleanUp: Z,
578
+ iconFor: L,
548
579
  addCommand(e) {
549
- let t = nt(e.menu);
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), et[e.value] = e.run, e.enabled && p.gate(n, e.enabled), 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?.(rt, p), tt = !1, p.onMenu((e) => et[e]?.()), p.onDispose(() => {
556
- for (let [, e] of A()) e.remove();
557
- for (let e of N(k)) e.remove();
558
- we ? k.remove() : k.append(...Te);
559
- }), V(), rt;
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
  }