@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.
- package/.agents/skills/opendoc-apply-comments/SKILL.md +30 -0
- package/.agents/skills/opendoc-apply-comments/agents/openai.yaml +4 -0
- package/.agents/skills/opendoc-create/SKILL.md +63 -0
- package/.agents/skills/opendoc-create/agents/openai.yaml +6 -0
- package/.agents/skills/opendoc-create-template/SKILL.md +50 -0
- package/.agents/skills/opendoc-create-template/agents/openai.yaml +4 -0
- package/.agents/skills/opendoc-create-template/references/structured-reports.md +11 -0
- package/.agents/skills/opendoc-create-theme/SKILL.md +40 -0
- package/.agents/skills/opendoc-create-theme/agents/openai.yaml +4 -0
- package/.agents/skills/opendoc-current-document/SKILL.md +32 -0
- package/.agents/skills/opendoc-current-document/agents/openai.yaml +4 -0
- package/.agents/skills/opendoc-current-document/references/context-fields.md +20 -0
- package/.agents/skills/opendoc-review-document/SKILL.md +60 -0
- package/.agents/skills/opendoc-review-document/agents/openai.yaml +4 -0
- package/AGENTS.md +69 -0
- package/CONTRIBUTING.md +38 -0
- package/LICENSE +21 -0
- package/README.md +179 -0
- package/SECURITY.md +9 -0
- package/THIRD_PARTY.md +49 -0
- package/VALIDATION.md +99 -0
- package/bin/opendoc.mjs +6 -0
- package/dist/assets/Markdown-sNZyjJi7.js +29 -0
- package/dist/assets/OpenDocSerif-Regular-D3OXs9A9.ttf +0 -0
- package/dist/assets/OpenDocSerif-Semibold-CjL9oDRo.ttf +0 -0
- package/dist/assets/geist-latin-ext-wght-italic-XgKbg5n7.woff2 +0 -0
- package/dist/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/dist/assets/geist-latin-wght-italic-dTnRTFFJ.woff2 +0 -0
- package/dist/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dist/assets/index-DdrZ6ozO.css +1 -0
- package/dist/assets/index-DgNBz7mL.js +39 -0
- package/dist/assets/pdf-B7Emtyld.js +54 -0
- package/dist/assets/pdf.worker.min-Dswkl-cV.mjs +29 -0
- package/dist/assets/wordmark-DsqLlZpb.png +0 -0
- package/dist/index.html +17 -0
- package/docs/APPEARANCE.md +21 -0
- package/docs/ASSETS.md +176 -0
- package/docs/AUTHORING.md +178 -0
- package/docs/HEADLESS.md +120 -0
- package/docs/MEDIA.md +112 -0
- package/docs/PROJECTS.md +55 -0
- package/docs/PROSE.md +15 -0
- package/docs/SELECTION.md +59 -0
- package/docs/TEMPLATES.md +55 -0
- package/docs/THEMES.md +106 -0
- package/node_modules/@formepdf/core/LICENSE +21 -0
- package/node_modules/@formepdf/core/README.md +53 -0
- package/node_modules/@formepdf/core/dist/attachments.d.ts +55 -0
- package/node_modules/@formepdf/core/dist/attachments.js +59 -0
- package/node_modules/@formepdf/core/dist/extract.d.ts +8 -0
- package/node_modules/@formepdf/core/dist/extract.js +56 -0
- package/node_modules/@formepdf/core/dist/index.d.ts +311 -0
- package/node_modules/@formepdf/core/dist/index.js +167 -0
- package/node_modules/@formepdf/core/dist/layout.d.ts +132 -0
- package/node_modules/@formepdf/core/dist/layout.js +240 -0
- package/node_modules/@formepdf/core/dist/shared/browserHelpers.d.ts +19 -0
- package/node_modules/@formepdf/core/dist/shared/browserHelpers.js +128 -0
- package/node_modules/@formepdf/core/package.json +35 -0
- package/node_modules/@formepdf/core/pkg-node/LICENSE +21 -0
- package/node_modules/@formepdf/core/pkg-node/README.md +84 -0
- package/node_modules/@formepdf/core/pkg-node/forme.d.ts +39 -0
- package/node_modules/@formepdf/core/pkg-node/forme.js +394 -0
- package/node_modules/@formepdf/core/pkg-node/forme_bg.wasm +0 -0
- package/node_modules/@formepdf/core/pkg-node/forme_bg.wasm.d.ts +21 -0
- package/node_modules/@formepdf/core/pkg-node/package.json +25 -0
- package/node_modules/@formepdf/react/README.md +70 -0
- package/node_modules/@formepdf/react/dist/charts.d.ts +72 -0
- package/node_modules/@formepdf/react/dist/charts.js +338 -0
- package/node_modules/@formepdf/react/dist/components.d.ts +533 -0
- package/node_modules/@formepdf/react/dist/components.js +608 -0
- package/node_modules/@formepdf/react/dist/expr.d.ts +20 -0
- package/node_modules/@formepdf/react/dist/expr.js +39 -0
- package/node_modules/@formepdf/react/dist/font.d.ts +2 -0
- package/node_modules/@formepdf/react/dist/font.js +1 -0
- package/node_modules/@formepdf/react/dist/index.d.ts +11 -0
- package/node_modules/@formepdf/react/dist/index.js +15 -0
- package/node_modules/@formepdf/react/dist/render.d.ts +12 -0
- package/node_modules/@formepdf/react/dist/render.js +15 -0
- package/node_modules/@formepdf/react/dist/serialize.d.ts +12 -0
- package/node_modules/@formepdf/react/dist/serialize.js +1470 -0
- package/node_modules/@formepdf/react/dist/stylesheet.d.ts +4 -0
- package/node_modules/@formepdf/react/dist/stylesheet.js +5 -0
- package/node_modules/@formepdf/react/dist/template-proxy.d.ts +38 -0
- package/node_modules/@formepdf/react/dist/template-proxy.js +100 -0
- package/node_modules/@formepdf/react/dist/types.d.ts +287 -0
- package/node_modules/@formepdf/react/dist/types.js +1 -0
- package/node_modules/@formepdf/react/package.json +41 -0
- package/node_modules/@formepdf/shared/README.md +7 -0
- package/node_modules/@formepdf/shared/dist/canvas.d.ts +6 -0
- package/node_modules/@formepdf/shared/dist/canvas.js +43 -0
- package/node_modules/@formepdf/shared/dist/charts.d.ts +100 -0
- package/node_modules/@formepdf/shared/dist/charts.js +98 -0
- package/node_modules/@formepdf/shared/dist/encode.d.ts +27 -0
- package/node_modules/@formepdf/shared/dist/encode.js +93 -0
- package/node_modules/@formepdf/shared/dist/font.d.ts +13 -0
- package/node_modules/@formepdf/shared/dist/font.js +52 -0
- package/node_modules/@formepdf/shared/dist/index.d.ts +10 -0
- package/node_modules/@formepdf/shared/dist/index.js +15 -0
- package/node_modules/@formepdf/shared/dist/parser.d.ts +30 -0
- package/node_modules/@formepdf/shared/dist/parser.js +756 -0
- package/node_modules/@formepdf/shared/dist/semantics.d.ts +15 -0
- package/node_modules/@formepdf/shared/dist/semantics.js +44 -0
- package/node_modules/@formepdf/shared/dist/style.d.ts +7 -0
- package/node_modules/@formepdf/shared/dist/style.js +1024 -0
- package/node_modules/@formepdf/shared/dist/types.d.ts +743 -0
- package/node_modules/@formepdf/shared/dist/types.js +2 -0
- package/node_modules/@formepdf/shared/package.json +35 -0
- package/node_modules/@types/node/LICENSE +21 -0
- package/node_modules/@types/node/README.md +15 -0
- package/node_modules/@types/node/assert/strict.d.ts +111 -0
- package/node_modules/@types/node/assert.d.ts +1078 -0
- package/node_modules/@types/node/async_hooks.d.ts +603 -0
- package/node_modules/@types/node/buffer.buffer.d.ts +472 -0
- package/node_modules/@types/node/buffer.d.ts +1934 -0
- package/node_modules/@types/node/child_process.d.ts +1476 -0
- package/node_modules/@types/node/cluster.d.ts +578 -0
- package/node_modules/@types/node/compatibility/disposable.d.ts +14 -0
- package/node_modules/@types/node/compatibility/index.d.ts +9 -0
- package/node_modules/@types/node/compatibility/indexable.d.ts +20 -0
- package/node_modules/@types/node/compatibility/iterators.d.ts +20 -0
- package/node_modules/@types/node/console.d.ts +452 -0
- package/node_modules/@types/node/constants.d.ts +21 -0
- package/node_modules/@types/node/crypto.d.ts +4545 -0
- package/node_modules/@types/node/dgram.d.ts +600 -0
- package/node_modules/@types/node/diagnostics_channel.d.ts +576 -0
- package/node_modules/@types/node/dns/promises.d.ts +503 -0
- package/node_modules/@types/node/dns.d.ts +923 -0
- package/node_modules/@types/node/domain.d.ts +170 -0
- package/node_modules/@types/node/events.d.ts +976 -0
- package/node_modules/@types/node/fs/promises.d.ts +1306 -0
- package/node_modules/@types/node/fs.d.ts +4463 -0
- package/node_modules/@types/node/globals.d.ts +172 -0
- package/node_modules/@types/node/globals.typedarray.d.ts +38 -0
- package/node_modules/@types/node/http.d.ts +2097 -0
- package/node_modules/@types/node/http2.d.ts +2843 -0
- package/node_modules/@types/node/https.d.ts +579 -0
- package/node_modules/@types/node/index.d.ts +98 -0
- package/node_modules/@types/node/inspector.d.ts +253 -0
- package/node_modules/@types/node/inspector.generated.d.ts +4052 -0
- package/node_modules/@types/node/module.d.ts +891 -0
- package/node_modules/@types/node/net.d.ts +1076 -0
- package/node_modules/@types/node/os.d.ts +506 -0
- package/node_modules/@types/node/package.json +145 -0
- package/node_modules/@types/node/path.d.ts +200 -0
- package/node_modules/@types/node/perf_hooks.d.ts +968 -0
- package/node_modules/@types/node/process.d.ts +2084 -0
- package/node_modules/@types/node/punycode.d.ts +117 -0
- package/node_modules/@types/node/querystring.d.ts +152 -0
- package/node_modules/@types/node/readline/promises.d.ts +161 -0
- package/node_modules/@types/node/readline.d.ts +594 -0
- package/node_modules/@types/node/repl.d.ts +428 -0
- package/node_modules/@types/node/sea.d.ts +162 -0
- package/node_modules/@types/node/sqlite.d.ts +722 -0
- package/node_modules/@types/node/stream/consumers.d.ts +38 -0
- package/node_modules/@types/node/stream/promises.d.ts +90 -0
- package/node_modules/@types/node/stream/web.d.ts +573 -0
- package/node_modules/@types/node/stream.d.ts +1694 -0
- package/node_modules/@types/node/string_decoder.d.ts +67 -0
- package/node_modules/@types/node/test.d.ts +2265 -0
- package/node_modules/@types/node/timers/promises.d.ts +108 -0
- package/node_modules/@types/node/timers.d.ts +287 -0
- package/node_modules/@types/node/tls.d.ts +1319 -0
- package/node_modules/@types/node/trace_events.d.ts +197 -0
- package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +468 -0
- package/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +34 -0
- package/node_modules/@types/node/ts5.6/index.d.ts +98 -0
- package/node_modules/@types/node/tty.d.ts +208 -0
- package/node_modules/@types/node/url.d.ts +984 -0
- package/node_modules/@types/node/util.d.ts +2606 -0
- package/node_modules/@types/node/v8.d.ts +920 -0
- package/node_modules/@types/node/vm.d.ts +1053 -0
- package/node_modules/@types/node/wasi.d.ts +181 -0
- package/node_modules/@types/node/web-globals/abortcontroller.d.ts +34 -0
- package/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
- package/node_modules/@types/node/web-globals/events.d.ts +97 -0
- package/node_modules/@types/node/web-globals/fetch.d.ts +55 -0
- package/node_modules/@types/node/web-globals/navigator.d.ts +22 -0
- package/node_modules/@types/node/web-globals/storage.d.ts +24 -0
- package/node_modules/@types/node/web-globals/streams.d.ts +22 -0
- package/node_modules/@types/node/worker_threads.d.ts +819 -0
- package/node_modules/@types/node/zlib.d.ts +747 -0
- package/node_modules/@types/react/LICENSE +21 -0
- package/node_modules/@types/react/README.md +15 -0
- package/node_modules/@types/react/canary.d.ts +129 -0
- package/node_modules/@types/react/compiler-runtime.d.ts +4 -0
- package/node_modules/@types/react/experimental.d.ts +184 -0
- package/node_modules/@types/react/global.d.ts +166 -0
- package/node_modules/@types/react/index.d.ts +4378 -0
- package/node_modules/@types/react/jsx-dev-runtime.d.ts +33 -0
- package/node_modules/@types/react/jsx-runtime.d.ts +24 -0
- package/node_modules/@types/react/package.json +210 -0
- package/node_modules/@types/react/ts5.0/canary.d.ts +129 -0
- package/node_modules/@types/react/ts5.0/experimental.d.ts +184 -0
- package/node_modules/@types/react/ts5.0/global.d.ts +166 -0
- package/node_modules/@types/react/ts5.0/index.d.ts +4365 -0
- package/node_modules/@types/react/ts5.0/jsx-dev-runtime.d.ts +33 -0
- package/node_modules/@types/react/ts5.0/jsx-runtime.d.ts +24 -0
- package/node_modules/csstype/LICENSE +19 -0
- package/node_modules/csstype/README.md +291 -0
- package/node_modules/csstype/index.d.ts +22569 -0
- package/node_modules/csstype/index.js.flow +6863 -0
- package/node_modules/csstype/package.json +70 -0
- package/node_modules/entities/LICENSE +11 -0
- package/node_modules/entities/decode.d.ts +1 -0
- package/node_modules/entities/decode.js +3 -0
- package/node_modules/entities/dist/commonjs/decode-codepoint.d.ts +19 -0
- package/node_modules/entities/dist/commonjs/decode-codepoint.d.ts.map +1 -0
- package/node_modules/entities/dist/commonjs/decode-codepoint.js +77 -0
- package/node_modules/entities/dist/commonjs/decode-codepoint.js.map +1 -0
- package/node_modules/entities/dist/commonjs/decode.d.ts +209 -0
- package/node_modules/entities/dist/commonjs/decode.d.ts.map +1 -0
- package/node_modules/entities/dist/commonjs/decode.js +511 -0
- package/node_modules/entities/dist/commonjs/decode.js.map +1 -0
- package/node_modules/entities/dist/commonjs/encode.d.ts +22 -0
- package/node_modules/entities/dist/commonjs/encode.d.ts.map +1 -0
- package/node_modules/entities/dist/commonjs/encode.js +73 -0
- package/node_modules/entities/dist/commonjs/encode.js.map +1 -0
- package/node_modules/entities/dist/commonjs/escape.d.ts +43 -0
- package/node_modules/entities/dist/commonjs/escape.d.ts.map +1 -0
- package/node_modules/entities/dist/commonjs/escape.js +121 -0
- package/node_modules/entities/dist/commonjs/escape.js.map +1 -0
- package/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts +2 -0
- package/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts.map +1 -0
- package/node_modules/entities/dist/commonjs/generated/decode-data-html.js +10 -0
- package/node_modules/entities/dist/commonjs/generated/decode-data-html.js.map +1 -0
- package/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts +2 -0
- package/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts.map +1 -0
- package/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +10 -0
- package/node_modules/entities/dist/commonjs/generated/decode-data-xml.js.map +1 -0
- package/node_modules/entities/dist/commonjs/generated/encode-html.d.ts +8 -0
- package/node_modules/entities/dist/commonjs/generated/encode-html.d.ts.map +1 -0
- package/node_modules/entities/dist/commonjs/generated/encode-html.js +13 -0
- package/node_modules/entities/dist/commonjs/generated/encode-html.js.map +1 -0
- package/node_modules/entities/dist/commonjs/index.d.ts +96 -0
- package/node_modules/entities/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/entities/dist/commonjs/index.js +131 -0
- package/node_modules/entities/dist/commonjs/index.js.map +1 -0
- package/node_modules/entities/dist/commonjs/package.json +3 -0
- package/node_modules/entities/dist/esm/decode-codepoint.d.ts +19 -0
- package/node_modules/entities/dist/esm/decode-codepoint.d.ts.map +1 -0
- package/node_modules/entities/dist/esm/decode-codepoint.js +72 -0
- package/node_modules/entities/dist/esm/decode-codepoint.js.map +1 -0
- package/node_modules/entities/dist/esm/decode.d.ts +209 -0
- package/node_modules/entities/dist/esm/decode.d.ts.map +1 -0
- package/node_modules/entities/dist/esm/decode.js +497 -0
- package/node_modules/entities/dist/esm/decode.js.map +1 -0
- package/node_modules/entities/dist/esm/encode.d.ts +22 -0
- package/node_modules/entities/dist/esm/encode.d.ts.map +1 -0
- package/node_modules/entities/dist/esm/encode.js +69 -0
- package/node_modules/entities/dist/esm/encode.js.map +1 -0
- package/node_modules/entities/dist/esm/escape.d.ts +43 -0
- package/node_modules/entities/dist/esm/escape.d.ts.map +1 -0
- package/node_modules/entities/dist/esm/escape.js +117 -0
- package/node_modules/entities/dist/esm/escape.js.map +1 -0
- package/node_modules/entities/dist/esm/generated/decode-data-html.d.ts +2 -0
- package/node_modules/entities/dist/esm/generated/decode-data-html.d.ts.map +1 -0
- package/node_modules/entities/dist/esm/generated/decode-data-html.js +7 -0
- package/node_modules/entities/dist/esm/generated/decode-data-html.js.map +1 -0
- package/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts +2 -0
- package/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts.map +1 -0
- package/node_modules/entities/dist/esm/generated/decode-data-xml.js +7 -0
- package/node_modules/entities/dist/esm/generated/decode-data-xml.js.map +1 -0
- package/node_modules/entities/dist/esm/generated/encode-html.d.ts +8 -0
- package/node_modules/entities/dist/esm/generated/encode-html.d.ts.map +1 -0
- package/node_modules/entities/dist/esm/generated/encode-html.js +10 -0
- package/node_modules/entities/dist/esm/generated/encode-html.js.map +1 -0
- package/node_modules/entities/dist/esm/index.d.ts +96 -0
- package/node_modules/entities/dist/esm/index.d.ts.map +1 -0
- package/node_modules/entities/dist/esm/index.js +107 -0
- package/node_modules/entities/dist/esm/index.js.map +1 -0
- package/node_modules/entities/dist/esm/package.json +3 -0
- package/node_modules/entities/escape.d.ts +1 -0
- package/node_modules/entities/escape.js +3 -0
- package/node_modules/entities/package.json +118 -0
- package/node_modules/entities/readme.md +122 -0
- package/node_modules/entities/src/decode-codepoint.ts +81 -0
- package/node_modules/entities/src/decode.spec.ts +320 -0
- package/node_modules/entities/src/decode.ts +620 -0
- package/node_modules/entities/src/encode.spec.ts +78 -0
- package/node_modules/entities/src/encode.ts +77 -0
- package/node_modules/entities/src/escape.spec.ts +14 -0
- package/node_modules/entities/src/escape.ts +148 -0
- package/node_modules/entities/src/generated/.eslintrc.json +10 -0
- package/node_modules/entities/src/generated/decode-data-html.ts +8 -0
- package/node_modules/entities/src/generated/decode-data-xml.ts +8 -0
- package/node_modules/entities/src/generated/encode-html.ts +17 -0
- package/node_modules/entities/src/index.spec.ts +125 -0
- package/node_modules/entities/src/index.ts +188 -0
- package/node_modules/parse5/LICENSE +19 -0
- package/node_modules/parse5/README.md +38 -0
- package/node_modules/parse5/dist/cjs/common/doctype.d.ts +4 -0
- package/node_modules/parse5/dist/cjs/common/doctype.js +118 -0
- package/node_modules/parse5/dist/cjs/common/error-codes.d.ts +67 -0
- package/node_modules/parse5/dist/cjs/common/error-codes.js +66 -0
- package/node_modules/parse5/dist/cjs/common/foreign-content.d.ts +9 -0
- package/node_modules/parse5/dist/cjs/common/foreign-content.js +237 -0
- package/node_modules/parse5/dist/cjs/common/html.d.ts +289 -0
- package/node_modules/parse5/dist/cjs/common/html.js +528 -0
- package/node_modules/parse5/dist/cjs/common/token.d.ts +84 -0
- package/node_modules/parse5/dist/cjs/common/token.js +24 -0
- package/node_modules/parse5/dist/cjs/common/unicode.d.ts +42 -0
- package/node_modules/parse5/dist/cjs/common/unicode.js +70 -0
- package/node_modules/parse5/dist/cjs/index.d.ts +71 -0
- package/node_modules/parse5/dist/cjs/index.js +54 -0
- package/node_modules/parse5/dist/cjs/package.json +1 -0
- package/node_modules/parse5/dist/cjs/parser/formatting-element-list.d.ts +36 -0
- package/node_modules/parse5/dist/cjs/parser/formatting-element-list.js +114 -0
- package/node_modules/parse5/dist/cjs/parser/index.d.ts +221 -0
- package/node_modules/parse5/dist/cjs/parser/index.js +3240 -0
- package/node_modules/parse5/dist/cjs/parser/open-element-stack.d.ts +53 -0
- package/node_modules/parse5/dist/cjs/parser/open-element-stack.js +328 -0
- package/node_modules/parse5/dist/cjs/serializer/index.d.ts +60 -0
- package/node_modules/parse5/dist/cjs/serializer/index.js +172 -0
- package/node_modules/parse5/dist/cjs/tokenizer/index.d.ts +247 -0
- package/node_modules/parse5/dist/cjs/tokenizer/index.js +2714 -0
- package/node_modules/parse5/dist/cjs/tokenizer/preprocessor.d.ts +36 -0
- package/node_modules/parse5/dist/cjs/tokenizer/preprocessor.js +200 -0
- package/node_modules/parse5/dist/cjs/tree-adapters/default.d.ts +84 -0
- package/node_modules/parse5/dist/cjs/tree-adapters/default.js +176 -0
- package/node_modules/parse5/dist/cjs/tree-adapters/interface.d.ts +255 -0
- package/node_modules/parse5/dist/cjs/tree-adapters/interface.js +2 -0
- package/node_modules/parse5/dist/common/doctype.d.ts +4 -0
- package/node_modules/parse5/dist/common/doctype.js +114 -0
- package/node_modules/parse5/dist/common/error-codes.d.ts +67 -0
- package/node_modules/parse5/dist/common/error-codes.js +63 -0
- package/node_modules/parse5/dist/common/foreign-content.d.ts +9 -0
- package/node_modules/parse5/dist/common/foreign-content.js +228 -0
- package/node_modules/parse5/dist/common/html.d.ts +289 -0
- package/node_modules/parse5/dist/common/html.js +523 -0
- package/node_modules/parse5/dist/common/token.d.ts +84 -0
- package/node_modules/parse5/dist/common/token.js +20 -0
- package/node_modules/parse5/dist/common/unicode.d.ts +42 -0
- package/node_modules/parse5/dist/common/unicode.js +62 -0
- package/node_modules/parse5/dist/index.d.ts +71 -0
- package/node_modules/parse5/dist/index.js +42 -0
- package/node_modules/parse5/dist/parser/formatting-element-list.d.ts +36 -0
- package/node_modules/parse5/dist/parser/formatting-element-list.js +110 -0
- package/node_modules/parse5/dist/parser/index.d.ts +221 -0
- package/node_modules/parse5/dist/parser/index.js +3245 -0
- package/node_modules/parse5/dist/parser/open-element-stack.d.ts +53 -0
- package/node_modules/parse5/dist/parser/open-element-stack.js +324 -0
- package/node_modules/parse5/dist/serializer/index.d.ts +60 -0
- package/node_modules/parse5/dist/serializer/index.js +168 -0
- package/node_modules/parse5/dist/tokenizer/index.d.ts +247 -0
- package/node_modules/parse5/dist/tokenizer/index.js +2710 -0
- package/node_modules/parse5/dist/tokenizer/preprocessor.d.ts +36 -0
- package/node_modules/parse5/dist/tokenizer/preprocessor.js +196 -0
- package/node_modules/parse5/dist/tree-adapters/default.d.ts +84 -0
- package/node_modules/parse5/dist/tree-adapters/default.js +173 -0
- package/node_modules/parse5/dist/tree-adapters/interface.d.ts +255 -0
- package/node_modules/parse5/dist/tree-adapters/interface.js +1 -0
- package/node_modules/parse5/package.json +50 -0
- package/node_modules/undici-types/LICENSE +21 -0
- package/node_modules/undici-types/README.md +6 -0
- package/node_modules/undici-types/agent.d.ts +31 -0
- package/node_modules/undici-types/api.d.ts +43 -0
- package/node_modules/undici-types/balanced-pool.d.ts +29 -0
- package/node_modules/undici-types/cache.d.ts +36 -0
- package/node_modules/undici-types/client.d.ts +108 -0
- package/node_modules/undici-types/connector.d.ts +34 -0
- package/node_modules/undici-types/content-type.d.ts +21 -0
- package/node_modules/undici-types/cookies.d.ts +28 -0
- package/node_modules/undici-types/diagnostics-channel.d.ts +66 -0
- package/node_modules/undici-types/dispatcher.d.ts +256 -0
- package/node_modules/undici-types/env-http-proxy-agent.d.ts +21 -0
- package/node_modules/undici-types/errors.d.ts +149 -0
- package/node_modules/undici-types/eventsource.d.ts +61 -0
- package/node_modules/undici-types/fetch.d.ts +209 -0
- package/node_modules/undici-types/file.d.ts +39 -0
- package/node_modules/undici-types/filereader.d.ts +54 -0
- package/node_modules/undici-types/formdata.d.ts +108 -0
- package/node_modules/undici-types/global-dispatcher.d.ts +9 -0
- package/node_modules/undici-types/global-origin.d.ts +7 -0
- package/node_modules/undici-types/handlers.d.ts +15 -0
- package/node_modules/undici-types/header.d.ts +4 -0
- package/node_modules/undici-types/index.d.ts +71 -0
- package/node_modules/undici-types/interceptors.d.ts +17 -0
- package/node_modules/undici-types/mock-agent.d.ts +50 -0
- package/node_modules/undici-types/mock-client.d.ts +25 -0
- package/node_modules/undici-types/mock-errors.d.ts +12 -0
- package/node_modules/undici-types/mock-interceptor.d.ts +93 -0
- package/node_modules/undici-types/mock-pool.d.ts +25 -0
- package/node_modules/undici-types/package.json +55 -0
- package/node_modules/undici-types/patch.d.ts +33 -0
- package/node_modules/undici-types/pool-stats.d.ts +19 -0
- package/node_modules/undici-types/pool.d.ts +39 -0
- package/node_modules/undici-types/proxy-agent.d.ts +28 -0
- package/node_modules/undici-types/readable.d.ts +65 -0
- package/node_modules/undici-types/retry-agent.d.ts +8 -0
- package/node_modules/undici-types/retry-handler.d.ts +116 -0
- package/node_modules/undici-types/util.d.ts +18 -0
- package/node_modules/undici-types/webidl.d.ts +228 -0
- package/node_modules/undici-types/websocket.d.ts +150 -0
- package/package.json +80 -0
- package/scripts/rebuild-forme.mjs +61 -0
- package/src/app/AppearanceControl.tsx +44 -0
- package/src/app/AssetThemeDefaults.tsx +87 -0
- package/src/app/AssetsBrowser.tsx +273 -0
- package/src/app/CommentDock.tsx +108 -0
- package/src/app/CreateDocumentDialog.tsx +51 -0
- package/src/app/DocumentActions.tsx +69 -0
- package/src/app/DocumentCard.tsx +50 -0
- package/src/app/DocumentViewControl.tsx +31 -0
- package/src/app/DocumentsBrowser.tsx +70 -0
- package/src/app/ExportHistoryDialog.tsx +86 -0
- package/src/app/ExportMenu.tsx +127 -0
- package/src/app/GuideDialog.tsx +80 -0
- package/src/app/InspectionLayer.tsx +77 -0
- package/src/app/LogoUploadDialog.tsx +92 -0
- package/src/app/Markdown.tsx +34 -0
- package/src/app/MaterialsBrowser.tsx +149 -0
- package/src/app/PageNumberInput.tsx +56 -0
- package/src/app/Pdf.tsx +561 -0
- package/src/app/ProjectDialogs.tsx +100 -0
- package/src/app/Reader.tsx +769 -0
- package/src/app/SearchField.tsx +13 -0
- package/src/app/Sidebar.tsx +86 -0
- package/src/app/SkillIndex.tsx +30 -0
- package/src/app/TemplatesBrowser.tsx +149 -0
- package/src/app/ThemesBrowser.tsx +159 -0
- package/src/app/api.ts +47 -0
- package/src/app/appearance.ts +35 -0
- package/src/app/assets.css +139 -0
- package/src/app/catalogPreview.ts +20 -0
- package/src/app/colors.css +167 -0
- package/src/app/comment-dock.css +53 -0
- package/src/app/commentDrafts.ts +67 -0
- package/src/app/componentCorrection.ts +17 -0
- package/src/app/edit-workbench.css +87 -0
- package/src/app/editSession.ts +238 -0
- package/src/app/editorRecovery.ts +25 -0
- package/src/app/export-history.css +31 -0
- package/src/app/export.css +17 -0
- package/src/app/guideLinks.ts +21 -0
- package/src/app/guides.css +40 -0
- package/src/app/main.tsx +221 -0
- package/src/app/materials.css +53 -0
- package/src/app/pdfLoading.ts +12 -0
- package/src/app/pdfSelection.ts +112 -0
- package/src/app/projects.css +63 -0
- package/src/app/reader-toolbar.css +65 -0
- package/src/app/selection.css +150 -0
- package/src/app/sidebar.css +60 -0
- package/src/app/skills.css +7 -0
- package/src/app/style.css +1061 -0
- package/src/app/templates.css +49 -0
- package/src/app/themes.css +80 -0
- package/src/app/ui/Icon.tsx +92 -0
- package/src/app/ui/README.md +27 -0
- package/src/app/ui/fonts.css +36 -0
- package/src/app/ui/index.tsx +223 -0
- package/src/app/ui/ui.css +388 -0
- package/src/app/useReaderPreview.ts +19 -0
- package/src/app/useTextEditing.ts +155 -0
- package/src/assets/adapter.ts +122 -0
- package/src/assets/files.ts +378 -0
- package/src/assets/import-worker.ts +294 -0
- package/src/assets/imports.ts +124 -0
- package/src/assets/index.ts +60 -0
- package/src/assets/store.ts +798 -0
- package/src/assets/usage.ts +118 -0
- package/src/cli/check.ts +25 -0
- package/src/cli/init.ts +119 -0
- package/src/cli/lock.ts +34 -0
- package/src/cli/main.ts +118 -0
- package/src/cli/process.ts +19 -0
- package/src/cli/start.ts +96 -0
- package/src/cli/update.ts +348 -0
- package/src/cli/workspace.ts +94 -0
- package/src/document/index.tsx +641 -0
- package/src/document/page.tsx +53 -0
- package/src/document/text-targets.tsx +162 -0
- package/src/media/files.ts +124 -0
- package/src/media/render.ts +63 -0
- package/src/rendering/resolve-sources.ts +84 -0
- package/src/runtime/jsx-dev-runtime.ts +2 -0
- package/src/runtime/jsx-runtime.ts +2 -0
- package/src/runtime/paths.ts +12 -0
- package/src/server/assets-cli.ts +162 -0
- package/src/server/assets-http.ts +100 -0
- package/src/server/client.ts +50 -0
- package/src/server/clipboard.ts +22 -0
- package/src/server/comments-cli.ts +64 -0
- package/src/server/comments.ts +130 -0
- package/src/server/create-cli.ts +33 -0
- package/src/server/create.ts +228 -0
- package/src/server/dependencies.ts +91 -0
- package/src/server/documents.ts +143 -0
- package/src/server/edits.ts +249 -0
- package/src/server/export-batch.ts +105 -0
- package/src/server/export-errors.ts +2 -0
- package/src/server/export-file.ts +57 -0
- package/src/server/export-inputs.ts +66 -0
- package/src/server/export-preview.ts +69 -0
- package/src/server/export.ts +32 -0
- package/src/server/exports.ts +283 -0
- package/src/server/files.ts +21 -0
- package/src/server/guides.ts +71 -0
- package/src/server/index.ts +432 -0
- package/src/server/materials.ts +39 -0
- package/src/server/media-cli.ts +73 -0
- package/src/server/media-mutations.ts +168 -0
- package/src/server/pptx.ts +160 -0
- package/src/server/preflight.ts +129 -0
- package/src/server/projects-cli.ts +29 -0
- package/src/server/projects.ts +187 -0
- package/src/server/render-error.ts +9 -0
- package/src/server/render-source.ts +24 -0
- package/src/server/render.ts +48 -0
- package/src/server/review-cli.ts +40 -0
- package/src/server/review.ts +161 -0
- package/src/server/selection.ts +23 -0
- package/src/server/source-overrides.ts +97 -0
- package/src/server/templates-cli.ts +51 -0
- package/src/server/templates.ts +186 -0
- package/src/server/text-layout.ts +41 -0
- package/src/server/text-source.ts +307 -0
- package/src/server/themes-cli.ts +59 -0
- package/src/server/themes.ts +215 -0
- package/src/server/ttf2eot.d.ts +3 -0
- package/src/server/worker.ts +166 -0
- package/src/server/workspace.ts +242 -0
- package/src/shared/anchors.ts +69 -0
- package/src/shared/assets.ts +154 -0
- package/src/shared/export.ts +34 -0
- package/src/shared/media.ts +33 -0
- package/src/shared/projects.ts +19 -0
- package/src/shared/selection.ts +94 -0
- package/src/shared/skill-index.ts +14 -0
- package/src/shared/starters.ts +19 -0
- package/src/shared/templates.ts +18 -0
- package/src/shared/themes.ts +24 -0
- package/src/shared/types.ts +39 -0
- package/src/template/index.ts +27 -0
- package/src/themes/index.ts +3 -0
- package/src/themes/neutral.ts +20 -0
- package/src/themes/types.ts +110 -0
- package/starter/assets/brand/wordmark.png +0 -0
- package/starter/assets/fonts/InterUI-LICENSE.txt +93 -0
- package/starter/assets/fonts/InterUI-Medium.ttf +0 -0
- package/starter/assets/fonts/InterUI-Regular.ttf +0 -0
- package/starter/assets/fonts/InterUI-source.json +19 -0
- package/starter/assets/fonts/OpenDocMono-Regular.ttf +0 -0
- package/starter/assets/fonts/OpenDocSans-Italic.ttf +0 -0
- package/starter/assets/fonts/OpenDocSans-Regular.ttf +0 -0
- package/starter/assets/fonts/OpenDocSans-Semibold.ttf +0 -0
- package/starter/assets/fonts/OpenDocSans-SemiboldItalic.ttf +0 -0
- package/starter/assets/fonts/OpenDocSerif-Italic.ttf +0 -0
- package/starter/assets/fonts/OpenDocSerif-Regular.ttf +0 -0
- package/starter/assets/fonts/OpenDocSerif-Semibold.ttf +0 -0
- package/starter/assets/fonts/OpenDocSerif-SemiboldItalic.ttf +0 -0
- package/starter/assets/fonts/SourceCode-LICENSE.md +93 -0
- package/starter/assets/fonts/SourceSans-LICENSE.md +93 -0
- package/starter/assets/fonts/SourceSerif-LICENSE.md +93 -0
- package/starter/assets/fonts/geist/OFL.txt +93 -0
- package/starter/assets/fonts/geist/asset.json +7 -0
- package/starter/assets/fonts/geist/files/1a9874b3be0fc168692a3d2327bccb4d28835653d3b91537a755296a467a83e3.ttf +0 -0
- package/starter/assets/fonts/geist/files/a8eefb873ba9c9020665f8a98302697ce1f3b79ab2deef6ee508c0ca6a82e876.ttf +0 -0
- package/starter/assets/fonts/geist/files/ccce59465ae5c61930ada5453834f60500fbd95084d85db63e0e65fad0125455.ttf +0 -0
- package/starter/assets/fonts/geist/files/f5e95110d70593672515080bee9148463ada0a7f77b89ed65a3d43cb2b0ff83a.pdf +0 -0
- package/starter/assets/fonts/geist/revisions/9a2bc12fb2f23cb27bc227087e63e1407bb804ee0586480bd6b7966ec69fb474.json +60 -0
- package/starter/assets/fonts/inter/OFL.txt +93 -0
- package/starter/assets/fonts/inter/asset.json +7 -0
- package/starter/assets/fonts/inter/files/1b08e7fc267a5c7e1d614100f604b83e7e8a0be241f0f288faa2b3ac93a683ba.ttf +0 -0
- package/starter/assets/fonts/inter/files/5b6f0c6f26e5c554a64cdcc3a9b5d802b7f9aec6206f1dbcfcdcad7b5860a2a9.ttf +0 -0
- package/starter/assets/fonts/inter/files/957db8560d510a198a7d0333fae7b6b444b00c20801581126273978d778eb3c3.pdf +0 -0
- package/starter/assets/fonts/inter/files/b37284b5701b6b168dfc770aa1a4ac492106422fd3ba76bc7641e37434e8019c.ttf +0 -0
- package/starter/assets/fonts/inter/files/c1811d32ac0f6eed1bbf57529f2ecdfc6c717d48a969dd864942436315a1b198.ttf +0 -0
- package/starter/assets/fonts/inter/files/e7a1aaf7eda9f2fad4131725fa556265ec75ca7b2d756260173a040363e8d4f7.ttf +0 -0
- package/starter/assets/fonts/inter/files/ef8f755d933b9310804cc9152f1f18cb2ac460d6b05054ec913d889c9f11f79e.ttf +0 -0
- package/starter/assets/fonts/inter/revisions/600391517c413963b71e278a57c26c40366c81fa3939a6b9755f446206766d12.json +99 -0
- package/starter/assets/fonts/inter/source.json +57 -0
- package/starter/assets/fonts/lato/OFL.txt +93 -0
- package/starter/assets/fonts/lato/asset.json +7 -0
- package/starter/assets/fonts/lato/files/4a6b566dbb28adb473a8789ce5169306f42f0c8a070ac92bae93636f36348b0d.pdf +0 -0
- package/starter/assets/fonts/lato/files/5adeb6b334d8fb99ef053bc052b952773d544315e0e1d668a12c0ce8bd51375c.ttf +0 -0
- package/starter/assets/fonts/lato/files/62c1b7f0d2e74b45960154c3520efc337b553db0961bfdc950d5618334596cc8.ttf +0 -0
- package/starter/assets/fonts/lato/files/71b8b7decbe75a881ed267be539d402bd1e9420b799658aada4e0d1bd5af803c.ttf +0 -0
- package/starter/assets/fonts/lato/files/8a0aace75d33794eece4b28187bfc1df0bbd2888b5d8a56e01788c8d65d16be1.ttf +0 -0
- package/starter/assets/fonts/lato/files/d636e4683231f931eda222d588e944d082bfd3bdba02f928bee461c0f185b251.ttf +0 -0
- package/starter/assets/fonts/lato/files/e399c44efe1387100531d26c7e4800c5d12251b890d6654a3098c7c679cb1786.ttf +0 -0
- package/starter/assets/fonts/lato/revisions/49ccb93400a9d466fab7d9843b1ecf8916ec6d47a475dd79a597a22eb39616bc.json +99 -0
- package/starter/assets/fonts/lato/source.json +57 -0
- package/starter/assets/fonts/merriweather/OFL.txt +93 -0
- package/starter/assets/fonts/merriweather/asset.json +7 -0
- package/starter/assets/fonts/merriweather/files/1c54f91b910454251c4c2b7bd4e472e1abf265fba7ca3c0ef2eee2f41324099e.ttf +0 -0
- package/starter/assets/fonts/merriweather/files/8bde8da2bb7f0265e27ba0481f70bb48d0f98a976c145f2f239c648ddd6532e0.pdf +0 -0
- package/starter/assets/fonts/merriweather/files/90b7db4460fcd1a5ca49575c2668a793f3cd6447664d312a068d690e1c01e6bc.ttf +0 -0
- package/starter/assets/fonts/merriweather/files/afff81272b7653417bb6f8bef57add055b1f9fda36f27eba5f32b40752bd08da.ttf +0 -0
- package/starter/assets/fonts/merriweather/files/e029d3b71e5bae3877c73f4f2b15af28db16593d49b0aed2a328d37ff7075846.ttf +0 -0
- package/starter/assets/fonts/merriweather/files/e9864a6790bf712a04e20f3662b206a1535186ed3e877fd859dd5fb9682335df.ttf +0 -0
- package/starter/assets/fonts/merriweather/files/fa71baebdd20a7d0de2e5e445a5922530fe9e1d740efbe791f113b682d3cb093.ttf +0 -0
- package/starter/assets/fonts/merriweather/revisions/1888e390b3e4f38a3d7cd2dc1bb805aeb6ce13f986a97656f0265fd436bc91d2.json +99 -0
- package/starter/assets/fonts/merriweather/source.json +57 -0
- package/starter/assets/fonts/open-sans/OFL.txt +92 -0
- package/starter/assets/fonts/open-sans/asset.json +7 -0
- package/starter/assets/fonts/open-sans/files/1bc0594a83762b2c25d38915a34464b7fec6088298ca22d151757bf98d6700ec.ttf +0 -0
- package/starter/assets/fonts/open-sans/files/47ed1cfaa7ffca04a04ab850b2938fd52c09d1b44cfa3e2980878e166b0cbd87.ttf +0 -0
- package/starter/assets/fonts/open-sans/files/574939af301f07df8e21cfff279465c5981dd9d9cf62086f7515897df951c6f5.pdf +0 -0
- package/starter/assets/fonts/open-sans/files/6d3884d0d57c1b67e9c50c54eca7b69c535c114e76bd7a9cfda0258588185553.ttf +0 -0
- package/starter/assets/fonts/open-sans/files/733eb93b167e6d45de09aa768f6c0355647c2c26f5416dbc7407a08ed41e81c6.ttf +0 -0
- package/starter/assets/fonts/open-sans/files/75367e6da7d914eaed87883ba51b2a2b5816b5cdbb39f96ec5c81a5b032bfd5a.ttf +0 -0
- package/starter/assets/fonts/open-sans/files/ff4fdc11204e0edd14e9a0bb6c374b847a9093b0ec2c16702e03afca79ac4ef7.ttf +0 -0
- package/starter/assets/fonts/open-sans/revisions/bbbe3a4915b9bccbc883c0decb4097511c43b6bd09ae22a1516aff128c219bc5.json +99 -0
- package/starter/assets/fonts/open-sans/source.json +57 -0
- package/starter/assets/fonts/roboto/OFL.txt +93 -0
- package/starter/assets/fonts/roboto/asset.json +7 -0
- package/starter/assets/fonts/roboto/files/22d45d989248a624252b8382067ac56550212fa675dcdbaf12f03d297dd87a58.pdf +0 -0
- package/starter/assets/fonts/roboto/files/35757eaa996b3359022f47f164a67ee9eac04971af24c5b8fbd4b89e844ff190.ttf +0 -0
- package/starter/assets/fonts/roboto/files/4d3035883c531846bd1ce2dc89f36d932e72dc114f56062c7e3a9cdd74f3d3ea.ttf +0 -0
- package/starter/assets/fonts/roboto/files/be7639306a4fc4a02ce2ae2ff59eb1335e4db4a7379dd0a384ed7cc053817789.ttf +0 -0
- package/starter/assets/fonts/roboto/files/d2920cbb1b60a3fd11fbf22049286e43a6baf522d37fdf1e7c89562319bcfea5.ttf +0 -0
- package/starter/assets/fonts/roboto/files/dece7c71bbe61710787f0839c722c65e87355dd2eb4a823e6b5488121ff81e4b.ttf +0 -0
- package/starter/assets/fonts/roboto/files/f478ba88b0292e685e487901dfbb1401457d32d6ebee4030cdfd5698235bffa8.ttf +0 -0
- package/starter/assets/fonts/roboto/revisions/bda5e2d84c17313373dd2dbf3e64fe0dd450c7e1b59e6929e69557e122fe976e.json +99 -0
- package/starter/assets/fonts/roboto/source.json +57 -0
- package/starter/assets/logos/opendoc/asset.json +6 -0
- package/starter/assets/logos/opendoc/files/831d5ccd9eb6709cc8439ea257c03d81452e81a28a3d1eedbd6a3b7daff687b6.png +0 -0
- package/starter/assets/logos/opendoc/revisions/834dde8926ddb81de687254195a168bb13bfb77803307f1257de1f2228be63b2.json +33 -0
- package/starter/assets/ui-fonts/geist/OFL.txt +93 -0
- package/starter/assets/ui-fonts/geist/geist-latin-ext-wght-italic.woff2 +0 -0
- package/starter/assets/ui-fonts/geist/geist-latin-ext-wght-normal.woff2 +0 -0
- package/starter/assets/ui-fonts/geist/geist-latin-wght-italic.woff2 +0 -0
- package/starter/assets/ui-fonts/geist/geist-latin-wght-normal.woff2 +0 -0
- package/starter/assets/ui-fonts/geist/source.json +26 -0
- package/starter/documents/welcome/assets.json +7 -0
- package/starter/documents/welcome/index.tsx +160 -0
- package/starter/documents/welcome/media/.gitkeep +0 -0
- package/starter/documents/welcome/media/paper-architecture/image.png +0 -0
- package/starter/documents/welcome/media/paper-architecture/meta.json +9 -0
- package/starter/documents/welcome/media/paper-architecture/prompt.txt +1 -0
- package/starter/documents/welcome/media/studio-rhythm/chart.svg +2343 -0
- package/starter/documents/welcome/media/studio-rhythm/data.json +234 -0
- package/starter/documents/welcome/media/studio-rhythm/generation.json +9 -0
- package/starter/documents/welcome/media/studio-rhythm/image.png +0 -0
- package/starter/documents/welcome/media/studio-rhythm/meta.json +11 -0
- package/starter/documents/welcome/media/studio-rhythm/recipe.py +79 -0
- package/starter/documents/welcome/theme.tsx +5 -0
- package/starter/documents/welcome-presentation/assets.json +7 -0
- package/starter/documents/welcome-presentation/index.tsx +166 -0
- package/starter/documents/welcome-presentation/media/.gitkeep +0 -0
- package/starter/documents/welcome-presentation/media/paper-architecture/image.png +0 -0
- package/starter/documents/welcome-presentation/media/paper-architecture/meta.json +9 -0
- package/starter/documents/welcome-presentation/media/paper-architecture/prompt.txt +1 -0
- package/starter/documents/welcome-presentation/media/studio-rhythm/chart.svg +1336 -0
- package/starter/documents/welcome-presentation/media/studio-rhythm/data.json +234 -0
- package/starter/documents/welcome-presentation/media/studio-rhythm/generation.json +9 -0
- package/starter/documents/welcome-presentation/media/studio-rhythm/image.png +0 -0
- package/starter/documents/welcome-presentation/media/studio-rhythm/meta.json +13 -0
- package/starter/documents/welcome-presentation/media/studio-rhythm/recipe.py +49 -0
- package/starter/documents/welcome-presentation/theme.tsx +5 -0
- package/starter/projects.json +17 -0
- package/starter/templates/AGENTS.md +9 -0
- package/starter/templates/_shared/BusinessLogo.tsx +14 -0
- package/starter/templates/_shared/Pricing.tsx +40 -0
- package/starter/templates/_shared/commerce.ts +93 -0
- package/starter/templates/brand-guidelines/AGENTS.md +32 -0
- package/starter/templates/brand-guidelines/index.tsx +62 -0
- package/starter/templates/brand-guidelines/preview.tsx +181 -0
- package/starter/templates/brand-guidelines/starter.tsx +179 -0
- package/starter/templates/brand-guidelines/template.json +15 -0
- package/starter/templates/business-proposal/AGENTS.md +13 -0
- package/starter/templates/business-proposal/README.md +36 -0
- package/starter/templates/business-proposal/data.json +37 -0
- package/starter/templates/business-proposal/examples/long.json +142 -0
- package/starter/templates/business-proposal/examples/sparse.json +17 -0
- package/starter/templates/business-proposal/examples/typical.json +37 -0
- package/starter/templates/business-proposal/index.tsx +59 -0
- package/starter/templates/business-proposal/preview.tsx +47 -0
- package/starter/templates/business-proposal/schema.ts +14 -0
- package/starter/templates/business-proposal/starter.tsx +18 -0
- package/starter/templates/business-proposal/template.json +11 -0
- package/starter/templates/company-profile/AGENTS.md +48 -0
- package/starter/templates/company-profile/index.tsx +69 -0
- package/starter/templates/company-profile/preview.tsx +185 -0
- package/starter/templates/company-profile/starter.tsx +186 -0
- package/starter/templates/company-profile/template.json +15 -0
- package/starter/templates/consulting-report/AGENTS.md +11 -0
- package/starter/templates/consulting-report/README.md +13 -0
- package/starter/templates/consulting-report/RESEARCH.md +10 -0
- package/starter/templates/consulting-report/index.tsx +44 -0
- package/starter/templates/consulting-report/preview.tsx +39 -0
- package/starter/templates/consulting-report/starter.tsx +15 -0
- package/starter/templates/consulting-report/template.json +11 -0
- package/starter/templates/editorial-essay/AGENTS.md +11 -0
- package/starter/templates/editorial-essay/README.md +11 -0
- package/starter/templates/editorial-essay/index.tsx +30 -0
- package/starter/templates/editorial-essay/preview.tsx +26 -0
- package/starter/templates/editorial-essay/starter.tsx +15 -0
- package/starter/templates/editorial-essay/template.json +11 -0
- package/starter/templates/executive-brief/AGENTS.md +9 -0
- package/starter/templates/executive-brief/README.md +11 -0
- package/starter/templates/executive-brief/index.tsx +33 -0
- package/starter/templates/executive-brief/preview.tsx +37 -0
- package/starter/templates/executive-brief/starter.tsx +11 -0
- package/starter/templates/executive-brief/template.json +11 -0
- package/starter/templates/image-story/AGENTS.md +37 -0
- package/starter/templates/image-story/index.tsx +106 -0
- package/starter/templates/image-story/preview.tsx +33 -0
- package/starter/templates/image-story/starter.tsx +24 -0
- package/starter/templates/image-story/template.json +13 -0
- package/starter/templates/invoice/AGENTS.md +13 -0
- package/starter/templates/invoice/README.md +40 -0
- package/starter/templates/invoice/data.json +61 -0
- package/starter/templates/invoice/examples/long.json +241 -0
- package/starter/templates/invoice/examples/sparse.json +33 -0
- package/starter/templates/invoice/examples/typical.json +61 -0
- package/starter/templates/invoice/index.tsx +57 -0
- package/starter/templates/invoice/preview.tsx +12 -0
- package/starter/templates/invoice/schema.ts +45 -0
- package/starter/templates/invoice/starter.tsx +12 -0
- package/starter/templates/invoice/template.json +11 -0
- package/starter/templates/literary-text/AGENTS.md +9 -0
- package/starter/templates/literary-text/README.md +11 -0
- package/starter/templates/literary-text/index.tsx +31 -0
- package/starter/templates/literary-text/preview.tsx +20 -0
- package/starter/templates/literary-text/starter.tsx +11 -0
- package/starter/templates/literary-text/template.json +11 -0
- package/starter/templates/magazine-feature/AGENTS.md +11 -0
- package/starter/templates/magazine-feature/README.md +13 -0
- package/starter/templates/magazine-feature/index.tsx +41 -0
- package/starter/templates/magazine-feature/preview.tsx +34 -0
- package/starter/templates/magazine-feature/starter.tsx +15 -0
- package/starter/templates/magazine-feature/template.json +11 -0
- package/starter/templates/monthly-report/AGENTS.md +11 -0
- package/starter/templates/monthly-report/README.md +24 -0
- package/starter/templates/monthly-report/data.json +131 -0
- package/starter/templates/monthly-report/examples/long.json +519 -0
- package/starter/templates/monthly-report/examples/sparse.json +20 -0
- package/starter/templates/monthly-report/examples/typical.json +37 -0
- package/starter/templates/monthly-report/index.tsx +92 -0
- package/starter/templates/monthly-report/preview.tsx +14 -0
- package/starter/templates/monthly-report/schema.ts +127 -0
- package/starter/templates/monthly-report/starter.tsx +13 -0
- package/starter/templates/monthly-report/template.json +11 -0
- package/starter/templates/pitch-deck/AGENTS.md +32 -0
- package/starter/templates/pitch-deck/index.tsx +46 -0
- package/starter/templates/pitch-deck/preview.tsx +142 -0
- package/starter/templates/pitch-deck/starter.tsx +140 -0
- package/starter/templates/pitch-deck/template.json +15 -0
- package/starter/templates/proposal-deck/AGENTS.md +25 -0
- package/starter/templates/proposal-deck/index.tsx +52 -0
- package/starter/templates/proposal-deck/preview.tsx +172 -0
- package/starter/templates/proposal-deck/starter.tsx +168 -0
- package/starter/templates/proposal-deck/template.json +7 -0
- package/starter/templates/quotation/AGENTS.md +13 -0
- package/starter/templates/quotation/README.md +42 -0
- package/starter/templates/quotation/data.json +64 -0
- package/starter/templates/quotation/examples/long.json +272 -0
- package/starter/templates/quotation/examples/sparse.json +31 -0
- package/starter/templates/quotation/examples/typical.json +64 -0
- package/starter/templates/quotation/index.tsx +51 -0
- package/starter/templates/quotation/preview.tsx +12 -0
- package/starter/templates/quotation/schema.ts +27 -0
- package/starter/templates/quotation/starter.tsx +12 -0
- package/starter/templates/quotation/template.json +11 -0
- package/starter/templates/scientific-paper/AGENTS.md +11 -0
- package/starter/templates/scientific-paper/README.md +13 -0
- package/starter/templates/scientific-paper/index.tsx +47 -0
- package/starter/templates/scientific-paper/preview.tsx +43 -0
- package/starter/templates/scientific-paper/starter.tsx +15 -0
- package/starter/templates/scientific-paper/template.json +11 -0
- package/starter/themes/Specimen.tsx +54 -0
- package/starter/themes/civic-spectrum/components.tsx +92 -0
- package/starter/themes/civic-spectrum/design.md +70 -0
- package/starter/themes/civic-spectrum/index.ts +57 -0
- package/starter/themes/civic-spectrum/preview.tsx +66 -0
- package/starter/themes/field-manual/components.tsx +106 -0
- package/starter/themes/field-manual/design.md +72 -0
- package/starter/themes/field-manual/index.ts +57 -0
- package/starter/themes/field-manual/preview.tsx +82 -0
- package/starter/themes/index.ts +3 -0
- package/starter/themes/mckinsey-consulting/components.tsx +69 -0
- package/starter/themes/mckinsey-consulting/design.md +68 -0
- package/starter/themes/mckinsey-consulting/index.ts +60 -0
- package/starter/themes/mckinsey-consulting/preview.tsx +53 -0
- package/starter/themes/neutral/design.md +35 -0
- package/starter/themes/neutral/index.ts +21 -0
- package/starter/themes/neutral/preview.tsx +4 -0
- package/starter/themes/opendoc-neutral/components.tsx +77 -0
- package/starter/themes/opendoc-neutral/design.md +70 -0
- package/starter/themes/opendoc-neutral/index.ts +54 -0
- package/starter/themes/opendoc-neutral/preview.tsx +43 -0
- package/starter/themes/types.ts +3 -0
- package/tsconfig.workspace.json +24 -0
- package/vendor/formepdf/LICENSE +21 -0
- package/vendor/formepdf/README.md +97 -0
- package/vendor/formepdf/font-subset.patch +228 -0
- package/vendor/formepdf/text-writer.patch +507 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { getBlock, type Comment, type RenderArtifact } from './types';
|
|
2
|
+
import type { DocumentSelection, TextAnchor, TextTarget } from './selection';
|
|
3
|
+
|
|
4
|
+
export function getTextTarget(artifact: RenderArtifact | null | undefined, id: string | null | undefined): TextTarget | undefined {
|
|
5
|
+
return typeof id === 'string' ? artifact?.textTargets?.find(target => target.id === id) : undefined;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function rangeOf(artifact: RenderArtifact | null | undefined, selection: DocumentSelection | null | undefined) {
|
|
9
|
+
if (!selection) return undefined;
|
|
10
|
+
const target = getTextTarget(artifact, selection.targetId);
|
|
11
|
+
const { start, end } = selection;
|
|
12
|
+
if (!target || target.blockId !== selection.blockId || !Number.isInteger(start) || !Number.isInteger(end)
|
|
13
|
+
|| start! < 0 || end! <= start! || end! > target.text.length) return undefined;
|
|
14
|
+
const text = target.text.slice(start, end);
|
|
15
|
+
if (selection.quote !== undefined && selection.quote !== text) return undefined;
|
|
16
|
+
return { target, start: start!, end: end!, text };
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function getEditableSelection(artifact: RenderArtifact | null | undefined, selection: DocumentSelection | null | undefined) {
|
|
20
|
+
const range = rangeOf(artifact, selection);
|
|
21
|
+
if (!range) return undefined;
|
|
22
|
+
const runs = range.target.runs.filter(candidate => candidate.start <= range.start && candidate.end >= range.end);
|
|
23
|
+
const run = runs.length === 1 ? runs[0] : undefined;
|
|
24
|
+
if (!run?.source || run.protected || run.source.value !== range.target.text.slice(run.start, run.end)) return undefined;
|
|
25
|
+
return { ...range, run, source: run.source };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function selectionReason(artifact: RenderArtifact | null | undefined, selection: DocumentSelection | null | undefined) {
|
|
29
|
+
if (!selection) return 'Click a text component to make a quick correction.';
|
|
30
|
+
if (getEditableSelection(artifact, selection)) return '';
|
|
31
|
+
const range = rangeOf(artifact, selection);
|
|
32
|
+
if (!range) return 'This component does not have a writable text field. Leave a comment for your agent.';
|
|
33
|
+
const run = range.target.runs.find(candidate => candidate.start <= range.start && candidate.end >= range.end);
|
|
34
|
+
return run?.reason ?? range.target.reason ?? (run?.protected
|
|
35
|
+
? 'Generated text—ask your agent to change its source.'
|
|
36
|
+
: 'This selection spans formatting or separate fields. Ask your agent to change it.');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function anchorForSelection(artifact: RenderArtifact | null | undefined, selection: DocumentSelection | null | undefined): TextAnchor | undefined {
|
|
40
|
+
const range = rangeOf(artifact, selection);
|
|
41
|
+
if (!range || range.target.stable === false) return undefined;
|
|
42
|
+
const { target, start, end, text } = range;
|
|
43
|
+
return { targetId: target.id, start, end, quote: text, prefix: target.text.slice(Math.max(0, start - 40), start), suffix: target.text.slice(end, end + 40) };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface ResolvedCommentAnchor {
|
|
47
|
+
status: 'attached' | 'changed' | 'missing';
|
|
48
|
+
selection?: DocumentSelection;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Reflow does not alter a target. Content changes require an unambiguous quote. */
|
|
52
|
+
export function resolveCommentAnchor(artifact: RenderArtifact | null | undefined, comment: Pick<Comment, 'blockId' | 'anchor' | 'quote'>): ResolvedCommentAnchor {
|
|
53
|
+
if (!getBlock(artifact, comment.blockId)) return { status: 'missing' };
|
|
54
|
+
const page = (artifact?.pages.findIndex(item => item.fragments.some(fragment => fragment.id === comment.blockId)) ?? -1) + 1;
|
|
55
|
+
const blockSelection: DocumentSelection = { blockId: comment.blockId, page: Math.max(1, page), quote: comment.quote, renderHash: artifact?.hash };
|
|
56
|
+
if (!comment.anchor) return { status: 'attached', selection: blockSelection };
|
|
57
|
+
const anchor = comment.anchor;
|
|
58
|
+
const target = getTextTarget(artifact, anchor.targetId);
|
|
59
|
+
if (!target || target.stable === false || target.blockId !== comment.blockId || !anchor.quote) return { status: 'changed', selection: blockSelection };
|
|
60
|
+
const matches: number[] = [];
|
|
61
|
+
for (let at = target.text.indexOf(anchor.quote); at !== -1; at = target.text.indexOf(anchor.quote, at + 1)) matches.push(at);
|
|
62
|
+
const contextual = matches.filter(at => target.text.slice(Math.max(0, at - anchor.prefix.length), at) === anchor.prefix
|
|
63
|
+
&& target.text.slice(at + anchor.quote.length, at + anchor.quote.length + anchor.suffix.length) === anchor.suffix);
|
|
64
|
+
const start = matches.length === 1 ? matches[0] : contextual.length === 1 ? contextual[0] : undefined;
|
|
65
|
+
if (start === undefined) return { status: 'changed', selection: blockSelection };
|
|
66
|
+
const end = start + anchor.quote.length;
|
|
67
|
+
const line = target.lines.find(item => item.start <= start && item.end > start);
|
|
68
|
+
return { status: 'attached', selection: { ...blockSelection, targetId: target.id, start, end, quote: anchor.quote, page: line?.page ?? blockSelection.page } };
|
|
69
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/** Shared, file-first asset identities. Documents always store exact revisions. */
|
|
2
|
+
export type AssetKind = 'logo' | 'font';
|
|
3
|
+
export interface AssetRef {
|
|
4
|
+
id: string;
|
|
5
|
+
revision: string;
|
|
6
|
+
}
|
|
7
|
+
export interface LogoBinding extends AssetRef {
|
|
8
|
+
variation?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface DocumentAssets {
|
|
11
|
+
version: 1;
|
|
12
|
+
logo?: LogoBinding;
|
|
13
|
+
logos?: Record<string, LogoBinding>;
|
|
14
|
+
bodyFont?: AssetRef;
|
|
15
|
+
headingFont?: AssetRef;
|
|
16
|
+
}
|
|
17
|
+
export interface ThemeAssetDefaults {
|
|
18
|
+
version: 1;
|
|
19
|
+
logo?: {
|
|
20
|
+
id: string;
|
|
21
|
+
variation?: string;
|
|
22
|
+
};
|
|
23
|
+
bodyFont?: string;
|
|
24
|
+
headingFont?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface AssetFile {
|
|
27
|
+
file: string;
|
|
28
|
+
hash: string;
|
|
29
|
+
mime: string;
|
|
30
|
+
bytes: number;
|
|
31
|
+
width?: number;
|
|
32
|
+
height?: number;
|
|
33
|
+
}
|
|
34
|
+
export interface LogoVariation {
|
|
35
|
+
id: string;
|
|
36
|
+
name: string;
|
|
37
|
+
description: string;
|
|
38
|
+
original: AssetFile;
|
|
39
|
+
image: AssetFile;
|
|
40
|
+
}
|
|
41
|
+
export interface FontFace {
|
|
42
|
+
id: string;
|
|
43
|
+
family: string;
|
|
44
|
+
postscriptName?: string;
|
|
45
|
+
weight: number;
|
|
46
|
+
style: 'normal' | 'italic';
|
|
47
|
+
file: AssetFile;
|
|
48
|
+
}
|
|
49
|
+
export interface FontCompatibility {
|
|
50
|
+
status: 'ready' | 'needs-attention';
|
|
51
|
+
defaultEligible: boolean;
|
|
52
|
+
message?: string;
|
|
53
|
+
}
|
|
54
|
+
interface AssetRevisionBase {
|
|
55
|
+
version: 1;
|
|
56
|
+
id: string;
|
|
57
|
+
revision: string;
|
|
58
|
+
name: string;
|
|
59
|
+
description: string;
|
|
60
|
+
createdAt: string;
|
|
61
|
+
}
|
|
62
|
+
export interface LogoRevision extends AssetRevisionBase {
|
|
63
|
+
kind: 'logo';
|
|
64
|
+
defaultVariation: string;
|
|
65
|
+
variations: LogoVariation[];
|
|
66
|
+
}
|
|
67
|
+
export interface FontRevision extends AssetRevisionBase {
|
|
68
|
+
kind: 'font';
|
|
69
|
+
faces: FontFace[];
|
|
70
|
+
compatibility: FontCompatibility;
|
|
71
|
+
specimen?: AssetFile;
|
|
72
|
+
}
|
|
73
|
+
export type AssetRevision = LogoRevision | FontRevision;
|
|
74
|
+
export interface ArchivedThemeDefault {
|
|
75
|
+
id: string;
|
|
76
|
+
defaults: ThemeAssetDefaults;
|
|
77
|
+
cleared: string;
|
|
78
|
+
}
|
|
79
|
+
export interface AssetHead {
|
|
80
|
+
version: 1;
|
|
81
|
+
id: string;
|
|
82
|
+
kind: AssetKind;
|
|
83
|
+
revision: string;
|
|
84
|
+
archived?: boolean;
|
|
85
|
+
builtIn?: boolean;
|
|
86
|
+
archivedDefaults?: ArchivedThemeDefault[];
|
|
87
|
+
}
|
|
88
|
+
export interface AssetUse extends AssetRef {
|
|
89
|
+
kind: AssetKind;
|
|
90
|
+
variation?: string;
|
|
91
|
+
face?: string;
|
|
92
|
+
blockId?: string;
|
|
93
|
+
}
|
|
94
|
+
export interface AssetUsage {
|
|
95
|
+
themes: {
|
|
96
|
+
id: string;
|
|
97
|
+
name: string;
|
|
98
|
+
roles: string[];
|
|
99
|
+
}[];
|
|
100
|
+
documents: {
|
|
101
|
+
id: string;
|
|
102
|
+
name: string;
|
|
103
|
+
revision: string;
|
|
104
|
+
roles: string[];
|
|
105
|
+
rendered: boolean;
|
|
106
|
+
current: boolean;
|
|
107
|
+
trashed?: boolean;
|
|
108
|
+
}[];
|
|
109
|
+
}
|
|
110
|
+
export interface AssetSummary {
|
|
111
|
+
id: string;
|
|
112
|
+
kind: AssetKind;
|
|
113
|
+
name: string;
|
|
114
|
+
description: string;
|
|
115
|
+
revision: string;
|
|
116
|
+
archived: boolean;
|
|
117
|
+
builtIn?: boolean;
|
|
118
|
+
count: number;
|
|
119
|
+
error?: string;
|
|
120
|
+
compatibility?: FontCompatibility;
|
|
121
|
+
preview?: AssetFile;
|
|
122
|
+
}
|
|
123
|
+
export interface AssetInspection {
|
|
124
|
+
asset: AssetRevision;
|
|
125
|
+
head: AssetHead;
|
|
126
|
+
usage: AssetUsage;
|
|
127
|
+
versions: {
|
|
128
|
+
revision: string;
|
|
129
|
+
createdAt: string;
|
|
130
|
+
name: string;
|
|
131
|
+
}[];
|
|
132
|
+
folder: string;
|
|
133
|
+
examples: string[];
|
|
134
|
+
}
|
|
135
|
+
export interface SelectedAsset {
|
|
136
|
+
kind: AssetKind;
|
|
137
|
+
id: string;
|
|
138
|
+
revision?: string;
|
|
139
|
+
variation?: string;
|
|
140
|
+
face?: string;
|
|
141
|
+
}
|
|
142
|
+
export interface AssetCatalog {
|
|
143
|
+
items: AssetSummary[];
|
|
144
|
+
issues: string[];
|
|
145
|
+
}
|
|
146
|
+
/** Semantic font defaults need both readable body text and a real emphasis face. */
|
|
147
|
+
export function fontCanBeDefault(font: FontRevision): boolean {
|
|
148
|
+
return (
|
|
149
|
+
font.compatibility.status === 'ready' &&
|
|
150
|
+
font.compatibility.defaultEligible &&
|
|
151
|
+
font.faces.some((face) => face.weight === 400 && face.style === 'normal') &&
|
|
152
|
+
font.faces.some((face) => (face.weight === 600 || face.weight === 700) && face.style === 'normal')
|
|
153
|
+
);
|
|
154
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AssetUse, DocumentAssets } from './assets';
|
|
2
|
+
|
|
3
|
+
export type ExportFormat = 'pdf' | 'pptx';
|
|
4
|
+
export const exportFormats = {
|
|
5
|
+
pdf: { label: 'PDF', extension: '.pdf', mime: 'application/pdf' },
|
|
6
|
+
pptx: { label: 'PowerPoint', extension: '.pptx', mime: 'application/vnd.openxmlformats-officedocument.presentationml.presentation' },
|
|
7
|
+
} as const;
|
|
8
|
+
export function exportInfo(format: ExportFormat = 'pdf') { return exportFormats[format]; }
|
|
9
|
+
|
|
10
|
+
export interface SavedExport {
|
|
11
|
+
id: string;
|
|
12
|
+
documentId: string;
|
|
13
|
+
hash: string;
|
|
14
|
+
filename: string;
|
|
15
|
+
path: string;
|
|
16
|
+
bytes: number;
|
|
17
|
+
createdAt: string;
|
|
18
|
+
/** Older receipts are PDF exports. */
|
|
19
|
+
format?: ExportFormat;
|
|
20
|
+
/** Captured from the published artifact. Missing on older receipts means unknown. */
|
|
21
|
+
assetBindings?: DocumentAssets;
|
|
22
|
+
assets?: AssetUse[];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function suggestedExportName(title: string, format: ExportFormat = 'pdf') {
|
|
26
|
+
const cleaned = title.replace(/\.(pdf|pptx)$/i, '').replace(/[<>:"/\\|?*\u0000-\u001f\u007f]/g, '-').replace(/^[. ]+|[. ]+$/g, '').trim();
|
|
27
|
+
let name = Array.from(cleaned).slice(0, 90).join('');
|
|
28
|
+
while (new TextEncoder().encode(name).length > 180) name = Array.from(name).slice(0, -1).join('');
|
|
29
|
+
if (!name || /^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/i.test(name)) name = `Document${name ? ` ${name}` : ''}`;
|
|
30
|
+
return name + exportInfo(format).extension;
|
|
31
|
+
}
|
|
32
|
+
export const suggestedPdfName = (title: string) => suggestedExportName(title);
|
|
33
|
+
|
|
34
|
+
export interface ExportHistoryEntry extends SavedExport { available: boolean }
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type MediaKind = 'photo' | 'illustration' | 'chart' | 'diagram' | 'image';
|
|
2
|
+
export interface MediaMeta {
|
|
3
|
+
title: string;
|
|
4
|
+
description: string;
|
|
5
|
+
file: string;
|
|
6
|
+
kind: MediaKind;
|
|
7
|
+
alt?: string;
|
|
8
|
+
sources?: string[]; // Optional provenance notes or locations; interpreted by the author, never opened by OpenDoc.
|
|
9
|
+
data?: string; // Relative to this media folder; the specific data used in the visual.
|
|
10
|
+
recipe?: string; // Relative to this media folder; the script, specification, or prompt.
|
|
11
|
+
attribution?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface MediaUse { item: string; blockId?: string }
|
|
14
|
+
export interface MediaItem {
|
|
15
|
+
documentId: string; documentTitle: string; id: string; folder: string;
|
|
16
|
+
meta?: MediaMeta; metadataRevision?: string; error?: string; hash?: string; mime?: string;
|
|
17
|
+
width?: number; height?: number; bytes?: number;
|
|
18
|
+
freshness: 'original' | 'current' | 'unrecorded' | 'stale';
|
|
19
|
+
changedInputs?: string[];
|
|
20
|
+
usedIn: { blockId: string; pages: number[] }[];
|
|
21
|
+
usageKnown: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface Materials { media: MediaItem[]; issues: string[] }
|
|
24
|
+
/** Visual grouping never changes files, titles, descriptions, or ownership. */
|
|
25
|
+
export function groupMedia(items: MediaItem[]): MediaItem[][] {
|
|
26
|
+
const groups = new Map<string, MediaItem[]>();
|
|
27
|
+
for (const item of items) {
|
|
28
|
+
const key = item.hash && !item.error ? item.hash : `${item.documentId}/${item.id}`;
|
|
29
|
+
const group = groups.get(key) ?? [];
|
|
30
|
+
group.push(item); groups.set(key, group);
|
|
31
|
+
}
|
|
32
|
+
return [...groups.values()];
|
|
33
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { DocumentFormat } from './types';
|
|
2
|
+
export interface Project {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
defaultTheme: string | null;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/** Projects organize stable document folders; moving a document does not move its files. */
|
|
9
|
+
export interface ProjectsManifest {
|
|
10
|
+
version: 1;
|
|
11
|
+
projects: Project[];
|
|
12
|
+
assignments: Record<string, string>;
|
|
13
|
+
/** Library names are independent of authored PDF titles. */
|
|
14
|
+
names?: Record<string, string>;
|
|
15
|
+
/** Missing formats are ordinary documents, including older workspaces. */
|
|
16
|
+
formats?: Record<string, DocumentFormat>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const emptyProjects = (): ProjectsManifest => ({ version: 1, projects: [], assignments: {} });
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/** Source values are issued by the renderer. Clients never choose a file to edit. */
|
|
2
|
+
export type { TextEditPreview } from './types';
|
|
3
|
+
export interface TextSourceValue {
|
|
4
|
+
/** Identity of the authored token; draft previews retain their original binding. */
|
|
5
|
+
bindingId?: string;
|
|
6
|
+
file: string;
|
|
7
|
+
digest: string;
|
|
8
|
+
start: number;
|
|
9
|
+
end: number;
|
|
10
|
+
kind: 'jsx-text' | 'jsx-attribute' | 'string' | 'json-string';
|
|
11
|
+
value: string;
|
|
12
|
+
linkedOccurrences?: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface TextRun {
|
|
16
|
+
start: number;
|
|
17
|
+
end: number;
|
|
18
|
+
source?: TextSourceValue;
|
|
19
|
+
protected?: boolean;
|
|
20
|
+
reason?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface TextLine {
|
|
24
|
+
page: number;
|
|
25
|
+
x: number;
|
|
26
|
+
y: number;
|
|
27
|
+
width: number;
|
|
28
|
+
height: number;
|
|
29
|
+
text: string;
|
|
30
|
+
start: number;
|
|
31
|
+
end: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** A stable content slot within a block, independent of its current page. */
|
|
35
|
+
export interface TextTarget {
|
|
36
|
+
id: string;
|
|
37
|
+
blockId: string;
|
|
38
|
+
slot: string;
|
|
39
|
+
/** Anonymous positional slots support revision-checked edits, not durable phrase anchors. */
|
|
40
|
+
stable?: boolean;
|
|
41
|
+
text: string;
|
|
42
|
+
runs: TextRun[];
|
|
43
|
+
lines: TextLine[];
|
|
44
|
+
reason?: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface DocumentSelection {
|
|
48
|
+
blockId: string;
|
|
49
|
+
targetId?: string;
|
|
50
|
+
start?: number;
|
|
51
|
+
end?: number;
|
|
52
|
+
quote?: string;
|
|
53
|
+
page: number;
|
|
54
|
+
renderHash?: string;
|
|
55
|
+
revision?: number;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface TextAnchor {
|
|
59
|
+
targetId: string;
|
|
60
|
+
start: number;
|
|
61
|
+
end: number;
|
|
62
|
+
quote: string;
|
|
63
|
+
prefix: string;
|
|
64
|
+
suffix: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface ManualEditSummary {
|
|
68
|
+
id: string;
|
|
69
|
+
blockId: string;
|
|
70
|
+
targetId: string;
|
|
71
|
+
before: string;
|
|
72
|
+
after: string;
|
|
73
|
+
at: string;
|
|
74
|
+
canUndo: boolean;
|
|
75
|
+
count?: number;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface TextEditChange {
|
|
79
|
+
targetId: string;
|
|
80
|
+
start: number;
|
|
81
|
+
end: number;
|
|
82
|
+
replacement: string;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export interface TextEditInput extends TextEditChange {
|
|
86
|
+
revision: number;
|
|
87
|
+
hash: string;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export interface TextEditBatchInput {
|
|
91
|
+
revision: number;
|
|
92
|
+
hash: string;
|
|
93
|
+
edits: TextEditChange[];
|
|
94
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type SkillSummary = { name: string; description: string };
|
|
2
|
+
|
|
3
|
+
// Skill UI metadata uses JSON-quoted YAML scalars. Keep the app index derived
|
|
4
|
+
// from those descriptions rather than maintaining another catalog.
|
|
5
|
+
export function skillIndex(files: Record<string, string>): SkillSummary[] {
|
|
6
|
+
return Object.entries(files).map(([path, source]) => {
|
|
7
|
+
const name = path.match(/\/skills\/(opendoc-[a-z0-9-]+)\/agents\/openai\.yaml$/)?.[1];
|
|
8
|
+
const quoted = source.match(/^ short_description: ("(?:[^"\\]|\\.)*")\s*$/m)?.[1];
|
|
9
|
+
if (!name || !quoted) throw new Error(`Invalid skill index metadata: ${path}`);
|
|
10
|
+
const description: unknown = JSON.parse(quoted);
|
|
11
|
+
if (typeof description !== 'string' || !description.trim()) throw new Error(`Missing skill description: ${path}`);
|
|
12
|
+
return { name, description };
|
|
13
|
+
}).sort((a, b) => a.name.localeCompare(b.name));
|
|
14
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { DocumentKind, DocumentFormat } from './types';
|
|
2
|
+
|
|
3
|
+
export const TITLE_MAX_LENGTH = 160;
|
|
4
|
+
export const DOCUMENT_ID_MAX_LENGTH = 80;
|
|
5
|
+
export type StarterId = 'blank' | 'article' | 'report' | 'proposal' | 'research' | 'technical';
|
|
6
|
+
export interface StarterSummary { id: StarterId; name: string; description: string; kind?: DocumentKind }
|
|
7
|
+
export interface CreateDocumentInput { format?: DocumentFormat; starter?: string; title: string; projectId: string; id?: string; theme?: string | null }
|
|
8
|
+
export interface CreatedDocument { id: string; title: string; starter: StarterId; entry: string; projectId: string }
|
|
9
|
+
|
|
10
|
+
/** Optional, explicitly requested examples. Ordinary agent creation uses the minimal blank scaffold. */
|
|
11
|
+
export const starters: readonly StarterSummary[] = [
|
|
12
|
+
{ id: 'article', name: 'Article', description: 'Essays, assignments, and ideas with room to develop.', kind: 'article' },
|
|
13
|
+
{ id: 'report', name: 'Report', description: 'Findings, evidence, and a clear recommendation.', kind: 'report' },
|
|
14
|
+
{ id: 'proposal', name: 'Proposal', description: 'A considered plan with scope, deliverables, and next steps.', kind: 'proposal' },
|
|
15
|
+
{ id: 'research', name: 'Research paper', description: 'A question, a method, results, and their limits.', kind: 'research' },
|
|
16
|
+
{ id: 'technical', name: 'Technical brief', description: 'Requirements, decisions, and how to verify them.', kind: 'technical' },
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
export function listStarters(): StarterSummary[] { return starters.map(starter => ({ ...starter })); }
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DocumentFormat, RenderArtifact, ReviewIssue } from './types';
|
|
2
|
+
|
|
3
|
+
export interface TemplateDescriptor {
|
|
4
|
+
/** Omitted by existing document templates. */
|
|
5
|
+
documentFormat?: DocumentFormat;
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
format: string;
|
|
9
|
+
structure: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface TemplateItem {
|
|
12
|
+
id: string;
|
|
13
|
+
descriptor: TemplateDescriptor;
|
|
14
|
+
revision: string;
|
|
15
|
+
error?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface TemplatePreview { artifact?: RenderArtifact; error?: string; issues?: ReviewIssue[] }
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { RenderArtifact, ReviewIssue } from './types';
|
|
2
|
+
import type { ThemeAssetDefaults } from './assets';
|
|
3
|
+
|
|
4
|
+
/** Small catalog records; executable rules and design guides are loaded on demand. */
|
|
5
|
+
export interface ThemeSummary {
|
|
6
|
+
id: string;
|
|
7
|
+
revision?: string;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
body: string;
|
|
11
|
+
heading: string;
|
|
12
|
+
/** Current defaults are preferences for future documents and theme specimens only. */
|
|
13
|
+
assetDefaults?: ThemeAssetDefaults;
|
|
14
|
+
assetError?: string;
|
|
15
|
+
baseBody?: string;
|
|
16
|
+
baseHeading?: string;
|
|
17
|
+
pageSize: string;
|
|
18
|
+
useFor: string[];
|
|
19
|
+
principles: string[];
|
|
20
|
+
palette?: { name: string; value: string; role: string }[];
|
|
21
|
+
geometry?: string[];
|
|
22
|
+
error?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ThemePreview { artifact?: RenderArtifact; error?: string; issues?: ReviewIssue[] }
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { MediaUse } from './media';
|
|
2
|
+
import type { AssetUse, DocumentAssets, SelectedAsset } from './assets';
|
|
3
|
+
import type { DocumentSelection, ManualEditSummary, TextAnchor, TextTarget } from './selection';
|
|
4
|
+
/** Optional descriptive label chosen by the author, not a document taxonomy. */
|
|
5
|
+
export type DocumentKind = string;
|
|
6
|
+
export type DocumentFormat = 'document' | 'presentation';
|
|
7
|
+
export interface SlideInfo { id: string }
|
|
8
|
+
export interface DocumentMeta { title: string; description: string; kind?: DocumentKind; theme: string; author?: string }
|
|
9
|
+
export interface SourceLocation { file: string; line: number; column: number }
|
|
10
|
+
export interface BlockInfo { slideId?: string; id: string; kind: string; source?: SourceLocation; text: string }
|
|
11
|
+
export interface Fragment { id: string; x: number; y: number; width: number; height: number }
|
|
12
|
+
export interface PageInfo { width: number; height: number; fragments: Fragment[] }
|
|
13
|
+
export interface DocumentProvenance { entry: string; template?: string; dataFile?: string }
|
|
14
|
+
export interface ReviewIssue { code: string; severity: 'error' | 'warning'; message: string; page?: number; blockId?: string }
|
|
15
|
+
export interface OutlineEntry { id: string; title: string; level: number; page: number }
|
|
16
|
+
export interface RenderArtifact { format?: DocumentFormat; slides?: SlideInfo[]; textTargets?: TextTarget[]; media?: MediaUse[]; assets?: AssetUse[]; assetBindings?: DocumentAssets; assetDependencies?: string[]; meta: DocumentMeta; blocks: Record<string, BlockInfo>; pages: PageInfo[]; hash: string; renderedAt: string; provenance?: DocumentProvenance; issues?: ReviewIssue[]; outline?: OutlineEntry[] }
|
|
17
|
+
export interface TextEditPreview { artifact: RenderArtifact; pdfUrl: string }
|
|
18
|
+
/** JSON restores a plain object, so valid IDs such as "constructor" need an own-property lookup. */
|
|
19
|
+
export function getBlock(artifact: RenderArtifact | null | undefined, id: string | null | undefined): BlockInfo | undefined {
|
|
20
|
+
if (!artifact || typeof id !== 'string' || !Object.hasOwn(artifact.blocks, id)) return undefined;
|
|
21
|
+
return artifact.blocks[id];
|
|
22
|
+
}
|
|
23
|
+
export interface DocumentState { format?: DocumentFormat; id: string; name?: string; projectId?: string | null; status: 'rendering' | 'ready' | 'error'; error?: string; revision: number; artifact?: RenderArtifact; manualEdit?: ManualEditSummary }
|
|
24
|
+
/** Browsing needs metadata and paper sizes, not text targets or layout fragments. */
|
|
25
|
+
export type ArtifactSummary = Pick<RenderArtifact, 'meta' | 'hash' | 'renderedAt' | 'format'> & { pages: Pick<PageInfo, 'width' | 'height'>[] };
|
|
26
|
+
export type DocumentSummary = Omit<DocumentState, 'artifact'> & { artifact?: ArtifactSummary };
|
|
27
|
+
export function summarizeDocument(state: DocumentState): DocumentSummary {
|
|
28
|
+
const { artifact, ...summary } = state;
|
|
29
|
+
return { ...summary, ...(artifact ? { artifact: { format: artifact.format, meta: artifact.meta, hash: artifact.hash, renderedAt: artifact.renderedAt, pages: artifact.pages.map(({ width, height }) => ({ width, height })) } } : {}) };
|
|
30
|
+
}
|
|
31
|
+
export function documentFormat(document: DocumentSummary): DocumentFormat { return document.format ?? document.artifact?.format ?? 'document'; }
|
|
32
|
+
export function documentName(document: DocumentSummary) { return document.name ?? document.artifact?.meta.title ?? document.id; }
|
|
33
|
+
export interface Comment {
|
|
34
|
+
id: string; blockId: string; text: string; quote: string; status: 'open' | 'resolved' | 'deleted';
|
|
35
|
+
anchor?: TextAnchor;
|
|
36
|
+
createdAt: string; updatedAt: string; version: number;
|
|
37
|
+
history: { at: string; action: 'created' | 'resolved' | 'reopened' | 'edited' | 'deleted'; previousText?: string }[];
|
|
38
|
+
}
|
|
39
|
+
export interface WorkspaceContext { selectedAsset?: SelectedAsset | null; selection?: DocumentSelection | null; editing?: boolean; pendingEdits?: number; draftPreview?: boolean; themeId?: string | null; projectId?: string | null; mediaId?: string | null; documentId: string | null; blockId: string | null; page: number; updatedAt?: string }
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { DocumentMeta } from '../shared/types';
|
|
3
|
+
|
|
4
|
+
/** A template is ordinary, local code. Its parser owns its data contract. */
|
|
5
|
+
export interface DocumentTemplate<T> {
|
|
6
|
+
parse(input: unknown): T;
|
|
7
|
+
meta(data: T): DocumentMeta;
|
|
8
|
+
render(data: T): ReactNode;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function defineTemplate<T>(template: DocumentTemplate<T>): DocumentTemplate<T> {
|
|
12
|
+
return template;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Used by isolated edit validation to confirm the existing data contract ran. */
|
|
16
|
+
export function validateTemplateInput<T>(parse: (input: unknown) => T, input: unknown): T {
|
|
17
|
+
const data = parse(input);
|
|
18
|
+
(globalThis as typeof globalThis & { __opendocTemplateValidated?: boolean }).__opendocTemplateValidated = true;
|
|
19
|
+
return data;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Validate once at entry load, before either metadata or the PDF is produced. */
|
|
23
|
+
export function bindTemplate<T>(template: DocumentTemplate<T>, input: unknown) {
|
|
24
|
+
const data = validateTemplateInput(template.parse, input);
|
|
25
|
+
const meta = template.meta(data);
|
|
26
|
+
return { data, meta, Document: () => template.render(data) };
|
|
27
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { DocTheme } from './types';
|
|
2
|
+
|
|
3
|
+
/** Runtime proofing default. Editable catalog themes live in the workspace. */
|
|
4
|
+
export const neutral: DocTheme = {
|
|
5
|
+
id: 'neutral', name: 'Neutral', description: 'A plain, adaptable proofing system with black type, gray details, and an open white page.',
|
|
6
|
+
body: 'OpenDoc Sans', heading: 'OpenDoc Sans', ink: '#242424', muted: '#666666',
|
|
7
|
+
accent: '#424242', paper: '#ffffff', line: '#d6d6d6',
|
|
8
|
+
fontSize: 11, lineHeight: 1.5, margin: 54, paragraphGap: 12,
|
|
9
|
+
pageSize: 'A4', runningHeader: false, runningFooter: true, footerLabel: '',
|
|
10
|
+
useFor: ['Layout proofs', 'Everyday documents', 'A starting point for a custom system'],
|
|
11
|
+
principles: ['Let content and structure lead.', 'Keep the page quiet.', 'Make every level easy to recognize.'],
|
|
12
|
+
palette: [
|
|
13
|
+
{ name: 'Ink', value: '#242424', role: 'Main text and headings' },
|
|
14
|
+
{ name: 'Muted', value: '#666666', role: 'Secondary text and annotations' },
|
|
15
|
+
{ name: 'Accent', value: '#424242', role: 'Labels, table headers, and selected emphasis' },
|
|
16
|
+
{ name: 'Surface', value: '#ffffff', role: 'Covers, callouts, code panels, and alternate table rows' },
|
|
17
|
+
{ name: 'Rule', value: '#d6d6d6', role: 'Quiet structure and table boundaries' },
|
|
18
|
+
],
|
|
19
|
+
geometry: ['A4 portrait; 54 pt default margins.', '11 pt body, 1.5 line height, 12 pt paragraph spacing.', 'Square corners, a clear left edge, and naturally flowing pages.'],
|
|
20
|
+
};
|