@inkandswitch/patchwork-pkg-base 0.0.41 → 0.0.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/package.json +1 -1
  2. package/packages/account/dist/{InlineContactAvatar-TVDLE2AV.js → InlineContactAvatar-6UAAJ73R.js} +2 -1
  3. package/packages/account/dist/InlineContactAvatar-6UAAJ73R.js.map +7 -0
  4. package/packages/account/dist/index.js +1 -1
  5. package/packages/chat/dist/{ChatRoot-DQkQQvPO.js → ChatRoot-WdCS4aLg.js} +3001 -2807
  6. package/packages/chat/dist/{context-tool-BuY29sJF.js → context-tool-KkwLFr2k.js} +2 -2
  7. package/packages/chat/dist/{index-NiYOPQzY.js → index-P8UuZ1jj.js} +3 -3
  8. package/packages/chat/dist/index.js +1 -1
  9. package/packages/chat/dist/{tool-He3mRTzT.js → tool-DWqQOW59.js} +2 -2
  10. package/packages/chat/package.json +1 -1
  11. package/packages/codemirror-base/dist/chunk-H5POLO74.js +2658 -0
  12. package/packages/codemirror-base/dist/chunk-H5POLO74.js.map +7 -0
  13. package/packages/codemirror-base/dist/lib/codemirror.js +1 -1
  14. package/packages/codemirror-base/dist/tool.js +9 -5
  15. package/packages/codemirror-base/dist/tool.js.map +2 -2
  16. package/packages/codemirror-base/package.json +1 -1
  17. package/packages/codemirror-markdown/dist/extensions/markdown.js +0 -94
  18. package/packages/codemirror-markdown/dist/extensions/markdown.js.map +3 -3
  19. package/packages/drafts/dist/assets/{DraftOverlayProvider-B0Mtq1UF.js → DraftOverlayProvider-VYKlzOy1.js} +85 -25
  20. package/packages/drafts/dist/assets/DraftOverlayProvider-VYKlzOy1.js.map +1 -0
  21. package/packages/drafts/dist/assets/{DraftListProvider-D41q9O5B.js → DraftStateProvider-DX8b_RgQ.js} +270 -39
  22. package/packages/drafts/dist/assets/DraftStateProvider-DX8b_RgQ.js.map +1 -0
  23. package/packages/drafts/dist/assets/{clone-policy-C4pVv5sr.js → clone-policy-CIdEhg7W.js} +5 -2
  24. package/packages/drafts/dist/assets/{clone-policy-C4pVv5sr.js.map → clone-policy-CIdEhg7W.js.map} +1 -1
  25. package/packages/drafts/dist/assets/draft-docs-Bi8K1y3a.js +554 -0
  26. package/packages/drafts/dist/assets/draft-docs-Bi8K1y3a.js.map +1 -0
  27. package/packages/drafts/dist/assets/main-BR_tW0sp.js +3105 -0
  28. package/packages/drafts/dist/assets/main-BR_tW0sp.js.map +1 -0
  29. package/packages/drafts/dist/index.js +14 -14
  30. package/packages/drafts/dist/index.js.map +1 -1
  31. package/packages/drafts/package.json +1 -1
  32. package/packages/threepane/dist/IsolatedDocumentArea-2JIBFDOX.js +2 -0
  33. package/packages/threepane/dist/{PatchworkFrame-4AEBOBRE.js → PatchworkFrame-P5P6JTJE.js} +2 -2
  34. package/packages/threepane/dist/chunk-CGHYPNSB.js +972 -0
  35. package/packages/threepane/dist/chunk-CGHYPNSB.js.map +7 -0
  36. package/packages/threepane/dist/index.js +1 -1
  37. package/packages/tldraw4/dist/tool.js +61 -10
  38. package/packages/tldraw4/dist/tool.js.map +2 -2
  39. package/packages/tldraw4/package.json +2 -2
  40. package/packages/account/dist/InlineContactAvatar-TVDLE2AV.js.map +0 -7
  41. package/packages/codemirror-base/dist/chunk-5IG5TKXV.js +0 -795
  42. package/packages/codemirror-base/dist/chunk-5IG5TKXV.js.map +0 -7
  43. package/packages/drafts/dist/assets/DraftListProvider-D41q9O5B.js.map +0 -1
  44. package/packages/drafts/dist/assets/DraftOverlayProvider-B0Mtq1UF.js.map +0 -1
  45. package/packages/drafts/dist/assets/main-Cp8VsNHh.js +0 -2331
  46. package/packages/drafts/dist/assets/main-Cp8VsNHh.js.map +0 -1
  47. package/packages/threepane/dist/IsolatedDocumentArea-MZBBRFMY.js +0 -2
  48. package/packages/threepane/dist/chunk-HNLVJAZZ.js +0 -972
  49. package/packages/threepane/dist/chunk-HNLVJAZZ.js.map +0 -7
  50. /package/packages/threepane/dist/{IsolatedDocumentArea-MZBBRFMY.js.map → IsolatedDocumentArea-2JIBFDOX.js.map} +0 -0
  51. /package/packages/threepane/dist/{PatchworkFrame-4AEBOBRE.js.map → PatchworkFrame-P5P6JTJE.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoIO,SAAS,WAAW,OAAmC;AAC5D,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,IAAI;AACV,QAAM,SAAS,EAAE,YAAY;AAC7B,SAAO,QAAQ,SAAS,WAAW,CAAC,CAAC,EAAE,UAAU,OAAO,EAAE,WAAW;AACvE;ACvIO,MAAM,UAAyB;AAAA,EACpC;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM,OAAO;AACX,YAAM,EAAE,sBACN;AAAA,mCAAAA,mBAAA,UAAM,OAAO,wCAAkC;AAAA,oCAAAA,mBAAA;AAAA;AACjD,aAAO;AAAA,IACT;AAAA;AAAA,EAEF;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM,OAAO;AACX,YAAM,EAAE,yBACN;AAAA,sCAAAC,sBAAA,UAAM,OAAO,2CAAqC;AAAA,uCAAAA,sBAAA;AAAA;AACpD,aAAO;AAAA,IACT;AAAA;AAAA,EAEF;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM,OAAO;AACX,YAAM,EAAE,kBAAkB;AAAA,+BAAAC,eAAA,UAAM,OAAO,oCAAoB;AAAA,gCAAAA,eAAA;AAAA;AAC3D,aAAO;AAAA,IACT;AAAA,IACA,UAAU;AAAA;AAAA,EAEZ;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM,CAAC,cAAc;AAAA,IACrB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,oBAAoB,CAAC,SAAS;AAAA,IAC9B,MAAM,OAAO;AACX,YAAM,EAAE,wBAAwB;AAAA,qCAAAC,qBAAA,UAAM,OAAO,2BAAQ;AAAA,sCAAAA,qBAAA;AAAA;AACrD,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM,CAAC,cAAc;AAAA,IACrB,MAAM,OAAO;AACX,YAAM,EAAE,wBAAwB;AAAA,qCAAAA,qBAAA,UAAM,OAAO,2BAAQ;AAAA,sCAAAA,qBAAA;AAAA;AACrD,aAAO,CAAC,YACN,oBAAoB,MAAe,OAAO;AAAA,IAC9C;AAAA;AAEJ","names":["DraftListProvider","DraftOverlayProvider","DraftDatatype","renderDraftsSidebar"],"ignoreList":[],"sources":["../src/draft-types.ts","../src/index.ts"],"sourcesContent":["import type { AutomergeUrl, UrlHeads } from \"@automerge/automerge-repo/slim\";\n\n// One COW relationship between an original doc and the per-draft clone we\n// write to. `clonedAt`/`mergedAt` capture the fork and join points on the\n// original — together they describe what the draft contributed to that doc.\nexport type CloneEntry = {\n cloneUrl: AutomergeUrl;\n clonedAt: UrlHeads;\n mergedAt?: UrlHeads;\n};\n\n// `parent` points at the URL this draft branches off of: the main draft (for\n// top-level drafts, listed in `mainDraft.drafts`) or another `DraftDoc` (for\n// sub-drafts attached via `DraftDoc.drafts`).\n//\n// `isMain` marks the single \"main draft\" a host doc points at via\n// `@patchwork.mainDraftUrl`. The main draft is bookkeeping only: it is never\n// resolved through (the overlay stays a no-op for main), its `clones` are\n// identity mappings (`cloneUrl === url`, `clonedAt === []`), and its `drafts`\n// holds the user-visible top-level draft list.\n//\n// `mergedAt` is a wall-clock timestamp set when the draft is merged into\n// its parent; absent means \"still open\". The sidebar uses it to filter\n// merged drafts out of the list.\n//\n// `name` is the user-given display name; absent means the default label\n// (\"Draft\", or \"Main\" for the main draft). Renaming main is what creates the\n// main draft doc if it doesn't exist yet.\nexport type DraftDoc = {\n \"@patchwork\": { type: \"draft\" };\n isMain?: boolean;\n name?: string;\n parent: AutomergeUrl;\n drafts: AutomergeUrl[];\n clones: Record<AutomergeUrl, CloneEntry>;\n mergedAt?: number;\n};\n\n// One member doc's pinned view within a checkpoint. `to` is the heads to render\n// the doc at (a fixed-heads, read-only view); omit it to leave the doc live.\n// `from` is the diff baseline the consumer compares `to` (or live) against;\n// omit it for no diff. A doc whose pinned change is its first has no predecessor,\n// so `from` is `[]` (the whole doc reads as added).\nexport type DocCheckpoint = {\n from?: UrlHeads;\n to?: UrlHeads;\n};\n\n// A frozen, read-only view of a draft (or main) at a point in its history: maps\n// each member doc's original url to the heads to view it at (`to`) and to diff\n// against (`from`). The selection's `checkedOut` branch gives those heads their\n// meaning, since post-fork changes only exist in that branch's clone.\n//\n// Built from a clicked timeline entry: the clicked doc is pinned exactly to that\n// change, every other member to its latest change at or before the entry's time\n// (approximate but good enough). Docs with no change at or before that time are\n// absent from the map — they didn't exist yet, so they fall through to live.\nexport type DraftCheckpoint = Record<AutomergeUrl, DocCheckpoint>;\n\n// Ephemeral, writeable state owned by the draft-list provider and handed to\n// the sidebar via `draft:checked-out`. It holds the selection: which draft is\n// currently checked out. `checkedOut = null` means \"main\" — i.e. the host doc\n// itself, no draft overlay. The derived drafts list lives separately in the\n// read-only `draft:list` push (`DraftList`).\n//\n// `at` pins the checkout to a history entry: absent/null means the live latest\n// heads (the default), set means a frozen read-only view (see DraftCheckpoint).\nexport type CheckedOutDraft = {\n checkedOut: AutomergeUrl | null;\n at?: DraftCheckpoint | null;\n};\n\n// Response shape for `draft:baseline { url }`, served by the draft-list provider\n// (see `currentBaseline`). `heads` is the doc's diff baseline: the checkpoint's\n// per-doc `from` when a history entry is pinned, otherwise the checked-out\n// draft's fork-point heads (`clones[url].clonedAt`) for a live draft view.\n// `heads` is `null` when there is no baseline (no clone yet, no pin on main).\n// It is `null` rather than optional so the value is a valid structured-cloneable\n// `JSONValue` crossing the provider channel.\nexport type Baseline = {\n heads: UrlHeads | null;\n};\n\n// One document that makes up a draft (or main), nested inside `DraftSummary`.\n//\n// On a draft these are the docs the overlay has forked — `cloneUrl` is the\n// per-draft clone and `clonedAt` its fork point (mirrors `CloneEntry`). On\n// \"main\" they come from the main draft's identity clones (`cloneUrl === url`,\n// `clonedAt === []`) once it exists; before the first draft is created there is\n// no main draft, so membership is observed from `patchwork:mounted` events and\n// both fields are `null`. Like `Baseline`, the nullable fields use `null`\n// rather than optional so the value stays a valid structured-cloneable\n// `JSONValue` crossing the provider channel.\nexport type DraftMemberDoc = {\n url: AutomergeUrl;\n cloneUrl: AutomergeUrl | null;\n clonedAt: UrlHeads | null;\n};\n\n// One entry in the read-only `draft:list` push: a draft (or main) together\n// with the member docs that make it up, so a consumer can render a card and\n// its change timeline without loading the `DraftDoc` itself.\nexport type DraftSummary = {\n // The `DraftDoc` url for a real draft; the host/main-draft url for `main`.\n url: AutomergeUrl;\n members: DraftMemberDoc[];\n // Number of sub-drafts (`DraftDoc.drafts.length`), shown in the card meta.\n childCount: number;\n // User-given display name (`DraftDoc.name`); `null` (not optional, to stay\n // structured-cloneable) means unnamed — the card shows its default label.\n name: string | null;\n};\n\n// Response shape for `draft:list`: the host doc's `main` entry plus the flat,\n// tree-ordered list of its (non-merged) drafts. Read-only and recomputed by\n// the provider; selection lives separately in `CheckedOutDraft`.\nexport type DraftList = {\n main: DraftSummary;\n drafts: DraftSummary[];\n};\n\n// Convention: a document that has been drafted carries `@patchwork.mainDraftUrl`\n// pointing at its single \"main draft\" — a `DraftDoc` (with `isMain`) whose\n// `drafts` lists the top-level drafts that branch off of it. The pointer is\n// created lazily on the first draft, so it is absent until then.\nexport type HasDrafts = {\n \"@patchwork\"?: {\n type?: string;\n mainDraftUrl?: AutomergeUrl;\n };\n};\n\nexport function isDraftDoc(value: unknown): value is DraftDoc {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n const marker = v[\"@patchwork\"] as { type?: string } | undefined;\n return marker?.type === \"draft\" && !!v.clones && typeof v.clones === \"object\";\n}\n","import type { Plugin, ToolElement } from \"@inkandswitch/patchwork-plugins\";\n\nexport const plugins: Plugin<any>[] = [\n {\n type: \"patchwork:component\",\n id: \"patchwork-draft-list-provider\",\n name: \"Draft List Provider\",\n async load() {\n const { DraftListProvider } =\n await import(\"./providers/DraftListProvider.js\");\n return DraftListProvider;\n },\n },\n {\n type: \"patchwork:component\",\n id: \"patchwork-draft-overlay-provider\",\n name: \"Draft Overlay Provider\",\n async load() {\n const { DraftOverlayProvider } =\n await import(\"./providers/DraftOverlayProvider.js\");\n return DraftOverlayProvider;\n },\n },\n {\n type: \"patchwork:datatype\",\n id: \"patchwork:draft\",\n name: \"Draft\",\n async load() {\n const { DraftDatatype } = await import(\"./DraftDatatype.js\");\n return DraftDatatype;\n },\n unlisted: true,\n },\n {\n type: \"patchwork:tool\",\n id: \"drafts\",\n tags: [\"context-tool\"],\n name: \"Drafts\",\n icon: \"GitBranch\",\n supportedDatatypes: [\"account\"],\n async load() {\n const { renderDraftsSidebar } = await import(\"./main\");\n return renderDraftsSidebar;\n },\n },\n // A `patchwork:component` that takes no document: the render function\n // ignores its handle (it reads everything off `element`), so we pass `null`\n // and it can be slotted in without an account doc.\n {\n type: \"patchwork:component\",\n id: \"drafts\",\n name: \"Drafts\",\n tags: [\"context-tool\"],\n async load() {\n const { renderDraftsSidebar } = await import(\"./main\");\n return (element: ToolElement) =>\n renderDraftsSidebar(null as never, element);\n },\n },\n];\n\nexport type {\n Baseline,\n CheckedOutDraft,\n CloneEntry,\n DraftDoc,\n DraftList,\n DraftMemberDoc,\n DraftSummary,\n} from \"./draft-types.js\";\nexport { isDraftDoc } from \"./draft-types.js\";\n"],"file":"index.js"}
1
+ {"version":3,"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8MO,SAAS,WAAW,OAAmC;AAC5D,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,IAAI;AACV,QAAM,SAAS,EAAE,YAAY;AAC7B,SAAO,QAAQ,SAAS,WAAW,CAAC,CAAC,EAAE,UAAU,OAAO,EAAE,WAAW;AACvE;ACjNO,MAAM,UAAyB;AAAA,EACpC;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM,OAAO;AACX,YAAM,EAAE,uBACN;AAAA,oCAAAA,oBAAA,UAAM,OAAO,yCAAmC;AAAA,qCAAAA,oBAAA;AAAA;AAClD,aAAO;AAAA,IACT;AAAA;AAAA,EAEF;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM,OAAO;AACX,YAAM,EAAE,yBACN;AAAA,sCAAAC,sBAAA,UAAM,OAAO,2CAAqC;AAAA,uCAAAA,sBAAA;AAAA;AACpD,aAAO;AAAA,IACT;AAAA;AAAA,EAEF;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM,OAAO;AACX,YAAM,EAAE,kBAAkB;AAAA,+BAAAC,eAAA,UAAM,OAAO,oCAAoB;AAAA,gCAAAA,eAAA;AAAA;AAC3D,aAAO;AAAA,IACT;AAAA,IACA,UAAU;AAAA;AAAA,EAEZ;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM,CAAC,cAAc;AAAA,IACrB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,oBAAoB,CAAC,SAAS;AAAA,IAC9B,MAAM,OAAO;AACX,YAAM,EAAE,wBAAwB;AAAA,qCAAAC,qBAAA,UAAM,OAAO,2BAAQ;AAAA,sCAAAA,qBAAA;AAAA;AACrD,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM,CAAC,cAAc;AAAA,IACrB,MAAM,OAAO;AACX,YAAM,EAAE,wBAAwB;AAAA,qCAAAA,qBAAA,UAAM,OAAO,2BAAQ;AAAA,sCAAAA,qBAAA;AAAA;AACrD,aAAO,CAAC,YACN,oBAAoB,MAAe,OAAO;AAAA,IAC9C;AAAA;AAEJ","names":["DraftStateProvider","DraftOverlayProvider","DraftDatatype","renderDraftsSidebar"],"ignoreList":[],"sources":["../src/draft-types.ts","../src/index.ts"],"sourcesContent":["import type { AutomergeUrl, UrlHeads } from \"@automerge/automerge-repo/slim\";\n\n// One COW relationship between an original doc and the per-draft clone we\n// write to. `clonedAt`/`mergedAt` capture the fork and join points on the\n// original — together they describe what the draft contributed to that doc.\nexport type CloneEntry = {\n cloneUrl: AutomergeUrl;\n clonedAt: UrlHeads;\n mergedAt?: UrlHeads;\n};\n\n// `parent` points at the URL this draft branches off of: the main draft (for\n// top-level drafts, listed in `mainDraft.drafts`) or another `DraftDoc` (for\n// sub-drafts attached via `DraftDoc.drafts`).\n//\n// `isMain` marks the single \"main draft\" a host doc points at via\n// `@patchwork.mainDraftUrl`. The main draft is bookkeeping only: it is never\n// resolved through (the overlay stays a no-op for main), its `clones` are\n// identity mappings (`cloneUrl === url`, `clonedAt === []`), and its `drafts`\n// holds the user-visible top-level draft list.\n//\n// `mergedAt` is a wall-clock timestamp set when the draft is merged into\n// its parent; absent means \"still open\". The sidebar uses it to filter\n// merged drafts out of the list.\n//\n// `name` is the user-given display name; absent means the default label\n// (\"Draft\", or \"Main\" for the main draft). Renaming main is what creates the\n// main draft doc if it doesn't exist yet.\nexport type DraftDoc = {\n \"@patchwork\": { type: \"draft\" };\n isMain?: boolean;\n name?: string;\n parent: AutomergeUrl;\n drafts: AutomergeUrl[];\n clones: Record<AutomergeUrl, CloneEntry>;\n mergedAt?: number;\n // Points at this draft's ChangeGroupDoc, holding the precomputed activity\n // groups for its timeline. Stamped lazily by the ChangeGrouper the first\n // time it touches the timeline (see change-group-cache.ts).\n changeGroupDocUrl?: AutomergeUrl;\n // Main draft only: points at the host doc's ActorAttributionDoc, mapping\n // actor ids to contact urls for author display. Stamped by the list\n // provider alongside the eager main-draft creation.\n actorAttributionUrl?: AutomergeUrl;\n // Main draft only: monotonic counter behind new forks' default names\n // (\"Draft N\"). Never decremented, so numbers aren't reused after deletes.\n draftCounter?: number;\n};\n\n// Maps Automerge actor ids to the contact doc of the user who wrote with\n// them. An actor id is per doc instance per session, so one person\n// accumulates many — the map is many-to-one and only the writing client can\n// attribute its own ids, which it does as it makes local changes (see\n// actor-attribution.ts). One doc per host doc (actor ids span main and every\n// draft), stamped on the main draft via `actorAttributionUrl`. Keyed by\n// actor id so concurrent writers converge per-entry.\nexport type ActorAttributionDoc = {\n \"@patchwork\": { type: \"actor-attribution\" };\n actors: Record<string, AutomergeUrl>;\n};\n\n// One persisted burst of activity in a draft's timeline: consecutive changes\n// (interleaved across the draft's member docs) separated by no more than the\n// inactivity gap, aggregated down to what a timeline row renders. Computed\n// once per change by the ChangeGrouper and persisted, so the sidebar never\n// has to re-diff history.\nexport type ChangeGroup = {\n id: string; // `tg-${newestHash}` — stable group identity\n startTime: number; // span covered, seconds (automerge change time)\n endTime: number;\n // Anchor change (click-to-pin, drag-to-fork): which MEMBER doc owns the\n // group's newest change, and its hash. Varies per group — a burst's last\n // edit can land in any member (host doc or embedded doc).\n newestMemberUrl: AutomergeUrl;\n newestHash: string;\n actors: string[]; // deduped authors, newest contributor first\n additions: number; // summed across ALL member docs in the span\n deletions: number;\n changeCount: number; // for scrubber band geometry\n};\n\n// Self-contained: one group doc per DraftDoc, holding that draft's timeline.\nexport type ChangeGroupDoc = {\n \"@patchwork\": { type: \"change-group\" };\n version: number; // document format; mismatch = rebuild\n inactivityGapMs: number; // grouping param baked in; changed = rebuild\n // Keyed by group id, ordered on read by endTime desc. A map (not array) so\n // concurrent writers converge per-group instead of duplicating rows.\n groups: Record<string, ChangeGroup>;\n // Per member: heads the grouping has consumed. getChangesMetaSince(doc,\n // these) yields exactly the unconsumed tail — including late-syncing\n // changes with old timestamps, which is what makes invalidation detectable.\n computedThrough: Record<AutomergeUrl, UrlHeads>;\n};\n\n// One member doc's pinned view within a checkpoint. `to` is the heads to render\n// the doc at (a fixed-heads, read-only view); omit it to leave the doc live.\n// `from` is the diff baseline the consumer compares `to` (or live) against;\n// omit it for no diff. `from` without `to` is the live-with-diff state (the\n// sidebar's eye toggled on while nothing is pinned: the doc stays writable and\n// diffs against its fork point). A `from` of `[]` diffs against the empty doc,\n// so the whole doc reads as added.\nexport type DocCheckpoint = {\n from?: UrlHeads;\n to?: UrlHeads;\n};\n\n// A frozen, read-only view of a draft (or main) at a point in its history: maps\n// each member doc's original url to the heads to view it at (`to`) and to diff\n// against (`from`). The selection's `checkedOut` branch gives those heads their\n// meaning, since post-fork changes only exist in that branch's clone.\n//\n// Built from a clicked timeline entry: the clicked doc is pinned exactly to that\n// change, every other member to its latest change at or before the entry's time\n// (approximate but good enough). Docs with no change at or before that time are\n// absent from the map — they didn't exist yet, so they fall through to live.\nexport type DraftCheckpoint = Record<AutomergeUrl, DocCheckpoint>;\n\n// Ephemeral, writeable state owned by the draft-state provider and handed to\n// the sidebar via `draft:checked-out`. It holds the selection: which draft is\n// currently checked out. `checkedOut = null` means \"main\" — i.e. the host doc\n// itself, no draft overlay. The derived drafts list lives separately in the\n// read-only `draft:list` push (`DraftList`).\n//\n// `at` carries the checkout's checkpoint (see DraftCheckpoint): per-doc pinned\n// heads (`to`) and/or diff baselines (`from`). Absent/null means the live\n// latest heads with no diff (the default). Entries with only `from` leave the\n// docs live but diffing — the sidebar's eye toggle on an unpinned draft.\nexport type CheckedOutDraft = {\n checkedOut: AutomergeUrl | null;\n at?: DraftCheckpoint | null;\n};\n\n// Response shape for `draft:baseline { url }`, served by the draft-state provider\n// (see `currentBaseline`). `heads` is the doc's diff baseline: the checkpoint's\n// per-doc `from`, written by the sidebar's eye toggle and scrubber. `heads` is\n// `null` when the checkpoint has no entry for the doc or the entry carries no\n// `from` — there is no implicit fork-point fallback; no baseline means no diff.\n// It is `null` rather than optional so the value is a valid structured-cloneable\n// `JSONValue` crossing the provider channel.\nexport type Baseline = {\n heads: UrlHeads | null;\n};\n\n// One document that makes up a draft (or main), nested inside `DraftSummary`.\n//\n// On a draft these are the docs the overlay has forked — `cloneUrl` is the\n// per-draft clone and `clonedAt` its fork point (mirrors `CloneEntry`). On\n// \"main\" they come from the main draft's identity clones (`cloneUrl === url`,\n// `clonedAt === []`) once it exists; before the first draft is created there is\n// no main draft, so membership is observed from `patchwork:mounted` events and\n// both fields are `null`. Like `Baseline`, the nullable fields use `null`\n// rather than optional so the value stays a valid structured-cloneable\n// `JSONValue` crossing the provider channel.\nexport type DraftMemberDoc = {\n url: AutomergeUrl;\n cloneUrl: AutomergeUrl | null;\n clonedAt: UrlHeads | null;\n};\n\n// One entry in the read-only `draft:list` push: a draft (or main) together\n// with the member docs that make it up, so a consumer can render a card and\n// its change timeline without loading the `DraftDoc` itself.\nexport type DraftSummary = {\n // The `DraftDoc` url for a real draft; the host/main-draft url for `main`.\n url: AutomergeUrl;\n // What this draft was forked off (`DraftDoc.parent`): the main draft's url\n // for a top-level draft, another draft's url for a sub-fork. `null` on the\n // main entry itself. The sidebar uses it to place the merge button on the\n // parent's card and to indent nested cards.\n parent: AutomergeUrl | null;\n members: DraftMemberDoc[];\n // Number of sub-drafts (`DraftDoc.drafts.length`), shown in the card meta.\n childCount: number;\n // User-given display name (`DraftDoc.name`); `null` (not optional, to stay\n // structured-cloneable) means unnamed — the card shows its default label.\n name: string | null;\n // The draft's ChangeGroupDoc url (`DraftDoc.changeGroupDocUrl`); `null`\n // until the ChangeGrouper stamps it. Cards read their timeline's groups\n // straight from this doc.\n changeGroupDocUrl: AutomergeUrl | null;\n};\n\n// Response shape for `draft:list`: the host doc's `main` entry plus the flat,\n// tree-ordered list of its (non-merged) drafts. Read-only and recomputed by\n// the provider; selection lives separately in `CheckedOutDraft`.\nexport type DraftList = {\n main: DraftSummary;\n drafts: DraftSummary[];\n // The host doc's ActorAttributionDoc url (`mainDraft.actorAttributionUrl`);\n // `null` until stamped. The sidebar resolves timeline actors to contacts\n // through it.\n actorAttributionUrl: AutomergeUrl | null;\n};\n\n// Convention: a document that has been drafted carries `@patchwork.mainDraftUrl`\n// pointing at its single \"main draft\" — a `DraftDoc` (with `isMain`) whose\n// `drafts` lists the top-level drafts that branch off of it. The pointer is\n// created lazily on the first draft, so it is absent until then.\nexport type HasDrafts = {\n \"@patchwork\"?: {\n type?: string;\n mainDraftUrl?: AutomergeUrl;\n };\n};\n\nexport function isDraftDoc(value: unknown): value is DraftDoc {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n const marker = v[\"@patchwork\"] as { type?: string } | undefined;\n return marker?.type === \"draft\" && !!v.clones && typeof v.clones === \"object\";\n}\n","import type { Plugin, ToolElement } from \"@inkandswitch/patchwork-plugins\";\n\nexport const plugins: Plugin<any>[] = [\n {\n type: \"patchwork:component\",\n id: \"patchwork-draft-state-provider\",\n name: \"Draft State Provider\",\n async load() {\n const { DraftStateProvider } =\n await import(\"./providers/DraftStateProvider.js\");\n return DraftStateProvider;\n },\n },\n {\n type: \"patchwork:component\",\n id: \"patchwork-draft-overlay-provider\",\n name: \"Draft Overlay Provider\",\n async load() {\n const { DraftOverlayProvider } =\n await import(\"./providers/DraftOverlayProvider.js\");\n return DraftOverlayProvider;\n },\n },\n {\n type: \"patchwork:datatype\",\n id: \"patchwork:draft\",\n name: \"Draft\",\n async load() {\n const { DraftDatatype } = await import(\"./DraftDatatype.js\");\n return DraftDatatype;\n },\n unlisted: true,\n },\n {\n type: \"patchwork:tool\",\n id: \"drafts\",\n tags: [\"context-tool\"],\n name: \"Drafts\",\n icon: \"GitBranch\",\n supportedDatatypes: [\"account\"],\n async load() {\n const { renderDraftsSidebar } = await import(\"./main\");\n return renderDraftsSidebar;\n },\n },\n // A `patchwork:component` that takes no document: the render function\n // ignores its handle (it reads everything off `element`), so we pass `null`\n // and it can be slotted in without an account doc.\n {\n type: \"patchwork:component\",\n id: \"drafts\",\n name: \"Drafts\",\n tags: [\"context-tool\"],\n async load() {\n const { renderDraftsSidebar } = await import(\"./main\");\n return (element: ToolElement) =>\n renderDraftsSidebar(null as never, element);\n },\n },\n];\n\nexport type {\n ActorAttributionDoc,\n Baseline,\n ChangeGroup,\n ChangeGroupDoc,\n CheckedOutDraft,\n CloneEntry,\n DraftDoc,\n DraftList,\n DraftMemberDoc,\n DraftSummary,\n} from \"./draft-types.js\";\nexport { isDraftDoc } from \"./draft-types.js\";\n"],"file":"index.js"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tiny-patchwork/drafts",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "main": "./dist/index.js",
@@ -0,0 +1,2 @@
1
+ import{s as a,t as b}from"./chunk-CGHYPNSB.js";import"./chunk-FW4363Y4.js";export{a as IsolatedDocumentArea,b as mountIsolationRoot};
2
+ //# sourceMappingURL=IsolatedDocumentArea-2JIBFDOX.js.map
@@ -1,2 +1,2 @@
1
- import{a as We,b as H,c as V,d as oe,e as ne,f as se,g as ie,h as ae,i as ce,j as le,k as de,l as ue,m as fe,n as me,o as P,p as he,q as pe,r as ge,s as we}from"./chunk-HNLVJAZZ.js";import{a as N,b as be}from"./chunk-3H5MX256.js";import{b as Oe}from"./chunk-FW4363Y4.js";import{template as y}from"solid-js/web";import{delegateEvents as st}from"solid-js/web";import{memo as it}from"solid-js/web";import{setStyleProperty as at}from"solid-js/web";import{setAttribute as q}from"solid-js/web";import{effect as x}from"solid-js/web";import{insert as _}from"solid-js/web";import{createComponent as u}from"solid-js/web";import{getOwner as U}from"solid-js/web";import{use as C}from"solid-js/web";import"@inkandswitch/patchwork-elements";import{parseAutomergeUrl as At,stringifyAutomergeUrl as xt}from"@automerge/automerge-repo";import{interpretAsDocumentId as Ft,isValidAutomergeUrl as Mt,parseAutomergeUrl as Ht,stringifyAutomergeUrl as Vt}from"@automerge/automerge-repo";function ve(e,c,l){let a=e.closest("patchwork-view")??e,t=new MessageChannel,r=t.port2,s=new AbortController,{signal:n}=s;r.addEventListener("message",m=>{m.data?.type==="change"&&l(m.data.value)},{signal:n}),r.start();let i={selector:c,port:t.port1};return a.dispatchEvent(new CustomEvent("patchwork:subscribe",{detail:i,bubbles:!0,composed:!0})),()=>{n.aborted||(s.abort(),r.postMessage({type:"unsubscribe"}),r.close())}}import{template as j}from"solid-js/web";import{delegateEvents as He}from"solid-js/web";import{memo as Ve}from"solid-js/web";import{insert as _e}from"solid-js/web";import{createComponent as A}from"solid-js/web";import{For as ze,Show as B}from"solid-js";var Ne=j("<div class=threepane-widgets>"),Be=j("<div class=threepane-widgets__empty><button type=button class=threepane-widgets__add>\uFF0B Add document list"),je=j("<div class=threepane-widget>"),qe="chee/document-list";function ye(e){let c=()=>{let l=e.rootFolderUrl(),o=e.configHandle();!l||!o||o.change(a=>{a.sidebar.widgets.push([qe,l])})};return(()=>{var l=Ne();return _e(l,A(B,{get when(){return e.ready()},get children(){return A(B,{get when(){return e.widgets().length},get fallback(){return A(B,{get when(){return Ve(()=>!!e.rootFolderUrl())()&&e.configHandle()},get children(){var o=Be(),a=o.firstChild;return a.$$click=c,o}})},get children(){return A(ze,{get each(){return e.widgets()},children:o=>(()=>{var a=je();return _e(a,A(P,{slot:o})),a})()})}})}})),l})()}He(["click"]);import{template as De}from"solid-js/web";import{setAttribute as Ye}from"solid-js/web";import{effect as Ke}from"solid-js/web";import{insert as Se}from"solid-js/web";import{createComponent as z}from"solid-js/web";import{For as Je,Show as Qe}from"solid-js";var Xe=De("<div class=frame-tray>"),Ge=De("<div class=frame-tray__item>");function ke(e){return z(Qe,{get when(){return e.slots().length},get children(){var c=Xe();return Se(c,z(Je,{get each(){return e.slots()},children:l=>(()=>{var o=Ge();return Se(o,z(P,{slot:l})),Ke(()=>Ye(o,"data-tray-id",me(l))),o})()})),c}})}import{createEffect as L,createMemo as X,createSignal as b,onCleanup as k,onMount as G,Show as E}from"solid-js";import{render as bt}from"solid-js/web";import{createDocOfDatatype2 as et}from"@inkandswitch/patchwork-plugins";import{getRegistry as Ze}from"@inkandswitch/patchwork-plugins";function O(e){return Ze("patchwork:datatype").loadWhenReady(e)}var tt=new Set(["document-title","spacer"]),rt="chee/document-list";function $e(e){return e?[[rt,e]]:[]}async function Ce(e,c){let l=e.doc()?.rootFolderUrl,o=e.doc()?.tools?.threepane;if(o){(await c.find(o)).change(i=>{l&&!i.sidebar?.widgets?.length&&(i.sidebar.widgets=$e(l)),i.tray||(i.tray=N.slice()),i.doctitle?.tools?.length||(i.doctitle={...i.doctitle,tools:be.slice()})});return}let a=await O("threepane:config");if(!a){console.warn("frame: threepane:config datatype never registered");return}if(e.doc()?.tools?.threepane)return;let t=e.doc(),r=(t?.documentToolbarToolIds??[]).filter(n=>!tt.has(n)),s=await et(a,c);s.change(n=>{r.length&&(n.doctitle.tools=r),n.sidebar.widgets=$e(t?.rootFolderUrl),n.tray||(n.tray=N.slice())}),e.change(n=>{n.tools||(n.tools={}),n.tools.threepane||(n.tools.threepane=s.url)})}var Ie=Oe(We(),1);import{createDocOfDatatype2 as ot}from"@inkandswitch/patchwork-plugins";var w=(0,Ie.default)("patchwork:threepane:examples");async function Ue(e,c){let l=e.doc();if(!l?.rootFolderUrl){w("skipped \u2014 account has no rootFolderUrl");return}if(l.exampleDocsSeededAt){w("skipped \u2014 already ran for this account at",new Date(l.exampleDocsSeededAt).toISOString());return}w("claiming marker on account",e.url),e.change(i=>{i.exampleDocsSeededAt||(i.exampleDocsSeededAt=Date.now())});let o=await c.find(l.rootFolderUrl),a=o.doc()?.docs?.length??0;if(a){w(`skipped \u2014 root folder already has ${a} doc(s); only fresh accounts are seeded`);return}let t=await nt();if(w("bundle init scripts:",t),!t.length){w("skipped \u2014 no static module bundles to ask");return}let r=await O("folder");if(!r){w("folder datatype never registered; giving up");return}let s=await ot(r,c,i=>{i.title="Examples"});for(let i of t)try{await(await import(i)).default?.(c,s),w("ran init script",i)}catch(m){w("init script unavailable or failed",i,m)}let n=s.doc()?.docs?.length??0;if(!n){w("no bundle contributed any documents");return}o.change(i=>{i.docs.unshift({name:"Examples",type:"folder",url:s.url})}),w(`seeded ${n} document(s) into Examples folder`,s.url)}var Ee="https://patchwork-tools.netlify.app/init.js",Re="https://patchwork-base.netlify.app/init.js";async function nt(){let e=window.patchwork?.packages;if(!e?.urls)return[Re,Ee];await e.doneLoading;let c=Object.values(e.urls).filter(o=>typeof o=="string"&&!o.startsWith("automerge:")).map(o=>new URL("init.js",new URL(o,document.baseURI)).href),l=c.length?[]:[Re];return[...new Set([...c,...l,Ee])]}var ct=y("<div class=frame-shell><aside class=frame-warning-banner>research grade software. do not share links. sharing a doc is sharing your account.</aside><div class=frame><patchwork-view component=patchwork-selected-doc-provider><patchwork-view component=patchwork-account-provider><patchwork-view component=patchwork-tool-storage-provider>",!0,!1,!1),lt=y("<div style=display:contents>"),dt=y("<div class=main-area>"),ut=y("<div class=frame__popover-backdrop><div class=frame__popover role=dialog aria-modal=true><div class=frame__popover-toolbar><patchwork-view tool-id=doc-openwith></patchwork-view></div><div class=frame__popover-body><patchwork-view>",!0,!1,!1),ft=y('<button type=button class="frame__sidebar-toggle frame__left-toggle">'),mt=y("<div class=threepane-sidebar><div class=threepane-sidebar__footer><footer class=threepane-account-bar><button type=button class=threepane-account-bar__button>Settings"),ht=y("<div class=frame__tray-dock>"),pt=y('<button type=button class="threepane-account-bar__button threepane-account-bar__avatar"title=Account aria-label=Account><patchwork-view tool-id=contact-avatar>',!0,!1,!1),gt=y("<button type=button class=threepane-account-bar__button>Packages"),wt=y('<svg xmlns=http://www.w3.org/2000/svg width=18 height=18 viewBox="0 0 24 24"fill=none stroke=var(--studio-chrome-line) stroke-width=1.75 stroke-linecap=round stroke-linejoin=round><rect width=18 height=18 x=3 y=3 rx=2></rect><path d="M9 3v18">'),vt=180,_t=720,yt=120,St=3,Y=(e,c)=>{let[l,o]=b(!1);return L(()=>{let a=c();if(!a)return;o(!1);let t=r=>{r.detail?.componentId===e&&o(!0)};a.addEventListener("patchwork:mounted",t),k(()=>a.removeEventListener("patchwork:mounted",t))}),l};function K(e,c){e.dispatchEvent(new CustomEvent("patchwork:open-document",{detail:c,bubbles:!0,composed:!0}))}function Dt({handle:e,repo:c,...l}){ge();let o=e.url,[a,t]=b(),r=Y("patchwork-account-provider",a),[s,n]=b(),i=Y("patchwork-tool-storage-provider",s),[m,d]=b(),h=Y("patchwork-selected-doc-provider",m),p=X(()=>h()&&r()&&i());return(()=>{var S=ct(),g=S.firstChild,W=g.nextSibling,T=W.firstChild,R=T.firstChild,I=R.firstChild;return C(d,T),T._$owner=U(),C(t,R),R.docUrl=o,R._$owner=U(),C(n,I),I.docUrl=o,I._$owner=U(),_(I,u(E,{get when(){return p()},get children(){return u(kt,{handle:e,repo:c,get isolation(){return l.isolation}})}})),S})()}function kt(e){let c=H(()=>e.handle.url,{repo:e.repo});(async()=>{await Ce(e.handle,e.repo),await Ue(e.handle,e.repo)})().catch(f=>{console.error("frame: account bootstrap failed",f)});let[l,o]=b(0);L(()=>{let f=c();if(!f)return;let v=()=>o(D=>D+1);f.on("change",v),k(()=>f.off("change",v))});let a=X(()=>(l(),c()?.doc())),t=e.handle.url,r=()=>a()?.tools?.threepane,s=H(()=>r(),{repo:e.repo}),[n,i]=b(0);L(()=>{let f=s();if(!f)return;let v=()=>i(D=>D+1);f.on("change",v),k(()=>f.off("change",v))});let m=X(()=>(n(),s()?.doc())),d=()=>m()?.doctitle?.tools,h=()=>m()?.sidebar?.widgets??[],p=()=>m()?.tray??[],S=()=>a()?.rootFolderUrl,g=ae(),W=ce({setLeftSidebarWidth:g.setLeftSidebarWidth,setRightSidebarWidth:g.setRightSidebarWidth,setIsSidebarCollapsed:g.setIsSidebarCollapsed,setIsRightSidebarCollapsed:g.setIsRightSidebarCollapsed,isLeftCollapsed:g.isSidebarCollapsed,isRightCollapsed:g.isRightSidebarCollapsed,minWidth:vt,maxWidth:_t,autoCloseWidth:yt,dragThreshold:St}),{events:T,dismissEvent:R,clearAll:I}=de(),F,[J,Le]=b(null),[Te,Q]=b(null);G(()=>{let f=ve(F,{type:"patchwork:selected-view"},v=>Le(v));k(f)});let $=()=>J()?.url,M=()=>J()?.toolId??void 0,Z=()=>se(V.rightWidth,ne),ee=()=>ie(V.rightCollapsed),[Ae,te]=b(),xe=le(Ae,$),[re,Pe]=b(!1);return L(()=>{re()||(e.isolation||!$()||xe())&&Pe(!0)}),(()=>{var f=lt(),v=F;return typeof v=="function"?C(v,f):F=f,_(f,u(ue,{get events(){return T()},onDismiss:R,onClearAll:I}),null),_(f,u(Ct,{accountDocUrl:t,sidebarState:g,sidebarResize:W,sidebarWidgets:h,traySlots:p,configHandle:s,rootFolderUrl:S,widgetsReady:re,contactUrl:()=>a()?.contactUrl,moduleSettingsUrl:()=>a()?.moduleSettingsUrl,get isolation(){return e.isolation},onInterceptOpen:Q,get children(){return u(E,{get when(){return $()},get fallback(){return(()=>{var D=dt();return _(D,u(he,{viewKey:$,selectedDocUrl:$,toolId:M,ref:te})),D})()},get children(){return u(E,{get when(){return e.isolation},get fallback(){return u(pe,{setMainDocElement:te,selectedDocUrl:$,selectedToolId:M,doctitleSlots:d,get isLeftCollapsed(){return g.isSidebarCollapsed},initialRightWidth:Z,initialRightCollapsed:ee})},get children(){return u(we,{get contactUrl(){return a()?.contactUrl},selectedDocUrl:$,selectedToolId:M,doctitleSlots:d,get isLeftCollapsed(){return g.isSidebarCollapsed},initialRightWidth:Z,initialRightCollapsed:ee})}})}})}}),null),_(f,u(E,{get when(){return Te()},children:D=>u($t,{get view(){return D()},onClose:()=>Q(null)})}),null),f})()}function $t(e){let[c,l]=b(e.view.toolId??void 0);L(()=>l(e.view.toolId??void 0));let o;return G(()=>{let a=s=>{s.key==="Escape"&&e.onClose()};window.addEventListener("keydown",a),k(()=>window.removeEventListener("keydown",a));let t=o;if(!t)return;let r=s=>{let{url:n,toolId:i}=s.detail;n&&(s.stopPropagation(),l(i??void 0))};t.addEventListener("patchwork:open-document",r),k(()=>t.removeEventListener("patchwork:open-document",r))}),(()=>{var a=ut(),t=a.firstChild,r=t.firstChild,s=r.firstChild,n=r.nextSibling,i=n.firstChild;a.$$click=()=>e.onClose(),t.$$click=d=>d.stopPropagation();var m=o;return typeof m=="function"?C(m,t):o=t,s._$owner=U(),i._$owner=U(),x(d=>{var h=e.view.url,p=e.view.url,S=c();return h!==d.e&&(s.docUrl=d.e=h),p!==d.t&&(i.docUrl=d.t=p),S!==d.a&&(i.toolId=d.a=S),d},{e:void 0,t:void 0,a:void 0}),a})()}function Ct(e){let c=e.sidebarState.isSidebarCollapsed,l=()=>e.traySlots().length>0,o;G(()=>{if(!e.isolation||!o)return;let t=o,r=s=>{let{url:n,toolId:i}=s.detail;n&&(s.stopPropagation(),e.onInterceptOpen?.({url:n,toolId:i??null}))};t.addEventListener("patchwork:open-document",r),k(()=>t.removeEventListener("patchwork:open-document",r))});let a;return L(()=>{if(e.sidebarState.isSidebarCollapsed())return;let t=a;if(!t)return;let r=()=>{t.getBoundingClientRect().width<=window.innerWidth*.75||(e.sidebarState.setIsSidebarCollapsed(!0),window.dispatchEvent(new CustomEvent(oe)))};t.addEventListener("patchwork:open-document",r),k(()=>t.removeEventListener("patchwork:open-document",r))}),[(()=>{var t=ft();return t.$$click=()=>e.sidebarState.setIsSidebarCollapsed(r=>!r),_(t,u(Et,{})),x(r=>{var s=c()?"Show sidebar":"Hide sidebar",n=c()?"Show sidebar":"Hide sidebar",i=!c();return s!==r.e&&q(t,"title",r.e=s),n!==r.t&&q(t,"aria-label",r.t=n),i!==r.a&&q(t,"aria-pressed",r.a=i),r},{e:void 0,t:void 0,a:void 0}),t})(),u(fe,{side:"left",isCollapsed:c,get width(){return e.sidebarState.leftSidebarWidth},get onMouseDown(){return e.sidebarResize.handleMouseDown},get onToggleClick(){return e.sidebarResize.handleToggleClick},get children(){var t=mt(),r=t.firstChild,s=r.firstChild,n=s.firstChild,i=a;typeof i=="function"?C(i,t):a=t,_(t,u(ye,{get widgets(){return e.sidebarWidgets},get configHandle(){return e.configHandle},get rootFolderUrl(){return e.rootFolderUrl},get ready(){return e.widgetsReady}}),r);var m=o;return typeof m=="function"?C(m,r):o=r,_(s,u(E,{get when(){return e.contactUrl()},children:d=>(()=>{var h=pt(),p=h.firstChild;return h.$$click=S=>K(S.currentTarget,{url:e.accountDocUrl,toolId:"account-picker"}),p._$owner=U(),x(()=>p.docUrl=d()),h})()}),n),_(s,u(E,{get when(){return e.moduleSettingsUrl()},children:d=>(()=>{var h=gt();return h.$$click=p=>K(p.currentTarget,{url:d(),toolId:"packages"}),h})()}),n),n.$$click=d=>K(d.currentTarget,{url:e.accountDocUrl,toolId:"frame-configurator"}),x(()=>t.classList.toggle("threepane-sidebar--has-tray",!!l())),t}}),u(E,{get when(){return l()},get children(){var t=ht();return _(t,u(ke,{get slots(){return e.traySlots}})),x(r=>{var s=!!c(),n=`${e.sidebarState.leftSidebarWidth()}px`;return s!==r.e&&t.classList.toggle("frame__tray-dock--collapsed",r.e=s),n!==r.t&&at(t,"width",r.t=n),r},{e:void 0,t:void 0}),t}}),it(()=>e.children)]}function Et(){return wt()}function Xr(e){return(c,l)=>bt(()=>u(Dt,{handle:c,get repo(){return l.repo},isolation:e}),l)}st(["click"]);export{Dt as PatchworkFrame,Xr as renderPatchworkFrame};
2
- //# sourceMappingURL=PatchworkFrame-4AEBOBRE.js.map
1
+ import{a as We,b as H,c as V,d as oe,e as ne,f as se,g as ie,h as ae,i as ce,j as le,k as de,l as ue,m as fe,n as me,o as P,p as he,q as pe,r as ge,s as we}from"./chunk-CGHYPNSB.js";import{a as N,b as be}from"./chunk-3H5MX256.js";import{b as Oe}from"./chunk-FW4363Y4.js";import{template as y}from"solid-js/web";import{delegateEvents as st}from"solid-js/web";import{memo as it}from"solid-js/web";import{setStyleProperty as at}from"solid-js/web";import{setAttribute as q}from"solid-js/web";import{effect as x}from"solid-js/web";import{insert as _}from"solid-js/web";import{createComponent as u}from"solid-js/web";import{getOwner as U}from"solid-js/web";import{use as C}from"solid-js/web";import"@inkandswitch/patchwork-elements";import{parseAutomergeUrl as At,stringifyAutomergeUrl as xt}from"@automerge/automerge-repo";import{interpretAsDocumentId as Ft,isValidAutomergeUrl as Mt,parseAutomergeUrl as Ht,stringifyAutomergeUrl as Vt}from"@automerge/automerge-repo";function ve(e,c,l){let a=e.closest("patchwork-view")??e,t=new MessageChannel,r=t.port2,s=new AbortController,{signal:n}=s;r.addEventListener("message",m=>{m.data?.type==="change"&&l(m.data.value)},{signal:n}),r.start();let i={selector:c,port:t.port1};return a.dispatchEvent(new CustomEvent("patchwork:subscribe",{detail:i,bubbles:!0,composed:!0})),()=>{n.aborted||(s.abort(),r.postMessage({type:"unsubscribe"}),r.close())}}import{template as j}from"solid-js/web";import{delegateEvents as He}from"solid-js/web";import{memo as Ve}from"solid-js/web";import{insert as _e}from"solid-js/web";import{createComponent as A}from"solid-js/web";import{For as ze,Show as B}from"solid-js";var Ne=j("<div class=threepane-widgets>"),Be=j("<div class=threepane-widgets__empty><button type=button class=threepane-widgets__add>\uFF0B Add document list"),je=j("<div class=threepane-widget>"),qe="chee/document-list";function ye(e){let c=()=>{let l=e.rootFolderUrl(),o=e.configHandle();!l||!o||o.change(a=>{a.sidebar.widgets.push([qe,l])})};return(()=>{var l=Ne();return _e(l,A(B,{get when(){return e.ready()},get children(){return A(B,{get when(){return e.widgets().length},get fallback(){return A(B,{get when(){return Ve(()=>!!e.rootFolderUrl())()&&e.configHandle()},get children(){var o=Be(),a=o.firstChild;return a.$$click=c,o}})},get children(){return A(ze,{get each(){return e.widgets()},children:o=>(()=>{var a=je();return _e(a,A(P,{slot:o})),a})()})}})}})),l})()}He(["click"]);import{template as De}from"solid-js/web";import{setAttribute as Ye}from"solid-js/web";import{effect as Ke}from"solid-js/web";import{insert as Se}from"solid-js/web";import{createComponent as z}from"solid-js/web";import{For as Je,Show as Qe}from"solid-js";var Xe=De("<div class=frame-tray>"),Ge=De("<div class=frame-tray__item>");function ke(e){return z(Qe,{get when(){return e.slots().length},get children(){var c=Xe();return Se(c,z(Je,{get each(){return e.slots()},children:l=>(()=>{var o=Ge();return Se(o,z(P,{slot:l})),Ke(()=>Ye(o,"data-tray-id",me(l))),o})()})),c}})}import{createEffect as L,createMemo as X,createSignal as b,onCleanup as k,onMount as G,Show as E}from"solid-js";import{render as bt}from"solid-js/web";import{createDocOfDatatype2 as et}from"@inkandswitch/patchwork-plugins";import{getRegistry as Ze}from"@inkandswitch/patchwork-plugins";function O(e){return Ze("patchwork:datatype").loadWhenReady(e)}var tt=new Set(["document-title","spacer"]),rt="chee/document-list";function $e(e){return e?[[rt,e]]:[]}async function Ce(e,c){let l=e.doc()?.rootFolderUrl,o=e.doc()?.tools?.threepane;if(o){(await c.find(o)).change(i=>{l&&!i.sidebar?.widgets?.length&&(i.sidebar.widgets=$e(l)),i.tray||(i.tray=N.slice()),i.doctitle?.tools?.length||(i.doctitle={...i.doctitle,tools:be.slice()})});return}let a=await O("threepane:config");if(!a){console.warn("frame: threepane:config datatype never registered");return}if(e.doc()?.tools?.threepane)return;let t=e.doc(),r=(t?.documentToolbarToolIds??[]).filter(n=>!tt.has(n)),s=await et(a,c);s.change(n=>{r.length&&(n.doctitle.tools=r),n.sidebar.widgets=$e(t?.rootFolderUrl),n.tray||(n.tray=N.slice())}),e.change(n=>{n.tools||(n.tools={}),n.tools.threepane||(n.tools.threepane=s.url)})}var Ie=Oe(We(),1);import{createDocOfDatatype2 as ot}from"@inkandswitch/patchwork-plugins";var w=(0,Ie.default)("patchwork:threepane:examples");async function Ue(e,c){let l=e.doc();if(!l?.rootFolderUrl){w("skipped \u2014 account has no rootFolderUrl");return}if(l.exampleDocsSeededAt){w("skipped \u2014 already ran for this account at",new Date(l.exampleDocsSeededAt).toISOString());return}w("claiming marker on account",e.url),e.change(i=>{i.exampleDocsSeededAt||(i.exampleDocsSeededAt=Date.now())});let o=await c.find(l.rootFolderUrl),a=o.doc()?.docs?.length??0;if(a){w(`skipped \u2014 root folder already has ${a} doc(s); only fresh accounts are seeded`);return}let t=await nt();if(w("bundle init scripts:",t),!t.length){w("skipped \u2014 no static module bundles to ask");return}let r=await O("folder");if(!r){w("folder datatype never registered; giving up");return}let s=await ot(r,c,i=>{i.title="Examples"});for(let i of t)try{await(await import(i)).default?.(c,s),w("ran init script",i)}catch(m){w("init script unavailable or failed",i,m)}let n=s.doc()?.docs?.length??0;if(!n){w("no bundle contributed any documents");return}o.change(i=>{i.docs.unshift({name:"Examples",type:"folder",url:s.url})}),w(`seeded ${n} document(s) into Examples folder`,s.url)}var Ee="https://patchwork-tools.netlify.app/init.js",Re="https://patchwork-base.netlify.app/init.js";async function nt(){let e=window.patchwork?.packages;if(!e?.urls)return[Re,Ee];await e.doneLoading;let c=Object.values(e.urls).filter(o=>typeof o=="string"&&!o.startsWith("automerge:")).map(o=>new URL("init.js",new URL(o,document.baseURI)).href),l=c.length?[]:[Re];return[...new Set([...c,...l,Ee])]}var ct=y("<div class=frame-shell><aside class=frame-warning-banner>research grade software. do not share links. sharing a doc is sharing your account.</aside><div class=frame><patchwork-view component=patchwork-selected-doc-provider><patchwork-view component=patchwork-account-provider><patchwork-view component=patchwork-tool-storage-provider>",!0,!1,!1),lt=y("<div style=display:contents>"),dt=y("<div class=main-area>"),ut=y("<div class=frame__popover-backdrop><div class=frame__popover role=dialog aria-modal=true><div class=frame__popover-toolbar><patchwork-view tool-id=doc-openwith></patchwork-view></div><div class=frame__popover-body><patchwork-view>",!0,!1,!1),ft=y('<button type=button class="frame__sidebar-toggle frame__left-toggle">'),mt=y("<div class=threepane-sidebar><div class=threepane-sidebar__footer><footer class=threepane-account-bar><button type=button class=threepane-account-bar__button>Settings"),ht=y("<div class=frame__tray-dock>"),pt=y('<button type=button class="threepane-account-bar__button threepane-account-bar__avatar"title=Account aria-label=Account><patchwork-view tool-id=contact-avatar>',!0,!1,!1),gt=y("<button type=button class=threepane-account-bar__button>Packages"),wt=y('<svg xmlns=http://www.w3.org/2000/svg width=18 height=18 viewBox="0 0 24 24"fill=none stroke=var(--studio-chrome-line) stroke-width=1.75 stroke-linecap=round stroke-linejoin=round><rect width=18 height=18 x=3 y=3 rx=2></rect><path d="M9 3v18">'),vt=180,_t=720,yt=120,St=3,Y=(e,c)=>{let[l,o]=b(!1);return L(()=>{let a=c();if(!a)return;o(!1);let t=r=>{r.detail?.componentId===e&&o(!0)};a.addEventListener("patchwork:mounted",t),k(()=>a.removeEventListener("patchwork:mounted",t))}),l};function K(e,c){e.dispatchEvent(new CustomEvent("patchwork:open-document",{detail:c,bubbles:!0,composed:!0}))}function Dt({handle:e,repo:c,...l}){ge();let o=e.url,[a,t]=b(),r=Y("patchwork-account-provider",a),[s,n]=b(),i=Y("patchwork-tool-storage-provider",s),[m,d]=b(),h=Y("patchwork-selected-doc-provider",m),p=X(()=>h()&&r()&&i());return(()=>{var S=ct(),g=S.firstChild,W=g.nextSibling,T=W.firstChild,R=T.firstChild,I=R.firstChild;return C(d,T),T._$owner=U(),C(t,R),R.docUrl=o,R._$owner=U(),C(n,I),I.docUrl=o,I._$owner=U(),_(I,u(E,{get when(){return p()},get children(){return u(kt,{handle:e,repo:c,get isolation(){return l.isolation}})}})),S})()}function kt(e){let c=H(()=>e.handle.url,{repo:e.repo});(async()=>{await Ce(e.handle,e.repo),await Ue(e.handle,e.repo)})().catch(f=>{console.error("frame: account bootstrap failed",f)});let[l,o]=b(0);L(()=>{let f=c();if(!f)return;let v=()=>o(D=>D+1);f.on("change",v),k(()=>f.off("change",v))});let a=X(()=>(l(),c()?.doc())),t=e.handle.url,r=()=>a()?.tools?.threepane,s=H(()=>r(),{repo:e.repo}),[n,i]=b(0);L(()=>{let f=s();if(!f)return;let v=()=>i(D=>D+1);f.on("change",v),k(()=>f.off("change",v))});let m=X(()=>(n(),s()?.doc())),d=()=>m()?.doctitle?.tools,h=()=>m()?.sidebar?.widgets??[],p=()=>m()?.tray??[],S=()=>a()?.rootFolderUrl,g=ae(),W=ce({setLeftSidebarWidth:g.setLeftSidebarWidth,setRightSidebarWidth:g.setRightSidebarWidth,setIsSidebarCollapsed:g.setIsSidebarCollapsed,setIsRightSidebarCollapsed:g.setIsRightSidebarCollapsed,isLeftCollapsed:g.isSidebarCollapsed,isRightCollapsed:g.isRightSidebarCollapsed,minWidth:vt,maxWidth:_t,autoCloseWidth:yt,dragThreshold:St}),{events:T,dismissEvent:R,clearAll:I}=de(),F,[J,Le]=b(null),[Te,Q]=b(null);G(()=>{let f=ve(F,{type:"patchwork:selected-view"},v=>Le(v));k(f)});let $=()=>J()?.url,M=()=>J()?.toolId??void 0,Z=()=>se(V.rightWidth,ne),ee=()=>ie(V.rightCollapsed),[Ae,te]=b(),xe=le(Ae,$),[re,Pe]=b(!1);return L(()=>{re()||(e.isolation||!$()||xe())&&Pe(!0)}),(()=>{var f=lt(),v=F;return typeof v=="function"?C(v,f):F=f,_(f,u(ue,{get events(){return T()},onDismiss:R,onClearAll:I}),null),_(f,u(Ct,{accountDocUrl:t,sidebarState:g,sidebarResize:W,sidebarWidgets:h,traySlots:p,configHandle:s,rootFolderUrl:S,widgetsReady:re,contactUrl:()=>a()?.contactUrl,moduleSettingsUrl:()=>a()?.moduleSettingsUrl,get isolation(){return e.isolation},onInterceptOpen:Q,get children(){return u(E,{get when(){return $()},get fallback(){return(()=>{var D=dt();return _(D,u(he,{viewKey:$,selectedDocUrl:$,toolId:M,ref:te})),D})()},get children(){return u(E,{get when(){return e.isolation},get fallback(){return u(pe,{setMainDocElement:te,selectedDocUrl:$,selectedToolId:M,doctitleSlots:d,get isLeftCollapsed(){return g.isSidebarCollapsed},initialRightWidth:Z,initialRightCollapsed:ee})},get children(){return u(we,{get contactUrl(){return a()?.contactUrl},selectedDocUrl:$,selectedToolId:M,doctitleSlots:d,get isLeftCollapsed(){return g.isSidebarCollapsed},initialRightWidth:Z,initialRightCollapsed:ee})}})}})}}),null),_(f,u(E,{get when(){return Te()},children:D=>u($t,{get view(){return D()},onClose:()=>Q(null)})}),null),f})()}function $t(e){let[c,l]=b(e.view.toolId??void 0);L(()=>l(e.view.toolId??void 0));let o;return G(()=>{let a=s=>{s.key==="Escape"&&e.onClose()};window.addEventListener("keydown",a),k(()=>window.removeEventListener("keydown",a));let t=o;if(!t)return;let r=s=>{let{url:n,toolId:i}=s.detail;n&&(s.stopPropagation(),l(i??void 0))};t.addEventListener("patchwork:open-document",r),k(()=>t.removeEventListener("patchwork:open-document",r))}),(()=>{var a=ut(),t=a.firstChild,r=t.firstChild,s=r.firstChild,n=r.nextSibling,i=n.firstChild;a.$$click=()=>e.onClose(),t.$$click=d=>d.stopPropagation();var m=o;return typeof m=="function"?C(m,t):o=t,s._$owner=U(),i._$owner=U(),x(d=>{var h=e.view.url,p=e.view.url,S=c();return h!==d.e&&(s.docUrl=d.e=h),p!==d.t&&(i.docUrl=d.t=p),S!==d.a&&(i.toolId=d.a=S),d},{e:void 0,t:void 0,a:void 0}),a})()}function Ct(e){let c=e.sidebarState.isSidebarCollapsed,l=()=>e.traySlots().length>0,o;G(()=>{if(!e.isolation||!o)return;let t=o,r=s=>{let{url:n,toolId:i}=s.detail;n&&(s.stopPropagation(),e.onInterceptOpen?.({url:n,toolId:i??null}))};t.addEventListener("patchwork:open-document",r),k(()=>t.removeEventListener("patchwork:open-document",r))});let a;return L(()=>{if(e.sidebarState.isSidebarCollapsed())return;let t=a;if(!t)return;let r=()=>{t.getBoundingClientRect().width<=window.innerWidth*.75||(e.sidebarState.setIsSidebarCollapsed(!0),window.dispatchEvent(new CustomEvent(oe)))};t.addEventListener("patchwork:open-document",r),k(()=>t.removeEventListener("patchwork:open-document",r))}),[(()=>{var t=ft();return t.$$click=()=>e.sidebarState.setIsSidebarCollapsed(r=>!r),_(t,u(Et,{})),x(r=>{var s=c()?"Show sidebar":"Hide sidebar",n=c()?"Show sidebar":"Hide sidebar",i=!c();return s!==r.e&&q(t,"title",r.e=s),n!==r.t&&q(t,"aria-label",r.t=n),i!==r.a&&q(t,"aria-pressed",r.a=i),r},{e:void 0,t:void 0,a:void 0}),t})(),u(fe,{side:"left",isCollapsed:c,get width(){return e.sidebarState.leftSidebarWidth},get onMouseDown(){return e.sidebarResize.handleMouseDown},get onToggleClick(){return e.sidebarResize.handleToggleClick},get children(){var t=mt(),r=t.firstChild,s=r.firstChild,n=s.firstChild,i=a;typeof i=="function"?C(i,t):a=t,_(t,u(ye,{get widgets(){return e.sidebarWidgets},get configHandle(){return e.configHandle},get rootFolderUrl(){return e.rootFolderUrl},get ready(){return e.widgetsReady}}),r);var m=o;return typeof m=="function"?C(m,r):o=r,_(s,u(E,{get when(){return e.contactUrl()},children:d=>(()=>{var h=pt(),p=h.firstChild;return h.$$click=S=>K(S.currentTarget,{url:e.accountDocUrl,toolId:"account-picker"}),p._$owner=U(),x(()=>p.docUrl=d()),h})()}),n),_(s,u(E,{get when(){return e.moduleSettingsUrl()},children:d=>(()=>{var h=gt();return h.$$click=p=>K(p.currentTarget,{url:d(),toolId:"packages"}),h})()}),n),n.$$click=d=>K(d.currentTarget,{url:e.accountDocUrl,toolId:"frame-configurator"}),x(()=>t.classList.toggle("threepane-sidebar--has-tray",!!l())),t}}),u(E,{get when(){return l()},get children(){var t=ht();return _(t,u(ke,{get slots(){return e.traySlots}})),x(r=>{var s=!!c(),n=`${e.sidebarState.leftSidebarWidth()}px`;return s!==r.e&&t.classList.toggle("frame__tray-dock--collapsed",r.e=s),n!==r.t&&at(t,"width",r.t=n),r},{e:void 0,t:void 0}),t}}),it(()=>e.children)]}function Et(){return wt()}function Xr(e){return(c,l)=>bt(()=>u(Dt,{handle:c,get repo(){return l.repo},isolation:e}),l)}st(["click"]);export{Dt as PatchworkFrame,Xr as renderPatchworkFrame};
2
+ //# sourceMappingURL=PatchworkFrame-P5P6JTJE.js.map