@inkandswitch/patchwork-pkg-base 0.0.108 → 0.0.110
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/module-settings-url +1 -1
- package/package.json +1 -1
- package/packages/add-doc-to-sidebar-button/button.js +141 -25
- package/packages/add-doc-to-sidebar-button/button.test.js +114 -0
- package/packages/sideboard/dist/chunk-H6GFMJFM.js +15 -0
- package/packages/sideboard/dist/chunk-H6GFMJFM.js.map +7 -0
- package/packages/sideboard/dist/{document-list-panel-VFY2RV33.js → document-list-panel-SEKNECHI.js} +2 -2
- package/packages/sideboard/dist/index.js +1 -1
- package/packages/sideboard/dist/sideboard/sideboard.js +1 -1
- package/packages/threepane/dist/IsolatedDocumentArea-5WRK3TWL.js +2 -0
- package/packages/threepane/dist/PatchworkFrame-22UEOQ6E.js +2 -0
- package/packages/threepane/dist/PatchworkFrame-22UEOQ6E.js.map +7 -0
- package/packages/threepane/dist/{chunk-XOKWELWP.js → chunk-U4IJVHXK.js} +10 -5
- package/packages/threepane/dist/chunk-U4IJVHXK.js.map +7 -0
- package/packages/threepane/dist/index.js +1 -1
- package/plugin-registry-url +1 -1
- package/packages/sideboard/dist/chunk-WPHECYLJ.js +0 -15
- package/packages/sideboard/dist/chunk-WPHECYLJ.js.map +0 -7
- package/packages/threepane/dist/IsolatedDocumentArea-UTNJADQ7.js +0 -2
- package/packages/threepane/dist/PatchworkFrame-U2TVLGCZ.js +0 -2
- package/packages/threepane/dist/PatchworkFrame-U2TVLGCZ.js.map +0 -7
- package/packages/threepane/dist/chunk-XOKWELWP.js.map +0 -7
- /package/packages/sideboard/dist/{document-list-panel-VFY2RV33.js.map → document-list-panel-SEKNECHI.js.map} +0 -0
- /package/packages/threepane/dist/{IsolatedDocumentArea-UTNJADQ7.js.map → IsolatedDocumentArea-5WRK3TWL.js.map} +0 -0
package/module-settings-url
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
automerge:
|
|
1
|
+
automerge:25J8uXbNL9ojTwWnJpMJJzMahP28
|
package/package.json
CHANGED
|
@@ -7,19 +7,99 @@ link.rel = "stylesheet";
|
|
|
7
7
|
link.href = cssURL.href;
|
|
8
8
|
document.head.appendChild(link);
|
|
9
9
|
|
|
10
|
+
const LABEL = "Add to sidebar";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Fired (bubbling, composed, cancelable) at the button's own element. A frame
|
|
14
|
+
* that claims it calls preventDefault() and hands its work to
|
|
15
|
+
* `detail.respondWith`. threepane listens for this.
|
|
16
|
+
*/
|
|
17
|
+
export const ADD_TO_SIDEBAR_EVENT = "patchwork:add-to-sidebar";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Put `link` first in the folder. A doc that's already there is lifted to the
|
|
21
|
+
* top, keeping its own name, rather than added twice. (threepane has the same
|
|
22
|
+
* rule in src/account/addToSidebar.ts.)
|
|
23
|
+
*/
|
|
24
|
+
export function putAtTop(folder, link) {
|
|
25
|
+
if (!folder.docs) folder.docs = [];
|
|
26
|
+
const docs = folder.docs;
|
|
27
|
+
const at = docs.findIndex((existing) => existing.url === link.url);
|
|
28
|
+
if (at === 0) return;
|
|
29
|
+
if (at > 0) {
|
|
30
|
+
const { name, type } = docs[at];
|
|
31
|
+
docs.splice(at, 1);
|
|
32
|
+
docs.unshift({ url: link.url, name, type });
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
docs.unshift({ url: link.url, name: link.name, type: link.type });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The account handle, wherever this host put it. Most hosts copy it onto
|
|
40
|
+
* `window.accountDocHandle`; some (gaios) only have it on `window.patchwork`.
|
|
41
|
+
*/
|
|
42
|
+
function accountHandle() {
|
|
43
|
+
return window.accountDocHandle ?? window.patchwork?.account;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The page's own repo, not the one on the element: titlebar tools can sit
|
|
48
|
+
* inside a draft overlay, whose repo would hand back a draft of the sidebar.
|
|
49
|
+
*/
|
|
50
|
+
function pageRepo(element) {
|
|
51
|
+
return window.repo ?? window.patchwork?.repo ?? element.repo;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Resolves with pick(doc) once it's something. */
|
|
55
|
+
function when(handle, pick) {
|
|
56
|
+
return new Promise((resolve) => {
|
|
57
|
+
const check = () => {
|
|
58
|
+
const doc = handle.doc();
|
|
59
|
+
const picked = doc && pick(doc);
|
|
60
|
+
if (!picked) return;
|
|
61
|
+
handle.off("change", check);
|
|
62
|
+
resolve(picked);
|
|
63
|
+
};
|
|
64
|
+
handle.on("change", check);
|
|
65
|
+
check();
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function withTimeout(promise, ms, message) {
|
|
70
|
+
let timer;
|
|
71
|
+
return Promise.race([
|
|
72
|
+
promise,
|
|
73
|
+
new Promise((_, reject) => {
|
|
74
|
+
timer = setTimeout(() => reject(new Error(message)), ms);
|
|
75
|
+
}),
|
|
76
|
+
]).finally(() => clearTimeout(timer));
|
|
77
|
+
}
|
|
78
|
+
|
|
10
79
|
export default function renderAddDocToSidebarButton(handle, element) {
|
|
11
80
|
const wrapper = document.createElement("div");
|
|
12
81
|
wrapper.className = "add-doc-to-sidebar";
|
|
13
82
|
|
|
14
83
|
const button = document.createElement("button");
|
|
15
|
-
button.
|
|
84
|
+
button.type = "button";
|
|
85
|
+
button.textContent = LABEL;
|
|
16
86
|
wrapper.appendChild(button);
|
|
17
87
|
|
|
18
|
-
// hidden
|
|
88
|
+
// hidden until we know the doc's datatype (a doc link needs one)
|
|
19
89
|
wrapper.style.display = "none";
|
|
20
90
|
|
|
21
91
|
let docDatatypeId;
|
|
22
92
|
let title;
|
|
93
|
+
let loadingDatatype;
|
|
94
|
+
let resetTimer;
|
|
95
|
+
let disposed = false;
|
|
96
|
+
|
|
97
|
+
// The doc the frame has open. The view's doc-url is the real one; the handle
|
|
98
|
+
// may be a draft overlay presenting it.
|
|
99
|
+
const docUrl = () =>
|
|
100
|
+
element.closest?.("patchwork-view")?.getAttribute("doc-url") ??
|
|
101
|
+
element.getAttribute?.("doc-url") ??
|
|
102
|
+
handle.url;
|
|
23
103
|
|
|
24
104
|
function update() {
|
|
25
105
|
const doc = handle.doc();
|
|
@@ -35,48 +115,84 @@ export default function renderAddDocToSidebarButton(handle, element) {
|
|
|
35
115
|
const loaded = registry.get(docDatatypeId);
|
|
36
116
|
if (loaded && "module" in loaded) {
|
|
37
117
|
title = loaded.module.getTitle(doc) || undefined;
|
|
118
|
+
} else if (loadingDatatype !== docDatatypeId) {
|
|
119
|
+
loadingDatatype = docDatatypeId;
|
|
120
|
+
registry.load(docDatatypeId).then(() => {
|
|
121
|
+
if (!disposed) update();
|
|
122
|
+
});
|
|
38
123
|
}
|
|
39
124
|
|
|
40
125
|
wrapper.style.display = "";
|
|
41
126
|
}
|
|
42
127
|
|
|
43
|
-
|
|
44
|
-
|
|
128
|
+
function flash(text) {
|
|
129
|
+
clearTimeout(resetTimer);
|
|
130
|
+
button.textContent = text;
|
|
131
|
+
resetTimer = setTimeout(() => {
|
|
132
|
+
button.textContent = LABEL;
|
|
133
|
+
button.disabled = false;
|
|
134
|
+
}, 1500);
|
|
135
|
+
}
|
|
45
136
|
|
|
46
|
-
|
|
47
|
-
|
|
137
|
+
// Ask whatever frame we're in to do it (threepane answers). If nobody
|
|
138
|
+
// claims the event, put it in the account's root folder ourselves.
|
|
139
|
+
function askFrame(link) {
|
|
140
|
+
let work;
|
|
141
|
+
const event = new CustomEvent(ADD_TO_SIDEBAR_EVENT, {
|
|
142
|
+
bubbles: true,
|
|
143
|
+
composed: true,
|
|
144
|
+
cancelable: true,
|
|
145
|
+
detail: {
|
|
146
|
+
...link,
|
|
147
|
+
respondWith(promise) {
|
|
148
|
+
work = promise;
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
wrapper.dispatchEvent(event);
|
|
153
|
+
if (!event.defaultPrevented) return undefined;
|
|
154
|
+
return work ?? Promise.resolve();
|
|
155
|
+
}
|
|
48
156
|
|
|
49
|
-
|
|
50
|
-
|
|
157
|
+
async function addItOurselves(link) {
|
|
158
|
+
const account = accountHandle();
|
|
159
|
+
if (!account) throw new Error("no account handle on this page");
|
|
160
|
+
const rootFolderUrl = await withTimeout(
|
|
161
|
+
when(account, (doc) => doc.rootFolderUrl),
|
|
162
|
+
5000,
|
|
163
|
+
"account has no rootFolderUrl"
|
|
51
164
|
);
|
|
165
|
+
const rootFolder = await pageRepo(element).find(rootFolderUrl);
|
|
166
|
+
rootFolder.change((folder) => putAtTop(folder, link));
|
|
167
|
+
}
|
|
52
168
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
169
|
+
async function onAddDocToSidebar() {
|
|
170
|
+
const link = {
|
|
171
|
+
url: docUrl(),
|
|
172
|
+
name: title ?? "Untitled",
|
|
173
|
+
type: docDatatypeId,
|
|
174
|
+
};
|
|
175
|
+
button.disabled = true;
|
|
176
|
+
try {
|
|
177
|
+
await (askFrame(link) ?? addItOurselves(link));
|
|
178
|
+
flash("Added ✓");
|
|
179
|
+
} catch (error) {
|
|
180
|
+
console.error("[add-doc-to-sidebar] couldn't add to sidebar", error);
|
|
181
|
+
flash("Couldn't add");
|
|
182
|
+
}
|
|
60
183
|
}
|
|
61
184
|
|
|
62
185
|
button.addEventListener("click", onAddDocToSidebar);
|
|
63
186
|
handle.on("change", update);
|
|
64
187
|
update();
|
|
65
188
|
|
|
66
|
-
// try to load the datatype async if it wasn't ready yet
|
|
67
|
-
const doc = handle.doc();
|
|
68
|
-
if (doc) {
|
|
69
|
-
const datatypeId = getType(doc);
|
|
70
|
-
if (datatypeId) {
|
|
71
|
-
const registry = getRegistry("patchwork:datatype");
|
|
72
|
-
registry.load(datatypeId).then(() => update());
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
189
|
element.appendChild(wrapper);
|
|
77
190
|
|
|
78
191
|
return () => {
|
|
192
|
+
disposed = true;
|
|
193
|
+
clearTimeout(resetTimer);
|
|
79
194
|
handle.off("change", update);
|
|
80
195
|
button.removeEventListener("click", onAddDocToSidebar);
|
|
196
|
+
wrapper.remove();
|
|
81
197
|
};
|
|
82
198
|
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { Repo, initSubduction } from "@automerge/automerge-repo";
|
|
3
|
+
|
|
4
|
+
beforeAll(() => initSubduction());
|
|
5
|
+
|
|
6
|
+
vi.mock("@inkandswitch/patchwork-plugins", () => ({
|
|
7
|
+
getRegistry: () => ({
|
|
8
|
+
get: () => ({ module: { getTitle: (doc) => doc.title } }),
|
|
9
|
+
load: () => Promise.resolve(),
|
|
10
|
+
}),
|
|
11
|
+
}));
|
|
12
|
+
|
|
13
|
+
const { default: render, putAtTop, ADD_TO_SIDEBAR_EVENT } = await import(
|
|
14
|
+
"./button.js"
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
const flush = () => new Promise((resolve) => setTimeout(resolve, 0));
|
|
18
|
+
|
|
19
|
+
describe("putAtTop", () => {
|
|
20
|
+
const a = { url: "automerge:a", name: "A", type: "t" };
|
|
21
|
+
const b = { url: "automerge:b", name: "B", type: "t" };
|
|
22
|
+
|
|
23
|
+
it("adds a new doc first", () => {
|
|
24
|
+
const folder = { docs: [a] };
|
|
25
|
+
putAtTop(folder, b);
|
|
26
|
+
expect(folder.docs.map((d) => d.url)).toEqual([b.url, a.url]);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it("lifts a doc that's already there instead of adding it twice", () => {
|
|
30
|
+
const folder = { docs: [a, { ...b, name: "kept" }] };
|
|
31
|
+
putAtTop(folder, b);
|
|
32
|
+
expect(folder.docs).toEqual([{ ...b, name: "kept" }, a]);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("makes the list if the folder has none", () => {
|
|
36
|
+
const folder = {};
|
|
37
|
+
putAtTop(folder, a);
|
|
38
|
+
expect(folder.docs).toEqual([a]);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
describe("the button", () => {
|
|
43
|
+
let repo, doc, root, account, host, cleanup;
|
|
44
|
+
|
|
45
|
+
beforeEach(() => {
|
|
46
|
+
repo = new Repo();
|
|
47
|
+
root = repo.create({ docs: [{ url: "automerge:x", name: "X", type: "t" }] });
|
|
48
|
+
account = repo.create({ rootFolderUrl: root.url });
|
|
49
|
+
doc = repo.create({ "@patchwork": { type: "essay" }, title: "My essay" });
|
|
50
|
+
host = document.createElement("patchwork-view");
|
|
51
|
+
host.setAttribute("doc-url", doc.url);
|
|
52
|
+
document.body.appendChild(host);
|
|
53
|
+
window.repo = repo;
|
|
54
|
+
window.accountDocHandle = account;
|
|
55
|
+
cleanup = render(doc, host);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
afterEach(() => {
|
|
59
|
+
cleanup();
|
|
60
|
+
host.remove();
|
|
61
|
+
delete window.repo;
|
|
62
|
+
delete window.accountDocHandle;
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const click = () => host.querySelector("button").click();
|
|
66
|
+
|
|
67
|
+
it("lets a frame that claims the event do the adding", async () => {
|
|
68
|
+
const seen = [];
|
|
69
|
+
let done;
|
|
70
|
+
const claim = (event) => {
|
|
71
|
+
event.preventDefault();
|
|
72
|
+
seen.push({ ...event.detail });
|
|
73
|
+
event.detail.respondWith(new Promise((resolve) => (done = resolve)));
|
|
74
|
+
};
|
|
75
|
+
document.body.addEventListener(ADD_TO_SIDEBAR_EVENT, claim);
|
|
76
|
+
click();
|
|
77
|
+
document.body.removeEventListener(ADD_TO_SIDEBAR_EVENT, claim);
|
|
78
|
+
|
|
79
|
+
expect(seen[0]).toMatchObject({
|
|
80
|
+
url: doc.url,
|
|
81
|
+
name: "My essay",
|
|
82
|
+
type: "essay",
|
|
83
|
+
});
|
|
84
|
+
done();
|
|
85
|
+
await flush();
|
|
86
|
+
expect(host.querySelector("button").textContent).toBe("Added ✓");
|
|
87
|
+
expect(root.doc().docs).toHaveLength(1);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it("adds to the top of the root folder itself when nobody claims it", async () => {
|
|
91
|
+
click();
|
|
92
|
+
await flush();
|
|
93
|
+
await flush();
|
|
94
|
+
expect(root.doc().docs.map((d) => d.url)).toEqual([doc.url, "automerge:x"]);
|
|
95
|
+
expect(root.doc().docs[0]).toEqual({
|
|
96
|
+
url: doc.url,
|
|
97
|
+
name: "My essay",
|
|
98
|
+
type: "essay",
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it("finds the account on window.patchwork when that's all there is", async () => {
|
|
103
|
+
delete window.accountDocHandle;
|
|
104
|
+
window.patchwork = { account, repo };
|
|
105
|
+
try {
|
|
106
|
+
click();
|
|
107
|
+
await flush();
|
|
108
|
+
await flush();
|
|
109
|
+
expect(root.doc().docs[0].url).toBe(doc.url);
|
|
110
|
+
} finally {
|
|
111
|
+
delete window.patchwork;
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import{a as Ne,b as Ke}from"./chunk-B2O2X2JP.js";import{a as N,b as K,c as z,d as Le,e as L,f as Ae,g as de,h as ke,i as Me,j as se,k as ce,l as C,m as q,n as qe}from"./chunk-3A65VAIS.js";import{a as $e,c as ue,e as J,f as S,g as j,j as G,k as Q,l as He,m as Ie,n as Z,o as Ue,p as T,q as H,r as ee,s as I,t as Ce,u as Re,v as Pe,w as _,x as U}from"./chunk-PVIUDN4Q.js";import{b as B,c as je}from"./chunk-FEMULUBJ.js";import{template as Lt}from"solid-js/web";import{delegateEvents as jr}from"solid-js/web";import{setAttribute as qr}from"solid-js/web";import{insert as V}from"solid-js/web";import{effect as St}from"solid-js/web";import{createComponent as E}from"solid-js/web";import{use as Or}from"solid-js/web";import{createEffect as _t,createMemo as Vr,createSelector as Xr,createSignal as Br,lazy as zr,onCleanup as X,onMount as Jr,Show as Fe,Suspense as Gr}from"solid-js";import{render as Qr}from"solid-js/web";var me=new WeakMap;function Xe(e,t){let n=me.get(e);return n||me.set(e,n=new Map),n.set(t,(n.get(t)??0)+1),()=>{let s=n.get(t)-1;s?n.set(t,s):n.delete(t)}}function Be(e,t){return!!me.get(e)?.has(t)}var O=new Map,Oe=new Map,We=new WeakSet;function Ye(e,t){let n=new Set(t?.map(i=>i.url)),s=Oe.get(e);if(s)for(let i of s){if(n.has(i))continue;let c=O.get(i);c?.delete(e),c?.size||O.delete(i)}for(let i of n){let c=O.get(i);c||O.set(i,c=new Set),c.add(e)}Oe.set(e,n)}var te=new Map;function W(e){We.has(e)||(We.add(e),Ye(e.url,e.doc()?.docs),e.on("change",()=>{Ye(e.url,e.doc()?.docs),te.clear()}))}function Ve(e,t){let n=new Set,s=[],i=new Map([[e,!0]]);function c(l){let f=i.get(l);if(f!==void 0)return f;i.set(l,!1);let u=!1;for(let a of O.get(l)??[])c(a)&&(n.add(a),u=!0);return i.set(l,u),u}for(let l of t)l!==e&&!c(l)&&s.push(l);return{folders:n,unreached:s}}async function kt(e,t,n){let s=new Set(n),i=new Set,c=!1;async function l(f){if(!s.size||i.has(f))return;i.add(f);let u;try{let a=await e.find(f);W(a),u=a.doc()?.docs??[]}catch{c=!0;return}for(let a of u)s.delete(a.url);await Promise.all(u.filter(a=>a.type==="folder").map(a=>l(a.url)))}return await l(t),!s.size||!c}async function ze(e,t,n){let s=Ve(t,n),i=te.get(t),c=s.unreached.filter(a=>!i?.has(a));if(!c.length)return s.folders;let l=await kt(e,t,new Set(c)),{folders:f,unreached:u}=Ve(t,n);if(l&&u.length){let a=te.get(t)??new Set;for(let g of u)a.add(g);te.set(t,a)}return f}import{template as Se}from"solid-js/web";import{effect as Er}from"solid-js/web";import{memo as ht}from"solid-js/web";import{insert as De}from"solid-js/web";import{createComponent as D}from"solid-js/web";import{deleteAt as Fr}from"@automerge/automerge-repo/slim";import{getRegistry as yt,isLoadedPlugin as Lr}from"@inkandswitch/patchwork-plugins";import{createEffect as wt,createMemo as Ar,createSignal as kr,For as Mr,lazy as $r,Match as xt,onCleanup as Ee,Show as Te,Suspense as Hr,Switch as Ir,untrack as vt}from"solid-js";import{isImmutableString as Mt,updateText as $t}from"@automerge/automerge-repo/slim";function re(e){if(typeof e=="string")return e;if(Mt(e))return String(e)}function $(e,t,n){let s=t[t.length-1],i=e;for(let l of t.slice(0,-1))i=i?.[l];if(i==null)return;let c=i[s];re(c)!==n&&(typeof c=="string"?$t(e,t,n):i[s]=n)}import{template as pt}from"solid-js/web";import{style as ft}from"solid-js/web";import{setAttribute as we}from"solid-js/web";import{effect as hr}from"solid-js/web";import{insert as xe}from"solid-js/web";import{createComponent as F}from"solid-js/web";import{addEventListener as yr}from"solid-js/web";import"solid-js/web";import{createEffect as ve,createSignal as vr,onCleanup as br,Show as gt,Suspense as Dr}from"solid-js";import{template as zt}from"solid-js/web";import{delegateEvents as Jt}from"solid-js/web";import{setAttribute as A}from"solid-js/web";import{effect as Gt}from"solid-js/web";import{insert as Qt}from"solid-js/web";import{addEventListener as ge}from"solid-js/web";import{use as Zt}from"solid-js/web";import{createEffect as tr,onCleanup as at}from"solid-js";import{isValidAutomergeUrl as fe}from"@automerge/automerge-repo/slim";var Ht=["text/x-patchwork-dnd","text/x-patchwork-urls","text/uri-list","text/plain"];function Je(e){return!!(e&&Ht.some(t=>e.types.includes(t)))}function It(e){let t=e.trim();if(fe(t))return t;let n=t.match(/#doc=([^&\s]+)/)?.[1];return n&&fe(`automerge:${n}`)?`automerge:${n}`:null}function Ge(e){let t=e.dataTransfer;if(!t)return null;let n=t.getData("text/x-patchwork-dnd");if(n)try{let l=JSON.parse(n);if(Array.isArray(l?.items)&&l.items.length>0)return{source:l.source??"",items:l.items}}catch{}let s=t.getData("text/x-patchwork-urls");if(s)try{let l=JSON.parse(s),f=(Array.isArray(l)?l:[]).filter(u=>fe(u)).map(u=>({url:u}));if(f.length>0)return{source:"",items:f}}catch{}let c=(t.getData("text/uri-list")||t.getData("text/plain")).split(/\r?\n/).map(It).filter(l=>l!==null).map(l=>({url:l}));return c.length>0?{source:"",items:c}:null}var Ut=new Set(["amtext","knitout","k","js","mjs","cjs","jsx","ts","mts","cts","tsx","json","jsonc","md","markdown","txt","csv","tsv","html","htm","css","svg","xml","yaml","yml","toml","ini","sh","py","log"]),Ct=new Set(["application/json","application/javascript","application/ecmascript","application/xml","application/x-sh"]),Rt=e=>{let t=e.split(";")[0].trim();return t.startsWith("text/")||Ct.has(t)||t.endsWith("+json")||t.endsWith("+xml")};async function Qe(e,t,n,s){let i=[],c=[],l=s;for(let f of e)try{let u=f.name.split("."),a=u.length>1?u.pop():"",g=u.join("."),x=Rt(f.type)||Ut.has(a.toLowerCase()),m=x?await f.text():new Uint8Array(await f.arrayBuffer()),o=x?"text/plain":"application/octet-stream",d=f.type!=="application/octet-stream"&&f.type,r=await n.create2({"@patchwork":{type:"file"},content:m,extension:a,mimeType:d||o,name:g}),h=Math.min(l,t.doc()?.docs?.length??0);t.change(p=>{p.docs.splice(h,0,{url:r.url,name:f.name,type:"file"})}),i.push({folderUrl:t.url,index:h,url:r.url}),l=h+1,C("FileDrop: Created file document:",f.name,r.url)}catch(u){C("FileDrop: Failed to create file document:",u),c.push(f.name)}return{landed:i,failed:c}}var Pt=5e3,Nt=700;async function R(e,t){let n=Ie();if(_(),!n)return;let s=G(e),i=[...e.dataTransfer?.files??[]],c=i.length?null:Ge(e),l=Ue(t.element),f=S();if(s){n.position==="inside"&&t.expand?.(),K({containerUrl:n.folderUrl,index:n.index});return}try{if(i.length){let a=await Kt(t,n),{landed:g,failed:x}=await Qe(i,a,t.repo,n.index);if(et(g),x.length)throw new q(`Couldn't add ${x.join(", ")}.`);return}if(!c)throw C("No dnd data in drop event. types:",e.dataTransfer?.types),new q("That isn't something the list can hold.");let u=await qe({draggedIds:c.items.map(a=>a.id??a.url),draggedUrls:c.items.map(a=>a.url),draggedItems:c.items,sourceToolId:c.source,copyMode:f},n,t.repo,t.rootFolderHandle,l);u&&et(u)}catch(u){C("Drop failed:",u),jt(t.element,u instanceof q?u.message:"That drop didn't work.")}}async function Kt(e,t){if(t.folderUrl===e.rootFolderHandle.url)return e.rootFolderHandle;try{return await e.repo.find(t.folderUrl)}catch{throw new q("Couldn't open the folder to drop into.")}}var Ze;function jt(e,t){clearTimeout(Ze),ce({element:e,message:t}),Ze=setTimeout(()=>ce(null),Pt)}function qt({folderUrl:e,index:t,url:n}){return`[data-dnd-parent="${CSS.escape(e)}"][data-dnd-index="${t}"][data-doc-url="${CSS.escape(n)}"]`}function et(e,t=10){if(!e.length)return;let n=e.map(qt).join(",");requestAnimationFrame(function s(){let i=document.querySelectorAll(n);if(i.length<e.length&&t-- >0){requestAnimationFrame(s);return}if(i.length){i.forEach(tt);return}let c=[...new Set(e.map(l=>l.folderUrl))];for(let l of c)document.querySelectorAll(`[data-dnd-item="${CSS.escape(l)}"]`).forEach(tt)})}function tt(e){e.removeAttribute("data-dnd-landed"),e.offsetWidth,e.setAttribute("data-dnd-landed",""),setTimeout(()=>e.removeAttribute("data-dnd-landed"),Nt)}import{parseAutomergeUrl as Ot}from"@automerge/automerge-repo/slim";function rt(e,t,n,s){let i=e.dataTransfer;T.has(t.id)||(I(),H(t.id,t));let c=[...T.values()],l=c.map(a=>a.url),f=c.map(a=>a.id);j(e.altKey),i.effectAllowed="all";let u=l.map(a=>location.protocol+"//"+location.host+`/#doc=${Ot(a).documentId}`).join(`\r
|
|
2
|
+
`)+`\r
|
|
3
|
+
`;i.items.add(u,"text/uri-list"),i.items.add(JSON.stringify(f),"text/x-sideboard-ids"),i.items.add(JSON.stringify(l),"text/x-patchwork-urls"),i.items.add(JSON.stringify({source:n.toolId,items:c}),"text/x-patchwork-dnd"),c.length===1&&s.addTo(i),i.setDragImage(Wt(c.length,t.name,e.altKey),10,10),Ce(f),Z(n),J(!0)}function Wt(e,t,n){let s=document.createElement("div");s.style.cssText=`
|
|
4
|
+
position: absolute;
|
|
5
|
+
top: -1000px;
|
|
6
|
+
background: var(--document-list-primary);
|
|
7
|
+
padding: 0.5rem 0.75rem;
|
|
8
|
+
border-radius: var(--document-list-radius);
|
|
9
|
+
font-family: inherit;
|
|
10
|
+
font-size: 0.9rem;
|
|
11
|
+
pointer-events: none;
|
|
12
|
+
color: var(--document-list-primary-line);
|
|
13
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
|
14
|
+
`;let i=n?" (copy)":"";return s.textContent=e===1?t+i:`${e} items${i}`,document.body.appendChild(s),setTimeout(()=>s.remove(),0),s}import{getImportableUrlFromAutomergeUrl as Yt}from"@inkandswitch/patchwork-filesystem";var Vt={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",avif:"image/avif",bmp:"image/bmp",tiff:"image/tiff",svg:"image/svg+xml",pdf:"application/pdf",mp4:"video/mp4",webm:"video/webm",mov:"video/quicktime",mp3:"audio/mpeg",wav:"audio/wav",ogg:"audio/ogg",txt:"text/plain",md:"text/markdown",csv:"text/csv",json:"application/json",html:"text/html",zip:"application/zip"};function nt(e){let t=e.includes(".")?e.split(".").pop().toLowerCase():"";return t?Vt[t]:void 0}function ot(e){let t=null,n=!1;return{prefetch(){n||e.type!=="file"||(n=!0,e.repo.find(e.url).then(s=>{let i=s?.doc();if(!i)return;let c=String(i.name??e.name??"file"),l=i.extension?`.${String(i.extension).replace(/^\.+/,"")}`:"",f=l&&!c.endsWith(l)?`${c}${l}`:c;t={mime:String(i.mimeType||nt(f)||"application/octet-stream"),filename:f}}).catch(()=>{}))},addTo(s){if(e.type!=="file")return;let i=t?.filename??e.name,c=t?.mime??nt(i)??"application/octet-stream";try{let l=new URL(Yt(e.url),location.origin).href;s.setData("DownloadURL",`${c}:${i}:${l}`)}catch{}}}}function ne(e,t){let n,s=!1;return{start(){return n||s?!1:(n=setTimeout(()=>{n=void 0,s=!0,t()},e),!0)},stop(){clearTimeout(n),n=void 0,s=!1}}}function Xt(e){for(let t=e.parentElement;t;t=t.parentElement){let n=getComputedStyle(t).overflowY;if((n==="auto"||n==="scroll")&&t.scrollHeight>t.clientHeight)return t}return document.scrollingElement??document.body}function Bt(e){let t=Xt(e),n=t.getBoundingClientRect(),s=t.querySelectorAll('.document-list-item[aria-selected="true"]');for(let i of s){let c=i.getBoundingClientRect();if(c.top>=n.top&&c.bottom<=n.bottom)return!0}return!1}function it(e){Bt(e)||e.scrollIntoViewIfNeeded?.()}var er=zt('<div role=treeitem tabindex=-1 aria-haspopup=menu class="popmenu__trigger document-list-item"draggable=true>'),rr=1500;function Y(e){let t,n=()=>e.type==="folder",s=()=>(e.parentFolderHandle??e.rootFolderHandle).url,i=ot(e);tr(o=>(e.pressed&&!o&&t&&it(t),e.pressed));let c=()=>({id:e.id,type:e.type,url:e.url,name:e.name,source:e.element.toolId}),l=ne(rr,()=>{t?.removeAttribute("data-dnd-springload"),e.openWith()});function f(){n()||T.has(e.id)||l.start()&&t?.setAttribute("data-dnd-springload","")}function u(){l.stop(),t?.removeAttribute("data-dnd-springload")}at(u);function a(o,d){Me({x:o,y:d,element:t,id:e.id,url:e.url,name:e.name,type:e.type,openWith:e.openWith,startRenaming:e.startRenaming,remove:e.remove,createInside:e.createInside})}let g,x=()=>clearTimeout(g);at(x);function m(){I(),e.openWith()}return(()=>{var o=er();o.$$keydown=r=>{if(r.target!==t)return;let h=!(r.altKey||r.shiftKey||r.metaKey||r.ctrlKey);if(h&&(r.key==="Enter"||r.key===" ")){r.preventDefault(),m();return}if(h&&n()&&e.onToggleExpand&&(r.key==="ArrowRight"&&!e.isExpanded||r.key==="ArrowLeft"&&e.isExpanded)){r.preventDefault(),e.onToggleExpand();return}if(r.key=="Enter"&&r.ctrlKey&&!(r.altKey||r.shiftKey||r.metaKey)){r.preventDefault(),r.stopPropagation();let p=t.getBoundingClientRect();a(p.x+10,p.y+p.height-10)}},ge(o,"dblclick",r=>{r.target.closest("input")||e.startRenaming()}),ge(o,"click",r=>{r.ctrlKey||r.metaKey||r.target.closest(".document-list-folder__toggle, .create-new-button, input")||m()}),o.$$mousedown=r=>{i.prefetch(),r.ctrlKey||r.metaKey?(T.has(e.id)?ee(e.id):H(e.id,c()),r.preventDefault(),r.stopPropagation(),r.stopImmediatePropagation()):T.has(e.id)||I()},o.addEventListener("drop",r=>{r.preventDefault(),r.stopPropagation(),u(),R(r,{repo:e.repo,rootFolderHandle:e.rootFolderHandle,element:e.element,expand:e.expand})}),o.addEventListener("dragleave",r=>{let h=r.relatedTarget;(!h||!t.contains(h))&&(u(),_())}),o.addEventListener("dragover",r=>{r.preventDefault(),r.dataTransfer.dropEffect=S()?"copy":"move";let h=t.getBoundingClientRect(),p;if(n()){let y=(r.clientY-h.top)/h.height;p=y<.25?"above":y>.75?"below":"inside"}else p=Pe(r.clientY,t)?"above":"below";p!=="inside"&&r.stopPropagation(),U(Q({id:e.id,url:e.url,parentUrl:s(),index:e.itemIndex??0},p)),f()}),o.addEventListener("dragend",()=>{u(),_(),Re(),I(),j(!1),Z(null),J(!1)}),o.addEventListener("drag",r=>{r.altKey!==S()&&j(r.altKey)}),o.addEventListener("dragstart",r=>{x(),rt(r,c(),e.element,i)}),o.addEventListener("pointercancel",x),o.$$pointerup=x,o.$$pointerdown=r=>{(r.pointerType==="touch"||r.pointerType==="pen")&&(g=setTimeout(()=>a(r.clientX,r.clientY),700))},ge(o,"contextmenu",r=>{r.preventDefault(),r.stopPropagation(),a(r.clientX,r.clientY)});var d=t;return typeof d=="function"?Zt(d,o):t=o,Qt(o,()=>e.children),Gt(r=>{var h=e["aria-label"],p=e.pressed?"true":void 0,y=n()?!!e.isExpanded:void 0,w=e.id,v=s(),b=e.itemIndex,k=e.url,M=e.type;return h!==r.e&&A(o,"aria-label",r.e=h),p!==r.t&&A(o,"aria-selected",r.t=p),y!==r.a&&A(o,"aria-expanded",r.a=y),w!==r.o&&A(o,"data-dnd-item",r.o=w),v!==r.i&&A(o,"data-dnd-parent",r.i=v),b!==r.n&&A(o,"data-dnd-index",r.n=b),k!==r.s&&A(o,"data-doc-url",r.s=k),M!==r.h&&A(o,"data-doc-type",r.h=M),r},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0}),o})()}Jt(["pointerdown","pointerup","mousedown","keydown"]);import{template as dt}from"solid-js/web";import{delegateEvents as nr}from"solid-js/web";import{insert as or}from"solid-js/web";import{createComponent as pe}from"solid-js/web";import{effect as ir}from"solid-js/web";import{use as ar}from"solid-js/web";import{createSelector as sr,createSignal as cr,Match as lt,Switch as ur}from"solid-js";var lr=dt("<form style=display:contents><input autofocus class=document-list-item__name>"),dr=dt("<span class=document-list-item__name>");function oe(e){let t=sr(Le),[n,s]=cr(e.name),i=!1;function c(l,f){if(i)return;i=!0;let u=n()??"";l&&u!==(e.name??"")&&e.rename(u);let a=f?.closest('[role="treeitem"]');t(e.id)&&L(""),a?.focus()}return pe(ur,{get children(){return[pe(lt,{get when(){return t(e.id)},get children(){var l=lr(),f=l.firstChild;return l.addEventListener("submit",u=>{u.preventDefault(),c(!0,u.currentTarget.querySelector("input"))}),f.$$input=u=>s(u.target.value),f.$$keydown=u=>{(u.key=="Escape"||u.key=="g"&&u.ctrlKey)&&(u.preventDefault(),u.stopPropagation(),c(!1,u.currentTarget))},f.addEventListener("blur",()=>c(!0)),ar(u=>{i=!1,s(e.name),setTimeout(()=>{u.focus(),u.select()},80)},f),ir(()=>f.value=n()),l}}),pe(lt,{get when(){return!t(e.id)},get children(){var l=dr();return or(l,()=>e.name),l}})]}})}nr(["keydown","input"]);import{template as ct}from"solid-js/web";import{insert as mr}from"solid-js/web";import{createComponent as fr}from"solid-js/web";import{setStyleProperty as he}from"solid-js/web";import{effect as ut}from"solid-js/web";import{For as pr}from"solid-js";var mt=ct('<div class="document-list-item document-list-item--loading"aria-hidden=true><span class=document-list-item__skeleton>'),gr=ct('<div class=document-list__loading aria-busy=true aria-label="Loading documents">');function ie(e){return(()=>{var t=mt();return ut(n=>he(t,"--depth",e.depth??0)),t})()}var st=["11rem","7rem","9.5rem","6rem","10rem","8rem"];function ye(e){let t=()=>Array.from({length:e.count??5},(n,s)=>s);return(()=>{var n=gr();return mr(n,fr(pr,{get each(){return t()},children:s=>(()=>{var i=mt(),c=i.firstChild;return ut(l=>{var f=e.depth??0,u=st[s%st.length];return f!==l.e&&he(i,"--depth",l.e=f),u!==l.t&&he(c,"width",l.t=u),l},{e:void 0,t:void 0}),i})()})),n})()}var wr=pt("<span aria-hidden=true class=document-list-folder__toggle>"),xr=pt("<div class=document-list-folder role=none><div role=group class=document-list-folder__contents>");function be(e){let[t,n]=vr(!1),[s,i]=B(()=>e.url,e);ve(()=>{i.latest&&W(i.latest)});let c=new Set(e.visitedFolders??[]);c.add(e.url);let l=()=>e.depth??1,f=()=>({"--depth":l()+1}),u=()=>({"--depth":l()});ve(m=>(!m&&e.filter&&z(e.filter,s()?.title??e.name)&&n(!0),e.filter)),ve(()=>{Ae().has(e.url)&&n(!0)});let a=ne(1e3,()=>n(!0));br(a.stop);function g(m){i()?.change(d=>$(d,["title"],m));let o=e.itemIndex;e.parentFolderHandle?.change(d=>{o!=null&&d.docs[o]?.url===e.url&&$(d,["docs",o,"name"],m)})}async function x(m){let o=i();if(!o)return;let d=await Ne(e.repo,m),r=0;o.change(h=>{h.docs.push(d),r=h.docs.length-1}),e.clearFilter(),n(!0),e.open(d),L(o.url+"/"+r)}return(()=>{var m=xr(),o=m.firstChild;return m.addEventListener("drop",d=>{d.preventDefault(),d.stopPropagation(),a.stop(),R(d,{repo:e.repo,rootFolderHandle:e.rootFolderHandle,element:e.element,expand:()=>n(!0)})}),m.addEventListener("dragleave",d=>{let r=d.relatedTarget;(!r||!d.currentTarget.contains(r))&&(a.stop(),_())}),m.addEventListener("dragover",d=>{d.preventDefault(),d.stopPropagation(),d.dataTransfer.dropEffect=S()?"copy":"move";let r=d.target.closest(".document-list-item");r||U(Q({id:e.url,url:e.url,parentUrl:e.parentFolderHandle?.url??e.url,index:e.itemIndex??0},"inside")),r?.getAttribute("data-dnd-item")===e.url&&!t()&&a.start()}),xe(m,F(Y,{get"aria-label"(){return s()?.title??e.name??""},startRenaming:()=>{L(e.url)},get remove(){return e.removeFromParent},get id(){return e.url},get url(){return e.url},get name(){return s()?.title??e.name??""},get pressed(){return e.isSelected(e.url)},type:"folder",get element(){return e.element},get repo(){return e.repo},get rootFolderHandle(){return e.rootFolderHandle},get parentFolderHandle(){return e.parentFolderHandle},get itemIndex(){return e.itemIndex},get isExpanded(){return t()},onToggleExpand:()=>n(d=>!d),expand:()=>n(!0),createInside:x,openWith:d=>{e.open({url:e.url,toolId:d,title:s()?.title??e.name,type:"folder"})},get children(){return[(()=>{var d=wr();return yr(d,"click",r=>{r.stopImmediatePropagation(),n(h=>!h)}),xe(d,F(gt,{get when(){return t()},get fallback(){return F(ue,{})},get children(){return F(ue,{style:{rotate:"90deg"}})}})),d})(),F(oe,{get name(){return s()?.title??e.name},get id(){return e.url},rename:g})]}}),o),xe(o,F(gt,{get when(){return t()||!!e.filter},get children(){return F(Dr,{get fallback(){return F(ie,{get depth(){return l()+1}})},get children(){return F(ae,{get docs(){return s()?.docs},get repo(){return e.repo},get depth(){return l()+1},get handle(){return i.latest},get open(){return e.open},get isSelected(){return e.isSelected},visitedFolders:c,get element(){return e.element},get rootFolderHandle(){return e.rootFolderHandle},get filter(){return e.filter},get clearFilter(){return e.clearFilter}})}})}})),hr(d=>{var r=l(),h=u(),p=e.url,y=!t()&&!e.filter,w=l(),v=f();return r!==d.e&&we(m,"data-depth",d.e=r),d.t=ft(m,h,d.t),p!==d.a&&we(m,"data-dnd-container",d.a=p),y!==d.o&&o.classList.toggle("document-list-folder__contents--hidden",d.o=y),w!==d.i&&we(o,"data-depth",d.i=w),d.n=ft(o,v,d.n),d},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0}),m})()}var Tr=Se('<div class="document-list__item document-list__item--visible">'),Sr=Se("<div class=document-list__item>"),_r=Se('<div class=document-list-folder__circular-ref style="padding-left:calc(var(--depth) * 1rem)"><span> (i contain myself eventually)'),Ur=$r(()=>import("./create-new-menu-JPICLPWM.js").then(e=>({default:e.NewDocPlaceholder}))),bt=40,Cr=8;function ae(e){let t=e.visitedFolders??new Set,[n,s]=kr(bt);wt(()=>{let a=e.docs?.length??0;if(vt(n)>=a)return;let g=requestAnimationFrame(function x(){let m=performance.now(),o=vt(n);do s(o+=bt);while(o<a&&performance.now()-m<Cr);o<a&&(g=requestAnimationFrame(x))});Ee(()=>cancelAnimationFrame(g))});let i=Ar(()=>{let a=e.docs??[];return a.length>n()?a.slice(0,n()):a});function c(a){e.handle.change(g=>Fr(g.docs,a))}let l=()=>!!e.handle&&N()?.containerUrl===e.handle.url,f=a=>{let g=N();if(!g)return;let x=g.index;K(null),e.handle.change(m=>m.docs.splice(x,0,a)),e.open(a),L(e.handle.url+"/"+x)},u=()=>(()=>{var a=Tr();return De(a,D(Ur,{get repo(){return e.repo},onCreate:f,onDismiss:()=>K(null),get clearFilter(){return e.clearFilter}})),a})();return[D(Mr,{get each(){return i()},children:(a,g)=>{let x=()=>!e.filter.length||z(e.filter,a.name),m=()=>c(g()),o=()=>e.handle.url+"/"+g();Ee(Xe(e.element,a.url));let d=r=>{e.handle.change(p=>$(p,["docs",g(),"name"],r));let h=yt("patchwork:datatype");e.repo.find(a.url).then(async p=>{let{"@patchwork":y}=p.doc();if(y){let w=h.get(y.type);if(w){await h.load(w.id);let v=w.module;if(v.getTitle?.(p.doc())===r)return;p.change(b=>v.setTitle?.(b,r))}}})};return wt(()=>{if(!e.isSelected(a.url))return;let r=!1,h;e.repo.find(a.url).then(async p=>{if(r)return;let y=yt("patchwork:datatype");async function w(){let b=p.doc();if(!b)return;let k=b["@patchwork"];if(!k?.type)return;let M=y.get(k.type);if(!M||(await y.load(M.id),r)||!Lr(M))return;let P=M.module.getTitle(b);if(!P)return;let At=e.handle.doc()?.docs?.[g()]?.name;re(At)!==P&&e.handle.change(le=>$(le,["docs",g(),"name"],P)),re(k.title)!==P&&p.change(le=>$(le,["@patchwork","title"],P))}if(await w(),r)return;let v=()=>w();p.on("change",v),h=()=>p.off("change",v)}),Ee(()=>{r=!0,h?.()})}),[D(Te,{get when(){return ht(()=>!!l())()&&N().index===g()},get children(){return u()}}),(()=>{var r=Sr();return De(r,D(Hr,{get fallback(){return D(ie,{get depth(){return e.depth}})},get children(){return D(Ir,{get children(){return[D(xt,{get when(){return a.type=="folder"},get children(){return D(Te,{get when(){return!t.has(a.url)},get fallback(){return(()=>{var h=_r(),p=h.firstChild,y=p.firstChild;return De(p,()=>a.name,y),h})()},get children(){return D(be,{get url(){return a.url},get depth(){return e.depth},get repo(){return e.repo},removeFromParent:m,get parentFolderHandle(){return e.handle},get itemIndex(){return g()},get open(){return e.open},get name(){return a.name},get isSelected(){return e.isSelected},visitedFolders:t,get element(){return e.element},get rootFolderHandle(){return e.rootFolderHandle},get filter(){return e.filter},get clearFilter(){return e.clearFilter}})}})}}),D(xt,{get when(){return a.type!="folder"},get children(){return D(Y,{get"aria-label"(){return a.name},get url(){return a.url},get name(){return a.name},get id(){return o()},startRenaming:()=>L(o()),remove:m,get pressed(){return e.isSelected(a.url)},get type(){return a.type},get element(){return e.element},get repo(){return e.repo},get rootFolderHandle(){return e.rootFolderHandle},get parentFolderHandle(){return e.handle},get itemIndex(){return g()},openWith:h=>e.open({url:a.url,toolId:h,title:a.name,type:a.type}),get children(){return D(oe,{get name(){return a.name},get id(){return o()},rename:d})}})}})]}})}})),Er(h=>{var p=!!x(),y=!x();return p!==h.e&&r.classList.toggle("document-list__item--visible",h.e=p),y!==h.t&&r.classList.toggle("document-list__item--invisible",h.t=y),h},{e:void 0,t:void 0}),r})()]}}),D(Te,{get when(){return ht(()=>!!l())()&&N().index>=(e.docs?.length??0)},get children(){return u()}})]}import{createEffect as Oo,createSignal as Rr,onCleanup as Pr,onMount as Nr}from"solid-js";import{createStore as Yo,reconcile as Vo}from"solid-js/store";import*as _e from"@inkandswitch/patchwork-providers";function Kr(e){return typeof e=="function"?e():e}function Dt(e,t,n){let[s,i]=Rr(n);return Nr(()=>{let c=Kr(e);if(!c)return;let l=_e.subscribe(c,t,i);Pr(l)}),s}function Et(e){let t=0,n=0,s=!1,i=new Set,c=new Set;function l(g){return{id:g.getAttribute("data-dnd-item"),url:g.getAttribute("data-doc-url"),type:g.getAttribute("data-doc-type")??"",name:(g.textContent??"").trim(),source:e.source()}}function f(g){let x=g.clientX-t,m=g.clientY-n;if(!s){if(Math.hypot(x,m)<5)return;s=!0}g.preventDefault();let o=Math.min(t,g.clientX),d=Math.min(n,g.clientY),r=Math.max(t,g.clientX),h=Math.max(n,g.clientY),p=e.container();if(!p)return;let y=new Set;for(let w of p.querySelectorAll("[data-dnd-item]")){if(w.offsetParent===null)continue;let v=w.getAttribute("data-dnd-item");if(!v||i.has(v))continue;let b=w.getBoundingClientRect();b.right<o||b.left>r||b.bottom<d||b.top>h||(y.add(v),T.has(v)||H(v,l(w)))}for(let w of c)y.has(w)||ee(w);c=y}function u(){window.removeEventListener("mousemove",f,!0),window.removeEventListener("mouseup",u,!0),s=!1,c=new Set,i=new Set}function a(g){g.button!==0||!(g.metaKey||g.ctrlKey)||g.target.closest(".document-list__toolbar")||(t=g.clientX,n=g.clientY,s=!1,c=new Set,i=new Set(T.keys()),window.addEventListener("mousemove",f,!0),window.addEventListener("mouseup",u,!0))}return{onMouseDown:a}}function Tt(e){let t='[role="treeitem"]',n=null,s=m=>m.offsetParent!==null,i=()=>[...e.querySelectorAll(t)].filter(s);function c(m){n!==m&&(n&&(n.tabIndex=-1),m.tabIndex=0,n=m)}function l(m){m&&(c(m),m.focus())}function f(){if(n?.isConnected&&s(n)&&n.tabIndex===0)return;n?.isConnected&&(n.tabIndex=-1),n=null;let m=i(),o=m.find(d=>d.getAttribute("aria-selected")==="true")??m[0];o&&c(o)}function u(m){let o=m.parentElement?.closest('[role="group"]');return!o||!e.contains(o)?null:o.parentElement?.querySelector(`:scope > ${t}`)}function a(m){if(m.defaultPrevented||m.altKey||m.ctrlKey||m.metaKey)return;let o=m.target;if(o.closest("input, textarea"))return;let d=o.closest(t);if(!d||!e.contains(d))return;let r=i(),h=r.indexOf(d),p;switch(m.key){case"ArrowDown":p=r[h+1];break;case"ArrowUp":p=r[h-1];break;case"Home":p=r[0];break;case"End":p=r[r.length-1];break;case"ArrowRight":if(d.getAttribute("aria-expanded")!=="true")return;p=r[h+1],p&&u(p)!==d&&(p=null);break;case"ArrowLeft":p=u(d);break;default:return}m.preventDefault(),l(p)}function g(m){let o=m.target.closest(t);o&&e.contains(o)&&o===m.target&&c(o)}let x=new MutationObserver(f);return x.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["class","aria-selected"]}),e.addEventListener("keydown",a),e.addEventListener("focusin",g),f(),()=>{x.disconnect(),e.removeEventListener("keydown",a),e.removeEventListener("focusin",g)}}var Wr=Lt("<p class=document-list__error role=alert>"),Yr=Lt('<aside class=document-list><nav class="document-list__doclist document-list-widget"role=tree aria-multiselectable=true><div class=document-list__toolbar><div class=document-list__filter-container><input name=filter class=document-list__filter placeholder="Filter by title">'),Ft=zr(()=>import("./item-menu-C37UJBFI.js").then(e=>({default:e.ItemMenu})));function Zr(e){let[t,n]=B(()=>e.folderUrl,{repo:e.repo}),[s,i]=Br("");Jr(()=>{let o=()=>void Ft.preload();if(typeof requestIdleCallback=="function"){let d=requestIdleCallback(o);X(()=>cancelIdleCallback(d))}else{let d=setTimeout(o,0);X(()=>clearTimeout(d))}});let c=()=>n.state==="ready"||n.state==="refreshing";_t(()=>{n.latest&&W(n.latest)});let l=Dt(e.element,{type:"patchwork:selected-doc"},[]),f=Vr(()=>new Set(l())),u=Xr(f,(o,d)=>d.has(o));_t(()=>{if(!c())return;let o=l();if(!o.length){de(new Set);return}if(o.every(r=>Be(e.element,r)))return;let d=!1;ze(e.repo,e.folderUrl,o).then(r=>{d||de(r)}),X(()=>{d=!0})});function a(o){e.element.dispatchEvent(je(o))}let g,x=Et({container:()=>g,source:()=>e.element.toolId??""}),m=o=>{g=o,o.addEventListener("mousedown",x.onMouseDown,!0),X(()=>o.removeEventListener("mousedown",x.onMouseDown,!0)),X(Tt(o))};return(()=>{var o=Yr(),d=o.firstChild,r=d.firstChild,h=r.firstChild,p=h.firstChild;return d.addEventListener("drop",y=>{y.preventDefault();let w=n.latest;w&&R(y,{repo:e.repo,rootFolderHandle:w,element:e.element})}),d.addEventListener("dragleave",y=>{let w=y.relatedTarget;(!w||!y.currentTarget.contains(w))&&_()}),d.addEventListener("dragover",y=>{let w=y.dataTransfer?.types.includes("Files");if(!w&&!Je(y.dataTransfer)&&!G(y))return;y.preventDefault(),y.dataTransfer.dropEffect=w||S()?"copy":"move";let v=n.latest;v&&U(He(v.url,v.doc()?.docs?.length??0))}),Or(m,d),V(r,E(Ke,{square:!0,draggable:!0,clearFilter:()=>i(""),changeFolder:y=>n()?.change(y),get repo(){return e.repo},open:a}),h),V(h,E($e,{}),p),p.$$input=y=>i(y.target.value.toLowerCase()),V(d,E(Fe,{get when(){return c()},get fallback(){return E(ye,{depth:0})},get children(){return[E(Gr,{get fallback(){return E(ye,{depth:0})},get children(){return E(ae,{depth:0,get repo(){return e.repo},get docs(){return t()?.docs},get handle(){return n.latest},open:a,isSelected:u,get element(){return e.element},get rootFolderHandle(){return n.latest},get filter(){return s()},clearFilter:()=>i("")})}}),E(Fe,{get when(){return ke()},get children(){return E(Ft,{get repo(){return e.repo},get rootFolderHandle(){return n.latest},get element(){return e.element}})}})]}}),null),V(d,E(Fe,{get when(){return se()?.element===e.element},get children(){var y=Wr();return V(y,()=>se().message),y}}),null),St(()=>qr(d,"data-dnd-container",e.folderUrl)),St(()=>p.value=s()),o})()}function bi(e,t){return Qr(()=>E(Zr,{folderUrl:e,get repo(){return t.repo},element:t}),t)}jr(["input"]);export{ye as a,Zr as b,bi as c};
|
|
15
|
+
//# sourceMappingURL=chunk-H6GFMJFM.js.map
|