@ryanyahya/opendoc 0.4.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 (789) hide show
  1. package/.agents/skills/opendoc-apply-comments/SKILL.md +30 -0
  2. package/.agents/skills/opendoc-apply-comments/agents/openai.yaml +4 -0
  3. package/.agents/skills/opendoc-create/SKILL.md +63 -0
  4. package/.agents/skills/opendoc-create/agents/openai.yaml +6 -0
  5. package/.agents/skills/opendoc-create-template/SKILL.md +50 -0
  6. package/.agents/skills/opendoc-create-template/agents/openai.yaml +4 -0
  7. package/.agents/skills/opendoc-create-template/references/structured-reports.md +11 -0
  8. package/.agents/skills/opendoc-create-theme/SKILL.md +40 -0
  9. package/.agents/skills/opendoc-create-theme/agents/openai.yaml +4 -0
  10. package/.agents/skills/opendoc-current-document/SKILL.md +32 -0
  11. package/.agents/skills/opendoc-current-document/agents/openai.yaml +4 -0
  12. package/.agents/skills/opendoc-current-document/references/context-fields.md +20 -0
  13. package/.agents/skills/opendoc-review-document/SKILL.md +60 -0
  14. package/.agents/skills/opendoc-review-document/agents/openai.yaml +4 -0
  15. package/AGENTS.md +69 -0
  16. package/CONTRIBUTING.md +38 -0
  17. package/LICENSE +21 -0
  18. package/README.md +179 -0
  19. package/SECURITY.md +9 -0
  20. package/THIRD_PARTY.md +49 -0
  21. package/VALIDATION.md +99 -0
  22. package/bin/opendoc.mjs +6 -0
  23. package/dist/assets/Markdown-sNZyjJi7.js +29 -0
  24. package/dist/assets/OpenDocSerif-Regular-D3OXs9A9.ttf +0 -0
  25. package/dist/assets/OpenDocSerif-Semibold-CjL9oDRo.ttf +0 -0
  26. package/dist/assets/geist-latin-ext-wght-italic-XgKbg5n7.woff2 +0 -0
  27. package/dist/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  28. package/dist/assets/geist-latin-wght-italic-dTnRTFFJ.woff2 +0 -0
  29. package/dist/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  30. package/dist/assets/index-DdrZ6ozO.css +1 -0
  31. package/dist/assets/index-DgNBz7mL.js +39 -0
  32. package/dist/assets/pdf-B7Emtyld.js +54 -0
  33. package/dist/assets/pdf.worker.min-Dswkl-cV.mjs +29 -0
  34. package/dist/assets/wordmark-DsqLlZpb.png +0 -0
  35. package/dist/index.html +17 -0
  36. package/docs/APPEARANCE.md +21 -0
  37. package/docs/ASSETS.md +176 -0
  38. package/docs/AUTHORING.md +178 -0
  39. package/docs/HEADLESS.md +120 -0
  40. package/docs/MEDIA.md +112 -0
  41. package/docs/PROJECTS.md +55 -0
  42. package/docs/PROSE.md +15 -0
  43. package/docs/SELECTION.md +59 -0
  44. package/docs/TEMPLATES.md +55 -0
  45. package/docs/THEMES.md +106 -0
  46. package/node_modules/@formepdf/core/LICENSE +21 -0
  47. package/node_modules/@formepdf/core/README.md +53 -0
  48. package/node_modules/@formepdf/core/dist/attachments.d.ts +55 -0
  49. package/node_modules/@formepdf/core/dist/attachments.js +59 -0
  50. package/node_modules/@formepdf/core/dist/extract.d.ts +8 -0
  51. package/node_modules/@formepdf/core/dist/extract.js +56 -0
  52. package/node_modules/@formepdf/core/dist/index.d.ts +311 -0
  53. package/node_modules/@formepdf/core/dist/index.js +167 -0
  54. package/node_modules/@formepdf/core/dist/layout.d.ts +132 -0
  55. package/node_modules/@formepdf/core/dist/layout.js +240 -0
  56. package/node_modules/@formepdf/core/dist/shared/browserHelpers.d.ts +19 -0
  57. package/node_modules/@formepdf/core/dist/shared/browserHelpers.js +128 -0
  58. package/node_modules/@formepdf/core/package.json +35 -0
  59. package/node_modules/@formepdf/core/pkg-node/LICENSE +21 -0
  60. package/node_modules/@formepdf/core/pkg-node/README.md +84 -0
  61. package/node_modules/@formepdf/core/pkg-node/forme.d.ts +39 -0
  62. package/node_modules/@formepdf/core/pkg-node/forme.js +394 -0
  63. package/node_modules/@formepdf/core/pkg-node/forme_bg.wasm +0 -0
  64. package/node_modules/@formepdf/core/pkg-node/forme_bg.wasm.d.ts +21 -0
  65. package/node_modules/@formepdf/core/pkg-node/package.json +25 -0
  66. package/node_modules/@formepdf/react/README.md +70 -0
  67. package/node_modules/@formepdf/react/dist/charts.d.ts +72 -0
  68. package/node_modules/@formepdf/react/dist/charts.js +338 -0
  69. package/node_modules/@formepdf/react/dist/components.d.ts +533 -0
  70. package/node_modules/@formepdf/react/dist/components.js +608 -0
  71. package/node_modules/@formepdf/react/dist/expr.d.ts +20 -0
  72. package/node_modules/@formepdf/react/dist/expr.js +39 -0
  73. package/node_modules/@formepdf/react/dist/font.d.ts +2 -0
  74. package/node_modules/@formepdf/react/dist/font.js +1 -0
  75. package/node_modules/@formepdf/react/dist/index.d.ts +11 -0
  76. package/node_modules/@formepdf/react/dist/index.js +15 -0
  77. package/node_modules/@formepdf/react/dist/render.d.ts +12 -0
  78. package/node_modules/@formepdf/react/dist/render.js +15 -0
  79. package/node_modules/@formepdf/react/dist/serialize.d.ts +12 -0
  80. package/node_modules/@formepdf/react/dist/serialize.js +1470 -0
  81. package/node_modules/@formepdf/react/dist/stylesheet.d.ts +4 -0
  82. package/node_modules/@formepdf/react/dist/stylesheet.js +5 -0
  83. package/node_modules/@formepdf/react/dist/template-proxy.d.ts +38 -0
  84. package/node_modules/@formepdf/react/dist/template-proxy.js +100 -0
  85. package/node_modules/@formepdf/react/dist/types.d.ts +287 -0
  86. package/node_modules/@formepdf/react/dist/types.js +1 -0
  87. package/node_modules/@formepdf/react/package.json +41 -0
  88. package/node_modules/@formepdf/shared/README.md +7 -0
  89. package/node_modules/@formepdf/shared/dist/canvas.d.ts +6 -0
  90. package/node_modules/@formepdf/shared/dist/canvas.js +43 -0
  91. package/node_modules/@formepdf/shared/dist/charts.d.ts +100 -0
  92. package/node_modules/@formepdf/shared/dist/charts.js +98 -0
  93. package/node_modules/@formepdf/shared/dist/encode.d.ts +27 -0
  94. package/node_modules/@formepdf/shared/dist/encode.js +93 -0
  95. package/node_modules/@formepdf/shared/dist/font.d.ts +13 -0
  96. package/node_modules/@formepdf/shared/dist/font.js +52 -0
  97. package/node_modules/@formepdf/shared/dist/index.d.ts +10 -0
  98. package/node_modules/@formepdf/shared/dist/index.js +15 -0
  99. package/node_modules/@formepdf/shared/dist/parser.d.ts +30 -0
  100. package/node_modules/@formepdf/shared/dist/parser.js +756 -0
  101. package/node_modules/@formepdf/shared/dist/semantics.d.ts +15 -0
  102. package/node_modules/@formepdf/shared/dist/semantics.js +44 -0
  103. package/node_modules/@formepdf/shared/dist/style.d.ts +7 -0
  104. package/node_modules/@formepdf/shared/dist/style.js +1024 -0
  105. package/node_modules/@formepdf/shared/dist/types.d.ts +743 -0
  106. package/node_modules/@formepdf/shared/dist/types.js +2 -0
  107. package/node_modules/@formepdf/shared/package.json +35 -0
  108. package/node_modules/@types/node/LICENSE +21 -0
  109. package/node_modules/@types/node/README.md +15 -0
  110. package/node_modules/@types/node/assert/strict.d.ts +111 -0
  111. package/node_modules/@types/node/assert.d.ts +1078 -0
  112. package/node_modules/@types/node/async_hooks.d.ts +603 -0
  113. package/node_modules/@types/node/buffer.buffer.d.ts +472 -0
  114. package/node_modules/@types/node/buffer.d.ts +1934 -0
  115. package/node_modules/@types/node/child_process.d.ts +1476 -0
  116. package/node_modules/@types/node/cluster.d.ts +578 -0
  117. package/node_modules/@types/node/compatibility/disposable.d.ts +14 -0
  118. package/node_modules/@types/node/compatibility/index.d.ts +9 -0
  119. package/node_modules/@types/node/compatibility/indexable.d.ts +20 -0
  120. package/node_modules/@types/node/compatibility/iterators.d.ts +20 -0
  121. package/node_modules/@types/node/console.d.ts +452 -0
  122. package/node_modules/@types/node/constants.d.ts +21 -0
  123. package/node_modules/@types/node/crypto.d.ts +4545 -0
  124. package/node_modules/@types/node/dgram.d.ts +600 -0
  125. package/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
  126. package/node_modules/@types/node/dns/promises.d.ts +503 -0
  127. package/node_modules/@types/node/dns.d.ts +923 -0
  128. package/node_modules/@types/node/domain.d.ts +170 -0
  129. package/node_modules/@types/node/events.d.ts +976 -0
  130. package/node_modules/@types/node/fs/promises.d.ts +1306 -0
  131. package/node_modules/@types/node/fs.d.ts +4463 -0
  132. package/node_modules/@types/node/globals.d.ts +172 -0
  133. package/node_modules/@types/node/globals.typedarray.d.ts +38 -0
  134. package/node_modules/@types/node/http.d.ts +2097 -0
  135. package/node_modules/@types/node/http2.d.ts +2843 -0
  136. package/node_modules/@types/node/https.d.ts +579 -0
  137. package/node_modules/@types/node/index.d.ts +98 -0
  138. package/node_modules/@types/node/inspector.d.ts +253 -0
  139. package/node_modules/@types/node/inspector.generated.d.ts +4052 -0
  140. package/node_modules/@types/node/module.d.ts +891 -0
  141. package/node_modules/@types/node/net.d.ts +1076 -0
  142. package/node_modules/@types/node/os.d.ts +506 -0
  143. package/node_modules/@types/node/package.json +145 -0
  144. package/node_modules/@types/node/path.d.ts +200 -0
  145. package/node_modules/@types/node/perf_hooks.d.ts +968 -0
  146. package/node_modules/@types/node/process.d.ts +2084 -0
  147. package/node_modules/@types/node/punycode.d.ts +117 -0
  148. package/node_modules/@types/node/querystring.d.ts +152 -0
  149. package/node_modules/@types/node/readline/promises.d.ts +161 -0
  150. package/node_modules/@types/node/readline.d.ts +594 -0
  151. package/node_modules/@types/node/repl.d.ts +428 -0
  152. package/node_modules/@types/node/sea.d.ts +162 -0
  153. package/node_modules/@types/node/sqlite.d.ts +722 -0
  154. package/node_modules/@types/node/stream/consumers.d.ts +38 -0
  155. package/node_modules/@types/node/stream/promises.d.ts +90 -0
  156. package/node_modules/@types/node/stream/web.d.ts +573 -0
  157. package/node_modules/@types/node/stream.d.ts +1694 -0
  158. package/node_modules/@types/node/string_decoder.d.ts +67 -0
  159. package/node_modules/@types/node/test.d.ts +2265 -0
  160. package/node_modules/@types/node/timers/promises.d.ts +108 -0
  161. package/node_modules/@types/node/timers.d.ts +287 -0
  162. package/node_modules/@types/node/tls.d.ts +1319 -0
  163. package/node_modules/@types/node/trace_events.d.ts +197 -0
  164. package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +468 -0
  165. package/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +34 -0
  166. package/node_modules/@types/node/ts5.6/index.d.ts +98 -0
  167. package/node_modules/@types/node/tty.d.ts +208 -0
  168. package/node_modules/@types/node/url.d.ts +984 -0
  169. package/node_modules/@types/node/util.d.ts +2606 -0
  170. package/node_modules/@types/node/v8.d.ts +920 -0
  171. package/node_modules/@types/node/vm.d.ts +1053 -0
  172. package/node_modules/@types/node/wasi.d.ts +181 -0
  173. package/node_modules/@types/node/web-globals/abortcontroller.d.ts +34 -0
  174. package/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  175. package/node_modules/@types/node/web-globals/events.d.ts +97 -0
  176. package/node_modules/@types/node/web-globals/fetch.d.ts +55 -0
  177. package/node_modules/@types/node/web-globals/navigator.d.ts +22 -0
  178. package/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  179. package/node_modules/@types/node/web-globals/streams.d.ts +22 -0
  180. package/node_modules/@types/node/worker_threads.d.ts +819 -0
  181. package/node_modules/@types/node/zlib.d.ts +747 -0
  182. package/node_modules/@types/react/LICENSE +21 -0
  183. package/node_modules/@types/react/README.md +15 -0
  184. package/node_modules/@types/react/canary.d.ts +129 -0
  185. package/node_modules/@types/react/compiler-runtime.d.ts +4 -0
  186. package/node_modules/@types/react/experimental.d.ts +184 -0
  187. package/node_modules/@types/react/global.d.ts +166 -0
  188. package/node_modules/@types/react/index.d.ts +4378 -0
  189. package/node_modules/@types/react/jsx-dev-runtime.d.ts +33 -0
  190. package/node_modules/@types/react/jsx-runtime.d.ts +24 -0
  191. package/node_modules/@types/react/package.json +210 -0
  192. package/node_modules/@types/react/ts5.0/canary.d.ts +129 -0
  193. package/node_modules/@types/react/ts5.0/experimental.d.ts +184 -0
  194. package/node_modules/@types/react/ts5.0/global.d.ts +166 -0
  195. package/node_modules/@types/react/ts5.0/index.d.ts +4365 -0
  196. package/node_modules/@types/react/ts5.0/jsx-dev-runtime.d.ts +33 -0
  197. package/node_modules/@types/react/ts5.0/jsx-runtime.d.ts +24 -0
  198. package/node_modules/csstype/LICENSE +19 -0
  199. package/node_modules/csstype/README.md +291 -0
  200. package/node_modules/csstype/index.d.ts +22569 -0
  201. package/node_modules/csstype/index.js.flow +6863 -0
  202. package/node_modules/csstype/package.json +70 -0
  203. package/node_modules/entities/LICENSE +11 -0
  204. package/node_modules/entities/decode.d.ts +1 -0
  205. package/node_modules/entities/decode.js +3 -0
  206. package/node_modules/entities/dist/commonjs/decode-codepoint.d.ts +19 -0
  207. package/node_modules/entities/dist/commonjs/decode-codepoint.d.ts.map +1 -0
  208. package/node_modules/entities/dist/commonjs/decode-codepoint.js +77 -0
  209. package/node_modules/entities/dist/commonjs/decode-codepoint.js.map +1 -0
  210. package/node_modules/entities/dist/commonjs/decode.d.ts +209 -0
  211. package/node_modules/entities/dist/commonjs/decode.d.ts.map +1 -0
  212. package/node_modules/entities/dist/commonjs/decode.js +511 -0
  213. package/node_modules/entities/dist/commonjs/decode.js.map +1 -0
  214. package/node_modules/entities/dist/commonjs/encode.d.ts +22 -0
  215. package/node_modules/entities/dist/commonjs/encode.d.ts.map +1 -0
  216. package/node_modules/entities/dist/commonjs/encode.js +73 -0
  217. package/node_modules/entities/dist/commonjs/encode.js.map +1 -0
  218. package/node_modules/entities/dist/commonjs/escape.d.ts +43 -0
  219. package/node_modules/entities/dist/commonjs/escape.d.ts.map +1 -0
  220. package/node_modules/entities/dist/commonjs/escape.js +121 -0
  221. package/node_modules/entities/dist/commonjs/escape.js.map +1 -0
  222. package/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts +2 -0
  223. package/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts.map +1 -0
  224. package/node_modules/entities/dist/commonjs/generated/decode-data-html.js +10 -0
  225. package/node_modules/entities/dist/commonjs/generated/decode-data-html.js.map +1 -0
  226. package/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts +2 -0
  227. package/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts.map +1 -0
  228. package/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +10 -0
  229. package/node_modules/entities/dist/commonjs/generated/decode-data-xml.js.map +1 -0
  230. package/node_modules/entities/dist/commonjs/generated/encode-html.d.ts +8 -0
  231. package/node_modules/entities/dist/commonjs/generated/encode-html.d.ts.map +1 -0
  232. package/node_modules/entities/dist/commonjs/generated/encode-html.js +13 -0
  233. package/node_modules/entities/dist/commonjs/generated/encode-html.js.map +1 -0
  234. package/node_modules/entities/dist/commonjs/index.d.ts +96 -0
  235. package/node_modules/entities/dist/commonjs/index.d.ts.map +1 -0
  236. package/node_modules/entities/dist/commonjs/index.js +131 -0
  237. package/node_modules/entities/dist/commonjs/index.js.map +1 -0
  238. package/node_modules/entities/dist/commonjs/package.json +3 -0
  239. package/node_modules/entities/dist/esm/decode-codepoint.d.ts +19 -0
  240. package/node_modules/entities/dist/esm/decode-codepoint.d.ts.map +1 -0
  241. package/node_modules/entities/dist/esm/decode-codepoint.js +72 -0
  242. package/node_modules/entities/dist/esm/decode-codepoint.js.map +1 -0
  243. package/node_modules/entities/dist/esm/decode.d.ts +209 -0
  244. package/node_modules/entities/dist/esm/decode.d.ts.map +1 -0
  245. package/node_modules/entities/dist/esm/decode.js +497 -0
  246. package/node_modules/entities/dist/esm/decode.js.map +1 -0
  247. package/node_modules/entities/dist/esm/encode.d.ts +22 -0
  248. package/node_modules/entities/dist/esm/encode.d.ts.map +1 -0
  249. package/node_modules/entities/dist/esm/encode.js +69 -0
  250. package/node_modules/entities/dist/esm/encode.js.map +1 -0
  251. package/node_modules/entities/dist/esm/escape.d.ts +43 -0
  252. package/node_modules/entities/dist/esm/escape.d.ts.map +1 -0
  253. package/node_modules/entities/dist/esm/escape.js +117 -0
  254. package/node_modules/entities/dist/esm/escape.js.map +1 -0
  255. package/node_modules/entities/dist/esm/generated/decode-data-html.d.ts +2 -0
  256. package/node_modules/entities/dist/esm/generated/decode-data-html.d.ts.map +1 -0
  257. package/node_modules/entities/dist/esm/generated/decode-data-html.js +7 -0
  258. package/node_modules/entities/dist/esm/generated/decode-data-html.js.map +1 -0
  259. package/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts +2 -0
  260. package/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts.map +1 -0
  261. package/node_modules/entities/dist/esm/generated/decode-data-xml.js +7 -0
  262. package/node_modules/entities/dist/esm/generated/decode-data-xml.js.map +1 -0
  263. package/node_modules/entities/dist/esm/generated/encode-html.d.ts +8 -0
  264. package/node_modules/entities/dist/esm/generated/encode-html.d.ts.map +1 -0
  265. package/node_modules/entities/dist/esm/generated/encode-html.js +10 -0
  266. package/node_modules/entities/dist/esm/generated/encode-html.js.map +1 -0
  267. package/node_modules/entities/dist/esm/index.d.ts +96 -0
  268. package/node_modules/entities/dist/esm/index.d.ts.map +1 -0
  269. package/node_modules/entities/dist/esm/index.js +107 -0
  270. package/node_modules/entities/dist/esm/index.js.map +1 -0
  271. package/node_modules/entities/dist/esm/package.json +3 -0
  272. package/node_modules/entities/escape.d.ts +1 -0
  273. package/node_modules/entities/escape.js +3 -0
  274. package/node_modules/entities/package.json +118 -0
  275. package/node_modules/entities/readme.md +122 -0
  276. package/node_modules/entities/src/decode-codepoint.ts +81 -0
  277. package/node_modules/entities/src/decode.spec.ts +320 -0
  278. package/node_modules/entities/src/decode.ts +620 -0
  279. package/node_modules/entities/src/encode.spec.ts +78 -0
  280. package/node_modules/entities/src/encode.ts +77 -0
  281. package/node_modules/entities/src/escape.spec.ts +14 -0
  282. package/node_modules/entities/src/escape.ts +148 -0
  283. package/node_modules/entities/src/generated/.eslintrc.json +10 -0
  284. package/node_modules/entities/src/generated/decode-data-html.ts +8 -0
  285. package/node_modules/entities/src/generated/decode-data-xml.ts +8 -0
  286. package/node_modules/entities/src/generated/encode-html.ts +17 -0
  287. package/node_modules/entities/src/index.spec.ts +125 -0
  288. package/node_modules/entities/src/index.ts +188 -0
  289. package/node_modules/parse5/LICENSE +19 -0
  290. package/node_modules/parse5/README.md +38 -0
  291. package/node_modules/parse5/dist/cjs/common/doctype.d.ts +4 -0
  292. package/node_modules/parse5/dist/cjs/common/doctype.js +118 -0
  293. package/node_modules/parse5/dist/cjs/common/error-codes.d.ts +67 -0
  294. package/node_modules/parse5/dist/cjs/common/error-codes.js +66 -0
  295. package/node_modules/parse5/dist/cjs/common/foreign-content.d.ts +9 -0
  296. package/node_modules/parse5/dist/cjs/common/foreign-content.js +237 -0
  297. package/node_modules/parse5/dist/cjs/common/html.d.ts +289 -0
  298. package/node_modules/parse5/dist/cjs/common/html.js +528 -0
  299. package/node_modules/parse5/dist/cjs/common/token.d.ts +84 -0
  300. package/node_modules/parse5/dist/cjs/common/token.js +24 -0
  301. package/node_modules/parse5/dist/cjs/common/unicode.d.ts +42 -0
  302. package/node_modules/parse5/dist/cjs/common/unicode.js +70 -0
  303. package/node_modules/parse5/dist/cjs/index.d.ts +71 -0
  304. package/node_modules/parse5/dist/cjs/index.js +54 -0
  305. package/node_modules/parse5/dist/cjs/package.json +1 -0
  306. package/node_modules/parse5/dist/cjs/parser/formatting-element-list.d.ts +36 -0
  307. package/node_modules/parse5/dist/cjs/parser/formatting-element-list.js +114 -0
  308. package/node_modules/parse5/dist/cjs/parser/index.d.ts +221 -0
  309. package/node_modules/parse5/dist/cjs/parser/index.js +3240 -0
  310. package/node_modules/parse5/dist/cjs/parser/open-element-stack.d.ts +53 -0
  311. package/node_modules/parse5/dist/cjs/parser/open-element-stack.js +328 -0
  312. package/node_modules/parse5/dist/cjs/serializer/index.d.ts +60 -0
  313. package/node_modules/parse5/dist/cjs/serializer/index.js +172 -0
  314. package/node_modules/parse5/dist/cjs/tokenizer/index.d.ts +247 -0
  315. package/node_modules/parse5/dist/cjs/tokenizer/index.js +2714 -0
  316. package/node_modules/parse5/dist/cjs/tokenizer/preprocessor.d.ts +36 -0
  317. package/node_modules/parse5/dist/cjs/tokenizer/preprocessor.js +200 -0
  318. package/node_modules/parse5/dist/cjs/tree-adapters/default.d.ts +84 -0
  319. package/node_modules/parse5/dist/cjs/tree-adapters/default.js +176 -0
  320. package/node_modules/parse5/dist/cjs/tree-adapters/interface.d.ts +255 -0
  321. package/node_modules/parse5/dist/cjs/tree-adapters/interface.js +2 -0
  322. package/node_modules/parse5/dist/common/doctype.d.ts +4 -0
  323. package/node_modules/parse5/dist/common/doctype.js +114 -0
  324. package/node_modules/parse5/dist/common/error-codes.d.ts +67 -0
  325. package/node_modules/parse5/dist/common/error-codes.js +63 -0
  326. package/node_modules/parse5/dist/common/foreign-content.d.ts +9 -0
  327. package/node_modules/parse5/dist/common/foreign-content.js +228 -0
  328. package/node_modules/parse5/dist/common/html.d.ts +289 -0
  329. package/node_modules/parse5/dist/common/html.js +523 -0
  330. package/node_modules/parse5/dist/common/token.d.ts +84 -0
  331. package/node_modules/parse5/dist/common/token.js +20 -0
  332. package/node_modules/parse5/dist/common/unicode.d.ts +42 -0
  333. package/node_modules/parse5/dist/common/unicode.js +62 -0
  334. package/node_modules/parse5/dist/index.d.ts +71 -0
  335. package/node_modules/parse5/dist/index.js +42 -0
  336. package/node_modules/parse5/dist/parser/formatting-element-list.d.ts +36 -0
  337. package/node_modules/parse5/dist/parser/formatting-element-list.js +110 -0
  338. package/node_modules/parse5/dist/parser/index.d.ts +221 -0
  339. package/node_modules/parse5/dist/parser/index.js +3245 -0
  340. package/node_modules/parse5/dist/parser/open-element-stack.d.ts +53 -0
  341. package/node_modules/parse5/dist/parser/open-element-stack.js +324 -0
  342. package/node_modules/parse5/dist/serializer/index.d.ts +60 -0
  343. package/node_modules/parse5/dist/serializer/index.js +168 -0
  344. package/node_modules/parse5/dist/tokenizer/index.d.ts +247 -0
  345. package/node_modules/parse5/dist/tokenizer/index.js +2710 -0
  346. package/node_modules/parse5/dist/tokenizer/preprocessor.d.ts +36 -0
  347. package/node_modules/parse5/dist/tokenizer/preprocessor.js +196 -0
  348. package/node_modules/parse5/dist/tree-adapters/default.d.ts +84 -0
  349. package/node_modules/parse5/dist/tree-adapters/default.js +173 -0
  350. package/node_modules/parse5/dist/tree-adapters/interface.d.ts +255 -0
  351. package/node_modules/parse5/dist/tree-adapters/interface.js +1 -0
  352. package/node_modules/parse5/package.json +50 -0
  353. package/node_modules/undici-types/LICENSE +21 -0
  354. package/node_modules/undici-types/README.md +6 -0
  355. package/node_modules/undici-types/agent.d.ts +31 -0
  356. package/node_modules/undici-types/api.d.ts +43 -0
  357. package/node_modules/undici-types/balanced-pool.d.ts +29 -0
  358. package/node_modules/undici-types/cache.d.ts +36 -0
  359. package/node_modules/undici-types/client.d.ts +108 -0
  360. package/node_modules/undici-types/connector.d.ts +34 -0
  361. package/node_modules/undici-types/content-type.d.ts +21 -0
  362. package/node_modules/undici-types/cookies.d.ts +28 -0
  363. package/node_modules/undici-types/diagnostics-channel.d.ts +66 -0
  364. package/node_modules/undici-types/dispatcher.d.ts +256 -0
  365. package/node_modules/undici-types/env-http-proxy-agent.d.ts +21 -0
  366. package/node_modules/undici-types/errors.d.ts +149 -0
  367. package/node_modules/undici-types/eventsource.d.ts +61 -0
  368. package/node_modules/undici-types/fetch.d.ts +209 -0
  369. package/node_modules/undici-types/file.d.ts +39 -0
  370. package/node_modules/undici-types/filereader.d.ts +54 -0
  371. package/node_modules/undici-types/formdata.d.ts +108 -0
  372. package/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  373. package/node_modules/undici-types/global-origin.d.ts +7 -0
  374. package/node_modules/undici-types/handlers.d.ts +15 -0
  375. package/node_modules/undici-types/header.d.ts +4 -0
  376. package/node_modules/undici-types/index.d.ts +71 -0
  377. package/node_modules/undici-types/interceptors.d.ts +17 -0
  378. package/node_modules/undici-types/mock-agent.d.ts +50 -0
  379. package/node_modules/undici-types/mock-client.d.ts +25 -0
  380. package/node_modules/undici-types/mock-errors.d.ts +12 -0
  381. package/node_modules/undici-types/mock-interceptor.d.ts +93 -0
  382. package/node_modules/undici-types/mock-pool.d.ts +25 -0
  383. package/node_modules/undici-types/package.json +55 -0
  384. package/node_modules/undici-types/patch.d.ts +33 -0
  385. package/node_modules/undici-types/pool-stats.d.ts +19 -0
  386. package/node_modules/undici-types/pool.d.ts +39 -0
  387. package/node_modules/undici-types/proxy-agent.d.ts +28 -0
  388. package/node_modules/undici-types/readable.d.ts +65 -0
  389. package/node_modules/undici-types/retry-agent.d.ts +8 -0
  390. package/node_modules/undici-types/retry-handler.d.ts +116 -0
  391. package/node_modules/undici-types/util.d.ts +18 -0
  392. package/node_modules/undici-types/webidl.d.ts +228 -0
  393. package/node_modules/undici-types/websocket.d.ts +150 -0
  394. package/package.json +80 -0
  395. package/scripts/rebuild-forme.mjs +61 -0
  396. package/src/app/AppearanceControl.tsx +44 -0
  397. package/src/app/AssetThemeDefaults.tsx +87 -0
  398. package/src/app/AssetsBrowser.tsx +273 -0
  399. package/src/app/CommentDock.tsx +108 -0
  400. package/src/app/CreateDocumentDialog.tsx +51 -0
  401. package/src/app/DocumentActions.tsx +69 -0
  402. package/src/app/DocumentCard.tsx +50 -0
  403. package/src/app/DocumentViewControl.tsx +31 -0
  404. package/src/app/DocumentsBrowser.tsx +70 -0
  405. package/src/app/ExportHistoryDialog.tsx +86 -0
  406. package/src/app/ExportMenu.tsx +127 -0
  407. package/src/app/GuideDialog.tsx +80 -0
  408. package/src/app/InspectionLayer.tsx +77 -0
  409. package/src/app/LogoUploadDialog.tsx +92 -0
  410. package/src/app/Markdown.tsx +34 -0
  411. package/src/app/MaterialsBrowser.tsx +149 -0
  412. package/src/app/PageNumberInput.tsx +56 -0
  413. package/src/app/Pdf.tsx +561 -0
  414. package/src/app/ProjectDialogs.tsx +100 -0
  415. package/src/app/Reader.tsx +769 -0
  416. package/src/app/SearchField.tsx +13 -0
  417. package/src/app/Sidebar.tsx +86 -0
  418. package/src/app/SkillIndex.tsx +30 -0
  419. package/src/app/TemplatesBrowser.tsx +149 -0
  420. package/src/app/ThemesBrowser.tsx +159 -0
  421. package/src/app/api.ts +47 -0
  422. package/src/app/appearance.ts +35 -0
  423. package/src/app/assets.css +139 -0
  424. package/src/app/catalogPreview.ts +20 -0
  425. package/src/app/colors.css +167 -0
  426. package/src/app/comment-dock.css +53 -0
  427. package/src/app/commentDrafts.ts +67 -0
  428. package/src/app/componentCorrection.ts +17 -0
  429. package/src/app/edit-workbench.css +87 -0
  430. package/src/app/editSession.ts +238 -0
  431. package/src/app/editorRecovery.ts +25 -0
  432. package/src/app/export-history.css +31 -0
  433. package/src/app/export.css +17 -0
  434. package/src/app/guideLinks.ts +21 -0
  435. package/src/app/guides.css +40 -0
  436. package/src/app/main.tsx +221 -0
  437. package/src/app/materials.css +53 -0
  438. package/src/app/pdfLoading.ts +12 -0
  439. package/src/app/pdfSelection.ts +112 -0
  440. package/src/app/projects.css +63 -0
  441. package/src/app/reader-toolbar.css +65 -0
  442. package/src/app/selection.css +150 -0
  443. package/src/app/sidebar.css +60 -0
  444. package/src/app/skills.css +7 -0
  445. package/src/app/style.css +1061 -0
  446. package/src/app/templates.css +49 -0
  447. package/src/app/themes.css +80 -0
  448. package/src/app/ui/Icon.tsx +92 -0
  449. package/src/app/ui/README.md +27 -0
  450. package/src/app/ui/fonts.css +36 -0
  451. package/src/app/ui/index.tsx +223 -0
  452. package/src/app/ui/ui.css +388 -0
  453. package/src/app/useReaderPreview.ts +19 -0
  454. package/src/app/useTextEditing.ts +155 -0
  455. package/src/assets/adapter.ts +122 -0
  456. package/src/assets/files.ts +378 -0
  457. package/src/assets/import-worker.ts +294 -0
  458. package/src/assets/imports.ts +124 -0
  459. package/src/assets/index.ts +60 -0
  460. package/src/assets/store.ts +798 -0
  461. package/src/assets/usage.ts +118 -0
  462. package/src/cli/check.ts +25 -0
  463. package/src/cli/init.ts +119 -0
  464. package/src/cli/lock.ts +34 -0
  465. package/src/cli/main.ts +118 -0
  466. package/src/cli/process.ts +19 -0
  467. package/src/cli/start.ts +96 -0
  468. package/src/cli/update.ts +348 -0
  469. package/src/cli/workspace.ts +94 -0
  470. package/src/document/index.tsx +641 -0
  471. package/src/document/page.tsx +53 -0
  472. package/src/document/text-targets.tsx +162 -0
  473. package/src/media/files.ts +124 -0
  474. package/src/media/render.ts +63 -0
  475. package/src/rendering/resolve-sources.ts +84 -0
  476. package/src/runtime/jsx-dev-runtime.ts +2 -0
  477. package/src/runtime/jsx-runtime.ts +2 -0
  478. package/src/runtime/paths.ts +12 -0
  479. package/src/server/assets-cli.ts +162 -0
  480. package/src/server/assets-http.ts +100 -0
  481. package/src/server/client.ts +50 -0
  482. package/src/server/clipboard.ts +22 -0
  483. package/src/server/comments-cli.ts +64 -0
  484. package/src/server/comments.ts +130 -0
  485. package/src/server/create-cli.ts +33 -0
  486. package/src/server/create.ts +228 -0
  487. package/src/server/dependencies.ts +91 -0
  488. package/src/server/documents.ts +143 -0
  489. package/src/server/edits.ts +249 -0
  490. package/src/server/export-batch.ts +105 -0
  491. package/src/server/export-errors.ts +2 -0
  492. package/src/server/export-file.ts +57 -0
  493. package/src/server/export-inputs.ts +66 -0
  494. package/src/server/export-preview.ts +69 -0
  495. package/src/server/export.ts +32 -0
  496. package/src/server/exports.ts +283 -0
  497. package/src/server/files.ts +21 -0
  498. package/src/server/guides.ts +71 -0
  499. package/src/server/index.ts +432 -0
  500. package/src/server/materials.ts +39 -0
  501. package/src/server/media-cli.ts +73 -0
  502. package/src/server/media-mutations.ts +168 -0
  503. package/src/server/pptx.ts +160 -0
  504. package/src/server/preflight.ts +129 -0
  505. package/src/server/projects-cli.ts +29 -0
  506. package/src/server/projects.ts +187 -0
  507. package/src/server/render-error.ts +9 -0
  508. package/src/server/render-source.ts +24 -0
  509. package/src/server/render.ts +48 -0
  510. package/src/server/review-cli.ts +40 -0
  511. package/src/server/review.ts +161 -0
  512. package/src/server/selection.ts +23 -0
  513. package/src/server/source-overrides.ts +97 -0
  514. package/src/server/templates-cli.ts +51 -0
  515. package/src/server/templates.ts +186 -0
  516. package/src/server/text-layout.ts +41 -0
  517. package/src/server/text-source.ts +307 -0
  518. package/src/server/themes-cli.ts +59 -0
  519. package/src/server/themes.ts +215 -0
  520. package/src/server/ttf2eot.d.ts +3 -0
  521. package/src/server/worker.ts +166 -0
  522. package/src/server/workspace.ts +242 -0
  523. package/src/shared/anchors.ts +69 -0
  524. package/src/shared/assets.ts +154 -0
  525. package/src/shared/export.ts +34 -0
  526. package/src/shared/media.ts +33 -0
  527. package/src/shared/projects.ts +19 -0
  528. package/src/shared/selection.ts +94 -0
  529. package/src/shared/skill-index.ts +14 -0
  530. package/src/shared/starters.ts +19 -0
  531. package/src/shared/templates.ts +18 -0
  532. package/src/shared/themes.ts +24 -0
  533. package/src/shared/types.ts +39 -0
  534. package/src/template/index.ts +27 -0
  535. package/src/themes/index.ts +3 -0
  536. package/src/themes/neutral.ts +20 -0
  537. package/src/themes/types.ts +110 -0
  538. package/starter/assets/brand/wordmark.png +0 -0
  539. package/starter/assets/fonts/InterUI-LICENSE.txt +93 -0
  540. package/starter/assets/fonts/InterUI-Medium.ttf +0 -0
  541. package/starter/assets/fonts/InterUI-Regular.ttf +0 -0
  542. package/starter/assets/fonts/InterUI-source.json +19 -0
  543. package/starter/assets/fonts/OpenDocMono-Regular.ttf +0 -0
  544. package/starter/assets/fonts/OpenDocSans-Italic.ttf +0 -0
  545. package/starter/assets/fonts/OpenDocSans-Regular.ttf +0 -0
  546. package/starter/assets/fonts/OpenDocSans-Semibold.ttf +0 -0
  547. package/starter/assets/fonts/OpenDocSans-SemiboldItalic.ttf +0 -0
  548. package/starter/assets/fonts/OpenDocSerif-Italic.ttf +0 -0
  549. package/starter/assets/fonts/OpenDocSerif-Regular.ttf +0 -0
  550. package/starter/assets/fonts/OpenDocSerif-Semibold.ttf +0 -0
  551. package/starter/assets/fonts/OpenDocSerif-SemiboldItalic.ttf +0 -0
  552. package/starter/assets/fonts/SourceCode-LICENSE.md +93 -0
  553. package/starter/assets/fonts/SourceSans-LICENSE.md +93 -0
  554. package/starter/assets/fonts/SourceSerif-LICENSE.md +93 -0
  555. package/starter/assets/fonts/geist/OFL.txt +93 -0
  556. package/starter/assets/fonts/geist/asset.json +7 -0
  557. package/starter/assets/fonts/geist/files/1a9874b3be0fc168692a3d2327bccb4d28835653d3b91537a755296a467a83e3.ttf +0 -0
  558. package/starter/assets/fonts/geist/files/a8eefb873ba9c9020665f8a98302697ce1f3b79ab2deef6ee508c0ca6a82e876.ttf +0 -0
  559. package/starter/assets/fonts/geist/files/ccce59465ae5c61930ada5453834f60500fbd95084d85db63e0e65fad0125455.ttf +0 -0
  560. package/starter/assets/fonts/geist/files/f5e95110d70593672515080bee9148463ada0a7f77b89ed65a3d43cb2b0ff83a.pdf +0 -0
  561. package/starter/assets/fonts/geist/revisions/9a2bc12fb2f23cb27bc227087e63e1407bb804ee0586480bd6b7966ec69fb474.json +60 -0
  562. package/starter/assets/fonts/inter/OFL.txt +93 -0
  563. package/starter/assets/fonts/inter/asset.json +7 -0
  564. package/starter/assets/fonts/inter/files/1b08e7fc267a5c7e1d614100f604b83e7e8a0be241f0f288faa2b3ac93a683ba.ttf +0 -0
  565. package/starter/assets/fonts/inter/files/5b6f0c6f26e5c554a64cdcc3a9b5d802b7f9aec6206f1dbcfcdcad7b5860a2a9.ttf +0 -0
  566. package/starter/assets/fonts/inter/files/957db8560d510a198a7d0333fae7b6b444b00c20801581126273978d778eb3c3.pdf +0 -0
  567. package/starter/assets/fonts/inter/files/b37284b5701b6b168dfc770aa1a4ac492106422fd3ba76bc7641e37434e8019c.ttf +0 -0
  568. package/starter/assets/fonts/inter/files/c1811d32ac0f6eed1bbf57529f2ecdfc6c717d48a969dd864942436315a1b198.ttf +0 -0
  569. package/starter/assets/fonts/inter/files/e7a1aaf7eda9f2fad4131725fa556265ec75ca7b2d756260173a040363e8d4f7.ttf +0 -0
  570. package/starter/assets/fonts/inter/files/ef8f755d933b9310804cc9152f1f18cb2ac460d6b05054ec913d889c9f11f79e.ttf +0 -0
  571. package/starter/assets/fonts/inter/revisions/600391517c413963b71e278a57c26c40366c81fa3939a6b9755f446206766d12.json +99 -0
  572. package/starter/assets/fonts/inter/source.json +57 -0
  573. package/starter/assets/fonts/lato/OFL.txt +93 -0
  574. package/starter/assets/fonts/lato/asset.json +7 -0
  575. package/starter/assets/fonts/lato/files/4a6b566dbb28adb473a8789ce5169306f42f0c8a070ac92bae93636f36348b0d.pdf +0 -0
  576. package/starter/assets/fonts/lato/files/5adeb6b334d8fb99ef053bc052b952773d544315e0e1d668a12c0ce8bd51375c.ttf +0 -0
  577. package/starter/assets/fonts/lato/files/62c1b7f0d2e74b45960154c3520efc337b553db0961bfdc950d5618334596cc8.ttf +0 -0
  578. package/starter/assets/fonts/lato/files/71b8b7decbe75a881ed267be539d402bd1e9420b799658aada4e0d1bd5af803c.ttf +0 -0
  579. package/starter/assets/fonts/lato/files/8a0aace75d33794eece4b28187bfc1df0bbd2888b5d8a56e01788c8d65d16be1.ttf +0 -0
  580. package/starter/assets/fonts/lato/files/d636e4683231f931eda222d588e944d082bfd3bdba02f928bee461c0f185b251.ttf +0 -0
  581. package/starter/assets/fonts/lato/files/e399c44efe1387100531d26c7e4800c5d12251b890d6654a3098c7c679cb1786.ttf +0 -0
  582. package/starter/assets/fonts/lato/revisions/49ccb93400a9d466fab7d9843b1ecf8916ec6d47a475dd79a597a22eb39616bc.json +99 -0
  583. package/starter/assets/fonts/lato/source.json +57 -0
  584. package/starter/assets/fonts/merriweather/OFL.txt +93 -0
  585. package/starter/assets/fonts/merriweather/asset.json +7 -0
  586. package/starter/assets/fonts/merriweather/files/1c54f91b910454251c4c2b7bd4e472e1abf265fba7ca3c0ef2eee2f41324099e.ttf +0 -0
  587. package/starter/assets/fonts/merriweather/files/8bde8da2bb7f0265e27ba0481f70bb48d0f98a976c145f2f239c648ddd6532e0.pdf +0 -0
  588. package/starter/assets/fonts/merriweather/files/90b7db4460fcd1a5ca49575c2668a793f3cd6447664d312a068d690e1c01e6bc.ttf +0 -0
  589. package/starter/assets/fonts/merriweather/files/afff81272b7653417bb6f8bef57add055b1f9fda36f27eba5f32b40752bd08da.ttf +0 -0
  590. package/starter/assets/fonts/merriweather/files/e029d3b71e5bae3877c73f4f2b15af28db16593d49b0aed2a328d37ff7075846.ttf +0 -0
  591. package/starter/assets/fonts/merriweather/files/e9864a6790bf712a04e20f3662b206a1535186ed3e877fd859dd5fb9682335df.ttf +0 -0
  592. package/starter/assets/fonts/merriweather/files/fa71baebdd20a7d0de2e5e445a5922530fe9e1d740efbe791f113b682d3cb093.ttf +0 -0
  593. package/starter/assets/fonts/merriweather/revisions/1888e390b3e4f38a3d7cd2dc1bb805aeb6ce13f986a97656f0265fd436bc91d2.json +99 -0
  594. package/starter/assets/fonts/merriweather/source.json +57 -0
  595. package/starter/assets/fonts/open-sans/OFL.txt +92 -0
  596. package/starter/assets/fonts/open-sans/asset.json +7 -0
  597. package/starter/assets/fonts/open-sans/files/1bc0594a83762b2c25d38915a34464b7fec6088298ca22d151757bf98d6700ec.ttf +0 -0
  598. package/starter/assets/fonts/open-sans/files/47ed1cfaa7ffca04a04ab850b2938fd52c09d1b44cfa3e2980878e166b0cbd87.ttf +0 -0
  599. package/starter/assets/fonts/open-sans/files/574939af301f07df8e21cfff279465c5981dd9d9cf62086f7515897df951c6f5.pdf +0 -0
  600. package/starter/assets/fonts/open-sans/files/6d3884d0d57c1b67e9c50c54eca7b69c535c114e76bd7a9cfda0258588185553.ttf +0 -0
  601. package/starter/assets/fonts/open-sans/files/733eb93b167e6d45de09aa768f6c0355647c2c26f5416dbc7407a08ed41e81c6.ttf +0 -0
  602. package/starter/assets/fonts/open-sans/files/75367e6da7d914eaed87883ba51b2a2b5816b5cdbb39f96ec5c81a5b032bfd5a.ttf +0 -0
  603. package/starter/assets/fonts/open-sans/files/ff4fdc11204e0edd14e9a0bb6c374b847a9093b0ec2c16702e03afca79ac4ef7.ttf +0 -0
  604. package/starter/assets/fonts/open-sans/revisions/bbbe3a4915b9bccbc883c0decb4097511c43b6bd09ae22a1516aff128c219bc5.json +99 -0
  605. package/starter/assets/fonts/open-sans/source.json +57 -0
  606. package/starter/assets/fonts/roboto/OFL.txt +93 -0
  607. package/starter/assets/fonts/roboto/asset.json +7 -0
  608. package/starter/assets/fonts/roboto/files/22d45d989248a624252b8382067ac56550212fa675dcdbaf12f03d297dd87a58.pdf +0 -0
  609. package/starter/assets/fonts/roboto/files/35757eaa996b3359022f47f164a67ee9eac04971af24c5b8fbd4b89e844ff190.ttf +0 -0
  610. package/starter/assets/fonts/roboto/files/4d3035883c531846bd1ce2dc89f36d932e72dc114f56062c7e3a9cdd74f3d3ea.ttf +0 -0
  611. package/starter/assets/fonts/roboto/files/be7639306a4fc4a02ce2ae2ff59eb1335e4db4a7379dd0a384ed7cc053817789.ttf +0 -0
  612. package/starter/assets/fonts/roboto/files/d2920cbb1b60a3fd11fbf22049286e43a6baf522d37fdf1e7c89562319bcfea5.ttf +0 -0
  613. package/starter/assets/fonts/roboto/files/dece7c71bbe61710787f0839c722c65e87355dd2eb4a823e6b5488121ff81e4b.ttf +0 -0
  614. package/starter/assets/fonts/roboto/files/f478ba88b0292e685e487901dfbb1401457d32d6ebee4030cdfd5698235bffa8.ttf +0 -0
  615. package/starter/assets/fonts/roboto/revisions/bda5e2d84c17313373dd2dbf3e64fe0dd450c7e1b59e6929e69557e122fe976e.json +99 -0
  616. package/starter/assets/fonts/roboto/source.json +57 -0
  617. package/starter/assets/logos/opendoc/asset.json +6 -0
  618. package/starter/assets/logos/opendoc/files/831d5ccd9eb6709cc8439ea257c03d81452e81a28a3d1eedbd6a3b7daff687b6.png +0 -0
  619. package/starter/assets/logos/opendoc/revisions/834dde8926ddb81de687254195a168bb13bfb77803307f1257de1f2228be63b2.json +33 -0
  620. package/starter/assets/ui-fonts/geist/OFL.txt +93 -0
  621. package/starter/assets/ui-fonts/geist/geist-latin-ext-wght-italic.woff2 +0 -0
  622. package/starter/assets/ui-fonts/geist/geist-latin-ext-wght-normal.woff2 +0 -0
  623. package/starter/assets/ui-fonts/geist/geist-latin-wght-italic.woff2 +0 -0
  624. package/starter/assets/ui-fonts/geist/geist-latin-wght-normal.woff2 +0 -0
  625. package/starter/assets/ui-fonts/geist/source.json +26 -0
  626. package/starter/documents/welcome/assets.json +7 -0
  627. package/starter/documents/welcome/index.tsx +160 -0
  628. package/starter/documents/welcome/media/.gitkeep +0 -0
  629. package/starter/documents/welcome/media/paper-architecture/image.png +0 -0
  630. package/starter/documents/welcome/media/paper-architecture/meta.json +9 -0
  631. package/starter/documents/welcome/media/paper-architecture/prompt.txt +1 -0
  632. package/starter/documents/welcome/media/studio-rhythm/chart.svg +2343 -0
  633. package/starter/documents/welcome/media/studio-rhythm/data.json +234 -0
  634. package/starter/documents/welcome/media/studio-rhythm/generation.json +9 -0
  635. package/starter/documents/welcome/media/studio-rhythm/image.png +0 -0
  636. package/starter/documents/welcome/media/studio-rhythm/meta.json +11 -0
  637. package/starter/documents/welcome/media/studio-rhythm/recipe.py +79 -0
  638. package/starter/documents/welcome/theme.tsx +5 -0
  639. package/starter/documents/welcome-presentation/assets.json +7 -0
  640. package/starter/documents/welcome-presentation/index.tsx +166 -0
  641. package/starter/documents/welcome-presentation/media/.gitkeep +0 -0
  642. package/starter/documents/welcome-presentation/media/paper-architecture/image.png +0 -0
  643. package/starter/documents/welcome-presentation/media/paper-architecture/meta.json +9 -0
  644. package/starter/documents/welcome-presentation/media/paper-architecture/prompt.txt +1 -0
  645. package/starter/documents/welcome-presentation/media/studio-rhythm/chart.svg +1336 -0
  646. package/starter/documents/welcome-presentation/media/studio-rhythm/data.json +234 -0
  647. package/starter/documents/welcome-presentation/media/studio-rhythm/generation.json +9 -0
  648. package/starter/documents/welcome-presentation/media/studio-rhythm/image.png +0 -0
  649. package/starter/documents/welcome-presentation/media/studio-rhythm/meta.json +13 -0
  650. package/starter/documents/welcome-presentation/media/studio-rhythm/recipe.py +49 -0
  651. package/starter/documents/welcome-presentation/theme.tsx +5 -0
  652. package/starter/projects.json +17 -0
  653. package/starter/templates/AGENTS.md +9 -0
  654. package/starter/templates/_shared/BusinessLogo.tsx +14 -0
  655. package/starter/templates/_shared/Pricing.tsx +40 -0
  656. package/starter/templates/_shared/commerce.ts +93 -0
  657. package/starter/templates/brand-guidelines/AGENTS.md +32 -0
  658. package/starter/templates/brand-guidelines/index.tsx +62 -0
  659. package/starter/templates/brand-guidelines/preview.tsx +181 -0
  660. package/starter/templates/brand-guidelines/starter.tsx +179 -0
  661. package/starter/templates/brand-guidelines/template.json +15 -0
  662. package/starter/templates/business-proposal/AGENTS.md +13 -0
  663. package/starter/templates/business-proposal/README.md +36 -0
  664. package/starter/templates/business-proposal/data.json +37 -0
  665. package/starter/templates/business-proposal/examples/long.json +142 -0
  666. package/starter/templates/business-proposal/examples/sparse.json +17 -0
  667. package/starter/templates/business-proposal/examples/typical.json +37 -0
  668. package/starter/templates/business-proposal/index.tsx +59 -0
  669. package/starter/templates/business-proposal/preview.tsx +47 -0
  670. package/starter/templates/business-proposal/schema.ts +14 -0
  671. package/starter/templates/business-proposal/starter.tsx +18 -0
  672. package/starter/templates/business-proposal/template.json +11 -0
  673. package/starter/templates/company-profile/AGENTS.md +48 -0
  674. package/starter/templates/company-profile/index.tsx +69 -0
  675. package/starter/templates/company-profile/preview.tsx +185 -0
  676. package/starter/templates/company-profile/starter.tsx +186 -0
  677. package/starter/templates/company-profile/template.json +15 -0
  678. package/starter/templates/consulting-report/AGENTS.md +11 -0
  679. package/starter/templates/consulting-report/README.md +13 -0
  680. package/starter/templates/consulting-report/RESEARCH.md +10 -0
  681. package/starter/templates/consulting-report/index.tsx +44 -0
  682. package/starter/templates/consulting-report/preview.tsx +39 -0
  683. package/starter/templates/consulting-report/starter.tsx +15 -0
  684. package/starter/templates/consulting-report/template.json +11 -0
  685. package/starter/templates/editorial-essay/AGENTS.md +11 -0
  686. package/starter/templates/editorial-essay/README.md +11 -0
  687. package/starter/templates/editorial-essay/index.tsx +30 -0
  688. package/starter/templates/editorial-essay/preview.tsx +26 -0
  689. package/starter/templates/editorial-essay/starter.tsx +15 -0
  690. package/starter/templates/editorial-essay/template.json +11 -0
  691. package/starter/templates/executive-brief/AGENTS.md +9 -0
  692. package/starter/templates/executive-brief/README.md +11 -0
  693. package/starter/templates/executive-brief/index.tsx +33 -0
  694. package/starter/templates/executive-brief/preview.tsx +37 -0
  695. package/starter/templates/executive-brief/starter.tsx +11 -0
  696. package/starter/templates/executive-brief/template.json +11 -0
  697. package/starter/templates/image-story/AGENTS.md +37 -0
  698. package/starter/templates/image-story/index.tsx +106 -0
  699. package/starter/templates/image-story/preview.tsx +33 -0
  700. package/starter/templates/image-story/starter.tsx +24 -0
  701. package/starter/templates/image-story/template.json +13 -0
  702. package/starter/templates/invoice/AGENTS.md +13 -0
  703. package/starter/templates/invoice/README.md +40 -0
  704. package/starter/templates/invoice/data.json +61 -0
  705. package/starter/templates/invoice/examples/long.json +241 -0
  706. package/starter/templates/invoice/examples/sparse.json +33 -0
  707. package/starter/templates/invoice/examples/typical.json +61 -0
  708. package/starter/templates/invoice/index.tsx +57 -0
  709. package/starter/templates/invoice/preview.tsx +12 -0
  710. package/starter/templates/invoice/schema.ts +45 -0
  711. package/starter/templates/invoice/starter.tsx +12 -0
  712. package/starter/templates/invoice/template.json +11 -0
  713. package/starter/templates/literary-text/AGENTS.md +9 -0
  714. package/starter/templates/literary-text/README.md +11 -0
  715. package/starter/templates/literary-text/index.tsx +31 -0
  716. package/starter/templates/literary-text/preview.tsx +20 -0
  717. package/starter/templates/literary-text/starter.tsx +11 -0
  718. package/starter/templates/literary-text/template.json +11 -0
  719. package/starter/templates/magazine-feature/AGENTS.md +11 -0
  720. package/starter/templates/magazine-feature/README.md +13 -0
  721. package/starter/templates/magazine-feature/index.tsx +41 -0
  722. package/starter/templates/magazine-feature/preview.tsx +34 -0
  723. package/starter/templates/magazine-feature/starter.tsx +15 -0
  724. package/starter/templates/magazine-feature/template.json +11 -0
  725. package/starter/templates/monthly-report/AGENTS.md +11 -0
  726. package/starter/templates/monthly-report/README.md +24 -0
  727. package/starter/templates/monthly-report/data.json +131 -0
  728. package/starter/templates/monthly-report/examples/long.json +519 -0
  729. package/starter/templates/monthly-report/examples/sparse.json +20 -0
  730. package/starter/templates/monthly-report/examples/typical.json +37 -0
  731. package/starter/templates/monthly-report/index.tsx +92 -0
  732. package/starter/templates/monthly-report/preview.tsx +14 -0
  733. package/starter/templates/monthly-report/schema.ts +127 -0
  734. package/starter/templates/monthly-report/starter.tsx +13 -0
  735. package/starter/templates/monthly-report/template.json +11 -0
  736. package/starter/templates/pitch-deck/AGENTS.md +32 -0
  737. package/starter/templates/pitch-deck/index.tsx +46 -0
  738. package/starter/templates/pitch-deck/preview.tsx +142 -0
  739. package/starter/templates/pitch-deck/starter.tsx +140 -0
  740. package/starter/templates/pitch-deck/template.json +15 -0
  741. package/starter/templates/proposal-deck/AGENTS.md +25 -0
  742. package/starter/templates/proposal-deck/index.tsx +52 -0
  743. package/starter/templates/proposal-deck/preview.tsx +172 -0
  744. package/starter/templates/proposal-deck/starter.tsx +168 -0
  745. package/starter/templates/proposal-deck/template.json +7 -0
  746. package/starter/templates/quotation/AGENTS.md +13 -0
  747. package/starter/templates/quotation/README.md +42 -0
  748. package/starter/templates/quotation/data.json +64 -0
  749. package/starter/templates/quotation/examples/long.json +272 -0
  750. package/starter/templates/quotation/examples/sparse.json +31 -0
  751. package/starter/templates/quotation/examples/typical.json +64 -0
  752. package/starter/templates/quotation/index.tsx +51 -0
  753. package/starter/templates/quotation/preview.tsx +12 -0
  754. package/starter/templates/quotation/schema.ts +27 -0
  755. package/starter/templates/quotation/starter.tsx +12 -0
  756. package/starter/templates/quotation/template.json +11 -0
  757. package/starter/templates/scientific-paper/AGENTS.md +11 -0
  758. package/starter/templates/scientific-paper/README.md +13 -0
  759. package/starter/templates/scientific-paper/index.tsx +47 -0
  760. package/starter/templates/scientific-paper/preview.tsx +43 -0
  761. package/starter/templates/scientific-paper/starter.tsx +15 -0
  762. package/starter/templates/scientific-paper/template.json +11 -0
  763. package/starter/themes/Specimen.tsx +54 -0
  764. package/starter/themes/civic-spectrum/components.tsx +92 -0
  765. package/starter/themes/civic-spectrum/design.md +70 -0
  766. package/starter/themes/civic-spectrum/index.ts +57 -0
  767. package/starter/themes/civic-spectrum/preview.tsx +66 -0
  768. package/starter/themes/field-manual/components.tsx +106 -0
  769. package/starter/themes/field-manual/design.md +72 -0
  770. package/starter/themes/field-manual/index.ts +57 -0
  771. package/starter/themes/field-manual/preview.tsx +82 -0
  772. package/starter/themes/index.ts +3 -0
  773. package/starter/themes/mckinsey-consulting/components.tsx +69 -0
  774. package/starter/themes/mckinsey-consulting/design.md +68 -0
  775. package/starter/themes/mckinsey-consulting/index.ts +60 -0
  776. package/starter/themes/mckinsey-consulting/preview.tsx +53 -0
  777. package/starter/themes/neutral/design.md +35 -0
  778. package/starter/themes/neutral/index.ts +21 -0
  779. package/starter/themes/neutral/preview.tsx +4 -0
  780. package/starter/themes/opendoc-neutral/components.tsx +77 -0
  781. package/starter/themes/opendoc-neutral/design.md +70 -0
  782. package/starter/themes/opendoc-neutral/index.ts +54 -0
  783. package/starter/themes/opendoc-neutral/preview.tsx +43 -0
  784. package/starter/themes/types.ts +3 -0
  785. package/tsconfig.workspace.json +24 -0
  786. package/vendor/formepdf/LICENSE +21 -0
  787. package/vendor/formepdf/README.md +97 -0
  788. package/vendor/formepdf/font-subset.patch +228 -0
  789. package/vendor/formepdf/text-writer.patch +507 -0
@@ -0,0 +1,57 @@
1
+ import type { DocTheme } from 'opendoc/themes';
2
+
3
+ /** Civic Spectrum signal colors with the owner's requested white page surface. */
4
+ export const colors = {
5
+ stock: '#FFFFFF', ink: '#17232B', blue: '#2F7EA5', muted: '#68747A', rule: '#C9CEC7',
6
+ sky: '#7ABED0', leaf: '#5F9D7A', sun: '#E3C84F', flame: '#E27D47', violet: '#7D6FA6',
7
+ inverse: '#F8F5EC', inverseMuted: '#B9C2C3', inverseRule: '#516068',
8
+ } as const;
9
+
10
+ export const metrics = {
11
+ margin: 48, bottomMargin: 56, columns: 6, gutter: 12, baseline: 4,
12
+ mainWidth: 328, railHeight: 12, signalSize: 8, badgeSize: 132,
13
+ railWeights: [2, 1, 3, 1.5, 2, 1],
14
+ } as const;
15
+
16
+ export const theme: DocTheme = {
17
+ id: 'civic-spectrum', name: 'Civic Spectrum',
18
+ description: 'Warm civic modernism: an unequal spectrum rail, square signals, compact grotesk type, and generous asymmetric space.',
19
+ body: 'OpenDoc Sans', heading: 'OpenDoc Sans',
20
+ ink: colors.ink, muted: colors.muted, accent: colors.blue, paper: colors.stock, line: colors.rule,
21
+ fontSize: 11, lineHeight: 1.5, margin: metrics.margin, paragraphGap: 12,
22
+ pageSize: 'A4', runningHeader: true, runningFooter: true, footerLabel: 'Civic Spectrum',
23
+ useFor: ['Public information', 'Community and cultural reports', 'Editorial explainers'],
24
+ principles: ['One grid, many voices.', 'Use color to classify.', 'Make space part of the structure.'],
25
+ palette: [
26
+ { name: 'Signal blue', value: colors.blue, role: 'Orientation and the primary emphasis' },
27
+ { name: 'Sky', value: colors.sky, role: 'Supporting information' },
28
+ { name: 'Leaf', value: colors.leaf, role: 'Progress and participation' },
29
+ { name: 'Sun', value: colors.sun, role: 'Attention and selected evidence' },
30
+ { name: 'Flame', value: colors.flame, role: 'Action and urgency' },
31
+ { name: 'Violet', value: colors.violet, role: 'Context and reflection' },
32
+ { name: 'Stock', value: colors.stock, role: 'White page surface' },
33
+ { name: 'Ink', value: colors.ink, role: 'Primary text and inverse surface' },
34
+ { name: 'Muted', value: colors.muted, role: 'Secondary text' },
35
+ { name: 'Rule', value: colors.rule, role: 'Quiet structural boundaries' },
36
+ ],
37
+ geometry: ['A4 portrait; 48 pt margins; six columns with 12 pt gutters.', 'Unequal rail: 2 : 1 : 3 : 1.5 : 2 : 1; 12 pt high.', 'Square 8 pt signals and 132 pt outlined or solid badges.', 'Four-column reading field with a two-column supporting field.', '4 pt baseline; square corners; no gradients or shadows.'],
38
+ design: {
39
+ page: { margin: { top: 48, right: 48, bottom: 56, left: 48 }, style: { backgroundColor: colors.stock } },
40
+ typography: {
41
+ h1: { fontSize: 42, lineHeight: 1.04, letterSpacing: -0.8, marginBottom: 20 },
42
+ h2: { fontSize: 23, lineHeight: 1.1, letterSpacing: -0.35, marginTop: 24, marginBottom: 12 },
43
+ h3: { fontSize: 14, lineHeight: 1.2, marginTop: 20, marginBottom: 8 },
44
+ label: { fontSize: 8, fontWeight: 600, letterSpacing: 1.1, color: colors.ink },
45
+ lead: { fontSize: 16, lineHeight: 1.4, color: colors.muted },
46
+ small: { fontSize: 8, lineHeight: 1.35, color: colors.muted },
47
+ caption: { fontSize: 9, lineHeight: 1.4, color: colors.muted },
48
+ },
49
+ title: { block: { borderBottomWidth: 0, borderTopWidth: 5, borderColor: colors.blue, paddingTop: 20, paddingBottom: 0, marginBottom: 28 }, heading: { fontSize: 42 }, eyebrow: { marginBottom: 16 } },
50
+ cover: { page: { backgroundColor: colors.stock }, block: { borderTopWidth: 12, borderColor: colors.blue, marginTop: 40, paddingTop: 32 }, title: { fontSize: 52, lineHeight: 1.02, letterSpacing: -1.1 } },
51
+ furniture: { uppercaseHeader: false, header: { fontSize: 8, letterSpacing: 0.4, paddingBottom: 20 }, footer: { borderTopWidth: 0.75, borderColor: colors.rule, paddingTop: 12 }, text: { fontSize: 8, fontWeight: 600, color: colors.ink }, pageNumber: 'page' },
52
+ table: { header: { backgroundColor: colors.ink, borderBottomWidth: 0 }, headerText: { color: colors.inverse, fontWeight: 600, fontSize: 9 }, cell: { padding: 10, borderBottomWidth: 0.5, borderColor: colors.rule }, text: { fontSize: 10 }, alternate: colors.stock },
53
+ figure: { block: { marginTop: 12, marginBottom: 24 } },
54
+ callout: { block: { backgroundColor: colors.sun, borderLeftWidth: 0, padding: 16, marginTop: 12, marginBottom: 20 }, title: { color: colors.ink, fontSize: 10, letterSpacing: 0 }, text: { color: colors.ink } },
55
+ list: { block: { paddingLeft: 0 }, item: { marginBottom: 8 }, gap: 8, markerWidth: 12 },
56
+ },
57
+ };
@@ -0,0 +1,66 @@
1
+ import * as F from '@formepdf/react';
2
+ import { Callout, DataTable, Document, Figure, Heading, Paragraph, Section, Strong } from 'opendoc';
3
+ import { CivicBadge, CivicOpening, CivicPages, CivicSplit, SignalBlock, SpectrumLegend, SpectrumRail, SquareSignal } from './components';
4
+ import { colors, theme } from './index';
5
+
6
+ export const meta = { title: 'Civic Spectrum — Systems people can read', description: theme.description, theme: theme.id };
7
+
8
+ function Identity() {
9
+ return <CivicPages title="Civic Spectrum / Design system" section="CS—01" footer="Civic Spectrum · Identity" rail>
10
+ <SquareSignal id="civic-identity-label" label="A civic language for print" />
11
+ <F.View style={{ marginTop: 28, marginBottom: 32 }}>
12
+ <CivicSplit id="civic-identity-split"
13
+ main={<><Heading id="civic-identity-title" level={1} style={{ fontSize: 54, lineHeight: 0.98, letterSpacing: -1.25, marginBottom: 20 }}>{'Civic\nSpectrum'}</Heading><Paragraph id="civic-identity-line" style={{ fontSize: 22, lineHeight: 1.15, width: 270 }}>Systems people can read.</Paragraph></>}
14
+ aside={<F.View style={{ paddingTop: 12 }}><CivicBadge id="civic-identity-badge" value="01" label="One system. Many public voices." /></F.View>} />
15
+ </F.View>
16
+ <F.View style={{ marginBottom: 24 }}><SquareSignal id="civic-palette-label" label="Six signals / precise roles" color={colors.leaf} /></F.View>
17
+ <SpectrumLegend id="civic-palette" />
18
+ <Paragraph id="civic-neutral-palette" style={{ fontFamily: 'OpenDoc Mono', fontSize: 8, color: colors.muted, marginBottom: 32 }}>{`STOCK ${colors.stock} · INK ${colors.ink} · RULE ${colors.rule}`}</Paragraph>
19
+ <CivicSplit id="civic-geometry-split"
20
+ main={<><Heading id="civic-geometry-title" level={2} style={{ marginTop: 0 }}>An unequal rhythm.</Heading><Paragraph id="civic-geometry-copy">The rail has six unequal lengths: <Strong>2 : 1 : 3 : 1.5 : 2 : 1</Strong>. A six-column print grid makes room for a wide reading field and a smaller supporting voice.</Paragraph><SpectrumRail height={8} /></>}
21
+ aside={<F.View style={{ borderTopWidth: 0.75, borderColor: colors.ink, paddingTop: 12 }}><F.Text style={{ fontSize: 32, fontWeight: 600, lineHeight: 1, color: colors.blue }}>6 / 12 / 4</F.Text><F.Text style={{ fontSize: 9, lineHeight: 1.45, marginTop: 12, color: colors.muted }}>{'Columns / gutter / baseline\nA4 · 48 pt margins\nSquare corners throughout'}</F.Text></F.View>} />
22
+ </CivicPages>;
23
+ }
24
+
25
+ function Reading() {
26
+ return <CivicPages title="Civic Spectrum / Applied reading" section="CS—02" footer="Illustrative community brief">
27
+ <CivicSplit id="civic-reading-layout"
28
+ main={<>
29
+ <CivicOpening id="civic-reading-opening" kicker="Community brief / Sample" title={'A place\nto gather.'} subtitle="Public information can be direct, generous, and warm." color={colors.leaf} />
30
+ <Paragraph id="civic-reading-intro">Imagine a neighborhood hall opening its doors for a shared workshop. A useful notice tells people where they belong, what they can do, and how to take the next step.</Paragraph>
31
+ <Section id="civic-reading-orient" title="Start with the person." lead="Give readers a clear entry point. Name the place and purpose before explaining the program.">
32
+ <Paragraph id="civic-reading-body">A strong hierarchy lets someone scan the essentials and then stay for the detail. The wide column carries the story. The narrower field carries a small set of signs: orientation, explanation, action.</Paragraph>
33
+ </Section>
34
+ <Section id="civic-reading-space" title="Leave useful space." lead="Empty space can separate different voices without drawing another box around them.">
35
+ <Paragraph id="civic-reading-space-copy">This composition keeps the main passage on four columns. Short supporting modules occupy two. Their top edges, square markers, and repeated spacing make the page feel like one system.</Paragraph>
36
+ </Section>
37
+ </>}
38
+ aside={<F.View style={{ paddingTop: 52 }}>
39
+ <SignalBlock id="civic-orient" code="01" title="Orient" color={colors.blue}>Establish the place, sequence, and purpose.</SignalBlock>
40
+ <SignalBlock id="civic-explain" code="02" title="Explain" color={colors.sun}>Give each part a clear role and a readable label.</SignalBlock>
41
+ <SignalBlock id="civic-move" code="03" title="Move" color={colors.flame}>Make the next action easy to find.</SignalBlock>
42
+ <F.View style={{ marginTop: 20 }}><CivicBadge id="civic-reading-badge" value="Aa" color={colors.sun} filled label="OpenDoc Sans · clear grotesk reading and display type" /></F.View>
43
+ </F.View>} />
44
+ </CivicPages>;
45
+ }
46
+
47
+ function Evidence() {
48
+ return <CivicPages title="Civic Spectrum / Applied evidence" section="CS—03" footer="Illustrative space allocation">
49
+ <CivicOpening id="civic-evidence-opening" kicker="Example allocation / Synthetic" title="Make the whole visible." subtitle="A simple partition shows how one shared room could be used." />
50
+ <Figure id="civic-allocation" caption="A notional 120 m² room, divided by activity." sourceNote="Illustrative dimensions only. This is a design demonstration, not a measured plan.">
51
+ <F.View style={{ flexDirection: 'row', gap: 4, height: 156 }}>
52
+ <F.View style={{ flex: 2, backgroundColor: colors.blue, padding: 12, justifyContent: 'space-between' }}><F.Text style={{ fontSize: 10, color: colors.inverse }}>Arrival</F.Text><F.Text style={{ fontSize: 25, lineHeight: 1, fontWeight: 600, color: colors.inverse }}>24</F.Text></F.View>
53
+ <F.View style={{ flex: 5, backgroundColor: colors.leaf, padding: 16, justifyContent: 'space-between' }}><F.Text style={{ fontSize: 12, color: colors.ink, fontWeight: 600 }}>Workshop</F.Text><F.Text style={{ fontSize: 54, lineHeight: 1, fontWeight: 600, letterSpacing: -1, color: colors.ink }}>60</F.Text></F.View>
54
+ <F.View style={{ flex: 3, backgroundColor: colors.sky, padding: 12, justifyContent: 'space-between' }}><F.Text style={{ fontSize: 10, color: colors.ink }}>Shared tables</F.Text><F.Text style={{ fontSize: 34, lineHeight: 1, fontWeight: 600, color: colors.ink }}>36</F.Text></F.View>
55
+ </F.View>
56
+ </Figure>
57
+ <DataTable id="civic-allocation-table" caption="The allocation in exact values."
58
+ columns={[{ label: 'Activity', width: 2 }, { label: 'Area (m²)' }, { label: 'Share' }]}
59
+ rows={[['Arrival', 24, '20%'], ['Workshop', 60, '50%'], ['Shared tables', 36, '30%']]} />
60
+ <Callout id="civic-allocation-note" title="Color carries the category.">Blue marks arrival, leaf marks participation, and sky supports shared activity. The yellow note asks for attention; it does not become a fourth data category.</Callout>
61
+ </CivicPages>;
62
+ }
63
+
64
+ export default function Preview() {
65
+ return <Document title={meta.title} theme={theme}><Identity /><Reading /><Evidence /></Document>;
66
+ }
@@ -0,0 +1,106 @@
1
+ import { Fragment, type ReactNode } from 'react';
2
+ import * as F from '@formepdf/react';
3
+ import { Block, Heading, Page, Paragraph } from 'opendoc';
4
+ import { colors, metrics } from './index';
5
+
6
+ export type ManualSurface = 'light' | 'dark';
7
+ const surface = (value: ManualSurface) => value === 'dark'
8
+ ? { bg: colors.dark, ink: colors.inverse, muted: colors.inverseMuted, rule: colors.inverseRule }
9
+ : { bg: colors.stock, ink: colors.ink, muted: colors.muted, rule: colors.rule };
10
+
11
+ /** Normal flowing pages, with genuine repeated fixed revision furniture. */
12
+ export function ManualPages({ title, code = 'FM—01', revision = 'REV 01', surface: mode = 'light', children }: {
13
+ title: string; code?: string; revision?: string; surface?: ManualSurface; children: ReactNode;
14
+ }) {
15
+ const c = surface(mode);
16
+ return <Page size="A4" margin={{ top: metrics.margin, right: metrics.margin, bottom: metrics.bottomMargin, left: metrics.margin }} style={{ backgroundColor: c.bg }}>
17
+ <F.Fixed position="header"><F.View style={{ flexDirection: 'row', justifyContent: 'space-between', borderBottomWidth: 0.75, borderColor: c.rule, paddingBottom: 12, marginBottom: 16 }}>
18
+ <F.Text style={{ fontFamily: 'OpenDoc Mono', fontSize: 7.5, color: c.muted }}>{title}</F.Text>
19
+ <F.Text style={{ fontFamily: 'OpenDoc Mono', fontSize: 7.5, color: c.muted }}>{revision}</F.Text>
20
+ </F.View></F.Fixed>
21
+ <F.Fixed position="footer"><F.View style={{ flexDirection: 'row', justifyContent: 'space-between', borderTopWidth: 0.75, borderColor: c.rule, paddingTop: 12 }}>
22
+ <F.Text style={{ fontFamily: 'OpenDoc Mono', fontSize: 7.5, color: c.muted }}>{code} / FIELD MANUAL</F.Text>
23
+ <F.Text style={{ fontFamily: 'OpenDoc Mono', fontSize: 7.5, color: c.muted }}>{'{{pageNumber}}'}</F.Text>
24
+ </F.View></F.Fixed>
25
+ {children}
26
+ </Page>;
27
+ }
28
+
29
+ export function ManualCode({ id, code, label, surface: mode = 'light' }: { id: string; code: string; label: string; surface?: ManualSurface }) {
30
+ const c = surface(mode);
31
+ return <Block id={id} style={{ flexDirection: 'row', alignItems: 'center', gap: 12 }}>
32
+ <F.View style={{ backgroundColor: colors.orange, paddingTop: 5, paddingBottom: 5, paddingLeft: 8, paddingRight: 8 }}>
33
+ <F.Text style={{ fontFamily: 'OpenDoc Mono', fontWeight: 400, fontSize: 8, color: colors.ink }}>{code}</F.Text>
34
+ </F.View>
35
+ <F.Text style={{ fontFamily: 'OpenDoc Mono', fontWeight: 400, fontSize: 8, letterSpacing: 0.4, color: c.ink }}>{label.toUpperCase()}</F.Text>
36
+ </Block>;
37
+ }
38
+
39
+ export function ManualSpine({ id, children }: { id: string; children: ReactNode }) {
40
+ return <Block id={id} style={{ borderLeftWidth: metrics.spine, borderColor: colors.orange, paddingLeft: metrics.inset }}>{children}</Block>;
41
+ }
42
+
43
+ export function ManualOpening({ id, code, label, title, subtitle, surface: mode = 'light' }: {
44
+ id: string; code: string; label: string; title: string; subtitle?: string; surface?: ManualSurface;
45
+ }) {
46
+ const c = surface(mode);
47
+ return <F.View wrap={false} style={{ marginBottom: 28 }}>
48
+ <ManualCode id={`${id}-code`} code={code} label={label} surface={mode} />
49
+ <Heading id={`${id}-title`} level={1} style={{ color: c.ink, marginTop: 24 }}>{title}</Heading>
50
+ {subtitle && <Paragraph id={`${id}-subtitle`} role="lead" style={{ color: c.muted, marginBottom: 0 }}>{subtitle}</Paragraph>}
51
+ </F.View>;
52
+ }
53
+
54
+ /** The label/value field is usable for actual metadata, definitions, and revision records. */
55
+ export function SpecRows({ id, rows, surface: mode = 'light' }: {
56
+ id: string; rows: { label: string; value: string }[]; surface?: ManualSurface;
57
+ }) {
58
+ const c = surface(mode);
59
+ return <Block id={id}>
60
+ {rows.map(row => <F.View key={row.label} wrap={false} style={{ borderTopWidth: metrics.rule, borderColor: c.rule, paddingTop: 8, paddingBottom: 12, flexDirection: 'row', gap: 8 }}>
61
+ <F.Text style={{ width: metrics.labelWidth, flexShrink: 0, fontFamily: 'OpenDoc Mono', fontSize: 7.5, color: c.muted }}>{row.label.toUpperCase()}</F.Text>
62
+ <F.Text style={{ flex: 1, minWidth: 0, fontFamily: 'OpenDoc Mono', fontSize: 8, lineHeight: 1.35, color: c.ink }}>{row.value}</F.Text>
63
+ </F.View>)}
64
+ </Block>;
65
+ }
66
+
67
+ export function EvidenceChain({ id, steps }: {
68
+ id: string; steps: [{ title: string; detail: string }, { title: string; detail: string }, { title: string; detail: string }];
69
+ }) {
70
+ return <Block id={id} style={{ flexDirection: 'row', alignItems: 'stretch', marginTop: 8, marginBottom: 24 }}>
71
+ {steps.map((step, index) => <Fragment key={step.title}>
72
+ {index > 0 && <F.Text style={{ width: 20, flexShrink: 0, alignSelf: 'center', textAlign: 'center', fontFamily: 'OpenDoc Sans', fontSize: 16, color: colors.muted }}>→</F.Text>}
73
+ <F.View style={{ flex: 1, minWidth: 0, borderTopWidth: 4, borderColor: index === 1 ? colors.orange : colors.ink, backgroundColor: index === 1 ? colors.paper : colors.panel, padding: 12 }}>
74
+ <F.Text style={{ fontFamily: 'OpenDoc Mono', fontSize: 7.5, color: index === 1 ? colors.orange : colors.muted }}>{`0${index + 1} / ${['INPUT', 'METHOD', 'OUTPUT'][index]}`}</F.Text>
75
+ <F.Text style={{ fontSize: 23, lineHeight: 1.1, fontWeight: 600, letterSpacing: -0.4, color: colors.ink, marginTop: 24, marginBottom: 12 }}>{step.title}</F.Text>
76
+ <F.Text style={{ fontSize: 10, lineHeight: 1.45, color: colors.muted }}>{step.detail}</F.Text>
77
+ </F.View>
78
+ </Fragment>)}
79
+ </Block>;
80
+ }
81
+
82
+ export function ManualAnnotation({ id, code, children, surface: mode = 'light' }: { id: string; code: string; children: ReactNode; surface?: ManualSurface }) {
83
+ const c = surface(mode);
84
+ return <Block id={id} style={{ flexDirection: 'row', gap: 16, borderTopWidth: 0.75, borderColor: c.rule, paddingTop: 12, marginTop: 12, marginBottom: 20 }}>
85
+ <F.Text style={{ width: 68, fontFamily: 'OpenDoc Mono', fontSize: 8, color: colors.orange }}>{code}</F.Text>
86
+ <F.Text style={{ flex: 1, minWidth: 0, fontSize: 10, lineHeight: 1.5, color: c.muted }}>{children}</F.Text>
87
+ </Block>;
88
+ }
89
+
90
+ /** A whole directive page; use only for a real revision, handover, or closing instruction. */
91
+ export function DirectivePage({ id, code, revision, title, lead, rows }: {
92
+ id: string; code: string; revision: string; title: string; lead: string; rows: { label: string; value: string }[];
93
+ }) {
94
+ return <ManualPages title="Directive / Field Manual" code={code} revision={revision} surface="dark">
95
+ <F.View style={{ height: 6, backgroundColor: colors.orange, marginBottom: 40 }} />
96
+ <ManualCode id={`${id}-code`} code={revision} label="Closing directive" surface="dark" />
97
+ <F.View style={{ marginTop: 36, marginBottom: 36 }}>
98
+ <ManualSpine id={`${id}-spine`}>
99
+ <Heading id={`${id}-title`} level={1} style={{ color: colors.inverse, fontSize: 48, lineHeight: 1.02, letterSpacing: -1, marginBottom: 24 }}>{title}</Heading>
100
+ <Paragraph id={`${id}-lead`} style={{ width: 340, fontSize: 15, lineHeight: 1.5, color: colors.inverseMuted, marginBottom: 0 }}>{lead}</Paragraph>
101
+ </ManualSpine>
102
+ </F.View>
103
+ <SpecRows id={`${id}-record`} rows={rows} surface="dark" />
104
+ <ManualAnnotation id={`${id}-note`} code="FM / RULE" surface="dark">A revision is useful when a reader can see what changed, why it changed, and which check comes next.</ManualAnnotation>
105
+ </ManualPages>;
106
+ }
@@ -0,0 +1,72 @@
1
+ # Field Manual
2
+
3
+ **Evidence before ornament.** Field Manual is a technical publishing system with warm stock, dense ink, a safety-orange spine, coded annotations, and visible revision information. Use it for manuals, evidence dossiers, decision records, and operational handovers. Every line identifies, divides, connects, or measures something. It is not a nostalgic imitation of an agency document.
4
+
5
+ ## Palette and function
6
+
7
+ | Role | Hex | Use |
8
+ | --- | --- | --- |
9
+ | Safety orange | `#F05A28` | Priority, active reasoning step, revision, change |
10
+ | Ink | `#16191B` | Main copy and strong structure |
11
+ | Stock | `#F2F0E8` | Warm technical-paper page |
12
+ | Paper | `#FCFAF4` | Lifted evidence field, without a shadow |
13
+ | Panel | `#E5E3DB` | Supporting modules and table headers |
14
+ | Rule | `#BFC2BC` | Quiet borders and technical structure |
15
+ | Muted | `#656B6E` | Qualifiers, annotations, and secondary labels |
16
+ | Dark | `#171A1C` | A directive or revision page |
17
+ | Inverse | `#F6F3EA` | Main text on dark |
18
+ | Inverse notes | `#AEB4B5` | Supporting text on dark |
19
+ | Inverse rule | `#4B5154` | Structure on dark |
20
+
21
+ Orange has a job. Use it for one active step, a meaningful priority, or a revision signal. Routine prose remains Ink. Do not color every number orange or use warning symbolism for ordinary content. On orange fields, use Ink text. Dark pages use Inverse and Inverse notes, with the same orange retained as a signal.
22
+
23
+ ## Print grid and geometry
24
+
25
+ Use **A4 portrait**, **44 pt top/side margins**, and a **52 pt bottom margin**. The content field is approximately 507 pt wide. Use a **4 pt baseline** and prefer 12, 16, 24, and 32 pt gaps. Ordinary explanatory text can occupy a **328 pt field**, leaving a structured annotation strip. A deliberate opening can use a wider display span while keeping metadata in a narrow field.
26
+
27
+ The signature is a **6 pt vertical orange spine** with an **18 pt content inset**. It introduces an opening or a major directive. Do not replace it with caution stripes. Fine structural rules are **0.75 pt**; evidence modules use **4 pt top rules**. Corners are square, with no shadows or rounded-card treatment. A light Paper field can distinguish a source or method without implying elevation.
28
+
29
+ The three-step evidence chain is **Source → Reason → Act**: equal-width modules, **20 pt connector fields**, **12 pt internal padding**, and straight arrows. Source names an observation, record, or constraint; Reason explains the transformation or judgment; Act states the result, owner, and next condition. Orange marks Reason in the standard demonstration. It may identify another active step only when the content makes that status explicit.
30
+
31
+ ## Type system
32
+
33
+ Use **OpenDoc Sans**, the local Source Sans 3 derivative, for display and prose. It substitutes for the original Public Sans. Use **OpenDoc Mono**, the local Source Code Pro derivative, for codes, revision labels, units, and annotations. Both are already embedded by OpenDoc. Mono has a real regular face; keep it at 400 instead of requesting an unavailable bold face. Display and emphasis use the real Sans 600 face.
34
+
35
+ | Role | Size / line height | Treatment |
36
+ | --- | --- | --- |
37
+ | Identity display | 52 pt / 0.98 | Tracking −1.2 pt; compact and declarative |
38
+ | Main title | 38 pt / 1.02 | Tracking −0.75 pt; 20 pt after |
39
+ | Directive title | 48 pt / 1.02 | Inverse on Dark; orange spine |
40
+ | Section | 21 pt / 1.10 | 24 pt before, 12 after |
41
+ | Subheading | 13 pt / 1.20 | 20 pt before, 8 after |
42
+ | Lead | 14 pt / 1.45 | Muted; short measure |
43
+ | Body | 10.5 pt / 1.50 | 12 pt paragraph gap |
44
+ | Caption/code label | 8 pt / 1.40 | Mono; concrete information only |
45
+ | Running note | 7.5 pt / 1.40 | Mono; use sparingly, never for the main argument |
46
+
47
+ Use sentence case for claims. Uppercase belongs to short document codes, revisions, classifications, and units. Do not invent tiny decorative labels to make an empty page look technical. Long content flows; a manual is not a stack of fixed-position posters.
48
+
49
+ ## Reusable component API
50
+
51
+ Import `theme` from `themes/field-manual`, and import the following from `components.tsx`. Place the components inside an OpenDoc `Document` using that theme.
52
+
53
+ - `ManualPages({title, code?, revision?, surface?, children})` supplies flowing pages and actual repeating header/footer records. `surface` is `light` or `dark`.
54
+ - `ManualCode({id, code, label, surface?})` pairs an orange code badge with a mono classification.
55
+ - `ManualSpine({id, children})` provides the exact 6/18 pt opening geometry.
56
+ - `ManualOpening({id, code, label, title, subtitle?, surface?})` keeps the title and its supporting line with the code.
57
+ - `SpecRows({id, rows, surface?})` takes `{label, value}` records. Labels occupy 68 pt; values flow beside them. Use real metadata, definitions, or revision information.
58
+ - `EvidenceChain({id, steps})` takes exactly three `{title, detail}` entries in source/method/action order.
59
+ - `ManualAnnotation({id, code, surface?, children})` separates a quiet explanatory note from the main reading field.
60
+ - `DirectivePage({id, code, revision, title, lead, rows})` creates a full dark closing/revision page with an orange rule and spine. It is reusable publication content, not a preview-only graphic.
61
+
62
+ Preserve stable IDs and real record identity. Avoid wrapping a whole long section in an unbreakable component. Normal `TitleBlock`, headings, tables, figures, lists, code, and callouts also receive executable theme styles.
63
+
64
+ ## Evidence and image rules
65
+
66
+ Tables expose units in headers, align numbers, use 9 pt cell padding, and favor horizontal rules. Header borders paint through cells because the current PDF engine ignores borders on a table row. Put sources and qualifications close to the exhibit. The demonstration handover is illustrative; it claims no operational findings.
67
+
68
+ Charts stay mostly monochrome unless orange identifies the one comparison that matters. Diagrams name inputs, methods, outputs, and evidence links; use straight connectors. Images retain their aspect ratio and readable detail. Add a crop only when it preserves the relevant evidence. Brand marks use supplied assets and real provenance. Avoid gradients, grunge, faux stamps, agency insignia, ornamental coordinates, and automatic warning icons.
69
+
70
+ ## Implementation and review
71
+
72
+ The system combines an orange spine, mono record labels, the Source / Reason / Act chain, and a dark directive composition. It uses flowing A4 pages and bundled OpenDoc Sans and Mono. Keep this specification synchronized with `index.ts` and the theme components. Review every page, dark-background visibility, repeated revision furniture, narrow metadata values, table continuation, and copied PDF text.
@@ -0,0 +1,57 @@
1
+ import type { DocTheme } from 'opendoc/themes';
2
+
3
+ export const colors = {
4
+ stock: '#F2F0E8', ink: '#16191B', orange: '#F05A28', muted: '#656B6E', rule: '#BFC2BC',
5
+ panel: '#E5E3DB', paper: '#FCFAF4', dark: '#171A1C', inverse: '#F6F3EA',
6
+ inverseMuted: '#AEB4B5', inverseRule: '#4B5154',
7
+ } as const;
8
+
9
+ export const metrics = {
10
+ margin: 44, bottomMargin: 52, spine: 6, inset: 18, gutter: 16,
11
+ baseline: 4, mainWidth: 328, labelWidth: 68, rule: 0.75,
12
+ } as const;
13
+
14
+ export const theme: DocTheme = {
15
+ id: 'field-manual', name: 'Field Manual',
16
+ description: 'Evidence-first technical publishing: warm stock, a safety-orange spine, mono codes and revisions, traceable chains, and decisive dark pages.',
17
+ body: 'OpenDoc Sans', heading: 'OpenDoc Sans', ink: colors.ink, muted: colors.muted,
18
+ accent: colors.orange, paper: colors.paper, line: colors.rule,
19
+ fontSize: 10.5, lineHeight: 1.5, margin: metrics.margin, paragraphGap: 12,
20
+ pageSize: 'A4', runningHeader: true, runningFooter: true, footerLabel: 'Field Manual / Revision 01',
21
+ useFor: ['Technical manuals', 'Evidence and decision records', 'Operational handovers'],
22
+ principles: ['Evidence before ornament.', 'Expose source, reasoning, and action.', 'Document what changes.'],
23
+ palette: [
24
+ { name: 'Safety orange', value: colors.orange, role: 'Priority, active step, change' },
25
+ { name: 'Ink', value: colors.ink, role: 'Main text and structural emphasis' },
26
+ { name: 'Stock', value: colors.stock, role: 'Technical-paper page surface' },
27
+ { name: 'Paper', value: colors.paper, role: 'Evidence fields' },
28
+ { name: 'Panel', value: colors.panel, role: 'Supporting modules and table bands' },
29
+ { name: 'Rule', value: colors.rule, role: 'Fine structure' },
30
+ { name: 'Muted', value: colors.muted, role: 'Annotations and qualifiers' },
31
+ { name: 'Dark', value: colors.dark, role: 'Directive and revision surface' },
32
+ { name: 'Inverse', value: colors.inverse, role: 'Main text on dark' },
33
+ { name: 'Inverse muted', value: colors.inverseMuted, role: 'Notes on dark' },
34
+ ],
35
+ geometry: ['A4 portrait; 44 pt margins; 4 pt baseline.', '6 pt vertical orange spine; 18 pt content inset.', '328 pt reading field plus structured annotation strip.', 'Source → Reason → Act modules; straight connectors; 4 pt top rules.', 'Square corners, 0.75 pt structural rules, mono codes and revision furniture.'],
36
+ design: {
37
+ page: { margin: { top: 44, right: 44, bottom: 52, left: 44 }, style: { backgroundColor: colors.stock } },
38
+ typography: {
39
+ h1: { fontSize: 38, lineHeight: 1.02, letterSpacing: -0.75, marginBottom: 20 },
40
+ h2: { fontSize: 21, lineHeight: 1.1, letterSpacing: -0.3, marginTop: 24, marginBottom: 12 },
41
+ h3: { fontSize: 13, lineHeight: 1.2, marginTop: 20, marginBottom: 8 },
42
+ label: { fontFamily: 'OpenDoc Mono', fontSize: 8, fontWeight: 400, letterSpacing: 0.6, color: colors.ink },
43
+ lead: { fontSize: 14, lineHeight: 1.45, color: colors.muted },
44
+ small: { fontFamily: 'OpenDoc Mono', fontSize: 7.5, fontWeight: 400, lineHeight: 1.4, color: colors.muted },
45
+ caption: { fontFamily: 'OpenDoc Mono', fontSize: 8, fontWeight: 400, lineHeight: 1.4, color: colors.muted },
46
+ code: { fontFamily: 'OpenDoc Mono', fontSize: 9, fontWeight: 400, lineHeight: 1.45, color: colors.ink },
47
+ },
48
+ title: { block: { borderBottomWidth: 0, borderLeftWidth: 6, borderColor: colors.orange, paddingLeft: 18, paddingBottom: 12, marginBottom: 28 }, eyebrow: { marginBottom: 16, color: colors.muted }, heading: { fontSize: 38, marginBottom: 18 }, byline: { fontFamily: 'OpenDoc Mono' } },
49
+ cover: { page: { backgroundColor: colors.stock }, block: { borderTopWidth: 0, borderLeftWidth: 6, borderColor: colors.orange, paddingLeft: 18, paddingTop: 0, marginTop: 48 }, title: { fontSize: 50, lineHeight: 1.02, letterSpacing: -1 } },
50
+ furniture: { uppercaseHeader: false, header: { paddingBottom: 12, borderBottomWidth: 0.75, borderColor: colors.rule, marginBottom: 12 }, text: { fontFamily: 'OpenDoc Mono', fontSize: 7.5, fontWeight: 400, color: colors.muted }, footer: { borderTopWidth: 0.75, paddingTop: 10 }, pageNumber: 'total' },
51
+ table: { header: { backgroundColor: colors.panel, borderTopWidth: 1, borderBottomWidth: 0.75, borderColor: colors.ink }, headerText: { fontFamily: 'OpenDoc Mono', fontSize: 8, fontWeight: 400, color: colors.ink }, cell: { padding: 9, borderBottomWidth: 0.5, borderColor: colors.rule }, text: { fontSize: 9.5, color: colors.ink }, alternate: colors.paper },
52
+ figure: { block: { marginTop: 12, marginBottom: 20 } },
53
+ callout: { block: { backgroundColor: colors.paper, borderLeftWidth: 6, borderColor: colors.orange, padding: 16, marginTop: 12, marginBottom: 20 }, title: { fontFamily: 'OpenDoc Mono', fontSize: 8, fontWeight: 400, color: colors.ink, letterSpacing: 0.4 }, text: { fontSize: 10.5, color: colors.ink } },
54
+ code: { panel: { backgroundColor: colors.panel, borderTopWidth: 0.75, borderColor: colors.rule, padding: 12 } },
55
+ list: { block: { paddingLeft: 0 }, item: { marginBottom: 8 }, gap: 8, markerWidth: 16 },
56
+ },
57
+ };
@@ -0,0 +1,82 @@
1
+ import * as F from '@formepdf/react';
2
+ import { DataTable, Document, Heading, Paragraph, Strong } from 'opendoc';
3
+ import { DirectivePage, EvidenceChain, ManualAnnotation, ManualCode, ManualOpening, ManualPages, ManualSpine, SpecRows } from './components';
4
+ import { colors, theme } from './index';
5
+
6
+ export const meta = { title: 'Field Manual — Evidence before ornament', description: theme.description, theme: theme.id };
7
+
8
+ function Identity() {
9
+ const neutrals = [
10
+ { name: 'Ink', value: colors.ink }, { name: 'Stock', value: colors.stock },
11
+ { name: 'Paper', value: colors.paper }, { name: 'Panel', value: colors.panel },
12
+ { name: 'Muted', value: colors.muted }, { name: 'Rule', value: colors.rule },
13
+ ];
14
+ return <ManualPages title="Field Manual / Design specification" code="FM—01" revision="REV 01">
15
+ <ManualSpine id="manual-identity-spine">
16
+ <ManualCode id="manual-identity-code" code="FM—01" label="Evidence systems" />
17
+ <F.View style={{ flexDirection: 'row', gap: 16, marginTop: 28 }}>
18
+ <F.View style={{ width: 312 }}>
19
+ <Heading id="manual-identity-title" level={1} style={{ fontSize: 52, lineHeight: 0.98, letterSpacing: -1.2, marginBottom: 20 }}>{'Field\nManual.'}</Heading>
20
+ <Paragraph id="manual-identity-purpose" style={{ fontSize: 22, lineHeight: 1.15, marginBottom: 16 }}>{'Evidence before\nornament.'}</Paragraph>
21
+ <Paragraph id="manual-identity-description" style={{ fontSize: 11, color: colors.muted, marginBottom: 0, width: 270 }}>A visual language for methods, decisions, and operational truth.</Paragraph>
22
+ </F.View>
23
+ <F.View style={{ flex: 1, minWidth: 0, backgroundColor: colors.paper, borderWidth: 0.75, borderColor: colors.rule, padding: 12 }}>
24
+ <F.Text style={{ fontFamily: 'OpenDoc Mono', fontSize: 36, lineHeight: 1, letterSpacing: -1, color: colors.orange, marginBottom: 24 }}>{'FM\n01'}</F.Text>
25
+ <SpecRows id="manual-identity-record" rows={[{ label: 'Class', value: 'Reference' }, { label: 'Mode', value: 'Evidence first' }, { label: 'Rev', value: '01' }]} />
26
+ </F.View>
27
+ </F.View>
28
+ </ManualSpine>
29
+ <F.View style={{ marginTop: 32, marginBottom: 16 }}><ManualCode id="manual-palette-label" code="CLR" label="Signal / support" /></F.View>
30
+ <F.View style={{ flexDirection: 'row', gap: 16 }}>
31
+ <F.View style={{ width: 148, backgroundColor: colors.orange, padding: 16, justifyContent: 'space-between' }}>
32
+ <F.Text style={{ fontFamily: 'OpenDoc Mono', fontSize: 8, color: colors.ink }}>{'SAFETY\nORANGE'}</F.Text>
33
+ <F.Text style={{ fontFamily: 'OpenDoc Mono', fontSize: 14, color: colors.ink }}>#F05A28</F.Text>
34
+ </F.View>
35
+ <F.View style={{ flex: 1 }}>
36
+ {[neutrals.slice(0, 2), neutrals.slice(2, 4), neutrals.slice(4)].map((row, index) => <F.View key={index} style={{ flexDirection: 'row', gap: 12, marginBottom: index === 2 ? 0 : 12 }}>
37
+ {row.map(entry => <F.View key={entry.name} style={{ flex: 1, flexDirection: 'row', gap: 8 }}>
38
+ <F.View style={{ width: 24, height: 24, borderWidth: 0.5, borderColor: colors.rule, backgroundColor: entry.value }} />
39
+ <F.View style={{ flex: 1 }}><F.Text style={{ fontSize: 8, color: colors.ink }}>{entry.name}</F.Text><F.Text style={{ fontFamily: 'OpenDoc Mono', fontSize: 8, color: colors.muted, marginTop: 3 }}>{entry.value}</F.Text></F.View>
40
+ </F.View>)}
41
+ </F.View>)}
42
+ </F.View>
43
+ </F.View>
44
+ <ManualAnnotation id="manual-geometry" code="6 / 18 / 4">A <Strong>6 pt orange spine</Strong>, an 18 pt inset, and a 4 pt baseline. Fine rules separate records. Monospace codes make identity, status, and revision visible.</ManualAnnotation>
45
+ <Paragraph id="manual-type-note" style={{ fontFamily: 'OpenDoc Mono', fontSize: 7.5, color: colors.muted }}>{'DISPLAY 52/51 · HEADING 38/39 · BODY 10.5/15.75 · NOTES 8/11.2\nDARK #171A1C · INVERSE #F6F3EA · INVERSE NOTES #AEB4B5'}</Paragraph>
46
+ </ManualPages>;
47
+ }
48
+
49
+ function Decision() {
50
+ return <ManualPages title="Field Manual / Decision anatomy" code="FM—02" revision="REV 01">
51
+ <ManualOpening id="manual-decision-opening" code="FM—02" label="Decision anatomy" title={'A decision should\nexpose its chain.'} />
52
+ <EvidenceChain id="manual-decision-chain" steps={[
53
+ { title: 'Source', detail: 'Name the observation, record, or constraint.' },
54
+ { title: 'Reason', detail: 'Show the rule, transformation, or judgment.' },
55
+ { title: 'Act', detail: 'State the result, owner, and next condition.' },
56
+ ]} />
57
+ <Paragraph id="manual-decision-intro">The chain separates what was observed from how it was interpreted and what happens next. Each step is inspectable. Orange identifies the active reasoning step; it does not turn every box into a warning.</Paragraph>
58
+ <DataTable id="manual-decision-record" caption="Sample handover record — illustrative only."
59
+ columns={[{ label: 'Record', width: 1 }, { label: 'Observation', width: 2 }, { label: 'Next condition', width: 1.8 }]}
60
+ rows={[
61
+ ['SRC / 01', 'Three draft sections use different terms.', 'Identify the owning definition.'],
62
+ ['MTH / 01', 'Compare each use with that definition.', 'Record the unresolved cases.'],
63
+ ['ACT / 01', 'Assign one editor to the revision.', 'Check the next issue before release.'],
64
+ ]} />
65
+ <ManualAnnotation id="manual-decision-note" code="NOTE / 01">This example contains no operational findings. It demonstrates the difference between a source record, a method, and an action.</ManualAnnotation>
66
+ </ManualPages>;
67
+ }
68
+
69
+ export default function Preview() {
70
+ return <Document title={meta.title} theme={theme}>
71
+ <Identity />
72
+ <Decision />
73
+ <DirectivePage id="manual-directive" code="FM—03" revision="REV 01" title={'Document\nwhat changes.'}
74
+ lead="A trustworthy system makes revisions, evidence, and responsibility inspectable. Every change should leave a clear path back to its reason."
75
+ rows={[
76
+ { label: 'Change', value: 'State what changed in this issue.' },
77
+ { label: 'Basis', value: 'Name the record or condition that required it.' },
78
+ { label: 'Owner', value: 'Identify who carries the next action.' },
79
+ { label: 'Check', value: 'Define what must be true before release.' },
80
+ ]} />
81
+ </Document>;
82
+ }
@@ -0,0 +1,3 @@
1
+ export { neutral } from './neutral/index';
2
+ export { themeType, themePage, validateTheme } from 'opendoc/themes';
3
+ export type { DocTheme, ThemeDesign, ThemeFont, ThemeTypeRole } from 'opendoc/themes';
@@ -0,0 +1,69 @@
1
+ import type { ReactNode } from 'react';
2
+ import { Fixed, Text, View } from '@formepdf/react';
3
+ import { Block, Heading, Paragraph, Page } from 'opendoc';
4
+ import { colors as c, theme } from './index';
5
+
6
+ /** A reusable dark publication opening. Its square field is deliberately unlike an analytical page. */
7
+ export function ConsultingCover({ id, title, subtitle, label = 'Executive exhibit system', children }: {
8
+ id: string; title: string; subtitle: string; label?: string; children?: ReactNode;
9
+ }) {
10
+ return <Page size="A4" margin={48} style={{ backgroundColor: c.ink }}>
11
+ <View style={{ flexDirection: 'row', alignItems: 'center', gap: 10 }}>
12
+ <View style={{ width: 22, height: 3, backgroundColor: c.focus }} />
13
+ <Text style={{ fontSize: 8, letterSpacing: 1.3, color: c.pale }}>{label.toUpperCase()}</Text>
14
+ </View>
15
+ <Heading id={`${id}-title`} level={1} style={{ color: c.white, fontSize: 62, lineHeight: 1.01, letterSpacing: -1.7, marginTop: 78, marginBottom: 24 }}>{title}</Heading>
16
+ <Paragraph id={`${id}-subtitle`} style={{ width: 350, color: c.pale, fontSize: 15, lineHeight: 1.4 }}>{subtitle}</Paragraph>
17
+ <View style={{ marginTop: 48, height: 224 }}>
18
+ <View style={{ flexDirection: 'row', height: 56 }}><View style={{ width: '18%' }} /><View style={{ width: '44%', backgroundColor: c.blue1 }} /><View style={{ width: '38%', backgroundColor: c.blue2 }} /></View>
19
+ <View style={{ flexDirection: 'row', height: 56 }}><View style={{ width: '44%', backgroundColor: c.blue1 }} /><View style={{ width: '56%', backgroundColor: c.focus }} /></View>
20
+ <View style={{ flexDirection: 'row', height: 56 }}><View style={{ width: '62%', backgroundColor: c.focus }} /><View style={{ width: '38%', backgroundColor: c.pale }} /></View>
21
+ <View style={{ flexDirection: 'row', height: 56 }}><View style={{ width: '18%', backgroundColor: c.blue2 }} /><View style={{ width: '44%', backgroundColor: c.blue4 }} /><View style={{ width: '38%' }} /></View>
22
+ </View>
23
+ {children}
24
+ <Fixed position="footer"><View style={{ flexDirection: 'row', justifyContent: 'space-between', borderTopWidth: 0.5, borderColor: c.positive, paddingTop: 8 }}>
25
+ <Text style={{ fontSize: 8, color: c.pale }}>Independent consulting design / {theme.name}</Text>
26
+ <Text style={{ fontSize: 8, color: c.pale }}>{'{{pageNumber}} / {{totalPages}}'}</Text>
27
+ </View></Fixed>
28
+ </Page>;
29
+ }
30
+
31
+ /** Keep a claim and its measurement definition together; evidence below remains flowable. */
32
+ export function ExhibitTitle({ id, number, topic, children, metric }: {
33
+ id: string; number: string; topic: string; children: ReactNode; metric: string;
34
+ }) {
35
+ return <View wrap={false} style={{ marginBottom: 20 }}>
36
+ <View style={{ flexDirection: 'row', gap: 8, alignItems: 'center', marginBottom: 12 }}>
37
+ <View style={{ width: 20, height: 2, backgroundColor: c.focus }} />
38
+ <Text style={{ color: c.focus, fontSize: 8, letterSpacing: 0.7, fontWeight: 600 }}>EXHIBIT {number} / {topic.toUpperCase()}</Text>
39
+ </View>
40
+ <Heading id={`${id}-claim`} level={1} style={{ marginBottom: 12 }}>{children}</Heading>
41
+ <Paragraph id={`${id}-metric`} style={{ fontSize: 9, color: c.muted, marginBottom: 0 }}>{metric}</Paragraph>
42
+ </View>;
43
+ }
44
+
45
+ /** Direct labels, a visible zero baseline, and one explicitly selected focus. Values share a scale. */
46
+ export function RankedBars({ id, rows, max = 100, suffix = '%', highlight = 0 }: {
47
+ id: string; rows: Array<{ label: string; detail?: string; value: number }>; max?: number; suffix?: string; highlight?: number;
48
+ }) {
49
+ if (!Number.isFinite(max) || max <= 0 || rows.some(row => !Number.isFinite(row.value) || row.value < 0 || row.value > max)) throw new Error('RankedBars needs finite nonnegative values within a positive maximum.');
50
+ return <Block id={id} style={{ marginBottom: 16 }}>
51
+ {rows.map((row, index) => <View key={row.label} wrap={false} style={{ flexDirection: 'row', alignItems: 'center', gap: 12, paddingTop: 8, paddingBottom: 8, borderTopWidth: 0.5, borderColor: c.rule }}>
52
+ <View style={{ width: 112 }}><Text style={{ fontSize: 10, fontWeight: 600 }}>{row.label}</Text>{row.detail && <Text style={{ fontSize: 8, color: c.muted, marginTop: 2 }}>{row.detail}</Text>}</View>
53
+ <View style={{ flex: 1, height: 22, backgroundColor: c.soft }}><View style={{ width: `${row.value / max * 100}%`, height: 22, backgroundColor: index === highlight ? c.focus : c.blue2 }} /></View>
54
+ <Text style={{ width: 36, textAlign: 'right', fontSize: 15, fontWeight: 600, color: index === highlight ? c.focus : c.ink }}>{row.value}{suffix}</Text>
55
+ </View>)}
56
+ <View style={{ flexDirection: 'row', marginLeft: 124, marginRight: 48, justifyContent: 'space-between', borderTopWidth: 0.5, borderColor: c.rule, paddingTop: 4 }}><Text style={{ fontSize: 7, color: c.muted }}>0</Text><Text style={{ fontSize: 7, color: c.muted }}>{max}{suffix}</Text></View>
57
+ </Block>;
58
+ }
59
+
60
+ export function Implication({ id, label = 'What this changes', children }: { id: string; label?: string; children: ReactNode }) {
61
+ return <Block id={id} style={{ backgroundColor: c.pale, padding: 16, marginTop: 8, marginBottom: 12 }}>
62
+ <Text style={{ fontSize: 9, fontWeight: 600, marginBottom: 6 }}>{label}</Text>
63
+ <Text style={{ fontSize: 10.5, lineHeight: 1.4 }}>{children}</Text>
64
+ </Block>;
65
+ }
66
+
67
+ export function SourceNote({ id, children }: { id: string; children: ReactNode }) {
68
+ return <Paragraph id={id} style={{ fontSize: 8, lineHeight: 1.35, color: c.muted, marginTop: 8 }}>{children}</Paragraph>;
69
+ }
@@ -0,0 +1,68 @@
1
+ # McKinsey Consulting
2
+
3
+ Answer-first analytical editorialism: one conclusion, one exhibit that proves it, one explicit implication. This independent OpenDoc system applies analytical publication conventions to flowing A4 pages. It is suited to executive decisions, operating reviews and business cases. It does not use McKinsey logos or claim affiliation.
4
+
5
+ ## Palette
6
+
7
+ The executable tokens are `colors` in `index.ts`; keep this table synchronized when refining them.
8
+
9
+ | Role | Hex | Use |
10
+ | --- | --- | --- |
11
+ | Deep blue | `#051C2C` | Text, structure, dark covers |
12
+ | Electric blue | `#2251FF` | The focal datum or governing conclusion |
13
+ | White | `#FFFFFF` | Analytical canvas, inverse copy |
14
+ | Gray | `#4D4D4D` | Secondary copy and source notes |
15
+ | Rule | `#D0D0D0` | Axes, dividers and table rules |
16
+ | Soft | `#F0F0F0` | Context bands and alternate rows |
17
+ | Pale blue | `#AAE6F0` | Implication field or selected row |
18
+ | Cyan | `#00A9F4` | Secondary emphasis, used sparingly |
19
+ | Series 1–4 | `#034B6F`, `#027AB1`, `#39BDF3`, `#71D2F1` | Ordered dark-to-light series |
20
+ | Positive | `#3C96B4` | Favorable movement when direction is defined |
21
+ | Caution | `#FAA082` | A watch item |
22
+ | Negative | `#E5546C` | Adverse variance or exception |
23
+
24
+ Keep most analytical content deep blue, gray and white. Electric blue earns attention by being scarce. Semantic warning colors require a meaningful exception; they are never decoration. The cover may combine the ordered blues in an abstract rectangular field, but charts use color to explain evidence.
25
+
26
+ ## Type, space and geometry
27
+
28
+ Use the embedded **OpenDoc Sans** regular and semibold faces. This is a deliberate substitute for proprietary McKinsey Sans. There is no CSS fallback stack and no external font request. OpenDoc Mono appears only in the system specimen’s hex values.
29
+
30
+ | Role | Size / leading |
31
+ | --- | --- |
32
+ | Cover | 62 pt / 1.01 |
33
+ | Answer or exhibit heading | 31 pt / 1.10 |
34
+ | Section | 19 pt / 1.15 |
35
+ | Subheading | 12 pt / 1.20 |
36
+ | Body | 10.5 pt / 1.42 |
37
+ | Table | 9 pt |
38
+ | Source | 8 pt / 1.35 |
39
+
40
+ Use sentence case and restrained semibold emphasis. Keep the answer to two or three short lines on A4. Do not bold a whole paragraph. Keep numerical labels flush right and use a shared comparison scale.
41
+
42
+ The page is A4 portrait with 48 pt left/right/top margins and 52 pt below. Build from a 12-column construction with 12 pt gutters; use 4 pt spacing increments. All analytical containers have square corners. Rules are 0.5 pt. Gaps and aligned edges separate groups; avoid boxed cells, rounded dashboards, shadows, gradients and decorative icons.
43
+
44
+ ## Composition and evidence
45
+
46
+ An analytical page follows **exhibit marker → answer → metric frame → evidence → implication → source**. The metric frame defines unit, population, period and comparison basis. Give the evidence the largest area. A title claiming “three levers account for 82%” requires those three contributions and their sum to be immediately inspectable.
47
+
48
+ Sort bars to expose the pattern and directly label values. Begin bars at zero; show a benchmark in the same field when relevant. Use exact-value tables when precision matters more than shape. Use a dark header and fine horizontal rules; select at most one row or decisive range. Source notes disclose limitations without hiding them in microscopic text. Synthetic data is labeled as illustrative at the exhibit and page footer.
49
+
50
+ Long prose and tables flow normally. Do not put an entire report in an unbreakable container or force every section onto a hand-positioned page. Reserve the separate dark cover for a substantial publication; a short memo starts directly with its answer.
51
+
52
+ ## Reusable components
53
+
54
+ Import the theme from `./index` and the components below from `./components` (use the corresponding relative paths in a document). Pass this theme to the enclosing OpenDoc `Document`.
55
+
56
+ | Component | Inputs and purpose |
57
+ | --- | --- |
58
+ | `ConsultingCover` | `id`, `title`, `subtitle`, optional `label`; dark cover with a rectangular field and automatic folio |
59
+ | `ExhibitTitle` | `id`, `number`, `topic`, `metric`, conclusion as children; keeps the claim with its measurement definition |
60
+ | `RankedBars` | `id`, rows of `{label, detail?, value}`, optional `max`, `suffix`, `highlight`; common zero scale and direct labels |
61
+ | `Implication` | `id`, optional `label`, text children; pale-blue decision field |
62
+ | `SourceNote` | `id`, text children; a readable caveat and source line |
63
+
64
+ Use standard OpenDoc `Pages`, `Paragraph`, `DataTable`, `Figure` and citation primitives for the rest; the theme’s native role styles already govern them. Retain stable IDs. The three-page `preview.tsx` demonstrates the cover, exact system grammar and an applied analytical exhibit through these same reusable components.
65
+
66
+ ## Basis
67
+
68
+ This is an independent implementation using OpenDoc primitives, a deep-blue/electric-blue palette, answer-first exhibits, and square geometry. It uses bundled OpenDoc Sans instead of proprietary fonts and includes no McKinsey artwork. The theme does not claim affiliation or endorsement.