@shivaedev/work-board 0.6.0 → 0.6.1
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 +18 -0
- package/README.md +8 -0
- package/dist/cli.js +1 -1
- package/dist/page/diagrams.d.ts +1 -1
- package/dist/page/diagrams.d.ts.map +1 -1
- package/dist/page/diagrams.js +1 -0
- package/dist/page/diagrams.js.map +1 -1
- package/dist/render/code.d.ts +2 -8
- package/dist/render/code.d.ts.map +1 -1
- package/dist/render/code.js +26 -18
- package/dist/render/code.js.map +1 -1
- package/dist/render/documentHeadings.d.ts +2 -658
- package/dist/render/documentHeadings.d.ts.map +1 -1
- package/dist/render/documentHeadings.js +20 -23
- package/dist/render/documentHeadings.js.map +1 -1
- package/dist/render/documentLinks.d.ts +2 -659
- package/dist/render/documentLinks.d.ts.map +1 -1
- package/dist/render/documentLinks.js +22 -25
- package/dist/render/documentLinks.js.map +1 -1
- package/dist/render/footnotes.d.ts +2 -18
- package/dist/render/footnotes.d.ts.map +1 -1
- package/dist/render/footnotes.js +9 -11
- package/dist/render/footnotes.js.map +1 -1
- package/dist/render/markdown.d.ts.map +1 -1
- package/dist/render/markdown.js +13 -4
- package/dist/render/markdown.js.map +1 -1
- package/dist/render/textContent.d.ts +3 -0
- package/dist/render/textContent.d.ts.map +1 -0
- package/dist/render/textContent.js +7 -0
- package/dist/render/textContent.js.map +1 -0
- package/dist/search/collector.d.ts +2 -8
- package/dist/search/collector.d.ts.map +1 -1
- package/dist/search/collector.js +29 -25
- package/dist/search/collector.js.map +1 -1
- package/dist/search/entries.d.ts.map +1 -1
- package/dist/search/entries.js +7 -3
- package/dist/search/entries.js.map +1 -1
- package/dist/search/linkCollector.d.ts +2 -7
- package/dist/search/linkCollector.d.ts.map +1 -1
- package/dist/search/linkCollector.js +12 -13
- package/dist/search/linkCollector.js.map +1 -1
- package/package.json +10 -1
- package/src/cli.ts +1 -1
- package/src/page/diagrams.ts +1 -0
- package/src/render/code.ts +29 -19
- package/src/render/documentHeadings.ts +21 -23
- package/src/render/documentLinks.ts +23 -25
- package/src/render/footnotes.ts +11 -14
- package/src/render/markdown.ts +17 -4
- package/src/render/textContent.ts +8 -0
- package/src/search/collector.ts +30 -27
- package/src/search/entries.ts +7 -3
- package/src/search/linkCollector.ts +13 -13
package/CHANGELOG.md
CHANGED
|
@@ -4,8 +4,26 @@
|
|
|
4
4
|
|
|
5
5
|
### Changed
|
|
6
6
|
|
|
7
|
+
- Prepare concrete step 11 visual-document source examples for discussion; the
|
|
8
|
+
proposed block conventions are not implemented or approved yet.
|
|
7
9
|
- Record the approved Platform-first live client direction and its actual shared HTTP/browser fixture evidence; Work Board adopts that foundation in 0.5.0 below.
|
|
8
10
|
|
|
11
|
+
## 0.6.1 - 2026-10-06
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- Adopt Antumbra's `react-markdown` and `remark-gfm` rendering stack on the
|
|
16
|
+
server, retaining no-JavaScript reading, local links/images, generated heading
|
|
17
|
+
anchors, scoped footnotes, raw-HTML details and Shiki highlighting. Search uses
|
|
18
|
+
the same Markdown/GFM processing and heading rules as the reader. Rendering
|
|
19
|
+
and search plugins now use unified transformers rather than Satteri visitors;
|
|
20
|
+
Satteri remains only for legacy heading-board source segmentation.
|
|
21
|
+
- Match Antumbra's Mermaid error-rendering setting so parse failures show a local
|
|
22
|
+
diagnostic/source without inserting Mermaid's global error diagram. Existing
|
|
23
|
+
local assets, strict rendering and visual inspection remain available.
|
|
24
|
+
- Keep the custom step 11 metric/progress/timeline source-format proposal open;
|
|
25
|
+
the renderer adoption does not settle that authoring contract.
|
|
26
|
+
|
|
9
27
|
## 0.6.0 - 2026-10-06
|
|
10
28
|
|
|
11
29
|
### Added
|
package/README.md
CHANGED
|
@@ -394,3 +394,11 @@ sets the waves, acceptance criteria, and open design decisions.
|
|
|
394
394
|
[Experience designs and mockups](https://github.com/ShivaeDev/platform/blob/main/packages/work-board/docs/vision/experience.md)
|
|
395
395
|
illustrate the target with fictional data. These are future plans; the sections
|
|
396
396
|
above describe the package's current behavior.
|
|
397
|
+
|
|
398
|
+
### Markdown rendering
|
|
399
|
+
|
|
400
|
+
Work Board uses Antumbra's `react-markdown` and `remark-gfm` libraries for
|
|
401
|
+
server-rendered Markdown, with locally served Mermaid for ordinary `mermaid`
|
|
402
|
+
fences. Existing local links, images, heading anchors, footnotes, raw-HTML details
|
|
403
|
+
and Shiki code highlighting remain available without React client state. Mermaid
|
|
404
|
+
rendering and inspection need JavaScript; its source remains readable without it.
|
package/dist/cli.js
CHANGED
|
@@ -3,7 +3,7 @@ import { NodeRuntime, NodeServices } from "@effect/platform-node";
|
|
|
3
3
|
import { Effect, Layer, Option, Path } from "effect";
|
|
4
4
|
import { Argument, Command, Flag } from "effect/unstable/cli";
|
|
5
5
|
import { HOST, serveBoard } from "./serve.js";
|
|
6
|
-
const VERSION = "0.6.
|
|
6
|
+
const VERSION = "0.6.1";
|
|
7
7
|
const serve = Effect.fn("WorkBoard.serve")(function* (input) {
|
|
8
8
|
const path = yield* Path.Path;
|
|
9
9
|
return yield* Layer.launch(serveBoard({ home: Option.getOrUndefined(input.home), port: input.port, root: path.resolve(input.dir) }));
|
package/dist/page/diagrams.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
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";
|
|
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 suppressErrorRendering: true,\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,+tGAuFpB,CAAC"}
|
package/dist/page/diagrams.js
CHANGED
|
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuFvB,CAAC"}
|
package/dist/render/code.d.ts
CHANGED
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Root } from "hast";
|
|
2
2
|
import { type Highlighter as Shiki } from "shiki";
|
|
3
|
-
export declare const codeBlocks: (highlighter: Shiki) =>
|
|
4
|
-
element: {
|
|
5
|
-
filter: string[];
|
|
6
|
-
visit: (pre: Readonly<Element>) => Promise<import("hast").RootContent | undefined>;
|
|
7
|
-
};
|
|
8
|
-
name: string;
|
|
9
|
-
};
|
|
3
|
+
export declare const codeBlocks: (highlighter: Shiki) => () => (tree: Root) => Promise<void>;
|
|
10
4
|
//# sourceMappingURL=code.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../../src/render/code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../../src/render/code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,IAAI,EAAE,MAAM,MAAM,CAAC;AAC1D,OAAO,EAA0C,KAAK,WAAW,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC;AA+C1F,eAAO,MAAM,UAAU,GAAI,aAAa,KAAK,YAAkB,MAAM,IAAI,kBAexE,CAAC"}
|
package/dist/render/code.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineHastPlugin } from "satteri";
|
|
2
1
|
import { bundledLanguages } from "shiki";
|
|
2
|
+
import { visit as visitElements } from "unist-util-visit";
|
|
3
3
|
import { THEMES } from "./highlighter.js";
|
|
4
4
|
const languageOf = (code) => {
|
|
5
5
|
const classes = code.properties.className;
|
|
@@ -26,22 +26,30 @@ const highlighted = async (highlighter, source, language) => {
|
|
|
26
26
|
await highlighter.loadLanguage(language);
|
|
27
27
|
return highlighter.codeToHast(source, { defaultColor: false, lang: language, themes: THEMES }).children.at(0);
|
|
28
28
|
};
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
29
|
+
async function renderedCode(highlighter, pre) {
|
|
30
|
+
const [code] = pre.children;
|
|
31
|
+
if (code?.type !== "element" || code.tagName !== "code") {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
const language = languageOf(code);
|
|
35
|
+
const source = textOf(code);
|
|
36
|
+
if (language === "mermaid") {
|
|
37
|
+
return diagram(source);
|
|
38
|
+
}
|
|
39
|
+
return language === undefined ? undefined : await highlighted(highlighter, source, language);
|
|
40
|
+
}
|
|
41
|
+
export const codeBlocks = (highlighter) => () => async (tree) => {
|
|
42
|
+
const work = [];
|
|
43
|
+
visitElements(tree, "element", (pre, index, parent) => {
|
|
44
|
+
if (pre.tagName !== "pre" || index === undefined || parent === undefined) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
work.push(renderedCode(highlighter, pre).then((result) => {
|
|
48
|
+
if (result?.type === "element") {
|
|
49
|
+
parent.children[index] = result;
|
|
41
50
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
});
|
|
51
|
+
}));
|
|
52
|
+
});
|
|
53
|
+
await Promise.all(work);
|
|
54
|
+
};
|
|
47
55
|
//# sourceMappingURL=code.js.map
|
package/dist/render/code.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/render/code.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/render/code.ts"],"names":[],"mappings":"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"}
|