@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,17 @@
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1.0"/><meta name="theme-color" content="#f8f8f8"/><title>OpenDoc</title>
3
+ <link rel="icon" type="image/png" href="/assets/wordmark-DsqLlZpb.png"/>
4
+ <script>
5
+ // Apply a saved appearance before the first paint, including on direct document links.
6
+ (() => {
7
+ let preference = 'system';
8
+ try { preference = localStorage.getItem('opendoc-appearance') || 'system'; } catch {}
9
+ const dark = preference === 'dark' || (preference !== 'light' && matchMedia('(prefers-color-scheme: dark)').matches);
10
+ document.documentElement.dataset.appearance = dark ? 'dark' : 'light';
11
+ document.documentElement.style.colorScheme = dark ? 'dark' : 'light';
12
+ document.querySelector('meta[name="theme-color"]').content = dark ? '#181818' : '#f8f8f8';
13
+ })();
14
+ </script>
15
+ <script type="module" crossorigin src="/assets/index-DgNBz7mL.js"></script>
16
+ <link rel="stylesheet" crossorigin href="/assets/index-DdrZ6ozO.css">
17
+ </head><body><div id="root"></div></body></html>
@@ -0,0 +1,21 @@
1
+ # App appearance
2
+
3
+ OpenDoc supports **Light**, **Dark**, and **System** through the sidebar footer and the reader's Document options menu. System is the default. The browser saves an explicit choice under `opendoc-appearance`, synchronizes it between workspace tabs, and applies it before the first paint. If storage is unavailable, the current session still works. System follows live device appearance changes.
4
+
5
+ ## Source of truth
6
+
7
+ [colors.css](../src/app/colors.css) owns the semantic palette, including increased-contrast overrides. Reuse its roles for surfaces, text, controls, feedback, focus, and PDF inspection. Keep component styles in the existing app stylesheets and reuse [shared controls](../src/app/ui/ui.css). Do not duplicate palette values in documentation or component-local overrides.
8
+
9
+ The interface uses bundled Inter Regular and Medium, independently of the document font catalog. Shared typography and density tokens live in `src/app/ui/ui.css`: titles use 16/20px Medium, labels 13/16px Medium, and body text 14/20px Regular. Buttons use a 32px minimum height with a 10px radius; data rows use 40px and navigation/library rows 44px. Rows may grow for wrapped content. Existing status badges use a 20px height and 6px radius, with palette roles defined in `colors.css`. Switch dimensions are reserved as tokens (24×14px with a 10px thumb); no switch control is currently used in the app.
10
+
11
+ Preserve larger touch targets where the compact reader needs them. Keep labels and descriptions readable, long names and paths wrapping, visible keyboard focus, and usable controls at narrow widths. Use the existing reduced-motion behavior.
12
+
13
+ ## Preserve the PDF boundary
14
+
15
+ Appearance changes the surrounding interface. Paper, media, logo variations, theme specimens, and exports retain their authored colors. Do not invert a PDF canvas or choose logo artwork from the app appearance. Media and asset preview backgrounds are inspection aids; they do not modify source files.
16
+
17
+ ## Verify changes
18
+
19
+ Review affected views in light and dark appearance, then with increased contrast. Check text, actions, menus, notices, disabled states, and visible focus against their actual backgrounds. Check system switching, explicit overrides, reload persistence, and cross-tab synchronization when changing appearance state. Include the reader, comments, and a narrow workspace view after shared palette or shell changes.
20
+
21
+ Use measured contrast ratios and readable screenshots as evidence for the specific colors and states changed. Do not turn a palette measurement into a claim of complete accessibility conformance. A PDF rendered before and after an app-only appearance change should have identical bytes.
package/docs/ASSETS.md ADDED
@@ -0,0 +1,176 @@
1
+ # Media & Assets
2
+
3
+ OpenDoc keeps reusable **Logos** and **Fonts** in a shared workspace library. **Media** remains owned by its document: photographs, illustrations, charts, and diagrams retain their prepared data, recipes, and evidence. Do not copy a shared logo or font into every document. Original reference material stays wherever the surrounding project manages it.
4
+
5
+ The app and `npx opendoc assets` operate on the same local records, import checks, and conflict protection. Selecting a library item tells the agent what the user is looking at; it does not apply it to any document or theme.
6
+
7
+ Run commands from the workspace root. Asset, theme, document, and output paths in this guide refer to that workspace; this guide is installed under `node_modules/opendoc/docs`.
8
+
9
+ ## Start from the document
10
+
11
+ 1. Resolve the intended document and read fresh `.opendoc/current.json` when the user refers to the current selection.
12
+ 2. Discover with `npx opendoc assets list`. Inspect only the relevant family to read its variations, guidance, compatibility, paths, relationships, and authoring examples.
13
+ 3. Bind the chosen asset to the document. This saves an exact version immediately. Choose a logo variation from its guidance and the actual PDF background, never from the app's light/dark appearance.
14
+ 4. Use `Logo` or the document's semantic fonts, render, and review the resulting PDF. A binding makes an asset available; it is not proof that the PDF uses it.
15
+
16
+ ```sh
17
+ npx opendoc assets list logo
18
+ npx opendoc assets inspect logo acme
19
+ npx opendoc assets bind my-report logo acme --variation default
20
+ ```
21
+
22
+ The supported binding roles are `logo`, `body-font`, and `heading-font`. For example, bind an imported, eligible family with `npx opendoc assets bind my-report body-font acme-sans`. Use `--name partner` with the `logo` role to add a named logo instead of changing the preferred logo. `--revision <revision>` chooses a historical version; omission captures the current version at binding time. Repeating `bind` is an explicit update. `unbind <document> <role>` removes that choice; add `--name <binding>` when removing a named logo.
23
+
24
+ ## Logos: one identity, several variations
25
+
26
+ In the app, choose **Add logo**, enter a name, then upload the default SVG or PNG. The logo opens as a folder with that default file. Use **Add variations** inside the folder to select one or more additional files together; names are suggested from filenames and can be edited before uploading. A family can mix SVG and PNG originals, with user-defined variation names and optional **When to use** descriptions. “On light backgrounds” and “On dark backgrounds” are suggestions, not fixed categories.
27
+
28
+ ```sh
29
+ npx opendoc assets import logo --id acme --name "Acme" --description "Use for Acme publications." --file /path/to/acme.png --variation-name "On light backgrounds" --variation-description "Dark mark for white or pale surfaces."
30
+ npx opendoc assets inspect logo acme
31
+ npx opendoc assets add-variation acme --id on-dark --name "On dark backgrounds" --description "White mark for dark surfaces." --file /path/to/acme-white.svg --expected-revision <current-revision>
32
+ ```
33
+
34
+ Copy the real revision returned by inspection; angle-bracket placeholders in this guide are not literal values. The first variation's stable ID is `default`, even when its display name is “On light backgrounds.” Names and guidance can change without changing family or variation IDs. To replace a variation's file, use `add-variation` with `--replace <variation-id>`, the desired name, and the latest `--expected-revision`. Replacement preserves the variation's identity and publishes a new family version.
35
+
36
+ Use a JSON file for revisions instead of long sets of metadata flags:
37
+
38
+ ```json
39
+ {
40
+ "expectedRevision": "copy-the-current-revision-from-inspect",
41
+ "description": "Brand guidance for the agent.",
42
+ "defaultVariation": "on-dark",
43
+ "variation": {
44
+ "id": "on-dark",
45
+ "name": "On dark backgrounds",
46
+ "description": "Use the white mark on dark navy or black backgrounds."
47
+ }
48
+ }
49
+ ```
50
+
51
+ ```sh
52
+ npx opendoc assets revise logo acme --metadata /path/to/logo-update.json
53
+ ```
54
+
55
+ Omit unchanged fields. The revision operation also accepts `name`, `removeVariation`, or `removeFace` for the relevant asset kind. Keep at least one usable variation or face, and select an existing default variation. Concurrent changes produce a conflict; inspect again and reconcile the intended edit instead of blindly retrying old metadata.
56
+
57
+ The logo folder shows all variations as file tiles. Select a file to preview it, edit its name or guidance, replace it, make it the default, or remove it. Removing the default requires choosing a replacement; every logo keeps at least one variation. If a batch upload stops on an invalid file, successful files stay saved and the remaining upload list stays open for correction and retry. Its light, dark, and transparency backgrounds are inspection aids. They do not recolor artwork or choose the PDF variation. Preview and PDF use the same prepared PNG. SVG originals are preserved and prepared locally through resvg, with proportions and transparency retained. Unsupported external resources or unresolved text fonts produce a useful import error. Supply self-contained artwork with text converted to outlines when necessary. SVG imports are limited to 5 MB; PNG imports to 50 MB.
58
+
59
+ ### Place a logo
60
+
61
+ ```tsx
62
+ import { Figure, Logo } from 'opendoc';
63
+
64
+ // The preferred document binding; omission of variation uses its saved default.
65
+ <Logo width={120} />
66
+
67
+ // A deliberate variation, identified by its stable ID from inspection.
68
+ <Logo variation="on-dark" width={120} alt="Acme" />
69
+
70
+ // A second logo bound with --name partner.
71
+ <Figure id="partner-mark" caption="Delivery partner">
72
+ <Logo name="partner" width={100} height={48} />
73
+ </Figure>
74
+ ```
75
+
76
+ Width is required and measured in PDF points. Optional height is a maximum bound; the image retains its aspect ratio. An omitted variation uses the binding's explicit variation, otherwise the saved revision's default. Missing bindings and unknown variations fail with an actionable error. Logo placement is always explicit; a theme default does not add a logo to the page automatically. Preserve the enclosing block ID when replacing artwork so feedback stays attached.
77
+
78
+ ## Fonts: actual files, actual PDF checks
79
+
80
+ Import static TTF/OTF faces from one family together, with repeated `--file` flags. The app asks only for font files. OpenDoc reads their family name, embedded English description (when present), weight, and style, then renders and checks a PDF specimen. A font without an embedded description stays blank; optional agent guidance can be edited later. Variable fonts, font collections, and web-font conversion are outside this release.
81
+
82
+ ```sh
83
+ npx opendoc assets import font --id acme-sans --file /path/to/AcmeSans-Regular.ttf --file /path/to/AcmeSans-Bold.ttf --file /path/to/AcmeSans-Italic.ttf
84
+ npx opendoc assets inspect font acme-sans
85
+ npx opendoc assets add-faces acme-sans --file /path/to/AcmeSans-BoldItalic.ttf --expected-revision <current-revision>
86
+ npx opendoc assets bind my-report body-font acme-sans
87
+ npx opendoc assets bind my-report heading-font acme-sans
88
+ ```
89
+
90
+ Import at most 24 faces and 100 MB at once. Added faces must belong to the existing embedded font family, even when replacing every face; import a different family separately. Original files are preserved; OpenDoc does not rewrite font tables or synthesize missing faces. General body and heading defaults require a regular face plus a semibold or bold face and passing compatibility checks. A family needing attention can remain in the library for inspection, but cannot become a body/heading default. Missing styles are visible in the family detail; explicitly requesting an unavailable weight or italic style fails when rendering. A semibold request can use a real bold face of the same style when semibold is absent; it retains that face's actual weight.
91
+
92
+ Inter, Roboto, Open Sans, Lato, and Merriweather are included in the library, each with regular, semibold, bold, italic, semibold italic, and bold italic faces. Their Google-supplied static TTF files are preserved, with an OFL license and download provenance in each family folder. Their retained bundled revisions contain passing compatibility results and reviewed specimens from the repaired PDF writer, making them available as body and heading defaults. Original font files are unchanged. The renderer patch is maintained with the OpenDoc application; ordinary workspace authoring does not require rebuilding it.
93
+
94
+ The specimen checks ligature words, ordinary mixed styles, and kerning-sensitive boundaries as well as glyphs. Inspect its real PDF appearance and copied text. A successful automated check does not establish suitability for every document. Keep font licensing information with the supplied material and respect it when using or sharing the font.
95
+
96
+ New documents use their generated theme adapter before any template factory runs:
97
+
98
+ ```tsx
99
+ // documents/my-report/theme.tsx, generated by the create command
100
+ import { theme as base } from '../../themes/neutral';
101
+ import { withDocumentAssets, type DocumentAssets } from 'opendoc/assets';
102
+ import assets from './assets.json';
103
+ export const theme = withDocumentAssets(base, assets as DocumentAssets);
104
+ ```
105
+
106
+ The document entry imports `{ theme }` from `./theme` and passes that same theme to `Document` and its template factory. Do not replace this adapter with a direct base-theme import: that would bypass the saved fonts during template construction. Binding fonts upgrades recognized older theme imports to this adapter while preserving the base theme, aliases, and document text. Custom or ambiguous imports produce an actionable error without replacing source; the agent should integrate the same adapter into the existing factory before retrying.
107
+
108
+ Native semantic body and heading roles receive the saved choices. Theme components that need a family explicitly can call `documentFont('body')` or `documentFont('heading')` from `opendoc` **inside their render function**, then use the returned family in their native PDF style. Do not call this helper at module scope. Deliberate code, caption, label, and furniture families remain intact; explicit authored style overrides remain last.
109
+
110
+ ## Theme defaults and document versions
111
+
112
+ The theme detail's **Assets for new documents** section chooses an optional preferred logo, body font, and heading font. **Keep theme font** leaves the theme's own family in place. Defaults live separately from design tokens:
113
+
114
+ ```json
115
+ {
116
+ "version": 1,
117
+ "logo": { "id": "acme", "variation": "default" },
118
+ "bodyFont": "acme-sans",
119
+ "headingFont": "acme-sans"
120
+ }
121
+ ```
122
+
123
+ This is `themes/<theme-id>/assets.json`. Omit optional properties to clear them; `{ "version": 1 }` means no shared asset defaults. Inspect and update through the same service as the app:
124
+
125
+ ```sh
126
+ npx opendoc assets defaults neutral
127
+ npx opendoc assets defaults neutral --metadata /path/to/theme-assets.json --expected-revision <defaults-revision>
128
+ ```
129
+
130
+ The read command returns `{ defaults, revision }`, including a revision for an absent defaults file. The metadata file contains the complete defaults object, not that response wrapper. Preserve defaults the user did not ask to change.
131
+
132
+ Creation resolves these choices once into `documents/<id>/assets.json`. Its version-1 object has optional `logo`, named `logos`, `bodyFont`, and `headingFont` fields. Every selection contains `id` and an exact `revision`; logo selections can also include `variation`. An explicitly empty record is written when no defaults are set. Only asset selections are frozen: the document continues to use its live base theme for color, geometry, and other visual rules.
133
+
134
+ Changing defaults, publishing a replacement, editing guidance, or adding a variation does not update existing documents. Defaults are validated against actual referenced files when saved and when a document is created. Rename, move, duplicate, and Trash restore preserve saved choices. Older documents without a binding file retain their existing rendering until deliberately bound and adapted. The current PDF's rendered asset usage distinguishes what was actually used from what was only available through bindings.
135
+
136
+ Generated `.opendoc/current.json` keeps these concepts separate:
137
+
138
+ - `selectedAsset`: the inspected library family, version, folder, and any selected variation or face.
139
+ - `theme.assetDefaults`: the defaults `file` and `choices`, with `appliesTo: "new-documents"`.
140
+ - `documentAssets`: the binding `file`, exact `bindings`, and `saved`; `saved: false` means a legacy document has no binding file.
141
+ - `renderedAssets`: actual `uses`, the rendered bindings, `renderHash`, and `current`. If `current` is false, usage belongs to the last successful PDF while the current source is rendering or failing.
142
+
143
+ Read error fields before applying replacements. Do not edit generated context by hand. Navigation between library items and documents clears incompatible selections; selecting a family never adds it to a document.
144
+
145
+ Saved PDF receipts retain `assetBindings` for the exact choices available to the exported render and `assets` for the deduplicated logo variations and font faces actually used. These fields come from that render, never from today's library state, and later source or library edits do not rewrite them. Earlier receipts may omit them; omission means usage is unknown, not that the PDF used no assets. Per-block usage remains in the render artifact.
146
+
147
+ ## Local records and safe lifecycle
148
+
149
+ ```text
150
+ assets/logos/<logo-id>/
151
+ asset.json current version and archive state
152
+ revisions/<revision>.json immutable family versions
153
+ files/<content-hash>.png prepared image or PNG original
154
+ files/<content-hash>.svg preserved SVG original
155
+ assets/fonts/<font-id>/
156
+ asset.json
157
+ revisions/<revision>.json
158
+ files/<content-hash>.ttf original font face (or .otf)
159
+ files/<content-hash>.pdf checked PDF specimen
160
+ ```
161
+
162
+ Family, variation, and face IDs are stable lowercase IDs with single hyphens. Filenames and display names are not identities. Unchanged files are reused across versions. Use the CLI or app to publish changes; never overwrite historical manifests or content-addressed files. Changed historical bytes are detected and must be restored or imported as a new version, rather than silently accepted.
163
+
164
+ Import validation completes before the family is published. Failed imports leave existing families and versions intact. A broken neighboring asset is reported independently rather than hiding the whole library. Prepared artwork, inspections, and specimens are cached; previews load on demand. Rendering watches saved dependencies, so new versions and changed defaults refresh the catalog without rerendering documents that still use earlier versions. Legacy source assets retain conservative dependency tracking.
165
+
166
+ Archive hides an asset from normal selection while preserving its historical files and existing document bindings. The app offers Undo. When a theme uses the asset as a default, the archive flow names those relationships and offers to clear them explicitly. CLI equivalent:
167
+
168
+ ```sh
169
+ npx opendoc assets archive logo acme --expected-revision <current-revision> --clear-defaults
170
+ npx opendoc assets list logo --archived
171
+ npx opendoc assets restore logo acme --expected-revision <current-revision>
172
+ ```
173
+
174
+ Omit `--clear-defaults` unless clearing those defaults is intended; archiving an assigned default otherwise fails. Restoration makes the family selectable again and restores the defaults cleared by that archive only where no later defaults edit would be overwritten. No permanent delete or historical-file cleanup is provided. Documents in Trash and previous PDFs remain usable. A failed current render preserves its last successful preview, and an in-flight export cannot publish against inputs that have changed.
175
+
176
+ Use `--json` for machine-readable command output. Failures print an actionable message to stderr and exit nonzero. Use `npx opendoc assets --help` for asset command syntax or `npx opendoc --help` for the full command list. Read [Media](MEDIA.md) for document-owned visuals and [Themes](THEMES.md) for executable design systems.
@@ -0,0 +1,178 @@
1
+ # Authoring documents
2
+
3
+ Run these commands from your OpenDoc workspace, such as `~/Documents/My OpenDoc`. The installed guides live in `node_modules/opendoc/docs`; paths such as `documents/`, `themes/`, `templates/`, and `output/` below refer to the workspace root. Use `npx opendoc --help` for commands, `--workspace <path>` to choose a workspace explicitly, and `--json` for machine-readable output. From a workspace subfolder, OpenDoc discovers the containing workspace automatically.
4
+
5
+ The authoring API, full starter library, and commands below are shared by normal OpenDoc and OpenDoc Headless. Headless uses the `opendoc` package alias to preserve imports and guide paths; it needs no browser service. See [Headless](HEADLESS.md) for complete remote production and artifact delivery.
6
+
7
+ Every document needs a project. Create its initial source and assignment with `npx opendoc create <id> --project <project-id> --title "Title"`, then develop the generated source. Add `--template <template-id>` when using a catalog layout; an ordinary document needs neither a template nor a starter. For imported document folders, use `npx opendoc projects assign <document-id> <project-id>`. See [Projects](PROJECTS.md) for defaults and membership.
8
+
9
+ Use English, local assets, and a pure TSX component. OpenDoc owns a small set of document primitives; Forme provides the underlying page layout. Arbitrary HTML, browser CSS, React hooks, and asynchronous component effects do not belong inside document source.
10
+
11
+ ## A complete small document
12
+
13
+ ```tsx
14
+ import {
15
+ Document, Pages, TitleBlock, Section, Paragraph, Cite, References,
16
+ type DocumentMeta,
17
+ } from 'opendoc';
18
+ import { theme } from './theme';
19
+
20
+ export const meta: DocumentMeta = {
21
+ title: 'A useful technical brief',
22
+ description: 'The decision, its reasoning, and how to check it.',
23
+ kind: 'technical',
24
+ theme: theme.id,
25
+ };
26
+
27
+ export default function Brief() {
28
+ return <Document title={meta.title} theme={theme}
29
+ references={{ forme: { title: 'Forme documentation', url: 'https://docs.formepdf.com/' } }}>
30
+ <Pages title={meta.title} footer="Design notes">
31
+ <TitleBlock id="opening" title={meta.title}
32
+ subtitle="Begin with the decision this document supports." />
33
+ <Section id="context" title="Context" lead="Explain the problem in a short opening.">
34
+ <Paragraph id="reasoning">Develop the reasoning with evidence. <Cite source="forme" /></Paragraph>
35
+ </Section>
36
+ <References />
37
+ </Pages>
38
+ </Document>;
39
+ }
40
+ ```
41
+
42
+ Use this inside a document created with the command above; retain the generated `theme.tsx` and `assets.json`. This example demonstrates citation mechanics; replace its source and prose with material relevant to the user's brief.
43
+
44
+ Import document primitives from `opendoc`, asset adapters from `opendoc/assets`, template contracts from `opendoc/template`, and theme types and helpers from `opendoc/themes`. Keep imports of your own documents, templates, themes, and data relative to those workspace files. Do not import OpenDoc's internal `src/` files.
45
+
46
+ `meta.kind` is an optional nonempty descriptive label, such as `quotation`. Omit it when a category adds nothing. Metadata describes the document; it does not choose its layout or constrain its structure. Themes are discovered from `themes/<id>/`. Use `npx opendoc themes list` and read only the selected theme’s `design.md`, then the needed component source. New documents import the adapted `theme` from `./theme`, preserving the saved asset choices; `meta.theme` must match the `Document` theme ID. Pass this same theme to any template factory before rendering. Civic Spectrum, Field Manual, McKinsey Consulting, and OpenDoc Neutral supply distinct print systems and reusable compositions. Neutral offers a simpler foundation and is the document fallback. See [Themes](THEMES.md).
47
+
48
+ ## Page structure and reading rhythm
49
+
50
+ ### Presentations
51
+
52
+ Create a presentation with `npx opendoc create <id> --project <project-id> --title "Title" --format presentation`. It uses the same document folder, theme adapter, assets, media, selection, comments, and text corrections. The format is recorded in `projects.json` before source publication; older entries remain documents. Use the matching root rather than changing the format by swapping components alone.
53
+
54
+ ```tsx
55
+ import { Presentation, Slide, Heading, Paragraph } from 'opendoc';
56
+ import { theme } from './theme';
57
+
58
+ export const meta = { title: 'A clear idea', description: '', theme: theme.id };
59
+ export default function Deck() {
60
+ return <Presentation title={meta.title} theme={theme}>
61
+ <Slide id="opening">
62
+ <Heading id="opening-title" level={1} style={{ fontSize: 44, lineHeight: 1.1 }}>A clear idea</Heading>
63
+ <Paragraph id="opening-lead" style={{ fontSize: 24 }}>One thought with room to breathe.</Paragraph>
64
+ </Slide>
65
+ </Presentation>;
66
+ }
67
+ ```
68
+
69
+ Each `Slide` is exactly 960 × 540 points (16:9), with 40-point padding by default. Optional `padding` changes the inset; `style` controls the content composition while canvas dimensions remain fixed. `backgroundMedia`, `backgroundImage`, `backgroundOpacity`, `backgroundSize`, and `backgroundPosition` use the same managed background support as `Page`. Place ordinary native content, `MediaFrame`, and `Logo` inside slides. Use current theme fonts and colors, adapting sizes locally for reading at presentation distance; document typography is not automatically scaled.
70
+
71
+ Every slide needs a unique stable ID, and component IDs remain unique across the whole deck. Preserve both when reordering. Slides cannot nest or contain `Page`, `Pages`, `PageBreak`, or running header/footer primitives. Put all content inside explicit slides. References and source notes also need room on explicit slides.
72
+
73
+ Overflow is an error: OpenDoc rejects extra pages, content crossing slide boundaries, off-page visuals/text, and clipped content. It does not silently shrink or discard content. Shorten the material, adjust the composition, or explicitly add another slide. Review the updated PDF after text corrections; a failed revision may leave older successful artifacts or the browser preview available, which do not represent that revision. Discover reusable deck skeletons through `npx opendoc templates list` or the browser's **Templates → Presentations**; `--template <id>` infers their presentation format. See [Templates](TEMPLATES.md#presentation-templates). Current themes supply fonts and colors; compose typography for slides locally.
74
+
75
+ #### PowerPoint delivery
76
+
77
+ Presentations are delivered as **PDF and editable PowerPoint by default**, unless the user asks for a single format. The PDF is also the reviewed layout used for PowerPoint export. From the same final source revision, run:
78
+
79
+ ```sh
80
+ npx opendoc export <id>
81
+ npx opendoc export <id> --format pptx
82
+ ```
83
+
84
+ Deliver `output/<id>.pdf` and `output/<id>.pptx`. After a source, media, or font change, regenerate and review the affected output in both formats. Do not mix an updated PDF with an earlier deck. See [the review skill](../.agents/skills/opendoc-review-document/SKILL.md).
85
+
86
+ Compose for the editable export from the beginning:
87
+
88
+ - Native text, rectangular shapes, solid borders, and images are supported. Text becomes editable boxes with the reviewed line breaks. Images and chart artwork remain images; tables assembled from blocks remain separate objects.
89
+ - Embedded fonts must have TrueType outlines and permit editable embedding. PowerPoint has regular, bold, italic, and bold-italic slots; different faces competing for the same family/style slot cannot be preserved together. Use the exact selected asset faces and verify an early export when introducing custom fonts. Do not silently replace an explicitly chosen font.
90
+ - Unsupported effects, including transforms, shadows, gradients, rounded shape corners, group opacity, justified text, and custom word spacing, fail with a specific error. Use compatible compositions within the brief; ask if resolving an error would materially change the user's chosen design or editability. Do not flatten the whole slide to work around an editable-export failure.
91
+ - Significant edits in PowerPoint can require resizing or reflowing a text box; PowerPoint does not rerun Forme. Inspect native rendering when available, and state verification limits accurately. A successful export or embedded-font record alone is not proof of identical appearance across platforms.
92
+
93
+ #### Document primitives
94
+
95
+ | Primitive | Use |
96
+ | --- | --- |
97
+ | `Document` | One root; title, author, theme, reference records, and citation mode |
98
+ | `Pages` | Flowing pages; optional size, margins, running header/footer text, and page numbers |
99
+ | `Page` | Custom native page composition, including reliable full-page background colors |
100
+ | `Cover` | A deliberate opening page with title, subtitle, footer, and optional stable `idPrefix` |
101
+ | `TitleBlock` | A compact title, optional subtitle/byline, and restrained dividing rule |
102
+ | `Section` | A heading plus a short lead held together; subsequent children flow naturally |
103
+ | `Heading` | Levels 1–3 with automatic PDF bookmarks; `bookmark={false}` suppresses one |
104
+ | `Paragraph` | Readable prose with widow/orphan controls and optional whole-block `href` |
105
+ | `Block` | A stable feedback target around a custom Forme visual or composition |
106
+
107
+ Use `Section` for ordinary prose sections. Its lead is deliberately limited to 700 characters; put longer content in normal paragraphs inside the section. Do not place an entire long section, table, or variable data report in an unbreakable container.
108
+
109
+ `Pages` defaults to the theme's A4 portrait layout. It also accepts Forme page sizes or a custom `{ width, height }` in points, `margin`, `header`, `footer`, and `pageNumbers`. Set header/footer to `false` to suppress them. For custom page compositions import `Page` from OpenDoc, with native Forme primitives inside; it handles the current engine's page-background limitation. Columns are appropriate for short independent material; they are not a promise of sequential magazine text flow. Use a composed opening followed by flowing pages for long publications.
110
+
111
+ ## Tables, figures, lists, and code
112
+
113
+ `DataTable` takes `columns` and `rows`. Columns have `label`, optional positive `width` weights, and optional `align: 'left' | 'center' | 'right'`. Numeric columns align right automatically. Cells are strings, finite numbers, or transparent text bindings; every row must match the columns. Optional `rowIds` preserve cell targets when records reorder. Optional `caption` and `sourceNote` explain the table. The caption and column headings repeat on continued pages. An empty table displays `emptyMessage` instead of pretending to contain observations.
114
+
115
+ ```tsx
116
+ <DataTable id="measurements" caption="Illustrative measurements"
117
+ columns={[{ label: 'Condition', width: 2 }, { label: 'Time (ms)' }]}
118
+ rows={[["Baseline", 24], ["Revised", 19]]}
119
+ sourceNote="Synthetic values for demonstrating table layout." />
120
+ ```
121
+
122
+ `Figure` keeps its visual, caption, and optional source note together. Size the visual to fit the available page area. Use managed `Media`, or supported local `Svg` or `Image` content, with useful alternative text. Do not treat a diagram or chart as evidence without identifying its basis. Very long labels and oversized figures require visual review.
123
+
124
+ OpenDoc rejects native Forme chart components on the current engine: their label encoding is incompatible with OpenDoc's embedded fonts, and changing the chart's font style does not correct it. Generate a local chart asset and place it in `Figure`; review every label, unit, scale, and legend in the exported PDF. Keep the underlying data with the document.
125
+
126
+ Prefer managed `<Media item="id" width={460} />` inside `Figure` for photos, charts, and diagrams. Each item has its own folder, metadata, and optional prepared data. Leave supplied inputs in the project’s existing organization. Optional source notes identify provenance; OpenDoc does not manage those originals. Read the [media guide](MEDIA.md) before adding or regenerating media.
127
+
128
+ For exact image rectangles use `<MediaFrame item="id" width={460} height={240} fit="cover" />`; use `fit="contain"` to preserve the whole image, `position={{x:0.5,y:0.5}}` to align the crop, or `radius` for rounded/circular frames. Use `<Page backgroundMedia="id" backgroundSize="cover">` for managed full bleed with native text on top. These follow the same freshness and usage contract as `Media`. See [image placement](MEDIA.md#image-frames-and-full-page-artwork) and the Image story guide at workspace-root `templates/image-story/AGENTS.md` for reviewed starting compositions and renderer limitations.
129
+
130
+ Direct local image paths resolve relative to the document folder; managed `Media` adds browser discovery and provenance checks. For `documents/cooling-review/chart.png`, use:
131
+
132
+ ```tsx
133
+ <Figure id="cooling-chart" caption="Illustrative cooling curves."
134
+ sourceNote="Synthetic measurements; see the accompanying data file.">
135
+ <Image src="./chart.png" alt="Two illustrative temperature curves over 30 minutes."
136
+ style={{ width: 460, height: 260 }} />
137
+ </Figure>
138
+ ```
139
+
140
+ `List` takes `items: { id, children }[]`, with optional `ordered` and `start`. Record IDs survive reordering. Omit empty lists. Items remain together and the list flows between items; a single item must fit on a page.
141
+
142
+ For continuous essay text with first-line indentation, use `Prose` as described in [Continuous prose](PROSE.md). It preserves ordinary paragraph IDs and source bindings.
143
+
144
+ Lists use ordinary text rows because the current engine mismeasures native wrapped list items. Their text and numbering remain selectable, but the PDF does not carry native list structure tags.
145
+
146
+ `Callout` accepts inline or block children and an optional title. Use it when the reader needs to notice a limitation, decision, or instruction, not as a container for every paragraph.
147
+
148
+ `CodeBlock` accepts a literal string, optional `language`/`caption`, and `tabSize` (2, 4, or 8). It uses the bundled monospace face and preserves indentation. Long source lines can wrap; inspect code where wrapping could change how a reader interprets it. Keep executable examples accurate. `Strong` and `Em` use real weight and italic faces from the selected family. Explicitly unavailable styles fail instead of being synthesized.
149
+
150
+ ## Evidence and references
151
+
152
+ `Document` accepts a `references` object keyed by stable source IDs. Each record needs a `title`. Include an HTTP(S) `url` when one exists; print sources do not need a fabricated link. `author` and `year` are optional for numeric citations and required for author-date citations.
153
+
154
+ - `<Cite source="key" />` reuses its number on repeated citations. An optional `locator="p. 12"` identifies a page or section of the source.
155
+ - `<Document citationStyle="author-date">` uses author/year labels and disambiguates matching author/year pairs.
156
+ - `<References />` includes all cited sources, even when the list is placed before a citation in source. Prefer placing it at the end for readers. Omitting the list when citations exist is an error.
157
+ - `<CrossReference target="measurements" />` resolves a figure/table number or heading/section title, including forward references. Unknown targets fail instead of showing a fabricated label. Referenced tables need visible captions; inconsistent manually numbered captions fail clearly.
158
+ - `<Note id="method-detail">Additional explanation.</Note>` creates an inline marker; `<Notes />` prints the endnotes. The notes section is required when notes exist.
159
+
160
+ These are simple numeric and author-date formats, not a complete citation-style processor. Cross-references identify labels rather than page numbers. Reference-list entries carry working PDF links; Forme 0.20.1 does not emit working annotations for inline link runs. Use `Paragraph href` for a whole-block link.
161
+
162
+ OpenDoc validates reference records and relationships. It does not verify whether a source supports a claim, whether a calculation is correct, or whether a study design is sound. Keep synthetic examples, measured observations, and inference distinct.
163
+
164
+ ## Durable feedback
165
+
166
+ Every commentable block needs a unique, stable `id`. Preserve it when rewriting or moving the same idea; assign a new ID to a different idea. Avoid IDs derived from page numbers or array positions.
167
+
168
+ Selections can identify individual phrases within those blocks. Literal document-owned text supports quick corrections; reusable props and instance data use transparent `TextSlot` bindings. Preserve slot and record IDs alongside block IDs. See [Selection and quick corrections](SELECTION.md) for the binding and agent-context contract.
169
+
170
+ Composite primitives reserve their child IDs. `TitleBlock id="opening"` creates `opening-title`, `opening-subtitle`, and `opening-byline` when present. `Section id="method"` creates `method-heading` and `method-lead`. `List id="steps"` combines its ID with each item ID. `Cover` defaults to the `cover-` prefix; choose another prefix for a second cover. References reserve `reference-<source-id>` and notes reserve `note-<note-id>`.
171
+
172
+ Data-driven reports should export provenance identifying their shared template and their own data file. See the monthly report contract at workspace-root `templates/monthly-report/README.md` and the [opendoc-create-template skill](../.agents/skills/opendoc-create-template/SKILL.md). A content correction belongs in the instance data; a layout change may affect every instance.
173
+
174
+ ## Finish at the PDF
175
+
176
+ Run `npx opendoc check`. `npx opendoc review <id> --json` prepares a fresh PDF, page images, extracted text, and structured review evidence without a browser; save intended browser corrections first when using it in normal OpenDoc. Inspect every page at readable size, read render issues, and check representative text, including symbols, code, and the final rows of long tables. Verify references and links that matter to the document. Revise as needed, then use `npx opendoc export <id>` to deliver the final unchanged revision. Presentations also need the requested PowerPoint export described above. Remote agents deliver accessible files through their existing channel; the recipient needs no OpenDoc installation.
177
+
178
+ The geometry checks reject concrete off-page content, clipping, and header/footer overlap. They allow deliberate page backgrounds and do not enforce an aesthetic template. Warnings point to possible stranded headings or empty pages. They are aids to review, not a guarantee of perfect formatting or accessibility conformance.
@@ -0,0 +1,120 @@
1
+ # OpenDoc Headless
2
+
3
+ OpenDoc Headless is the complete document-production workflow for agents running remotely. Ask the agent for a report, presentation, theme, or template; it authors, renders, reviews, and revises the work, then returns the finished files. The recipient opens the PDF or PowerPoint on any device and does not need OpenDoc installed.
4
+
5
+ Both editions come from the same open-source repository, use the same version and rendering implementation, and include the full starter library: editable templates, themes, fonts, and welcome examples. Headless omits the browser interface and its service dependencies. It has no embedded AI, hosted service, or messaging connector. The host agent supplies the model, task context, filesystem access, and delivery channel.
6
+
7
+ ## Install in the agent's environment
8
+
9
+ Requires Node.js 24 or newer and npm on macOS or Linux. Run:
10
+
11
+ ```sh
12
+ npx --yes @ryanyahya/opendoc-headless init ./workspace --json
13
+ cd ./workspace
14
+ npx opendoc --help
15
+ ```
16
+
17
+ Supply a new or empty destination. Headless initialization is noninteractive and never opens a browser or starts a service. It installs an exact version, copies the full editable starter library, and writes the workspace's project records and versioned agent-guide pointers. Installation and updates need network access; rendering local content does not.
18
+
19
+ Run subsequent commands from the initialized workspace or one of its subfolders. Use `--workspace /absolute/path/to/workspace` to target it from elsewhere. The `.opendoc/workspace.json` marker records `edition: "headless"`. Its package dependency uses an npm alias, for example:
20
+
21
+ ```json
22
+ {
23
+ "dependencies": {
24
+ "opendoc": "npm:@ryanyahya/opendoc-headless@0.4.0"
25
+ }
26
+ }
27
+ ```
28
+
29
+ Normal OpenDoc similarly aliases `opendoc` to `npm:@ryanyahya/opendoc@<version>`. These aliases keep `npx opendoc`, `node_modules/opendoc/`, and authoring imports such as `opendoc/assets` identical in both editions. Do not add the normal package to obtain document components. Edit the workspace's `documents/`, `themes/`, `templates/`, and `assets/`; installed package files are application code and versioned guidance.
30
+
31
+ The agent may retain this workspace for later requests or create a disposable one for a single job. A command exits after its work; no persistent OpenDoc process is required. Retain the source and resources before discarding a workspace when future revisions or reusable designs are part of the request.
32
+
33
+ ## Author, inspect, revise, deliver
34
+
35
+ Follow [AGENTS.md](../AGENTS.md) and its matching skills. All shared writing, design, provenance, stable-identity, media, font, and export rules apply. Resolve document and project IDs from the request and workspace catalogs; an old `.opendoc/current.json` is not current remote task context. Do not start the browser to resolve a target.
36
+
37
+ For example, discover the available designs and create a project and document:
38
+
39
+ ```sh
40
+ npx opendoc themes list --json
41
+ npx opendoc templates list --json
42
+ npx opendoc projects create client-work --name "Client work" --theme neutral --json
43
+ npx opendoc create my-report --project client-work --title "Project report" --json
44
+ ```
45
+
46
+ Honor the user's design choices; when choosing is delegated, use judgment. An existing project can be reused. Creation makes a scaffold, project membership, `theme.tsx`, and exact `assets.json` bindings. The agent then writes the actual report in `documents/my-report/index.tsx` using the [authoring API](AUTHORING.md). A scaffold is not a finished deliverable.
47
+
48
+ After authoring:
49
+
50
+ ```sh
51
+ npx opendoc check --json
52
+ npx opendoc review my-report --json
53
+ ```
54
+
55
+ `check` typechecks workspace source. `review` renders fresh saved source and produces the PDF, readable page PNGs, extracted page text, and a `review.json` manifest. For documents and presentations these live under `output/reviews/documents/<id>/`; theme and template specimens use `output/reviews/themes/<id>/` and `output/reviews/templates/<id>/`. Use the returned paths instead of guessing filenames. The same command works in normal OpenDoc; save intended browser text corrections before reviewing saved source there.
56
+
57
+ The result identifies the exact PDF hash, output paths, page count and dimensions, page images/text, render issues, and stable block/source information. `status: "ready"` and exit code 0 mean the review artifacts were prepared and technical render/layout checks passed. **They do not mean visual or factual review is complete.** The manifest keeps `visualReview` and `factualReview` as `"required"`.
58
+
59
+ The agent must inspect every page image at a readable scale, examine representative extracted text, and check the content against the brief and sources. Fix clipping, missing glyphs, awkward breaks, bad crops, incorrect claims, and other material defects. After changing source, regenerate the review artifacts and inspect affected pages and adjacent breaks. The [review skill](../.agents/skills/opendoc-review-document/SKILL.md) defines the full pass. If the agent cannot inspect images, report that concrete limitation; generating PNGs is not visual inspection.
60
+
61
+ Render and source-freshness failures return a nonzero exit status and structured diagnostics when available. They leave the previous successful review files intact, so those files must not be represented as the failed revision's output. Inspect the current command result before using an existing path.
62
+
63
+ When the final revision is ready:
64
+
65
+ ```sh
66
+ npx opendoc export my-report --json
67
+ ```
68
+
69
+ This writes `output/my-report.pdf`. Export renders fresh in Headless, independently of any browser session or stale server state. Keep source unchanged between final review and export, and use the exported file for delivery.
70
+
71
+ ## Presentations
72
+
73
+ Create a slide scaffold with `--format presentation`, or use a presentation template whose format is inferred:
74
+
75
+ ```sh
76
+ npx opendoc create project-deck --project client-work --title "Project update" --format presentation --json
77
+ ```
78
+
79
+ Author `Presentation` and explicit `Slide` components, preserving one 960 × 540 PDF page per slide. Complete the same check/review/revise cycle, then export both formats from the same final source:
80
+
81
+ ```sh
82
+ npx opendoc export project-deck --json
83
+ npx opendoc export project-deck --format pptx --json
84
+ ```
85
+
86
+ Deliver both `output/project-deck.pdf` and `output/project-deck.pptx` unless the user requests a single format. Review the PDF even for a PowerPoint-only request because it supplies the layout used for export. Follow [PowerPoint delivery](AUTHORING.md#powerpoint-delivery) for supported effects, editable objects, font embedding, package/content checks, and native inspection when available.
87
+
88
+ A remote environment need not have Microsoft PowerPoint installed. Complete available PDF and PPTX package/content checks and state when native PowerPoint appearance was not verified; that limitation alone does not prevent delivery of a valid requested file. A failed PPTX export is a separate incomplete format and must be reported and corrected within scope.
89
+
90
+ ## Create themes and templates remotely
91
+
92
+ Use [opendoc-create-theme](../.agents/skills/opendoc-create-theme/SKILL.md) or [opendoc-create-template](../.agents/skills/opendoc-create-template/SKILL.md). Author the reusable bundle in its workspace catalog, then inspect its real specimen without a browser:
93
+
94
+ ```sh
95
+ npx opendoc review --theme my-theme --json
96
+ npx opendoc review --template my-template --json
97
+ ```
98
+
99
+ Each produces the same page-image, text, PDF, and manifest evidence as a document review. Specimens stay outside the document library and need no project membership. The lighter `themes check <id>` and `templates check <id>` commands validate and render without exporting a specimen. `themes preview <id>` writes `output/themes/<id>.pdf`; `templates preview <id>` writes `output/templates/<id>.pdf`.
100
+
101
+ Verify catalog discovery with `themes inspect <id>` or `templates inspect <id>`, inspect every specimen page, and exercise representative content and affected instances as required by the skill. Keep the completed theme or template in the remote workspace for reuse. Return its reviewed specimen PDF to show the design. If the user requests a portable bundle, include its source, guide, specimen source, and required local dependencies/assets with their licenses; a specimen PDF alone is not a reusable theme or template.
102
+
103
+ ## Deliver through the host agent
104
+
105
+ OpenDoc produces files and machine-readable results. The agent sends the requested artifacts through its existing attachment, download, or storage capabilities, within the user's requested destination and scope. For example, a messaging agent may attach the PDF to its current conversation; another agent may expose a downloadable file.
106
+
107
+ Return accessible artifacts, not a remote-only filesystem path the recipient cannot open. Do not send internal review manifests, source material, or unrelated workspace files unless requested. Keep the final response focused on the deliverables and any concrete unresolved limits. The recipient should never need to install OpenDoc, start its GUI, or repeat the agent's review to complete the requested production workflow.
108
+
109
+ ## Update
110
+
111
+ From the workspace:
112
+
113
+ ```sh
114
+ npx opendoc update --check --json
115
+ npx opendoc update --json
116
+ ```
117
+
118
+ Updates stay on `@ryanyahya/opendoc-headless` and pin the selected exact version while preserving authored documents, templates, themes, assets, feedback, and project records. They update the installed application and its guidance together; they do not overwrite local catalogs with newly shipped examples. See the [update rules](../README.md#update-an-existing-workspace) for compatible versions and explicit version selection.
119
+
120
+ The workspace runs trusted TSX code. Render workers contain crashes and timeouts, not hostile code. The host agent's environment owns its own isolation and access controls; see [Security](../SECURITY.md).