@ryanyahya/opendoc-headless 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 (716) 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/docs/APPEARANCE.md +21 -0
  24. package/docs/ASSETS.md +176 -0
  25. package/docs/AUTHORING.md +178 -0
  26. package/docs/HEADLESS.md +120 -0
  27. package/docs/MEDIA.md +112 -0
  28. package/docs/PROJECTS.md +55 -0
  29. package/docs/PROSE.md +15 -0
  30. package/docs/SELECTION.md +59 -0
  31. package/docs/TEMPLATES.md +55 -0
  32. package/docs/THEMES.md +106 -0
  33. package/node_modules/@formepdf/core/LICENSE +21 -0
  34. package/node_modules/@formepdf/core/README.md +53 -0
  35. package/node_modules/@formepdf/core/dist/attachments.d.ts +55 -0
  36. package/node_modules/@formepdf/core/dist/attachments.js +59 -0
  37. package/node_modules/@formepdf/core/dist/extract.d.ts +8 -0
  38. package/node_modules/@formepdf/core/dist/extract.js +56 -0
  39. package/node_modules/@formepdf/core/dist/index.d.ts +311 -0
  40. package/node_modules/@formepdf/core/dist/index.js +167 -0
  41. package/node_modules/@formepdf/core/dist/layout.d.ts +132 -0
  42. package/node_modules/@formepdf/core/dist/layout.js +240 -0
  43. package/node_modules/@formepdf/core/dist/shared/browserHelpers.d.ts +19 -0
  44. package/node_modules/@formepdf/core/dist/shared/browserHelpers.js +128 -0
  45. package/node_modules/@formepdf/core/package.json +35 -0
  46. package/node_modules/@formepdf/core/pkg-node/LICENSE +21 -0
  47. package/node_modules/@formepdf/core/pkg-node/README.md +84 -0
  48. package/node_modules/@formepdf/core/pkg-node/forme.d.ts +39 -0
  49. package/node_modules/@formepdf/core/pkg-node/forme.js +394 -0
  50. package/node_modules/@formepdf/core/pkg-node/forme_bg.wasm +0 -0
  51. package/node_modules/@formepdf/core/pkg-node/forme_bg.wasm.d.ts +21 -0
  52. package/node_modules/@formepdf/core/pkg-node/package.json +25 -0
  53. package/node_modules/@formepdf/react/README.md +70 -0
  54. package/node_modules/@formepdf/react/dist/charts.d.ts +72 -0
  55. package/node_modules/@formepdf/react/dist/charts.js +338 -0
  56. package/node_modules/@formepdf/react/dist/components.d.ts +533 -0
  57. package/node_modules/@formepdf/react/dist/components.js +608 -0
  58. package/node_modules/@formepdf/react/dist/expr.d.ts +20 -0
  59. package/node_modules/@formepdf/react/dist/expr.js +39 -0
  60. package/node_modules/@formepdf/react/dist/font.d.ts +2 -0
  61. package/node_modules/@formepdf/react/dist/font.js +1 -0
  62. package/node_modules/@formepdf/react/dist/index.d.ts +11 -0
  63. package/node_modules/@formepdf/react/dist/index.js +15 -0
  64. package/node_modules/@formepdf/react/dist/render.d.ts +12 -0
  65. package/node_modules/@formepdf/react/dist/render.js +15 -0
  66. package/node_modules/@formepdf/react/dist/serialize.d.ts +12 -0
  67. package/node_modules/@formepdf/react/dist/serialize.js +1470 -0
  68. package/node_modules/@formepdf/react/dist/stylesheet.d.ts +4 -0
  69. package/node_modules/@formepdf/react/dist/stylesheet.js +5 -0
  70. package/node_modules/@formepdf/react/dist/template-proxy.d.ts +38 -0
  71. package/node_modules/@formepdf/react/dist/template-proxy.js +100 -0
  72. package/node_modules/@formepdf/react/dist/types.d.ts +287 -0
  73. package/node_modules/@formepdf/react/dist/types.js +1 -0
  74. package/node_modules/@formepdf/react/package.json +41 -0
  75. package/node_modules/@formepdf/shared/README.md +7 -0
  76. package/node_modules/@formepdf/shared/dist/canvas.d.ts +6 -0
  77. package/node_modules/@formepdf/shared/dist/canvas.js +43 -0
  78. package/node_modules/@formepdf/shared/dist/charts.d.ts +100 -0
  79. package/node_modules/@formepdf/shared/dist/charts.js +98 -0
  80. package/node_modules/@formepdf/shared/dist/encode.d.ts +27 -0
  81. package/node_modules/@formepdf/shared/dist/encode.js +93 -0
  82. package/node_modules/@formepdf/shared/dist/font.d.ts +13 -0
  83. package/node_modules/@formepdf/shared/dist/font.js +52 -0
  84. package/node_modules/@formepdf/shared/dist/index.d.ts +10 -0
  85. package/node_modules/@formepdf/shared/dist/index.js +15 -0
  86. package/node_modules/@formepdf/shared/dist/parser.d.ts +30 -0
  87. package/node_modules/@formepdf/shared/dist/parser.js +756 -0
  88. package/node_modules/@formepdf/shared/dist/semantics.d.ts +15 -0
  89. package/node_modules/@formepdf/shared/dist/semantics.js +44 -0
  90. package/node_modules/@formepdf/shared/dist/style.d.ts +7 -0
  91. package/node_modules/@formepdf/shared/dist/style.js +1024 -0
  92. package/node_modules/@formepdf/shared/dist/types.d.ts +743 -0
  93. package/node_modules/@formepdf/shared/dist/types.js +2 -0
  94. package/node_modules/@formepdf/shared/package.json +35 -0
  95. package/node_modules/@types/node/LICENSE +21 -0
  96. package/node_modules/@types/node/README.md +15 -0
  97. package/node_modules/@types/node/assert/strict.d.ts +111 -0
  98. package/node_modules/@types/node/assert.d.ts +1078 -0
  99. package/node_modules/@types/node/async_hooks.d.ts +603 -0
  100. package/node_modules/@types/node/buffer.buffer.d.ts +472 -0
  101. package/node_modules/@types/node/buffer.d.ts +1934 -0
  102. package/node_modules/@types/node/child_process.d.ts +1476 -0
  103. package/node_modules/@types/node/cluster.d.ts +578 -0
  104. package/node_modules/@types/node/compatibility/disposable.d.ts +14 -0
  105. package/node_modules/@types/node/compatibility/index.d.ts +9 -0
  106. package/node_modules/@types/node/compatibility/indexable.d.ts +20 -0
  107. package/node_modules/@types/node/compatibility/iterators.d.ts +20 -0
  108. package/node_modules/@types/node/console.d.ts +452 -0
  109. package/node_modules/@types/node/constants.d.ts +21 -0
  110. package/node_modules/@types/node/crypto.d.ts +4545 -0
  111. package/node_modules/@types/node/dgram.d.ts +600 -0
  112. package/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
  113. package/node_modules/@types/node/dns/promises.d.ts +503 -0
  114. package/node_modules/@types/node/dns.d.ts +923 -0
  115. package/node_modules/@types/node/domain.d.ts +170 -0
  116. package/node_modules/@types/node/events.d.ts +976 -0
  117. package/node_modules/@types/node/fs/promises.d.ts +1306 -0
  118. package/node_modules/@types/node/fs.d.ts +4463 -0
  119. package/node_modules/@types/node/globals.d.ts +172 -0
  120. package/node_modules/@types/node/globals.typedarray.d.ts +38 -0
  121. package/node_modules/@types/node/http.d.ts +2097 -0
  122. package/node_modules/@types/node/http2.d.ts +2843 -0
  123. package/node_modules/@types/node/https.d.ts +579 -0
  124. package/node_modules/@types/node/index.d.ts +98 -0
  125. package/node_modules/@types/node/inspector.d.ts +253 -0
  126. package/node_modules/@types/node/inspector.generated.d.ts +4052 -0
  127. package/node_modules/@types/node/module.d.ts +891 -0
  128. package/node_modules/@types/node/net.d.ts +1076 -0
  129. package/node_modules/@types/node/os.d.ts +506 -0
  130. package/node_modules/@types/node/package.json +145 -0
  131. package/node_modules/@types/node/path.d.ts +200 -0
  132. package/node_modules/@types/node/perf_hooks.d.ts +968 -0
  133. package/node_modules/@types/node/process.d.ts +2084 -0
  134. package/node_modules/@types/node/punycode.d.ts +117 -0
  135. package/node_modules/@types/node/querystring.d.ts +152 -0
  136. package/node_modules/@types/node/readline/promises.d.ts +161 -0
  137. package/node_modules/@types/node/readline.d.ts +594 -0
  138. package/node_modules/@types/node/repl.d.ts +428 -0
  139. package/node_modules/@types/node/sea.d.ts +162 -0
  140. package/node_modules/@types/node/sqlite.d.ts +722 -0
  141. package/node_modules/@types/node/stream/consumers.d.ts +38 -0
  142. package/node_modules/@types/node/stream/promises.d.ts +90 -0
  143. package/node_modules/@types/node/stream/web.d.ts +573 -0
  144. package/node_modules/@types/node/stream.d.ts +1694 -0
  145. package/node_modules/@types/node/string_decoder.d.ts +67 -0
  146. package/node_modules/@types/node/test.d.ts +2265 -0
  147. package/node_modules/@types/node/timers/promises.d.ts +108 -0
  148. package/node_modules/@types/node/timers.d.ts +287 -0
  149. package/node_modules/@types/node/tls.d.ts +1319 -0
  150. package/node_modules/@types/node/trace_events.d.ts +197 -0
  151. package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +468 -0
  152. package/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +34 -0
  153. package/node_modules/@types/node/ts5.6/index.d.ts +98 -0
  154. package/node_modules/@types/node/tty.d.ts +208 -0
  155. package/node_modules/@types/node/url.d.ts +984 -0
  156. package/node_modules/@types/node/util.d.ts +2606 -0
  157. package/node_modules/@types/node/v8.d.ts +920 -0
  158. package/node_modules/@types/node/vm.d.ts +1053 -0
  159. package/node_modules/@types/node/wasi.d.ts +181 -0
  160. package/node_modules/@types/node/web-globals/abortcontroller.d.ts +34 -0
  161. package/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  162. package/node_modules/@types/node/web-globals/events.d.ts +97 -0
  163. package/node_modules/@types/node/web-globals/fetch.d.ts +55 -0
  164. package/node_modules/@types/node/web-globals/navigator.d.ts +22 -0
  165. package/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  166. package/node_modules/@types/node/web-globals/streams.d.ts +22 -0
  167. package/node_modules/@types/node/worker_threads.d.ts +819 -0
  168. package/node_modules/@types/node/zlib.d.ts +747 -0
  169. package/node_modules/@types/react/LICENSE +21 -0
  170. package/node_modules/@types/react/README.md +15 -0
  171. package/node_modules/@types/react/canary.d.ts +129 -0
  172. package/node_modules/@types/react/compiler-runtime.d.ts +4 -0
  173. package/node_modules/@types/react/experimental.d.ts +184 -0
  174. package/node_modules/@types/react/global.d.ts +166 -0
  175. package/node_modules/@types/react/index.d.ts +4378 -0
  176. package/node_modules/@types/react/jsx-dev-runtime.d.ts +33 -0
  177. package/node_modules/@types/react/jsx-runtime.d.ts +24 -0
  178. package/node_modules/@types/react/package.json +210 -0
  179. package/node_modules/@types/react/ts5.0/canary.d.ts +129 -0
  180. package/node_modules/@types/react/ts5.0/experimental.d.ts +184 -0
  181. package/node_modules/@types/react/ts5.0/global.d.ts +166 -0
  182. package/node_modules/@types/react/ts5.0/index.d.ts +4365 -0
  183. package/node_modules/@types/react/ts5.0/jsx-dev-runtime.d.ts +33 -0
  184. package/node_modules/@types/react/ts5.0/jsx-runtime.d.ts +24 -0
  185. package/node_modules/csstype/LICENSE +19 -0
  186. package/node_modules/csstype/README.md +291 -0
  187. package/node_modules/csstype/index.d.ts +22569 -0
  188. package/node_modules/csstype/index.js.flow +6863 -0
  189. package/node_modules/csstype/package.json +70 -0
  190. package/node_modules/entities/LICENSE +11 -0
  191. package/node_modules/entities/decode.d.ts +1 -0
  192. package/node_modules/entities/decode.js +3 -0
  193. package/node_modules/entities/dist/commonjs/decode-codepoint.d.ts +19 -0
  194. package/node_modules/entities/dist/commonjs/decode-codepoint.d.ts.map +1 -0
  195. package/node_modules/entities/dist/commonjs/decode-codepoint.js +77 -0
  196. package/node_modules/entities/dist/commonjs/decode-codepoint.js.map +1 -0
  197. package/node_modules/entities/dist/commonjs/decode.d.ts +209 -0
  198. package/node_modules/entities/dist/commonjs/decode.d.ts.map +1 -0
  199. package/node_modules/entities/dist/commonjs/decode.js +511 -0
  200. package/node_modules/entities/dist/commonjs/decode.js.map +1 -0
  201. package/node_modules/entities/dist/commonjs/encode.d.ts +22 -0
  202. package/node_modules/entities/dist/commonjs/encode.d.ts.map +1 -0
  203. package/node_modules/entities/dist/commonjs/encode.js +73 -0
  204. package/node_modules/entities/dist/commonjs/encode.js.map +1 -0
  205. package/node_modules/entities/dist/commonjs/escape.d.ts +43 -0
  206. package/node_modules/entities/dist/commonjs/escape.d.ts.map +1 -0
  207. package/node_modules/entities/dist/commonjs/escape.js +121 -0
  208. package/node_modules/entities/dist/commonjs/escape.js.map +1 -0
  209. package/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts +2 -0
  210. package/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts.map +1 -0
  211. package/node_modules/entities/dist/commonjs/generated/decode-data-html.js +10 -0
  212. package/node_modules/entities/dist/commonjs/generated/decode-data-html.js.map +1 -0
  213. package/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts +2 -0
  214. package/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts.map +1 -0
  215. package/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +10 -0
  216. package/node_modules/entities/dist/commonjs/generated/decode-data-xml.js.map +1 -0
  217. package/node_modules/entities/dist/commonjs/generated/encode-html.d.ts +8 -0
  218. package/node_modules/entities/dist/commonjs/generated/encode-html.d.ts.map +1 -0
  219. package/node_modules/entities/dist/commonjs/generated/encode-html.js +13 -0
  220. package/node_modules/entities/dist/commonjs/generated/encode-html.js.map +1 -0
  221. package/node_modules/entities/dist/commonjs/index.d.ts +96 -0
  222. package/node_modules/entities/dist/commonjs/index.d.ts.map +1 -0
  223. package/node_modules/entities/dist/commonjs/index.js +131 -0
  224. package/node_modules/entities/dist/commonjs/index.js.map +1 -0
  225. package/node_modules/entities/dist/commonjs/package.json +3 -0
  226. package/node_modules/entities/dist/esm/decode-codepoint.d.ts +19 -0
  227. package/node_modules/entities/dist/esm/decode-codepoint.d.ts.map +1 -0
  228. package/node_modules/entities/dist/esm/decode-codepoint.js +72 -0
  229. package/node_modules/entities/dist/esm/decode-codepoint.js.map +1 -0
  230. package/node_modules/entities/dist/esm/decode.d.ts +209 -0
  231. package/node_modules/entities/dist/esm/decode.d.ts.map +1 -0
  232. package/node_modules/entities/dist/esm/decode.js +497 -0
  233. package/node_modules/entities/dist/esm/decode.js.map +1 -0
  234. package/node_modules/entities/dist/esm/encode.d.ts +22 -0
  235. package/node_modules/entities/dist/esm/encode.d.ts.map +1 -0
  236. package/node_modules/entities/dist/esm/encode.js +69 -0
  237. package/node_modules/entities/dist/esm/encode.js.map +1 -0
  238. package/node_modules/entities/dist/esm/escape.d.ts +43 -0
  239. package/node_modules/entities/dist/esm/escape.d.ts.map +1 -0
  240. package/node_modules/entities/dist/esm/escape.js +117 -0
  241. package/node_modules/entities/dist/esm/escape.js.map +1 -0
  242. package/node_modules/entities/dist/esm/generated/decode-data-html.d.ts +2 -0
  243. package/node_modules/entities/dist/esm/generated/decode-data-html.d.ts.map +1 -0
  244. package/node_modules/entities/dist/esm/generated/decode-data-html.js +7 -0
  245. package/node_modules/entities/dist/esm/generated/decode-data-html.js.map +1 -0
  246. package/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts +2 -0
  247. package/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts.map +1 -0
  248. package/node_modules/entities/dist/esm/generated/decode-data-xml.js +7 -0
  249. package/node_modules/entities/dist/esm/generated/decode-data-xml.js.map +1 -0
  250. package/node_modules/entities/dist/esm/generated/encode-html.d.ts +8 -0
  251. package/node_modules/entities/dist/esm/generated/encode-html.d.ts.map +1 -0
  252. package/node_modules/entities/dist/esm/generated/encode-html.js +10 -0
  253. package/node_modules/entities/dist/esm/generated/encode-html.js.map +1 -0
  254. package/node_modules/entities/dist/esm/index.d.ts +96 -0
  255. package/node_modules/entities/dist/esm/index.d.ts.map +1 -0
  256. package/node_modules/entities/dist/esm/index.js +107 -0
  257. package/node_modules/entities/dist/esm/index.js.map +1 -0
  258. package/node_modules/entities/dist/esm/package.json +3 -0
  259. package/node_modules/entities/escape.d.ts +1 -0
  260. package/node_modules/entities/escape.js +3 -0
  261. package/node_modules/entities/package.json +118 -0
  262. package/node_modules/entities/readme.md +122 -0
  263. package/node_modules/entities/src/decode-codepoint.ts +81 -0
  264. package/node_modules/entities/src/decode.spec.ts +320 -0
  265. package/node_modules/entities/src/decode.ts +620 -0
  266. package/node_modules/entities/src/encode.spec.ts +78 -0
  267. package/node_modules/entities/src/encode.ts +77 -0
  268. package/node_modules/entities/src/escape.spec.ts +14 -0
  269. package/node_modules/entities/src/escape.ts +148 -0
  270. package/node_modules/entities/src/generated/.eslintrc.json +10 -0
  271. package/node_modules/entities/src/generated/decode-data-html.ts +8 -0
  272. package/node_modules/entities/src/generated/decode-data-xml.ts +8 -0
  273. package/node_modules/entities/src/generated/encode-html.ts +17 -0
  274. package/node_modules/entities/src/index.spec.ts +125 -0
  275. package/node_modules/entities/src/index.ts +188 -0
  276. package/node_modules/parse5/LICENSE +19 -0
  277. package/node_modules/parse5/README.md +38 -0
  278. package/node_modules/parse5/dist/cjs/common/doctype.d.ts +4 -0
  279. package/node_modules/parse5/dist/cjs/common/doctype.js +118 -0
  280. package/node_modules/parse5/dist/cjs/common/error-codes.d.ts +67 -0
  281. package/node_modules/parse5/dist/cjs/common/error-codes.js +66 -0
  282. package/node_modules/parse5/dist/cjs/common/foreign-content.d.ts +9 -0
  283. package/node_modules/parse5/dist/cjs/common/foreign-content.js +237 -0
  284. package/node_modules/parse5/dist/cjs/common/html.d.ts +289 -0
  285. package/node_modules/parse5/dist/cjs/common/html.js +528 -0
  286. package/node_modules/parse5/dist/cjs/common/token.d.ts +84 -0
  287. package/node_modules/parse5/dist/cjs/common/token.js +24 -0
  288. package/node_modules/parse5/dist/cjs/common/unicode.d.ts +42 -0
  289. package/node_modules/parse5/dist/cjs/common/unicode.js +70 -0
  290. package/node_modules/parse5/dist/cjs/index.d.ts +71 -0
  291. package/node_modules/parse5/dist/cjs/index.js +54 -0
  292. package/node_modules/parse5/dist/cjs/package.json +1 -0
  293. package/node_modules/parse5/dist/cjs/parser/formatting-element-list.d.ts +36 -0
  294. package/node_modules/parse5/dist/cjs/parser/formatting-element-list.js +114 -0
  295. package/node_modules/parse5/dist/cjs/parser/index.d.ts +221 -0
  296. package/node_modules/parse5/dist/cjs/parser/index.js +3240 -0
  297. package/node_modules/parse5/dist/cjs/parser/open-element-stack.d.ts +53 -0
  298. package/node_modules/parse5/dist/cjs/parser/open-element-stack.js +328 -0
  299. package/node_modules/parse5/dist/cjs/serializer/index.d.ts +60 -0
  300. package/node_modules/parse5/dist/cjs/serializer/index.js +172 -0
  301. package/node_modules/parse5/dist/cjs/tokenizer/index.d.ts +247 -0
  302. package/node_modules/parse5/dist/cjs/tokenizer/index.js +2714 -0
  303. package/node_modules/parse5/dist/cjs/tokenizer/preprocessor.d.ts +36 -0
  304. package/node_modules/parse5/dist/cjs/tokenizer/preprocessor.js +200 -0
  305. package/node_modules/parse5/dist/cjs/tree-adapters/default.d.ts +84 -0
  306. package/node_modules/parse5/dist/cjs/tree-adapters/default.js +176 -0
  307. package/node_modules/parse5/dist/cjs/tree-adapters/interface.d.ts +255 -0
  308. package/node_modules/parse5/dist/cjs/tree-adapters/interface.js +2 -0
  309. package/node_modules/parse5/dist/common/doctype.d.ts +4 -0
  310. package/node_modules/parse5/dist/common/doctype.js +114 -0
  311. package/node_modules/parse5/dist/common/error-codes.d.ts +67 -0
  312. package/node_modules/parse5/dist/common/error-codes.js +63 -0
  313. package/node_modules/parse5/dist/common/foreign-content.d.ts +9 -0
  314. package/node_modules/parse5/dist/common/foreign-content.js +228 -0
  315. package/node_modules/parse5/dist/common/html.d.ts +289 -0
  316. package/node_modules/parse5/dist/common/html.js +523 -0
  317. package/node_modules/parse5/dist/common/token.d.ts +84 -0
  318. package/node_modules/parse5/dist/common/token.js +20 -0
  319. package/node_modules/parse5/dist/common/unicode.d.ts +42 -0
  320. package/node_modules/parse5/dist/common/unicode.js +62 -0
  321. package/node_modules/parse5/dist/index.d.ts +71 -0
  322. package/node_modules/parse5/dist/index.js +42 -0
  323. package/node_modules/parse5/dist/parser/formatting-element-list.d.ts +36 -0
  324. package/node_modules/parse5/dist/parser/formatting-element-list.js +110 -0
  325. package/node_modules/parse5/dist/parser/index.d.ts +221 -0
  326. package/node_modules/parse5/dist/parser/index.js +3245 -0
  327. package/node_modules/parse5/dist/parser/open-element-stack.d.ts +53 -0
  328. package/node_modules/parse5/dist/parser/open-element-stack.js +324 -0
  329. package/node_modules/parse5/dist/serializer/index.d.ts +60 -0
  330. package/node_modules/parse5/dist/serializer/index.js +168 -0
  331. package/node_modules/parse5/dist/tokenizer/index.d.ts +247 -0
  332. package/node_modules/parse5/dist/tokenizer/index.js +2710 -0
  333. package/node_modules/parse5/dist/tokenizer/preprocessor.d.ts +36 -0
  334. package/node_modules/parse5/dist/tokenizer/preprocessor.js +196 -0
  335. package/node_modules/parse5/dist/tree-adapters/default.d.ts +84 -0
  336. package/node_modules/parse5/dist/tree-adapters/default.js +173 -0
  337. package/node_modules/parse5/dist/tree-adapters/interface.d.ts +255 -0
  338. package/node_modules/parse5/dist/tree-adapters/interface.js +1 -0
  339. package/node_modules/parse5/package.json +50 -0
  340. package/node_modules/undici-types/LICENSE +21 -0
  341. package/node_modules/undici-types/README.md +6 -0
  342. package/node_modules/undici-types/agent.d.ts +31 -0
  343. package/node_modules/undici-types/api.d.ts +43 -0
  344. package/node_modules/undici-types/balanced-pool.d.ts +29 -0
  345. package/node_modules/undici-types/cache.d.ts +36 -0
  346. package/node_modules/undici-types/client.d.ts +108 -0
  347. package/node_modules/undici-types/connector.d.ts +34 -0
  348. package/node_modules/undici-types/content-type.d.ts +21 -0
  349. package/node_modules/undici-types/cookies.d.ts +28 -0
  350. package/node_modules/undici-types/diagnostics-channel.d.ts +66 -0
  351. package/node_modules/undici-types/dispatcher.d.ts +256 -0
  352. package/node_modules/undici-types/env-http-proxy-agent.d.ts +21 -0
  353. package/node_modules/undici-types/errors.d.ts +149 -0
  354. package/node_modules/undici-types/eventsource.d.ts +61 -0
  355. package/node_modules/undici-types/fetch.d.ts +209 -0
  356. package/node_modules/undici-types/file.d.ts +39 -0
  357. package/node_modules/undici-types/filereader.d.ts +54 -0
  358. package/node_modules/undici-types/formdata.d.ts +108 -0
  359. package/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  360. package/node_modules/undici-types/global-origin.d.ts +7 -0
  361. package/node_modules/undici-types/handlers.d.ts +15 -0
  362. package/node_modules/undici-types/header.d.ts +4 -0
  363. package/node_modules/undici-types/index.d.ts +71 -0
  364. package/node_modules/undici-types/interceptors.d.ts +17 -0
  365. package/node_modules/undici-types/mock-agent.d.ts +50 -0
  366. package/node_modules/undici-types/mock-client.d.ts +25 -0
  367. package/node_modules/undici-types/mock-errors.d.ts +12 -0
  368. package/node_modules/undici-types/mock-interceptor.d.ts +93 -0
  369. package/node_modules/undici-types/mock-pool.d.ts +25 -0
  370. package/node_modules/undici-types/package.json +55 -0
  371. package/node_modules/undici-types/patch.d.ts +33 -0
  372. package/node_modules/undici-types/pool-stats.d.ts +19 -0
  373. package/node_modules/undici-types/pool.d.ts +39 -0
  374. package/node_modules/undici-types/proxy-agent.d.ts +28 -0
  375. package/node_modules/undici-types/readable.d.ts +65 -0
  376. package/node_modules/undici-types/retry-agent.d.ts +8 -0
  377. package/node_modules/undici-types/retry-handler.d.ts +116 -0
  378. package/node_modules/undici-types/util.d.ts +18 -0
  379. package/node_modules/undici-types/webidl.d.ts +228 -0
  380. package/node_modules/undici-types/websocket.d.ts +150 -0
  381. package/package.json +72 -0
  382. package/scripts/rebuild-forme.mjs +61 -0
  383. package/src/assets/adapter.ts +122 -0
  384. package/src/assets/files.ts +378 -0
  385. package/src/assets/import-worker.ts +294 -0
  386. package/src/assets/imports.ts +124 -0
  387. package/src/assets/index.ts +60 -0
  388. package/src/assets/store.ts +798 -0
  389. package/src/assets/usage.ts +118 -0
  390. package/src/cli/check.ts +25 -0
  391. package/src/cli/init.ts +119 -0
  392. package/src/cli/lock.ts +34 -0
  393. package/src/cli/main.ts +118 -0
  394. package/src/cli/process.ts +19 -0
  395. package/src/cli/start.ts +96 -0
  396. package/src/cli/update.ts +348 -0
  397. package/src/cli/workspace.ts +94 -0
  398. package/src/document/index.tsx +641 -0
  399. package/src/document/page.tsx +53 -0
  400. package/src/document/text-targets.tsx +162 -0
  401. package/src/media/files.ts +124 -0
  402. package/src/media/render.ts +63 -0
  403. package/src/rendering/resolve-sources.ts +84 -0
  404. package/src/runtime/jsx-dev-runtime.ts +2 -0
  405. package/src/runtime/jsx-runtime.ts +2 -0
  406. package/src/runtime/paths.ts +12 -0
  407. package/src/server/assets-cli.ts +162 -0
  408. package/src/server/assets-http.ts +100 -0
  409. package/src/server/client.ts +50 -0
  410. package/src/server/clipboard.ts +22 -0
  411. package/src/server/comments-cli.ts +64 -0
  412. package/src/server/comments.ts +130 -0
  413. package/src/server/create-cli.ts +33 -0
  414. package/src/server/create.ts +228 -0
  415. package/src/server/dependencies.ts +91 -0
  416. package/src/server/documents.ts +143 -0
  417. package/src/server/edits.ts +249 -0
  418. package/src/server/export-batch.ts +105 -0
  419. package/src/server/export-errors.ts +2 -0
  420. package/src/server/export-file.ts +57 -0
  421. package/src/server/export-inputs.ts +66 -0
  422. package/src/server/export-preview.ts +69 -0
  423. package/src/server/export.ts +32 -0
  424. package/src/server/exports.ts +283 -0
  425. package/src/server/files.ts +21 -0
  426. package/src/server/guides.ts +71 -0
  427. package/src/server/materials.ts +39 -0
  428. package/src/server/media-cli.ts +73 -0
  429. package/src/server/media-mutations.ts +168 -0
  430. package/src/server/pptx.ts +160 -0
  431. package/src/server/preflight.ts +129 -0
  432. package/src/server/projects-cli.ts +29 -0
  433. package/src/server/projects.ts +187 -0
  434. package/src/server/render-error.ts +9 -0
  435. package/src/server/render-source.ts +24 -0
  436. package/src/server/render.ts +48 -0
  437. package/src/server/review-cli.ts +40 -0
  438. package/src/server/review.ts +161 -0
  439. package/src/server/selection.ts +23 -0
  440. package/src/server/source-overrides.ts +97 -0
  441. package/src/server/templates-cli.ts +51 -0
  442. package/src/server/templates.ts +186 -0
  443. package/src/server/text-layout.ts +41 -0
  444. package/src/server/text-source.ts +307 -0
  445. package/src/server/themes-cli.ts +59 -0
  446. package/src/server/themes.ts +215 -0
  447. package/src/server/ttf2eot.d.ts +3 -0
  448. package/src/server/worker.ts +166 -0
  449. package/src/server/workspace.ts +242 -0
  450. package/src/shared/anchors.ts +69 -0
  451. package/src/shared/assets.ts +154 -0
  452. package/src/shared/export.ts +34 -0
  453. package/src/shared/media.ts +33 -0
  454. package/src/shared/projects.ts +19 -0
  455. package/src/shared/selection.ts +94 -0
  456. package/src/shared/skill-index.ts +14 -0
  457. package/src/shared/starters.ts +19 -0
  458. package/src/shared/templates.ts +18 -0
  459. package/src/shared/themes.ts +24 -0
  460. package/src/shared/types.ts +39 -0
  461. package/src/template/index.ts +27 -0
  462. package/src/themes/index.ts +3 -0
  463. package/src/themes/neutral.ts +20 -0
  464. package/src/themes/types.ts +110 -0
  465. package/starter/assets/brand/wordmark.png +0 -0
  466. package/starter/assets/fonts/InterUI-LICENSE.txt +93 -0
  467. package/starter/assets/fonts/InterUI-Medium.ttf +0 -0
  468. package/starter/assets/fonts/InterUI-Regular.ttf +0 -0
  469. package/starter/assets/fonts/InterUI-source.json +19 -0
  470. package/starter/assets/fonts/OpenDocMono-Regular.ttf +0 -0
  471. package/starter/assets/fonts/OpenDocSans-Italic.ttf +0 -0
  472. package/starter/assets/fonts/OpenDocSans-Regular.ttf +0 -0
  473. package/starter/assets/fonts/OpenDocSans-Semibold.ttf +0 -0
  474. package/starter/assets/fonts/OpenDocSans-SemiboldItalic.ttf +0 -0
  475. package/starter/assets/fonts/OpenDocSerif-Italic.ttf +0 -0
  476. package/starter/assets/fonts/OpenDocSerif-Regular.ttf +0 -0
  477. package/starter/assets/fonts/OpenDocSerif-Semibold.ttf +0 -0
  478. package/starter/assets/fonts/OpenDocSerif-SemiboldItalic.ttf +0 -0
  479. package/starter/assets/fonts/SourceCode-LICENSE.md +93 -0
  480. package/starter/assets/fonts/SourceSans-LICENSE.md +93 -0
  481. package/starter/assets/fonts/SourceSerif-LICENSE.md +93 -0
  482. package/starter/assets/fonts/geist/OFL.txt +93 -0
  483. package/starter/assets/fonts/geist/asset.json +7 -0
  484. package/starter/assets/fonts/geist/files/1a9874b3be0fc168692a3d2327bccb4d28835653d3b91537a755296a467a83e3.ttf +0 -0
  485. package/starter/assets/fonts/geist/files/a8eefb873ba9c9020665f8a98302697ce1f3b79ab2deef6ee508c0ca6a82e876.ttf +0 -0
  486. package/starter/assets/fonts/geist/files/ccce59465ae5c61930ada5453834f60500fbd95084d85db63e0e65fad0125455.ttf +0 -0
  487. package/starter/assets/fonts/geist/files/f5e95110d70593672515080bee9148463ada0a7f77b89ed65a3d43cb2b0ff83a.pdf +0 -0
  488. package/starter/assets/fonts/geist/revisions/9a2bc12fb2f23cb27bc227087e63e1407bb804ee0586480bd6b7966ec69fb474.json +60 -0
  489. package/starter/assets/fonts/inter/OFL.txt +93 -0
  490. package/starter/assets/fonts/inter/asset.json +7 -0
  491. package/starter/assets/fonts/inter/files/1b08e7fc267a5c7e1d614100f604b83e7e8a0be241f0f288faa2b3ac93a683ba.ttf +0 -0
  492. package/starter/assets/fonts/inter/files/5b6f0c6f26e5c554a64cdcc3a9b5d802b7f9aec6206f1dbcfcdcad7b5860a2a9.ttf +0 -0
  493. package/starter/assets/fonts/inter/files/957db8560d510a198a7d0333fae7b6b444b00c20801581126273978d778eb3c3.pdf +0 -0
  494. package/starter/assets/fonts/inter/files/b37284b5701b6b168dfc770aa1a4ac492106422fd3ba76bc7641e37434e8019c.ttf +0 -0
  495. package/starter/assets/fonts/inter/files/c1811d32ac0f6eed1bbf57529f2ecdfc6c717d48a969dd864942436315a1b198.ttf +0 -0
  496. package/starter/assets/fonts/inter/files/e7a1aaf7eda9f2fad4131725fa556265ec75ca7b2d756260173a040363e8d4f7.ttf +0 -0
  497. package/starter/assets/fonts/inter/files/ef8f755d933b9310804cc9152f1f18cb2ac460d6b05054ec913d889c9f11f79e.ttf +0 -0
  498. package/starter/assets/fonts/inter/revisions/600391517c413963b71e278a57c26c40366c81fa3939a6b9755f446206766d12.json +99 -0
  499. package/starter/assets/fonts/inter/source.json +57 -0
  500. package/starter/assets/fonts/lato/OFL.txt +93 -0
  501. package/starter/assets/fonts/lato/asset.json +7 -0
  502. package/starter/assets/fonts/lato/files/4a6b566dbb28adb473a8789ce5169306f42f0c8a070ac92bae93636f36348b0d.pdf +0 -0
  503. package/starter/assets/fonts/lato/files/5adeb6b334d8fb99ef053bc052b952773d544315e0e1d668a12c0ce8bd51375c.ttf +0 -0
  504. package/starter/assets/fonts/lato/files/62c1b7f0d2e74b45960154c3520efc337b553db0961bfdc950d5618334596cc8.ttf +0 -0
  505. package/starter/assets/fonts/lato/files/71b8b7decbe75a881ed267be539d402bd1e9420b799658aada4e0d1bd5af803c.ttf +0 -0
  506. package/starter/assets/fonts/lato/files/8a0aace75d33794eece4b28187bfc1df0bbd2888b5d8a56e01788c8d65d16be1.ttf +0 -0
  507. package/starter/assets/fonts/lato/files/d636e4683231f931eda222d588e944d082bfd3bdba02f928bee461c0f185b251.ttf +0 -0
  508. package/starter/assets/fonts/lato/files/e399c44efe1387100531d26c7e4800c5d12251b890d6654a3098c7c679cb1786.ttf +0 -0
  509. package/starter/assets/fonts/lato/revisions/49ccb93400a9d466fab7d9843b1ecf8916ec6d47a475dd79a597a22eb39616bc.json +99 -0
  510. package/starter/assets/fonts/lato/source.json +57 -0
  511. package/starter/assets/fonts/merriweather/OFL.txt +93 -0
  512. package/starter/assets/fonts/merriweather/asset.json +7 -0
  513. package/starter/assets/fonts/merriweather/files/1c54f91b910454251c4c2b7bd4e472e1abf265fba7ca3c0ef2eee2f41324099e.ttf +0 -0
  514. package/starter/assets/fonts/merriweather/files/8bde8da2bb7f0265e27ba0481f70bb48d0f98a976c145f2f239c648ddd6532e0.pdf +0 -0
  515. package/starter/assets/fonts/merriweather/files/90b7db4460fcd1a5ca49575c2668a793f3cd6447664d312a068d690e1c01e6bc.ttf +0 -0
  516. package/starter/assets/fonts/merriweather/files/afff81272b7653417bb6f8bef57add055b1f9fda36f27eba5f32b40752bd08da.ttf +0 -0
  517. package/starter/assets/fonts/merriweather/files/e029d3b71e5bae3877c73f4f2b15af28db16593d49b0aed2a328d37ff7075846.ttf +0 -0
  518. package/starter/assets/fonts/merriweather/files/e9864a6790bf712a04e20f3662b206a1535186ed3e877fd859dd5fb9682335df.ttf +0 -0
  519. package/starter/assets/fonts/merriweather/files/fa71baebdd20a7d0de2e5e445a5922530fe9e1d740efbe791f113b682d3cb093.ttf +0 -0
  520. package/starter/assets/fonts/merriweather/revisions/1888e390b3e4f38a3d7cd2dc1bb805aeb6ce13f986a97656f0265fd436bc91d2.json +99 -0
  521. package/starter/assets/fonts/merriweather/source.json +57 -0
  522. package/starter/assets/fonts/open-sans/OFL.txt +92 -0
  523. package/starter/assets/fonts/open-sans/asset.json +7 -0
  524. package/starter/assets/fonts/open-sans/files/1bc0594a83762b2c25d38915a34464b7fec6088298ca22d151757bf98d6700ec.ttf +0 -0
  525. package/starter/assets/fonts/open-sans/files/47ed1cfaa7ffca04a04ab850b2938fd52c09d1b44cfa3e2980878e166b0cbd87.ttf +0 -0
  526. package/starter/assets/fonts/open-sans/files/574939af301f07df8e21cfff279465c5981dd9d9cf62086f7515897df951c6f5.pdf +0 -0
  527. package/starter/assets/fonts/open-sans/files/6d3884d0d57c1b67e9c50c54eca7b69c535c114e76bd7a9cfda0258588185553.ttf +0 -0
  528. package/starter/assets/fonts/open-sans/files/733eb93b167e6d45de09aa768f6c0355647c2c26f5416dbc7407a08ed41e81c6.ttf +0 -0
  529. package/starter/assets/fonts/open-sans/files/75367e6da7d914eaed87883ba51b2a2b5816b5cdbb39f96ec5c81a5b032bfd5a.ttf +0 -0
  530. package/starter/assets/fonts/open-sans/files/ff4fdc11204e0edd14e9a0bb6c374b847a9093b0ec2c16702e03afca79ac4ef7.ttf +0 -0
  531. package/starter/assets/fonts/open-sans/revisions/bbbe3a4915b9bccbc883c0decb4097511c43b6bd09ae22a1516aff128c219bc5.json +99 -0
  532. package/starter/assets/fonts/open-sans/source.json +57 -0
  533. package/starter/assets/fonts/roboto/OFL.txt +93 -0
  534. package/starter/assets/fonts/roboto/asset.json +7 -0
  535. package/starter/assets/fonts/roboto/files/22d45d989248a624252b8382067ac56550212fa675dcdbaf12f03d297dd87a58.pdf +0 -0
  536. package/starter/assets/fonts/roboto/files/35757eaa996b3359022f47f164a67ee9eac04971af24c5b8fbd4b89e844ff190.ttf +0 -0
  537. package/starter/assets/fonts/roboto/files/4d3035883c531846bd1ce2dc89f36d932e72dc114f56062c7e3a9cdd74f3d3ea.ttf +0 -0
  538. package/starter/assets/fonts/roboto/files/be7639306a4fc4a02ce2ae2ff59eb1335e4db4a7379dd0a384ed7cc053817789.ttf +0 -0
  539. package/starter/assets/fonts/roboto/files/d2920cbb1b60a3fd11fbf22049286e43a6baf522d37fdf1e7c89562319bcfea5.ttf +0 -0
  540. package/starter/assets/fonts/roboto/files/dece7c71bbe61710787f0839c722c65e87355dd2eb4a823e6b5488121ff81e4b.ttf +0 -0
  541. package/starter/assets/fonts/roboto/files/f478ba88b0292e685e487901dfbb1401457d32d6ebee4030cdfd5698235bffa8.ttf +0 -0
  542. package/starter/assets/fonts/roboto/revisions/bda5e2d84c17313373dd2dbf3e64fe0dd450c7e1b59e6929e69557e122fe976e.json +99 -0
  543. package/starter/assets/fonts/roboto/source.json +57 -0
  544. package/starter/assets/logos/opendoc/asset.json +6 -0
  545. package/starter/assets/logos/opendoc/files/831d5ccd9eb6709cc8439ea257c03d81452e81a28a3d1eedbd6a3b7daff687b6.png +0 -0
  546. package/starter/assets/logos/opendoc/revisions/834dde8926ddb81de687254195a168bb13bfb77803307f1257de1f2228be63b2.json +33 -0
  547. package/starter/assets/ui-fonts/geist/OFL.txt +93 -0
  548. package/starter/assets/ui-fonts/geist/geist-latin-ext-wght-italic.woff2 +0 -0
  549. package/starter/assets/ui-fonts/geist/geist-latin-ext-wght-normal.woff2 +0 -0
  550. package/starter/assets/ui-fonts/geist/geist-latin-wght-italic.woff2 +0 -0
  551. package/starter/assets/ui-fonts/geist/geist-latin-wght-normal.woff2 +0 -0
  552. package/starter/assets/ui-fonts/geist/source.json +26 -0
  553. package/starter/documents/welcome/assets.json +7 -0
  554. package/starter/documents/welcome/index.tsx +160 -0
  555. package/starter/documents/welcome/media/.gitkeep +0 -0
  556. package/starter/documents/welcome/media/paper-architecture/image.png +0 -0
  557. package/starter/documents/welcome/media/paper-architecture/meta.json +9 -0
  558. package/starter/documents/welcome/media/paper-architecture/prompt.txt +1 -0
  559. package/starter/documents/welcome/media/studio-rhythm/chart.svg +2343 -0
  560. package/starter/documents/welcome/media/studio-rhythm/data.json +234 -0
  561. package/starter/documents/welcome/media/studio-rhythm/generation.json +9 -0
  562. package/starter/documents/welcome/media/studio-rhythm/image.png +0 -0
  563. package/starter/documents/welcome/media/studio-rhythm/meta.json +11 -0
  564. package/starter/documents/welcome/media/studio-rhythm/recipe.py +79 -0
  565. package/starter/documents/welcome/theme.tsx +5 -0
  566. package/starter/documents/welcome-presentation/assets.json +7 -0
  567. package/starter/documents/welcome-presentation/index.tsx +166 -0
  568. package/starter/documents/welcome-presentation/media/.gitkeep +0 -0
  569. package/starter/documents/welcome-presentation/media/paper-architecture/image.png +0 -0
  570. package/starter/documents/welcome-presentation/media/paper-architecture/meta.json +9 -0
  571. package/starter/documents/welcome-presentation/media/paper-architecture/prompt.txt +1 -0
  572. package/starter/documents/welcome-presentation/media/studio-rhythm/chart.svg +1336 -0
  573. package/starter/documents/welcome-presentation/media/studio-rhythm/data.json +234 -0
  574. package/starter/documents/welcome-presentation/media/studio-rhythm/generation.json +9 -0
  575. package/starter/documents/welcome-presentation/media/studio-rhythm/image.png +0 -0
  576. package/starter/documents/welcome-presentation/media/studio-rhythm/meta.json +13 -0
  577. package/starter/documents/welcome-presentation/media/studio-rhythm/recipe.py +49 -0
  578. package/starter/documents/welcome-presentation/theme.tsx +5 -0
  579. package/starter/projects.json +17 -0
  580. package/starter/templates/AGENTS.md +9 -0
  581. package/starter/templates/_shared/BusinessLogo.tsx +14 -0
  582. package/starter/templates/_shared/Pricing.tsx +40 -0
  583. package/starter/templates/_shared/commerce.ts +93 -0
  584. package/starter/templates/brand-guidelines/AGENTS.md +32 -0
  585. package/starter/templates/brand-guidelines/index.tsx +62 -0
  586. package/starter/templates/brand-guidelines/preview.tsx +181 -0
  587. package/starter/templates/brand-guidelines/starter.tsx +179 -0
  588. package/starter/templates/brand-guidelines/template.json +15 -0
  589. package/starter/templates/business-proposal/AGENTS.md +13 -0
  590. package/starter/templates/business-proposal/README.md +36 -0
  591. package/starter/templates/business-proposal/data.json +37 -0
  592. package/starter/templates/business-proposal/examples/long.json +142 -0
  593. package/starter/templates/business-proposal/examples/sparse.json +17 -0
  594. package/starter/templates/business-proposal/examples/typical.json +37 -0
  595. package/starter/templates/business-proposal/index.tsx +59 -0
  596. package/starter/templates/business-proposal/preview.tsx +47 -0
  597. package/starter/templates/business-proposal/schema.ts +14 -0
  598. package/starter/templates/business-proposal/starter.tsx +18 -0
  599. package/starter/templates/business-proposal/template.json +11 -0
  600. package/starter/templates/company-profile/AGENTS.md +48 -0
  601. package/starter/templates/company-profile/index.tsx +69 -0
  602. package/starter/templates/company-profile/preview.tsx +185 -0
  603. package/starter/templates/company-profile/starter.tsx +186 -0
  604. package/starter/templates/company-profile/template.json +15 -0
  605. package/starter/templates/consulting-report/AGENTS.md +11 -0
  606. package/starter/templates/consulting-report/README.md +13 -0
  607. package/starter/templates/consulting-report/RESEARCH.md +10 -0
  608. package/starter/templates/consulting-report/index.tsx +44 -0
  609. package/starter/templates/consulting-report/preview.tsx +39 -0
  610. package/starter/templates/consulting-report/starter.tsx +15 -0
  611. package/starter/templates/consulting-report/template.json +11 -0
  612. package/starter/templates/editorial-essay/AGENTS.md +11 -0
  613. package/starter/templates/editorial-essay/README.md +11 -0
  614. package/starter/templates/editorial-essay/index.tsx +30 -0
  615. package/starter/templates/editorial-essay/preview.tsx +26 -0
  616. package/starter/templates/editorial-essay/starter.tsx +15 -0
  617. package/starter/templates/editorial-essay/template.json +11 -0
  618. package/starter/templates/executive-brief/AGENTS.md +9 -0
  619. package/starter/templates/executive-brief/README.md +11 -0
  620. package/starter/templates/executive-brief/index.tsx +33 -0
  621. package/starter/templates/executive-brief/preview.tsx +37 -0
  622. package/starter/templates/executive-brief/starter.tsx +11 -0
  623. package/starter/templates/executive-brief/template.json +11 -0
  624. package/starter/templates/image-story/AGENTS.md +37 -0
  625. package/starter/templates/image-story/index.tsx +106 -0
  626. package/starter/templates/image-story/preview.tsx +33 -0
  627. package/starter/templates/image-story/starter.tsx +24 -0
  628. package/starter/templates/image-story/template.json +13 -0
  629. package/starter/templates/invoice/AGENTS.md +13 -0
  630. package/starter/templates/invoice/README.md +40 -0
  631. package/starter/templates/invoice/data.json +61 -0
  632. package/starter/templates/invoice/examples/long.json +241 -0
  633. package/starter/templates/invoice/examples/sparse.json +33 -0
  634. package/starter/templates/invoice/examples/typical.json +61 -0
  635. package/starter/templates/invoice/index.tsx +57 -0
  636. package/starter/templates/invoice/preview.tsx +12 -0
  637. package/starter/templates/invoice/schema.ts +45 -0
  638. package/starter/templates/invoice/starter.tsx +12 -0
  639. package/starter/templates/invoice/template.json +11 -0
  640. package/starter/templates/literary-text/AGENTS.md +9 -0
  641. package/starter/templates/literary-text/README.md +11 -0
  642. package/starter/templates/literary-text/index.tsx +31 -0
  643. package/starter/templates/literary-text/preview.tsx +20 -0
  644. package/starter/templates/literary-text/starter.tsx +11 -0
  645. package/starter/templates/literary-text/template.json +11 -0
  646. package/starter/templates/magazine-feature/AGENTS.md +11 -0
  647. package/starter/templates/magazine-feature/README.md +13 -0
  648. package/starter/templates/magazine-feature/index.tsx +41 -0
  649. package/starter/templates/magazine-feature/preview.tsx +34 -0
  650. package/starter/templates/magazine-feature/starter.tsx +15 -0
  651. package/starter/templates/magazine-feature/template.json +11 -0
  652. package/starter/templates/monthly-report/AGENTS.md +11 -0
  653. package/starter/templates/monthly-report/README.md +24 -0
  654. package/starter/templates/monthly-report/data.json +131 -0
  655. package/starter/templates/monthly-report/examples/long.json +519 -0
  656. package/starter/templates/monthly-report/examples/sparse.json +20 -0
  657. package/starter/templates/monthly-report/examples/typical.json +37 -0
  658. package/starter/templates/monthly-report/index.tsx +92 -0
  659. package/starter/templates/monthly-report/preview.tsx +14 -0
  660. package/starter/templates/monthly-report/schema.ts +127 -0
  661. package/starter/templates/monthly-report/starter.tsx +13 -0
  662. package/starter/templates/monthly-report/template.json +11 -0
  663. package/starter/templates/pitch-deck/AGENTS.md +32 -0
  664. package/starter/templates/pitch-deck/index.tsx +46 -0
  665. package/starter/templates/pitch-deck/preview.tsx +142 -0
  666. package/starter/templates/pitch-deck/starter.tsx +140 -0
  667. package/starter/templates/pitch-deck/template.json +15 -0
  668. package/starter/templates/proposal-deck/AGENTS.md +25 -0
  669. package/starter/templates/proposal-deck/index.tsx +52 -0
  670. package/starter/templates/proposal-deck/preview.tsx +172 -0
  671. package/starter/templates/proposal-deck/starter.tsx +168 -0
  672. package/starter/templates/proposal-deck/template.json +7 -0
  673. package/starter/templates/quotation/AGENTS.md +13 -0
  674. package/starter/templates/quotation/README.md +42 -0
  675. package/starter/templates/quotation/data.json +64 -0
  676. package/starter/templates/quotation/examples/long.json +272 -0
  677. package/starter/templates/quotation/examples/sparse.json +31 -0
  678. package/starter/templates/quotation/examples/typical.json +64 -0
  679. package/starter/templates/quotation/index.tsx +51 -0
  680. package/starter/templates/quotation/preview.tsx +12 -0
  681. package/starter/templates/quotation/schema.ts +27 -0
  682. package/starter/templates/quotation/starter.tsx +12 -0
  683. package/starter/templates/quotation/template.json +11 -0
  684. package/starter/templates/scientific-paper/AGENTS.md +11 -0
  685. package/starter/templates/scientific-paper/README.md +13 -0
  686. package/starter/templates/scientific-paper/index.tsx +47 -0
  687. package/starter/templates/scientific-paper/preview.tsx +43 -0
  688. package/starter/templates/scientific-paper/starter.tsx +15 -0
  689. package/starter/templates/scientific-paper/template.json +11 -0
  690. package/starter/themes/Specimen.tsx +54 -0
  691. package/starter/themes/civic-spectrum/components.tsx +92 -0
  692. package/starter/themes/civic-spectrum/design.md +70 -0
  693. package/starter/themes/civic-spectrum/index.ts +57 -0
  694. package/starter/themes/civic-spectrum/preview.tsx +66 -0
  695. package/starter/themes/field-manual/components.tsx +106 -0
  696. package/starter/themes/field-manual/design.md +72 -0
  697. package/starter/themes/field-manual/index.ts +57 -0
  698. package/starter/themes/field-manual/preview.tsx +82 -0
  699. package/starter/themes/index.ts +3 -0
  700. package/starter/themes/mckinsey-consulting/components.tsx +69 -0
  701. package/starter/themes/mckinsey-consulting/design.md +68 -0
  702. package/starter/themes/mckinsey-consulting/index.ts +60 -0
  703. package/starter/themes/mckinsey-consulting/preview.tsx +53 -0
  704. package/starter/themes/neutral/design.md +35 -0
  705. package/starter/themes/neutral/index.ts +21 -0
  706. package/starter/themes/neutral/preview.tsx +4 -0
  707. package/starter/themes/opendoc-neutral/components.tsx +77 -0
  708. package/starter/themes/opendoc-neutral/design.md +70 -0
  709. package/starter/themes/opendoc-neutral/index.ts +54 -0
  710. package/starter/themes/opendoc-neutral/preview.tsx +43 -0
  711. package/starter/themes/types.ts +3 -0
  712. package/tsconfig.workspace.json +24 -0
  713. package/vendor/formepdf/LICENSE +21 -0
  714. package/vendor/formepdf/README.md +97 -0
  715. package/vendor/formepdf/font-subset.patch +228 -0
  716. package/vendor/formepdf/text-writer.patch +507 -0
@@ -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).
package/docs/MEDIA.md ADDED
@@ -0,0 +1,112 @@
1
+ # Document media
2
+
3
+ Each document owns its prepared media. OpenDoc embeds and previews those visuals; the project and coding agent manage original reference material. There is no source library or required source-folder layout. Reusable logos and fonts belong in the shared **Logos** and **Fonts** tabs of **Media & Assets**; see [Assets](ASSETS.md). Do not copy those families into each document's media folder.
4
+
5
+ Run commands from the workspace root. The paths below refer to that workspace, not the installed package containing this guide.
6
+
7
+ ```text
8
+ documents/cooling-curves/
9
+ index.tsx
10
+ media/
11
+ cooling-curves/
12
+ meta.json title, description, file and relationships
13
+ image.png the embedding image
14
+ data.json rows prepared for this chart
15
+ recipe.py optional reproducible preparation
16
+ generation.json recorded image and input hashes
17
+ temperature-drop/
18
+ ... another view of the same source
19
+ ```
20
+
21
+ Original datasets, supplied PDFs, previous drafts, and reference documents stay wherever the surrounding project manages them. Do not copy or move originals just to satisfy OpenDoc. Several documents may use the same original. Prepared selections, calculations, chart specifications, and editable diagram files belong beside the image that uses them. The coding agent interprets the originals, prepares visuals, and checks evidence and attribution.
22
+
23
+ ## Describe a visual
24
+
25
+ Every `media/<id>/meta.json` requires `title`, `description`, `file`, and `kind`. IDs use lowercase words separated by single hyphens. `kind` is `photo`, `illustration`, `chart`, `diagram`, or `image`.
26
+
27
+ ```json
28
+ {
29
+ "title": "Temperature over time",
30
+ "description": "Two illustrative cooling curves from one synthetic dataset.",
31
+ "file": "image.png",
32
+ "kind": "chart",
33
+ "alt": "Cup A falls from 80 to 53 degrees Celsius; Cup B falls to 62.",
34
+ "sources": ["Project teaching dataset; synthetic, not measured"],
35
+ "data": "data.json",
36
+ "recipe": "recipe.py",
37
+ "attribution": "Synthetic teaching example; no experiment was conducted."
38
+ }
39
+ ```
40
+
41
+ `alt`, `sources`, `data`, `recipe`, and `attribution` are optional. `sources` contains descriptive provenance notes or locations for the author: OpenDoc displays the text but never resolves, downloads, hashes, or requires those files. Existing source-path notes remain valid. `file`, `data`, and `recipe` identify owned files relative to the media item; parent traversal, hidden paths, and symlinks are rejected for these files. Unknown fields are rejected. Titles are limited to 200 characters; descriptions and each source note to 4,000.
42
+
43
+ PNG and JPEG are the supported media embedding formats, up to 50 MB and 100 megapixels. Preserve an SVG or other editable original alongside a PNG export; arbitrary SVG text rendering is not reliable in the current PDF engine. Shared logos have their own SVG/PNG import path with automatic PNG preparation; use [Assets](ASSETS.md) for those. Use an image large enough for its printed size—about 300 pixels per inch for charts—and inspect labels at actual reading size. Keep important chart values in a selectable table as well: raster chart labels are image pixels in the PDF.
44
+
45
+ ## Add, generate, and review
46
+
47
+ Use the existing image tool or a suitable chart/diagram tool to produce the visual. The media contract does not choose a generator, run recipes automatically, or install their dependencies. Choose tools already available for the task. Keep any recipe reproducible and resolve its files from its own location. Sample documents are not a required dependency.
48
+
49
+ ```sh
50
+ npx opendoc media import my-report overview --file /path/to/image.png --title "Overview" --description "The main stages." --kind diagram
51
+ ```
52
+
53
+ Media imports copy an image and refuse to overwrite an existing media folder. Media is added by the agent from chat attachments, generated visuals, or downloaded images. The app browses these document-owned folders and edits their details; it has no media upload form. An ordinary photograph can consist of only an image and metadata. For generated work, add the prepared data and recipe before recording it. Add provenance notes when useful. Editing a title, description, or other metadata in the app never records a generated visual as reviewed.
54
+
55
+ After generating, review the actual image for values, labels, scales, units, and provenance. Then record the reviewed inputs:
56
+
57
+ ```sh
58
+ npx opendoc media record my-report overview
59
+ npx opendoc media check my-report overview
60
+ ```
61
+
62
+ `record` snapshots file hashes; it does not generate or validate a chart. Never use it just to silence a stale warning. Changing prepared data, a recipe, or a recorded image marks the item as needing regeneration. Regenerate and review the affected images, then record their new versions. Original-source changes are the author’s responsibility; OpenDoc does not infer whether they require a new chart or a revised argument. Images with inputs but no generation record also require review and recording.
63
+
64
+ ## Place it in the PDF
65
+
66
+ ```tsx
67
+ <Figure id="overview-figure" caption="The main stages." sourceNote="Based on the supplied reference.">
68
+ <Media item="overview" width={460} />
69
+ </Figure>
70
+ ```
71
+
72
+ Import `Media` from `opendoc` with the other document primitives. Width is a positive value in PDF points. An optional positive `height` sets a maximum bound; the image keeps its aspect ratio. Alternative text defaults to metadata, or can be supplied as `alt`. Preserve the enclosing Figure ID when replacing an image so feedback stays attached.
73
+
74
+ The document cannot export a stale or unrecorded derived image. Its previous successful preview remains visible, with the current error. After recording, export and review the actual PDF, including caption placement and adjacent page breaks. Raw `Image` and vector `Svg` primitives remain available, but only managed media items appear in the Media browser and receive these provenance checks. For pictures inside SVG layouts, use the frame support below.
75
+
76
+ ## Image frames and full-page artwork
77
+
78
+ Use `Media` when an image should keep its natural proportions inside a maximum bound. Use `MediaFrame` when the layout needs an **exact rectangle**. It supports `cover` (default: proportional crop) or `contain` (whole image, transparent unused space), normalized `position` (`0` left/top, `0.5` center, `1` right/bottom), and an optional `radius` in PDF points. Width and height are required. Dimensions in `style` do not override them.
79
+
80
+ ```tsx
81
+ import { Block, Figure, MediaFrame, Page, Heading, Paragraph } from 'opendoc';
82
+
83
+ <Figure id="opening-scene" caption="A supplied photograph of the site.">
84
+ <MediaFrame item="site" width={490} height={240}
85
+ fit="cover" position={{x:0.65,y:0.5}} />
86
+ </Figure>
87
+
88
+ // A circular crop. Use containment for diagrams and images whose labels must stay visible.
89
+ <Block id="portrait"><MediaFrame item="portrait" width={160} height={160} radius={80}/></Block>
90
+
91
+ // Artwork reaches the page edges; the margin only reserves room for the native text.
92
+ <Page size="A4" margin={48} backgroundMedia="cover-art" backgroundSize="cover">
93
+ <Heading id="cover-title" level={1} style={{color:'#ffffff',fontSize:54}}>A short title</Heading>
94
+ <Paragraph id="cover-subtitle" style={{color:'#ffffff'}}>Choose quiet image space for the words.</Paragraph>
95
+ </Page>
96
+ ```
97
+
98
+ Frames and `backgroundMedia` use the same document-owned media IDs, freshness checks, and usage records as `Media`. Frames inherit their enclosing `Block` or `Figure` for feedback; a page background records page-level usage without a block selection. Missing named images fail rendering. You cannot combine `backgroundMedia` and `backgroundImage` on one page. For an unmanaged local PNG/JPEG, `backgroundImage="./image.png"` resolves relative to the authored document; it does not add managed provenance. Managed backgrounds default to centered `cover`; `backgroundSize="contain"` preserves the whole picture, and `backgroundPosition` accepts `center` or a corner such as `top-left`. OpenDoc prepares these proportional local-image backgrounds before sending them to the native page layer, which otherwise stretches images. Explicit `fill` retains stretching; remote URLs retain the native renderer's behavior.
99
+
100
+ The installed renderer prepares cropped/rounded frames as bounded PNGs, leaving the originals intact and surrounding text selectable. It uses up to 216 dpi with a 4096-pixel edge limit; this does not add detail to a low-resolution source. You do not need to read files, encode base64, import a native addon, or clip an oversized `Image` yourself. Native SVG `<image>` content can disappear without an export error, so use `MediaFrame` for image composition instead. Do not rasterize an entire text page to work around image placement.
101
+
102
+ For starting compositions, read workspace-root `templates/image-story/AGENTS.md` and view its real PDF in **Templates**. It demonstrates full bleed, vertical/horizontal halves, panoramas with insets, diptychs, collage, and floating text panels. You can use the primitives without using that template. Generate or choose images for their intended aspect ratio and quiet text areas; never crop away a face, important object, label, or evidence merely to match a frame. Always inspect the rendered PDF for image visibility, crop, contrast, caption placement, and text extraction. A successful export is not a visual review.
103
+
104
+ ## Browse and continue with Codex
105
+
106
+ The **Media** tab in **Media & Assets** lists visuals across documents, searchable by title, description, kind, and document. Existing Media links keep working. Byte-identical images share one browser card; ownership, metadata, and source relationships stay separate. A filename match alone never merges images. The detail view shows their document, current PDF usage, prepared files, and optional source notes.
107
+
108
+ File downloads are limited to document-owned media files. Original references are shown only as source notes. Selecting a media item updates `.opendoc/current.json` with its folder, metadata, and input status so Codex can work on the right item. Selection remains observed context, never an instruction to change the document. Metadata is editable in the app or through ordinary local files and the coding agent; prepared data, recipes, and regeneration remain agent work.
109
+
110
+ ## Existing projects
111
+
112
+ Existing original files and media folders remain in place. Older generation records may contain original-source hashes; those remain historical information and no longer participate in media checks. Current checks cover only the image and its own prepared data and recipe. Normal document imports still participate in dependency tracking and rerendering. Citations, references, and source notes in PDFs continue to work independently of file organization.
@@ -0,0 +1,55 @@
1
+ # Projects
2
+
3
+ A workspace contains projects, and every newly created document must have a project. A new workspace starts with **Getting started** and the **Welcome to OpenDoc** document and welcome presentation. Paths in this guide refer to the workspace root; the installed guide itself lives in `node_modules/opendoc/docs`.
4
+
5
+ ## In the app
6
+
7
+ Use the **+ beside Projects in the sidebar** to create a project. A name is required; a default theme is optional. Choose a project in the sidebar to create and find its documents. **Documents** shows all documents across the workspace, with project links beneath their previews. There is no separate projects overview page. On narrow screens, **Open sidebar** reveals the full project list and creation button. **Project settings** changes its name or default theme. **Move to project** changes an existing document’s membership. A project can be deleted only when it has no documents.
8
+
9
+ **Create document** and **Create presentation** provide agent prompts carrying the current project, without a title, purpose, or theme form. **Use this template** and theme-based creation carry the selected layout or theme in the prompt. The agent follows [opendoc-create](../.agents/skills/opendoc-create/SKILL.md), resolves any missing project from the brief or current context, and asks when a meaningful design preference is unclear. Naming the skill is optional. Creation requires project membership; the CLI uses an explicit theme override, then the project default, then Neutral. Those fallbacks apply after the agent resolves the user's direction. Explicitly requested starter examples retain their own fallback themes. Changing a project default applies to future work. Moving a document or presentation keeps its existing theme.
10
+
11
+ Switch between **Gallery** and **List** beside the document count in Documents or any project. List shows a compact first-page PDF thumbnail, name, document details, and a project link in Documents. The browser remembers one shared view preference. Switching views preserves the current search.
12
+
13
+ The **…** menu on every card or list row offers **Rename**, **Duplicate**, **Move to project…**, and **Delete**. These actions also appear in the reader’s **Document options** menu. Rename changes the library name; the PDF title stays authored in source. Duplicate copies saved source, local media, and feedback into the same project, rebinding supplied template instance IDs and local data paths. It does not include unsaved browser drafts. Delete asks for confirmation and shows an **Undo** notification. Its saved folder and receipt remain recoverable in `.opendoc/trash/<restore-id>/`; existing PDF exports remain in `output/`. Restore refuses to overwrite a reused ID and requires the original project to exist.
14
+
15
+ Opening a document hides the workspace sidebar and gives the reader the full window. The header’s back arrow returns to the project, Documents, or other workspace view you opened from and restores navigation. A directly opened document returns to its project, or Documents if it has no project. The same pattern applies on mobile.
16
+
17
+ If files from an older workspace have no assignment, **Documents** keeps them accessible and offers **Choose a project** beneath each unassigned document. OpenDoc does not invent a replacement project or silently discard these files.
18
+
19
+ ## Local files
20
+
21
+ `projects.json` owns project names, optional default themes, document assignments, and optional library names:
22
+
23
+ ```json
24
+ {
25
+ "version": 1,
26
+ "projects": [
27
+ { "id": "getting-started", "name": "Getting started", "defaultTheme": "neutral" }
28
+ ],
29
+ "assignments": { "welcome": "getting-started" },
30
+ "names": { "welcome": "Workspace guide" }
31
+ }
32
+ ```
33
+
34
+ Documents remain at `documents/<id>/index.tsx`. Grouping is separate from physical folders. Renaming projects or documents and moving documents do not move files or rewrite imports, media, comments, or PDF contents. Document IDs are unique across the workspace. Templates and themes remain shared resources.
35
+
36
+ The creation service records membership before exposing a new document entry. Browser and command-line changes serialize through a local lock and atomically replace the manifest. Invalid registries are reported without being overwritten. If a process terminates while holding the project lock, the next operation recovers it only after confirming the owner is no longer running. An active or unrecognized lock remains protected; retry after the other operation finishes rather than deleting its lock blindly.
37
+
38
+ The optional `names` map is keyed by stable document ID. Without an override, the app uses the PDF metadata title. The generated `.opendoc/current.json` distinguishes the library `name` from the authored `title` and includes the active project and its default theme alongside the document or selection. Do not edit this generated context by hand.
39
+
40
+ ## Commands
41
+
42
+ Run from the workspace root, or add `--workspace <path>`. Use `npx opendoc --help` for the command list and `--json` for machine-readable output.
43
+
44
+ ```sh
45
+ npx opendoc projects list
46
+ npx opendoc projects create client-work --name "Client work" --theme neutral
47
+ npx opendoc projects update client-work --name "Client publications" --theme civic-spectrum
48
+ npx opendoc projects update client-work --theme none
49
+ npx opendoc create proposal --project client-work --title "A proposal"
50
+ npx opendoc create brief --project client-work --title "A technical brief" --theme field-manual
51
+ npx opendoc projects assign proposal client-work
52
+ npx opendoc projects delete empty-project
53
+ ```
54
+
55
+ A missing or unknown project prevents creation before any document folder is written. Use the normal creation command for bespoke documents too, then replace its editable source. If importing existing document folders, assign each one using the project command. Preserve unrelated assignments and stable document IDs.
package/docs/PROSE.md ADDED
@@ -0,0 +1,15 @@
1
+ # Continuous prose
2
+
3
+ `Prose` is an optional OpenDoc region for continuous reading text. The Editorial essay template uses it for its body. Existing documents retain their paragraph behavior unless they explicitly use this region.
4
+
5
+ It leaves the first paragraph flush left and indents subsequent paragraphs by 1½ em. Paragraph gaps default to zero; set `paragraphGap` to a non-negative number of points for extra spacing. Editorial essay uses `<Prose paragraphGap={6}>`. Headings, section starts, figures, tables, callouts, lists, and explicit breaks restart the reading sequence. Section lead paragraphs stay flush; their following paragraphs indent. Captions, tables, and reference entries do not receive body formatting. Pure author components and fragments expand before formatting, so their paragraph IDs and source locations remain available for comments.
6
+
7
+ ## Forme compatibility
8
+
9
+ Forme 0.20.1 has no native first-line-indent style. OpenDoc uses an isolated inline U+2003 em-space run, sized to the requested indent. Its measured advance is fixed; an ordinary leading whitespace string is stretchable glue in this engine and does not reliably preserve its width. This is a compatibility shim, not a native Forme feature. No word joiner, tabs, manual line splitting, dependency patch, or full-paragraph padding is involved.
10
+
11
+ The body uses greedy line breaking by default to keep measured text within the column in this renderer. An explicit paragraph `lineBreaking` choice takes precedence. The spacer appears only at the paragraph's beginning; Forme handles all subsequent lines and page fragments. It leaves the body line height unchanged. Searchable and copied text retain the authored words; layout-oriented extraction may include normal indentation spaces.
12
+
13
+ This helper deliberately supports one measured 1½-em indent. Do not generalize it to arbitrary spacing without new PDF coordinate checks: Forme can merge a spacer run that has the same font size as the body and treat it as stretchable whitespace. Do not nest `Prose` regions; sibling regions start separate paragraph sequences. Keep regions within a single document's body. Use a separate region or a structural break to begin a new passage, not blank paragraphs.
14
+
15
+ Regression checks read actual PDF coordinates with the bundled Sans and Serif fonts, check continuation lines across pages, verify heading/figure/section resets, and preserve mixed inline formatting, citations, source locations, and existing non-Prose paragraphs. Recheck the spacer advance and extraction before using a new font or upgrading Forme. Replace this shim with native first-line indentation when the engine supports it and those checks pass.
@@ -0,0 +1,59 @@
1
+ # Selection and quick corrections
2
+
3
+ OpenDoc uses stable component selection for text editing and feedback. A fixed-width bottom bar offers Edit and Comment for the selection; both use the same panel above it. Saved comments have their own bottom-right dock. Hover outlines identify components before clicking. Text selection and copying stay inside the editor; the PDF itself supports component selection, links, navigation, and reading.
4
+
5
+ ## Correcting text
6
+
7
+ Click a component to select it without opening a panel. Choose the Edit icon to edit its full text value, or the Comment icon to write feedback. The bar keeps the same dimensions when either panel opens or closes. Valid changes enter a browser draft and update a separately rendered PDF preview. Moving to another component, clicking outside, **Done**, Cmd/Ctrl+Enter, and Escape keep those changes without writing source. A change that crosses source values or generated content must be corrected or reset before leaving the editor. Formatting and structural changes remain agent work.
8
+
9
+ The floating bar keeps the pending count, Undo, Redo, Discard, and Save all together. Consecutive typing in one source value coalesces into history steps; native textarea undo remains available, while Cmd/Ctrl+Z and Shift+Cmd/Ctrl+Z operate on draft history outside text fields. Save all or Cmd/Ctrl+S validates the combined candidate and writes the group. Save errors retain the draft. A successful source save then updates the canonical PDF; only a ready result displays the saved confirmation. Export stays paused while text changes remain unsaved.
10
+
11
+ Drafts and their bounded history survive document navigation and reloads in the same browser tab. If source changes elsewhere, Refresh draft carries forward only edits whose original values and identities still match. Conflicts keep the draft for review. Storage failures retain the in-memory draft and warn before a reload can lose it. The latest saved group has one guarded, server-session-local Undo; later source changes invalidate it instead of overwriting newer work.
12
+
13
+ Open editors remember the source version they came from. Untouched text follows source updates; modified text from an older or unknown version stays available for review without silently becoming a new draft change.
14
+
15
+ A correction replaces text within one proven writable source value and preserves surrounding structure and formatting. Shared local constants update every occurrence, and the draft count counts that shared value once. Mixed formatting stays intact: individual changes must stay inside one existing source value. Imported, computed, and unsupported expressions are available for feedback rather than guessed from their displayed wording.
16
+
17
+ The renderer issues writable targets. Requests do not choose arbitrary files or source spans. The server checks the baseline document revision, PDF hash, source digests, and source ownership; validates all candidate files; and renders a real draft PDF through isolated source overrides. Previewing never changes document source or canonical artifacts. Save stages the validated replacements and uses guarded rollback on a write failure, preserving intervening external changes. These safeguards do not imply a filesystem-wide atomic rename across independent files.
18
+
19
+ ## Binding reusable content
20
+
21
+ Native OpenDoc blocks provide content slots. Shared components can declare a caller-owned prop with the transparent `TextSlot` helper:
22
+
23
+ ```tsx
24
+ import { Paragraph, TextSlot } from 'opendoc';
25
+
26
+ export function Byline({ author }: { author: string }) {
27
+ return <Paragraph id="byline">
28
+ <TextSlot slot="author" from="author">{author}</TextSlot>
29
+ </Paragraph>;
30
+ }
31
+ ```
32
+
33
+ For a validated data template, bind a string in the instance's `provenance.dataFile`:
34
+
35
+ ```tsx
36
+ <TextSlot slot="client-name" field={['client', 'name']}>
37
+ {data.client.name}
38
+ </TextSlot>
39
+
40
+ {data.terms.map(term => <Paragraph id={`term-${term.id}`} key={term.id}>
41
+ <TextSlot slot="text" field={['terms', { id: term.id }, 'text']}>
42
+ {term.text}
43
+ </TextSlot>
44
+ </Paragraph>)}
45
+ ```
46
+
47
+ Slots and record IDs must remain stable through edits and reordering. TextSlot adds no PDF node, style, or text. Bind the original string, not a formatted or computed representation. Data corrections run the existing template parser before saving; import `bindTemplate` from `opendoc/template` for template instances, or `validateTemplateInput` from the same module to wrap an existing parser for optional data components.
48
+
49
+ DataTable accepts transparent TextSlot content within cells. Supply `rowIds` for stable row identities when data can reorder. Cell values without a proven binding remain readable and commentable. Never bind a calculated total to an unrelated raw field merely to enable editing.
50
+
51
+ ## Comments and agent context
52
+
53
+ Select any component and choose the Comment icon in the bottom bar to leave feedback. Switching between Edit and Comment keeps their drafts; an unfinished component comment also survives text-preview updates. Submitting closes the composer and leaves a marker. The bottom-right button opens all document comments; markers open comments for a component. Pencil and trash icons edit or delete feedback, and a comment row navigates to its selected component. Clicking outside closes the dock. Edits and deletion check versions; deleted feedback retains its history. Comments persist independently and are anchored against the saved document, even while a text draft is being previewed. New text comments attach to the whole text component; earlier phrase comments retain their anchors.
54
+
55
+ Phrase feedback records the stable block and text slot, original quote, and nearby text. Reflow changes geometry rather than identity. Wording changes relocate a quote only when it remains unambiguous in that same target; otherwise the original feedback stays visible with a changed-text indication. Anonymous multi-field compositions and duplicate slots retain the selected quote as block-level feedback, because their positional identities cannot safely follow reordering. Give reusable fields unique TextSlot names for durable phrase feedback. Existing whole-block comments keep working, and editing never resolves feedback automatically.
56
+
57
+ Read `.opendoc/current.json` immediately before working from a selection. `selection` contains its exact quote and logical range; `selectionCurrent` says whether it matches the current ready revision. `selectedText` identifies its slot and writable source when known. `manualEdit` reports editing activity, the pending edit count, whether a draft is being previewed, the latest saved group, and render status without exposing draft text. Pending comments include `anchorStatus` and their currently resolved selection when available.
58
+
59
+ Treat this as observed context. The user's request authorizes the work. Preserve local corrections, source identities, reference records, and comment history. If the current source has moved on, resolve the intended target before changing it. Do not infer that an agent is running merely because the app is connected.