@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,234 @@
1
+ {
2
+ "basis": "Synthetic data for a design demonstration; not observed work or product performance.",
3
+ "units": {
4
+ "pages": "pages",
5
+ "research": "hours",
6
+ "drafting": "hours",
7
+ "design": "hours",
8
+ "review": "hours"
9
+ },
10
+ "stages": [
11
+ "research",
12
+ "drafting",
13
+ "design",
14
+ "review"
15
+ ],
16
+ "documents": [
17
+ {
18
+ "id": "document-01-1",
19
+ "week": 1,
20
+ "pages": 7,
21
+ "research": 7,
22
+ "drafting": 11,
23
+ "design": 4,
24
+ "review": 5
25
+ },
26
+ {
27
+ "id": "document-01-2",
28
+ "week": 1,
29
+ "pages": 14,
30
+ "research": 10,
31
+ "drafting": 16,
32
+ "design": 8,
33
+ "review": 7
34
+ },
35
+ {
36
+ "id": "document-02-1",
37
+ "week": 2,
38
+ "pages": 10,
39
+ "research": 9,
40
+ "drafting": 14,
41
+ "design": 5,
42
+ "review": 7
43
+ },
44
+ {
45
+ "id": "document-02-2",
46
+ "week": 2,
47
+ "pages": 17,
48
+ "research": 12,
49
+ "drafting": 19,
50
+ "design": 9,
51
+ "review": 9
52
+ },
53
+ {
54
+ "id": "document-03-1",
55
+ "week": 3,
56
+ "pages": 13,
57
+ "research": 11,
58
+ "drafting": 17,
59
+ "design": 6,
60
+ "review": 9
61
+ },
62
+ {
63
+ "id": "document-03-2",
64
+ "week": 3,
65
+ "pages": 20,
66
+ "research": 14,
67
+ "drafting": 22,
68
+ "design": 10,
69
+ "review": 11
70
+ },
71
+ {
72
+ "id": "document-04-1",
73
+ "week": 4,
74
+ "pages": 16,
75
+ "research": 13,
76
+ "drafting": 20,
77
+ "design": 7,
78
+ "review": 11
79
+ },
80
+ {
81
+ "id": "document-04-2",
82
+ "week": 4,
83
+ "pages": 6,
84
+ "research": 5,
85
+ "drafting": 10,
86
+ "design": 11,
87
+ "review": 3
88
+ },
89
+ {
90
+ "id": "document-05-1",
91
+ "week": 5,
92
+ "pages": 19,
93
+ "research": 15,
94
+ "drafting": 8,
95
+ "design": 8,
96
+ "review": 3
97
+ },
98
+ {
99
+ "id": "document-05-2",
100
+ "week": 5,
101
+ "pages": 9,
102
+ "research": 7,
103
+ "drafting": 13,
104
+ "design": 3,
105
+ "review": 5
106
+ },
107
+ {
108
+ "id": "document-06-1",
109
+ "week": 6,
110
+ "pages": 5,
111
+ "research": 6,
112
+ "drafting": 11,
113
+ "design": 9,
114
+ "review": 5
115
+ },
116
+ {
117
+ "id": "document-06-2",
118
+ "week": 6,
119
+ "pages": 12,
120
+ "research": 9,
121
+ "drafting": 16,
122
+ "design": 4,
123
+ "review": 7
124
+ },
125
+ {
126
+ "id": "document-07-1",
127
+ "week": 7,
128
+ "pages": 8,
129
+ "research": 8,
130
+ "drafting": 14,
131
+ "design": 10,
132
+ "review": 7
133
+ },
134
+ {
135
+ "id": "document-07-2",
136
+ "week": 7,
137
+ "pages": 15,
138
+ "research": 11,
139
+ "drafting": 19,
140
+ "design": 5,
141
+ "review": 9
142
+ },
143
+ {
144
+ "id": "document-08-1",
145
+ "week": 8,
146
+ "pages": 11,
147
+ "research": 10,
148
+ "drafting": 17,
149
+ "design": 11,
150
+ "review": 9
151
+ },
152
+ {
153
+ "id": "document-08-2",
154
+ "week": 8,
155
+ "pages": 18,
156
+ "research": 13,
157
+ "drafting": 22,
158
+ "design": 6,
159
+ "review": 11
160
+ },
161
+ {
162
+ "id": "document-09-1",
163
+ "week": 9,
164
+ "pages": 14,
165
+ "research": 12,
166
+ "drafting": 20,
167
+ "design": 3,
168
+ "review": 11
169
+ },
170
+ {
171
+ "id": "document-09-2",
172
+ "week": 9,
173
+ "pages": 4,
174
+ "research": 15,
175
+ "drafting": 10,
176
+ "design": 7,
177
+ "review": 3
178
+ },
179
+ {
180
+ "id": "document-10-1",
181
+ "week": 10,
182
+ "pages": 17,
183
+ "research": 14,
184
+ "drafting": 8,
185
+ "design": 4,
186
+ "review": 3
187
+ },
188
+ {
189
+ "id": "document-10-2",
190
+ "week": 10,
191
+ "pages": 7,
192
+ "research": 6,
193
+ "drafting": 13,
194
+ "design": 8,
195
+ "review": 5
196
+ },
197
+ {
198
+ "id": "document-11-1",
199
+ "week": 11,
200
+ "pages": 20,
201
+ "research": 5,
202
+ "drafting": 11,
203
+ "design": 5,
204
+ "review": 5
205
+ },
206
+ {
207
+ "id": "document-11-2",
208
+ "week": 11,
209
+ "pages": 10,
210
+ "research": 8,
211
+ "drafting": 16,
212
+ "design": 9,
213
+ "review": 7
214
+ },
215
+ {
216
+ "id": "document-12-1",
217
+ "week": 12,
218
+ "pages": 6,
219
+ "research": 7,
220
+ "drafting": 14,
221
+ "design": 6,
222
+ "review": 7
223
+ },
224
+ {
225
+ "id": "document-12-2",
226
+ "week": 12,
227
+ "pages": 13,
228
+ "research": 10,
229
+ "drafting": 19,
230
+ "design": 10,
231
+ "review": 9
232
+ }
233
+ ]
234
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 1,
3
+ "imageHash": "d8c368888bade3f7324c803f41d6b8f0ef42d3a25d42462f78a3f9d3a2bca522",
4
+ "inputs": {
5
+ "media/studio-rhythm/data.json": "f307dc1c2cf822755899b4dc2393e55d66188150dd06d9fedd1f99c8b0a40c97",
6
+ "media/studio-rhythm/recipe.py": "3cd480d879eeffdac2a459b4326431d72d62755999d5f3dfd23cc0ec287d75d1"
7
+ },
8
+ "recordedAt": "2026-09-11T13:32:10.127Z"
9
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "title": "The shape of a working season",
3
+ "description": "Weekly hours by workstream across twelve weeks and twenty-four fictional documents. One stacked area chart, adapted for a presentation from the welcome guide’s synthetic dataset.",
4
+ "file": "image.png",
5
+ "kind": "chart",
6
+ "alt": "A single stacked area chart shows hours per week for research, drafting, design, and review across twelve weeks. Total effort peaks at 100 hours in week three.",
7
+ "sources": [
8
+ "Original synthetic demonstration dataset authored for the OpenDoc welcome document, 11 September 2026. No project activity or product performance was measured."
9
+ ],
10
+ "data": "data.json",
11
+ "recipe": "recipe.py",
12
+ "attribution": "Illustrative data only. This is not an OpenDoc productivity benchmark."
13
+ }
@@ -0,0 +1,49 @@
1
+ """Render one slide-sized chart from the welcome guide's synthetic dataset.
2
+ Run: uv run --with matplotlib python documents/welcome-presentation/media/studio-rhythm/recipe.py
3
+ The prepared data remain unchanged. No actual activity is represented.
4
+ """
5
+ from pathlib import Path
6
+ import json
7
+ import numpy as np
8
+ import matplotlib
9
+ matplotlib.use('Agg')
10
+ import matplotlib.pyplot as plt
11
+ from matplotlib.font_manager import FontProperties, fontManager
12
+ from matplotlib.patches import Patch
13
+
14
+ HERE = Path(__file__).resolve().parent
15
+ ROOT = HERE.parents[3]
16
+ data = json.loads((HERE / 'data.json').read_text())
17
+ for face in ['Regular', 'Semibold']:
18
+ fontManager.addfont(str(ROOT / 'assets/fonts' / f'OpenDocSans-{face}.ttf'))
19
+ regular = FontProperties(fname=ROOT / 'assets/fonts/OpenDocSans-Regular.ttf')
20
+ plt.rcParams.update({'font.family': regular.get_name(), 'font.size': 16,
21
+ 'text.color': '#171A1D', 'axes.labelcolor': '#62686D',
22
+ 'xtick.color': '#62686D', 'ytick.color': '#62686D',
23
+ 'axes.edgecolor': '#D7D7D2', 'axes.linewidth': .7, 'svg.fonttype': 'path'})
24
+ stages = data['stages']
25
+ weeks = np.arange(1, 13)
26
+ values = np.array([[sum(row[stage] for row in data['documents'] if row['week'] == week)
27
+ for week in weeks] for stage in stages])
28
+ palette = ['#D4D0C7', '#969DA5', '#30363C', '#3758F9']
29
+ fig = plt.figure(figsize=(14.4, 5), facecolor='white')
30
+ ax = fig.add_axes([.058, .22, .922, .64])
31
+ ax.stackplot(weeks, values, colors=palette, linewidth=.8, edgecolor='white')
32
+ ax.set_xlim(1, 12)
33
+ ax.set_ylim(0, 110)
34
+ ax.set_yticks([0, 25, 50, 75, 100])
35
+ ax.set_xticks(weeks, [f'W{i:02}' for i in weeks])
36
+ ax.tick_params(length=0, pad=9, labelsize=15)
37
+ ax.grid(axis='y', color='#D7D7D2', linewidth=.6)
38
+ ax.set_axisbelow(True)
39
+ for side in ['top', 'right', 'left']:
40
+ ax.spines[side].set_visible(False)
41
+ fig.text(.058, .936, 'Hours per week', fontsize=16, color='#62686D')
42
+ fig.legend(handles=[Patch(facecolor=color, label=stage.capitalize()) for stage, color in zip(stages, palette)],
43
+ loc='lower center', bbox_to_anchor=(.52, .012), ncol=4, frameon=False,
44
+ fontsize=16, handlelength=1.1, handleheight=.7, columnspacing=3)
45
+ fig.savefig(HERE / 'image.png', dpi=300, facecolor='white')
46
+ fig.savefig(HERE / 'chart.svg', facecolor='white')
47
+ plt.close(fig)
48
+ print(json.dumps({'documents':len(data['documents']), 'weeks':len(weeks),
49
+ 'hours':int(values.sum()), 'workstreams':dict(zip(stages,map(int,values.sum(axis=1))))},indent=2))
@@ -0,0 +1,5 @@
1
+ import { theme as base } from '../../themes/opendoc-neutral';
2
+ import { withDocumentAssets, type DocumentAssets } from 'opendoc/assets';
3
+ import assets from './assets.json';
4
+
5
+ export const theme = withDocumentAssets(base, assets as DocumentAssets);
@@ -0,0 +1,17 @@
1
+ {
2
+ "version": 1,
3
+ "projects": [
4
+ {
5
+ "id": "getting-started",
6
+ "name": "Getting started",
7
+ "defaultTheme": "neutral"
8
+ }
9
+ ],
10
+ "assignments": {
11
+ "welcome": "getting-started",
12
+ "welcome-presentation": "getting-started"
13
+ },
14
+ "formats": {
15
+ "welcome-presentation": "presentation"
16
+ }
17
+ }
@@ -0,0 +1,9 @@
1
+ # Working with templates
2
+
3
+ Treat every template as a soft foundation for the document being created. It offers a useful starting composition and design intent, with room for variation and creativity. Let the actual content, reader, and purpose guide the result; use judgment rather than trying to reproduce the specimen exactly.
4
+
5
+ Typography, spacing, margins, image proportions, and placement are starting values. For example, reduce the title size when a long headline overwhelms the opening; rebalance its surrounding space, or adjust the reading measure when the material benefits. Optional elements can be omitted, moved, or adapted. Preserve a coherent hierarchy and readable flow, not every original measurement. Routine design adjustments within the user's brief do not need additional approval.
6
+
7
+ Keep document-specific adaptations local to that document or a local layout variant. If a small shared option is useful, preserve existing defaults so other documents do not change accidentally. Do not add a generalized layout engine or automatic fitting machinery for a simple design adjustment.
8
+
9
+ Distinguish design guidance from functional requirements. Native Forme flow, stable block IDs, accurate evidence, validated data contracts where applicable, and preservation of unrelated documents remain requirements. Review the rendered result after adapting it. Each template's guidance should explain its character and useful defaults while making this freedom explicit.
@@ -0,0 +1,14 @@
1
+ import type { ReactNode } from 'react';
2
+ import * as F from '@formepdf/react';
3
+ import { Block } from 'opendoc';
4
+ import type { DocTheme } from 'opendoc/themes';
5
+
6
+ /** Replace the placeholder with supplied artwork, or pass null to omit the slot. */
7
+ export function BusinessLogo({ id, theme, children }: { id: string; theme: DocTheme; children?: ReactNode }) {
8
+ if (children === null || children === false) return null;
9
+ return <Block id={id} style={{ width: 88, alignItems: 'flex-end' }}>
10
+ {children === undefined ? <F.View wrap={false} style={{ width: 88, height: 28, borderWidth: 0.6, borderColor: theme.line, alignItems: 'center', justifyContent: 'center' }}>
11
+ <F.Text style={{ fontSize: 8, letterSpacing: 1.2, color: theme.muted }}>YOUR LOGO</F.Text>
12
+ </F.View> : children}
13
+ </Block>;
14
+ }
@@ -0,0 +1,40 @@
1
+ import * as F from '@formepdf/react';
2
+ import { TextSlot, Block, DataTable } from 'opendoc';
3
+ import type { DocTheme } from 'opendoc/themes';
4
+ import { calculatePricing, money, unitPriceMinor, type PricingData } from './commerce';
5
+
6
+ export function Pricing({ id = 'pricing', data, theme, totalLabel = 'Total', paymentReceived }: { id?: string; data: PricingData; theme: DocTheme; totalLabel?: string; paymentReceived?: bigint }) {
7
+ const totals = calculatePricing(data);
8
+ if (paymentReceived !== undefined && (paymentReceived < 0n || paymentReceived > totals.totalMinor)) throw new Error('Received payment must be between zero and the total.');
9
+ const amounts = [
10
+ ['Subtotal', totals.subtotalMinor],
11
+ ...(data.discount === undefined ? [] : [['Discount', -totals.discountMinor] as const]),
12
+ ...(data.tax ? [[`${data.tax.label} (${data.tax.ratePercent}%)`, totals.taxMinor] as const] : []),
13
+ [totalLabel, totals.totalMinor],
14
+ ...(paymentReceived === undefined ? [] : [['Payments received', -paymentReceived], ['Amount due', totals.totalMinor - paymentReceived]] as const),
15
+ ] as const;
16
+ return <>
17
+ <DataTable id={`${id}-items`} columns={[
18
+ { label: 'Description', width: 3.2 }, { label: 'Qty / unit', width: 1.1, align: 'right' },
19
+ { label: `Unit price (${data.currency.code})`, width: 1.6, align: 'right' }, { label: `Amount (${data.currency.code})`, width: 1.7, align: 'right' },
20
+ ]} rowIds={totals.items.map(item => item.id)} rows={totals.items.map(item => [
21
+ <TextSlot slot={`item-${item.id.length}-${item.id}-description`} field={['pricing', 'items', { id: item.id }, 'description']}>{item.description}</TextSlot>,
22
+ <TextSlot slot={`item-${item.id.length}-${item.id}-quantity-unit`}><TextSlot slot="quantity" reason="Calculated input—ask your agent to change quantities.">{item.quantity}</TextSlot>{item.unit ? <> <TextSlot slot="unit" field={['pricing', 'items', { id: item.id }, 'unit']}>{item.unit}</TextSlot></> : ''}</TextSlot>,
23
+ money(unitPriceMinor(item, data.currency), data.currency, false), money(item.amountMinor, data.currency, false),
24
+ ])} />
25
+ <Block id={`${id}-totals`} style={{ flexDirection: 'row', justifyContent: 'flex-end', marginBottom: 18 }}><F.View wrap={false} style={{ width: 260 }}>
26
+ {amounts.map(([label, amount], index) => {
27
+ const final = index === amounts.length - 1;
28
+ const taxRow = data.tax && index === 1 + (data.discount === undefined ? 0 : 1);
29
+ const textStyle: F.Style = {
30
+ fontSize: final ? 12 : 10, fontWeight: final ? 600 : 400,
31
+ ...theme.design?.table?.text, ...(final ? theme.design?.table?.headerText : undefined),
32
+ };
33
+ return <F.View key={label} style={{ paddingTop: 8, paddingBottom: 8, borderTopWidth: final ? 0.8 : 0, borderColor: theme.line, ...theme.design?.table?.cell, ...(final ? theme.design?.table?.header : undefined), flexDirection: 'row', gap: 12 }}>
34
+ <F.Text style={{ ...textStyle, flex: 1 }}>{taxRow ? <><TextSlot slot="tax-label" field={['pricing', 'tax', 'label']}>{data.tax!.label}</TextSlot> ({data.tax!.ratePercent}%)</> : label}</F.Text>
35
+ <F.Text style={{ ...textStyle, textAlign: 'right' }}><TextSlot slot={`amount-${index}`} reason="Calculated value—ask your agent to change its inputs.">{amount < 0n ? '−' : ''}{money(amount < 0n ? -amount : amount, data.currency)}</TextSlot></F.Text>
36
+ </F.View>;
37
+ })}
38
+ </F.View></Block>
39
+ </>;
40
+ }
@@ -0,0 +1,93 @@
1
+ export function object(value: unknown, allowed: string[], path: string): Record<string, unknown> {
2
+ if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error(`${path}: expected an object.`);
3
+ for (const key of Object.keys(value)) if (!allowed.includes(key)) throw new Error(`${path}.${key}: unknown field.`);
4
+ return value as Record<string, unknown>;
5
+ }
6
+ export function text(value: unknown, path: string, max = 5000, maxLines = Infinity): string {
7
+ if (typeof value !== 'string' || !value.trim() || value.trim().length > max) throw new Error(`${path}: use nonempty text of at most ${max} characters.`);
8
+ if (value.trim().split(/\r\n|\r|\n/).length > maxLines) throw new Error(`${path}: use at most ${maxLines} supplied lines so this field fits its layout.`);
9
+ return value.trim();
10
+ }
11
+ export function optionalText(value: unknown, path: string, max = 5000, maxLines = Infinity) {
12
+ return value === undefined || value === null ? undefined : text(value, path, max, maxLines);
13
+ }
14
+ export function date(value: unknown, path: string): string {
15
+ const input = text(value, path, 10);
16
+ const parsed = new Date(`${input}T00:00:00Z`);
17
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(input) || input.startsWith('0000') || !Number.isFinite(parsed.getTime()) || parsed.toISOString().slice(0, 10) !== input) throw new Error(`${path}: use a real date in YYYY-MM-DD format.`);
18
+ return input;
19
+ }
20
+ function decimal(value: unknown, places: number, path: string, positive = false, integerDigits = 9): string {
21
+ if (typeof value !== 'string' || !new RegExp(`^(0|[1-9][0-9]{0,${integerDigits - 1}})${places ? `(\\.[0-9]{1,${places}})?` : ''}$`).test(value)) throw new Error(`${path}: use a nonnegative decimal string with at most ${integerDigits} integer digits and ${places} decimal places.`);
22
+ if (positive && scaled(value, places) === 0n) throw new Error(`${path}: must be greater than zero.`);
23
+ return value;
24
+ }
25
+ function scaled(value: string, places: number): bigint {
26
+ const [whole, fraction = ''] = value.split('.');
27
+ return BigInt(whole) * 10n ** BigInt(places) + BigInt(fraction.padEnd(places, '0') || '0');
28
+ }
29
+ const roundHalfUp = (value: bigint, divisor: bigint) => (value + divisor / 2n) / divisor;
30
+ export interface PricingData {
31
+ currency: { code: string; decimals: number };
32
+ items: { id: string; description: string; quantity: string; unit?: string; unitPrice: string }[];
33
+ discount?: string;
34
+ tax?: { label: string; ratePercent: string };
35
+ }
36
+
37
+ export function parsePricing(input: unknown): PricingData {
38
+ const value = object(input, ['currency', 'items', 'discount', 'tax'], 'pricing');
39
+ const currency = object(value.currency, ['code', 'decimals'], 'pricing.currency');
40
+ if (typeof currency.code !== 'string' || !/^[A-Z]{3}$/.test(currency.code)) throw new Error('pricing.currency.code: supply a three-letter uppercase currency code.');
41
+ if (typeof currency.decimals !== 'number' || !Number.isInteger(currency.decimals) || currency.decimals < 0 || currency.decimals > 3) throw new Error('pricing.currency.decimals: supply 0, 1, 2, or 3 explicitly.');
42
+ const places = currency.decimals;
43
+ if (!Array.isArray(value.items) || !value.items.length || value.items.length > 500) throw new Error('pricing.items: supply 1–500 line items.');
44
+ const seen = new Set<string>();
45
+ const items = value.items.map((raw, i) => {
46
+ const path = `pricing.items[${i}]`;
47
+ const item = object(raw, ['id', 'description', 'quantity', 'unit', 'unitPrice'], path);
48
+ const id = text(item.id, `${path}.id`, 100);
49
+ if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(id) || seen.has(id)) throw new Error(`${path}.id: supply a unique stable ID with letters, numbers, dots, underscores, or hyphens.`);
50
+ seen.add(id);
51
+ return { id, description: text(item.description, `${path}.description`, 600, 8), quantity: decimal(item.quantity, 3, `${path}.quantity`, true), unit: optionalText(item.unit, `${path}.unit`, 24, 1), unitPrice: decimal(item.unitPrice, places, `${path}.unitPrice`) };
52
+ });
53
+ let tax: PricingData['tax'];
54
+ if (value.tax !== undefined && value.tax !== null) {
55
+ const rate = object(value.tax, ['label', 'ratePercent'], 'pricing.tax');
56
+ const ratePercent = decimal(rate.ratePercent, 2, 'pricing.tax.ratePercent');
57
+ if (scaled(ratePercent, 2) > 10000n) throw new Error('pricing.tax.ratePercent: use a rate from 0 to 100.');
58
+ tax = { label: text(rate.label, 'pricing.tax.label', 60, 1), ratePercent };
59
+ }
60
+ const result: PricingData = { currency: { code: currency.code, decimals: places }, items, discount: value.discount === undefined || value.discount === null ? undefined : decimal(value.discount, places, 'pricing.discount'), tax };
61
+ calculatePricing(result);
62
+ return result;
63
+ }
64
+
65
+ /** Integer arithmetic: round each line, then tax the discounted subtotal, half up. */
66
+ export function calculatePricing(data: PricingData) {
67
+ const items = data.items.map(item => ({ ...item, amountMinor: roundHalfUp(scaled(item.quantity, 3) * scaled(item.unitPrice, data.currency.decimals), 1000n) }));
68
+ const subtotalMinor = items.reduce((sum, item) => sum + item.amountMinor, 0n);
69
+ const discountMinor = scaled(data.discount ?? '0', data.currency.decimals);
70
+ if (discountMinor > subtotalMinor) throw new Error('pricing.discount: cannot exceed the subtotal.');
71
+ const netMinor = subtotalMinor - discountMinor;
72
+ const taxMinor = data.tax ? roundHalfUp(netMinor * scaled(data.tax.ratePercent, 2), 10000n) : 0n;
73
+ const totalMinor = netMinor + taxMinor;
74
+ if (subtotalMinor > BigInt(Number.MAX_SAFE_INTEGER) || totalMinor > BigInt(Number.MAX_SAFE_INTEGER)) throw new Error('pricing: total exceeds the supported amount range.');
75
+ return { items, subtotalMinor, discountMinor, netMinor, taxMinor, totalMinor };
76
+ }
77
+
78
+ export function money(minor: bigint, currency: PricingData['currency'], includeCode = true) {
79
+ const scale = 10n ** BigInt(currency.decimals);
80
+ const whole = (minor / scale).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
81
+ const fraction = currency.decimals ? `.${(minor % scale).toString().padStart(currency.decimals, '0')}` : '';
82
+ return `${includeCode ? `${currency.code} ` : ''}${whole}${fraction}`;
83
+ }
84
+ export function unitPriceMinor(item: PricingData['items'][number], currency: PricingData['currency']) {
85
+ return scaled(item.unitPrice, currency.decimals);
86
+ }
87
+
88
+ /** A supplied payment may cover the complete calculated total, not just one unit price. */
89
+ export function paymentMinor(input: unknown, currency: PricingData['currency'], path: string): bigint {
90
+ const value = scaled(decimal(input, currency.decimals, path, false, 16), currency.decimals);
91
+ if (value > BigInt(Number.MAX_SAFE_INTEGER)) throw new Error(`${path}: amount exceeds the supported range.`);
92
+ return value;
93
+ }
@@ -0,0 +1,32 @@
1
+ # Brand guidelines
2
+
3
+ An identity handbook with the rhythm of a design presentation: oversized type, generous image fields, opposing mark variants, annotated specimens, contact sheets, and application galleries. Neutral is the catalog appearance, not a proposed brand. Every bracketed text or artwork area is a replaceable placeholder. Never turn these prompts into invented company facts, approved rules, or licensing claims.
4
+
5
+ ## Structure and useful variations
6
+
7
+ The eighteen-slide starter moves from purpose, voice, and visual world to marks, measured usage, color, accessibility, typography, imagery, graphic language, applications, and ownership. This is an adaptable collection, not a required outline. A small identity may omit motion, physical applications, or alternate marks. A complex one may add subbrands, partnerships, multilingual specimens, packaging, data visualization, or motion sequences as separate slides.
8
+
9
+ Show real examples beside rules. A clear-space page needs an approved annotated diagram and actual measurements, not a decorative grid mistaken for a specification. The sample swatch widths are a composition, not palette ratios. Display the verified color values for every medium the brand uses. Record actual tested text/background combinations, their sizes and target standard; a dark/light specimen is not an accessibility certification. Use written labels or other cues alongside color.
10
+
11
+ The image-rich spreads should do different jobs: the expression board communicates a world; photography defines the point of view; crop variants preserve the subject across formats; application galleries show the system operating. Replace image briefs with meaning-bearing artwork and retain concise captions explaining the choices. The graphics slide supports icons, illustration, pattern, or a static motion storyboard only when relevant.
12
+
13
+ Typography and geometry are starting values. A long title receives an explicit smaller opening size; shorten further or adapt its field when needed. Rebalance an image or omit an optional caption when the material benefits. Each slide remains one 960 × 540 page; preserve stable slide and component IDs when reordering. `BrandText` binds its caller's `children` through `TextSlot`, so edits belong to the instance. All visible starter copy is local; the shared layout has no brand argument or rule set.
14
+
15
+ ## Artwork and appearance
16
+
17
+ `BrandImage` accepts `image={{item:'document-media-id',fit:'cover',position:{x:0.5,y:0.5}}}` for managed `MediaFrame` artwork. Use `fit:'contain'` for a diagram or mark that must remain complete. A missing image is intentional; a supplied missing media item must fail. Import and review document-owned images according to [Media](../../docs/MEDIA.md), keeping provenance and original source records.
18
+
19
+ Reusable logos belong in the shared [asset library](../../docs/ASSETS.md). After binding the intended family/version, use `logo={{variation:'approved-variation'}}` or `logo={{name:'partner',variation:'approved-variation'}}`. Bind the correct light/dark variation for the actual PDF surface. The template does not recolor, distort, or fabricate a logo. Choose either `image` or `logo` for a slot. Saved fonts come from the instance's generated theme adapter; retain that import and `assets.json`.
20
+
21
+ The starter passes its caller's theme into every slide and specimen. Its presentation sizes are deliberately local, while font family, semantic title styling, paper, line, and ink follow the theme. Catalog imagery remains empty because a generic brand manual should not imply ownership of stock pictures or resemble an existing brand.
22
+
23
+ ## Research and rationale
24
+
25
+ Reviewed official sources on 11 September 2026. These sources inform the categories and the usefulness of the skeleton; their own brand-specific aesthetic rules are not imposed on another brand.
26
+
27
+ - [Adobe Express: How to create brand guidelines](https://www.adobe.com/uk/express/discover/examples/brand-guidelines) covers brand foundations, approved logo variations, color specifications, typography, image/icon guidance, and voice. This informed the foundation-to-application coverage and the paired voice example. Its mood-board and contextual-example guidance informed the expression board.
28
+ - [IBM Design Language: Color](https://www.ibm.com/design/language/color/) treats colors as roles and discusses contrast, background variations, and avoiding reliance on color alone. This informed the role-based palette specimen and a separate evidence-oriented pairing page, without claiming the placeholders meet a specific standard.
29
+ - [IBM Design Language: Photography tips and techniques](https://www.ibm.com/design/language/photography/tips-and-techniques/) explains perspective, framing, focal points, aspect ratio, lighting, and purposeful imagery. This informed separate art-direction and crop compositions. IBM's specific lens, lighting, and filter preferences remain IBM's rules; authors supply the rules for their own identity.
30
+ - [IBM Design Language: Resources](https://www.ibm.com/design/language/resources/) connects identity components to source tools, font repositories, logo permissions, photography, and motion resources. This informed a practical handoff slide with asset access, ownership, permissions, versions, and a review path.
31
+
32
+ Review every native PDF slide, including labels and the final ownership slide, after replacing copy or images. Check actual crop visibility, text extraction, image contrast, and the intended variant on its background. Keep catalog specimens and acceptance fixtures outside the user document library.
@@ -0,0 +1,62 @@
1
+ import type { ReactNode } from 'react';
2
+ import * as F from '@formepdf/react';
3
+ import { Block, Logo, MediaFrame, Presentation, Slide, TextSlot, type ImageFrameOptions } from 'opendoc';
4
+ import { themeType, type DocTheme } from 'opendoc/themes';
5
+
6
+ export type BrandImageSource = Pick<ImageFrameOptions, 'fit' | 'position' | 'radius'> & { item: string; alt?: string };
7
+ export type BrandBox = { x: number; y: number; w: number; h: number };
8
+ const position = ({ x, y, w, h }: BrandBox): F.Style => ({ position: 'absolute', left: x, top: y, width: w, height: h });
9
+
10
+ /** A presentation made from independent, reorderable brand-system compositions. */
11
+ export function BrandGuidelines(props: Parameters<typeof Presentation>[0]) { return <Presentation {...props}/>; }
12
+
13
+ export function BrandSlide({ id, theme, section, folio, dark = false, children }: {
14
+ id: string; theme: DocTheme; section: ReactNode; folio: ReactNode; dark?: boolean; children: ReactNode;
15
+ }) {
16
+ return <Slide id={id} padding={0} style={{ backgroundColor: dark ? theme.ink : theme.paper, lineBreaking: 'greedy' }}>
17
+ <Block id={`${id}-section`} style={{...position({x:40,y:26,w:800,h:25}),overflow:'hidden'}}><F.Text style={{...themeType(theme,'label'),fontSize:11,fontWeight:400,color:dark?theme.paper:theme.muted,lineHeight:1.2,margin:0}}><TextSlot slot="section" from="section">{section}</TextSlot></F.Text></Block>
18
+ <Block id={`${id}-folio`} style={{...position({x:870,y:26,w:50,h:25}),overflow:'hidden'}}><F.Text style={{fontFamily:theme.body,fontSize:11,fontWeight:400,color:dark?theme.paper:theme.muted,lineHeight:1.2,margin:0,textAlign:'right'}}><TextSlot slot="folio" from="folio">{folio}</TextSlot></F.Text></Block>
19
+ {children}
20
+ </Slide>;
21
+ }
22
+
23
+ /** Text stays native and binds to the instance's children, including direct JSX text. */
24
+ export function BrandText({ id, theme, x, y, w, h, children, size = 18, role = 'body', color, align = 'left', weight, leading = 1.2 }: BrandBox & {
25
+ id: string; theme: DocTheme; children: ReactNode; size?: number; role?: 'body' | 'title' | 'label';
26
+ color?: string; align?: 'left' | 'center' | 'right'; weight?: 400 | 600 | 700; leading?: number;
27
+ }) {
28
+ const type = role === 'title' ? themeType(theme, 'h1') : role === 'label' ? themeType(theme, 'label') : { fontFamily: theme.body };
29
+ return <Block id={id} style={{...position({ x, y, w, h }), overflow:'hidden'}}>
30
+ <F.Text style={{ ...type, fontSize: size, fontWeight: weight ?? (role === 'title' ? 600 : 400), color: color ?? theme.ink, lineHeight: leading, margin: 0, textAlign: align }}>
31
+ <TextSlot slot="text" from="children">{children}</TextSlot>
32
+ </F.Text>
33
+ </Block>;
34
+ }
35
+
36
+ /** Supplied artwork must be valid managed media. No image means an intentional visual brief. */
37
+ export function BrandImage({ id, theme, x, y, w, h, image, logo, label, detail, dark = false }: BrandBox & {
38
+ id: string; theme: DocTheme; image?: BrandImageSource; logo?: { name?: string; variation?: string; alt?: string };
39
+ label: ReactNode; detail?: ReactNode; dark?: boolean;
40
+ }) {
41
+ if (image && logo) throw new Error(`Brand image ${id}: choose managed media or a bound logo, not both.`);
42
+ const background = dark ? theme.ink : theme.line;
43
+ const foreground = dark ? theme.paper : theme.ink;
44
+ return <Block id={id} style={position({ x, y, w, h })}>
45
+ {image ? <MediaFrame {...image} width={w} height={h}/> : logo ? <F.View style={{ width:w, height:h, backgroundColor:background, alignItems:'center', justifyContent:'center', padding:24 }}><Logo {...logo} width={w-48} height={h-48}/></F.View> : <F.View style={{width:w,height:h,backgroundColor:background,borderWidth:0.5,borderColor:dark?theme.muted:theme.line}}>
46
+ <F.View style={{position:'absolute',left:16,top:16,width:18,height:18,borderLeftWidth:1,borderTopWidth:1,borderColor:foreground}}/>
47
+ <F.View style={{position:'absolute',left:w-34,top:h-34,width:18,height:18,borderRightWidth:1,borderBottomWidth:1,borderColor:foreground}}/>
48
+ <F.View style={{position:'absolute',left:24,top:h/2-25,width:w-48,height:50,justifyContent:'center',overflow:'hidden'}}>
49
+ <F.Text style={{fontFamily:theme.heading,fontSize:w<190?16:22,fontWeight:400,color:foreground,textAlign:'center',lineHeight:1.15}}><TextSlot slot="label" from="label">{label}</TextSlot></F.Text>
50
+ </F.View>
51
+ {detail && <F.View style={{position:'absolute',left:20,top:h-43,width:w-40,height:30,overflow:'hidden'}}><F.Text style={{fontFamily:theme.body,fontSize:10,color:foreground,textAlign:'center',lineHeight:1.2}}><TextSlot slot="detail" from="detail">{detail}</TextSlot></F.Text></F.View>}
52
+ </F.View>}
53
+ </Block>;
54
+ }
55
+
56
+ export function BrandPanel({ theme, x, y, w, h, color, outline = false }: BrandBox & { theme: DocTheme; color?: string; outline?: boolean }) {
57
+ return <F.View style={{...position({x,y,w,h}),backgroundColor:color ?? theme.paper,...(outline?{borderWidth:1,borderColor:theme.muted}:{})}}/>;
58
+ }
59
+
60
+ export function BrandRule({ theme, x, y, w, color }: { theme: DocTheme; x:number; y:number; w:number; color?:string }) {
61
+ return <F.View style={{position:'absolute',left:x,top:y,width:w,height:1,backgroundColor:color??theme.line}}/>;
62
+ }