@shivaedev/work-board 0.4.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +56 -0
- package/README.md +59 -18
- package/assets/native.js +36 -0
- package/dist/board.d.ts +1 -1
- package/dist/board.d.ts.map +1 -1
- package/dist/board.js +40 -8
- package/dist/board.js.map +1 -1
- package/dist/browser/client.d.ts +88 -0
- package/dist/browser/client.d.ts.map +1 -0
- package/dist/browser/client.js +53 -0
- package/dist/browser/client.js.map +1 -0
- package/dist/browser/session.d.ts +89 -0
- package/dist/browser/session.d.ts.map +1 -0
- package/dist/browser/session.js +20 -0
- package/dist/browser/session.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/files/changes.d.ts +4 -1
- package/dist/files/changes.d.ts.map +1 -1
- package/dist/files/changes.js +7 -3
- package/dist/files/changes.js.map +1 -1
- package/dist/files/list.d.ts +1 -1
- package/dist/files/list.d.ts.map +1 -1
- package/dist/files/list.js +5 -3
- package/dist/files/list.js.map +1 -1
- package/dist/files/watchDirectories.d.ts.map +1 -1
- package/dist/files/watchDirectories.js +2 -1
- package/dist/files/watchDirectories.js.map +1 -1
- package/dist/history/schema.js +1 -1
- package/dist/history/schema.js.map +1 -1
- package/dist/history/script.d.ts.map +1 -1
- package/dist/history/script.js +15 -12
- package/dist/history/script.js.map +1 -1
- package/dist/http/assets.d.ts +2 -0
- package/dist/http/assets.d.ts.map +1 -1
- package/dist/http/assets.js +14 -0
- package/dist/http/assets.js.map +1 -1
- package/dist/http/attachment.d.ts +4 -0
- package/dist/http/attachment.d.ts.map +1 -0
- package/dist/http/attachment.js +43 -0
- package/dist/http/attachment.js.map +1 -0
- package/dist/http/history.d.ts.map +1 -1
- package/dist/http/history.js +1 -13
- package/dist/http/history.js.map +1 -1
- package/dist/http/sameOrigin.d.ts +3 -0
- package/dist/http/sameOrigin.d.ts.map +1 -0
- package/dist/http/sameOrigin.js +14 -0
- package/dist/http/sameOrigin.js.map +1 -0
- package/dist/metadata/sourceLinks.d.ts.map +1 -1
- package/dist/metadata/sourceLinks.js +3 -1
- package/dist/metadata/sourceLinks.js.map +1 -1
- package/dist/page/ageScript.d.ts +2 -0
- package/dist/page/ageScript.d.ts.map +1 -0
- package/dist/page/ageScript.js +23 -0
- package/dist/page/ageScript.js.map +1 -0
- package/dist/page/client.d.ts +1 -1
- package/dist/page/client.d.ts.map +1 -1
- package/dist/page/client.js +74 -74
- package/dist/page/diagrams.d.ts +1 -1
- package/dist/page/diagrams.d.ts.map +1 -1
- package/dist/page/diagrams.js +7 -0
- package/dist/page/diagrams.js.map +1 -1
- package/dist/page/navigationScript.d.ts.map +1 -1
- package/dist/page/navigationScript.js +7 -5
- package/dist/page/navigationScript.js.map +1 -1
- package/dist/page/searchScript.d.ts.map +1 -1
- package/dist/page/searchScript.js +6 -4
- package/dist/page/searchScript.js.map +1 -1
- package/dist/page/shell.d.ts.map +1 -1
- package/dist/page/shell.js +4 -3
- package/dist/page/shell.js.map +1 -1
- package/dist/page/stateScript.js +1 -1
- package/dist/page/style.d.ts.map +1 -1
- package/dist/page/style.js +4 -2
- package/dist/page/style.js.map +1 -1
- package/dist/page/swap.d.ts +1 -1
- package/dist/page/swap.d.ts.map +1 -1
- package/dist/page/swap.js +23 -7
- package/dist/page/swap.js.map +1 -1
- package/dist/page/visualDialog.d.ts +3 -0
- package/dist/page/visualDialog.d.ts.map +1 -0
- package/dist/page/visualDialog.js +25 -0
- package/dist/page/visualDialog.js.map +1 -0
- package/dist/page/visualScript.d.ts +2 -0
- package/dist/page/visualScript.d.ts.map +1 -0
- package/dist/page/visualScript.js +42 -0
- package/dist/page/visualScript.js.map +1 -0
- package/dist/page/visualViewport.d.ts +2 -0
- package/dist/page/visualViewport.d.ts.map +1 -0
- package/dist/page/visualViewport.js +87 -0
- package/dist/page/visualViewport.js.map +1 -0
- package/dist/path/attachment.d.ts +3 -0
- package/dist/path/attachment.d.ts.map +1 -0
- package/dist/path/attachment.js +22 -0
- package/dist/path/attachment.js.map +1 -0
- package/dist/path/isMarkdown.d.ts +2 -0
- package/dist/path/isMarkdown.d.ts.map +1 -0
- package/dist/path/isMarkdown.js +7 -0
- package/dist/path/isMarkdown.js.map +1 -0
- package/dist/render/documentLinks.d.ts +2 -1
- package/dist/render/documentLinks.d.ts.map +1 -1
- package/dist/render/documentLinks.js +15 -4
- package/dist/render/documentLinks.js.map +1 -1
- package/dist/rpc/affected.d.ts +4 -0
- package/dist/rpc/affected.d.ts.map +1 -0
- package/dist/rpc/affected.js +75 -0
- package/dist/rpc/affected.js.map +1 -0
- package/dist/rpc/contract.d.ts +134 -0
- package/dist/rpc/contract.d.ts.map +1 -0
- package/dist/rpc/contract.js +59 -0
- package/dist/rpc/contract.js.map +1 -0
- package/dist/rpc/hints.d.ts +17 -0
- package/dist/rpc/hints.d.ts.map +1 -0
- package/dist/rpc/hints.js +28 -0
- package/dist/rpc/hints.js.map +1 -0
- package/dist/rpc/keys.d.ts +7 -0
- package/dist/rpc/keys.d.ts.map +1 -0
- package/dist/rpc/keys.js +9 -0
- package/dist/rpc/keys.js.map +1 -0
- package/dist/rpc/pageKeys.d.ts +3 -0
- package/dist/rpc/pageKeys.d.ts.map +1 -0
- package/dist/rpc/pageKeys.js +14 -0
- package/dist/rpc/pageKeys.js.map +1 -0
- package/dist/rpc/server.d.ts +12 -0
- package/dist/rpc/server.d.ts.map +1 -0
- package/dist/rpc/server.js +32 -0
- package/dist/rpc/server.js.map +1 -0
- package/package.json +9 -4
- package/src/board.ts +46 -9
- package/src/browser/client.ts +59 -0
- package/src/browser/session.ts +26 -0
- package/src/cli.ts +1 -1
- package/src/files/changes.ts +14 -4
- package/src/files/list.ts +5 -4
- package/src/files/watchDirectories.ts +2 -1
- package/src/history/schema.ts +1 -1
- package/src/history/script.ts +15 -12
- package/src/http/assets.ts +15 -0
- package/src/http/attachment.ts +46 -0
- package/src/http/history.ts +1 -12
- package/src/http/sameOrigin.ts +14 -0
- package/src/metadata/sourceLinks.ts +3 -1
- package/src/page/ageScript.ts +22 -0
- package/src/page/client.ts +74 -74
- package/src/page/diagrams.ts +7 -0
- package/src/page/navigationScript.ts +7 -5
- package/src/page/searchScript.ts +6 -4
- package/src/page/shell.ts +4 -3
- package/src/page/stateScript.ts +1 -1
- package/src/page/style.ts +5 -2
- package/src/page/swap.ts +23 -7
- package/src/page/visualDialog.ts +25 -0
- package/src/page/visualScript.ts +41 -0
- package/src/page/visualViewport.ts +86 -0
- package/src/path/attachment.ts +23 -0
- package/src/path/isMarkdown.ts +6 -0
- package/src/render/documentLinks.ts +15 -4
- package/src/rpc/affected.ts +77 -0
- package/src/rpc/contract.ts +62 -0
- package/src/rpc/hints.ts +34 -0
- package/src/rpc/keys.ts +9 -0
- package/src/rpc/pageKeys.ts +14 -0
- package/src/rpc/server.ts +55 -0
package/dist/page/diagrams.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const diagrams = "\nconst rendered = new Map();\nconst dark = matchMedia(\"(prefers-color-scheme: dark)\");\nlet mermaid;\nlet counter = 0;\n\nconst token = (name) => getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n\nconst load = async () => {\n mermaid ??= (await import(\"/_board/mermaid/mermaid.esm.min.mjs\")).default;\n mermaid.initialize({\n startOnLoad: false,\n securityLevel: \"strict\",\n theme: \"base\",\n themeVariables: {\n darkMode: schemeNow() === \"dark\",\n background: token(\"--bg\"),\n primaryColor: token(\"--surface\"),\n primaryTextColor: token(\"--text\"),\n primaryBorderColor: token(\"--border\"),\n lineColor: token(\"--muted\"),\n textColor: token(\"--text\"),\n fontFamily: token(\"--sans\"),\n },\n });\n return mermaid;\n};\n\nconst schemeNow = () => document.documentElement.dataset.scheme ?? (dark.matches ? \"dark\" : \"light\");\nlet lastScheme = schemeNow();\n\nconst draw = async (figure) => {\n const source = figure.querySelector(\".diagram-source\").textContent;\n const scheme = schemeNow();\n const key = scheme + \":\" + source;\n if (!rendered.has(key)) {\n rendered.set(key, load().then((engine) => engine.render(\"diagram-\" + ++counter, source)).then((result) => result.svg));\n }\n try {\n const svg = await rendered.get(key);\n if (scheme !== schemeNow()) {\n rendered.delete(key);\n return;\n }\n figure.querySelector(\".diagram-svg\")?.remove();\n figure.insertAdjacentHTML(\"afterbegin\", '<div class=\"diagram-svg\">' + svg + \"</div>\");\n figure.dataset.state = \"drawn\";\n } catch (error) {\n rendered.delete(key);\n if (scheme !== schemeNow()) return;\n figure.querySelector(\".diagram-svg\")?.remove();\n figure.dataset.state = \"failed\";\n figure.dataset.error = String(error?.message ?? error);\n }\n};\n\nconst forget = (root) => {\n const shown = new Set([...root.querySelectorAll(\"figure.diagram .diagram-source\")].map((source) => source.textContent));\n for (const key of rendered.keys()) {\n if (!shown.has(key.slice(key.indexOf(\":\") + 1))) rendered.delete(key);\n }\n};\n\nexport const renderDiagrams = (root, selector = \"figure.diagram:not([data-state=drawn])\") => {\n forget(root);\n return Promise.all([...root.querySelectorAll(selector)].map(draw));\n};\n\nconst themeChanged = () => {\n const scheme = schemeNow();\n if (lastScheme === scheme) return;\n lastScheme = scheme;\n const doc = document.getElementById(\"doc\");\n if (doc) doc.dataset.scheme = scheme;\n mermaid = undefined;\n renderDiagrams(document, \"figure.diagram\");\n};\ndocument.addEventListener(\"board-theme\", themeChanged);\ndark.addEventListener(\"change\", themeChanged);\n";
|
|
1
|
+
export declare const diagrams = "\nimport { diagramTools } from \"/_board/visuals.js\";\nconst rendered = new Map();\nconst dark = matchMedia(\"(prefers-color-scheme: dark)\");\nlet mermaid;\nlet counter = 0;\n\nconst token = (name) => getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n\nconst load = async () => {\n mermaid ??= (await import(\"/_board/mermaid/mermaid.esm.min.mjs\")).default;\n mermaid.initialize({\n startOnLoad: false,\n securityLevel: \"strict\",\n theme: \"base\",\n themeVariables: {\n darkMode: schemeNow() === \"dark\",\n background: token(\"--bg\"),\n primaryColor: token(\"--surface\"),\n primaryTextColor: token(\"--text\"),\n primaryBorderColor: token(\"--border\"),\n lineColor: token(\"--muted\"),\n textColor: token(\"--text\"),\n fontFamily: token(\"--sans\"),\n },\n });\n return mermaid;\n};\n\nconst schemeNow = () => document.documentElement.dataset.scheme ?? (dark.matches ? \"dark\" : \"light\");\nlet lastScheme = schemeNow();\n\nconst draw = async (figure) => {\n const source = figure.querySelector(\".diagram-source\").textContent;\n const scheme = schemeNow();\n const key = scheme + \":\" + source;\n if (!rendered.has(key)) {\n rendered.set(key, load().then((engine) => engine.render(\"diagram-\" + ++counter, source)).then((result) => result.svg));\n }\n try {\n const svg = await rendered.get(key);\n if (scheme !== schemeNow()) {\n rendered.delete(key);\n return;\n }\n figure.querySelector(\".diagram-svg\")?.remove();\n figure.querySelector(\"[data-diagram-error]\")?.remove();\n figure.insertAdjacentHTML(\"afterbegin\", '<div class=\"diagram-svg\">' + svg + \"</div>\");\n figure.dataset.state = \"drawn\";\n diagramTools(figure);\n } catch (error) {\n rendered.delete(key);\n if (scheme !== schemeNow()) return;\n figure.querySelector(\".diagram-svg\")?.remove();\n figure.dataset.state = \"failed\";\n figure.dataset.error = String(error?.message ?? error);\n figure.querySelector(\"[data-diagram-error]\")?.remove();\n const message = document.createElement(\"p\"); message.setAttribute(\"data-diagram-error\", \"\"); message.setAttribute(\"role\", \"status\");\n message.textContent = \"Diagram could not be drawn: \" + figure.dataset.error; figure.append(message);\n diagramTools(figure);\n }\n};\n\nconst forget = (root) => {\n const shown = new Set([...root.querySelectorAll(\"figure.diagram .diagram-source\")].map((source) => source.textContent));\n for (const key of rendered.keys()) {\n if (!shown.has(key.slice(key.indexOf(\":\") + 1))) rendered.delete(key);\n }\n};\n\nexport const renderDiagrams = (root, selector = \"figure.diagram:not([data-state=drawn])\") => {\n forget(root);\n return Promise.all([...root.querySelectorAll(selector)].map(draw));\n};\n\nconst themeChanged = () => {\n const scheme = schemeNow();\n if (lastScheme === scheme) return;\n lastScheme = scheme;\n const doc = document.getElementById(\"doc\");\n if (doc) doc.dataset.scheme = scheme;\n mermaid = undefined;\n renderDiagrams(document, \"figure.diagram\");\n};\ndocument.addEventListener(\"board-theme\", themeChanged);\ndark.addEventListener(\"change\", themeChanged);\n";
|
|
2
2
|
//# sourceMappingURL=diagrams.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagrams.d.ts","sourceRoot":"","sources":["../../src/page/diagrams.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"diagrams.d.ts","sourceRoot":"","sources":["../../src/page/diagrams.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,4rGAsFpB,CAAC"}
|
package/dist/page/diagrams.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export const diagrams = `
|
|
2
|
+
import { diagramTools } from "/_board/visuals.js";
|
|
2
3
|
const rendered = new Map();
|
|
3
4
|
const dark = matchMedia("(prefers-color-scheme: dark)");
|
|
4
5
|
let mermaid;
|
|
@@ -43,14 +44,20 @@ const draw = async (figure) => {
|
|
|
43
44
|
return;
|
|
44
45
|
}
|
|
45
46
|
figure.querySelector(".diagram-svg")?.remove();
|
|
47
|
+
figure.querySelector("[data-diagram-error]")?.remove();
|
|
46
48
|
figure.insertAdjacentHTML("afterbegin", '<div class="diagram-svg">' + svg + "</div>");
|
|
47
49
|
figure.dataset.state = "drawn";
|
|
50
|
+
diagramTools(figure);
|
|
48
51
|
} catch (error) {
|
|
49
52
|
rendered.delete(key);
|
|
50
53
|
if (scheme !== schemeNow()) return;
|
|
51
54
|
figure.querySelector(".diagram-svg")?.remove();
|
|
52
55
|
figure.dataset.state = "failed";
|
|
53
56
|
figure.dataset.error = String(error?.message ?? error);
|
|
57
|
+
figure.querySelector("[data-diagram-error]")?.remove();
|
|
58
|
+
const message = document.createElement("p"); message.setAttribute("data-diagram-error", ""); message.setAttribute("role", "status");
|
|
59
|
+
message.textContent = "Diagram could not be drawn: " + figure.dataset.error; figure.append(message);
|
|
60
|
+
diagramTools(figure);
|
|
54
61
|
}
|
|
55
62
|
};
|
|
56
63
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagrams.js","sourceRoot":"","sources":["../../src/page/diagrams.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG
|
|
1
|
+
{"version":3,"file":"diagrams.js","sourceRoot":"","sources":["../../src/page/diagrams.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFvB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigationScript.d.ts","sourceRoot":"","sources":["../../src/page/navigationScript.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"navigationScript.d.ts","sourceRoot":"","sources":["../../src/page/navigationScript.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,IAAI,MAAM,CAwGzC"}
|
|
@@ -3,6 +3,7 @@ export function navigationScript() {
|
|
|
3
3
|
import { applyPage, capturePage } from "/_board/page-state.js";
|
|
4
4
|
import { reportMissingPassage, restoreReading, scrollToPassage } from "/_board/reading-state.js";
|
|
5
5
|
import { refreshLibrary } from "/_board/library.js";
|
|
6
|
+
import { session } from "/_board/native.js";
|
|
6
7
|
|
|
7
8
|
const cache = new Map();
|
|
8
9
|
const readingKey = "work-board:reading:" + document.documentElement.dataset.workspace;
|
|
@@ -65,20 +66,21 @@ const navigate = async (target, entry) => {
|
|
|
65
66
|
restoreReading(cached.reading);
|
|
66
67
|
} else status.textContent = "Opening document…";
|
|
67
68
|
try {
|
|
68
|
-
const
|
|
69
|
-
const
|
|
69
|
+
const native = session(window);
|
|
70
|
+
const response = await native.read(native.api.page.query({ url: target.pathname + target.search }), controller.signal);
|
|
71
|
+
const page = new DOMParser().parseFromString(response.html, "text/html");
|
|
70
72
|
if (mine !== version) return;
|
|
71
73
|
if (!applyPage(page, Boolean(cached))) throw new Error("Invalid page");
|
|
72
74
|
displayedId = id;
|
|
73
|
-
status.textContent = response.
|
|
74
|
-
if (response.
|
|
75
|
+
status.textContent = response.status < 400 ? "" : response.status === 404 ? "This document is missing or was renamed." : "This document could not be opened.";
|
|
76
|
+
if (response.status < 400) reportMissingPassage();
|
|
75
77
|
if (!cached) {
|
|
76
78
|
document.getElementById("doc").focus({ preventScroll: true });
|
|
77
79
|
if (savedReading[id] ?? entry?.reading) restoreReading(savedReading[id] ?? entry.reading);
|
|
78
80
|
else scrollToPassage(target.hash);
|
|
79
81
|
}
|
|
80
82
|
} catch (error) {
|
|
81
|
-
if (mine !== version ||
|
|
83
|
+
if (mine !== version || controller.signal.aborted) return;
|
|
82
84
|
status.textContent = "Could not open this document. Retry the link or reload the page.";
|
|
83
85
|
}
|
|
84
86
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigationScript.js","sourceRoot":"","sources":["../../src/page/navigationScript.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB;IAC/B,OAAO
|
|
1
|
+
{"version":3,"file":"navigationScript.js","sourceRoot":"","sources":["../../src/page/navigationScript.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsGP,CAAC;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchScript.d.ts","sourceRoot":"","sources":["../../src/page/searchScript.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"searchScript.d.ts","sourceRoot":"","sources":["../../src/page/searchScript.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,IAAI,MAAM,CAyErC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export function searchScript() {
|
|
2
2
|
return `
|
|
3
3
|
import { activate, matchingCommands, move, showResults } from "/_board/search-results.js";
|
|
4
|
+
import { session } from "/_board/native.js";
|
|
4
5
|
const dialog = document.getElementById("search-dialog");
|
|
5
6
|
const input = document.getElementById("search-query");
|
|
6
7
|
const status = document.getElementById("search-status");
|
|
@@ -25,14 +26,15 @@ const search = async () => {
|
|
|
25
26
|
status.textContent = "Searching…";
|
|
26
27
|
controller = new AbortController();
|
|
27
28
|
try {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
const native = session(window);
|
|
30
|
+
const atom = native.api.search.query({ query });
|
|
31
|
+
native.registry.refresh(atom);
|
|
32
|
+
const body = await native.read(atom, controller.signal);
|
|
31
33
|
if (mine !== version || !dialog.open) return;
|
|
32
34
|
showResults([...commands, ...body.results]);
|
|
33
35
|
status.textContent = (body.total ? (body.total > body.results.length ? "Showing " + body.results.length + " of " : "") + body.total + " matches." : "No document matches.") + (body.unavailable.length ? " Could not read " + body.unavailable.length + " files; results are incomplete." : "");
|
|
34
36
|
} catch (error) {
|
|
35
|
-
if (mine !== version ||
|
|
37
|
+
if (mine !== version || controller.signal.aborted) return;
|
|
36
38
|
status.textContent = "Search could not be completed. Press Search to retry.";
|
|
37
39
|
}
|
|
38
40
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchScript.js","sourceRoot":"","sources":["../../src/page/searchScript.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY;IAC3B,OAAO
|
|
1
|
+
{"version":3,"file":"searchScript.js","sourceRoot":"","sources":["../../src/page/searchScript.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY;IAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuEP,CAAC;AACF,CAAC"}
|
package/dist/page/shell.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/page/shell.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/page/shell.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,KAAK,GACjB,OAAO,MAAM,EACb,KAAK,MAAM,EACX,MAAM,MAAM,EACZ,WAAW,MAAM,EACjB,OAAO,OAAO,EACd,WAAW,MAAM,EACjB,OAAM,OAAO,GAAG,UAAU,GAAG,SAAiB,KAC5C,MAmBQ,CAAC"}
|
package/dist/page/shell.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { fileUrl } from "#files/url.ts";
|
|
2
2
|
import { escapeHtml } from "./escape.js";
|
|
3
3
|
import { searchDialog } from "./searchDialog.js";
|
|
4
|
+
import { visualDialog } from "./visualDialog.js";
|
|
4
5
|
function location(file) {
|
|
5
6
|
return file
|
|
6
7
|
.split("/")
|
|
@@ -12,7 +13,7 @@ export const shell = (title, nav, main, workspace, board, identity, view = false
|
|
|
12
13
|
'<meta name="viewport" content="width=device-width, initial-scale=1"><meta name="color-scheme" content="light dark">',
|
|
13
14
|
`<title>${escapeHtml(title)}</title>`,
|
|
14
15
|
'<link rel="stylesheet" href="/_board/style.css"><script type="module" src="/_board/client.js"></script>',
|
|
15
|
-
'</head><body><a class="skip" href="#doc">Skip to content</a><div class="workspace">',
|
|
16
|
+
'</head><body><noscript><style>html:not([data-js]) figure.diagram .diagram-source{display:block}html:not([data-js]) figure.diagram[data-state="pending"]{min-height:0}</style></noscript><a class="skip" href="#doc">Skip to content</a><div class="workspace">',
|
|
16
17
|
'<aside id="sidebar" class="sidebar"><a class="brand" href="/">work board<span>Local workspace</span></a>',
|
|
17
18
|
'<div id="reading-library" class="reading-library" hidden></div><h2 class="nav-heading">Project files</h2>',
|
|
18
19
|
`<nav id="files" class="files" aria-label="Project files">${nav}</nav></aside>`,
|
|
@@ -22,8 +23,8 @@ export const shell = (title, nav, main, workspace, board, identity, view = false
|
|
|
22
23
|
'<div class="preferences" role="group" aria-label="Reading preferences">',
|
|
23
24
|
'<div class="preference"><label for="theme">Theme</label><select id="theme"><option value="system">System</option><option value="light">Light</option><option value="dark">Dark</option></select></div>',
|
|
24
25
|
'<div class="preference"><label for="density">Density</label><select id="density"><option value="comfortable">Comfortable</option><option value="compact">Compact</option></select></div>',
|
|
25
|
-
'<span id="preference-status" role="status"></span></div>',
|
|
26
|
+
'<button id="updates-toggle" type="button" aria-pressed="false" disabled>Pause updates</button><span id="preference-status" role="status"></span></div>',
|
|
26
27
|
`<main${view ? ` data-view="${typeof view === "string" ? view : "work"}"` : ""}${identity ? ` data-identity="${escapeHtml(identity)}"` : ""} id="doc" data-file="${escapeHtml(title)}" data-url="${escapeHtml(fileUrl(title))}" class="${board ? "board-view" : "document-view"}" tabindex="-1">${main}</main>`,
|
|
27
|
-
`</div></div>${searchDialog}</body></html>`,
|
|
28
|
+
`</div></div>${searchDialog}${visualDialog}</body></html>`,
|
|
28
29
|
].join("");
|
|
29
30
|
//# sourceMappingURL=shell.js.map
|
package/dist/page/shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/page/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,SAAS,QAAQ,CAAC,IAAY;IAC7B,OAAO,IAAI;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;SACjD,IAAI,CAAC,kCAAkC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CACpB,KAAa,EACb,GAAW,EACX,IAAY,EACZ,SAAiB,EACjB,KAAc,EACd,QAAiB,EACjB,OAAyC,KAAK,EACrC,EAAE,CACX;IACC,kDAAkD,UAAU,CAAC,SAAS,CAAC,gCAAgC;IACvG,qHAAqH;IACrH,UAAU,UAAU,CAAC,KAAK,CAAC,UAAU;IACrC,yGAAyG;IACzG,
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/page/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,SAAS,QAAQ,CAAC,IAAY;IAC7B,OAAO,IAAI;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;SACjD,IAAI,CAAC,kCAAkC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CACpB,KAAa,EACb,GAAW,EACX,IAAY,EACZ,SAAiB,EACjB,KAAc,EACd,QAAiB,EACjB,OAAyC,KAAK,EACrC,EAAE,CACX;IACC,kDAAkD,UAAU,CAAC,SAAS,CAAC,gCAAgC;IACvG,qHAAqH;IACrH,UAAU,UAAU,CAAC,KAAK,CAAC,UAAU;IACrC,yGAAyG;IACzG,gQAAgQ;IAChQ,0GAA0G;IAC1G,2GAA2G;IAC3G,4DAA4D,GAAG,gBAAgB;IAC/E,6IAA6I;IAC7I,iIAAiI,QAAQ,CAAC,KAAK,CAAC,QAAQ;IACxJ,kEAAkE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,kFAAkF,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,yEAAyE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,6QAA6Q;IACtnB,yEAAyE;IACzE,wMAAwM;IACxM,0LAA0L;IAC1L,wJAAwJ;IACxJ,QAAQ,IAAI,CAAC,CAAC,CAAC,eAAe,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,wBAAwB,UAAU,CAAC,KAAK,CAAC,eAAe,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,mBAAmB,IAAI,SAAS;IAC/S,eAAe,YAAY,GAAG,YAAY,gBAAgB;CAC1D,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC"}
|
package/dist/page/stateScript.js
CHANGED
|
@@ -22,7 +22,7 @@ export const applyPage = (page, preserve = false) => {
|
|
|
22
22
|
const content = current.querySelector("#changes-content");
|
|
23
23
|
if (content) incoming.querySelector("#changes-content")?.replaceWith(content.cloneNode(true));
|
|
24
24
|
}
|
|
25
|
-
swap(current, incoming);
|
|
25
|
+
swap(current, incoming, true);
|
|
26
26
|
} else {
|
|
27
27
|
current.replaceWith(document.importNode(incoming, true));
|
|
28
28
|
remember(document.getElementById("doc"));
|
package/dist/page/style.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AA4DA,eAAO,MAAM,KAAK,QAC0H,CAAC"}
|
package/dist/page/style.js
CHANGED
|
@@ -3,6 +3,7 @@ import { workStyle } from "#views/workStyle.ts";
|
|
|
3
3
|
import { metadataStyles } from "./metadata.js";
|
|
4
4
|
import { readingStyles } from "./readingStyles.js";
|
|
5
5
|
import { searchStyles } from "./searchDialog.js";
|
|
6
|
+
import { visualStyles } from "./visualDialog.js";
|
|
6
7
|
import { layout, theme } from "./workspaceStyles.js";
|
|
7
8
|
const prose = `
|
|
8
9
|
h1, h2, h3, h4 { font-weight: 600; line-height: 1.25; margin: 1.6em 0 0.5em; }
|
|
@@ -45,12 +46,13 @@ const board = `
|
|
|
45
46
|
footer { margin-top: 2.5em; padding-top: 1em; border-top: 1px solid var(--border); color: var(--muted); font-size: 0.925em; }
|
|
46
47
|
`;
|
|
47
48
|
const diagrams = `
|
|
49
|
+
[data-live-change] { outline: 2px solid var(--border); outline-offset: 3px; border-radius: 3px; }
|
|
48
50
|
figure.diagram { margin-left: 0; margin-right: 0; }
|
|
49
51
|
figure.diagram[data-state="pending"] { min-height: 12rem; background: var(--surface); border-radius: 6px; }
|
|
50
52
|
figure.diagram .diagram-source { display: none; }
|
|
51
53
|
figure.diagram[data-state="failed"] .diagram-source { display: block; }
|
|
52
|
-
|
|
54
|
+
[data-diagram-error] { color: var(--danger); font-size: 0.875em; }
|
|
53
55
|
@media (prefers-reduced-motion: reduce) { * { transition: none !important; animation: none !important; } }
|
|
54
56
|
`;
|
|
55
|
-
export const style = theme + layout + prose + board + diagrams + readingStyles() + searchStyles + metadataStyles + workStyle() + attentionStyle();
|
|
57
|
+
export const style = theme + layout + prose + board + diagrams + readingStyles() + searchStyles + metadataStyles + workStyle() + attentionStyle() + visualStyles;
|
|
56
58
|
//# sourceMappingURL=style.js.map
|
package/dist/page/style.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Bb,CAAC;AAEF,MAAM,KAAK,GAAG;;;;;;;;;;;;CAYb,CAAC;AAEF,MAAM,QAAQ,GAAG
|
|
1
|
+
{"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Bb,CAAC;AAEF,MAAM,KAAK,GAAG;;;;;;;;;;;;CAYb,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;;CAQhB,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GACjB,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,aAAa,EAAE,GAAG,YAAY,GAAG,cAAc,GAAG,SAAS,EAAE,GAAG,cAAc,EAAE,GAAG,YAAY,CAAC"}
|
package/dist/page/swap.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const swap = "\nconst containers = new Set([\"DIV\", \"SECTION\", \"ARTICLE\", \"HEADER\", \"FOOTER\", \"MAIN\", \"NAV\", \"FORM\", \"SELECT\", \"LABEL\", \"ASIDE\"]);\n\nconst structural = (element) => [...element.childNodes].every((node) => node.nodeType === 1 || node.textContent.trim() === \"\");\n\nconst pristine = new WeakMap();\n\nexport const remember = (element) => {\n pristine.set(element, element
|
|
1
|
+
export declare const swap = "\nconst containers = new Set([\"DIV\", \"SECTION\", \"ARTICLE\", \"HEADER\", \"FOOTER\", \"MAIN\", \"NAV\", \"FORM\", \"SELECT\", \"LABEL\", \"ASIDE\"]);\n\nconst structural = (element) => [...element.childNodes].every((node) => node.nodeType === 1 || node.textContent.trim() === \"\");\n\nconst pristine = new WeakMap();\nconst flash = (element) => {\n if (element.matches(\"[data-modified]\")) return;\n if (!element.matches(\"p, li, pre, blockquote, h1, h2, h3, h4, h5, h6, .item, .notes, .metadata-panel\")) return;\n element.setAttribute(\"data-live-change\", \"\");\n setTimeout(() => element.removeAttribute(\"data-live-change\"), 2500);\n};\n\nexport const remember = (element) => {\n pristine.set(element, normalized(element));\n if (containers.has(element.tagName)) for (const child of element.children) remember(child);\n};\n\nconst normalized = (element) => {\n const copy = element.cloneNode(true);\n for (const tool of copy.querySelectorAll(\"[data-visual-tools], [data-image-error], [data-diagram-error]\")) tool.remove();\n for (const node of [copy, ...copy.querySelectorAll(\"*\")]) {\n node.removeAttribute(\"data-live-change\");\n if (node.tagName === \"DETAILS\") node.removeAttribute(\"open\");\n if (node.matches(\"figure.diagram\")) {\n node.querySelector(\".diagram-svg\")?.remove();\n node.dataset.state = \"pending\";\n delete node.dataset.error;\n }\n if (node.matches(\"[data-modified]\")) node.textContent = \"\";\n if (node.matches(\"img[data-local-image]\")) {\n node.setAttribute(\"src\", node.dataset.localImage);\n for (const attribute of [\"tabindex\", \"role\", \"aria-label\"]) node.removeAttribute(attribute);\n }\n }\n return copy.outerHTML;\n};\n\nconst signature = (element) => {\n if (!pristine.has(element)) pristine.set(element, normalized(element));\n return pristine.get(element);\n};\n\nconst normalizedShell = (element) => { const copy = element.cloneNode(false); copy.removeAttribute(\"data-live-change\"); return copy.outerHTML; };\n\nconst sameShell = (old, next) =>\n old.tagName === next.tagName && containers.has(old.tagName) && normalizedShell(old) === normalizedShell(next);\n\nconst matches = (a, b) => {\n let start = 0;\n while (start < a.length && start < b.length && a[start] === b[start]) start++;\n let tail = 0;\n while (tail < a.length - start && tail < b.length - start && a[a.length - 1 - tail] === b[b.length - 1 - tail]) tail++;\n const n = a.length - start - tail;\n const m = b.length - start - tail;\n const table = Array.from({ length: n + 1 }, () => new Uint32Array(m + 1));\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n table[i][j] = a[start + i] === b[start + j] ? table[i + 1][j + 1] + 1 : Math.max(table[i + 1][j], table[i][j + 1]);\n }\n }\n const pairs = Array.from({ length: start }, (_, index) => [index, index]);\n for (let i = 0, j = 0; i < n && j < m; ) {\n if (a[start + i] === b[start + j]) pairs.push([start + i++, start + j++]);\n else if (table[i + 1][j] >= table[i][j + 1]) i++;\n else j++;\n }\n for (let index = tail; index > 0; index--) pairs.push([a.length - index, b.length - index]);\n return [...pairs, [a.length, b.length]];\n};\n\nconst patch = (current, incoming, highlight) => {\n const selected = current.tagName === \"SELECT\" ? current.value : null;\n const fallback = incoming.tagName === \"SELECT\" ? incoming.value : null;\n if (!structural(current) || !structural(incoming)) {\n current.replaceChildren(...incoming.childNodes);\n for (const child of current.children) remember(child);\n if (highlight) flash(current);\n return;\n }\n const olds = [...current.children];\n const news = [...incoming.children];\n const signatures = news.map(normalized);\n const arrive = (index) => {\n remember(news[index]);\n if (highlight) flash(news[index]);\n return news[index];\n };\n let i = 0;\n let j = 0;\n for (const [kept, arrived] of matches(olds.map(signature), signatures)) {\n const anchor = olds[kept] ?? null;\n for (; i < kept && j < arrived; i++, j++) {\n if (sameShell(olds[i], news[j])) {\n patch(olds[i], news[j], highlight);\n pristine.set(olds[i], signatures[j]);\n } else olds[i].replaceWith(arrive(j));\n }\n for (; i < kept; i++) olds[i].remove();\n for (; j < arrived; j++) current.insertBefore(arrive(j), anchor);\n i++;\n j++;\n }\n if (selected !== null) current.value = [...current.options].some((option) => option.value === selected) ? selected : fallback;\n};\n\nconst keysOf = (root) => {\n const seen = new Map();\n return [...root.querySelectorAll(\"details\")].map((details) => {\n const base =\n details.dataset.key ??\n (details.closest(\".item\")?.querySelector(\"h3\")?.textContent ?? \"\") + \"|\" + (details.querySelector(\"summary\")?.textContent ?? \"\");\n const count = seen.get(base) ?? 0;\n seen.set(base, count + 1);\n return [base + \"#\" + count, details];\n });\n};\n\nconst carryDrawings = (drawings, figures) => {\n if (drawings.length !== figures.length) return;\n figures.forEach((figure, index) => {\n const drawing = drawings[index];\n if (figure.dataset.state !== \"pending\" || drawing === null || drawing.isConnected) return;\n figure.prepend(drawing);\n figure.dataset.state = \"redrawing\";\n });\n};\n\nexport const swap = (current, incoming, highlight = false) => {\n const before = keysOf(current);\n const open = new Map(before.map(([key, details]) => [key, details.open]));\n const existing = new Set(before.map(([, details]) => details));\n const drawings = [...current.querySelectorAll(\"figure.diagram\")].map((figure) => figure.querySelector(\".diagram-svg\"));\n patch(current, incoming, highlight);\n carryDrawings(drawings, [...current.querySelectorAll(\"figure.diagram\")]);\n for (const [key, details] of keysOf(current)) {\n const was = open.get(key);\n if (was !== undefined && !existing.has(details)) details.open = was;\n }\n};\n";
|
|
2
2
|
//# sourceMappingURL=swap.d.ts.map
|
package/dist/page/swap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swap.d.ts","sourceRoot":"","sources":["../../src/page/swap.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"swap.d.ts","sourceRoot":"","sources":["../../src/page/swap.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,m7LA4IhB,CAAC"}
|
package/dist/page/swap.js
CHANGED
|
@@ -4,15 +4,23 @@ const containers = new Set(["DIV", "SECTION", "ARTICLE", "HEADER", "FOOTER", "MA
|
|
|
4
4
|
const structural = (element) => [...element.childNodes].every((node) => node.nodeType === 1 || node.textContent.trim() === "");
|
|
5
5
|
|
|
6
6
|
const pristine = new WeakMap();
|
|
7
|
+
const flash = (element) => {
|
|
8
|
+
if (element.matches("[data-modified]")) return;
|
|
9
|
+
if (!element.matches("p, li, pre, blockquote, h1, h2, h3, h4, h5, h6, .item, .notes, .metadata-panel")) return;
|
|
10
|
+
element.setAttribute("data-live-change", "");
|
|
11
|
+
setTimeout(() => element.removeAttribute("data-live-change"), 2500);
|
|
12
|
+
};
|
|
7
13
|
|
|
8
14
|
export const remember = (element) => {
|
|
9
|
-
pristine.set(element, element
|
|
15
|
+
pristine.set(element, normalized(element));
|
|
10
16
|
if (containers.has(element.tagName)) for (const child of element.children) remember(child);
|
|
11
17
|
};
|
|
12
18
|
|
|
13
19
|
const normalized = (element) => {
|
|
14
20
|
const copy = element.cloneNode(true);
|
|
21
|
+
for (const tool of copy.querySelectorAll("[data-visual-tools], [data-image-error], [data-diagram-error]")) tool.remove();
|
|
15
22
|
for (const node of [copy, ...copy.querySelectorAll("*")]) {
|
|
23
|
+
node.removeAttribute("data-live-change");
|
|
16
24
|
if (node.tagName === "DETAILS") node.removeAttribute("open");
|
|
17
25
|
if (node.matches("figure.diagram")) {
|
|
18
26
|
node.querySelector(".diagram-svg")?.remove();
|
|
@@ -20,6 +28,10 @@ const normalized = (element) => {
|
|
|
20
28
|
delete node.dataset.error;
|
|
21
29
|
}
|
|
22
30
|
if (node.matches("[data-modified]")) node.textContent = "";
|
|
31
|
+
if (node.matches("img[data-local-image]")) {
|
|
32
|
+
node.setAttribute("src", node.dataset.localImage);
|
|
33
|
+
for (const attribute of ["tabindex", "role", "aria-label"]) node.removeAttribute(attribute);
|
|
34
|
+
}
|
|
23
35
|
}
|
|
24
36
|
return copy.outerHTML;
|
|
25
37
|
};
|
|
@@ -29,8 +41,10 @@ const signature = (element) => {
|
|
|
29
41
|
return pristine.get(element);
|
|
30
42
|
};
|
|
31
43
|
|
|
44
|
+
const normalizedShell = (element) => { const copy = element.cloneNode(false); copy.removeAttribute("data-live-change"); return copy.outerHTML; };
|
|
45
|
+
|
|
32
46
|
const sameShell = (old, next) =>
|
|
33
|
-
old.tagName === next.tagName && containers.has(old.tagName) && old
|
|
47
|
+
old.tagName === next.tagName && containers.has(old.tagName) && normalizedShell(old) === normalizedShell(next);
|
|
34
48
|
|
|
35
49
|
const matches = (a, b) => {
|
|
36
50
|
let start = 0;
|
|
@@ -55,19 +69,21 @@ const matches = (a, b) => {
|
|
|
55
69
|
return [...pairs, [a.length, b.length]];
|
|
56
70
|
};
|
|
57
71
|
|
|
58
|
-
const patch = (current, incoming) => {
|
|
72
|
+
const patch = (current, incoming, highlight) => {
|
|
59
73
|
const selected = current.tagName === "SELECT" ? current.value : null;
|
|
60
74
|
const fallback = incoming.tagName === "SELECT" ? incoming.value : null;
|
|
61
75
|
if (!structural(current) || !structural(incoming)) {
|
|
62
76
|
current.replaceChildren(...incoming.childNodes);
|
|
63
77
|
for (const child of current.children) remember(child);
|
|
78
|
+
if (highlight) flash(current);
|
|
64
79
|
return;
|
|
65
80
|
}
|
|
66
81
|
const olds = [...current.children];
|
|
67
82
|
const news = [...incoming.children];
|
|
68
|
-
const signatures = news.map(
|
|
83
|
+
const signatures = news.map(normalized);
|
|
69
84
|
const arrive = (index) => {
|
|
70
85
|
remember(news[index]);
|
|
86
|
+
if (highlight) flash(news[index]);
|
|
71
87
|
return news[index];
|
|
72
88
|
};
|
|
73
89
|
let i = 0;
|
|
@@ -76,7 +92,7 @@ const patch = (current, incoming) => {
|
|
|
76
92
|
const anchor = olds[kept] ?? null;
|
|
77
93
|
for (; i < kept && j < arrived; i++, j++) {
|
|
78
94
|
if (sameShell(olds[i], news[j])) {
|
|
79
|
-
patch(olds[i], news[j]);
|
|
95
|
+
patch(olds[i], news[j], highlight);
|
|
80
96
|
pristine.set(olds[i], signatures[j]);
|
|
81
97
|
} else olds[i].replaceWith(arrive(j));
|
|
82
98
|
}
|
|
@@ -110,12 +126,12 @@ const carryDrawings = (drawings, figures) => {
|
|
|
110
126
|
});
|
|
111
127
|
};
|
|
112
128
|
|
|
113
|
-
export const swap = (current, incoming) => {
|
|
129
|
+
export const swap = (current, incoming, highlight = false) => {
|
|
114
130
|
const before = keysOf(current);
|
|
115
131
|
const open = new Map(before.map(([key, details]) => [key, details.open]));
|
|
116
132
|
const existing = new Set(before.map(([, details]) => details));
|
|
117
133
|
const drawings = [...current.querySelectorAll("figure.diagram")].map((figure) => figure.querySelector(".diagram-svg"));
|
|
118
|
-
patch(current, incoming);
|
|
134
|
+
patch(current, incoming, highlight);
|
|
119
135
|
carryDrawings(drawings, [...current.querySelectorAll("figure.diagram")]);
|
|
120
136
|
for (const [key, details] of keysOf(current)) {
|
|
121
137
|
const was = open.get(key);
|
package/dist/page/swap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swap.js","sourceRoot":"","sources":["../../src/page/swap.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"swap.js","sourceRoot":"","sources":["../../src/page/swap.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4InB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const visualDialog = "<dialog id=\"visual-dialog\" aria-labelledby=\"visual-title\">\n<div id=\"visual-stage\">\n<div class=\"visual-bar\"><h2 id=\"visual-title\">Visual evidence</h2><button id=\"visual-close\" type=\"button\">Close</button></div>\n<p id=\"visual-context\"></p>\n<div class=\"visual-bar\" role=\"group\" aria-label=\"Visual controls\">\n<button id=\"visual-previous\" type=\"button\">Previous image</button><button id=\"visual-next\" type=\"button\">Next image</button>\n<button id=\"visual-out\" type=\"button\" aria-label=\"Zoom out\">\u2212</button><button id=\"visual-fit\" type=\"button\">Fit</button><button id=\"visual-actual\" type=\"button\" aria-pressed=\"false\">Actual size</button><button id=\"visual-in\" type=\"button\" aria-label=\"Zoom in\">+</button>\n<button id=\"visual-fullscreen\" type=\"button\">Fullscreen</button><a id=\"visual-download\" download>Save locally</a>\n</div><p id=\"visual-status\" role=\"status\"></p><div id=\"visual-viewport\" tabindex=\"0\" aria-label=\"Scrollable visual\"><div id=\"visual-content\"></div></div>\n<p class=\"visual-help\">Arrow keys choose images \u00B7 Zoom and scroll to inspect \u00B7 Escape returns to the source. Recorded evidence does not verify acceptance.</p>\n</div></dialog>";
|
|
2
|
+
export declare const visualStyles = "\n#visual-dialog{width:min(1100px,calc(100vw - 24px));max-height:calc(100dvh - 24px);padding:16px;border:1px solid var(--border);border-radius:12px;background:var(--card);color:var(--text)}\n#visual-dialog::backdrop{background:rgb(0 0 0 / .6)}\n.visual-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.visual-bar h2{flex:1;margin:0;font-size:1.2rem}\n.visual-bar button,.visual-bar a{font:inherit;padding:6px 10px;cursor:pointer;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:6px}\n#visual-context,.visual-help,#visual-status{font-size:.85rem;overflow-wrap:anywhere;color:var(--muted)}\n#visual-viewport{overflow:auto;max-height:65dvh;min-height:150px;background:var(--surface);border:1px solid var(--border);padding:12px}\n#visual-content{width:100%;min-width:0}#visual-content img,#visual-content svg{display:block;width:100%;max-width:none;height:auto}\n#visual-stage:fullscreen{width:100vw;height:100dvh;box-sizing:border-box;padding:16px;background:var(--card);color:var(--text);overflow:auto}#visual-stage:fullscreen #visual-viewport{max-height:75dvh}\n[data-local-image]{cursor:zoom-in}[data-local-image]:focus-visible{outline:2px solid var(--focus)}\n[data-visual-tools]{display:block;margin:8px 0;font-size:.85rem}[data-visual-tools] button{font:inherit;cursor:pointer;color:var(--text);background:var(--surface);border:1px solid var(--border);border-radius:6px;padding:5px 10px}\n[data-image-error]{display:block;color:var(--danger);font-size:.85rem}\n";
|
|
3
|
+
//# sourceMappingURL=visualDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visualDialog.d.ts","sourceRoot":"","sources":["../../src/page/visualDialog.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,6tCAUT,CAAC;AAEjB,eAAO,MAAM,YAAY,g/CAYxB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export const visualDialog = `<dialog id="visual-dialog" aria-labelledby="visual-title">
|
|
2
|
+
<div id="visual-stage">
|
|
3
|
+
<div class="visual-bar"><h2 id="visual-title">Visual evidence</h2><button id="visual-close" type="button">Close</button></div>
|
|
4
|
+
<p id="visual-context"></p>
|
|
5
|
+
<div class="visual-bar" role="group" aria-label="Visual controls">
|
|
6
|
+
<button id="visual-previous" type="button">Previous image</button><button id="visual-next" type="button">Next image</button>
|
|
7
|
+
<button id="visual-out" type="button" aria-label="Zoom out">−</button><button id="visual-fit" type="button">Fit</button><button id="visual-actual" type="button" aria-pressed="false">Actual size</button><button id="visual-in" type="button" aria-label="Zoom in">+</button>
|
|
8
|
+
<button id="visual-fullscreen" type="button">Fullscreen</button><a id="visual-download" download>Save locally</a>
|
|
9
|
+
</div><p id="visual-status" role="status"></p><div id="visual-viewport" tabindex="0" aria-label="Scrollable visual"><div id="visual-content"></div></div>
|
|
10
|
+
<p class="visual-help">Arrow keys choose images · Zoom and scroll to inspect · Escape returns to the source. Recorded evidence does not verify acceptance.</p>
|
|
11
|
+
</div></dialog>`;
|
|
12
|
+
export const visualStyles = `
|
|
13
|
+
#visual-dialog{width:min(1100px,calc(100vw - 24px));max-height:calc(100dvh - 24px);padding:16px;border:1px solid var(--border);border-radius:12px;background:var(--card);color:var(--text)}
|
|
14
|
+
#visual-dialog::backdrop{background:rgb(0 0 0 / .6)}
|
|
15
|
+
.visual-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.visual-bar h2{flex:1;margin:0;font-size:1.2rem}
|
|
16
|
+
.visual-bar button,.visual-bar a{font:inherit;padding:6px 10px;cursor:pointer;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:6px}
|
|
17
|
+
#visual-context,.visual-help,#visual-status{font-size:.85rem;overflow-wrap:anywhere;color:var(--muted)}
|
|
18
|
+
#visual-viewport{overflow:auto;max-height:65dvh;min-height:150px;background:var(--surface);border:1px solid var(--border);padding:12px}
|
|
19
|
+
#visual-content{width:100%;min-width:0}#visual-content img,#visual-content svg{display:block;width:100%;max-width:none;height:auto}
|
|
20
|
+
#visual-stage:fullscreen{width:100vw;height:100dvh;box-sizing:border-box;padding:16px;background:var(--card);color:var(--text);overflow:auto}#visual-stage:fullscreen #visual-viewport{max-height:75dvh}
|
|
21
|
+
[data-local-image]{cursor:zoom-in}[data-local-image]:focus-visible{outline:2px solid var(--focus)}
|
|
22
|
+
[data-visual-tools]{display:block;margin:8px 0;font-size:.85rem}[data-visual-tools] button{font:inherit;cursor:pointer;color:var(--text);background:var(--surface);border:1px solid var(--border);border-radius:6px;padding:5px 10px}
|
|
23
|
+
[data-image-error]{display:block;color:var(--danger);font-size:.85rem}
|
|
24
|
+
`;
|
|
25
|
+
//# sourceMappingURL=visualDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visualDialog.js","sourceRoot":"","sources":["../../src/page/visualDialog.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;gBAUZ,CAAC;AAEjB,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;CAY3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visualScript.d.ts","sourceRoot":"","sources":["../../src/page/visualScript.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,IAAI,MAAM,CAwCrC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export function visualScript() {
|
|
2
|
+
return `
|
|
3
|
+
import { inspectImage, inspectDiagram, inspectAttachment } from "/_board/visual-viewport.js";
|
|
4
|
+
let revision = 0;
|
|
5
|
+
const refresh = () => {
|
|
6
|
+
revision++;
|
|
7
|
+
for (const image of document.querySelectorAll("#doc img[data-local-image]")) {
|
|
8
|
+
image.tabIndex = 0; image.setAttribute("role", "button"); image.setAttribute("aria-label", "Inspect image: " + (image.alt || "Local image"));
|
|
9
|
+
const url = new URL(image.dataset.localImage, location.href); url.searchParams.set("_wb", Date.now() + "-" + revision); image.src = url.href;
|
|
10
|
+
image.onerror = () => {
|
|
11
|
+
if (!image.isConnected || image.nextElementSibling?.hasAttribute("data-image-error")) return;
|
|
12
|
+
const error = document.createElement("span"); error.setAttribute("data-image-error", ""); error.setAttribute("role", "status");
|
|
13
|
+
error.textContent = "Image unavailable. Check the local path, supported type, workspace boundary and 16 MiB limit."; image.after(error);
|
|
14
|
+
};
|
|
15
|
+
image.onload = () => { if (image.nextElementSibling?.hasAttribute("data-image-error")) image.nextElementSibling.remove(); };
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
export const diagramTools = (figure) => {
|
|
19
|
+
let tools = figure.querySelector("[data-visual-tools]");
|
|
20
|
+
if (!tools) {
|
|
21
|
+
tools = document.createElement("span"); tools.setAttribute("data-visual-tools", "");
|
|
22
|
+
const button = document.createElement("button"); button.type = "button"; button.textContent = "Inspect diagram"; button.setAttribute("data-inspect-diagram", "");
|
|
23
|
+
tools.append(button); figure.append(tools);
|
|
24
|
+
}
|
|
25
|
+
tools.querySelector("button").disabled = figure.dataset.state !== "drawn";
|
|
26
|
+
};
|
|
27
|
+
document.addEventListener("click", (event) => {
|
|
28
|
+
if (event.defaultPrevented || event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return;
|
|
29
|
+
const diagram = event.target.closest?.("#doc [data-inspect-diagram]");
|
|
30
|
+
if (diagram && !diagram.disabled) { inspectDiagram(diagram.closest("figure.diagram"), diagram); return; }
|
|
31
|
+
const link = event.target.closest?.('#doc a[href^="/_board/attachment/"]');
|
|
32
|
+
if (link && !link.hasAttribute("download") && (!link.target || link.target === "_self")) { event.preventDefault(); inspectAttachment(link); return; }
|
|
33
|
+
const image = event.target.closest?.("#doc img[data-local-image]"); if (image) { event.preventDefault(); inspectImage(image); }
|
|
34
|
+
});
|
|
35
|
+
document.addEventListener("keydown", (event) => {
|
|
36
|
+
if (["Enter", " "].includes(event.key) && event.target.matches?.("#doc img[data-local-image]")) { event.preventDefault(); inspectImage(event.target); }
|
|
37
|
+
});
|
|
38
|
+
document.addEventListener("board-page", refresh);
|
|
39
|
+
refresh();
|
|
40
|
+
`;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=visualScript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visualScript.js","sourceRoot":"","sources":["../../src/page/visualScript.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY;IAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCP,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visualViewport.d.ts","sourceRoot":"","sources":["../../src/page/visualViewport.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,IAAI,MAAM,CAqFvC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export function visualViewport() {
|
|
2
|
+
return `
|
|
3
|
+
const dialog = document.getElementById("visual-dialog");
|
|
4
|
+
const content = document.getElementById("visual-content");
|
|
5
|
+
const viewport = document.getElementById("visual-viewport");
|
|
6
|
+
const status = document.getElementById("visual-status");
|
|
7
|
+
const download = document.getElementById("visual-download");
|
|
8
|
+
let scale = 100;
|
|
9
|
+
let baseWidth = 0;
|
|
10
|
+
let objectUrl;
|
|
11
|
+
let origin;
|
|
12
|
+
let images = [];
|
|
13
|
+
let selected = -1;
|
|
14
|
+
const id = (name) => document.getElementById("visual-" + name);
|
|
15
|
+
const release = () => { if (objectUrl) URL.revokeObjectURL(objectUrl); objectUrl = undefined; };
|
|
16
|
+
const zoom = (next) => {
|
|
17
|
+
scale = Math.max(25, Math.min(800, next));
|
|
18
|
+
content.style.width = baseWidth ? (baseWidth * scale / 100) + "px" : scale + "%";
|
|
19
|
+
id("actual").setAttribute("aria-pressed", baseWidth ? "true" : "false");
|
|
20
|
+
id("fit").textContent = scale === 100 && !baseWidth ? "Fit" : Math.round(scale) + "% · Fit";
|
|
21
|
+
};
|
|
22
|
+
const fit = () => { baseWidth = 0; zoom(100); viewport.scrollTop = 0; viewport.scrollLeft = 0; };
|
|
23
|
+
const showImage = () => {
|
|
24
|
+
release(); fit(); status.textContent = "";
|
|
25
|
+
const source = images[selected];
|
|
26
|
+
const image = new Image(); image.alt = source.alt;
|
|
27
|
+
image.onerror = () => { if (content.contains(image)) { status.textContent = "Image unavailable. Check the local path, supported type, workspace boundary and 16 MiB limit."; download.removeAttribute("href"); download.setAttribute("aria-disabled", "true"); } };
|
|
28
|
+
image.src = source.src; content.replaceChildren(image);
|
|
29
|
+
id("context").textContent = (source.alt || "Local image") + " · " + (selected + 1) + " of " + images.length + " · " + source.dataset.localImage + " · " + document.getElementById("doc").dataset.file;
|
|
30
|
+
download.href = source.dataset.localImage;
|
|
31
|
+
try { download.download = decodeURIComponent(new URL(download.href).pathname.split("/").at(-1)); } catch { download.download = "work-board-image"; }
|
|
32
|
+
download.setAttribute("aria-disabled", "false");
|
|
33
|
+
id("previous").disabled = selected <= 0; id("next").disabled = selected >= images.length - 1;
|
|
34
|
+
};
|
|
35
|
+
export const inspectImage = (source) => {
|
|
36
|
+
origin = source; images = [...document.querySelectorAll("#doc img[data-local-image]")]; selected = images.indexOf(source);
|
|
37
|
+
id("previous").hidden = false; id("next").hidden = false; showImage(); dialog.showModal();
|
|
38
|
+
};
|
|
39
|
+
export const inspectAttachment = (link) => {
|
|
40
|
+
origin = link; const source = { alt: link.textContent, dataset: { localImage: link.getAttribute("href") }, src: link.href };
|
|
41
|
+
images = [source]; selected = 0; id("previous").hidden = false; id("next").hidden = false; showImage(); dialog.showModal();
|
|
42
|
+
};
|
|
43
|
+
export const inspectDiagram = (figure, trigger) => {
|
|
44
|
+
const drawing = figure.querySelector(".diagram-svg svg");
|
|
45
|
+
if (!drawing) return;
|
|
46
|
+
origin = trigger; selected = -1; images = []; release(); fit(); status.textContent = "";
|
|
47
|
+
const copy = drawing.cloneNode(true); copy.style.maxWidth = "none"; copy.style.width = "100%"; copy.style.height = "auto";
|
|
48
|
+
content.replaceChildren(copy);
|
|
49
|
+
id("context").textContent = "Mermaid diagram · " + document.getElementById("doc").dataset.file + " · Current drawing";
|
|
50
|
+
id("previous").hidden = true; id("next").hidden = true;
|
|
51
|
+
const xml = new XMLSerializer().serializeToString(drawing);
|
|
52
|
+
objectUrl = URL.createObjectURL(new Blob([xml], { type: "image/svg+xml" }));
|
|
53
|
+
download.href = objectUrl; download.download = "work-board-diagram.svg"; dialog.showModal();
|
|
54
|
+
download.setAttribute("aria-disabled", "false");
|
|
55
|
+
};
|
|
56
|
+
const move = (offset) => { if (selected < 0) return; selected = Math.max(0, Math.min(images.length - 1, selected + offset)); showImage(); };
|
|
57
|
+
id("previous").addEventListener("click", () => move(-1)); id("next").addEventListener("click", () => move(1));
|
|
58
|
+
id("in").addEventListener("click", () => zoom(scale * 1.5)); id("out").addEventListener("click", () => zoom(scale / 1.5));
|
|
59
|
+
id("fit").addEventListener("click", fit);
|
|
60
|
+
id("actual").addEventListener("click", () => {
|
|
61
|
+
const graphic = content.firstElementChild;
|
|
62
|
+
const width = graphic?.naturalWidth || graphic?.viewBox?.baseVal?.width;
|
|
63
|
+
if (!width) { status.textContent = "Original dimensions unavailable; Fit and zoom remain available."; return; }
|
|
64
|
+
baseWidth = width; zoom(100); viewport.scrollTop = 0; viewport.scrollLeft = 0;
|
|
65
|
+
});
|
|
66
|
+
id("close").addEventListener("click", () => dialog.close());
|
|
67
|
+
id("fullscreen").addEventListener("click", async () => {
|
|
68
|
+
try { if (document.fullscreenElement) await document.exitFullscreen(); else await id("stage").requestFullscreen(); }
|
|
69
|
+
catch { status.textContent = "Fullscreen is unavailable here; the scrollable viewer remains available."; }
|
|
70
|
+
});
|
|
71
|
+
dialog.addEventListener("keydown", (event) => {
|
|
72
|
+
if (event.key === "ArrowLeft" && selected >= 0) { event.preventDefault(); move(-1); }
|
|
73
|
+
if (event.key === "ArrowRight" && selected >= 0) { event.preventDefault(); move(1); }
|
|
74
|
+
if (event.key === "Escape") { event.preventDefault(); dialog.close(); }
|
|
75
|
+
});
|
|
76
|
+
dialog.addEventListener("close", async () => {
|
|
77
|
+
release(); content.replaceChildren();
|
|
78
|
+
if (dialog.contains(document.fullscreenElement)) await document.exitFullscreen().catch(() => {});
|
|
79
|
+
(origin?.isConnected ? origin : document.getElementById("doc")).focus();
|
|
80
|
+
});
|
|
81
|
+
document.addEventListener("board-page", () => {
|
|
82
|
+
if (dialog.open) { status.textContent = "Source updated. This preview is the drawing/image opened earlier; close and reopen to inspect or save the latest source."; download.removeAttribute("href"); download.setAttribute("aria-disabled", "true"); }
|
|
83
|
+
});
|
|
84
|
+
window.addEventListener("pagehide", () => { release(); if (dialog.open) dialog.close(); });
|
|
85
|
+
`;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=visualViewport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visualViewport.js","sourceRoot":"","sources":["../../src/page/visualViewport.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmFP,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../src/path/attachment.ts"],"names":[],"mappings":"AAQA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG/D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAS/D"}
|