@inkandswitch/patchwork-pkg-base 0.0.82 → 0.0.83

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 (51) hide show
  1. package/module-settings-url +1 -1
  2. package/package.json +1 -1
  3. package/packages/packages/dist/assets/mount-CgQfKq8z.js +1753 -0
  4. package/packages/packages/dist/index.js +1 -1
  5. package/packages/sideboard/dist/chunk-E6Y5RRIY.js +15 -0
  6. package/packages/sideboard/dist/chunk-E6Y5RRIY.js.map +7 -0
  7. package/packages/sideboard/dist/{chunk-DS3QVJZT.js → chunk-IBAIF3GD.js} +2 -2
  8. package/packages/sideboard/dist/chunk-RZPTJTVZ.js +2 -0
  9. package/packages/sideboard/dist/chunk-RZPTJTVZ.js.map +7 -0
  10. package/packages/sideboard/dist/chunk-YZ573CYO.js +2 -0
  11. package/packages/sideboard/dist/chunk-YZ573CYO.js.map +7 -0
  12. package/packages/sideboard/dist/{create-new-menu-VA4ELRJ6.js → create-new-menu-WF2LPUEV.js} +2 -2
  13. package/packages/sideboard/dist/document-list-panel-VY4FDLFY.js +2 -0
  14. package/packages/sideboard/dist/index.css +1 -1
  15. package/packages/sideboard/dist/index.css.map +2 -2
  16. package/packages/sideboard/dist/index.js +1 -1
  17. package/packages/sideboard/dist/item-menu-7ZNKM77G.js +2 -0
  18. package/packages/sideboard/dist/{item-menu-IEK2CSM2.js.map → item-menu-7ZNKM77G.js.map} +1 -1
  19. package/packages/sideboard/dist/sideboard/sideboard.js +1 -1
  20. package/packages/threepane/dist/IsolatedDocumentArea-G3V7KYHJ.js +2 -0
  21. package/packages/threepane/dist/PatchworkFrame-R4CTQ6DV.js +2 -0
  22. package/packages/threepane/dist/PatchworkFrame-R4CTQ6DV.js.map +7 -0
  23. package/packages/threepane/dist/chunk-YC5AHP5G.js +841 -0
  24. package/packages/threepane/dist/chunk-YC5AHP5G.js.map +7 -0
  25. package/packages/threepane/dist/chunk-YERFWP5I.js +2 -0
  26. package/packages/threepane/dist/chunk-YERFWP5I.js.map +7 -0
  27. package/packages/threepane/dist/datatypes-YDAECNBI.js +2 -0
  28. package/packages/threepane/dist/index.js +1 -1
  29. package/plugin-registry-url +1 -1
  30. package/packages/packages/dist/assets/mount-Czkd2ZvO.js +0 -1660
  31. package/packages/sideboard/dist/chunk-53SB45PL.js +0 -2
  32. package/packages/sideboard/dist/chunk-53SB45PL.js.map +0 -7
  33. package/packages/sideboard/dist/chunk-7KPSHWII.js +0 -15
  34. package/packages/sideboard/dist/chunk-7KPSHWII.js.map +0 -7
  35. package/packages/sideboard/dist/chunk-ZQBDNEEV.js +0 -2
  36. package/packages/sideboard/dist/chunk-ZQBDNEEV.js.map +0 -7
  37. package/packages/sideboard/dist/document-list-panel-PAXN5JY3.js +0 -2
  38. package/packages/sideboard/dist/item-menu-IEK2CSM2.js +0 -2
  39. package/packages/threepane/dist/IsolatedDocumentArea-TH3ENI3M.js +0 -2
  40. package/packages/threepane/dist/PatchworkFrame-WMZ3SLEE.js +0 -2
  41. package/packages/threepane/dist/PatchworkFrame-WMZ3SLEE.js.map +0 -7
  42. package/packages/threepane/dist/chunk-ESMUVHPH.js +0 -2
  43. package/packages/threepane/dist/chunk-ESMUVHPH.js.map +0 -7
  44. package/packages/threepane/dist/chunk-FRVSEOM5.js +0 -969
  45. package/packages/threepane/dist/chunk-FRVSEOM5.js.map +0 -7
  46. package/packages/threepane/dist/datatypes-5DFL6VIN.js +0 -2
  47. /package/packages/sideboard/dist/{chunk-DS3QVJZT.js.map → chunk-IBAIF3GD.js.map} +0 -0
  48. /package/packages/sideboard/dist/{create-new-menu-VA4ELRJ6.js.map → create-new-menu-WF2LPUEV.js.map} +0 -0
  49. /package/packages/sideboard/dist/{document-list-panel-PAXN5JY3.js.map → document-list-panel-VY4FDLFY.js.map} +0 -0
  50. /package/packages/threepane/dist/{IsolatedDocumentArea-TH3ENI3M.js.map → IsolatedDocumentArea-G3V7KYHJ.js.map} +0 -0
  51. /package/packages/threepane/dist/{datatypes-5DFL6VIN.js.map → datatypes-YDAECNBI.js.map} +0 -0
@@ -1,2 +0,0 @@
1
- import{a as L}from"./chunk-ZQBDNEEV.js";import{a as C}from"./chunk-TCL6SLDB.js";import{b as T}from"./chunk-FW4363Y4.js";import{createSignal as h}from"solid-js";var[N,V]=h(null);function _(e,n){let t=n?.toLowerCase();return!!t&&e.split(/\s+/).filter(Boolean).every(d=>t.includes(d))}var[z,W]=h(""),[X,j]=h(new Set),[q,G]=h(null);import{deleteAt as w}from"@automerge/automerge-repo/slim";var A=T(C(),1),u=(0,A.default)("patchwork:sideboard:dnd");var p=new Map,v=20;function b(e){return{url:e.url,name:e.name,type:e.type}}async function ee(e,n,t,d){if(u("executeDrop called with:",{draggedIds:e.draggedIds,targetId:e.targetId,position:e.position,copyMode:e.copyMode,sourceToolId:e.sourceToolId}),e.draggedUrls.length===0){u("No items to drop");return}u("Starting location finding...");let i=await S(t,e.draggedUrls,e.targetId,n,e.position);if(!i){u("Could not find target location. Target:",e.targetId);return}if(!d||i.sourceItems.length===0){u("Cross-view/external drop, adding links. sameOriginView:",d),await $(n,t,i,e);return}u("Locations found:",{sourceItemsCount:i.sourceItems.length,targetFolder:i.targetFolder,targetIndex:i.targetIndex}),u("Validating drop...");let a=R(i,e);if(a){u("Invalid drop operation:",a);return}u("Validation passed, executing operation..."),e.copyMode?await E(t,i,e,n):await O(t,i,e),u("Operation complete!")}async function te(e,n,t){let d=new Set(t);if(d.size===0)return;let i=new Map,a=new Set;async function f(r,s){if(s>=v)return;let o=r.doc();if(o?.docs){a.add(r.url);for(let c=0;c<o.docs.length;c++){let l=o.docs[c];if(d.has(l.url)){let g=i.get(r)??[];g.push(c),i.set(r,g)}if(l.type==="folder"&&l.url&&l.url!==r.url&&!a.has(l.url)){let g=p.get(l.url);if(!g)try{g=await e.find(l.url),p.set(l.url,g)}catch(D){u("Failed to load folder while removing:",l.url,D);continue}await f(g,s+1)}}}}await f(n,0);for(let[r,s]of i){let o=[...s].sort((c,l)=>l-c);r.change(c=>{for(let l of o)w(c.docs,l)})}}async function S(e,n,t,d,i){let a=e.doc();if(!a)return null;let f=[],r=null,s=null,o=0,c=new Set;async function l(g,D,y,U=0){if(D){if(U>=v){u(`Max folder depth (${v}) reached, stopping traversal`);return}c.add(g);for(let I=0;I<D.length;I++){let m=D[I];if(n.includes(m.url)&&f.push({url:m.url,folderUrl:g,folderPath:[...y],index:I,item:m}),g+"/"+I===t&&(r=g,s=[...y],o=I),m.type==="folder"&&m.url===t&&(i==="above"||i==="below"?(r=g,s=[...y],o=I):i==="inside"&&(r=m.url,s=[...y,I],o=0)),m.type==="folder"&&m.url){if(m.url===g){u("Skipping self-referencing folder:",m.url);continue}if(c.has(m.url)){u("Skipping already visited folder:",m.url);continue}let M=[...y,I],x=p.get(m.url);if(!x)try{x=await d.find(m.url),p.set(m.url,x)}catch(P){u("Failed to load folder:",m.url,P);continue}let F=x?.doc();F?.docs&&await l(m.url,F.docs,M,U+1)}}}}return a.docs&&await l(e.url,a.docs,[],0),t===e.url&&i==="inside"&&(r=e.url,s=[],o=0),!r||!s?null:{sourceItems:f,targetFolder:r,targetFolderPath:s,targetIndex:o}}function R(e,n){for(let t of e.sourceItems){if(t.folderUrl+"/"+t.index===n.targetId||t.url===n.targetId)return`Cannot drop item onto itself (${t.item.name})`;if(t.folderUrl===e.targetFolder&&n.position==="inside"&&!n.copyMode)return`Item is already in this folder (${t.item.name})`;if(t.item.type==="folder"&&t.url===e.targetFolder)return`Cannot drop folder into itself (${t.item.name})`;if(t.item.type==="folder"&&k(t.url,e.targetFolder))return`Cannot drop folder into its own descendant (${t.item.name})`}return null}function k(e,n){if(e===n)return!0;let t=p.get(e);if(!t)return!1;let d=t.doc();if(!d?.docs)return!1;for(let i of d.docs)if(i.type==="folder"&&i.url&&(i.url===n||k(i.url,n)))return!0;return!1}async function O(e,n,t){u(`Moving ${n.sourceItems.length} item(s) to position:`,t.position);let d=new Map;for(let r of n.sourceItems){let s=d.get(r.folderUrl)||[];s.push(r),d.set(r.folderUrl,s)}let i=[];for(let[r,s]of d){let o=[...s].sort((c,l)=>l.index-c.index);if(r===e.url)e.change(c=>{for(let l of o){let g=b(c.docs[l.index]);i.unshift(g),w(c.docs,l.index)}});else{let c=p.get(r);c&&c.change(l=>{for(let g of o){let D=b(l.docs[g.index]);i.unshift(D),w(l.docs,g.index)}})}}let a=n.targetIndex,f=d.get(n.targetFolder);if(f){let r=f.filter(s=>s.index<n.targetIndex).length;a-=r}if(t.position==="above"||(t.position==="below"?a++:t.position==="inside"&&(a=0)),n.targetFolder===e.url)e.change(r=>{r.docs.splice(a,0,...i)});else{let r=p.get(n.targetFolder);r&&r.change(s=>{s.docs.splice(a,0,...i)})}}async function $(e,n,t,d){let i=(d.draggedItems??[]).filter(o=>o.url&&o.url!==t.targetFolder),a=t.targetFolder===n.url?n.doc()?.docs:p.get(t.targetFolder)?.doc()?.docs,f=new Set(a?.map(o=>o.url)??[]),r=(await Promise.all(i.filter(o=>!f.has(o.url)).map(async o=>{if(o.name&&o.type)return{url:o.url,name:o.name,type:o.type};try{return await L(e,o.url)}catch(c){return u("Failed to resolve dropped doc:",o.url,c),null}}))).filter(o=>o!==null);if(r.length===0){u("No addable items in external drop (already present or unresolvable)");return}let s=t.targetIndex;if(d.position==="below"?s++:d.position==="inside"&&(s=0),u(`Adding ${r.length} link(s) at index:`,s),t.targetFolder===n.url)n.change(o=>{o.docs.splice(s,0,...r)});else{let o=p.get(t.targetFolder);o&&o.change(c=>{c.docs.splice(s,0,...r)})}}async function E(e,n,t,d){u(`Copying ${n.sourceItems.length} item(s) to position:`,t.position);let i=[];for(let f of n.sourceItems){let r;if(f.folderUrl===e.url){let s=e.doc();s?.docs&&(r=s.docs[f.index])}else{let o=p.get(f.folderUrl)?.doc();o?.docs&&(r=o.docs[f.index])}if(r){let s=b(r);s.name=r.name,i.push(s)}}let a=n.targetIndex;if(t.position==="above"||(t.position==="below"?a++:t.position==="inside"&&(a=0)),n.targetFolder===e.url)e.change(f=>{f.docs.splice(a,0,...i)});else{let f=p.get(n.targetFolder);f&&f.change(r=>{r.docs.splice(a,0,...i)})}}export{N as a,V as b,_ as c,z as d,W as e,X as f,j as g,q as h,G as i,u as j,ee as k,te as l};
2
- //# sourceMappingURL=chunk-53SB45PL.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/sideboard/state.ts", "../src/sideboard/dnd/operations.ts", "../src/sideboard/dnd/debug.ts"],
4
- "sourcesContent": ["import { createSignal } from \"solid-js\";\nimport type { AutomergeUrl } from \"@automerge/automerge-repo/slim\";\nimport type {\n DatatypeDescription,\n Plugin,\n} from \"@inkandswitch/patchwork-plugins\";\n\n// A \"new document\" drag (or click) is asking for a doc to be created inside the\n// folder at `containerUrl`, inserted at `index`. The DocumentList whose handle\n// matches `containerUrl` renders a placeholder row + type picker there.\nexport const [pendingNewDoc, setPendingNewDoc] = createSignal<{\n containerUrl: AutomergeUrl;\n index: number;\n} | null>(null);\n\nexport function filterMatches(filter: string, string?: string) {\n const lower = string?.toLowerCase();\n return (\n !!lower &&\n filter\n .split(/\\s+/)\n .filter(Boolean)\n .every((term) => lower.includes(term))\n );\n}\n\nexport const [renaming, setRenaming] = createSignal(\"\");\n\n// The set of folder URLs that lie on the path from the root to a currently\n// selected document. A folder reads this to auto-expand itself so the selected\n// doc is revealed, even when it sits in a deeply nested (and otherwise\n// unmounted) subtree. Computed by the panel whenever the selection changes; see\n// foldersToReveal in document-list/auto-expand.ts.\nexport const [autoExpandedFolders, setAutoExpandedFolders] = createSignal<\n Set<AutomergeUrl>\n>(new Set());\n\n// The row whose context menu is open. Rows don't own a menu each (a Kobalte\n// menu per row is far too heavy for big trees); the panel renders one shared\n// menu for whichever row last asked, anchored at the pointer.\nexport interface MenuTarget {\n x: number;\n y: number;\n element: HTMLElement;\n id: string;\n url: AutomergeUrl;\n name: string;\n type: string;\n openWith(toolId?: string): void;\n startRenaming(): void;\n remove(): void;\n createInside?(datatype: Plugin<DatatypeDescription>): void;\n}\n\nexport const [menuTarget, setMenuTarget] = createSignal<MenuTarget | null>(\n null\n);\n", "import type { DocHandle, Repo, AutomergeUrl } from \"@automerge/automerge-repo/slim\";\nimport type { FolderDoc, DocLink } from \"@inkandswitch/patchwork-filesystem\";\nimport { deleteAt } from \"@automerge/automerge-repo/slim\";\nimport { log } from \"./debug.ts\";\nimport { docLinkFromUrl } from \"../lib/doc-link.ts\";\n\n// Track loaded folders to prevent memory leaks\nconst folderCache = new Map<AutomergeUrl, DocHandle<FolderDoc>>();\n\n// Maximum folder nesting depth to prevent stack overflow\nconst MAX_FOLDER_DEPTH = 20;\n\n// Helper to extract plain data from Automerge proxy objects\n// structuredClone doesn't work with Automerge proxies - they contain\n// internal symbols and proxies that cannot be cloned\nfunction extractPlainDocLink(docLink: DocLink): DocLink {\n // Explicitly copy only the serializable properties\n const plain: DocLink = {\n url: docLink.url,\n name: docLink.name,\n type: docLink.type,\n };\n return plain;\n}\n\nexport interface DropOperation {\n draggedIds: string[];\n draggedUrls: AutomergeUrl[];\n // Full payload items, used to add links when the dragged docs\n // aren't part of this sideboard's folder tree\n draggedItems?: Array<{ url: AutomergeUrl; name?: string; type?: string }>;\n targetId: string;\n position: \"above\" | \"below\" | \"inside\";\n sourceToolId: string;\n copyMode: boolean;\n}\n\ninterface ItemLocation {\n url: AutomergeUrl;\n folderUrl: AutomergeUrl;\n folderPath: number[];\n index: number;\n item: DocLink;\n}\n\ninterface ItemLocations {\n sourceItems: ItemLocation[];\n targetFolder: AutomergeUrl;\n targetFolderPath: number[];\n targetIndex: number;\n}\n\nexport async function executeDrop(\n operation: DropOperation,\n repo: Repo,\n rootFolderHandle: DocHandle<FolderDoc>,\n // True when the drop lands in the same <patchwork-view> the drag started in.\n // Only then can items be moved; see step 3.\n sameOriginView: boolean\n) {\n log(\"executeDrop called with:\", {\n draggedIds: operation.draggedIds,\n targetId: operation.targetId,\n position: operation.position,\n copyMode: operation.copyMode,\n sourceToolId: operation.sourceToolId,\n });\n\n // 1. Validate we have items to drop\n if (operation.draggedUrls.length === 0) {\n log(\"No items to drop\");\n return;\n }\n\n log(\"Starting location finding...\");\n\n // 2. Find source and target locations\n const locations = await findItemLocations(\n rootFolderHandle,\n operation.draggedUrls,\n operation.targetId,\n repo,\n operation.position\n );\n\n if (!locations) {\n log(\"Could not find target location. Target:\", operation.targetId);\n return;\n }\n\n // 3. Move only when the drag started inside *this same* <patchwork-view> and\n // the dragged docs are actually in this tree. A drag from another view, or an\n // external / bare-url drop (neither sets the origin view), is added to the\n // target folder as a link instead. Identity is the view element itself, not\n // the tool id, which is null for the fallback-mounted sideboard.\n if (!sameOriginView || locations.sourceItems.length === 0) {\n log(\n \"Cross-view/external drop, adding links. sameOriginView:\",\n sameOriginView\n );\n await performAdd(repo, rootFolderHandle, locations, operation);\n return;\n }\n\n log(\"Locations found:\", {\n sourceItemsCount: locations.sourceItems.length,\n targetFolder: locations.targetFolder,\n targetIndex: locations.targetIndex,\n });\n\n // 4. Validate drop is legal (no circular references, etc)\n log(\"Validating drop...\");\n const validationError = getDropValidationError(locations, operation);\n if (validationError) {\n log(\"Invalid drop operation:\", validationError);\n return;\n }\n\n log(\"Validation passed, executing operation...\");\n\n // 5. Execute the move or copy\n if (operation.copyMode) {\n await performCopy(rootFolderHandle, locations, operation, repo);\n } else {\n await performMove(rootFolderHandle, locations, operation);\n }\n\n log(\"Operation complete!\");\n}\n\n// Remove every doc-link matching one of `urls` from the sideboard's folder\n// tree, wherever it lives. Used by the context menu to remove a multi-selection\n// in one shot. Deletes are batched per folder and applied high-index-first so\n// earlier removals don't shift the indices of later ones.\nexport async function removeItemsByUrl(\n repo: Repo,\n rootFolderHandle: DocHandle<FolderDoc>,\n urls: AutomergeUrl[]\n): Promise<void> {\n const targets = new Set(urls);\n if (targets.size === 0) return;\n\n const removalsByFolder = new Map<DocHandle<FolderDoc>, number[]>();\n const visited = new Set<AutomergeUrl>();\n\n async function traverse(\n handle: DocHandle<FolderDoc>,\n depth: number\n ): Promise<void> {\n if (depth >= MAX_FOLDER_DEPTH) return;\n const doc = handle.doc();\n if (!doc?.docs) return;\n visited.add(handle.url);\n\n for (let i = 0; i < doc.docs.length; i++) {\n const child = doc.docs[i];\n\n if (targets.has(child.url)) {\n const indices = removalsByFolder.get(handle) ?? [];\n indices.push(i);\n removalsByFolder.set(handle, indices);\n }\n\n if (\n child.type === \"folder\" &&\n child.url &&\n child.url !== handle.url &&\n !visited.has(child.url)\n ) {\n let nested = folderCache.get(child.url);\n if (!nested) {\n try {\n nested = await repo.find<FolderDoc>(child.url);\n folderCache.set(child.url, nested);\n } catch (error) {\n log(\"Failed to load folder while removing:\", child.url, error);\n continue;\n }\n }\n await traverse(nested, depth + 1);\n }\n }\n }\n\n await traverse(rootFolderHandle, 0);\n\n for (const [handle, indices] of removalsByFolder) {\n const sorted = [...indices].sort((a, b) => b - a);\n handle.change((doc) => {\n for (const index of sorted) deleteAt(doc.docs, index);\n });\n }\n}\n\nasync function findItemLocations(\n rootFolderHandle: DocHandle<FolderDoc>,\n draggedUrls: AutomergeUrl[],\n targetId: string,\n repo: Repo,\n position: \"above\" | \"below\" | \"inside\"\n): Promise<ItemLocations | null> {\n const rootFolder = rootFolderHandle.doc();\n if (!rootFolder) return null;\n\n const sourceItems: ItemLocation[] = [];\n let targetFolder: AutomergeUrl | null = null;\n let targetFolderPath: number[] | null = null;\n let targetIndex = 0;\n\n // Track visited folders to prevent infinite recursion\n const visitedFolders = new Set<AutomergeUrl>();\n\n // Helper to traverse folder tree recursively\n async function traverse(\n folderUrl: AutomergeUrl,\n docs: DocLink[] | undefined,\n path: number[],\n depth: number = 0\n ): Promise<void> {\n if (!docs) return;\n\n // Prevent infinite recursion with depth limit\n if (depth >= MAX_FOLDER_DEPTH) {\n log(`Max folder depth (${MAX_FOLDER_DEPTH}) reached, stopping traversal`);\n return;\n }\n\n // Mark this folder as visited\n visitedFolders.add(folderUrl);\n\n for (let i = 0; i < docs.length; i++) {\n const doc = docs[i];\n\n // Check if this is a dragged item\n if (draggedUrls.includes(doc.url)) {\n sourceItems.push({\n url: doc.url,\n folderUrl,\n folderPath: [...path],\n index: i,\n item: doc,\n });\n }\n\n // Check if this is the target\n const itemId = folderUrl + \"/\" + i;\n if (itemId === targetId) {\n targetFolder = folderUrl;\n targetFolderPath = [...path];\n targetIndex = i;\n }\n\n // Check if folder URL matches targetId for above/below/inside positions\n if (doc.type === \"folder\" && doc.url === targetId) {\n if (position === \"above\" || position === \"below\") {\n // Dropping above or below the folder - target is the parent folder\n targetFolder = folderUrl;\n targetFolderPath = [...path];\n targetIndex = i;\n } else if (position === \"inside\") {\n // Dropping inside the folder - target is the folder itself\n targetFolder = doc.url;\n targetFolderPath = [...path, i];\n targetIndex = 0; // Drop at start of folder\n }\n }\n\n // Recurse into folders to find nested items\n if (doc.type === \"folder\" && doc.url) {\n // Skip if folder references itself (only skip recursion, not target matching above)\n if (doc.url === folderUrl) {\n log(\"Skipping self-referencing folder:\", doc.url);\n continue;\n }\n\n // Skip if we've already visited this folder (prevent circular refs)\n if (visitedFolders.has(doc.url)) {\n log(\"Skipping already visited folder:\", doc.url);\n continue;\n }\n\n const nestedPath = [...path, i];\n\n // Load the nested folder if not cached\n let nestedHandle = folderCache.get(doc.url);\n if (!nestedHandle) {\n try {\n nestedHandle = await repo.find<FolderDoc>(doc.url);\n folderCache.set(doc.url, nestedHandle);\n } catch (error) {\n log(\"Failed to load folder:\", doc.url, error);\n continue;\n }\n }\n\n const nestedFolder = nestedHandle?.doc();\n if (nestedFolder?.docs) {\n await traverse(doc.url, nestedFolder.docs, nestedPath, depth + 1);\n }\n }\n }\n }\n\n // Start traversal from root\n if (rootFolder.docs) {\n await traverse(rootFolderHandle.url, rootFolder.docs, [], 0);\n }\n\n // If target is the root folder URL (dropping inside root), set target to root\n if (targetId === rootFolderHandle.url && position === \"inside\") {\n targetFolder = rootFolderHandle.url;\n targetFolderPath = [];\n targetIndex = 0;\n }\n\n if (!targetFolder || !targetFolderPath) {\n return null;\n }\n\n return {\n sourceItems,\n targetFolder,\n targetFolderPath,\n targetIndex,\n };\n}\n\nfunction getDropValidationError(\n locations: ItemLocations,\n operation: DropOperation\n): string | null {\n // Check if dropping onto itself\n for (const sourceItem of locations.sourceItems) {\n const sourceId = sourceItem.folderUrl + \"/\" + sourceItem.index;\n\n // Prevent dropping item onto itself\n if (\n sourceId === operation.targetId ||\n sourceItem.url === operation.targetId\n ) {\n return `Cannot drop item onto itself (${sourceItem.item.name})`;\n }\n\n // Prevent dropping item into its current position\n if (\n sourceItem.folderUrl === locations.targetFolder &&\n operation.position === \"inside\" &&\n !operation.copyMode\n ) {\n return `Item is already in this folder (${sourceItem.item.name})`;\n }\n\n // Check if trying to drop folder into itself\n if (\n sourceItem.item.type === \"folder\" &&\n sourceItem.url === locations.targetFolder\n ) {\n return `Cannot drop folder into itself (${sourceItem.item.name})`;\n }\n\n // Check if dropping folder into its descendants (circular reference prevention)\n if (sourceItem.item.type === \"folder\") {\n const isDescendant = isDescendantFolder(\n sourceItem.url,\n locations.targetFolder\n );\n if (isDescendant) {\n return `Cannot drop folder into its own descendant (${sourceItem.item.name})`;\n }\n }\n }\n\n return null;\n}\n\n// Helper to check if targetFolder is a descendant of potentialAncestor\nfunction isDescendantFolder(\n potentialAncestor: AutomergeUrl,\n targetFolder: AutomergeUrl\n): boolean {\n if (potentialAncestor === targetFolder) {\n return true;\n }\n\n // Check cached folder for descendants\n const ancestorHandle = folderCache.get(potentialAncestor);\n if (!ancestorHandle) return false;\n\n const ancestorDoc = ancestorHandle.doc();\n if (!ancestorDoc?.docs) return false;\n\n // Recursively check all subfolders\n for (const doc of ancestorDoc.docs) {\n if (doc.type === \"folder\" && doc.url) {\n if (doc.url === targetFolder) {\n return true;\n }\n if (isDescendantFolder(doc.url, targetFolder)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nasync function performMove(\n rootFolderHandle: DocHandle<FolderDoc>,\n locations: ItemLocations,\n operation: DropOperation\n) {\n log(\n `Moving ${locations.sourceItems.length} item(s) to position:`,\n operation.position\n );\n\n // Group sources by folder for efficient removal\n const sourcesByFolder = new Map<AutomergeUrl, ItemLocation[]>();\n for (const source of locations.sourceItems) {\n const sources = sourcesByFolder.get(source.folderUrl) || [];\n sources.push(source);\n sourcesByFolder.set(source.folderUrl, sources);\n }\n\n // Remove items from source folders (process each folder once)\n const removedItems: DocLink[] = [];\n for (const [folderUrl, sources] of sourcesByFolder) {\n // Sort by index descending to remove from end first (preserves indices)\n const sorted = [...sources].sort((a, b) => b.index - a.index);\n\n if (folderUrl === rootFolderHandle.url) {\n // Root level - can modify directly\n rootFolderHandle.change((doc) => {\n for (const source of sorted) {\n const item = extractPlainDocLink(doc.docs[source.index]);\n removedItems.unshift(item);\n deleteAt(doc.docs, source.index);\n }\n });\n } else {\n // Nested folder - need to load and modify\n const folderHandle = folderCache.get(folderUrl);\n if (folderHandle) {\n folderHandle.change((doc) => {\n for (const source of sorted) {\n const item = extractPlainDocLink(doc.docs[source.index]);\n removedItems.unshift(item);\n deleteAt(doc.docs, source.index);\n }\n });\n }\n }\n }\n\n // Calculate target index (adjust if moving within same folder)\n let finalTargetIndex = locations.targetIndex;\n\n const sourcesInTargetFolder = sourcesByFolder.get(locations.targetFolder);\n if (sourcesInTargetFolder) {\n // Moving within same folder - adjust for removed items\n const removedBefore = sourcesInTargetFolder.filter(\n (s) => s.index < locations.targetIndex\n ).length;\n finalTargetIndex -= removedBefore;\n }\n\n // Adjust based on position\n if (operation.position === \"above\") {\n // Insert before target\n } else if (operation.position === \"below\") {\n // Insert after target\n finalTargetIndex++;\n } else if (operation.position === \"inside\") {\n // Insert at beginning of folder\n finalTargetIndex = 0;\n }\n\n // Insert items at target location\n if (locations.targetFolder === rootFolderHandle.url) {\n // Root level\n rootFolderHandle.change((doc) => {\n doc.docs.splice(finalTargetIndex, 0, ...removedItems);\n });\n } else {\n // Nested folder\n const targetHandle = folderCache.get(locations.targetFolder);\n if (targetHandle) {\n targetHandle.change((doc) => {\n doc.docs.splice(finalTargetIndex, 0, ...removedItems);\n });\n }\n }\n}\n\n// Add links for docs dragged in from outside this sideboard's folder tree\nasync function performAdd(\n repo: Repo,\n rootFolderHandle: DocHandle<FolderDoc>,\n locations: ItemLocations,\n operation: DropOperation\n) {\n const candidates = (operation.draggedItems ?? []).filter(\n (item) => item.url && item.url !== locations.targetFolder\n );\n\n // Don't add items that are already present in the target folder -\n // dropping a doc into a folder it's already in shouldn't duplicate it.\n const targetDocs =\n locations.targetFolder === rootFolderHandle.url\n ? rootFolderHandle.doc()?.docs\n : folderCache.get(locations.targetFolder)?.doc()?.docs;\n const existingUrls = new Set(targetDocs?.map((doc) => doc.url) ?? []);\n\n const links = (\n await Promise.all(\n candidates\n .filter((item) => !existingUrls.has(item.url))\n .map(async (item): Promise<DocLink | null> => {\n if (item.name && item.type) {\n return { url: item.url, name: item.name, type: item.type };\n }\n // Bare url (e.g. dragged link text) - resolve name/type from the doc\n try {\n return await docLinkFromUrl(repo, item.url);\n } catch (error) {\n log(\"Failed to resolve dropped doc:\", item.url, error);\n return null;\n }\n })\n )\n ).filter((link): link is DocLink => link !== null);\n\n if (links.length === 0) {\n log(\"No addable items in external drop (already present or unresolvable)\");\n return;\n }\n\n let finalTargetIndex = locations.targetIndex;\n if (operation.position === \"below\") {\n finalTargetIndex++;\n } else if (operation.position === \"inside\") {\n finalTargetIndex = 0;\n }\n\n log(`Adding ${links.length} link(s) at index:`, finalTargetIndex);\n\n if (locations.targetFolder === rootFolderHandle.url) {\n rootFolderHandle.change((doc) => {\n doc.docs.splice(finalTargetIndex, 0, ...links);\n });\n } else {\n const targetHandle = folderCache.get(locations.targetFolder);\n if (targetHandle) {\n targetHandle.change((doc) => {\n doc.docs.splice(finalTargetIndex, 0, ...links);\n });\n }\n }\n}\n\nasync function performCopy(\n rootFolderHandle: DocHandle<FolderDoc>,\n locations: ItemLocations,\n operation: DropOperation,\n _repo: Repo\n) {\n log(\n `Copying ${locations.sourceItems.length} item(s) to position:`,\n operation.position\n );\n\n // Collect items to copy from their source folders\n const itemsToCopy: DocLink[] = [];\n\n for (const source of locations.sourceItems) {\n let item: DocLink | undefined;\n\n if (source.folderUrl === rootFolderHandle.url) {\n // Root level\n const doc = rootFolderHandle.doc();\n if (doc?.docs) {\n item = doc.docs[source.index];\n }\n } else {\n // Nested folder\n const folderHandle = folderCache.get(source.folderUrl);\n const doc = folderHandle?.doc();\n if (doc?.docs) {\n item = doc.docs[source.index];\n }\n }\n\n if (item) {\n const clonedItem = extractPlainDocLink(item);\n clonedItem.name = item.name;\n itemsToCopy.push(clonedItem);\n }\n }\n\n // Calculate target index\n let finalTargetIndex = locations.targetIndex;\n\n if (operation.position === \"above\") {\n // Insert before target\n } else if (operation.position === \"below\") {\n // Insert after target\n finalTargetIndex++;\n } else if (operation.position === \"inside\") {\n // Insert at beginning of folder\n finalTargetIndex = 0;\n }\n\n // Insert copied items at target location\n if (locations.targetFolder === rootFolderHandle.url) {\n // Root level\n rootFolderHandle.change((doc) => {\n doc.docs.splice(finalTargetIndex, 0, ...itemsToCopy);\n });\n } else {\n // Nested folder\n const targetHandle = folderCache.get(locations.targetFolder);\n if (targetHandle) {\n targetHandle.change((doc) => {\n doc.docs.splice(finalTargetIndex, 0, ...itemsToCopy);\n });\n }\n }\n}\n", "import debug from \"debug\";\n\nexport const log = debug(\"patchwork:sideboard:dnd\");\n"],
5
- "mappings": "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",
6
- "names": ["createSignal", "pendingNewDoc", "setPendingNewDoc", "filterMatches", "filter", "string", "lower", "term", "renaming", "setRenaming", "autoExpandedFolders", "setAutoExpandedFolders", "menuTarget", "setMenuTarget", "deleteAt", "import_debug", "log", "debug", "folderCache", "MAX_FOLDER_DEPTH", "extractPlainDocLink", "docLink", "executeDrop", "operation", "repo", "rootFolderHandle", "sameOriginView", "log", "locations", "findItemLocations", "performAdd", "validationError", "getDropValidationError", "performCopy", "performMove", "removeItemsByUrl", "urls", "targets", "removalsByFolder", "visited", "traverse", "handle", "depth", "doc", "i", "child", "indices", "nested", "error", "sorted", "a", "b", "index", "deleteAt", "draggedUrls", "targetId", "position", "rootFolder", "sourceItems", "targetFolder", "targetFolderPath", "targetIndex", "visitedFolders", "folderUrl", "docs", "path", "nestedPath", "nestedHandle", "nestedFolder", "sourceItem", "isDescendantFolder", "potentialAncestor", "ancestorHandle", "ancestorDoc", "sourcesByFolder", "source", "sources", "removedItems", "item", "folderHandle", "finalTargetIndex", "sourcesInTargetFolder", "removedBefore", "targetHandle", "candidates", "targetDocs", "existingUrls", "links", "docLinkFromUrl", "link", "_repo", "itemsToCopy", "clonedItem"]
7
- }
@@ -1,15 +0,0 @@
1
- import{a as Ie,b as de,c as Pe,d as Ue}from"./chunk-DS3QVJZT.js";import{a as j,b as I,c as Q,d as Te,e as C,f as Ae,g as le,h as $e,i as Ee,j as S,k as N}from"./chunk-53SB45PL.js";import{b as se,c as k,d as Z,g as R,h as ee,i as ce,j as H,k as T,l as W,m as te,n as Y,o as ke,p as Le,q as Me,r as M,s as re}from"./chunk-ZQBDNEEV.js";import{b as G,c as Ce}from"./chunk-FEMULUBJ.js";import{template as wr}from"solid-js/web";import{delegateEvents as Dr}from"solid-js/web";import{insert as Se}from"solid-js/web";import{effect as mt}from"solid-js/web";import{createComponent as L}from"solid-js/web";import{use as xr}from"solid-js/web";import{createEffect as ft,createMemo as br,createSelector as _r,createSignal as gt,lazy as Fr,onCleanup as ht,Show as pt,Suspense as Sr}from"solid-js";import{render as Tr}from"solid-js/web";var ue=new WeakMap;function Oe(e,n){let o=ue.get(e);return o||ue.set(e,o=new Map),o.set(n,(o.get(n)??0)+1),()=>{let m=o.get(n)-1;m?o.set(n,m):o.delete(n)}}function qe(e,n){return!!ue.get(e)?.has(n)}var z=new Map,Re=new Map,He=new WeakSet;function Ne(e,n){let o=new Set(n?.map(c=>c.url)),m=Re.get(e);if(m)for(let c of m){if(o.has(c))continue;let u=z.get(c);u?.delete(e),u?.size||z.delete(c)}for(let c of o){let u=z.get(c);u||z.set(c,u=new Set),u.add(e)}Re.set(e,o)}var ne=new Map;function B(e){He.has(e)||(He.add(e),Ne(e.url,e.doc()?.docs),e.on("change",()=>{Ne(e.url,e.doc()?.docs),ne.clear()}))}function Ke(e,n){let o=new Set,m=[],c=new Map([[e,!0]]);function u(d){let g=c.get(d);if(g!==void 0)return g;c.set(d,!1);let h=!1;for(let i of z.get(d)??[])u(i)&&(o.add(i),h=!0);return c.set(d,h),h}for(let d of n)d!==e&&!u(d)&&m.push(d);return{folders:o,unreached:m}}async function wt(e,n,o){let m=new Set(o),c=new Set,u=!1;async function d(g){if(!m.size||c.has(g))return;c.add(g);let h;try{let i=await e.find(g);B(i),h=i.doc()?.docs??[]}catch{u=!0;return}for(let i of h)m.delete(i.url);await Promise.all(h.filter(i=>i.type==="folder").map(i=>d(i.url)))}return await d(n),!m.size||!u}async function je(e,n,o){let m=Ke(n,o),c=ne.get(n),u=m.unreached.filter(i=>!c?.has(i));if(!u.length)return m.folders;let d=await wt(e,n,new Set(u)),{folders:g,unreached:h}=Ke(n,o);if(d&&h.length){let i=ne.get(n)??new Set;for(let f of h)i.add(f);ne.set(n,i)}return g}import{template as _e}from"solid-js/web";import{effect as er}from"solid-js/web";import{memo as nt}from"solid-js/web";import{insert as xe}from"solid-js/web";import{createComponent as A}from"solid-js/web";import{deleteAt as or,updateText as ot}from"@automerge/automerge-repo/slim";import{getRegistry as at,isLoadedPlugin as ar}from"@inkandswitch/patchwork-plugins";import{createEffect as it,createMemo as ir,createSignal as lr,For as dr,lazy as sr,Match as lt,onCleanup as ve,Show as be,Suspense as cr,Switch as ur,untrack as dt}from"solid-js";import{template as rt}from"solid-js/web";import{style as Ze}from"solid-js/web";import{setAttribute as J}from"solid-js/web";import{effect as et}from"solid-js/web";import{insert as ye}from"solid-js/web";import{createComponent as P}from"solid-js/web";import{addEventListener as Bt}from"solid-js/web";import"solid-js/web";import{updateText as Jt}from"@automerge/automerge-repo/slim";async function K(e,n,o,m,c){for(let u of Array.from(e))try{let d=await u.arrayBuffer(),g=new Uint8Array(d),h=u.name.split("."),i=h.length>1?h.pop():"",f=h.join("."),D=await o.create2({"@patchwork":{type:"file"},content:g,extension:i,mimeType:u.type||"application/octet-stream",name:f}),x=m==="above"?c:m==="below"?c+1:0;n.change(v=>{v.docs.splice(x,0,{url:D.url,name:u.name,type:"file"})}),S("FileDrop: Created file document:",u.name,D.url)}catch(d){S("FileDrop: Failed to create file document:",d)}}import{createEffect as we,createSignal as Gt,onCleanup as Qt,Show as tt,Suspense as Zt}from"solid-js";import{template as vt}from"solid-js/web";import{delegateEvents as bt}from"solid-js/web";import{setAttribute as V}from"solid-js/web";import{effect as _t}from"solid-js/web";import{insert as Ft}from"solid-js/web";import{addEventListener as fe}from"solid-js/web";import{use as St}from"solid-js/web";import{createEffect as At,createSignal as $t,onCleanup as Ye}from"solid-js";import{parseAutomergeUrl as Et}from"@automerge/automerge-repo/slim";import{getImportableUrlFromAutomergeUrl as It}from"@inkandswitch/patchwork-filesystem";import{isValidAutomergeUrl as me}from"@automerge/automerge-repo/slim";var Dt=["text/x-patchwork-dnd","text/x-patchwork-urls","text/uri-list","text/plain"];function We(e){return!!(e&&Dt.some(n=>e.types.includes(n)))}function xt(e){let n=e.trim();if(me(n))return n;let o=n.match(/#doc=([^&\s]+)/)?.[1];return o&&me(`automerge:${o}`)?`automerge:${o}`:null}function O(e){let n=e.dataTransfer;if(!n)return null;let o=n.getData("text/x-patchwork-dnd");if(o)try{let d=JSON.parse(o);if(Array.isArray(d?.items)&&d.items.length>0)return{source:d.source??"",items:d.items}}catch{}let m=n.getData("text/x-patchwork-urls");if(m)try{let d=JSON.parse(m),g=(Array.isArray(d)?d:[]).filter(h=>me(h)).map(h=>({url:h}));if(g.length>0)return{source:"",items:g}}catch{}let u=(n.getData("text/uri-list")||n.getData("text/plain")).split(/\r?\n/).map(xt).filter(d=>d!==null).map(d=>({url:d}));return u.length>0?{source:"",items:u}:null}var Tt=vt('<button draggable=true aria-haspopup=menu class="popmenu__trigger document-list-item"role=treeitem>'),kt={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 ze(e){let n=e.includes(".")?e.split(".").pop().toLowerCase():"";return n?kt[n]:void 0}function Lt(e){for(let n=e.parentElement;n;n=n.parentElement){let o=getComputedStyle(n).overflowY;if((o==="auto"||o==="scroll")&&n.scrollHeight>n.clientHeight)return n}return document.scrollingElement??document.body}function Mt(e){let n=Lt(e),o=n.getBoundingClientRect(),m=n.querySelectorAll('.document-list-item[aria-selected="true"]');for(let c of m){let u=c.getBoundingClientRect();if(u.top>=o.top&&u.bottom<=o.bottom)return!0}return!1}function X(e){let n,[o,m]=$t(null),c=!1;function u(){c||e.type!=="file"||(c=!0,e.repo.find(e.url).then(r=>{let s=r?.doc();if(!s)return;let t=String(s.name??e.name??"file"),a=s.extension?`.${String(s.extension).replace(/^\.+/,"")}`:"",l=a&&!t.endsWith(a)?`${t}${a}`:t,p=String(s.mimeType||ze(l)||"application/octet-stream");m({mime:p,filename:l})}).catch(()=>{}))}At(r=>(e.pressed&&!r&&n&&!Mt(n)&&n.scrollIntoViewIfNeeded?.(),e.pressed));let d=()=>({id:e.id,type:e.type,url:e.url,name:e.name,source:e.element.toolId}),g=1500,h=null,i=!1;function f(r){e.type==="folder"||T.has(e.id)||h||i||(r.setAttribute("data-dnd-springload",""),h=setTimeout(()=>{h=null,i=!0,r.removeAttribute("data-dnd-springload"),e.openWith()},g))}function D(){h&&(clearTimeout(h),h=null),i=!1,n?.removeAttribute("data-dnd-springload")}Ye(D);function x(r,s){Ee({x:r,y:s,element:n,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 v,$=()=>clearTimeout(v);Ye($);async function y(r,s,t){if(S("Item drop handler called for:",s,t),r.dataTransfer?.files&&r.dataTransfer.files.length>0){let w=t==="inside"&&e.type==="folder"?await e.repo.find(e.url):e.parentFolderHandle??e.rootFolderHandle;await K(r.dataTransfer.files,w,e.repo,t,t==="inside"?0:e.itemIndex??0);return}let a=O(r);if(!a){S("No dnd data in drop event. types:",r.dataTransfer?.types);return}let{source:l,items:p}=a;S("Drop data:",{source:l,items:p,targetId:s,position:t}),N({draggedIds:p.map(w=>w.id),draggedUrls:p.map(w=>w.url),draggedItems:p,targetId:s,position:t,sourceToolId:l,copyMode:k()},e.repo,e.rootFolderHandle,H(e.element))}return(()=>{var r=Tt();r.$$keydown=t=>{if(t.key==="ArrowDown"||t.key==="ArrowUp"){t.preventDefault();let a=t.currentTarget,l=Array.from(document.querySelectorAll("[data-dnd-item]")).filter(w=>w.offsetParent!==null),p=l.indexOf(a);t.key==="ArrowDown"&&p<l.length-1?l[p+1]?.focus():t.key==="ArrowUp"&&p>0&&l[p-1]?.focus();return}if(e.type==="folder"&&e.onToggleExpand){if(t.key==="ArrowRight"&&!e.isExpanded){t.preventDefault(),e.onToggleExpand();return}else if(t.key==="ArrowLeft"&&e.isExpanded){t.preventDefault(),e.onToggleExpand();return}}if(t.key=="Enter"&&t.ctrlKey&&!(+t.altKey|+t.shiftKey|+t.metaKey)){t.preventDefault(),t.stopImmediatePropagation(),t.stopPropagation();let a=n.getBoundingClientRect();x(a.x+10,a.y+a.height-10)}},fe(r,"dblclick",()=>{e.startRenaming()}),fe(r,"click",t=>{t.ctrlKey||t.metaKey||t.target.closest(".document-list-folder__toggle, .create-new-button")||(Y(),e.openWith())}),r.$$mousedown=t=>{u(),t.ctrlKey||t.metaKey?(T.has(e.id)?te(e.id):W(e.id,d()),t.preventDefault(),t.stopPropagation(),t.stopImmediatePropagation()):T.has(e.id)||Y()},r.addEventListener("drop",t=>{D();let a=ee();if(console.log("[DnD] Item ondrop event fired",e.id,"type:",e.type,"target:",a),e.type==="folder"&&a?.position==="inside"){if(t.preventDefault(),t.stopPropagation(),R(t)){I({containerUrl:e.url,index:0}),M();return}y(t,a.id,"inside"),M();return}if(S("Item handling drop itself"),t.preventDefault(),t.stopPropagation(),!a){S("No drop target set");return}if(R(t)){if(e.parentFolderHandle&&e.itemIndex!=null){let l=a.position==="above"?e.itemIndex:e.itemIndex+1;I({containerUrl:e.parentFolderHandle.url,index:l})}M();return}y(t,a.id,a.position),M()}),r.addEventListener("dragleave",t=>{let a=t.relatedTarget;(!a||!t.currentTarget.contains(a))&&(D(),M())}),r.addEventListener("dragover",t=>{t.preventDefault(),t.dataTransfer.dropEffect=k()?"copy":"move";let a;if(e.type==="folder"){let l=t.currentTarget.getBoundingClientRect(),w=(t.clientY-l.top)/l.height;w<.25?a="above":w>.75?a="below":a="inside",a!=="inside"&&t.stopPropagation()}else a=Me(t.clientY,t.currentTarget)?"above":"below",t.stopPropagation();re({id:e.id,position:a}),f(t.currentTarget)}),r.addEventListener("dragend",()=>{D(),Le(),Y(),Z(!1),ce(null),se(!1)}),r.addEventListener("drag",t=>{t.altKey!==k()&&Z(t.altKey)}),r.addEventListener("dragstart",t=>{$(),T.has(e.id)||(Y(),W(e.id,d()));let a=T.values(),l=[],p=[];Z(t.altKey),t.dataTransfer.effectAllowed="all";for(let E of a)l.push(E.url),p.push(E.id);let w=l.map(E=>location.protocol+"//"+location.host+`/#doc=${Et(E).documentId}`).join(`\r
2
- `)+`\r
3
- `;if(t.dataTransfer?.items.add(w,"text/uri-list"),t.dataTransfer?.items.add(JSON.stringify(p),"text/x-sideboard-ids"),t.dataTransfer?.items.add(JSON.stringify(l),"text/x-patchwork-urls"),t.dataTransfer?.items.add(JSON.stringify({source:e.element.toolId,items:[...T.values()]}),"text/x-patchwork-dnd"),T.size===1&&e.type==="file"){let E=o(),_=E?.filename??e.name,q=E?.mime??ze(_)??"application/octet-stream";try{let yt=new URL(It(e.url),location.origin).href;t.dataTransfer?.setData("DownloadURL",`${q}:${_}:${yt}`)}catch{}}let b=document.createElement("div");b.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 F=T.size,U=t.altKey?" (copy)":"";b.textContent=F===1?e.name+U:`${F} items${U}`,document.body.appendChild(b),t.dataTransfer.setDragImage(b,10,10),setTimeout(()=>b.remove(),0),ke([...T.keys()]),ce(e.element),se(!0)}),r.addEventListener("pointercancel",$),r.$$pointerup=$,r.$$pointerdown=t=>{(t.pointerType==="touch"||t.pointerType==="pen")&&(v=setTimeout(()=>x(t.clientX,t.clientY),700))},fe(r,"contextmenu",t=>{t.preventDefault(),t.stopPropagation(),x(t.clientX,t.clientY)});var s=n;return typeof s=="function"?St(s,r):n=r,Ft(r,()=>e.children),_t(t=>{var a=e.id,l=e.url,p=e.type,w=e["aria-label"],b=e.pressed?"true":void 0;return a!==t.e&&V(r,"data-dnd-item",t.e=a),l!==t.t&&V(r,"data-doc-url",t.t=l),p!==t.a&&V(r,"data-doc-type",t.a=p),w!==t.o&&V(r,"aria-label",t.o=w),b!==t.i&&V(r,"aria-selected",t.i=b),t},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),r})()}bt(["pointerdown","pointerup","mousedown","keydown"]);import{template as Ve}from"solid-js/web";import{delegateEvents as Pt}from"solid-js/web";import{insert as Ut}from"solid-js/web";import{createComponent as ge}from"solid-js/web";import{effect as Ct}from"solid-js/web";import{use as Rt}from"solid-js/web";import{createSelector as Kt,createSignal as Ot,Match as Be,Switch as qt}from"solid-js";var Ht=Ve("<form style=display:contents><input autofocus class=document-list-item__name>"),Nt=Ve("<span class=document-list-item__name>");function oe(e){let n=Kt(Te),[o,m]=Ot(e.name);function c(){e.rename(o()??""),n(e.id)&&C("")}return ge(qt,{get children(){return[ge(Be,{get when(){return n(e.id)},get children(){var u=Ht(),d=u.firstChild;return u.addEventListener("submit",g=>{g.preventDefault(),c()}),d.$$input=g=>m(g.target.value),d.$$keydown=g=>{(g.key=="Escape"||g.key=="g"&&g.ctrlKey)&&c()},d.addEventListener("blur",c),Rt(g=>{m(e.name),setTimeout(()=>{g.focus(),g.select()},80)},d),Ct(()=>d.value=o()),u}}),ge(Be,{get when(){return!n(e.id)},get children(){var u=Nt();return Ut(u,()=>e.name),u}})]}})}Pt(["keydown","input"]);import{template as Je}from"solid-js/web";import{insert as jt}from"solid-js/web";import{createComponent as Wt}from"solid-js/web";import{setStyleProperty as he}from"solid-js/web";import{effect as Ge}from"solid-js/web";import{For as zt}from"solid-js";var Qe=Je('<div class="document-list-item document-list-item--loading"aria-hidden=true><span class=document-list-item__skeleton>'),Yt=Je('<div class=document-list__loading aria-busy=true aria-label="Loading documents">');function ae(e){return(()=>{var n=Qe();return Ge(o=>he(n,"--depth",e.depth??0)),n})()}var Xe=["11rem","7rem","9.5rem","6rem","10rem","8rem"];function pe(e){let n=()=>Array.from({length:e.count??5},(o,m)=>m);return(()=>{var o=Yt();return jt(o,Wt(zt,{get each(){return n()},children:m=>(()=>{var c=Qe(),u=c.firstChild;return Ge(d=>{var g=e.depth??0,h=Xe[m%Xe.length];return g!==d.e&&he(c,"--depth",d.e=g),h!==d.t&&he(u,"width",d.t=h),d},{e:void 0,t:void 0}),c})()})),o})()}var Vt=rt("<button class=document-list-folder__toggle>"),Xt=rt("<div class=document-list-folder role=group><div class=document-list-folder__contents>");function De(e){let[n,o]=Gt(!1),[m,c]=G(()=>e.url,e);we(()=>{c.latest&&B(c.latest)});let u=new Set(e.visitedFolders??[]);u.add(e.url);let d=()=>e.depth??1,g=()=>({"--depth":d()+1}),h=()=>({"--depth":d()});we(r=>(!r&&e.filter&&Q(e.filter,m()?.title??e.name)&&o(!0),e.filter)),we(()=>{Ae().has(e.url)&&o(!0)});let i=null,f=!1;function D(){i||f||(i=setTimeout(()=>{o(r=>!r),f=!0,i=null},1e3))}function x(){i&&(clearTimeout(i),i=null),f=!1}Qt(x);function v(r){c()?.change(s=>Jt(s,["title"],r))}async function $(r){let s=c();if(!s)return;let t=await Pe(e.repo,r),a=0;s.change(l=>{l.docs.push(t),a=l.docs.length-1}),e.clearFilter(),o(!0),e.open(t),C(s.url+"/"+a)}async function y(r){if(S("Folder drop handler called for:",e.url),r.dataTransfer?.files&&r.dataTransfer.files.length>0){await K(r.dataTransfer.files,c(),e.repo,"inside",0);return}let s=O(r);if(!s){S("No dnd data in drop event. types:",r.dataTransfer?.types);return}let{source:t,items:a}=s;S("Drop data:",{source:t,items:a,folderUrl:e.url}),N({draggedIds:a.map(l=>l.id),draggedUrls:a.map(l=>l.url),draggedItems:a,targetId:e.url,position:"inside",sourceToolId:t,copyMode:k()},e.repo,e.rootFolderHandle,H(e.element))}return(()=>{var r=Xt(),s=r.firstChild;return r.addEventListener("drop",t=>{if(x(),S("Folder ondrop event fired",e.url),t.preventDefault(),t.stopPropagation(),ee()?.position==="inside")if(R(t)){let l=c();l&&(o(!0),I({containerUrl:l.url,index:0}))}else y(t);M()}),r.addEventListener("dragleave",t=>{let a=t.relatedTarget;(!a||!t.currentTarget.contains(a))&&(x(),M())}),r.addEventListener("dragover",t=>{t.preventDefault(),t.stopPropagation();let a=k()?"copy":"move";t.dataTransfer.dropEffect=a,t.target.closest(".document-list-item")||re({id:e.url,position:"inside"}),t.target.closest(".document-list-item")?.getAttribute("data-dnd-item")===e.url&&D()}),ye(r,P(X,{get"aria-label"(){return m()?.title??e.name??""},startRenaming:()=>{C(e.url)},get remove(){return e.removeFromParent},get id(){return e.url},get url(){return e.url},get name(){return m()?.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 n()},onToggleExpand:()=>o(t=>!t),createInside:$,openWith:t=>{e.open({url:e.url,toolId:t,title:m()?.title??e.name,type:"folder"})},get children(){return[(()=>{var t=Vt();return Bt(t,"click",a=>{a.stopImmediatePropagation(),o(l=>!l)}),ye(t,P(tt,{get when(){return n()},get fallback(){return P(de,{})},get children(){return P(de,{style:{rotate:"90deg"}})}})),et(()=>J(t,"aria-label",(n()?"collapse":"expand")+" "+(m()?.title??e.name))),t})(),P(oe,{get name(){return m()?.title??e.name},get id(){return e.url},rename:v})]}}),s),ye(s,P(tt,{get when(){return n()||!!e.filter},get children(){return P(Zt,{get fallback(){return P(ae,{get depth(){return d()+1}})},get children(){return P(ie,{get docs(){return m()?.docs},get repo(){return e.repo},get depth(){return d()+1},get handle(){return c.latest},get open(){return e.open},get isSelected(){return e.isSelected},visitedFolders:u,get element(){return e.element},get rootFolderHandle(){return e.rootFolderHandle},get filter(){return e.filter},get clearFilter(){return e.clearFilter}})}})}})),et(t=>{var a=d(),l=h(),p=n(),w=e.url,b=!n()&&!e.filter,F=d(),U=g();return a!==t.e&&J(r,"data-depth",t.e=a),t.t=Ze(r,l,t.t),p!==t.a&&J(r,"aria-expanded",t.a=p),w!==t.o&&J(r,"data-dnd-container",t.o=w),b!==t.i&&s.classList.toggle("document-list-folder__contents--hidden",t.i=b),F!==t.n&&J(s,"data-depth",t.n=F),t.s=Ze(s,U,t.s),t},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),r})()}var tr=_e('<div class="document-list__item document-list__item--visible">'),rr=_e("<div class=document-list__item>"),nr=_e('<div class=document-list-folder__circular-ref style="padding-left:calc(var(--depth) * 1rem)"><span> (i contain myself eventually)'),mr=sr(()=>import("./create-new-menu-VA4ELRJ6.js").then(e=>({default:e.NewDocPlaceholder}))),st=40,fr=8;function ie(e){let n=e.visitedFolders??new Set,[o,m]=lr(st);it(()=>{let i=e.docs?.length??0;if(dt(o)>=i)return;let f=requestAnimationFrame(function D(){let x=performance.now(),v=dt(o);do m(v+=st);while(v<i&&performance.now()-x<fr);v<i&&(f=requestAnimationFrame(D))});ve(()=>cancelAnimationFrame(f))});let c=ir(()=>{let i=e.docs??[];return i.length>o()?i.slice(0,o()):i});function u(i){e.handle.change(f=>or(f.docs,i))}let d=()=>!!e.handle&&j()?.containerUrl===e.handle.url,g=i=>{let f=j();if(!f)return;let D=f.index;I(null),e.handle.change(x=>x.docs.splice(D,0,i)),e.open(i),C(e.handle.url+"/"+D)},h=()=>(()=>{var i=tr();return xe(i,A(mr,{get repo(){return e.repo},onCreate:g,onDismiss:()=>I(null),get clearFilter(){return e.clearFilter}})),i})();return[A(dr,{get each(){return c()},children:(i,f)=>{let D=()=>!e.filter.length||Q(e.filter,i.name),x=()=>u(f()),v=()=>e.handle.url+"/"+f();ve(Oe(e.element,i.url));let $=y=>{e.handle.change(s=>{ot(s,["docs",f(),"name"],y)});let r=at("patchwork:datatype");e.repo.find(i.url).then(async s=>{let{"@patchwork":t}=s.doc();if(t){let a=r.get(t.type);a&&(await r.load(a.id),s.change(l=>a.module.setTitle?.(l,y)))}})};return it(()=>{if(!e.isSelected(i.url))return;let y=!1,r;e.repo.find(i.url).then(async s=>{if(y)return;let t=at("patchwork:datatype");async function a(){let p=s.doc();if(!p)return;let w=p["@patchwork"];if(!w?.type)return;let b=t.get(w.type);if(!b||(await t.load(b.id),y)||!ar(b))return;let F=b.module.getTitle(p);if(!F)return;e.handle.doc()?.docs?.[f()]?.name!==F&&e.handle.change(_=>{ot(_,["docs",f(),"name"],F)}),w.title!==F&&s.change(_=>{_["@patchwork"]&&(_["@patchwork"].title=F)})}if(await a(),y)return;let l=()=>a();s.on("change",l),r=()=>s.off("change",l)}),ve(()=>{y=!0,r?.()})}),[A(be,{get when(){return nt(()=>!!d())()&&j().index===f()},get children(){return h()}}),(()=>{var y=rr();return xe(y,A(cr,{get fallback(){return A(ae,{get depth(){return e.depth}})},get children(){return A(ur,{get children(){return[A(lt,{get when(){return i.type=="folder"},get children(){return A(be,{get when(){return!n.has(i.url)},get fallback(){return(()=>{var r=nr(),s=r.firstChild,t=s.firstChild;return xe(s,()=>i.name,t),r})()},get children(){return A(De,{get url(){return i.url},get depth(){return e.depth},get repo(){return e.repo},removeFromParent:x,get parentFolderHandle(){return e.handle},get itemIndex(){return f()},get open(){return e.open},get name(){return i.name},get isSelected(){return e.isSelected},visitedFolders:n,get element(){return e.element},get rootFolderHandle(){return e.rootFolderHandle},get filter(){return e.filter},get clearFilter(){return e.clearFilter}})}})}}),A(lt,{get when(){return i.type!="folder"},get children(){return A(X,{get"aria-label"(){return i.name},get url(){return i.url},get name(){return i.name},get id(){return v()},startRenaming:()=>C(v()),remove:x,get pressed(){return e.isSelected(i.url)},get type(){return i.type},get element(){return e.element},get repo(){return e.repo},get rootFolderHandle(){return e.rootFolderHandle},get parentFolderHandle(){return e.handle},get itemIndex(){return f()},openWith:r=>e.open({url:i.url,toolId:r,title:i.name,type:i.type}),get children(){return A(oe,{get name(){return i.name},get id(){return v()},rename:$})}})}})]}})}})),er(r=>{var s=!!D(),t=!D();return s!==r.e&&y.classList.toggle("document-list__item--visible",r.e=s),t!==r.t&&y.classList.toggle("document-list__item--invisible",r.t=t),r},{e:void 0,t:void 0}),y})()]}}),A(be,{get when(){return nt(()=>!!d())()&&j().index>=(e.docs?.length??0)},get children(){return h()}})]}import{createEffect as ro,createSignal as gr,onCleanup as hr,onMount as pr}from"solid-js";import{createStore as oo,reconcile as ao}from"solid-js/store";import*as Fe from"@inkandswitch/patchwork-providers";function yr(e){return typeof e=="function"?e():e}function ct(e,n,o){let[m,c]=gr(o);return pr(()=>{let u=yr(e);if(!u)return;let d=Fe.subscribe(u,n,c);hr(d)}),m}function ut(e){let n=0,o=0,m=!1,c=new Set,u=new Set;function d(f){return{id:f.getAttribute("data-dnd-item"),url:f.getAttribute("data-doc-url"),type:f.getAttribute("data-doc-type")??"",name:(f.textContent??"").trim(),source:e.source()}}function g(f){let D=f.clientX-n,x=f.clientY-o;if(!m){if(Math.hypot(D,x)<5)return;m=!0}f.preventDefault();let v=Math.min(n,f.clientX),$=Math.min(o,f.clientY),y=Math.max(n,f.clientX),r=Math.max(o,f.clientY),s=e.container();if(!s)return;let t=new Set;for(let a of s.querySelectorAll("[data-dnd-item]")){if(a.offsetParent===null)continue;let l=a.getAttribute("data-dnd-item");if(!l||c.has(l))continue;let p=a.getBoundingClientRect();p.right<v||p.left>y||p.bottom<$||p.top>r||(t.add(l),T.has(l)||W(l,d(a)))}for(let a of u)t.has(a)||te(a);u=t}function h(){window.removeEventListener("mousemove",g,!0),window.removeEventListener("mouseup",h,!0),m=!1,u=new Set,c=new Set}function i(f){f.button!==0||!(f.metaKey||f.ctrlKey)||f.target.closest(".document-list__toolbar")||(n=f.clientX,o=f.clientY,m=!1,u=new Set,c=new Set(T.keys()),window.addEventListener("mousemove",g,!0),window.addEventListener("mouseup",h,!0))}return{onMouseDown:i}}var vr=wr('<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">'),Ar=Fr(()=>import("./item-menu-IEK2CSM2.js").then(e=>({default:e.ItemMenu})));function $r(e){let[n,o]=G(()=>e.folderUrl,{repo:e.repo}),[m,c]=gt(""),u=()=>o.state==="ready"||o.state==="refreshing";ft(()=>{o.latest&&B(o.latest)});let d=ct(e.element,{type:"patchwork:selected-doc"},[]),g=br(()=>new Set(d())),h=_r(g,(y,r)=>r.has(y));ft(()=>{if(!u())return;let y=d();if(!y.length){le(new Set);return}if(y.every(s=>qe(e.element,s)))return;let r=!1;je(e.repo,e.folderUrl,y).then(s=>{r||le(s)}),ht(()=>{r=!0})});function i(y){e.element.dispatchEvent(Ce(y))}let[f,D]=gt(!1),x,v=ut({container:()=>x,source:()=>e.element.toolId??""}),$=y=>{x=y,y.addEventListener("mousedown",v.onMouseDown,!0),ht(()=>y.removeEventListener("mousedown",v.onMouseDown,!0))};return(()=>{var y=vr(),r=y.firstChild,s=r.firstChild,t=s.firstChild,a=t.firstChild;return r.addEventListener("drop",l=>{if(l.preventDefault(),D(!1),R(l)){let _=o();if(_){let q=_.doc()?.docs?.length??0;I({containerUrl:_.url,index:q})}return}let p=l.dataTransfer?.files;if(p&&p.length>0&&o()){let q=o().doc()?.docs?.length||0;K(p,o(),e.repo,"inside",q);return}let w=O(l);if(!w||!o())return;let{source:b,items:F}=w,U=o().url,E=o().doc()?.docs?.length??0;N({draggedIds:F.map(_=>_.id),draggedUrls:F.map(_=>_.url),draggedItems:F,targetId:E>0?`${U}/${E-1}`:U,position:E>0?"below":"inside",sourceToolId:b,copyMode:k()},e.repo,o.latest,H(e.element))}),r.addEventListener("dragleave",l=>{let p=l.relatedTarget;(!p||!l.currentTarget.contains(p))&&D(!1)}),r.addEventListener("dragover",l=>{if(l.dataTransfer?.types.includes("Files")){l.preventDefault(),l.dataTransfer.dropEffect="copy",D(!0);return}(We(l.dataTransfer)||R(l))&&(l.preventDefault(),l.dataTransfer.dropEffect=k()?"copy":"move")}),xr($,r),Se(s,L(Ue,{square:!0,draggable:!0,clearFilter:()=>c(""),changeFolder:l=>o()?.change(l),get repo(){return e.repo},open:i}),t),Se(t,L(Ie,{}),a),a.$$input=l=>c(l.target.value.toLowerCase()),Se(r,L(pt,{get when(){return u()},get fallback(){return L(pe,{depth:0})},get children(){return[L(Sr,{get fallback(){return L(pe,{depth:0})},get children(){return L(ie,{depth:0,get repo(){return e.repo},get docs(){return n()?.docs},get handle(){return o.latest},open:i,isSelected:h,get element(){return e.element},get rootFolderHandle(){return o.latest},get filter(){return m()},clearFilter:()=>c("")})}}),L(pt,{get when(){return $e()},get children(){return L(Ar,{get repo(){return e.repo},get rootFolderHandle(){return o.latest},get element(){return e.element}})}})]}}),null),mt(()=>r.classList.toggle("document-list__doclist--drag-over",!!f())),mt(()=>a.value=m()),y})()}function Mo(e,n){return Tr(()=>L($r,{folderUrl:e,get repo(){return n.repo},element:n}),n)}Dr(["input"]);export{pe as a,$r as b,Mo as c};
15
- //# sourceMappingURL=chunk-7KPSHWII.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/sideboard/document-list-panel.tsx", "../src/sideboard/document-list/auto-expand.ts", "../src/sideboard/document-list/document-list.tsx", "../src/sideboard/document-list/folder.tsx", "../src/sideboard/document-list/file-drop.ts", "../src/sideboard/document-list/item.tsx", "../src/sideboard/dnd/payload.ts", "../src/sideboard/document-list/name.tsx", "../src/sideboard/document-list/loading-row.tsx", "../node_modules/.pnpm/@inkandswitch+patchwork-providers-solid@0.2.8_@automerge+automerge-repo@2.6.0-subductio_67b137d5e2e338e4087baee1e2e96ad1/node_modules/@inkandswitch/patchwork-providers-solid/dist/index.js", "../src/sideboard/document-list/marquee.ts"],
4
- "sourcesContent": ["import { template as _$template } from \"solid-js/web\";\nimport { delegateEvents as _$delegateEvents } from \"solid-js/web\";\nimport { insert as _$insert } from \"solid-js/web\";\nimport { effect as _$effect } from \"solid-js/web\";\nimport { createComponent as _$createComponent } from \"solid-js/web\";\nimport { use as _$use } from \"solid-js/web\";\nvar _tmpl$ = /*#__PURE__*/_$template(`<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\">`);\nimport { useDocument } from \"solid-automerge\";\nimport { createEffect, createMemo, createSelector, createSignal, lazy, onCleanup, Show, Suspense } from \"solid-js\";\nimport { render } from \"solid-js/web\";\nimport { setPendingNewDoc, setAutoExpandedFolders } from \"./state.ts\";\nimport { foldersToReveal, isMounted, watchFolder } from \"./document-list/auto-expand.ts\";\nimport CreateNew from \"./create-new.tsx\";\nimport { createOpenEvent } from \"./events.ts\";\nimport { SearchIcon } from \"./icons.tsx\";\nimport { DocumentList } from \"./document-list/document-list.tsx\";\nimport { LoadingRows } from \"./document-list/loading-row.tsx\";\nimport { subscribe } from \"@inkandswitch/patchwork-providers-solid\";\nimport { handleFilesDrop } from \"./document-list/file-drop.ts\";\nimport { copyMode, isNewDocDrag, isSameDragOriginView } from \"./dnd/dnd.ts\";\nimport { executeDrop } from \"./dnd/operations.ts\";\nimport { getDndPayload, hasDocumentDrag } from \"./dnd/payload.ts\";\nimport { createMarquee } from \"./document-list/marquee.ts\";\nimport { menuTarget } from \"./state.ts\";\nconst ItemMenu = lazy(() => import(\"./document-list/item-menu.tsx\").then(m => ({\n default: m.ItemMenu\n})));\nexport function DocumentListPanel(props) {\n const [folder, folderHandle] = useDocument(() => props.folderUrl, {\n repo: props.repo\n });\n const [filter, setFilter] = createSignal(\"\");\n const folderReady = () => folderHandle.state === \"ready\" || folderHandle.state === \"refreshing\";\n createEffect(() => {\n if (folderHandle.latest) watchFolder(folderHandle.latest);\n });\n const selectedDocUrls = subscribe(props.element, {\n type: \"patchwork:selected-doc\"\n }, []);\n const selectedSet = createMemo(() => new Set(selectedDocUrls()));\n const isSelected = createSelector(selectedSet, (url, set) => set.has(url));\n createEffect(() => {\n if (!folderReady()) return;\n const selected = selectedDocUrls();\n if (!selected.length) {\n setAutoExpandedFolders(/* @__PURE__ */new Set());\n return;\n }\n if (selected.every(url => isMounted(props.element, url))) return;\n let cancelled = false;\n foldersToReveal(props.repo, props.folderUrl, selected).then(folders => {\n if (!cancelled) setAutoExpandedFolders(folders);\n });\n onCleanup(() => {\n cancelled = true;\n });\n });\n function open(detail) {\n props.element.dispatchEvent(createOpenEvent(detail));\n }\n const [isDraggingFile, setIsDraggingFile] = createSignal(false);\n let navEl;\n const marquee = createMarquee({\n container: () => navEl,\n source: () => props.element.toolId ?? \"\"\n });\n const attachMarquee = el => {\n navEl = el;\n el.addEventListener(\"mousedown\", marquee.onMouseDown, true);\n onCleanup(() => el.removeEventListener(\"mousedown\", marquee.onMouseDown, true));\n };\n return (() => {\n var _el$ = _tmpl$(),\n _el$2 = _el$.firstChild,\n _el$3 = _el$2.firstChild,\n _el$4 = _el$3.firstChild,\n _el$5 = _el$4.firstChild;\n _el$2.addEventListener(\"drop\", event => {\n event.preventDefault();\n setIsDraggingFile(false);\n if (isNewDocDrag(event)) {\n const h = folderHandle();\n if (h) {\n const len = h.doc()?.docs?.length ?? 0;\n setPendingNewDoc({\n containerUrl: h.url,\n index: len\n });\n }\n return;\n }\n const files = event.dataTransfer?.files;\n if (files && files.length > 0 && folderHandle()) {\n const folderDoc = folderHandle().doc();\n const insertIndex = folderDoc?.docs?.length || 0;\n handleFilesDrop(files, folderHandle(), props.repo, \"inside\", insertIndex);\n return;\n }\n const payload = getDndPayload(event);\n if (!payload || !folderHandle()) return;\n const {\n source,\n items\n } = payload;\n const rootUrl = folderHandle().url;\n const docsLength = folderHandle().doc()?.docs?.length ?? 0;\n executeDrop({\n draggedIds: items.map(i => i.id),\n draggedUrls: items.map(i => i.url),\n draggedItems: items,\n // Append after the last root item; \"inside\" root if empty\n targetId: docsLength > 0 ? `${rootUrl}/${docsLength - 1}` : rootUrl,\n position: docsLength > 0 ? \"below\" : \"inside\",\n sourceToolId: source,\n copyMode: copyMode()\n }, props.repo, folderHandle.latest, isSameDragOriginView(props.element));\n });\n _el$2.addEventListener(\"dragleave\", event => {\n const related = event.relatedTarget;\n if (!related || !event.currentTarget.contains(related)) {\n setIsDraggingFile(false);\n }\n });\n _el$2.addEventListener(\"dragover\", event => {\n if (event.dataTransfer?.types.includes(\"Files\")) {\n event.preventDefault();\n event.dataTransfer.dropEffect = \"copy\";\n setIsDraggingFile(true);\n return;\n }\n if (hasDocumentDrag(event.dataTransfer) || isNewDocDrag(event)) {\n event.preventDefault();\n event.dataTransfer.dropEffect = copyMode() ? \"copy\" : \"move\";\n }\n });\n _$use(attachMarquee, _el$2);\n _$insert(_el$3, _$createComponent(CreateNew, {\n square: true,\n draggable: true,\n clearFilter: () => setFilter(\"\"),\n changeFolder: fn => folderHandle()?.change(fn),\n get repo() {\n return props.repo;\n },\n open: open\n }), _el$4);\n _$insert(_el$4, _$createComponent(SearchIcon, {}), _el$5);\n _el$5.$$input = event => setFilter(event.target.value.toLowerCase());\n _$insert(_el$2, _$createComponent(Show, {\n get when() {\n return folderReady();\n },\n get fallback() {\n return _$createComponent(LoadingRows, {\n depth: 0\n });\n },\n get children() {\n return [_$createComponent(Suspense, {\n get fallback() {\n return _$createComponent(LoadingRows, {\n depth: 0\n });\n },\n get children() {\n return _$createComponent(DocumentList, {\n depth: 0,\n get repo() {\n return props.repo;\n },\n get docs() {\n return folder()?.docs;\n },\n get handle() {\n return folderHandle.latest;\n },\n open: open,\n isSelected: isSelected,\n get element() {\n return props.element;\n },\n get rootFolderHandle() {\n return folderHandle.latest;\n },\n get filter() {\n return filter();\n },\n clearFilter: () => setFilter(\"\")\n });\n }\n }), _$createComponent(Show, {\n get when() {\n return menuTarget();\n },\n get children() {\n return _$createComponent(ItemMenu, {\n get repo() {\n return props.repo;\n },\n get rootFolderHandle() {\n return folderHandle.latest;\n },\n get element() {\n return props.element;\n }\n });\n }\n })];\n }\n }), null);\n _$effect(() => _el$2.classList.toggle(\"document-list__doclist--drag-over\", !!isDraggingFile()));\n _$effect(() => _el$5.value = filter());\n return _el$;\n })();\n}\nexport function renderDocumentListPanel(folderUrl, element) {\n return render(() => _$createComponent(DocumentListPanel, {\n folderUrl: folderUrl,\n get repo() {\n return element.repo;\n },\n element: element\n }), element);\n}\n_$delegateEvents([\"input\"]);", "import type {\n AutomergeUrl,\n DocHandle,\n Repo,\n} from \"@automerge/automerge-repo/slim\";\nimport type { DocLink, FolderDoc } from \"@inkandswitch/patchwork-filesystem\";\n\n// Rows currently mounted in each panel, refcounted (a doc can appear in more\n// than one folder). Children only mount when their folder is expanded, so a\n// mounted row means every folder above it is already open \u2014 a selection made\n// by clicking a row needs no walk at all.\nconst mountedRows = new WeakMap<object, Map<AutomergeUrl, number>>();\n\n/** Record that `panel` is rendering a row for `url`. Returns the unmount. */\nexport function markMounted(panel: object, url: AutomergeUrl): () => void {\n let rows = mountedRows.get(panel);\n if (!rows) mountedRows.set(panel, (rows = new Map()));\n rows.set(url, (rows.get(url) ?? 0) + 1);\n return () => {\n const n = rows.get(url)! - 1;\n if (n) rows.set(url, n);\n else rows.delete(url);\n };\n}\n\nexport function isMounted(panel: object, url: AutomergeUrl): boolean {\n return !!mountedRows.get(panel)?.has(url);\n}\n\n// Reverse index of every folder we've loaded: child url \u2192 the folders that\n// link to it. Kept current by listening to each folder handle's changes, so it\n// can answer \"which folders lead to this doc?\" by walking up, without any finds.\nconst parents = new Map<AutomergeUrl, Set<AutomergeUrl>>();\nconst children = new Map<AutomergeUrl, Set<AutomergeUrl>>();\nconst watched = new WeakSet<DocHandle<FolderDoc>>();\n\nfunction indexFolder(folderUrl: AutomergeUrl, docs: DocLink[] | undefined) {\n const next = new Set(docs?.map((link) => link.url));\n const prev = children.get(folderUrl);\n if (prev) {\n for (const child of prev) {\n if (next.has(child)) continue;\n const set = parents.get(child);\n set?.delete(folderUrl);\n if (!set?.size) parents.delete(child);\n }\n }\n for (const child of next) {\n let set = parents.get(child);\n if (!set) parents.set(child, (set = new Set()));\n set.add(folderUrl);\n }\n children.set(folderUrl, next);\n}\n\n// Selected urls that a complete walk from a root didn't find, keyed by root.\n// Every folder that walk saw is now watched, so this stays true until one of\n// them changes \u2014 then it's dropped wholesale and the next reveal looks again.\nconst missing = new Map<AutomergeUrl, Set<AutomergeUrl>>();\n\n/** Add a folder to the parent index and keep it current. Idempotent. */\nexport function watchFolder(handle: DocHandle<FolderDoc>) {\n if (watched.has(handle)) return;\n watched.add(handle);\n indexFolder(handle.url, handle.doc()?.docs);\n handle.on(\"change\", () => {\n indexFolder(handle.url, handle.doc()?.docs);\n missing.clear();\n });\n}\n\n/**\n * Walk up the parent index from each selected doc and collect every folder on\n * a path that reaches `rootUrl` (including the root itself). `unreached` is the\n * selected docs that can't be traced to the root with what's indexed so far.\n */\nexport function expandedFoldersFromIndex(\n rootUrl: AutomergeUrl,\n selected: Iterable<AutomergeUrl>\n): { folders: Set<AutomergeUrl>; unreached: AutomergeUrl[] } {\n const folders = new Set<AutomergeUrl>();\n const unreached: AutomergeUrl[] = [];\n // url \u2192 whether it reaches the root. Seeded false on entry so a cycle\n // terminates instead of recursing forever.\n const reaches = new Map<AutomergeUrl, boolean>([[rootUrl, true]]);\n\n function up(url: AutomergeUrl): boolean {\n const known = reaches.get(url);\n if (known !== undefined) return known;\n reaches.set(url, false);\n let found = false;\n for (const parent of parents.get(url) ?? []) {\n if (up(parent)) {\n folders.add(parent);\n found = true;\n }\n }\n reaches.set(url, found);\n return found;\n }\n\n for (const url of selected) {\n if (url !== rootUrl && !up(url)) unreached.push(url);\n }\n return { folders, unreached };\n}\n\n/**\n * Load folders down from `rootUrl` (one cached `repo.find` each), adding each\n * to the parent index, until every url in `wanted` has been seen in some\n * folder's docrefs. Leaf docs are never loaded. Each folder is visited once,\n * however many parents link to it, and a cycle just hits an already-seen\n * folder.\n *\n * Returns whether the answer is trustworthy: everything was found, or the\n * whole tree was walked without a folder failing to load.\n */\nasync function indexUntilFound(\n repo: Repo,\n rootUrl: AutomergeUrl,\n wanted: Set<AutomergeUrl>\n): Promise<boolean> {\n const remaining = new Set(wanted);\n const seen = new Set<AutomergeUrl>();\n let failed = false;\n\n async function visit(url: AutomergeUrl): Promise<void> {\n if (!remaining.size || seen.has(url)) return;\n seen.add(url);\n let docs: DocLink[];\n try {\n const handle = await repo.find<FolderDoc>(url);\n watchFolder(handle);\n docs = handle.doc()?.docs ?? [];\n } catch {\n failed = true;\n return;\n }\n for (const link of docs) remaining.delete(link.url);\n await Promise.all(\n docs.filter((link) => link.type === \"folder\").map((link) => visit(link.url))\n );\n }\n\n await visit(rootUrl);\n return !remaining.size || !failed;\n}\n\n/**\n * The set of folders under `rootUrl` that must be expanded for the selected\n * docs to be visible.\n *\n * Answered from the parent index when it can be. Otherwise walks the tree just\n * far enough to find what's missing, indexing as it goes, so the next reveal\n * of anything it passed is free. A selection that isn't under the root at all\n * costs one full walk, then nothing until the tree changes.\n */\nexport async function foldersToReveal(\n repo: Repo,\n rootUrl: AutomergeUrl,\n selected: AutomergeUrl[]\n): Promise<Set<AutomergeUrl>> {\n const indexed = expandedFoldersFromIndex(rootUrl, selected);\n const known = missing.get(rootUrl);\n const search = indexed.unreached.filter((url) => !known?.has(url));\n if (!search.length) return indexed.folders;\n\n const complete = await indexUntilFound(repo, rootUrl, new Set(search));\n const { folders, unreached } = expandedFoldersFromIndex(rootUrl, selected);\n if (complete && unreached.length) {\n const set = missing.get(rootUrl) ?? new Set();\n for (const url of unreached) set.add(url);\n missing.set(rootUrl, set);\n }\n return folders;\n}\n", "import { template as _$template } from \"solid-js/web\";\nimport { effect as _$effect } from \"solid-js/web\";\nimport { memo as _$memo } from \"solid-js/web\";\nimport { insert as _$insert } from \"solid-js/web\";\nimport { createComponent as _$createComponent } from \"solid-js/web\";\nvar _tmpl$ = /*#__PURE__*/_$template(`<div class=\"document-list__item document-list__item--visible\">`),\n _tmpl$2 = /*#__PURE__*/_$template(`<div class=document-list__item>`),\n _tmpl$3 = /*#__PURE__*/_$template(`<div class=document-list-folder__circular-ref style=\"padding-left:calc(var(--depth) * 1rem)\"><span> (i contain myself eventually)`);\nimport { deleteAt, updateText } from \"@automerge/automerge-repo/slim\";\nimport { getRegistry, isLoadedPlugin } from \"@inkandswitch/patchwork-plugins\";\nimport { createEffect, createMemo, createSignal, For, lazy, Match, onCleanup, Show, Suspense, Switch, untrack } from \"solid-js\";\nimport { filterMatches, setRenaming, pendingNewDoc, setPendingNewDoc } from \"../state.ts\";\nimport { markMounted } from \"./auto-expand.ts\";\nimport Folder from \"./folder.tsx\";\nimport Item from \"./item.tsx\";\nimport { ItemName } from \"./name.tsx\";\nimport { LoadingRow } from \"./loading-row.tsx\";\nconst NewDocPlaceholder = lazy(() => import(\"../create-new-menu.tsx\").then(m => ({\n default: m.NewDocPlaceholder\n})));\nconst CHUNK = 40;\nconst FRAME_BUDGET_MS = 8;\nexport function DocumentList(props) {\n const visitedFolders = props.visitedFolders ?? /* @__PURE__ */new Set();\n const [limit, setLimit] = createSignal(CHUNK);\n createEffect(() => {\n const total = props.docs?.length ?? 0;\n if (untrack(limit) >= total) return;\n let frame = requestAnimationFrame(function more() {\n const start = performance.now();\n let n = untrack(limit);\n do setLimit(n += CHUNK); while (n < total && performance.now() - start < FRAME_BUDGET_MS);\n if (n < total) frame = requestAnimationFrame(more);\n });\n onCleanup(() => cancelAnimationFrame(frame));\n });\n const docs = createMemo(() => {\n const all = props.docs ?? [];\n return all.length > limit() ? all.slice(0, limit()) : all;\n });\n function removeItem(index) {\n props.handle.change(folder => deleteAt(folder.docs, index));\n }\n const pendingHere = () => !!props.handle && pendingNewDoc()?.containerUrl === props.handle.url;\n const commitPending = docLink => {\n const target = pendingNewDoc();\n if (!target) return;\n const index = target.index;\n setPendingNewDoc(null);\n props.handle.change(folder => folder.docs.splice(index, 0, docLink));\n props.open(docLink);\n setRenaming(props.handle.url + \"/\" + index);\n };\n const placeholder = () => (() => {\n var _el$ = _tmpl$();\n _$insert(_el$, _$createComponent(NewDocPlaceholder, {\n get repo() {\n return props.repo;\n },\n onCreate: commitPending,\n onDismiss: () => setPendingNewDoc(null),\n get clearFilter() {\n return props.clearFilter;\n }\n }));\n return _el$;\n })();\n return [_$createComponent(For, {\n get each() {\n return docs();\n },\n children: (doc, index) => {\n const visible = () => !props.filter.length || filterMatches(props.filter, doc.name);\n const remove = () => removeItem(index());\n const relid = () => props.handle.url + \"/\" + index();\n onCleanup(markMounted(props.element, doc.url));\n const rename = name => {\n props.handle.change(doc2 => {\n updateText(doc2, [\"docs\", index(), \"name\"], name);\n });\n const datatypes = getRegistry(\"patchwork:datatype\");\n props.repo.find(doc.url).then(async handle => {\n const {\n \"@patchwork\": metadata\n } = handle.doc();\n if (metadata) {\n const datatype = datatypes.get(metadata.type);\n if (datatype) {\n await datatypes.load(datatype.id);\n handle.change(doc2 => datatype.module.setTitle?.(doc2, name));\n }\n }\n });\n };\n createEffect(() => {\n if (!props.isSelected(doc.url)) return;\n let cancelled = false;\n let removeListener;\n props.repo.find(doc.url).then(async docHandle => {\n if (cancelled) return;\n const datatypes = getRegistry(\"patchwork:datatype\");\n async function syncTitle() {\n const docData = docHandle.doc();\n if (!docData) return;\n const metadata = docData[\"@patchwork\"];\n if (!metadata?.type) return;\n const datatype = datatypes.get(metadata.type);\n if (!datatype) return;\n await datatypes.load(datatype.id);\n if (cancelled) return;\n if (!isLoadedPlugin(datatype)) return;\n const title = datatype.module.getTitle(docData);\n if (!title) return;\n const currentFolder = props.handle.doc();\n const currentName = currentFolder?.docs?.[index()]?.name;\n if (currentName !== title) {\n props.handle.change(folder => {\n updateText(folder, [\"docs\", index(), \"name\"], title);\n });\n }\n if (metadata.title !== title) {\n docHandle.change(d => {\n if (d[\"@patchwork\"]) {\n d[\"@patchwork\"].title = title;\n }\n });\n }\n }\n await syncTitle();\n if (cancelled) return;\n const onChange = () => syncTitle();\n docHandle.on(\"change\", onChange);\n removeListener = () => docHandle.off(\"change\", onChange);\n });\n onCleanup(() => {\n cancelled = true;\n removeListener?.();\n });\n });\n return [_$createComponent(Show, {\n get when() {\n return _$memo(() => !!pendingHere())() && pendingNewDoc().index === index();\n },\n get children() {\n return placeholder();\n }\n }), (() => {\n var _el$2 = _tmpl$2();\n _$insert(_el$2, _$createComponent(Suspense, {\n get fallback() {\n return _$createComponent(LoadingRow, {\n get depth() {\n return props.depth;\n }\n });\n },\n get children() {\n return _$createComponent(Switch, {\n get children() {\n return [_$createComponent(Match, {\n get when() {\n return doc.type == \"folder\";\n },\n get children() {\n return _$createComponent(Show, {\n get when() {\n return !visitedFolders.has(doc.url);\n },\n get fallback() {\n return (() => {\n var _el$3 = _tmpl$3(),\n _el$4 = _el$3.firstChild,\n _el$5 = _el$4.firstChild;\n _$insert(_el$4, () => doc.name, _el$5);\n return _el$3;\n })();\n },\n get children() {\n return _$createComponent(Folder, {\n get url() {\n return doc.url;\n },\n get depth() {\n return props.depth;\n },\n get repo() {\n return props.repo;\n },\n removeFromParent: remove,\n get parentFolderHandle() {\n return props.handle;\n },\n get itemIndex() {\n return index();\n },\n get open() {\n return props.open;\n },\n get name() {\n return doc.name;\n },\n get isSelected() {\n return props.isSelected;\n },\n visitedFolders: visitedFolders,\n get element() {\n return props.element;\n },\n get rootFolderHandle() {\n return props.rootFolderHandle;\n },\n get filter() {\n return props.filter;\n },\n get clearFilter() {\n return props.clearFilter;\n }\n });\n }\n });\n }\n }), _$createComponent(Match, {\n get when() {\n return doc.type != \"folder\";\n },\n get children() {\n return _$createComponent(Item, {\n get [\"aria-label\"]() {\n return doc.name;\n },\n get url() {\n return doc.url;\n },\n get name() {\n return doc.name;\n },\n get id() {\n return relid();\n },\n startRenaming: () => setRenaming(relid()),\n remove: remove,\n get pressed() {\n return props.isSelected(doc.url);\n },\n get type() {\n return doc.type;\n },\n get element() {\n return props.element;\n },\n get repo() {\n return props.repo;\n },\n get rootFolderHandle() {\n return props.rootFolderHandle;\n },\n get parentFolderHandle() {\n return props.handle;\n },\n get itemIndex() {\n return index();\n },\n openWith: toolId => props.open({\n url: doc.url,\n toolId,\n title: doc.name,\n type: doc.type\n }),\n get children() {\n return _$createComponent(ItemName, {\n get name() {\n return doc.name;\n },\n get id() {\n return relid();\n },\n rename: rename\n });\n }\n });\n }\n })];\n }\n });\n }\n }));\n _$effect(_p$ => {\n var _v$ = !!visible(),\n _v$2 = !visible();\n _v$ !== _p$.e && _el$2.classList.toggle(\"document-list__item--visible\", _p$.e = _v$);\n _v$2 !== _p$.t && _el$2.classList.toggle(\"document-list__item--invisible\", _p$.t = _v$2);\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$2;\n })()];\n }\n }), _$createComponent(Show, {\n get when() {\n return _$memo(() => !!pendingHere())() && pendingNewDoc().index >= (props.docs?.length ?? 0);\n },\n get children() {\n return placeholder();\n }\n })];\n}", "import { template as _$template } from \"solid-js/web\";\nimport { style as _$style } from \"solid-js/web\";\nimport { setAttribute as _$setAttribute } from \"solid-js/web\";\nimport { effect as _$effect } from \"solid-js/web\";\nimport { insert as _$insert } from \"solid-js/web\";\nimport { createComponent as _$createComponent } from \"solid-js/web\";\nimport { addEventListener as _$addEventListener } from \"solid-js/web\";\nimport { memo as _$memo } from \"solid-js/web\";\nvar _tmpl$ = /*#__PURE__*/_$template(`<button class=document-list-folder__toggle>`),\n _tmpl$2 = /*#__PURE__*/_$template(`<div class=document-list-folder role=group><div class=document-list-folder__contents>`);\nimport { updateText } from \"@automerge/automerge-repo/slim\";\nimport { useDocument } from \"solid-automerge\";\nimport { handleFilesDrop } from \"./file-drop.ts\";\nimport { createEffect, createSignal, onCleanup, Show, Suspense } from \"solid-js\";\nimport { filterMatches, setRenaming, setPendingNewDoc, autoExpandedFolders } from \"../state.ts\";\nimport { DocumentList } from \"./document-list.tsx\";\nimport { watchFolder } from \"./auto-expand.ts\";\nimport Item from \"./item.tsx\";\nimport { ItemName } from \"./name.tsx\";\nimport { LoadingRow } from \"./loading-row.tsx\";\nimport { createNew } from \"../create-new.tsx\";\nimport { Chevron } from \"../icons.tsx\";\nimport { getDropTarget, setDropTarget, clearDropTarget, copyMode, isNewDocDrag, isSameDragOriginView } from \"../dnd/dnd.ts\";\nimport { executeDrop } from \"../dnd/operations.ts\";\nimport { getDndPayload } from \"../dnd/payload.ts\";\nimport { log } from \"../dnd/debug.ts\";\nexport default function Folder(props) {\n const [expanded, setExpanded] = createSignal(false);\n const [folder, handle] = useDocument(() => props.url, props);\n createEffect(() => {\n if (handle.latest) watchFolder(handle.latest);\n });\n const nextVisitedFolders = new Set(props.visitedFolders ?? []);\n nextVisitedFolders.add(props.url);\n const depth = () => props.depth ?? 1;\n const depthStyle = () => ({\n \"--depth\": depth() + 1\n });\n const folderDepthStyle = () => ({\n \"--depth\": depth()\n });\n createEffect(last => {\n if (!last && props.filter && filterMatches(props.filter, folder()?.title ?? props.name)) {\n setExpanded(true);\n }\n return props.filter;\n });\n createEffect(() => {\n if (autoExpandedFolders().has(props.url)) setExpanded(true);\n });\n let dragToggleTimer = null;\n let dragAutoCommitted = false;\n function startDragAutoToggle() {\n if (dragToggleTimer || dragAutoCommitted) return;\n dragToggleTimer = setTimeout(() => {\n setExpanded(v => !v);\n dragAutoCommitted = true;\n dragToggleTimer = null;\n }, 1e3);\n }\n function stopDragAutoToggle() {\n if (dragToggleTimer) {\n clearTimeout(dragToggleTimer);\n dragToggleTimer = null;\n }\n dragAutoCommitted = false;\n }\n onCleanup(stopDragAutoToggle);\n function rename(name) {\n handle()?.change(doc => updateText(doc, [\"title\"], name));\n }\n async function createInside(datatype) {\n const h = handle();\n if (!h) return;\n const freshy = await createNew(props.repo, datatype);\n let newIndex = 0;\n h.change(folder2 => {\n folder2.docs.push(freshy);\n newIndex = folder2.docs.length - 1;\n });\n props.clearFilter();\n setExpanded(true);\n props.open(freshy);\n setRenaming(h.url + \"/\" + newIndex);\n }\n async function handleDropIntoFolder(event) {\n log(\"Folder drop handler called for:\", props.url);\n if (event.dataTransfer?.files && event.dataTransfer.files.length > 0) {\n await handleFilesDrop(event.dataTransfer.files, handle(), props.repo, \"inside\", 0);\n return;\n }\n const payload = getDndPayload(event);\n if (!payload) {\n log(\"No dnd data in drop event. types:\", event.dataTransfer?.types);\n return;\n }\n const {\n source,\n items\n } = payload;\n log(\"Drop data:\", {\n source,\n items,\n folderUrl: props.url\n });\n executeDrop({\n draggedIds: items.map(i => i.id),\n draggedUrls: items.map(i => i.url),\n draggedItems: items,\n targetId: props.url,\n position: \"inside\",\n sourceToolId: source,\n copyMode: copyMode()\n }, props.repo, props.rootFolderHandle, isSameDragOriginView(props.element));\n }\n return (() => {\n var _el$ = _tmpl$2(),\n _el$3 = _el$.firstChild;\n _el$.addEventListener(\"drop\", event => {\n stopDragAutoToggle();\n log(\"Folder ondrop event fired\", props.url);\n event.preventDefault();\n event.stopPropagation();\n const target = getDropTarget();\n if (target?.position === \"inside\") {\n if (isNewDocDrag(event)) {\n const h = handle();\n if (h) {\n setExpanded(true);\n setPendingNewDoc({\n containerUrl: h.url,\n index: 0\n });\n }\n } else {\n handleDropIntoFolder(event);\n }\n }\n clearDropTarget();\n });\n _el$.addEventListener(\"dragleave\", event => {\n const related = event.relatedTarget;\n if (!related || !event.currentTarget.contains(related)) {\n stopDragAutoToggle();\n clearDropTarget();\n }\n });\n _el$.addEventListener(\"dragover\", event => {\n event.preventDefault();\n event.stopPropagation();\n const effect = copyMode() ? \"copy\" : \"move\";\n event.dataTransfer.dropEffect = effect;\n const target = event.target;\n const isOverItem = target.closest(\".document-list-item\");\n if (!isOverItem) {\n setDropTarget({\n id: props.url,\n position: \"inside\"\n });\n }\n const overItem = event.target.closest(\".document-list-item\");\n if (overItem?.getAttribute(\"data-dnd-item\") === props.url) {\n startDragAutoToggle();\n }\n });\n _$insert(_el$, _$createComponent(Item, {\n get [\"aria-label\"]() {\n return folder()?.title ?? props.name ?? \"\";\n },\n startRenaming: () => {\n setRenaming(props.url);\n },\n get remove() {\n return props.removeFromParent;\n },\n get id() {\n return props.url;\n },\n get url() {\n return props.url;\n },\n get name() {\n return folder()?.title ?? props.name ?? \"\";\n },\n get pressed() {\n return props.isSelected(props.url);\n },\n type: \"folder\",\n get element() {\n return props.element;\n },\n get repo() {\n return props.repo;\n },\n get rootFolderHandle() {\n return props.rootFolderHandle;\n },\n get parentFolderHandle() {\n return props.parentFolderHandle;\n },\n get itemIndex() {\n return props.itemIndex;\n },\n get isExpanded() {\n return expanded();\n },\n onToggleExpand: () => setExpanded(yn => !yn),\n createInside: createInside,\n openWith: toolId => {\n props.open({\n url: props.url,\n toolId,\n title: folder()?.title ?? props.name,\n type: \"folder\"\n });\n },\n get children() {\n return [(() => {\n var _el$2 = _tmpl$();\n _$addEventListener(_el$2, \"click\", event => {\n event.stopImmediatePropagation();\n setExpanded(yn => !yn);\n });\n _$insert(_el$2, _$createComponent(Show, {\n get when() {\n return expanded();\n },\n get fallback() {\n return _$createComponent(Chevron, {});\n },\n get children() {\n return _$createComponent(Chevron, {\n style: {\n rotate: \"90deg\"\n }\n });\n }\n }));\n _$effect(() => _$setAttribute(_el$2, \"aria-label\", (expanded() ? \"collapse\" : \"expand\") + \" \" + (folder()?.title ?? props.name)));\n return _el$2;\n })(), _$createComponent(ItemName, {\n get name() {\n return folder()?.title ?? props.name;\n },\n get id() {\n return props.url;\n },\n rename: rename\n })];\n }\n }), _el$3);\n _$insert(_el$3, _$createComponent(Show, {\n get when() {\n return expanded() || !!props.filter;\n },\n get children() {\n return _$createComponent(Suspense, {\n get fallback() {\n return _$createComponent(LoadingRow, {\n get depth() {\n return depth() + 1;\n }\n });\n },\n get children() {\n return _$createComponent(DocumentList, {\n get docs() {\n return folder()?.docs;\n },\n get repo() {\n return props.repo;\n },\n get depth() {\n return depth() + 1;\n },\n get handle() {\n return handle.latest;\n },\n get open() {\n return props.open;\n },\n get isSelected() {\n return props.isSelected;\n },\n visitedFolders: nextVisitedFolders,\n get element() {\n return props.element;\n },\n get rootFolderHandle() {\n return props.rootFolderHandle;\n },\n get filter() {\n return props.filter;\n },\n get clearFilter() {\n return props.clearFilter;\n }\n });\n }\n });\n }\n }));\n _$effect(_p$ => {\n var _v$ = depth(),\n _v$2 = folderDepthStyle(),\n _v$3 = expanded(),\n _v$4 = props.url,\n _v$5 = !!(!expanded() && !props.filter),\n _v$6 = depth(),\n _v$7 = depthStyle();\n _v$ !== _p$.e && _$setAttribute(_el$, \"data-depth\", _p$.e = _v$);\n _p$.t = _$style(_el$, _v$2, _p$.t);\n _v$3 !== _p$.a && _$setAttribute(_el$, \"aria-expanded\", _p$.a = _v$3);\n _v$4 !== _p$.o && _$setAttribute(_el$, \"data-dnd-container\", _p$.o = _v$4);\n _v$5 !== _p$.i && _el$3.classList.toggle(\"document-list-folder__contents--hidden\", _p$.i = _v$5);\n _v$6 !== _p$.n && _$setAttribute(_el$3, \"data-depth\", _p$.n = _v$6);\n _p$.s = _$style(_el$3, _v$7, _p$.s);\n return _p$;\n }, {\n e: undefined,\n t: undefined,\n a: undefined,\n o: undefined,\n i: undefined,\n n: undefined,\n s: undefined\n });\n return _el$;\n })();\n}", "import type { Repo, DocHandle } from \"@automerge/automerge-repo/slim\";\nimport type {\n FolderDoc,\n HasPatchworkMetadata,\n UnixFileEntry,\n} from \"@inkandswitch/patchwork-filesystem\";\nimport { log } from \"../dnd/debug.ts\";\n\n/**\n * Handles file drops from the operating system by creating UnixFileEntry documents\n * and adding them to the specified folder.\n */\nexport async function handleFilesDrop(\n files: FileList,\n folderHandle: DocHandle<FolderDoc>,\n repo: Repo,\n position: \"above\" | \"below\" | \"inside\",\n targetIndex: number\n): Promise<void> {\n for (const file of Array.from(files)) {\n try {\n // Read file content\n const arrayBuffer = await file.arrayBuffer();\n const content = new Uint8Array(arrayBuffer);\n\n // Extract extension from filename\n const nameParts = file.name.split(\".\");\n const extension = nameParts.length > 1 ? nameParts.pop()! : \"\";\n const nameWithoutExt = nameParts.join(\".\");\n\n // Create UnixFileEntry document\n const handle = await repo.create2<UnixFileEntry & HasPatchworkMetadata>({\n \"@patchwork\": {\n type: \"file\",\n },\n content,\n extension,\n mimeType: file.type || \"application/octet-stream\",\n name: nameWithoutExt,\n });\n\n // Calculate insertion index based on position\n const insertIndex =\n position === \"above\"\n ? targetIndex\n : position === \"below\"\n ? targetIndex + 1\n : 0; // \"inside\" means at the beginning of the folder\n\n // Add to folder at the correct position\n folderHandle.change((folder) => {\n folder.docs.splice(insertIndex, 0, {\n url: handle.url,\n name: file.name,\n type: \"file\",\n });\n });\n\n log(\"FileDrop: Created file document:\", file.name, handle.url);\n } catch (error) {\n log(\"FileDrop: Failed to create file document:\", error);\n }\n }\n}\n", "import { template as _$template } from \"solid-js/web\";\nimport { delegateEvents as _$delegateEvents } from \"solid-js/web\";\nimport { setAttribute as _$setAttribute } from \"solid-js/web\";\nimport { effect as _$effect } from \"solid-js/web\";\nimport { insert as _$insert } from \"solid-js/web\";\nimport { addEventListener as _$addEventListener } from \"solid-js/web\";\nimport { use as _$use } from \"solid-js/web\";\nvar _tmpl$ = /*#__PURE__*/_$template(`<button draggable=true aria-haspopup=menu class=\"popmenu__trigger document-list-item\"role=treeitem>`);\nimport { createEffect, createSignal, onCleanup } from \"solid-js\";\nimport { dragstack, addToDragstack, removeFromDragstack, clearDragstack, setDragging, setDragSourceItems, clearDragSourceItems, getDropTarget, setDropTarget, isAbove, clearDropTarget, copyMode, setCopyMode, isNewDocDrag, setDragOriginView, isSameDragOriginView } from \"../dnd/dnd.ts\";\nimport { setMenuTarget, setPendingNewDoc } from \"../state.ts\";\nimport { parseAutomergeUrl } from \"@automerge/automerge-repo/slim\";\nimport { getImportableUrlFromAutomergeUrl } from \"@inkandswitch/patchwork-filesystem\";\nimport { executeDrop } from \"../dnd/operations.ts\";\nimport { getDndPayload } from \"../dnd/payload.ts\";\nimport { handleFilesDrop } from \"./file-drop.ts\";\nimport { log } from \"../dnd/debug.ts\";\nconst EXT_MIME = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n bmp: \"image/bmp\",\n tiff: \"image/tiff\",\n svg: \"image/svg+xml\",\n pdf: \"application/pdf\",\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n mov: \"video/quicktime\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n ogg: \"audio/ogg\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n csv: \"text/csv\",\n json: \"application/json\",\n html: \"text/html\",\n zip: \"application/zip\"\n};\nfunction mimeForName(name) {\n const ext = name.includes(\".\") ? name.split(\".\").pop().toLowerCase() : \"\";\n return ext ? EXT_MIME[ext] : void 0;\n}\nfunction scrollParent(el) {\n for (let p = el.parentElement; p; p = p.parentElement) {\n const overflow = getComputedStyle(p).overflowY;\n if ((overflow === \"auto\" || overflow === \"scroll\") && p.scrollHeight > p.clientHeight) {\n return p;\n }\n }\n return document.scrollingElement ?? document.body;\n}\nfunction selectedItemIsVisible(el) {\n const container = scrollParent(el);\n const box = container.getBoundingClientRect();\n const selected = container.querySelectorAll('.document-list-item[aria-selected=\"true\"]');\n for (const item of selected) {\n const rect = item.getBoundingClientRect();\n if (rect.top >= box.top && rect.bottom <= box.bottom) return true;\n }\n return false;\n}\nexport default function Item(props) {\n let trigger;\n const [fileMeta, setFileMeta] = createSignal(null);\n let filePrefetched = false;\n function prefetchFileMeta() {\n if (filePrefetched || props.type !== \"file\") return;\n filePrefetched = true;\n props.repo.find(props.url).then(handle => {\n const doc = handle?.doc();\n if (!doc) return;\n const base = String(doc.name ?? props.name ?? \"file\");\n const ext = doc.extension ? `.${String(doc.extension).replace(/^\\.+/, \"\")}` : \"\";\n const filename = ext && !base.endsWith(ext) ? `${base}${ext}` : base;\n const mime = String(doc.mimeType || mimeForName(filename) || \"application/octet-stream\");\n setFileMeta({\n mime,\n filename\n });\n }).catch(() => {});\n }\n createEffect(prev => {\n if (props.pressed && !prev) {\n if (trigger && !selectedItemIsVisible(trigger)) {\n trigger.scrollIntoViewIfNeeded?.();\n }\n }\n return props.pressed;\n });\n const dnd = () => ({\n id: props.id,\n type: props.type,\n url: props.url,\n name: props.name,\n source: props.element.toolId\n });\n const SPRING_LOAD_MS = 1500;\n let springTimer = null;\n let springCommitted = false;\n function startSpringLoad(target) {\n if (props.type === \"folder\" || dragstack.has(props.id)) return;\n if (springTimer || springCommitted) return;\n target.setAttribute(\"data-dnd-springload\", \"\");\n springTimer = setTimeout(() => {\n springTimer = null;\n springCommitted = true;\n target.removeAttribute(\"data-dnd-springload\");\n props.openWith();\n }, SPRING_LOAD_MS);\n }\n function stopSpringLoad() {\n if (springTimer) {\n clearTimeout(springTimer);\n springTimer = null;\n }\n springCommitted = false;\n trigger?.removeAttribute(\"data-dnd-springload\");\n }\n onCleanup(stopSpringLoad);\n function openMenu(x, y) {\n setMenuTarget({\n x,\n y,\n element: trigger,\n id: props.id,\n url: props.url,\n name: props.name,\n type: props.type,\n openWith: props.openWith,\n startRenaming: props.startRenaming,\n remove: props.remove,\n createInside: props.createInside\n });\n }\n let longPress;\n const cancelLongPress = () => clearTimeout(longPress);\n onCleanup(cancelLongPress);\n async function handleDrop(event, targetId, position) {\n log(\"Item drop handler called for:\", targetId, position);\n if (event.dataTransfer?.files && event.dataTransfer.files.length > 0) {\n const folderHandle = position === \"inside\" && props.type === \"folder\" ? await props.repo.find(props.url) : props.parentFolderHandle ?? props.rootFolderHandle;\n await handleFilesDrop(event.dataTransfer.files, folderHandle, props.repo, position, position === \"inside\" ? 0 : props.itemIndex ?? 0);\n return;\n }\n const payload = getDndPayload(event);\n if (!payload) {\n log(\"No dnd data in drop event. types:\", event.dataTransfer?.types);\n return;\n }\n const {\n source,\n items\n } = payload;\n log(\"Drop data:\", {\n source,\n items,\n targetId,\n position\n });\n executeDrop({\n draggedIds: items.map(i => i.id),\n draggedUrls: items.map(i => i.url),\n draggedItems: items,\n targetId,\n position,\n sourceToolId: source,\n copyMode: copyMode()\n }, props.repo, props.rootFolderHandle, isSameDragOriginView(props.element));\n }\n return (() => {\n var _el$ = _tmpl$();\n _el$.$$keydown = event => {\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n const current = event.currentTarget;\n const allItems = Array.from(document.querySelectorAll(\"[data-dnd-item]\")).filter(item => item.offsetParent !== null);\n const currentIndex = allItems.indexOf(current);\n if (event.key === \"ArrowDown\" && currentIndex < allItems.length - 1) {\n allItems[currentIndex + 1]?.focus();\n } else if (event.key === \"ArrowUp\" && currentIndex > 0) {\n allItems[currentIndex - 1]?.focus();\n }\n return;\n }\n if (props.type === \"folder\" && props.onToggleExpand) {\n if (event.key === \"ArrowRight\" && !props.isExpanded) {\n event.preventDefault();\n props.onToggleExpand();\n return;\n } else if (event.key === \"ArrowLeft\" && props.isExpanded) {\n event.preventDefault();\n props.onToggleExpand();\n return;\n }\n }\n if (event.key == \"Enter\" && event.ctrlKey && !(+event.altKey | +event.shiftKey | +event.metaKey)) {\n event.preventDefault();\n event.stopImmediatePropagation();\n event.stopPropagation();\n const box = trigger.getBoundingClientRect();\n openMenu(box.x + 10, box.y + box.height - 10);\n }\n };\n _$addEventListener(_el$, \"dblclick\", () => {\n props.startRenaming();\n });\n _$addEventListener(_el$, \"click\", event => {\n if (event.ctrlKey || event.metaKey) {\n return;\n }\n const target = event.target;\n if (target.closest(\".document-list-folder__toggle, .create-new-button\")) {\n return;\n }\n clearDragstack();\n props.openWith();\n });\n _el$.$$mousedown = event => {\n prefetchFileMeta();\n if (event.ctrlKey || event.metaKey) {\n if (dragstack.has(props.id)) {\n removeFromDragstack(props.id);\n } else {\n addToDragstack(props.id, dnd());\n }\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n } else if (!dragstack.has(props.id)) {\n clearDragstack();\n }\n };\n _el$.addEventListener(\"drop\", event => {\n stopSpringLoad();\n const target = getDropTarget();\n console.log(\"[DnD] Item ondrop event fired\", props.id, \"type:\", props.type, \"target:\", target);\n if (props.type === \"folder\" && target?.position === \"inside\") {\n event.preventDefault();\n event.stopPropagation();\n if (isNewDocDrag(event)) {\n setPendingNewDoc({\n containerUrl: props.url,\n index: 0\n });\n clearDropTarget();\n return;\n }\n handleDrop(event, target.id, \"inside\");\n clearDropTarget();\n return;\n }\n log(\"Item handling drop itself\");\n event.preventDefault();\n event.stopPropagation();\n if (!target) {\n log(\"No drop target set\");\n return;\n }\n if (isNewDocDrag(event)) {\n if (props.parentFolderHandle && props.itemIndex != null) {\n const index = target.position === \"above\" ? props.itemIndex : props.itemIndex + 1;\n setPendingNewDoc({\n containerUrl: props.parentFolderHandle.url,\n index\n });\n }\n clearDropTarget();\n return;\n }\n handleDrop(event, target.id, target.position);\n clearDropTarget();\n });\n _el$.addEventListener(\"dragleave\", event => {\n const related = event.relatedTarget;\n if (!related || !event.currentTarget.contains(related)) {\n stopSpringLoad();\n clearDropTarget();\n }\n });\n _el$.addEventListener(\"dragover\", event => {\n event.preventDefault();\n event.dataTransfer.dropEffect = copyMode() ? \"copy\" : \"move\";\n let position;\n if (props.type === \"folder\") {\n const rect = event.currentTarget.getBoundingClientRect();\n const offset = event.clientY - rect.top;\n const relativePosition = offset / rect.height;\n if (relativePosition < 0.25) {\n position = \"above\";\n } else if (relativePosition > 0.75) {\n position = \"below\";\n } else {\n position = \"inside\";\n }\n if (position !== \"inside\") {\n event.stopPropagation();\n }\n } else {\n position = isAbove(event.clientY, event.currentTarget) ? \"above\" : \"below\";\n event.stopPropagation();\n }\n setDropTarget({\n id: props.id,\n position\n });\n startSpringLoad(event.currentTarget);\n });\n _el$.addEventListener(\"dragend\", () => {\n stopSpringLoad();\n clearDragSourceItems();\n clearDragstack();\n setCopyMode(false);\n setDragOriginView(null);\n setDragging(false);\n });\n _el$.addEventListener(\"drag\", event => {\n if (event.altKey !== copyMode()) {\n setCopyMode(event.altKey);\n }\n });\n _el$.addEventListener(\"dragstart\", event => {\n cancelLongPress();\n if (!dragstack.has(props.id)) {\n clearDragstack();\n addToDragstack(props.id, dnd());\n }\n const items = dragstack.values();\n const urls = [];\n const ids = [];\n setCopyMode(event.altKey);\n event.dataTransfer.effectAllowed = \"all\";\n for (const item of items) {\n urls.push(item.url);\n ids.push(item.id);\n }\n const urlList = urls.map(url => location.protocol + \"//\" + location.host + `/#doc=${parseAutomergeUrl(url).documentId}`).join(\"\\r\\n\") + \"\\r\\n\";\n event.dataTransfer?.items.add(urlList, \"text/uri-list\");\n event.dataTransfer?.items.add(JSON.stringify(ids), \"text/x-sideboard-ids\");\n event.dataTransfer?.items.add(JSON.stringify(urls), \"text/x-patchwork-urls\");\n event.dataTransfer?.items.add(JSON.stringify({\n source: props.element.toolId,\n items: [...dragstack.values()]\n }), \"text/x-patchwork-dnd\");\n if (dragstack.size === 1 && props.type === \"file\") {\n const meta = fileMeta();\n const filename = meta?.filename ?? props.name;\n const mime = meta?.mime ?? mimeForName(filename) ?? \"application/octet-stream\";\n try {\n const swUrl = new URL(getImportableUrlFromAutomergeUrl(props.url), location.origin).href;\n event.dataTransfer?.setData(\"DownloadURL\", `${mime}:${filename}:${swUrl}`);\n } catch {}\n }\n const preview = document.createElement(\"div\");\n preview.style.cssText = `\n position: absolute;\n top: -1000px;\n background: var(--document-list-primary);\n padding: 0.5rem 0.75rem;\n border-radius: var(--document-list-radius);\n font-family: inherit;\n font-size: 0.9rem;\n pointer-events: none;\n color: var(--document-list-primary-line);\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n `;\n const count = dragstack.size;\n const modeText = event.altKey ? \" (copy)\" : \"\";\n preview.textContent = count === 1 ? props.name + modeText : `${count} items${modeText}`;\n document.body.appendChild(preview);\n event.dataTransfer.setDragImage(preview, 10, 10);\n setTimeout(() => preview.remove(), 0);\n setDragSourceItems([...dragstack.keys()]);\n setDragOriginView(props.element);\n setDragging(true);\n });\n _el$.addEventListener(\"pointercancel\", cancelLongPress);\n _el$.$$pointerup = cancelLongPress;\n _el$.$$pointerdown = event => {\n if (event.pointerType === \"touch\" || event.pointerType === \"pen\") {\n longPress = setTimeout(() => openMenu(event.clientX, event.clientY), 700);\n }\n };\n _$addEventListener(_el$, \"contextmenu\", event => {\n event.preventDefault();\n event.stopPropagation();\n openMenu(event.clientX, event.clientY);\n });\n var _ref$ = trigger;\n typeof _ref$ === \"function\" ? _$use(_ref$, _el$) : trigger = _el$;\n _$insert(_el$, () => props.children);\n _$effect(_p$ => {\n var _v$ = props.id,\n _v$2 = props.url,\n _v$3 = props.type,\n _v$4 = props[\"aria-label\"],\n _v$5 = props.pressed ? \"true\" : void 0;\n _v$ !== _p$.e && _$setAttribute(_el$, \"data-dnd-item\", _p$.e = _v$);\n _v$2 !== _p$.t && _$setAttribute(_el$, \"data-doc-url\", _p$.t = _v$2);\n _v$3 !== _p$.a && _$setAttribute(_el$, \"data-doc-type\", _p$.a = _v$3);\n _v$4 !== _p$.o && _$setAttribute(_el$, \"aria-label\", _p$.o = _v$4);\n _v$5 !== _p$.i && _$setAttribute(_el$, \"aria-selected\", _p$.i = _v$5);\n return _p$;\n }, {\n e: undefined,\n t: undefined,\n a: undefined,\n o: undefined,\n i: undefined\n });\n return _el$;\n })();\n}\n_$delegateEvents([\"pointerdown\", \"pointerup\", \"mousedown\", \"keydown\"]);", "import {\n isValidAutomergeUrl,\n type AutomergeUrl,\n} from \"@automerge/automerge-repo/slim\";\n\nexport type DndPayloadItem = {\n id?: string;\n url: AutomergeUrl;\n name?: string;\n type?: string;\n};\n\nexport type DndPayload = {\n source: string;\n items: DndPayloadItem[];\n};\n\n// MIME types we can extract document drags from, in order of preference\nexport const DND_DATA_TYPES = [\n \"text/x-patchwork-dnd\",\n \"text/x-patchwork-urls\",\n \"text/uri-list\",\n \"text/plain\",\n];\n\nexport function hasDocumentDrag(dataTransfer: DataTransfer | null) {\n return Boolean(\n dataTransfer &&\n DND_DATA_TYPES.some((type) => dataTransfer.types.includes(type))\n );\n}\n\nfunction urlFromText(text: string): AutomergeUrl | null {\n const trimmed = text.trim();\n if (isValidAutomergeUrl(trimmed)) return trimmed;\n // patchwork web links carry the document id in the fragment: #doc=<documentId>\n const docId = trimmed.match(/#doc=([^&\\s]+)/)?.[1];\n if (docId && isValidAutomergeUrl(`automerge:${docId}`)) {\n return `automerge:${docId}` as AutomergeUrl;\n }\n return null;\n}\n\nexport function getDndPayload(event: DragEvent): DndPayload | null {\n const data = event.dataTransfer;\n if (!data) return null;\n\n const dndData = data.getData(\"text/x-patchwork-dnd\");\n if (dndData) {\n try {\n const parsed = JSON.parse(dndData);\n if (Array.isArray(parsed?.items) && parsed.items.length > 0) {\n return { source: parsed.source ?? \"\", items: parsed.items };\n }\n } catch {\n // fall through to the other types\n }\n }\n\n const urlData = data.getData(\"text/x-patchwork-urls\");\n if (urlData) {\n try {\n const urls: unknown = JSON.parse(urlData);\n const items = (Array.isArray(urls) ? urls : [])\n .filter((url): url is AutomergeUrl => isValidAutomergeUrl(url))\n .map((url) => ({ url }));\n if (items.length > 0) return { source: \"\", items };\n } catch {\n // fall through to the other types\n }\n }\n\n const text = data.getData(\"text/uri-list\") || data.getData(\"text/plain\");\n const items = text\n .split(/\\r?\\n/)\n .map(urlFromText)\n .filter((url): url is AutomergeUrl => url !== null)\n .map((url) => ({ url }));\n if (items.length > 0) return { source: \"\", items };\n\n return null;\n}\n", "import { template as _$template } from \"solid-js/web\";\nimport { delegateEvents as _$delegateEvents } from \"solid-js/web\";\nimport { insert as _$insert } from \"solid-js/web\";\nimport { createComponent as _$createComponent } from \"solid-js/web\";\nimport { effect as _$effect } from \"solid-js/web\";\nimport { use as _$use } from \"solid-js/web\";\nvar _tmpl$ = /*#__PURE__*/_$template(`<form style=display:contents><input autofocus class=document-list-item__name>`),\n _tmpl$2 = /*#__PURE__*/_$template(`<span class=document-list-item__name>`);\nimport { createSelector, createSignal, Match, Switch } from \"solid-js\";\nimport { renaming, setRenaming } from \"../state.ts\";\nexport function ItemName(props) {\n const isBeingRenamed = createSelector(renaming);\n const [next, setNext] = createSignal(props.name);\n function blur() {\n props.rename(next() ?? \"\");\n if (isBeingRenamed(props.id)) setRenaming(\"\");\n }\n return _$createComponent(Switch, {\n get children() {\n return [_$createComponent(Match, {\n get when() {\n return isBeingRenamed(props.id);\n },\n get children() {\n var _el$ = _tmpl$(),\n _el$2 = _el$.firstChild;\n _el$.addEventListener(\"submit\", event => {\n event.preventDefault();\n blur();\n });\n _el$2.$$input = event => setNext(event.target.value);\n _el$2.$$keydown = event => {\n if (event.key == \"Escape\" || event.key == \"g\" && event.ctrlKey) {\n blur();\n }\n };\n _el$2.addEventListener(\"blur\", blur);\n _$use(el => {\n setNext(props.name);\n setTimeout(() => {\n el.focus();\n el.select();\n }, 80);\n }, _el$2);\n _$effect(() => _el$2.value = next());\n return _el$;\n }\n }), _$createComponent(Match, {\n get when() {\n return !isBeingRenamed(props.id);\n },\n get children() {\n var _el$3 = _tmpl$2();\n _$insert(_el$3, () => props.name);\n return _el$3;\n }\n })];\n }\n });\n}\n_$delegateEvents([\"keydown\", \"input\"]);", "import { template as _$template } from \"solid-js/web\";\nimport { insert as _$insert } from \"solid-js/web\";\nimport { createComponent as _$createComponent } from \"solid-js/web\";\nimport { setStyleProperty as _$setStyleProperty } from \"solid-js/web\";\nimport { effect as _$effect } from \"solid-js/web\";\nvar _tmpl$ = /*#__PURE__*/_$template(`<div class=\"document-list-item document-list-item--loading\"aria-hidden=true><span class=document-list-item__skeleton>`),\n _tmpl$2 = /*#__PURE__*/_$template(`<div class=document-list__loading aria-busy=true aria-label=\"Loading documents\">`);\nimport { For } from \"solid-js\";\nexport function LoadingRow(props) {\n return (() => {\n var _el$ = _tmpl$();\n _$effect(_$p => _$setStyleProperty(_el$, \"--depth\", props.depth ?? 0));\n return _el$;\n })();\n}\nconst SKELETON_WIDTHS = [\"11rem\", \"7rem\", \"9.5rem\", \"6rem\", \"10rem\", \"8rem\"];\nexport function LoadingRows(props) {\n const rows = () => Array.from({\n length: props.count ?? 5\n }, (_, i) => i);\n return (() => {\n var _el$2 = _tmpl$2();\n _$insert(_el$2, _$createComponent(For, {\n get each() {\n return rows();\n },\n children: i => (() => {\n var _el$3 = _tmpl$(),\n _el$4 = _el$3.firstChild;\n _$effect(_p$ => {\n var _v$ = props.depth ?? 0,\n _v$2 = SKELETON_WIDTHS[i % SKELETON_WIDTHS.length];\n _v$ !== _p$.e && _$setStyleProperty(_el$3, \"--depth\", _p$.e = _v$);\n _v$2 !== _p$.t && _$setStyleProperty(_el$4, \"width\", _p$.t = _v$2);\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$3;\n })()\n }));\n return _el$2;\n })();\n}", "import { createEffect, createSignal, onCleanup, onMount, } from \"solid-js\";\nimport { createStore, reconcile } from \"solid-js/store\";\nimport * as Providers from \"@inkandswitch/patchwork-providers\";\nfunction resolveElement(source) {\n return typeof source === \"function\" ? source() : source;\n}\n/**\n * Generic reactive request. Resolves the first value a provider emits for\n * `selector` (via the one-shot `request` helper) and returns an accessor that\n * reads `undefined` until then. `T` is the response type.\n */\nexport function request(element, selector) {\n const [value, setValue] = createSignal(undefined);\n onMount(() => {\n const target = resolveElement(element);\n if (!target)\n return;\n Providers.request(target, selector).then((v) => {\n if (v == null)\n return;\n setValue(() => v);\n });\n });\n return value;\n}\nexport function subscribe(element, selector, initialValue) {\n const [value, setValue] = createSignal(initialValue);\n onMount(() => {\n const target = resolveElement(element);\n if (!target)\n return;\n const unsubscribe = Providers.subscribe(target, selector, setValue);\n onCleanup(unsubscribe);\n });\n return value;\n}\n/**\n * Store-backed subscription. Use this when a consumer wants Solid's\n * fine-grained nested reactivity for incoming JSON object or array snapshots.\n * Requires an initial object/array so the store has a stable root.\n *\n * `reconcile` preserves stable object/array identity where possible, so this\n * helper is not a good fit when the top-level value is used as an identity key\n * for resources or memos.\n */\nexport function subscribeReconciled(element, selector, initialValue) {\n const [store, setStore] = createStore(initialValue);\n onMount(() => {\n const target = resolveElement(element);\n if (!target)\n return;\n const unsubscribe = Providers.subscribe(target, selector, (v) => {\n setStore(reconcile(v));\n });\n onCleanup(unsubscribe);\n });\n return store;\n}\n/**\n * Handle-specialized subscription. Use when the answering provider emits an\n * `AutomergeUrl`. The handle is recovered locally from the global repo\n * (`window.repo`), so it stays fully live \u2014 reads project reactively and writes go\n * straight back to the same repo. Returns `[doc, handle]` matching the shape\n * of `solid-automerge`'s `useDocument`; both read `undefined` until the first\n * url arrives. `T` is the doc shape inside the handle.\n */\nexport function subscribeDoc(element, selector) {\n const [handle, setHandle] = createSignal(undefined);\n onMount(() => {\n const target = resolveElement(element);\n if (!target)\n return;\n let canceled = false;\n const unsubscribe = Providers.subscribe(target, selector, (url) => {\n if (!url)\n return;\n const repo = \"repo\" in window ? window.repo : undefined;\n if (!repo)\n return;\n void Promise.resolve(repo.find(url)).then((h) => {\n if (canceled)\n return;\n setHandle(() => h);\n });\n });\n onCleanup(() => {\n canceled = true;\n unsubscribe();\n });\n });\n // Mirror the doc into a store by `reconcile`-ing against the *materialized*\n // snapshot (`handle.doc()`) on every change, rather than replaying the\n // change's incremental patches (as `solid-automerge`'s `createDocumentProjection`\n // / `autoproduce` does).\n //\n // A whole-value write such as `doc.list = [...]` is lowered by Automerge to\n // `putObjectFromHydrate`, whose patch stream is a `put` that materializes the\n // new container *plus* per-element `insert` patches. Replaying that delta with\n // `applyPatches` double-applies the contents \u2014 the `put` seeds `[a, b]`, then\n // the inserts splice `a, b` in again, yielding `[a, b, a, b]` \u2014 even though the\n // document itself is correct. The materialized snapshot is always\n // authoritative, so reconciling against it is robust to any valid change,\n // whole-array reassignment included.\n const [store, setStore] = createStore({});\n const [ready, setReady] = createSignal(false);\n createEffect(() => {\n const h = handle();\n if (!h) {\n setReady(false);\n return;\n }\n const sync = () => {\n setStore(reconcile((h.doc() ?? {})));\n setReady(true);\n };\n sync();\n h.on(\"change\", sync);\n onCleanup(() => h.off(\"change\", sync));\n });\n const doc = () => (ready() ? store : undefined);\n return [doc, handle];\n}\n", "import type { AutomergeUrl } from \"@automerge/automerge-repo/slim\";\nimport {\n dragstack,\n addToDragstack,\n removeFromDragstack,\n type SideboardDragAndDropItem,\n} from \"../dnd/dnd.ts\";\n\n/**\n * A cmd/ctrl-drag rubber-band selection over the document list. Attach the\n * returned `onMouseDown` to the list container.\n *\n * Rows whose bounding boxes intersect the band are added to the drag selection\n * (the `dragstack`); rows the band leaves are removed again, so the selection\n * tracks the band live. Any selection the user made before starting the band\n * (via cmd-click) is left untouched \u2014 the band only manages the rows it adds.\n */\nexport function createMarquee(opts: {\n container: () => HTMLElement | undefined;\n source: () => string;\n}) {\n let startX = 0;\n let startY = 0;\n let active = false;\n // Selection present before the band started \u2014 never touched by the band.\n let preexisting = new Set<string>();\n // Rows the band itself added, so it can release them as it shrinks.\n let owned = new Set<string>();\n\n function itemFromEl(el: Element): SideboardDragAndDropItem {\n return {\n id: el.getAttribute(\"data-dnd-item\")!,\n url: el.getAttribute(\"data-doc-url\") as AutomergeUrl,\n type: el.getAttribute(\"data-doc-type\") ?? \"\",\n name: (el.textContent ?? \"\").trim(),\n source: opts.source(),\n };\n }\n\n function onMouseMove(event: MouseEvent) {\n const dx = event.clientX - startX;\n const dy = event.clientY - startY;\n if (!active) {\n // Small threshold so a plain cmd-click still toggles a single item.\n if (Math.hypot(dx, dy) < 5) return;\n active = true;\n }\n event.preventDefault();\n\n const left = Math.min(startX, event.clientX);\n const top = Math.min(startY, event.clientY);\n const right = Math.max(startX, event.clientX);\n const bottom = Math.max(startY, event.clientY);\n\n const container = opts.container();\n if (!container) return;\n\n const nextOwned = new Set<string>();\n for (const el of container.querySelectorAll(\"[data-dnd-item]\")) {\n if ((el as HTMLElement).offsetParent === null) continue; // hidden row\n const id = el.getAttribute(\"data-dnd-item\");\n if (!id || preexisting.has(id)) continue;\n const r = el.getBoundingClientRect();\n const hit = !(\n r.right < left ||\n r.left > right ||\n r.bottom < top ||\n r.top > bottom\n );\n if (!hit) continue;\n nextOwned.add(id);\n if (!dragstack.has(id)) addToDragstack(id, itemFromEl(el));\n }\n for (const id of owned) {\n if (!nextOwned.has(id)) removeFromDragstack(id);\n }\n owned = nextOwned;\n }\n\n function onMouseUp() {\n window.removeEventListener(\"mousemove\", onMouseMove, true);\n window.removeEventListener(\"mouseup\", onMouseUp, true);\n active = false;\n owned = new Set();\n preexisting = new Set();\n }\n\n function onMouseDown(event: MouseEvent) {\n if (event.button !== 0 || !(event.metaKey || event.ctrlKey)) return;\n // Don't start a band from the toolbar (filter input / create button).\n if ((event.target as Element).closest(\".document-list__toolbar\")) return;\n startX = event.clientX;\n startY = event.clientY;\n active = false;\n owned = new Set();\n preexisting = new Set(dragstack.keys());\n window.addEventListener(\"mousemove\", onMouseMove, true);\n window.addEventListener(\"mouseup\", onMouseUp, true);\n }\n\n return { onMouseDown };\n}\n"],
5
- "mappings": "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",
6
- "names": ["_$template", "_$delegateEvents", "_$insert", "_$effect", "_$createComponent", "_$use", "createEffect", "createMemo", "createSelector", "createSignal", "lazy", "onCleanup", "Show", "Suspense", "render", "mountedRows", "markMounted", "panel", "url", "rows", "n", "isMounted", "parents", "children", "watched", "indexFolder", "folderUrl", "docs", "next", "link", "prev", "child", "set", "missing", "watchFolder", "handle", "expandedFoldersFromIndex", "rootUrl", "selected", "folders", "unreached", "reaches", "up", "known", "found", "parent", "indexUntilFound", "repo", "wanted", "remaining", "seen", "failed", "visit", "foldersToReveal", "indexed", "search", "complete", "_$template", "_$effect", "_$memo", "_$insert", "_$createComponent", "deleteAt", "updateText", "getRegistry", "isLoadedPlugin", "createEffect", "createMemo", "createSignal", "For", "lazy", "Match", "onCleanup", "Show", "Suspense", "Switch", "untrack", "_$template", "_$style", "_$setAttribute", "_$effect", "_$insert", "_$createComponent", "_$addEventListener", "updateText", "handleFilesDrop", "files", "folderHandle", "repo", "position", "targetIndex", "file", "arrayBuffer", "content", "nameParts", "extension", "nameWithoutExt", "handle", "insertIndex", "folder", "log", "error", "createEffect", "createSignal", "onCleanup", "Show", "Suspense", "_$template", "_$delegateEvents", "_$setAttribute", "_$effect", "_$insert", "_$addEventListener", "_$use", "createEffect", "createSignal", "onCleanup", "parseAutomergeUrl", "getImportableUrlFromAutomergeUrl", "isValidAutomergeUrl", "DND_DATA_TYPES", "hasDocumentDrag", "dataTransfer", "type", "urlFromText", "text", "trimmed", "docId", "getDndPayload", "event", "data", "dndData", "parsed", "urlData", "urls", "items", "url", "_tmpl$", "_$template", "EXT_MIME", "mimeForName", "name", "ext", "scrollParent", "el", "p", "overflow", "selectedItemIsVisible", "container", "box", "selected", "item", "rect", "Item", "props", "trigger", "fileMeta", "setFileMeta", "createSignal", "filePrefetched", "prefetchFileMeta", "handle", "doc", "base", "filename", "mime", "createEffect", "prev", "dnd", "SPRING_LOAD_MS", "springTimer", "springCommitted", "startSpringLoad", "target", "dragstack", "stopSpringLoad", "onCleanup", "openMenu", "x", "y", "setMenuTarget", "longPress", "cancelLongPress", "handleDrop", "event", "targetId", "position", "log", "folderHandle", "handleFilesDrop", "payload", "getDndPayload", "source", "items", "executeDrop", "i", "copyMode", "isSameDragOriginView", "_el$", "current", "allItems", "currentIndex", "_$addEventListener", "clearDragstack", "removeFromDragstack", "addToDragstack", "getDropTarget", "isNewDocDrag", "setPendingNewDoc", "clearDropTarget", "index", "related", "relativePosition", "isAbove", "setDropTarget", "clearDragSourceItems", "setCopyMode", "setDragOriginView", "setDragging", "urls", "ids", "urlList", "url", "parseAutomergeUrl", "meta", "swUrl", "getImportableUrlFromAutomergeUrl", "preview", "count", "modeText", "setDragSourceItems", "_ref$", "_$use", "_$insert", "_$effect", "_p$", "_v$", "_v$2", "_v$3", "_v$4", "_v$5", "_$setAttribute", "_$delegateEvents", "_$template", "_$delegateEvents", "_$insert", "_$createComponent", "_$effect", "_$use", "createSelector", "createSignal", "Match", "Switch", "_tmpl$", "_$template", "_tmpl$2", "ItemName", "props", "isBeingRenamed", "createSelector", "renaming", "next", "setNext", "createSignal", "blur", "setRenaming", "_$createComponent", "Switch", "Match", "_el$", "_el$2", "event", "_$use", "el", "_$effect", "_el$3", "_$insert", "_$delegateEvents", "_$template", "_$insert", "_$createComponent", "_$setStyleProperty", "_$effect", "For", "_tmpl$", "_tmpl$2", "LoadingRow", "props", "_el$", "_$p", "SKELETON_WIDTHS", "LoadingRows", "rows", "_", "i", "_el$2", "_el$3", "_el$4", "_p$", "_v$", "_v$2", "_tmpl$", "_$template", "_tmpl$2", "Folder", "props", "expanded", "setExpanded", "createSignal", "folder", "handle", "useDocument", "createEffect", "watchFolder", "nextVisitedFolders", "depth", "depthStyle", "folderDepthStyle", "last", "filterMatches", "autoExpandedFolders", "dragToggleTimer", "dragAutoCommitted", "startDragAutoToggle", "v", "stopDragAutoToggle", "onCleanup", "rename", "name", "doc", "updateText", "createInside", "datatype", "h", "freshy", "createNew", "newIndex", "folder2", "setRenaming", "handleDropIntoFolder", "event", "log", "handleFilesDrop", "payload", "getDndPayload", "source", "items", "executeDrop", "i", "copyMode", "isSameDragOriginView", "_el$", "_el$3", "getDropTarget", "isNewDocDrag", "setPendingNewDoc", "clearDropTarget", "related", "effect", "setDropTarget", "_$insert", "_$createComponent", "Item", "yn", "toolId", "_el$2", "_$addEventListener", "Show", "Chevron", "_$effect", "_$setAttribute", "ItemName", "Suspense", "LoadingRow", "DocumentList", "_p$", "_v$", "_v$2", "_v$3", "_v$4", "_v$5", "_v$6", "_v$7", "_$style", "_tmpl$", "_$template", "_tmpl$2", "_tmpl$3", "NewDocPlaceholder", "lazy", "m", "CHUNK", "FRAME_BUDGET_MS", "DocumentList", "props", "visitedFolders", "limit", "setLimit", "createSignal", "createEffect", "total", "untrack", "frame", "more", "start", "n", "onCleanup", "docs", "createMemo", "all", "removeItem", "index", "folder", "deleteAt", "pendingHere", "pendingNewDoc", "commitPending", "docLink", "target", "setPendingNewDoc", "setRenaming", "placeholder", "_el$", "_$insert", "_$createComponent", "For", "doc", "visible", "filterMatches", "remove", "relid", "markMounted", "rename", "name", "doc2", "updateText", "datatypes", "getRegistry", "handle", "metadata", "datatype", "cancelled", "removeListener", "docHandle", "syncTitle", "docData", "isLoadedPlugin", "title", "d", "onChange", "Show", "_$memo", "_el$2", "Suspense", "LoadingRow", "Switch", "Match", "_el$3", "_el$4", "_el$5", "Folder", "Item", "toolId", "ItemName", "_$effect", "_p$", "_v$", "_v$2", "createEffect", "createSignal", "onCleanup", "onMount", "createStore", "reconcile", "Providers", "resolveElement", "source", "subscribe", "element", "selector", "initialValue", "value", "setValue", "createSignal", "onMount", "target", "resolveElement", "unsubscribe", "onCleanup", "createMarquee", "opts", "startX", "startY", "active", "preexisting", "owned", "itemFromEl", "el", "onMouseMove", "event", "dx", "dy", "left", "top", "right", "bottom", "container", "nextOwned", "id", "r", "dragstack", "addToDragstack", "removeFromDragstack", "onMouseUp", "onMouseDown", "_tmpl$", "_$template", "ItemMenu", "lazy", "m", "DocumentListPanel", "props", "folder", "folderHandle", "useDocument", "filter", "setFilter", "createSignal", "folderReady", "createEffect", "watchFolder", "selectedDocUrls", "subscribe", "selectedSet", "createMemo", "isSelected", "createSelector", "url", "set", "selected", "setAutoExpandedFolders", "isMounted", "cancelled", "foldersToReveal", "folders", "onCleanup", "open", "detail", "createOpenEvent", "isDraggingFile", "setIsDraggingFile", "navEl", "marquee", "createMarquee", "attachMarquee", "el", "_el$", "_el$2", "_el$3", "_el$4", "_el$5", "event", "isNewDocDrag", "h", "len", "setPendingNewDoc", "files", "insertIndex", "handleFilesDrop", "payload", "getDndPayload", "source", "items", "rootUrl", "docsLength", "executeDrop", "i", "copyMode", "isSameDragOriginView", "related", "hasDocumentDrag", "_$use", "_$insert", "_$createComponent", "CreateNew", "fn", "SearchIcon", "Show", "LoadingRows", "Suspense", "DocumentList", "menuTarget", "_$effect", "renderDocumentListPanel", "folderUrl", "element", "render", "_$delegateEvents"]
7
- }
@@ -1,2 +0,0 @@
1
- import{getRegistry as f,isLoadedPlugin as m}from"@inkandswitch/patchwork-plugins";async function y(t,e){let r=(await t.find(e)).doc(),s=r?.["@patchwork"]?.type??"",c="Untitled";if(s){let l=f("patchwork:datatype"),i=l.get(s);i&&(await l.load(i.id),m(i)&&(c=i.module.getTitle(r)||c))}return{name:c,type:s,url:e}}import{createSignal as p}from"solid-js";var[k,A]=p(!1),[h,w]=p(!1),D="application/x-patchwork-new-doc",[P,C]=p(!1);function v(t){return t.dataTransfer?.types.includes(D)??!1}var n=null;function q(){return n}function g(t,e){if(t){let o=document.querySelector(`[data-dnd-item="${CSS.escape(t.id)}"]`);o&&o.removeAttribute("data-dnd-droplist-state");let r=document.querySelector(`[data-dnd-container="${CSS.escape(t.id)}"]`);r&&r.removeAttribute("data-drop-state")}if(e){let o=document.querySelector(`[data-dnd-item="${CSS.escape(e.id)}"]`);if(o&&o.setAttribute("data-dnd-droplist-state",e.position??""),e.position==="inside"){let r=document.querySelector(`[data-dnd-container="${CSS.escape(e.id)}"]`);r&&r.setAttribute("data-drop-state","inside")}}}var d=null;function M(t){d=t}function U(t){return d!=null&&d===t}var a=new Map;function u(t,e){let o=document.querySelector(`[data-dnd-item="${CSS.escape(t)}"]`);o&&(e?o.setAttribute("aria-checked","true"):o.removeAttribute("aria-checked"))}function $(t,e){a.set(t,e),u(t,!0)}function I(t){a.delete(t),u(t,!1)}function O(){for(let t of a.keys())u(t,!1);a.clear()}function E(t){for(let e of t){let o=document.querySelector(`[data-dnd-item="${CSS.escape(e)}"]`);o&&o.setAttribute("data-dnd-dragging","")}}function L(){for(let t of document.querySelectorAll("[data-dnd-dragging]"))t.removeAttribute("data-dnd-dragging")}function N(t,e){let o=e.getBoundingClientRect();return t-o.top<o.height/2}function R(){g(n,null),n=null}function j(t){let e=n;!e&&!t||e&&t&&e.id===t.id&&e.position===t.position||(g(e,t),n=t)}export{y as a,A as b,h as c,w as d,D as e,C as f,v as g,q as h,M as i,U as j,a as k,$ as l,I as m,O as n,E as o,L as p,N as q,R as r,j as s};
2
- //# sourceMappingURL=chunk-ZQBDNEEV.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/sideboard/lib/doc-link.ts", "../src/sideboard/dnd/dnd.ts"],
4
- "sourcesContent": ["import type { AutomergeUrl, Repo } from \"@automerge/automerge-repo/slim\";\nimport { getRegistry, isLoadedPlugin } from \"@inkandswitch/patchwork-plugins\";\nimport type {\n DocLink,\n HasPatchworkMetadata,\n} from \"@inkandswitch/patchwork-filesystem\";\n\n// Resolve a bare automerge url into a DocLink by reading the doc's\n// patchwork metadata and asking its datatype for a title\nexport async function docLinkFromUrl(\n repo: Repo,\n url: AutomergeUrl\n): Promise<DocLink> {\n const handle = await repo.find<Partial<HasPatchworkMetadata>>(url);\n const doc = handle.doc();\n const type = doc?.[\"@patchwork\"]?.type ?? \"\";\n let name = \"Untitled\";\n\n if (type) {\n const registry = getRegistry(\"patchwork:datatype\");\n const datatype = registry.get(type);\n if (datatype) {\n await registry.load(datatype.id);\n if (isLoadedPlugin(datatype)) {\n name = datatype.module.getTitle(doc) || name;\n }\n }\n }\n\n return { name, type, url };\n}\n", "import { createSignal } from \"solid-js\";\nimport type { AutomergeUrl } from \"@automerge/automerge-repo/slim\";\n\nexport const [dragging, setDragging] = createSignal(false);\nexport const [copyMode, setCopyMode] = createSignal(false);\n\n// Dragging the \"new document\" button. Carries no document \u2014 on drop it asks the\n// list to open a pending-doc placeholder at the drop location instead of moving\n// anything.\nexport const NEW_DOC_DND_TYPE = \"application/x-patchwork-new-doc\";\nexport const [newDocDragging, setNewDocDragging] = createSignal(false);\n\nexport function isNewDocDrag(event: DragEvent) {\n return event.dataTransfer?.types.includes(NEW_DOC_DND_TYPE) ?? false;\n}\n\nexport type DropPosition = \"above\" | \"below\" | \"inside\" | null;\n\n// Drop target is a plain variable \u2014 not a SolidJS signal.\n// Visual state is updated via direct DOM manipulation to avoid\n// O(n) reactive updates across all items on every dragover.\nlet currentDropTarget: { id: string; position: DropPosition } | null = null;\n\nexport function getDropTarget() {\n return currentDropTarget;\n}\n\nfunction updateDropTargetDOM(\n oldTarget: { id: string; position: DropPosition } | null,\n newTarget: { id: string; position: DropPosition } | null\n) {\n if (oldTarget) {\n const item = document.querySelector(\n `[data-dnd-item=\"${CSS.escape(oldTarget.id)}\"]`\n );\n if (item) item.removeAttribute(\"data-dnd-droplist-state\");\n const container = document.querySelector(\n `[data-dnd-container=\"${CSS.escape(oldTarget.id)}\"]`\n );\n if (container) container.removeAttribute(\"data-drop-state\");\n }\n if (newTarget) {\n const item = document.querySelector(\n `[data-dnd-item=\"${CSS.escape(newTarget.id)}\"]`\n );\n if (item)\n item.setAttribute(\"data-dnd-droplist-state\", newTarget.position ?? \"\");\n if (newTarget.position === \"inside\") {\n const container = document.querySelector(\n `[data-dnd-container=\"${CSS.escape(newTarget.id)}\"]`\n );\n if (container) container.setAttribute(\"data-drop-state\", \"inside\");\n }\n }\n}\n\n// Identity for the \"did this drag start and end in the same view?\" question.\n// The answer decides move (\u2192 in-view) vs add-link (\u2192 cross-view or external).\n//\n// The tool id can't answer it: the sideboard is shown through patchwork-view's\n// *fallback* path, which never sets the `tool-id` attribute, so element.toolId\n// is null \u2014 and even when set it names the tool *type*, not the instance, so\n// two side-by-side views would collide. The <patchwork-view> element itself is\n// the instance identity. We're single-context on the web (dragstart and drop\n// run in the same window), so plain reference equality is all we need: remember\n// the origin element on dragstart, compare it on drop, clear it on dragend.\nlet dragOriginView: object | null = null;\nexport function setDragOriginView(element: object | null) {\n dragOriginView = element;\n}\nexport function isSameDragOriginView(element: object): boolean {\n return dragOriginView != null && dragOriginView === element;\n}\n\nexport type SideboardDragAndDropItem = {\n id: string;\n url: AutomergeUrl;\n type: string;\n name: string;\n source: string;\n};\n\n// Plain Map \u2014 not reactive. aria-checked is updated via DOM manipulation\n// to avoid O(n) reactive updates when selection changes.\nexport const dragstack = new Map<string, SideboardDragAndDropItem>();\n\nfunction setDragChecked(id: string, checked: boolean) {\n const el = document.querySelector(`[data-dnd-item=\"${CSS.escape(id)}\"]`);\n if (el) {\n if (checked) {\n el.setAttribute(\"aria-checked\", \"true\");\n } else {\n el.removeAttribute(\"aria-checked\");\n }\n }\n}\n\nexport function addToDragstack(id: string, item: SideboardDragAndDropItem) {\n dragstack.set(id, item);\n setDragChecked(id, true);\n}\n\nexport function removeFromDragstack(id: string) {\n dragstack.delete(id);\n setDragChecked(id, false);\n}\n\nexport function clearDragstack() {\n for (const id of dragstack.keys()) {\n setDragChecked(id, false);\n }\n dragstack.clear();\n}\n\nexport function setDragSourceItems(ids: string[]) {\n for (const id of ids) {\n const el = document.querySelector(`[data-dnd-item=\"${CSS.escape(id)}\"]`);\n if (el) el.setAttribute(\"data-dnd-dragging\", \"\");\n }\n}\n\nexport function clearDragSourceItems() {\n for (const el of document.querySelectorAll(\"[data-dnd-dragging]\")) {\n el.removeAttribute(\"data-dnd-dragging\");\n }\n}\n\nexport function isAbove(clientY: number, element: Element) {\n const rect = element.getBoundingClientRect();\n const offset = clientY - rect.top;\n return offset < rect.height / 2;\n}\n\nexport function clearDropTarget() {\n updateDropTargetDOM(currentDropTarget, null);\n currentDropTarget = null;\n}\n\nexport function setDropTarget(\n target: { id: string; position: DropPosition } | null\n) {\n // Only update if actually changed\n const current = currentDropTarget;\n if (!current && !target) return;\n if (\n current &&\n target &&\n current.id === target.id &&\n current.position === target.position\n ) {\n return;\n }\n\n updateDropTargetDOM(current, target);\n currentDropTarget = target;\n}\n"],
5
- "mappings": "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",
6
- "names": ["getRegistry", "isLoadedPlugin", "docLinkFromUrl", "repo", "url", "doc", "type", "name", "registry", "datatype", "createSignal", "dragging", "setDragging", "copyMode", "setCopyMode", "NEW_DOC_DND_TYPE", "newDocDragging", "setNewDocDragging", "isNewDocDrag", "event", "currentDropTarget", "getDropTarget", "updateDropTargetDOM", "oldTarget", "newTarget", "item", "container", "dragOriginView", "setDragOriginView", "element", "isSameDragOriginView", "dragstack", "setDragChecked", "id", "checked", "el", "addToDragstack", "removeFromDragstack", "clearDragstack", "setDragSourceItems", "ids", "clearDragSourceItems", "isAbove", "clientY", "rect", "clearDropTarget", "setDropTarget", "target", "current"]
7
- }
@@ -1,2 +0,0 @@
1
- import{b as a,c as b}from"./chunk-7KPSHWII.js";import"./chunk-DS3QVJZT.js";import"./chunk-53SB45PL.js";import"./chunk-ZQBDNEEV.js";import"./chunk-FEMULUBJ.js";import"./chunk-TCL6SLDB.js";import"./chunk-FW4363Y4.js";export{a as DocumentListPanel,b as renderDocumentListPanel};
2
- //# sourceMappingURL=document-list-panel-PAXN5JY3.js.map
@@ -1,2 +0,0 @@
1
- import{a as f,b as w,c as v,d as o,e as a}from"./chunk-6LWWNFKU.js";import{h as s,i as g,l as S}from"./chunk-53SB45PL.js";import{k as i,n as p}from"./chunk-ZQBDNEEV.js";import"./chunk-TCL6SLDB.js";import"./chunk-FW4363Y4.js";import{memo as $}from"solid-js/web";import{createComponent as e}from"solid-js/web";import{For as m,Show as u}from"solid-js";import{parseAutomergeUrl as I}from"@automerge/automerge-repo/slim";function A(l){let t=()=>{let n=s();return n&&l.element.contains(n.element)?n:null};function c(){let n=t();n&&(g(null),n.element.focus({preventScroll:!0}))}return e(u,{get when(){return t()},keyed:!0,children:n=>e(v,{get anchor(){return{x:n.x,y:n.y}},placement:"right-start",onClose:c,get children(){return e(T,{target:n,get repo(){return l.repo},get rootFolderHandle(){return l.rootFolderHandle}})}})})}function T(l){let t=l.target,c=w(t.type),n=f(r=>!r.unlisted),d=()=>i.has(t.id)&&i.size>1,h=()=>`${location.protocol}//${location.host}/#doc=${I(t.url).documentId}`;async function b(){if(!d()){t.remove();return}let r=[...i.values()].map(y=>y.url);confirm(`Remove ${r.length} items from the sidebar?`)&&(p(),await S(l.repo,l.rootFolderHandle,r))}return[e(u,{get when(){return t.createInside},get children(){return e(a,{label:"Create",get children(){return e(m,{each:n,children:r=>e(o,{onSelect:()=>t.createInside(r),get children(){return r.name}})})}})}}),e(u,{get when(){return c.length},get children(){return e(a,{label:"Open with...",get children(){return e(m,{each:c,children:r=>e(o,{onSelect:()=>t.openWith(r.id),get children(){return r.name}})})}})}}),e(a,{label:"Copy",get children(){return[e(o,{onSelect:()=>navigator.clipboard.writeText(t.url),children:"Automerge url"}),e(o,{onSelect:()=>navigator.clipboard.writeText(h()),children:"Patchwork url"}),e(u,{get when(){return c.length},get children(){return e(a,{label:"Patchwork url with...",get children(){return e(m,{each:c,children:r=>e(o,{onSelect:()=>navigator.clipboard.writeText(`${h()}&tool=${r.id}`),get children(){return r.name}})})}})}})]}}),e(o,{onSelect:()=>t.startRenaming(),children:"Rename"}),e(o,{onSelect:b,get children(){return $(()=>!!d())()?`Remove ${i.size} items`:"Remove"}})]}export{A as ItemMenu};
2
- //# sourceMappingURL=item-menu-IEK2CSM2.js.map
@@ -1,2 +0,0 @@
1
- import{t as a,u as b}from"./chunk-FRVSEOM5.js";import"./chunk-FW4363Y4.js";export{a as IsolatedDocumentArea,b as mountIsolationRoot};
2
- //# sourceMappingURL=IsolatedDocumentArea-TH3ENI3M.js.map
@@ -1,2 +0,0 @@
1
- import{a as Fe,b as B,c as j,d as ie,e as ae,f as le,g as se,h as de,i as ce,j as ue,k as me,l as fe,m as he,n as x,o as F,p as P,q as pe,r as ge,s as we,t as ve}from"./chunk-FRVSEOM5.js";import{a as M,b as _e}from"./chunk-ESMUVHPH.js";import{b as xe}from"./chunk-FW4363Y4.js";import{template as y}from"solid-js/web";import{delegateEvents as rt}from"solid-js/web";import{memo as nt}from"solid-js/web";import{setStyleProperty as it}from"solid-js/web";import{setAttribute as G}from"solid-js/web";import{effect as W}from"solid-js/web";import{getOwner as T}from"solid-js/web";import{use as R}from"solid-js/web";import{insert as _}from"solid-js/web";import{createComponent as m}from"solid-js/web";import"@inkandswitch/patchwork-elements";import{subscribe as gt}from"@inkandswitch/patchwork-providers";import{template as q}from"solid-js/web";import{delegateEvents as Pe}from"solid-js/web";import{memo as Me}from"solid-js/web";import{insert as be}from"solid-js/web";import{createComponent as O}from"solid-js/web";import{For as Be,Show as z}from"solid-js";var He=q("<div class=threepane-widgets>"),Ve=q("<div class=threepane-widgets__empty><button type=button class=threepane-widgets__add>\uFF0B Add document list"),Ne=q("<div class=threepane-widget>"),je="chee/document-list";function ye(e){let a=()=>{let l=e.rootFolderUrl(),r=e.configHandle();!l||!r||r.change(i=>{i.sidebar.widgets.push([je,l])})};return(()=>{var l=He();return be(l,O(z,{get when(){return e.ready()},get children(){return O(z,{get when(){return e.widgets().length},get fallback(){return O(z,{get when(){return Me(()=>!!e.rootFolderUrl())()&&e.configHandle()},get children(){var r=Ve(),i=r.firstChild;return i.$$click=a,r}})},get children(){return O(Be,{get each(){return e.widgets()},children:r=>(()=>{var i=Ne();return be(i,O(P,{slot:r})),i})()})}})}})),l})()}Pe(["click"]);import{template as De}from"solid-js/web";import{setAttribute as ze}from"solid-js/web";import{effect as qe}from"solid-js/web";import{insert as Se}from"solid-js/web";import{createComponent as K}from"solid-js/web";import{For as Xe,Show as Ye}from"solid-js";var Ke=De("<div class=frame-tray>"),Ge=De("<div class=frame-tray__item>");function $e(e){return K(Ye,{get when(){return e.slots().length},get children(){var a=Ke();return Se(a,K(Xe,{get each(){return F(e.slots())},children:l=>(()=>{var r=Ge();return Se(r,K(P,{slot:l})),qe(()=>ze(r,"data-tray-id",x(l))),r})()})),a}})}import{createEffect as U,createMemo as J,createSignal as v,onCleanup as k,onMount as Q,Show as C}from"solid-js";import{render as wt}from"solid-js/web";import{createDocOfDatatype2 as Qe}from"@inkandswitch/patchwork-plugins";import{getRegistry as Je}from"@inkandswitch/patchwork-plugins";function H(e){return Je("patchwork:datatype").loadWhenReady(e)}var Ze=new Set(["document-title","spacer"]),et="chee/document-list";function ke(e){return e?[[et,e]]:[]}async function Ce(e,a){let l=e.doc()?.rootFolderUrl,r=e.doc()?.tools?.threepane;if(r){(await a.find(r)).change(d=>{if(l&&!d.sidebar?.widgets?.length&&(d.sidebar.widgets=ke(l)),!d.tray)d.tray=M.slice();else{let c=F(d.tray);c.length!==d.tray.length&&(d.tray=c);let u=new Set(d.tray.map(f=>x(f)));for(let f of M)u.has(f)||(d.tray.push(f),u.add(f))}d.doctitle?.tools?.length||(d.doctitle={...d.doctitle,tools:_e.slice()})});return}let i=await H("threepane:config");if(!i){console.warn("frame: threepane:config datatype never registered");return}if(e.doc()?.tools?.threepane)return;let t=e.doc(),o=(t?.documentToolbarToolIds??[]).filter(n=>!Ze.has(n)),s=await Qe(i,a);s.change(n=>{o.length&&(n.doctitle.tools=o),n.sidebar.widgets=ke(t?.rootFolderUrl),n.tray||(n.tray=M.slice())}),e.change(n=>{n.tools||(n.tools={}),n.tools.threepane||(n.tools.threepane=s.url)})}var Re=xe(Fe(),1);import{createDocOfDatatype2 as tt}from"@inkandswitch/patchwork-plugins";var w=(0,Re.default)("patchwork:threepane:examples");async function Ie(e,a){let l=e.doc();if(!l?.rootFolderUrl){w("skipped \u2014 account has no rootFolderUrl");return}if(l.exampleDocsSeededAt){w("skipped \u2014 already ran for this account at",new Date(l.exampleDocsSeededAt).toISOString());return}w("claiming marker on account",e.url),e.change(c=>{c.exampleDocsSeededAt||(c.exampleDocsSeededAt=Date.now())});let r=await a.find(l.rootFolderUrl),i=r.doc()?.docs?.length??0;if(i){w(`skipped \u2014 root folder already has ${i} doc(s); only fresh accounts are seeded`);return}let t=window.location.hostname.includes("gaios"),o=t?[]:await ot();if(w(t?"gaios examples":"bundle init scripts:",o),!t&&!o.length){w("skipped \u2014 no static module bundles to ask");return}let s=await H("folder");if(!s){w("folder datatype never registered; giving up");return}let n=await tt(s,a,c=>{c.title="Examples"});if(t){let{seedGaiosExamples:c}=await import("./gaiosExamples-YDNQB35L.js");await c(a,n)}for(let c of o)try{await(await import(c)).default?.(a,n),w("ran init script",c)}catch(u){w("init script unavailable or failed",c,u)}let d=n.doc()?.docs?.length??0;if(!d){w("no bundle contributed any documents");return}r.change(c=>{c.docs.unshift({name:"Examples",type:"folder",url:n.url})}),w(`seeded ${d} document(s) into Examples folder`,n.url)}var Ee="https://patchwork-tools.netlify.app/init.js",Te="https://patchwork-base.netlify.app/init.js";async function ot(){let e=window.patchwork?.packages;if(!e?.urls)return[Te,Ee];await e.doneLoading;let a=Object.values(e.urls).filter(r=>typeof r=="string"&&!r.startsWith("automerge:")).map(r=>new URL("init.js",new URL(r,document.baseURI)).href),l=a.length?[]:[Te];return[...new Set([...a,...l,Ee])]}var at=y("<div class=frame-shell><aside class=frame-warning-banner>research grade software. do not share links. sharing a doc is sharing your account.</aside><div class=frame><patchwork-view component=patchwork-selected-doc-provider><patchwork-view component=patchwork-account-provider><patchwork-view component=patchwork-tool-storage-provider><patchwork-view component=patchwork-worker-provider>",!0,!1,!1),lt=y("<div style=display:contents>"),st=y("<div class=main-area>"),dt=y("<div class=frame__popover-backdrop><div class=frame__popover role=dialog aria-modal=true><div class=frame__popover-toolbar><patchwork-view tool-id=doc-openwith></patchwork-view></div><div class=frame__popover-body><patchwork-view>",!0,!1,!1),ct=y('<button type=button class="frame__sidebar-toggle frame__left-toggle">'),ut=y("<div class=threepane-sidebar><div class=threepane-sidebar__footer><footer class=threepane-account-bar><button type=button class=threepane-account-bar__button>Settings"),mt=y("<div class=frame__tray-dock>"),ft=y('<button type=button class="threepane-account-bar__button threepane-account-bar__avatar"title=Account aria-label=Account><patchwork-view tool-id=contact-avatar>',!0,!1,!1),ht=y("<button type=button class=threepane-account-bar__button>Packages"),pt=y('<svg xmlns=http://www.w3.org/2000/svg width=18 height=18 viewBox="0 0 24 24"fill=none stroke=var(--studio-chrome-line) stroke-width=1.75 stroke-linecap=round stroke-linejoin=round><rect width=18 height=18 x=3 y=3 rx=2></rect><path d="M9 3v18">'),vt=180,_t=720,bt=120,yt=3,X=(e,a)=>{let[l,r]=v(!1);return U(()=>{let i=a();if(!i)return;r(!1);let t=o=>{o.detail?.componentId===e&&r(!0)};i.addEventListener("patchwork:mounted",t),k(()=>i.removeEventListener("patchwork:mounted",t))}),l};function Y(e,a){e.dispatchEvent(new CustomEvent("patchwork:open-document",{detail:a,bubbles:!0,composed:!0}))}function St({handle:e,repo:a,...l}){we();let r=e.url,[i,t]=v(),o=X("patchwork-account-provider",i),[s,n]=v(),d=X("patchwork-tool-storage-provider",s),[c,u]=v(),f=X("patchwork-selected-doc-provider",c),g=J(()=>f()&&o()&&d());return(()=>{var S=at(),p=S.firstChild,Z=p.firstChild,V=p.nextSibling,L=V.firstChild,I=L.firstChild,D=I.firstChild,A=D.firstChild;return _(p,m(C,{get when(){return l.isolation},get children(){return[" ","isolation is highly experimental. if things are broken, switch back to wild west."]}}),null),R(u,L),L._$owner=T(),R(t,I),I.docUrl=r,I._$owner=T(),R(n,D),D.docUrl=r,D._$owner=T(),A._$owner=T(),_(A,m(C,{get when(){return g()},get children(){return m(Dt,{handle:e,repo:a,get isolation(){return l.isolation}})}})),S})()}function Dt(e){let a=B(()=>e.handle.url,{repo:e.repo});(async()=>{await Ce(e.handle,e.repo),await Ie(e.handle,e.repo)})().catch(h=>{console.error("frame: account bootstrap failed",h)});let[l,r]=v(0);U(()=>{let h=a();if(!h)return;let b=()=>r($=>$+1);h.on("change",b),k(()=>h.off("change",b))});let i=J(()=>(l(),a()?.doc())),t=e.handle.url,o=()=>i()?.tools?.threepane,s=B(()=>o(),{repo:e.repo}),[n,d]=v(0);U(()=>{let h=s();if(!h)return;let b=()=>d($=>$+1);h.on("change",b),k(()=>h.off("change",b))});let c=J(()=>(n(),s()?.doc())),u=()=>c()?.doctitle?.tools,f=()=>c()?.sidebar?.widgets??[],g=()=>c()?.tray??[],S=()=>i()?.rootFolderUrl,p=de(),Z=ce({setLeftSidebarWidth:p.setLeftSidebarWidth,setRightSidebarWidth:p.setRightSidebarWidth,setIsSidebarCollapsed:p.setIsSidebarCollapsed,setIsRightSidebarCollapsed:p.setIsRightSidebarCollapsed,isLeftCollapsed:p.isSidebarCollapsed,isRightCollapsed:p.isRightSidebarCollapsed,minWidth:vt,maxWidth:_t,autoCloseWidth:bt,dragThreshold:yt}),{events:V,dismissEvent:L,clearAll:I}=me(),D,[A,Ue]=v(null),[Le,ee]=v(null);Q(()=>{let h=gt(D,{type:"patchwork:selected-view"},b=>Ue(b));k(h)});let E=()=>A()?.url,N=()=>A()?.toolId??void 0,te=()=>le(j.rightWidth,ae),oe=()=>se(j.rightCollapsed),[Ae,re]=v(),Oe=ue(Ae,E),[ne,We]=v(!1);return U(()=>{ne()||(e.isolation||!E()||Oe())&&We(!0)}),(()=>{var h=lt(),b=D;return typeof b=="function"?R(b,h):D=h,_(h,m(fe,{get events(){return V()},onDismiss:L,onClearAll:I}),null),_(h,m(kt,{accountDocUrl:t,sidebarState:p,sidebarResize:Z,sidebarWidgets:f,traySlots:g,configHandle:s,rootFolderUrl:S,widgetsReady:ne,contactUrl:()=>i()?.contactUrl,moduleSettingsUrl:()=>i()?.moduleSettingsUrl,get isolation(){return e.isolation},onInterceptOpen:ee,get children(){return m(C,{get when(){return E()},get fallback(){return(()=>{var $=st();return _($,m(pe,{viewKey:E,selectedDocUrl:E,toolId:N,ref:re})),$})()},get children(){return m(C,{get when(){return e.isolation},get fallback(){return m(ge,{setMainDocElement:re,selectedDocUrl:E,selectedToolId:N,doctitleSlots:u,get isLeftCollapsed(){return p.isSidebarCollapsed},initialRightWidth:te,initialRightCollapsed:oe})},get children(){return m(ve,{get contactUrl(){return i()?.contactUrl},selectedDocUrl:E,selectedToolId:N,doctitleSlots:u,get isLeftCollapsed(){return p.isSidebarCollapsed},initialRightWidth:te,initialRightCollapsed:oe})}})}})}}),null),_(h,m(C,{get when(){return Le()},children:$=>m($t,{get view(){return $()},onClose:()=>ee(null)})}),null),h})()}function $t(e){let[a,l]=v(e.view.toolId??void 0);U(()=>l(e.view.toolId??void 0));let r;return Q(()=>{let i=s=>{s.key==="Escape"&&e.onClose()};window.addEventListener("keydown",i),k(()=>window.removeEventListener("keydown",i));let t=r;if(!t)return;let o=s=>{let{url:n,toolId:d}=s.detail;n&&(s.stopPropagation(),l(d??void 0))};t.addEventListener("patchwork:open-document",o),k(()=>t.removeEventListener("patchwork:open-document",o))}),(()=>{var i=dt(),t=i.firstChild,o=t.firstChild,s=o.firstChild,n=o.nextSibling,d=n.firstChild;i.$$click=()=>e.onClose(),t.$$click=u=>u.stopPropagation();var c=r;return typeof c=="function"?R(c,t):r=t,s._$owner=T(),d._$owner=T(),W(u=>{var f=e.view.url,g=e.view.url,S=a();return f!==u.e&&(s.docUrl=u.e=f),g!==u.t&&(d.docUrl=u.t=g),S!==u.a&&(d.toolId=u.a=S),u},{e:void 0,t:void 0,a:void 0}),i})()}function kt(e){let a=e.sidebarState.isSidebarCollapsed,l=()=>e.traySlots().length>0,r;Q(()=>{if(!e.isolation||!r)return;let t=r,o=s=>{let{url:n,toolId:d}=s.detail;n&&(s.stopPropagation(),e.onInterceptOpen?.({url:n,toolId:d??null}))};t.addEventListener("patchwork:open-document",o),k(()=>t.removeEventListener("patchwork:open-document",o))});let i;return U(()=>{if(e.sidebarState.isSidebarCollapsed())return;let t=i;if(!t)return;let o=()=>{t.getBoundingClientRect().width<=window.innerWidth*.75||(e.sidebarState.setIsSidebarCollapsed(!0),window.dispatchEvent(new CustomEvent(ie)))};t.addEventListener("patchwork:open-document",o),k(()=>t.removeEventListener("patchwork:open-document",o))}),[(()=>{var t=ct();return t.$$click=()=>e.sidebarState.setIsSidebarCollapsed(o=>!o),_(t,m(Ct,{})),W(o=>{var s=a()?"Show sidebar":"Hide sidebar",n=a()?"Show sidebar":"Hide sidebar",d=!a();return s!==o.e&&G(t,"title",o.e=s),n!==o.t&&G(t,"aria-label",o.t=n),d!==o.a&&G(t,"aria-pressed",o.a=d),o},{e:void 0,t:void 0,a:void 0}),t})(),m(he,{side:"left",isCollapsed:a,get width(){return e.sidebarState.leftSidebarWidth},get onMouseDown(){return e.sidebarResize.handleMouseDown},get onToggleClick(){return e.sidebarResize.handleToggleClick},get children(){var t=ut(),o=t.firstChild,s=o.firstChild,n=s.firstChild,d=i;typeof d=="function"?R(d,t):i=t,_(t,m(ye,{get widgets(){return e.sidebarWidgets},get configHandle(){return e.configHandle},get rootFolderUrl(){return e.rootFolderUrl},get ready(){return e.widgetsReady}}),o);var c=r;return typeof c=="function"?R(c,o):r=o,_(s,m(C,{get when(){return e.contactUrl()},children:u=>(()=>{var f=ft(),g=f.firstChild;return f.$$click=S=>Y(S.currentTarget,{url:e.accountDocUrl,toolId:"account-picker"}),g._$owner=T(),W(()=>g.docUrl=u()),f})()}),n),_(s,m(C,{get when(){return e.moduleSettingsUrl()},children:u=>(()=>{var f=ht();return f.$$click=g=>Y(g.currentTarget,{url:u(),toolId:"packages"}),f})()}),n),n.$$click=u=>Y(u.currentTarget,{url:e.accountDocUrl,toolId:"frame-configurator"}),W(()=>t.classList.toggle("threepane-sidebar--has-tray",!!l())),t}}),m(C,{get when(){return l()},get children(){var t=mt();return _(t,m($e,{get slots(){return e.traySlots}})),W(o=>{var s=!!a(),n=`${e.sidebarState.leftSidebarWidth()}px`;return s!==o.e&&t.classList.toggle("frame__tray-dock--collapsed",o.e=s),n!==o.t&&it(t,"width",o.t=n),o},{e:void 0,t:void 0}),t}}),nt(()=>e.children)]}function Ct(){return pt()}function ko(e){return(a,l)=>wt(()=>m(St,{handle:a,get repo(){return l.repo},isolation:e}),l)}rt(["click"]);export{St as PatchworkFrame,ko as renderPatchworkFrame};
2
- //# sourceMappingURL=PatchworkFrame-WMZ3SLEE.js.map