@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,756 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markup parser: Svelte SSR output in, Forme document model out.
|
|
3
|
+
*
|
|
4
|
+
* The Forme Svelte components render namespaced placeholder tags
|
|
5
|
+
* (`<forme-document>`, `<forme-page>`, `<forme-view>`, `<forme-text>`)
|
|
6
|
+
* with a single `props` attribute holding the JSON-encoded component
|
|
7
|
+
* props. This module parses that markup - the emitting components and
|
|
8
|
+
* this parser are a matched pair inside this package. The placeholder
|
|
9
|
+
* tag/attribute vocabulary is an INTERNAL contract, not a public
|
|
10
|
+
* format: it may change in any release without notice.
|
|
11
|
+
*
|
|
12
|
+
* Whitespace is normalized to JSX-equivalent semantics so that a
|
|
13
|
+
* `.svelte` template and its TSX counterpart serialize identically:
|
|
14
|
+
* indentation and newlines never leak into text content, while
|
|
15
|
+
* interior spaces and interpolation boundaries are preserved. The
|
|
16
|
+
* Svelte compiler trims fragment edges and collapses inter-element
|
|
17
|
+
* whitespace before we ever see the markup, so the remaining rules
|
|
18
|
+
* are applied here (see `cleanJsxText`). Known divergences from JSX,
|
|
19
|
+
* where the compiler destroys the distinction before serialization -
|
|
20
|
+
* each matches how Svelte itself renders the template to the DOM:
|
|
21
|
+
*
|
|
22
|
+
* - Same-line leading/trailing spaces inside `<Text>` are trimmed
|
|
23
|
+
* (`<Text> a </Text>` → `"a"`; JSX keeps them).
|
|
24
|
+
* - Interpolations split across lines join with a single space
|
|
25
|
+
* (JSX drops the whitespace-only literal between them entirely).
|
|
26
|
+
* - Newlines inside interpolated *values* are treated like template
|
|
27
|
+
* text and collapse to a space.
|
|
28
|
+
*/
|
|
29
|
+
import { parseFragment } from 'parse5';
|
|
30
|
+
import { buildAreaChartKind, buildBarChartKind, buildDotPlotKind, buildLineChartKind, buildPieChartKind, CODE_DEFAULTS, EM_DEFAULTS, expandEdges, Font, HEADING_DEFAULTS, LINK_DEFAULTS, mapColumnWidth, mapListMarker, mapStyle, mergeFonts, parseColor, STRONG_DEFAULTS, } from './index.js';
|
|
31
|
+
import { reviveBytesMarker } from './encode.js';
|
|
32
|
+
function isElement(node) {
|
|
33
|
+
return 'tagName' in node;
|
|
34
|
+
}
|
|
35
|
+
function isText(node) {
|
|
36
|
+
return node.nodeName === '#text';
|
|
37
|
+
}
|
|
38
|
+
export function parseMarkup(markup) {
|
|
39
|
+
const fragment = parseFragment(markup);
|
|
40
|
+
const root = findDocumentRoot(fragment.childNodes);
|
|
41
|
+
const props = decodeProps(root, 'Document');
|
|
42
|
+
// Separate Page children from content children
|
|
43
|
+
const pageNodes = [];
|
|
44
|
+
const contentNodes = [];
|
|
45
|
+
for (const child of root.childNodes) {
|
|
46
|
+
if (isElement(child) && child.tagName === 'forme-page') {
|
|
47
|
+
pageNodes.push(parsePage(child));
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const node = parseChild(child, 'Document');
|
|
51
|
+
if (node)
|
|
52
|
+
contentNodes.push(node);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// If there are page nodes, use them. Otherwise the content stands alone.
|
|
56
|
+
let children;
|
|
57
|
+
if (pageNodes.length > 0) {
|
|
58
|
+
// Any loose content nodes get added to the last page's children
|
|
59
|
+
if (contentNodes.length > 0) {
|
|
60
|
+
const lastPage = pageNodes[pageNodes.length - 1];
|
|
61
|
+
lastPage.children.push(...contentNodes);
|
|
62
|
+
}
|
|
63
|
+
children = pageNodes;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
children = contentNodes;
|
|
67
|
+
}
|
|
68
|
+
const metadata = {};
|
|
69
|
+
if (props.title !== undefined)
|
|
70
|
+
metadata.title = props.title;
|
|
71
|
+
if (props.author !== undefined)
|
|
72
|
+
metadata.author = props.author;
|
|
73
|
+
if (props.subject !== undefined)
|
|
74
|
+
metadata.subject = props.subject;
|
|
75
|
+
if (props.creator !== undefined)
|
|
76
|
+
metadata.creator = props.creator;
|
|
77
|
+
if (props.lang !== undefined)
|
|
78
|
+
metadata.lang = props.lang;
|
|
79
|
+
// Merge global + document fonts (document fonts override on conflict)
|
|
80
|
+
const mergedFonts = mergeFonts(Font.getRegistered(), props.fonts);
|
|
81
|
+
const result = {
|
|
82
|
+
children,
|
|
83
|
+
metadata,
|
|
84
|
+
defaultPage: {
|
|
85
|
+
size: 'A4',
|
|
86
|
+
margin: { top: 54, right: 54, bottom: 54, left: 54 },
|
|
87
|
+
wrap: true,
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
if (props.style)
|
|
91
|
+
result.defaultStyle = mapStyle(props.style);
|
|
92
|
+
if (props.tagged !== undefined)
|
|
93
|
+
result.tagged = props.tagged;
|
|
94
|
+
if (props.pdfa !== undefined)
|
|
95
|
+
result.pdfa = props.pdfa;
|
|
96
|
+
if (props.pdfUa)
|
|
97
|
+
result.pdfUa = true;
|
|
98
|
+
const cert = props.certification ?? props.signature;
|
|
99
|
+
if (cert) {
|
|
100
|
+
if (props.signature && !props.certification) {
|
|
101
|
+
console.warn('[Forme] The `signature` prop is deprecated. Use `certification` instead.');
|
|
102
|
+
}
|
|
103
|
+
result.certification = cert;
|
|
104
|
+
}
|
|
105
|
+
if (mergedFonts.length > 0) {
|
|
106
|
+
result.fonts = mergedFonts;
|
|
107
|
+
}
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Parse one markup node into a Forme node. Returns null for nodes that
|
|
112
|
+
* produce no output (comments, i.e. Svelte SSR block anchors, and
|
|
113
|
+
* whitespace-only text between elements).
|
|
114
|
+
*/
|
|
115
|
+
function parseChild(node, parent) {
|
|
116
|
+
if (isElement(node)) {
|
|
117
|
+
return parseElement(node, parent);
|
|
118
|
+
}
|
|
119
|
+
if (isText(node)) {
|
|
120
|
+
// Loose text directly inside a container becomes an anonymous Text
|
|
121
|
+
// node. Edges are trimmed: the Svelte compiler collapses the
|
|
122
|
+
// whitespace around inter-element newlines to a single space, so
|
|
123
|
+
// by the time the markup reaches the parser, indentation and
|
|
124
|
+
// intentional edge spaces are indistinguishable.
|
|
125
|
+
const content = cleanJsxText(node.value).replace(/^[ \t]+|[ \t]+$/g, '');
|
|
126
|
+
if (content === '')
|
|
127
|
+
return null;
|
|
128
|
+
return {
|
|
129
|
+
kind: { type: 'Text', content },
|
|
130
|
+
style: {},
|
|
131
|
+
children: [],
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
function parseElement(element, parent) {
|
|
137
|
+
switch (element.tagName) {
|
|
138
|
+
case 'forme-view':
|
|
139
|
+
return parseView(element);
|
|
140
|
+
case 'forme-text':
|
|
141
|
+
return parseText(element);
|
|
142
|
+
case 'forme-h1':
|
|
143
|
+
return parseHeading(element, 1);
|
|
144
|
+
case 'forme-h2':
|
|
145
|
+
return parseHeading(element, 2);
|
|
146
|
+
case 'forme-h3':
|
|
147
|
+
return parseHeading(element, 3);
|
|
148
|
+
case 'forme-h4':
|
|
149
|
+
return parseHeading(element, 4);
|
|
150
|
+
case 'forme-h5':
|
|
151
|
+
return parseHeading(element, 5);
|
|
152
|
+
case 'forme-h6':
|
|
153
|
+
return parseHeading(element, 6);
|
|
154
|
+
case 'forme-ordered-list':
|
|
155
|
+
return parseList(element, true);
|
|
156
|
+
case 'forme-unordered-list':
|
|
157
|
+
return parseList(element, false);
|
|
158
|
+
case 'forme-list-item':
|
|
159
|
+
return parseListItem(element);
|
|
160
|
+
case 'forme-table':
|
|
161
|
+
return parseTable(element);
|
|
162
|
+
case 'forme-row':
|
|
163
|
+
validateNesting('Row', parent);
|
|
164
|
+
return parseRow(element);
|
|
165
|
+
case 'forme-cell':
|
|
166
|
+
validateNesting('Cell', parent);
|
|
167
|
+
return parseCell(element);
|
|
168
|
+
case 'forme-fixed':
|
|
169
|
+
return parseFixed(element);
|
|
170
|
+
case 'forme-image':
|
|
171
|
+
return parseImage(element);
|
|
172
|
+
case 'forme-svg':
|
|
173
|
+
return parseSvg(element);
|
|
174
|
+
case 'forme-qrcode':
|
|
175
|
+
return parseQrCode(element);
|
|
176
|
+
case 'forme-barcode':
|
|
177
|
+
return parseBarcode(element);
|
|
178
|
+
case 'forme-canvas':
|
|
179
|
+
return parseCanvas(element);
|
|
180
|
+
case 'forme-watermark':
|
|
181
|
+
return parseWatermark(element);
|
|
182
|
+
case 'forme-bar-chart':
|
|
183
|
+
return parseChart(element, 'BarChart', buildBarChartKind);
|
|
184
|
+
case 'forme-line-chart':
|
|
185
|
+
return parseChart(element, 'LineChart', buildLineChartKind);
|
|
186
|
+
case 'forme-pie-chart':
|
|
187
|
+
return parseChart(element, 'PieChart', buildPieChartKind);
|
|
188
|
+
case 'forme-area-chart':
|
|
189
|
+
return parseChart(element, 'AreaChart', buildAreaChartKind);
|
|
190
|
+
case 'forme-dot-plot':
|
|
191
|
+
return parseChart(element, 'DotPlot', buildDotPlotKind);
|
|
192
|
+
case 'forme-text-field':
|
|
193
|
+
return parseTextField(element);
|
|
194
|
+
case 'forme-checkbox':
|
|
195
|
+
return parseCheckbox(element);
|
|
196
|
+
case 'forme-dropdown':
|
|
197
|
+
return parseDropdown(element);
|
|
198
|
+
case 'forme-radio-button':
|
|
199
|
+
return parseRadioButton(element);
|
|
200
|
+
case 'forme-strong':
|
|
201
|
+
case 'forme-em':
|
|
202
|
+
case 'forme-code':
|
|
203
|
+
case 'forme-link': {
|
|
204
|
+
const name = INLINE_COMPONENT_NAMES[element.tagName];
|
|
205
|
+
throw new Error(`<${name}> is an inline formatting component and must be inside a <Text> or heading. Wrap it: <Text><${name}>...</${name}></Text>`);
|
|
206
|
+
}
|
|
207
|
+
case 'forme-page-break':
|
|
208
|
+
return { kind: { type: 'PageBreak' }, style: {}, children: [] };
|
|
209
|
+
case 'forme-page':
|
|
210
|
+
validateNesting('Page', parent);
|
|
211
|
+
return parsePage(element);
|
|
212
|
+
default:
|
|
213
|
+
throw unknownElementError(element.tagName);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// ─── Nesting validation ──────────────────────────────────────────────
|
|
217
|
+
const VALID_PARENTS = {
|
|
218
|
+
Page: {
|
|
219
|
+
allowed: ['Document'],
|
|
220
|
+
suggestion: '<Page> must be a direct child of <Document>.',
|
|
221
|
+
},
|
|
222
|
+
Row: {
|
|
223
|
+
allowed: ['Table'],
|
|
224
|
+
suggestion: '<Row> must be inside a <Table>. Wrap it: <Table><Row>...</Row></Table>',
|
|
225
|
+
},
|
|
226
|
+
Cell: {
|
|
227
|
+
allowed: ['Row'],
|
|
228
|
+
suggestion: '<Cell> must be inside a <Row>. Wrap it: <Row><Cell>...</Cell></Row>',
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
function validateNesting(componentName, parent) {
|
|
232
|
+
const rule = VALID_PARENTS[componentName];
|
|
233
|
+
if (!rule)
|
|
234
|
+
return;
|
|
235
|
+
if (parent !== null && !rule.allowed.includes(parent)) {
|
|
236
|
+
throw new Error(`Invalid nesting: <${componentName}> found inside <${parent}>. ${rule.suggestion}`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// ─── Unknown elements ────────────────────────────────────────────────
|
|
240
|
+
const HTML_SUGGESTIONS = {
|
|
241
|
+
div: 'View', span: 'Text', p: 'Text', h1: 'H1', h2: 'H2',
|
|
242
|
+
h3: 'H3', h4: 'H4', h5: 'H5', h6: 'H6', img: 'Image',
|
|
243
|
+
table: 'Table', tr: 'Row', td: 'Cell', ol: 'OrderedList',
|
|
244
|
+
ul: 'UnorderedList', li: 'ListItem', strong: 'Strong', b: 'Strong',
|
|
245
|
+
em: 'Em', i: 'Em', code: 'Code', a: 'Link',
|
|
246
|
+
};
|
|
247
|
+
function unknownElementError(tagName) {
|
|
248
|
+
const suggestion = HTML_SUGGESTIONS[tagName];
|
|
249
|
+
if (suggestion) {
|
|
250
|
+
return new Error(`HTML element <${tagName}> is not supported. Use <${suggestion}> instead.`);
|
|
251
|
+
}
|
|
252
|
+
return new Error(`Unsupported element <${tagName}> in a Forme template.`);
|
|
253
|
+
}
|
|
254
|
+
function parseChildren(nodes, parent) {
|
|
255
|
+
const children = [];
|
|
256
|
+
for (const node of nodes) {
|
|
257
|
+
const child = parseChild(node, parent);
|
|
258
|
+
if (child)
|
|
259
|
+
children.push(child);
|
|
260
|
+
}
|
|
261
|
+
return children;
|
|
262
|
+
}
|
|
263
|
+
function parsePage(element) {
|
|
264
|
+
const props = decodeProps(element, 'Page');
|
|
265
|
+
let size = 'A4';
|
|
266
|
+
if (props.size !== undefined) {
|
|
267
|
+
if (typeof props.size === 'string') {
|
|
268
|
+
size = props.size;
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
size = { Custom: { width: props.size.width, height: props.size.height } };
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
let margin = { top: 54, right: 54, bottom: 54, left: 54 };
|
|
275
|
+
if (props.margin !== undefined) {
|
|
276
|
+
margin = expandEdges(props.margin);
|
|
277
|
+
}
|
|
278
|
+
const config = { size, margin, wrap: true };
|
|
279
|
+
if (props.backgroundImage !== undefined)
|
|
280
|
+
config.backgroundImage = props.backgroundImage;
|
|
281
|
+
if (props.backgroundOpacity !== undefined)
|
|
282
|
+
config.backgroundOpacity = props.backgroundOpacity;
|
|
283
|
+
if (props.backgroundSize !== undefined)
|
|
284
|
+
config.backgroundSize = props.backgroundSize;
|
|
285
|
+
if (props.backgroundPosition !== undefined)
|
|
286
|
+
config.backgroundPosition = props.backgroundPosition;
|
|
287
|
+
return {
|
|
288
|
+
kind: { type: 'Page', config },
|
|
289
|
+
style: props.style ? mapStyle(props.style) : {},
|
|
290
|
+
children: parseChildren(element.childNodes, 'Page'),
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
function parseView(element) {
|
|
294
|
+
const props = decodeProps(element, 'View');
|
|
295
|
+
const style = mapStyle(props.style);
|
|
296
|
+
if (props.wrap !== undefined) {
|
|
297
|
+
style.wrap = props.wrap;
|
|
298
|
+
}
|
|
299
|
+
const node = {
|
|
300
|
+
kind: { type: 'View' },
|
|
301
|
+
style,
|
|
302
|
+
children: parseChildren(element.childNodes, 'View'),
|
|
303
|
+
};
|
|
304
|
+
if (props.bookmark)
|
|
305
|
+
node.bookmark = props.bookmark;
|
|
306
|
+
if (props.href)
|
|
307
|
+
node.href = props.href;
|
|
308
|
+
return node;
|
|
309
|
+
}
|
|
310
|
+
function parseText(element) {
|
|
311
|
+
const props = decodeProps(element, 'Text');
|
|
312
|
+
const kind = { type: 'Text', content: '' };
|
|
313
|
+
const runs = textRunsOf(element.childNodes);
|
|
314
|
+
if (runs) {
|
|
315
|
+
kind.runs = runs;
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
kind.content = textContentOf(element.childNodes);
|
|
319
|
+
}
|
|
320
|
+
if (props.href)
|
|
321
|
+
kind.href = props.href;
|
|
322
|
+
const node = {
|
|
323
|
+
kind,
|
|
324
|
+
style: mapStyle(props.style),
|
|
325
|
+
children: [],
|
|
326
|
+
};
|
|
327
|
+
if (props.bookmark)
|
|
328
|
+
node.bookmark = props.bookmark;
|
|
329
|
+
return node;
|
|
330
|
+
}
|
|
331
|
+
/** Inline formatting placeholder tags and their component-default
|
|
332
|
+
* styles. `forme-text` carries no defaults beyond the user's style -
|
|
333
|
+
* same table the react adapter keeps in `inlineDefaults()`. */
|
|
334
|
+
const INLINE_DEFAULTS = {
|
|
335
|
+
'forme-text': {},
|
|
336
|
+
'forme-strong': STRONG_DEFAULTS,
|
|
337
|
+
'forme-em': EM_DEFAULTS,
|
|
338
|
+
'forme-code': CODE_DEFAULTS,
|
|
339
|
+
'forme-link': LINK_DEFAULTS,
|
|
340
|
+
};
|
|
341
|
+
const INLINE_COMPONENT_NAMES = {
|
|
342
|
+
'forme-strong': 'Strong',
|
|
343
|
+
'forme-em': 'Em',
|
|
344
|
+
'forme-code': 'Code',
|
|
345
|
+
'forme-link': 'Link',
|
|
346
|
+
};
|
|
347
|
+
/**
|
|
348
|
+
* Build styled text runs from a Text (or heading) element's children,
|
|
349
|
+
* mirroring the react adapter's `buildTextRuns`: only used when at
|
|
350
|
+
* least one direct child is an inline element (`<Text>`, `<Strong>`,
|
|
351
|
+
* `<Em>`, `<Code>`, `<Link>`) - returns null otherwise. Descent
|
|
352
|
+
* accumulates style and href: the outer accumulated style is overlaid
|
|
353
|
+
* by each inline component's defaults, which are overlaid by the
|
|
354
|
+
* user-supplied `style` on that element, so user style wins at every
|
|
355
|
+
* level. `<Strong><Em>both</Em></Strong>` produces a single run with
|
|
356
|
+
* bold + italic. Elements other than inline components are skipped but
|
|
357
|
+
* still split the surrounding text into separate runs, as react's
|
|
358
|
+
* per-child loop does.
|
|
359
|
+
*/
|
|
360
|
+
function textRunsOf(nodes) {
|
|
361
|
+
if (!nodes.some(n => isElement(n) && n.tagName in INLINE_DEFAULTS))
|
|
362
|
+
return null;
|
|
363
|
+
return buildRuns(nodes, {}, undefined);
|
|
364
|
+
}
|
|
365
|
+
function buildRuns(nodes, accStyle, accHref) {
|
|
366
|
+
const runs = [];
|
|
367
|
+
let buffer = '';
|
|
368
|
+
const flush = () => {
|
|
369
|
+
const content = cleanJsxText(buffer);
|
|
370
|
+
buffer = '';
|
|
371
|
+
// JSX drops whitespace-only literals spanning lines but keeps
|
|
372
|
+
// same-line spaces between spans; cleanJsxText reproduces that,
|
|
373
|
+
// leaving only genuinely empty chunks to discard.
|
|
374
|
+
if (content === '')
|
|
375
|
+
return;
|
|
376
|
+
const run = { content };
|
|
377
|
+
if (Object.keys(accStyle).length > 0)
|
|
378
|
+
run.style = mapStyle(accStyle);
|
|
379
|
+
if (accHref)
|
|
380
|
+
run.href = accHref;
|
|
381
|
+
runs.push(run);
|
|
382
|
+
};
|
|
383
|
+
for (const node of nodes) {
|
|
384
|
+
if (isText(node)) {
|
|
385
|
+
buffer += node.value;
|
|
386
|
+
}
|
|
387
|
+
else if (isElement(node)) {
|
|
388
|
+
flush();
|
|
389
|
+
const defaults = INLINE_DEFAULTS[node.tagName];
|
|
390
|
+
if (defaults === undefined)
|
|
391
|
+
continue; // unknown element inside <Text> - skip
|
|
392
|
+
const props = decodeProps(node, INLINE_COMPONENT_NAMES[node.tagName] ?? 'Text');
|
|
393
|
+
// Cascade: outer accumulated -> this component's defaults -> user
|
|
394
|
+
// style. Later spreads win, so user style overrides defaults and
|
|
395
|
+
// outer.
|
|
396
|
+
const nextStyle = { ...accStyle, ...defaults, ...(props.style || {}) };
|
|
397
|
+
const nextHref = props.href ?? accHref;
|
|
398
|
+
runs.push(...buildRuns(node.childNodes, nextStyle, nextHref));
|
|
399
|
+
}
|
|
400
|
+
// Comments (SSR block anchors) fall through: the text around them
|
|
401
|
+
// stays one contiguous chunk.
|
|
402
|
+
}
|
|
403
|
+
flush();
|
|
404
|
+
return runs;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Parse an H1-H6 placeholder. Mirrors parseText for the children
|
|
408
|
+
* machinery (mixed strings + inline-formatting components produce
|
|
409
|
+
* runs) but emits the engine's `Heading { level }` node kind so the
|
|
410
|
+
* tagged-PDF builder can pick up the semantic role. Default styles per
|
|
411
|
+
* level are merged BEFORE the user's `style` prop, so user values win.
|
|
412
|
+
*/
|
|
413
|
+
function parseHeading(element, level) {
|
|
414
|
+
const props = decodeProps(element, `H${level}`);
|
|
415
|
+
const kind = { type: 'Heading', level, content: '' };
|
|
416
|
+
const runs = textRunsOf(element.childNodes);
|
|
417
|
+
if (runs) {
|
|
418
|
+
kind.runs = runs;
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
kind.content = textContentOf(element.childNodes);
|
|
422
|
+
}
|
|
423
|
+
if (props.href)
|
|
424
|
+
kind.href = props.href;
|
|
425
|
+
// Defaults underlay; user style wins on conflicting keys.
|
|
426
|
+
const mergedStyle = { ...HEADING_DEFAULTS[level], ...(props.style || {}) };
|
|
427
|
+
const node = {
|
|
428
|
+
kind,
|
|
429
|
+
style: mapStyle(mergedStyle),
|
|
430
|
+
children: [],
|
|
431
|
+
};
|
|
432
|
+
if (props.bookmark)
|
|
433
|
+
node.bookmark = props.bookmark;
|
|
434
|
+
return node;
|
|
435
|
+
}
|
|
436
|
+
function parseList(element, ordered) {
|
|
437
|
+
const props = decodeProps(element, ordered ? 'OrderedList' : 'UnorderedList');
|
|
438
|
+
const markerType = ordered
|
|
439
|
+
? mapListMarker(props.type, 'decimal')
|
|
440
|
+
: mapListMarker(props.marker, 'disc');
|
|
441
|
+
const start = typeof props.start === 'number' && props.start >= 1 ? props.start : 1;
|
|
442
|
+
// Children must be ListItems - anything else is silently dropped to
|
|
443
|
+
// keep the serializer tolerant, matching the react adapter. (Loose
|
|
444
|
+
// whitespace and `{#if}` anchors between items are too common to be
|
|
445
|
+
// a real error.)
|
|
446
|
+
const children = element.childNodes
|
|
447
|
+
.filter((c) => isElement(c) && c.tagName === 'forme-list-item')
|
|
448
|
+
.map(c => parseListItem(c));
|
|
449
|
+
const node = {
|
|
450
|
+
kind: { type: 'List', ordered, marker_type: markerType, start },
|
|
451
|
+
style: mapStyle(props.style),
|
|
452
|
+
children,
|
|
453
|
+
};
|
|
454
|
+
if (props.bookmark)
|
|
455
|
+
node.bookmark = props.bookmark;
|
|
456
|
+
return node;
|
|
457
|
+
}
|
|
458
|
+
function parseListItem(element) {
|
|
459
|
+
const props = decodeProps(element, 'ListItem');
|
|
460
|
+
// ListItem content is laid out by the engine using layout_children,
|
|
461
|
+
// so whatever the user put inside serializes as the node's children.
|
|
462
|
+
// Loose strings auto-wrap in a Text node via parseChild, matching
|
|
463
|
+
// the react adapter's convention.
|
|
464
|
+
return {
|
|
465
|
+
kind: { type: 'ListItem' },
|
|
466
|
+
style: mapStyle(props.style),
|
|
467
|
+
children: parseChildren(element.childNodes, null),
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Extract the merged text content of a Text element's children.
|
|
472
|
+
* Comments (Svelte SSR block anchors) vanish and the text around them
|
|
473
|
+
* is treated as one contiguous chunk, so `{#if}`/`{#each}` boundaries
|
|
474
|
+
* inside a `<Text>` never introduce breaks. Element children
|
|
475
|
+
* contribute their own descendant text (react's flattenTextContent
|
|
476
|
+
* recurses the same way).
|
|
477
|
+
*/
|
|
478
|
+
function textContentOf(nodes) {
|
|
479
|
+
return cleanJsxText(rawTextOf(nodes));
|
|
480
|
+
}
|
|
481
|
+
function rawTextOf(nodes) {
|
|
482
|
+
let merged = '';
|
|
483
|
+
for (const node of nodes) {
|
|
484
|
+
if (isText(node))
|
|
485
|
+
merged += node.value;
|
|
486
|
+
else if (isElement(node))
|
|
487
|
+
merged += rawTextOf(node.childNodes);
|
|
488
|
+
}
|
|
489
|
+
return merged;
|
|
490
|
+
}
|
|
491
|
+
function parseTable(element) {
|
|
492
|
+
const props = decodeProps(element, 'Table');
|
|
493
|
+
const columns = (props.columns ?? []).map(col => ({
|
|
494
|
+
width: mapColumnWidth(col.width),
|
|
495
|
+
}));
|
|
496
|
+
return {
|
|
497
|
+
kind: { type: 'Table', columns },
|
|
498
|
+
style: mapStyle(props.style),
|
|
499
|
+
children: parseChildren(element.childNodes, 'Table'),
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
function parseRow(element) {
|
|
503
|
+
const props = decodeProps(element, 'Row');
|
|
504
|
+
return {
|
|
505
|
+
kind: { type: 'TableRow', is_header: props.header ?? false },
|
|
506
|
+
style: mapStyle(props.style),
|
|
507
|
+
children: parseChildren(element.childNodes, 'Row'),
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
function parseCell(element) {
|
|
511
|
+
const props = decodeProps(element, 'Cell');
|
|
512
|
+
return {
|
|
513
|
+
kind: { type: 'TableCell', col_span: props.colSpan ?? 1, row_span: props.rowSpan ?? 1 },
|
|
514
|
+
style: mapStyle(props.style),
|
|
515
|
+
children: parseChildren(element.childNodes, 'Cell'),
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
function parseFixed(element) {
|
|
519
|
+
const props = decodeProps(element, 'Fixed');
|
|
520
|
+
// Mirrors react: anything other than 'header' falls back to Footer.
|
|
521
|
+
const position = props.position === 'header' ? 'Header' : 'Footer';
|
|
522
|
+
const node = {
|
|
523
|
+
kind: { type: 'Fixed', position },
|
|
524
|
+
style: mapStyle(props.style),
|
|
525
|
+
children: parseChildren(element.childNodes, 'Fixed'),
|
|
526
|
+
};
|
|
527
|
+
if (props.bookmark)
|
|
528
|
+
node.bookmark = props.bookmark;
|
|
529
|
+
return node;
|
|
530
|
+
}
|
|
531
|
+
function parseImage(element) {
|
|
532
|
+
const props = decodeProps(element, 'Image');
|
|
533
|
+
const kind = { type: 'Image', src: props.src };
|
|
534
|
+
if (props.width !== undefined)
|
|
535
|
+
kind.width = props.width;
|
|
536
|
+
if (props.height !== undefined)
|
|
537
|
+
kind.height = props.height;
|
|
538
|
+
const node = {
|
|
539
|
+
kind,
|
|
540
|
+
style: mapStyle(props.style),
|
|
541
|
+
children: [],
|
|
542
|
+
};
|
|
543
|
+
if (props.href)
|
|
544
|
+
node.href = props.href;
|
|
545
|
+
if (props.alt)
|
|
546
|
+
node.alt = props.alt;
|
|
547
|
+
return node;
|
|
548
|
+
}
|
|
549
|
+
function parseSvg(element) {
|
|
550
|
+
const props = decodeProps(element, 'Svg');
|
|
551
|
+
const kind = {
|
|
552
|
+
type: 'Svg',
|
|
553
|
+
width: props.width,
|
|
554
|
+
height: props.height,
|
|
555
|
+
content: props.content ?? '',
|
|
556
|
+
};
|
|
557
|
+
if (props.viewBox)
|
|
558
|
+
kind.view_box = props.viewBox;
|
|
559
|
+
const node = {
|
|
560
|
+
kind,
|
|
561
|
+
style: mapStyle(props.style),
|
|
562
|
+
children: [],
|
|
563
|
+
};
|
|
564
|
+
if (props.href)
|
|
565
|
+
node.href = props.href;
|
|
566
|
+
if (props.alt)
|
|
567
|
+
node.alt = props.alt;
|
|
568
|
+
return node;
|
|
569
|
+
}
|
|
570
|
+
function parseQrCode(element) {
|
|
571
|
+
const props = decodeProps(element, 'QrCode');
|
|
572
|
+
const kind = { type: 'QrCode', data: props.data };
|
|
573
|
+
if (props.size !== undefined)
|
|
574
|
+
kind.size = props.size;
|
|
575
|
+
const style = mapStyle(props.style);
|
|
576
|
+
if (props.color)
|
|
577
|
+
style.color = parseColor(props.color);
|
|
578
|
+
return { kind, style, children: [] };
|
|
579
|
+
}
|
|
580
|
+
function parseBarcode(element) {
|
|
581
|
+
const props = decodeProps(element, 'Barcode');
|
|
582
|
+
const kind = {
|
|
583
|
+
type: 'Barcode',
|
|
584
|
+
data: props.data,
|
|
585
|
+
format: props.format ?? 'Code128',
|
|
586
|
+
height: props.height ?? 60,
|
|
587
|
+
};
|
|
588
|
+
if (props.width !== undefined)
|
|
589
|
+
kind.width = props.width;
|
|
590
|
+
const style = mapStyle(props.style);
|
|
591
|
+
if (props.color)
|
|
592
|
+
style.color = parseColor(props.color);
|
|
593
|
+
return { kind, style, children: [] };
|
|
594
|
+
}
|
|
595
|
+
function parseCanvas(element) {
|
|
596
|
+
const props = decodeProps(element, 'Canvas');
|
|
597
|
+
return {
|
|
598
|
+
kind: { type: 'Canvas', width: props.width, height: props.height, operations: props.operations },
|
|
599
|
+
style: mapStyle(props.style),
|
|
600
|
+
children: [],
|
|
601
|
+
};
|
|
602
|
+
}
|
|
603
|
+
function parseWatermark(element) {
|
|
604
|
+
const props = decodeProps(element, 'Watermark');
|
|
605
|
+
const fontSize = props.fontSize ?? 60;
|
|
606
|
+
const angle = props.angle ?? -45;
|
|
607
|
+
// Mirrors react: the color's alpha channel becomes opacity (multiplied
|
|
608
|
+
// with any style opacity); the stored color itself is fully opaque.
|
|
609
|
+
const parsed = parseColor(props.color ?? 'rgba(0,0,0,0.1)');
|
|
610
|
+
const style = mapStyle(props.style);
|
|
611
|
+
style.color = { r: parsed.r, g: parsed.g, b: parsed.b, a: 1 };
|
|
612
|
+
style.opacity = parsed.a * (style.opacity ?? 1);
|
|
613
|
+
style.fontSize = fontSize;
|
|
614
|
+
return {
|
|
615
|
+
kind: { type: 'Watermark', text: props.text, font_size: fontSize, angle },
|
|
616
|
+
style,
|
|
617
|
+
children: [],
|
|
618
|
+
};
|
|
619
|
+
}
|
|
620
|
+
function parseTextField(element) {
|
|
621
|
+
const props = decodeProps(element, 'TextField');
|
|
622
|
+
const kind = {
|
|
623
|
+
type: 'TextField',
|
|
624
|
+
name: props.name,
|
|
625
|
+
width: props.width,
|
|
626
|
+
height: props.height ?? 24,
|
|
627
|
+
multiline: props.multiline ?? false,
|
|
628
|
+
password: props.password ?? false,
|
|
629
|
+
read_only: props.readOnly ?? false,
|
|
630
|
+
font_size: props.fontSize ?? 12,
|
|
631
|
+
};
|
|
632
|
+
if (props.value !== undefined)
|
|
633
|
+
kind.value = props.value;
|
|
634
|
+
if (props.placeholder !== undefined)
|
|
635
|
+
kind.placeholder = props.placeholder;
|
|
636
|
+
if (props.maxLength !== undefined)
|
|
637
|
+
kind.max_length = props.maxLength;
|
|
638
|
+
return { kind, style: mapStyle(props.style), children: [] };
|
|
639
|
+
}
|
|
640
|
+
function parseCheckbox(element) {
|
|
641
|
+
const props = decodeProps(element, 'Checkbox');
|
|
642
|
+
return {
|
|
643
|
+
kind: {
|
|
644
|
+
type: 'Checkbox',
|
|
645
|
+
name: props.name,
|
|
646
|
+
checked: props.checked ?? false,
|
|
647
|
+
width: props.width ?? 14,
|
|
648
|
+
height: props.height ?? 14,
|
|
649
|
+
read_only: props.readOnly ?? false,
|
|
650
|
+
},
|
|
651
|
+
style: mapStyle(props.style),
|
|
652
|
+
children: [],
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
function parseDropdown(element) {
|
|
656
|
+
const props = decodeProps(element, 'Dropdown');
|
|
657
|
+
const kind = {
|
|
658
|
+
type: 'Dropdown',
|
|
659
|
+
name: props.name,
|
|
660
|
+
options: props.options,
|
|
661
|
+
width: props.width,
|
|
662
|
+
height: props.height ?? 24,
|
|
663
|
+
read_only: props.readOnly ?? false,
|
|
664
|
+
font_size: props.fontSize ?? 12,
|
|
665
|
+
};
|
|
666
|
+
if (props.value !== undefined)
|
|
667
|
+
kind.value = props.value;
|
|
668
|
+
return { kind, style: mapStyle(props.style), children: [] };
|
|
669
|
+
}
|
|
670
|
+
function parseRadioButton(element) {
|
|
671
|
+
const props = decodeProps(element, 'RadioButton');
|
|
672
|
+
return {
|
|
673
|
+
kind: {
|
|
674
|
+
type: 'RadioButton',
|
|
675
|
+
name: props.name,
|
|
676
|
+
value: props.value,
|
|
677
|
+
checked: props.checked ?? false,
|
|
678
|
+
width: props.width ?? 14,
|
|
679
|
+
height: props.height ?? 14,
|
|
680
|
+
read_only: props.readOnly ?? false,
|
|
681
|
+
},
|
|
682
|
+
style: mapStyle(props.style),
|
|
683
|
+
children: [],
|
|
684
|
+
};
|
|
685
|
+
}
|
|
686
|
+
// ─── Charts ──────────────────────────────────────────────────────────
|
|
687
|
+
/**
|
|
688
|
+
* Parse one chart placeholder. The camelCase-to-snake_case prop
|
|
689
|
+
* mapping (and its defaults) lives in the shared kind builders, the
|
|
690
|
+
* same functions the react adapter serializes with, so the two
|
|
691
|
+
* adapters cannot drift.
|
|
692
|
+
*/
|
|
693
|
+
function parseChart(element, component, buildKind) {
|
|
694
|
+
const props = decodeProps(element, component);
|
|
695
|
+
return {
|
|
696
|
+
kind: buildKind(props),
|
|
697
|
+
style: mapStyle(props.style),
|
|
698
|
+
children: [],
|
|
699
|
+
};
|
|
700
|
+
}
|
|
701
|
+
// ─── Whitespace normalization ────────────────────────────────────────
|
|
702
|
+
/**
|
|
703
|
+
* Normalize template text to JSX-equivalent semantics - the same
|
|
704
|
+
* algorithm Babel, TypeScript, and esbuild apply to JSX text literals:
|
|
705
|
+
*
|
|
706
|
+
* - lines are trimmed (leading whitespace on all but the first line,
|
|
707
|
+
* trailing whitespace on all but the last line) and joined with a
|
|
708
|
+
* single space; whitespace-only lines are dropped
|
|
709
|
+
* - tabs count as spaces
|
|
710
|
+
* - only ASCII space/tab are trimmed, so non-breaking spaces survive
|
|
711
|
+
*/
|
|
712
|
+
function cleanJsxText(text) {
|
|
713
|
+
const lines = text.split(/\r\n|\n|\r/);
|
|
714
|
+
let lastNonEmptyLine = 0;
|
|
715
|
+
for (let i = 0; i < lines.length; i++) {
|
|
716
|
+
if (/[^ \t]/.test(lines[i]))
|
|
717
|
+
lastNonEmptyLine = i;
|
|
718
|
+
}
|
|
719
|
+
let str = '';
|
|
720
|
+
for (let i = 0; i < lines.length; i++) {
|
|
721
|
+
const isFirstLine = i === 0;
|
|
722
|
+
const isLastLine = i === lines.length - 1;
|
|
723
|
+
const isLastNonEmptyLine = i === lastNonEmptyLine;
|
|
724
|
+
let trimmed = lines[i].replace(/\t/g, ' ');
|
|
725
|
+
if (!isFirstLine)
|
|
726
|
+
trimmed = trimmed.replace(/^ +/, '');
|
|
727
|
+
if (!isLastLine)
|
|
728
|
+
trimmed = trimmed.replace(/ +$/, '');
|
|
729
|
+
if (trimmed) {
|
|
730
|
+
if (!isLastNonEmptyLine)
|
|
731
|
+
trimmed += ' ';
|
|
732
|
+
str += trimmed;
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
return str;
|
|
736
|
+
}
|
|
737
|
+
function findDocumentRoot(nodes) {
|
|
738
|
+
for (const node of nodes) {
|
|
739
|
+
if (isElement(node) && node.tagName === 'forme-document') {
|
|
740
|
+
return node;
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
throw new Error('Top-level element must be <Document>');
|
|
744
|
+
}
|
|
745
|
+
/** Decode the JSON `props` attribute of a placeholder element. */
|
|
746
|
+
function decodeProps(element, component) {
|
|
747
|
+
const attr = element.attrs.find(a => a.name === 'props');
|
|
748
|
+
if (attr === undefined)
|
|
749
|
+
return {};
|
|
750
|
+
try {
|
|
751
|
+
return JSON.parse(attr.value, reviveBytesMarker);
|
|
752
|
+
}
|
|
753
|
+
catch (err) {
|
|
754
|
+
throw new Error(`[Forme] <${component}>: failed to decode props attribute: ${err instanceof Error ? err.message : String(err)}`);
|
|
755
|
+
}
|
|
756
|
+
}
|