@inkandswitch/patchwork-pkg-base 0.0.22 → 0.0.24

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-Cg7zrpH9.js","sources":["../../src/tool.tsx"],"sourcesContent":["// Embed frame: chrome (title, tool picker, open button) around a nested\n// <patchwork-view>. Hosts mount it via <patchwork-view tool-id=\"embed\">, pin\n// the inner tool with the `embed-tool-id` attribute, and persist picks by\n// listening for the bubbling `patchwork:embed-tool-changed` event.\n\nimport {\n getFallbackTool,\n getRegistry,\n getSupportedToolsForType,\n isLoadedPlugin,\n type DatatypeImplementation,\n type ToolDescription,\n type ToolImplementation,\n} from \"@inkandswitch/patchwork-plugins\";\nimport { getType } from \"@inkandswitch/patchwork-filesystem\";\nimport { openDocument } from \"@inkandswitch/patchwork-elements\";\nimport type { DocHandle } from \"@automerge/automerge-repo\";\nimport { createEffect, createSignal, For, onCleanup, Show } from \"solid-js\";\nimport { render } from \"solid-js/web\";\nimport { version } from \"../package.json\";\nimport \"./embed.css\";\n\nconst EMBED_TOOL_ID = \"embed\";\n\nconst EmbedFrame: ToolImplementation<any> = (handle, element) =>\n render(() => <Frame handle={handle} element={element} />, element);\n\nexport default EmbedFrame;\n\ntype FrameProps = {\n handle: DocHandle<any>;\n element: HTMLElement;\n};\n\nfunction Frame(props: FrameProps) {\n // Static per mount (the render contract passes them once); safe to unwrap.\n const { handle, element } = props;\n\n // `element` is the inner <patchwork-view-legacy>; hosts set `embed-tool-id`\n // on the outer <patchwork-view>, so check there too.\n const [pinnedToolId, setPinnedToolId] = createSignal(\n element.getAttribute(\"embed-tool-id\") ||\n element.closest(\"patchwork-view\")?.getAttribute(\"embed-tool-id\") ||\n null\n );\n const [doc, setDoc] = createSignal<any>(handle.doc(), { equals: false });\n const [datatype, setDatatype] =\n createSignal<DatatypeImplementation<any> | null>(null);\n const [renaming, setRenaming] = createSignal(false);\n const [menuOpen, setMenuOpen] = createSignal(false);\n\n const onDocChange = () => setDoc(handle.doc());\n handle.on(\"change\", onDocChange);\n onCleanup(() => handle.off(\"change\", onDocChange));\n void loadDatatype();\n\n let menuEl!: HTMLDivElement;\n let toolButtonEl!: HTMLButtonElement;\n\n const title = () => {\n try {\n return datatype()?.getTitle(doc()) || \"Untitled\";\n } catch {\n // getTitle throws on unexpected doc shapes\n return \"Untitled\";\n }\n };\n\n const canRename = () => Boolean(datatype()?.setTitle);\n\n // With no pinned tool the nested view renders the doc's fallback tool, so\n // surface that as the selection rather than a special \"unselected\" state.\n const effectiveToolId = () => {\n datatype(); // re-check once the datatype (and the tools it ships) loaded\n if (pinnedToolId()) return pinnedToolId();\n try {\n return getFallbackTool(doc())?.id ?? null;\n } catch {\n return null;\n }\n };\n\n const toolName = () => {\n const toolId = effectiveToolId();\n if (!toolId) return \"\";\n const tool = getRegistry<ToolDescription>(\"patchwork:tool\").get(toolId);\n return tool?.name ?? toolId;\n };\n\n function setTool(toolId: string): void {\n if (!toolId || toolId === pinnedToolId()) return;\n setPinnedToolId(toolId);\n element.dispatchEvent(\n new CustomEvent(\"patchwork:embed-tool-changed\", {\n detail: { url: handle.url, toolId },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n function finishRename(commit: boolean, value: string): void {\n if (!renaming()) return;\n setRenaming(false);\n const trimmed = value.trim();\n if (commit && trimmed && trimmed !== title()) {\n handle.change((d: any) => datatype()!.setTitle!(d, trimmed));\n }\n }\n\n function toggleMenu(): void {\n if (menuEl.matches(\":popover-open\")) {\n menuEl.hidePopover();\n return;\n }\n setMenuOpen(true);\n const rect = toolButtonEl.getBoundingClientRect();\n const menuWidth = Math.max(rect.width, 180);\n menuEl.style.top = `${rect.bottom + 2}px`;\n menuEl.style.minWidth = `${menuWidth}px`;\n if (rect.left + menuWidth > window.innerWidth - 8) {\n menuEl.style.left = \"\";\n menuEl.style.right = `${window.innerWidth - rect.right}px`;\n } else {\n menuEl.style.right = \"\";\n menuEl.style.left = `${rect.left}px`;\n }\n menuEl.showPopover();\n }\n\n function listTools(): ToolDescription[] {\n const d = doc();\n const type = d && getType(d);\n if (!type) return [];\n const list = getSupportedToolsForType(type).filter(\n (t) => !t.unlisted && !t.forTitleBar && t.id !== EMBED_TOOL_ID\n );\n // Datatype-specific tools before the generic wildcard ones.\n list.sort((a, b) => Number(isWildcard(a)) - Number(isWildcard(b)));\n return list;\n }\n\n // Built imperatively rather than as JSX so we don't have to teach Solid's\n // JSX types about the custom element.\n const nestedView = document.createElement(\"patchwork-view\");\n nestedView.setAttribute(\"doc-url\", handle.url);\n createEffect(() => {\n const toolId = pinnedToolId();\n if (toolId) nestedView.setAttribute(\"tool-id\", toolId);\n else nestedView.removeAttribute(\"tool-id\");\n });\n\n // Load the datatype (for getTitle/setTitle and its tools).\n async function loadDatatype(): Promise<void> {\n const d = handle.doc();\n const type = d && getType(d);\n if (!type) return;\n const registry = getRegistry(\"patchwork:datatype\");\n try {\n await registry.load(type);\n } catch {\n // datatype unavailable; keep the fallbacks\n }\n const loaded = registry.get(type);\n if (loaded && isLoadedPlugin(loaded)) {\n setDatatype(() => loaded.module as DatatypeImplementation<any>);\n }\n }\n\n return (\n <div class=\"embed-frame\">\n <div class=\"header\">\n <Show\n when={!renaming()}\n fallback={\n <input\n class=\"rename-input\"\n value={title()}\n ref={(el) =>\n queueMicrotask(() => {\n el.focus();\n el.select();\n })\n }\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === \"Enter\") finishRename(true, e.currentTarget.value);\n if (e.key === \"Escape\")\n finishRename(false, e.currentTarget.value);\n }}\n onBlur={(e) => finishRename(true, e.currentTarget.value)}\n />\n }\n >\n <span\n class=\"title\"\n data-renamable={canRename() ? \"\" : undefined}\n title={canRename() ? \"Click to rename\" : undefined}\n onClick={() => canRename() && setRenaming(true)}\n >\n {title()}\n </span>\n </Show>\n {/* Deploy check: which build is actually running. */}\n <span class=\"version\">v{version}</span>\n <button\n class=\"tool-btn\"\n title={\"Open with\\u2026\"}\n ref={toolButtonEl}\n onClick={toggleMenu}\n >\n {toolName()}\n </button>\n <button\n class=\"open-btn\"\n title=\"Open document\"\n innerHTML={openIcon}\n onClick={() =>\n openDocument(element, handle.url, pinnedToolId() || undefined)\n }\n />\n </div>\n <div class=\"content\">{nestedView}</div>\n <div\n class=\"tool-menu\"\n popover=\"auto\"\n ref={(el) => {\n menuEl = el;\n // Unrender the item list while closed.\n el.addEventListener(\"toggle\", (e) => {\n if ((e as { newState?: string }).newState === \"closed\") {\n setMenuOpen(false);\n }\n });\n }}\n >\n <Show when={menuOpen()}>\n <div class=\"list\">\n <For each={listTools()}>\n {(tool) => (\n <button\n class=\"item\"\n data-current={tool.id === effectiveToolId() ? \"\" : undefined}\n onClick={() => {\n menuEl.hidePopover();\n setTool(tool.id);\n }}\n >\n {tool.name || tool.id}\n </button>\n )}\n </For>\n </div>\n </Show>\n </div>\n </div>\n );\n}\n\nfunction isWildcard(tool: ToolDescription): boolean {\n return (\n tool.supportedDatatypes === \"*\" ||\n (Array.isArray(tool.supportedDatatypes) &&\n tool.supportedDatatypes.includes(\"*\"))\n );\n}\n\nconst openIcon = `<svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t<path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"></path>\n\t<polyline points=\"15 3 21 3 21 9\"></polyline>\n\t<line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"></line>\n</svg>`;\n"],"names":["EMBED_TOOL_ID","EmbedFrame","handle","element","render","_$createComponent","Frame","props","pinnedToolId","setPinnedToolId","createSignal","getAttribute","closest","doc","setDoc","equals","datatype","setDatatype","renaming","setRenaming","menuOpen","setMenuOpen","onDocChange","on","onCleanup","off","loadDatatype","menuEl","toolButtonEl","title","getTitle","canRename","Boolean","setTitle","effectiveToolId","getFallbackTool","id","toolName","toolId","tool","getRegistry","get","name","setTool","dispatchEvent","CustomEvent","detail","url","bubbles","composed","finishRename","commit","value","trimmed","trim","change","d","toggleMenu","matches","hidePopover","rect","getBoundingClientRect","menuWidth","Math","max","width","style","top","bottom","minWidth","left","window","innerWidth","right","showPopover","listTools","type","getType","list","getSupportedToolsForType","filter","t","unlisted","forTitleBar","sort","a","b","Number","isWildcard","nestedView","document","createElement","setAttribute","createEffect","removeAttribute","registry","load","loaded","isLoadedPlugin","module","_el$","_tmpl$3","_el$2","firstChild","_el$4","_el$6","nextSibling","_el$7","_el$8","_el$9","_$insert","Show","when","fallback","_el$1","_tmpl$4","addEventListener","e","currentTarget","$$keydown","stopPropagation","key","_$use","el","queueMicrotask","focus","select","_$effect","children","_el$3","_tmpl$","$$click","_p$","_v$","undefined","_v$2","_$setAttribute","version","_ref$","openDocument","innerHTML","openIcon","newState","_el$0","_tmpl$2","For","each","_el$10","_tmpl$5","supportedDatatypes","Array","isArray","includes","_$delegateEvents"],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ const scriptRel = "modulepreload";
2
+ const assetsURL = function(dep, importerUrl) {
3
+ return new URL(dep, importerUrl).href;
4
+ };
5
+ const seen = {};
6
+ const __vitePreload = function preload(baseModule, deps, importerUrl) {
7
+ let promise = Promise.resolve();
8
+ if (deps && deps.length > 0) {
9
+ const links = document.getElementsByTagName("link");
10
+ const cspNonceMeta = document.querySelector(
11
+ "meta[property=csp-nonce]"
12
+ );
13
+ const cspNonce = (cspNonceMeta == null ? void 0 : cspNonceMeta.nonce) || (cspNonceMeta == null ? void 0 : cspNonceMeta.getAttribute("nonce"));
14
+ promise = Promise.allSettled(
15
+ deps.map((dep) => {
16
+ dep = assetsURL(dep, importerUrl);
17
+ if (dep in seen) return;
18
+ seen[dep] = true;
19
+ const isCss = dep.endsWith(".css");
20
+ const cssSelector = isCss ? '[rel="stylesheet"]' : "";
21
+ const isBaseRelative = !!importerUrl;
22
+ if (isBaseRelative) {
23
+ for (let i = links.length - 1; i >= 0; i--) {
24
+ const link2 = links[i];
25
+ if (link2.href === dep && (!isCss || link2.rel === "stylesheet")) {
26
+ return;
27
+ }
28
+ }
29
+ } else if (document.querySelector(`link[href="${dep}"]${cssSelector}`)) {
30
+ return;
31
+ }
32
+ const link = document.createElement("link");
33
+ link.rel = isCss ? "stylesheet" : scriptRel;
34
+ if (!isCss) {
35
+ link.as = "script";
36
+ }
37
+ link.crossOrigin = "";
38
+ link.href = dep;
39
+ if (cspNonce) {
40
+ link.setAttribute("nonce", cspNonce);
41
+ }
42
+ document.head.appendChild(link);
43
+ if (isCss) {
44
+ return new Promise((res, rej) => {
45
+ link.addEventListener("load", res);
46
+ link.addEventListener(
47
+ "error",
48
+ () => rej(new Error(`Unable to preload CSS for ${dep}`))
49
+ );
50
+ });
51
+ }
52
+ })
53
+ );
54
+ }
55
+ function handlePreloadError(err) {
56
+ const e = new Event("vite:preloadError", {
57
+ cancelable: true
58
+ });
59
+ e.payload = err;
60
+ window.dispatchEvent(e);
61
+ if (!e.defaultPrevented) {
62
+ throw err;
63
+ }
64
+ }
65
+ return promise.then((res) => {
66
+ for (const item of res || []) {
67
+ if (item.status !== "rejected") continue;
68
+ handlePreloadError(item.reason);
69
+ }
70
+ return baseModule().catch(handlePreloadError);
71
+ });
72
+ };
73
+ const plugins = [
74
+ {
75
+ type: "patchwork:tool",
76
+ id: "embed",
77
+ name: "Embed",
78
+ icon: "PictureInPicture2",
79
+ supportedDatatypes: "*",
80
+ // Load-bearing: keeps "Embed" out of pickers and out of getFallbackTool,
81
+ // which would otherwise recurse (embed frame falling back to itself).
82
+ unlisted: true,
83
+ async load() {
84
+ return (await __vitePreload(async () => {
85
+ const { default: __vite_default__ } = await import("./assets/tool-Cg7zrpH9.js");
86
+ return { default: __vite_default__ };
87
+ }, true ? [] : void 0, import.meta.url)).default;
88
+ }
89
+ }
90
+ ];
91
+ export {
92
+ plugins
93
+ };
94
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,MAAM,UAAkB;AAAA,EAC7B;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,oBAAoB;AAAA;AAAA;AAAA,IAGpB,UAAU;AAAA,IACV,MAAM,OAAO;AACX,cAAQ;AAAA,oDAAM,OAAO,2BAAQ;AAAA;AAAA,+CAAG;AAAA,IAClC;AAAA;AAEJ","names":[],"ignoreList":[],"sources":["../src/index.ts"],"sourcesContent":["// Metadata only: Patchwork evaluates this entry in a worker (no importmap, no\n// DOM), so no runtime imports here — the implementation loads lazily.\nimport type { Tool } from \"@inkandswitch/patchwork-plugins\";\n\nexport const plugins: Tool[] = [\n {\n type: \"patchwork:tool\",\n id: \"embed\",\n name: \"Embed\",\n icon: \"PictureInPicture2\",\n supportedDatatypes: \"*\",\n // Load-bearing: keeps \"Embed\" out of pickers and out of getFallbackTool,\n // which would otherwise recurse (embed frame falling back to itself).\n unlisted: true,\n async load() {\n return (await import(\"./tool\")).default;\n },\n },\n];\n"],"file":"index.js"}
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "embed",
3
+ "version": "0.0.2",
4
+ "description": "Shared embed frame: title bar, tool picker, and open button around a nested patchwork-view",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "scripts": {
8
+ "build": "vite build",
9
+ "typecheck": "tsc --noEmit",
10
+ "push": "pnpm build && pushwork sync",
11
+ "register": "pw-modules add \"$MODULE_SETTINGS_DOC_URL\" \"$(pushwork url)\""
12
+ },
13
+ "dependencies": {
14
+ "@inkandswitch/patchwork-bootloader": "^0.2.8",
15
+ "@inkandswitch/patchwork-elements": "1.0.0",
16
+ "@inkandswitch/patchwork-filesystem": "^0.0.8",
17
+ "@inkandswitch/patchwork-plugins": "^0.0.11",
18
+ "solid-js": "^1.9.11"
19
+ },
20
+ "devDependencies": {
21
+ "@automerge/automerge-repo": "^2.6.0-subduction.9",
22
+ "typescript": "~5.9.3",
23
+ "vite": "^5.4.21",
24
+ "vite-plugin-css-injected-by-js": "^3.5.2",
25
+ "vite-plugin-solid": "^2.11.10"
26
+ }
27
+ }
@@ -0,0 +1,3 @@
1
+ (function(){"use strict";try{if(typeof document<"u"){var r=document.createElement("style");r.appendChild(document.createTextNode("@layer package{:root,:host,[theme]{--configurator-fg: var(--editor-line, black);--configurator-fill: var(--editor-fill, white);--configurator-family: var(--editor-family-sans, system-ui, sans-serif);--configurator-family-code: var(--editor-family-code, ui-monospace, monospace);--configurator-accent: var(--studio-accent, oklch(.6 .15 250))}}.configurator{container-type:inline-size;padding:1.25rem 1.25rem 4rem;display:flex;flex-direction:column;gap:1.5rem;height:100%;overflow-y:auto;font-family:var(--configurator-family);color:var(--configurator-fg)}.configurator.loading{opacity:.5;font-size:.875rem}.configurator-title{font-size:.9375rem;font-weight:600;letter-spacing:-.01em;color:inherit}.config-section{display:flex;flex-direction:column;gap:.625rem;padding-top:1rem;border-top:1px solid color-mix(in oklch,currentColor 10%,transparent)}.config-section:first-of-type{border-top:none;padding-top:0}.section-label{font-size:.625rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;opacity:.5}.preview-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:.5rem}@container (max-width: 279px){.preview-grid{grid-template-columns:1fr}}@container (min-width: 400px){.preview-grid{grid-template-columns:repeat(3,1fr)}}.preview-card{display:flex;flex-direction:column;border:1.5px solid color-mix(in oklch,currentColor 12%,transparent);border-radius:.5rem;overflow:hidden;cursor:pointer;transition:border-color .12s,box-shadow .12s;background:none;color:inherit;padding:0;text-align:left}.preview-card:hover{border-color:color-mix(in oklch,currentColor 25%,transparent)}.preview-card[aria-checked=true]{border-color:var(--configurator-accent);box-shadow:0 0 0 1px var(--configurator-accent)}.preview-card-label{display:flex;align-items:center;gap:.375rem;padding:.5rem .625rem;font-size:.75rem;font-weight:500}.preview-card-check{margin-left:auto;color:var(--configurator-accent);flex-shrink:0;display:none}.preview-card[aria-checked=true] .preview-card-check{display:flex}.empty-message{font-size:.8125rem;opacity:.7;font-style:italic;margin:0;padding:.375rem 0}.toolbar-strip{display:flex;flex-wrap:wrap;gap:.375rem;align-items:flex-end}.toolbar-box{display:flex;flex-direction:row;align-items:center;border:1px solid color-mix(in oklch,currentColor 12%,transparent);border-radius:.375rem;overflow:hidden;cursor:grab;-webkit-user-select:none;user-select:none;position:relative;transition:border-color .12s,opacity .15s,transform .2s ease}.toolbar-box:active{cursor:grabbing}.toolbar-box.dragging{opacity:0}.toolbar-box.shift-left{transform:translate(calc(-100% - .375rem))}.toolbar-box.shift-right{transform:translate(calc(100% + .375rem))}.toolbar-box-label{font-size:.6875rem;padding:.3125rem .625rem;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.toolbar-box-remove{margin-right:.25rem;flex-shrink:0;display:flex;align-items:center;justify-content:center;width:1rem;height:1rem;border:none;border-radius:50%;background:color-mix(in oklch,currentColor 10%,transparent);color:inherit;opacity:0;cursor:pointer;padding:0;transition:opacity .12s,background .12s,color .12s}.toolbar-box:hover .toolbar-box-remove{opacity:.5}.toolbar-box-remove:hover{opacity:1!important;color:#f04c5a;background:#f04c5a26}.toolbar-add-btn{display:flex;align-items:center;justify-content:center;width:2.25rem;height:100%;min-height:3.5rem;border:1.5px dashed color-mix(in oklch,currentColor 18%,transparent);border-radius:.375rem;background:none;color:inherit;opacity:.45;cursor:pointer;padding:0;transition:opacity .12s,border-color .12s,background .12s}.toolbar-add-btn:hover{opacity:.8;border-color:color-mix(in oklch,currentColor 30%,transparent);background:color-mix(in oklch,currentColor 4%,transparent)}.context-tabs{display:flex;flex-wrap:wrap;gap:0;border-bottom:1.5px solid color-mix(in oklch,currentColor 12%,transparent)}.context-tab{display:flex;align-items:center;gap:.25rem;padding:.375rem .625rem;border:1px solid color-mix(in oklch,currentColor 12%,transparent);border-bottom:none;border-radius:.375rem .375rem 0 0;background:none;color:inherit;font-size:.75rem;font-weight:500;cursor:grab;-webkit-user-select:none;user-select:none;margin-bottom:-1.5px;transition:background .12s,opacity .15s,transform .2s ease}.context-tab:active{cursor:grabbing}.context-tab.dragging{opacity:0}.context-tab.shift-left{transform:translate(-100%)}.context-tab.shift-right{transform:translate(100%)}.context-tab:hover{background:color-mix(in oklch,currentColor 6%,transparent)}.context-tab-remove{display:flex;align-items:center;justify-content:center;width:.875rem;height:.875rem;border:none;border-radius:50%;background:none;color:inherit;opacity:.25;cursor:pointer;padding:0;flex-shrink:0;transition:opacity .12s,color .12s,background .12s}.context-tab-remove:hover{opacity:1;color:#f04c5a;background:#f04c5a1f}.context-tab-add{display:flex;align-items:center;gap:.25rem;padding:.375rem .625rem;border:1px dashed color-mix(in oklch,currentColor 15%,transparent);border-bottom:none;border-radius:.375rem .375rem 0 0;background:none;color:inherit;font-size:.75rem;opacity:.45;cursor:pointer;margin-bottom:-1.5px;transition:opacity .12s,background .12s}.context-tab-add:hover{opacity:.8;background:color-mix(in oklch,currentColor 4%,transparent)}.add-popover-anchor{position:relative}.add-popover{position:absolute;bottom:calc(100% + .375rem);left:0;z-index:10;min-width:12rem;padding:.375rem;background:var(--configurator-fill);border:1px solid color-mix(in oklch,currentColor 15%,transparent);border-radius:.5rem;box-shadow:0 4px 16px #0000001a,0 1px 4px #0000000f;display:flex;flex-direction:column;gap:2px}.add-popover-option{display:flex;align-items:center;gap:.375rem;padding:.375rem .5rem;border:none;border-radius:.375rem;background:none;color:inherit;font-size:.8125rem;cursor:pointer;text-align:left;width:100%;transition:background .12s}.add-popover-option:hover{background:color-mix(in oklch,currentColor 8%,transparent)}.add-popover-option svg{opacity:.4;flex-shrink:0}.add-popover-custom{display:flex;align-items:center;gap:4px;padding:.375rem .375rem .25rem;border-top:1px solid color-mix(in oklch,currentColor 8%,transparent);margin-top:2px}.add-popover-custom-input{flex:1;min-width:0;padding:.25rem .375rem;border:1px solid color-mix(in oklch,currentColor 15%,transparent);border-radius:.25rem;background:none;color:inherit;font-size:.8125rem;font-family:var(--configurator-family-code);outline:none;transition:border-color .12s}.add-popover-custom-input::placeholder{opacity:.4;font-family:inherit;font-style:italic}.add-popover-custom-input:focus{border-color:color-mix(in oklch,currentColor 35%,transparent)}.add-popover-custom-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;border:none;border-radius:.25rem;background:none;color:inherit;opacity:.5;cursor:pointer;flex-shrink:0;padding:0;transition:opacity .12s,background .12s}.add-popover-custom-btn:hover:not(:disabled){opacity:.8;background:color-mix(in oklch,currentColor 8%,transparent)}.add-popover-custom-btn:disabled{opacity:.2;cursor:default}.add-popover-done{display:flex;align-items:center;justify-content:center;padding:.3125rem;border:none;border-radius:.25rem;background:none;color:inherit;opacity:.5;font-size:.75rem;cursor:pointer;transition:background .12s,opacity .12s}.add-popover-done:hover{opacity:.8;background:color-mix(in oklch,currentColor 8%,transparent)}.theme-embed{border:1px solid color-mix(in oklch,currentColor 10%,transparent);border-radius:.5rem;overflow:hidden}.theme-embed patchwork-view{display:block;width:100%}")),document.head.appendChild(r)}}catch(o){console.error("vite-plugin-css-injected-by-js",o)}})();
2
+ import{render as le,createComponent as y,insert as v,getOwner as ae,effect as E,template as w,use as ne,setAttribute as I,className as W,delegateEvents as ce}from"solid-js/web";import{getRegistry as ue}from"@inkandswitch/patchwork-plugins";import{accept as J}from"@inkandswitch/patchwork-providers";import{onCleanup as re,createMemo as x,createContext as de,useContext as fe,createResource as pe,createEffect as he,Show as P,For as V,createSignal as M}from"solid-js";import{createStore as oe,reconcile as U,produce as Ce}from"solid-js/store";function me(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var j={exports:{}},N,Z;function ge(){if(Z)return N;Z=1;var e=1e3,n=e*60,o=n*60,t=o*24,c=t*7,d=t*365.25;N=function(i,r){r=r||{};var l=typeof i;if(l==="string"&&i.length>0)return a(i);if(l==="number"&&isFinite(i))return r.long?h(i):p(i);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(i))};function a(i){if(i=String(i),!(i.length>100)){var r=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(i);if(r){var l=parseFloat(r[1]),f=(r[2]||"ms").toLowerCase();switch(f){case"years":case"year":case"yrs":case"yr":case"y":return l*d;case"weeks":case"week":case"w":return l*c;case"days":case"day":case"d":return l*t;case"hours":case"hour":case"hrs":case"hr":case"h":return l*o;case"minutes":case"minute":case"mins":case"min":case"m":return l*n;case"seconds":case"second":case"secs":case"sec":case"s":return l*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return l;default:return}}}}function p(i){var r=Math.abs(i);return r>=t?Math.round(i/t)+"d":r>=o?Math.round(i/o)+"h":r>=n?Math.round(i/n)+"m":r>=e?Math.round(i/e)+"s":i+"ms"}function h(i){var r=Math.abs(i);return r>=t?s(i,r,t,"day"):r>=o?s(i,r,o,"hour"):r>=n?s(i,r,n,"minute"):r>=e?s(i,r,e,"second"):i+" ms"}function s(i,r,l,f){var C=r>=l*1.5;return Math.round(i/l)+" "+f+(C?"s":"")}return N}var z,K;function ve(){if(K)return z;K=1;function e(n){t.debug=t,t.default=t,t.coerce=s,t.disable=p,t.enable=d,t.enabled=h,t.humanize=ge(),t.destroy=i,Object.keys(n).forEach(r=>{t[r]=n[r]}),t.names=[],t.skips=[],t.formatters={};function o(r){let l=0;for(let f=0;f<r.length;f++)l=(l<<5)-l+r.charCodeAt(f),l|=0;return t.colors[Math.abs(l)%t.colors.length]}t.selectColor=o;function t(r){let l,f=null,C,b;function u(...m){if(!u.enabled)return;const g=u,$=Number(new Date),L=$-(l||$);g.diff=L,g.prev=l,g.curr=$,l=$,m[0]=t.coerce(m[0]),typeof m[0]!="string"&&m.unshift("%O");let A=0;m[0]=m[0].replace(/%([a-zA-Z%])/g,(_,k)=>{if(_==="%%")return"%";A++;const D=t.formatters[k];if(typeof D=="function"){const R=m[A];_=D.call(g,R),m.splice(A,1),A--}return _}),t.formatArgs.call(g,m),(g.log||t.log).apply(g,m)}return u.namespace=r,u.useColors=t.useColors(),u.color=t.selectColor(r),u.extend=c,u.destroy=t.destroy,Object.defineProperty(u,"enabled",{enumerable:!0,configurable:!1,get:()=>f!==null?f:(C!==t.namespaces&&(C=t.namespaces,b=t.enabled(r)),b),set:m=>{f=m}}),typeof t.init=="function"&&t.init(u),u}function c(r,l){const f=t(this.namespace+(typeof l>"u"?":":l)+r);return f.log=this.log,f}function d(r){t.save(r),t.namespaces=r,t.names=[],t.skips=[];const l=(typeof r=="string"?r:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(const f of l)f[0]==="-"?t.skips.push(f.slice(1)):t.names.push(f)}function a(r,l){let f=0,C=0,b=-1,u=0;for(;f<r.length;)if(C<l.length&&(l[C]===r[f]||l[C]==="*"))l[C]==="*"?(b=C,u=f,C++):(f++,C++);else if(b!==-1)C=b+1,u++,f=u;else return!1;for(;C<l.length&&l[C]==="*";)C++;return C===l.length}function p(){const r=[...t.names,...t.skips.map(l=>"-"+l)].join(",");return t.enable(""),r}function h(r){for(const l of t.skips)if(a(r,l))return!1;for(const l of t.names)if(a(r,l))return!0;return!1}function s(r){return r instanceof Error?r.stack||r.message:r}function i(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return t.enable(t.load()),t}return z=e,z}var Y;function ye(){return Y||(Y=1,(function(e,n){var o={};n.formatArgs=c,n.save=d,n.load=a,n.useColors=t,n.storage=p(),n.destroy=(()=>{let s=!1;return()=>{s||(s=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),n.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function t(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let s;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(s=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(s[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function c(s){if(s[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+s[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const i="color: "+this.color;s.splice(1,0,i,"color: inherit");let r=0,l=0;s[0].replace(/%[a-zA-Z%]/g,f=>{f!=="%%"&&(r++,f==="%c"&&(l=r))}),s.splice(l,0,i)}n.log=console.debug||console.log||(()=>{});function d(s){try{s?n.storage.setItem("debug",s):n.storage.removeItem("debug")}catch{}}function a(){let s;try{s=n.storage.getItem("debug")||n.storage.getItem("DEBUG")}catch{}return!s&&typeof process<"u"&&"env"in process&&(s=o.DEBUG),s}function p(){try{return localStorage}catch{}}e.exports=ve()(n);const{formatters:h}=e.exports;h.j=function(s){try{return JSON.stringify(s)}catch(i){return"[UnexpectedJSONParseError]: "+i.message}}})(j,j.exports)),j.exports}var we=ye();const be=me(we);var se=be("cabbages");function Q(e){return typeof e=="object"&&typeof e!=null&&Object.getPrototypeOf(e)==Object.prototype}var Fe="";function $e(e,...n){if(n.length==0){se("empty patch");return}const[o,t,c]=n;let d=[...o];for(;;){let a=d.shift();if(!d.length){const h=Array.isArray(t);if(Q(e)&&h&&typeof a>"u"&&typeof t[0]=="string"){delete e[t[0]];return}if(h||typeof t=="number"){if(typeof a>"u")throw new Error("cant treat top level as a seq");a=a;let[s,i]=Array.isArray(t)?t:[t,t+1];const r=Array.isArray(t)&&t.length==0;if(!r&&(s==null||i==null))throw new RangeError("it's all or nothing, no half measures");const l=typeof c>"u",f=s===i&&!l,C=r&&!l,b=!f&&!l&&!C;if(typeof e[a]>"u"){if(typeof e=="string")return;typeof c=="string"?e[a]="":e[a]=[]}let u=e[a];if(Array.isArray(u)){if(C){Array.isArray(c)?u.push(...c):u.push(c);return}if(f||b){Array.isArray(c)?u.splice(s,i-s,...c):u.splice(s,i-s,c);return}if(l){u.splice(s,i-s);return}throw new Error("i don't know what happened")}if(typeof u=="string"){if(C){e[a]=u+c;return}if(b||f){e[a]=u.slice(0,s)+(typeof c=="string"?c:c.map(m=>typeof m=="string"?m:Fe).join(""))+u.slice(i);return}if(l){e[a]=u.slice(0,s)+u.slice(i);return}throw new Error("i don't know what happened")}if(Q(u)&&h&&typeof t[0]=="string"){delete u[t[0]];return}throw new Error("not implemented")}if(typeof a>"u"){if(typeof t!="string")throw new Error(`can't index top-level map with ${t}`);typeof c>"u"?delete e[t]:e[t]=c;return}if(typeof e[a]>"u"&&(e[a]={}),h){let[s,i]=t;s!=null&&i!=null&&(typeof c>"u"&&s!=null&&i!=null?delete e[a][s||i]:e[a][s||i]=c)}else if(typeof c>"u")delete e[a][t];else{if(typeof e[a]=="string")return;e[a][t]=c}return}if(typeof a>"u")throw new Error("cant treat top level as a seq");a=a;let p=d[0];if(typeof e[a]>"u")if(typeof p=="string")e[a]={};else if(typeof p=="number")e[a]=[];else throw new Error(`can't go down this road ${e}.${a}.${p}`);e=e[a]}}function X(e,n){for(let o=0;o<n.length;o++)e=e?e[n[o]]:void 0;return e}function ke(e,n){const o=e.path.slice(0,-1),t=e.path[e.path.length-1];switch(e.action){case"mark":case"unmark":return se(`skipping ${e.action} because it doesn't affect material reality`),[];case"inc":if(n)return[o,t,X(n.patchInfo.after,e.path)];throw new Error(`can't apply ${e.action} without payload argument`);case"conflict":if(n)return[o,t,X(n.patchInfo.after,e.path)];throw new Error(`can't apply ${e.action} without payload argument`);case"del":return typeof t=="string"?[o,t]:[o,[t,t+(e.length||1)]];case"insert":return[o,[t,t],e.values];case"splice":return[o,[t,t],[e.value]];case"put":return[o,t,e.value]}}function _e(e){return n=>{for(let o of e.patches)$e(n,...ke(o,e))}}const S=new WeakMap;function Ae(e){if(re(()=>{const d=S.get(e);d&&(d.refs--||d.cleanup())}),S.has(e)){const d=S.get(e);return d.refs++,d.store}const[n,o]=oe(e.doc());S.set(e,{refs:0,store:n,cleanup(){e.off("change",t),e.off("delete",c),S.delete(e)}});function t(d){if(d.scopeReplaced){o(U(d.doc??{}));return}o(Ce(_e(d)))}function c(){o(U({}))}return e.on("change",t),e.on("delete",c),e.whenReady().then(()=>{o(e.doc())}),n}const T=e=>typeof e=="function"&&!e.length?e():e;function Ee(e){return x(()=>T(e)&&Ae(T(e)))}const ie=de(null);function xe(e,n){const o=fe(ie);if(!o)throw new Error("use outside <RepoContext> requires options.repo");const t=o;function c(){const p=T(e);if(!p)return;const h=t.findWithProgress(p).peek();return h.state==="ready"?h.handle:void 0}const[d,{mutate:a}]=pe(e,p=>t.findWithProgress(p).whenReady(),{initialValue:c()});return he(()=>{T(e)||a()}),d}function ee(e,n){const o=xe(e);return[Ee(o),o]}var Ie=w('<svg width=14 height=14 viewBox="0 0 14 14"fill=none stroke=var(--studio-chrome-line) stroke-width=1.5 stroke-linecap=round><line x1=7 y1=3 x2=7 y2=11></line><line x1=3 y1=7 x2=11 y2=7>'),De=w('<svg viewBox="0 0 10 10"fill=none stroke=var(--studio-chrome-line) stroke-width=1.5 stroke-linecap=round><line x1=2 y1=2 x2=8 y2=8></line><line x1=8 y1=2 x2=2 y2=8>'),Re=w('<svg width=12 height=12 viewBox="0 0 12 12"fill=none stroke=var(--studio-chrome-line) stroke-width=2 stroke-linecap=round stroke-linejoin=round><polyline points="2.5 6 5 8.5 9.5 3.5">'),Oe=w("<div class=add-popover><div class=add-popover-custom><input type=text class=add-popover-custom-input><button class=add-popover-custom-btn></button></div><button class=add-popover-done>Done"),Se=w("<button class=add-popover-option>"),Pe=w("<div class=preview-grid>"),Le=w("<div class=config-section><div class=section-label>"),je=w("<p class=empty-message>No tools available"),Me=w("<button class=preview-card><div class=preview-card-label><span></span><span class=preview-card-check>"),Te=w('<div class=config-section><div class=section-label></div><div><div class=add-popover-anchor><button class=toolbar-add-btn aria-label="Add doc titlebar tool">'),qe=w("<div><div class=toolbar-box-label></div><button class=toolbar-box-remove>"),Be=w("<div class=configurator>"),Ne=w('<div class="configurator loading">Loading configuration...'),ze=w("<p class=empty-message>Preparing layout configuration…"),Ue=w("<div class=config-section><div class=section-label>Theme</div><div class=theme-embed><patchwork-view tool-id=theme-picker>",!0,!1,!1);const Ge=250;function Ve(e){const n=ue(e),[o,t]=oe((n.all?.()??[]).map(a=>a)),c=()=>{const a=(n.all?.()??[]).map(p=>p);t(U(a))};c();const d=n.on("changed",c);return re(d),o}function te(e,n){return e.filter(o=>!o.unlisted&&(o.tags??[]).includes(n)).map(o=>({id:o.id,name:o.name||o.id})).sort((o,t)=>o.name.localeCompare(t.name))}const G=()=>Ie(),He=e=>{const n=()=>e.size??10;return(()=>{var o=De();return E(t=>{var c=n(),d=n();return c!==t.e&&I(o,"width",t.e=c),d!==t.t&&I(o,"height",t.t=d),t},{e:void 0,t:void 0}),o})()},We=()=>Re();function Je(e){const[n,o]=M(""),t=()=>{const c=n().trim();c&&(e.onAdd(c),o(""))};return(()=>{var c=Oe(),d=c.firstChild,a=d.firstChild,p=a.nextSibling,h=d.nextSibling;return v(c,y(V,{get each(){return e.available},children:s=>(()=>{var i=Se();return i.$$click=()=>e.onAdd(s.id),v(i,y(G,{}),null),v(i,()=>s.name,null),i})()}),d),a.$$keydown=s=>s.key==="Enter"&&t(),a.$$input=s=>o(s.currentTarget.value),p.$$click=t,v(p,y(G,{})),h.$$click=()=>e.onClose(),E(s=>{var i=e.customPlaceholder??"tool-id",r=!n().trim();return i!==s.e&&I(a,"placeholder",s.e=i),r!==s.t&&(p.disabled=s.t=r),s},{e:void 0,t:void 0}),E(()=>a.value=n()),c})()}function q(e){e.addEventListener("patchwork:subscribe",(n=>{n.detail.selector.type==="patchwork:selected-doc"?J(n,o=>{o([])}):n.detail.selector.type==="patchwork:selected-view"&&J(n,o=>{o(null)})}),!0)}function Ze(e){return(()=>{var n=Le(),o=n.firstChild;return v(o,()=>e.label),v(n,y(P,{get when(){return e.options.length>0},get fallback(){return je()},get children(){var t=Pe(),c=q;return typeof c=="function"?ne(c,t):q=t,v(t,y(V,{get each(){return e.options},children:d=>(()=>{var a=Me(),p=a.firstChild,h=p.firstChild,s=h.nextSibling;return a.$$click=()=>e.onChange(d.id),v(h,()=>d.name),v(s,y(We,{})),E(()=>I(a,"aria-checked",e.value===d.id)),a})()})),t}}),null),n})()}function Ke(e,n,o){return n===null||o===null?"":e===n?" dragging":o===n?"":n<o&&e>n&&e<=o?" shift-left":n>o&&e<n&&e>=o?" shift-right":""}function Ye(e){const[n,o]=M(!1),[t,c]=M(null),[d,a]=M(null);let p=null;const h=x(()=>e.values??[]),s=x(()=>new Set(h())),i=x(()=>e.allOptions.filter(u=>!s().has(u.id))),r=u=>e.allOptions.find(m=>m.id===u)?.name??u,l=u=>{e.setValues(h().filter((m,g)=>g!==u))},f=u=>{e.setValues([...h(),u])},C=u=>{p=u,a(u)},b=()=>{const u=t(),m=p;if(c(null),a(null),p=null,u==null||m==null||u===m)return;const g=[...h()],[$]=g.splice(u,1);g.splice(m,0,$),e.setValues(g)};return(()=>{var u=Te(),m=u.firstChild,g=m.nextSibling,$=g.firstChild,L=$.firstChild;v(m,()=>e.label);var A=q;return typeof A=="function"?ne(A,g):q=g,v(g,y(V,{get each(){return h()},children:(B,_)=>(()=>{var k=qe(),D=k.firstChild,R=D.nextSibling;return k.addEventListener("dragend",()=>b()),k.addEventListener("dragover",F=>{F.preventDefault(),F.dataTransfer.dropEffect="move",C(_())}),k.addEventListener("dragstart",F=>{F.dataTransfer.effectAllowed="move";const O=_();requestAnimationFrame(()=>{c(O),C(O)})}),I(k,"draggable",!0),v(D,()=>r(B)),R.$$click=F=>{F.stopPropagation(),l(_())},v(R,y(He,{size:8})),E(F=>{var O=`toolbar-box${Ke(_(),t(),d())}`,H=`Remove ${r(B)}`;return O!==F.e&&W(k,F.e=O),H!==F.t&&I(R,"aria-label",F.t=H),F},{e:void 0,t:void 0}),k})()}),$),L.$$click=()=>o(!n()),v(L,y(G,{})),v($,y(P,{get when(){return n()},get children(){return y(Je,{get available(){return i()},onAdd:f,onClose:()=>o(!1)})}}),null),E(()=>W(g,`toolbar-strip${t()!==null?" is-dragging":""}`)),u})()}function Qe(e){const[n]=ee(()=>e.handle.url),[o,t]=ee(()=>n()?.tools?.threepane),c=Ve("patchwork:tool"),d=x(()=>te([...c],"frame-tool")),a=x(()=>te([...c],"titlebar-tool")),p=r=>typeof r=="string"?r:r[0],h=()=>o()?.doctitle?.tools?.map(p),s=r=>t()?.change(l=>{l.doctitle.tools=r.slice()}),i=(r,l)=>{e.handle.change(f=>{f[r]=l})};return y(P,{get when(){return n()},get fallback(){return Ne()},get children(){var r=Be();return v(r,y(Ze,{label:"Frame Tool",get value(){return n().frameToolId},onChange:l=>{i("frameToolId",l),setTimeout(async()=>{await e.element.repo.flush().catch(()=>null),window.location.reload()},Ge)},get options(){return d()}}),null),v(r,y(P,{get when(){return o()},get fallback(){return ze()},get children(){return y(Ye,{label:"Doc Titlebar",get values(){return h()},setValues:s,get allOptions(){return a()}})}}),null),v(r,y(P,{get when(){return n()?.toolStorage?.["theme-preferences"]},children:l=>(()=>{var f=Ue(),C=f.firstChild,b=C.nextSibling,u=b.firstChild;return u._$owner=ae(),E(()=>u.docUrl=l()),f})()}),null),r}})}function ot(e,n){const o=le(()=>y(ie.Provider,{get value(){return n.repo},get children(){return y(Qe,{handle:e,element:n})}}),n);return()=>o()}ce(["input","keydown","click"]);export{Qe as FrameConfigurator,ot as renderFrameConfigurator};
3
+ //# sourceMappingURL=FrameConfigurator-eip19KvL.js.map