@shivaedev/work-board 0.6.0 → 0.7.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.
Files changed (81) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +18 -0
  3. package/dist/cli.js +1 -1
  4. package/dist/page/diagrams.d.ts +1 -1
  5. package/dist/page/diagrams.d.ts.map +1 -1
  6. package/dist/page/diagrams.js +1 -0
  7. package/dist/page/diagrams.js.map +1 -1
  8. package/dist/page/style.d.ts.map +1 -1
  9. package/dist/page/style.js +25 -1
  10. package/dist/page/style.js.map +1 -1
  11. package/dist/render/board.d.ts.map +1 -1
  12. package/dist/render/board.js +5 -2
  13. package/dist/render/board.js.map +1 -1
  14. package/dist/render/callouts.d.ts +3 -0
  15. package/dist/render/callouts.d.ts.map +1 -0
  16. package/dist/render/callouts.js +27 -0
  17. package/dist/render/callouts.js.map +1 -0
  18. package/dist/render/code.d.ts +2 -8
  19. package/dist/render/code.d.ts.map +1 -1
  20. package/dist/render/code.js +26 -18
  21. package/dist/render/code.js.map +1 -1
  22. package/dist/render/documentHeadings.d.ts +2 -658
  23. package/dist/render/documentHeadings.d.ts.map +1 -1
  24. package/dist/render/documentHeadings.js +20 -23
  25. package/dist/render/documentHeadings.js.map +1 -1
  26. package/dist/render/documentLinks.d.ts +2 -659
  27. package/dist/render/documentLinks.d.ts.map +1 -1
  28. package/dist/render/documentLinks.js +22 -25
  29. package/dist/render/documentLinks.js.map +1 -1
  30. package/dist/render/footnotes.d.ts +2 -18
  31. package/dist/render/footnotes.d.ts.map +1 -1
  32. package/dist/render/footnotes.js +9 -11
  33. package/dist/render/footnotes.js.map +1 -1
  34. package/dist/render/markdown.d.ts.map +1 -1
  35. package/dist/render/markdown.js +16 -4
  36. package/dist/render/markdown.js.map +1 -1
  37. package/dist/render/textContent.d.ts +3 -0
  38. package/dist/render/textContent.d.ts.map +1 -0
  39. package/dist/render/textContent.js +7 -0
  40. package/dist/render/textContent.js.map +1 -0
  41. package/dist/render/visual.d.ts +3 -0
  42. package/dist/render/visual.d.ts.map +1 -0
  43. package/dist/render/visual.js +90 -0
  44. package/dist/render/visual.js.map +1 -0
  45. package/dist/render/visualDocuments.d.ts +5 -0
  46. package/dist/render/visualDocuments.d.ts.map +1 -0
  47. package/dist/render/visualDocuments.js +57 -0
  48. package/dist/render/visualDocuments.js.map +1 -0
  49. package/dist/render/visualFields.d.ts +12 -0
  50. package/dist/render/visualFields.d.ts.map +1 -0
  51. package/dist/render/visualFields.js +13 -0
  52. package/dist/render/visualFields.js.map +1 -0
  53. package/dist/search/collector.d.ts +2 -8
  54. package/dist/search/collector.d.ts.map +1 -1
  55. package/dist/search/collector.js +29 -25
  56. package/dist/search/collector.js.map +1 -1
  57. package/dist/search/entries.d.ts.map +1 -1
  58. package/dist/search/entries.js +10 -3
  59. package/dist/search/entries.js.map +1 -1
  60. package/dist/search/linkCollector.d.ts +2 -7
  61. package/dist/search/linkCollector.d.ts.map +1 -1
  62. package/dist/search/linkCollector.js +12 -13
  63. package/dist/search/linkCollector.js.map +1 -1
  64. package/package.json +13 -2
  65. package/src/cli.ts +1 -1
  66. package/src/page/diagrams.ts +1 -0
  67. package/src/page/style.ts +26 -1
  68. package/src/render/board.ts +5 -2
  69. package/src/render/callouts.ts +29 -0
  70. package/src/render/code.ts +29 -19
  71. package/src/render/documentHeadings.ts +21 -23
  72. package/src/render/documentLinks.ts +23 -25
  73. package/src/render/footnotes.ts +11 -14
  74. package/src/render/markdown.ts +20 -4
  75. package/src/render/textContent.ts +8 -0
  76. package/src/render/visual.ts +100 -0
  77. package/src/render/visualDocuments.ts +68 -0
  78. package/src/render/visualFields.ts +17 -0
  79. package/src/search/collector.ts +30 -27
  80. package/src/search/entries.ts +10 -3
  81. package/src/search/linkCollector.ts +13 -13
package/CHANGELOG.md CHANGED
@@ -6,6 +6,41 @@
6
6
 
7
7
  - 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
8
 
9
+ ## 0.7.0 - 2026-10-06
10
+
11
+ ### Added
12
+
13
+ - Read-only metric, progress and authored timeline Markdown directives parsed by
14
+ `remark-directive` and validated with Effect Schema. Keep Markdown labels/source
15
+ links, explicit unknown values and native labeled progress with text alternatives.
16
+ Retain invalid/unsupported source with diagnostics and bound each component to
17
+ 64 KiB and each timeline to 100 entries. Nested composition remains deferred.
18
+ - GitHub NOTE/TIP/IMPORTANT/WARNING/CAUTION callouts, with comparisons remaining
19
+ ordinary GFM tables. The project brief uses the agreed source conventions.
20
+
21
+ ### Changed
22
+
23
+ - Use the same remark parser/directive grammar for legacy board segmentation,
24
+ rendering and search; remove Satteri. Headings inside directive containers do
25
+ not become board columns. Keep native live/history ownership and local-only
26
+ reading without source writes or acceptance inference.
27
+
28
+ ## 0.6.1 - 2026-10-06
29
+
30
+ ### Changed
31
+
32
+ - Adopt Antumbra's `react-markdown` and `remark-gfm` rendering stack on the
33
+ server, retaining no-JavaScript reading, local links/images, generated heading
34
+ anchors, scoped footnotes, raw-HTML details and Shiki highlighting. Search uses
35
+ the same Markdown/GFM processing and heading rules as the reader. Rendering
36
+ and search plugins now use unified transformers rather than Satteri visitors;
37
+ Satteri remains only for legacy heading-board source segmentation.
38
+ - Match Antumbra's Mermaid error-rendering setting so parse failures show a local
39
+ diagnostic/source without inserting Mermaid's global error diagram. Existing
40
+ local assets, strict rendering and visual inspection remain available.
41
+ - Keep the custom step 11 metric/progress/timeline source-format proposal open;
42
+ the renderer adoption does not settle that authoring contract.
43
+
9
44
  ## 0.6.0 - 2026-10-06
10
45
 
11
46
  ### Added
package/README.md CHANGED
@@ -394,3 +394,21 @@ 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.
405
+
406
+ ### Visual document directives
407
+
408
+ Use `:::metric{value="50" unit="documents"}`, `:::progress{completed="3" total="8"}`
409
+ and `:::timeline` containers with Markdown labels and linked sources. Components
410
+ render on the server and remain readable without JavaScript. Unknown counts stay
411
+ unknown, invalid components retain their source with a diagnostic, and timelines
412
+ preserve authored order. Recorded values do not establish verified acceptance.
413
+ See [the complete source conventions](./docs/vision/delivery/visual-document-examples.md).
414
+ GitHub alert blockquotes render as callouts; comparisons remain ordinary GFM tables.
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.0";
6
+ const VERSION = "0.7.0";
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) }));
@@ -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,4rGAsFpB,CAAC"}
1
+ {"version":3,"file":"diagrams.d.ts","sourceRoot":"","sources":["../../src/page/diagrams.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,+tGAuFpB,CAAC"}
@@ -11,6 +11,7 @@ const load = async () => {
11
11
  mermaid ??= (await import("/_board/mermaid/mermaid.esm.min.mjs")).default;
12
12
  mermaid.initialize({
13
13
  startOnLoad: false,
14
+ suppressErrorRendering: true,
14
15
  securityLevel: "strict",
15
16
  theme: "base",
16
17
  themeVariables: {
@@ -1 +1 @@
1
- {"version":3,"file":"diagrams.js","sourceRoot":"","sources":["../../src/page/diagrams.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFvB,CAAC"}
1
+ {"version":3,"file":"diagrams.js","sourceRoot":"","sources":["../../src/page/diagrams.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuFvB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AA4DA,eAAO,MAAM,KAAK,QAC0H,CAAC"}
1
+ {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AA0EA,eAAO,MAAM,KAAK,QAYN,CAAC"}
@@ -54,5 +54,29 @@ figure.diagram[data-state="failed"] .diagram-source { display: block; }
54
54
  [data-diagram-error] { color: var(--danger); font-size: 0.875em; }
55
55
  @media (prefers-reduced-motion: reduce) { * { transition: none !important; animation: none !important; } }
56
56
  `;
57
- export const style = theme + layout + prose + board + diagrams + readingStyles() + searchStyles + metadataStyles + workStyle() + attentionStyle() + visualStyles;
57
+ const documents = `
58
+ .visual-document, .visual-callout { border: 1px solid var(--border); border-radius: 12px; padding: 1em 1.2em; margin: 1.2em 0; overflow-wrap: anywhere; }
59
+ .visual-document > :last-child, .visual-callout > :last-child { margin-bottom: 0; }
60
+ .visual-label { font-weight: 650; margin-top: 0; }
61
+ .visual-value { font-size: 1.35em; font-variant-numeric: tabular-nums; }
62
+ .visual-document progress { display: block; width: 100%; height: 1em; accent-color: var(--link); }
63
+ .visual-timeline-entries { border-left: 2px solid var(--border); padding-left: 1.6em; }
64
+ .visual-timeline-entries > li { padding: .3em 0 .7em .2em; }
65
+ .visual-callout { border-left: 4px solid var(--link); background: var(--surface); }
66
+ .visual-warning, .visual-caution { border-left-color: #b97720; }
67
+ .visual-diagnostic { font-weight: 600; color: var(--muted); }
68
+ @media print { .visual-document, .visual-callout { break-inside: avoid; } }
69
+ `;
70
+ export const style = theme
71
+ + layout
72
+ + prose
73
+ + board
74
+ + diagrams
75
+ + readingStyles()
76
+ + searchStyles
77
+ + metadataStyles
78
+ + workStyle()
79
+ + attentionStyle()
80
+ + visualStyles
81
+ + documents;
58
82
  //# sourceMappingURL=style.js.map
@@ -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,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"}
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,SAAS,GAAG;;;;;;;;;;;;CAYjB,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GACjB,KAAK;MACH,MAAM;MACN,KAAK;MACL,KAAK;MACL,QAAQ;MACR,aAAa,EAAE;MACf,YAAY;MACZ,cAAc;MACd,SAAS,EAAE;MACX,cAAc,EAAE;MAChB,YAAY;MACZ,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../../src/render/board.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,OAAO;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,KAAK;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AA0CD,eAAO,MAAM,OAAO,GAAI,QAAQ,MAAM,KAAG,KAexC,CAAC;AAEF,MAAM,WAAW,KAAK;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,KAAK,KAAG,SAAS,KAAK,EAC2E,CAAC"}
1
+ {"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../../src/render/board.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,OAAO;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,KAAK;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AA0CD,eAAO,MAAM,OAAO,GAAI,QAAQ,MAAM,KAAG,KAexC,CAAC;AAEF,MAAM,WAAW,KAAK;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,KAAK,KAAG,SAAS,KAAK,EAC2E,CAAC"}
@@ -1,4 +1,7 @@
1
- import { markdownToMdast } from "satteri";
1
+ import remarkDirective from "remark-directive";
2
+ import remarkGfm from "remark-gfm";
3
+ import remarkParse from "remark-parse";
4
+ import { unified } from "unified";
2
5
  const textOf = (node) => {
3
6
  if ("value" in node) {
4
7
  return node.value;
@@ -36,7 +39,7 @@ const place = (draft, node, source, closing) => {
36
39
  const joined = (blocks) => blocks.join("\n\n");
37
40
  export const boardOf = (source) => {
38
41
  const draft = { definitions: [], footer: undefined, intro: [], sections: [], title: "" };
39
- const root = markdownToMdast(source);
42
+ const root = unified().use(remarkParse).use(remarkGfm).use(remarkDirective).parse(source);
40
43
  const nodes = root.type === "root" ? root.children : [];
41
44
  const lastHeading = nodes.findLastIndex((node) => node.type === "heading");
42
45
  nodes.forEach((node, index) => {
@@ -1 +1 @@
1
- {"version":3,"file":"board.js","sourceRoot":"","sources":["../../src/render/board.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"board.js","sourceRoot":"","sources":["../../src/render/board.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Root } from "mdast";
2
+ export declare function callouts(): (tree: Root) => void;
3
+ //# sourceMappingURL=callouts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callouts.d.ts","sourceRoot":"","sources":["../../src/render/callouts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAKlC,wBAAgB,QAAQ,KACG,MAAM,IAAI,UAsBpC"}
@@ -0,0 +1,27 @@
1
+ import { visit as visitNodes } from "unist-util-visit";
2
+ const alerts = new Set(["NOTE", "TIP", "IMPORTANT", "WARNING", "CAUTION"]);
3
+ export function callouts() {
4
+ return function transform(tree) {
5
+ visitNodes(tree, "blockquote", (node) => {
6
+ const [first] = node.children;
7
+ const text = first?.type === "paragraph" ? first.children.at(0) : undefined;
8
+ if (text?.type !== "text") {
9
+ return;
10
+ }
11
+ const match = /^\[!(?<kind>[A-Z]+)\](?:\n|$)/u.exec(text.value);
12
+ const named = match?.groups?.kind;
13
+ if (!(named && alerts.has(named))) {
14
+ return;
15
+ }
16
+ const kind = named.toLowerCase();
17
+ text.value = text.value.slice(match?.[0].length ?? 0);
18
+ node.children.unshift({
19
+ children: [{ type: "text", value: named[0] + kind.slice(1) }],
20
+ data: { hProperties: { className: ["visual-label"] } },
21
+ type: "paragraph",
22
+ });
23
+ node.data = { ...node.data, hName: "aside", hProperties: { className: ["visual-callout", `visual-${kind}`], role: "note" } };
24
+ });
25
+ };
26
+ }
27
+ //# sourceMappingURL=callouts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callouts.js","sourceRoot":"","sources":["../../src/render/callouts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAE3E,MAAM,UAAU,QAAQ;IACvB,OAAO,SAAS,SAAS,CAAC,IAAU;QACnC,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;YACvC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC9B,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5E,IAAI,IAAI,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC3B,OAAO;YACR,CAAC;YACD,MAAM,KAAK,GAAG,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChE,MAAM,KAAK,GAAG,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC;YAClC,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACnC,OAAO;YACR,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACrB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE;gBACtD,IAAI,EAAE,WAAW;aACjB,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,gBAAgB,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;QAC9H,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC"}
@@ -1,10 +1,4 @@
1
- import type { Element } from "hast";
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,EAAE,OAAO,EAAkB,MAAM,MAAM,CAAC;AAEpD,OAAO,EAA0C,KAAK,WAAW,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC;AAiC1F,eAAO,MAAM,UAAU,GAAI,aAAa,KAAK;;;;;;CAkB1C,CAAC"}
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"}
@@ -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
- export const codeBlocks = (highlighter) => defineHastPlugin({
30
- element: {
31
- filter: ["pre"],
32
- visit: async (pre) => {
33
- const [code] = pre.children;
34
- if (code?.type !== "element" || code.tagName !== "code") {
35
- return undefined;
36
- }
37
- const language = languageOf(code);
38
- const source = textOf(code);
39
- if (language === "mermaid") {
40
- return diagram(source);
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
- return language === undefined ? undefined : await highlighted(highlighter, source, language);
43
- },
44
- },
45
- name: "work-board-code",
46
- });
51
+ }));
52
+ });
53
+ await Promise.all(work);
54
+ };
47
55
  //# sourceMappingURL=code.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/render/code.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/render/code.ts"],"names":[],"mappings":"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"}