@x12i/made-easy 0.0.0-stage → 0.1.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 (169) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +57 -2
  3. package/dist/analysis.d.ts +19 -0
  4. package/dist/analysis.d.ts.map +1 -0
  5. package/dist/analysis.js +90 -0
  6. package/dist/analysis.js.map +1 -0
  7. package/dist/build.d.ts +36 -0
  8. package/dist/build.d.ts.map +1 -0
  9. package/dist/build.js +260 -0
  10. package/dist/build.js.map +1 -0
  11. package/dist/contracts/api.d.ts +447 -0
  12. package/dist/contracts/api.d.ts.map +1 -0
  13. package/dist/contracts/api.js +152 -0
  14. package/dist/contracts/api.js.map +1 -0
  15. package/dist/contracts/blocks.d.ts +221 -0
  16. package/dist/contracts/blocks.d.ts.map +1 -0
  17. package/dist/contracts/blocks.js +392 -0
  18. package/dist/contracts/blocks.js.map +1 -0
  19. package/dist/contracts/diagnostics.d.ts +111 -0
  20. package/dist/contracts/diagnostics.d.ts.map +1 -0
  21. package/dist/contracts/diagnostics.js +122 -0
  22. package/dist/contracts/diagnostics.js.map +1 -0
  23. package/dist/contracts/index.d.ts +11 -0
  24. package/dist/contracts/index.d.ts.map +1 -0
  25. package/dist/contracts/index.js +11 -0
  26. package/dist/contracts/index.js.map +1 -0
  27. package/dist/contracts/json-schema.d.ts +5 -0
  28. package/dist/contracts/json-schema.d.ts.map +1 -0
  29. package/dist/contracts/json-schema.js +41 -0
  30. package/dist/contracts/json-schema.js.map +1 -0
  31. package/dist/contracts/recipe.d.ts +535 -0
  32. package/dist/contracts/recipe.d.ts.map +1 -0
  33. package/dist/contracts/recipe.js +380 -0
  34. package/dist/contracts/recipe.js.map +1 -0
  35. package/dist/contracts/schemas.d.ts +413 -0
  36. package/dist/contracts/schemas.d.ts.map +1 -0
  37. package/dist/contracts/schemas.js +205 -0
  38. package/dist/contracts/schemas.js.map +1 -0
  39. package/dist/draft.d.ts +157 -0
  40. package/dist/draft.d.ts.map +1 -0
  41. package/dist/draft.js +254 -0
  42. package/dist/draft.js.map +1 -0
  43. package/dist/emit-assets.d.ts +2 -0
  44. package/dist/emit-assets.d.ts.map +1 -0
  45. package/dist/emit-assets.js +27 -0
  46. package/dist/emit-assets.js.map +1 -0
  47. package/dist/index.d.ts +25 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +30 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/markdown-doc.d.ts +59 -0
  52. package/dist/markdown-doc.d.ts.map +1 -0
  53. package/dist/markdown-doc.js +187 -0
  54. package/dist/markdown-doc.js.map +1 -0
  55. package/dist/model.d.ts +54 -0
  56. package/dist/model.d.ts.map +1 -0
  57. package/dist/model.js +244 -0
  58. package/dist/model.js.map +1 -0
  59. package/dist/normalize.d.ts +63 -0
  60. package/dist/normalize.d.ts.map +1 -0
  61. package/dist/normalize.js +54 -0
  62. package/dist/normalize.js.map +1 -0
  63. package/dist/npm.d.ts +24 -0
  64. package/dist/npm.d.ts.map +1 -0
  65. package/dist/npm.js +51 -0
  66. package/dist/npm.js.map +1 -0
  67. package/dist/render/blocks.d.ts +17 -0
  68. package/dist/render/blocks.d.ts.map +1 -0
  69. package/dist/render/blocks.js +384 -0
  70. package/dist/render/blocks.js.map +1 -0
  71. package/dist/render/brief.d.ts +77 -0
  72. package/dist/render/brief.d.ts.map +1 -0
  73. package/dist/render/brief.js +62 -0
  74. package/dist/render/brief.js.map +1 -0
  75. package/dist/render/context.d.ts +43 -0
  76. package/dist/render/context.d.ts.map +1 -0
  77. package/dist/render/context.js +88 -0
  78. package/dist/render/context.js.map +1 -0
  79. package/dist/render/html.d.ts +19 -0
  80. package/dist/render/html.d.ts.map +1 -0
  81. package/dist/render/html.js +178 -0
  82. package/dist/render/html.js.map +1 -0
  83. package/dist/render/markdown-out.d.ts +11 -0
  84. package/dist/render/markdown-out.d.ts.map +1 -0
  85. package/dist/render/markdown-out.js +121 -0
  86. package/dist/render/markdown-out.js.map +1 -0
  87. package/dist/render/pdf.d.ts +23 -0
  88. package/dist/render/pdf.d.ts.map +1 -0
  89. package/dist/render/pdf.js +138 -0
  90. package/dist/render/pdf.js.map +1 -0
  91. package/dist/render/prose.d.ts +15 -0
  92. package/dist/render/prose.d.ts.map +1 -0
  93. package/dist/render/prose.js +110 -0
  94. package/dist/render/prose.js.map +1 -0
  95. package/dist/scaffold.d.ts +13 -0
  96. package/dist/scaffold.d.ts.map +1 -0
  97. package/dist/scaffold.js +393 -0
  98. package/dist/scaffold.js.map +1 -0
  99. package/dist/sdk.d.ts +56 -0
  100. package/dist/sdk.d.ts.map +1 -0
  101. package/dist/sdk.js +238 -0
  102. package/dist/sdk.js.map +1 -0
  103. package/dist/source.d.ts +57 -0
  104. package/dist/source.d.ts.map +1 -0
  105. package/dist/source.js +289 -0
  106. package/dist/source.js.map +1 -0
  107. package/dist/theme/book.d.ts +10 -0
  108. package/dist/theme/book.d.ts.map +1 -0
  109. package/dist/theme/book.js +198 -0
  110. package/dist/theme/book.js.map +1 -0
  111. package/dist/util.d.ts +14 -0
  112. package/dist/util.d.ts.map +1 -0
  113. package/dist/util.js +69 -0
  114. package/dist/util.js.map +1 -0
  115. package/dist/validate.d.ts +36 -0
  116. package/dist/validate.d.ts.map +1 -0
  117. package/dist/validate.js +986 -0
  118. package/dist/validate.js.map +1 -0
  119. package/dist/verify.d.ts +35 -0
  120. package/dist/verify.d.ts.map +1 -0
  121. package/dist/verify.js +112 -0
  122. package/dist/verify.js.map +1 -0
  123. package/dist/version.d.ts +3 -0
  124. package/dist/version.d.ts.map +1 -0
  125. package/dist/version.js +4 -0
  126. package/dist/version.js.map +1 -0
  127. package/dist/yamlfile.d.ts +22 -0
  128. package/dist/yamlfile.d.ts.map +1 -0
  129. package/dist/yamlfile.js +129 -0
  130. package/dist/yamlfile.js.map +1 -0
  131. package/package.json +64 -4
  132. package/recipes/index.json +282 -0
  133. package/recipes/shared-1.0.0.json +456 -0
  134. package/schemas/artifact.v1.json +36 -0
  135. package/schemas/assets.v1.json +61 -0
  136. package/schemas/block.v1.json +27 -0
  137. package/schemas/blocks/brief.v1.json +20 -0
  138. package/schemas/blocks/callout.v1.json +25 -0
  139. package/schemas/blocks/code.v1.json +21 -0
  140. package/schemas/blocks/decision.v1.json +80 -0
  141. package/schemas/blocks/evidence-comparison.v1.json +33 -0
  142. package/schemas/blocks/example.v1.json +52 -0
  143. package/schemas/blocks/figure.v1.json +22 -0
  144. package/schemas/blocks/human-action.v1.json +42 -0
  145. package/schemas/blocks/job-map.v1.json +170 -0
  146. package/schemas/blocks/pause.v1.json +25 -0
  147. package/schemas/blocks/reference-profile.v1.json +41 -0
  148. package/schemas/blocks/review-checklist.v1.json +19 -0
  149. package/schemas/blocks/table.v1.json +59 -0
  150. package/schemas/brief.v1.json +157 -0
  151. package/schemas/build-request.v1.json +173 -0
  152. package/schemas/build-result.v1.json +171 -0
  153. package/schemas/checks.v1.json +149 -0
  154. package/schemas/create-request.v1.json +47 -0
  155. package/schemas/diagnostic.v1.json +50 -0
  156. package/schemas/draft-request.v1.json +196 -0
  157. package/schemas/guide.v1.json +172 -0
  158. package/schemas/job.v1.json +107 -0
  159. package/schemas/preview-request.v1.json +153 -0
  160. package/schemas/preview-result.v1.json +84 -0
  161. package/schemas/problem.v1.json +78 -0
  162. package/schemas/recipe-definition.v1.json +673 -0
  163. package/schemas/source-ref.v1.json +111 -0
  164. package/schemas/sources.v1.json +158 -0
  165. package/schemas/validate-request.v1.json +135 -0
  166. package/schemas/validate-result.v1.json +110 -0
  167. package/schemas/verification.v1.json +77 -0
  168. package/themes/book/1.0.0/theme.css +190 -0
  169. package/themes/book/1.0.0/theme.json +5 -0
@@ -0,0 +1,10 @@
1
+ export declare const BOOK_THEME: {
2
+ readonly id: "book";
3
+ readonly version: "1.0.0";
4
+ };
5
+ /**
6
+ * Versioned "book" theme: cover, chapter headings, typography, navigation, code and print styles.
7
+ * Self-contained: system font stacks, no network requests, no scripts.
8
+ */
9
+ export declare const BOOK_THEME_CSS = "\n:root{\n --ink:#1b1f24;--paper:#fffdf8;--muted:#4f5864;--rule:#d9d3c5;--accent:#1f4e79;--accent-soft:#e7eef6;\n --code-bg:#f3f0e8;--ok:#14532d;--ok-bg:#e6f4ea;--warn:#7a4a00;--warn-bg:#fdf1d8;--bad:#8a1c1c;--bad-bg:#fbe6e6;\n --focus:#b45309;--radius:6px;\n --serif:Georgia,\"Iowan Old Style\",\"Palatino Linotype\",Palatino,\"Times New Roman\",serif;\n --sans:system-ui,-apple-system,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,sans-serif;\n --mono:ui-monospace,SFMono-Regular,Consolas,\"Liberation Mono\",Menlo,monospace;\n}\n*{box-sizing:border-box}\nhtml{-webkit-text-size-adjust:100%;scroll-padding-top:1rem}\nbody{margin:0;background:var(--paper);color:var(--ink);font:1.0625rem/1.65 var(--serif);counter-reset:chapter appendix}\na{color:var(--accent);text-underline-offset:.15em}\na:hover{text-decoration-thickness:2px}\n:focus-visible{outline:3px solid var(--focus);outline-offset:2px;border-radius:2px}\n.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n.skip-link{position:absolute;left:.5rem;top:-4rem;background:var(--ink);color:#fff;padding:.5rem .8rem;z-index:10;border-radius:var(--radius);font:600 .9rem var(--sans)}\n.skip-link:focus{top:.5rem}\ncode,pre,kbd{font-family:var(--mono);font-size:.9em}\ncode{background:var(--code-bg);padding:.08em .3em;border-radius:3px;overflow-wrap:anywhere}\npre.code{background:var(--code-bg);border:1px solid var(--rule);border-left:4px solid var(--accent);padding:.8rem 1rem;overflow:auto;border-radius:var(--radius);line-height:1.45;white-space:pre;max-width:100%}\npre.code code{background:none;padding:0;font-size:.85rem;overflow-wrap:normal}\n.draft-banner{background:var(--warn-bg);color:var(--warn);border-bottom:3px solid var(--warn);padding:.6rem 1rem;font:700 .9rem var(--sans);text-align:center;letter-spacing:.02em}\n.draft-watermark{display:none}\n\n/* cover */\n.cover{padding:4.5rem 1.5rem 3rem;border-bottom:6px double var(--rule);background:linear-gradient(180deg,var(--accent-soft),var(--paper))}\n.cover-inner{max-width:52rem;margin:0 auto}\n.kicker{font:700 .8rem var(--sans);letter-spacing:.14em;text-transform:uppercase;color:var(--accent);margin:0 0 1rem}\n.cover h1{font:700 clamp(2.2rem,6vw,3.6rem)/1.08 var(--serif);margin:0 0 .6rem;letter-spacing:-.01em}\n.cover .subtitle{font:1.3rem/1.4 var(--serif);color:var(--muted);margin:0 0 2rem}\n.cover-meta{display:grid;grid-template-columns:max-content 1fr;gap:.3rem 1.2rem;font:.9rem/1.5 var(--sans);margin:0}\n.cover-meta dt{font-weight:700;color:var(--muted)}\n.cover-meta dd{margin:0;overflow-wrap:anywhere}\n\n/* layout & navigation */\n.layout{display:grid;grid-template-columns:minmax(0,1fr);gap:0;max-width:72rem;margin:0 auto;padding:0 1.25rem}\n.toc{font:.92rem/1.45 var(--sans);padding:1.5rem 0;border-bottom:1px solid var(--rule)}\n.toc-title{font-weight:700;text-transform:uppercase;letter-spacing:.1em;font-size:.75rem;color:var(--muted);margin:0 0 .6rem}\n.toc ol{margin:0;padding-left:1.25rem}\n.toc li{margin:.25rem 0}\n.toc .toc-sub{font-size:.85rem;color:var(--muted)}\n.toc a{text-decoration:none}\n.toc a:hover,.toc a:focus-visible{text-decoration:underline}\n.toc .toc-other{margin-top:.8rem;padding-top:.6rem;border-top:1px dashed var(--rule);list-style:none;margin-left:-1.25rem}\nmain{padding:1.5rem 0 3rem;min-width:0}\nmain:focus{outline:none}\n@media (min-width:62rem){\n .layout{grid-template-columns:16rem minmax(0,1fr);gap:3rem}\n .toc{position:sticky;top:0;align-self:start;max-height:100vh;overflow:auto;border-bottom:0;border-right:1px solid var(--rule);padding:2rem 1rem 2rem 0}\n main{padding:2.5rem 0 4rem}\n}\n\n/* chapters */\n.chapter{margin:0 0 4rem;max-width:46rem}\n.chapter>header .chapter-no{font:700 .8rem var(--sans);letter-spacing:.14em;text-transform:uppercase;color:var(--accent);margin:0}\n.chapter>header .chapter-no::before{counter-increment:chapter;content:\"Chapter \" counter(chapter)}\n.appendix>header .chapter-no::before{counter-increment:appendix;content:\"Appendix \" counter(appendix,upper-alpha)}\n.chapter h2{font:700 2rem/1.2 var(--serif);margin:.2rem 0 1rem;border-bottom:2px solid var(--ink);padding-bottom:.4rem}\n.chapter h3{font:700 1.35rem/1.3 var(--serif);margin:2rem 0 .6rem}\n.chapter h4{font:700 1.05rem/1.3 var(--sans);margin:1.4rem 0 .5rem}\n.chapter h5{font:700 .95rem/1.3 var(--sans);margin:1rem 0 .3rem;color:var(--muted)}\n.chapter .anchor{font-size:.7em;margin-left:.3em;text-decoration:none;opacity:.35}\n.chapter :is(h2,h3,h4):hover .anchor,.chapter .anchor:focus-visible{opacity:1}\n.chapter p{margin:.7rem 0}\n.chapter ul,.chapter ol{padding-left:1.5rem}\n.chapter li{margin:.25rem 0}\n.back-to-top{font:.8rem var(--sans);margin-top:2rem}\nimg{max-width:100%;height:auto}\nfigure{margin:1.2rem 0}\nfigcaption{font:.88rem/1.4 var(--sans);color:var(--muted);margin:.3rem 0}\n.table-wrap{overflow-x:auto;margin:1rem 0;max-width:100%}\ntable{border-collapse:collapse;width:100%;font:.92rem/1.45 var(--sans)}\ncaption{text-align:left;font-weight:700;padding:.3rem 0}\nth,td{border:1px solid var(--rule);padding:.45rem .6rem;vertical-align:top;text-align:left}\nthead th{background:var(--accent-soft);border-bottom:2px solid var(--accent)}\ntbody th{background:#faf8f2;font-weight:600}\ntd.align-right,th.align-right{text-align:right}td.align-center,th.align-center{text-align:center}\n.sub{display:block;font:.85rem/1.4 var(--sans);color:var(--muted)}\n.empty{color:var(--muted);font-style:italic}\nmark.placeholder{background:#fff3bf;color:#5c4400;border:1px dashed #b88700;padding:0 .25em;border-radius:3px;font-family:var(--sans);font-size:.88em}\n.ref{font-family:var(--sans);font-size:.88em}\n.ref-unresolved{background:var(--bad-bg);color:var(--bad);border:1px solid var(--bad);padding:0 .25em;border-radius:3px}\n.tag{display:inline-block;font:700 .72rem var(--sans);letter-spacing:.04em;text-transform:uppercase;border:1px solid currentColor;border-radius:999px;padding:.05rem .5rem;color:var(--muted);vertical-align:middle}\n.tag.verified{color:var(--ok)}.tag.unverified{color:var(--warn)}\n\n/* blocks */\n.block{border:1px solid var(--rule);border-left:5px solid var(--accent);border-radius:var(--radius);background:#fff;padding:.9rem 1.1rem 1rem;margin:1.4rem 0;font:1rem/1.55 var(--sans)}\n.block>.block-kicker{font:700 .72rem var(--sans);letter-spacing:.14em;text-transform:uppercase;color:var(--accent);margin:.1rem 0 .5rem}\n.block h4{margin-top:1rem}\n.block ul,.block ol{margin:.4rem 0}\n.facts{margin:.3rem 0;display:grid;gap:.5rem}\n.fact{display:grid;grid-template-columns:minmax(8rem,12rem) 1fr;gap:.2rem 1rem}\n.fact dt{font-weight:700;color:var(--muted);font-size:.9rem}\n.fact dd{margin:0}\n.fact dd ul{margin:0;padding-left:1.1rem}\n@media (max-width:40rem){.fact{grid-template-columns:1fr}}\n.options>li{margin:.7rem 0;padding:.5rem .7rem;background:#faf8f2;border-radius:var(--radius);border:1px solid var(--rule);list-style-position:inside}\n.option-head{display:inline}\n.options p{margin:.25rem 0}\n.evidence{font-size:.88rem;margin:.4rem 0}\n.evidence-links{display:inline;list-style:none;padding:0;margin:0}\n.evidence-links li{display:inline;margin:0 .6rem 0 0}\n.decision{border-left-color:var(--accent)}\n.job-map{border-left-color:#4b6b3a}\n.jm-grid{display:grid;grid-template-columns:1fr 1.6fr 1fr;gap:1rem}\n@media (max-width:48rem){.jm-grid{grid-template-columns:1fr}}\n.jm-col{background:#faf8f2;border:1px solid var(--rule);border-radius:var(--radius);padding:.2rem .9rem .6rem;min-width:0}\n.jm-col ul,.jm-col ol{padding-left:1.1rem}\n.actor{display:inline-block;font:700 .7rem var(--sans);text-transform:uppercase;letter-spacing:.06em;padding:.05rem .45rem;border-radius:3px;border:1.5px solid var(--ink);margin-right:.3rem}\n.actor-human{background:var(--ink);color:#fff}\n.actor-operator{background:#fff;color:var(--ink)}\n.actor-system{background:#fff;color:var(--ink);border-style:dashed}\n.text-equivalent{margin-top:1rem;padding-top:.6rem;border-top:1px dashed var(--rule);font-size:.92rem}\n.human-action{border-left-color:#7a4a00}\n.human-action.kind-delegated{border-left-style:dashed}\n.pause{border-left-color:var(--bad);background:#fffafa}\n.pause>.block-kicker{color:var(--bad)}\n.brief{border-left-color:#5b3a8c}\n.brief>.block-kicker{color:#5b3a8c}\n.brief-panes{display:grid;grid-template-columns:1fr 1fr;gap:1rem}\n@media (max-width:48rem){.brief-panes{grid-template-columns:1fr}}\n.brief-pane{background:#faf8f2;border:1px solid var(--rule);border-radius:var(--radius);padding:.2rem .9rem .7rem;min-width:0}\n.brief-pane .fact{grid-template-columns:1fr}\n.brief-cols{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem}\n@media (max-width:48rem){.brief-cols{grid-template-columns:1fr}}\n.reference-pin{margin-top:1rem;padding:.2rem .9rem .7rem;border:2px solid #5b3a8c;border-radius:var(--radius)}\n.review-checklist{border-left-color:#14532d}\n.checklist{list-style:none;padding:0!important}\n.checklist li{display:grid;grid-template-columns:2rem 1fr;gap:.4rem;margin:.7rem 0;break-inside:avoid}\n.checklist .box{font-size:1.5rem;line-height:1}\n.checklist p{margin:.1rem 0}\n.compare{display:grid;grid-template-columns:1fr 1fr;gap:1rem;align-items:start}\n@media (max-width:62rem){.compare{grid-template-columns:1fr}}\n.result{border:2px solid var(--ink);border-radius:var(--radius);padding:.2rem .9rem .8rem;background:#fff;min-width:0}\n.result-flawed{border-style:dashed}\n.result>header{display:flex;flex-wrap:wrap;justify-content:space-between;gap:.5rem;align-items:baseline}\n.result h4{margin:.8rem 0 .3rem}\n.verdict{font:800 .9rem var(--sans);letter-spacing:.06em;text-transform:uppercase;margin:.8rem 0 .3rem;border:2px solid currentColor;border-radius:3px;padding:.1rem .6rem}\n.verdict-usable{color:var(--ok);background:var(--ok-bg)}.verdict-partial{color:var(--warn);background:var(--warn-bg)}.verdict-invalid{color:var(--bad);background:var(--bad-bg)}\n.check-results th,.check-results td{font-size:.85rem}\n.outcome{font-weight:800;white-space:nowrap;letter-spacing:.02em}\n.outcome-pass{color:var(--ok)}.outcome-fail{color:var(--bad)}.outcome-missing{color:var(--warn)}.outcome-contradictory{color:var(--bad)}\ntr.outcome-fail td:first-of-type,tr.outcome-contradictory td:first-of-type{background:var(--bad-bg)}\ntr.outcome-missing td:first-of-type{background:var(--warn-bg)}\ntr.outcome-pass td:first-of-type{background:var(--ok-bg)}\ntr.decisive th{box-shadow:inset 4px 0 0 var(--ink)}\n.recovery{border-top:1px dashed var(--rule);padding-top:.5rem}\n.callout{border-left-width:5px;font:1rem/1.55 var(--sans)}\n.callout-title{margin:0 0 .3rem;font-weight:700}\n.callout-label{text-transform:uppercase;letter-spacing:.08em;font-size:.75rem;border:1.5px solid currentColor;padding:.05rem .4rem;border-radius:3px}\n.callout-info{border-left-color:var(--accent);background:var(--accent-soft)}\n.callout-success{border-left-color:var(--ok);background:var(--ok-bg)}\n.callout-warning,.callout-exception{border-left-color:var(--warn);background:var(--warn-bg)}\n.callout-risk{border-left-color:var(--bad);background:var(--bad-bg)}\n.callout-exception{border-left-style:dashed}\n.example{border-left-color:#0f5f5f}\n.profile .fact{grid-template-columns:minmax(9rem,14rem) 1fr}\n.appendix .claim,.appendix .source,.appendix .check{border-top:1px solid var(--rule);padding:.6rem 0}\n.appendix h3{font-size:1.15rem}\n.status-unresolved{color:var(--bad)}.status-supported{color:var(--ok)}\n.colophon{max-width:72rem;margin:0 auto;padding:1.5rem 1.25rem 3rem;border-top:1px solid var(--rule);font:.82rem/1.5 var(--sans);color:var(--muted)}\n.colophon code{font-size:.8rem}\n\n/* print */\n@media print{\n html{scroll-padding-top:0}\n body{background:#fff;font-size:10.5pt;line-height:1.5}\n .skip-link,.toc,.back-to-top,.anchor{display:none!important}\n .layout{display:block;padding:0;max-width:none}\n .cover{min-height:92vh;padding:6rem 1rem 2rem;background:#fff;border-bottom:0;break-after:page;display:flex;align-items:center}\n .cover-inner{max-width:none}\n .chapter{max-width:none;margin:0;break-before:page}\n .chapter:first-of-type{break-before:auto}\n .chapter h2,.chapter h3,.chapter h4,.chapter h5{break-after:avoid}\n .block,.result,.options>li,.jm-col,.callout,figure,.checklist li{break-inside:avoid}\n .block.example,.block.brief,.block.job-map,.block.evidence-comparison{break-inside:auto}\n table{break-inside:auto}tr,.fact{break-inside:avoid}thead{display:table-header-group}\n .compare,.jm-grid,.brief-panes,.brief-cols{display:block}\n .compare>*,.jm-grid>*,.brief-panes>*,.brief-cols>*{margin-bottom:.8rem}\n .table-wrap{overflow:visible}\n pre.code{white-space:pre-wrap;overflow:visible;word-break:break-word}\n a{color:inherit;text-decoration:none}\n .chapter p a[href^=\"http\"]::after,.chapter li a[href^=\"http\"]::after{content:\" (\" attr(href) \")\";font-size:.8em;color:var(--muted);word-break:break-all}\n a.ref::after{content:none!important}\n .draft-banner{position:static}\n body.is-draft .draft-watermark{display:block;position:fixed;top:42%;left:0;right:0;text-align:center;font:800 7rem/1 var(--sans);color:rgba(138,28,28,.09);transform:rotate(-24deg);z-index:-1;pointer-events:none}\n .colophon{border-top:1px solid #999;padding:1rem 0}\n}\n@media (forced-colors:active){.block,.result,.jm-col,.brief-pane{border:2px solid CanvasText}}\n@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}\n";
10
+ //# sourceMappingURL=book.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"book.d.ts","sourceRoot":"","sources":["../../src/theme/book.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU;;;CAA4C,CAAC;AAEpE;;;GAGG;AACH,eAAO,MAAM,cAAc,0oaA+L1B,CAAC"}
@@ -0,0 +1,198 @@
1
+ export const BOOK_THEME = { id: 'book', version: '1.0.0' };
2
+ /**
3
+ * Versioned "book" theme: cover, chapter headings, typography, navigation, code and print styles.
4
+ * Self-contained: system font stacks, no network requests, no scripts.
5
+ */
6
+ export const BOOK_THEME_CSS = `
7
+ :root{
8
+ --ink:#1b1f24;--paper:#fffdf8;--muted:#4f5864;--rule:#d9d3c5;--accent:#1f4e79;--accent-soft:#e7eef6;
9
+ --code-bg:#f3f0e8;--ok:#14532d;--ok-bg:#e6f4ea;--warn:#7a4a00;--warn-bg:#fdf1d8;--bad:#8a1c1c;--bad-bg:#fbe6e6;
10
+ --focus:#b45309;--radius:6px;
11
+ --serif:Georgia,"Iowan Old Style","Palatino Linotype",Palatino,"Times New Roman",serif;
12
+ --sans:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
13
+ --mono:ui-monospace,SFMono-Regular,Consolas,"Liberation Mono",Menlo,monospace;
14
+ }
15
+ *{box-sizing:border-box}
16
+ html{-webkit-text-size-adjust:100%;scroll-padding-top:1rem}
17
+ body{margin:0;background:var(--paper);color:var(--ink);font:1.0625rem/1.65 var(--serif);counter-reset:chapter appendix}
18
+ a{color:var(--accent);text-underline-offset:.15em}
19
+ a:hover{text-decoration-thickness:2px}
20
+ :focus-visible{outline:3px solid var(--focus);outline-offset:2px;border-radius:2px}
21
+ .sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
22
+ .skip-link{position:absolute;left:.5rem;top:-4rem;background:var(--ink);color:#fff;padding:.5rem .8rem;z-index:10;border-radius:var(--radius);font:600 .9rem var(--sans)}
23
+ .skip-link:focus{top:.5rem}
24
+ code,pre,kbd{font-family:var(--mono);font-size:.9em}
25
+ code{background:var(--code-bg);padding:.08em .3em;border-radius:3px;overflow-wrap:anywhere}
26
+ pre.code{background:var(--code-bg);border:1px solid var(--rule);border-left:4px solid var(--accent);padding:.8rem 1rem;overflow:auto;border-radius:var(--radius);line-height:1.45;white-space:pre;max-width:100%}
27
+ pre.code code{background:none;padding:0;font-size:.85rem;overflow-wrap:normal}
28
+ .draft-banner{background:var(--warn-bg);color:var(--warn);border-bottom:3px solid var(--warn);padding:.6rem 1rem;font:700 .9rem var(--sans);text-align:center;letter-spacing:.02em}
29
+ .draft-watermark{display:none}
30
+
31
+ /* cover */
32
+ .cover{padding:4.5rem 1.5rem 3rem;border-bottom:6px double var(--rule);background:linear-gradient(180deg,var(--accent-soft),var(--paper))}
33
+ .cover-inner{max-width:52rem;margin:0 auto}
34
+ .kicker{font:700 .8rem var(--sans);letter-spacing:.14em;text-transform:uppercase;color:var(--accent);margin:0 0 1rem}
35
+ .cover h1{font:700 clamp(2.2rem,6vw,3.6rem)/1.08 var(--serif);margin:0 0 .6rem;letter-spacing:-.01em}
36
+ .cover .subtitle{font:1.3rem/1.4 var(--serif);color:var(--muted);margin:0 0 2rem}
37
+ .cover-meta{display:grid;grid-template-columns:max-content 1fr;gap:.3rem 1.2rem;font:.9rem/1.5 var(--sans);margin:0}
38
+ .cover-meta dt{font-weight:700;color:var(--muted)}
39
+ .cover-meta dd{margin:0;overflow-wrap:anywhere}
40
+
41
+ /* layout & navigation */
42
+ .layout{display:grid;grid-template-columns:minmax(0,1fr);gap:0;max-width:72rem;margin:0 auto;padding:0 1.25rem}
43
+ .toc{font:.92rem/1.45 var(--sans);padding:1.5rem 0;border-bottom:1px solid var(--rule)}
44
+ .toc-title{font-weight:700;text-transform:uppercase;letter-spacing:.1em;font-size:.75rem;color:var(--muted);margin:0 0 .6rem}
45
+ .toc ol{margin:0;padding-left:1.25rem}
46
+ .toc li{margin:.25rem 0}
47
+ .toc .toc-sub{font-size:.85rem;color:var(--muted)}
48
+ .toc a{text-decoration:none}
49
+ .toc a:hover,.toc a:focus-visible{text-decoration:underline}
50
+ .toc .toc-other{margin-top:.8rem;padding-top:.6rem;border-top:1px dashed var(--rule);list-style:none;margin-left:-1.25rem}
51
+ main{padding:1.5rem 0 3rem;min-width:0}
52
+ main:focus{outline:none}
53
+ @media (min-width:62rem){
54
+ .layout{grid-template-columns:16rem minmax(0,1fr);gap:3rem}
55
+ .toc{position:sticky;top:0;align-self:start;max-height:100vh;overflow:auto;border-bottom:0;border-right:1px solid var(--rule);padding:2rem 1rem 2rem 0}
56
+ main{padding:2.5rem 0 4rem}
57
+ }
58
+
59
+ /* chapters */
60
+ .chapter{margin:0 0 4rem;max-width:46rem}
61
+ .chapter>header .chapter-no{font:700 .8rem var(--sans);letter-spacing:.14em;text-transform:uppercase;color:var(--accent);margin:0}
62
+ .chapter>header .chapter-no::before{counter-increment:chapter;content:"Chapter " counter(chapter)}
63
+ .appendix>header .chapter-no::before{counter-increment:appendix;content:"Appendix " counter(appendix,upper-alpha)}
64
+ .chapter h2{font:700 2rem/1.2 var(--serif);margin:.2rem 0 1rem;border-bottom:2px solid var(--ink);padding-bottom:.4rem}
65
+ .chapter h3{font:700 1.35rem/1.3 var(--serif);margin:2rem 0 .6rem}
66
+ .chapter h4{font:700 1.05rem/1.3 var(--sans);margin:1.4rem 0 .5rem}
67
+ .chapter h5{font:700 .95rem/1.3 var(--sans);margin:1rem 0 .3rem;color:var(--muted)}
68
+ .chapter .anchor{font-size:.7em;margin-left:.3em;text-decoration:none;opacity:.35}
69
+ .chapter :is(h2,h3,h4):hover .anchor,.chapter .anchor:focus-visible{opacity:1}
70
+ .chapter p{margin:.7rem 0}
71
+ .chapter ul,.chapter ol{padding-left:1.5rem}
72
+ .chapter li{margin:.25rem 0}
73
+ .back-to-top{font:.8rem var(--sans);margin-top:2rem}
74
+ img{max-width:100%;height:auto}
75
+ figure{margin:1.2rem 0}
76
+ figcaption{font:.88rem/1.4 var(--sans);color:var(--muted);margin:.3rem 0}
77
+ .table-wrap{overflow-x:auto;margin:1rem 0;max-width:100%}
78
+ table{border-collapse:collapse;width:100%;font:.92rem/1.45 var(--sans)}
79
+ caption{text-align:left;font-weight:700;padding:.3rem 0}
80
+ th,td{border:1px solid var(--rule);padding:.45rem .6rem;vertical-align:top;text-align:left}
81
+ thead th{background:var(--accent-soft);border-bottom:2px solid var(--accent)}
82
+ tbody th{background:#faf8f2;font-weight:600}
83
+ td.align-right,th.align-right{text-align:right}td.align-center,th.align-center{text-align:center}
84
+ .sub{display:block;font:.85rem/1.4 var(--sans);color:var(--muted)}
85
+ .empty{color:var(--muted);font-style:italic}
86
+ mark.placeholder{background:#fff3bf;color:#5c4400;border:1px dashed #b88700;padding:0 .25em;border-radius:3px;font-family:var(--sans);font-size:.88em}
87
+ .ref{font-family:var(--sans);font-size:.88em}
88
+ .ref-unresolved{background:var(--bad-bg);color:var(--bad);border:1px solid var(--bad);padding:0 .25em;border-radius:3px}
89
+ .tag{display:inline-block;font:700 .72rem var(--sans);letter-spacing:.04em;text-transform:uppercase;border:1px solid currentColor;border-radius:999px;padding:.05rem .5rem;color:var(--muted);vertical-align:middle}
90
+ .tag.verified{color:var(--ok)}.tag.unverified{color:var(--warn)}
91
+
92
+ /* blocks */
93
+ .block{border:1px solid var(--rule);border-left:5px solid var(--accent);border-radius:var(--radius);background:#fff;padding:.9rem 1.1rem 1rem;margin:1.4rem 0;font:1rem/1.55 var(--sans)}
94
+ .block>.block-kicker{font:700 .72rem var(--sans);letter-spacing:.14em;text-transform:uppercase;color:var(--accent);margin:.1rem 0 .5rem}
95
+ .block h4{margin-top:1rem}
96
+ .block ul,.block ol{margin:.4rem 0}
97
+ .facts{margin:.3rem 0;display:grid;gap:.5rem}
98
+ .fact{display:grid;grid-template-columns:minmax(8rem,12rem) 1fr;gap:.2rem 1rem}
99
+ .fact dt{font-weight:700;color:var(--muted);font-size:.9rem}
100
+ .fact dd{margin:0}
101
+ .fact dd ul{margin:0;padding-left:1.1rem}
102
+ @media (max-width:40rem){.fact{grid-template-columns:1fr}}
103
+ .options>li{margin:.7rem 0;padding:.5rem .7rem;background:#faf8f2;border-radius:var(--radius);border:1px solid var(--rule);list-style-position:inside}
104
+ .option-head{display:inline}
105
+ .options p{margin:.25rem 0}
106
+ .evidence{font-size:.88rem;margin:.4rem 0}
107
+ .evidence-links{display:inline;list-style:none;padding:0;margin:0}
108
+ .evidence-links li{display:inline;margin:0 .6rem 0 0}
109
+ .decision{border-left-color:var(--accent)}
110
+ .job-map{border-left-color:#4b6b3a}
111
+ .jm-grid{display:grid;grid-template-columns:1fr 1.6fr 1fr;gap:1rem}
112
+ @media (max-width:48rem){.jm-grid{grid-template-columns:1fr}}
113
+ .jm-col{background:#faf8f2;border:1px solid var(--rule);border-radius:var(--radius);padding:.2rem .9rem .6rem;min-width:0}
114
+ .jm-col ul,.jm-col ol{padding-left:1.1rem}
115
+ .actor{display:inline-block;font:700 .7rem var(--sans);text-transform:uppercase;letter-spacing:.06em;padding:.05rem .45rem;border-radius:3px;border:1.5px solid var(--ink);margin-right:.3rem}
116
+ .actor-human{background:var(--ink);color:#fff}
117
+ .actor-operator{background:#fff;color:var(--ink)}
118
+ .actor-system{background:#fff;color:var(--ink);border-style:dashed}
119
+ .text-equivalent{margin-top:1rem;padding-top:.6rem;border-top:1px dashed var(--rule);font-size:.92rem}
120
+ .human-action{border-left-color:#7a4a00}
121
+ .human-action.kind-delegated{border-left-style:dashed}
122
+ .pause{border-left-color:var(--bad);background:#fffafa}
123
+ .pause>.block-kicker{color:var(--bad)}
124
+ .brief{border-left-color:#5b3a8c}
125
+ .brief>.block-kicker{color:#5b3a8c}
126
+ .brief-panes{display:grid;grid-template-columns:1fr 1fr;gap:1rem}
127
+ @media (max-width:48rem){.brief-panes{grid-template-columns:1fr}}
128
+ .brief-pane{background:#faf8f2;border:1px solid var(--rule);border-radius:var(--radius);padding:.2rem .9rem .7rem;min-width:0}
129
+ .brief-pane .fact{grid-template-columns:1fr}
130
+ .brief-cols{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem}
131
+ @media (max-width:48rem){.brief-cols{grid-template-columns:1fr}}
132
+ .reference-pin{margin-top:1rem;padding:.2rem .9rem .7rem;border:2px solid #5b3a8c;border-radius:var(--radius)}
133
+ .review-checklist{border-left-color:#14532d}
134
+ .checklist{list-style:none;padding:0!important}
135
+ .checklist li{display:grid;grid-template-columns:2rem 1fr;gap:.4rem;margin:.7rem 0;break-inside:avoid}
136
+ .checklist .box{font-size:1.5rem;line-height:1}
137
+ .checklist p{margin:.1rem 0}
138
+ .compare{display:grid;grid-template-columns:1fr 1fr;gap:1rem;align-items:start}
139
+ @media (max-width:62rem){.compare{grid-template-columns:1fr}}
140
+ .result{border:2px solid var(--ink);border-radius:var(--radius);padding:.2rem .9rem .8rem;background:#fff;min-width:0}
141
+ .result-flawed{border-style:dashed}
142
+ .result>header{display:flex;flex-wrap:wrap;justify-content:space-between;gap:.5rem;align-items:baseline}
143
+ .result h4{margin:.8rem 0 .3rem}
144
+ .verdict{font:800 .9rem var(--sans);letter-spacing:.06em;text-transform:uppercase;margin:.8rem 0 .3rem;border:2px solid currentColor;border-radius:3px;padding:.1rem .6rem}
145
+ .verdict-usable{color:var(--ok);background:var(--ok-bg)}.verdict-partial{color:var(--warn);background:var(--warn-bg)}.verdict-invalid{color:var(--bad);background:var(--bad-bg)}
146
+ .check-results th,.check-results td{font-size:.85rem}
147
+ .outcome{font-weight:800;white-space:nowrap;letter-spacing:.02em}
148
+ .outcome-pass{color:var(--ok)}.outcome-fail{color:var(--bad)}.outcome-missing{color:var(--warn)}.outcome-contradictory{color:var(--bad)}
149
+ tr.outcome-fail td:first-of-type,tr.outcome-contradictory td:first-of-type{background:var(--bad-bg)}
150
+ tr.outcome-missing td:first-of-type{background:var(--warn-bg)}
151
+ tr.outcome-pass td:first-of-type{background:var(--ok-bg)}
152
+ tr.decisive th{box-shadow:inset 4px 0 0 var(--ink)}
153
+ .recovery{border-top:1px dashed var(--rule);padding-top:.5rem}
154
+ .callout{border-left-width:5px;font:1rem/1.55 var(--sans)}
155
+ .callout-title{margin:0 0 .3rem;font-weight:700}
156
+ .callout-label{text-transform:uppercase;letter-spacing:.08em;font-size:.75rem;border:1.5px solid currentColor;padding:.05rem .4rem;border-radius:3px}
157
+ .callout-info{border-left-color:var(--accent);background:var(--accent-soft)}
158
+ .callout-success{border-left-color:var(--ok);background:var(--ok-bg)}
159
+ .callout-warning,.callout-exception{border-left-color:var(--warn);background:var(--warn-bg)}
160
+ .callout-risk{border-left-color:var(--bad);background:var(--bad-bg)}
161
+ .callout-exception{border-left-style:dashed}
162
+ .example{border-left-color:#0f5f5f}
163
+ .profile .fact{grid-template-columns:minmax(9rem,14rem) 1fr}
164
+ .appendix .claim,.appendix .source,.appendix .check{border-top:1px solid var(--rule);padding:.6rem 0}
165
+ .appendix h3{font-size:1.15rem}
166
+ .status-unresolved{color:var(--bad)}.status-supported{color:var(--ok)}
167
+ .colophon{max-width:72rem;margin:0 auto;padding:1.5rem 1.25rem 3rem;border-top:1px solid var(--rule);font:.82rem/1.5 var(--sans);color:var(--muted)}
168
+ .colophon code{font-size:.8rem}
169
+
170
+ /* print */
171
+ @media print{
172
+ html{scroll-padding-top:0}
173
+ body{background:#fff;font-size:10.5pt;line-height:1.5}
174
+ .skip-link,.toc,.back-to-top,.anchor{display:none!important}
175
+ .layout{display:block;padding:0;max-width:none}
176
+ .cover{min-height:92vh;padding:6rem 1rem 2rem;background:#fff;border-bottom:0;break-after:page;display:flex;align-items:center}
177
+ .cover-inner{max-width:none}
178
+ .chapter{max-width:none;margin:0;break-before:page}
179
+ .chapter:first-of-type{break-before:auto}
180
+ .chapter h2,.chapter h3,.chapter h4,.chapter h5{break-after:avoid}
181
+ .block,.result,.options>li,.jm-col,.callout,figure,.checklist li{break-inside:avoid}
182
+ .block.example,.block.brief,.block.job-map,.block.evidence-comparison{break-inside:auto}
183
+ table{break-inside:auto}tr,.fact{break-inside:avoid}thead{display:table-header-group}
184
+ .compare,.jm-grid,.brief-panes,.brief-cols{display:block}
185
+ .compare>*,.jm-grid>*,.brief-panes>*,.brief-cols>*{margin-bottom:.8rem}
186
+ .table-wrap{overflow:visible}
187
+ pre.code{white-space:pre-wrap;overflow:visible;word-break:break-word}
188
+ a{color:inherit;text-decoration:none}
189
+ .chapter p a[href^="http"]::after,.chapter li a[href^="http"]::after{content:" (" attr(href) ")";font-size:.8em;color:var(--muted);word-break:break-all}
190
+ a.ref::after{content:none!important}
191
+ .draft-banner{position:static}
192
+ body.is-draft .draft-watermark{display:block;position:fixed;top:42%;left:0;right:0;text-align:center;font:800 7rem/1 var(--sans);color:rgba(138,28,28,.09);transform:rotate(-24deg);z-index:-1;pointer-events:none}
193
+ .colophon{border-top:1px solid #999;padding:1rem 0}
194
+ }
195
+ @media (forced-colors:active){.block,.result,.jm-col,.brief-pane{border:2px solid CanvasText}}
196
+ @media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
197
+ `;
198
+ //# sourceMappingURL=book.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"book.js","sourceRoot":"","sources":["../../src/theme/book.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAW,CAAC;AAEpE;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+L7B,CAAC"}
package/dist/util.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ export declare function sha256Hex(data: string | Uint8Array): string;
2
+ export declare function sha256Digest(data: string | Uint8Array): string;
3
+ export declare function shortRevision(digest: string, length?: number): string;
4
+ export declare function toBytes(value: string | Uint8Array): Uint8Array;
5
+ export declare function fromBytes(bytes: Uint8Array): string;
6
+ /** Normalise text for hashing: LF newlines, no BOM, no trailing whitespace per line, single final newline. */
7
+ export declare function normalizeText(text: string): string;
8
+ export declare function escapeHtml(value: unknown): string;
9
+ export declare function slugify(text: string): string;
10
+ /** Stable JSON: object keys sorted, used for hashing and deterministic outputs. */
11
+ export declare function canonicalJson(value: unknown): string;
12
+ export declare function wordCount(text: string): number;
13
+ export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
14
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAE3D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAE9D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,MAAM,CAEjE;AAKD,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAE9D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEnD;AAED,8GAA8G;AAC9G,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOjD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAU5C;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEpD;AAeD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE9E"}
package/dist/util.js ADDED
@@ -0,0 +1,69 @@
1
+ import { createHash } from 'node:crypto';
2
+ export function sha256Hex(data) {
3
+ return createHash('sha256').update(data).digest('hex');
4
+ }
5
+ export function sha256Digest(data) {
6
+ return `sha256:${sha256Hex(data)}`;
7
+ }
8
+ export function shortRevision(digest, length = 12) {
9
+ return digest.replace(/^sha256:/, '').slice(0, length);
10
+ }
11
+ const encoder = new TextEncoder();
12
+ const decoder = new TextDecoder('utf-8');
13
+ export function toBytes(value) {
14
+ return typeof value === 'string' ? encoder.encode(value) : value;
15
+ }
16
+ export function fromBytes(bytes) {
17
+ return decoder.decode(bytes);
18
+ }
19
+ /** Normalise text for hashing: LF newlines, no BOM, no trailing whitespace per line, single final newline. */
20
+ export function normalizeText(text) {
21
+ return (text
22
+ .replace(/^\uFEFF/, '')
23
+ .replace(/\r\n?/g, '\n')
24
+ .split('\n')
25
+ .map((l) => l.replace(/[ \t]+$/, ''))
26
+ .join('\n')
27
+ .replace(/\n+$/, '') + '\n');
28
+ }
29
+ export function escapeHtml(value) {
30
+ return String(value ?? '')
31
+ .replace(/&/g, '&amp;')
32
+ .replace(/</g, '&lt;')
33
+ .replace(/>/g, '&gt;')
34
+ .replace(/"/g, '&quot;')
35
+ .replace(/'/g, '&#39;');
36
+ }
37
+ export function slugify(text) {
38
+ const slug = text
39
+ .normalize('NFKD')
40
+ .replace(/[\u0300-\u036f]/g, '')
41
+ .toLowerCase()
42
+ .replace(/[^a-z0-9]+/g, '-')
43
+ .replace(/^-+|-+$/g, '')
44
+ .slice(0, 60)
45
+ .replace(/-+$/g, '');
46
+ return slug || 'section';
47
+ }
48
+ /** Stable JSON: object keys sorted, used for hashing and deterministic outputs. */
49
+ export function canonicalJson(value) {
50
+ return JSON.stringify(sortKeys(value));
51
+ }
52
+ function sortKeys(value) {
53
+ if (Array.isArray(value))
54
+ return value.map(sortKeys);
55
+ if (value && typeof value === 'object') {
56
+ return Object.fromEntries(Object.entries(value)
57
+ .filter(([, v]) => v !== undefined)
58
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
59
+ .map(([k, v]) => [k, sortKeys(v)]));
60
+ }
61
+ return value;
62
+ }
63
+ export function wordCount(text) {
64
+ return (text.match(/[\p{L}\p{N}][\p{L}\p{N}'\u2019-]*/gu) ?? []).length;
65
+ }
66
+ export function isPlainObject(value) {
67
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
68
+ }
69
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { type Diagnostic, type DiagnosticSummary, type ValidationMode } from './contracts/index.js';
2
+ import { type BlockNode } from './markdown-doc.js';
3
+ import { type GuideModel, type ModelEntry } from './model.js';
4
+ import { pointerFromPath } from './yamlfile.js';
5
+ export interface ValidateOptions {
6
+ mode: ValidationMode;
7
+ /** Requesting a public audience applies release-grade privacy rules even in draft mode. */
8
+ audience?: 'private' | 'public';
9
+ }
10
+ export interface ValidationReport {
11
+ ok: boolean;
12
+ mode: ValidationMode;
13
+ guideId?: string;
14
+ revision: string;
15
+ referenceRevision: string;
16
+ summary: DiagnosticSummary;
17
+ diagnostics: Diagnostic[];
18
+ }
19
+ export declare const SUPPORTED_THEMES: string[];
20
+ export declare function isFilled(value: unknown): boolean;
21
+ /** Return pointers (relative to `root`) of locations that fail the dotted field path. */
22
+ export declare function failingPointers(root: unknown, path: string, base?: string): string[];
23
+ /** Digest of an executable example: its definition plus every fixture file. */
24
+ export declare function exampleDigest(model: GuideModel, props: Record<string, unknown>): string;
25
+ export declare function exampleBlocks(model: GuideModel): {
26
+ entry: ModelEntry;
27
+ block: BlockNode;
28
+ }[];
29
+ export declare function validateModel(model: GuideModel, options: ValidateOptions): ValidationReport;
30
+ /** Scan for `[[TODO: ...]]` in prose and YAML values; fenced code is ignored in Markdown. */
31
+ export declare function scanPlaceholders(text: string, markdown: boolean): {
32
+ line: number;
33
+ text: string;
34
+ }[];
35
+ export { pointerFromPath };
36
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,UAAU,EACf,KAAK,iBAAiB,EAGtB,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAA0C,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAA8C,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE1G,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,cAAc,CAAC;IACrB,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,eAAO,MAAM,gBAAgB,UAAiB,CAAC;AAI/C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAMhD;AAED,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,SAAK,GAAG,MAAM,EAAE,CAehF;AA+BD,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAiBvF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU;;;IAI9C;AAID,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,GAAG,gBAAgB,CAspB3F;AAgDD,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CA0BlG;AAiLD,OAAO,EAAE,eAAe,EAAE,CAAC"}