@inkandswitch/patchwork-pkg-base 0.0.69 → 0.0.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/module-settings-url +1 -1
- package/package.json +1 -1
- package/packages/providers/dist/assets/WorkerProvider-CG700oWK.js +2 -0
- package/packages/providers/dist/assets/WorkerProvider-CG700oWK.js.map +1 -0
- package/packages/providers/dist/index.js +1 -1
- package/packages/providers/dist/index.js.map +1 -1
- package/packages/providers/package.json +5 -1
- package/packages/sideboard/dist/{chunk-OYTJOD52.js → chunk-XFYC7NFX.js} +2 -2
- package/packages/sideboard/dist/{chunk-OYTJOD52.js.map → chunk-XFYC7NFX.js.map} +2 -2
- package/packages/sideboard/dist/{document-list-panel-SAZI3PJP.js → document-list-panel-TEMPKXQI.js} +2 -2
- package/packages/sideboard/dist/index.js +1 -1
- package/packages/sideboard/dist/sideboard/sideboard.js +1 -1
- package/packages/theming/dist/{active-theme-CZOUYQ4S.js → active-theme-ZEJCS5RM.js} +3 -3
- package/packages/theming/dist/{chunk-6PXH63WF.js → chunk-FLDRNDLY.js} +2 -2
- package/packages/theming/dist/{chunk-RATW7VZI.js → chunk-L7WQSSFT.js} +2 -2
- package/packages/theming/dist/{gloom-JYQPEOHI.css → gloom-UKANBN2Z.css} +1 -1
- package/packages/theming/dist/main.js +4 -4
- package/packages/theming/dist/{theme-titlebar-EKXBWQZO.js → theme-titlebar-HAEXLVMW.js} +3 -3
- package/packages/theming/dist/{theme-tray-JJFCEA26.js → theme-tray-XYB4LGZ6.js} +3 -3
- package/packages/theming/dist/tool.js +2 -2
- package/plugin-registry-url +1 -1
- /package/packages/sideboard/dist/{document-list-panel-SAZI3PJP.js.map → document-list-panel-TEMPKXQI.js.map} +0 -0
- /package/packages/theming/dist/{active-theme-CZOUYQ4S.js.map → active-theme-ZEJCS5RM.js.map} +0 -0
- /package/packages/theming/dist/{chunk-6PXH63WF.js.map → chunk-FLDRNDLY.js.map} +0 -0
- /package/packages/theming/dist/{chunk-RATW7VZI.js.map → chunk-L7WQSSFT.js.map} +0 -0
- /package/packages/theming/dist/{theme-titlebar-EKXBWQZO.js.map → theme-titlebar-HAEXLVMW.js.map} +0 -0
- /package/packages/theming/dist/{theme-tray-JJFCEA26.js.map → theme-tray-XYB4LGZ6.js.map} +0 -0
package/module-settings-url
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
automerge:
|
|
1
|
+
automerge:33vwW9j93FsjU67jMzCqvGxerXHH
|
package/package.json
CHANGED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{getRegistry as R}from"@inkandswitch/patchwork-plugins";import{accept as I}from"@inkandswitch/patchwork-providers";const L="patchwork:worker-channel",N="patchwork:worker",O=5e3;let U=0;function $(){return"wk-"+ ++U+"-"+(performance.now()|0)}function q(l,w={}){let d=null,i=null;const o=new Map,r=new Map,n=new Set,a=Symbol("pending");let s=null,u=!1;const h=e=>{try{s?.enqueue(e)}catch{}},E=l.open?Promise.race([Promise.resolve(l.open(w)),new Promise(e=>setTimeout(e,O,null))]).catch(()=>null):Promise.resolve(null),k=(e,t)=>{u||S().then(b=>b.postMessage(e,t||[])).catch(()=>{})};function S(){return i||(i=Promise.resolve().then(()=>l.createWorker()).then(e=>(d=e,e.onmessage=t=>g(t.data),e.onerror=f,e.onmessageerror=f,e)),i.catch(f),i)}function g(e){if(!(!e||u)){if(e.id!=null){const t=o.get(e.id);t&&t(e)&&o.delete(e.id);return}h(e)}}async function P(e){if(!e||typeof e!="object")return;const t=e.id;if(e.op==="abort"){if(!r.has(t))return;const c=r.get(t);if(c===a){n.add(t);return}try{l.abort?.(c,k)}catch{}r.delete(t);return}r.set(t,a);const _=await E;if(u)return;const p=$();let m=!1;const M={post:k,emit:c=>h({...c,id:t}),on:c=>{m=!0,o.set(p,y=>{const v=c(y);return v&&(r.delete(t),n.delete(t)),v})},workerId:p,state:_,ctx:w};try{const c=await l.handle(e,M);if(n.has(t)){n.delete(t),r.delete(t),o.delete(p);try{l.abort?.(c,k)}catch{}return}m?r.set(t,c):r.delete(t)}catch(c){h({id:t,type:"error",message:c?.message||String(c)}),o.delete(p),r.delete(t),n.delete(t)}}function f(){if(!u){u=!0,o.clear(),r.clear(),n.clear();try{s?.close()}catch{}s=null;try{d?.terminate()}catch{}d=null}}const W=new ReadableStream({start(e){s=e},cancel(){f()}}),T=new WritableStream({write(e){P(e)},close(){f()},abort(){f()}});return{readable:W,writable:T}}const A=1e4,G=l=>{const w=R(N),d=o=>{const r=o.detail,n=r?.selector;if(!n||n.type!==L||!r.port)return;const a=n.kind;!a||!w.has(a)||I(o,s=>{i(a,s)})};async function i(o,r){try{const a=(await Promise.race([w.loadWhenReady(o),new Promise((u,h)=>setTimeout(()=>h(new Error(`timed out loading worker plugin "${o}"`)),A))]))?.module;if(!a||typeof a.handle!="function"||typeof a.createWorker!="function")throw new Error(`worker plugin "${o}" did not resolve to a WorkerSpec`);const s=q(a,{element:l});r({readable:s.readable,writable:s.writable},[s.readable,s.writable])}catch(n){console.error(`[worker-provider] failed to serve "${o}":`,n),r(null)}}return document.addEventListener("patchwork:subscribe",d),()=>{document.removeEventListener("patchwork:subscribe",d)}};export{G as WorkerProvider};
|
|
2
|
+
//# sourceMappingURL=WorkerProvider-CG700oWK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerProvider-CG700oWK.js","sources":["../../node_modules/.pnpm/@grjte+patchwork-worker@0.0.2_@automerge+automerge-repo@2.6.0-subduction.48_supports-co_f3089f3cacfd2de7804cd039328d81f0/node_modules/@grjte/patchwork-worker/connect.js","../../node_modules/.pnpm/@grjte+patchwork-worker@0.0.2_@automerge+automerge-repo@2.6.0-subduction.48_supports-co_f3089f3cacfd2de7804cd039328d81f0/node_modules/@grjte/patchwork-worker/serve.js","../../src/WorkerProvider.ts"],"sourcesContent":["/**\n * connectWorker — a generic, transferable-stream connection to a worker-backed\n * service.\n *\n * A tool asks to connect to a worker of some `kind` and, for the lifetime of\n * that connection, holds a `WritableStream` (to send request frames) and a\n * `ReadableStream` (to receive event frames). The worker itself, and any\n * privileged setup it needs (config/secrets), live on whichever side answers the\n * connection — the SAME realm when there's no isolation boundary, or the host\n * realm when the consumer runs in a sandboxed realm. Either way the consumer sees\n * an identical `{readable, writable}` pair; the streams are transferable, so they\n * cross an isolation boundary unchanged.\n *\n * This file is the CONSUMER half. `connectWorker(kind, {element})` returns\n * `{readable, writable, disconnect}`; a provider answers via the discovery event\n * (in-realm, or relayed from the host realm by whatever isolation mechanism is\n * in use). If nothing answers, it rejects. There is no local fallback.\n *\n * The SERVING half is `serveWorkerSpec` (./serve.js), driven by the host-realm\n * `patchwork-worker-provider` component (shipped by the `providers` package),\n * which resolves a WorkerSpec for the requested `kind` from the\n * `patchwork:worker` plugin registry. Consumers never import serve.js.\n *\n * This module is service-agnostic: it knows nothing about LLMs. Frame shapes are\n * the service's concern; connect.js treats them as opaque structured-cloneable\n * values, tagged with an `id` so many requests can multiplex over one connection.\n *\n * Discovery/handoff goes through patchwork-providers: this file calls\n * `subscribe()` and the host provider answers with `accept()`. The stream pair\n * rides in the value; `respond`'s transfer list moves rather than clones it, so\n * the streams stay live across the isolation boundary.\n *\n * Layering: this file stays free of the plugin registry so the sandbox-loaded\n * transport carries no more than it needs; the registry lookup lives in\n * ./client.js.\n */\n\nimport {createOpenSession} from \"./session.js\"\n\n// --- Protocol constants -----------------------------------------------------\n// Deliberately STRINGS, not Symbols. Comparisons against them are `===` on the\n// value (here, in the host worker provider, and possibly as inlined literals in\n// code that relays the subscription across a boundary), so they keep working\n// even if this module is evaluated more than once. A Symbol would silently stop\n// matching.\n\n/**\n * The selector type used to discover a worker-connection provider. A consumer\n * dispatches a `patchwork:subscribe` for `{ type: CHANNEL_SELECTOR, kind }`\n * carrying a MessagePort in `detail.port`. The answering side replies over that\n * port, in the standard providers envelope (`{type:\"change\", value}`), with\n * exactly one of:\n *\n * {readable, writable} — success; the pair is TRANSFERRED, not cloned\n * null — refused; fail fast\n *\n * Silence is also a valid outcome (nothing is mounted to answer), which the\n * consumer's bounded discovery timeout covers. Answering sides that KNOW they're\n * refusing should respond `null` rather than staying silent.\n */\nexport const CHANNEL_SELECTOR = \"patchwork:worker-channel\"\n\n/**\n * The plugin type a service package registers to offer a worker. Its `id` is\n * the worker `kind`; `load()` resolves to a WorkerSpec (see ./serve.js).\n */\nexport const WORKER_PLUGIN_TYPE = \"patchwork:worker\"\n\n/**\n * The paired plugin type a service package registers to offer a typed client\n * for its worker. Same `id` as the worker; `load()` resolves to a factory\n * `(session) => clientApi` (see ./client.js).\n */\nexport const WORKER_CLIENT_PLUGIN_TYPE = \"patchwork:worker-client\"\n\n/**\n * BACKSTOP: how long to wait for a provider to answer before giving up.\n *\n * Not control flow. A mounted provider either serves the kind (streams) or\n * refuses it (`null`), and both are immediate — so in a healthy frame this timer\n * never fires. It exists because an unclaimed `patchwork:subscribe` never\n * settles by design (a subscription may wait for a provider that mounts later).\n * Without a bound, a missing provider would hang the caller forever instead of\n * erroring.\n */\nconst DISCOVERY_TIMEOUT_MS = 8000\n\n/** @typedef {{ readable: ReadableStream, writable: WritableStream }} WorkerStreams */\n/** @typedef {WorkerStreams & { disconnect: () => void }} WorkerConnection */\n/**\n * What a `patchwork:worker` plugin's `load()` must resolve to: a WorkerSpec that\n * `serveWorkerSpec` (serve.js) drives. The transport owns the streams, ids, and\n * per-connection worker; the spec owns only its op vocabulary. `open(ctx)` gets\n * the provider's mount point, so a worker can resolve host-realm context (a\n * settings doc, say) without the provider knowing about that service.\n *\n * (Shape mirrored from serve.js's `WorkerSpec`, kept as a local typedef so this\n * sandbox-loaded file does not import the host-only serve module. Types erase,\n * so this costs nothing at runtime.)\n * @typedef {{\n * createWorker: () => Worker | Promise<Worker>,\n * open?: (ctx: {element?: HTMLElement}) => any,\n * handle: (frame: any, io: any) => any,\n * abort?: (token: any, post: (msg: any, transfer?: Transferable[]) => void) => void,\n * }} WorkerSpec\n */\n\n/**\n * The descriptor a package puts in its `plugins` array to offer a worker.\n * @typedef {{type: \"patchwork:worker\", id: string, name?: string, load: () => Promise<WorkerSpec>}} WorkerPlugin\n */\n\n/**\n * Open a connection to a worker of `kind`.\n *\n * A `patchwork:subscribe` provider for `{type: CHANNEL_SELECTOR, kind}` above\n * `element` answers, transferring streams back over the port. In the host realm\n * that's a mounted worker provider; in a sandboxed realm it's whatever relays\n * the subscription to the host and transfers the host's streams back across the\n * boundary. The consumer gets the same `{readable, writable, disconnect}` either\n * way and never learns which answered.\n *\n * There is deliberately NO fallback to a locally-constructed worker. Inside the\n * sandbox that fallback was a hole: any in-boundary tool that imported a service\n * package would register its worker as an import side-effect, and a connection\n * that should have been refused would instead run the worker in the opaque\n * origin — no shared model cache, no host config, and no signal that the\n * isolation boundary had been bypassed. Serving is the provider's job; a\n * consumer with no provider ancestor fails loudly instead.\n *\n * @param {string} kind\n * @param {{ element: HTMLElement }} opts a node inside a mounted <patchwork-view>,\n * to dispatch the discovery subscribe from\n * @returns {Promise<WorkerConnection>}\n */\nexport async function connectWorker(kind, opts) {\n\tconst el = opts?.element\n\tif (!el) {\n\t\tthrow new Error(\n\t\t\t`no worker available for kind \"${kind}\": no element to discover a provider from`\n\t\t)\n\t}\n\tconst streams = await discoverViaProvider(el, kind)\n\tif (!streams) {\n\t\tthrow new Error(`no worker available for kind \"${kind}\"`)\n\t}\n\treturn withDisconnect(streams)\n}\n\n/**\n * Wrap a {readable, writable} with a disconnect() that tears both ends down.\n * Only valid while the caller holds no reader/writer lock (a locked stream\n * rejects cancel/abort); a consumer that has taken locks releases through them.\n * @param {WorkerStreams} streams\n * @returns {WorkerConnection}\n */\nfunction withDisconnect(streams) {\n\treturn {\n\t\t...streams,\n\t\tdisconnect() {\n\t\t\tstreams.readable.cancel().catch(() => {})\n\t\t\tstreams.writable.abort().catch(() => {})\n\t\t},\n\t}\n}\n\n/**\n * Ask a `patchwork:worker-channel` provider to open a connection, via providers\n * `subscribe()`. Resolves null on an explicit refusal, or if nothing answers\n * within the discovery timeout.\n *\n * @param {HTMLElement} element\n * @param {string} kind\n * @returns {Promise<WorkerStreams | null>}\n */\nfunction discoverViaProvider(element, kind) {\n\treturn new Promise((resolve) => {\n\t\tlet settled = false\n\t\t/** @type {(() => void) | null} */\n\t\tlet unsubscribe = null\n\n\t\tconst finish = (/** @type {WorkerStreams | null} */ v) => {\n\t\t\tif (settled) return\n\t\t\tsettled = true\n\t\t\tclearTimeout(timer)\n\t\t\t// One-shot: the provider may hold the subscription open, but we only ever\n\t\t\t// want the first answer.\n\t\t\ttry {\n\t\t\t\tunsubscribe?.()\n\t\t\t} catch {}\n\t\t\tresolve(v)\n\t\t}\n\t\tconst timer = setTimeout(() => finish(null), DISCOVERY_TIMEOUT_MS)\n\n\t\t// `subscribe` is typed `T extends JSONValue`, but a transferred stream pair\n\t\t// is not JSON — the cast is that constraint biting. `accept<T = JSONValue>`\n\t\t// is deliberately unconstrained for exactly this case; the consumer half\n\t\t// was never widened to match. Worth fixing upstream.\n\t\tvoid import(\"@inkandswitch/patchwork-providers\")\n\t\t\t.then(({subscribe}) => {\n\t\t\t\tif (settled) return\n\t\t\t\tunsubscribe = /** @type {any} */ (subscribe)(\n\t\t\t\t\telement,\n\t\t\t\t\t{type: CHANNEL_SELECTOR, kind},\n\t\t\t\t\t(/** @type {WorkerStreams | null} */ value) => {\n\t\t\t\t\t\t// `null` is an explicit refusal — settle now rather than burning\n\t\t\t\t\t\t// the full discovery timeout for an answer that already exists.\n\t\t\t\t\t\tif (value && value.readable && value.writable) {\n\t\t\t\t\t\t\tfinish({readable: value.readable, writable: value.writable})\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfinish(null)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\t// A provider can answer during the dispatch above, in which case\n\t\t\t\t// `finish` ran while `unsubscribe` was still null. Tear down now.\n\t\t\t\tif (settled) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tunsubscribe?.()\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tconsole.error(\"[patchwork-worker] failed to load patchwork-providers:\", err)\n\t\t\t\tfinish(null)\n\t\t\t})\n\t})\n}\n\n// --- Session layer ----------------------------------------------------------\n// session.js takes `connectWorker` as a parameter rather than importing it, so\n// the dependency runs one way and there's no import cycle.\nexport const openSession = createOpenSession(connectWorker)\n","/**\n * The SERVING half of a worker connection — the mirror of `openSession`.\n *\n * `openSession` (session.js) is the consumer side: it owns a `{readable,\n * writable}` pair, mints request ids, multiplexes many requests over one\n * connection, and routes event frames back to the right caller. `serveWorkerSpec`\n * is the same machinery on the OTHER end. A service supplies a small `WorkerSpec`\n * — how to construct its worker, an optional per-connection warm-up, and a\n * `handle(frame, io)` that turns one consumer request into worker traffic — and\n * this file owns everything kind-agnostic around it:\n *\n * - the `{readable, writable}` stream pair and its controller lifecycle\n * - ONE dedicated Worker per connection, terminated on teardown (no reuse, no\n * sharing — a worker belongs to the connection that opened it and dies with it)\n * - id minting and demux for requests multiplexed within the connection\n * - the reserved `op:\"abort\"` (session.js sends it, so it is part of the\n * transport protocol, not any service's vocabulary)\n * - teardown on cancel/close/abort of either stream, on worker death, and on a\n * worker that cannot be constructed\n * - a bounded `open` hook\n *\n * Frames the worker posts with NO `id` (status, progress) are emitted straight\n * onto the connection's readable; the consumer side fans them out to its\n * in-flight requests. With one worker per connection there is nothing else to\n * route them to.\n *\n * The spec knows nothing about streams, ids, or workers-as-transport; the\n * transport knows nothing about the service's op vocabulary, config, or secrets.\n */\n\n/**\n * How long `spec.open` may take before the transport gives up and serves frames\n * anyway. Bounds an upstream primitive that can hang: a settings-doc warm resolves\n * through patchwork-providers' `request()`, which never settles if no provider\n * answers. Falling through is the spec's responsibility to make safe; wedging\n * every frame forever is strictly worse.\n */\nconst OPEN_TIMEOUT_MS = 5000\n\n/**\n * @typedef {(msg: any, transfer?: Transferable[]) => void} Post\n * @typedef {(frame: any) => void} Emit\n *\n * @typedef {Object} IO what a spec's `handle` is given\n * @property {Post} post send a message to the worker (transfer supported)\n * @property {Emit} emit enqueue a frame onto THIS consumer's readable\n * @property {(fn: (msg:any)=>boolean|void) => void} on\n * register a handler for worker messages tagged with `workerId`; return a truthy\n * value from `fn` when the request is complete and the transport should clean up.\n * A request whose handle never calls `on` is fire-and-forget: nothing is\n * tracked for it and `op:\"abort\"` cannot target it.\n * @property {string} workerId the transport-minted id to tag worker payloads with\n * @property {any} state whatever `spec.open` resolved (or null)\n * @property {{element?: HTMLElement}} ctx host-realm context from the provider\n *\n * @typedef {Object} WorkerSpec\n * @property {() => Worker | Promise<Worker>} createWorker\n * @property {(ctx: {element?: HTMLElement}) => any} [open]\n * @property {(frame: any, io: IO) => any} handle\n * returns an opaque abort token (or nothing) stored per tracked request\n * @property {(token: any, post: Post) => void} [abort]\n */\n\nlet idSeq = 0\nfunction nextWorkerId() {\n\treturn \"wk-\" + ++idSeq + \"-\" + (performance.now() | 0)\n}\n\n/**\n * Serve one worker connection from a spec. Returns the `{readable, writable}` the\n * provider transfers to the consumer. One Worker is created for this connection\n * and terminated when either stream ends or the worker dies.\n *\n * @param {WorkerSpec} spec\n * @param {{element?: HTMLElement}} [ctx]\n * @returns {{readable: ReadableStream, writable: WritableStream}}\n */\nexport function serveWorkerSpec(spec, ctx = {}) {\n\t/** @type {Worker | null} */\n\tlet worker = null\n\t/** @type {Promise<Worker> | null} */\n\tlet workerReady = null\n\t// worker message id -> handler. One connection, so one flat map is enough.\n\t/** @type {Map<string, (msg:any)=>boolean|void>} */\n\tconst handlers = new Map()\n\t// caller id -> the abort token the spec returned, so `op:\"abort\"` can cancel\n\t// it. A request is entered here SYNCHRONOUSLY at `PENDING` the moment its\n\t// frame arrives, before any await — so an `op:\"abort\"` that races in while the\n\t// spec is still resolving (`await openState` / `await spec.handle`) finds the\n\t// request and is honoured once the token lands, rather than being dropped.\n\t/** @type {Map<string, any>} */\n\tconst tokens = new Map()\n\t// caller ids aborted while still `PENDING` — the abort is deferred to when the\n\t// handler stores its token.\n\t/** @type {Set<string>} */\n\tconst aborted = new Set()\n\tconst PENDING = Symbol(\"pending\")\n\n\t/** @type {ReadableStreamDefaultController | null} */\n\tlet controller = null\n\tlet closed = false\n\n\tconst emit = (/** @type {any} */ frame) => {\n\t\ttry {\n\t\t\tcontroller?.enqueue(frame)\n\t\t} catch {}\n\t}\n\n\t// The connection's one warm-up, bounded so a never-settling `open` can't wedge\n\t// every frame. Started eagerly; frames await it before dispatch.\n\tconst openState = spec.open\n\t\t? Promise.race([\n\t\t\t\tPromise.resolve(spec.open(ctx)),\n\t\t\t\tnew Promise((resolve) => setTimeout(resolve, OPEN_TIMEOUT_MS, null)),\n\t\t\t]).catch(() => null)\n\t\t: Promise.resolve(null)\n\n\t/** @type {Post} */\n\tconst post = (msg, transfer) => {\n\t\tif (closed) return\n\t\tvoid getWorker()\n\t\t\t.then((w) => w.postMessage(msg, transfer || []))\n\t\t\t.catch(() => {}) // a failed construction has already torn the connection down\n\t}\n\n\t/**\n\t * Lazily construct the worker (once) and wire its message pump. A worker that\n\t * cannot be constructed, or that later dies, ends the connection: the\n\t * consumer's in-flight requests reject when its readable closes, instead of\n\t * waiting on a worker that will never answer.\n\t */\n\tfunction getWorker() {\n\t\tif (workerReady) return workerReady\n\t\tworkerReady = Promise.resolve()\n\t\t\t.then(() => spec.createWorker())\n\t\t\t.then((w) => {\n\t\t\t\tworker = w\n\t\t\t\tw.onmessage = (/** @type {MessageEvent} */ ev) => dispatch(ev.data)\n\t\t\t\tw.onerror = teardown\n\t\t\t\tw.onmessageerror = teardown\n\t\t\t\treturn w\n\t\t\t})\n\t\tworkerReady.catch(teardown)\n\t\treturn workerReady\n\t}\n\n\t/**\n\t * Route a worker message. A message with an `id` goes to that request's\n\t * handler (which reports terminal by returning truthy). A message with no `id`\n\t * is a connection-wide broadcast and goes straight onto the readable.\n\t */\n\tfunction dispatch(/** @type {any} */ msg) {\n\t\tif (!msg || closed) return\n\t\tif (msg.id != null) {\n\t\t\tconst h = handlers.get(msg.id)\n\t\t\tif (h && h(msg)) handlers.delete(msg.id)\n\t\t\treturn\n\t\t}\n\t\temit(msg)\n\t}\n\n\tasync function handleFrame(/** @type {any} */ frame) {\n\t\tif (!frame || typeof frame !== \"object\") return\n\t\tconst id = frame.id\n\t\tconst op = frame.op\n\n\t\t// Reserved transport op. Cancel one in-flight request: let the spec send\n\t\t// whatever the worker needs, then forget it. If the request is still\n\t\t// `PENDING` (its handler hasn't returned a token yet), defer: record the id\n\t\t// and let the handler abort as soon as it stores the token.\n\t\tif (op === \"abort\") {\n\t\t\tif (!tokens.has(id)) return // unknown / already-finished request\n\t\t\tconst token = tokens.get(id)\n\t\t\tif (token === PENDING) {\n\t\t\t\taborted.add(id)\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tspec.abort?.(token, post)\n\t\t\t} catch {}\n\t\t\ttokens.delete(id)\n\t\t\treturn\n\t\t}\n\n\t\t// Claim the id SYNCHRONOUSLY, before the first await, so an abort racing in\n\t\t// during `await openState` / `await spec.handle` isn't dropped.\n\t\ttokens.set(id, PENDING)\n\n\t\tconst state = await openState\n\t\tif (closed) return\n\t\tconst workerId = nextWorkerId()\n\t\tlet tracked = false\n\n\t\t/** @type {IO} */\n\t\tconst io = {\n\t\t\tpost,\n\t\t\t// Frames the spec emits carry the WORKER id; re-tag with the caller id.\n\t\t\temit: (f) => emit({...f, id}),\n\t\t\ton: (fn) => {\n\t\t\t\ttracked = true\n\t\t\t\thandlers.set(workerId, (msg) => {\n\t\t\t\t\tconst done = fn(msg)\n\t\t\t\t\tif (done) {\n\t\t\t\t\t\ttokens.delete(id)\n\t\t\t\t\t\taborted.delete(id)\n\t\t\t\t\t}\n\t\t\t\t\treturn done\n\t\t\t\t})\n\t\t\t},\n\t\t\tworkerId,\n\t\t\tstate,\n\t\t\tctx,\n\t\t}\n\n\t\ttry {\n\t\t\tconst token = await spec.handle(frame, io)\n\t\t\t// An abort arrived while this request was still PENDING — honour it now\n\t\t\t// that the token exists, and don't store it (the request is cancelled).\n\t\t\tif (aborted.has(id)) {\n\t\t\t\taborted.delete(id)\n\t\t\t\ttokens.delete(id)\n\t\t\t\thandlers.delete(workerId)\n\t\t\t\ttry {\n\t\t\t\t\tspec.abort?.(token, post)\n\t\t\t\t} catch {}\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Track the request only if the spec is listening for a reply; a\n\t\t\t// fire-and-forget handle has nothing to abort and must not accumulate.\n\t\t\tif (tracked) tokens.set(id, token)\n\t\t\telse tokens.delete(id)\n\t\t} catch (e) {\n\t\t\tconst err = /** @type {any} */ (e)\n\t\t\temit({id, type: \"error\", message: err?.message || String(e)})\n\t\t\thandlers.delete(workerId)\n\t\t\ttokens.delete(id)\n\t\t\taborted.delete(id)\n\t\t}\n\t}\n\n\tfunction teardown() {\n\t\tif (closed) return\n\t\tclosed = true\n\t\thandlers.clear()\n\t\ttokens.clear()\n\t\taborted.clear()\n\t\t// Close the readable so a consumer still reading it sees end-of-stream rather\n\t\t// than hanging forever. Teardown can be driven from the WRITABLE side\n\t\t// (close/abort) or worker death, where the readable was never cancelled.\n\t\t// `close()` throws if the stream was already closed/cancelled, so guard it.\n\t\ttry {\n\t\t\tcontroller?.close()\n\t\t} catch {}\n\t\tcontroller = null\n\t\t// The worker belongs to this connection alone — kill it.\n\t\ttry {\n\t\t\tworker?.terminate()\n\t\t} catch {}\n\t\tworker = null\n\t}\n\n\tconst readable = new ReadableStream({\n\t\tstart(c) {\n\t\t\tcontroller = c\n\t\t},\n\t\tcancel() {\n\t\t\tteardown()\n\t\t},\n\t})\n\n\tconst writable = new WritableStream({\n\t\twrite(frame) {\n\t\t\tvoid handleFrame(frame)\n\t\t},\n\t\tclose() {\n\t\t\tteardown()\n\t\t},\n\t\tabort() {\n\t\t\tteardown()\n\t\t},\n\t})\n\n\treturn {readable, writable}\n}\n","/**\n * The worker provider — the SERVING half of `patchwork:worker-channel`.\n *\n * Mounted in the host realm as a `patchwork:component`, it answers worker-channel\n * subscriptions by running the requested worker HERE and transferring its\n * `{readable, writable}` stream pair back to the consumer. Under isolation the\n * consumer is inside the sandbox and only the streams cross; the worker, and any\n * config or secrets it resolves, never leave the host.\n *\n * It is KIND-AGNOSTIC. Workers are resolved from the `patchwork:worker` plugin\n * registry by the selector's `kind`, so this file imports nothing\n * service-specific — no LLM, no config, no secrets. A package that owns a worker\n * registers it declaratively:\n *\n * // in a Patchwork package's `plugins` array\n * {type: \"patchwork:worker\", id: \"llm\", name: \"LLM\",\n * async load() { return llmWorkerSpec }}\n *\n * and `load()` resolves to a `WorkerSpec` (see @grjte/patchwork-worker/serve.js):\n * `{createWorker, open?, handle, abort?}`. The provider hands the spec to\n * `serveWorkerSpec`, which owns the streams, the worker lifetime, and the id\n * demux; the spec owns only the service's op vocabulary.\n *\n * Package placement: this lives in the host-only `providers` package and imports\n * the transport's serve half from `@grjte/patchwork-worker/serve.js`. The\n * consumer half (`connect.js`, the only file a sandboxed tool loads) never\n * imports this module, so the plugin registry stays out of the sandbox.\n *\n * Three invariants make this reliable rather than racy:\n *\n * 1. DECLINE SYNCHRONOUSLY, CLAIM SYNCHRONOUSLY. `registry.has(kind)` is sync,\n * so a kind we cannot serve is left to bubble (another provider may answer)\n * by returning BEFORE `accept()`. `accept()` itself claims with\n * `stopPropagation()` before running the producer, so a kind we can serve is\n * claimed before any await — otherwise the event finishes bubbling while we\n * wait and an ancestor double-answers.\n * 2. ALWAYS SETTLE A CLAIMED REQUEST. Once claimed, the consumer is waiting on\n * this subscription, so every path must reply — the stream pair on success,\n * an explicit `null` on failure. Staying silent turns a bad config or a\n * throwing worker into a hang.\n * 3. LISTEN AT THE DOCUMENT, NOT THE MOUNT ELEMENT. `patchwork:subscribe`\n * bubbles and is `composed`, so a document-level listener catches every\n * request regardless of where this provider sits relative to the consumer.\n * Listening on the mount element instead would make correctness depend on\n * this component having mounted before any consumer dispatches — and\n * `patchwork-view` mounting is async twice over (a deferred render, then an\n * async registry load), so a host would have to gate its whole subtree on\n * this provider being ready. That gate is a bad trade: `patchwork-view`\n * emits no event when a component fails to load, so a failed load would\n * leave the gated subtree blank forever. Listening at the document keeps\n * this an optional capability that degrades to \"no worker available\"\n * instead of taking the frame down with it. (The sibling providers in this\n * package listen on their mount element; this one deliberately differs.)\n */\n\nimport { getRegistry, type PluginDescription, type PluginRegistry } from \"@inkandswitch/patchwork-plugins\";\nimport { accept, type SubscribeEvent } from \"@inkandswitch/patchwork-providers\";\nimport { CHANNEL_SELECTOR, WORKER_PLUGIN_TYPE } from \"@grjte/patchwork-worker/connect.js\";\nimport { serveWorkerSpec, type WorkerSpec } from \"@grjte/patchwork-worker/serve.js\";\n\n/**\n * How long to wait for a registered worker plugin to LOAD before refusing.\n *\n * `has(kind)` proves the plugin is registered, not that its module can be\n * fetched — an unreachable package or a `load()` that never settles would\n * otherwise leave a claimed port unanswered forever, which is exactly the hang\n * invariant 2 exists to prevent.\n */\nconst LOAD_TIMEOUT_MS = 10000;\n\n/** The value a worker-channel subscription settles with: the pair, or a refusal. */\ntype WorkerChannelValue = { readable: ReadableStream; writable: WritableStream } | null;\n\n/** The selector a consumer dispatches (see connect.js `CHANNEL_SELECTOR`). */\ntype WorkerChannelSelector = { type: string; kind?: string };\n\n/**\n * Mount the worker provider on `element`. Returns a cleanup function\n * (the `patchwork:component` render contract).\n *\n * `element` is never read for `repo` or attributes; it is only the host-realm\n * context handed to a spec's `open(ctx)`, so a worker can resolve things that\n * need a mounted view (a settings doc, say). Hence `HTMLElement`, not\n * `PatchworkViewElement`.\n */\nexport const WorkerProvider = (element: HTMLElement): (() => void) => {\n const workers: PluginRegistry<PluginDescription, WorkerSpec> = getRegistry(WORKER_PLUGIN_TYPE);\n\n const onSubscribe = (event: Event) => {\n const detail = (event as SubscribeEvent).detail;\n const selector = detail?.selector as WorkerChannelSelector | undefined;\n if (!selector || selector.type !== CHANNEL_SELECTOR) return;\n if (!detail.port) return;\n\n const kind = selector.kind;\n\n // Decline what we cannot serve, SYNCHRONOUSLY and without claiming, so the\n // event keeps bubbling and something else may answer. Must come BEFORE\n // `accept()`, which claims via stopPropagation() the moment it is called.\n if (!kind || !workers.has(kind)) return;\n\n // `accept()` claims the event and owns the port from here: its lifetime,\n // its teardown, and the `{type:\"change\", value}` envelope. We only choose\n // the value.\n accept<WorkerChannelValue>(event as SubscribeEvent, (respond) => {\n void serve(kind, respond);\n });\n };\n\n /**\n * Run the worker for `kind` and hand its streams back. Always settles: the\n * stream pair on success, `null` on any failure — a claimed subscription that\n * stays silent hangs the consumer forever.\n */\n async function serve(\n kind: string,\n respond: (value: WorkerChannelValue, transfer?: Transferable[]) => void\n ) {\n try {\n // `loadWhenReady` (not `load`) waits for the `registered` event, so a\n // worker registered-but-not-yet-loaded still resolves instead of being\n // reported missing. Bounded: a claimed subscription must always settle,\n // and `accept()` does not bound the producer for us.\n const plugin = await Promise.race([\n workers.loadWhenReady(kind),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error(`timed out loading worker plugin \"${kind}\"`)),\n LOAD_TIMEOUT_MS\n )\n ),\n ]);\n const spec = plugin?.module as WorkerSpec | undefined;\n if (!spec || typeof spec.handle !== \"function\" || typeof spec.createWorker !== \"function\") {\n throw new Error(`worker plugin \"${kind}\" did not resolve to a WorkerSpec`);\n }\n\n // The element is what lets a worker resolve host-realm context it needs\n // (e.g. a settings doc via the patchwork:tool-storage provider) without\n // this provider knowing anything about that service. serveWorkerSpec owns\n // the streams, the per-connection worker, and the id demux; the spec owns\n // the service vocabulary.\n const streams = serveWorkerSpec(spec, { element });\n\n // The streams ride IN the value; naming them in the transfer list only\n // upgrades the structured clone to a move. Both are required — a\n // transferable named in the list but absent from the value is detached\n // here and never arrives there.\n respond({ readable: streams.readable, writable: streams.writable }, [\n streams.readable,\n streams.writable,\n ]);\n } catch (err) {\n // The reason no longer rides the wire (the envelope is `accept()`'s), so\n // log it here — this is the only place it was ever surfaced anyway.\n console.error(`[worker-provider] failed to serve \"${kind}\":`, err);\n respond(null);\n }\n }\n\n // Document-level: see invariant 3. `element` is still used as the host-realm\n // context handed to `open(ctx)`, so a worker can resolve things that need a\n // mounted view (a settings doc, say) — the provider's POSITION matters for\n // that, but not for whether it hears the request.\n document.addEventListener(\"patchwork:subscribe\", onSubscribe);\n return () => {\n document.removeEventListener(\"patchwork:subscribe\", onSubscribe);\n };\n};\n"],"names":["CHANNEL_SELECTOR","WORKER_PLUGIN_TYPE","OPEN_TIMEOUT_MS","idSeq","nextWorkerId","serveWorkerSpec","spec","ctx","worker","workerReady","handlers","tokens","aborted","PENDING","controller","closed","emit","frame","openState","resolve","post","msg","transfer","getWorker","w","ev","dispatch","teardown","h","handleFrame","id","token","state","workerId","tracked","io","f","fn","done","e","readable","c","writable","LOAD_TIMEOUT_MS","WorkerProvider","element","workers","getRegistry","onSubscribe","event","detail","selector","kind","accept","respond","serve","_","reject","streams","err"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const
|
|
1
|
+
const h="modulepreload",f=function(t,e){return new URL(t,e).href},_={},i=function(e,u,m){let p=Promise.resolve();if(u&&u.length>0){let P=function(r){return Promise.all(r.map(a=>Promise.resolve(a).then(s=>({status:"fulfilled",value:s}),s=>({status:"rejected",reason:s}))))};const c=document.getElementsByTagName("link"),o=document.querySelector("meta[property=csp-nonce]"),w=o?.nonce||o?.getAttribute("nonce");p=P(u.map(r=>{if(r=f(r,m),r in _)return;_[r]=!0;const a=r.endsWith(".css"),s=a?'[rel="stylesheet"]':"";if(m)for(let l=c.length-1;l>=0;l--){const d=c[l];if(d.href===r&&(!a||d.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${r}"]${s}`))return;const n=document.createElement("link");if(n.rel=a?"stylesheet":h,a||(n.as="script"),n.crossOrigin="",n.href=r,w&&n.setAttribute("nonce",w),document.head.appendChild(n),a)return new Promise((l,d)=>{n.addEventListener("load",l),n.addEventListener("error",()=>d(new Error(`Unable to preload CSS for ${r}`)))})}))}function v(c){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=c,window.dispatchEvent(o),!o.defaultPrevented)throw c}return p.then(c=>{for(const o of c||[])o.status==="rejected"&&v(o.reason);return e().catch(v)})},y=[{type:"patchwork:component",id:"patchwork-comments-provider",name:"Comments Provider",async load(){const{CommentsProvider:t}=await i(async()=>{const{CommentsProvider:e}=await import("./assets/CommentsProvider-BYqGfL6x.js");return{CommentsProvider:e}},[],import.meta.url);return t}},{type:"patchwork:component",id:"patchwork-focus-provider",name:"Focus Provider",async load(){const{FocusProvider:t}=await i(async()=>{const{FocusProvider:e}=await import("./assets/FocusProvider-AfpGH4B_.js");return{FocusProvider:e}},[],import.meta.url);return t}},{type:"patchwork:component",id:"patchwork-account-provider",name:"Account Provider",async load(){const{AccountProvider:t}=await i(async()=>{const{AccountProvider:e}=await import("./assets/AccountProvider-BNtDCQWd.js");return{AccountProvider:e}},[],import.meta.url);return t}},{type:"patchwork:component",id:"patchwork-selected-doc-provider",name:"Selected Doc Provider",async load(){const{SelectedDocProvider:t}=await i(async()=>{const{SelectedDocProvider:e}=await import("./assets/SelectedDocProvider-CLztU54U.js");return{SelectedDocProvider:e}},[],import.meta.url);return t}},{type:"patchwork:component",id:"patchwork-tool-storage-provider",name:"Tool Storage Provider",async load(){const{ToolStorageProvider:t}=await i(async()=>{const{ToolStorageProvider:e}=await import("./assets/ToolStorageProvider-D7F0l8h7.js");return{ToolStorageProvider:e}},[],import.meta.url);return t}},{type:"patchwork:component",id:"patchwork-worker-provider",name:"Worker Provider",async load(){const{WorkerProvider:t}=await i(async()=>{const{WorkerProvider:e}=await import("./assets/WorkerProvider-CG700oWK.js");return{WorkerProvider:e}},[],import.meta.url);return t}}];export{y as plugins};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"gsCAEaA,EAAyB,CACpC,CACE,KAAM,sBACN,GAAI,8BACJ,KAAM,oBACN,MAAM,MAAO,CACX,KAAM,CAAE,iBAAAC,CAAA,EAAqB,MAAAC,EAAA,iCAAAD,CAAA,OAAM,QAAO,uCAAuB,0BAAAA,CAAA,uBACjE,OAAOA,CACT,GAEF,CACE,KAAM,sBACN,GAAI,2BACJ,KAAM,iBACN,MAAM,MAAO,CACX,KAAM,CAAE,cAAAE,CAAA,EAAkB,MAAAD,EAAA,8BAAAC,CAAA,OAAM,QAAO,oCAAoB,uBAAAA,CAAA,uBAC3D,OAAOA,CACT,GAEF,CACE,KAAM,sBACN,GAAI,6BACJ,KAAM,mBACN,MAAM,MAAO,CACX,KAAM,CAAE,gBAAAC,CAAA,EAAoB,MAAAF,EAAA,gCAAAE,CAAA,OAAM,QAAO,sCAAsB,yBAAAA,CAAA,uBAC/D,OAAOA,CACT,GAEF,CACE,KAAM,sBACN,GAAI,kCACJ,KAAM,wBACN,MAAM,MAAO,CACX,KAAM,CAAE,oBAAAC,CAAA,EAAwB,MAAAH,EAAA,oCAAAG,CAAA,OAAM,QAAO,0CAA0B,6BAAAA,CAAA,uBACvE,OAAOA,CACT,GAEF,CACE,KAAM,sBACN,GAAI,kCACJ,KAAM,wBACN,MAAM,MAAO,CACX,KAAM,CAAE,oBAAAC,CAAA,EAAwB,MAAAJ,EAAA,oCAAAI,CAAA,OAAM,QAAO,0CAA0B,6BAAAA,CAAA,uBACvE,OAAOA,CACT,EAEJ","names":["plugins","CommentsProvider","__vitePreload","FocusProvider","AccountProvider","SelectedDocProvider","ToolStorageProvider"],"ignoreList":[],"sources":["../src/index.ts"],"sourcesContent":["import type { Plugin } from \"@inkandswitch/patchwork-plugins\";\n\nexport const plugins: Plugin<any>[] = [\n {\n type: \"patchwork:component\",\n id: \"patchwork-comments-provider\",\n name: \"Comments Provider\",\n async load() {\n const { CommentsProvider } = await import(\"./CommentsProvider.js\");\n return CommentsProvider;\n },\n },\n {\n type: \"patchwork:component\",\n id: \"patchwork-focus-provider\",\n name: \"Focus Provider\",\n async load() {\n const { FocusProvider } = await import(\"./FocusProvider.js\");\n return FocusProvider;\n },\n },\n {\n type: \"patchwork:component\",\n id: \"patchwork-account-provider\",\n name: \"Account Provider\",\n async load() {\n const { AccountProvider } = await import(\"./AccountProvider.js\");\n return AccountProvider;\n },\n },\n {\n type: \"patchwork:component\",\n id: \"patchwork-selected-doc-provider\",\n name: \"Selected Doc Provider\",\n async load() {\n const { SelectedDocProvider } = await import(\"./SelectedDocProvider.js\");\n return SelectedDocProvider;\n },\n },\n {\n type: \"patchwork:component\",\n id: \"patchwork-tool-storage-provider\",\n name: \"Tool Storage Provider\",\n async load() {\n const { ToolStorageProvider } = await import(\"./ToolStorageProvider.js\");\n return ToolStorageProvider;\n },\n },\n];\n"],"file":"index.js"}
|
|
1
|
+
{"version":3,"mappings":"gsCAEaA,EAAyB,CACpC,CACE,KAAM,sBACN,GAAI,8BACJ,KAAM,oBACN,MAAM,MAAO,CACX,KAAM,CAAE,iBAAAC,CAAA,EAAqB,MAAAC,EAAA,iCAAAD,CAAA,OAAM,QAAO,uCAAuB,0BAAAA,CAAA,uBACjE,OAAOA,CACT,GAEF,CACE,KAAM,sBACN,GAAI,2BACJ,KAAM,iBACN,MAAM,MAAO,CACX,KAAM,CAAE,cAAAE,CAAA,EAAkB,MAAAD,EAAA,8BAAAC,CAAA,OAAM,QAAO,oCAAoB,uBAAAA,CAAA,uBAC3D,OAAOA,CACT,GAEF,CACE,KAAM,sBACN,GAAI,6BACJ,KAAM,mBACN,MAAM,MAAO,CACX,KAAM,CAAE,gBAAAC,CAAA,EAAoB,MAAAF,EAAA,gCAAAE,CAAA,OAAM,QAAO,sCAAsB,yBAAAA,CAAA,uBAC/D,OAAOA,CACT,GAEF,CACE,KAAM,sBACN,GAAI,kCACJ,KAAM,wBACN,MAAM,MAAO,CACX,KAAM,CAAE,oBAAAC,CAAA,EAAwB,MAAAH,EAAA,oCAAAG,CAAA,OAAM,QAAO,0CAA0B,6BAAAA,CAAA,uBACvE,OAAOA,CACT,GAEF,CACE,KAAM,sBACN,GAAI,kCACJ,KAAM,wBACN,MAAM,MAAO,CACX,KAAM,CAAE,oBAAAC,CAAA,EAAwB,MAAAJ,EAAA,oCAAAI,CAAA,OAAM,QAAO,0CAA0B,6BAAAA,CAAA,uBACvE,OAAOA,CACT,GAEF,CACE,KAAM,sBACN,GAAI,4BACJ,KAAM,kBACN,MAAM,MAAO,CACX,KAAM,CAAE,eAAAC,CAAA,EAAmB,MAAAL,EAAA,+BAAAK,CAAA,OAAM,QAAO,qCAAqB,wBAAAA,CAAA,uBAC7D,OAAOA,CACT,EAEJ","names":["plugins","CommentsProvider","__vitePreload","FocusProvider","AccountProvider","SelectedDocProvider","ToolStorageProvider","WorkerProvider"],"ignoreList":[],"sources":["../src/index.ts"],"sourcesContent":["import type { Plugin } from \"@inkandswitch/patchwork-plugins\";\n\nexport const plugins: Plugin<any>[] = [\n {\n type: \"patchwork:component\",\n id: \"patchwork-comments-provider\",\n name: \"Comments Provider\",\n async load() {\n const { CommentsProvider } = await import(\"./CommentsProvider.js\");\n return CommentsProvider;\n },\n },\n {\n type: \"patchwork:component\",\n id: \"patchwork-focus-provider\",\n name: \"Focus Provider\",\n async load() {\n const { FocusProvider } = await import(\"./FocusProvider.js\");\n return FocusProvider;\n },\n },\n {\n type: \"patchwork:component\",\n id: \"patchwork-account-provider\",\n name: \"Account Provider\",\n async load() {\n const { AccountProvider } = await import(\"./AccountProvider.js\");\n return AccountProvider;\n },\n },\n {\n type: \"patchwork:component\",\n id: \"patchwork-selected-doc-provider\",\n name: \"Selected Doc Provider\",\n async load() {\n const { SelectedDocProvider } = await import(\"./SelectedDocProvider.js\");\n return SelectedDocProvider;\n },\n },\n {\n type: \"patchwork:component\",\n id: \"patchwork-tool-storage-provider\",\n name: \"Tool Storage Provider\",\n async load() {\n const { ToolStorageProvider } = await import(\"./ToolStorageProvider.js\");\n return ToolStorageProvider;\n },\n },\n {\n type: \"patchwork:component\",\n id: \"patchwork-worker-provider\",\n name: \"Worker Provider\",\n async load() {\n const { WorkerProvider } = await import(\"./WorkerProvider.js\");\n return WorkerProvider;\n },\n },\n];\n"],"file":"index.js"}
|
|
@@ -10,13 +10,16 @@
|
|
|
10
10
|
"sync": "vite build && pushwork sync",
|
|
11
11
|
"register": "pw-modules add \"$MODULE_SETTINGS_DOC_URL\" \"$(pushwork url)\"",
|
|
12
12
|
"test": "vitest run",
|
|
13
|
-
"test:watch": "vitest"
|
|
13
|
+
"test:watch": "vitest",
|
|
14
|
+
"typecheck": "tsc --noEmit"
|
|
14
15
|
},
|
|
15
16
|
"dependencies": {
|
|
16
17
|
"@automerge/automerge": "3.3.0-fragments.1",
|
|
17
18
|
"@automerge/automerge-repo": "^2.6.0-subduction.26",
|
|
19
|
+
"@grjte/patchwork-worker": "^0.0.2",
|
|
18
20
|
"@inkandswitch/patchwork-comments": "^0.1.2",
|
|
19
21
|
"@inkandswitch/patchwork-elements": "^6.0.2",
|
|
22
|
+
"@inkandswitch/patchwork-filesystem": "^0.2.9",
|
|
20
23
|
"@inkandswitch/patchwork-plugins": "^1.2.5",
|
|
21
24
|
"@inkandswitch/patchwork-providers": "^0.5.2"
|
|
22
25
|
},
|
|
@@ -27,6 +30,7 @@
|
|
|
27
30
|
"eslint": "^9.34.0",
|
|
28
31
|
"globals": "^16.4.0",
|
|
29
32
|
"happy-dom": "^15.11.7",
|
|
33
|
+
"typescript": "^5.6.0",
|
|
30
34
|
"typescript-eslint": "^8.41.0",
|
|
31
35
|
"vite": "^7.1.9",
|
|
32
36
|
"vitest": "^3.2.4"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as Te,b as ae,c as Ie,d as Ae}from"./chunk-DS3QVJZT.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-OHHPMOAE.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-FEMULUBJ.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
|
|
1
|
+
import{a as Te,b as ae,c as Ie,d as Ae}from"./chunk-DS3QVJZT.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-OHHPMOAE.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-FEMULUBJ.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=true 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
2
|
`)+`\r
|
|
3
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
4
|
position: absolute;
|
|
@@ -12,4 +12,4 @@ import{a as Te,b as ae,c as Ie,d as Ae}from"./chunk-DS3QVJZT.js";import{a as B,b
|
|
|
12
12
|
color: var(--document-list-primary-line);
|
|
13
13
|
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
|
14
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-VA4ELRJ6.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-KCPJAERD.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-
|
|
15
|
+
//# sourceMappingURL=chunk-XFYC7NFX.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/sideboard/document-list-panel.tsx", "../src/sideboard/document-list/auto-expand.ts", "../src/sideboard/document-list/document-list.tsx", "../src/sideboard/document-list/folder.tsx", "../src/sideboard/document-list/file-drop.ts", "../src/sideboard/document-list/item.tsx", "../src/sideboard/dnd/payload.ts", "../src/sideboard/document-list/name.tsx", "../src/sideboard/document-list/loading-row.tsx", "../node_modules/.pnpm/@inkandswitch+patchwork-providers-solid@0.2.8_@automerge+automerge-repo@2.6.0-subductio_67b137d5e2e338e4087baee1e2e96ad1/node_modules/@inkandswitch/patchwork-providers-solid/dist/index.js", "../src/sideboard/document-list/marquee.ts"],
|
|
4
|
-
"sourcesContent": ["import { template as _$template } from \"solid-js/web\";\nimport { delegateEvents as _$delegateEvents } from \"solid-js/web\";\nimport { insert as _$insert } from \"solid-js/web\";\nimport { effect as _$effect } from \"solid-js/web\";\nimport { createComponent as _$createComponent } from \"solid-js/web\";\nimport { use as _$use } from \"solid-js/web\";\nvar _tmpl$ = /*#__PURE__*/_$template(`<aside class=document-list><nav class=\"document-list__doclist document-list-widget\"role=tree aria-multiselectable=true><div class=document-list__toolbar><div class=document-list__filter-container><input name=filter class=document-list__filter placeholder=\"Filter by title\">`);\nimport { useDocument } from \"solid-automerge\";\nimport { createEffect, createMemo, createSelector, createSignal, lazy, onCleanup, Show, Suspense } from \"solid-js\";\nimport { render } from \"solid-js/web\";\nimport { setPendingNewDoc, setAutoExpandedFolders } from \"./state.ts\";\nimport { 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": "2XAAA,OAAS,YAAYA,OAAkB,eACvC,OAAS,kBAAkBC,OAAwB,eACnD,OAAS,UAAUC,OAAgB,eACnC,OAAS,UAAUC,OAAgB,eACnC,OAAS,mBAAmBC,MAAyB,eACrD,OAAS,OAAOC,OAAa,eAG7B,OAAS,gBAAAC,GAAc,cAAAC,GAAY,kBAAAC,GAAgB,gBAAAC,GAAc,QAAAC,GAAM,aAAAC,GAAW,QAAAC,GAAM,YAAAC,OAAgB,WACxG,OAAS,UAAAC,OAAc,eCSvB,eAAsBC,GACpBC,EACAC,EACAC,EACAC,EACAC,EACkB,CAClB,GAAIA,EAAQ,IAAIH,CAAS,EAAG,MAAO,GACnC,IAAMI,EAAc,IAAI,IAAID,CAAO,EACnCC,EAAY,IAAIJ,CAAS,EAEzB,IAAIK,EACJ,GAAI,CAEFA,GADe,MAAMN,EAAK,KAAgBC,CAAS,GACtC,IAAI,CACnB,MAAQ,CACN,MAAO,EACT,CACA,GAAI,CAACK,GAAK,KAAM,MAAO,GAEvB,IAAIC,EAAWD,EAAI,KAAK,KAAME,GAAUN,EAAS,IAAIM,EAAM,GAAG,CAAC,EAQ/D,OAPmB,MAAM,QAAQ,IAC/BF,EAAI,KACD,OAAQE,GAAUA,EAAM,OAAS,QAAQ,EACzC,IAAKA,GACJT,GAAuBC,EAAMQ,EAAM,IAAKN,EAAUC,EAAQE,CAAW,CACvE,CACJ,GACe,KAAK,OAAO,IAAGE,EAAW,IAErCA,GAAUJ,EAAO,IAAIF,CAAS,EAC3BM,CACT,CClDA,OAAS,YAAYE,OAAkB,eACvC,OAAS,UAAUC,OAAgB,eACnC,OAAS,QAAQC,OAAc,eAC/B,OAAS,UAAUC,OAAgB,eACnC,OAAS,mBAAmBC,MAAyB,eAIrD,OAAS,YAAAC,GAAU,cAAAC,OAAkB,iCACrC,OAAS,eAAAC,GAAa,kBAAAC,OAAsB,kCAC5C,OAAS,gBAAAC,GAAc,cAAAC,GAAY,gBAAAC,GAAc,OAAAC,GAAK,QAAAC,GAAM,SAAAC,GAAO,aAAAC,GAAW,QAAAC,GAAM,YAAAC,GAAU,UAAAC,GAAQ,WAAAC,OAAe,WCVrH,OAAS,YAAYC,OAAkB,eACvC,OAAS,SAASC,OAAe,eACjC,OAAS,gBAAgBC,MAAsB,eAC/C,OAAS,UAAUC,OAAgB,eACnC,OAAS,UAAUC,OAAgB,eACnC,OAAS,mBAAmBC,MAAyB,eACrD,OAAS,oBAAoBC,OAA0B,eACvD,MAA+B,eAG/B,OAAS,cAAAC,OAAkB,iCCE3B,eAAsBC,EACpBC,EACAC,EACAC,EACAC,EACAC,EACe,CACf,QAAWC,KAAQ,MAAM,KAAKL,CAAK,EACjC,GAAI,CAEF,IAAMM,EAAc,MAAMD,EAAK,YAAY,EACrCE,EAAU,IAAI,WAAWD,CAAW,EAGpCE,EAAYH,EAAK,KAAK,MAAM,GAAG,EAC/BI,EAAYD,EAAU,OAAS,EAAIA,EAAU,IAAI,EAAK,GACtDE,EAAiBF,EAAU,KAAK,GAAG,EAGnCG,EAAS,MAAMT,EAAK,QAA8C,CACtE,aAAc,CACZ,KAAM,MACR,EACA,QAAAK,EACA,UAAAE,EACA,SAAUJ,EAAK,MAAQ,2BACvB,KAAMK,CACR,CAAC,EAGKE,EACJT,IAAa,QACTC,EACAD,IAAa,QACXC,EAAc,EACd,EAGRH,EAAa,OAAQY,GAAW,CAC9BA,EAAO,KAAK,OAAOD,EAAa,EAAG,CACjC,IAAKD,EAAO,IACZ,KAAMN,EAAK,KACX,KAAM,MACR,CAAC,CACH,CAAC,EAEDS,EAAI,mCAAoCT,EAAK,KAAMM,EAAO,GAAG,CAC/D,OAASI,EAAO,CACdD,EAAI,4CAA6CC,CAAK,CACxD,CAEJ,CDlDA,OAAS,gBAAAC,GAAc,gBAAAC,GAAc,aAAAC,GAAW,QAAAC,GAAM,YAAAC,OAAgB,WEbtE,OAAS,YAAYC,OAAkB,eACvC,OAAS,kBAAkBC,OAAwB,eACnD,OAAS,gBAAgBC,MAAsB,eAC/C,OAAS,UAAUC,OAAgB,eACnC,OAAS,UAAUC,OAAgB,eACnC,OAAS,oBAAoBC,OAA0B,eACvD,OAAS,OAAOC,OAAa,eAE7B,OAAS,gBAAAC,GAAc,gBAAAC,GAAc,aAAAC,OAAiB,WAGtD,OAAS,qBAAAC,OAAyB,iCAClC,OAAS,oCAAAC,OAAwC,qCCZjD,OACE,uBAAAC,OAEK,iCAeA,IAAMC,GAAiB,CAC5B,uBACA,wBACA,gBACA,YACF,EAEO,SAASC,GAAgBC,EAAmC,CACjE,MAAO,GACLA,GACEF,GAAe,KAAMG,GAASD,EAAa,MAAM,SAASC,CAAI,CAAC,EAErE,CAEA,SAASC,GAAYC,EAAmC,CACtD,IAAMC,EAAUD,EAAK,KAAK,EAC1B,GAAIN,GAAoBO,CAAO,EAAG,OAAOA,EAEzC,IAAMC,EAAQD,EAAQ,MAAM,gBAAgB,IAAI,CAAC,EACjD,OAAIC,GAASR,GAAoB,aAAaQ,CAAK,EAAE,EAC5C,aAAaA,CAAK,GAEpB,IACT,CAEO,SAASC,EAAcC,EAAqC,CACjE,IAAMC,EAAOD,EAAM,aACnB,GAAI,CAACC,EAAM,OAAO,KAElB,IAAMC,EAAUD,EAAK,QAAQ,sBAAsB,EACnD,GAAIC,EACF,GAAI,CACF,IAAMC,EAAS,KAAK,MAAMD,CAAO,EACjC,GAAI,MAAM,QAAQC,GAAQ,KAAK,GAAKA,EAAO,MAAM,OAAS,EACxD,MAAO,CAAE,OAAQA,EAAO,QAAU,GAAI,MAAOA,EAAO,KAAM,CAE9D,MAAQ,CAER,CAGF,IAAMC,EAAUH,EAAK,QAAQ,uBAAuB,EACpD,GAAIG,EACF,GAAI,CACF,IAAMC,EAAgB,KAAK,MAAMD,CAAO,EAClCE,GAAS,MAAM,QAAQD,CAAI,EAAIA,EAAO,CAAC,GAC1C,OAAQE,GAA6BjB,GAAoBiB,CAAG,CAAC,EAC7D,IAAKA,IAAS,CAAE,IAAAA,CAAI,EAAE,EACzB,GAAID,EAAM,OAAS,EAAG,MAAO,CAAE,OAAQ,GAAI,MAAAA,CAAM,CACnD,MAAQ,CAER,CAIF,IAAMA,GADOL,EAAK,QAAQ,eAAe,GAAKA,EAAK,QAAQ,YAAY,GAEpE,MAAM,OAAO,EACb,IAAIN,EAAW,EACf,OAAQY,GAA6BA,IAAQ,IAAI,EACjD,IAAKA,IAAS,CAAE,IAAAA,CAAI,EAAE,EACzB,OAAID,EAAM,OAAS,EAAU,CAAE,OAAQ,GAAI,MAAAA,CAAM,EAE1C,IACT,CD1EA,IAAIE,GAAsBC,GAAW,gGAAgG,EAU/HC,GAAW,CACf,IAAK,YACL,IAAK,aACL,KAAM,aACN,IAAK,YACL,KAAM,aACN,KAAM,aACN,IAAK,YACL,KAAM,aACN,IAAK,gBACL,IAAK,kBACL,IAAK,YACL,KAAM,aACN,IAAK,kBACL,IAAK,aACL,IAAK,YACL,IAAK,YACL,IAAK,aACL,GAAI,gBACJ,IAAK,WACL,KAAM,mBACN,KAAM,YACN,IAAK,iBACP,EACA,SAASC,GAAYC,EAAM,CACzB,IAAMC,EAAMD,EAAK,SAAS,GAAG,EAAIA,EAAK,MAAM,GAAG,EAAE,IAAI,EAAE,YAAY,EAAI,GACvE,OAAOC,EAAMH,GAASG,CAAG,EAAI,MAC/B,CACA,SAASC,GAAaC,EAAI,CACxB,QAASC,EAAID,EAAG,cAAeC,EAAGA,EAAIA,EAAE,cAAe,CACrD,IAAMC,EAAW,iBAAiBD,CAAC,EAAE,UACrC,IAAKC,IAAa,QAAUA,IAAa,WAAaD,EAAE,aAAeA,EAAE,aACvE,OAAOA,CAEX,CACA,OAAO,SAAS,kBAAoB,SAAS,IAC/C,CACA,SAASE,GAAsBH,EAAI,CACjC,IAAMI,EAAYL,GAAaC,CAAE,EAC3BK,EAAMD,EAAU,sBAAsB,EACtCE,EAAWF,EAAU,iBAAiB,2CAA2C,EACvF,QAAWG,KAAQD,EAAU,CAC3B,IAAME,EAAOD,EAAK,sBAAsB,EACxC,GAAIC,EAAK,KAAOH,EAAI,KAAOG,EAAK,QAAUH,EAAI,OAAQ,MAAO,EAC/D,CACA,MAAO,EACT,CACe,SAARI,EAAsBC,EAAO,CAClC,IAAIC,EACE,CAACC,EAAUC,CAAW,EAAIC,GAAa,IAAI,EAC7CC,EAAiB,GACrB,SAASC,GAAmB,CACtBD,GAAkBL,EAAM,OAAS,SACrCK,EAAiB,GACjBL,EAAM,KAAK,KAAKA,EAAM,GAAG,EAAE,KAAKO,GAAU,CACxC,IAAMC,EAAMD,GAAQ,IAAI,EACxB,GAAI,CAACC,EAAK,OACV,IAAMC,EAAO,OAAOD,EAAI,MAAQR,EAAM,MAAQ,MAAM,EAC9CZ,EAAMoB,EAAI,UAAY,IAAI,OAAOA,EAAI,SAAS,EAAE,QAAQ,OAAQ,EAAE,CAAC,GAAK,GACxEE,EAAWtB,GAAO,CAACqB,EAAK,SAASrB,CAAG,EAAI,GAAGqB,CAAI,GAAGrB,CAAG,GAAKqB,EAC1DE,EAAO,OAAOH,EAAI,UAAYtB,GAAYwB,CAAQ,GAAK,0BAA0B,EACvFP,EAAY,CACV,KAAAQ,EACA,SAAAD,CACF,CAAC,CACH,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,EACnB,CACAE,GAAaC,IACPb,EAAM,SAAW,CAACa,GAChBZ,GAAW,CAACR,GAAsBQ,CAAO,GAC3CA,EAAQ,yBAAyB,EAG9BD,EAAM,QACd,EACD,IAAMc,EAAM,KAAO,CACjB,GAAId,EAAM,GACV,KAAMA,EAAM,KACZ,IAAKA,EAAM,IACX,KAAMA,EAAM,KACZ,OAAQA,EAAM,QAAQ,MACxB,GACMe,EAAiB,KACnBC,EAAc,KACdC,EAAkB,GACtB,SAASC,EAAgBC,EAAQ,CAC3BnB,EAAM,OAAS,UAAYoB,EAAU,IAAIpB,EAAM,EAAE,GACjDgB,GAAeC,IACnBE,EAAO,aAAa,sBAAuB,EAAE,EAC7CH,EAAc,WAAW,IAAM,CAC7BA,EAAc,KACdC,EAAkB,GAClBE,EAAO,gBAAgB,qBAAqB,EAC5CnB,EAAM,SAAS,CACjB,EAAGe,CAAc,EACnB,CACA,SAASM,GAAiB,CACpBL,IACF,aAAaA,CAAW,EACxBA,EAAc,MAEhBC,EAAkB,GAClBhB,GAAS,gBAAgB,qBAAqB,CAChD,CACAqB,GAAUD,CAAc,EACxB,SAASE,EAASC,EAAGC,EAAG,CACtBC,GAAc,CACZ,EAAAF,EACA,EAAAC,EACA,QAASxB,EACT,GAAID,EAAM,GACV,IAAKA,EAAM,IACX,KAAMA,EAAM,KACZ,KAAMA,EAAM,KACZ,SAAUA,EAAM,SAChB,cAAeA,EAAM,cACrB,OAAQA,EAAM,OACd,aAAcA,EAAM,YACtB,CAAC,CACH,CACA,IAAI2B,EACEC,EAAkB,IAAM,aAAaD,CAAS,EACpDL,GAAUM,CAAe,EACzB,eAAeC,EAAWC,EAAOC,EAAUC,EAAU,CAEnD,GADAC,EAAI,gCAAiCF,EAAUC,CAAQ,EACnDF,EAAM,cAAc,OAASA,EAAM,aAAa,MAAM,OAAS,EAAG,CACpE,IAAMI,EAAeF,IAAa,UAAYhC,EAAM,OAAS,SAAW,MAAMA,EAAM,KAAK,KAAKA,EAAM,GAAG,EAAIA,EAAM,oBAAsBA,EAAM,iBAC7I,MAAMmC,EAAgBL,EAAM,aAAa,MAAOI,EAAclC,EAAM,KAAMgC,EAAUA,IAAa,SAAW,EAAIhC,EAAM,WAAa,CAAC,EACpI,MACF,CACA,IAAMoC,EAAUC,EAAcP,CAAK,EACnC,GAAI,CAACM,EAAS,CACZH,EAAI,oCAAqCH,EAAM,cAAc,KAAK,EAClE,MACF,CACA,GAAM,CACJ,OAAAQ,EACA,MAAAC,CACF,EAAIH,EACJH,EAAI,aAAc,CAChB,OAAAK,EACA,MAAAC,EACA,SAAAR,EACA,SAAAC,CACF,CAAC,EACDQ,EAAY,CACV,WAAYD,EAAM,IAAIE,GAAKA,EAAE,EAAE,EAC/B,YAAaF,EAAM,IAAIE,GAAKA,EAAE,GAAG,EACjC,aAAcF,EACd,SAAAR,EACA,SAAAC,EACA,aAAcM,EACd,SAAUI,EAAS,CACrB,EAAG1C,EAAM,KAAMA,EAAM,iBAAkB2C,EAAqB3C,EAAM,OAAO,CAAC,CAC5E,CACA,OAAQ,IAAM,CACZ,IAAI4C,EAAO7D,GAAO,EAClB6D,EAAK,UAAYd,GAAS,CACxB,GAAIA,EAAM,MAAQ,aAAeA,EAAM,MAAQ,UAAW,CACxDA,EAAM,eAAe,EACrB,IAAMe,EAAUf,EAAM,cAChBgB,EAAW,MAAM,KAAK,SAAS,iBAAiB,iBAAiB,CAAC,EAAE,OAAOjD,GAAQA,EAAK,eAAiB,IAAI,EAC7GkD,EAAeD,EAAS,QAAQD,CAAO,EACzCf,EAAM,MAAQ,aAAeiB,EAAeD,EAAS,OAAS,EAChEA,EAASC,EAAe,CAAC,GAAG,MAAM,EACzBjB,EAAM,MAAQ,WAAaiB,EAAe,GACnDD,EAASC,EAAe,CAAC,GAAG,MAAM,EAEpC,MACF,CACA,GAAI/C,EAAM,OAAS,UAAYA,EAAM,gBACnC,GAAI8B,EAAM,MAAQ,cAAgB,CAAC9B,EAAM,WAAY,CACnD8B,EAAM,eAAe,EACrB9B,EAAM,eAAe,EACrB,MACF,SAAW8B,EAAM,MAAQ,aAAe9B,EAAM,WAAY,CACxD8B,EAAM,eAAe,EACrB9B,EAAM,eAAe,EACrB,MACF,EAEF,GAAI8B,EAAM,KAAO,SAAWA,EAAM,SAAW,EAAE,CAACA,EAAM,OAAS,CAACA,EAAM,SAAW,CAACA,EAAM,SAAU,CAChGA,EAAM,eAAe,EACrBA,EAAM,yBAAyB,EAC/BA,EAAM,gBAAgB,EACtB,IAAMnC,EAAMM,EAAQ,sBAAsB,EAC1CsB,EAAS5B,EAAI,EAAI,GAAIA,EAAI,EAAIA,EAAI,OAAS,EAAE,CAC9C,CACF,EACAqD,GAAmBJ,EAAM,WAAY,IAAM,CACzC5C,EAAM,cAAc,CACtB,CAAC,EACDgD,GAAmBJ,EAAM,QAASd,GAAS,CACrCA,EAAM,SAAWA,EAAM,SAGZA,EAAM,OACV,QAAQ,mDAAmD,IAGtEmB,EAAe,EACfjD,EAAM,SAAS,EACjB,CAAC,EACD4C,EAAK,YAAcd,GAAS,CAC1BxB,EAAiB,EACbwB,EAAM,SAAWA,EAAM,SACrBV,EAAU,IAAIpB,EAAM,EAAE,EACxBkD,EAAoBlD,EAAM,EAAE,EAE5BmD,EAAenD,EAAM,GAAIc,EAAI,CAAC,EAEhCgB,EAAM,eAAe,EACrBA,EAAM,gBAAgB,EACtBA,EAAM,yBAAyB,GACrBV,EAAU,IAAIpB,EAAM,EAAE,GAChCiD,EAAe,CAEnB,EACAL,EAAK,iBAAiB,OAAQd,GAAS,CACrCT,EAAe,EACf,IAAMF,EAASiC,EAAc,EAE7B,GADA,QAAQ,IAAI,gCAAiCpD,EAAM,GAAI,QAASA,EAAM,KAAM,UAAWmB,CAAM,EACzFnB,EAAM,OAAS,UAAYmB,GAAQ,WAAa,SAAU,CAG5D,GAFAW,EAAM,eAAe,EACrBA,EAAM,gBAAgB,EAClBuB,EAAavB,CAAK,EAAG,CACvBwB,EAAiB,CACf,aAActD,EAAM,IACpB,MAAO,CACT,CAAC,EACDuD,EAAgB,EAChB,MACF,CACA1B,EAAWC,EAAOX,EAAO,GAAI,QAAQ,EACrCoC,EAAgB,EAChB,MACF,CAIA,GAHAtB,EAAI,2BAA2B,EAC/BH,EAAM,eAAe,EACrBA,EAAM,gBAAgB,EAClB,CAACX,EAAQ,CACXc,EAAI,oBAAoB,EACxB,MACF,CACA,GAAIoB,EAAavB,CAAK,EAAG,CACvB,GAAI9B,EAAM,oBAAsBA,EAAM,WAAa,KAAM,CACvD,IAAMwD,EAAQrC,EAAO,WAAa,QAAUnB,EAAM,UAAYA,EAAM,UAAY,EAChFsD,EAAiB,CACf,aAActD,EAAM,mBAAmB,IACvC,MAAAwD,CACF,CAAC,CACH,CACAD,EAAgB,EAChB,MACF,CACA1B,EAAWC,EAAOX,EAAO,GAAIA,EAAO,QAAQ,EAC5CoC,EAAgB,CAClB,CAAC,EACDX,EAAK,iBAAiB,YAAad,GAAS,CAC1C,IAAM2B,EAAU3B,EAAM,eAClB,CAAC2B,GAAW,CAAC3B,EAAM,cAAc,SAAS2B,CAAO,KACnDpC,EAAe,EACfkC,EAAgB,EAEpB,CAAC,EACDX,EAAK,iBAAiB,WAAYd,GAAS,CACzCA,EAAM,eAAe,EACrBA,EAAM,aAAa,WAAaY,EAAS,EAAI,OAAS,OACtD,IAAIV,EACJ,GAAIhC,EAAM,OAAS,SAAU,CAC3B,IAAMF,EAAOgC,EAAM,cAAc,sBAAsB,EAEjD4B,GADS5B,EAAM,QAAUhC,EAAK,KACFA,EAAK,OACnC4D,EAAmB,IACrB1B,EAAW,QACF0B,EAAmB,IAC5B1B,EAAW,QAEXA,EAAW,SAETA,IAAa,UACfF,EAAM,gBAAgB,CAE1B,MACEE,EAAW2B,GAAQ7B,EAAM,QAASA,EAAM,aAAa,EAAI,QAAU,QACnEA,EAAM,gBAAgB,EAExB8B,GAAc,CACZ,GAAI5D,EAAM,GACV,SAAAgC,CACF,CAAC,EACDd,EAAgBY,EAAM,aAAa,CACrC,CAAC,EACDc,EAAK,iBAAiB,UAAW,IAAM,CACrCvB,EAAe,EACfwC,GAAqB,EACrBZ,EAAe,EACfa,EAAY,EAAK,EACjBC,GAAkB,IAAI,EACtBC,GAAY,EAAK,CACnB,CAAC,EACDpB,EAAK,iBAAiB,OAAQd,GAAS,CACjCA,EAAM,SAAWY,EAAS,GAC5BoB,EAAYhC,EAAM,MAAM,CAE5B,CAAC,EACDc,EAAK,iBAAiB,YAAad,GAAS,CAC1CF,EAAgB,EACXR,EAAU,IAAIpB,EAAM,EAAE,IACzBiD,EAAe,EACfE,EAAenD,EAAM,GAAIc,EAAI,CAAC,GAEhC,IAAMyB,EAAQnB,EAAU,OAAO,EACzB6C,EAAO,CAAC,EACRC,EAAM,CAAC,EACbJ,EAAYhC,EAAM,MAAM,EACxBA,EAAM,aAAa,cAAgB,MACnC,QAAWjC,KAAQ0C,EACjB0B,EAAK,KAAKpE,EAAK,GAAG,EAClBqE,EAAI,KAAKrE,EAAK,EAAE,EAElB,IAAMsE,EAAUF,EAAK,IAAIG,GAAO,SAAS,SAAW,KAAO,SAAS,KAAO,SAASC,GAAkBD,CAAG,EAAE,UAAU,EAAE,EAAE,KAAK;AAAA,CAAM,EAAI;AAAA,EAQxI,GAPAtC,EAAM,cAAc,MAAM,IAAIqC,EAAS,eAAe,EACtDrC,EAAM,cAAc,MAAM,IAAI,KAAK,UAAUoC,CAAG,EAAG,sBAAsB,EACzEpC,EAAM,cAAc,MAAM,IAAI,KAAK,UAAUmC,CAAI,EAAG,uBAAuB,EAC3EnC,EAAM,cAAc,MAAM,IAAI,KAAK,UAAU,CAC3C,OAAQ9B,EAAM,QAAQ,OACtB,MAAO,CAAC,GAAGoB,EAAU,OAAO,CAAC,CAC/B,CAAC,EAAG,sBAAsB,EACtBA,EAAU,OAAS,GAAKpB,EAAM,OAAS,OAAQ,CACjD,IAAMsE,EAAOpE,EAAS,EAChBQ,EAAW4D,GAAM,UAAYtE,EAAM,KACnCW,EAAO2D,GAAM,MAAQpF,GAAYwB,CAAQ,GAAK,2BACpD,GAAI,CACF,IAAM6D,GAAQ,IAAI,IAAIC,GAAiCxE,EAAM,GAAG,EAAG,SAAS,MAAM,EAAE,KACpF8B,EAAM,cAAc,QAAQ,cAAe,GAAGnB,CAAI,IAAID,CAAQ,IAAI6D,EAAK,EAAE,CAC3E,MAAQ,CAAC,CACX,CACA,IAAME,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,MAAM,QAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAYxB,IAAMC,EAAQtD,EAAU,KAClBuD,EAAW7C,EAAM,OAAS,UAAY,GAC5C2C,EAAQ,YAAcC,IAAU,EAAI1E,EAAM,KAAO2E,EAAW,GAAGD,CAAK,SAASC,CAAQ,GACrF,SAAS,KAAK,YAAYF,CAAO,EACjC3C,EAAM,aAAa,aAAa2C,EAAS,GAAI,EAAE,EAC/C,WAAW,IAAMA,EAAQ,OAAO,EAAG,CAAC,EACpCG,GAAmB,CAAC,GAAGxD,EAAU,KAAK,CAAC,CAAC,EACxC2C,GAAkB/D,EAAM,OAAO,EAC/BgE,GAAY,EAAI,CAClB,CAAC,EACDpB,EAAK,iBAAiB,gBAAiBhB,CAAe,EACtDgB,EAAK,YAAchB,EACnBgB,EAAK,cAAgBd,GAAS,EACxBA,EAAM,cAAgB,SAAWA,EAAM,cAAgB,SACzDH,EAAY,WAAW,IAAMJ,EAASO,EAAM,QAASA,EAAM,OAAO,EAAG,GAAG,EAE5E,EACAkB,GAAmBJ,EAAM,cAAed,GAAS,CAC/CA,EAAM,eAAe,EACrBA,EAAM,gBAAgB,EACtBP,EAASO,EAAM,QAASA,EAAM,OAAO,CACvC,CAAC,EACD,IAAI+C,EAAQ5E,EACZ,cAAO4E,GAAU,WAAaC,GAAMD,EAAOjC,CAAI,EAAI3C,EAAU2C,EAC7DmC,GAASnC,EAAM,IAAM5C,EAAM,QAAQ,EACnCgF,GAASC,GAAO,CACd,IAAIC,EAAMlF,EAAM,GACdmF,EAAOnF,EAAM,IACboF,EAAOpF,EAAM,KACbqF,EAAOrF,EAAM,YAAY,EACzBsF,EAAOtF,EAAM,QAAU,OAAS,OAClC,OAAAkF,IAAQD,EAAI,GAAKM,EAAe3C,EAAM,gBAAiBqC,EAAI,EAAIC,CAAG,EAClEC,IAASF,EAAI,GAAKM,EAAe3C,EAAM,eAAgBqC,EAAI,EAAIE,CAAI,EACnEC,IAASH,EAAI,GAAKM,EAAe3C,EAAM,gBAAiBqC,EAAI,EAAIG,CAAI,EACpEC,IAASJ,EAAI,GAAKM,EAAe3C,EAAM,aAAcqC,EAAI,EAAII,CAAI,EACjEC,IAASL,EAAI,GAAKM,EAAe3C,EAAM,gBAAiBqC,EAAI,EAAIK,CAAI,EAC7DL,CACT,EAAG,CACD,EAAG,OACH,EAAG,OACH,EAAG,OACH,EAAG,OACH,EAAG,MACL,CAAC,EACMrC,CACT,GAAG,CACL,CACA4C,GAAiB,CAAC,cAAe,YAAa,YAAa,SAAS,CAAC,EE/ZrE,OAAS,YAAYC,OAAkB,eACvC,OAAS,kBAAkBC,OAAwB,eACnD,OAAS,UAAUC,OAAgB,eACnC,OAAS,mBAAmBC,OAAyB,eACrD,OAAS,UAAUC,OAAgB,eACnC,OAAS,OAAOC,OAAa,eAG7B,OAAS,kBAAAC,GAAgB,gBAAAC,GAAc,SAAAC,GAAO,UAAAC,OAAc,WAF5D,IAAIC,GAAsBC,GAAW,+EAA+E,EAClHC,GAAuBD,GAAW,uCAAuC,EAGpE,SAASE,GAASC,EAAO,CAC9B,IAAMC,EAAiBC,GAAeC,EAAQ,EACxC,CAACC,EAAMC,CAAO,EAAIC,GAAaN,EAAM,IAAI,EAC/C,SAASO,GAAO,CACdP,EAAM,OAAOI,EAAK,GAAK,EAAE,EACrBH,EAAeD,EAAM,EAAE,GAAGQ,EAAY,EAAE,CAC9C,CACA,OAAOC,GAAkBC,GAAQ,CAC/B,IAAI,UAAW,CACb,MAAO,CAACD,GAAkBE,GAAO,CAC/B,IAAI,MAAO,CACT,OAAOV,EAAeD,EAAM,EAAE,CAChC,EACA,IAAI,UAAW,CACb,IAAIY,EAAOhB,GAAO,EAChBiB,EAAQD,EAAK,WACf,OAAAA,EAAK,iBAAiB,SAAUE,GAAS,CACvCA,EAAM,eAAe,EACrBP,EAAK,CACP,CAAC,EACDM,EAAM,QAAUC,GAAST,EAAQS,EAAM,OAAO,KAAK,EACnDD,EAAM,UAAYC,GAAS,EACrBA,EAAM,KAAO,UAAYA,EAAM,KAAO,KAAOA,EAAM,UACrDP,EAAK,CAET,EACAM,EAAM,iBAAiB,OAAQN,CAAI,EACnCQ,GAAMC,GAAM,CACVX,EAAQL,EAAM,IAAI,EAClB,WAAW,IAAM,CACfgB,EAAG,MAAM,EACTA,EAAG,OAAO,CACZ,EAAG,EAAE,CACP,EAAGH,CAAK,EACRI,GAAS,IAAMJ,EAAM,MAAQT,EAAK,CAAC,EAC5BQ,CACT,CACF,CAAC,EAAGH,GAAkBE,GAAO,CAC3B,IAAI,MAAO,CACT,MAAO,CAACV,EAAeD,EAAM,EAAE,CACjC,EACA,IAAI,UAAW,CACb,IAAIkB,EAAQpB,GAAQ,EACpB,OAAAqB,GAASD,EAAO,IAAMlB,EAAM,IAAI,EACzBkB,CACT,CACF,CAAC,CAAC,CACJ,CACF,CAAC,CACH,CACAE,GAAiB,CAAC,UAAW,OAAO,CAAC,EC5DrC,OAAS,YAAYC,OAAkB,eACvC,OAAS,UAAUC,OAAgB,eACnC,OAAS,mBAAmBC,OAAyB,eACrD,OAAS,oBAAoBC,OAA0B,eACvD,OAAS,UAAUC,OAAgB,eAGnC,OAAS,OAAAC,OAAW,WAFpB,IAAIC,GAAsBN,GAAW,uHAAuH,EAC1JO,GAAuBP,GAAW,kFAAkF,EAE/G,SAASQ,GAAWC,EAAO,CAChC,OAAQ,IAAM,CACZ,IAAIC,EAAOJ,GAAO,EAClB,OAAAF,GAASO,GAAOR,GAAmBO,EAAM,UAAWD,EAAM,OAAS,CAAC,CAAC,EAC9DC,CACT,GAAG,CACL,CACA,IAAME,GAAkB,CAAC,QAAS,OAAQ,SAAU,OAAQ,QAAS,MAAM,EACpE,SAASC,GAAYJ,EAAO,CACjC,IAAMK,EAAO,IAAM,MAAM,KAAK,CAC5B,OAAQL,EAAM,OAAS,CACzB,EAAG,CAACM,EAAGC,IAAMA,CAAC,EACd,OAAQ,IAAM,CACZ,IAAIC,EAAQV,GAAQ,EACpB,OAAAN,GAASgB,EAAOf,GAAkBG,GAAK,CACrC,IAAI,MAAO,CACT,OAAOS,EAAK,CACd,EACA,SAAUE,IAAM,IAAM,CACpB,IAAIE,EAAQZ,GAAO,EACjBa,EAAQD,EAAM,WAChB,OAAAd,GAASgB,GAAO,CACd,IAAIC,EAAMZ,EAAM,OAAS,EACvBa,EAAOV,GAAgBI,EAAIJ,GAAgB,MAAM,EACnD,OAAAS,IAAQD,EAAI,GAAKjB,GAAmBe,EAAO,UAAWE,EAAI,EAAIC,CAAG,EACjEC,IAASF,EAAI,GAAKjB,GAAmBgB,EAAO,QAASC,EAAI,EAAIE,CAAI,EAC1DF,CACT,EAAG,CACD,EAAG,OACH,EAAG,MACL,CAAC,EACMF,CACT,GAAG,CACL,CAAC,CAAC,EACKD,CACT,GAAG,CACL,CLpCA,IAAIM,GAAsBC,GAAW,6CAA6C,EAChFC,GAAuBD,GAAW,uFAAuF,EAgB5G,SAARE,GAAwBC,EAAO,CACpC,GAAM,CAACC,EAAUC,CAAW,EAAIC,GAAa,EAAK,EAC5C,CAACC,EAAQC,CAAM,EAAIC,EAAY,IAAMN,EAAM,IAAKA,CAAK,EACrDO,EAAqB,IAAI,IAAIP,EAAM,gBAAkB,CAAC,CAAC,EAC7DO,EAAmB,IAAIP,EAAM,GAAG,EAChC,IAAMQ,EAAQ,IAAMR,EAAM,OAAS,EAC7BS,EAAa,KAAO,CACxB,UAAWD,EAAM,EAAI,CACvB,GACME,EAAmB,KAAO,CAC9B,UAAWF,EAAM,CACnB,GACAG,GAAaC,IACP,CAACA,GAAQZ,EAAM,QAAUa,EAAcb,EAAM,OAAQI,EAAO,GAAG,OAASJ,EAAM,IAAI,GACpFE,EAAY,EAAI,EAEXF,EAAM,OACd,EACDW,GAAa,IAAM,CACbG,GAAoB,EAAE,IAAId,EAAM,GAAG,GAAGE,EAAY,EAAI,CAC5D,CAAC,EACD,IAAIa,EAAkB,KAClBC,EAAoB,GACxB,SAASC,GAAsB,CACzBF,GAAmBC,IACvBD,EAAkB,WAAW,IAAM,CACjCb,EAAYgB,GAAK,CAACA,CAAC,EACnBF,EAAoB,GACpBD,EAAkB,IACpB,EAAG,GAAG,EACR,CACA,SAASI,GAAqB,CACxBJ,IACF,aAAaA,CAAe,EAC5BA,EAAkB,MAEpBC,EAAoB,EACtB,CACAI,GAAUD,CAAkB,EAC5B,SAASE,EAAOC,EAAM,CACpBjB,EAAO,GAAG,OAAOkB,GAAOC,GAAWD,EAAK,CAAC,OAAO,EAAGD,CAAI,CAAC,CAC1D,CACA,eAAeG,EAAaC,EAAU,CACpC,IAAMC,EAAItB,EAAO,EACjB,GAAI,CAACsB,EAAG,OACR,IAAMC,EAAS,MAAMC,GAAU7B,EAAM,KAAM0B,CAAQ,EAC/CI,EAAW,EACfH,EAAE,OAAOI,GAAW,CAClBA,EAAQ,KAAK,KAAKH,CAAM,EACxBE,EAAWC,EAAQ,KAAK,OAAS,CACnC,CAAC,EACD/B,EAAM,YAAY,EAClBE,EAAY,EAAI,EAChBF,EAAM,KAAK4B,CAAM,EACjBI,EAAYL,EAAE,IAAM,IAAMG,CAAQ,CACpC,CACA,eAAeG,EAAqBC,EAAO,CAEzC,GADAC,EAAI,kCAAmCnC,EAAM,GAAG,EAC5CkC,EAAM,cAAc,OAASA,EAAM,aAAa,MAAM,OAAS,EAAG,CACpE,MAAME,EAAgBF,EAAM,aAAa,MAAO7B,EAAO,EAAGL,EAAM,KAAM,SAAU,CAAC,EACjF,MACF,CACA,IAAMqC,EAAUC,EAAcJ,CAAK,EACnC,GAAI,CAACG,EAAS,CACZF,EAAI,oCAAqCD,EAAM,cAAc,KAAK,EAClE,MACF,CACA,GAAM,CACJ,OAAAK,EACA,MAAAC,CACF,EAAIH,EACJF,EAAI,aAAc,CAChB,OAAAI,EACA,MAAAC,EACA,UAAWxC,EAAM,GACnB,CAAC,EACDyC,EAAY,CACV,WAAYD,EAAM,IAAIE,GAAKA,EAAE,EAAE,EAC/B,YAAaF,EAAM,IAAIE,GAAKA,EAAE,GAAG,EACjC,aAAcF,EACd,SAAUxC,EAAM,IAChB,SAAU,SACV,aAAcuC,EACd,SAAUI,EAAS,CACrB,EAAG3C,EAAM,KAAMA,EAAM,iBAAkB4C,EAAqB5C,EAAM,OAAO,CAAC,CAC5E,CACA,OAAQ,IAAM,CACZ,IAAI6C,EAAO/C,GAAQ,EACjBgD,EAAQD,EAAK,WACf,OAAAA,EAAK,iBAAiB,OAAQX,GAAS,CAMrC,GALAf,EAAmB,EACnBgB,EAAI,4BAA6BnC,EAAM,GAAG,EAC1CkC,EAAM,eAAe,EACrBA,EAAM,gBAAgB,EACPa,EAAc,GACjB,WAAa,SACvB,GAAIC,EAAad,CAAK,EAAG,CACvB,IAAMP,EAAItB,EAAO,EACbsB,IACFzB,EAAY,EAAI,EAChB+C,EAAiB,CACf,aAActB,EAAE,IAChB,MAAO,CACT,CAAC,EAEL,MACEM,EAAqBC,CAAK,EAG9BgB,EAAgB,CAClB,CAAC,EACDL,EAAK,iBAAiB,YAAaX,GAAS,CAC1C,IAAMiB,EAAUjB,EAAM,eAClB,CAACiB,GAAW,CAACjB,EAAM,cAAc,SAASiB,CAAO,KACnDhC,EAAmB,EACnB+B,EAAgB,EAEpB,CAAC,EACDL,EAAK,iBAAiB,WAAYX,GAAS,CACzCA,EAAM,eAAe,EACrBA,EAAM,gBAAgB,EACtB,IAAMkB,EAAST,EAAS,EAAI,OAAS,OACrCT,EAAM,aAAa,WAAakB,EACjBlB,EAAM,OACK,QAAQ,qBAAqB,GAErDmB,GAAc,CACZ,GAAIrD,EAAM,IACV,SAAU,QACZ,CAAC,EAEckC,EAAM,OAAO,QAAQ,qBAAqB,GAC7C,aAAa,eAAe,IAAMlC,EAAM,KACpDiB,EAAoB,CAExB,CAAC,EACDqC,GAAST,EAAMU,EAAkBC,EAAM,CACrC,GAAK,cAAgB,CACnB,OAAOpD,EAAO,GAAG,OAASJ,EAAM,MAAQ,EAC1C,EACA,cAAe,IAAM,CACnBgC,EAAYhC,EAAM,GAAG,CACvB,EACA,IAAI,QAAS,CACX,OAAOA,EAAM,gBACf,EACA,IAAI,IAAK,CACP,OAAOA,EAAM,GACf,EACA,IAAI,KAAM,CACR,OAAOA,EAAM,GACf,EACA,IAAI,MAAO,CACT,OAAOI,EAAO,GAAG,OAASJ,EAAM,MAAQ,EAC1C,EACA,IAAI,SAAU,CACZ,OAAOA,EAAM,WAAWA,EAAM,GAAG,CACnC,EACA,KAAM,SACN,IAAI,SAAU,CACZ,OAAOA,EAAM,OACf,EACA,IAAI,MAAO,CACT,OAAOA,EAAM,IACf,EACA,IAAI,kBAAmB,CACrB,OAAOA,EAAM,gBACf,EACA,IAAI,oBAAqB,CACvB,OAAOA,EAAM,kBACf,EACA,IAAI,WAAY,CACd,OAAOA,EAAM,SACf,EACA,IAAI,YAAa,CACf,OAAOC,EAAS,CAClB,EACA,eAAgB,IAAMC,EAAYuD,GAAM,CAACA,CAAE,EAC3C,aAAchC,EACd,SAAUiC,GAAU,CAClB1D,EAAM,KAAK,CACT,IAAKA,EAAM,IACX,OAAA0D,EACA,MAAOtD,EAAO,GAAG,OAASJ,EAAM,KAChC,KAAM,QACR,CAAC,CACH,EACA,IAAI,UAAW,CACb,MAAO,EAAE,IAAM,CACb,IAAI2D,EAAQ/D,GAAO,EACnB,OAAAgE,GAAmBD,EAAO,QAASzB,GAAS,CAC1CA,EAAM,yBAAyB,EAC/BhC,EAAYuD,GAAM,CAACA,CAAE,CACvB,CAAC,EACDH,GAASK,EAAOJ,EAAkBM,GAAM,CACtC,IAAI,MAAO,CACT,OAAO5D,EAAS,CAClB,EACA,IAAI,UAAW,CACb,OAAOsD,EAAkBO,GAAS,CAAC,CAAC,CACtC,EACA,IAAI,UAAW,CACb,OAAOP,EAAkBO,GAAS,CAChC,MAAO,CACL,OAAQ,OACV,CACF,CAAC,CACH,CACF,CAAC,CAAC,EACFC,GAAS,IAAMC,EAAeL,EAAO,cAAe1D,EAAS,EAAI,WAAa,UAAY,KAAOG,EAAO,GAAG,OAASJ,EAAM,KAAK,CAAC,EACzH2D,CACT,GAAG,EAAGJ,EAAkBU,GAAU,CAChC,IAAI,MAAO,CACT,OAAO7D,EAAO,GAAG,OAASJ,EAAM,IAClC,EACA,IAAI,IAAK,CACP,OAAOA,EAAM,GACf,EACA,OAAQqB,CACV,CAAC,CAAC,CACJ,CACF,CAAC,EAAGyB,CAAK,EACTQ,GAASR,EAAOS,EAAkBM,GAAM,CACtC,IAAI,MAAO,CACT,OAAO5D,EAAS,GAAK,CAAC,CAACD,EAAM,MAC/B,EACA,IAAI,UAAW,CACb,OAAOuD,EAAkBW,GAAU,CACjC,IAAI,UAAW,CACb,OAAOX,EAAkBY,GAAY,CACnC,IAAI,OAAQ,CACV,OAAO3D,EAAM,EAAI,CACnB,CACF,CAAC,CACH,EACA,IAAI,UAAW,CACb,OAAO+C,EAAkBa,GAAc,CACrC,IAAI,MAAO,CACT,OAAOhE,EAAO,GAAG,IACnB,EACA,IAAI,MAAO,CACT,OAAOJ,EAAM,IACf,EACA,IAAI,OAAQ,CACV,OAAOQ,EAAM,EAAI,CACnB,EACA,IAAI,QAAS,CACX,OAAOH,EAAO,MAChB,EACA,IAAI,MAAO,CACT,OAAOL,EAAM,IACf,EACA,IAAI,YAAa,CACf,OAAOA,EAAM,UACf,EACA,eAAgBO,EAChB,IAAI,SAAU,CACZ,OAAOP,EAAM,OACf,EACA,IAAI,kBAAmB,CACrB,OAAOA,EAAM,gBACf,EACA,IAAI,QAAS,CACX,OAAOA,EAAM,MACf,EACA,IAAI,aAAc,CAChB,OAAOA,EAAM,WACf,CACF,CAAC,CACH,CACF,CAAC,CACH,CACF,CAAC,CAAC,EACF+D,GAASM,GAAO,CACd,IAAIC,EAAM9D,EAAM,EACd+D,EAAO7D,EAAiB,EACxB8D,EAAOvE,EAAS,EAChBwE,EAAOzE,EAAM,IACb0E,EAAU,CAACzE,EAAS,GAAK,CAACD,EAAM,OAChC2E,EAAOnE,EAAM,EACboE,EAAOnE,EAAW,EACpB,OAAA6D,IAAQD,EAAI,GAAKL,EAAenB,EAAM,aAAcwB,EAAI,EAAIC,CAAG,EAC/DD,EAAI,EAAIQ,GAAQhC,EAAM0B,EAAMF,EAAI,CAAC,EACjCG,IAASH,EAAI,GAAKL,EAAenB,EAAM,gBAAiBwB,EAAI,EAAIG,CAAI,EACpEC,IAASJ,EAAI,GAAKL,EAAenB,EAAM,qBAAsBwB,EAAI,EAAII,CAAI,EACzEC,IAASL,EAAI,GAAKvB,EAAM,UAAU,OAAO,yCAA0CuB,EAAI,EAAIK,CAAI,EAC/FC,IAASN,EAAI,GAAKL,EAAelB,EAAO,aAAcuB,EAAI,EAAIM,CAAI,EAClEN,EAAI,EAAIQ,GAAQ/B,EAAO8B,EAAMP,EAAI,CAAC,EAC3BA,CACT,EAAG,CACD,EAAG,OACH,EAAG,OACH,EAAG,OACH,EAAG,OACH,EAAG,OACH,EAAG,OACH,EAAG,MACL,CAAC,EACMxB,CACT,GAAG,CACL,CDhUA,IAAIiC,GAAsBC,GAAW,gEAAgE,EACnGC,GAAuBD,GAAW,iCAAiC,EACnEE,GAAuBF,GAAW,mIAAmI,EASjKG,GAAoBC,GAAK,IAAM,OAAO,+BAAwB,EAAE,KAAKC,IAAM,CAC/E,QAASA,EAAE,iBACb,EAAE,CAAC,EACGC,GAAQ,GACRC,GAAkB,EACjB,SAASC,GAAaC,EAAO,CAClC,IAAMC,EAAiBD,EAAM,gBAAiC,IAAI,IAC5D,CAACE,EAAOC,CAAQ,EAAIC,GAAaP,EAAK,EAC5CQ,GAAa,IAAM,CACjB,IAAMC,EAAQN,EAAM,MAAM,QAAU,EACpC,GAAIO,GAAQL,CAAK,GAAKI,EAAO,OAC7B,IAAIE,EAAQ,sBAAsB,SAASC,GAAO,CAChD,IAAMC,EAAQ,YAAY,IAAI,EAC1BC,EAAIJ,GAAQL,CAAK,EACrB,GAAGC,EAASQ,GAAKd,EAAK,QAAUc,EAAIL,GAAS,YAAY,IAAI,EAAII,EAAQZ,IACrEa,EAAIL,IAAOE,EAAQ,sBAAsBC,CAAI,EACnD,CAAC,EACDG,GAAU,IAAM,qBAAqBJ,CAAK,CAAC,CAC7C,CAAC,EACD,IAAMK,EAAOC,GAAW,IAAM,CAC5B,IAAMC,EAAMf,EAAM,MAAQ,CAAC,EAC3B,OAAOe,EAAI,OAASb,EAAM,EAAIa,EAAI,MAAM,EAAGb,EAAM,CAAC,EAAIa,CACxD,CAAC,EACD,SAASC,EAAWC,EAAO,CACzBjB,EAAM,OAAO,OAAOkB,GAAUC,GAASD,EAAO,KAAMD,CAAK,CAAC,CAC5D,CACA,IAAMG,EAAc,IAAM,CAAC,CAACpB,EAAM,QAAUqB,EAAc,GAAG,eAAiBrB,EAAM,OAAO,IACrFsB,EAAgBC,GAAW,CAC/B,IAAMC,EAASH,EAAc,EAC7B,GAAI,CAACG,EAAQ,OACb,IAAMP,EAAQO,EAAO,MACrBC,EAAiB,IAAI,EACrBzB,EAAM,OAAO,OAAOkB,GAAUA,EAAO,KAAK,OAAOD,EAAO,EAAGM,CAAO,CAAC,EACnEvB,EAAM,KAAKuB,CAAO,EAClBG,EAAY1B,EAAM,OAAO,IAAM,IAAMiB,CAAK,CAC5C,EACMU,EAAc,KAAO,IAAM,CAC/B,IAAIC,EAAOtC,GAAO,EAClB,OAAAuC,GAASD,EAAME,EAAkBpC,GAAmB,CAClD,IAAI,MAAO,CACT,OAAOM,EAAM,IACf,EACA,SAAUsB,EACV,UAAW,IAAMG,EAAiB,IAAI,EACtC,IAAI,aAAc,CAChB,OAAOzB,EAAM,WACf,CACF,CAAC,CAAC,EACK4B,CACT,GAAG,EACH,MAAO,CAACE,EAAkBC,GAAK,CAC7B,IAAI,MAAO,CACT,OAAOlB,EAAK,CACd,EACA,SAAU,CAACmB,EAAKf,IAAU,CACxB,IAAMgB,EAAU,IAAM,CAACjC,EAAM,OAAO,QAAUkC,EAAclC,EAAM,OAAQgC,EAAI,IAAI,EAC5EG,EAAS,IAAMnB,EAAWC,EAAM,CAAC,EACjCmB,EAAQ,IAAMpC,EAAM,OAAO,IAAM,IAAMiB,EAAM,EAC7CoB,EAASC,GAAQ,CACrBtC,EAAM,OAAO,OAAOuC,GAAQ,CAC1BC,GAAWD,EAAM,CAAC,OAAQtB,EAAM,EAAG,MAAM,EAAGqB,CAAI,CAClD,CAAC,EACD,IAAMG,EAAYC,GAAY,oBAAoB,EAClD1C,EAAM,KAAK,KAAKgC,EAAI,GAAG,EAAE,KAAK,MAAMW,GAAU,CAC5C,GAAM,CACJ,aAAcC,CAChB,EAAID,EAAO,IAAI,EACf,GAAIC,EAAU,CACZ,IAAMC,EAAWJ,EAAU,IAAIG,EAAS,IAAI,EACxCC,IACF,MAAMJ,EAAU,KAAKI,EAAS,EAAE,EAChCF,EAAO,OAAOJ,GAAQM,EAAS,OAAO,WAAWN,EAAMD,CAAI,CAAC,EAEhE,CACF,CAAC,CACH,EACA,OAAAjC,GAAa,IAAM,CACjB,GAAI,CAACL,EAAM,WAAWgC,EAAI,GAAG,EAAG,OAChC,IAAIc,EAAY,GACZC,EACJ/C,EAAM,KAAK,KAAKgC,EAAI,GAAG,EAAE,KAAK,MAAMgB,GAAa,CAC/C,GAAIF,EAAW,OACf,IAAML,EAAYC,GAAY,oBAAoB,EAClD,eAAeO,GAAY,CACzB,IAAMC,EAAUF,EAAU,IAAI,EAC9B,GAAI,CAACE,EAAS,OACd,IAAMN,EAAWM,EAAQ,YAAY,EACrC,GAAI,CAACN,GAAU,KAAM,OACrB,IAAMC,EAAWJ,EAAU,IAAIG,EAAS,IAAI,EAI5C,GAHI,CAACC,IACL,MAAMJ,EAAU,KAAKI,EAAS,EAAE,EAC5BC,IACA,CAACK,GAAeN,CAAQ,EAAG,OAC/B,IAAMO,EAAQP,EAAS,OAAO,SAASK,CAAO,EAC9C,GAAI,CAACE,EAAO,OACUpD,EAAM,OAAO,IAAI,GACJ,OAAOiB,EAAM,CAAC,GAAG,OAChCmC,GAClBpD,EAAM,OAAO,OAAOkB,GAAU,CAC5BsB,GAAWtB,EAAQ,CAAC,OAAQD,EAAM,EAAG,MAAM,EAAGmC,CAAK,CACrD,CAAC,EAECR,EAAS,QAAUQ,GACrBJ,EAAU,OAAOK,GAAK,CAChBA,EAAE,YAAY,IAChBA,EAAE,YAAY,EAAE,MAAQD,EAE5B,CAAC,CAEL,CAEA,GADA,MAAMH,EAAU,EACZH,EAAW,OACf,IAAMQ,EAAW,IAAML,EAAU,EACjCD,EAAU,GAAG,SAAUM,CAAQ,EAC/BP,EAAiB,IAAMC,EAAU,IAAI,SAAUM,CAAQ,CACzD,CAAC,EACD1C,GAAU,IAAM,CACdkC,EAAY,GACZC,IAAiB,CACnB,CAAC,CACH,CAAC,EACM,CAACjB,EAAkByB,GAAM,CAC9B,IAAI,MAAO,CACT,OAAOC,GAAO,IAAM,CAAC,CAACpC,EAAY,CAAC,EAAE,GAAKC,EAAc,EAAE,QAAUJ,EAAM,CAC5E,EACA,IAAI,UAAW,CACb,OAAOU,EAAY,CACrB,CACF,CAAC,GAAI,IAAM,CACT,IAAI8B,EAAQjE,GAAQ,EACpB,OAAAqC,GAAS4B,EAAO3B,EAAkB4B,GAAU,CAC1C,IAAI,UAAW,CACb,OAAO5B,EAAkB6B,GAAY,CACnC,IAAI,OAAQ,CACV,OAAO3D,EAAM,KACf,CACF,CAAC,CACH,EACA,IAAI,UAAW,CACb,OAAO8B,EAAkB8B,GAAQ,CAC/B,IAAI,UAAW,CACb,MAAO,CAAC9B,EAAkB+B,GAAO,CAC/B,IAAI,MAAO,CACT,OAAO7B,EAAI,MAAQ,QACrB,EACA,IAAI,UAAW,CACb,OAAOF,EAAkByB,GAAM,CAC7B,IAAI,MAAO,CACT,MAAO,CAACtD,EAAe,IAAI+B,EAAI,GAAG,CACpC,EACA,IAAI,UAAW,CACb,OAAQ,IAAM,CACZ,IAAI8B,EAAQrE,GAAQ,EAClBsE,EAAQD,EAAM,WACdE,EAAQD,EAAM,WAChB,OAAAlC,GAASkC,EAAO,IAAM/B,EAAI,KAAMgC,CAAK,EAC9BF,CACT,GAAG,CACL,EACA,IAAI,UAAW,CACb,OAAOhC,EAAkBmC,GAAQ,CAC/B,IAAI,KAAM,CACR,OAAOjC,EAAI,GACb,EACA,IAAI,OAAQ,CACV,OAAOhC,EAAM,KACf,EACA,IAAI,MAAO,CACT,OAAOA,EAAM,IACf,EACA,iBAAkBmC,EAClB,IAAI,oBAAqB,CACvB,OAAOnC,EAAM,MACf,EACA,IAAI,WAAY,CACd,OAAOiB,EAAM,CACf,EACA,IAAI,MAAO,CACT,OAAOjB,EAAM,IACf,EACA,IAAI,MAAO,CACT,OAAOgC,EAAI,IACb,EACA,IAAI,YAAa,CACf,OAAOhC,EAAM,UACf,EACA,eAAgBC,EAChB,IAAI,SAAU,CACZ,OAAOD,EAAM,OACf,EACA,IAAI,kBAAmB,CACrB,OAAOA,EAAM,gBACf,EACA,IAAI,QAAS,CACX,OAAOA,EAAM,MACf,EACA,IAAI,aAAc,CAChB,OAAOA,EAAM,WACf,CACF,CAAC,CACH,CACF,CAAC,CACH,CACF,CAAC,EAAG8B,EAAkB+B,GAAO,CAC3B,IAAI,MAAO,CACT,OAAO7B,EAAI,MAAQ,QACrB,EACA,IAAI,UAAW,CACb,OAAOF,EAAkBoC,EAAM,CAC7B,GAAK,cAAgB,CACnB,OAAOlC,EAAI,IACb,EACA,IAAI,KAAM,CACR,OAAOA,EAAI,GACb,EACA,IAAI,MAAO,CACT,OAAOA,EAAI,IACb,EACA,IAAI,IAAK,CACP,OAAOI,EAAM,CACf,EACA,cAAe,IAAMV,EAAYU,EAAM,CAAC,EACxC,OAAQD,EACR,IAAI,SAAU,CACZ,OAAOnC,EAAM,WAAWgC,EAAI,GAAG,CACjC,EACA,IAAI,MAAO,CACT,OAAOA,EAAI,IACb,EACA,IAAI,SAAU,CACZ,OAAOhC,EAAM,OACf,EACA,IAAI,MAAO,CACT,OAAOA,EAAM,IACf,EACA,IAAI,kBAAmB,CACrB,OAAOA,EAAM,gBACf,EACA,IAAI,oBAAqB,CACvB,OAAOA,EAAM,MACf,EACA,IAAI,WAAY,CACd,OAAOiB,EAAM,CACf,EACA,SAAUkD,GAAUnE,EAAM,KAAK,CAC7B,IAAKgC,EAAI,IACT,OAAAmC,EACA,MAAOnC,EAAI,KACX,KAAMA,EAAI,IACZ,CAAC,EACD,IAAI,UAAW,CACb,OAAOF,EAAkBsC,GAAU,CACjC,IAAI,MAAO,CACT,OAAOpC,EAAI,IACb,EACA,IAAI,IAAK,CACP,OAAOI,EAAM,CACf,EACA,OAAQC,CACV,CAAC,CACH,CACF,CAAC,CACH,CACF,CAAC,CAAC,CACJ,CACF,CAAC,CACH,CACF,CAAC,CAAC,EACFgC,GAASC,GAAO,CACd,IAAIC,EAAM,CAAC,CAACtC,EAAQ,EAClBuC,EAAO,CAACvC,EAAQ,EAClB,OAAAsC,IAAQD,EAAI,GAAKb,EAAM,UAAU,OAAO,+BAAgCa,EAAI,EAAIC,CAAG,EACnFC,IAASF,EAAI,GAAKb,EAAM,UAAU,OAAO,iCAAkCa,EAAI,EAAIE,CAAI,EAChFF,CACT,EAAG,CACD,EAAG,OACH,EAAG,MACL,CAAC,EACMb,CACT,GAAG,CAAC,CACN,CACF,CAAC,EAAG3B,EAAkByB,GAAM,CAC1B,IAAI,MAAO,CACT,OAAOC,GAAO,IAAM,CAAC,CAACpC,EAAY,CAAC,EAAE,GAAKC,EAAc,EAAE,QAAUrB,EAAM,MAAM,QAAU,EAC5F,EACA,IAAI,UAAW,CACb,OAAO2B,EAAY,CACrB,CACF,CAAC,CAAC,CACJ,COjTA,OAAS,gBAAA8C,GAAc,gBAAAC,GAAc,aAAAC,GAAW,WAAAC,OAAgB,WAChE,OAAS,eAAAC,GAAa,aAAAC,OAAiB,iBACvC,UAAYC,OAAe,oCAC3B,SAASC,GAAeC,EAAQ,CAC5B,OAAO,OAAOA,GAAW,WAAaA,EAAO,EAAIA,CACrD,CAoBO,SAASC,GAAUC,EAASC,EAAUC,EAAc,CACvD,GAAM,CAACC,EAAOC,CAAQ,EAAIC,GAAaH,CAAY,EACnD,OAAAI,GAAQ,IAAM,CACV,IAAMC,EAASC,GAAeR,CAAO,EACrC,GAAI,CAACO,EACD,OACJ,IAAME,EAAwB,aAAUF,EAAQN,EAAUG,CAAQ,EAClEM,GAAUD,CAAW,CACzB,CAAC,EACMN,CACX,CClBO,SAASQ,GAAcC,EAG3B,CACD,IAAIC,EAAS,EACTC,EAAS,EACTC,EAAS,GAETC,EAAc,IAAI,IAElBC,EAAQ,IAAI,IAEhB,SAASC,EAAWC,EAAuC,CACzD,MAAO,CACL,GAAIA,EAAG,aAAa,eAAe,EACnC,IAAKA,EAAG,aAAa,cAAc,EACnC,KAAMA,EAAG,aAAa,eAAe,GAAK,GAC1C,MAAOA,EAAG,aAAe,IAAI,KAAK,EAClC,OAAQP,EAAK,OAAO,CACtB,CACF,CAEA,SAASQ,EAAYC,EAAmB,CACtC,IAAMC,EAAKD,EAAM,QAAUR,EACrBU,EAAKF,EAAM,QAAUP,EAC3B,GAAI,CAACC,EAAQ,CAEX,GAAI,KAAK,MAAMO,EAAIC,CAAE,EAAI,EAAG,OAC5BR,EAAS,EACX,CACAM,EAAM,eAAe,EAErB,IAAMG,EAAO,KAAK,IAAIX,EAAQQ,EAAM,OAAO,EACrCI,EAAM,KAAK,IAAIX,EAAQO,EAAM,OAAO,EACpCK,EAAQ,KAAK,IAAIb,EAAQQ,EAAM,OAAO,EACtCM,EAAS,KAAK,IAAIb,EAAQO,EAAM,OAAO,EAEvCO,EAAYhB,EAAK,UAAU,EACjC,GAAI,CAACgB,EAAW,OAEhB,IAAMC,EAAY,IAAI,IACtB,QAAWV,KAAMS,EAAU,iBAAiB,iBAAiB,EAAG,CAC9D,GAAKT,EAAmB,eAAiB,KAAM,SAC/C,IAAMW,EAAKX,EAAG,aAAa,eAAe,EAC1C,GAAI,CAACW,GAAMd,EAAY,IAAIc,CAAE,EAAG,SAChC,IAAMC,EAAIZ,EAAG,sBAAsB,EAEjCY,EAAE,MAAQP,GACVO,EAAE,KAAOL,GACTK,EAAE,OAASN,GACXM,EAAE,IAAMJ,IAGVE,EAAU,IAAIC,CAAE,EACXE,EAAU,IAAIF,CAAE,GAAGG,EAAeH,EAAIZ,EAAWC,CAAE,CAAC,EAC3D,CACA,QAAWW,KAAMb,EACVY,EAAU,IAAIC,CAAE,GAAGI,EAAoBJ,CAAE,EAEhDb,EAAQY,CACV,CAEA,SAASM,GAAY,CACnB,OAAO,oBAAoB,YAAaf,EAAa,EAAI,EACzD,OAAO,oBAAoB,UAAWe,EAAW,EAAI,EACrDpB,EAAS,GACTE,EAAQ,IAAI,IACZD,EAAc,IAAI,GACpB,CAEA,SAASoB,EAAYf,EAAmB,CAClCA,EAAM,SAAW,GAAK,EAAEA,EAAM,SAAWA,EAAM,UAE9CA,EAAM,OAAmB,QAAQ,yBAAyB,IAC/DR,EAASQ,EAAM,QACfP,EAASO,EAAM,QACfN,EAAS,GACTE,EAAQ,IAAI,IACZD,EAAc,IAAI,IAAIgB,EAAU,KAAK,CAAC,EACtC,OAAO,iBAAiB,YAAaZ,EAAa,EAAI,EACtD,OAAO,iBAAiB,UAAWe,EAAW,EAAI,EACpD,CAEA,MAAO,CAAE,YAAAC,CAAY,CACvB,CV/FA,IAAIC,GAAsBC,GAAW,mRAAmR,EAkBlTC,GAAWC,GAAK,IAAM,OAAO,yBAA+B,EAAE,KAAKC,IAAM,CAC7E,QAASA,EAAE,QACb,EAAE,CAAC,EACI,SAASC,GAAkBC,EAAO,CACvC,GAAM,CAACC,EAAQC,CAAY,EAAIC,EAAY,IAAMH,EAAM,UAAW,CAChE,KAAMA,EAAM,IACd,CAAC,EACK,CAACI,EAAQC,CAAS,EAAIC,GAAa,EAAE,EACrCC,EAAc,IAAML,EAAa,QAAU,SAAWA,EAAa,QAAU,aAC7EM,EAAkBC,GAAUT,EAAM,QAAS,CAC/C,KAAM,wBACR,EAAG,CAAC,CAAC,EACCU,EAAcC,GAAW,IAAM,IAAI,IAAIH,EAAgB,CAAC,CAAC,EACzDI,EAAaC,GAAeH,EAAa,CAACI,EAAKC,IAAQA,EAAI,IAAID,CAAG,CAAC,EACzEE,GAAa,IAAM,CACjB,GAAI,CAACT,EAAY,EAAG,OACpB,IAAMU,EAAWT,EAAgB,EACjC,GAAI,CAACS,EAAS,OAAQ,CACpBC,GAAsC,IAAI,GAAK,EAC/C,MACF,CACA,IAAIC,EAAY,GACVC,EAAwB,IAAI,IAClCC,GAAuBrB,EAAM,KAAMA,EAAM,UAAW,IAAI,IAAIiB,CAAQ,EAAGG,EAAuB,IAAI,GAAK,EAAE,KAAK,IAAM,CAC7GD,GAAWD,GAAuBE,CAAM,CAC/C,CAAC,EACDE,GAAU,IAAM,CACdH,EAAY,EACd,CAAC,CACH,CAAC,EACD,SAASI,EAAKC,EAAQ,CACpBxB,EAAM,QAAQ,cAAcyB,GAAgBD,CAAM,CAAC,CACrD,CACA,GAAM,CAACE,EAAgBC,CAAiB,EAAIrB,GAAa,EAAK,EAC1DsB,EACEC,EAAUC,GAAc,CAC5B,UAAW,IAAMF,EACjB,OAAQ,IAAM5B,EAAM,QAAQ,QAAU,EACxC,CAAC,EACK+B,EAAgBC,GAAM,CAC1BJ,EAAQI,EACRA,EAAG,iBAAiB,YAAaH,EAAQ,YAAa,EAAI,EAC1DP,GAAU,IAAMU,EAAG,oBAAoB,YAAaH,EAAQ,YAAa,EAAI,CAAC,CAChF,EACA,OAAQ,IAAM,CACZ,IAAII,EAAOvC,GAAO,EAChBwC,EAAQD,EAAK,WACbE,EAAQD,EAAM,WACdE,EAAQD,EAAM,WACdE,EAAQD,EAAM,WAChB,OAAAF,EAAM,iBAAiB,OAAQI,GAAS,CAGtC,GAFAA,EAAM,eAAe,EACrBX,EAAkB,EAAK,EACnBY,EAAaD,CAAK,EAAG,CACvB,IAAME,EAAItC,EAAa,EACvB,GAAIsC,EAAG,CACL,IAAMC,EAAMD,EAAE,IAAI,GAAG,MAAM,QAAU,EACrCE,EAAiB,CACf,aAAcF,EAAE,IAChB,MAAOC,CACT,CAAC,CACH,CACA,MACF,CACA,IAAME,EAAQL,EAAM,cAAc,MAClC,GAAIK,GAASA,EAAM,OAAS,GAAKzC,EAAa,EAAG,CAE/C,IAAM0C,EADY1C,EAAa,EAAE,IAAI,GACN,MAAM,QAAU,EAC/C2C,EAAgBF,EAAOzC,EAAa,EAAGF,EAAM,KAAM,SAAU4C,CAAW,EACxE,MACF,CACA,IAAME,EAAUC,EAAcT,CAAK,EACnC,GAAI,CAACQ,GAAW,CAAC5C,EAAa,EAAG,OACjC,GAAM,CACJ,OAAA8C,EACA,MAAAC,CACF,EAAIH,EACEI,EAAUhD,EAAa,EAAE,IACzBiD,EAAajD,EAAa,EAAE,IAAI,GAAG,MAAM,QAAU,EACzDkD,EAAY,CACV,WAAYH,EAAM,IAAII,GAAKA,EAAE,EAAE,EAC/B,YAAaJ,EAAM,IAAII,GAAKA,EAAE,GAAG,EACjC,aAAcJ,EAEd,SAAUE,EAAa,EAAI,GAAGD,CAAO,IAAIC,EAAa,CAAC,GAAKD,EAC5D,SAAUC,EAAa,EAAI,QAAU,SACrC,aAAcH,EACd,SAAUM,EAAS,CACrB,EAAGtD,EAAM,KAAME,EAAa,OAAQqD,EAAqBvD,EAAM,OAAO,CAAC,CACzE,CAAC,EACDkC,EAAM,iBAAiB,YAAaI,GAAS,CAC3C,IAAMkB,EAAUlB,EAAM,eAClB,CAACkB,GAAW,CAAClB,EAAM,cAAc,SAASkB,CAAO,IACnD7B,EAAkB,EAAK,CAE3B,CAAC,EACDO,EAAM,iBAAiB,WAAYI,GAAS,CAC1C,GAAIA,EAAM,cAAc,MAAM,SAAS,OAAO,EAAG,CAC/CA,EAAM,eAAe,EACrBA,EAAM,aAAa,WAAa,OAChCX,EAAkB,EAAI,EACtB,MACF,EACI8B,GAAgBnB,EAAM,YAAY,GAAKC,EAAaD,CAAK,KAC3DA,EAAM,eAAe,EACrBA,EAAM,aAAa,WAAagB,EAAS,EAAI,OAAS,OAE1D,CAAC,EACDI,GAAM3B,EAAeG,CAAK,EAC1ByB,GAASxB,EAAOyB,EAAkBC,GAAW,CAC3C,OAAQ,GACR,UAAW,GACX,YAAa,IAAMxD,EAAU,EAAE,EAC/B,aAAcyD,GAAM5D,EAAa,GAAG,OAAO4D,CAAE,EAC7C,IAAI,MAAO,CACT,OAAO9D,EAAM,IACf,EACA,KAAMuB,CACR,CAAC,EAAGa,CAAK,EACTuB,GAASvB,EAAOwB,EAAkBG,GAAY,CAAC,CAAC,EAAG1B,CAAK,EACxDA,EAAM,QAAUC,GAASjC,EAAUiC,EAAM,OAAO,MAAM,YAAY,CAAC,EACnEqB,GAASzB,EAAO0B,EAAkBI,GAAM,CACtC,IAAI,MAAO,CACT,OAAOzD,EAAY,CACrB,EACA,IAAI,UAAW,CACb,OAAOqD,EAAkBK,GAAa,CACpC,MAAO,CACT,CAAC,CACH,EACA,IAAI,UAAW,CACb,MAAO,CAACL,EAAkBM,GAAU,CAClC,IAAI,UAAW,CACb,OAAON,EAAkBK,GAAa,CACpC,MAAO,CACT,CAAC,CACH,EACA,IAAI,UAAW,CACb,OAAOL,EAAkBO,GAAc,CACrC,MAAO,EACP,IAAI,MAAO,CACT,OAAOnE,EAAM,IACf,EACA,IAAI,MAAO,CACT,OAAOC,EAAO,GAAG,IACnB,EACA,IAAI,QAAS,CACX,OAAOC,EAAa,MACtB,EACA,KAAMqB,EACN,WAAYX,EACZ,IAAI,SAAU,CACZ,OAAOZ,EAAM,OACf,EACA,IAAI,kBAAmB,CACrB,OAAOE,EAAa,MACtB,EACA,IAAI,QAAS,CACX,OAAOE,EAAO,CAChB,EACA,YAAa,IAAMC,EAAU,EAAE,CACjC,CAAC,CACH,CACF,CAAC,EAAGuD,EAAkBI,GAAM,CAC1B,IAAI,MAAO,CACT,OAAOI,GAAW,CACpB,EACA,IAAI,UAAW,CACb,OAAOR,EAAkBhE,GAAU,CACjC,IAAI,MAAO,CACT,OAAOI,EAAM,IACf,EACA,IAAI,kBAAmB,CACrB,OAAOE,EAAa,MACtB,EACA,IAAI,SAAU,CACZ,OAAOF,EAAM,OACf,CACF,CAAC,CACH,CACF,CAAC,CAAC,CACJ,CACF,CAAC,EAAG,IAAI,EACRqE,GAAS,IAAMnC,EAAM,UAAU,OAAO,oCAAqC,CAAC,CAACR,EAAe,CAAC,CAAC,EAC9F2C,GAAS,IAAMhC,EAAM,MAAQjC,EAAO,CAAC,EAC9B6B,CACT,GAAG,CACL,CACO,SAASqC,GAAwBC,EAAWC,EAAS,CAC1D,OAAOC,GAAO,IAAMb,EAAkB7D,GAAmB,CACvD,UAAWwE,EACX,IAAI,MAAO,CACT,OAAOC,EAAQ,IACjB,EACA,QAASA,CACX,CAAC,EAAGA,CAAO,CACb,CACAE,GAAiB,CAAC,OAAO,CAAC",
|
|
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=true aria-haspopup=menu class=\"popmenu__trigger document-list-item\"role=treeitem>`);\nimport { createEffect, createSignal, onCleanup } from \"solid-js\";\nimport { dragstack, addToDragstack, removeFromDragstack, clearDragstack, setDragging, setDragSourceItems, clearDragSourceItems, getDropTarget, setDropTarget, isAbove, clearDropTarget, copyMode, setCopyMode, isNewDocDrag, setDragOriginView, isSameDragOriginView } from \"../dnd/dnd.ts\";\nimport { setMenuTarget, setPendingNewDoc } from \"../state.ts\";\nimport { parseAutomergeUrl } from \"@automerge/automerge-repo/slim\";\nimport { getImportableUrlFromAutomergeUrl } from \"@inkandswitch/patchwork-filesystem\";\nimport { executeDrop } from \"../dnd/operations.ts\";\nimport { getDndPayload } from \"../dnd/payload.ts\";\nimport { handleFilesDrop } from \"./file-drop.ts\";\nimport { log } from \"../dnd/debug.ts\";\nconst EXT_MIME = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n bmp: \"image/bmp\",\n tiff: \"image/tiff\",\n svg: \"image/svg+xml\",\n pdf: \"application/pdf\",\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n mov: \"video/quicktime\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n ogg: \"audio/ogg\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n csv: \"text/csv\",\n json: \"application/json\",\n html: \"text/html\",\n zip: \"application/zip\"\n};\nfunction mimeForName(name) {\n const ext = name.includes(\".\") ? name.split(\".\").pop().toLowerCase() : \"\";\n return ext ? EXT_MIME[ext] : void 0;\n}\nfunction scrollParent(el) {\n for (let p = el.parentElement; p; p = p.parentElement) {\n const overflow = getComputedStyle(p).overflowY;\n if ((overflow === \"auto\" || overflow === \"scroll\") && p.scrollHeight > p.clientHeight) {\n return p;\n }\n }\n return document.scrollingElement ?? document.body;\n}\nfunction selectedItemIsVisible(el) {\n const container = scrollParent(el);\n const box = container.getBoundingClientRect();\n const selected = container.querySelectorAll('.document-list-item[aria-selected=\"true\"]');\n for (const item of selected) {\n const rect = item.getBoundingClientRect();\n if (rect.top >= box.top && rect.bottom <= box.bottom) return true;\n }\n return false;\n}\nexport default function Item(props) {\n let trigger;\n const [fileMeta, setFileMeta] = createSignal(null);\n let filePrefetched = false;\n function prefetchFileMeta() {\n if (filePrefetched || props.type !== \"file\") return;\n filePrefetched = true;\n props.repo.find(props.url).then(handle => {\n const doc = handle?.doc();\n if (!doc) return;\n const base = String(doc.name ?? props.name ?? \"file\");\n const ext = doc.extension ? `.${String(doc.extension).replace(/^\\.+/, \"\")}` : \"\";\n const filename = ext && !base.endsWith(ext) ? `${base}${ext}` : base;\n const mime = String(doc.mimeType || mimeForName(filename) || \"application/octet-stream\");\n setFileMeta({\n mime,\n filename\n });\n }).catch(() => {});\n }\n createEffect(prev => {\n if (props.pressed && !prev) {\n if (trigger && !selectedItemIsVisible(trigger)) {\n trigger.scrollIntoViewIfNeeded?.();\n }\n }\n return props.pressed;\n });\n const dnd = () => ({\n id: props.id,\n type: props.type,\n url: props.url,\n name: props.name,\n source: props.element.toolId\n });\n const SPRING_LOAD_MS = 1500;\n let springTimer = null;\n let springCommitted = false;\n function startSpringLoad(target) {\n if (props.type === \"folder\" || dragstack.has(props.id)) return;\n if (springTimer || springCommitted) return;\n target.setAttribute(\"data-dnd-springload\", \"\");\n springTimer = setTimeout(() => {\n springTimer = null;\n springCommitted = true;\n target.removeAttribute(\"data-dnd-springload\");\n props.openWith();\n }, SPRING_LOAD_MS);\n }\n function stopSpringLoad() {\n if (springTimer) {\n clearTimeout(springTimer);\n springTimer = null;\n }\n springCommitted = false;\n trigger?.removeAttribute(\"data-dnd-springload\");\n }\n onCleanup(stopSpringLoad);\n function openMenu(x, y) {\n setMenuTarget({\n x,\n y,\n element: trigger,\n id: props.id,\n url: props.url,\n name: props.name,\n type: props.type,\n openWith: props.openWith,\n startRenaming: props.startRenaming,\n remove: props.remove,\n createInside: props.createInside\n });\n }\n let longPress;\n const cancelLongPress = () => clearTimeout(longPress);\n onCleanup(cancelLongPress);\n async function handleDrop(event, targetId, position) {\n log(\"Item drop handler called for:\", targetId, position);\n if (event.dataTransfer?.files && event.dataTransfer.files.length > 0) {\n const folderHandle = position === \"inside\" && props.type === \"folder\" ? await props.repo.find(props.url) : props.parentFolderHandle ?? props.rootFolderHandle;\n await handleFilesDrop(event.dataTransfer.files, folderHandle, props.repo, position, position === \"inside\" ? 0 : props.itemIndex ?? 0);\n return;\n }\n const payload = getDndPayload(event);\n if (!payload) {\n log(\"No dnd data in drop event. types:\", event.dataTransfer?.types);\n return;\n }\n const {\n source,\n items\n } = payload;\n log(\"Drop data:\", {\n source,\n items,\n targetId,\n position\n });\n executeDrop({\n draggedIds: items.map(i => i.id),\n draggedUrls: items.map(i => i.url),\n draggedItems: items,\n targetId,\n position,\n sourceToolId: source,\n copyMode: copyMode()\n }, props.repo, props.rootFolderHandle, isSameDragOriginView(props.element));\n }\n return (() => {\n var _el$ = _tmpl$();\n _el$.$$keydown = event => {\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n const current = event.currentTarget;\n const allItems = Array.from(document.querySelectorAll(\"[data-dnd-item]\")).filter(item => item.offsetParent !== null);\n const currentIndex = allItems.indexOf(current);\n if (event.key === \"ArrowDown\" && currentIndex < allItems.length - 1) {\n allItems[currentIndex + 1]?.focus();\n } else if (event.key === \"ArrowUp\" && currentIndex > 0) {\n allItems[currentIndex - 1]?.focus();\n }\n return;\n }\n if (props.type === \"folder\" && props.onToggleExpand) {\n if (event.key === \"ArrowRight\" && !props.isExpanded) {\n event.preventDefault();\n props.onToggleExpand();\n return;\n } else if (event.key === \"ArrowLeft\" && props.isExpanded) {\n event.preventDefault();\n props.onToggleExpand();\n return;\n }\n }\n if (event.key == \"Enter\" && event.ctrlKey && !(+event.altKey | +event.shiftKey | +event.metaKey)) {\n event.preventDefault();\n event.stopImmediatePropagation();\n event.stopPropagation();\n const box = trigger.getBoundingClientRect();\n openMenu(box.x + 10, box.y + box.height - 10);\n }\n };\n _$addEventListener(_el$, \"dblclick\", () => {\n props.startRenaming();\n });\n _$addEventListener(_el$, \"click\", event => {\n if (event.ctrlKey || event.metaKey) {\n return;\n }\n const target = event.target;\n if (target.closest(\".document-list-folder__toggle, .create-new-button\")) {\n return;\n }\n clearDragstack();\n props.openWith();\n });\n _el$.$$mousedown = event => {\n prefetchFileMeta();\n if (event.ctrlKey || event.metaKey) {\n if (dragstack.has(props.id)) {\n removeFromDragstack(props.id);\n } else {\n addToDragstack(props.id, dnd());\n }\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n } else if (!dragstack.has(props.id)) {\n clearDragstack();\n }\n };\n _el$.addEventListener(\"drop\", event => {\n stopSpringLoad();\n const target = getDropTarget();\n console.log(\"[DnD] Item ondrop event fired\", props.id, \"type:\", props.type, \"target:\", target);\n if (props.type === \"folder\" && target?.position === \"inside\") {\n event.preventDefault();\n event.stopPropagation();\n if (isNewDocDrag(event)) {\n setPendingNewDoc({\n containerUrl: props.url,\n index: 0\n });\n clearDropTarget();\n return;\n }\n handleDrop(event, target.id, \"inside\");\n clearDropTarget();\n return;\n }\n log(\"Item handling drop itself\");\n event.preventDefault();\n event.stopPropagation();\n if (!target) {\n log(\"No drop target set\");\n return;\n }\n if (isNewDocDrag(event)) {\n if (props.parentFolderHandle && props.itemIndex != null) {\n const index = target.position === \"above\" ? props.itemIndex : props.itemIndex + 1;\n setPendingNewDoc({\n containerUrl: props.parentFolderHandle.url,\n index\n });\n }\n clearDropTarget();\n return;\n }\n handleDrop(event, target.id, target.position);\n clearDropTarget();\n });\n _el$.addEventListener(\"dragleave\", event => {\n const related = event.relatedTarget;\n if (!related || !event.currentTarget.contains(related)) {\n stopSpringLoad();\n clearDropTarget();\n }\n });\n _el$.addEventListener(\"dragover\", event => {\n event.preventDefault();\n event.dataTransfer.dropEffect = copyMode() ? \"copy\" : \"move\";\n let position;\n if (props.type === \"folder\") {\n const rect = event.currentTarget.getBoundingClientRect();\n const offset = event.clientY - rect.top;\n const relativePosition = offset / rect.height;\n if (relativePosition < 0.25) {\n position = \"above\";\n } else if (relativePosition > 0.75) {\n position = \"below\";\n } else {\n position = \"inside\";\n }\n if (position !== \"inside\") {\n event.stopPropagation();\n }\n } else {\n position = isAbove(event.clientY, event.currentTarget) ? \"above\" : \"below\";\n event.stopPropagation();\n }\n setDropTarget({\n id: props.id,\n position\n });\n startSpringLoad(event.currentTarget);\n });\n _el$.addEventListener(\"dragend\", () => {\n stopSpringLoad();\n clearDragSourceItems();\n clearDragstack();\n setCopyMode(false);\n setDragOriginView(null);\n setDragging(false);\n });\n _el$.addEventListener(\"drag\", event => {\n if (event.altKey !== copyMode()) {\n setCopyMode(event.altKey);\n }\n });\n _el$.addEventListener(\"dragstart\", event => {\n cancelLongPress();\n if (!dragstack.has(props.id)) {\n clearDragstack();\n addToDragstack(props.id, dnd());\n }\n const items = dragstack.values();\n const urls = [];\n const ids = [];\n setCopyMode(event.altKey);\n event.dataTransfer.effectAllowed = \"all\";\n for (const item of items) {\n urls.push(item.url);\n ids.push(item.id);\n }\n const urlList = urls.map(url => location.protocol + \"//\" + location.host + `/#doc=${parseAutomergeUrl(url).documentId}`).join(\"\\r\\n\") + \"\\r\\n\";\n event.dataTransfer?.items.add(urlList, \"text/uri-list\");\n event.dataTransfer?.items.add(JSON.stringify(ids), \"text/x-sideboard-ids\");\n event.dataTransfer?.items.add(JSON.stringify(urls), \"text/x-patchwork-urls\");\n event.dataTransfer?.items.add(JSON.stringify({\n source: props.element.toolId,\n items: [...dragstack.values()]\n }), \"text/x-patchwork-dnd\");\n if (dragstack.size === 1 && props.type === \"file\") {\n const meta = fileMeta();\n const filename = meta?.filename ?? props.name;\n const mime = meta?.mime ?? mimeForName(filename) ?? \"application/octet-stream\";\n try {\n const swUrl = new URL(getImportableUrlFromAutomergeUrl(props.url), location.origin).href;\n event.dataTransfer?.setData(\"DownloadURL\", `${mime}:${filename}:${swUrl}`);\n } catch {}\n }\n const preview = document.createElement(\"div\");\n preview.style.cssText = `\n position: absolute;\n top: -1000px;\n background: var(--document-list-primary);\n padding: 0.5rem 0.75rem;\n border-radius: var(--document-list-radius);\n font-family: inherit;\n font-size: 0.9rem;\n pointer-events: none;\n color: var(--document-list-primary-line);\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n `;\n const count = dragstack.size;\n const modeText = event.altKey ? \" (copy)\" : \"\";\n preview.textContent = count === 1 ? props.name + modeText : `${count} items${modeText}`;\n document.body.appendChild(preview);\n event.dataTransfer.setDragImage(preview, 10, 10);\n setTimeout(() => preview.remove(), 0);\n setDragSourceItems([...dragstack.keys()]);\n setDragOriginView(props.element);\n setDragging(true);\n });\n _el$.addEventListener(\"pointercancel\", cancelLongPress);\n _el$.$$pointerup = cancelLongPress;\n _el$.$$pointerdown = event => {\n if (event.pointerType === \"touch\" || event.pointerType === \"pen\") {\n longPress = setTimeout(() => openMenu(event.clientX, event.clientY), 700);\n }\n };\n _$addEventListener(_el$, \"contextmenu\", event => {\n event.preventDefault();\n event.stopPropagation();\n openMenu(event.clientX, event.clientY);\n });\n var _ref$ = trigger;\n typeof _ref$ === \"function\" ? _$use(_ref$, _el$) : trigger = _el$;\n _$insert(_el$, () => props.children);\n _$effect(_p$ => {\n var _v$ = props.id,\n _v$2 = props.url,\n _v$3 = props.type,\n _v$4 = props[\"aria-label\"],\n _v$5 = props.pressed ? \"true\" : void 0;\n _v$ !== _p$.e && _$setAttribute(_el$, \"data-dnd-item\", _p$.e = _v$);\n _v$2 !== _p$.t && _$setAttribute(_el$, \"data-doc-url\", _p$.t = _v$2);\n _v$3 !== _p$.a && _$setAttribute(_el$, \"data-doc-type\", _p$.a = _v$3);\n _v$4 !== _p$.o && _$setAttribute(_el$, \"aria-label\", _p$.o = _v$4);\n _v$5 !== _p$.i && _$setAttribute(_el$, \"aria-selected\", _p$.i = _v$5);\n return _p$;\n }, {\n e: undefined,\n t: undefined,\n a: undefined,\n o: undefined,\n i: undefined\n });\n return _el$;\n })();\n}\n_$delegateEvents([\"pointerdown\", \"pointerup\", \"mousedown\", \"keydown\"]);", "import {\n isValidAutomergeUrl,\n type AutomergeUrl,\n} from \"@automerge/automerge-repo/slim\";\n\nexport type DndPayloadItem = {\n id?: string;\n url: AutomergeUrl;\n name?: string;\n type?: string;\n};\n\nexport type DndPayload = {\n source: string;\n items: DndPayloadItem[];\n};\n\n// MIME types we can extract document drags from, in order of preference\nexport const DND_DATA_TYPES = [\n \"text/x-patchwork-dnd\",\n \"text/x-patchwork-urls\",\n \"text/uri-list\",\n \"text/plain\",\n];\n\nexport function hasDocumentDrag(dataTransfer: DataTransfer | null) {\n return Boolean(\n dataTransfer &&\n DND_DATA_TYPES.some((type) => dataTransfer.types.includes(type))\n );\n}\n\nfunction urlFromText(text: string): AutomergeUrl | null {\n const trimmed = text.trim();\n if (isValidAutomergeUrl(trimmed)) return trimmed;\n // patchwork web links carry the document id in the fragment: #doc=<documentId>\n const docId = trimmed.match(/#doc=([^&\\s]+)/)?.[1];\n if (docId && isValidAutomergeUrl(`automerge:${docId}`)) {\n return `automerge:${docId}` as AutomergeUrl;\n }\n return null;\n}\n\nexport function getDndPayload(event: DragEvent): DndPayload | null {\n const data = event.dataTransfer;\n if (!data) return null;\n\n const dndData = data.getData(\"text/x-patchwork-dnd\");\n if (dndData) {\n try {\n const parsed = JSON.parse(dndData);\n if (Array.isArray(parsed?.items) && parsed.items.length > 0) {\n return { source: parsed.source ?? \"\", items: parsed.items };\n }\n } catch {\n // fall through to the other types\n }\n }\n\n const urlData = data.getData(\"text/x-patchwork-urls\");\n if (urlData) {\n try {\n const urls: unknown = JSON.parse(urlData);\n const items = (Array.isArray(urls) ? urls : [])\n .filter((url): url is AutomergeUrl => isValidAutomergeUrl(url))\n .map((url) => ({ url }));\n if (items.length > 0) return { source: \"\", items };\n } catch {\n // fall through to the other types\n }\n }\n\n const text = data.getData(\"text/uri-list\") || data.getData(\"text/plain\");\n const items = text\n .split(/\\r?\\n/)\n .map(urlFromText)\n .filter((url): url is AutomergeUrl => url !== null)\n .map((url) => ({ url }));\n if (items.length > 0) return { source: \"\", items };\n\n return null;\n}\n", "import { template as _$template } from \"solid-js/web\";\nimport { delegateEvents as _$delegateEvents } from \"solid-js/web\";\nimport { insert as _$insert } from \"solid-js/web\";\nimport { createComponent as _$createComponent } from \"solid-js/web\";\nimport { effect as _$effect } from \"solid-js/web\";\nimport { use as _$use } from \"solid-js/web\";\nvar _tmpl$ = /*#__PURE__*/_$template(`<form style=display:contents><input autofocus class=document-list-item__name>`),\n _tmpl$2 = /*#__PURE__*/_$template(`<span class=document-list-item__name>`);\nimport { createSelector, createSignal, Match, Switch } from \"solid-js\";\nimport { renaming, setRenaming } from \"../state.ts\";\nexport function ItemName(props) {\n const isBeingRenamed = createSelector(renaming);\n const [next, setNext] = createSignal(props.name);\n function blur() {\n props.rename(next() ?? \"\");\n if (isBeingRenamed(props.id)) setRenaming(\"\");\n }\n return _$createComponent(Switch, {\n get children() {\n return [_$createComponent(Match, {\n get when() {\n return isBeingRenamed(props.id);\n },\n get children() {\n var _el$ = _tmpl$(),\n _el$2 = _el$.firstChild;\n _el$.addEventListener(\"submit\", event => {\n event.preventDefault();\n blur();\n });\n _el$2.$$input = event => setNext(event.target.value);\n _el$2.$$keydown = event => {\n if (event.key == \"Escape\" || event.key == \"g\" && event.ctrlKey) {\n blur();\n }\n };\n _el$2.addEventListener(\"blur\", blur);\n _$use(el => {\n setNext(props.name);\n setTimeout(() => {\n el.focus();\n el.select();\n }, 80);\n }, _el$2);\n _$effect(() => _el$2.value = next());\n return _el$;\n }\n }), _$createComponent(Match, {\n get when() {\n return !isBeingRenamed(props.id);\n },\n get children() {\n var _el$3 = _tmpl$2();\n _$insert(_el$3, () => props.name);\n return _el$3;\n }\n })];\n }\n });\n}\n_$delegateEvents([\"keydown\", \"input\"]);", "import { template as _$template } from \"solid-js/web\";\nimport { insert as _$insert } from \"solid-js/web\";\nimport { createComponent as _$createComponent } from \"solid-js/web\";\nimport { setStyleProperty as _$setStyleProperty } from \"solid-js/web\";\nimport { effect as _$effect } from \"solid-js/web\";\nvar _tmpl$ = /*#__PURE__*/_$template(`<div class=\"document-list-item document-list-item--loading\"aria-hidden=true><span class=document-list-item__skeleton>`),\n _tmpl$2 = /*#__PURE__*/_$template(`<div class=document-list__loading aria-busy=true aria-label=\"Loading documents\">`);\nimport { For } from \"solid-js\";\nexport function LoadingRow(props) {\n return (() => {\n var _el$ = _tmpl$();\n _$effect(_$p => _$setStyleProperty(_el$, \"--depth\", props.depth ?? 0));\n return _el$;\n })();\n}\nconst SKELETON_WIDTHS = [\"11rem\", \"7rem\", \"9.5rem\", \"6rem\", \"10rem\", \"8rem\"];\nexport function LoadingRows(props) {\n const rows = () => Array.from({\n length: props.count ?? 5\n }, (_, i) => i);\n return (() => {\n var _el$2 = _tmpl$2();\n _$insert(_el$2, _$createComponent(For, {\n get each() {\n return rows();\n },\n children: i => (() => {\n var _el$3 = _tmpl$(),\n _el$4 = _el$3.firstChild;\n _$effect(_p$ => {\n var _v$ = props.depth ?? 0,\n _v$2 = SKELETON_WIDTHS[i % SKELETON_WIDTHS.length];\n _v$ !== _p$.e && _$setStyleProperty(_el$3, \"--depth\", _p$.e = _v$);\n _v$2 !== _p$.t && _$setStyleProperty(_el$4, \"width\", _p$.t = _v$2);\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$3;\n })()\n }));\n return _el$2;\n })();\n}", "import { createEffect, createSignal, onCleanup, onMount, } from \"solid-js\";\nimport { createStore, reconcile } from \"solid-js/store\";\nimport * as Providers from \"@inkandswitch/patchwork-providers\";\nfunction resolveElement(source) {\n return typeof source === \"function\" ? source() : source;\n}\n/**\n * Generic reactive request. Resolves the first value a provider emits for\n * `selector` (via the one-shot `request` helper) and returns an accessor that\n * reads `undefined` until then. `T` is the response type.\n */\nexport function request(element, selector) {\n const [value, setValue] = createSignal(undefined);\n onMount(() => {\n const target = resolveElement(element);\n if (!target)\n return;\n Providers.request(target, selector).then((v) => {\n if (v == null)\n return;\n setValue(() => v);\n });\n });\n return value;\n}\nexport function subscribe(element, selector, initialValue) {\n const [value, setValue] = createSignal(initialValue);\n onMount(() => {\n const target = resolveElement(element);\n if (!target)\n return;\n const unsubscribe = Providers.subscribe(target, selector, setValue);\n onCleanup(unsubscribe);\n });\n return value;\n}\n/**\n * Store-backed subscription. Use this when a consumer wants Solid's\n * fine-grained nested reactivity for incoming JSON object or array snapshots.\n * Requires an initial object/array so the store has a stable root.\n *\n * `reconcile` preserves stable object/array identity where possible, so this\n * helper is not a good fit when the top-level value is used as an identity key\n * for resources or memos.\n */\nexport function subscribeReconciled(element, selector, initialValue) {\n const [store, setStore] = createStore(initialValue);\n onMount(() => {\n const target = resolveElement(element);\n if (!target)\n return;\n const unsubscribe = Providers.subscribe(target, selector, (v) => {\n setStore(reconcile(v));\n });\n onCleanup(unsubscribe);\n });\n return store;\n}\n/**\n * Handle-specialized subscription. Use when the answering provider emits an\n * `AutomergeUrl`. The handle is recovered locally from the global repo\n * (`window.repo`), so it stays fully live \u2014 reads project reactively and writes go\n * straight back to the same repo. Returns `[doc, handle]` matching the shape\n * of `solid-automerge`'s `useDocument`; both read `undefined` until the first\n * url arrives. `T` is the doc shape inside the handle.\n */\nexport function subscribeDoc(element, selector) {\n const [handle, setHandle] = createSignal(undefined);\n onMount(() => {\n const target = resolveElement(element);\n if (!target)\n return;\n let canceled = false;\n const unsubscribe = Providers.subscribe(target, selector, (url) => {\n if (!url)\n return;\n const repo = \"repo\" in window ? window.repo : undefined;\n if (!repo)\n return;\n void Promise.resolve(repo.find(url)).then((h) => {\n if (canceled)\n return;\n setHandle(() => h);\n });\n });\n onCleanup(() => {\n canceled = true;\n unsubscribe();\n });\n });\n // Mirror the doc into a store by `reconcile`-ing against the *materialized*\n // snapshot (`handle.doc()`) on every change, rather than replaying the\n // change's incremental patches (as `solid-automerge`'s `createDocumentProjection`\n // / `autoproduce` does).\n //\n // A whole-value write such as `doc.list = [...]` is lowered by Automerge to\n // `putObjectFromHydrate`, whose patch stream is a `put` that materializes the\n // new container *plus* per-element `insert` patches. Replaying that delta with\n // `applyPatches` double-applies the contents \u2014 the `put` seeds `[a, b]`, then\n // the inserts splice `a, b` in again, yielding `[a, b, a, b]` \u2014 even though the\n // document itself is correct. The materialized snapshot is always\n // authoritative, so reconciling against it is robust to any valid change,\n // whole-array reassignment included.\n const [store, setStore] = createStore({});\n const [ready, setReady] = createSignal(false);\n createEffect(() => {\n const h = handle();\n if (!h) {\n setReady(false);\n return;\n }\n const sync = () => {\n setStore(reconcile((h.doc() ?? {})));\n setReady(true);\n };\n sync();\n h.on(\"change\", sync);\n onCleanup(() => h.off(\"change\", sync));\n });\n const doc = () => (ready() ? store : undefined);\n return [doc, handle];\n}\n", "import type { AutomergeUrl } from \"@automerge/automerge-repo/slim\";\nimport {\n dragstack,\n addToDragstack,\n removeFromDragstack,\n type SideboardDragAndDropItem,\n} from \"../dnd/dnd.ts\";\n\n/**\n * A cmd/ctrl-drag rubber-band selection over the document list. Attach the\n * returned `onMouseDown` to the list container.\n *\n * Rows whose bounding boxes intersect the band are added to the drag selection\n * (the `dragstack`); rows the band leaves are removed again, so the selection\n * tracks the band live. Any selection the user made before starting the band\n * (via cmd-click) is left untouched \u2014 the band only manages the rows it adds.\n */\nexport function createMarquee(opts: {\n container: () => HTMLElement | undefined;\n source: () => string;\n}) {\n let startX = 0;\n let startY = 0;\n let active = false;\n // Selection present before the band started \u2014 never touched by the band.\n let preexisting = new Set<string>();\n // Rows the band itself added, so it can release them as it shrinks.\n let owned = new Set<string>();\n\n function itemFromEl(el: Element): SideboardDragAndDropItem {\n return {\n id: el.getAttribute(\"data-dnd-item\")!,\n url: el.getAttribute(\"data-doc-url\") as AutomergeUrl,\n type: el.getAttribute(\"data-doc-type\") ?? \"\",\n name: (el.textContent ?? \"\").trim(),\n source: opts.source(),\n };\n }\n\n function onMouseMove(event: MouseEvent) {\n const dx = event.clientX - startX;\n const dy = event.clientY - startY;\n if (!active) {\n // Small threshold so a plain cmd-click still toggles a single item.\n if (Math.hypot(dx, dy) < 5) return;\n active = true;\n }\n event.preventDefault();\n\n const left = Math.min(startX, event.clientX);\n const top = Math.min(startY, event.clientY);\n const right = Math.max(startX, event.clientX);\n const bottom = Math.max(startY, event.clientY);\n\n const container = opts.container();\n if (!container) return;\n\n const nextOwned = new Set<string>();\n for (const el of container.querySelectorAll(\"[data-dnd-item]\")) {\n if ((el as HTMLElement).offsetParent === null) continue; // hidden row\n const id = el.getAttribute(\"data-dnd-item\");\n if (!id || preexisting.has(id)) continue;\n const r = el.getBoundingClientRect();\n const hit = !(\n r.right < left ||\n r.left > right ||\n r.bottom < top ||\n r.top > bottom\n );\n if (!hit) continue;\n nextOwned.add(id);\n if (!dragstack.has(id)) addToDragstack(id, itemFromEl(el));\n }\n for (const id of owned) {\n if (!nextOwned.has(id)) removeFromDragstack(id);\n }\n owned = nextOwned;\n }\n\n function onMouseUp() {\n window.removeEventListener(\"mousemove\", onMouseMove, true);\n window.removeEventListener(\"mouseup\", onMouseUp, true);\n active = false;\n owned = new Set();\n preexisting = new Set();\n }\n\n function onMouseDown(event: MouseEvent) {\n if (event.button !== 0 || !(event.metaKey || event.ctrlKey)) return;\n // Don't start a band from the toolbar (filter input / create button).\n if ((event.target as Element).closest(\".document-list__toolbar\")) return;\n startX = event.clientX;\n startY = event.clientY;\n active = false;\n owned = new Set();\n preexisting = new Set(dragstack.keys());\n window.addEventListener(\"mousemove\", onMouseMove, true);\n window.addEventListener(\"mouseup\", onMouseUp, true);\n }\n\n return { onMouseDown };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
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
7
|
}
|
package/packages/sideboard/dist/{document-list-panel-SAZI3PJP.js → document-list-panel-TEMPKXQI.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as a,c as b}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=document-list-panel-
|
|
1
|
+
import{b as a,c as b}from"./chunk-XFYC7NFX.js";import"./chunk-DS3QVJZT.js";import"./chunk-OHHPMOAE.js";import"./chunk-ZQBDNEEV.js";import"./chunk-FEMULUBJ.js";import"./chunk-TCL6SLDB.js";import"./chunk-FW4363Y4.js";export{a as DocumentListPanel,b as renderDocumentListPanel};
|
|
2
|
+
//# sourceMappingURL=document-list-panel-TEMPKXQI.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./chunk-FW4363Y4.js";async function n(){let e=new URL("./index.css",import.meta.url);return(await fetch(e)).text()}function r(e){let t="sideboard-styles",o=document.head.querySelector(`#${t}`)??document.createElement("style");Object.assign(o,{textContent:e,id:t}),document.head.append(o)}var a={id:"chee/document-list",type:"patchwork:tool",name:"Document List",supportedDatatypes:["folder"],icon:"FolderOpen",unlisted:!0,async load(){let[{renderDocumentListPanel:e},t]=await Promise.all([import("./document-list-panel-
|
|
1
|
+
import"./chunk-FW4363Y4.js";async function n(){let e=new URL("./index.css",import.meta.url);return(await fetch(e)).text()}function r(e){let t="sideboard-styles",o=document.head.querySelector(`#${t}`)??document.createElement("style");Object.assign(o,{textContent:e,id:t}),document.head.append(o)}var a={id:"chee/document-list",type:"patchwork:tool",name:"Document List",supportedDatatypes:["folder"],icon:"FolderOpen",unlisted:!0,async load(){let[{renderDocumentListPanel:e},t]=await Promise.all([import("./document-list-panel-TEMPKXQI.js"),n()]);return(o,i)=>(r(t),e(o.url,i))}},c=[a,Object.assign({},a,{id:"folder-tree-view",name:"Folder Tree View",icon:"Tree",unlisted:!1}),{id:"chee/account-bar",type:"patchwork:tool",name:"Account Bar",supportedDatatypes:["account"],icon:"UserCircle",unlisted:!0,async load(){let[{renderAccountBar:e},t]=await Promise.all([import("./account-bar-JHI3FZZT.js"),n()]);return(o,i)=>(r(t),e(o,i))}},{id:"chee/sideboard",type:"patchwork:tool",tags:["sidebar-account"],name:"Sideboard",supportedDatatypes:["account"],icon:"FolderOpen",unlisted:!0,async load(){let[{renderSideboard:e},t]=await Promise.all([import("./sideboard/sideboard.js"),n()]);return(o,i)=>(r(t),e(o,i))}}];export{c as plugins};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as i,b as a}from"../chunk-
|
|
1
|
+
import{a as i,b as a}from"../chunk-XFYC7NFX.js";import"../chunk-DS3QVJZT.js";import"../chunk-OHHPMOAE.js";import"../chunk-ZQBDNEEV.js";import{a as d}from"../chunk-25X3B3RC.js";import{a as m}from"../chunk-FEMULUBJ.js";import"../chunk-TCL6SLDB.js";import"../chunk-FW4363Y4.js";import{template as u}from"solid-js/web";import{insert as n}from"solid-js/web";import{createComponent as t}from"solid-js/web";import{Show as p}from"solid-js";import{render as g}from"solid-js/web";var s=u("<div class=sideboard>"),f=u('<aside class=document-list><nav class="document-list__doclist document-list-widget">');function _(e){let r=m(e.handle);return(()=>{var o=s();return n(o,t(p,{get when(){return r.rootFolderUrl},get fallback(){return(()=>{var l=f(),c=l.firstChild;return n(c,t(i,{depth:0})),l})()},get children(){return t(a,{get folderUrl(){return r.rootFolderUrl},get repo(){return e.repo},get element(){return e.element}})}}),null),n(o,t(d,{get handle(){return e.handle},get repo(){return e.repo},get element(){return e.element}}),null),o})()}function x(e,r){return g(()=>t(_,{handle:e,get repo(){return r.repo},element:r}),r)}export{_ as Sideboard,x as renderSideboard};
|
|
2
2
|
//# sourceMappingURL=sideboard.js.map
|
|
@@ -9,8 +9,8 @@ import {
|
|
|
9
9
|
setThemeForMode,
|
|
10
10
|
startActiveTheme,
|
|
11
11
|
startActiveThemeFromProvider
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-FLDRNDLY.js";
|
|
13
|
+
import "./chunk-L7WQSSFT.js";
|
|
14
14
|
export {
|
|
15
15
|
CURRENT_THEME_SELECTOR,
|
|
16
16
|
detectColorScheme,
|
|
@@ -23,4 +23,4 @@ export {
|
|
|
23
23
|
startActiveTheme,
|
|
24
24
|
startActiveThemeFromProvider
|
|
25
25
|
};
|
|
26
|
-
//# sourceMappingURL=active-theme-
|
|
26
|
+
//# sourceMappingURL=active-theme-ZEJCS5RM.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
gloom_default,
|
|
3
3
|
lychee_default
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-L7WQSSFT.js";
|
|
5
5
|
|
|
6
6
|
// src/active-theme.ts
|
|
7
7
|
import { getRegistry } from "@inkandswitch/patchwork-plugins";
|
|
@@ -285,4 +285,4 @@ export {
|
|
|
285
285
|
hasThemePreferences,
|
|
286
286
|
onActiveThemeChange
|
|
287
287
|
};
|
|
288
|
-
//# sourceMappingURL=chunk-
|
|
288
|
+
//# sourceMappingURL=chunk-FLDRNDLY.js.map
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
var lychee_default = "./lychee-BMLMUNP6.css";
|
|
3
3
|
|
|
4
4
|
// src/gloom.css
|
|
5
|
-
var gloom_default = "./gloom-
|
|
5
|
+
var gloom_default = "./gloom-UKANBN2Z.css";
|
|
6
6
|
|
|
7
7
|
export {
|
|
8
8
|
lychee_default,
|
|
9
9
|
gloom_default
|
|
10
10
|
};
|
|
11
|
-
//# sourceMappingURL=chunk-
|
|
11
|
+
//# sourceMappingURL=chunk-L7WQSSFT.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
gloom_default,
|
|
3
3
|
lychee_default
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-L7WQSSFT.js";
|
|
5
5
|
|
|
6
6
|
// src/main.ts
|
|
7
7
|
(async function() {
|
|
8
|
-
(await import("./active-theme-
|
|
8
|
+
(await import("./active-theme-ZEJCS5RM.js")).startActiveTheme();
|
|
9
9
|
})();
|
|
10
10
|
var plugins = [
|
|
11
11
|
{
|
|
@@ -57,7 +57,7 @@ var plugins = [
|
|
|
57
57
|
unlisted: true,
|
|
58
58
|
forTitleBar: true,
|
|
59
59
|
async load() {
|
|
60
|
-
const { ThemeTitlebarTool } = await import("./theme-titlebar-
|
|
60
|
+
const { ThemeTitlebarTool } = await import("./theme-titlebar-HAEXLVMW.js");
|
|
61
61
|
return ThemeTitlebarTool;
|
|
62
62
|
}
|
|
63
63
|
},
|
|
@@ -68,7 +68,7 @@ var plugins = [
|
|
|
68
68
|
icon: "Palette",
|
|
69
69
|
tags: ["system-tray"],
|
|
70
70
|
async load() {
|
|
71
|
-
const { ThemeTray } = await import("./theme-tray-
|
|
71
|
+
const { ThemeTray } = await import("./theme-tray-XYB4LGZ6.js");
|
|
72
72
|
return ThemeTray;
|
|
73
73
|
}
|
|
74
74
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
startActiveThemeFromProvider
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-FLDRNDLY.js";
|
|
4
|
+
import "./chunk-L7WQSSFT.js";
|
|
5
5
|
|
|
6
6
|
// src/theme-titlebar.ts
|
|
7
7
|
function ThemeTitlebarTool(_handle, element) {
|
|
@@ -18,4 +18,4 @@ function ThemeTitlebarTool(_handle, element) {
|
|
|
18
18
|
export {
|
|
19
19
|
ThemeTitlebarTool
|
|
20
20
|
};
|
|
21
|
-
//# sourceMappingURL=theme-titlebar-
|
|
21
|
+
//# sourceMappingURL=theme-titlebar-HAEXLVMW.js.map
|
|
@@ -5,8 +5,8 @@ import {
|
|
|
5
5
|
serveCurrentThemeProvider,
|
|
6
6
|
setThemeForCurrentMode,
|
|
7
7
|
startActiveTheme
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-FLDRNDLY.js";
|
|
9
|
+
import "./chunk-L7WQSSFT.js";
|
|
10
10
|
|
|
11
11
|
// src/theme-tray.tsx
|
|
12
12
|
import { template as _$template } from "solid-js/web";
|
|
@@ -348,4 +348,4 @@ _$delegateEvents(["click", "input"]);
|
|
|
348
348
|
export {
|
|
349
349
|
ThemeTray
|
|
350
350
|
};
|
|
351
|
-
//# sourceMappingURL=theme-tray-
|
|
351
|
+
//# sourceMappingURL=theme-tray-XYB4LGZ6.js.map
|
|
@@ -4,8 +4,8 @@ import {
|
|
|
4
4
|
onActiveThemeChange,
|
|
5
5
|
setThemeForMode,
|
|
6
6
|
startActiveTheme
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-FLDRNDLY.js";
|
|
8
|
+
import "./chunk-L7WQSSFT.js";
|
|
9
9
|
|
|
10
10
|
// src/tool.tsx
|
|
11
11
|
import { template as _$template } from "solid-js/web";
|
package/plugin-registry-url
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
automerge:
|
|
1
|
+
automerge:2GqA3HMZTy1YM4rZa6krZa7BEG84
|
|
File without changes
|
/package/packages/theming/dist/{active-theme-CZOUYQ4S.js.map → active-theme-ZEJCS5RM.js.map}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/packages/theming/dist/{theme-titlebar-EKXBWQZO.js.map → theme-titlebar-HAEXLVMW.js.map}
RENAMED
|
File without changes
|
|
File without changes
|