@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,241 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "title": "Website content services",
4
+ "number": "SAMPLE-INV-001",
5
+ "issuedOn": "2026-09-08",
6
+ "dueOn": "2026-09-22",
7
+ "reference": "SAMPLE-Q-001",
8
+ "seller": {
9
+ "name": "Example Studio",
10
+ "details": "Studio address placeholder\nContact details placeholder"
11
+ },
12
+ "customer": {
13
+ "name": "Example Client",
14
+ "details": "Client address placeholder\nAttention: project contact"
15
+ },
16
+ "synthetic": true,
17
+ "pricing": {
18
+ "currency": {
19
+ "code": "USD",
20
+ "decimals": 2
21
+ },
22
+ "items": [
23
+ {
24
+ "id": "service-1",
25
+ "description": "Illustrative service 1: preparation, delivery, and review of a clearly described item for this example.",
26
+ "quantity": "2.5",
27
+ "unit": "hours",
28
+ "unitPrice": "160.00"
29
+ },
30
+ {
31
+ "id": "service-2",
32
+ "description": "Illustrative service 2: preparation, delivery, and review of a clearly described item for this example.",
33
+ "quantity": "2.5",
34
+ "unit": "hours",
35
+ "unitPrice": "160.00"
36
+ },
37
+ {
38
+ "id": "service-3",
39
+ "description": "Illustrative service 3: preparation, delivery, and review of a clearly described item for this example.",
40
+ "quantity": "2.5",
41
+ "unit": "hours",
42
+ "unitPrice": "160.00"
43
+ },
44
+ {
45
+ "id": "service-4",
46
+ "description": "Illustrative service 4: preparation, delivery, and review of a clearly described item for this example.",
47
+ "quantity": "2.5",
48
+ "unit": "hours",
49
+ "unitPrice": "160.00"
50
+ },
51
+ {
52
+ "id": "service-5",
53
+ "description": "Illustrative service 5: preparation, delivery, and review of a clearly described item for this example.",
54
+ "quantity": "2.5",
55
+ "unit": "hours",
56
+ "unitPrice": "160.00"
57
+ },
58
+ {
59
+ "id": "service-6",
60
+ "description": "Illustrative service 6: preparation, delivery, and review of a clearly described item for this example.",
61
+ "quantity": "2.5",
62
+ "unit": "hours",
63
+ "unitPrice": "160.00"
64
+ },
65
+ {
66
+ "id": "service-7",
67
+ "description": "Illustrative service 7: preparation, delivery, and review of a clearly described item for this example.",
68
+ "quantity": "2.5",
69
+ "unit": "hours",
70
+ "unitPrice": "160.00"
71
+ },
72
+ {
73
+ "id": "service-8",
74
+ "description": "Illustrative service 8: preparation, delivery, and review of a clearly described item for this example.",
75
+ "quantity": "2.5",
76
+ "unit": "hours",
77
+ "unitPrice": "160.00"
78
+ },
79
+ {
80
+ "id": "service-9",
81
+ "description": "Illustrative service 9: preparation, delivery, and review of a clearly described item for this example.",
82
+ "quantity": "2.5",
83
+ "unit": "hours",
84
+ "unitPrice": "160.00"
85
+ },
86
+ {
87
+ "id": "service-10",
88
+ "description": "Illustrative service 10: preparation, delivery, and review of a clearly described item for this example.",
89
+ "quantity": "2.5",
90
+ "unit": "hours",
91
+ "unitPrice": "160.00"
92
+ },
93
+ {
94
+ "id": "service-11",
95
+ "description": "Illustrative service 11: preparation, delivery, and review of a clearly described item for this example.",
96
+ "quantity": "2.5",
97
+ "unit": "hours",
98
+ "unitPrice": "160.00"
99
+ },
100
+ {
101
+ "id": "service-12",
102
+ "description": "Illustrative service 12: preparation, delivery, and review of a clearly described item for this example.",
103
+ "quantity": "2.5",
104
+ "unit": "hours",
105
+ "unitPrice": "160.00"
106
+ },
107
+ {
108
+ "id": "service-13",
109
+ "description": "Illustrative service 13: preparation, delivery, and review of a clearly described item for this example.",
110
+ "quantity": "2.5",
111
+ "unit": "hours",
112
+ "unitPrice": "160.00"
113
+ },
114
+ {
115
+ "id": "service-14",
116
+ "description": "Illustrative service 14: preparation, delivery, and review of a clearly described item for this example.",
117
+ "quantity": "2.5",
118
+ "unit": "hours",
119
+ "unitPrice": "160.00"
120
+ },
121
+ {
122
+ "id": "service-15",
123
+ "description": "Illustrative service 15: preparation, delivery, and review of a clearly described item for this example.",
124
+ "quantity": "2.5",
125
+ "unit": "hours",
126
+ "unitPrice": "160.00"
127
+ },
128
+ {
129
+ "id": "service-16",
130
+ "description": "Illustrative service 16: preparation, delivery, and review of a clearly described item for this example.",
131
+ "quantity": "2.5",
132
+ "unit": "hours",
133
+ "unitPrice": "160.00"
134
+ },
135
+ {
136
+ "id": "service-17",
137
+ "description": "Illustrative service 17: preparation, delivery, and review of a clearly described item for this example.",
138
+ "quantity": "2.5",
139
+ "unit": "hours",
140
+ "unitPrice": "160.00"
141
+ },
142
+ {
143
+ "id": "service-18",
144
+ "description": "Illustrative service 18: preparation, delivery, and review of a clearly described item for this example.",
145
+ "quantity": "2.5",
146
+ "unit": "hours",
147
+ "unitPrice": "160.00"
148
+ },
149
+ {
150
+ "id": "service-19",
151
+ "description": "Illustrative service 19: preparation, delivery, and review of a clearly described item for this example.",
152
+ "quantity": "2.5",
153
+ "unit": "hours",
154
+ "unitPrice": "160.00"
155
+ },
156
+ {
157
+ "id": "service-20",
158
+ "description": "Illustrative service 20: preparation, delivery, and review of a clearly described item for this example.",
159
+ "quantity": "2.5",
160
+ "unit": "hours",
161
+ "unitPrice": "160.00"
162
+ },
163
+ {
164
+ "id": "service-21",
165
+ "description": "Illustrative service 21: preparation, delivery, and review of a clearly described item for this example.",
166
+ "quantity": "2.5",
167
+ "unit": "hours",
168
+ "unitPrice": "160.00"
169
+ },
170
+ {
171
+ "id": "service-22",
172
+ "description": "Illustrative service 22: preparation, delivery, and review of a clearly described item for this example.",
173
+ "quantity": "2.5",
174
+ "unit": "hours",
175
+ "unitPrice": "160.00"
176
+ },
177
+ {
178
+ "id": "service-23",
179
+ "description": "Illustrative service 23: preparation, delivery, and review of a clearly described item for this example.",
180
+ "quantity": "2.5",
181
+ "unit": "hours",
182
+ "unitPrice": "160.00"
183
+ },
184
+ {
185
+ "id": "service-24",
186
+ "description": "Illustrative service 24: preparation, delivery, and review of a clearly described item for this example.",
187
+ "quantity": "2.5",
188
+ "unit": "hours",
189
+ "unitPrice": "160.00"
190
+ },
191
+ {
192
+ "id": "service-25",
193
+ "description": "Illustrative service 25: preparation, delivery, and review of a clearly described item for this example.",
194
+ "quantity": "2.5",
195
+ "unit": "hours",
196
+ "unitPrice": "160.00"
197
+ },
198
+ {
199
+ "id": "service-26",
200
+ "description": "Illustrative service 26: preparation, delivery, and review of a clearly described item for this example.",
201
+ "quantity": "2.5",
202
+ "unit": "hours",
203
+ "unitPrice": "160.00"
204
+ },
205
+ {
206
+ "id": "service-27",
207
+ "description": "Illustrative service 27: preparation, delivery, and review of a clearly described item for this example.",
208
+ "quantity": "2.5",
209
+ "unit": "hours",
210
+ "unitPrice": "160.00"
211
+ },
212
+ {
213
+ "id": "service-28",
214
+ "description": "Illustrative service 28: preparation, delivery, and review of a clearly described item for this example.",
215
+ "quantity": "2.5",
216
+ "unit": "hours",
217
+ "unitPrice": "160.00"
218
+ }
219
+ ],
220
+ "discount": "25.00",
221
+ "tax": {
222
+ "label": "Illustrative tax",
223
+ "ratePercent": "10"
224
+ }
225
+ },
226
+ "amountPaid": "320.00",
227
+ "paymentInstructions": "Payment details placeholder. Supply the agreed method and verified recipient details before issuing a real invoice.",
228
+ "paymentReference": "SAMPLE-INV-001",
229
+ "notes": [
230
+ {
231
+ "id": "scope",
232
+ "title": "Scope note",
233
+ "text": "Illustrative services only. Replace the sample with the actual goods or services and any necessary supporting details."
234
+ },
235
+ {
236
+ "id": "supporting-detail",
237
+ "title": "Supporting detail",
238
+ "text": "This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. This is an illustrative note about the services described in the invoice. No real delivery or payment is being claimed. "
239
+ }
240
+ ]
241
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "title": "Sample invoice",
4
+ "number": "SAMPLE-INV-001",
5
+ "issuedOn": "2026-09-08",
6
+ "dueOn": null,
7
+ "reference": null,
8
+ "seller": {
9
+ "name": "Example Studio"
10
+ },
11
+ "customer": {
12
+ "name": "Example Customer"
13
+ },
14
+ "synthetic": true,
15
+ "pricing": {
16
+ "currency": {
17
+ "code": "USD",
18
+ "decimals": 2
19
+ },
20
+ "items": [
21
+ {
22
+ "id": "service",
23
+ "description": "Illustrative service",
24
+ "quantity": "1",
25
+ "unitPrice": "100.00"
26
+ }
27
+ ]
28
+ },
29
+ "amountPaid": null,
30
+ "paymentInstructions": null,
31
+ "paymentReference": null,
32
+ "notes": []
33
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "title": "Website content services",
4
+ "number": "SAMPLE-INV-001",
5
+ "issuedOn": "2026-09-08",
6
+ "dueOn": "2026-09-22",
7
+ "reference": "SAMPLE-Q-001",
8
+ "seller": {
9
+ "name": "Example Studio",
10
+ "details": "Studio address placeholder\nContact details placeholder"
11
+ },
12
+ "customer": {
13
+ "name": "Example Client",
14
+ "details": "Client address placeholder\nAttention: project contact"
15
+ },
16
+ "synthetic": true,
17
+ "pricing": {
18
+ "currency": {
19
+ "code": "USD",
20
+ "decimals": 2
21
+ },
22
+ "items": [
23
+ {
24
+ "id": "planning",
25
+ "description": "Content planning workshop",
26
+ "quantity": "2.5",
27
+ "unit": "hours",
28
+ "unitPrice": "160.00"
29
+ },
30
+ {
31
+ "id": "writing",
32
+ "description": "Website copy package: supplied scope and agreed deliverables",
33
+ "quantity": "1",
34
+ "unit": "package",
35
+ "unitPrice": "600.00"
36
+ },
37
+ {
38
+ "id": "review",
39
+ "description": "Review and revision sessions",
40
+ "quantity": "3",
41
+ "unit": "hours",
42
+ "unitPrice": "75.00"
43
+ }
44
+ ],
45
+ "discount": "25.00",
46
+ "tax": {
47
+ "label": "Illustrative tax",
48
+ "ratePercent": "10"
49
+ }
50
+ },
51
+ "amountPaid": "320.00",
52
+ "paymentInstructions": "Payment details placeholder. Supply the agreed method and verified recipient details before issuing a real invoice.",
53
+ "paymentReference": "SAMPLE-INV-001",
54
+ "notes": [
55
+ {
56
+ "id": "scope",
57
+ "title": "Scope note",
58
+ "text": "Illustrative services only. Replace the sample with the actual goods or services and any necessary supporting details."
59
+ }
60
+ ]
61
+ }
@@ -0,0 +1,57 @@
1
+ import type { ReactNode } from 'react';
2
+ import * as F from '@formepdf/react';
3
+ import { TextSlot, Block, Document, Heading, Paragraph, Strong, Page } from 'opendoc';
4
+ import { defineTemplate } from 'opendoc/template';
5
+ import { themePage, type DocTheme } from 'opendoc/themes';
6
+ import { BusinessLogo } from '../_shared/BusinessLogo';
7
+ import { Pricing } from '../_shared/Pricing';
8
+ import { money } from '../_shared/commerce';
9
+ import { calculateInvoice, parseInvoice, type InvoiceData } from './schema';
10
+ export { calculateInvoice, parseInvoice } from './schema';
11
+ export type { InvoiceData } from './schema';
12
+
13
+ export function Invoice({ data, theme, titleStyle, logo }: { data: InvoiceData; theme: DocTheme; titleStyle?: F.Style; logo?: ReactNode }) {
14
+ const balance = calculateInvoice(data);
15
+ const layoutTheme = theme.design ? theme : { ...theme, fontSize: 10.5, lineHeight: 1.4, paragraphGap: 8 };
16
+ return <Document title={data.title} author={data.seller.name} theme={layoutTheme}>
17
+ <Page {...themePage(theme, { top: 48, bottom: 52, left: 48, right: 48 })} style={{ lineBreaking: 'greedy', ...theme.design?.page?.style }}>
18
+ {(!theme.design || theme.runningFooter) && <F.Fixed position="footer"><F.Text style={{ fontFamily: theme.design ? theme.body : undefined, fontSize: 8, color: theme.muted, textAlign: 'right', ...theme.design?.furniture?.text, ...theme.design?.furniture?.footer }}>{data.synthetic ? 'Illustrative invoice · ' : ''}{theme.design?.furniture?.pageNumber === 'total' ? '{{pageNumber}} / {{totalPages}}' : '{{pageNumber}}'}</F.Text></F.Fixed>}
19
+ <F.View style={theme.design?.title?.block}>
20
+ <F.View wrap={false} style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>
21
+ <Paragraph id="invoice-label" role="label" baseStyle={{ fontSize: 9, letterSpacing: 0.8, color: theme.muted, marginBottom: 0 }} style={theme.design?.title?.eyebrow}>INVOICE</Paragraph>
22
+ <BusinessLogo id="invoice-logo" theme={theme}>{logo}</BusinessLogo>
23
+ </F.View>
24
+ <Heading id="invoice-title" level={1} baseStyle={{ fontSize: 28, lineHeight: 1.15, marginBottom: 12 }} style={{ ...theme.design?.title?.heading, ...titleStyle }}><TextSlot slot="title" field={['title']}>{data.title}</TextSlot></Heading>
25
+ <Paragraph id="invoice-number" role="small" baseStyle={{ fontSize: 9, marginBottom: 8 }} style={theme.design?.title?.byline}>No. <TextSlot slot="number" field={['number']}>{data.number}</TextSlot>{data.reference ? <> · Reference: <TextSlot slot="reference" field={['reference']}>{data.reference}</TextSlot></> : ''}</Paragraph>
26
+ <Block id="invoice-balance-summary"><F.View wrap={false} style={{ flexDirection: 'row', gap: 24, marginBottom: 12 }}>
27
+ <F.View style={{ flex: 1 }}>
28
+ <F.Text style={{ fontSize: 9.5, marginBottom: 4, ...theme.design?.typography?.small }}>Issued <TextSlot slot="issuedOn" field={['issuedOn']}>{data.issuedOn}</TextSlot></F.Text>
29
+ {data.dueOn && <F.Text style={{ fontSize: 9.5, ...theme.design?.typography?.small }}>Due <TextSlot slot="dueOn" field={['dueOn']}>{data.dueOn}</TextSlot></F.Text>}
30
+ </F.View>
31
+ <F.View style={{ flex: 1 }}>
32
+ <F.Text style={{ fontSize: 8.5, color: theme.muted, textAlign: 'right', marginBottom: 5, ...theme.design?.typography?.small }}>Amount due</F.Text>
33
+ <F.Text style={{ fontSize: 21, fontWeight: 600, ...theme.design?.typography?.h2, textAlign: 'right' }}><TextSlot slot="amount-due" reason="Calculated value—ask your agent to change its inputs.">{money(balance.balanceMinor, data.pricing.currency)}</TextSlot></F.Text>
34
+ </F.View>
35
+ </F.View></Block>
36
+ </F.View>
37
+ <Block id="invoice-parties"><F.View wrap={false} style={{ flexDirection: 'row', gap: 28, marginBottom: 8 }}>
38
+ {([['From', data.seller, 'seller'], ['Bill to', data.customer, 'customer']] as const).map(([label, party, partyField]) => <F.View key={label} style={{ flex: 1 }}>
39
+ <F.Text style={{ fontSize: 8.5, color: theme.muted, marginBottom: 5, ...theme.design?.typography?.small }}>{label}</F.Text>
40
+ <F.Text style={{ fontWeight: 600, marginBottom: 5 }}><TextSlot slot={`${partyField}-name`} field={[partyField, 'name']}>{party.name}</TextSlot></F.Text>
41
+ {party.details && <F.Text style={{ fontSize: 9.5, color: theme.muted, ...theme.design?.typography?.small }}><TextSlot slot={`${partyField}-details`} field={[partyField, 'details']}>{party.details}</TextSlot></F.Text>}
42
+ </F.View>)}
43
+ </F.View></Block>
44
+ {data.synthetic && <Paragraph id="invoice-sample-notice" role="small" baseStyle={{ fontSize: 9, color: theme.muted }}>Illustrative invoice. All parties, amounts, dates, and payment details are synthetic. This is not a payment request.</Paragraph>}
45
+ {data.introduction && <Paragraph id="invoice-introduction"><TextSlot slot="introduction" field={['introduction']}>{data.introduction}</TextSlot></Paragraph>}
46
+ <Pricing data={data.pricing} theme={theme} totalLabel={data.amountPaid === undefined ? 'Amount due' : 'Invoice total'} paymentReceived={data.amountPaid === undefined ? undefined : balance.paidMinor} />
47
+ {data.paymentInstructions && <Paragraph id="invoice-payment-instructions" role="small" baseStyle={{ fontSize: 9.5 }}><Strong>Payment instructions. </Strong><TextSlot slot="paymentInstructions" field={['paymentInstructions']}>{data.paymentInstructions}</TextSlot></Paragraph>}
48
+ {data.paymentReference && <Paragraph id="invoice-payment-reference" role="small" baseStyle={{ fontSize: 9.5 }}><Strong>Payment reference. </Strong><TextSlot slot="paymentReference" field={['paymentReference']}>{data.paymentReference}</TextSlot></Paragraph>}
49
+ {data.notes.map(note => <Paragraph key={note.id} id={`invoice-note-${note.id.length}-${note.id}`} role="small" baseStyle={{ fontSize: 9.5, marginBottom: 10 }}><Strong><TextSlot slot="title" field={['notes', { id: note.id }, 'title']}>{note.title}</TextSlot>. </Strong><TextSlot slot="text" field={['notes', { id: note.id }, 'text']}>{note.text}</TextSlot></Paragraph>)}
50
+ </Page>
51
+ </Document>;
52
+ }
53
+ export const invoiceTemplate = (theme: DocTheme, { logo }: { logo?: ReactNode } = {}) => defineTemplate<InvoiceData>({
54
+ parse: parseInvoice,
55
+ meta: data => ({ title: data.title, description: `Invoice ${data.number} for ${data.customer.name}.`, kind: 'report', theme: theme.id, author: data.seller.name }),
56
+ render: data => <Invoice data={data} theme={theme} logo={logo} />,
57
+ });
@@ -0,0 +1,12 @@
1
+ import { neutral } from '../../themes';
2
+ import { type DocTheme } from 'opendoc/themes';
3
+ import { invoiceTemplate, parseInvoice } from './index';
4
+ import typical from './examples/typical.json';
5
+ import sparse from './examples/sparse.json';
6
+ import long from './examples/long.json';
7
+ export const meta = invoiceTemplate(neutral).meta(parseInvoice(typical));
8
+ export function Specimen({ length = 'typical', theme = neutral }: { length?: 'sparse' | 'typical' | 'long'; theme?: DocTheme } = {}) {
9
+ const template = invoiceTemplate(theme);
10
+ return template.render(template.parse({ sparse, typical, long }[length]));
11
+ }
12
+ export default Specimen;
@@ -0,0 +1,45 @@
1
+ import { calculatePricing, date, object, optionalText, parsePricing, paymentMinor, text, type PricingData } from '../_shared/commerce';
2
+
3
+ export interface InvoiceData {
4
+ schemaVersion: 1; title: string; number: string; issuedOn: string; dueOn?: string; reference?: string;
5
+ seller: { name: string; details?: string }; customer: { name: string; details?: string };
6
+ synthetic: boolean; introduction?: string; pricing: PricingData; amountPaid?: string;
7
+ paymentInstructions?: string; paymentReference?: string; notes: { id: string; title: string; text: string }[];
8
+ }
9
+
10
+ export function calculateInvoice(data: InvoiceData) {
11
+ const totals = calculatePricing(data.pricing);
12
+ const paidMinor = data.amountPaid === undefined ? 0n : paymentMinor(data.amountPaid, data.pricing.currency, 'invoice.amountPaid');
13
+ if (paidMinor > totals.totalMinor) throw new Error('invoice.amountPaid: cannot exceed the invoice total; a credit balance needs a separate explicit treatment.');
14
+ return { ...totals, paidMinor, balanceMinor: totals.totalMinor - paidMinor };
15
+ }
16
+
17
+ export function parseInvoice(input: unknown): InvoiceData {
18
+ const value = object(input, ['schemaVersion', 'title', 'number', 'issuedOn', 'dueOn', 'reference', 'seller', 'customer', 'synthetic', 'introduction', 'pricing', 'amountPaid', 'paymentInstructions', 'paymentReference', 'notes'], 'invoice');
19
+ if (value.schemaVersion !== 1) throw new Error('invoice.schemaVersion: expected 1.');
20
+ if (typeof value.synthetic !== 'boolean') throw new Error('invoice.synthetic: explicitly supply true or false.');
21
+ const party = (input: unknown, path: string) => {
22
+ const data = object(input, ['name', 'details'], path);
23
+ return { name: text(data.name, `${path}.name`, 180, 1), details: optionalText(data.details, `${path}.details`, 700, 8) };
24
+ };
25
+ const issuedOn = date(value.issuedOn, 'invoice.issuedOn');
26
+ const dueOn = value.dueOn === undefined || value.dueOn === null ? undefined : date(value.dueOn, 'invoice.dueOn');
27
+ if (dueOn && dueOn < issuedOn) throw new Error('invoice.dueOn: must be on or after issuedOn.');
28
+ if (value.notes !== undefined && !Array.isArray(value.notes)) throw new Error('invoice.notes: expected an array.');
29
+ const seen = new Set<string>();
30
+ const notes = ((value.notes ?? []) as unknown[]).map((raw, index) => {
31
+ const path = `invoice.notes[${index}]`, note = object(raw, ['id', 'title', 'text'], path), id = text(note.id, `${path}.id`, 100);
32
+ if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(id) || seen.has(id)) throw new Error(`${path}.id: supply a unique stable ID.`);
33
+ seen.add(id);
34
+ return { id, title: text(note.title, `${path}.title`, 120), text: text(note.text, `${path}.text`) };
35
+ });
36
+ const data: InvoiceData = {
37
+ schemaVersion: 1, title: text(value.title, 'invoice.title', 300), number: text(value.number, 'invoice.number', 80, 1), issuedOn, dueOn,
38
+ reference: optionalText(value.reference, 'invoice.reference', 180, 1), seller: party(value.seller, 'invoice.seller'), customer: party(value.customer, 'invoice.customer'),
39
+ synthetic: value.synthetic, introduction: optionalText(value.introduction, 'invoice.introduction'), pricing: parsePricing(value.pricing),
40
+ amountPaid: value.amountPaid === undefined || value.amountPaid === null ? undefined : text(value.amountPaid, 'invoice.amountPaid', 20, 1),
41
+ paymentInstructions: optionalText(value.paymentInstructions, 'invoice.paymentInstructions'), paymentReference: optionalText(value.paymentReference, 'invoice.paymentReference', 180, 1), notes,
42
+ };
43
+ calculateInvoice(data);
44
+ return data;
45
+ }
@@ -0,0 +1,12 @@
1
+ import { bindTemplate } from 'opendoc/template';
2
+ import { invoiceTemplate } from '../../templates/invoice';
3
+ // @ts-ignore The selected local theme module is inserted when this starter becomes a document.
4
+ import { theme } from "__OPENDOC_THEME_MODULE__";
5
+ import data from './data.json';
6
+ const documentId = "__OPENDOC_DOCUMENT_ID__";
7
+ const themeId = "__OPENDOC_THEME__";
8
+ // Bind a shared logo, pass <Logo slot="primary" /> through the logo option, or pass null to omit it.
9
+ const bound = bindTemplate(invoiceTemplate(theme), data);
10
+ export const meta = { ...bound.meta, theme: themeId };
11
+ export const provenance = { template: 'templates/invoice/index.tsx', dataFile: `documents/${documentId}/data.json` };
12
+ export default bound.Document;
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "Invoice",
3
+ "description": "Invoice references and dates, seller and customer details, itemized charges, and a clear amount due with optional payment instructions and recorded payments.",
4
+ "format": "A4 \u00b7 Business invoice",
5
+ "structure": [
6
+ "The opening pairs issue and optional due dates with a prominent calculated amount due, below the title and invoice reference. An optional logo slot sits at the upper right.",
7
+ "Seller and customer details sit side by side, followed by line items with repeating table headers.",
8
+ "Totals align on the right. Supplied payments reduce the calculated balance; the same amount due appears in the opening and the totals.",
9
+ "Optional payment instructions, payment reference, and supporting notes follow the charges. Each invoice owns its data and longer content flows naturally."
10
+ ]
11
+ }
@@ -0,0 +1,9 @@
1
+ # Literary text
2
+
3
+ Use this as a soft foundation for the writing, with room for variation and creativity. Its starting character is a restrained, slightly lowered title, an intimate reading measure, relaxed leading, and quiet page numbers. These are defaults, not a fixed rule system. A long title may need smaller type through `titleStyle`; another passage may benefit from different spacing, a different opening alignment, or a wider measure. Serve the voice and reading rhythm rather than reproducing the specimen.
4
+
5
+ The author line, epigraph, and scene breaks are optional. Do not add them merely to fill space, and do not prescribe a plot, chapter structure, or writing method. An epigraph is supplied inline text; include attribution when needed and never invent a quotation. The native starting layout uses flush paragraphs with small gaps. It deliberately does not use the custom Prose indentation helper.
6
+
7
+ Use ordinary Paragraph blocks and native Forme flow. SceneBreak takes a stable id and a short lead paragraph; its native unbreakable View keeps the marker with that opening. Put the remaining scene text in following paragraphs so it can paginate. Avoid custom fitting, manual line splitting, absolute-positioned body text, and renderer patches. Preserve IDs, quotations, and reference accuracy. Keep changes for one document local or use options that preserve shared defaults.
8
+
9
+ The caller's theme supplies visual hierarchy, rhythm, and component treatments; catalog previews use Neutral. Review the adapted PDF. Shared changes also need short and long specimens, scene breaks near page boundaries, a second theme, and a working starter. Preserve unrelated documents and templates.
@@ -0,0 +1,11 @@
1
+ # Literary text
2
+
3
+ A flexible prose layout for stories, chapters, and longer creative writing. Native Forme handles wrapping and pagination. Defaults are A4 portrait with 112-point side and 64-point top/bottom margins, a 371-point reading column, 11.5/17.825-point body type, and 7-point paragraph gaps. The centered 26-point title has additional opening space above it. Page numbers sit centrally below the text.
4
+
5
+ `LiteraryText` accepts `title`, `theme`, and ordinary OpenDoc blocks as `children`. Optional `author` and inline `epigraph` supply opening material. `titleStyle` accepts native styles for smaller titles, alternate alignment, or different opening spacing. Fonts and colors come from the theme. Paragraphs begin flush; there is no indentation shim or custom typesetting. The layout is a starting point, not a prescribed literary style.
6
+
7
+ Use `<SceneBreak id="return-to-the-house" lead="The first short paragraph of the new scene." />` for a quiet three-asterisk marker. It keeps the marker with its short lead using a native unbreakable View. The lead is limited to 700 characters to keep this small group page-sized; place the rest in normal Paragraph blocks. Its comment targets are `<id>-marker` and `<id>-lead`. Keep these IDs stable when moving scenes. Omit scene markers when the writing does not need them.
8
+
9
+ Long titles and epigraphs remain breakable. If an opening becomes disproportionate, adapt it with ordinary styles after reviewing the PDF. Supply verified `references` and use existing Cite blocks if the work needs references; otherwise the reference section is omitted. No chapter order or content outline is imposed.
10
+
11
+ `preview.tsx` uses explicitly identified placeholder prose, not a fictional quotation attributed to a real author. Its Specimen accepts sparse, typical, and long lengths plus an optional theme for review. The default catalog proof stays Neutral. `starter.tsx` creates a normal linked document. See [AGENTS.md](AGENTS.md) for the intended flexibility and native-layout boundaries.
@@ -0,0 +1,31 @@
1
+ import type { ReactNode } from 'react';
2
+ import * as F from '@formepdf/react';
3
+ import { TextSlot, Document, Heading, Paragraph, References, Page } from 'opendoc';
4
+ import { themePage, type DocTheme } from 'opendoc/themes';
5
+
6
+ export function LiteraryText({ title, theme, author, epigraph, titleStyle, children, references }: {
7
+ title: string; theme: DocTheme; author?: string; epigraph?: ReactNode; titleStyle?: F.Style;
8
+ children: ReactNode; references?: Parameters<typeof Document>[0]['references'];
9
+ }) {
10
+ const layoutTheme: DocTheme = theme.design ? theme : { ...theme, fontSize: 11.5, lineHeight: 1.55, paragraphGap: 7 };
11
+ return <Document title={title} author={author} theme={layoutTheme} references={references}>
12
+ <Page {...themePage(theme, { top: 64, bottom: 64, left: 112, right: 112 })} style={{ lineBreaking: 'greedy', ...theme.design?.page?.style }}>
13
+ {(!theme.design || theme.runningFooter) && <F.Fixed position="footer"><F.Text style={{ fontFamily: theme.body, fontSize: 8, color: theme.muted, textAlign: 'center', ...theme.design?.furniture?.text, ...theme.design?.furniture?.footer }}>{theme.design?.furniture?.pageNumber === 'total' ? '{{pageNumber}} / {{totalPages}}' : '{{pageNumber}}'}</F.Text></F.Fixed>}
14
+ <F.View style={theme.design?.title?.block}>
15
+ <Heading id="literary-title" level={1} baseStyle={{ fontSize: 26, lineHeight: 1.2, textAlign: 'center', marginTop: 56, marginBottom: 16 }} style={{ ...theme.design?.title?.heading, ...titleStyle }}><TextSlot slot="title" from="title">{title}</TextSlot></Heading>
16
+ {author && <Paragraph id="literary-author" role="small" baseStyle={{ fontSize: 10, color: theme.muted, textAlign: 'center', marginBottom: 20 }} style={theme.design?.title?.byline}><TextSlot slot="author" from="author">{author}</TextSlot></Paragraph>}
17
+ {epigraph && <Paragraph id="literary-epigraph" role="lead" baseStyle={{ fontSize: 11, fontStyle: 'italic', lineHeight: 1.45, marginLeft: 24, marginRight: 24, marginTop: 10, marginBottom: 14 }}><TextSlot slot="epigraph" from="epigraph">{epigraph}</TextSlot></Paragraph>}
18
+ </F.View>
19
+ <F.View style={{ marginTop: 28 }}>{children}<References headingBaseStyle={{ fontSize: 12, marginTop: 24, marginBottom: 8 }} /></F.View>
20
+ </Page>
21
+ </Document>;
22
+ }
23
+
24
+ /** Keep a scene marker with its short opening; subsequent paragraphs flow normally. */
25
+ export function SceneBreak({ id, lead }: { id: string; lead: string }) {
26
+ if (!lead.trim() || lead.length > 700) throw new Error('SceneBreak needs a short opening paragraph of 1–700 characters. Put the rest in following Paragraph blocks.');
27
+ return <F.View wrap={false}>
28
+ <Paragraph id={`${id}-marker`} role="small" baseStyle={{ textAlign: 'center', fontSize: 10, marginTop: 18, marginBottom: 18 }}>* * *</Paragraph>
29
+ <Paragraph id={`${id}-lead`}><TextSlot slot="lead" from="lead">{lead}</TextSlot></Paragraph>
30
+ </F.View>;
31
+ }
@@ -0,0 +1,20 @@
1
+ import { Paragraph } from 'opendoc';
2
+ import { neutral } from '../../themes';
3
+ import { type DocTheme } from 'opendoc/themes';
4
+ import { LiteraryText, SceneBreak } from './index';
5
+
6
+ export const meta = { title: 'Literary text', description: 'A Neutral reading specimen with placeholder prose.', kind: 'article' as const, theme: 'neutral' };
7
+ const paragraph = 'This is placeholder prose for the reading column. It makes the shape of a passage visible: the length of a line, the pause between paragraphs, and the quiet space around the text. In an authored work, the writer’s own sentences would set the pace. The page should support that voice and let a long passage continue naturally, without asking the writer to fit the story into a predetermined outline.';
8
+
9
+ export function Specimen({ length = 'typical', theme = neutral }: { length?: 'sparse' | 'typical' | 'long'; theme?: DocTheme } = {}) {
10
+ const sparse = length === 'sparse';
11
+ return <LiteraryText title={meta.title} theme={theme} author={sparse ? undefined : 'Author name'} epigraph={sparse ? undefined : 'An optional epigraph can sit here. This is a layout placeholder, not a quotation.'}>
12
+ {Array.from({ length: sparse ? 1 : length === 'long' ? 15 : 3 }, (_, index) => <Paragraph key={index} id={`specimen-paragraph-${index + 1}`}>{paragraph}</Paragraph>)}
13
+ {!sparse && <>
14
+ <SceneBreak id="specimen-scene" lead="The next scene begins with this short placeholder paragraph. Its marker remains with it when a page turns." />
15
+ <Paragraph id="specimen-continuation">{paragraph}</Paragraph>
16
+ <Paragraph id="specimen-ending">This last passage shows the closing rhythm of the page. The writing can finish here or continue into another scene, in the author's own form.</Paragraph>
17
+ </>}
18
+ </LiteraryText>;
19
+ }
20
+ export default Specimen;
@@ -0,0 +1,11 @@
1
+ import { LiteraryText } from '../../templates/literary-text';
2
+ import { Paragraph } from 'opendoc';
3
+ // @ts-ignore The selected local theme module is inserted when this starter becomes a document.
4
+ import { theme } from "__OPENDOC_THEME_MODULE__";
5
+ const title = "__OPENDOC_TITLE__";
6
+ const themeId = "__OPENDOC_THEME__";
7
+ export const meta = { title, description: 'A literary text, ready for your writing.', kind: 'article' as const, theme: themeId };
8
+ export const provenance = { template: 'templates/literary-text/index.tsx' };
9
+ export default function Text() {
10
+ return <LiteraryText title={title} theme={theme} author="Author name"><Paragraph id="literary-opening">Your writing begins here. Replace this placeholder with your own opening and let the work take its shape.</Paragraph></LiteraryText>;
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "Literary text",
3
+ "description": "A restrained opening and a comfortable reading column for stories, chapters, and longer creative prose, with optional epigraphs and quiet scene breaks.",
4
+ "format": "A4 · Literary prose",
5
+ "structure": [
6
+ "A modest centered title sits lower on the opening page, with an optional author line and epigraph.",
7
+ "A narrow column, relaxed leading, and small paragraph gaps support continuous reading.",
8
+ "Optional scene markers stay with their short opening paragraphs; longer passages flow naturally across pages.",
9
+ "Centered page numbers keep navigation quiet. The writing determines its own structure, and the design remains adaptable."
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ # Magazine feature
2
+
3
+ Use this template as an adaptable starting point for the feature, with room for variation and creativity. Its character comes from the contrast between a broad opening and an offset reading column. The specimen's measurements are defaults: a long headline may need a smaller size, different spacing, or a rebalanced opening. Adjust the column, image proportions, and placement when the material calls for it. Aim for a coherent feature, not an exact reproduction of the specimen.
4
+
5
+ Give the headline presence and usually keep the kicker and byline quiet. An opening image can span the full content width, with its caption immediately below. Flush body paragraphs and open spacing are a useful baseline. Display quotes work as occasional moments of emphasis in the reading flow. Omit or adapt these elements to suit the story; none imposes a mandatory content outline.
6
+
7
+ Accept ordinary OpenDoc blocks in the author's order. The theme supplies visual hierarchy, rhythm, and component treatments; the layout supplies adaptable dimensions and spacing. Use the shared Neutral theme for the catalog specimen. References normally follow the body. Preserve stable block IDs, and keep document-specific variations local so other documents retain their existing layout.
8
+
9
+ Use Forme's native Page, Fixed, View, and text flow through the existing OpenDoc primitives. Do not introduce the Prose indentation helper, column-balancing logic, text measurement, custom line splitting, negative margins, absolute-positioned body text, or renderer patches. The reading column is one flowing column; it does not promise newspaper-style two-column pagination. Leave variable text breakable. An image and its caption may use the existing Figure block; size the complete figure to fit a page.
10
+
11
+ Review the adapted document and its page continuations. Shared layout changes also need sparse, typical, and long specimens, a second theme, and a working starter. Do not change unrelated templates or documents.
@@ -0,0 +1,13 @@
1
+ # Magazine feature
2
+
3
+ A native Forme layout for illustrated features, profiles, and interviews. A4 pages have 48-point top and side margins and a 58-point bottom margin. The opening uses the full 499-point content width; body text is inset 96 points from the left, leaving a 403-point reading column. The headline is 52 points. Body text is 11/16.5 points with 10-point paragraph gaps and no indents. Fonts and colors come from the caller's theme.
4
+
5
+ `MagazineFeature` takes `title`, `theme`, and ordinary OpenDoc blocks as `children`. Optional `kicker`, `standfirst`, `author`, and `hero` supply opening material. Omit them when they are not needed; there are no empty reserved panels or mandatory content sections. Pass verified `references` and use `Cite` in the body for the usual reference list.
6
+
7
+ For `hero`, supply an existing `Figure` containing local `Media` or a native Forme image. Its available width is approximately 499 points; body visuals have approximately 403 points. Preserve the image's aspect ratio and leave enough height for its caption. `Figure` keeps the image and caption together, so the complete group must fit on a page. See [the media guidance](../../docs/MEDIA.md).
8
+
9
+ Use `<FeatureQuote id="a-stable-quote-id">…</FeatureQuote>` for an optional display quote. It inherits the body font and color, uses 24/30-point text, and remains breakable in normal reading order. The writer supplies the quotation and attribution; this component does not invent either. Use ordinary paragraphs for nearby attribution when needed.
10
+
11
+ The implementation uses existing OpenDoc blocks backed by Forme's native `Page`, `Fixed`, `View`, and text primitives. There is no custom typesetting, indentation shim, page splitting, or simulated multi-column flow. Long titles, decks, body text, and quotes remain breakable. Keep headings with a short opening using OpenDoc `Section` where appropriate, rather than wrapping large passages in an unbreakable group.
12
+
13
+ `preview.tsx` contains clearly marked layout placeholders. `Specimen` accepts `length="sparse"`, `"typical"`, or `"long"`, plus an optional theme for review. The default catalog proof stays Neutral. `starter.tsx` creates an ordinary document linked to this folder. Keep authored IDs stable across revisions; preview sequence IDs belong only to its fixed specimen.