@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.
Files changed (24) hide show
  1. package/module-settings-url +1 -1
  2. package/package.json +1 -1
  3. package/packages/add-doc-to-sidebar-button/button.js +141 -25
  4. package/packages/add-doc-to-sidebar-button/button.test.js +114 -0
  5. package/packages/sideboard/dist/chunk-H6GFMJFM.js +15 -0
  6. package/packages/sideboard/dist/chunk-H6GFMJFM.js.map +7 -0
  7. package/packages/sideboard/dist/{document-list-panel-VFY2RV33.js → document-list-panel-SEKNECHI.js} +2 -2
  8. package/packages/sideboard/dist/index.js +1 -1
  9. package/packages/sideboard/dist/sideboard/sideboard.js +1 -1
  10. package/packages/threepane/dist/IsolatedDocumentArea-5WRK3TWL.js +2 -0
  11. package/packages/threepane/dist/PatchworkFrame-22UEOQ6E.js +2 -0
  12. package/packages/threepane/dist/PatchworkFrame-22UEOQ6E.js.map +7 -0
  13. package/packages/threepane/dist/{chunk-XOKWELWP.js → chunk-U4IJVHXK.js} +10 -5
  14. package/packages/threepane/dist/chunk-U4IJVHXK.js.map +7 -0
  15. package/packages/threepane/dist/index.js +1 -1
  16. package/plugin-registry-url +1 -1
  17. package/packages/sideboard/dist/chunk-WPHECYLJ.js +0 -15
  18. package/packages/sideboard/dist/chunk-WPHECYLJ.js.map +0 -7
  19. package/packages/threepane/dist/IsolatedDocumentArea-UTNJADQ7.js +0 -2
  20. package/packages/threepane/dist/PatchworkFrame-U2TVLGCZ.js +0 -2
  21. package/packages/threepane/dist/PatchworkFrame-U2TVLGCZ.js.map +0 -7
  22. package/packages/threepane/dist/chunk-XOKWELWP.js.map +0 -7
  23. /package/packages/sideboard/dist/{document-list-panel-VFY2RV33.js.map → document-list-panel-SEKNECHI.js.map} +0 -0
  24. /package/packages/threepane/dist/{IsolatedDocumentArea-UTNJADQ7.js.map → IsolatedDocumentArea-5WRK3TWL.js.map} +0 -0
@@ -1 +1 @@
1
- automerge:2rK17joYKqYiX2t2bWpRcS66wPTH
1
+ automerge:25J8uXbNL9ojTwWnJpMJJzMahP28
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inkandswitch/patchwork-pkg-base",
3
- "version": "0.0.108",
3
+ "version": "0.0.110",
4
4
  "type": "module",
5
5
  "description": "Base packages for the Patchwork system",
6
6
  "repository": {
@@ -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.textContent = "Add to sidebar";
84
+ button.type = "button";
85
+ button.textContent = LABEL;
16
86
  wrapper.appendChild(button);
17
87
 
18
- // hidden by default until we confirm there's a datatype
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
- async function onAddDocToSidebar() {
44
- const repo = element.repo;
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
- // hack: get reference to the account doc handle through window
47
- const accountDocHandle = window.accountDocHandle;
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
- const rootFolderDocHandle = await repo.find(
50
- accountDocHandle.doc().rootFolderUrl
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
- rootFolderDocHandle.change((doc) => {
54
- doc.docs.unshift({
55
- name: title ?? "Untitled",
56
- url: handle.url,
57
- type: docDatatypeId,
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