vintage-frames 0.15.0 → 0.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/custom-elements.json +907 -99
  2. package/dist/chrome.d.ts +10 -1
  3. package/dist/chrome.js +8 -3
  4. package/dist/components/vf-desktop.d.ts +5 -2
  5. package/dist/components/vf-desktop.js +5 -5
  6. package/dist/components/vf-dialog.d.ts +14 -8
  7. package/dist/components/vf-dialog.js +27 -27
  8. package/dist/components/vf-menu-bar.js +9 -10
  9. package/dist/components/vf-menu-item.js +18 -13
  10. package/dist/components/vf-menu.d.ts +8 -3
  11. package/dist/components/vf-menu.js +85 -61
  12. package/dist/components/vf-number-field.d.ts +4 -0
  13. package/dist/components/vf-number-field.js +28 -25
  14. package/dist/components/vf-paragraph.d.ts +3 -1
  15. package/dist/components/vf-paragraph.js +7 -0
  16. package/dist/components/vf-scroll-area.d.ts +16 -1
  17. package/dist/components/vf-scroll-area.js +39 -29
  18. package/dist/components/vf-select.d.ts +5 -4
  19. package/dist/components/vf-select.js +26 -17
  20. package/dist/components/vf-text-field.d.ts +5 -5
  21. package/dist/components/vf-text-field.js +1 -1
  22. package/dist/components/vf-window.d.ts +22 -5
  23. package/dist/components/vf-window.js +113 -98
  24. package/dist/cursor.d.ts +8 -0
  25. package/dist/cursor.js +70 -73
  26. package/dist/index.d.ts +2 -1
  27. package/dist/modal-dialog.d.ts +27 -5
  28. package/dist/modal-dialog.js +63 -51
  29. package/dist/shell/catalog.d.ts +1 -1
  30. package/dist/shell/catalog.js +32 -18
  31. package/dist/shell/finder.d.ts +6 -1
  32. package/dist/shell/finder.js +182 -176
  33. package/dist/shell/index.d.ts +1 -1
  34. package/dist/shell/pure.d.ts +10 -0
  35. package/dist/shell/pure.js +4 -0
  36. package/dist/shell/shell.d.ts +16 -3
  37. package/dist/shell/shell.js +141 -126
  38. package/dist/shell/windows.d.ts +57 -13
  39. package/dist/shell/windows.js +214 -154
  40. package/dist/text-control.d.ts +46 -3
  41. package/dist/text-control.js +33 -5
  42. package/dist/top-layer.d.ts +13 -0
  43. package/dist/top-layer.js +16 -0
  44. package/docs/SPEC.md +25 -24
  45. package/editor/vscode.html-custom-data.json +36 -11
  46. package/editor/web-types.json +81 -23
  47. package/package.json +5 -1
@@ -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 { appIdOf as de, defineApp as p } from "./shell.js";
8
- import { fileByDrag as fe } from "./filing.js";
9
- import { composeAlert as pe } from "./alert.js";
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", me = 306, he = 300, ge = {
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
- }, _e = 20, ve = 18, h = {
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
- }, ye = {
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 be = (e) => e.localName === "vf-icon" && e.dataset.app != null || e instanceof HTMLTemplateElement && e.dataset.folder != null;
89
- function xe(e) {
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(be)) r instanceof HTMLTemplateElement ? n.push({
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: xe(r.content)
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), Se = [], Ce = (e) => e, S = i.seed === "markup" ? async (e) => {
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 : Ce(a.app)),
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(Se, null);
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
- Ce = (e) => p.app(e)?.name ?? e;
138
- let T = i.lattice?.desktop?.cell ?? 64, we = i.lattice?.folder?.cell ?? 64, Te = i.window ?? {
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: _e
144
- }), Ee = /* @__PURE__ */ new Map();
144
+ headerHeight: ve
145
+ }), De = /* @__PURE__ */ new Map();
145
146
  async function D(e, t, n, r = {}) {
146
- let i = Ee.get(e);
147
+ let i = De.get(e);
147
148
  if (i) return i(t);
148
- let a = pe(n, {
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
- }, `${ge[e]} failed: ${n.message}.`);
167
- }, k = y.querySelector(":scope > vf-icon-field"), De = !k;
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, 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);
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
- })], 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) => ({
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
- }), Ae = (e) => S.itemOf(e.closest("vf-window")), je = (e) => ({
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
- }), Me = (e) => {
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 ? je(t).width : 0, i.lattice?.folder);
189
- }, Ne = (e) => {
190
- let t = S.windowFor(e), n = t && M(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(P(n).map(R), je(t), { cell: we });
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
- }, Pe = (n, r, i) => {
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
- }, Fe = (e) => {
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 Ie(e, t) {
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 Le(e) {
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 z = /* @__PURE__ */ new Set(), B = /* @__PURE__ */ new WeakMap();
219
- function Re(e, t, n, r) {
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 (B.get(e) === r) return;
223
- B.set(e, r), (e.left !== t.left || e.top !== t.top) && Pe(e, n, {
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 = 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);
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 V = !1;
233
- function H() {
234
- if (!V) {
235
- V = !0;
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(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));
241
- let o = c.kind === "app" ? S.hasWindows(de(c) ?? "") : S.isOpen(c.id);
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 = () => Re(e, c, a, s);
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 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);
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
- V = !1;
254
+ B = !1;
254
255
  }
255
- ze();
256
+ He();
256
257
  }
257
258
  }
258
- let U = !1;
259
- function ze() {
260
- if (U = !1, !z.size) return;
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 z) t.isConnected && t.left != null && t.top != null && e.set(I(t), R(t));
263
- z.clear(), C.place(e);
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 && (z.add(t), !U && (U = !0, queueMicrotask(ze)));
268
- }), p.onDispose(C.subscribe(H)), p.onDispose(S.onWindows(H));
269
- function Be() {
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 Ve(e) {
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(Be()) : !o && s && s.remove();
282
- let c = o ? ye : h;
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 He(e) {
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 = _e, n.width = Te.width, n.height = Te.height;
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 = ve, r.rule = "bottom";
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 && Ne(t);
299
+ t != null && Fe(t);
299
300
  });
300
- function W(e, t) {
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: () => He(e)
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 && J().length > 1 ? Ke() : W(I(t), t.cellRect()));
312
+ t.localName === "vf-icon" && t.dataset.id != null && (t.selected && q().length > 1 ? Ye() : U(F(t), t.cellRect()));
312
313
  });
313
- let Ue = (e) => {
314
- let t = C.get().items.filter((t) => t.kind === "app" && de(t) === e);
315
- return t.find((e) => L(e.id)) ?? t[0] ?? null;
316
- }, We = (e, t) => C.item(e) ?? (t == null ? null : Ue(t));
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 = We(e, t);
319
+ let n = qe(e, t);
319
320
  if (!n) return null;
320
- let r = L(n.id)?.cellRect();
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 = L(e)?.cellRect();
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 : We(e, t), r = P(A), i = n ? L(n.id) : r.find((e) => e.selected) ?? r[0] ?? 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 G = (e) => {
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 (!G(e)) return;
337
+ if (!W(e)) return;
337
338
  let t = e.target, { label: n, previous: r } = e.detail;
338
- C.rename(I(t), n).catch(() => {
339
+ C.rename(F(t), n).catch(() => {
339
340
  t.label = r;
340
341
  });
341
342
  });
342
- let K = !1;
343
+ let G = !1;
343
344
  p.on(y, "vf-name-too-long", (e) => {
344
- if (!G(e) || K) return;
345
- K = !0;
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
- K = !1;
349
+ G = !1;
349
350
  });
350
351
  }), p.on(y, "vf-name-rejected", (e) => {
351
- G(e) && D("name-rejected", {}, "An item needs a name.");
352
- }), p.onDispose(fe(y, {
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 : Ae(e),
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]) => [I(e), t]));
365
- C.move(e.map(I), t, r).catch((e) => {
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 Ge = /* @__PURE__ */ new WeakMap(), q = 0;
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 P(A)) {
378
+ for (let i of N(A)) {
378
379
  let o = {
379
- ...R(i),
380
+ ...L(i),
380
381
  ...r
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, {
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(q), q = window.setTimeout(() => {
389
- q = 0, te(P(A).map((e) => ({
390
- ...R(e),
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 && 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));
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
- }, Y = (e) => {
399
+ }, J = (e) => {
399
400
  let t = new Set(e);
400
- for (let e of F()) e.setSelected(t.has(I(e)));
401
- }, X = () => {
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 Z(e) {
406
- let t = ke(e);
406
+ async function X(e) {
407
+ let t = je(e);
407
408
  if (!t) return;
408
- let n = Me(e), r = P(t), i = ee(n, r.map(R)), a = r.map((e, t) => ({
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 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);
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 qe(e) {
419
- let t = L(e);
420
- t && (Y([e]), await t.updateComplete, t.startEditing());
419
+ async function Xe(e) {
420
+ let t = I(e);
421
+ t && (J([e]), await t.updateComplete, t.startEditing());
421
422
  }
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);
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 Xe() {
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
- }, Ze = (e) => e.replace(/\r\n?/g, "\n").trimEnd();
451
- async function Qe() {
452
- let e = J().filter((e) => !d(e.id));
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 $e(e, t) {
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 et = () => [...p.kinds.values()].some((e) => e.claim);
479
- async function tt() {
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 nt(e) {
500
- if (!Je()) return;
501
- let t = X();
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 tt() : e, r = Q.ids.length > 0 && (n == null || n.text != null && Ze(n.text) === Ze(Q.text));
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 && Y(e.map((e) => e.id));
508
- } else for (let e of n?.files ?? []) await $e(e, t);
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(), nt({
517
+ t && (e.preventDefault(), it({
517
518
  text: t.getData("text/plain") || null,
518
519
  files: [...t.files]
519
520
  }));
520
521
  });
521
- let rt = (e) => [...e.dataTransfer?.types ?? []].includes("Files");
522
+ let at = (e) => [...e.dataTransfer?.types ?? []].includes("Files");
522
523
  p.on(y, "dragover", (e) => {
523
- rt(e) && et() && e.preventDefault();
524
+ at(e) && nt() && e.preventDefault();
524
525
  }), p.on(y, "drop", (e) => {
525
- if (!rt(e) || !et()) return;
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(), !Je())) return;
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 $e(e, i);
532
+ for (let e of n) await tt(e, i);
532
533
  })().catch(O("add-file"));
533
534
  });
534
- let it = {
535
- open: () => void Ke(),
536
- "new-folder": () => void Ye(),
535
+ let ot = {
536
+ open: () => void Ye(),
537
+ "new-folder": () => void Ze(),
537
538
  close: () => {
538
- let e = X(), t = e == null ? null : S.windowFor(e);
539
+ let e = Y(), t = e == null ? null : S.windowFor(e);
539
540
  t && S.requestClose(t);
540
541
  },
541
- copy: () => void Qe(),
542
- paste: () => void nt(),
542
+ copy: () => void et(),
543
+ paste: () => void it(),
543
544
  "select-all": () => {
544
- let e = ke(X());
545
- e && Y(P(e).map(I));
545
+ let e = je(Y());
546
+ e && J(N(e).map(F));
546
547
  },
547
548
  arrange: () => S.arrange(),
548
- "clean-up": () => void Z(X()),
549
- "empty-trash": () => void Xe()
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() && 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")) {
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 = X() == null ? "Clean Up Desktop" : "Clean Up Window";
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 at = !0, ot = (e) => {
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 (!at) throw Error(`vintage-frames/shell (finder): no ${e} menu; add to it from extend`);
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
- }, st = {
569
+ }, lt = {
569
570
  catalog: C,
570
- selection: J,
571
- select: Y,
572
- activeFolder: X,
571
+ selection: q,
572
+ select: J,
573
+ activeFolder: Y,
573
574
  open: ({ item: e, from: t = null } = {}) => {
574
- e != null && W(e, t);
575
+ e != null && U(e, t);
575
576
  },
576
- rename: qe,
577
- cleanUp: Z,
578
- iconFor: L,
577
+ rename: Xe,
578
+ cleanUp: X,
579
+ iconFor: I,
579
580
  addCommand(e) {
580
- let t = ot(e.menu);
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), it[e.value] = e.run, e.enabled && p.gate(n, e.enabled), 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
- Ee.set(e, t);
587
- }
587
+ De.set(e, t);
588
+ },
589
+ storageReady: Z
588
590
  };
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;
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
  }