@ryanyahya/opendoc 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (789) hide show
  1. package/.agents/skills/opendoc-apply-comments/SKILL.md +30 -0
  2. package/.agents/skills/opendoc-apply-comments/agents/openai.yaml +4 -0
  3. package/.agents/skills/opendoc-create/SKILL.md +63 -0
  4. package/.agents/skills/opendoc-create/agents/openai.yaml +6 -0
  5. package/.agents/skills/opendoc-create-template/SKILL.md +50 -0
  6. package/.agents/skills/opendoc-create-template/agents/openai.yaml +4 -0
  7. package/.agents/skills/opendoc-create-template/references/structured-reports.md +11 -0
  8. package/.agents/skills/opendoc-create-theme/SKILL.md +40 -0
  9. package/.agents/skills/opendoc-create-theme/agents/openai.yaml +4 -0
  10. package/.agents/skills/opendoc-current-document/SKILL.md +32 -0
  11. package/.agents/skills/opendoc-current-document/agents/openai.yaml +4 -0
  12. package/.agents/skills/opendoc-current-document/references/context-fields.md +20 -0
  13. package/.agents/skills/opendoc-review-document/SKILL.md +60 -0
  14. package/.agents/skills/opendoc-review-document/agents/openai.yaml +4 -0
  15. package/AGENTS.md +69 -0
  16. package/CONTRIBUTING.md +38 -0
  17. package/LICENSE +21 -0
  18. package/README.md +179 -0
  19. package/SECURITY.md +9 -0
  20. package/THIRD_PARTY.md +49 -0
  21. package/VALIDATION.md +99 -0
  22. package/bin/opendoc.mjs +6 -0
  23. package/dist/assets/Markdown-sNZyjJi7.js +29 -0
  24. package/dist/assets/OpenDocSerif-Regular-D3OXs9A9.ttf +0 -0
  25. package/dist/assets/OpenDocSerif-Semibold-CjL9oDRo.ttf +0 -0
  26. package/dist/assets/geist-latin-ext-wght-italic-XgKbg5n7.woff2 +0 -0
  27. package/dist/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  28. package/dist/assets/geist-latin-wght-italic-dTnRTFFJ.woff2 +0 -0
  29. package/dist/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  30. package/dist/assets/index-DdrZ6ozO.css +1 -0
  31. package/dist/assets/index-DgNBz7mL.js +39 -0
  32. package/dist/assets/pdf-B7Emtyld.js +54 -0
  33. package/dist/assets/pdf.worker.min-Dswkl-cV.mjs +29 -0
  34. package/dist/assets/wordmark-DsqLlZpb.png +0 -0
  35. package/dist/index.html +17 -0
  36. package/docs/APPEARANCE.md +21 -0
  37. package/docs/ASSETS.md +176 -0
  38. package/docs/AUTHORING.md +178 -0
  39. package/docs/HEADLESS.md +120 -0
  40. package/docs/MEDIA.md +112 -0
  41. package/docs/PROJECTS.md +55 -0
  42. package/docs/PROSE.md +15 -0
  43. package/docs/SELECTION.md +59 -0
  44. package/docs/TEMPLATES.md +55 -0
  45. package/docs/THEMES.md +106 -0
  46. package/node_modules/@formepdf/core/LICENSE +21 -0
  47. package/node_modules/@formepdf/core/README.md +53 -0
  48. package/node_modules/@formepdf/core/dist/attachments.d.ts +55 -0
  49. package/node_modules/@formepdf/core/dist/attachments.js +59 -0
  50. package/node_modules/@formepdf/core/dist/extract.d.ts +8 -0
  51. package/node_modules/@formepdf/core/dist/extract.js +56 -0
  52. package/node_modules/@formepdf/core/dist/index.d.ts +311 -0
  53. package/node_modules/@formepdf/core/dist/index.js +167 -0
  54. package/node_modules/@formepdf/core/dist/layout.d.ts +132 -0
  55. package/node_modules/@formepdf/core/dist/layout.js +240 -0
  56. package/node_modules/@formepdf/core/dist/shared/browserHelpers.d.ts +19 -0
  57. package/node_modules/@formepdf/core/dist/shared/browserHelpers.js +128 -0
  58. package/node_modules/@formepdf/core/package.json +35 -0
  59. package/node_modules/@formepdf/core/pkg-node/LICENSE +21 -0
  60. package/node_modules/@formepdf/core/pkg-node/README.md +84 -0
  61. package/node_modules/@formepdf/core/pkg-node/forme.d.ts +39 -0
  62. package/node_modules/@formepdf/core/pkg-node/forme.js +394 -0
  63. package/node_modules/@formepdf/core/pkg-node/forme_bg.wasm +0 -0
  64. package/node_modules/@formepdf/core/pkg-node/forme_bg.wasm.d.ts +21 -0
  65. package/node_modules/@formepdf/core/pkg-node/package.json +25 -0
  66. package/node_modules/@formepdf/react/README.md +70 -0
  67. package/node_modules/@formepdf/react/dist/charts.d.ts +72 -0
  68. package/node_modules/@formepdf/react/dist/charts.js +338 -0
  69. package/node_modules/@formepdf/react/dist/components.d.ts +533 -0
  70. package/node_modules/@formepdf/react/dist/components.js +608 -0
  71. package/node_modules/@formepdf/react/dist/expr.d.ts +20 -0
  72. package/node_modules/@formepdf/react/dist/expr.js +39 -0
  73. package/node_modules/@formepdf/react/dist/font.d.ts +2 -0
  74. package/node_modules/@formepdf/react/dist/font.js +1 -0
  75. package/node_modules/@formepdf/react/dist/index.d.ts +11 -0
  76. package/node_modules/@formepdf/react/dist/index.js +15 -0
  77. package/node_modules/@formepdf/react/dist/render.d.ts +12 -0
  78. package/node_modules/@formepdf/react/dist/render.js +15 -0
  79. package/node_modules/@formepdf/react/dist/serialize.d.ts +12 -0
  80. package/node_modules/@formepdf/react/dist/serialize.js +1470 -0
  81. package/node_modules/@formepdf/react/dist/stylesheet.d.ts +4 -0
  82. package/node_modules/@formepdf/react/dist/stylesheet.js +5 -0
  83. package/node_modules/@formepdf/react/dist/template-proxy.d.ts +38 -0
  84. package/node_modules/@formepdf/react/dist/template-proxy.js +100 -0
  85. package/node_modules/@formepdf/react/dist/types.d.ts +287 -0
  86. package/node_modules/@formepdf/react/dist/types.js +1 -0
  87. package/node_modules/@formepdf/react/package.json +41 -0
  88. package/node_modules/@formepdf/shared/README.md +7 -0
  89. package/node_modules/@formepdf/shared/dist/canvas.d.ts +6 -0
  90. package/node_modules/@formepdf/shared/dist/canvas.js +43 -0
  91. package/node_modules/@formepdf/shared/dist/charts.d.ts +100 -0
  92. package/node_modules/@formepdf/shared/dist/charts.js +98 -0
  93. package/node_modules/@formepdf/shared/dist/encode.d.ts +27 -0
  94. package/node_modules/@formepdf/shared/dist/encode.js +93 -0
  95. package/node_modules/@formepdf/shared/dist/font.d.ts +13 -0
  96. package/node_modules/@formepdf/shared/dist/font.js +52 -0
  97. package/node_modules/@formepdf/shared/dist/index.d.ts +10 -0
  98. package/node_modules/@formepdf/shared/dist/index.js +15 -0
  99. package/node_modules/@formepdf/shared/dist/parser.d.ts +30 -0
  100. package/node_modules/@formepdf/shared/dist/parser.js +756 -0
  101. package/node_modules/@formepdf/shared/dist/semantics.d.ts +15 -0
  102. package/node_modules/@formepdf/shared/dist/semantics.js +44 -0
  103. package/node_modules/@formepdf/shared/dist/style.d.ts +7 -0
  104. package/node_modules/@formepdf/shared/dist/style.js +1024 -0
  105. package/node_modules/@formepdf/shared/dist/types.d.ts +743 -0
  106. package/node_modules/@formepdf/shared/dist/types.js +2 -0
  107. package/node_modules/@formepdf/shared/package.json +35 -0
  108. package/node_modules/@types/node/LICENSE +21 -0
  109. package/node_modules/@types/node/README.md +15 -0
  110. package/node_modules/@types/node/assert/strict.d.ts +111 -0
  111. package/node_modules/@types/node/assert.d.ts +1078 -0
  112. package/node_modules/@types/node/async_hooks.d.ts +603 -0
  113. package/node_modules/@types/node/buffer.buffer.d.ts +472 -0
  114. package/node_modules/@types/node/buffer.d.ts +1934 -0
  115. package/node_modules/@types/node/child_process.d.ts +1476 -0
  116. package/node_modules/@types/node/cluster.d.ts +578 -0
  117. package/node_modules/@types/node/compatibility/disposable.d.ts +14 -0
  118. package/node_modules/@types/node/compatibility/index.d.ts +9 -0
  119. package/node_modules/@types/node/compatibility/indexable.d.ts +20 -0
  120. package/node_modules/@types/node/compatibility/iterators.d.ts +20 -0
  121. package/node_modules/@types/node/console.d.ts +452 -0
  122. package/node_modules/@types/node/constants.d.ts +21 -0
  123. package/node_modules/@types/node/crypto.d.ts +4545 -0
  124. package/node_modules/@types/node/dgram.d.ts +600 -0
  125. package/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
  126. package/node_modules/@types/node/dns/promises.d.ts +503 -0
  127. package/node_modules/@types/node/dns.d.ts +923 -0
  128. package/node_modules/@types/node/domain.d.ts +170 -0
  129. package/node_modules/@types/node/events.d.ts +976 -0
  130. package/node_modules/@types/node/fs/promises.d.ts +1306 -0
  131. package/node_modules/@types/node/fs.d.ts +4463 -0
  132. package/node_modules/@types/node/globals.d.ts +172 -0
  133. package/node_modules/@types/node/globals.typedarray.d.ts +38 -0
  134. package/node_modules/@types/node/http.d.ts +2097 -0
  135. package/node_modules/@types/node/http2.d.ts +2843 -0
  136. package/node_modules/@types/node/https.d.ts +579 -0
  137. package/node_modules/@types/node/index.d.ts +98 -0
  138. package/node_modules/@types/node/inspector.d.ts +253 -0
  139. package/node_modules/@types/node/inspector.generated.d.ts +4052 -0
  140. package/node_modules/@types/node/module.d.ts +891 -0
  141. package/node_modules/@types/node/net.d.ts +1076 -0
  142. package/node_modules/@types/node/os.d.ts +506 -0
  143. package/node_modules/@types/node/package.json +145 -0
  144. package/node_modules/@types/node/path.d.ts +200 -0
  145. package/node_modules/@types/node/perf_hooks.d.ts +968 -0
  146. package/node_modules/@types/node/process.d.ts +2084 -0
  147. package/node_modules/@types/node/punycode.d.ts +117 -0
  148. package/node_modules/@types/node/querystring.d.ts +152 -0
  149. package/node_modules/@types/node/readline/promises.d.ts +161 -0
  150. package/node_modules/@types/node/readline.d.ts +594 -0
  151. package/node_modules/@types/node/repl.d.ts +428 -0
  152. package/node_modules/@types/node/sea.d.ts +162 -0
  153. package/node_modules/@types/node/sqlite.d.ts +722 -0
  154. package/node_modules/@types/node/stream/consumers.d.ts +38 -0
  155. package/node_modules/@types/node/stream/promises.d.ts +90 -0
  156. package/node_modules/@types/node/stream/web.d.ts +573 -0
  157. package/node_modules/@types/node/stream.d.ts +1694 -0
  158. package/node_modules/@types/node/string_decoder.d.ts +67 -0
  159. package/node_modules/@types/node/test.d.ts +2265 -0
  160. package/node_modules/@types/node/timers/promises.d.ts +108 -0
  161. package/node_modules/@types/node/timers.d.ts +287 -0
  162. package/node_modules/@types/node/tls.d.ts +1319 -0
  163. package/node_modules/@types/node/trace_events.d.ts +197 -0
  164. package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +468 -0
  165. package/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +34 -0
  166. package/node_modules/@types/node/ts5.6/index.d.ts +98 -0
  167. package/node_modules/@types/node/tty.d.ts +208 -0
  168. package/node_modules/@types/node/url.d.ts +984 -0
  169. package/node_modules/@types/node/util.d.ts +2606 -0
  170. package/node_modules/@types/node/v8.d.ts +920 -0
  171. package/node_modules/@types/node/vm.d.ts +1053 -0
  172. package/node_modules/@types/node/wasi.d.ts +181 -0
  173. package/node_modules/@types/node/web-globals/abortcontroller.d.ts +34 -0
  174. package/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  175. package/node_modules/@types/node/web-globals/events.d.ts +97 -0
  176. package/node_modules/@types/node/web-globals/fetch.d.ts +55 -0
  177. package/node_modules/@types/node/web-globals/navigator.d.ts +22 -0
  178. package/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  179. package/node_modules/@types/node/web-globals/streams.d.ts +22 -0
  180. package/node_modules/@types/node/worker_threads.d.ts +819 -0
  181. package/node_modules/@types/node/zlib.d.ts +747 -0
  182. package/node_modules/@types/react/LICENSE +21 -0
  183. package/node_modules/@types/react/README.md +15 -0
  184. package/node_modules/@types/react/canary.d.ts +129 -0
  185. package/node_modules/@types/react/compiler-runtime.d.ts +4 -0
  186. package/node_modules/@types/react/experimental.d.ts +184 -0
  187. package/node_modules/@types/react/global.d.ts +166 -0
  188. package/node_modules/@types/react/index.d.ts +4378 -0
  189. package/node_modules/@types/react/jsx-dev-runtime.d.ts +33 -0
  190. package/node_modules/@types/react/jsx-runtime.d.ts +24 -0
  191. package/node_modules/@types/react/package.json +210 -0
  192. package/node_modules/@types/react/ts5.0/canary.d.ts +129 -0
  193. package/node_modules/@types/react/ts5.0/experimental.d.ts +184 -0
  194. package/node_modules/@types/react/ts5.0/global.d.ts +166 -0
  195. package/node_modules/@types/react/ts5.0/index.d.ts +4365 -0
  196. package/node_modules/@types/react/ts5.0/jsx-dev-runtime.d.ts +33 -0
  197. package/node_modules/@types/react/ts5.0/jsx-runtime.d.ts +24 -0
  198. package/node_modules/csstype/LICENSE +19 -0
  199. package/node_modules/csstype/README.md +291 -0
  200. package/node_modules/csstype/index.d.ts +22569 -0
  201. package/node_modules/csstype/index.js.flow +6863 -0
  202. package/node_modules/csstype/package.json +70 -0
  203. package/node_modules/entities/LICENSE +11 -0
  204. package/node_modules/entities/decode.d.ts +1 -0
  205. package/node_modules/entities/decode.js +3 -0
  206. package/node_modules/entities/dist/commonjs/decode-codepoint.d.ts +19 -0
  207. package/node_modules/entities/dist/commonjs/decode-codepoint.d.ts.map +1 -0
  208. package/node_modules/entities/dist/commonjs/decode-codepoint.js +77 -0
  209. package/node_modules/entities/dist/commonjs/decode-codepoint.js.map +1 -0
  210. package/node_modules/entities/dist/commonjs/decode.d.ts +209 -0
  211. package/node_modules/entities/dist/commonjs/decode.d.ts.map +1 -0
  212. package/node_modules/entities/dist/commonjs/decode.js +511 -0
  213. package/node_modules/entities/dist/commonjs/decode.js.map +1 -0
  214. package/node_modules/entities/dist/commonjs/encode.d.ts +22 -0
  215. package/node_modules/entities/dist/commonjs/encode.d.ts.map +1 -0
  216. package/node_modules/entities/dist/commonjs/encode.js +73 -0
  217. package/node_modules/entities/dist/commonjs/encode.js.map +1 -0
  218. package/node_modules/entities/dist/commonjs/escape.d.ts +43 -0
  219. package/node_modules/entities/dist/commonjs/escape.d.ts.map +1 -0
  220. package/node_modules/entities/dist/commonjs/escape.js +121 -0
  221. package/node_modules/entities/dist/commonjs/escape.js.map +1 -0
  222. package/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts +2 -0
  223. package/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts.map +1 -0
  224. package/node_modules/entities/dist/commonjs/generated/decode-data-html.js +10 -0
  225. package/node_modules/entities/dist/commonjs/generated/decode-data-html.js.map +1 -0
  226. package/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts +2 -0
  227. package/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts.map +1 -0
  228. package/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +10 -0
  229. package/node_modules/entities/dist/commonjs/generated/decode-data-xml.js.map +1 -0
  230. package/node_modules/entities/dist/commonjs/generated/encode-html.d.ts +8 -0
  231. package/node_modules/entities/dist/commonjs/generated/encode-html.d.ts.map +1 -0
  232. package/node_modules/entities/dist/commonjs/generated/encode-html.js +13 -0
  233. package/node_modules/entities/dist/commonjs/generated/encode-html.js.map +1 -0
  234. package/node_modules/entities/dist/commonjs/index.d.ts +96 -0
  235. package/node_modules/entities/dist/commonjs/index.d.ts.map +1 -0
  236. package/node_modules/entities/dist/commonjs/index.js +131 -0
  237. package/node_modules/entities/dist/commonjs/index.js.map +1 -0
  238. package/node_modules/entities/dist/commonjs/package.json +3 -0
  239. package/node_modules/entities/dist/esm/decode-codepoint.d.ts +19 -0
  240. package/node_modules/entities/dist/esm/decode-codepoint.d.ts.map +1 -0
  241. package/node_modules/entities/dist/esm/decode-codepoint.js +72 -0
  242. package/node_modules/entities/dist/esm/decode-codepoint.js.map +1 -0
  243. package/node_modules/entities/dist/esm/decode.d.ts +209 -0
  244. package/node_modules/entities/dist/esm/decode.d.ts.map +1 -0
  245. package/node_modules/entities/dist/esm/decode.js +497 -0
  246. package/node_modules/entities/dist/esm/decode.js.map +1 -0
  247. package/node_modules/entities/dist/esm/encode.d.ts +22 -0
  248. package/node_modules/entities/dist/esm/encode.d.ts.map +1 -0
  249. package/node_modules/entities/dist/esm/encode.js +69 -0
  250. package/node_modules/entities/dist/esm/encode.js.map +1 -0
  251. package/node_modules/entities/dist/esm/escape.d.ts +43 -0
  252. package/node_modules/entities/dist/esm/escape.d.ts.map +1 -0
  253. package/node_modules/entities/dist/esm/escape.js +117 -0
  254. package/node_modules/entities/dist/esm/escape.js.map +1 -0
  255. package/node_modules/entities/dist/esm/generated/decode-data-html.d.ts +2 -0
  256. package/node_modules/entities/dist/esm/generated/decode-data-html.d.ts.map +1 -0
  257. package/node_modules/entities/dist/esm/generated/decode-data-html.js +7 -0
  258. package/node_modules/entities/dist/esm/generated/decode-data-html.js.map +1 -0
  259. package/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts +2 -0
  260. package/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts.map +1 -0
  261. package/node_modules/entities/dist/esm/generated/decode-data-xml.js +7 -0
  262. package/node_modules/entities/dist/esm/generated/decode-data-xml.js.map +1 -0
  263. package/node_modules/entities/dist/esm/generated/encode-html.d.ts +8 -0
  264. package/node_modules/entities/dist/esm/generated/encode-html.d.ts.map +1 -0
  265. package/node_modules/entities/dist/esm/generated/encode-html.js +10 -0
  266. package/node_modules/entities/dist/esm/generated/encode-html.js.map +1 -0
  267. package/node_modules/entities/dist/esm/index.d.ts +96 -0
  268. package/node_modules/entities/dist/esm/index.d.ts.map +1 -0
  269. package/node_modules/entities/dist/esm/index.js +107 -0
  270. package/node_modules/entities/dist/esm/index.js.map +1 -0
  271. package/node_modules/entities/dist/esm/package.json +3 -0
  272. package/node_modules/entities/escape.d.ts +1 -0
  273. package/node_modules/entities/escape.js +3 -0
  274. package/node_modules/entities/package.json +118 -0
  275. package/node_modules/entities/readme.md +122 -0
  276. package/node_modules/entities/src/decode-codepoint.ts +81 -0
  277. package/node_modules/entities/src/decode.spec.ts +320 -0
  278. package/node_modules/entities/src/decode.ts +620 -0
  279. package/node_modules/entities/src/encode.spec.ts +78 -0
  280. package/node_modules/entities/src/encode.ts +77 -0
  281. package/node_modules/entities/src/escape.spec.ts +14 -0
  282. package/node_modules/entities/src/escape.ts +148 -0
  283. package/node_modules/entities/src/generated/.eslintrc.json +10 -0
  284. package/node_modules/entities/src/generated/decode-data-html.ts +8 -0
  285. package/node_modules/entities/src/generated/decode-data-xml.ts +8 -0
  286. package/node_modules/entities/src/generated/encode-html.ts +17 -0
  287. package/node_modules/entities/src/index.spec.ts +125 -0
  288. package/node_modules/entities/src/index.ts +188 -0
  289. package/node_modules/parse5/LICENSE +19 -0
  290. package/node_modules/parse5/README.md +38 -0
  291. package/node_modules/parse5/dist/cjs/common/doctype.d.ts +4 -0
  292. package/node_modules/parse5/dist/cjs/common/doctype.js +118 -0
  293. package/node_modules/parse5/dist/cjs/common/error-codes.d.ts +67 -0
  294. package/node_modules/parse5/dist/cjs/common/error-codes.js +66 -0
  295. package/node_modules/parse5/dist/cjs/common/foreign-content.d.ts +9 -0
  296. package/node_modules/parse5/dist/cjs/common/foreign-content.js +237 -0
  297. package/node_modules/parse5/dist/cjs/common/html.d.ts +289 -0
  298. package/node_modules/parse5/dist/cjs/common/html.js +528 -0
  299. package/node_modules/parse5/dist/cjs/common/token.d.ts +84 -0
  300. package/node_modules/parse5/dist/cjs/common/token.js +24 -0
  301. package/node_modules/parse5/dist/cjs/common/unicode.d.ts +42 -0
  302. package/node_modules/parse5/dist/cjs/common/unicode.js +70 -0
  303. package/node_modules/parse5/dist/cjs/index.d.ts +71 -0
  304. package/node_modules/parse5/dist/cjs/index.js +54 -0
  305. package/node_modules/parse5/dist/cjs/package.json +1 -0
  306. package/node_modules/parse5/dist/cjs/parser/formatting-element-list.d.ts +36 -0
  307. package/node_modules/parse5/dist/cjs/parser/formatting-element-list.js +114 -0
  308. package/node_modules/parse5/dist/cjs/parser/index.d.ts +221 -0
  309. package/node_modules/parse5/dist/cjs/parser/index.js +3240 -0
  310. package/node_modules/parse5/dist/cjs/parser/open-element-stack.d.ts +53 -0
  311. package/node_modules/parse5/dist/cjs/parser/open-element-stack.js +328 -0
  312. package/node_modules/parse5/dist/cjs/serializer/index.d.ts +60 -0
  313. package/node_modules/parse5/dist/cjs/serializer/index.js +172 -0
  314. package/node_modules/parse5/dist/cjs/tokenizer/index.d.ts +247 -0
  315. package/node_modules/parse5/dist/cjs/tokenizer/index.js +2714 -0
  316. package/node_modules/parse5/dist/cjs/tokenizer/preprocessor.d.ts +36 -0
  317. package/node_modules/parse5/dist/cjs/tokenizer/preprocessor.js +200 -0
  318. package/node_modules/parse5/dist/cjs/tree-adapters/default.d.ts +84 -0
  319. package/node_modules/parse5/dist/cjs/tree-adapters/default.js +176 -0
  320. package/node_modules/parse5/dist/cjs/tree-adapters/interface.d.ts +255 -0
  321. package/node_modules/parse5/dist/cjs/tree-adapters/interface.js +2 -0
  322. package/node_modules/parse5/dist/common/doctype.d.ts +4 -0
  323. package/node_modules/parse5/dist/common/doctype.js +114 -0
  324. package/node_modules/parse5/dist/common/error-codes.d.ts +67 -0
  325. package/node_modules/parse5/dist/common/error-codes.js +63 -0
  326. package/node_modules/parse5/dist/common/foreign-content.d.ts +9 -0
  327. package/node_modules/parse5/dist/common/foreign-content.js +228 -0
  328. package/node_modules/parse5/dist/common/html.d.ts +289 -0
  329. package/node_modules/parse5/dist/common/html.js +523 -0
  330. package/node_modules/parse5/dist/common/token.d.ts +84 -0
  331. package/node_modules/parse5/dist/common/token.js +20 -0
  332. package/node_modules/parse5/dist/common/unicode.d.ts +42 -0
  333. package/node_modules/parse5/dist/common/unicode.js +62 -0
  334. package/node_modules/parse5/dist/index.d.ts +71 -0
  335. package/node_modules/parse5/dist/index.js +42 -0
  336. package/node_modules/parse5/dist/parser/formatting-element-list.d.ts +36 -0
  337. package/node_modules/parse5/dist/parser/formatting-element-list.js +110 -0
  338. package/node_modules/parse5/dist/parser/index.d.ts +221 -0
  339. package/node_modules/parse5/dist/parser/index.js +3245 -0
  340. package/node_modules/parse5/dist/parser/open-element-stack.d.ts +53 -0
  341. package/node_modules/parse5/dist/parser/open-element-stack.js +324 -0
  342. package/node_modules/parse5/dist/serializer/index.d.ts +60 -0
  343. package/node_modules/parse5/dist/serializer/index.js +168 -0
  344. package/node_modules/parse5/dist/tokenizer/index.d.ts +247 -0
  345. package/node_modules/parse5/dist/tokenizer/index.js +2710 -0
  346. package/node_modules/parse5/dist/tokenizer/preprocessor.d.ts +36 -0
  347. package/node_modules/parse5/dist/tokenizer/preprocessor.js +196 -0
  348. package/node_modules/parse5/dist/tree-adapters/default.d.ts +84 -0
  349. package/node_modules/parse5/dist/tree-adapters/default.js +173 -0
  350. package/node_modules/parse5/dist/tree-adapters/interface.d.ts +255 -0
  351. package/node_modules/parse5/dist/tree-adapters/interface.js +1 -0
  352. package/node_modules/parse5/package.json +50 -0
  353. package/node_modules/undici-types/LICENSE +21 -0
  354. package/node_modules/undici-types/README.md +6 -0
  355. package/node_modules/undici-types/agent.d.ts +31 -0
  356. package/node_modules/undici-types/api.d.ts +43 -0
  357. package/node_modules/undici-types/balanced-pool.d.ts +29 -0
  358. package/node_modules/undici-types/cache.d.ts +36 -0
  359. package/node_modules/undici-types/client.d.ts +108 -0
  360. package/node_modules/undici-types/connector.d.ts +34 -0
  361. package/node_modules/undici-types/content-type.d.ts +21 -0
  362. package/node_modules/undici-types/cookies.d.ts +28 -0
  363. package/node_modules/undici-types/diagnostics-channel.d.ts +66 -0
  364. package/node_modules/undici-types/dispatcher.d.ts +256 -0
  365. package/node_modules/undici-types/env-http-proxy-agent.d.ts +21 -0
  366. package/node_modules/undici-types/errors.d.ts +149 -0
  367. package/node_modules/undici-types/eventsource.d.ts +61 -0
  368. package/node_modules/undici-types/fetch.d.ts +209 -0
  369. package/node_modules/undici-types/file.d.ts +39 -0
  370. package/node_modules/undici-types/filereader.d.ts +54 -0
  371. package/node_modules/undici-types/formdata.d.ts +108 -0
  372. package/node_modules/undici-types/global-dispatcher.d.ts +9 -0
  373. package/node_modules/undici-types/global-origin.d.ts +7 -0
  374. package/node_modules/undici-types/handlers.d.ts +15 -0
  375. package/node_modules/undici-types/header.d.ts +4 -0
  376. package/node_modules/undici-types/index.d.ts +71 -0
  377. package/node_modules/undici-types/interceptors.d.ts +17 -0
  378. package/node_modules/undici-types/mock-agent.d.ts +50 -0
  379. package/node_modules/undici-types/mock-client.d.ts +25 -0
  380. package/node_modules/undici-types/mock-errors.d.ts +12 -0
  381. package/node_modules/undici-types/mock-interceptor.d.ts +93 -0
  382. package/node_modules/undici-types/mock-pool.d.ts +25 -0
  383. package/node_modules/undici-types/package.json +55 -0
  384. package/node_modules/undici-types/patch.d.ts +33 -0
  385. package/node_modules/undici-types/pool-stats.d.ts +19 -0
  386. package/node_modules/undici-types/pool.d.ts +39 -0
  387. package/node_modules/undici-types/proxy-agent.d.ts +28 -0
  388. package/node_modules/undici-types/readable.d.ts +65 -0
  389. package/node_modules/undici-types/retry-agent.d.ts +8 -0
  390. package/node_modules/undici-types/retry-handler.d.ts +116 -0
  391. package/node_modules/undici-types/util.d.ts +18 -0
  392. package/node_modules/undici-types/webidl.d.ts +228 -0
  393. package/node_modules/undici-types/websocket.d.ts +150 -0
  394. package/package.json +80 -0
  395. package/scripts/rebuild-forme.mjs +61 -0
  396. package/src/app/AppearanceControl.tsx +44 -0
  397. package/src/app/AssetThemeDefaults.tsx +87 -0
  398. package/src/app/AssetsBrowser.tsx +273 -0
  399. package/src/app/CommentDock.tsx +108 -0
  400. package/src/app/CreateDocumentDialog.tsx +51 -0
  401. package/src/app/DocumentActions.tsx +69 -0
  402. package/src/app/DocumentCard.tsx +50 -0
  403. package/src/app/DocumentViewControl.tsx +31 -0
  404. package/src/app/DocumentsBrowser.tsx +70 -0
  405. package/src/app/ExportHistoryDialog.tsx +86 -0
  406. package/src/app/ExportMenu.tsx +127 -0
  407. package/src/app/GuideDialog.tsx +80 -0
  408. package/src/app/InspectionLayer.tsx +77 -0
  409. package/src/app/LogoUploadDialog.tsx +92 -0
  410. package/src/app/Markdown.tsx +34 -0
  411. package/src/app/MaterialsBrowser.tsx +149 -0
  412. package/src/app/PageNumberInput.tsx +56 -0
  413. package/src/app/Pdf.tsx +561 -0
  414. package/src/app/ProjectDialogs.tsx +100 -0
  415. package/src/app/Reader.tsx +769 -0
  416. package/src/app/SearchField.tsx +13 -0
  417. package/src/app/Sidebar.tsx +86 -0
  418. package/src/app/SkillIndex.tsx +30 -0
  419. package/src/app/TemplatesBrowser.tsx +149 -0
  420. package/src/app/ThemesBrowser.tsx +159 -0
  421. package/src/app/api.ts +47 -0
  422. package/src/app/appearance.ts +35 -0
  423. package/src/app/assets.css +139 -0
  424. package/src/app/catalogPreview.ts +20 -0
  425. package/src/app/colors.css +167 -0
  426. package/src/app/comment-dock.css +53 -0
  427. package/src/app/commentDrafts.ts +67 -0
  428. package/src/app/componentCorrection.ts +17 -0
  429. package/src/app/edit-workbench.css +87 -0
  430. package/src/app/editSession.ts +238 -0
  431. package/src/app/editorRecovery.ts +25 -0
  432. package/src/app/export-history.css +31 -0
  433. package/src/app/export.css +17 -0
  434. package/src/app/guideLinks.ts +21 -0
  435. package/src/app/guides.css +40 -0
  436. package/src/app/main.tsx +221 -0
  437. package/src/app/materials.css +53 -0
  438. package/src/app/pdfLoading.ts +12 -0
  439. package/src/app/pdfSelection.ts +112 -0
  440. package/src/app/projects.css +63 -0
  441. package/src/app/reader-toolbar.css +65 -0
  442. package/src/app/selection.css +150 -0
  443. package/src/app/sidebar.css +60 -0
  444. package/src/app/skills.css +7 -0
  445. package/src/app/style.css +1061 -0
  446. package/src/app/templates.css +49 -0
  447. package/src/app/themes.css +80 -0
  448. package/src/app/ui/Icon.tsx +92 -0
  449. package/src/app/ui/README.md +27 -0
  450. package/src/app/ui/fonts.css +36 -0
  451. package/src/app/ui/index.tsx +223 -0
  452. package/src/app/ui/ui.css +388 -0
  453. package/src/app/useReaderPreview.ts +19 -0
  454. package/src/app/useTextEditing.ts +155 -0
  455. package/src/assets/adapter.ts +122 -0
  456. package/src/assets/files.ts +378 -0
  457. package/src/assets/import-worker.ts +294 -0
  458. package/src/assets/imports.ts +124 -0
  459. package/src/assets/index.ts +60 -0
  460. package/src/assets/store.ts +798 -0
  461. package/src/assets/usage.ts +118 -0
  462. package/src/cli/check.ts +25 -0
  463. package/src/cli/init.ts +119 -0
  464. package/src/cli/lock.ts +34 -0
  465. package/src/cli/main.ts +118 -0
  466. package/src/cli/process.ts +19 -0
  467. package/src/cli/start.ts +96 -0
  468. package/src/cli/update.ts +348 -0
  469. package/src/cli/workspace.ts +94 -0
  470. package/src/document/index.tsx +641 -0
  471. package/src/document/page.tsx +53 -0
  472. package/src/document/text-targets.tsx +162 -0
  473. package/src/media/files.ts +124 -0
  474. package/src/media/render.ts +63 -0
  475. package/src/rendering/resolve-sources.ts +84 -0
  476. package/src/runtime/jsx-dev-runtime.ts +2 -0
  477. package/src/runtime/jsx-runtime.ts +2 -0
  478. package/src/runtime/paths.ts +12 -0
  479. package/src/server/assets-cli.ts +162 -0
  480. package/src/server/assets-http.ts +100 -0
  481. package/src/server/client.ts +50 -0
  482. package/src/server/clipboard.ts +22 -0
  483. package/src/server/comments-cli.ts +64 -0
  484. package/src/server/comments.ts +130 -0
  485. package/src/server/create-cli.ts +33 -0
  486. package/src/server/create.ts +228 -0
  487. package/src/server/dependencies.ts +91 -0
  488. package/src/server/documents.ts +143 -0
  489. package/src/server/edits.ts +249 -0
  490. package/src/server/export-batch.ts +105 -0
  491. package/src/server/export-errors.ts +2 -0
  492. package/src/server/export-file.ts +57 -0
  493. package/src/server/export-inputs.ts +66 -0
  494. package/src/server/export-preview.ts +69 -0
  495. package/src/server/export.ts +32 -0
  496. package/src/server/exports.ts +283 -0
  497. package/src/server/files.ts +21 -0
  498. package/src/server/guides.ts +71 -0
  499. package/src/server/index.ts +432 -0
  500. package/src/server/materials.ts +39 -0
  501. package/src/server/media-cli.ts +73 -0
  502. package/src/server/media-mutations.ts +168 -0
  503. package/src/server/pptx.ts +160 -0
  504. package/src/server/preflight.ts +129 -0
  505. package/src/server/projects-cli.ts +29 -0
  506. package/src/server/projects.ts +187 -0
  507. package/src/server/render-error.ts +9 -0
  508. package/src/server/render-source.ts +24 -0
  509. package/src/server/render.ts +48 -0
  510. package/src/server/review-cli.ts +40 -0
  511. package/src/server/review.ts +161 -0
  512. package/src/server/selection.ts +23 -0
  513. package/src/server/source-overrides.ts +97 -0
  514. package/src/server/templates-cli.ts +51 -0
  515. package/src/server/templates.ts +186 -0
  516. package/src/server/text-layout.ts +41 -0
  517. package/src/server/text-source.ts +307 -0
  518. package/src/server/themes-cli.ts +59 -0
  519. package/src/server/themes.ts +215 -0
  520. package/src/server/ttf2eot.d.ts +3 -0
  521. package/src/server/worker.ts +166 -0
  522. package/src/server/workspace.ts +242 -0
  523. package/src/shared/anchors.ts +69 -0
  524. package/src/shared/assets.ts +154 -0
  525. package/src/shared/export.ts +34 -0
  526. package/src/shared/media.ts +33 -0
  527. package/src/shared/projects.ts +19 -0
  528. package/src/shared/selection.ts +94 -0
  529. package/src/shared/skill-index.ts +14 -0
  530. package/src/shared/starters.ts +19 -0
  531. package/src/shared/templates.ts +18 -0
  532. package/src/shared/themes.ts +24 -0
  533. package/src/shared/types.ts +39 -0
  534. package/src/template/index.ts +27 -0
  535. package/src/themes/index.ts +3 -0
  536. package/src/themes/neutral.ts +20 -0
  537. package/src/themes/types.ts +110 -0
  538. package/starter/assets/brand/wordmark.png +0 -0
  539. package/starter/assets/fonts/InterUI-LICENSE.txt +93 -0
  540. package/starter/assets/fonts/InterUI-Medium.ttf +0 -0
  541. package/starter/assets/fonts/InterUI-Regular.ttf +0 -0
  542. package/starter/assets/fonts/InterUI-source.json +19 -0
  543. package/starter/assets/fonts/OpenDocMono-Regular.ttf +0 -0
  544. package/starter/assets/fonts/OpenDocSans-Italic.ttf +0 -0
  545. package/starter/assets/fonts/OpenDocSans-Regular.ttf +0 -0
  546. package/starter/assets/fonts/OpenDocSans-Semibold.ttf +0 -0
  547. package/starter/assets/fonts/OpenDocSans-SemiboldItalic.ttf +0 -0
  548. package/starter/assets/fonts/OpenDocSerif-Italic.ttf +0 -0
  549. package/starter/assets/fonts/OpenDocSerif-Regular.ttf +0 -0
  550. package/starter/assets/fonts/OpenDocSerif-Semibold.ttf +0 -0
  551. package/starter/assets/fonts/OpenDocSerif-SemiboldItalic.ttf +0 -0
  552. package/starter/assets/fonts/SourceCode-LICENSE.md +93 -0
  553. package/starter/assets/fonts/SourceSans-LICENSE.md +93 -0
  554. package/starter/assets/fonts/SourceSerif-LICENSE.md +93 -0
  555. package/starter/assets/fonts/geist/OFL.txt +93 -0
  556. package/starter/assets/fonts/geist/asset.json +7 -0
  557. package/starter/assets/fonts/geist/files/1a9874b3be0fc168692a3d2327bccb4d28835653d3b91537a755296a467a83e3.ttf +0 -0
  558. package/starter/assets/fonts/geist/files/a8eefb873ba9c9020665f8a98302697ce1f3b79ab2deef6ee508c0ca6a82e876.ttf +0 -0
  559. package/starter/assets/fonts/geist/files/ccce59465ae5c61930ada5453834f60500fbd95084d85db63e0e65fad0125455.ttf +0 -0
  560. package/starter/assets/fonts/geist/files/f5e95110d70593672515080bee9148463ada0a7f77b89ed65a3d43cb2b0ff83a.pdf +0 -0
  561. package/starter/assets/fonts/geist/revisions/9a2bc12fb2f23cb27bc227087e63e1407bb804ee0586480bd6b7966ec69fb474.json +60 -0
  562. package/starter/assets/fonts/inter/OFL.txt +93 -0
  563. package/starter/assets/fonts/inter/asset.json +7 -0
  564. package/starter/assets/fonts/inter/files/1b08e7fc267a5c7e1d614100f604b83e7e8a0be241f0f288faa2b3ac93a683ba.ttf +0 -0
  565. package/starter/assets/fonts/inter/files/5b6f0c6f26e5c554a64cdcc3a9b5d802b7f9aec6206f1dbcfcdcad7b5860a2a9.ttf +0 -0
  566. package/starter/assets/fonts/inter/files/957db8560d510a198a7d0333fae7b6b444b00c20801581126273978d778eb3c3.pdf +0 -0
  567. package/starter/assets/fonts/inter/files/b37284b5701b6b168dfc770aa1a4ac492106422fd3ba76bc7641e37434e8019c.ttf +0 -0
  568. package/starter/assets/fonts/inter/files/c1811d32ac0f6eed1bbf57529f2ecdfc6c717d48a969dd864942436315a1b198.ttf +0 -0
  569. package/starter/assets/fonts/inter/files/e7a1aaf7eda9f2fad4131725fa556265ec75ca7b2d756260173a040363e8d4f7.ttf +0 -0
  570. package/starter/assets/fonts/inter/files/ef8f755d933b9310804cc9152f1f18cb2ac460d6b05054ec913d889c9f11f79e.ttf +0 -0
  571. package/starter/assets/fonts/inter/revisions/600391517c413963b71e278a57c26c40366c81fa3939a6b9755f446206766d12.json +99 -0
  572. package/starter/assets/fonts/inter/source.json +57 -0
  573. package/starter/assets/fonts/lato/OFL.txt +93 -0
  574. package/starter/assets/fonts/lato/asset.json +7 -0
  575. package/starter/assets/fonts/lato/files/4a6b566dbb28adb473a8789ce5169306f42f0c8a070ac92bae93636f36348b0d.pdf +0 -0
  576. package/starter/assets/fonts/lato/files/5adeb6b334d8fb99ef053bc052b952773d544315e0e1d668a12c0ce8bd51375c.ttf +0 -0
  577. package/starter/assets/fonts/lato/files/62c1b7f0d2e74b45960154c3520efc337b553db0961bfdc950d5618334596cc8.ttf +0 -0
  578. package/starter/assets/fonts/lato/files/71b8b7decbe75a881ed267be539d402bd1e9420b799658aada4e0d1bd5af803c.ttf +0 -0
  579. package/starter/assets/fonts/lato/files/8a0aace75d33794eece4b28187bfc1df0bbd2888b5d8a56e01788c8d65d16be1.ttf +0 -0
  580. package/starter/assets/fonts/lato/files/d636e4683231f931eda222d588e944d082bfd3bdba02f928bee461c0f185b251.ttf +0 -0
  581. package/starter/assets/fonts/lato/files/e399c44efe1387100531d26c7e4800c5d12251b890d6654a3098c7c679cb1786.ttf +0 -0
  582. package/starter/assets/fonts/lato/revisions/49ccb93400a9d466fab7d9843b1ecf8916ec6d47a475dd79a597a22eb39616bc.json +99 -0
  583. package/starter/assets/fonts/lato/source.json +57 -0
  584. package/starter/assets/fonts/merriweather/OFL.txt +93 -0
  585. package/starter/assets/fonts/merriweather/asset.json +7 -0
  586. package/starter/assets/fonts/merriweather/files/1c54f91b910454251c4c2b7bd4e472e1abf265fba7ca3c0ef2eee2f41324099e.ttf +0 -0
  587. package/starter/assets/fonts/merriweather/files/8bde8da2bb7f0265e27ba0481f70bb48d0f98a976c145f2f239c648ddd6532e0.pdf +0 -0
  588. package/starter/assets/fonts/merriweather/files/90b7db4460fcd1a5ca49575c2668a793f3cd6447664d312a068d690e1c01e6bc.ttf +0 -0
  589. package/starter/assets/fonts/merriweather/files/afff81272b7653417bb6f8bef57add055b1f9fda36f27eba5f32b40752bd08da.ttf +0 -0
  590. package/starter/assets/fonts/merriweather/files/e029d3b71e5bae3877c73f4f2b15af28db16593d49b0aed2a328d37ff7075846.ttf +0 -0
  591. package/starter/assets/fonts/merriweather/files/e9864a6790bf712a04e20f3662b206a1535186ed3e877fd859dd5fb9682335df.ttf +0 -0
  592. package/starter/assets/fonts/merriweather/files/fa71baebdd20a7d0de2e5e445a5922530fe9e1d740efbe791f113b682d3cb093.ttf +0 -0
  593. package/starter/assets/fonts/merriweather/revisions/1888e390b3e4f38a3d7cd2dc1bb805aeb6ce13f986a97656f0265fd436bc91d2.json +99 -0
  594. package/starter/assets/fonts/merriweather/source.json +57 -0
  595. package/starter/assets/fonts/open-sans/OFL.txt +92 -0
  596. package/starter/assets/fonts/open-sans/asset.json +7 -0
  597. package/starter/assets/fonts/open-sans/files/1bc0594a83762b2c25d38915a34464b7fec6088298ca22d151757bf98d6700ec.ttf +0 -0
  598. package/starter/assets/fonts/open-sans/files/47ed1cfaa7ffca04a04ab850b2938fd52c09d1b44cfa3e2980878e166b0cbd87.ttf +0 -0
  599. package/starter/assets/fonts/open-sans/files/574939af301f07df8e21cfff279465c5981dd9d9cf62086f7515897df951c6f5.pdf +0 -0
  600. package/starter/assets/fonts/open-sans/files/6d3884d0d57c1b67e9c50c54eca7b69c535c114e76bd7a9cfda0258588185553.ttf +0 -0
  601. package/starter/assets/fonts/open-sans/files/733eb93b167e6d45de09aa768f6c0355647c2c26f5416dbc7407a08ed41e81c6.ttf +0 -0
  602. package/starter/assets/fonts/open-sans/files/75367e6da7d914eaed87883ba51b2a2b5816b5cdbb39f96ec5c81a5b032bfd5a.ttf +0 -0
  603. package/starter/assets/fonts/open-sans/files/ff4fdc11204e0edd14e9a0bb6c374b847a9093b0ec2c16702e03afca79ac4ef7.ttf +0 -0
  604. package/starter/assets/fonts/open-sans/revisions/bbbe3a4915b9bccbc883c0decb4097511c43b6bd09ae22a1516aff128c219bc5.json +99 -0
  605. package/starter/assets/fonts/open-sans/source.json +57 -0
  606. package/starter/assets/fonts/roboto/OFL.txt +93 -0
  607. package/starter/assets/fonts/roboto/asset.json +7 -0
  608. package/starter/assets/fonts/roboto/files/22d45d989248a624252b8382067ac56550212fa675dcdbaf12f03d297dd87a58.pdf +0 -0
  609. package/starter/assets/fonts/roboto/files/35757eaa996b3359022f47f164a67ee9eac04971af24c5b8fbd4b89e844ff190.ttf +0 -0
  610. package/starter/assets/fonts/roboto/files/4d3035883c531846bd1ce2dc89f36d932e72dc114f56062c7e3a9cdd74f3d3ea.ttf +0 -0
  611. package/starter/assets/fonts/roboto/files/be7639306a4fc4a02ce2ae2ff59eb1335e4db4a7379dd0a384ed7cc053817789.ttf +0 -0
  612. package/starter/assets/fonts/roboto/files/d2920cbb1b60a3fd11fbf22049286e43a6baf522d37fdf1e7c89562319bcfea5.ttf +0 -0
  613. package/starter/assets/fonts/roboto/files/dece7c71bbe61710787f0839c722c65e87355dd2eb4a823e6b5488121ff81e4b.ttf +0 -0
  614. package/starter/assets/fonts/roboto/files/f478ba88b0292e685e487901dfbb1401457d32d6ebee4030cdfd5698235bffa8.ttf +0 -0
  615. package/starter/assets/fonts/roboto/revisions/bda5e2d84c17313373dd2dbf3e64fe0dd450c7e1b59e6929e69557e122fe976e.json +99 -0
  616. package/starter/assets/fonts/roboto/source.json +57 -0
  617. package/starter/assets/logos/opendoc/asset.json +6 -0
  618. package/starter/assets/logos/opendoc/files/831d5ccd9eb6709cc8439ea257c03d81452e81a28a3d1eedbd6a3b7daff687b6.png +0 -0
  619. package/starter/assets/logos/opendoc/revisions/834dde8926ddb81de687254195a168bb13bfb77803307f1257de1f2228be63b2.json +33 -0
  620. package/starter/assets/ui-fonts/geist/OFL.txt +93 -0
  621. package/starter/assets/ui-fonts/geist/geist-latin-ext-wght-italic.woff2 +0 -0
  622. package/starter/assets/ui-fonts/geist/geist-latin-ext-wght-normal.woff2 +0 -0
  623. package/starter/assets/ui-fonts/geist/geist-latin-wght-italic.woff2 +0 -0
  624. package/starter/assets/ui-fonts/geist/geist-latin-wght-normal.woff2 +0 -0
  625. package/starter/assets/ui-fonts/geist/source.json +26 -0
  626. package/starter/documents/welcome/assets.json +7 -0
  627. package/starter/documents/welcome/index.tsx +160 -0
  628. package/starter/documents/welcome/media/.gitkeep +0 -0
  629. package/starter/documents/welcome/media/paper-architecture/image.png +0 -0
  630. package/starter/documents/welcome/media/paper-architecture/meta.json +9 -0
  631. package/starter/documents/welcome/media/paper-architecture/prompt.txt +1 -0
  632. package/starter/documents/welcome/media/studio-rhythm/chart.svg +2343 -0
  633. package/starter/documents/welcome/media/studio-rhythm/data.json +234 -0
  634. package/starter/documents/welcome/media/studio-rhythm/generation.json +9 -0
  635. package/starter/documents/welcome/media/studio-rhythm/image.png +0 -0
  636. package/starter/documents/welcome/media/studio-rhythm/meta.json +11 -0
  637. package/starter/documents/welcome/media/studio-rhythm/recipe.py +79 -0
  638. package/starter/documents/welcome/theme.tsx +5 -0
  639. package/starter/documents/welcome-presentation/assets.json +7 -0
  640. package/starter/documents/welcome-presentation/index.tsx +166 -0
  641. package/starter/documents/welcome-presentation/media/.gitkeep +0 -0
  642. package/starter/documents/welcome-presentation/media/paper-architecture/image.png +0 -0
  643. package/starter/documents/welcome-presentation/media/paper-architecture/meta.json +9 -0
  644. package/starter/documents/welcome-presentation/media/paper-architecture/prompt.txt +1 -0
  645. package/starter/documents/welcome-presentation/media/studio-rhythm/chart.svg +1336 -0
  646. package/starter/documents/welcome-presentation/media/studio-rhythm/data.json +234 -0
  647. package/starter/documents/welcome-presentation/media/studio-rhythm/generation.json +9 -0
  648. package/starter/documents/welcome-presentation/media/studio-rhythm/image.png +0 -0
  649. package/starter/documents/welcome-presentation/media/studio-rhythm/meta.json +13 -0
  650. package/starter/documents/welcome-presentation/media/studio-rhythm/recipe.py +49 -0
  651. package/starter/documents/welcome-presentation/theme.tsx +5 -0
  652. package/starter/projects.json +17 -0
  653. package/starter/templates/AGENTS.md +9 -0
  654. package/starter/templates/_shared/BusinessLogo.tsx +14 -0
  655. package/starter/templates/_shared/Pricing.tsx +40 -0
  656. package/starter/templates/_shared/commerce.ts +93 -0
  657. package/starter/templates/brand-guidelines/AGENTS.md +32 -0
  658. package/starter/templates/brand-guidelines/index.tsx +62 -0
  659. package/starter/templates/brand-guidelines/preview.tsx +181 -0
  660. package/starter/templates/brand-guidelines/starter.tsx +179 -0
  661. package/starter/templates/brand-guidelines/template.json +15 -0
  662. package/starter/templates/business-proposal/AGENTS.md +13 -0
  663. package/starter/templates/business-proposal/README.md +36 -0
  664. package/starter/templates/business-proposal/data.json +37 -0
  665. package/starter/templates/business-proposal/examples/long.json +142 -0
  666. package/starter/templates/business-proposal/examples/sparse.json +17 -0
  667. package/starter/templates/business-proposal/examples/typical.json +37 -0
  668. package/starter/templates/business-proposal/index.tsx +59 -0
  669. package/starter/templates/business-proposal/preview.tsx +47 -0
  670. package/starter/templates/business-proposal/schema.ts +14 -0
  671. package/starter/templates/business-proposal/starter.tsx +18 -0
  672. package/starter/templates/business-proposal/template.json +11 -0
  673. package/starter/templates/company-profile/AGENTS.md +48 -0
  674. package/starter/templates/company-profile/index.tsx +69 -0
  675. package/starter/templates/company-profile/preview.tsx +185 -0
  676. package/starter/templates/company-profile/starter.tsx +186 -0
  677. package/starter/templates/company-profile/template.json +15 -0
  678. package/starter/templates/consulting-report/AGENTS.md +11 -0
  679. package/starter/templates/consulting-report/README.md +13 -0
  680. package/starter/templates/consulting-report/RESEARCH.md +10 -0
  681. package/starter/templates/consulting-report/index.tsx +44 -0
  682. package/starter/templates/consulting-report/preview.tsx +39 -0
  683. package/starter/templates/consulting-report/starter.tsx +15 -0
  684. package/starter/templates/consulting-report/template.json +11 -0
  685. package/starter/templates/editorial-essay/AGENTS.md +11 -0
  686. package/starter/templates/editorial-essay/README.md +11 -0
  687. package/starter/templates/editorial-essay/index.tsx +30 -0
  688. package/starter/templates/editorial-essay/preview.tsx +26 -0
  689. package/starter/templates/editorial-essay/starter.tsx +15 -0
  690. package/starter/templates/editorial-essay/template.json +11 -0
  691. package/starter/templates/executive-brief/AGENTS.md +9 -0
  692. package/starter/templates/executive-brief/README.md +11 -0
  693. package/starter/templates/executive-brief/index.tsx +33 -0
  694. package/starter/templates/executive-brief/preview.tsx +37 -0
  695. package/starter/templates/executive-brief/starter.tsx +11 -0
  696. package/starter/templates/executive-brief/template.json +11 -0
  697. package/starter/templates/image-story/AGENTS.md +37 -0
  698. package/starter/templates/image-story/index.tsx +106 -0
  699. package/starter/templates/image-story/preview.tsx +33 -0
  700. package/starter/templates/image-story/starter.tsx +24 -0
  701. package/starter/templates/image-story/template.json +13 -0
  702. package/starter/templates/invoice/AGENTS.md +13 -0
  703. package/starter/templates/invoice/README.md +40 -0
  704. package/starter/templates/invoice/data.json +61 -0
  705. package/starter/templates/invoice/examples/long.json +241 -0
  706. package/starter/templates/invoice/examples/sparse.json +33 -0
  707. package/starter/templates/invoice/examples/typical.json +61 -0
  708. package/starter/templates/invoice/index.tsx +57 -0
  709. package/starter/templates/invoice/preview.tsx +12 -0
  710. package/starter/templates/invoice/schema.ts +45 -0
  711. package/starter/templates/invoice/starter.tsx +12 -0
  712. package/starter/templates/invoice/template.json +11 -0
  713. package/starter/templates/literary-text/AGENTS.md +9 -0
  714. package/starter/templates/literary-text/README.md +11 -0
  715. package/starter/templates/literary-text/index.tsx +31 -0
  716. package/starter/templates/literary-text/preview.tsx +20 -0
  717. package/starter/templates/literary-text/starter.tsx +11 -0
  718. package/starter/templates/literary-text/template.json +11 -0
  719. package/starter/templates/magazine-feature/AGENTS.md +11 -0
  720. package/starter/templates/magazine-feature/README.md +13 -0
  721. package/starter/templates/magazine-feature/index.tsx +41 -0
  722. package/starter/templates/magazine-feature/preview.tsx +34 -0
  723. package/starter/templates/magazine-feature/starter.tsx +15 -0
  724. package/starter/templates/magazine-feature/template.json +11 -0
  725. package/starter/templates/monthly-report/AGENTS.md +11 -0
  726. package/starter/templates/monthly-report/README.md +24 -0
  727. package/starter/templates/monthly-report/data.json +131 -0
  728. package/starter/templates/monthly-report/examples/long.json +519 -0
  729. package/starter/templates/monthly-report/examples/sparse.json +20 -0
  730. package/starter/templates/monthly-report/examples/typical.json +37 -0
  731. package/starter/templates/monthly-report/index.tsx +92 -0
  732. package/starter/templates/monthly-report/preview.tsx +14 -0
  733. package/starter/templates/monthly-report/schema.ts +127 -0
  734. package/starter/templates/monthly-report/starter.tsx +13 -0
  735. package/starter/templates/monthly-report/template.json +11 -0
  736. package/starter/templates/pitch-deck/AGENTS.md +32 -0
  737. package/starter/templates/pitch-deck/index.tsx +46 -0
  738. package/starter/templates/pitch-deck/preview.tsx +142 -0
  739. package/starter/templates/pitch-deck/starter.tsx +140 -0
  740. package/starter/templates/pitch-deck/template.json +15 -0
  741. package/starter/templates/proposal-deck/AGENTS.md +25 -0
  742. package/starter/templates/proposal-deck/index.tsx +52 -0
  743. package/starter/templates/proposal-deck/preview.tsx +172 -0
  744. package/starter/templates/proposal-deck/starter.tsx +168 -0
  745. package/starter/templates/proposal-deck/template.json +7 -0
  746. package/starter/templates/quotation/AGENTS.md +13 -0
  747. package/starter/templates/quotation/README.md +42 -0
  748. package/starter/templates/quotation/data.json +64 -0
  749. package/starter/templates/quotation/examples/long.json +272 -0
  750. package/starter/templates/quotation/examples/sparse.json +31 -0
  751. package/starter/templates/quotation/examples/typical.json +64 -0
  752. package/starter/templates/quotation/index.tsx +51 -0
  753. package/starter/templates/quotation/preview.tsx +12 -0
  754. package/starter/templates/quotation/schema.ts +27 -0
  755. package/starter/templates/quotation/starter.tsx +12 -0
  756. package/starter/templates/quotation/template.json +11 -0
  757. package/starter/templates/scientific-paper/AGENTS.md +11 -0
  758. package/starter/templates/scientific-paper/README.md +13 -0
  759. package/starter/templates/scientific-paper/index.tsx +47 -0
  760. package/starter/templates/scientific-paper/preview.tsx +43 -0
  761. package/starter/templates/scientific-paper/starter.tsx +15 -0
  762. package/starter/templates/scientific-paper/template.json +11 -0
  763. package/starter/themes/Specimen.tsx +54 -0
  764. package/starter/themes/civic-spectrum/components.tsx +92 -0
  765. package/starter/themes/civic-spectrum/design.md +70 -0
  766. package/starter/themes/civic-spectrum/index.ts +57 -0
  767. package/starter/themes/civic-spectrum/preview.tsx +66 -0
  768. package/starter/themes/field-manual/components.tsx +106 -0
  769. package/starter/themes/field-manual/design.md +72 -0
  770. package/starter/themes/field-manual/index.ts +57 -0
  771. package/starter/themes/field-manual/preview.tsx +82 -0
  772. package/starter/themes/index.ts +3 -0
  773. package/starter/themes/mckinsey-consulting/components.tsx +69 -0
  774. package/starter/themes/mckinsey-consulting/design.md +68 -0
  775. package/starter/themes/mckinsey-consulting/index.ts +60 -0
  776. package/starter/themes/mckinsey-consulting/preview.tsx +53 -0
  777. package/starter/themes/neutral/design.md +35 -0
  778. package/starter/themes/neutral/index.ts +21 -0
  779. package/starter/themes/neutral/preview.tsx +4 -0
  780. package/starter/themes/opendoc-neutral/components.tsx +77 -0
  781. package/starter/themes/opendoc-neutral/design.md +70 -0
  782. package/starter/themes/opendoc-neutral/index.ts +54 -0
  783. package/starter/themes/opendoc-neutral/preview.tsx +43 -0
  784. package/starter/themes/types.ts +3 -0
  785. package/tsconfig.workspace.json +24 -0
  786. package/vendor/formepdf/LICENSE +21 -0
  787. package/vendor/formepdf/README.md +97 -0
  788. package/vendor/formepdf/font-subset.patch +228 -0
  789. package/vendor/formepdf/text-writer.patch +507 -0
@@ -0,0 +1,53 @@
1
+ import { deflateSync } from 'node:zlib';
2
+ import { Page as NativePage, parseColor, type PageProps as NativePageProps } from '@formepdf/react';
3
+ import { readyMedia, mediaUri, framedMedia, pageImage, type ImageFrameOptions } from '../media/render';
4
+
5
+ export interface PageProps extends NativePageProps {
6
+ /** Document-owned media item; includes freshness checks and rendered usage tracking. */
7
+ backgroundMedia?: string;
8
+ }
9
+
10
+ function crc32(bytes: Uint8Array) {
11
+ let crc = 0xffffffff;
12
+ for (const byte of bytes) {
13
+ crc ^= byte;
14
+ for (let bit = 0; bit < 8; bit++) crc = (crc >>> 1) ^ (crc & 1 ? 0xedb88320 : 0);
15
+ }
16
+ return (crc ^ 0xffffffff) >>> 0;
17
+ }
18
+
19
+ /** A tiny lossless image uses the renderer's actual full-page background layer. */
20
+ function solidBackground(input: string) {
21
+ const color = ({ white: '#ffffff', black: '#000000', transparent: '#00000000' } as Record<string, string>)[input.toLowerCase()] ?? input;
22
+ if (!/^#(?:[0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(color) && !/^rgba?\([\d.,\s]+\)$/i.test(color)) throw new Error('Page backgroundColor needs a hex or rgb/rgba color.');
23
+ const { r, g, b, a } = parseColor(color);
24
+ if ([r, g, b, a].some(channel => !Number.isFinite(channel) || channel < 0 || channel > 1)) throw new Error('Page backgroundColor contains an invalid color channel.');
25
+ const chunk = (type: string, data: Buffer) => {
26
+ const name = Buffer.from(type), length = Buffer.alloc(4), checksum = Buffer.alloc(4);
27
+ length.writeUInt32BE(data.length);
28
+ checksum.writeUInt32BE(crc32(Buffer.concat([name, data])));
29
+ return Buffer.concat([length, name, data, checksum]);
30
+ };
31
+ const header = Buffer.alloc(13);
32
+ header.writeUInt32BE(1, 0); header.writeUInt32BE(1, 4); header[8] = 8; header[9] = 6;
33
+ const pixel = Buffer.from([0, ...[r, g, b, a].map(channel => Math.round(channel * 255))]);
34
+ const png = Buffer.concat([Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]), chunk('IHDR', header), chunk('IDAT', deflateSync(pixel)), chunk('IEND', Buffer.alloc(0))]);
35
+ return `data:image/png;base64,${png.toString('base64')}`;
36
+ }
37
+
38
+ /** Native flow and geometry, with backgroundColor painted behind every continuation page. */
39
+ export function Page({ style, backgroundImage, backgroundMedia, ...props }: PageProps) {
40
+ if (backgroundMedia !== undefined && backgroundImage !== undefined) throw new Error('Page accepts either backgroundMedia or backgroundImage, not both.');
41
+ const sizes = {A4: [595.28, 841.89], A3: [841.89, 1190.55], A5: [419.53, 595.28], Letter: [612, 792], Legal: [612, 1008], Tabloid: [792, 1224]} as const;
42
+ const size = props.size ?? 'A4';
43
+ const [width, height] = typeof size === 'string' ? sizes[size] : [size.width, size.height];
44
+ const fit = props.backgroundSize ?? (backgroundMedia !== undefined ? 'cover' : 'fill');
45
+ const positions = {'center': {x: .5, y: .5}, 'top-left': {x: 0, y: 0}, 'top-right': {x: 1, y: 0}, 'bottom-left': {x: 0, y: 1}, 'bottom-right': {x: 1, y: 1}};
46
+ const frame: ImageFrameOptions | undefined = fit === 'fill' ? undefined : {width, height, fit, position: positions[props.backgroundPosition ?? 'center']};
47
+ const asset = backgroundMedia !== undefined ? readyMedia(backgroundMedia) : undefined;
48
+ // The native background layer stretches its bitmap. Prepare cover/contain at the page ratio first.
49
+ const image = asset ? (frame ? framedMedia(asset, frame) : mediaUri(asset)) : backgroundImage !== undefined ? pageImage(backgroundImage, frame) : undefined;
50
+ if (style?.backgroundColor === undefined || image !== undefined) return <NativePage {...props} backgroundImage={image} style={style} />;
51
+ const { backgroundColor, ...contentStyle } = style;
52
+ return <NativePage {...props} style={contentStyle} backgroundImage={solidBackground(backgroundColor)} backgroundSize="fill" backgroundPosition="center" />;
53
+ }
@@ -0,0 +1,162 @@
1
+ import React, { createElement, isValidElement, type ReactElement, type ReactNode } from 'react';
2
+ import * as F from '@formepdf/react';
3
+ import type { SourceLocation } from '../shared/types';
4
+ import type { TextRun, TextSourceValue, TextTarget } from '../shared/selection';
5
+
6
+ export type TextFieldPath = (string | { id: string })[];
7
+ export interface TextSlotProps {
8
+ /** Stable content name, independent of pagination and array order. */
9
+ slot: string;
10
+ /** A literal prop on the calling component. */
11
+ from?: string;
12
+ /** A string in the instance's provenance.dataFile; arrays use record IDs. */
13
+ field?: TextFieldPath;
14
+ /** Internal offset when a native block groups its authored children. */
15
+ childIndex?: number;
16
+ /** Set false for a generated slot whose identity depends on array position. */
17
+ stable?: boolean;
18
+ reason?: string;
19
+ children?: ReactNode;
20
+ }
21
+
22
+ /** Transparent source provenance. It introduces no text, styles, or PDF nodes. */
23
+ export function TextSlot({ children }: TextSlotProps) { return <>{children}</>; }
24
+
25
+ export type TextResolution = (location: SourceLocation, slot: string, childIndex?: number) => TextSourceValue | undefined;
26
+ export type TextGlobals = typeof globalThis & {
27
+ __opendocResolveTextSource?: TextResolution;
28
+ __opendocResolveTextField?: (field: TextFieldPath) => TextSourceValue | undefined;
29
+ };
30
+ type Binding = { slot?: string; source?: TextSourceValue; origin?: SourceLocation; from?: string; childIndex?: number; stable?: boolean; protected?: boolean; reason?: string };
31
+ const textTypes = new Set<unknown>([F.Text, F.H1, F.H2, F.H3, F.H4, F.H5, F.H6]);
32
+
33
+ function rawText(node: ReactNode): string {
34
+ if (typeof node === 'string' || typeof node === 'number') return String(node);
35
+ if (Array.isArray(node)) return node.map(rawText).join('');
36
+ return isValidElement<{ children?: ReactNode }>(node) ? rawText(node.props.children) : '';
37
+ }
38
+
39
+ /** Capture authored leaves before Forme flattens inline runs into text lines. */
40
+ export class TextCapture {
41
+ private bindings = new WeakMap<object, Binding>();
42
+ private origins = new WeakMap<object, SourceLocation>();
43
+ constructor(private sourceMap: WeakMap<object, SourceLocation>) {}
44
+
45
+ remember(element: object, source?: SourceLocation) { if (source) this.origins.set(element, source); }
46
+ copy(from: object, to: object) {
47
+ const binding = this.bindings.get(from), origin = this.origins.get(from);
48
+ if (binding) this.bindings.set(to, binding);
49
+ if (origin) this.origins.set(to, origin);
50
+ }
51
+ wrap(children: ReactNode, props: TextSlotProps, caller?: SourceLocation): ReactElement {
52
+ if (typeof props.slot !== 'string' || !props.slot.trim()) throw new Error('TextSlot needs a nonempty stable content name.');
53
+ const globals = globalThis as TextGlobals;
54
+ const source = props.field ? globals.__opendocResolveTextField?.(props.field)
55
+ : props.from && props.from !== 'children' && caller ? globals.__opendocResolveTextSource?.(caller, props.from) : undefined;
56
+ const marker = createElement(React.Fragment, {}, children);
57
+ this.bindings.set(marker, { slot: props.slot, source, origin: caller, from: props.from, childIndex: props.childIndex, stable: props.stable, reason: props.reason, protected: !!props.reason });
58
+ return marker;
59
+ }
60
+ protect(children: ReactNode, reason: string): ReactElement {
61
+ const marker = createElement(React.Fragment, {}, children);
62
+ this.bindings.set(marker, { protected: true, reason });
63
+ return marker;
64
+ }
65
+
66
+ complete(root: ReactNode): { element: ReactElement; textTargets: TextTarget[] } {
67
+ const textTargets: TextTarget[] = [];
68
+ const counts = new Map<string, number>();
69
+ const used = new Set<string>();
70
+ const identities = new Map<TextTarget, { named: boolean; key: string }>();
71
+ const globals = globalThis as TextGlobals;
72
+ const resolve = (location: SourceLocation | undefined, slot: string, childIndex?: number) => location ? globals.__opendocResolveTextSource?.(location, slot, childIndex) : undefined;
73
+ const containsProtected = (node: ReactNode): boolean => {
74
+ if (Array.isArray(node)) return node.some(containsProtected);
75
+ if (!isValidElement<{ children?: ReactNode }>(node)) return false;
76
+ return !!this.bindings.get(node)?.protected || containsProtected(node.props.children);
77
+ };
78
+
79
+ const gather = (node: ReactNode, runs: TextRun[], buffer: { text: string }, inherited?: Binding, source?: TextSourceValue) => {
80
+ if (typeof node === 'string' || typeof node === 'number') {
81
+ const text = String(node); if (!text) return;
82
+ const candidate = inherited?.source ?? source;
83
+ const writable = !inherited?.protected && candidate?.value === text ? candidate : undefined;
84
+ const start = buffer.text.length; buffer.text += text;
85
+ runs.push({ start, end: buffer.text.length, ...(writable ? { source: writable } : {}),
86
+ ...(!writable ? { protected: !!inherited?.protected, reason: inherited?.reason ?? 'Ask your agent to change this text.' } : {}) });
87
+ return;
88
+ }
89
+ if (Array.isArray(node)) { node.forEach(child => gather(child, runs, buffer, inherited)); return; }
90
+ if (!isValidElement<{ children?: ReactNode }>(node)) return;
91
+ const own = this.bindings.get(node);
92
+ const binding = inherited?.protected ? inherited : own ? { ...inherited, ...own } : inherited;
93
+ // A bound scalar may be wrapped by transparent/formatting elements. Keep
94
+ // it one writable run only when all rendered content is that exact scalar.
95
+ if (binding?.source && !binding.protected && !containsProtected(node.props.children) && rawText(node.props.children) === binding.source.value) {
96
+ const start = buffer.text.length; buffer.text += binding.source.value;
97
+ runs.push({ start, end: buffer.text.length, source: binding.source });
98
+ return;
99
+ }
100
+ const origin = own?.origin ?? this.origins.get(node);
101
+ const from = own?.from ?? 'children';
102
+ const children = Array.isArray(node.props.children) ? node.props.children : [node.props.children];
103
+ children.forEach((child, index) => gather(child, runs, buffer, binding,
104
+ typeof child === 'string' || typeof child === 'number' ? resolve(origin, from, index + (own?.childIndex ?? 0)) : undefined));
105
+ };
106
+ const descendantSlot = (node: ReactNode): Binding | undefined => {
107
+ if (Array.isArray(node)) {
108
+ const bindings = node.map(descendantSlot).filter((value): value is Binding => !!value);
109
+ return bindings.find(binding => !binding.protected) ?? bindings[0];
110
+ }
111
+ if (!isValidElement<{ children?: ReactNode }>(node)) return undefined;
112
+ const binding = this.bindings.get(node), child = descendantSlot(node.props.children);
113
+ return binding?.slot === 'children' ? child ?? binding : binding?.slot ? binding : child;
114
+ };
115
+ const clean = (node: ReactNode, blockId?: string, withinText = false, inherited?: Binding): ReactNode => {
116
+ if (Array.isArray(node)) return node.map(child => clean(child, blockId, withinText, inherited));
117
+ if (!isValidElement<{ children?: ReactNode }>(node)) return node;
118
+ const location = this.sourceMap.get(node);
119
+ const id = location?.file.startsWith('opendoc:block:') ? location.file.slice(14) : blockId;
120
+ const own = this.bindings.get(node);
121
+ const binding = inherited?.protected ? inherited : own ? { ...inherited, ...own } : inherited;
122
+ if (node.type === React.Fragment) return clean(node.props.children, id, withinText, binding);
123
+ const textRoot = !withinText && textTypes.has(node.type);
124
+ let target: TextTarget | undefined;
125
+ if (textRoot && id) {
126
+ const count = (counts.get(id) ?? 0) + 1; counts.set(id, count);
127
+ const named = binding?.slot ? binding : descendantSlot(node.props.children);
128
+ const slot = named?.slot ?? (count === 1 ? 'children' : `text-${count}`);
129
+ const key = `${id}:${encodeURIComponent(slot)}`;
130
+ const runs: TextRun[] = [], buffer = { text: '' };
131
+ gather(node, runs, buffer, binding);
132
+ if (buffer.text) {
133
+ target = { id: used.has(key) ? `${key}:${count}` : key, blockId: id, slot, text: buffer.text, runs, lines: [], stable: named?.stable !== false };
134
+ used.add(target.id); textTargets.push(target);
135
+ identities.set(target, { named: !!named?.slot, key });
136
+ if (!runs.some(run => run.source)) target.reason = runs.find(run => run.reason)?.reason;
137
+ }
138
+ }
139
+ const result = createElement(node.type, { ...node.props, key: node.key }, clean(node.props.children, id, withinText || textRoot, binding));
140
+ // Keep block source tags compatible with preflight and fragments; the
141
+ // synthetic line records which text target owns this native text node.
142
+ if (target) this.sourceMap.set(result, { file: `opendoc:block:${id}`, line: textTargets.length, column: 1 });
143
+ else if (location) this.sourceMap.set(result, location);
144
+ return result;
145
+ };
146
+ const element = clean(root) as ReactElement;
147
+ const slots = new Map<string, TextTarget[]>();
148
+ for (const target of textTargets) {
149
+ const identity = identities.get(target)!;
150
+ if (!identity.named && (counts.get(target.blockId) ?? 0) > 1) target.stable = false;
151
+ const group = slots.get(identity.key) ?? []; group.push(target); slots.set(identity.key, group);
152
+ }
153
+ for (const group of slots.values()) if (group.length > 1) for (const target of group) target.stable = false;
154
+ const linked = new Map<string, TextSourceValue[]>();
155
+ for (const target of textTargets) for (const run of target.runs) if (run.source) {
156
+ const value = run.source, key = `${value.file}:${value.digest}:${value.start}:${value.end}`;
157
+ const values = linked.get(key) ?? []; values.push(value); linked.set(key, values);
158
+ }
159
+ for (const values of linked.values()) for (const value of values) value.linkedOccurrences = Math.max(value.linkedOccurrences ?? 1, values.length);
160
+ return { element, textTargets };
161
+ }
162
+ }
@@ -0,0 +1,124 @@
1
+ import { readFileSync, realpathSync, lstatSync, statSync, openSync, readSync, closeSync } from 'node:fs';
2
+ import { resolve, relative, sep, extname, basename } from 'node:path';
3
+ import { createHash } from 'node:crypto';
4
+ import type { MediaMeta, MediaKind } from '../shared/media';
5
+
6
+ export const mediaId = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
7
+ const kinds: MediaKind[] = ['photo', 'illustration', 'chart', 'diagram', 'image'];
8
+ const fileHashes = new Map<string, {stamp: string; hash: string}>();
9
+ function fileHash(file: string) {
10
+ const info = statSync(file, {bigint:true});
11
+ const stamp = `${info.size}:${info.mtimeNs}:${info.ctimeNs}:${info.ino}`;
12
+ const cached = fileHashes.get(file);
13
+ if (cached?.stamp === stamp) return cached.hash;
14
+ const digest = createHash('sha256'), buffer = Buffer.allocUnsafe(64 * 1024);
15
+ const fd = openSync(file, 'r');
16
+ try { let count; while ((count = readSync(fd, buffer, 0, buffer.length, null)) > 0) digest.update(buffer.subarray(0,count)); }
17
+ finally { closeSync(fd); }
18
+ const after = statSync(file,{bigint:true});
19
+ if (`${after.size}:${after.mtimeNs}:${after.ctimeNs}:${after.ino}` !== stamp) throw new Error('A source changed while it was being read. Try again after the edit finishes.');
20
+ const hash = digest.digest('hex');
21
+ if (fileHashes.size >= 256) fileHashes.delete(fileHashes.keys().next().value!);
22
+ fileHashes.set(file,{stamp,hash}); return hash;
23
+ }
24
+ export const hashBytes = (bytes: Uint8Array) => createHash('sha256').update(bytes).digest('hex');
25
+
26
+ export function localPath(value: unknown, label: string): asserts value is string {
27
+ if (typeof value !== 'string' || !value || value.includes('\\') || value.startsWith('/') || value.split('/').some(part => !part || part === '.' || part === '..' || part.startsWith('.')) || /[\u0000-\u001f]/.test(value)) throw new Error(`${label} must be a relative local path without hidden files or parent traversal.`);
28
+ }
29
+ /** Refuse symlinks as well as paths outside the owning folder. */
30
+ export function ownedFile(directory: string, name: string) {
31
+ localPath(name, 'File path');
32
+ const base = realpathSync(directory);
33
+ let current = base;
34
+ for (const part of name.split('/')) {
35
+ current = resolve(current, part);
36
+ if (lstatSync(current).isSymbolicLink()) throw new Error('Linked files are not supported. Copy the file into the owning document.');
37
+ }
38
+ const file = realpathSync(current);
39
+ const rel = relative(base, file);
40
+ if (rel === '..' || rel.startsWith(`..${sep}`) || !statSync(file).isFile()) throw new Error('Expected a regular file inside the owning folder.');
41
+ return file;
42
+ }
43
+ export function mediaDirectory(document: string, id: string) {
44
+ if (!mediaId.test(id)) throw new Error('Use a lowercase media folder name with single hyphens.');
45
+ const base = realpathSync(document);
46
+ const dir = resolve(base, 'media', id);
47
+ for (const folder of [resolve(base, 'media'), dir]) if (lstatSync(folder).isSymbolicLink() || !lstatSync(folder).isDirectory()) throw new Error('Media must live in ordinary folders inside its document.');
48
+ return dir;
49
+ }
50
+ export function parseMediaMeta(value: unknown): MediaMeta {
51
+ if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('meta.json must contain a media record.');
52
+ const v = value as Record<string, unknown>;
53
+ const keys = ['title', 'description', 'file', 'kind', 'alt', 'sources', 'data', 'recipe', 'attribution'];
54
+ for (const key of Object.keys(v)) if (!keys.includes(key)) throw new Error(`Unknown media field: ${key}.`);
55
+ for (const key of ['title', 'description']) if (typeof v[key] !== 'string' || !(v[key] as string).trim() || (v[key] as string).length > (key === 'title' ? 200 : 4000)) throw new Error(`Media ${key} must be nonempty text (${key === 'title' ? 200 : 4000} characters maximum).`);
56
+ localPath(v.file, 'Media file');
57
+ if (!['.png', '.jpg', '.jpeg'].includes(extname(v.file).toLowerCase())) throw new Error('The embedding image must be PNG or JPEG. Keep other originals beside it and export a PNG copy.');
58
+ if (!kinds.includes(v.kind as MediaKind)) throw new Error(`Media kind must be ${kinds.join(', ')}.`);
59
+ for (const key of ['alt', 'attribution']) if (v[key] !== undefined && (typeof v[key] !== 'string' || !(v[key] as string).trim())) throw new Error(`Media ${key} must be nonempty text when provided.`);
60
+ for (const key of ['data', 'recipe']) if (v[key] !== undefined) localPath(v[key], `Media ${key}`);
61
+ if (v.sources !== undefined) {
62
+ if (!Array.isArray(v.sources)) throw new Error('Media sources must be a list of provenance notes or locations.');
63
+ for (const source of v.sources) if (typeof source !== 'string' || !source.trim() || source.length > 4000 || /[\u0000-\u001f]/.test(source)) throw new Error('Each source reference must be nonempty text, up to 4,000 characters.');
64
+ if (new Set(v.sources).size !== v.sources.length) throw new Error('Media source references must be unique.');
65
+ }
66
+ return v as unknown as MediaMeta;
67
+ }
68
+ export function imageInfo(bytes: Buffer) {
69
+ if (bytes.length >= 24 && bytes.subarray(0, 8).equals(Buffer.from([137,80,78,71,13,10,26,10])) && bytes.toString('ascii',12,16) === 'IHDR') {
70
+ return checkedImage('image/png', bytes.readUInt32BE(16), bytes.readUInt32BE(20));
71
+ }
72
+ if (bytes[0] === 255 && bytes[1] === 216) {
73
+ let offset = 2;
74
+ while (offset + 4 <= bytes.length) {
75
+ if (bytes[offset++] !== 255) break;
76
+ while (bytes[offset] === 255) offset++;
77
+ const marker = bytes[offset++];
78
+ if (marker === 217 || marker === 218) break;
79
+ if (marker === 1 || (marker >= 208 && marker <= 215)) continue;
80
+ const size = bytes.readUInt16BE(offset);
81
+ if (size < 2 || offset + size > bytes.length) break;
82
+ if ([192,193,194,195,197,198,199,201,202,203,205,206,207].includes(marker) && size >= 7) return checkedImage('image/jpeg',bytes.readUInt16BE(offset+5),bytes.readUInt16BE(offset+3));
83
+ offset += size;
84
+ }
85
+ }
86
+ throw new Error('The image is not a readable PNG or JPEG. Export it again from its original.');
87
+ }
88
+ function checkedImage(mime: string, width: number, height: number) {
89
+ if (!width || !height || width * height > 100_000_000) throw new Error('Media image dimensions must be positive and no more than 100 megapixels.');
90
+ return { mime, width, height };
91
+ }
92
+ export function readMedia(document: string, id: string) {
93
+ const directory = mediaDirectory(document, id);
94
+ const metaFile = ownedFile(directory, 'meta.json');
95
+ if (statSync(metaFile).size > 32_000) throw new Error('Keep media metadata below 32 KB.');
96
+ const meta = parseMediaMeta(JSON.parse(readFileSync(metaFile, 'utf8')));
97
+ const image = ownedFile(directory, meta.file);
98
+ if (statSync(image).size > 50_000_000) throw new Error('Keep an embedding image below 50 MB.');
99
+ const bytes = readFileSync(image);
100
+ const info = imageInfo(bytes);
101
+ if (info.mime !== (extname(meta.file).toLowerCase() === '.png' ? 'image/png' : 'image/jpeg')) throw new Error('The image extension does not match its contents.');
102
+ const inputs: Record<string, string> = Object.create(null);
103
+ for (const path of [meta.data, meta.recipe]) if (path) inputs[`media/${id}/${path}`] = fileHash(ownedFile(directory, path));
104
+ return { directory, meta, image, bytes, ...info, hash: hashBytes(bytes), inputs };
105
+ }
106
+ export interface GenerationRecord { version: 1; imageHash: string; inputs: Record<string,string>; recordedAt: string }
107
+ export function mediaFreshness(media: ReturnType<typeof readMedia>) {
108
+ if (!Object.keys(media.inputs).length) return { freshness: 'original' as const, changedInputs: [] };
109
+ try {
110
+ const file = ownedFile(media.directory, 'generation.json');
111
+ if (statSync(file).size > 64_000) throw new Error('Generation record is too large.');
112
+ const record = JSON.parse(readFileSync(file, 'utf8')) as GenerationRecord;
113
+ if (record.version !== 1 || !record.inputs || typeof record.inputs !== 'object' || Array.isArray(record.inputs) || typeof record.imageHash !== 'string') throw new Error('Invalid generation.json. Regenerate and record this image again.');
114
+ // Older records may include original-source hashes. Those remain historical notes.
115
+ const prefix = `media/${basename(media.directory)}/`;
116
+ const recordedInputs = Object.keys(record.inputs).filter(key => key.startsWith(prefix));
117
+ const changedInputs = [...new Set([...recordedInputs, ...Object.keys(media.inputs)])].filter(key => record.inputs[key] !== media.inputs[key]);
118
+ if (record.imageHash !== media.hash) changedInputs.push(media.meta.file);
119
+ return { freshness: changedInputs.length ? 'stale' as const : 'current' as const, changedInputs };
120
+ } catch (error) {
121
+ if ((error as NodeJS.ErrnoException).code === 'ENOENT') return { freshness: 'unrecorded' as const, changedInputs: [] };
122
+ throw error;
123
+ }
124
+ }
@@ -0,0 +1,63 @@
1
+ import { readFileSync, statSync } from 'node:fs';
2
+ import { Resvg } from '@resvg/resvg-js';
3
+ import { resolve } from 'node:path';
4
+ import { imageInfo, readMedia, mediaFreshness } from './files';
5
+
6
+ type RenderGlobals = typeof globalThis & { __opendocRoot?: string; __opendocDocumentDirectory?: string };
7
+ const globals = globalThis as RenderGlobals;
8
+
9
+ /** The same source and freshness contract serves ordinary media, frames, and page backgrounds. */
10
+ export function readyMedia(item: string) {
11
+ if (!globals.__opendocDocumentDirectory) throw new Error('Media must render inside an OpenDoc document.');
12
+ const asset = readMedia(globals.__opendocDocumentDirectory, item);
13
+ const status = mediaFreshness(asset);
14
+ if (status.freshness === 'stale') throw new Error(`Media "${item}" needs regeneration: ${status.changedInputs.join(', ')} changed. Generate and review the image, then run npx opendoc media record <document> ${item}.`);
15
+ if (status.freshness === 'unrecorded') throw new Error(`Media "${item}" has inputs but no generation record. Generate and review it, then run npx opendoc media record <document> ${item}.`);
16
+ return asset;
17
+ }
18
+
19
+ export const mediaUri = (asset: { mime: string; bytes: Buffer }) => `data:${asset.mime};base64,${asset.bytes.toString('base64')}`;
20
+
21
+ export interface ImageFrameOptions {
22
+ width: number;
23
+ height: number;
24
+ fit?: 'cover' | 'contain';
25
+ /** Crop/alignment: 0 is left/top, 0.5 is center, 1 is right/bottom. */
26
+ position?: { x: number; y: number };
27
+ /** Points; half the side of a square makes a circular image. */
28
+ radius?: number;
29
+ }
30
+
31
+ /** Rasterize only the bounded image frame, never the surrounding PDF text or original file. */
32
+ export function framedMedia(asset: {bytes: Buffer; mime: string; width: number; height: number}, { width, height, fit = 'cover', position = { x: 0.5, y: 0.5 }, radius = 0 }: ImageFrameOptions) {
33
+ if (![width, height].every(value => Number.isFinite(value) && value > 0)) throw new Error('MediaFrame needs positive width and height in points.');
34
+ if (!['cover', 'contain'].includes(fit)) throw new Error('MediaFrame fit must be cover or contain.');
35
+ if (!position || ![position.x, position.y].every(value => Number.isFinite(value) && value >= 0 && value <= 1)) throw new Error('MediaFrame position needs x and y between 0 and 1.');
36
+ if (!Number.isFinite(radius) || radius < 0 || radius > Math.min(width, height) / 2) throw new Error('MediaFrame radius must be between zero and half the shorter side.');
37
+ const scale = (fit === 'cover' ? Math.max : Math.min)(width / asset.width, height / asset.height);
38
+ const w = asset.width * scale, h = asset.height * scale;
39
+ const x = (width - w) * position.x, y = (height - h) * position.y;
40
+ // Authoring resolution keeps this native addon in the installed runtime.
41
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}"><defs><clipPath id="frame"><rect width="${width}" height="${height}" rx="${radius}"/></clipPath></defs><g clip-path="url(#frame)"><image href="${mediaUri(asset)}" x="${x}" y="${y}" width="${w}" height="${h}"/></g></svg>`;
42
+ // 216 dpi at ordinary page sizes, bounded to avoid oversized intermediate bitmaps.
43
+ const outputScale = Math.min(3, 4096 / Math.max(width, height));
44
+ const bytes = new Resvg(svg, { fitTo: { mode: 'width', value: Math.max(1, Math.ceil(width * outputScale)) } }).render().asPng();
45
+ return mediaUri({ mime: 'image/png', bytes });
46
+ }
47
+
48
+ /** Native background paths bypass Forme's normal image resolver. Resolve local files explicitly. */
49
+ export function pageImage(source: string, frame?: ImageFrameOptions) {
50
+ if (/^https?:/i.test(source)) return source;
51
+ if (/^data:/i.test(source)) {
52
+ if (!frame) return source;
53
+ const match = /^data:image\/(?:png|jpeg);base64,(.+)$/is.exec(source);
54
+ if (!match) throw new Error('Proportional page backgrounds need a PNG or JPEG base64 data URI.');
55
+ const bytes = Buffer.from(match[1], 'base64');
56
+ return framedMedia({bytes, ...imageInfo(bytes)}, frame);
57
+ }
58
+ const file = resolve(globals.__opendocDocumentDirectory ?? process.cwd(), source);
59
+ if (statSync(file).size > 50_000_000) throw new Error('Keep a page background image below 50 MB.');
60
+ const bytes = readFileSync(file);
61
+ const asset = { bytes, ...imageInfo(bytes) };
62
+ return frame ? framedMedia(asset, frame) : mediaUri(asset);
63
+ }
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Asset resolver from @formepdf/renderer 0.20.1, dist/resolve.js.
3
+ * Copyright (c) 2026 Daniel Molitor. MIT; see vendor/formepdf/LICENSE.
4
+ * Only TypeScript annotations and formatting differ from upstream. Keeping this
5
+ * narrow module avoids loading the unrelated HTML compiler in every render.
6
+ */
7
+ import { readFile } from 'node:fs/promises';
8
+ import { resolve, extname } from 'node:path';
9
+
10
+ interface AssetNode {
11
+ kind?: { type?: string; src?: unknown };
12
+ children?: AssetNode[];
13
+ }
14
+
15
+ export function uint8ArrayToBase64(bytes: Uint8Array): string {
16
+ return Buffer.from(bytes).toString('base64');
17
+ }
18
+
19
+ /// Resolve font sources to base64 strings for the WASM engine.
20
+ /// File paths are resolved relative to `basePath` (defaults to cwd).
21
+ /// Uint8Array values are base64-encoded. Data URIs pass through as-is.
22
+ export async function resolveFontSources(doc: Record<string, unknown>, basePath?: string): Promise<void> {
23
+ const fonts = doc.fonts as { src?: unknown }[] | undefined;
24
+ if (!fonts?.length) return;
25
+ const baseDir = basePath ?? process.cwd();
26
+ for (const font of fonts) {
27
+ if (font.src instanceof Uint8Array) {
28
+ font.src = uint8ArrayToBase64(font.src);
29
+ } else if (typeof font.src === 'string' && !font.src.startsWith('data:')) {
30
+ const fontPath = resolve(baseDir, font.src);
31
+ const bytes = await readFile(fontPath);
32
+ font.src = uint8ArrayToBase64(new Uint8Array(bytes));
33
+ }
34
+ }
35
+ }
36
+
37
+ const MIME_BY_EXT: Record<string, string> = {
38
+ '.png': 'image/png',
39
+ '.jpg': 'image/jpeg',
40
+ '.jpeg': 'image/jpeg',
41
+ '.gif': 'image/gif',
42
+ '.webp': 'image/webp',
43
+ '.svg': 'image/svg+xml',
44
+ '.bmp': 'image/bmp',
45
+ '.ico': 'image/x-icon',
46
+ '.avif': 'image/avif',
47
+ };
48
+
49
+ /// Resolve image sources — converts HTTP/HTTPS URLs and local file paths to base64 data URIs.
50
+ /// Walks the document tree recursively. File paths are resolved relative to `basePath`.
51
+ export async function resolveImageSources(doc: Record<string, unknown>, basePath?: string): Promise<void> {
52
+ const children = doc.children as AssetNode[] | undefined;
53
+ if (!children?.length) return;
54
+ await Promise.all(children.map((node) => resolveImageSourcesInNode(node, basePath)));
55
+ }
56
+
57
+ async function resolveImageSourcesInNode(node: AssetNode, basePath?: string): Promise<void> {
58
+ const kind = node.kind;
59
+ if (kind?.type === 'Image' && typeof kind.src === 'string') {
60
+ const src = kind.src;
61
+ if (src.startsWith('data:')) {
62
+ // Already a data URI — pass through.
63
+ } else if (src.startsWith('http://') || src.startsWith('https://')) {
64
+ const res = await fetch(src);
65
+ if (!res.ok) throw new Error(`Failed to fetch image: ${src} (${res.status})`);
66
+ const contentType = res.headers.get('content-type') || 'image/png';
67
+ const buf = new Uint8Array(await res.arrayBuffer());
68
+ kind.src = `data:${contentType};base64,${uint8ArrayToBase64(buf)}`;
69
+ } else if (basePath) {
70
+ const filePath = resolve(basePath, src);
71
+ const ext = extname(filePath).toLowerCase();
72
+ const mime = MIME_BY_EXT[ext] || 'application/octet-stream';
73
+ const bytes = await readFile(filePath);
74
+ kind.src = `data:${mime};base64,${uint8ArrayToBase64(new Uint8Array(bytes))}`;
75
+ }
76
+ }
77
+ const children = node.children;
78
+ if (children?.length) await Promise.all(children.map((child) => resolveImageSourcesInNode(child, basePath)));
79
+ }
80
+
81
+ /// Resolve all asset sources (fonts + images) in parallel.
82
+ export async function resolveAllSources(doc: Record<string, unknown>, basePath?: string): Promise<void> {
83
+ await Promise.all([resolveFontSources(doc, basePath), resolveImageSources(doc, basePath)]);
84
+ }
@@ -0,0 +1,2 @@
1
+ export { Fragment, jsxDEV } from 'react/jsx-dev-runtime';
2
+ export type { JSX } from 'react/jsx-dev-runtime';
@@ -0,0 +1,2 @@
1
+ export { Fragment, jsx, jsxs } from 'react/jsx-runtime';
2
+ export type { JSX } from 'react/jsx-runtime';
@@ -0,0 +1,12 @@
1
+ import { createRequire } from 'node:module';
2
+ import { resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+
5
+ /** Code and dependencies belong to the installation; authored files belong to the workspace. */
6
+ export const applicationRoot = fileURLToPath(new URL('../../', import.meta.url));
7
+ export const runtimeRequire = createRequire(new URL('../../package.json', import.meta.url));
8
+ export const runtimeResolve = (specifier: string) => {
9
+ const url = import.meta.resolve(specifier);
10
+ return url.startsWith('file:') ? fileURLToPath(url) : url;
11
+ };
12
+ export const runtimeSource = (path: string) => resolve(applicationRoot, 'src', path);