@inkandswitch/patchwork-pkg-base 0.0.63 → 0.0.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/packages/sideboard/dist/account-bar-KGTVEYOE.js +2 -0
- package/packages/sideboard/dist/chunk-6LWWNFKU.js +2 -0
- package/packages/sideboard/dist/chunk-6LWWNFKU.js.map +7 -0
- package/packages/sideboard/dist/chunk-KHS2XJKP.js +15 -0
- package/packages/sideboard/dist/chunk-KHS2XJKP.js.map +7 -0
- package/packages/sideboard/dist/chunk-LJ5XCENG.js +2 -0
- package/packages/sideboard/dist/chunk-LJ5XCENG.js.map +7 -0
- package/packages/sideboard/dist/chunk-NO6SJFVH.js +2 -0
- package/packages/sideboard/dist/chunk-NO6SJFVH.js.map +7 -0
- package/packages/sideboard/dist/chunk-TCL6SLDB.js +2 -0
- package/packages/sideboard/dist/chunk-TCL6SLDB.js.map +7 -0
- package/packages/sideboard/dist/chunk-TXFTRSLY.js +13 -0
- package/packages/sideboard/dist/chunk-TXFTRSLY.js.map +7 -0
- package/packages/sideboard/dist/chunk-V62KH27A.js +2 -0
- package/packages/sideboard/dist/{chunk-52EOIDIA.js.map → chunk-V62KH27A.js.map} +2 -2
- package/packages/sideboard/dist/chunk-ZQBDNEEV.js +2 -0
- package/packages/sideboard/dist/chunk-ZQBDNEEV.js.map +7 -0
- package/packages/sideboard/dist/create-new-menu-EU5KJJ3R.js +2 -0
- package/packages/sideboard/dist/create-new-menu-EU5KJJ3R.js.map +7 -0
- package/packages/sideboard/dist/document-list-panel-WDIVYTZU.js +2 -0
- package/packages/sideboard/dist/index.css +1 -1
- package/packages/sideboard/dist/index.css.map +2 -2
- package/packages/sideboard/dist/index.js +1 -1
- package/packages/sideboard/dist/item-menu-N2ATUOK3.js +2 -0
- package/packages/sideboard/dist/item-menu-N2ATUOK3.js.map +7 -0
- package/packages/sideboard/dist/sideboard/sideboard.js +1 -1
- package/packages/sideboard/dist/sideboard/sideboard.js.map +2 -2
- package/packages/sideboard/package.json +5 -6
- package/packages/sideboard/dist/account-bar-6B65GY2V.js +0 -2
- package/packages/sideboard/dist/chunk-52EOIDIA.js +0 -2
- package/packages/sideboard/dist/chunk-G7U5YDCS.js +0 -2
- package/packages/sideboard/dist/chunk-G7U5YDCS.js.map +0 -7
- package/packages/sideboard/dist/chunk-NPZBYDER.js +0 -26
- package/packages/sideboard/dist/chunk-NPZBYDER.js.map +0 -7
- package/packages/sideboard/dist/document-list-panel-44RR5PWX.js +0 -2
- /package/packages/sideboard/dist/{account-bar-6B65GY2V.js.map → account-bar-KGTVEYOE.js.map} +0 -0
- /package/packages/sideboard/dist/{document-list-panel-44RR5PWX.js.map → document-list-panel-WDIVYTZU.js.map} +0 -0
package/package.json
CHANGED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{getRegistry as w,getSupportedToolsForType as D}from"@inkandswitch/patchwork-plugins";import{createEffect as T,createRoot as C,onCleanup as g}from"solid-js";import{createStore as h,reconcile as v}from"solid-js/store";function ee(n){let t=w("patchwork:datatype"),[r,i]=h(t.filter(n)),o=t.on("changed",()=>i(v(t.filter(n))));return g(o),r}function M(n){let t=new Map;return r=>{if(!t.has(r)){let o,s=C(a=>(o=a,n(r)));t.set(r,{value:s,refCount:0,dispose:o})}let i=t.get(r);return i.refCount++,g(()=>{i.refCount--,i.refCount===0&&(i.dispose(),t.delete(r))}),i.value}}var R=M(n=>{let t=w("patchwork:tool"),[r,i]=h([]),o=()=>{let a=D(n);i(v(a))};o();let s=t.on("changed",o);return g(s),r});function te(n,t){let r=typeof n=="function"?n():n,i=R(r);if(t?.includeUnlisted)return i;let[o,s]=h([]);return T(()=>{s(v(i.filter(a=>!a.unlisted)))}),o}import{template as b}from"solid-js/web";import{delegateEvents as E}from"solid-js/web";import{setAttribute as S}from"solid-js/web";import{spread as A}from"solid-js/web";import{mergeProps as O}from"solid-js/web";import{createComponent as f}from"solid-js/web";import{setStyleProperty as F}from"solid-js/web";import{className as I}from"solid-js/web";import{effect as k}from"solid-js/web";import{insert as $}from"solid-js/web";import{use as P}from"solid-js/web";import{createContext as L,createSignal as N,createUniqueId as q,onCleanup as B,onMount as G,Show as W,splitProps as z,useContext as x}from"solid-js";import{Portal as K}from"solid-js/web";var U=b("<div role=menu tabindex=-1 data-expanded style=position:fixed>"),V=b("<div role=menuitem tabindex=-1 class=popmenu__item>"),H=b("<div role=menuitem aria-haspopup=menu tabindex=-1 class=popmenu__sub-trigger>"),y=2,p=4,m=L(),j='[role="menuitem"]:not([aria-disabled="true"])';function _(n){return[...n.querySelectorAll(j)]}function J(n,t,r){let i="width"in t?t:new DOMRect(t.x,t.y,0,0),{width:o,height:s}=n.getBoundingClientRect(),a=r==="right-start"?i.right+y:i.left,e=r==="right-start"?i.top:i.bottom+y;a+o>innerWidth-p&&(a=r==="right-start"?i.left-o-y:innerWidth-p-o),e+s>innerHeight-p&&(e=innerHeight-p-s),n.style.left=`${Math.max(p,a)}px`,n.style.top=`${Math.max(p,e)}px`}function Q(n){let t=x(m),[r,i]=N(null),o,s={closeRoot:t?.closeRoot??n.onClose,openSub:r,setOpenSub:i,depth:(t?.depth??-1)+1};G(()=>{J(o,n.anchor,n.placement??"bottom-start"),n.autofocus!==!1&&o.focus({preventScroll:!0});let e=u=>{u.target?.closest?.('[role="menu"]')||s.closeRoot()};document.addEventListener("pointerdown",e,!0),B(()=>document.removeEventListener("pointerdown",e,!0))});function a(e){if(e.target!==o&&!_(o).includes(e.target)){e.key==="Escape"&&s.closeRoot();return}let u=_(o),c=u.indexOf(document.activeElement),l=d=>u.at((d%u.length+u.length)%u.length)?.focus();switch(e.key){case"Escape":s.closeRoot();break;case"ArrowDown":l(c+1);break;case"ArrowUp":l(c<0?-1:c-1);break;case"Home":l(0);break;case"End":l(-1);break;case"ArrowLeft":t&&t.setOpenSub(null);break;case"Enter":case" ":c>=0&&u[c].click();break;default:return}e.preventDefault(),e.stopPropagation()}return f(K,{get children(){return f(m.Provider,{value:s,get children(){var e=U();e.$$focusout=c=>c.target.removeAttribute("data-highlighted"),e.$$focusin=c=>c.target.setAttribute("data-highlighted",""),e.$$keydown=a;var u=o;return typeof u=="function"?P(u,e):o=e,$(e,()=>n.children),k(c=>{var l=n.class??"popmenu__content",d=2+s.depth;return l!==c.e&&I(e,c.e=l),d!==c.t&&F(e,"z-index",c.t=d),c},{e:void 0,t:void 0}),e}})}})}function he(n){let t=x(m),[r,i]=z(n,["onSelect","children","onPointerMove"]);return(()=>{var o=V();return A(o,O(i,{onPointerMove:s=>{s.currentTarget.focus(),t.setOpenSub(null),typeof r.onPointerMove=="function"&&r.onPointerMove(s)},onClick:()=>{r.onSelect(),t.closeRoot()}}),!1,!0),$(o,()=>r.children),o})()}function ve(n){let t=x(m),r=q(),i,o=()=>t.openSub()===r;return[(()=>{var s=H();s.$$keydown=e=>{e.key!=="ArrowRight"&&e.key!=="Enter"&&e.key!==" "||(t.setOpenSub(r),e.preventDefault(),e.stopPropagation())},s.$$click=()=>t.setOpenSub(r),s.$$pointermove=e=>{e.currentTarget.focus(),t.setOpenSub(r)};var a=i;return typeof a=="function"?P(a,s):i=s,$(s,()=>n.label),k(e=>{var u=o(),c=o()?"":void 0;return u!==e.e&&S(s,"aria-expanded",e.e=u),c!==e.t&&S(s,"data-expanded",e.t=c),e},{e:void 0,t:void 0}),s})(),f(W,{get when(){return o()},get children(){return f(Q,{get anchor(){return i.getBoundingClientRect()},placement:"right-start",class:"popmenu__sub-content",onClose:()=>{t.setOpenSub(null),i.focus()},get children(){return n.children}})}})]}E(["keydown","focusin","focusout","pointermove","click"]);export{ee as a,te as b,Q as c,he as d,ve as e};
|
|
2
|
+
//# sourceMappingURL=chunk-6LWWNFKU.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/sideboard/lib/solid-plugins.ts", "../src/sideboard/popmenu.tsx"],
|
|
4
|
+
"sourcesContent": ["import type {\n ToolDescription,\n DatatypeDescription,\n Plugin,\n} from \"@inkandswitch/patchwork-plugins\";\nimport {\n getRegistry,\n getSupportedToolsForType,\n} from \"@inkandswitch/patchwork-plugins\";\nimport { createEffect, createRoot, onCleanup } from \"solid-js\";\nimport { createStore, reconcile } from \"solid-js/store\";\n\nexport type MaybeAccessor<T> = T | (() => T);\n\n/**\n * Hook to get filtered datatype plugins\n */\nexport function useFilteredDatatypes(\n filter: (item: DatatypeDescription) => boolean\n): Plugin<DatatypeDescription>[] {\n const datatypeRegistry =\n getRegistry<DatatypeDescription>(\"patchwork:datatype\");\n const [plugins, setPlugins] = createStore(datatypeRegistry.filter(filter));\n const dispose = datatypeRegistry.on(\"changed\", () =>\n setPlugins(reconcile(datatypeRegistry.filter(filter)))\n );\n onCleanup(dispose);\n return plugins;\n}\n\n/**\n * Create a ref-counted shared reactive resource keyed by a string.\n * The factory runs once per unique key (inside its own reactive root).\n * When the last consumer unmounts, the root is disposed and the\n * entry is removed from the cache.\n */\nfunction createShared<V>(factory: (key: string) => V): (key: string) => V {\n const cache = new Map<\n string,\n { value: V; refCount: number; dispose: () => void }\n >();\n\n return (key: string) => {\n if (!cache.has(key)) {\n let dispose!: () => void;\n const value = createRoot((d) => {\n dispose = d;\n return factory(key);\n });\n cache.set(key, { value, refCount: 0, dispose });\n }\n\n const entry = cache.get(key)!;\n entry.refCount++;\n onCleanup(() => {\n entry.refCount--;\n if (entry.refCount === 0) {\n entry.dispose();\n cache.delete(key);\n }\n });\n\n return entry.value;\n };\n}\n\nconst useSharedToolsForType = createShared((type) => {\n const toolRegistry = getRegistry<ToolDescription>(\"patchwork:tool\");\n const [plugins, setPlugins] = createStore<Plugin<ToolDescription>[]>([]);\n\n const update = () => {\n const tools = getSupportedToolsForType(type);\n setPlugins(reconcile(tools));\n };\n update();\n\n const dispose = toolRegistry.on(\"changed\", update);\n onCleanup(dispose);\n\n return plugins;\n});\n\n/**\n * Hook to get tools that support a specific data type.\n * Shared across all callers for the same type \u2014 only one\n * store/listener exists per unique type string.\n */\nexport function useSupportedToolsForType(\n type: MaybeAccessor<string>,\n options?: { includeUnlisted?: boolean }\n): Plugin<ToolDescription>[] {\n const key = typeof type === \"function\" ? type() : type;\n const all = useSharedToolsForType(key);\n if (options?.includeUnlisted) return all;\n const [filtered, setFiltered] = createStore<Plugin<ToolDescription>[]>([]);\n createEffect(() => {\n setFiltered(reconcile(all.filter((t) => !t.unlisted)));\n });\n return filtered;\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 { spread as _$spread } from \"solid-js/web\";\nimport { mergeProps as _$mergeProps } from \"solid-js/web\";\nimport { createComponent as _$createComponent } from \"solid-js/web\";\nimport { setStyleProperty as _$setStyleProperty } from \"solid-js/web\";\nimport { className as _$className } from \"solid-js/web\";\nimport { effect as _$effect } from \"solid-js/web\";\nimport { insert as _$insert } from \"solid-js/web\";\nimport { use as _$use } from \"solid-js/web\";\nvar _tmpl$ = /*#__PURE__*/_$template(`<div role=menu tabindex=-1 data-expanded style=position:fixed>`),\n _tmpl$2 = /*#__PURE__*/_$template(`<div role=menuitem tabindex=-1 class=popmenu__item>`),\n _tmpl$3 = /*#__PURE__*/_$template(`<div role=menuitem aria-haspopup=menu tabindex=-1 class=popmenu__sub-trigger>`);\nimport { createContext, createSignal, createUniqueId, onCleanup, onMount, Show, splitProps, useContext } from \"solid-js\";\nimport { Portal } from \"solid-js/web\";\nconst GUTTER = 2;\nconst MARGIN = 4;\nconst Ctx = createContext();\nconst ITEMS = '[role=\"menuitem\"]:not([aria-disabled=\"true\"])';\nfunction ownItems(menu) {\n return [...menu.querySelectorAll(ITEMS)];\n}\nfunction position(el, anchor, placement) {\n const a = \"width\" in anchor ? anchor : new DOMRect(anchor.x, anchor.y, 0, 0);\n const {\n width,\n height\n } = el.getBoundingClientRect();\n let left = placement === \"right-start\" ? a.right + GUTTER : a.left;\n let top = placement === \"right-start\" ? a.top : a.bottom + GUTTER;\n if (left + width > innerWidth - MARGIN) {\n left = placement === \"right-start\" ? a.left - width - GUTTER : innerWidth - MARGIN - width;\n }\n if (top + height > innerHeight - MARGIN) top = innerHeight - MARGIN - height;\n el.style.left = `${Math.max(MARGIN, left)}px`;\n el.style.top = `${Math.max(MARGIN, top)}px`;\n}\nexport function Menu(props) {\n const parent = useContext(Ctx);\n const [openSub, setOpenSub] = createSignal(null);\n let el;\n const ctx = {\n closeRoot: parent?.closeRoot ?? props.onClose,\n openSub,\n setOpenSub,\n depth: (parent?.depth ?? -1) + 1\n };\n onMount(() => {\n position(el, props.anchor, props.placement ?? \"bottom-start\");\n if (props.autofocus !== false) el.focus({\n preventScroll: true\n });\n const onPointerDown = e => {\n const t = e.target;\n if (t?.closest?.('[role=\"menu\"]')) return;\n ctx.closeRoot();\n };\n document.addEventListener(\"pointerdown\", onPointerDown, true);\n onCleanup(() => document.removeEventListener(\"pointerdown\", onPointerDown, true));\n });\n function onKeyDown(e) {\n if (e.target !== el && !ownItems(el).includes(e.target)) {\n if (e.key === \"Escape\") ctx.closeRoot();\n return;\n }\n const items = ownItems(el);\n const i = items.indexOf(document.activeElement);\n const focus = n => items.at((n % items.length + items.length) % items.length)?.focus();\n switch (e.key) {\n case \"Escape\":\n ctx.closeRoot();\n break;\n case \"ArrowDown\":\n focus(i + 1);\n break;\n case \"ArrowUp\":\n focus(i < 0 ? -1 : i - 1);\n break;\n case \"Home\":\n focus(0);\n break;\n case \"End\":\n focus(-1);\n break;\n case \"ArrowLeft\":\n if (parent) parent.setOpenSub(null);\n break;\n case \"Enter\":\n case \" \":\n if (i >= 0) items[i].click();\n break;\n default:\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n }\n return _$createComponent(Portal, {\n get children() {\n return _$createComponent(Ctx.Provider, {\n value: ctx,\n get children() {\n var _el$ = _tmpl$();\n _el$.$$focusout = e => e.target.removeAttribute(\"data-highlighted\");\n _el$.$$focusin = e => e.target.setAttribute(\"data-highlighted\", \"\");\n _el$.$$keydown = onKeyDown;\n var _ref$ = el;\n typeof _ref$ === \"function\" ? _$use(_ref$, _el$) : el = _el$;\n _$insert(_el$, () => props.children);\n _$effect(_p$ => {\n var _v$ = props.class ?? \"popmenu__content\",\n _v$2 = 2 + ctx.depth;\n _v$ !== _p$.e && _$className(_el$, _p$.e = _v$);\n _v$2 !== _p$.t && _$setStyleProperty(_el$, \"z-index\", _p$.t = _v$2);\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n }\n });\n }\n });\n}\nexport function MenuItem(props) {\n const ctx = useContext(Ctx);\n const [local, rest] = splitProps(props, [\"onSelect\", \"children\", \"onPointerMove\"]);\n return (() => {\n var _el$2 = _tmpl$2();\n _$spread(_el$2, _$mergeProps(rest, {\n \"onPointerMove\": e => {\n e.currentTarget.focus();\n ctx.setOpenSub(null);\n if (typeof local.onPointerMove === \"function\") local.onPointerMove(e);\n },\n \"onClick\": () => {\n local.onSelect();\n ctx.closeRoot();\n }\n }), false, true);\n _$insert(_el$2, () => local.children);\n return _el$2;\n })();\n}\nexport function SubMenu(props) {\n const ctx = useContext(Ctx);\n const id = createUniqueId();\n let trigger;\n const open = () => ctx.openSub() === id;\n return [(() => {\n var _el$3 = _tmpl$3();\n _el$3.$$keydown = e => {\n if (e.key !== \"ArrowRight\" && e.key !== \"Enter\" && e.key !== \" \") return;\n ctx.setOpenSub(id);\n e.preventDefault();\n e.stopPropagation();\n };\n _el$3.$$click = () => ctx.setOpenSub(id);\n _el$3.$$pointermove = e => {\n e.currentTarget.focus();\n ctx.setOpenSub(id);\n };\n var _ref$2 = trigger;\n typeof _ref$2 === \"function\" ? _$use(_ref$2, _el$3) : trigger = _el$3;\n _$insert(_el$3, () => props.label);\n _$effect(_p$ => {\n var _v$3 = open(),\n _v$4 = open() ? \"\" : void 0;\n _v$3 !== _p$.e && _$setAttribute(_el$3, \"aria-expanded\", _p$.e = _v$3);\n _v$4 !== _p$.t && _$setAttribute(_el$3, \"data-expanded\", _p$.t = _v$4);\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$3;\n })(), _$createComponent(Show, {\n get when() {\n return open();\n },\n get children() {\n return _$createComponent(Menu, {\n get anchor() {\n return trigger.getBoundingClientRect();\n },\n placement: \"right-start\",\n \"class\": \"popmenu__sub-content\",\n onClose: () => {\n ctx.setOpenSub(null);\n trigger.focus();\n },\n get children() {\n return props.children;\n }\n });\n }\n })];\n}\n_$delegateEvents([\"keydown\", \"focusin\", \"focusout\", \"pointermove\", \"click\"]);"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["getRegistry", "getSupportedToolsForType", "createEffect", "createRoot", "onCleanup", "createStore", "reconcile", "useFilteredDatatypes", "filter", "datatypeRegistry", "plugins", "setPlugins", "dispose", "createShared", "factory", "cache", "key", "value", "d", "entry", "useSharedToolsForType", "type", "toolRegistry", "update", "tools", "useSupportedToolsForType", "options", "all", "filtered", "setFiltered", "t", "_$template", "_$delegateEvents", "_$setAttribute", "_$spread", "_$mergeProps", "_$createComponent", "_$setStyleProperty", "_$className", "_$effect", "_$insert", "_$use", "createContext", "createSignal", "createUniqueId", "onCleanup", "onMount", "Show", "splitProps", "useContext", "Portal", "_tmpl$", "_tmpl$2", "_tmpl$3", "GUTTER", "MARGIN", "Ctx", "ITEMS", "ownItems", "menu", "position", "el", "anchor", "placement", "a", "width", "height", "left", "top", "Menu", "props", "parent", "openSub", "setOpenSub", "ctx", "onPointerDown", "e", "onKeyDown", "items", "i", "focus", "n", "_el$", "_ref$", "_p$", "_v$", "_v$2", "MenuItem", "local", "rest", "_el$2", "SubMenu", "id", "trigger", "open", "_el$3", "_ref$2", "_v$3", "_v$4"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import{a as Te,b as ae,c as Ie,d as Ae}from"./chunk-TXFTRSLY.js";import{a as B,b as A,c as J,d as _e,e as U,f as ve,g as oe,h as be,i as Fe,j as T,k as H}from"./chunk-NO6SJFVH.js";import{b as ie,c as L,d as G,g as N,h as Q,i as le,j as R,k as $,l as V,m as Z,n as Y,o as $e,p as Ee,q as Se,r as P,s as ee}from"./chunk-ZQBDNEEV.js";import{b as z,c as Le}from"./chunk-LJ5XCENG.js";import{template as ir}from"solid-js/web";import{delegateEvents as lr}from"solid-js/web";import{insert as xe}from"solid-js/web";import{effect as rt}from"solid-js/web";import{createComponent as k}from"solid-js/web";import{use as dr}from"solid-js/web";import{createEffect as cr,createMemo as ur,createSelector as mr,createSignal as nt,lazy as fr,onCleanup as ot,Show as at,Suspense as gr}from"solid-js";import{render as hr}from"solid-js/web";async function de(e,o,i,m,g){if(g.has(o))return!1;let u=new Set(g);u.add(o);let s;try{s=(await e.find(o)).doc()}catch{return!1}if(!s?.docs)return!1;let h=s.docs.some(l=>i.has(l.url));return(await Promise.all(s.docs.filter(l=>l.type==="folder").map(l=>de(e,l.url,i,m,u)))).some(Boolean)&&(h=!0),h&&m.add(o),h}import{template as we}from"solid-js/web";import{effect as qt}from"solid-js/web";import{memo as We}from"solid-js/web";import{insert as pe}from"solid-js/web";import{createComponent as E}from"solid-js/web";import{deleteAt as Wt,updateText as je}from"@automerge/automerge-repo/slim";import{getRegistry as Xe,isLoadedPlugin as jt}from"@inkandswitch/patchwork-plugins";import{createEffect as ze,createMemo as Xt,createSignal as zt,For as Jt,lazy as Gt,Match as Je,onCleanup as Ge,Show as ye,Suspense as Qt,Switch as Zt,untrack as Qe}from"solid-js";import{template as Ye}from"solid-js/web";import{style as Oe}from"solid-js/web";import{setAttribute as X}from"solid-js/web";import{effect as qe}from"solid-js/web";import{insert as ge}from"solid-js/web";import{createComponent as M}from"solid-js/web";import{addEventListener as Ct}from"solid-js/web";import"solid-js/web";import{updateText as Rt}from"@automerge/automerge-repo/slim";async function K(e,o,i,m,g){for(let u of Array.from(e))try{let s=await u.arrayBuffer(),h=new Uint8Array(s),y=u.name.split("."),l=y.length>1?y.pop():"",c=y.join("."),D=await i.create2({"@patchwork":{type:"file"},content:h,extension:l,mimeType:u.type||"application/octet-stream",name:c}),x=m==="above"?g:m==="below"?g+1:0;o.change(_=>{_.docs.splice(x,0,{url:D.url,name:u.name,type:"file"})}),T("FileDrop: Created file document:",u.name,D.url)}catch(s){T("FileDrop: Failed to create file document:",s)}}import{createEffect as Be,createSignal as Ht,onCleanup as Kt,Show as Ve,Suspense as Ot}from"solid-js";import{template as st}from"solid-js/web";import{delegateEvents as ct}from"solid-js/web";import{setAttribute as W}from"solid-js/web";import{effect as ut}from"solid-js/web";import{insert as mt}from"solid-js/web";import{addEventListener as ce}from"solid-js/web";import{use as ft}from"solid-js/web";import{createEffect as ht,createSignal as pt,onCleanup as Pe}from"solid-js";import{parseAutomergeUrl as yt}from"@automerge/automerge-repo/slim";import{getImportableUrlFromAutomergeUrl as wt}from"@inkandswitch/patchwork-filesystem";import{isValidAutomergeUrl as se}from"@automerge/automerge-repo/slim";var lt=["text/x-patchwork-dnd","text/x-patchwork-urls","text/uri-list","text/plain"];function ke(e){return!!(e&<.some(o=>e.types.includes(o)))}function dt(e){let o=e.trim();if(se(o))return o;let i=o.match(/#doc=([^&\s]+)/)?.[1];return i&&se(`automerge:${i}`)?`automerge:${i}`:null}function O(e){let o=e.dataTransfer;if(!o)return null;let i=o.getData("text/x-patchwork-dnd");if(i)try{let s=JSON.parse(i);if(Array.isArray(s?.items)&&s.items.length>0)return{source:s.source??"",items:s.items}}catch{}let m=o.getData("text/x-patchwork-urls");if(m)try{let s=JSON.parse(m),h=(Array.isArray(s)?s:[]).filter(y=>se(y)).map(y=>({url:y}));if(h.length>0)return{source:"",items:h}}catch{}let u=(o.getData("text/uri-list")||o.getData("text/plain")).split(/\r?\n/).map(dt).filter(s=>s!==null).map(s=>({url:s}));return u.length>0?{source:"",items:u}:null}var gt=st('<button draggable aria-haspopup=menu class="popmenu__trigger document-list-item"role=treeitem>'),Dt={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 Me(e){let o=e.includes(".")?e.split(".").pop().toLowerCase():"";return o?Dt[o]:void 0}function xt(e){for(let o=e.parentElement;o;o=o.parentElement){let i=getComputedStyle(o).overflowY;if((i==="auto"||i==="scroll")&&o.scrollHeight>o.clientHeight)return o}return document.scrollingElement??document.body}function _t(e){let o=xt(e),i=o.getBoundingClientRect(),m=o.querySelectorAll('.document-list-item[aria-selected="true"]');for(let g of m){let u=g.getBoundingClientRect();if(u.top>=i.top&&u.bottom<=i.bottom)return!0}return!1}function j(e){let o,[i,m]=pt(null),g=!1;function u(){g||e.type!=="file"||(g=!0,e.repo.find(e.url).then(r=>{let d=r?.doc();if(!d)return;let t=String(d.name??e.name??"file"),n=d.extension?`.${String(d.extension).replace(/^\.+/,"")}`:"",a=n&&!t.endsWith(n)?`${t}${n}`:t,f=String(d.mimeType||Me(a)||"application/octet-stream");m({mime:f,filename:a})}).catch(()=>{}))}ht(r=>(e.pressed&&!r&&o&&!_t(o)&&o.scrollIntoViewIfNeeded?.(),e.pressed));let s=()=>({id:e.id,type:e.type,url:e.url,name:e.name,source:e.element.toolId}),h=1500,y=null,l=!1;function c(r){e.type==="folder"||$.has(e.id)||y||l||(r.setAttribute("data-dnd-springload",""),y=setTimeout(()=>{y=null,l=!0,r.removeAttribute("data-dnd-springload"),e.openWith()},h))}function D(){y&&(clearTimeout(y),y=null),l=!1,o?.removeAttribute("data-dnd-springload")}Pe(D);function x(r,d){Fe({x:r,y:d,element:o,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 _,S=()=>clearTimeout(_);Pe(S);async function p(r,d,t){if(T("Item drop handler called for:",d,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 n=O(r);if(!n){T("No dnd data in drop event. types:",r.dataTransfer?.types);return}let{source:a,items:f}=n;T("Drop data:",{source:a,items:f,targetId:d,position:t}),H({draggedIds:f.map(w=>w.id),draggedUrls:f.map(w=>w.url),draggedItems:f,targetId:d,position:t,sourceToolId:a,copyMode:L()},e.repo,e.rootFolderHandle,R(e.element))}return(()=>{var r=gt();r.$$keydown=t=>{if(t.key==="ArrowDown"||t.key==="ArrowUp"){t.preventDefault();let n=t.currentTarget,a=Array.from(document.querySelectorAll("[data-dnd-item]")).filter(w=>w.offsetParent!==null),f=a.indexOf(n);t.key==="ArrowDown"&&f<a.length-1?a[f+1]?.focus():t.key==="ArrowUp"&&f>0&&a[f-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 n=o.getBoundingClientRect();x(n.x+10,n.y+n.height-10)}},ce(r,"dblclick",()=>{e.startRenaming()}),ce(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?($.has(e.id)?Z(e.id):V(e.id,s()),t.preventDefault(),t.stopPropagation(),t.stopImmediatePropagation()):$.has(e.id)||Y()},r.addEventListener("drop",t=>{D();let n=Q();if(console.log("[DnD] Item ondrop event fired",e.id,"type:",e.type,"target:",n),e.type==="folder"&&n?.position==="inside"){if(t.preventDefault(),t.stopPropagation(),N(t)){A({containerUrl:e.url,index:0}),P();return}p(t,n.id,"inside"),P();return}if(T("Item handling drop itself"),t.preventDefault(),t.stopPropagation(),!n){T("No drop target set");return}if(N(t)){if(e.parentFolderHandle&&e.itemIndex!=null){let a=n.position==="above"?e.itemIndex:e.itemIndex+1;A({containerUrl:e.parentFolderHandle.url,index:a})}P();return}p(t,n.id,n.position),P()}),r.addEventListener("dragleave",t=>{let n=t.relatedTarget;(!n||!t.currentTarget.contains(n))&&(D(),P())}),r.addEventListener("dragover",t=>{t.preventDefault(),t.dataTransfer.dropEffect=L()?"copy":"move";let n;if(e.type==="folder"){let a=t.currentTarget.getBoundingClientRect(),w=(t.clientY-a.top)/a.height;w<.25?n="above":w>.75?n="below":n="inside",n!=="inside"&&t.stopPropagation()}else n=Se(t.clientY,t.currentTarget)?"above":"below",t.stopPropagation();ee({id:e.id,position:n}),c(t.currentTarget)}),r.addEventListener("dragend",()=>{D(),Ee(),Y(),G(!1),le(null),ie(!1)}),r.addEventListener("drag",t=>{t.altKey!==L()&&G(t.altKey)}),r.addEventListener("dragstart",t=>{S(),$.has(e.id)||(Y(),V(e.id,s()));let n=$.values(),a=[],f=[];G(t.altKey),t.dataTransfer.effectAllowed="all";for(let I of n)a.push(I.url),f.push(I.id);let w=a.map(I=>location.protocol+"//"+location.host+`/#doc=${yt(I).documentId}`).join(`\r
|
|
2
|
+
`)+`\r
|
|
3
|
+
`;if(t.dataTransfer?.items.add(w,"text/uri-list"),t.dataTransfer?.items.add(JSON.stringify(f),"text/x-sideboard-ids"),t.dataTransfer?.items.add(JSON.stringify(a),"text/x-patchwork-urls"),t.dataTransfer?.items.add(JSON.stringify({source:e.element.toolId,items:[...$.values()]}),"text/x-patchwork-dnd"),$.size===1&&e.type==="file"){let I=i(),b=I?.filename??e.name,q=I?.mime??Me(b)??"application/octet-stream";try{let it=new URL(wt(e.url),location.origin).href;t.dataTransfer?.setData("DownloadURL",`${q}:${b}:${it}`)}catch{}}let v=document.createElement("div");v.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=$.size,C=t.altKey?" (copy)":"";v.textContent=F===1?e.name+C:`${F} items${C}`,document.body.appendChild(v),t.dataTransfer.setDragImage(v,10,10),setTimeout(()=>v.remove(),0),$e([...$.keys()]),le(e.element),ie(!0)}),r.addEventListener("pointercancel",S),r.$$pointerup=S,r.$$pointerdown=t=>{(t.pointerType==="touch"||t.pointerType==="pen")&&(_=setTimeout(()=>x(t.clientX,t.clientY),700))},ce(r,"contextmenu",t=>{t.preventDefault(),t.stopPropagation(),x(t.clientX,t.clientY)});var d=o;return typeof d=="function"?ft(d,r):o=r,mt(r,()=>e.children),ut(t=>{var n=e.id,a=e.url,f=e.type,w=e["aria-label"],v=e.pressed?"true":void 0;return n!==t.e&&W(r,"data-dnd-item",t.e=n),a!==t.t&&W(r,"data-doc-url",t.t=a),f!==t.a&&W(r,"data-doc-type",t.a=f),w!==t.o&&W(r,"aria-label",t.o=w),v!==t.i&&W(r,"aria-selected",t.i=v),t},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),r})()}ct(["pointerdown","pointerup","mousedown","keydown"]);import{template as Ue}from"solid-js/web";import{delegateEvents as vt}from"solid-js/web";import{insert as bt}from"solid-js/web";import{createComponent as ue}from"solid-js/web";import{effect as Ft}from"solid-js/web";import{use as Tt}from"solid-js/web";import{createSelector as St,createSignal as It,Match as Ce,Switch as At}from"solid-js";var $t=Ue("<form style=display:contents><input autofocus class=document-list-item__name>"),Et=Ue("<span class=document-list-item__name>");function te(e){let o=St(_e),[i,m]=It(e.name);function g(){e.rename(i()??""),o(e.id)&&U("")}return ue(At,{get children(){return[ue(Ce,{get when(){return o(e.id)},get children(){var u=$t(),s=u.firstChild;return u.addEventListener("submit",h=>{h.preventDefault(),g()}),s.$$input=h=>m(h.target.value),s.$$keydown=h=>{(h.key=="Escape"||h.key=="g"&&h.ctrlKey)&&g()},s.addEventListener("blur",g),Tt(h=>{m(e.name),setTimeout(()=>{h.focus(),h.select()},80)},s),Ft(()=>s.value=i()),u}}),ue(Ce,{get when(){return!o(e.id)},get children(){var u=Et();return bt(u,()=>e.name),u}})]}})}vt(["keydown","input"]);import{template as Re}from"solid-js/web";import{insert as Lt}from"solid-js/web";import{createComponent as kt}from"solid-js/web";import{setStyleProperty as me}from"solid-js/web";import{effect as He}from"solid-js/web";import{For as Mt}from"solid-js";var Ke=Re('<div class="document-list-item document-list-item--loading"aria-hidden=true><span class=document-list-item__skeleton>'),Pt=Re('<div class=document-list__loading aria-busy=true aria-label="Loading documents">');function re(e){return(()=>{var o=Ke();return He(i=>me(o,"--depth",e.depth??0)),o})()}var Ne=["11rem","7rem","9.5rem","6rem","10rem","8rem"];function fe(e){let o=()=>Array.from({length:e.count??5},(i,m)=>m);return(()=>{var i=Pt();return Lt(i,kt(Mt,{get each(){return o()},children:m=>(()=>{var g=Ke(),u=g.firstChild;return He(s=>{var h=e.depth??0,y=Ne[m%Ne.length];return h!==s.e&&me(g,"--depth",s.e=h),y!==s.t&&me(u,"width",s.t=y),s},{e:void 0,t:void 0}),g})()})),i})()}var Ut=Ye("<button class=document-list-folder__toggle>"),Nt=Ye("<div class=document-list-folder role=group><div class=document-list-folder__contents>");function he(e){let[o,i]=Ht(!1),[m,g]=z(()=>e.url,e),u=new Set(e.visitedFolders??[]);u.add(e.url);let s=()=>e.depth??1,h=()=>({"--depth":s()+1}),y=()=>({"--depth":s()});Be(r=>(!r&&e.filter&&J(e.filter,m()?.title??e.name)&&i(!0),e.filter)),Be(()=>{ve().has(e.url)&&i(!0)});let l=null,c=!1;function D(){l||c||(l=setTimeout(()=>{i(r=>!r),c=!0,l=null},1e3))}function x(){l&&(clearTimeout(l),l=null),c=!1}Kt(x);function _(r){g()?.change(d=>Rt(d,["title"],r))}async function S(r){let d=g();if(!d)return;let t=await Ie(e.repo,r),n=0;d.change(a=>{a.docs.push(t),n=a.docs.length-1}),e.clearFilter(),i(!0),e.open(t),U(d.url+"/"+n)}async function p(r){if(T("Folder drop handler called for:",e.url),r.dataTransfer?.files&&r.dataTransfer.files.length>0){await K(r.dataTransfer.files,g(),e.repo,"inside",0);return}let d=O(r);if(!d){T("No dnd data in drop event. types:",r.dataTransfer?.types);return}let{source:t,items:n}=d;T("Drop data:",{source:t,items:n,folderUrl:e.url}),H({draggedIds:n.map(a=>a.id),draggedUrls:n.map(a=>a.url),draggedItems:n,targetId:e.url,position:"inside",sourceToolId:t,copyMode:L()},e.repo,e.rootFolderHandle,R(e.element))}return(()=>{var r=Nt(),d=r.firstChild;return r.addEventListener("drop",t=>{if(x(),T("Folder ondrop event fired",e.url),t.preventDefault(),t.stopPropagation(),Q()?.position==="inside")if(N(t)){let a=g();a&&(i(!0),A({containerUrl:a.url,index:0}))}else p(t);P()}),r.addEventListener("dragleave",t=>{let n=t.relatedTarget;(!n||!t.currentTarget.contains(n))&&(x(),P())}),r.addEventListener("dragover",t=>{t.preventDefault(),t.stopPropagation();let n=L()?"copy":"move";t.dataTransfer.dropEffect=n,t.target.closest(".document-list-item")||ee({id:e.url,position:"inside"}),t.target.closest(".document-list-item")?.getAttribute("data-dnd-item")===e.url&&D()}),ge(r,M(j,{get"aria-label"(){return m()?.title??e.name??""},startRenaming:()=>{U(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 o()},onToggleExpand:()=>i(t=>!t),createInside:S,openWith:t=>{e.open({url:e.url,toolId:t,title:m()?.title??e.name,type:"folder"})},get children(){return[(()=>{var t=Ut();return Ct(t,"click",n=>{n.stopImmediatePropagation(),i(a=>!a)}),ge(t,M(Ve,{get when(){return o()},get fallback(){return M(ae,{})},get children(){return M(ae,{style:{rotate:"90deg"}})}})),qe(()=>X(t,"aria-label",(o()?"collapse":"expand")+" "+(m()?.title??e.name))),t})(),M(te,{get name(){return m()?.title??e.name},get id(){return e.url},rename:_})]}}),d),ge(d,M(Ve,{get when(){return o()||!!e.filter},get children(){return M(Ot,{get fallback(){return M(re,{get depth(){return s()+1}})},get children(){return M(ne,{get docs(){return m()?.docs},get repo(){return e.repo},get depth(){return s()+1},get handle(){return g.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}})}})}})),qe(t=>{var n=s(),a=y(),f=o(),w=e.url,v=!o()&&!e.filter,F=s(),C=h();return n!==t.e&&X(r,"data-depth",t.e=n),t.t=Oe(r,a,t.t),f!==t.a&&X(r,"aria-expanded",t.a=f),w!==t.o&&X(r,"data-dnd-container",t.o=w),v!==t.i&&d.classList.toggle("document-list-folder__contents--hidden",t.i=v),F!==t.n&&X(d,"data-depth",t.n=F),t.s=Oe(d,C,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 Bt=we('<div class="document-list__item document-list__item--visible">'),Vt=we("<div class=document-list__item>"),Yt=we('<div class=document-list-folder__circular-ref style="padding-left:calc(var(--depth) * 1rem)"><span> (i contain myself eventually)'),er=Gt(()=>import("./create-new-menu-EU5KJJ3R.js").then(e=>({default:e.NewDocPlaceholder}))),Ze=40,tr=8;function ne(e){let o=e.visitedFolders??new Set,[i,m]=zt(Ze);ze(()=>{let l=e.docs?.length??0;if(Qe(i)>=l)return;let c=requestAnimationFrame(function D(){let x=performance.now(),_=Qe(i);do m(_+=Ze);while(_<l&&performance.now()-x<tr);_<l&&(c=requestAnimationFrame(D))});Ge(()=>cancelAnimationFrame(c))});let g=Xt(()=>{let l=e.docs??[];return l.length>i()?l.slice(0,i()):l});function u(l){e.handle.change(c=>Wt(c.docs,l))}let s=()=>!!e.handle&&B()?.containerUrl===e.handle.url,h=l=>{let c=B();if(!c)return;let D=c.index;A(null),e.handle.change(x=>x.docs.splice(D,0,l)),e.open(l),U(e.handle.url+"/"+D)},y=()=>(()=>{var l=Bt();return pe(l,E(er,{get repo(){return e.repo},onCreate:h,onDismiss:()=>A(null),get clearFilter(){return e.clearFilter}})),l})();return[E(Jt,{get each(){return g()},children:(l,c)=>{let D=()=>!e.filter.length||J(e.filter,l.name),x=()=>u(c()),_=()=>e.handle.url+"/"+c(),S=p=>{e.handle.change(d=>{je(d,["docs",c(),"name"],p)});let r=Xe("patchwork:datatype");e.repo.find(l.url).then(async d=>{let{"@patchwork":t}=d.doc();if(t){let n=r.get(t.type);n&&(await r.load(n.id),d.change(a=>n.module.setTitle?.(a,p)))}})};return ze(()=>{if(!e.isSelected(l.url))return;let p=!1,r;e.repo.find(l.url).then(async d=>{if(p)return;let t=Xe("patchwork:datatype");async function n(){let f=d.doc();if(!f)return;let w=f["@patchwork"];if(!w?.type)return;let v=t.get(w.type);if(!v||(await t.load(v.id),p)||!jt(v))return;let F=v.module.getTitle(f);if(!F)return;e.handle.doc()?.docs?.[c()]?.name!==F&&e.handle.change(b=>{je(b,["docs",c(),"name"],F)}),w.title!==F&&d.change(b=>{b["@patchwork"]&&(b["@patchwork"].title=F)})}if(await n(),p)return;let a=()=>n();d.on("change",a),r=()=>d.off("change",a)}),Ge(()=>{p=!0,r?.()})}),[E(ye,{get when(){return We(()=>!!s())()&&B().index===c()},get children(){return y()}}),(()=>{var p=Vt();return pe(p,E(Qt,{get fallback(){return E(re,{get depth(){return e.depth}})},get children(){return E(Zt,{get children(){return[E(Je,{get when(){return l.type=="folder"},get children(){return E(ye,{get when(){return!o.has(l.url)},get fallback(){return(()=>{var r=Yt(),d=r.firstChild,t=d.firstChild;return pe(d,()=>l.name,t),r})()},get children(){return E(he,{get url(){return l.url},get depth(){return e.depth},get repo(){return e.repo},removeFromParent:x,get parentFolderHandle(){return e.handle},get itemIndex(){return c()},get open(){return e.open},get name(){return l.name},get isSelected(){return e.isSelected},visitedFolders:o,get element(){return e.element},get rootFolderHandle(){return e.rootFolderHandle},get filter(){return e.filter},get clearFilter(){return e.clearFilter}})}})}}),E(Je,{get when(){return l.type!="folder"},get children(){return E(j,{get"aria-label"(){return l.name},get url(){return l.url},get name(){return l.name},get id(){return _()},startRenaming:()=>U(_()),remove:x,get pressed(){return e.isSelected(l.url)},get type(){return l.type},get element(){return e.element},get repo(){return e.repo},get rootFolderHandle(){return e.rootFolderHandle},get parentFolderHandle(){return e.handle},get itemIndex(){return c()},openWith:r=>e.open({url:l.url,toolId:r,title:l.name,type:l.type}),get children(){return E(te,{get name(){return l.name},get id(){return _()},rename:S})}})}})]}})}})),qt(r=>{var d=!!D(),t=!D();return d!==r.e&&p.classList.toggle("document-list__item--visible",r.e=d),t!==r.t&&p.classList.toggle("document-list__item--invisible",r.t=t),r},{e:void 0,t:void 0}),p})()]}}),E(ye,{get when(){return We(()=>!!s())()&&B().index>=(e.docs?.length??0)},get children(){return y()}})]}import{createEffect as Bn,createSignal as rr,onCleanup as nr,onMount as or}from"solid-js";import{createStore as Yn,reconcile as Wn}from"solid-js/store";import*as De from"@inkandswitch/patchwork-providers";function ar(e){return typeof e=="function"?e():e}function et(e,o,i){let[m,g]=rr(i);return or(()=>{let u=ar(e);if(!u)return;let s=De.subscribe(u,o,g);nr(s)}),m}function tt(e){let o=0,i=0,m=!1,g=new Set,u=new Set;function s(c){return{id:c.getAttribute("data-dnd-item"),url:c.getAttribute("data-doc-url"),type:c.getAttribute("data-doc-type")??"",name:(c.textContent??"").trim(),source:e.source()}}function h(c){let D=c.clientX-o,x=c.clientY-i;if(!m){if(Math.hypot(D,x)<5)return;m=!0}c.preventDefault();let _=Math.min(o,c.clientX),S=Math.min(i,c.clientY),p=Math.max(o,c.clientX),r=Math.max(i,c.clientY),d=e.container();if(!d)return;let t=new Set;for(let n of d.querySelectorAll("[data-dnd-item]")){if(n.offsetParent===null)continue;let a=n.getAttribute("data-dnd-item");if(!a||g.has(a))continue;let f=n.getBoundingClientRect();f.right<_||f.left>p||f.bottom<S||f.top>r||(t.add(a),$.has(a)||V(a,s(n)))}for(let n of u)t.has(n)||Z(n);u=t}function y(){window.removeEventListener("mousemove",h,!0),window.removeEventListener("mouseup",y,!0),m=!1,u=new Set,g=new Set}function l(c){c.button!==0||!(c.metaKey||c.ctrlKey)||c.target.closest(".document-list__toolbar")||(o=c.clientX,i=c.clientY,m=!1,u=new Set,g=new Set($.keys()),window.addEventListener("mousemove",h,!0),window.addEventListener("mouseup",y,!0))}return{onMouseDown:l}}var sr=ir('<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">'),pr=fr(()=>import("./item-menu-N2ATUOK3.js").then(e=>({default:e.ItemMenu})));function yr(e){let[o,i]=z(()=>e.folderUrl,{repo:e.repo}),[m,g]=nt(""),u=()=>i.state==="ready"||i.state==="refreshing",s=et(e.element,{type:"patchwork:selected-doc"},[]),h=ur(()=>new Set(s())),y=mr(h,(p,r)=>r.has(p));cr(()=>{if(!u())return;let p=s();if(!p.length){oe(new Set);return}let r=!1,d=new Set;de(e.repo,e.folderUrl,new Set(p),d,new Set).then(()=>{r||oe(d)}),ot(()=>{r=!0})});function l(p){e.element.dispatchEvent(Le(p))}let[c,D]=nt(!1),x,_=tt({container:()=>x,source:()=>e.element.toolId??""}),S=p=>{x=p,p.addEventListener("mousedown",_.onMouseDown,!0),ot(()=>p.removeEventListener("mousedown",_.onMouseDown,!0))};return(()=>{var p=sr(),r=p.firstChild,d=r.firstChild,t=d.firstChild,n=t.firstChild;return r.addEventListener("drop",a=>{if(a.preventDefault(),D(!1),N(a)){let b=i();if(b){let q=b.doc()?.docs?.length??0;A({containerUrl:b.url,index:q})}return}let f=a.dataTransfer?.files;if(f&&f.length>0&&i()){let q=i().doc()?.docs?.length||0;K(f,i(),e.repo,"inside",q);return}let w=O(a);if(!w||!i())return;let{source:v,items:F}=w,C=i().url,I=i().doc()?.docs?.length??0;H({draggedIds:F.map(b=>b.id),draggedUrls:F.map(b=>b.url),draggedItems:F,targetId:I>0?`${C}/${I-1}`:C,position:I>0?"below":"inside",sourceToolId:v,copyMode:L()},e.repo,i.latest,R(e.element))}),r.addEventListener("dragleave",a=>{let f=a.relatedTarget;(!f||!a.currentTarget.contains(f))&&D(!1)}),r.addEventListener("dragover",a=>{if(a.dataTransfer?.types.includes("Files")){a.preventDefault(),a.dataTransfer.dropEffect="copy",D(!0);return}(ke(a.dataTransfer)||N(a))&&(a.preventDefault(),a.dataTransfer.dropEffect=L()?"copy":"move")}),dr(S,r),xe(d,k(Ae,{square:!0,draggable:!0,clearFilter:()=>g(""),changeFolder:a=>i()?.change(a),get repo(){return e.repo},open:l}),t),xe(t,k(Te,{}),n),n.$$input=a=>g(a.target.value.toLowerCase()),xe(r,k(at,{get when(){return u()},get fallback(){return k(fe,{depth:0})},get children(){return[k(gr,{get fallback(){return k(fe,{depth:0})},get children(){return k(ne,{depth:0,get repo(){return e.repo},get docs(){return o()?.docs},get handle(){return i.latest},open:l,isSelected:y,get element(){return e.element},get rootFolderHandle(){return i.latest},get filter(){return m()},clearFilter:()=>g("")})}}),k(at,{get when(){return be()},get children(){return k(pr,{get repo(){return e.repo},get rootFolderHandle(){return i.latest},get element(){return e.element}})}})]}}),null),rt(()=>r.classList.toggle("document-list__doclist--drag-over",!!c())),rt(()=>n.value=m()),p})()}function xo(e,o){return hr(()=>k(yr,{folderUrl:e,get repo(){return o.repo},element:o}),o)}lr(["input"]);export{fe as a,yr as b,xo as c};
|
|
15
|
+
//# sourceMappingURL=chunk-KHS2XJKP.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
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_997d6daeb7f9baaac82ff60da9500927/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 { collectExpandedFolders } 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 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 let cancelled = false;\n const result = /* @__PURE__ */new Set();\n collectExpandedFolders(props.repo, props.folderUrl, new Set(selected), result, /* @__PURE__ */new Set()).then(() => {\n if (!cancelled) setAutoExpandedFolders(result);\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 { AutomergeUrl, Repo } from \"@automerge/automerge-repo/slim\";\nimport type { FolderDoc } from \"@inkandswitch/patchwork-filesystem\";\n\n/**\n * Walk the folder tree from `folderUrl` and collect the URLs of every folder\n * that has a selected document somewhere in its subtree \u2014 i.e. the set of\n * folders that must be expanded for the selection to be visible.\n *\n * This reads folder docs directly (one cached `repo.find` each) rather than\n * relying on mounted components, so it finds the full ancestor chain even for a\n * deeply nested selection whose folders aren't mounted yet. Leaf docs are never\n * loaded \u2014 selection is matched against the urls already present in each\n * folder's docrefs.\n *\n * Returns whether `folderUrl`'s subtree contains a selection; ancestors are\n * accumulated into `result`. `visited` is branched per path so a folder that\n * legitimately appears under two parents is handled, while true cycles stop.\n */\nexport async function collectExpandedFolders(\n repo: Repo,\n folderUrl: AutomergeUrl,\n selected: Set<AutomergeUrl>,\n result: Set<AutomergeUrl>,\n visited: Set<AutomergeUrl>\n): Promise<boolean> {\n if (visited.has(folderUrl)) return false;\n const nextVisited = new Set(visited);\n nextVisited.add(folderUrl);\n\n let doc: FolderDoc | undefined;\n try {\n const handle = await repo.find<FolderDoc>(folderUrl);\n doc = handle.doc();\n } catch {\n return false;\n }\n if (!doc?.docs) return false;\n\n let contains = doc.docs.some((child) => selected.has(child.url));\n const subfolders = await Promise.all(\n doc.docs\n .filter((child) => child.type === \"folder\")\n .map((child) =>\n collectExpandedFolders(repo, child.url, selected, result, nextVisited)\n )\n );\n if (subfolders.some(Boolean)) contains = true;\n\n if (contains) result.add(folderUrl);\n return contains;\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 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 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 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 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 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", "collectExpandedFolders", "repo", "folderUrl", "selected", "result", "visited", "nextVisited", "doc", "contains", "child", "_$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", "nextVisitedFolders", "depth", "depthStyle", "folderDepthStyle", "createEffect", "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", "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", "selectedDocUrls", "subscribe", "selectedSet", "createMemo", "isSelected", "createSelector", "url", "set", "createEffect", "selected", "setAutoExpandedFolders", "cancelled", "result", "collectExpandedFolders", "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
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as v}from"./chunk-TCL6SLDB.js";import{b as q}from"./chunk-FW4363Y4.js";import{onCleanup as I}from"solid-js";var b=q(v(),1),O=(0,b.default)("cabbages");function S(e){return typeof e=="object"&&typeof e!=null&&Object.getPrototypeOf(e)==Object.prototype}var H="\uFFFC";function j(e,...n){if(n.length==0){O("empty patch");return}let[o,t,i]=n,c=[...o];for(;;){let r=c.shift();if(!c.length){let a=Array.isArray(t);if(S(e)&&a&&typeof r>"u"&&typeof t[0]=="string"){delete e[t[0]];return}if(a||typeof t=="number"){if(typeof r>"u")throw new Error("cant treat top level as a seq");r=r;let[s,u]=Array.isArray(t)?t:[t,t+1],D=Array.isArray(t)&&t.length==0;if(!D&&(s==null||u==null))throw new RangeError("it's all or nothing, no half measures");let m=typeof i>"u",E=s===u&&!m,A=D&&!m,k=!E&&!m&&!A;if(typeof e[r]>"u"){if(typeof e=="string")return;typeof i=="string"?e[r]="":e[r]=[]}let f=e[r];if(Array.isArray(f)){if(A){Array.isArray(i)?f.push(...i):f.push(i);return}if(E||k){Array.isArray(i)?f.splice(s,u-s,...i):f.splice(s,u-s,i);return}if(m){f.splice(s,u-s);return}throw new Error("i don't know what happened")}if(typeof f=="string"){if(A){e[r]=f+i;return}if(k||E){e[r]=f.slice(0,s)+(typeof i=="string"?i:i.map(C=>typeof C=="string"?C:H).join(""))+f.slice(u);return}if(m){e[r]=f.slice(0,s)+f.slice(u);return}throw new Error("i don't know what happened")}if(S(f)&&a&&typeof t[0]=="string"){delete f[t[0]];return}throw new Error("not implemented")}if(typeof r>"u"){if(typeof t!="string")throw new Error(`can't index top-level map with ${t}`);typeof i>"u"?delete e[t]:e[t]=i;return}if(typeof e[r]>"u"&&(e[r]={}),a){let[s,u]=t;s!=null&&u!=null&&(typeof i>"u"&&s!=null&&u!=null?delete e[r][s||u]:e[r][s||u]=i)}else if(typeof i>"u")delete e[r][t];else{if(typeof e[r]=="string")return;e[r][t]=i}return}if(typeof r>"u")throw new Error("cant treat top level as a seq");r=r;let p=c[0];if(typeof e[r]>"u")if(typeof p=="string")e[r]={};else if(typeof p=="number")e[r]=[];else throw new Error(`can't go down this road ${e}.${r}.${p}`);e=e[r]}}function R(e,n){for(let o=0;o<n.length;o++)e=e?e[n[o]]:void 0;return e}function P(e,n){let o=e.path.slice(0,-1),t=e.path[e.path.length-1];switch(e.action){case"mark":case"unmark":return O(`skipping ${e.action} because it doesn't affect material reality`),[];case"inc":if(n)return[o,t,R(n.patchInfo.after,e.path)];throw new Error(`can't apply ${e.action} without payload argument`);case"conflict":if(n)return[o,t,R(n.patchInfo.after,e.path)];throw new Error(`can't apply ${e.action} without payload argument`);case"del":return typeof t=="string"?[o,t]:[o,[t,t+(e.length||1)]];case"insert":return[o,[t,t],structuredClone(e.values)];case"splice":return[o,[t,t],[e.value]];case"put":return[o,t,structuredClone(e.value)]}}function y(e){return n=>{for(let o of e.patches)j(n,...P(o,e))}}import{createStore as M,produce as _,reconcile as N}from"solid-js/store";var d=new WeakMap;function h(e){if(I(()=>{let c=d.get(e);c&&(c.refs--||c.cleanup())}),d.has(e)){let c=d.get(e);return c.refs++,c.store}let[n,o]=M(e.doc());d.set(e,{refs:0,store:n,cleanup(){e.off("change",t),e.off("delete",i),d.delete(e)}});function t(c){if(c.scopeReplaced){o(N(c.doc??{}));return}o(_(y(c)))}function i(){o(N({}))}return e.on("change",t),e.on("delete",i),e.whenReady().then(()=>{o(e.doc())}),n}import{createMemo as $}from"solid-js";import{getOwner as X,onCleanup as ee,createSignal as te,untrack as re,sharedConfig as oe,onMount as ne,DEV as ie,equalFn as ce}from"solid-js";import{isServer as fe}from"solid-js/web";var l=e=>typeof e=="function"&&!e.length?e():e;function g(e){return $(()=>l(e)&&h(l(e)))}import{createEffect as F,createResource as W,useContext as G}from"solid-js";import{createContext as T}from"solid-js";var w=T(null);function x(e,n){let o=G(w);if(!n?.repo&&!o)throw new Error("use outside <RepoContext> requires options.repo");let t=n?.repo||o;function i(){if(n?.["~skipInitialValue"])return;let p=l(e);if(!p)return;let a=t.findWithProgress(p).peek();return a.state==="ready"?a.handle:void 0}let[c,{mutate:r}]=W(e,p=>t.findWithProgress(p).whenReady(),{initialValue:i()});return F(()=>{l(e)||r()}),c}function L(e,n){let o=x(e,n);return[g(o),o]}import{onCleanup as Se}from"solid-js";import{createSignal as be}from"solid-js";import{createEffect as Pe,onCleanup as Ne}from"solid-js";import{createSignal as qe}from"solid-js";import{useContext as Te}from"solid-js";function rt(e){return new CustomEvent("patchwork:open-document",{detail:e,bubbles:!0,composed:!0})}export{h as a,L as b,rt as c};
|
|
2
|
+
//# sourceMappingURL=chunk-LJ5XCENG.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/makeDocumentProjection.ts", "../node_modules/.pnpm/cabbages@0.2.10/node_modules/cabbages/output/cabbages.js", "../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/autoproduce.ts", "../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/createDocumentProjection.ts", "../node_modules/.pnpm/@solid-primitives+utils@6.4.1_solid-js@1.9.11/node_modules/@solid-primitives/utils/dist/index.js", "../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/useDocHandle.ts", "../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/context.ts", "../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/useDocument.ts", "../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/makeDocSignal.ts", "../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/createDocSignal.ts", "../node_modules/.pnpm/solid-automerge@2.0.1_@automerge+automerge-repo@2.6.0-subduction.12_solid-js@1.9.11/node_modules/solid-automerge/src/useRepo.ts", "../src/sideboard/events.ts"],
|
|
4
|
+
"sourcesContent": ["import {onCleanup} from \"solid-js\"\nimport type {\n\tDoc,\n\tDocHandle,\n\tDocHandleChangePayload,\n} from \"@automerge/automerge-repo/slim\"\nimport autoproduce from \"./autoproduce.ts\"\nimport {createStore, produce, reconcile, type Store} from \"solid-js/store\"\n\nconst cache = new WeakMap<\n\tDocHandle<unknown>,\n\t{\n\t\trefs: number\n\t\tstore: Store<Doc<unknown>>\n\t\tcleanup(): void\n\t}\n>()\n\n/**\n * make a fine-grained live view of a document from its handle.\n * @param handle an Automerge\n * [DocHandle](https://automerge.org/automerge-repo/classes/_automerge_automerge_repo.DocHandle.html)\n */\nexport default function makeDocumentProjection<T extends object>(\n\thandle: DocHandle<T>\n): Doc<T> {\n\tonCleanup(() => {\n\t\tconst item = cache.get(handle)!\n\t\tif (!item) return\n\t\tif (!item.refs--) {\n\t\t\titem.cleanup()\n\t\t}\n\t})\n\n\tif (cache.has(handle)) {\n\t\tconst item = cache.get(handle)!\n\t\titem.refs++\n\t\treturn item.store as Doc<T>\n\t}\n\n\tconst [doc, set] = createStore<Doc<T>>(handle.doc()!)\n\n\tcache.set(handle, {\n\t\trefs: 0,\n\t\tstore: doc,\n\t\tcleanup() {\n\t\t\thandle.off(\"change\", patch)\n\t\t\thandle.off(\"delete\", ondelete)\n\t\t\tcache.delete(handle)\n\t\t},\n\t})\n\n\tfunction patch(payload: DocHandleChangePayload<T>) {\n\t\t// `scopeReplaced` means the change landed at or above this (sub-)handle's\n\t\t// scope boundary, so it can't be expressed as in-scope patches. The\n\t\t// payload still carries `doc` \u2014 the new value at the handle's path (the\n\t\t// part of the store this scope points at) \u2014 so we reconcile against that\n\t\t// instead of applying patches. `reconcile` structurally diffs it against\n\t\t// the current store, so unchanged subtrees keep their identity and only\n\t\t// the parts that actually changed notify. `doc` is undefined when the\n\t\t// scope was removed entirely.\n\t\tif (payload.scopeReplaced) {\n\t\t\tset(reconcile((payload.doc ?? {}) as Doc<T>))\n\t\t\treturn\n\t\t}\n\t\tset(produce(autoproduce(payload)))\n\t}\n\n\tfunction ondelete() {\n\t\tset(reconcile({} as Doc<T>))\n\t}\n\n\thandle.on(\"change\", patch)\n\thandle.on(\"delete\", ondelete)\n\n\thandle.whenReady().then(() => {\n\t\tset(handle.doc()!)\n\t})\n\n\treturn doc\n}\n", "// cabbages.ts\nimport debug from \"debug\";\nvar log = debug(\"cabbages\");\nfunction pojo(target) {\n return typeof target == \"object\" && typeof target != null && Object.getPrototypeOf(target) == Object.prototype;\n}\nvar BLOCK_MARKER = \"\\uFFFC\";\nfunction apply(target, ...rest) {\n if (rest.length == 0) {\n log(\"empty patch\");\n return;\n }\n const [path, range, val] = rest;\n let p = [...path];\n while (true) {\n let key = p.shift();\n if (!p.length) {\n const RANGE_ARRAY = Array.isArray(range);\n if (pojo(target) && RANGE_ARRAY && typeof key == \"undefined\" && typeof range[0] == \"string\") {\n delete target[range[0]];\n return;\n }\n if (RANGE_ARRAY || typeof range == \"number\") {\n if (typeof key == \"undefined\") {\n throw new Error(\"cant treat top level as a seq\");\n }\n key = key;\n let [start, end] = Array.isArray(range) ? range : [range, range + 1];\n const ZERO_LENGTH = Array.isArray(range) && range.length == 0;\n if (!ZERO_LENGTH && (start == null || end == null)) {\n throw new RangeError(\"it's all or nothing, no half measures\");\n }\n const DELETE = typeof val == \"undefined\";\n const INSERT = start === end && !DELETE;\n const APPEND = ZERO_LENGTH && !DELETE;\n const REPLACE = !INSERT && !DELETE && !APPEND;\n if (typeof target[key] == \"undefined\") {\n if (typeof target == \"string\") {\n return;\n } else if (typeof val == \"string\") {\n target[key] = \"\";\n } else {\n target[key] = [];\n }\n }\n let seq = target[key];\n if (Array.isArray(seq)) {\n if (APPEND) {\n Array.isArray(val) ? seq.push(...val) : seq.push(val);\n return;\n }\n if (INSERT || REPLACE) {\n Array.isArray(val) ? seq.splice(start, end - start, ...val) : seq.splice(start, end - start, val);\n return;\n }\n if (DELETE) {\n seq.splice(start, end - start);\n return;\n }\n throw new Error(\"i don't know what happened\");\n }\n if (typeof seq == \"string\") {\n if (APPEND) {\n target[key] = seq + val;\n return;\n }\n if (REPLACE || INSERT) {\n target[key] = seq.slice(0, start) + (typeof val == \"string\" ? val : val.map(\n (n) => typeof n == \"string\" ? n : BLOCK_MARKER\n ).join(\"\")) + seq.slice(end);\n return;\n }\n if (DELETE) {\n target[key] = seq.slice(0, start) + seq.slice(end);\n return;\n }\n throw new Error(\"i don't know what happened\");\n }\n if (pojo(seq) && RANGE_ARRAY && typeof range[0] == \"string\") {\n delete seq[range[0]];\n return;\n }\n throw new Error(\"not implemented\");\n }\n if (typeof key == \"undefined\") {\n if (typeof range != \"string\") {\n throw new Error(`can't index top-level map with ${range}`);\n }\n if (typeof val == \"undefined\") {\n delete target[range];\n } else {\n target[range] = val;\n }\n return;\n }\n if (typeof target[key] == \"undefined\") {\n target[key] = {};\n }\n if (RANGE_ARRAY) {\n let [a, b] = range;\n if (a != null && b != null) {\n if (typeof val == \"undefined\" && a != null && b != null) {\n delete target[key][a || b];\n } else {\n target[key][a || b] = val;\n }\n }\n } else {\n if (typeof val == \"undefined\") {\n delete target[key][range];\n } else if (typeof target[key] == \"string\") {\n return;\n } else {\n target[key][range] = val;\n }\n }\n return;\n }\n if (typeof key == \"undefined\") {\n throw new Error(\"cant treat top level as a seq\");\n }\n key = key;\n let nextkey = p[0];\n if (typeof target[key] == \"undefined\") {\n if (typeof nextkey == \"string\") {\n target[key] = {};\n } else if (typeof nextkey == \"number\") {\n target[key] = [];\n } else {\n throw new Error(`can't go down this road ${target}.${key}.${nextkey}`);\n }\n }\n target = target[key];\n }\n}\nvar patch = apply;\nfunction get(obj, key) {\n for (let p = 0; p < key.length; p++) {\n obj = obj ? obj[key[p]] : void 0;\n }\n return obj;\n}\nfunction fromAutomerge(autopatch, payload) {\n const path = autopatch.path.slice(0, -1);\n const key = autopatch.path[autopatch.path.length - 1];\n switch (autopatch.action) {\n case \"mark\":\n case \"unmark\":\n log(\n `skipping ${autopatch.action} because it doesn't affect material reality`\n );\n return [];\n case \"inc\":\n if (payload) {\n return [path, key, get(payload.patchInfo.after, autopatch.path)];\n } else {\n throw new Error(\n `can't apply ${autopatch.action} without payload argument`\n );\n }\n case \"conflict\":\n if (payload) {\n return [path, key, get(payload.patchInfo.after, autopatch.path)];\n } else {\n throw new Error(\n `can't apply ${autopatch.action} without payload argument`\n );\n }\n case \"del\": {\n return typeof key == \"string\" ? [path, key] : [path, [key, key + (autopatch.length || 1)]];\n }\n case \"insert\": {\n return [\n path,\n [key, key],\n structuredClone(autopatch.values)\n ];\n }\n case \"splice\": {\n return [path, [key, key], [autopatch.value]];\n }\n case \"put\": {\n return [path, key, structuredClone(autopatch.value)];\n }\n }\n}\nexport {\n apply,\n fromAutomerge,\n patch,\n pojo\n};\n", "import type {DocHandleChangePayload} from \"@automerge/automerge-repo/slim\"\nimport {apply, fromAutomerge} from \"cabbages\"\n\n/**\n * convert automerge patches to solid producer operations\n * @param payload the\n * [DocHandleChangePayload](https://automerge.org/automerge-repo/interfaces/_automerge_automerge_repo.DocHandleChangePayload.html)\n * from the handle.on(\"change\n * @returns a callback for an immer-like function. e.g.\n * [produce](https://docs.solidjs.com/reference/store-utilities/produce) for\n * [Solid\n * Stores](https://docs.solidjs.com/reference/store-utilities/create-store)\n */\nexport default function autoproduce<T>(\n\tpayload: DocHandleChangePayload<T>\n): (doc: T) => void {\n\treturn (doc: T) => {\n\t\tfor (let patch of payload.patches) {\n\t\t\tapply(doc, ...fromAutomerge(patch, payload))\n\t\t}\n\t}\n}\n", "import {createMemo, type Accessor} from \"solid-js\"\nimport {type DocHandle, type Doc} from \"@automerge/automerge-repo/slim\"\nimport makeDocumentProjection from \"./makeDocumentProjection.ts\"\nimport {access} from \"@solid-primitives/utils\"\n\n/**\n * get a fine-grained live view of a document from a handle. works with\n * {@link useDocHandle}.\n * @param handle an accessor (signal/resource) of a\n * [DocHandle](https://automerge.org/automerge-repo/classes/_automerge_automerge_repo.DocHandle.html)\n */\nexport default function createDocumentProjection<T extends object>(\n\thandle: Accessor<DocHandle<T> | undefined>\n): Accessor<Doc<T> | undefined> {\n\tconst projection = createMemo<Doc<T> | undefined>(\n\t\t() => access(handle) && makeDocumentProjection<T>(access(handle)!)\n\t)\n\treturn projection\n}\n", "import { getOwner, onCleanup, createSignal, untrack, sharedConfig, onMount, DEV, equalFn, } from \"solid-js\";\nimport { isServer } from \"solid-js/web\";\nexport * from \"./types.js\";\n//\n// GENERAL HELPERS:\n//\nexport { isServer };\nexport const isClient = !isServer;\nexport const isDev = isClient && !!DEV;\nexport const isProd = !isDev;\n/** no operation */\nexport const noop = (() => void 0);\nexport const trueFn = () => true;\nexport const falseFn = () => false;\n/** @deprecated use {@link equalFn} from \"solid-js\" */\nexport const defaultEquals = equalFn;\nexport const EQUALS_FALSE_OPTIONS = { equals: false };\nexport const INTERNAL_OPTIONS = { internal: true };\n/**\n * Check if the value is an instance of ___\n */\nexport const ofClass = (v, c) => v instanceof c || (v && v.constructor === c);\n/** Check if value is typeof \"object\" or \"function\" */\nexport function isObject(value) {\n return value !== null && (typeof value === \"object\" || typeof value === \"function\");\n}\nexport const isNonNullable = (i) => i != null;\nexport const filterNonNullable = (arr) => arr.filter(isNonNullable);\nexport const compare = (a, b) => (a < b ? -1 : a > b ? 1 : 0);\n/**\n * Check shallow array equality\n */\nexport const arrayEquals = (a, b) => a === b || (a.length === b.length && a.every((e, i) => e === b[i]));\n/**\n * Returns a function that will call all functions in the order they were chained with the same arguments.\n */\nexport function chain(callbacks) {\n return (...args) => {\n for (const callback of callbacks)\n callback && callback(...args);\n };\n}\n/**\n * Returns a function that will call all functions in the reversed order with the same arguments.\n */\nexport function reverseChain(callbacks) {\n return (...args) => {\n for (let i = callbacks.length - 1; i >= 0; i--) {\n const callback = callbacks[i];\n callback && callback(...args);\n }\n };\n}\nexport const clamp = (n, min, max) => Math.min(Math.max(n, min), max);\n/**\n * Accesses the value of a MaybeAccessor\n * @example\n * ```ts\n * access(\"foo\") // => \"foo\"\n * access(() => \"foo\") // => \"foo\"\n * ```\n */\nexport const access = (v) => typeof v === \"function\" && !v.length ? v() : v;\nexport const asArray = (value) => Array.isArray(value) ? value : value ? [value] : [];\n/**\n * Access an array of MaybeAccessors\n * @example\n * const list = [1, 2, () => 3)] // T: MaybeAccessor<number>[]\n * const newList = accessArray(list) // T: number[]\n */\nexport const accessArray = (list) => list.map(v => access(v));\n/**\n * Run the function if the accessed value is not `undefined` nor `null`\n * @param value\n * @param fn\n */\nexport const withAccess = (value, fn) => {\n const _value = access(value);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n typeof _value != null && fn(_value);\n};\nexport const asAccessor = (v) => (typeof v === \"function\" ? v : () => v);\n/** If value is a function \u2013 call it with a given arguments \u2013 otherwise get the value as is */\nexport function accessWith(valueOrFn, ...args) {\n return typeof valueOrFn === \"function\" ? valueOrFn(...args) : valueOrFn;\n}\nexport function defer(deps, fn, initialValue) {\n const isArray = Array.isArray(deps);\n let prevInput;\n let shouldDefer = true;\n return prevValue => {\n let input;\n if (isArray) {\n input = Array(deps.length);\n for (let i = 0; i < deps.length; i++)\n input[i] = deps[i]();\n }\n else\n input = deps();\n if (shouldDefer) {\n shouldDefer = false;\n prevInput = input;\n return initialValue;\n }\n const result = untrack(() => fn(input, prevInput, prevValue));\n prevInput = input;\n return result;\n };\n}\n/**\n * Get entries of an object\n */\nexport const entries = Object.entries;\n/**\n * Get keys of an object\n */\nexport const keys = Object.keys;\n/**\n * Solid's `onCleanup` that doesn't warn in development if used outside of a component.\n */\nexport const tryOnCleanup = isDev\n ? fn => (getOwner() ? onCleanup(fn) : fn)\n : onCleanup;\nexport const createCallbackStack = () => {\n let stack = [];\n const clear = () => (stack = []);\n return {\n push: (...callbacks) => stack.push(...callbacks),\n execute(arg0, arg1, arg2, arg3) {\n stack.forEach(cb => cb(arg0, arg1, arg2, arg3));\n clear();\n },\n clear,\n };\n};\n/**\n * Group synchronous function calls.\n * @param fn\n * @returns `fn`\n */\nexport function createMicrotask(fn) {\n let calls = 0;\n let args;\n onCleanup(() => (calls = 0));\n return (...a) => {\n (args = a), calls++;\n queueMicrotask(() => --calls === 0 && fn(...args));\n };\n}\n/**\n * A hydratable version of the {@link createSignal}. It will use the serverValue on the server and the update function on the client. If initialized during hydration it will use serverValue as the initial value and update it once hydration is complete.\n *\n * @param serverValue initial value of the state on the server\n * @param update called once on the client or on hydration to initialize the value\n * @param options {@link SignalOptions}\n * @returns\n * ```ts\n * [state: Accessor<T>, setState: Setter<T>]\n * ```\n * @see {@link createSignal}\n */\nexport function createHydratableSignal(serverValue, update, options) {\n if (isServer) {\n return createSignal(serverValue, options);\n }\n if (sharedConfig.context) {\n const [state, setState] = createSignal(serverValue, options);\n onMount(() => setState(() => update()));\n return [state, setState];\n }\n return createSignal(update(), options);\n}\n/** @deprecated use {@link createHydratableSignal} instead */\nexport const createHydrateSignal = createHydratableSignal;\n/**\n * Handle items removed and added to the array by diffing it by refference.\n *\n * @param current new array instance\n * @param prev previous array copy\n * @param handleAdded called once for every added item to array\n * @param handleRemoved called once for every removed from array\n */\nexport function handleDiffArray(current, prev, handleAdded, handleRemoved) {\n const currLength = current.length;\n const prevLength = prev.length;\n let i = 0;\n if (!prevLength) {\n for (; i < currLength; i++)\n handleAdded(current[i]);\n return;\n }\n if (!currLength) {\n for (; i < prevLength; i++)\n handleRemoved(prev[i]);\n return;\n }\n for (; i < prevLength; i++) {\n if (prev[i] !== current[i])\n break;\n }\n let prevEl;\n let currEl;\n prev = prev.slice(i);\n current = current.slice(i);\n for (prevEl of prev) {\n if (!current.includes(prevEl))\n handleRemoved(prevEl);\n }\n for (currEl of current) {\n if (!prev.includes(currEl))\n handleAdded(currEl);\n }\n}\n// \u2500\u2500\u2500 String transforms \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/**\n * Parse a string as a single JSON value.\n *\n * ```ts\n * const { data } = createSSE<{ status: string }>(url, { transform: json });\n * ```\n */\nexport const json = (raw) => JSON.parse(raw);\n/**\n * Parse a string as newline-delimited JSON (NDJSON / JSON Lines).\n *\n * Each non-empty line is parsed as a separate JSON value and returned as an array.\n *\n * ```ts\n * const { data } = createSSE<TickEvent[]>(url, { transform: ndjson });\n * // data() === [{ id: 1, type: \"tick\" }, { id: 2, type: \"tick\" }]\n * ```\n */\nexport const ndjson = (raw) => raw\n .split(\"\\n\")\n .filter(line => line !== \"\")\n .map(line => JSON.parse(line));\n/**\n * Split a string into individual lines, returning a `string[]`. Empty lines are filtered out.\n *\n * ```ts\n * const { data } = createSSE<string[]>(url, { transform: lines });\n * // data() === [\"line one\", \"line two\"]\n * ```\n */\nexport const lines = (raw) => raw.split(\"\\n\").filter(line => line !== \"\");\n/**\n * Parse a string as a number using `Number()` semantics.\n *\n * Note: `\"\"` \u2192 `0`, non-numeric strings \u2192 `NaN`.\n *\n * ```ts\n * const { data } = createSSE<number>(url, { transform: number });\n * // data() === 42\n * ```\n */\nexport const number = (raw) => Number(raw);\nexport function safe(transform, fallback) {\n return (raw) => {\n try {\n return transform(raw);\n }\n catch {\n return fallback;\n }\n };\n}\n/**\n * Compose two transforms into one: the output of `a` is passed as the input of `b`.\n *\n * ```ts\n * const { data } = createSSE<RawEvent[]>(url, {\n * transform: pipe(ndjson<RawEvent>, rows => rows.filter(r => r.type === \"tick\")),\n * });\n * ```\n */\nexport function pipe(a, b) {\n return (raw) => b(a(raw));\n}\n", "import type {AutomergeUrl, DocHandle} from \"@automerge/automerge-repo/slim\"\nimport {createEffect, createResource, useContext, type Resource} from \"solid-js\"\nimport {access, type MaybeAccessor} from \"@solid-primitives/utils\"\nimport {RepoContext} from \"./context.ts\"\nimport type {UseDocHandleOptions} from \"./types.ts\"\n\n/**\n * get a\n * [DocHandle](https://automerge.org/automerge-repo/classes/_automerge_automerge_repo.DocHandle.html)\n * from an\n * [AutomergeUrl](https://automerge.org/automerge-repo/types/_automerge_automerge_repo.AutomergeUrl.html)\n * as a\n * [Resource](https://docs.solidjs.com/reference/basic-reactivity/create-resource).\n * Waits for the handle to be ready.\n */\nexport default function useDocHandle<T>(\n\turl: MaybeAccessor<AutomergeUrl | undefined>,\n\toptions?: UseDocHandleOptions\n): Resource<DocHandle<T> | undefined> {\n\tconst contextRepo = useContext(RepoContext)\n\n\tif (!options?.repo && !contextRepo) {\n\t\tthrow new Error(\"use outside <RepoContext> requires options.repo\")\n\t}\n\n\tconst repo = (options?.repo || contextRepo)!\n\n\tfunction getExistingHandle() {\n\t\tif (options?.[\"~skipInitialValue\"]) return undefined\n\t\tconst unwrappedURL = access(url)\n\t\tif (!unwrappedURL) return undefined\n\t\tconst state = repo.findWithProgress<T>(unwrappedURL).peek()\n\t\treturn state.state === \"ready\" ? state.handle : undefined\n\t}\n\n\tconst [handle, {mutate}] = createResource(\n\t\turl,\n\t\turl => repo.findWithProgress<T>(url).whenReady(),\n\t\t{\n\t\t\tinitialValue: getExistingHandle(),\n\t\t}\n\t)\n\n\tcreateEffect(() => {\n\t\tif (!access(url)) {\n\t\t\tmutate()\n\t\t}\n\t})\n\n\treturn handle\n}\n", "import type {Repo} from \"@automerge/automerge-repo/slim\"\nimport {createContext, type Context} from \"solid-js\"\n\n/**\n * a [context](https://docs.solidjs.com/concepts/context) that provides access\n * to an Automerge Repo. you don't need this, you can pass the repo in the\n * second arg to the functions that need it.\n */\nexport const RepoContext: Context<Repo | null> = createContext<Repo | null>(\n\tnull\n)\n", "import type {AutomergeUrl, Doc, DocHandle} from \"@automerge/automerge-repo/slim\"\nimport createDocumentProjection from \"./createDocumentProjection.ts\"\nimport type {MaybeAccessor} from \"@solid-primitives/utils\"\nimport useDocHandle from \"./useDocHandle.ts\"\nimport type {UseDocHandleOptions} from \"./types.ts\"\nimport type {Accessor, Resource} from \"solid-js\"\n\n/**\n * get a fine-grained live view of a document, and its handle, from a URL.\n * @param url a function that returns a url\n */\nexport default function useDocument<T extends object>(\n\turl: MaybeAccessor<AutomergeUrl | undefined>,\n\toptions?: UseDocHandleOptions\n): [Accessor<Doc<T> | undefined>, Resource<DocHandle<T> | undefined>] {\n\tconst handle = useDocHandle<T>(url, options)\n\treturn [createDocumentProjection<T>(handle), handle] as const\n}\n", "import {onCleanup, type Accessor} from \"solid-js\"\nimport {createSignal} from \"solid-js\"\nimport type {Doc, DocHandle} from \"@automerge/automerge-repo/slim\"\n\n/**\n * a light coarse-grained primitive when you care only _that_ a doc has changed,\n * and not _how_.\n * @param handle an Automerge\n * [DocHandle](https://automerge.org/automerge-repo/classes/_automerge_automerge_repo.DocHandle.html)\n */\nexport default function makeDocSignal<T extends object>(\n\thandle: DocHandle<T>\n): Accessor<Doc<T> | undefined> {\n\tconst [signal, setSignal] = createSignal<Doc<T> | undefined>(handle.doc())\n\n\tfunction update() {\n\t\tsetSignal(() => handle.doc() as Doc<T> | undefined)\n\t}\n\n\thandle.on(\"change\", update)\n\tonCleanup(() => handle.off(\"change\", update))\n\n\treturn signal\n}\n", "import {createEffect, onCleanup, type Accessor} from \"solid-js\"\nimport {createSignal} from \"solid-js\"\nimport type {Doc, DocHandle} from \"@automerge/automerge-repo/slim\"\n\n/**\n * a light coarse-grained primitive when you care only _that_ a doc has changed,\n * and not _how_. works with {@link useDocHandle}.\n * @param handle an accessor (signal/resource) of a\n * [DocHandle](https://automerge.org/automerge-repo/classes/_automerge_automerge_repo.DocHandle.html)\n */\nexport default function createDocSignal<T extends object>(\n\thandle: Accessor<DocHandle<T> | undefined>\n): Accessor<Doc<T> | undefined> {\n\tconst [signal, setSignal] = createSignal<Doc<T> | undefined>(handle()?.doc())\n\n\tcreateEffect(() => {\n\t\tconst h = handle()\n\n\t\tfunction update() {\n\t\t\tsetSignal(() => h?.doc() as Doc<T> | undefined)\n\t\t}\n\n\t\t// sync the signal with the current handle's doc\n\t\tupdate()\n\n\t\tif (h) {\n\t\t\th.on(\"change\", update)\n\t\t\tonCleanup(() => h.off(\"change\", update))\n\t\t}\n\t})\n\n\treturn signal\n}\n", "import type {Repo} from \"@automerge/automerge-repo/slim\"\nimport {RepoContext} from \"./context.ts\"\nimport {useContext} from \"solid-js\"\n\n/** grab the repo from the {@link RepoContext} */\nexport default function useRepo(): Repo {\n\tconst repo = useContext(RepoContext)\n\tif (!repo) throw new Error(\"Please wrap me in a <RepoContext value={repo}>\")\n\treturn repo\n}\n", "import type { OpenDocumentEventDetail } from \"@inkandswitch/patchwork-elements\";\n\nexport function createOpenEvent(detail: OpenDocumentEventDetail) {\n const openEvent = new CustomEvent(\"patchwork:open-document\", {\n detail,\n bubbles: true,\n composed: true,\n });\n return openEvent;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["onCleanup", "import_debug", "log", "debug", "pojo", "target", "BLOCK_MARKER", "apply", "rest", "path", "range", "val", "p", "key", "RANGE_ARRAY", "start", "end", "ZERO_LENGTH", "DELETE", "INSERT", "APPEND", "REPLACE", "seq", "n", "a", "b", "nextkey", "get", "obj", "key", "p", "fromAutomerge", "autopatch", "payload", "path", "log", "autoproduce", "payload", "doc", "patch", "apply", "fromAutomerge", "createStore", "produce", "reconcile", "cache", "makeDocumentProjection", "handle", "onCleanup", "item", "doc", "set", "patch", "ondelete", "payload", "autoproduce", "createMemo", "getOwner", "onCleanup", "createSignal", "untrack", "sharedConfig", "onMount", "DEV", "equalFn", "isServer", "access", "v", "createDocumentProjection", "handle", "createMemo", "access", "makeDocumentProjection", "createEffect", "createResource", "useContext", "createContext", "RepoContext", "useDocHandle", "url", "options", "contextRepo", "useContext", "RepoContext", "repo", "getExistingHandle", "unwrappedURL", "access", "state", "handle", "mutate", "createResource", "createEffect", "useDocument", "url", "options", "handle", "useDocHandle", "createDocumentProjection", "onCleanup", "createSignal", "createEffect", "onCleanup", "createSignal", "useContext", "createOpenEvent", "detail"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
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-NO6SJFVH.js.map
|