@agile-team/mach-report 2.14.0 → 2.16.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/README.md +26 -16
- package/THIRD_PARTY_NOTICES.md +3 -1
- package/dist/{ExcelBindingWizard-CLT2p7P3.cjs → ExcelBindingWizard-CP6h2x1f.cjs} +1 -1
- package/dist/{ExcelBindingWizard-CvsWR8Ga.js → ExcelBindingWizard-HhB3hAJE.js} +3 -3
- package/dist/ParamEditor-CUQLgoxa.cjs +1 -0
- package/dist/ParamEditor-OKesP_nO.js +594 -0
- package/dist/{ReportBatchPanel-DkxTzBkD.cjs → ReportBatchPanel-cZCAMAwH.cjs} +1 -1
- package/dist/{ReportBatchPanel-LqVgiqp7.js → ReportBatchPanel-ruxcbfY6.js} +39 -39
- package/dist/ReportPreview-BcDKCLiK.js +4834 -0
- package/dist/ReportPreview-Bk9nLfO9.cjs +6 -0
- package/dist/{ReportTemplateLibrary-cQ1sqNYo.cjs → ReportTemplateLibrary-BDlNT8JN.cjs} +1 -1
- package/dist/{ReportTemplateLibrary-MjWEtc7X.js → ReportTemplateLibrary-DcwrH-63.js} +1 -1
- package/dist/{RuleEditor-BaR6xUiI.cjs → RuleEditor-BX5S8RSF.cjs} +1 -1
- package/dist/{RuleEditor-ChuXMlei.js → RuleEditor-CGl9XY2s.js} +5 -5
- package/dist/{TemplateOutlinePanel-BHKP89Xz.cjs → TemplateOutlinePanel-CGrT5DFN.cjs} +1 -1
- package/dist/{TemplateOutlinePanel-Dci6aRn1.js → TemplateOutlinePanel-SXCjaPKR.js} +2 -2
- package/dist/{TemplateReusePanel-CY5eO2Sh.cjs → TemplateReusePanel-6Z3wRFz8.cjs} +1 -1
- package/dist/{TemplateReusePanel-B7Gmyc1z.js → TemplateReusePanel-lHLOS9Wn.js} +2 -2
- package/dist/{TemplateReviewPanel-DjlX3xpt.js → TemplateReviewPanel-CJ9PLc48.js} +2 -2
- package/dist/{TemplateReviewPanel-JvZe9_4G.cjs → TemplateReviewPanel-Dpk7sLcF.cjs} +1 -1
- package/dist/analytics.cjs +1 -1
- package/dist/analytics.d.cts +5 -1
- package/dist/analytics.d.ts +5 -1
- package/dist/analytics.js +154 -60
- package/dist/artifact-integrity.json +143 -0
- package/dist/assets-CqIbfbTr.js +126 -0
- package/dist/assets-e4YSke8n.cjs +1 -0
- package/dist/auto-YR7a4BtF.js +240 -0
- package/dist/auto-uVBjX1j5.cjs +1 -0
- package/dist/batch-WzDIXJAt.js +220 -0
- package/dist/batch-z6Aw5GEY.cjs +1 -0
- package/dist/capabilities-DDwXr_cA.js +103 -0
- package/dist/capabilities-DNLyZdNw.cjs +1 -0
- package/dist/codes.d.cts +4 -0
- package/dist/codes.d.ts +4 -0
- package/dist/component-tree-Ca6YYfHq.js +61 -0
- package/dist/component-tree-DkGLEfZC.cjs +1 -0
- package/dist/{computed-Bvk0W15F.js → computed-C-4C2S5h.js} +3 -3
- package/dist/config-Dg_o8e7m.cjs +1 -0
- package/dist/config-XQ4qrQ7Q.js +844 -0
- package/dist/designer-BfQSahxq.js +5163 -0
- package/dist/designer-CPPdeM5_.cjs +2 -0
- package/dist/designer.cjs +1 -1
- package/dist/designer.d.cts +197 -16
- package/dist/designer.d.ts +197 -16
- package/dist/designer.js +1 -1
- package/dist/diagnostic-notification-B9K9We3h.cjs +1 -0
- package/dist/diagnostic-notification-qGAYZdkB.js +7 -0
- package/dist/drill-CsdjgkRM.cjs +1 -0
- package/dist/drill-DIGsZfyB.js +145 -0
- package/dist/encoding-BOGq4qYL.js +21 -0
- package/dist/encoding-BYF9ZTl9.cjs +1 -0
- package/dist/{font-loader-DHto6Lra.js → font-loader-CzI1GuBc.js} +1 -1
- package/dist/{font-loader-vhCT8znW.cjs → font-loader-EKLzOJxf.cjs} +1 -1
- package/dist/index.cjs +8 -9
- package/dist/index.d.cts +84 -4
- package/dist/index.d.ts +84 -4
- package/dist/index.js +829 -833
- package/dist/json-snapshot-D6ioHth9.js +1702 -0
- package/dist/json-snapshot-DknkjvxP.cjs +2 -0
- package/dist/licenses/_bwip-js_generic-4.11.4.txt +24 -0
- package/dist/licenses/_fast-csv_format-4.3.5.txt +22 -0
- package/dist/licenses/_fast-csv_parse-4.3.6.txt +22 -0
- package/dist/licenses/_pdf-lib_fontkit-1.1.1.txt +326 -0
- package/dist/licenses/_pdf-lib_standard-fonts-1.0.0.txt +22 -0
- package/dist/licenses/_pdf-lib_upng-1.0.1.txt +22 -0
- package/dist/licenses/_types_node-14.18.63.txt +22 -0
- package/dist/licenses/_types_pako-2.0.3.txt +22 -0
- package/dist/licenses/_types_pegjs-0.10.6.txt +22 -0
- package/dist/licenses/archiver-5.3.2.txt +23 -0
- package/dist/licenses/archiver-utils-2.1.0.txt +23 -0
- package/dist/licenses/archiver-utils-3.0.4.txt +23 -0
- package/dist/licenses/async-3.2.6.txt +20 -0
- package/dist/licenses/balanced-match-1.0.2.txt +22 -0
- package/dist/licenses/base64-js-1.5.1.txt +22 -0
- package/dist/licenses/big-integer-1.6.52.txt +25 -0
- package/dist/licenses/binary-0.3.0.txt +178 -0
- package/dist/licenses/bl-4.1.0.txt +14 -0
- package/dist/licenses/bluebird-3.4.7.txt +22 -0
- package/dist/licenses/brace-expansion-1.1.21.txt +22 -0
- package/dist/licenses/brace-expansion-2.1.7.txt +22 -0
- package/dist/licenses/buffer-5.7.1.txt +22 -0
- package/dist/licenses/buffer-crc32-0.2.13.txt +20 -0
- package/dist/licenses/buffer-indexof-polyfill-1.0.2.txt +23 -0
- package/dist/licenses/buffers-0.1.1.txt +140 -0
- package/dist/licenses/chainsaw-0.1.0.txt +184 -0
- package/dist/licenses/compress-commons-4.1.2.txt +23 -0
- package/dist/licenses/concat-map-0.0.1.txt +19 -0
- package/dist/licenses/core-util-is-1.0.3.txt +20 -0
- package/dist/licenses/crc-32-1.2.2.txt +202 -0
- package/dist/licenses/crc32-stream-4.0.3.txt +23 -0
- package/dist/licenses/dayjs-1.11.23.txt +22 -0
- package/dist/licenses/duplexer2-0.1.4.txt +27 -0
- package/dist/licenses/end-of-stream-1.4.5.txt +22 -0
- package/dist/licenses/exceljs-4.4.0.txt +23 -0
- package/dist/licenses/fast-csv-4.3.6.txt +22 -0
- package/dist/licenses/fast-png-6.4.0.txt +22 -0
- package/dist/licenses/fs-constants-1.0.0.txt +22 -0
- package/dist/licenses/fs.realpath-1.0.0.txt +44 -0
- package/dist/licenses/fstream-1.0.12.txt +16 -0
- package/dist/licenses/glob-7.2.3.txt +22 -0
- package/dist/licenses/graceful-fs-4.2.11.txt +16 -0
- package/dist/licenses/ieee754-1.2.1.txt +12 -0
- package/dist/licenses/immediate-3.0.6.txt +21 -0
- package/dist/licenses/inflight-1.0.6.txt +16 -0
- package/dist/licenses/inherits-2.0.4.txt +17 -0
- package/dist/licenses/iobuffer-5.4.0.txt +23 -0
- package/dist/licenses/isarray-1.0.0.txt +61 -0
- package/dist/licenses/jszip-3.10.2.txt +652 -0
- package/dist/licenses/lazystream-1.0.1.txt +24 -0
- package/dist/licenses/lie-3.3.0.txt +8 -0
- package/dist/licenses/listenercount-1.0.1.txt +6 -0
- package/dist/licenses/lodash.defaults-4.2.0.txt +48 -0
- package/dist/licenses/lodash.difference-4.5.0.txt +48 -0
- package/dist/licenses/lodash.escaperegexp-4.1.2.txt +48 -0
- package/dist/licenses/lodash.flatten-4.4.0.txt +48 -0
- package/dist/licenses/lodash.groupby-4.6.0.txt +48 -0
- package/dist/licenses/lodash.isboolean-3.0.3.txt +23 -0
- package/dist/licenses/lodash.isequal-4.5.0.txt +48 -0
- package/dist/licenses/lodash.isfunction-3.0.9.txt +48 -0
- package/dist/licenses/lodash.isnil-4.0.0.txt +23 -0
- package/dist/licenses/lodash.isplainobject-4.0.6.txt +48 -0
- package/dist/licenses/lodash.isundefined-3.0.1.txt +23 -0
- package/dist/licenses/lodash.union-4.6.0.txt +48 -0
- package/dist/licenses/lodash.uniq-4.5.0.txt +48 -0
- package/dist/licenses/minimatch-3.1.5.txt +16 -0
- package/dist/licenses/minimatch-5.1.9.txt +16 -0
- package/dist/licenses/minimist-1.2.8.txt +19 -0
- package/dist/licenses/mkdirp-0.5.6.txt +22 -0
- package/dist/licenses/node-sql-parser-5.4.0.txt +202 -0
- package/dist/licenses/normalize-path-3.0.0.txt +22 -0
- package/dist/licenses/once-1.4.0.txt +16 -0
- package/dist/licenses/pako-1.0.11.txt +22 -0
- package/dist/licenses/pako-2.2.0.txt +22 -0
- package/dist/licenses/path-is-absolute-1.0.1.txt +22 -0
- package/dist/licenses/pdf-lib-1.17.1.txt +22 -0
- package/dist/licenses/process-nextick-args-2.0.1.txt +20 -0
- package/dist/licenses/readable-stream-2.3.8.txt +48 -0
- package/dist/licenses/readable-stream-3.6.2.txt +48 -0
- package/dist/licenses/readdir-glob-1.1.3.txt +202 -0
- package/dist/licenses/rimraf-2.7.1.txt +16 -0
- package/dist/licenses/safe-buffer-5.1.2.txt +22 -0
- package/dist/licenses/safe-buffer-5.2.1.txt +22 -0
- package/dist/licenses/saxes-5.0.1.txt +397 -0
- package/dist/licenses/setimmediate-1.0.5.txt +21 -0
- package/dist/licenses/string_decoder-1.1.1.txt +49 -0
- package/dist/licenses/string_decoder-1.3.0.txt +49 -0
- package/dist/licenses/tar-stream-2.2.0.txt +22 -0
- package/dist/licenses/tmp-0.2.7.txt +22 -0
- package/dist/licenses/traverse-0.3.9.txt +25 -0
- package/dist/licenses/tslib-1.14.1.txt +13 -0
- package/dist/licenses/unzipper-0.10.14.txt +26 -0
- package/dist/licenses/util-deprecate-1.0.2.txt +25 -0
- package/dist/licenses/uuid-11.1.1.txt +10 -0
- package/dist/licenses/wrappy-1.0.2.txt +16 -0
- package/dist/licenses/xmlchars-2.2.0.txt +19 -0
- package/dist/licenses/zip-stream-4.1.1.txt +23 -0
- package/dist/matrix-CGRGkn5s.js +112 -0
- package/dist/matrix-gEO7ZM_u.cjs +1 -0
- package/dist/media-B7vnpD8k.cjs +1 -0
- package/dist/media-Y90dHK9z.js +70 -0
- package/dist/param-validation-C3HlcLLO.cjs +1 -0
- package/dist/param-validation-Do7Eg8Zv.js +181 -0
- package/dist/{pdf-AyJGb22z.cjs → pdf-ByVCb1i6.cjs} +49 -49
- package/dist/{pdf-8UPQebOE.js → pdf-DJ5S6ukC.js} +4924 -4872
- package/dist/pdf.cjs +1 -1
- package/dist/pdf.d.cts +20 -3
- package/dist/pdf.d.ts +20 -3
- package/dist/pdf.js +2 -2
- package/dist/{plugin-BGKf-Tqg.js → plugin-C2j5_mhx.js} +2 -2
- package/dist/{plugin-CktLH_Iy.cjs → plugin-Dr39GBRG.cjs} +1 -1
- package/dist/prepared-DdrjLC7L.cjs +1 -0
- package/dist/prepared-DqtpvRTn.js +87 -0
- package/dist/progress-B0ctFpKf.cjs +1 -0
- package/dist/progress-BXzlVbIp.js +29 -0
- package/dist/progress-DJBd9Rb9.cjs +1 -0
- package/dist/progress-Hc2vxoCs.js +52 -0
- package/dist/protocol-BzwMP4Vw.cjs +1 -0
- package/dist/protocol-kt4Iy6-3.js +90 -0
- package/dist/record-bindings-CZWBJ1fU.js +195 -0
- package/dist/record-bindings-DUX1VMlR.cjs +1 -0
- package/dist/{region-binding-workflow-DEJbhpCv.js → region-binding-workflow-CWNvIjkV.js} +1 -1
- package/dist/{region-binding-workflow-BzfbxRiR.cjs → region-binding-workflow-CqSMxQ4p.cjs} +1 -1
- package/dist/report-encoding-worker.cjs +1 -0
- package/dist/report-encoding-worker.d.ts +1 -0
- package/dist/report-encoding-worker.js +2 -0
- package/dist/{report-params-B44imUd4.js → report-params-B1RzkhJj.js} +1 -1
- package/dist/{report-params-SJfhKgaX.cjs → report-params-WDGrA4oP.cjs} +1 -1
- package/dist/rich-text-layout-ALlMoYOG.cjs +3 -0
- package/dist/rich-text-layout-Ct5WrY1g.js +102 -0
- package/dist/runtime-BjKBI530.js +168 -0
- package/dist/runtime-CBFEPKEs.cjs +1 -0
- package/dist/sbom.cdx.json +3982 -0
- package/dist/server/node.d.cts +106 -2
- package/dist/server/node.d.ts +106 -2
- package/dist/server-node.cjs +5 -1
- package/dist/server-node.js +4634 -539
- package/dist/server.cjs +1 -1
- package/dist/server.d.cts +780 -5
- package/dist/server.d.ts +780 -5
- package/dist/server.js +773 -691
- package/dist/sha256-BshdOkCC.cjs +1 -0
- package/dist/sha256-DTG-Gq8i.js +157 -0
- package/dist/style-67OqfNed.js +73 -0
- package/dist/style-C22Pbv3T.cjs +1 -0
- package/dist/style.css +1 -1
- package/dist/template-bindings-C2SpvsMU.js +58 -0
- package/dist/template-bindings-CEtWyiLX.cjs +1 -0
- package/dist/template-catalog-BtR2JmCL.js +414 -0
- package/dist/template-catalog-C2NLdrwB.cjs +1 -0
- package/dist/{template-fragments-DFUpq5QM.cjs → template-fragments-BVsbxs4a.cjs} +1 -1
- package/dist/{template-fragments-CLkGo6To.js → template-fragments-By0aZC1D.js} +21 -21
- package/dist/{template-outline-B3xVkzSv.cjs → template-outline-BwRV_eRo.cjs} +1 -1
- package/dist/{template-outline-CFenM1PV.js → template-outline-cnWfT_LK.js} +3 -3
- package/dist/template-registry-C62vpv4a.cjs +1 -0
- package/dist/template-registry-Cw3vRTX2.js +801 -0
- package/dist/textwrap-BEIg2w8y.js +110 -0
- package/dist/textwrap-BI-yJ6Wt.cjs +4 -0
- package/dist/{tree-CqcQ99NM.js → tree-CjVZLRw7.js} +1 -1
- package/dist/vue/async.d.cts +189 -14
- package/dist/vue/async.d.ts +189 -14
- package/dist/vue/index.d.cts +246 -22
- package/dist/vue/index.d.ts +246 -22
- package/dist/vue-async.cjs +1 -1
- package/dist/vue-async.js +3 -3
- package/dist/vue.cjs +1 -1
- package/dist/vue.js +80 -78
- package/dist/{workbook-session-BfK1yHOO.js → workbook-session-BeSO8PFB.js} +5460 -5295
- package/dist/{workbook-session-DNa2RHNG.cjs → workbook-session-Cbts-22R.cjs} +19 -19
- package/dist/worker.cjs +1 -1
- package/dist/worker.d.cts +104 -2
- package/dist/worker.d.ts +104 -2
- package/dist/worker.js +12 -156
- package/dist/xlsx-node.cjs +35 -35
- package/dist/xlsx-node.js +2138 -2137
- package/dist/xlsx.cjs +4 -4
- package/dist/xlsx.d.cts +24 -10
- package/dist/xlsx.d.ts +24 -10
- package/dist/xlsx.js +303 -277
- package/package.json +7 -4
- package/dist/ParamEditor-CflQV3eQ.js +0 -526
- package/dist/ParamEditor-vIDzvpPV.cjs +0 -1
- package/dist/ReportPreview-CvbqLUzM.cjs +0 -6
- package/dist/ReportPreview-D_ywJ_-H.js +0 -4533
- package/dist/assets-C2U-e-Sz.cjs +0 -4
- package/dist/assets-Q0wUwNrV.js +0 -217
- package/dist/batch-DzaTNLWI.js +0 -371
- package/dist/batch-xMkqYiTr.cjs +0 -1
- package/dist/capabilities-CK_7hizc.js +0 -63
- package/dist/capabilities-CsZ-pNHR.cjs +0 -1
- package/dist/config-0UIohTS7.cjs +0 -1
- package/dist/config-Dt9NtCPl.js +0 -566
- package/dist/data-explanation-BktvER5B.cjs +0 -1
- package/dist/data-explanation-C_J6jYNi.js +0 -16
- package/dist/defaults-DXhiM1ZD.js +0 -10
- package/dist/defaults-xhmcLLrf.cjs +0 -1
- package/dist/designer-Ci1LizA9.js +0 -5020
- package/dist/designer-rtmVIIdN.cjs +0 -2
- package/dist/grid-strokes-Cr7DwUux.cjs +0 -1
- package/dist/grid-strokes-DyyG1q_o.js +0 -53
- package/dist/json-snapshot-BeFT3Tso.js +0 -1952
- package/dist/json-snapshot-D1NTP2oI.cjs +0 -2
- package/dist/matrix-DVyWiYsd.cjs +0 -1
- package/dist/matrix-yZsGnldA.js +0 -227
- package/dist/page-window-index-CIuT4BAv.js +0 -43
- package/dist/page-window-index-DEjnM6IB.cjs +0 -1
- package/dist/param-validation-BlHHXs6u.js +0 -153
- package/dist/param-validation-DCK039V1.cjs +0 -1
- package/dist/progress-7OSZbFok.js +0 -39
- package/dist/progress-BnLiS5eH.cjs +0 -1
- package/dist/render-plan-7xpGrCEl.cjs +0 -1
- package/dist/render-plan-Ck6koX9L.js +0 -13
- package/dist/style-CQ1PK8ZB.js +0 -67
- package/dist/style-UgIJSA1F.cjs +0 -1
- package/dist/task-events-DQ276fn2.cjs +0 -1
- package/dist/task-events-Dpsvf_t2.js +0 -47
- package/dist/template-bindings-BJR4k7qZ.cjs +0 -1
- package/dist/template-bindings-Daui7hLF.js +0 -252
- package/dist/template-registry-COXDEJEM.js +0 -570
- package/dist/template-registry-D3SjENi6.cjs +0 -1
- package/dist/validate-BJ5HIWY8.cjs +0 -1
- package/dist/validate-CkQBWCeg.js +0 -163
package/dist/index.cjs
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const $=require("./defaults-xhmcLLrf.cjs"),G=require("./template-bindings-BJR4k7qZ.cjs"),u=require("./style-UgIJSA1F.cjs"),U=require("./render-plan-7xpGrCEl.cjs"),X=require("./validate-BJ5HIWY8.cjs"),ce=require("./dataset-BkRmwgeJ.cjs"),A=require("./assets-C2U-e-Sz.cjs"),f=require("./json-snapshot-D1NTP2oI.cjs"),de=require("./grid-geometry-CZ_cYB6O.cjs"),Le=require("./grid-strokes-Cr7DwUux.cjs"),B=require("./capabilities-CsZ-pNHR.cjs"),Ke=require("./progress-BnLiS5eH.cjs"),Xe=require("./page-window-index-DEjnM6IB.cjs"),M=require("./template-registry-D3SjENi6.cjs"),W=require("./param-validation-DCK039V1.cjs"),me=require("./data-explanation-BktvER5B.cjs"),he=require("./template-outline-B3xVkzSv.cjs"),oe=require("./template-fragments-DFUpq5QM.cjs"),ge=require("./tree-BX380Rr7.cjs"),Ze={root:"mr-root",page:"mr-page",comp:"mr-comp",text:"mr-text",lines:"mr-lines",line:"mr-line",rich:"mr-rich",paragraph:"mr-paragraph",segment:"mr-segment",image:"mr-image",shape:"mr-shape",grid:"mr-grid",row:"mr-row",cell:"mr-cell",unknown:"mr-unknown"};function P(e,t){return t?.classNames?.[e]??Ze[e]}class Qe{constructor(){this.props=[]}add(t,r){return r==null||r===!1||r===""?this:(this.props.push([t,String(r)]),this)}mm(t,r,n,o=2){return this.add(t,`${u.round(u.mmToPx(r,n),o)}px`)}toString(){let t="";for(const[r,n]of this.props)t+=`${r}:${n};`;return t}applyTo(t){const r=this.toString();r&&(t.style.cssText=r)}}function T(e,t="unset"){return new Qe().add("all",t).add("display",e).add("box-sizing","border-box")}function Ie(e,t,r){e.add("color",t.color).add("font-family",t.fontFamily).add("font-weight",t.bold!=null?t.bold?"700":"400":void 0).add("font-style",t.italic!=null?t.italic?"italic":"normal":void 0).add("text-decoration",t.underline!=null?t.underline?"underline":"none":void 0).add("letter-spacing",t.letterSpacing!=null?`${t.letterSpacing}pt`:void 0).add("line-height",String(u.resolveLineHeight(t))).add("text-align",t.align);const n=u.resolveFontSize(t,r);e.add("font-size",`${u.round(n.fontSizePx,2)}px`)}function et(e,t,r){const n=t.style??{};Ie(e,n,r),e.add("background-color",n.backgroundColor).add("opacity",n.opacity!=null?String(n.opacity):void 0).add("transform",n.rotateDeg?`rotate(${n.rotateDeg}deg)`:void 0)}function tt(e,t,r,n,o,a){const s=e.cell,i=a.createElement("td");i.className=P("cell",o),i.dataset.mrRowIndex=String(e.ri),i.dataset.mrColumnIndex=String(e.ci),i.setAttribute("role",t.table?.role==="header"?"columnheader":"cell"),s.colSpan&&(i.colSpan=s.colSpan),s.rowSpan&&(i.rowSpan=s.rowSpan);const l=u.mergeComponentStyles(t.style,s.style),c=T("block").add("position","absolute").mm("left",e.xMm,n).mm("top",e.yMm,n).mm("width",e.widthMm,n).mm("height",e.heightMm,n).add("background-color",l.backgroundColor).add("vertical-align",l.verticalAlign??"middle");Ie(c,l,n),c.applyTo(i);const d=a.createElement("div");d.className="mr-cell-content",T("flex").add("position","absolute").mm("left",r+(s.indentMm??0),n).mm("right",r,n).mm("top",r,n).mm("bottom",r,n).add("flex-direction","column").add("justify-content",l.verticalAlign==="top"?"flex-start":l.verticalAlign==="bottom"?"flex-end":"center").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(d),s.text!=null&&d.append(s.text);for(const m of s.children??[])d.appendChild(ue(m,n,o,a));return i.appendChild(d),i}function rt(e,t,r,n){return Le.resolveGridStrokes(e,t).map(o=>{const a=`${u.round(o.widthPt*r/72,2)}px solid ${o.color}`,s=n.createElement("div");s.className="mr-grid-edge",s.setAttribute("aria-hidden","true");const i=o.kind==="h";return T("block").add("position","absolute").add("pointer-events","none").mm("left",i?o.from:o.pos,r).mm("top",i?o.pos:o.from,r).mm("width",i?o.to-o.from:0,r).mm("height",i?0:o.to-o.from,r).add(i?"border-top":"border-left",a).applyTo(s),s})}function nt(e,t,r,n,o){const a=o.createElement("table");a.className=P("grid",n),a.setAttribute("role","table"),T("block").add("position","relative").add("width","100%").add("height","100%").applyTo(a);const s=de.resolveGridLayout(e,t.widthMm,t.heightMm),i=o.createElement("tbody");T("contents").applyTo(i),a.appendChild(i);const l=e.cells.map(()=>{const d=o.createElement("tr");return d.className=P("row",n),d.setAttribute("role","row"),T("contents").applyTo(d),i.appendChild(d),d});for(const d of s.cells)l[d.ri].appendChild(tt(d,t,e.paddingMm??.5,r,n,o));const c=o.createElement("div");return T("block").add("position","relative").add("width","100%").add("height","100%").applyTo(c),c.append(a,...rt(s,t,r,o)),c}function ot(e,t,r,n){const o=n.createElement("div");o.className=P("paragraph",r),T("block").add("text-align",e.align).add("line-height",e.lineHeight!=null?String(e.lineHeight):void 0).mm("margin-top",e.spaceBeforeMm??0,t).mm("margin-bottom",e.spaceAfterMm??0,t).mm("text-indent",e.indentMm??0,t).applyTo(o);for(const a of e.segments||[]){const s=n.createElement("span");s.className=P("segment",r),s.textContent=a.kind==="field"?a.field??"":a.text??"";const i=T("inline");if(a.style){const l=a.style;i.add("color",l.color).add("font-family",l.fontFamily).add("font-weight",l.bold!=null?l.bold?"700":"400":void 0).add("font-style",l.italic!=null?l.italic?"italic":"normal":void 0).add("text-decoration",l.underline!=null?l.underline?"underline":"none":void 0),(l.fontSize!=null||l.fontSizePx!=null)&&i.add("font-size",`${u.round(u.resolveFontSize(l,t).fontSizePx,2)}px`)}i.applyTo(s),o.appendChild(s)}return o}function it(e,t,r,n){if(U.isRichText(e)){const o=n.createElement("div");o.className=P("rich",r),T("block").applyTo(o);for(const a of e.richParagraphs)o.appendChild(ot(a,t,r,n));return o}if(Array.isArray(e.lines)&&e.lines.length>0){const o=n.createElement("div");o.className=P("lines",r),T("block").applyTo(o);for(const a of e.lines){const s=n.createElement("div");s.className=P("line",r),s.textContent=a,T("block").add("white-space","pre").add("min-height","1lh").applyTo(s),o.appendChild(s)}return o}return e.text??""}function at(e,t,r,n){const o=n.createElement("div");o.className=P("text",r);const a=e.style||{};return T("flex").add("width","100%").add("height","100%").add("flex-direction","column").add("justify-content",a.verticalAlign==="middle"?"center":a.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(o),o.append(it(e,t,r,n)),o}function st(e,t,r){const n=r.createElement("img");return n.className=P("image",t),n.src=e.imageData,T("block").add("width","100%").add("height","100%").add("object-fit","contain").applyTo(n),n.alt=e.kind,n}function Ee(e,t,r,n){const o=n.createElement("div");o.className=P("shape",r);const a=e.style||{},s=u.resolveStroke(a),i=u.resolveBoxBorders(a),l=`${u.round(s.widthPt*t/72,2)}px solid ${s.color}`,c=T("block");return e.grid?c.add("position","relative"):e.kind==="rect"?(i.top&&c.add("border-top",l),i.right&&c.add("border-right",l),i.bottom&&c.add("border-bottom",l),i.left&&c.add("border-left",l)):e.kind==="ellipse"?(i.inner&&c.add("border",l).add("border-radius","50%"),a.backgroundColor&&c.add("background-color",a.backgroundColor)):e.kind==="line"&&c.add("height","0").add("border-top",l),c.add("box-sizing","border-box").add("width","100%").add("height","100%"),c.applyTo(o),o}function lt(e,t,r){const n=r.createElementNS("http://www.w3.org/2000/svg","svg"),o=u.mmToPx(e.widthMm,t),a=u.mmToPx(e.heightMm,t);n.setAttribute("width",String(Math.max(1,o))),n.setAttribute("height",String(Math.max(1,a))),n.setAttribute("aria-hidden","true"),n.style.overflow="visible",n.style.display="block";const s=r.createElementNS("http://www.w3.org/2000/svg","line");s.setAttribute("x1","0"),s.setAttribute("x2",String(o)),s.setAttribute("y1",e.lineDirection==="up"?String(a):"0"),s.setAttribute("y2",e.lineDirection==="up"?"0":String(a));const i=u.resolveStroke({...e.style,borderColor:e.style?.lineColor??e.style?.borderColor});return s.setAttribute("stroke",i.color),s.setAttribute("stroke-width",String(i.widthPt*t/72)),n.appendChild(s),n}function ue(e,t,r,n){const o=n.createElement("div");o.className=`${P("comp",r)} mr-kind-${e.kind}`;const a=T("block").add("position","absolute").mm("left",e.leftMm,t).mm("top",e.topMm,t).mm("width",e.widthMm,t).mm("height",e.heightMm,t).add("box-sizing","border-box");if(et(a,e,t),a.applyTo(o),U.isImageBackedComponent(e))return o.appendChild(st(e,r,n)),o;if(e.kind==="text")return o.appendChild(at(e,t,r,n)),o;if(e.grid){const i=Ee(e,t,r,n);return i.appendChild(nt(e.grid,e,t,r,n)),o.appendChild(i),o}if(e.kind==="line"&&e.lineDirection)return o.appendChild(lt(e,t,n)),o;if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse")return o.appendChild(Ee(e,t,r,n)),o;const s=n.createElement("div");return s.className=P("unknown",r),T("block").applyTo(s),s.textContent=e.fallbackText??`[${e.kind}]`,s.dataset.mrUnsupported=e.kind,s.setAttribute("role","note"),o.appendChild(s),o}function ke(e,t,r,n){const o=n.createElement("div");return o.className=P("page",r),T("block","initial").add("position","relative").add("font-family",$.DEFAULT_FONT_FAMILY).add("font-size",`${u.round(u.resolveFontSize(void 0,t).fontSizePx,2)}px`).add("line-height",String(u.resolveLineHeight(void 0))).add("white-space","pre-wrap").add("direction","ltr").mm("width",e.pageWidthMm,t).mm("height",e.pageHeightMm,t).add("background-color","#fff").add("color",$.DEFAULT_TEXT_COLOR).add("overflow","hidden").add("box-sizing","border-box").applyTo(o),e.components.forEach((a,s)=>{const i=ue(a,t,r,n);i.dataset.mrComponentIndex=String(s),o.appendChild(i)}),o}function ct(e,t,r={}){const n=r.dpi??96;B.reportOutputDiagnostics(e,"dom",r);const o=t.createElement("div");return o.className=P("root",r),T("block").applyTo(o),o.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(a=>{o.appendChild(ke(a,n,r,t))}),o}function D(e){if(e?.aborted)throw e.reason??new DOMException("The operation was aborted.","AbortError")}const dt=(e,t)=>(D(t),/^data:image\/(?:png|jpe?g|webp|gif|svg\+xml)[;,]/i.test(e)?new Promise((r,n)=>{const o=new Image,a=()=>{o.onload=null,o.onerror=null,t?.removeEventListener("abort",s)},s=()=>{a(),o.src="",n(t?.reason??new DOMException("The operation was aborted.","AbortError"))};o.onload=()=>{a(),r(o)},o.onerror=()=>{a(),n(new Error("Image could not be decoded for Canvas output."))},t?.addEventListener("abort",s,{once:!0}),o.src=e}):Promise.reject(new TypeError("Canvas imageData must be an image data URL; provide imageLoader for other sources.")));function mt(e,t,r){return D(r),r?new Promise((n,o)=>{const a=()=>o(r.reason??new DOMException("The operation was aborted.","AbortError"));r.addEventListener("abort",a,{once:!0}),Promise.resolve().then(()=>e(t,r)).then(n,o).finally(()=>r.removeEventListener("abort",a))}):e(t)}async function ht(e,t,r){const n=new Map;for(const o of e.components)!U.isImageBackedComponent(o)||n.has(o.imageData)||n.set(o.imageData,await mt(t,o.imageData,r));return D(r),n}function gt(e,t,r,n,o,a){const s=t,i=s.naturalWidth??s.width??o,l=s.naturalHeight??s.height??a;if(i<=0||l<=0)throw new RangeError("Decoded Canvas image dimensions must be positive.");const c=Math.min(o/i,a/l),d=i*c,m=l*c;e.drawImage(t,r+(o-d)/2,n+(a-m)/2,d,m)}function Fe(e){return Xe.createPageWindowIndex(e.pageHeightsPx,e.gapPx).window(e.viewportHeightPx,e.scrollTopPx,e.overscan)}const pe=96/25.4;function ie(e,t=96){const r=t/96*pe;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*r)),heightPx:Math.max(1,Math.round(e.pageHeightMm*r))}}function $e(e,t,r,n=64e6){if(!Number.isFinite(t)||t<=0||!Number.isFinite(r)||r<=0)throw new RangeError("Canvas dpr and dpi must be positive finite numbers.");if(!Number.isFinite(n)||n<=0)throw new RangeError("maxCanvasPixels must be positive and finite.");const o=ie(e,r),a=Math.round(o.widthPx*t),s=Math.round(o.heightPx*t);if(!Number.isSafeInteger(a)||!Number.isSafeInteger(s)||a*s>n)throw new RangeError("Canvas page exceeds maxCanvasPixels; reduce resolution or split the report.");return{width:a,height:s}}function De(e,t,r,n){const o=document.createElement("canvas"),{widthPx:a,heightPx:s}=ie(e,r),i=$e(e,t,r,n);o.width=i.width,o.height=i.height,o.style.width=`${a}px`,o.style.height=`${s}px`;const l=o.getContext("2d");if(!l)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return l.scale(t,t),l.fillStyle="#ffffff",l.fillRect(0,0,a,s),{canvas:o,ctx:l}}function ut(e,t=96){return u.resolveFontSize(e,t).fontSizePx}function Ne(e,t,r,n,o,a,s,i="top"){e.font=`${t.italic?"italic ":""}${t.bold?"bold ":""}${t.fontSizePx}px ${s}`,"letterSpacing"in e&&(e.letterSpacing="0px"),e.fillStyle=t.color,e.textBaseline="alphabetic";const l=t.fontSizePx*t.lineHeight,c=t.text===""?[""]:t.text.split(`
|
|
2
|
-
`),d=c.length*
|
|
3
|
-
`);
|
|
4
|
-
`):t.
|
|
5
|
-
`):A.wrapText(t.text??"",t.widthMm,{fontSizePt:d.fontSizePt,bold:c.bold,italic:c.italic,fontFamily:c.fontFamily??i,letterSpacingPt:c.letterSpacing},l).join(`
|
|
6
|
-
`);Ne(e,{text:m,fontSizePx:d.fontSizePx,bold:c.bold??!1,italic:c.italic,color:u.resolveTextColor(c),align:c.align??"left",lineHeight:u.resolveLineHeight(c),letterSpacingPx:u.ptToPx(c.letterSpacing??0,s)},r,n,o,a,c.fontFamily??i,c.verticalAlign)}function fe(e,t,r,n,o,a,s){const i=t.leftMm*r,l=t.topMm*r,c=t.widthMm*r,d=t.heightMm*r,m=t.style??{};if(U.isImageBackedComponent(t)){const h=s?.get(t.imageData);h?gt(e,h,i,l,c,d):Te(e,t,i,l,c,d);return}if(t.grid){vt(e,t.grid,t,i,l,c,d,r,n,o,a);return}switch(t.kind){case"text":{yt(e,t,i,l,c,d,n,o,a);break}case"rect":{const h=u.resolveStroke(m),g=u.resolveBoxBorders(m);m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.fillRect(i,l,c,d)),g.inner&&(e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,n),wt(e,g,i,l,c,d));break}case"line":{const h=u.resolveStroke({...m,borderColor:m.lineColor??m.borderColor});e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,n),e.beginPath();const g=t.lineDirection==="up"?l+d:t.lineDirection==="down"?l:l+d/2,p=t.lineDirection==="up"?l:t.lineDirection==="down"?l+d:l+d/2;e.moveTo(i,g),e.lineTo(i+c,p),e.stroke();break}case"ellipse":{const h=u.resolveStroke(m);e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,n),m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.beginPath(),e.ellipse(i+c/2,l+d/2,c/2,d/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(i+c/2,l+d/2,c/2,d/2,0,0,Math.PI*2),e.stroke();break}default:Te(e,t,i,l,c,d);break}}function Te(e,t,r,n,o,a){e.save(),e.strokeStyle="#94a3b8",e.strokeRect(r,n,o,a),e.fillStyle="#64748b",e.font="12px sans-serif",e.fillText(t.fallbackText??`[${t.kind}]`,r+3,n+14),e.restore()}async function bt(e,t={}){if(typeof document>"u")throw new Error("renderPlanToImages 需要浏览器环境(SSR/Node 请在客户端钩子中调用)");const{format:r="png",quality:n=.92,...o}=t;if(r!=="png"&&r!=="jpeg")throw new TypeError("Image format must be png or jpeg.");if(!Number.isFinite(n)||n<0||n>1)throw new RangeError("Image quality must be between 0 and 1.");D(t.signal);const a=await A.resolvePlanAssets(e,{...t,format:"canvas"});e=a.plan;const s=[...a.diagnostics,...B.reportOutputDiagnostics(e,"canvas",t)],i=r==="jpeg"?"image/jpeg":"image/png",l=[],c=Math.min(e.pages.length-1,t.end??e.pages.length-1);for(let d=Math.max(0,t.start??0);d<=c;d++){D(t.signal);const m=await Oe(e.pages[d],d,o,s);try{l.push(await Mt(m,i,n,t.signal))}finally{m.width=0,m.height=0}await Ke.outputCheckpoint(t,l.length,c-Math.max(0,t.start??0)+1)}return D(t.signal),{blobs:l,diagnostics:s}}function Mt(e,t,r,n){return D(n),new Promise((o,a)=>{const s=()=>a(n?.reason??new DOMException("The operation was aborted.","AbortError"));n?.addEventListener("abort",s,{once:!0});try{e.toBlob(i=>{n?.removeEventListener("abort",s),i?o(i):a(new Error("Canvas encoding failed; no empty image was emitted."))},t,r)}catch(i){n?.removeEventListener("abort",s),a(i)}})}function Et(e,t={}){if(D(t.signal),typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const r=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,o=n/96*pe,a=t.fontFamily??$.DEFAULT_FONT_FAMILY,s=t.measurer??A.heuristicMeasurer,i=Math.max(0,t.start??0),l=Math.min(e.pages.length-1,t.end??e.pages.length-1),c=[],d=B.reportOutputDiagnostics(e,"canvas",t),m=Tt(e,i,l);for(const h of m)B.notifyOutputDiagnostic(h,t),d.push(h);if(t.fidelity==="strict"&&m.length)throw new B.OutputFidelityError(d);for(let h=i;h<=l;h++){D(t.signal);const g=e.pages[h],{canvas:p,ctx:y}=De(g,r,n,t.maxCanvasPixels);for(const L of g.components)fe(y,L,o,n,a,s);c.push(p)}return{canvases:c,diagnostics:d}}function Tt(e,t,r){return r<t?[]:e.pages.slice(t,r+1).flatMap((n,o)=>n.components.flatMap((a,s)=>U.isImageBackedComponent(a)?[{code:"async-image-required",severity:"warning",format:"canvas",pageIndex:t+o,componentIndex:s,kind:a.kind,nid:a.nid,message:"Use renderPlanToCanvasAsync or renderPlanToImages to decode and include images."}]:[]))}async function xt(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvasAsync 需要浏览器环境(Node 请使用 PDF 或 XLSX 输出)");D(t.signal);const r=await A.resolvePlanAssets(e,{...t,format:"canvas"});e=r.plan;const n=[...r.diagnostics,...B.reportOutputDiagnostics(e,"canvas",t)],o=[],a=Math.min(e.pages.length-1,t.end??e.pages.length-1);for(let s=Math.max(0,t.start??0);s<=a;s++)o.push(await Oe(e.pages[s],s,t,n));return{canvases:o,diagnostics:n}}async function Oe(e,t,r,n){const o=r.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),a=r.dpi??96,s=r.fontFamily??$.DEFAULT_FONT_FAMILY,i=await _e(e,t,r,n);D(r.signal);const{canvas:l,ctx:c}=De(e,o,a,r.maxCanvasPixels);for(const d of e.components)fe(c,d,a/25.4,a,s,r.measurer??A.heuristicMeasurer,i);return l}async function _e(e,t,r,n){const o=r.imageLoader??dt;return ht(e,async(a,s)=>{try{return await o(a,s)}catch(i){if(s?.aborted)throw i;const l=e.components.findIndex(m=>m.imageData===a),c=e.components[l],d={code:"image-decode-failed",severity:"warning",format:"canvas",pageIndex:t,componentIndex:l,kind:c.kind,nid:c.nid,message:"Image decoding failed; raster output was cancelled instead of omitting the image."};throw n.push(d),B.notifyOutputDiagnostic(d,r),i}},r.signal)}function Rt(e,t={}){const r=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,o=n/96*pe,a=t.fontFamily??$.DEFAULT_FONT_FAMILY,s=t.measurer??A.heuristicMeasurer,i=t.overscan??1,l=t.gapPx??18,c=t.pagesPerFrame??1,d=e.pages.map(w=>w.pageHeightMm*o),m=Math.max(1,...e.pages.map(w=>w.pageWidthMm*o)),h={start:0,end:-1};let g=null,p=null,y=null,L=null,R=[],x=0,I=[],V=0,H=new AbortController;const ye=[];function Ve(){const w=g;w.innerHTML="",p=document.createElement("div"),p.style.cssText=`width:${m}px;margin:0 auto;`,y=document.createElement("div"),L=document.createElement("div"),p.appendChild(y),R=[];const S=Math.min(e.pages.length,3+i*2);for(let j=0;j<S;j++){const E=document.createElement("div");E.style.cssText=`margin:0 auto ${l}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,p.appendChild(E),R.push(E)}p.appendChild(L),w.appendChild(p)}async function Ge(w,S){const j=V,E=await A.resolvePlanAssets(e,{...t,signal:H.signal,format:"canvas",start:S,end:S});ye.push(...E.diagnostics);const k=E.plan.pages[S],ee=await _e(k,S,{...t,signal:H.signal},ye);if(j!==V||!g)return;const{widthPx:se,heightPx:le}=ie(k,n);let z=w.firstElementChild;(!z||z.tagName!=="CANVAS")&&(z=document.createElement("canvas"),w.innerHTML="",w.appendChild(z));const Me=$e(k,r,n,t.maxCanvasPixels);z.width=Me.width,z.height=Me.height,z.style.width=`${se}px`,z.style.height=`${le}px`;const Y=z.getContext("2d");if(Y){Y.setTransform(1,0,0,1,0,0),Y.scale(r,r),Y.fillStyle="#ffffff",Y.fillRect(0,0,se,le);for(const Je of k.components)fe(Y,Je,o,n,a,s,ee);z.dataset.canvasPage=String(S),w.style.height=`${le}px`,w.style.width=`${se}px`}}function Ye(w){V++,h.start=w.start,h.end=w.end,y.style.height=`${w.start*l+d.slice(0,w.start).reduce((E,k)=>E+k,0)}px`;const S=e.pages.length-1-w.end;L.style.height=`${S*l+d.slice(w.end+1).reduce((E,k)=>E+k,0)}px`;const j=w.end-w.start+1;R.forEach((E,k)=>{if(k<j){E.style.display="";const ee=w.start+k;E.style.height=`${d[ee]??0}px`}else E.style.display="none"}),I=[];for(let E=w.start;E<=w.end;E++){const k=R[E-w.start];if(!k)continue;k.firstElementChild?.dataset?.canvasPage!==String(E)&&I.push(E)}ae()}function ae(){x||I.length===0||(x=requestAnimationFrame(()=>{x=0;let w=Math.max(1,c);for(;I.length>0&&w-- >0;){const S=I.shift(),j=R[S-h.start];j&&Ge(j,S).catch(()=>{})}I.length>0&&ae()}))}function Z(){x||(x=requestAnimationFrame(()=>{x=0;const w=g,S=Fe({pageHeightsPx:d,viewportHeightPx:w.clientHeight,scrollTopPx:w.scrollTop,overscan:i,gapPx:l});S.start!==h.start||S.end!==h.end?Ye(S):ae()}))}let Q=null;return{attach(w){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");D(t.signal),H=new AbortController,t.signal?.addEventListener("abort",be,{once:!0}),B.reportOutputDiagnostics(e,"canvas",t),g=w,Ve(),w.addEventListener("scroll",Z,{passive:!0}),typeof ResizeObserver<"u"&&(Q=new ResizeObserver(()=>Z()),Q.observe(w)),Z()},destroy(){V++,H.abort(),t.signal?.removeEventListener("abort",be),x&&cancelAnimationFrame(x),x=0,Q?.disconnect(),Q=null,g?.removeEventListener("scroll",Z),I=[],p?.remove(),g=null},window(){return{...h}}};function be(){H.abort(t.signal?.reason)}}function we(e,t,r){let n,o;if(typeof e=="string"){const a=u.PAPER_SIZES[e];if(!a)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(u.PAPER_SIZES).join("/")})`);n=a.widthMm,o=a.heightMm}else typeof e=="number"?(n=e,o=t??297):(n=e.widthMm,o=e.heightMm);return r?{widthMm:o,heightMm:n}:{widthMm:n,heightMm:o}}class Be{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}repeat(t){return this.templateRepeat=t,this}params(t){return this.templateParams=t,this}page(t="a4",r={},n){this.collect();const a=n!=null&&!("margins"in n)&&!("landscape"in n)&&("marginTopMm"in n||"marginBottomMm"in n||"marginLeftMm"in n||"marginRightMm"in n)?{margins:n}:typeof r=="number"?n??{}:r,{widthMm:s,heightMm:i}=we(t,typeof r=="number"?r:void 0,a.landscape),l=a.margins??{};return this.pending=new He(this,{widthMm:s,heightMm:i,marginTopMm:l.marginTopMm??10,marginBottomMm:l.marginBottomMm??10,marginLeftMm:l.marginLeftMm??10,marginRightMm:l.marginRightMm??10}),this.pending}collect(){this.pending&&(this.pages.push(this.pending.buildPage()),this.pending=null)}build(){if(this.collect(),this.pages.length===0)throw new Error("模板至少需要一页:先调用 .page() 添加内容");return{...this.templateParams?{params:this.templateParams}:{},...this.templateRepeat?{repeat:this.templateRepeat}:{},pages:this.pages}}}class He{constructor(t,r){this.parent=t,this.page=r,this.components=[]}text(t,r={},n={}){return this.components.push({kind:"text",leftMm:r.leftMm??0,topMm:r.topMm??0,widthMm:r.widthMm??60,heightMm:r.heightMm??8,text:t,style:n}),this}list(t,r,n,o={}){return this.components.push({kind:"list",leftMm:r.leftMm??10,topMm:r.topMm??30,widthMm:r.widthMm??180,dataset:t,columns:n,...o}),this}rect(t,r={}){return this.components.push({kind:"rect",...t,style:r}),this}line(t,r,n,o={}){return this.components.push({kind:"line",leftMm:t,topMm:r,widthMm:n,heightMm:.5,style:o}),this}barcode(t,r){return this.components.push({kind:"barcode",leftMm:r.leftMm??0,topMm:r.topMm??0,widthMm:r.widthMm??40,heightMm:r.heightMm??12,fallbackText:t}),this}qrcode(t,r,n,o){return this.components.push({kind:"qrcode",leftMm:n,topMm:o,widthMm:r,heightMm:r,fallbackText:t}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function St(){return new Be}function Ct(e,t={}){return ce.validateDatasetRows([],e),e.fields.map(r=>({field:r.field,header:`${r.label??r.field}${r.unit?` (${r.unit})`:""}`,semanticRole:r.semanticRole??(r.type==="number"||r.type==="decimal"?"measure":r.type==="date"?"date":r.enum?"dimension":"text"),...t[r.field]}))}function N(e,t,r=!1){if(!Number.isFinite(e)||(r?e<0:e<=0))throw new Error(`${t} 必须是有限${r?"非负":"正"}数`)}function re(e,t,r){if(e!==void 0&&!["left","center","right","justify",...r?["auto"]:[]].includes(e))throw new Error(`${t} 必须是 left/center/right/justify${r?"/auto":""}`)}function Pt(e){const t=e.layout??"page";if(t!=="page"&&t!=="wide")throw new Error("layout 必须是 page 或 wide");if(t==="wide"&&(e.paper!==void 0||e.landscape!==void 0))throw new Error('宽表布局不能同时指定 paper 或 landscape;标准纸型请使用 layout: "page"');if(t!=="wide"&&e.columnWidthMm!==void 0)throw new Error('columnWidthMm 仅适用于 layout: "wide"');const r=e.columnWidthMm??30;return N(r,"columnWidthMm"),{layout:t,columnWidthMm:r}}function At(e){const t=e.paper===void 0?"a4":e.paper;if(typeof t!="string"&&(typeof t!="object"||t===null)||e.landscape!==void 0&&typeof e.landscape!="boolean")throw new Error("paper 必须是纸张预设名或 { widthMm, heightMm } 对象,landscape 必须是布尔值");if(typeof t=="string"&&!Object.prototype.hasOwnProperty.call(u.PAPER_SIZES,t))throw new Error(`未知纸张预设 "${t}"(可用:${Object.keys(u.PAPER_SIZES).join("/")})`);const r=we(t,void 0,e.landscape),n=r.widthMm,o=r.heightMm;return N(n,"纸张 widthMm"),N(o,"纸张 heightMm"),{widthMm:n,heightMm:o}}function Lt(e){if(e.margins!==void 0&&(!e.margins||typeof e.margins!="object"||Array.isArray(e.margins)))throw new Error("margins 必须是页边距对象");const t=e.margins??{},r={marginTopMm:t.marginTopMm===void 0?10:t.marginTopMm,marginBottomMm:t.marginBottomMm===void 0?10:t.marginBottomMm,marginLeftMm:t.marginLeftMm===void 0?10:t.marginLeftMm,marginRightMm:t.marginRightMm===void 0?10:t.marginRightMm};for(const[n,o]of Object.entries(r))N(o,n,!0);return r}function It(e,t){const r=e.dataset===void 0?"detail":e.dataset;if(typeof r!="string"||!r.trim())throw new Error("dataset 必须是非空字符串");if(e.title!==void 0&&typeof e.title!="string")throw new Error("title 必须是字符串");const n=e.titleHeightMm===void 0?10:e.titleHeightMm,o=e.titleGapMm===void 0?4:e.titleGapMm;N(n,"titleHeightMm"),N(o,"titleGapMm",!0);const a=e.title!==void 0&&e.title.length>0,s=a?n+o:0;if(s>=t)throw new Error("标题高度与间距占满页面,必须为表格保留可用高度");return{dataset:r,titleHeightMm:n,hasTitle:a,titleSpaceMm:s}}function kt(e){if(e.listOptions!==void 0&&(!e.listOptions||typeof e.listOptions!="object"||Array.isArray(e.listOptions)))throw new Error("listOptions 必须是列表配置对象");const t=e.listOptions??{};re(t.align,"listOptions.align",!0),re(t.headerAlign,"listOptions.headerAlign",!1);for(const r of["fontSizePt","rowHeightMm","paddingMm"]){const n=t[r];n!==void 0&&N(n,`listOptions.${r}`,r==="paddingMm")}return t}function Ft(e){let t=0,r=0;for(const[n,o]of e.entries()){if(!o||typeof o.header!="string"||typeof o.field!="string"||!o.field.trim())throw new Error(`columns[${n}] 需要字符串 header 与非空 field`);re(o.align,`columns[${n}].align`,!0),re(o.headerAlign,`columns[${n}].headerAlign`,!1),o.flex!==void 0&&N(o.flex,`columns[${n}].flex`),o.widthMm!==void 0?(N(o.widthMm,`columns[${n}].widthMm`),t+=o.widthMm):r=Math.max(r,o.flex??1)}return{fixedWidthMm:t,maxFlex:r}}function $t(e,t,r,n){const{fixedWidthMm:o,maxFlex:a}=Ft(e.columns);if(t==="page"&&o>n)throw new Error(`固定列宽 ${o}mm 超出页面可用宽度 ${n}mm`);const s=n-o;if(t==="page"&&a>0&&s<=0)throw new Error("固定列占满页面可用宽度,自动列需要正的剩余宽度");const i=a>0?e.columns.reduce((c,d)=>c+(d.widthMm===void 0?(d.flex??1)/a:0),0):0;return{columns:e.columns.map(({widthMm:c,flex:d,...m},h)=>{const g=c??(t==="wide"?r*(d??1):s*((d??1)/a)/i);return N(g,`columns[${h}] 分配后的 widthMm`),{...m,widthMm:g}}),fixedWidthMm:o,maxFlex:a}}function Dt(e){if(!e||typeof e!="object")throw new Error("标准明细模板需要 options 对象");if(!Array.isArray(e.columns)||e.columns.length===0)throw new Error("columns 至少需要一列");const{layout:t,columnWidthMm:r}=Pt(e),n=At(e);let o=n.widthMm;const a=n.heightMm,s=Lt(e);let i=o-s.marginLeftMm-s.marginRightMm;const l=a-s.marginTopMm-s.marginBottomMm;if(t==="page"&&i<=0||l<=0)throw new Error("页边距占满纸张,必须保留正的可用宽度和高度");const{dataset:c,titleHeightMm:d,hasTitle:m,titleSpaceMm:h}=It(e,l),g=kt(e),{columns:p,fixedWidthMm:y,maxFlex:L}=$t(e,t,r,i);t==="wide"&&(i=p.reduce((x,I)=>x+I.widthMm,0),N(i,"宽表总列宽"),o=i+s.marginLeftMm+s.marginRightMm,N(o,"宽表总宽度"));const R={widthMm:o,heightMm:a,...s,components:[],...t==="wide"?{layout:t}:{}};return m&&R.components.push({kind:"text",text:e.title,leftMm:s.marginLeftMm,topMm:s.marginTopMm,widthMm:i,heightMm:d,style:{fontSize:16,bold:!0,align:"center",verticalAlign:"middle",...e.titleStyle}}),R.components.push({align:"auto",headerAlign:"center",...g,kind:"list",...t==="wide"?{layout:t}:{},...m?{title:e.title}:{},dataset:c,columns:p,leftMm:s.marginLeftMm,topMm:s.marginTopMm+h,widthMm:t==="wide"||L>0?i:y}),e.params===void 0?{pages:[R]}:{params:e.params,pages:[R]}}function Nt(e){if(e.components!==void 0&&e.pages!==void 0)throw new TypeError("标签 components 与 pages 只能选择一种");const{dataset:t,rowKey:r,copies:n,params:o}=e,a=e.pages??[{components:e.components??[]}],s={repeat:{dataset:t,...r===void 0?{}:{rowKey:r},...n===void 0?{}:{copies:n}},...o===void 0?{}:{params:o},pages:a.map(l=>({widthMm:l.widthMm??e.widthMm??80,heightMm:l.heightMm??e.heightMm??55,marginTopMm:0,marginRightMm:0,marginBottomMm:0,marginLeftMm:0,components:l.components,...l.meta===void 0?{}:{meta:l.meta}}))},i=M.validateReportTemplate(s);if(!i.ok)throw new M.ReportTemplateError(i.errors);return JSON.parse(JSON.stringify(s))}function Ot(e){if(!e||typeof e!="object"||!e.repeat)throw new f.ReportSourceError("config","defineLabelReport 需要带 repeat 的固定标签模板");const t=M.validateReportTemplate(e);if(!t.ok)throw new M.ReportTemplateError(t.errors);return e.repeat.dataset}function xe(e,t){if(!Array.isArray(e))throw new f.ReportSourceError("validate","标签数据应为对象数组;请从业务响应中提取行数组");return{[t]:e}}function _t(e){const{template:t,rows:r,load:n,dataSchema:o,params:a,pagination:s,dataValidation:i}=e,l=Ot(t);if(r!==void 0==(n!==void 0)||n!==void 0&&typeof n!="function")throw new f.ReportSourceError("config","标签报表应且只能配置 rows 或 load 其中一种数据来源");const c={template:t,params:a,pagination:s,dataValidation:i,...o===void 0?{}:{dataSchema:{[l]:o}}};return n?f.defineReport({...c,load:n,mapData:d=>xe(d,l)}):{...c,datasets:xe(r,l)}}function Bt(e){return e}class O extends Error{constructor(t,r){super(r),this.code=t,this.name="ReportTemplateStoreError"}}function _(e){return JSON.parse(JSON.stringify(e))}function C(e){if(!e?.aborted)return;const t=new Error("模板操作已取消");throw t.name="AbortError",t}function Re(e){const t=e?Number(e.revision):0;if(!Number.isSafeInteger(t)||t<0||t>=Number.MAX_SAFE_INTEGER)throw new O("history","修订号无效或已达上限");return String(t+1)}function Ht(e,t={}){const r=async(s,i)=>{C(i);const l=await e.read(s,i);return C(i),l?_(l):void 0},n=async(s,i)=>{const l=await r(s,i.signal);if((l?.revision??null)!==i.expectedRevision)throw new O("conflict","模板已变化,请重新读取后提交");return l},o=async(s,i,l)=>{if(C(i.signal),!await e.compareAndSwap(s.id,i.expectedRevision,_(s),{signal:i.signal,...l?{publication:_(l)}:{}}))throw new O("conflict","模板已被其他请求更新");return _(s)},a=async(s,i,l,c)=>{if(t.beforePublish){C(l.signal);const g=await t.beforePublish({document:M.parseReportTemplate(i),previous:s.published?M.parseReportTemplate(s.published):void 0,signal:l.signal});if(!g||g.ok!==!0)throw new O("review",g?.issues?.find(p=>p.severity==="error")?.message??"模板发布检查未通过");C(l.signal)}const d=Re(s),m=M.parseReportTemplate({...i,revision:d}),h={revision:d,document:m,publishedAt:(t.now?.()??new Date).toISOString()};return c!==void 0&&(h.restoredFrom=c),o({id:s.id,revision:d,publishedRevision:d,published:m},l,h)};return{list:async s=>{C(s);const i=await e.list(s);return C(s),_(i)},get:async(s,i={})=>{const l=await r(s,i.signal),c=i.draft?l?.draft:l?.published;return c?M.parseReportTemplate(c):void 0},history:async(s,i)=>{C(i);const l=await e.history(s,i);return C(i),_(l)},saveDraft:async(s,i)=>{i={...i},C(i.signal);const l=M.parseReportTemplate(t.migrate?await t.migrate(s):s),c=await n(l.id,i),d=Re(c);return o({id:l.id,revision:d,draft:{...l,revision:d},...c?.publishedRevision?{publishedRevision:c.publishedRevision,published:c.published}:{}},i)},publish:async(s,i)=>{i={...i};const l=await n(s,i);if(!l)throw new O("missing","模板不存在");if(!l.draft)throw new O("draft","没有可发布的草稿");return a(l,l.draft,i)},rollback:async(s,i,l)=>{l={...l};const c=await n(s,l);if(!c)throw new O("missing","模板不存在");C(l.signal);const d=await e.getVersion(s,i,l.signal);if(!d)throw new O("history","历史修订不存在");return a(c,d.document,l,i)}}}function zt(){const e=new Map,t=new Map;return{read:async(r,n)=>{C(n);const o=e.get(r);return o?_(o):void 0},list:async r=>(C(r),Array.from(e.values(),({id:n,revision:o,publishedRevision:a})=>({id:n,revision:o,...a?{publishedRevision:a}:{}}))),history:async(r,n)=>(C(n),Array.from(t.get(r)?.values()??[],o=>_(o))),getVersion:async(r,n,o)=>{C(o);const a=t.get(r)?.get(n);return a?_(a):void 0},compareAndSwap:async(r,n,o,a)=>{if(C(a.signal),(e.get(r)?.revision??null)!==n)return!1;if(o.id!==r)throw new O("history","状态 ID 与存储 ID 不一致");const s=_(o),i=a.publication;if(i){const l=t.get(r)??new Map;if(l.has(i.revision)||i.revision!==o.revision||i.document.id!==r)throw new O("history","发布修订不可覆盖,且必须与状态修订和模板 ID 一致");l.set(i.revision,_(i)),t.set(r,l)}return e.set(r,s),!0}}}function Wt(e,t){const r=e.publishedRevision??e.published?.revision;for(const n of[e.draftRevision,r])if(n!==void 0&&(typeof n!="string"||!n.trim()))throw new TypeError("模板生命周期修订应为非空字符串");if(e.draftRevision!==void 0&&e.draftRevision!==t.revision)throw new TypeError("可编辑文档应与草稿修订一致");if(e.published&&(e.published.id!==t.id||e.published.revision!==r))throw new TypeError("发布文档身份或修订不一致");if(!e.published&&r!==void 0&&r!==t.revision)throw new TypeError("发布修订需要对应的独立文档");return{...e.draftRevision===void 0?{}:{draftRevision:e.draftRevision},...r===void 0?{}:{publishedRevision:r}}}function jt(e,t){const r=M.parseReportTemplate(e);if(t.id===r.id)throw new Error("复制模板应使用新的 ID");const{revision:n,...o}=r;return M.parseReportTemplate({...o,id:t.id,name:t.name})}function Ut(e){if(!Array.isArray(e)||e.length>1e3)throw new RangeError("本地模板目录最多 1000 项");const t=new Map,r=new Map,n=[];for(const o of e){const a=M.parseReportTemplate(o.document);if(t.has(a.id))throw new Error(`模板 ID 重复:${a.id}`);if(o.category!==void 0&&(typeof o.category!="string"||o.category.length>128)||o.tags!==void 0&&(!Array.isArray(o.tags)||o.tags.length>20||o.tags.some(c=>typeof c!="string"||c.length>128)))throw new TypeError("模板分类和标签无效");const s=Wt(o,a),{template:i,...l}=a;t.set(a.id,a),o.published?r.set(a.id,M.parseReportTemplate(o.published)):s.publishedRevision&&r.set(a.id,M.parseReportTemplate(a)),n.push({...l,...s,...o.category?{category:o.category}:{},...o.tags?{tags:[...o.tags]}:{}})}return n.sort((o,a)=>o.id<a.id?-1:1),{search:async o=>{Se(o.signal);const a=o.limit??30;if(!Number.isSafeInteger(a)||a<1||a>100)throw new RangeError("模板每页数量应为 1–100");const s=o.query?.trim().toLocaleLowerCase()??"",i=n.filter(c=>(!o.category||c.category===o.category)&&(!o.cursor||c.id>o.cursor)&&(!s||[c.id,c.name,c.description,...c.tags??[]].some(d=>d?.toLocaleLowerCase().includes(s)))),l=new Map;for(const c of n)c.category&&l.set(c.category,(l.get(c.category)??0)+1);return JSON.parse(JSON.stringify({items:i.slice(0,a),...i.length>a?{next:i[a-1].id}:{},categories:Array.from(l,([c,d])=>({id:c,label:c,count:d}))}))},get:async(o,a)=>{Se(a.signal);const s=a.mode==="published"?r.get(o):t.get(o);return s?M.parseReportTemplate(s):void 0}}}function Se(e){if(!e?.aborted)return;const t=new Error("模板目录操作已取消");throw t.name="AbortError",t}function qt(e){return e.map(t=>t.map(r=>/[\t\r\n"]/.test(r)?`"${r.replace(/"/g,'""')}"`:r).join(" ")).join(`\r
|
|
7
|
-
`)
|
|
8
|
-
`){i(),r.push([]),c==="\r"&&e[l+1]===`
|
|
9
|
-
`&&l++;continue}if(a)throw new Error("Invalid quoted clipboard value");n+=c}if(o)throw new Error("Unclosed clipboard quote");return i(),Vt(r,e),r}class ze extends Error{constructor(t,r,n){const o=typeof r.label=="string"?r.label:"单元格",a={definition:`${o}的编辑器配置无效`,type:`${o}的编辑器与数据类型不一致`,required:`${o}不能为空`,min:`${o}不能小于 ${n}`,max:`${o}不能大于 ${n}`,precision:`${o}最多保留 ${n} 位小数`,length:`${o}最多允许 ${n} 个字符`,choice:`${o}请选择有效选项`,date:`${o}请输入有效日期(YYYY-MM-DD)`};super(a[t]),this.code=t,this.field=r,this.expected=n,this.name="ReportCellFieldError"}}function v(e,t,r){throw new ze(t,e,r)}function We(e){if(typeof e!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(e)||e.startsWith("0000-"))return!1;const t=new Date(`${e}T00:00:00.000Z`);return Number.isFinite(t.getTime())&&t.toISOString().slice(0,10)===e}function Yt(e){const[t="",r="0"]=String(e).toLowerCase().split("e");return Math.max(0,(t.split(".")[1]?.length??0)-Number(r))}function Jt(e,t){e.min!==void 0&&t<e.min&&v(e,"min",e.min),e.max!==void 0&&t>e.max&&v(e,"max",e.max),e.precision!==void 0&&Yt(t)>e.precision&&v(e,"precision",e.precision)}function Kt(e,t){We(t)||v(e,"date"),e.min!==void 0&&t<e.min&&v(e,"min",e.min),e.max!==void 0&&t>e.max&&v(e,"max",e.max)}function Xt(e){[e.min,e.max].some(t=>t!==void 0&&!Number.isFinite(t))&&v(e,"definition"),e.min!==void 0&&e.max!==void 0&&e.min>e.max&&v(e,"definition"),e.precision!==void 0&&(!Number.isInteger(e.precision)||e.precision<0||e.precision>15)&&v(e,"definition")}function Zt(e){[e.min,e.max].some(t=>t!==void 0&&!We(t))&&v(e,"definition"),e.min!==void 0&&e.max!==void 0&&e.min>e.max&&v(e,"definition")}function Qt(e,t){(!Array.isArray(t.options)||!t.options.length)&&v(t,"definition");const r=e.valueType==="text"?"string":e.valueType,n=new Set;for(const o of t.options)(!o||typeof o.value!==r||typeof o.value=="number"&&!Number.isFinite(o.value))&&v(t,"definition"),o.label!==void 0&&typeof o.label!="string"&&v(t,"definition"),n.has(o.value)&&v(t,"definition"),n.add(o.value)}function er(e){e.required!==void 0&&typeof e.required!="boolean"&&v(e,"definition"),[e.label,e.hint,e.unit].some(t=>t!==void 0&&typeof t!="string")&&v(e,"definition"),e.type==="boolean"&&[e.trueLabel,e.falseLabel].some(t=>t!==void 0&&typeof t!="string")&&v(e,"definition")}function je(e,t){(!t||typeof t!="object"||Array.isArray(t)||!["text","number","boolean","enum","date"].includes(t.type))&&v(t??{type:"text"},"definition"),er(t),(t.type==="number"||t.type==="boolean")&&e.valueType!==t.type&&v(t,"type"),(t.type==="text"||t.type==="date")&&e.valueType!=="text"&&v(t,"type"),t.type==="number"&&Xt(t),t.type==="text"&&t.maxLength!==void 0&&(!Number.isInteger(t.maxLength)||t.maxLength<0)&&v(t,"definition"),t.type==="date"&&Zt(t),t.type==="enum"&&Qt(e,t)}function tr(e,t,r){if(!e.editable)throw new f.ReportCellEditError("readonly");r&&je(e,r);const n=f.parseReportCellInput(e,t);return r?(r.required&&typeof n=="string"&&!n.trim()&&v(r,"required"),n===null||n===""?(r.required&&v(r,"required"),n):(r.type==="number"&&Jt(r,n),r.type==="date"&&Kt(r,n),r.type==="text"&&r.maxLength!==void 0&&[...String(n)].length>r.maxLength&&v(r,"length",r.maxLength),r.type==="enum"&&!r.options.some(o=>Object.is(o.value,n))&&v(r,"choice"),n)):n}class b extends Error{constructor(t){super(`Report calculation: ${t}`),this.code=t,this.name="ReportCalculationError"}}function J(e){if(!e?.aborted)return;const t=new Error("Calculation cancelled");throw t.name="AbortError",t}async function ne(e,t=1){const r=Math.floor(e.scanned/2048);if(e.scanned+=t,e.scanned>e.maxScanned)throw new b("limit");J(e.signal),Math.floor(e.scanned/2048)>r&&(await e.yieldToHost(),J(e.signal))}function ve(e){return e.table?.role==="header"?-Math.max(1,e.grid?.cells.length??1):e.table?.rowIndex??0}function Ce(e,t,r){if(![t.pageIndex,t.componentIndex,t.rowIndex,t.columnIndex].every(i=>Number.isSafeInteger(i)&&i>=0))throw new b("selection");const n=e.pages[t.pageIndex]?.components[t.componentIndex];if(!n?.grid||t.rowIndex>=n.grid.cells.length)throw new b("selection");const o=n.grid.colWidthsMm?.length??n.grid.cells.reduce((i,l)=>Math.max(i,l.length),1);if(t.columnIndex>=o)throw new b("selection");const a=n.table,s=e.pages[r.pageIndex]?.components[r.componentIndex]?.table;if(a&&s&&a.id===s.id){const i=s.columnKeys.indexOf(a.columnKeys[t.columnIndex]??"");if(i<0)throw new b("selection");return{grid:a.id,row:ve(n)+t.rowIndex,column:i}}return{grid:`${t.pageIndex}:${t.componentIndex}`,row:t.rowIndex,column:t.columnIndex}}function rr(e,t,r){const n=Ce(e,t.anchor,t.anchor),o=Ce(e,t.focus,t.anchor);if(n.grid!==o.grid)throw new b("selection");const a=(Math.abs(n.row-o.row)+1)*(Math.abs(n.column-o.column)+1);if(!Number.isSafeInteger(a)||a>r)throw new b("limit");return{grid:n.grid,rowStart:Math.min(n.row,o.row),rowEnd:Math.max(n.row,o.row),columnStart:Math.min(n.column,o.column),columnEnd:Math.max(n.column,o.column),origin:e.pages[t.anchor.pageIndex].components[t.anchor.componentIndex].table}}function nr(e){if(!e)return!1;const t=e.replace(/"[^"]*"|\\.|\[(?![hms]+\])[^\]]*\]/gi,"");return/[ymdhs]/i.test(t)}function or(e){if(e.valueType==="text"||e.valueType==="boolean"||nr(e.numberFormat))return null;const t=e.value;if(typeof t!="number"||!Number.isFinite(t))return null;if(Number.isInteger(t)&&!Number.isSafeInteger(t))throw new b("precision");return t}function ir(e,t,r){if(e.seen.has(r))return;e.seen.add(r),e.selected++;const n=t?or(t):null;n===null?e.excluded++:e.values.push(n)}function ar(e,t,r,n){return n.origin?e.table?.id===n.origin.id:`${t}:${r}`===n.grid}function sr(e,t,r){return r.origin?r.origin.columnKeys.indexOf(e.table.columnKeys[t]??""):t}function lr(e,t,r,n){const o=n.origin?ve(e)+t:t,a=sr(e,r,n);return o<n.rowStart||o>n.rowEnd||a<n.columnStart||a>n.columnEnd?null:`${n.grid}:${o}:${a}`}function cr(e,t){const r=t.origin?ve(e):0,n=Math.max(0,t.rowStart-r),o=Math.min(e.grid.cells.length,t.rowEnd-r+1);return o>n?o:0}async function dr(e,t,r,n,o){const a=e.grid;if(t>n.maxScanned)throw new b("limit");const s=a.colWidthsMm?.length??a.cells.reduce((l,c)=>Math.max(l,c.length),1);if(s>n.maxScanned)throw new b("limit");const i=new Map;for(let l=0;l<t;l++){l>0&&l%2048===0&&(await n.yieldToHost(),J(n.signal));let c=0;for(const d of a.cells[l]){for(await ne(n);c<s&&(i.get(c)??0)>l;)c++;if(c>=s)break;const m=Math.max(1,Math.min(d?.colSpan??1,s-c)),h=Math.min(a.cells.length,l+Math.max(1,d?.rowSpan??1));m>1&&await ne(n,m-1);for(let p=c;p<c+m;p++)i.set(p,h);const g=lr(e,l,c,r);g&&ir(o,d,g),c+=m}}}async function mr(e,t,r){const n={values:[],seen:new Set,excluded:0,selected:0};for(let o=0;o<e.pages.length;o++){await ne(r);const a=e.pages[o];for(let s=0;s<a.components.length;s++){await ne(r);const i=a.components[s];if(!i.grid||!ar(i,o,s,t)||i.table&&i.table.role!=="body")continue;const l=cr(i,t);l&&await dr(i,l,t,r,n)}}return n}function K(e){if(!Number.isFinite(e))throw new b("overflow");return e}function hr(e){let t=0,r=0;for(const n of e){const o=n-r,a=K(t+o);r=a-t-o,t=a}return t}async function Pe(e,t){let r=[...e],n=new Array(e.length);for(let a=1;a<e.length;a*=2){for(let s=0;s<e.length;s+=a*2){const i=Math.min(s+a,e.length),l=Math.min(s+a*2,e.length);let c=s,d=i;for(let m=s;m<l;m++)n[m]=d>=l||c<i&&r[c]<=r[d]?r[c++]:r[d++],m%2048===0&&(await t.yieldToHost(),J(t.signal))}[r,n]=[n,r]}const o=Math.floor(r.length/2);return r.length%2?r[o]:K(r[o-1]/2+r[o]/2)}function gr(e){const t=hr(e);let r=1/0,n=-1/0;for(const o of e)r=Math.min(r,o),n=Math.max(n,o);return{SUM:t,AVERAGE:t/e.length,AVG:t/e.length,MIN:r,MAX:n,COUNT:e.length}}function Ue(e,t){if(typeof e!="string"||e.length>256)throw new b("expression");const r=e.toUpperCase().match(/(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?|[A-Z_]+|[()+\-*/]|\S/g)??[];if(!r.length||r.length>64)throw new b("expression");let n=0;function o(i){if(i>16)throw new b("expression");const l=r[n++];if(l==="+"||l==="-")return(l==="-"?-1:1)*o(i+1);if(l==="("){const c=a(0,i+1);if(r[n++]!==")")throw new b("expression");return c}if(l&&/^(?:SUM|AVERAGE|AVG|MIN|MAX|COUNT|MEDIAN)$/.test(l)&&Object.prototype.hasOwnProperty.call(t,l))return K(t[l]);if(l&&/^(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?$/.test(l))return K(Number(l));throw new b("expression")}function a(i,l){let c=o(l);for(;n<r.length;){const d=r[n],m=d==="+"||d==="-"?1:d==="*"||d==="/"?2:0;if(!m||m<i)break;n++;const h=a(m+1,l+1);if(d==="/"&&h===0)throw new b("division");c=K(d==="+"?c+h:d==="-"?c-h:d==="*"?c*h:c/h)}return c}const s=a(1,0);if(n!==r.length)throw new b("expression");return s}function ur(e){const t=e.maxCells??1e5,r=e.maxScannedCells??2e5,n=e.precision??2;if(![t,r].every(o=>Number.isSafeInteger(o)&&o>=1&&o<=2e6))throw new b("limit");if(!Number.isInteger(n)||n<0||n>12)throw new b("precision");return{maxCells:t,maxScanned:r,precision:n}}async function pr(e,t,r={}){const n=ur(r),o={scanned:0,maxScanned:n.maxScanned,signal:r.signal,yieldToHost:r.yieldToHost??(()=>new Promise(l=>setTimeout(l,0)))};J(o.signal);const a=await mr(e,rr(e,t,n.maxCells),o),s=r.operation??"sum";if(!["sum","average","min","max","count","median","expression"].includes(s))throw new b("expression");let i=null;if(s==="count")i=a.values.length;else if(a.values.length)if(s==="median")i=await Pe(a.values,o);else{const l=gr(a.values);s==="expression"?(/\bMEDIAN\b/i.test(r.expression??"")&&(l.MEDIAN=await Pe(a.values,o)),i=Ue(r.expression??"",l)):i=l[s.toUpperCase()]}if(J(o.signal),i!==null&&Number.isInteger(i)&&!Number.isSafeInteger(i))throw new b("precision");return{value:i,formatted:i===null?"—":i.toFixed(n.precision),numericCells:a.values.length,excludedCells:a.excluded,selectedCells:a.selected,precision:n.precision}}class F extends Error{constructor(t,r){super(t),this.path=r,this.code="label-sheet",this.name="LabelSheetError"}}function te(e){if(e?.aborted){const t=new Error("标签拼版已取消");throw t.name="AbortError",t}}function q(e,t,r=!1){if(!Number.isFinite(e)||e<=0||r&&!Number.isSafeInteger(e))throw new F("应为正有限数字,数量应为安全整数",t);return e}function Ae(e,t){if(!Number.isFinite(e)||e<0)throw new F("应为非负有限数字",t);return e}function fr(e){const t=typeof e.marginMm=="object"?e.marginMm:{top:e.marginMm??0,left:e.marginMm??0,bottom:e.marginMm??0,right:e.marginMm??0},r=typeof e.gapMm=="object"?e.gapMm:{horizontal:e.gapMm??0,vertical:e.gapMm??0};for(const n of["top","left","bottom","right"])Ae(t?.[n],`$.marginMm.${n}`);for(const n of["horizontal","vertical"])Ae(r?.[n],`$.gapMm.${n}`);return{margin:t,gap:r}}function wr(e){const t=e.paper===void 0||e.paper==="a4"?{widthMm:210,heightMm:297}:e.paper;q(t.widthMm,"$.paper.widthMm"),q(t.heightMm,"$.paper.heightMm");const r=q(e.columns,"$.columns",!0),n=q(e.rows,"$.rows",!0),o=r*n;if(o>1e3)throw new F("每张纸不能超过 1000 个位置","$.columns");const{margin:a,gap:s}=fr(e),i=e.startSlot??0,l=e.offsetMm??{x:0,y:0};if(!Number.isSafeInteger(i)||i<0||i>=o)throw new F("起始位置应在首张纸的有效位置内","$.startSlot");if(!Number.isFinite(l.x)||!Number.isFinite(l.y))throw new F("校准偏移应为有限毫米值","$.offsetMm");return{paper:t,columns:r,rows:n,capacity:o,margin:a,gap:s,startSlot:i,offset:l}}function qe(e){return 1+(e.grid?.cells.reduce((t,r)=>t+r.length+1+r.reduce((n,o)=>n+(o?.children?.reduce((a,s)=>a+qe(s),0)??0),0),0)??0)}function vr(e,t,r){if(!X.validateRenderPlan(e).ok)throw new F("标签计划无效","$.plan");const n=e.pages[0];if(!n)return;const{paper:o,columns:a,rows:s,margin:i,gap:l,offset:c}=r;if(i.left+c.x<0||i.top+c.y<0||i.left+c.x+a*n.pageWidthMm+(a-1)*l.horizontal+i.right>o.widthMm+1e-6||i.top+c.y+s*n.pageHeightMm+(s-1)*l.vertical+i.bottom>o.heightMm+1e-6)throw new F("标签、间距、边距及校准偏移超过纸张尺寸;不会自动缩小标签","$.paper");let d=0;for(const[m,h]of e.pages.entries()){if(te(t.signal),h.layout==="wide"||h.pageWidthMm!==n.pageWidthMm||h.pageHeightMm!==n.pageHeightMm)throw new F("拼版需要尺寸相同的固定标签页面",`$.pages.${m}`);if(d+=h.components.reduce((g,p)=>g+qe(p),0),d>q(t.maxComponents??25e4,"$.maxComponents",!0))throw new F("拼版组件总量超过预算","$.maxComponents");for(const g of h.components)if(g.leftMm<0||g.topMm<0||g.leftMm+g.widthMm>h.pageWidthMm+1e-6||g.topMm+g.heightMm>h.pageHeightMm+1e-6)throw new F("标签内容超出标签边界",`$.pages.${m}.components`)}}function yr(e,t){te(t.signal);const r=wr(t),{paper:n,columns:o,capacity:a,margin:s,gap:i,startSlot:l,offset:c}=r,d=e.pages.length?Math.ceil((l+e.pages.length)/a):0;if(d>q(t.maxSheets??1e4,"$.maxSheets",!0))throw new F("拼版纸张数量超过预算","$.maxSheets");q(t.maxComponents??25e4,"$.maxComponents",!0),vr(e,t,r);const m=f.snapshotReportJson(e,{maxBytes:q(t.maxSnapshotBytes??64e6,"$.maxSnapshotBytes",!0),check:()=>te(t.signal),error:(g,p)=>new F(p,"$.maxSnapshotBytes")}),h=Array.from({length:d},()=>({pageWidthMm:n.widthMm,pageHeightMm:n.heightMm,components:[],meta:{labelSheet:{columns:o,rows:r.rows,slots:[]}}}));for(const[g,p]of m.pages.entries()){te(t.signal);const y=l+g,L=y%a,R=h[Math.floor(y/a)],x=s.left+c.x+L%o*(p.pageWidthMm+i.horizontal),I=s.top+c.y+Math.floor(L/o)*(p.pageHeightMm+i.vertical),V={sourcePageIndex:g,slotIndex:L,xMm:x,yMm:I,widthMm:p.pageWidthMm,heightMm:p.pageHeightMm,...p.meta?{sourceMeta:p.meta}:{}};R.meta.labelSheet.slots.push(V),R.components.push(...p.components.map(H=>({...H,leftMm:H.leftMm+x,topMm:H.topMm+I,meta:{...H.meta,labelSheet:V}})))}return{...m,pages:h}}exports.DEFAULT_BORDER_PT=$.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_FAMILY=$.DEFAULT_FONT_FAMILY;exports.DEFAULT_FONT_PT=$.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=$.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=$.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=$.LINE_HEIGHT;exports.SCHEMA_VERSION_MACH=$.SCHEMA_VERSION_MACH;exports.ReportBindingError=G.ReportBindingError;exports.evalStyleRule=G.evalStyleRule;exports.formatValue=G.formatValue;exports.parseDateLocal=G.parseDateLocal;exports.resolveComponentBinding=G.resolveComponentBinding;exports.toExcelNumberFormat=G.toExcelNumberFormat;exports.toNumber=G.toNumber;exports.CSS_DPI=u.CSS_DPI;exports.MM_PER_INCH=u.MM_PER_INCH;exports.PAPER_SIZES=u.PAPER_SIZES;exports.mergeComponentStyles=u.mergeComponentStyles;exports.mmToPx=u.mmToPx;exports.mmToPxFactor=u.mmToPxFactor;exports.ptToPx=u.ptToPx;exports.pxToMm=u.pxToMm;exports.resolveBoxBorders=u.resolveBoxBorders;exports.resolveFontSize=u.resolveFontSize;exports.resolveLineHeight=u.resolveLineHeight;exports.resolveStroke=u.resolveStroke;exports.resolveTextColor=u.resolveTextColor;exports.round=u.round;exports.RENDER_PLAN_SCHEMA_VERSION=U.RENDER_PLAN_SCHEMA_VERSION;exports.isImageBackedComponent=U.isImageBackedComponent;exports.isRichText=U.isRichText;exports.assertRenderPlan=X.assertRenderPlan;exports.validateComponent=X.validateComponent;exports.validatePage=X.validatePage;exports.validateRenderPlan=X.validateRenderPlan;exports.datasetJsonSchema=ce.datasetJsonSchema;exports.validateDatasetRows=ce.validateDatasetRows;exports.OutputAssetError=A.OutputAssetError;exports.charWidthEm=A.charWidthEm;exports.createCanvasMeasurer=A.createCanvasMeasurer;exports.createHeuristicMeasurer=A.createHeuristicMeasurer;exports.heuristicMeasurer=A.heuristicMeasurer;exports.measureTextMm=A.measureTextMm;exports.resolvePlanAssets=A.resolvePlanAssets;exports.wrapText=A.wrapText;exports.DEFAULT_LABEL_PAGE_LIMIT=f.DEFAULT_LABEL_PAGE_LIMIT;exports.PaginateCellLimitError=f.PaginateCellLimitError;exports.PaginatePageLimitError=f.PaginatePageLimitError;exports.ReportCellEditError=f.ReportCellEditError;exports.ReportSourceError=f.ReportSourceError;exports.applyReportCellEdit=f.applyReportCellEdit;exports.applyReportCellEditBatch=f.applyReportCellEditBatch;exports.applyReportEditResult=f.applyReportEditResult;exports.countTemplatePages=f.countTemplatePages;exports.createReportCellEdit=f.createReportCellEdit;exports.createReportCellEditBatch=f.createReportCellEditBatch;exports.createReportCellResolver=f.createReportCellResolver;exports.createReportEditSession=f.createReportEditSession;exports.createReportSource=f.createReportSource;exports.defineReport=f.defineReport;exports.diffReportTemplates=f.diffReportTemplates;exports.estimateListLayoutCells=f.estimateListLayoutCells;exports.formatReportCellEdit=f.formatReportCellEdit;exports.getReportCellContext=f.getReportCellContext;exports.getReportEditSession=f.getReportEditSession;exports.paginateTemplate=f.paginateTemplate;exports.paginateTemplatePages=f.paginateTemplatePages;exports.parseReportCellInput=f.parseReportCellInput;exports.projectListColumns=f.projectListColumns;exports.registerReportEditSession=f.registerReportEditSession;exports.relocateReportCellEdits=f.relocateReportCellEdits;exports.reportCellEditKey=f.reportCellEditKey;exports.reviewReportTemplate=f.reviewReportTemplate;exports.reviewReportTemplateAsync=f.reviewReportTemplateAsync;exports.summarizeReportCellEdits=f.summarizeReportCellEdits;exports.resolveGridLayout=de.resolveGridLayout;exports.OutputFidelityError=B.OutputFidelityError;exports.inspectOutputCapabilities=B.inspectOutputCapabilities;exports.reportOutputDiagnostics=B.reportOutputDiagnostics;exports.REPORT_TEMPLATE_DOCUMENT_VERSION=M.REPORT_TEMPLATE_DOCUMENT_VERSION;exports.ReportTemplateError=M.ReportTemplateError;exports.createTemplateRegistry=M.createTemplateRegistry;exports.defineReportTemplate=M.defineReportTemplate;exports.parseReportTemplate=M.parseReportTemplate;exports.serializeReportTemplate=M.serializeReportTemplate;exports.validateReportTemplate=M.validateReportTemplate;exports.validateReportTemplateDocument=M.validateReportTemplateDocument;exports.ReportParamValidationError=W.ReportParamValidationError;exports.assertReportParams=W.assertReportParams;exports.formatReportDateRange=W.formatReportDateRange;exports.isReportDate=W.isReportDate;exports.isReportMonth=W.isReportMonth;exports.isReportYear=W.isReportYear;exports.parseReportDateRange=W.parseReportDateRange;exports.reportParamsJsonSchema=W.reportParamsJsonSchema;exports.validateReportParamDefinitions=W.validateReportParamDefinitions;exports.validateReportParams=W.validateReportParams;exports.hasValidDataExplanation=me.hasValidDataExplanation;exports.isReportDataTarget=me.isReportDataTarget;exports.isReportValueState=me.isReportValueState;exports.collectTemplateOutline=he.collectTemplateOutline;exports.inspectTemplateFieldUsage=he.inspectTemplateFieldUsage;exports.templatePathLocation=he.templatePathLocation;exports.applyReportDocumentStyle=oe.applyReportDocumentStyle;exports.captureTemplateFragment=oe.captureTemplateFragment;exports.insertTemplateFragment=oe.insertTemplateFragment;exports.inspectTemplateFragmentBindings=oe.inspectTemplateFragmentBindings;exports.TreeRowLimitError=ge.TreeRowLimitError;exports.createTreeTable=ge.createTreeTable;exports.validateTreeOptions=ge.validateTreeOptions;exports.LabelSheetError=F;exports.PageBuilder=He;exports.ReportCalculationError=b;exports.ReportCellFieldError=ze;exports.ReportTemplateStoreError=O;exports.TemplateBuilder=Be;exports.calculateReportSelection=pr;exports.classOf=P;exports.cloneReportTemplate=jt;exports.columnsFromContract=Ct;exports.computePageWindow=Fe;exports.createCanvasPager=Rt;exports.createLabelTemplate=Nt;exports.createLocalTemplateCatalog=Ut;exports.createMemoryTemplateStore=zt;exports.createProviderReport=Bt;exports.createTableTemplate=Dt;exports.createTemplate=St;exports.createTemplateManager=Ht;exports.defineLabelReport=_t;exports.evaluateReportAggregateExpression=Ue;exports.formatReportClipboard=qt;exports.imposeLabelSheets=yr;exports.measurePageSizePx=ie;exports.parseReportCellFieldInput=tr;exports.parseReportClipboard=Gt;exports.planFontSizePx=ut;exports.renderComponent=ue;exports.renderPage=ke;exports.renderPlan=ct;exports.renderPlanToCanvas=Et;exports.renderPlanToCanvasAsync=xt;exports.renderPlanToImages=bt;exports.resolvePaper=we;exports.validateReportCellFieldDefinition=je;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("./style-C22Pbv3T.cjs"),G=require("./record-bindings-DUX1VMlR.cjs"),q=require("./component-tree-DkGLEfZC.cjs"),y=require("./template-registry-C62vpv4a.cjs"),me=require("./dataset-BkRmwgeJ.cjs"),O=require("./textwrap-BI-yJ6Wt.cjs"),f=require("./json-snapshot-DknkjvxP.cjs"),he=require("./grid-geometry-CZ_cYB6O.cjs"),ge=require("./rich-text-layout-ALlMoYOG.cjs"),W=require("./capabilities-DNLyZdNw.cjs"),Qe=require("./progress-B0ctFpKf.cjs"),Ie=require("./diagnostic-notification-B9K9We3h.cjs"),J=require("./assets-e4YSke8n.cjs"),K=require("./drill-CsdjgkRM.cjs"),z=require("./param-validation-C3HlcLLO.cjs"),Z=require("./template-catalog-C2NLdrwB.cjs"),ue=require("./template-outline-BwRV_eRo.cjs"),oe=require("./template-fragments-BVsbxs4a.cjs"),pe=require("./tree-BX380Rr7.cjs"),et={root:"mr-root",page:"mr-page",comp:"mr-comp",text:"mr-text",lines:"mr-lines",line:"mr-line",rich:"mr-rich",paragraph:"mr-paragraph",segment:"mr-segment",image:"mr-image",shape:"mr-shape",grid:"mr-grid",row:"mr-row",cell:"mr-cell",unknown:"mr-unknown"};function C(e,t){return t?.classNames?.[e]??et[e]}class tt{constructor(){this.props=[]}add(t,n){return n==null||n===!1||n===""?this:(this.props.push([t,String(n)]),this)}mm(t,n,r,i=2){return this.add(t,`${g.round(g.mmToPx(n,r),i)}px`)}toString(){let t="";for(const[n,r]of this.props)t+=`${n}:${r};`;return t}applyTo(t){const n=this.toString();n&&(t.style.cssText=n)}}function E(e,t="unset"){return new tt().add("all",t).add("display",e).add("box-sizing","border-box")}function De(e,t,n){e.add("color",t.color).add("font-family",t.fontFamily).add("font-weight",t.bold!=null?t.bold?"700":"400":void 0).add("font-style",t.italic!=null?t.italic?"italic":"normal":void 0).add("text-decoration",t.underline!=null?t.underline?"underline":"none":void 0).add("letter-spacing",t.letterSpacing!=null?`${t.letterSpacing}pt`:void 0).add("line-height",String(g.resolveLineHeight(t))).add("text-align",t.align);const r=g.resolveFontSize(t,n);e.add("font-size",`${g.round(r.fontSizePx,2)}px`)}function nt(e,t,n){const r=t.style??{};De(e,r,n),e.add("background-color",r.backgroundColor).add("opacity",r.opacity!=null?String(r.opacity):void 0).add("transform",r.rotateDeg?`rotate(${r.rotateDeg}deg)`:void 0)}function rt(e,t,n,r,i,a){const l=e.cell,o=a.createElement("td");o.className=C("cell",i),o.dataset.mrRowIndex=String(e.ri),o.dataset.mrColumnIndex=String(e.ci),o.setAttribute("role",t.table?.role==="header"?"columnheader":"cell"),l.colSpan&&(o.colSpan=l.colSpan),l.rowSpan&&(o.rowSpan=l.rowSpan);const s=g.mergeComponentStyles(t.style,l.style),c=E("block").add("position","absolute").mm("left",e.xMm,r).mm("top",e.yMm,r).mm("width",e.widthMm,r).mm("height",e.heightMm,r).add("background-color",s.backgroundColor).add("vertical-align",s.verticalAlign??"middle");De(c,s,r),c.applyTo(o);const d=a.createElement("div");d.className="mr-cell-content",E("flex").add("position","absolute").mm("left",n+(l.indentMm??0),r).mm("right",n,r).mm("top",n,r).mm("bottom",n,r).add("flex-direction","column").add("justify-content",s.verticalAlign==="top"?"flex-start":s.verticalAlign==="bottom"?"flex-end":"center").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(d),l.richParagraphs?.length?d.appendChild(Fe({...t,kind:"text",richParagraphs:l.richParagraphs},r,i,a)):l.text!=null&&d.append(l.text);for(const h of l.children??[])d.appendChild(fe(h,r,i,a));return o.appendChild(d),o}function it(e,t,n,r){return ge.resolveGridStrokes(e,t).map(i=>{const a=`${g.round(i.widthPt*n/72,2)}px solid ${i.color}`,l=r.createElement("div");l.className="mr-grid-edge",l.setAttribute("aria-hidden","true");const o=i.kind==="h";return E("block").add("position","absolute").add("pointer-events","none").mm("left",o?i.from:i.pos,n).mm("top",o?i.pos:i.from,n).mm("width",o?i.to-i.from:0,n).mm("height",o?0:i.to-i.from,n).add(o?"border-top":"border-left",a).applyTo(l),l})}function ot(e,t,n,r,i){const a=i.createElement("table");a.className=C("grid",r),a.setAttribute("role","table"),E("block").add("position","relative").add("width","100%").add("height","100%").applyTo(a);const l=he.resolveGridLayout(e,t.widthMm,t.heightMm),o=i.createElement("tbody");E("contents").applyTo(o),a.appendChild(o);const s=e.cells.map(()=>{const d=i.createElement("tr");return d.className=C("row",r),d.setAttribute("role","row"),E("contents").applyTo(d),o.appendChild(d),d});for(const d of l.cells)s[d.ri].appendChild(rt(d,t,e.paddingMm??.5,n,r,i));const c=i.createElement("div");return E("block").add("position","relative").add("width","100%").add("height","100%").applyTo(c),c.append(a,...it(l,t,n,i)),c}function at(e,t,n,r){const i=r.createElement("div");i.className=C("paragraph",n),E("block").add("text-align",e.align).add("line-height",e.lineHeight!=null?String(e.lineHeight):void 0).mm("margin-top",e.spaceBeforeMm??0,t).mm("margin-bottom",e.spaceAfterMm??0,t).mm("text-indent",e.indentMm??0,t).applyTo(i);for(const a of e.segments||[]){const l=r.createElement("span");l.className=C("segment",n),l.textContent=a.kind==="field"?a.field??"":a.text??"";const o=E("inline");if(a.style){const s=a.style;o.add("color",s.color).add("background-color",s.backgroundColor).add("font-family",s.fontFamily).add("line-height",s.lineHeight).add("letter-spacing",s.letterSpacing==null?void 0:`${s.letterSpacing*t/72}px`).add("font-weight",s.bold!=null?s.bold?"700":"400":void 0).add("font-style",s.italic!=null?s.italic?"italic":"normal":void 0).add("text-decoration",s.underline!=null?s.underline?"underline":"none":void 0),(s.fontSize!=null||s.fontSizePx!=null)&&o.add("font-size",`${g.round(g.resolveFontSize(s,t).fontSizePx,2)}px`)}o.applyTo(l),i.appendChild(l)}return i}function Fe(e,t,n,r){if(q.isRichText(e)){const i=r.createElement("div");i.className=C("rich",n),E("block").applyTo(i);for(const a of e.richParagraphs)i.appendChild(at(a,t,n,r));return i}if(Array.isArray(e.lines)&&e.lines.length>0){const i=r.createElement("div");i.className=C("lines",n),E("block").applyTo(i);for(const a of e.lines){const l=r.createElement("div");l.className=C("line",n),l.textContent=a,E("block").add("white-space","pre").add("min-height","1lh").applyTo(l),i.appendChild(l)}return i}return e.text??""}function st(e,t,n,r){const i=r.createElement("div");i.className=C("text",n);const a=e.style||{};return E("flex").add("width","100%").add("height","100%").add("flex-direction","column").add("justify-content",a.verticalAlign==="middle"?"center":a.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(i),i.append(Fe(e,t,n,r)),i}function lt(e,t,n){const r=n.createElement("img");return r.className=C("image",t),r.src=e.imageData,E("block").add("width","100%").add("height","100%").add("object-fit","contain").applyTo(r),r.alt=e.kind,r}function Re(e,t,n,r){const i=r.createElement("div");i.className=C("shape",n);const a=e.style||{},l=g.resolveStroke(a),o=g.resolveBoxBorders(a),s=`${g.round(l.widthPt*t/72,2)}px solid ${l.color}`,c=E("block");return e.grid?c.add("position","relative"):e.kind==="rect"?(o.top&&c.add("border-top",s),o.right&&c.add("border-right",s),o.bottom&&c.add("border-bottom",s),o.left&&c.add("border-left",s)):e.kind==="ellipse"?(o.inner&&c.add("border",s).add("border-radius","50%"),a.backgroundColor&&c.add("background-color",a.backgroundColor)):e.kind==="line"&&c.add("height","0").add("border-top",s),c.add("box-sizing","border-box").add("width","100%").add("height","100%"),c.applyTo(i),i}function ct(e,t,n){const r=n.createElementNS("http://www.w3.org/2000/svg","svg"),i=g.mmToPx(e.widthMm,t),a=g.mmToPx(e.heightMm,t);r.setAttribute("width",String(Math.max(1,i))),r.setAttribute("height",String(Math.max(1,a))),r.setAttribute("aria-hidden","true"),r.style.overflow="visible",r.style.display="block";const l=n.createElementNS("http://www.w3.org/2000/svg","line");l.setAttribute("x1","0"),l.setAttribute("x2",String(i)),l.setAttribute("y1",e.lineDirection==="up"?String(a):"0"),l.setAttribute("y2",e.lineDirection==="up"?"0":String(a));const o=g.resolveStroke({...e.style,borderColor:e.style?.lineColor??e.style?.borderColor});return l.setAttribute("stroke",o.color),l.setAttribute("stroke-width",String(o.widthPt*t/72)),r.appendChild(l),r}function fe(e,t,n,r){const i=r.createElement("div");i.className=`${C("comp",n)} mr-kind-${e.kind}`;const a=E("block").add("position","absolute").mm("left",e.leftMm,t).mm("top",e.topMm,t).mm("width",e.widthMm,t).mm("height",e.heightMm,t).add("box-sizing","border-box");if(nt(a,e,t),a.applyTo(i),q.isImageBackedComponent(e))return i.appendChild(lt(e,n,r)),i;if(e.kind==="text")return i.appendChild(st(e,t,n,r)),i;if(e.grid){const o=Re(e,t,n,r);return o.appendChild(ot(e.grid,e,t,n,r)),i.appendChild(o),i}if(e.kind==="line"&&e.lineDirection)return i.appendChild(ct(e,t,r)),i;if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse")return i.appendChild(Re(e,t,n,r)),i;const l=r.createElement("div");return l.className=C("unknown",n),E("block").applyTo(l),l.textContent=e.fallbackText??`[${e.kind}]`,l.dataset.mrUnsupported=e.kind,l.setAttribute("role","note"),i.appendChild(l),i}function Ne(e,t,n,r){const i=r.createElement("div");return i.className=C("page",n),E("block","initial").add("position","relative").add("font-family",g.DEFAULT_FONT_FAMILY).add("font-size",`${g.round(g.resolveFontSize(void 0,t).fontSizePx,2)}px`).add("line-height",String(g.resolveLineHeight(void 0))).add("white-space","pre-wrap").add("direction","ltr").mm("width",e.pageWidthMm,t).mm("height",e.pageHeightMm,t).add("background-color","#fff").add("color",g.DEFAULT_TEXT_COLOR).add("overflow","hidden").add("box-sizing","border-box").applyTo(i),e.components.forEach((a,l)=>{const o=fe(a,t,n,r);o.dataset.mrComponentIndex=String(l),i.appendChild(o)}),i}function dt(e,t,n={}){const r=n.dpi??96;W.reportOutputDiagnostics(e,"dom",n);const i=t.createElement("div");return i.className=C("root",n),E("block").applyTo(i),i.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(a=>{i.appendChild(Ne(a,r,n,t))}),i}function we(e,t,n,r,i,a,l,o="top"){e.font=`${t.italic?"italic ":""}${t.bold?"bold ":""}${t.fontSizePx}px ${l}`,"letterSpacing"in e&&(e.letterSpacing="0px"),e.fillStyle=t.color,e.textBaseline="alphabetic";const s=t.fontSizePx*t.lineHeight,c=t.text===""?[""]:t.text.split(`
|
|
2
|
+
`),d=c.length*s;let h=r;o==="middle"?h=r+(a-d)/2:o==="bottom"&&(h=r+a-d),c.forEach((m,u)=>{const p=h+u*s+t.fontSizePx*.8;mt(e,m,t,n,p,i),t.underline&&m&&ht(e,m,t,n,p,i)}),e.textAlign="left"}function mt(e,t,n,r,i,a){const l=Array.from(t),o=n.letterSpacingPx??0;if(!o){e.textAlign=n.align==="center"?"center":n.align==="right"?"right":"left";const h=n.align==="center"?r+a/2:n.align==="right"?r+a:r;e.fillText(t,h,i);return}const s=e.measureText(t).width+Math.max(0,l.length-1)*o,c=n.align==="center"?r+(a-s)/2:n.align==="right"?r+a-s:r;e.textAlign="left";let d="";l.forEach((h,m)=>{e.fillText(h,c+e.measureText(d).width+m*o,i),d+=h})}function ht(e,t,n,r,i,a){const l=e.measureText(t).width+Math.max(0,Array.from(t).length-1)*(n.letterSpacingPx??0),o=n.align==="center"?r+(a-l)/2:n.align==="right"?r+a-l:r;e.strokeStyle=n.color,e.lineWidth=Math.max(.5,n.fontSizePx/20),e.beginPath(),e.moveTo(o,i+1),e.lineTo(o+l,i+1),e.stroke()}function $e(e,t,n,r,i){const a=r/72,l=o=>{e.font=`${o.italic?"italic ":""}${o.bold?"bold ":""}${g.resolveFontSize(o,r).fontSizePx}px ${o.fontFamily??i}`,"letterSpacing"in e&&(e.letterSpacing="0px")};ge.drawRichText(t,{x:n.x/a,yTop:-n.y/a,width:n.width/a,height:n.height/a},{measure(o,s){return l(s),e.measureText(o).width/a+(s.letterSpacing??0)},draw(o,s,c,d,h){const m=g.resolveFontSize(s,r).fontSizePx,u=-d*a-m*.8;s.backgroundColor&&(e.fillStyle=s.backgroundColor,e.fillRect(c*a,u,h*a,m*g.resolveLineHeight(s))),we(e,{text:o,fontSizePx:m,bold:!!s.bold,italic:s.italic,underline:s.underline,color:g.resolveTextColor(s),align:"left",lineHeight:g.resolveLineHeight(s),letterSpacingPx:(s.letterSpacing??0)*a},c*a,u,h*a,m,s.fontFamily??i)}})}function D(e){if(e?.aborted)throw e.reason??new DOMException("The operation was aborted.","AbortError")}const gt=(e,t)=>(D(t),/^data:image\/(?:png|jpe?g|webp|gif|svg\+xml)[;,]/i.test(e)?new Promise((n,r)=>{const i=new Image,a=()=>{i.onload=null,i.onerror=null,t?.removeEventListener("abort",l)},l=()=>{a(),i.src="",r(t?.reason??new DOMException("The operation was aborted.","AbortError"))};i.onload=()=>{a(),n(i)},i.onerror=()=>{a(),r(new Error("Image could not be decoded for Canvas output."))},t?.addEventListener("abort",l,{once:!0}),i.src=e}):Promise.reject(new TypeError("Canvas imageData must be an image data URL; provide imageLoader for other sources.")));function ut(e,t,n){return D(n),n?new Promise((r,i)=>{const a=()=>i(n.reason??new DOMException("The operation was aborted.","AbortError"));n.addEventListener("abort",a,{once:!0}),Promise.resolve().then(()=>e(t,n)).then(r,i).finally(()=>n.removeEventListener("abort",a))}):e(t)}function*ve(e){function*t(n,r,i,a){if(a.has(n))throw new TypeError("Cyclic grid children cannot be rendered.");q.isImageBackedComponent(n)&&(yield{component:n,componentIndex:r,componentPath:i});const l=new Set(a).add(n);for(const[o,s]of(n.grid?.cells??[]).entries())for(const[c,d]of s.entries())for(const[h,m]of(d?.children??[]).entries())yield*t(m,r,[...i,o,c,h],l)}for(const[n,r]of e.components.entries())yield*t(r,n,[],new Set)}async function pt(e,t,n){const r=new Map;for(const{component:i}of ve(e))!q.isImageBackedComponent(i)||r.has(i.imageData)||r.set(i.imageData,await ut(t,i.imageData,n));return D(n),r}function ft(e,t,n,r,i,a){const l=t,o=l.naturalWidth??l.width??i,s=l.naturalHeight??l.height??a;if(o<=0||s<=0)throw new RangeError("Decoded Canvas image dimensions must be positive.");const c=Math.min(i/o,a/s),d=o*c,h=s*c;e.drawImage(t,n+(i-d)/2,r+(a-h)/2,d,h)}function Oe(e){return K.createPageWindowIndex(e.pageHeightsPx,e.gapPx).window(e.viewportHeightPx,e.scrollTopPx,e.overscan)}const Me=96/25.4;function ae(e,t=96){const n=t/96*Me;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*n)),heightPx:Math.max(1,Math.round(e.pageHeightMm*n))}}function _e(e,t,n,r=64e6){if(!Number.isFinite(t)||t<=0||!Number.isFinite(n)||n<=0)throw new RangeError("Canvas dpr and dpi must be positive finite numbers.");if(!Number.isFinite(r)||r<=0)throw new RangeError("maxCanvasPixels must be positive and finite.");const i=ae(e,n),a=Math.round(i.widthPx*t),l=Math.round(i.heightPx*t);if(!Number.isSafeInteger(a)||!Number.isSafeInteger(l)||a*l>r)throw new RangeError("Canvas page exceeds maxCanvasPixels; reduce resolution or split the report.");return{width:a,height:l}}function He(e,t,n,r){const i=document.createElement("canvas"),{widthPx:a,heightPx:l}=ae(e,n),o=_e(e,t,n,r);i.width=o.width,i.height=o.height,i.style.width=`${a}px`,i.style.height=`${l}px`;const s=i.getContext("2d");if(!s)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return s.scale(t,t),s.fillStyle="#ffffff",s.fillRect(0,0,a,l),{canvas:i,ctx:s}}function wt(e,t=96){return g.resolveFontSize(e,t).fontSizePx}function vt(e,t,n,r,i,a,l){for(const o of ge.resolveGridStrokes(t,n))e.strokeStyle=o.color,e.lineWidth=g.ptToPx(o.widthPt,l),e.beginPath(),o.kind==="v"?(e.moveTo(r+o.pos*a,i+o.from*a),e.lineTo(r+o.pos*a,i+o.to*a)):(e.moveTo(r+o.from*a,i+o.pos*a),e.lineTo(r+o.to*a,i+o.pos*a)),e.stroke()}function Mt(e,t,n,r,i,a){e.beginPath(),t.top&&(e.moveTo(n,r),e.lineTo(n+i,r)),t.right&&(e.moveTo(n+i,r),e.lineTo(n+i,r+a)),t.bottom&&(e.moveTo(n+i,r+a),e.lineTo(n,r+a)),t.left&&(e.moveTo(n,r+a),e.lineTo(n,r)),e.stroke()}function yt(e,t,n,r,i,a,l,o,s,c,d,h){const m=he.resolveGridLayout(t,a/o,l/o);for(const u of m.cells){const p=u.cell.style?.backgroundColor??n.style?.backgroundColor;p&&(e.fillStyle=p,e.fillRect(r+u.xMm*o,i+u.yMm*o,u.widthMm*o,u.heightMm*o))}vt(e,m,n,r,i,o,s);for(const u of m.cells)bt(e,u,n,r,i,o,s,c,d,h)}function bt(e,t,n,r,i,a,l,o,s,c){const d=n.grid?.paddingMm??.5,h=t.cell.text??"",m=g.mergeComponentStyles(n.style,t.cell.style),u=g.resolveFontSize(m,l),p=t.cell.indentMm??0,P=Math.max(0,t.widthMm-2*d-p),L=O.wrapText(h,P,{fontSizePt:u.fontSizePt,bold:m.bold,italic:m.italic,fontFamily:m.fontFamily??o,letterSpacingPt:m.letterSpacing},s).join(`
|
|
3
|
+
`),b={x:r+(t.xMm+d+p)*a,y:i+(t.yMm+d)*a,width:P*a,height:Math.max(0,t.heightMm-2*d)*a};e.save(),e.beginPath(),e.rect(b.x,b.y,b.width,b.height),e.clip(),t.cell.richParagraphs?.length?$e(e,{...n,richParagraphs:t.cell.richParagraphs,style:{verticalAlign:"middle",...m}},b,l,o):we(e,{text:L,fontSizePx:u.fontSizePx,bold:m.bold??!1,italic:m.italic,underline:m.underline,color:g.resolveTextColor(m,g.DEFAULT_TEXT_COLOR),align:m.align??"left",lineHeight:g.resolveLineHeight(m),letterSpacingPx:g.ptToPx(m.letterSpacing??0,l)},r+(t.xMm+d+p)*a,i+(t.yMm+d)*a,P*a,Math.max(0,t.heightMm-2*d)*a,m.fontFamily??o,m.verticalAlign??"middle");for(const S of t.cell.children??[])se(e,{...S,leftMm:S.leftMm+b.x/a,topMm:S.topMm+b.y/a},a,l,o,s,c);e.restore()}function Tt(e,t,n,r,i,a,l,o,s){const c=t.style??{},d=g.resolveFontSize(c,l);if(q.isRichText(t)){$e(e,t,{x:n,y:r,width:i,height:a},l,o);return}const h=t.lines?.length?t.lines.join(`
|
|
4
|
+
`):O.wrapText(t.text??"",t.widthMm,{fontSizePt:d.fontSizePt,bold:c.bold,italic:c.italic,fontFamily:c.fontFamily??o,letterSpacingPt:c.letterSpacing},s).join(`
|
|
5
|
+
`);we(e,{text:h,fontSizePx:d.fontSizePx,bold:c.bold??!1,italic:c.italic,underline:c.underline,color:g.resolveTextColor(c),align:c.align??"left",lineHeight:g.resolveLineHeight(c),letterSpacingPx:g.ptToPx(c.letterSpacing??0,l)},n,r,i,a,c.fontFamily??o,c.verticalAlign)}function se(e,t,n,r,i,a,l){const o=t.leftMm*n,s=t.topMm*n,c=t.widthMm*n,d=t.heightMm*n,h=t.style??{};if(q.isImageBackedComponent(t)){const m=l?.get(t.imageData);m?ft(e,m,o,s,c,d):xe(e,t,o,s,c,d);return}if(t.grid){yt(e,t.grid,t,o,s,c,d,n,r,i,a,l);return}switch(t.kind){case"text":{Tt(e,t,o,s,c,d,r,i,a);break}case"rect":{const m=g.resolveStroke(h),u=g.resolveBoxBorders(h);h.backgroundColor&&(e.fillStyle=h.backgroundColor,e.fillRect(o,s,c,d)),u.inner&&(e.strokeStyle=m.color,e.lineWidth=g.ptToPx(m.widthPt,r),Mt(e,u,o,s,c,d));break}case"line":{const m=g.resolveStroke({...h,borderColor:h.lineColor??h.borderColor});e.strokeStyle=m.color,e.lineWidth=g.ptToPx(m.widthPt,r),e.beginPath();const u=t.lineDirection==="up"?s+d:t.lineDirection==="down"?s:s+d/2,p=t.lineDirection==="up"?s:t.lineDirection==="down"?s+d:s+d/2;e.moveTo(o,u),e.lineTo(o+c,p),e.stroke();break}case"ellipse":{const m=g.resolveStroke(h);e.strokeStyle=m.color,e.lineWidth=g.ptToPx(m.widthPt,r),h.backgroundColor&&(e.fillStyle=h.backgroundColor,e.beginPath(),e.ellipse(o+c/2,s+d/2,c/2,d/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(o+c/2,s+d/2,c/2,d/2,0,0,Math.PI*2),e.stroke();break}default:xe(e,t,o,s,c,d);break}}function xe(e,t,n,r,i,a){e.save(),e.strokeStyle="#94a3b8",e.strokeRect(n,r,i,a),e.fillStyle="#64748b",e.font="12px sans-serif",e.fillText(t.fallbackText??`[${t.kind}]`,n+3,r+14),e.restore()}async function Et(e,t={}){if(typeof document>"u")throw new Error("renderPlanToImages 需要浏览器环境(SSR/Node 请在客户端钩子中调用)");const{format:n="png",quality:r=.92,...i}=t;if(n!=="png"&&n!=="jpeg")throw new TypeError("Image format must be png or jpeg.");if(!Number.isFinite(r)||r<0||r>1)throw new RangeError("Image quality must be between 0 and 1.");D(t.signal);const a=await J.resolvePlanAssets(e,{...t,format:"canvas"});e=a.plan;const l=[...a.diagnostics,...W.reportOutputDiagnostics(e,"canvas",t)],o=n==="jpeg"?"image/jpeg":"image/png",s=[],c=Math.min(e.pages.length-1,t.end??e.pages.length-1);for(let d=Math.max(0,t.start??0);d<=c;d++){D(t.signal);const h=await ze(e.pages[d],d,i,l);try{s.push(await St(h,o,r,t.signal))}finally{h.width=0,h.height=0}await Qe.outputCheckpoint(t,s.length,c-Math.max(0,t.start??0)+1)}return D(t.signal),{blobs:s,diagnostics:l}}function St(e,t,n,r){return D(r),new Promise((i,a)=>{const l=()=>a(r?.reason??new DOMException("The operation was aborted.","AbortError"));r?.addEventListener("abort",l,{once:!0});try{e.toBlob(o=>{r?.removeEventListener("abort",l),o?i(o):a(new Error("Canvas encoding failed; no empty image was emitted."))},t,n)}catch(o){r?.removeEventListener("abort",l),a(o)}})}function Rt(e,t={}){if(D(t.signal),typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,i=r/96*Me,a=t.fontFamily??g.DEFAULT_FONT_FAMILY,l=t.measurer??O.heuristicMeasurer,o=Math.max(0,t.start??0),s=Math.min(e.pages.length-1,t.end??e.pages.length-1),c=[],d=W.reportOutputDiagnostics(e,"canvas",t),h=xt(e,o,s);for(const m of h)Ie.notifyOutputDiagnostic(m,t),d.push(m);if(t.fidelity==="strict"&&h.length)throw new W.OutputFidelityError(d);for(let m=o;m<=s;m++){D(t.signal);const u=e.pages[m],{canvas:p,ctx:P}=He(u,n,r,t.maxCanvasPixels);for(const L of u.components)se(P,L,i,r,a,l);c.push(p)}return{canvases:c,diagnostics:d}}function xt(e,t,n){return n<t?[]:e.pages.slice(t,n+1).flatMap((r,i)=>[...ve(r)].map(({component:a,componentIndex:l,componentPath:o})=>({code:"async-image-required",severity:"warning",format:"canvas",pageIndex:t+i,componentIndex:l,componentPath:o,kind:a.kind,nid:a.nid,message:"Use renderPlanToCanvasAsync or renderPlanToImages to decode and include images."})))}async function Ct(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvasAsync 需要浏览器环境(Node 请使用 PDF 或 XLSX 输出)");D(t.signal);const n=await J.resolvePlanAssets(e,{...t,format:"canvas"});e=n.plan;const r=[...n.diagnostics,...W.reportOutputDiagnostics(e,"canvas",t)],i=[],a=Math.min(e.pages.length-1,t.end??e.pages.length-1);for(let l=Math.max(0,t.start??0);l<=a;l++)i.push(await ze(e.pages[l],l,t,r));return{canvases:i,diagnostics:r}}async function ze(e,t,n,r){const i=n.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),a=n.dpi??96,l=n.fontFamily??g.DEFAULT_FONT_FAMILY,o=await Be(e,t,n,r);D(n.signal);const{canvas:s,ctx:c}=He(e,i,a,n.maxCanvasPixels);for(const d of e.components)se(c,d,a/25.4,a,l,n.measurer??O.heuristicMeasurer,o);return s}async function Be(e,t,n,r){const i=n.imageLoader??gt;return pt(e,async(a,l)=>{try{return await i(a,l)}catch(o){if(l?.aborted)throw o;const s=[...ve(e)].find(({component:u})=>u.imageData===a),{component:c,componentIndex:d,componentPath:h}=s,m={code:"image-decode-failed",severity:"warning",format:"canvas",pageIndex:t,componentIndex:d,componentPath:h,kind:c.kind,nid:c.nid,message:"Image decoding failed; raster output was cancelled instead of omitting the image."};throw r.push(m),Ie.notifyOutputDiagnostic(m,n),o}},n.signal)}function Pt(e,t={}){const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,i=r/96*Me,a=t.fontFamily??g.DEFAULT_FONT_FAMILY,l=t.measurer??O.heuristicMeasurer,o=t.overscan??1,s=t.gapPx??18,c=t.pagesPerFrame??1,d=e.pages.map(w=>w.pageHeightMm*i),h=Math.max(1,...e.pages.map(w=>w.pageWidthMm*i)),m={start:0,end:-1};let u=null,p=null,P=null,L=null,b=[],S=0,I=[],j=0,_=new AbortController;const Te=[];function Ke(){const w=u;w.innerHTML="",p=document.createElement("div"),p.style.cssText=`width:${h}px;margin:0 auto;`,P=document.createElement("div"),L=document.createElement("div"),p.appendChild(P),b=[];const R=Math.min(e.pages.length,3+o*2);for(let B=0;B<R;B++){const T=document.createElement("div");T.style.cssText=`margin:0 auto ${s}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,p.appendChild(T),b.push(T)}p.appendChild(L),w.appendChild(p)}async function Xe(w,R){const B=j,T=await J.resolvePlanAssets(e,{...t,signal:_.signal,format:"canvas",start:R,end:R});Te.push(...T.diagnostics);const A=T.plan.pages[R],te=await Be(A,R,{...t,signal:_.signal},Te);if(B!==j||!u)return;const{widthPx:ce,heightPx:de}=ae(A,r);let H=w.firstElementChild;(!H||H.tagName!=="CANVAS")&&(H=document.createElement("canvas"),w.innerHTML="",w.appendChild(H));const Se=_e(A,n,r,t.maxCanvasPixels);H.width=Se.width,H.height=Se.height,H.style.width=`${ce}px`,H.style.height=`${de}px`;const V=H.getContext("2d");if(V){V.setTransform(1,0,0,1,0,0),V.scale(n,n),V.fillStyle="#ffffff",V.fillRect(0,0,ce,de);for(const Ze of A.components)se(V,Ze,i,r,a,l,te);H.dataset.canvasPage=String(R),w.style.height=`${de}px`,w.style.width=`${ce}px`}}function Je(w){j++,m.start=w.start,m.end=w.end,P.style.height=`${w.start*s+d.slice(0,w.start).reduce((T,A)=>T+A,0)}px`;const R=e.pages.length-1-w.end;L.style.height=`${R*s+d.slice(w.end+1).reduce((T,A)=>T+A,0)}px`;const B=w.end-w.start+1;b.forEach((T,A)=>{if(A<B){T.style.display="";const te=w.start+A;T.style.height=`${d[te]??0}px`}else T.style.display="none"}),I=[];for(let T=w.start;T<=w.end;T++){const A=b[T-w.start];if(!A)continue;A.firstElementChild?.dataset?.canvasPage!==String(T)&&I.push(T)}le()}function le(){S||I.length===0||(S=requestAnimationFrame(()=>{S=0;let w=Math.max(1,c);for(;I.length>0&&w-- >0;){const R=I.shift(),B=b[R-m.start];B&&Xe(B,R).catch(()=>{})}I.length>0&&le()}))}function Q(){S||(S=requestAnimationFrame(()=>{S=0;const w=u,R=Oe({pageHeightsPx:d,viewportHeightPx:w.clientHeight,scrollTopPx:w.scrollTop,overscan:o,gapPx:s});R.start!==m.start||R.end!==m.end?Je(R):le()}))}let ee=null;return{attach(w){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");D(t.signal),_=new AbortController,t.signal?.addEventListener("abort",Ee,{once:!0}),W.reportOutputDiagnostics(e,"canvas",t),u=w,Ke(),w.addEventListener("scroll",Q,{passive:!0}),typeof ResizeObserver<"u"&&(ee=new ResizeObserver(()=>Q()),ee.observe(w)),Q()},destroy(){j++,_.abort(),t.signal?.removeEventListener("abort",Ee),S&&cancelAnimationFrame(S),S=0,ee?.disconnect(),ee=null,u?.removeEventListener("scroll",Q),I=[],p?.remove(),u=null},window(){return{...m}}};function Ee(){_.abort(t.signal?.reason)}}function ye(e,t,n){let r,i;if(typeof e=="string"){const a=g.PAPER_SIZES[e];if(!a)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(g.PAPER_SIZES).join("/")})`);r=a.widthMm,i=a.heightMm}else typeof e=="number"?(r=e,i=t??297):(r=e.widthMm,i=e.heightMm);return n?{widthMm:i,heightMm:r}:{widthMm:r,heightMm:i}}class We{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}repeat(t){return this.templateRepeat=t,this}params(t){return this.templateParams=t,this}page(t="a4",n={},r){this.collect();const a=r!=null&&!("margins"in r)&&!("landscape"in r)&&("marginTopMm"in r||"marginBottomMm"in r||"marginLeftMm"in r||"marginRightMm"in r)?{margins:r}:typeof n=="number"?r??{}:n,{widthMm:l,heightMm:o}=ye(t,typeof n=="number"?n:void 0,a.landscape),s=a.margins??{};return this.pending=new qe(this,{widthMm:l,heightMm:o,marginTopMm:s.marginTopMm??10,marginBottomMm:s.marginBottomMm??10,marginLeftMm:s.marginLeftMm??10,marginRightMm:s.marginRightMm??10}),this.pending}collect(){this.pending&&(this.pages.push(this.pending.buildPage()),this.pending=null)}build(){if(this.collect(),this.pages.length===0)throw new Error("模板至少需要一页:先调用 .page() 添加内容");return{...this.templateParams?{params:this.templateParams}:{},...this.templateRepeat?{repeat:this.templateRepeat}:{},pages:this.pages}}}class qe{constructor(t,n){this.parent=t,this.page=n,this.components=[]}text(t,n={},r={}){return this.components.push({kind:"text",leftMm:n.leftMm??0,topMm:n.topMm??0,widthMm:n.widthMm??60,heightMm:n.heightMm??8,text:t,style:r}),this}list(t,n,r,i={}){return this.components.push({kind:"list",leftMm:n.leftMm??10,topMm:n.topMm??30,widthMm:n.widthMm??180,dataset:t,columns:r,...i}),this}rect(t,n={}){return this.components.push({kind:"rect",...t,style:n}),this}line(t,n,r,i={}){return this.components.push({kind:"line",leftMm:t,topMm:n,widthMm:r,heightMm:.5,style:i}),this}barcode(t,n){return this.components.push({kind:"barcode",leftMm:n.leftMm??0,topMm:n.topMm??0,widthMm:n.widthMm??40,heightMm:n.heightMm??12,fallbackText:t}),this}qrcode(t,n,r,i){return this.components.push({kind:"qrcode",leftMm:r,topMm:i,widthMm:n,heightMm:n,fallbackText:t}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function At(){return new We}function Lt(e,t={}){return me.validateDatasetRows([],e),e.fields.map(n=>({field:n.field,header:`${n.label??n.field}${n.unit?` (${n.unit})`:""}`,semanticRole:n.semanticRole??(n.type==="number"||n.type==="decimal"?"measure":n.type==="date"?"date":n.enum?"dimension":"text"),...t[n.field]}))}function F(e,t,n=!1){if(!Number.isFinite(e)||(n?e<0:e<=0))throw new Error(`${t} 必须是有限${n?"非负":"正"}数`)}function re(e,t,n){if(e!==void 0&&!["left","center","right","justify",...n?["auto"]:[]].includes(e))throw new Error(`${t} 必须是 left/center/right/justify${n?"/auto":""}`)}function kt(e){const t=e.layout??"page";if(t!=="page"&&t!=="wide")throw new Error("layout 必须是 page 或 wide");if(t==="wide"&&(e.paper!==void 0||e.landscape!==void 0))throw new Error('宽表布局不能同时指定 paper 或 landscape;标准纸型请使用 layout: "page"');if(t!=="wide"&&e.columnWidthMm!==void 0)throw new Error('columnWidthMm 仅适用于 layout: "wide"');const n=e.columnWidthMm??30;return F(n,"columnWidthMm"),{layout:t,columnWidthMm:n}}function It(e){const t=e.paper===void 0?"a4":e.paper;if(typeof t!="string"&&(typeof t!="object"||t===null)||e.landscape!==void 0&&typeof e.landscape!="boolean")throw new Error("paper 必须是纸张预设名或 { widthMm, heightMm } 对象,landscape 必须是布尔值");if(typeof t=="string"&&!Object.prototype.hasOwnProperty.call(g.PAPER_SIZES,t))throw new Error(`未知纸张预设 "${t}"(可用:${Object.keys(g.PAPER_SIZES).join("/")})`);const n=ye(t,void 0,e.landscape),r=n.widthMm,i=n.heightMm;return F(r,"纸张 widthMm"),F(i,"纸张 heightMm"),{widthMm:r,heightMm:i}}function Dt(e){if(e.margins!==void 0&&(!e.margins||typeof e.margins!="object"||Array.isArray(e.margins)))throw new Error("margins 必须是页边距对象");const t=e.margins??{},n={marginTopMm:t.marginTopMm===void 0?10:t.marginTopMm,marginBottomMm:t.marginBottomMm===void 0?10:t.marginBottomMm,marginLeftMm:t.marginLeftMm===void 0?10:t.marginLeftMm,marginRightMm:t.marginRightMm===void 0?10:t.marginRightMm};for(const[r,i]of Object.entries(n))F(i,r,!0);return n}function Ft(e,t){const n=e.dataset===void 0?"detail":e.dataset;if(typeof n!="string"||!n.trim())throw new Error("dataset 必须是非空字符串");if(e.title!==void 0&&typeof e.title!="string")throw new Error("title 必须是字符串");const r=e.titleHeightMm===void 0?10:e.titleHeightMm,i=e.titleGapMm===void 0?4:e.titleGapMm;F(r,"titleHeightMm"),F(i,"titleGapMm",!0);const a=e.title!==void 0&&e.title.length>0,l=a?r+i:0;if(l>=t)throw new Error("标题高度与间距占满页面,必须为表格保留可用高度");return{dataset:n,titleHeightMm:r,hasTitle:a,titleSpaceMm:l}}function Nt(e){if(e.listOptions!==void 0&&(!e.listOptions||typeof e.listOptions!="object"||Array.isArray(e.listOptions)))throw new Error("listOptions 必须是列表配置对象");const t=e.listOptions??{};re(t.align,"listOptions.align",!0),re(t.headerAlign,"listOptions.headerAlign",!1);for(const n of["fontSizePt","rowHeightMm","paddingMm"]){const r=t[n];r!==void 0&&F(r,`listOptions.${n}`,n==="paddingMm")}return t}function $t(e){let t=0,n=0;for(const[r,i]of e.entries()){if(!i||typeof i.header!="string"||typeof i.field!="string"||!i.field.trim())throw new Error(`columns[${r}] 需要字符串 header 与非空 field`);re(i.align,`columns[${r}].align`,!0),re(i.headerAlign,`columns[${r}].headerAlign`,!1),i.flex!==void 0&&F(i.flex,`columns[${r}].flex`),i.widthMm!==void 0?(F(i.widthMm,`columns[${r}].widthMm`),t+=i.widthMm):n=Math.max(n,i.flex??1)}return{fixedWidthMm:t,maxFlex:n}}function Ot(e,t,n,r){const{fixedWidthMm:i,maxFlex:a}=$t(e.columns);if(t==="page"&&i>r)throw new Error(`固定列宽 ${i}mm 超出页面可用宽度 ${r}mm`);const l=r-i;if(t==="page"&&a>0&&l<=0)throw new Error("固定列占满页面可用宽度,自动列需要正的剩余宽度");const o=a>0?e.columns.reduce((c,d)=>c+(d.widthMm===void 0?(d.flex??1)/a:0),0):0;return{columns:e.columns.map(({widthMm:c,flex:d,...h},m)=>{const u=c??(t==="wide"?n*(d??1):l*((d??1)/a)/o);return F(u,`columns[${m}] 分配后的 widthMm`),{...h,widthMm:u}}),fixedWidthMm:i,maxFlex:a}}function _t(e){if(!e||typeof e!="object")throw new Error("标准明细模板需要 options 对象");if(!Array.isArray(e.columns)||e.columns.length===0)throw new Error("columns 至少需要一列");const{layout:t,columnWidthMm:n}=kt(e),r=It(e);let i=r.widthMm;const a=r.heightMm,l=Dt(e);let o=i-l.marginLeftMm-l.marginRightMm;const s=a-l.marginTopMm-l.marginBottomMm;if(t==="page"&&o<=0||s<=0)throw new Error("页边距占满纸张,必须保留正的可用宽度和高度");const{dataset:c,titleHeightMm:d,hasTitle:h,titleSpaceMm:m}=Ft(e,s),u=Nt(e),{columns:p,fixedWidthMm:P,maxFlex:L}=Ot(e,t,n,o);t==="wide"&&(o=p.reduce((S,I)=>S+I.widthMm,0),F(o,"宽表总列宽"),i=o+l.marginLeftMm+l.marginRightMm,F(i,"宽表总宽度"));const b={widthMm:i,heightMm:a,...l,components:[],...t==="wide"?{layout:t}:{}};return h&&b.components.push({kind:"text",text:e.title,leftMm:l.marginLeftMm,topMm:l.marginTopMm,widthMm:o,heightMm:d,style:{fontSize:16,bold:!0,align:"center",verticalAlign:"middle",...e.titleStyle}}),b.components.push({align:"auto",headerAlign:"center",...u,kind:"list",...t==="wide"?{layout:t}:{},...h?{title:e.title}:{},dataset:c,columns:p,leftMm:l.marginLeftMm,topMm:l.marginTopMm+m,widthMm:t==="wide"||L>0?o:P}),e.params===void 0?{pages:[b]}:{params:e.params,pages:[b]}}function Ht(e){if(e.components!==void 0&&e.pages!==void 0)throw new TypeError("标签 components 与 pages 只能选择一种");const{dataset:t,rowKey:n,copies:r,params:i}=e,a=e.pages??[{components:e.components??[]}],l={repeat:{dataset:t,...n===void 0?{}:{rowKey:n},...r===void 0?{}:{copies:r}},...i===void 0?{}:{params:i},pages:a.map(s=>({widthMm:s.widthMm??e.widthMm??80,heightMm:s.heightMm??e.heightMm??55,marginTopMm:0,marginRightMm:0,marginBottomMm:0,marginLeftMm:0,components:s.components,...s.meta===void 0?{}:{meta:s.meta}}))},o=y.validateReportTemplate(l);if(!o.ok)throw new y.ReportTemplateError(o.errors);return JSON.parse(JSON.stringify(l))}function zt(e){if(!e||typeof e!="object"||!e.repeat)throw new f.ReportSourceError("config","defineLabelReport 需要带 repeat 的固定标签模板");const t=y.validateReportTemplate(e);if(!t.ok)throw new y.ReportTemplateError(t.errors);return e.repeat.dataset}function Ce(e,t){if(!Array.isArray(e))throw new f.ReportSourceError("validate","标签数据应为对象数组;请从业务响应中提取行数组");return{[t]:e}}function Bt(e){const{template:t,rows:n,load:r,dataSchema:i,params:a,pagination:l,dataValidation:o}=e,s=zt(t);if(n!==void 0==(r!==void 0)||r!==void 0&&typeof r!="function")throw new f.ReportSourceError("config","标签报表应且只能配置 rows 或 load 其中一种数据来源");const c={template:t,params:a,pagination:l,dataValidation:o,...i===void 0?{}:{dataSchema:{[s]:i}}};return r?f.defineReport({...c,load:r,mapData:d=>Ce(d,s)}):{...c,datasets:Ce(n,s)}}function Wt(e){return e}class N extends Error{constructor(t,n){super(n),this.code=t,this.name="ReportTemplateStoreError"}}function $(e){return JSON.parse(JSON.stringify(e))}function x(e){if(!e?.aborted)return;const t=new Error("模板操作已取消");throw t.name="AbortError",t}function Pe(e){const t=e?Number(e.revision):0;if(!Number.isSafeInteger(t)||t<0||t>=Number.MAX_SAFE_INTEGER)throw new N("history","修订号无效或已达上限");return String(t+1)}function qt(e,t={}){const n=async(l,o)=>{x(o);const s=await e.read(l,o);return x(o),s?$(s):void 0},r=async(l,o)=>{const s=await n(l,o.signal);if((s?.revision??null)!==o.expectedRevision)throw new N("conflict","模板已变化,请重新读取后提交");return s},i=async(l,o,s)=>{if(x(o.signal),!await e.compareAndSwap(l.id,o.expectedRevision,$(l),{signal:o.signal,...s?{publication:$(s)}:{}}))throw new N("conflict","模板已被其他请求更新");return $(l)},a=async(l,o,s,c)=>{if(t.beforePublish){x(s.signal);const u=await t.beforePublish({document:y.parseReportTemplate(o),previous:l.published?y.parseReportTemplate(l.published):void 0,signal:s.signal});if(!u||u.ok!==!0)throw new N("review",u?.issues?.find(p=>p.severity==="error")?.message??"模板发布检查未通过");x(s.signal)}const d=Pe(l),h=y.parseReportTemplate({...o,revision:d}),m={revision:d,document:h,publishedAt:(t.now?.()??new Date).toISOString()};return c!==void 0&&(m.restoredFrom=c),i({id:l.id,revision:d,publishedRevision:d,published:h},s,m)};return{list:async l=>{x(l);const o=await e.list(l);return x(l),$(o)},get:async(l,o={})=>{const s=await n(l,o.signal),c=o.draft?s?.draft:s?.published;return c?y.parseReportTemplate(c):void 0},history:async(l,o)=>{x(o);const s=await e.history(l,o);return x(o),$(s)},saveDraft:async(l,o)=>{o={...o},x(o.signal);const s=y.parseReportTemplate(t.migrate?await t.migrate(l):l),c=await r(s.id,o),d=Pe(c);return i({id:s.id,revision:d,draft:{...s,revision:d},...c?.publishedRevision?{publishedRevision:c.publishedRevision,published:c.published}:{}},o)},publish:async(l,o)=>{o={...o};const s=await r(l,o);if(!s)throw new N("missing","模板不存在");if(!s.draft)throw new N("draft","没有可发布的草稿");return a(s,s.draft,o)},rollback:async(l,o,s)=>{s={...s};const c=await r(l,s);if(!c)throw new N("missing","模板不存在");x(s.signal);const d=await e.getVersion(l,o,s.signal);if(!d)throw new N("history","历史修订不存在");return a(c,d.document,s,o)}}}function Ut(){const e=new Map,t=new Map;return{read:async(n,r)=>{x(r);const i=e.get(n);return i?$(i):void 0},list:async n=>(x(n),Array.from(e.values(),({id:r,revision:i,publishedRevision:a})=>({id:r,revision:i,...a?{publishedRevision:a}:{}}))),history:async(n,r)=>(x(r),Array.from(t.get(n)?.values()??[],i=>$(i))),getVersion:async(n,r,i)=>{x(i);const a=t.get(n)?.get(r);return a?$(a):void 0},compareAndSwap:async(n,r,i,a)=>{if(x(a.signal),(e.get(n)?.revision??null)!==r)return!1;if(i.id!==n)throw new N("history","状态 ID 与存储 ID 不一致");const l=$(i),o=a.publication;if(o){const s=t.get(n)??new Map;if(s.has(o.revision)||o.revision!==i.revision||o.document.id!==n)throw new N("history","发布修订不可覆盖,且必须与状态修订和模板 ID 一致");s.set(o.revision,$(o)),t.set(n,s)}return e.set(n,l),!0}}}function jt(e){return e.map(t=>t.map(n=>/[\t\r\n"]/.test(n)?`"${n.replace(/"/g,'""')}"`:n).join(" ")).join(`\r
|
|
6
|
+
`)}function Gt(e,t){const n=e[e.length-1];e.length>1&&n?.length===1&&n[0]===""&&/[\r\n]$/.test(t)&&e.pop()}function Vt(e,t=1e4){if(e.length>4*1024*1024)throw new Error("Clipboard text limit exceeded");const n=[[]];let r="",i=!1,a=!1,l=0;function o(){if(++l>t)throw new Error("Clipboard cell limit exceeded");n[n.length-1].push(r),r="",a=!1}for(let s=0;s<e.length;s++){const c=e[s];if(i){if(c!=='"'){r+=c;continue}if(e[s+1]==='"'){r+='"',s++;continue}i=!1,a=!0;continue}if(c==='"'&&!r&&!a){i=!0;continue}if(c===" "){o();continue}if(c==="\r"||c===`
|
|
7
|
+
`){o(),n.push([]),c==="\r"&&e[s+1]===`
|
|
8
|
+
`&&s++;continue}if(a)throw new Error("Invalid quoted clipboard value");r+=c}if(i)throw new Error("Unclosed clipboard quote");return o(),Gt(n,e),n}class Ue extends Error{constructor(t,n,r){const i=typeof n.label=="string"?n.label:"单元格",a={definition:`${i}的编辑器配置无效`,type:`${i}的编辑器与数据类型不一致`,required:`${i}不能为空`,min:`${i}不能小于 ${r}`,max:`${i}不能大于 ${r}`,precision:`${i}最多保留 ${r} 位小数`,length:`${i}最多允许 ${r} 个字符`,choice:`${i}请选择有效选项`,date:`${i}请输入有效日期(YYYY-MM-DD)`};super(a[t]),this.code=t,this.field=n,this.expected=r,this.name="ReportCellFieldError"}}function v(e,t,n){throw new Ue(t,e,n)}function je(e){if(typeof e!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(e)||e.startsWith("0000-"))return!1;const t=new Date(`${e}T00:00:00.000Z`);return Number.isFinite(t.getTime())&&t.toISOString().slice(0,10)===e}function Yt(e){const[t="",n="0"]=String(e).toLowerCase().split("e");return Math.max(0,(t.split(".")[1]?.length??0)-Number(n))}function Kt(e,t){e.min!==void 0&&t<e.min&&v(e,"min",e.min),e.max!==void 0&&t>e.max&&v(e,"max",e.max),e.precision!==void 0&&Yt(t)>e.precision&&v(e,"precision",e.precision)}function Xt(e,t){je(t)||v(e,"date"),e.min!==void 0&&t<e.min&&v(e,"min",e.min),e.max!==void 0&&t>e.max&&v(e,"max",e.max)}function Jt(e){[e.min,e.max].some(t=>t!==void 0&&!Number.isFinite(t))&&v(e,"definition"),e.min!==void 0&&e.max!==void 0&&e.min>e.max&&v(e,"definition"),e.precision!==void 0&&(!Number.isInteger(e.precision)||e.precision<0||e.precision>15)&&v(e,"definition")}function Zt(e){[e.min,e.max].some(t=>t!==void 0&&!je(t))&&v(e,"definition"),e.min!==void 0&&e.max!==void 0&&e.min>e.max&&v(e,"definition")}function Qt(e,t){(!Array.isArray(t.options)||!t.options.length)&&v(t,"definition");const n=e.valueType==="text"?"string":e.valueType,r=new Set;for(const i of t.options)(!i||typeof i.value!==n||typeof i.value=="number"&&!Number.isFinite(i.value))&&v(t,"definition"),i.label!==void 0&&typeof i.label!="string"&&v(t,"definition"),r.has(i.value)&&v(t,"definition"),r.add(i.value)}function en(e){e.required!==void 0&&typeof e.required!="boolean"&&v(e,"definition"),[e.label,e.hint,e.unit].some(t=>t!==void 0&&typeof t!="string")&&v(e,"definition"),e.type==="boolean"&&[e.trueLabel,e.falseLabel].some(t=>t!==void 0&&typeof t!="string")&&v(e,"definition")}function Ge(e,t){(!t||typeof t!="object"||Array.isArray(t)||!["text","number","boolean","enum","date"].includes(t.type))&&v(t??{type:"text"},"definition"),en(t),(t.type==="number"||t.type==="boolean")&&e.valueType!==t.type&&v(t,"type"),(t.type==="text"||t.type==="date")&&e.valueType!=="text"&&v(t,"type"),t.type==="number"&&Jt(t),t.type==="text"&&t.maxLength!==void 0&&(!Number.isInteger(t.maxLength)||t.maxLength<0)&&v(t,"definition"),t.type==="date"&&Zt(t),t.type==="enum"&&Qt(e,t)}function tn(e,t,n){if(!e.editable)throw new f.ReportCellEditError("readonly");n&&Ge(e,n);const r=f.parseReportCellInput(e,t);return n?(n.required&&typeof r=="string"&&!r.trim()&&v(n,"required"),r===null||r===""?(n.required&&v(n,"required"),r):(n.type==="number"&&Kt(n,r),n.type==="date"&&Xt(n,r),n.type==="text"&&n.maxLength!==void 0&&[...String(r)].length>n.maxLength&&v(n,"length",n.maxLength),n.type==="enum"&&!n.options.some(i=>Object.is(i.value,r))&&v(n,"choice"),r)):r}class M extends Error{constructor(t){super(`Report calculation: ${t}`),this.code=t,this.name="ReportCalculationError"}}function Y(e){if(!e?.aborted)return;const t=new Error("Calculation cancelled");throw t.name="AbortError",t}async function ie(e,t=1){const n=Math.floor(e.scanned/2048);if(e.scanned+=t,e.scanned>e.maxScanned)throw new M("limit");Y(e.signal),Math.floor(e.scanned/2048)>n&&(await e.yieldToHost(),Y(e.signal))}function be(e){return e.table?.role==="header"?-Math.max(1,e.grid?.cells.length??1):e.table?.rowIndex??0}function Ae(e,t,n){if(![t.pageIndex,t.componentIndex,t.rowIndex,t.columnIndex].every(o=>Number.isSafeInteger(o)&&o>=0))throw new M("selection");const r=e.pages[t.pageIndex]?.components[t.componentIndex];if(!r?.grid||t.rowIndex>=r.grid.cells.length)throw new M("selection");const i=r.grid.colWidthsMm?.length??r.grid.cells.reduce((o,s)=>Math.max(o,s.length),1);if(t.columnIndex>=i)throw new M("selection");const a=r.table,l=e.pages[n.pageIndex]?.components[n.componentIndex]?.table;if(a&&l&&a.id===l.id){const o=l.columnKeys.indexOf(a.columnKeys[t.columnIndex]??"");if(o<0)throw new M("selection");return{grid:a.id,row:be(r)+t.rowIndex,column:o}}return{grid:`${t.pageIndex}:${t.componentIndex}`,row:t.rowIndex,column:t.columnIndex}}function nn(e,t,n){const r=Ae(e,t.anchor,t.anchor),i=Ae(e,t.focus,t.anchor);if(r.grid!==i.grid)throw new M("selection");const a=(Math.abs(r.row-i.row)+1)*(Math.abs(r.column-i.column)+1);if(!Number.isSafeInteger(a)||a>n)throw new M("limit");return{grid:r.grid,rowStart:Math.min(r.row,i.row),rowEnd:Math.max(r.row,i.row),columnStart:Math.min(r.column,i.column),columnEnd:Math.max(r.column,i.column),origin:e.pages[t.anchor.pageIndex].components[t.anchor.componentIndex].table}}function rn(e){if(!e)return!1;const t=e.replace(/"[^"]*"|\\.|\[(?![hms]+\])[^\]]*\]/gi,"");return/[ymdhs]/i.test(t)}function on(e){if(e.valueType==="text"||e.valueType==="boolean"||rn(e.numberFormat))return null;const t=e.value;if(typeof t!="number"||!Number.isFinite(t))return null;if(Number.isInteger(t)&&!Number.isSafeInteger(t))throw new M("precision");return t}function an(e,t,n){if(e.seen.has(n))return;e.seen.add(n),e.selected++;const r=t?on(t):null;r===null?e.excluded++:e.values.push(r)}function sn(e,t,n,r){return r.origin?e.table?.id===r.origin.id:`${t}:${n}`===r.grid}function ln(e,t,n){return n.origin?n.origin.columnKeys.indexOf(e.table.columnKeys[t]??""):t}function cn(e,t,n,r){const i=r.origin?be(e)+t:t,a=ln(e,n,r);return i<r.rowStart||i>r.rowEnd||a<r.columnStart||a>r.columnEnd?null:`${r.grid}:${i}:${a}`}function dn(e,t){const n=t.origin?be(e):0,r=Math.max(0,t.rowStart-n),i=Math.min(e.grid.cells.length,t.rowEnd-n+1);return i>r?i:0}async function mn(e,t,n,r,i){const a=e.grid;if(t>r.maxScanned)throw new M("limit");const l=a.colWidthsMm?.length??a.cells.reduce((s,c)=>Math.max(s,c.length),1);if(l>r.maxScanned)throw new M("limit");const o=new Map;for(let s=0;s<t;s++){s>0&&s%2048===0&&(await r.yieldToHost(),Y(r.signal));let c=0;for(const d of a.cells[s]){for(await ie(r);c<l&&(o.get(c)??0)>s;)c++;if(c>=l)break;const h=Math.max(1,Math.min(d?.colSpan??1,l-c)),m=Math.min(a.cells.length,s+Math.max(1,d?.rowSpan??1));h>1&&await ie(r,h-1);for(let p=c;p<c+h;p++)o.set(p,m);const u=cn(e,s,c,n);u&&an(i,d,u),c+=h}}}async function hn(e,t,n){const r={values:[],seen:new Set,excluded:0,selected:0};for(let i=0;i<e.pages.length;i++){await ie(n);const a=e.pages[i];for(let l=0;l<a.components.length;l++){await ie(n);const o=a.components[l];if(!o.grid||!sn(o,i,l,t)||o.table&&o.table.role!=="body")continue;const s=dn(o,t);s&&await mn(o,s,t,n,r)}}return r}function X(e){if(!Number.isFinite(e))throw new M("overflow");return e}function gn(e){let t=0,n=0;for(const r of e){const i=r-n,a=X(t+i);n=a-t-i,t=a}return t}async function Le(e,t){let n=[...e],r=new Array(e.length);for(let a=1;a<e.length;a*=2){for(let l=0;l<e.length;l+=a*2){const o=Math.min(l+a,e.length),s=Math.min(l+a*2,e.length);let c=l,d=o;for(let h=l;h<s;h++)r[h]=d>=s||c<o&&n[c]<=n[d]?n[c++]:n[d++],h%2048===0&&(await t.yieldToHost(),Y(t.signal))}[n,r]=[r,n]}const i=Math.floor(n.length/2);return n.length%2?n[i]:X(n[i-1]/2+n[i]/2)}function un(e){const t=gn(e);let n=1/0,r=-1/0;for(const i of e)n=Math.min(n,i),r=Math.max(r,i);return{SUM:t,AVERAGE:t/e.length,AVG:t/e.length,MIN:n,MAX:r,COUNT:e.length}}function Ve(e,t){if(typeof e!="string"||e.length>256)throw new M("expression");const n=e.toUpperCase().match(/(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?|[A-Z_]+|[()+\-*/]|\S/g)??[];if(!n.length||n.length>64)throw new M("expression");let r=0;function i(o){if(o>16)throw new M("expression");const s=n[r++];if(s==="+"||s==="-")return(s==="-"?-1:1)*i(o+1);if(s==="("){const c=a(0,o+1);if(n[r++]!==")")throw new M("expression");return c}if(s&&/^(?:SUM|AVERAGE|AVG|MIN|MAX|COUNT|MEDIAN)$/.test(s)&&Object.prototype.hasOwnProperty.call(t,s))return X(t[s]);if(s&&/^(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?$/.test(s))return X(Number(s));throw new M("expression")}function a(o,s){let c=i(s);for(;r<n.length;){const d=n[r],h=d==="+"||d==="-"?1:d==="*"||d==="/"?2:0;if(!h||h<o)break;r++;const m=a(h+1,s+1);if(d==="/"&&m===0)throw new M("division");c=X(d==="+"?c+m:d==="-"?c-m:d==="*"?c*m:c/m)}return c}const l=a(1,0);if(r!==n.length)throw new M("expression");return l}function pn(e){const t=e.maxCells??1e5,n=e.maxScannedCells??2e5,r=e.precision??2;if(![t,n].every(i=>Number.isSafeInteger(i)&&i>=1&&i<=2e6))throw new M("limit");if(!Number.isInteger(r)||r<0||r>12)throw new M("precision");return{maxCells:t,maxScanned:n,precision:r}}async function fn(e,t,n={}){const r=pn(n),i={scanned:0,maxScanned:r.maxScanned,signal:n.signal,yieldToHost:n.yieldToHost??(()=>new Promise(s=>setTimeout(s,0)))};Y(i.signal);const a=await hn(e,nn(e,t,r.maxCells),i),l=n.operation??"sum";if(!["sum","average","min","max","count","median","expression"].includes(l))throw new M("expression");let o=null;if(l==="count")o=a.values.length;else if(a.values.length)if(l==="median")o=await Le(a.values,i);else{const s=un(a.values);l==="expression"?(/\bMEDIAN\b/i.test(n.expression??"")&&(s.MEDIAN=await Le(a.values,i)),o=Ve(n.expression??"",s)):o=s[l.toUpperCase()]}if(Y(i.signal),o!==null&&Number.isInteger(o)&&!Number.isSafeInteger(o))throw new M("precision");return{value:o,formatted:o===null?"—":o.toFixed(r.precision),numericCells:a.values.length,excludedCells:a.excluded,selectedCells:a.selected,precision:r.precision}}class k extends Error{constructor(t,n){super(t),this.path=n,this.code="label-sheet",this.name="LabelSheetError"}}function ne(e){if(e?.aborted){const t=new Error("标签拼版已取消");throw t.name="AbortError",t}}function U(e,t,n=!1){if(!Number.isFinite(e)||e<=0||n&&!Number.isSafeInteger(e))throw new k("应为正有限数字,数量应为安全整数",t);return e}function ke(e,t){if(!Number.isFinite(e)||e<0)throw new k("应为非负有限数字",t);return e}function wn(e){const t=typeof e.marginMm=="object"?e.marginMm:{top:e.marginMm??0,left:e.marginMm??0,bottom:e.marginMm??0,right:e.marginMm??0},n=typeof e.gapMm=="object"?e.gapMm:{horizontal:e.gapMm??0,vertical:e.gapMm??0};for(const r of["top","left","bottom","right"])ke(t?.[r],`$.marginMm.${r}`);for(const r of["horizontal","vertical"])ke(n?.[r],`$.gapMm.${r}`);return{margin:t,gap:n}}function vn(e){const t=e.paper===void 0||e.paper==="a4"?{widthMm:210,heightMm:297}:e.paper;U(t.widthMm,"$.paper.widthMm"),U(t.heightMm,"$.paper.heightMm");const n=U(e.columns,"$.columns",!0),r=U(e.rows,"$.rows",!0),i=n*r;if(i>1e3)throw new k("每张纸不能超过 1000 个位置","$.columns");const{margin:a,gap:l}=wn(e),o=e.startSlot??0,s=e.offsetMm??{x:0,y:0};if(!Number.isSafeInteger(o)||o<0||o>=i)throw new k("起始位置应在首张纸的有效位置内","$.startSlot");if(!Number.isFinite(s.x)||!Number.isFinite(s.y))throw new k("校准偏移应为有限毫米值","$.offsetMm");return{paper:t,columns:n,rows:r,capacity:i,margin:a,gap:l,startSlot:o,offset:s}}function Ye(e){return 1+(e.grid?.cells.reduce((t,n)=>t+n.length+1+n.reduce((r,i)=>r+(i?.children?.reduce((a,l)=>a+Ye(l),0)??0),0),0)??0)}function Mn(e,t,n){if(!y.validateRenderPlan(e).ok)throw new k("标签计划无效","$.plan");const r=e.pages[0];if(!r)return;const{paper:i,columns:a,rows:l,margin:o,gap:s,offset:c}=n;if(o.left+c.x<0||o.top+c.y<0||o.left+c.x+a*r.pageWidthMm+(a-1)*s.horizontal+o.right>i.widthMm+1e-6||o.top+c.y+l*r.pageHeightMm+(l-1)*s.vertical+o.bottom>i.heightMm+1e-6)throw new k("标签、间距、边距及校准偏移超过纸张尺寸;不会自动缩小标签","$.paper");let d=0;for(const[h,m]of e.pages.entries()){if(ne(t.signal),m.layout==="wide"||m.pageWidthMm!==r.pageWidthMm||m.pageHeightMm!==r.pageHeightMm)throw new k("拼版需要尺寸相同的固定标签页面",`$.pages.${h}`);if(d+=m.components.reduce((u,p)=>u+Ye(p),0),d>U(t.maxComponents??25e4,"$.maxComponents",!0))throw new k("拼版组件总量超过预算","$.maxComponents");for(const u of m.components)if(u.leftMm<0||u.topMm<0||u.leftMm+u.widthMm>m.pageWidthMm+1e-6||u.topMm+u.heightMm>m.pageHeightMm+1e-6)throw new k("标签内容超出标签边界",`$.pages.${h}.components`)}}function yn(e,t){ne(t.signal);const n=vn(t),{paper:r,columns:i,capacity:a,margin:l,gap:o,startSlot:s,offset:c}=n,d=e.pages.length?Math.ceil((s+e.pages.length)/a):0;if(d>U(t.maxSheets??1e4,"$.maxSheets",!0))throw new k("拼版纸张数量超过预算","$.maxSheets");U(t.maxComponents??25e4,"$.maxComponents",!0),Mn(e,t,n);const h=f.snapshotReportJson(e,{maxBytes:U(t.maxSnapshotBytes??64e6,"$.maxSnapshotBytes",!0),check:()=>ne(t.signal),error:(u,p)=>new k(p,"$.maxSnapshotBytes")}),m=Array.from({length:d},()=>({pageWidthMm:r.widthMm,pageHeightMm:r.heightMm,components:[],meta:{labelSheet:{columns:i,rows:n.rows,slots:[]}}}));for(const[u,p]of h.pages.entries()){ne(t.signal);const P=s+u,L=P%a,b=m[Math.floor(P/a)],S=l.left+c.x+L%i*(p.pageWidthMm+o.horizontal),I=l.top+c.y+Math.floor(L/i)*(p.pageHeightMm+o.vertical),j={sourcePageIndex:u,slotIndex:L,xMm:S,yMm:I,widthMm:p.pageWidthMm,heightMm:p.pageHeightMm,...p.meta?{sourceMeta:p.meta}:{}};b.meta.labelSheet.slots.push(j),b.components.push(...p.components.map(_=>({..._,leftMm:_.leftMm+S,topMm:_.topMm+I,meta:{..._.meta,labelSheet:j}})))}return{...h,pages:m}}exports.CSS_DPI=g.CSS_DPI;exports.DEFAULT_BORDER_PT=g.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_FAMILY=g.DEFAULT_FONT_FAMILY;exports.DEFAULT_FONT_PT=g.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=g.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=g.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=g.LINE_HEIGHT;exports.MM_PER_INCH=g.MM_PER_INCH;exports.PAPER_SIZES=g.PAPER_SIZES;exports.SCHEMA_VERSION_MACH=g.SCHEMA_VERSION_MACH;exports.mergeComponentStyles=g.mergeComponentStyles;exports.mmToPx=g.mmToPx;exports.mmToPxFactor=g.mmToPxFactor;exports.ptToPx=g.ptToPx;exports.pxToMm=g.pxToMm;exports.resolveBoxBorders=g.resolveBoxBorders;exports.resolveFontSize=g.resolveFontSize;exports.resolveLineHeight=g.resolveLineHeight;exports.resolveStroke=g.resolveStroke;exports.resolveTextColor=g.resolveTextColor;exports.round=g.round;exports.ReportBindingError=G.ReportBindingError;exports.evalStyleRule=G.evalStyleRule;exports.formatValue=G.formatValue;exports.parseDateLocal=G.parseDateLocal;exports.resolveComponentBinding=G.resolveComponentBinding;exports.toExcelNumberFormat=G.toExcelNumberFormat;exports.toNumber=G.toNumber;exports.RENDER_PLAN_SCHEMA_VERSION=q.RENDER_PLAN_SCHEMA_VERSION;exports.isImageBackedComponent=q.isImageBackedComponent;exports.isRichText=q.isRichText;exports.REPORT_TEMPLATE_DOCUMENT_VERSION=y.REPORT_TEMPLATE_DOCUMENT_VERSION;exports.ReportTemplateError=y.ReportTemplateError;exports.assertRenderPlan=y.assertRenderPlan;exports.createTemplateRegistry=y.createTemplateRegistry;exports.defineReportTemplate=y.defineReportTemplate;exports.parseReportTemplate=y.parseReportTemplate;exports.serializeReportTemplate=y.serializeReportTemplate;exports.validateComponent=y.validateComponent;exports.validatePage=y.validatePage;exports.validateRenderPlan=y.validateRenderPlan;exports.validateReportTemplate=y.validateReportTemplate;exports.validateReportTemplateDocument=y.validateReportTemplateDocument;exports.datasetJsonSchema=me.datasetJsonSchema;exports.validateDatasetRows=me.validateDatasetRows;exports.charWidthEm=O.charWidthEm;exports.createCanvasMeasurer=O.createCanvasMeasurer;exports.createHeuristicMeasurer=O.createHeuristicMeasurer;exports.heuristicMeasurer=O.heuristicMeasurer;exports.measureTextMm=O.measureTextMm;exports.wrapText=O.wrapText;exports.DEFAULT_LABEL_PAGE_LIMIT=f.DEFAULT_LABEL_PAGE_LIMIT;exports.PaginateCellLimitError=f.PaginateCellLimitError;exports.PaginatePageLimitError=f.PaginatePageLimitError;exports.ReportCellEditError=f.ReportCellEditError;exports.ReportSourceError=f.ReportSourceError;exports.applyReportCellEdit=f.applyReportCellEdit;exports.applyReportCellEditBatch=f.applyReportCellEditBatch;exports.applyReportEditResult=f.applyReportEditResult;exports.applyReportSourceMetadata=f.applyReportSourceMetadata;exports.countTemplatePages=f.countTemplatePages;exports.createReportCellEdit=f.createReportCellEdit;exports.createReportCellEditBatch=f.createReportCellEditBatch;exports.createReportCellResolver=f.createReportCellResolver;exports.createReportEditSession=f.createReportEditSession;exports.createReportSource=f.createReportSource;exports.defineReport=f.defineReport;exports.estimateListLayoutCells=f.estimateListLayoutCells;exports.formatReportCellEdit=f.formatReportCellEdit;exports.getReportCellContext=f.getReportCellContext;exports.getReportEditSession=f.getReportEditSession;exports.hasValidDataExplanation=f.hasValidDataExplanation;exports.isReportDataTarget=f.isReportDataTarget;exports.isReportValueState=f.isReportValueState;exports.paginateTemplate=f.paginateTemplate;exports.paginateTemplatePages=f.paginateTemplatePages;exports.parseReportCellInput=f.parseReportCellInput;exports.projectListColumns=f.projectListColumns;exports.registerReportEditSession=f.registerReportEditSession;exports.relocateReportCellEdits=f.relocateReportCellEdits;exports.reportCellEditKey=f.reportCellEditKey;exports.summarizeReportCellEdits=f.summarizeReportCellEdits;exports.resolveGridLayout=he.resolveGridLayout;exports.OutputFidelityError=W.OutputFidelityError;exports.inspectOutputCapabilities=W.inspectOutputCapabilities;exports.reportOutputDiagnostics=W.reportOutputDiagnostics;exports.OutputAssetError=J.OutputAssetError;exports.resolvePlanAssets=J.resolvePlanAssets;exports.ReportDrillError=K.ReportDrillError;exports.createReportDrillRequest=K.createReportDrillRequest;exports.matchReportDrillActions=K.matchReportDrillActions;exports.resolveReportDrillReturn=K.resolveReportDrillReturn;exports.validateReportDrillActions=K.validateReportDrillActions;exports.ReportParamValidationError=z.ReportParamValidationError;exports.assertReportParams=z.assertReportParams;exports.formatReportDateRange=z.formatReportDateRange;exports.isReportDate=z.isReportDate;exports.isReportMonth=z.isReportMonth;exports.isReportYear=z.isReportYear;exports.parseReportDateRange=z.parseReportDateRange;exports.reportParamsJsonSchema=z.reportParamsJsonSchema;exports.validateReportParamDefinitions=z.validateReportParamDefinitions;exports.validateReportParams=z.validateReportParams;exports.cloneReportTemplate=Z.cloneReportTemplate;exports.createLocalTemplateCatalog=Z.createLocalTemplateCatalog;exports.diffReportTemplates=Z.diffReportTemplates;exports.reviewReportTemplate=Z.reviewReportTemplate;exports.reviewReportTemplateAsync=Z.reviewReportTemplateAsync;exports.collectTemplateOutline=ue.collectTemplateOutline;exports.inspectTemplateFieldUsage=ue.inspectTemplateFieldUsage;exports.templatePathLocation=ue.templatePathLocation;exports.applyReportDocumentStyle=oe.applyReportDocumentStyle;exports.captureTemplateFragment=oe.captureTemplateFragment;exports.insertTemplateFragment=oe.insertTemplateFragment;exports.inspectTemplateFragmentBindings=oe.inspectTemplateFragmentBindings;exports.TreeRowLimitError=pe.TreeRowLimitError;exports.createTreeTable=pe.createTreeTable;exports.validateTreeOptions=pe.validateTreeOptions;exports.LabelSheetError=k;exports.PageBuilder=qe;exports.ReportCalculationError=M;exports.ReportCellFieldError=Ue;exports.ReportTemplateStoreError=N;exports.TemplateBuilder=We;exports.calculateReportSelection=fn;exports.classOf=C;exports.columnsFromContract=Lt;exports.computePageWindow=Oe;exports.createCanvasPager=Pt;exports.createLabelTemplate=Ht;exports.createMemoryTemplateStore=Ut;exports.createProviderReport=Wt;exports.createTableTemplate=_t;exports.createTemplate=At;exports.createTemplateManager=qt;exports.defineLabelReport=Bt;exports.evaluateReportAggregateExpression=Ve;exports.formatReportClipboard=jt;exports.imposeLabelSheets=yn;exports.measurePageSizePx=ae;exports.parseReportCellFieldInput=tn;exports.parseReportClipboard=Vt;exports.planFontSizePx=wt;exports.renderComponent=fe;exports.renderPage=Ne;exports.renderPlan=dt;exports.renderPlanToCanvas=Rt;exports.renderPlanToCanvasAsync=Ct;exports.renderPlanToImages=Et;exports.resolvePaper=ye;exports.validateReportCellFieldDefinition=Ge;
|
package/dist/index.d.cts
CHANGED
|
@@ -22,6 +22,9 @@ export declare function applyReportDocumentStyle(input: ReportTemplateDocument,
|
|
|
22
22
|
/** Refresh concurrency metadata without changing values, layout, or the host's source objects. */
|
|
23
23
|
export declare function applyReportEditResult(plan: RenderPlan, batch: ReportEditBatch, result: void | ReportEditResult): RenderPlan;
|
|
24
24
|
|
|
25
|
+
/** Session-owned receipts survive reflow even when host rows have no concurrency fields. */
|
|
26
|
+
export declare function applyReportSourceMetadata(plan: RenderPlan, metadata: ReadonlyMap<string, ReportEditResult>): RenderPlan;
|
|
27
|
+
|
|
25
28
|
export declare function assertRenderPlan(input: unknown): PlanPage[];
|
|
26
29
|
|
|
27
30
|
export declare function assertReportParams(defs: readonly ReportParamDef[], input?: Record<string, unknown>): Record<string, string>;
|
|
@@ -37,7 +40,7 @@ export declare interface AssetRenderBudget {
|
|
|
37
40
|
maxDurationMs?: number;
|
|
38
41
|
}
|
|
39
42
|
|
|
40
|
-
export declare interface AssetRenderOptions extends OutputDiagnosticOptions {
|
|
43
|
+
export declare interface AssetRenderOptions extends OutputDiagnosticOptions, ImageMediaOptions {
|
|
41
44
|
assetRenderers?: Partial<Record<ImageComponentKind, ComponentImageRenderer>>;
|
|
42
45
|
assetBudget?: AssetRenderBudget;
|
|
43
46
|
/** Default throw prevents an incomplete export; placeholder retains the component and emits diagnostics. */
|
|
@@ -275,6 +278,9 @@ export declare function createReportCellEditBatch(plan: RenderPlan, inputs: read
|
|
|
275
278
|
/** Operation-scoped index: avoids repeated geometry work without caching mutable plans globally. */
|
|
276
279
|
export declare function createReportCellResolver(plan: RenderPlan): (address: ReportCellAddress) => ReportCellContext | null;
|
|
277
280
|
|
|
281
|
+
/** Revalidates the current cell on activation; returns only bounded scalar values and explicit return state. */
|
|
282
|
+
export declare function createReportDrillRequest(plan: RenderPlan, address: ReportCellAddress, action: ReportDrillAction, params?: Readonly<Record<string, string>>): ReportDrillRequest;
|
|
283
|
+
|
|
278
284
|
/** Optional standalone entry; normal createReportSource/createLocalFetcher already register it. */
|
|
279
285
|
export declare function createReportEditSession(options: {
|
|
280
286
|
template: ReportTemplate;
|
|
@@ -442,6 +448,8 @@ export declare function getReportCellContext(plan: RenderPlan, address: ReportCe
|
|
|
442
448
|
export declare function getReportEditSession(plan: RenderPlan): ReportEditSession | undefined;
|
|
443
449
|
|
|
444
450
|
export declare interface GridCell {
|
|
451
|
+
/** Styled cell content; text remains a plain-text fallback. Imported rich cells are read-only. */
|
|
452
|
+
richParagraphs?: RichParagraph[];
|
|
445
453
|
text?: string;
|
|
446
454
|
rawText?: string;
|
|
447
455
|
/** 原始值,仅供 Excel raw 模式消费;不参与预览、分页与 PDF 绘制。 */
|
|
@@ -508,6 +516,19 @@ export declare const heuristicMeasurer: TextMeasurer;
|
|
|
508
516
|
|
|
509
517
|
export declare type ImageComponentKind = "image" | "chart" | "barcode" | "qrcode";
|
|
510
518
|
|
|
519
|
+
/** Bounded binary image inspection shared by PDF, Excel and template import. No decoder is loaded. */
|
|
520
|
+
declare interface ImageMediaOptions {
|
|
521
|
+
maxImageBytes?: number;
|
|
522
|
+
maxTotalImageBytes?: number;
|
|
523
|
+
maxImages?: number;
|
|
524
|
+
/** Decoded pixels per unique image, default 16 million. */
|
|
525
|
+
maxImagePixels?: number;
|
|
526
|
+
/** Total decoded pixels for unique media, default 64 million. */
|
|
527
|
+
maxTotalImagePixels?: number;
|
|
528
|
+
/** Maximum source dimension, default 16384 pixels. */
|
|
529
|
+
maxImageDimension?: number;
|
|
530
|
+
}
|
|
531
|
+
|
|
511
532
|
export declare interface ImageRenderOptions extends AsyncCanvasRenderOptions {
|
|
512
533
|
/** 图片格式(默认 png;jpeg 体积更小但无透明) */
|
|
513
534
|
format?: "png" | "jpeg";
|
|
@@ -755,6 +776,9 @@ export declare interface LocalTemplateCatalogItem {
|
|
|
755
776
|
tags?: string[];
|
|
756
777
|
}
|
|
757
778
|
|
|
779
|
+
/** O(action count), no row scans or listeners per cell; invoke for the focused cell only. */
|
|
780
|
+
export declare function matchReportDrillActions(plan: RenderPlan, address: ReportCellAddress, actions: readonly ReportDrillAction[]): ReportDrillAction[];
|
|
781
|
+
|
|
758
782
|
declare interface MatrixTableOptions {
|
|
759
783
|
rowFields: readonly string[];
|
|
760
784
|
columnFields: readonly string[];
|
|
@@ -794,7 +818,7 @@ export declare class OutputAssetError extends Error {
|
|
|
794
818
|
}
|
|
795
819
|
|
|
796
820
|
export declare interface OutputDiagnostic {
|
|
797
|
-
code: "missing-image" | "unsupported-component" | "unsupported-image-format" | "unsupported-style" | "rich-text-flattened" | "nested-components-omitted" | "async-image-required" | "image-decode-failed" | "asset-render-failed" | "asset-budget-exceeded";
|
|
821
|
+
code: "invalid-image-data" | "image-budget-exceeded" | "component-render-failed" | "unsupported-text" | "output-degraded" | "missing-image" | "unsupported-component" | "unsupported-image-format" | "unsupported-style" | "rich-text-flattened" | "nested-components-omitted" | "async-image-required" | "image-decode-failed" | "asset-render-failed" | "asset-budget-exceeded";
|
|
798
822
|
severity: "warning";
|
|
799
823
|
format: OutputFormat;
|
|
800
824
|
pageIndex: number;
|
|
@@ -1017,7 +1041,7 @@ export declare function ptToPx(pt: number, dpi?: number): number;
|
|
|
1017
1041
|
|
|
1018
1042
|
export declare function pxToMm(value: number, dpi?: number): number;
|
|
1019
1043
|
|
|
1020
|
-
/** Registers
|
|
1044
|
+
/** Registers a bounded descriptor guard. Immutable strings are retained, never rescanned character by character. */
|
|
1021
1045
|
export declare function registerReportEditSession(initial: RenderPlan, registration: ReportEditSessionRegistration): ReportEditSession;
|
|
1022
1046
|
|
|
1023
1047
|
/** Reflow changes coordinates; history targets are resolved by business source every time. */
|
|
@@ -1180,6 +1204,8 @@ export declare type ReportCellReadOnlyReason = "cell" | "formula" | "complex" |
|
|
|
1180
1204
|
|
|
1181
1205
|
/** 可持久化的业务身份与计划坐标独立;权限及并发校验仍由业务服务器执行。 */
|
|
1182
1206
|
export declare interface ReportCellSource {
|
|
1207
|
+
/** Source identity across report occurrences; sharing must be explicitly declared. */
|
|
1208
|
+
sourceScope?: string;
|
|
1183
1209
|
datasetId: string;
|
|
1184
1210
|
rowKey: string | number;
|
|
1185
1211
|
field: string;
|
|
@@ -1205,6 +1231,8 @@ export declare interface ReportDataTarget {
|
|
|
1205
1231
|
rowKey?: string | number;
|
|
1206
1232
|
/** Use table identity when the same dataset appears in several tables. */
|
|
1207
1233
|
tableId?: string;
|
|
1234
|
+
/** Assigned by the source/runtime when several reports share dataset names. */
|
|
1235
|
+
reportScope?: string;
|
|
1208
1236
|
}
|
|
1209
1237
|
|
|
1210
1238
|
/** Wire values deliberately remain strings in browsers, Workers and backend runtimes. */
|
|
@@ -1214,6 +1242,8 @@ export declare interface ReportDateRange {
|
|
|
1214
1242
|
}
|
|
1215
1243
|
|
|
1216
1244
|
export declare interface ReportDefinition {
|
|
1245
|
+
/** Explicitly shared editable data identity. Omit to isolate each report occurrence. */
|
|
1246
|
+
sourceScope?: string;
|
|
1217
1247
|
/** 静态模板或宿主提供的异步模板加载器;动态模板默认每次重新读取,不缓存版本。 */
|
|
1218
1248
|
template: ReportTemplate | ReportTemplateLoader;
|
|
1219
1249
|
/** 静态数据;load 存在时优先使用 load 的结果。 */
|
|
@@ -1251,6 +1281,46 @@ export declare interface ReportDocumentStyle {
|
|
|
1251
1281
|
target?: "content" | "header";
|
|
1252
1282
|
}
|
|
1253
1283
|
|
|
1284
|
+
/** Serializable action metadata. URLs, scripts and automatic navigation are deliberately absent. */
|
|
1285
|
+
export declare interface ReportDrillAction {
|
|
1286
|
+
id: string;
|
|
1287
|
+
label: string;
|
|
1288
|
+
target: {
|
|
1289
|
+
field: string;
|
|
1290
|
+
datasetId?: string;
|
|
1291
|
+
reportScope?: string;
|
|
1292
|
+
roles?: readonly string[];
|
|
1293
|
+
};
|
|
1294
|
+
params?: Readonly<Record<string, ReportDrillBinding>>;
|
|
1295
|
+
}
|
|
1296
|
+
|
|
1297
|
+
export declare type ReportDrillBinding = {
|
|
1298
|
+
value: string | number | boolean;
|
|
1299
|
+
} | {
|
|
1300
|
+
from: "value" | "rowKey";
|
|
1301
|
+
} | {
|
|
1302
|
+
from: "query" | "field";
|
|
1303
|
+
field: string;
|
|
1304
|
+
};
|
|
1305
|
+
|
|
1306
|
+
export declare class ReportDrillError extends Error {
|
|
1307
|
+
readonly code: "config" | "missing-value" | "target";
|
|
1308
|
+
constructor(code: "config" | "missing-value" | "target");
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
export declare interface ReportDrillRequest {
|
|
1312
|
+
actionId: string;
|
|
1313
|
+
params: Readonly<Record<string, string>>;
|
|
1314
|
+
returnState: Readonly<ReportDrillReturnState>;
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1317
|
+
export declare interface ReportDrillReturnState {
|
|
1318
|
+
params: Readonly<Record<string, string>>;
|
|
1319
|
+
address: Readonly<ReportCellAddress>;
|
|
1320
|
+
reportScope?: string;
|
|
1321
|
+
source?: Readonly<Pick<ReportCellSource, "sourceScope" | "datasetId" | "rowKey" | "field">>;
|
|
1322
|
+
}
|
|
1323
|
+
|
|
1254
1324
|
export declare interface ReportEditBatch {
|
|
1255
1325
|
/** Idempotency identity; the server should bind it to the exact payload. */
|
|
1256
1326
|
requestId: string;
|
|
@@ -1286,6 +1356,7 @@ export declare interface ReportEditSession {
|
|
|
1286
1356
|
declare interface ReportEditSessionPart {
|
|
1287
1357
|
template: ReportTemplate;
|
|
1288
1358
|
datasets: DatasetRows;
|
|
1359
|
+
sourceScope?: string;
|
|
1289
1360
|
}
|
|
1290
1361
|
|
|
1291
1362
|
export declare interface ReportEditSessionRegistration {
|
|
@@ -1376,6 +1447,10 @@ export declare interface ReportParamDef {
|
|
|
1376
1447
|
label: string;
|
|
1377
1448
|
value: string;
|
|
1378
1449
|
}>;
|
|
1450
|
+
/** Opaque host-resolved source key. No URL, credentials or executable code is stored. */
|
|
1451
|
+
optionsSource?: string;
|
|
1452
|
+
/** Select dependencies must be declared parameters; changing a parent clears descendants. */
|
|
1453
|
+
dependsOn?: string[];
|
|
1379
1454
|
defaultValue?: string;
|
|
1380
1455
|
required?: boolean;
|
|
1381
1456
|
placeholder?: string;
|
|
@@ -1393,7 +1468,7 @@ export declare interface ReportParamIssue {
|
|
|
1393
1468
|
message: string;
|
|
1394
1469
|
}
|
|
1395
1470
|
|
|
1396
|
-
export declare type ReportParamIssueCode = "definition" | "required" | "type" | "option" | "minimum" | "maximum" | "minLength" | "maxLength";
|
|
1471
|
+
export declare type ReportParamIssueCode = "definition" | "required" | "type" | "option" | "dependency" | "minimum" | "maximum" | "minLength" | "maxLength";
|
|
1397
1472
|
|
|
1398
1473
|
/** 描述 typedValues 的 Draft 2020-12 Schema;日期区间额外保留 x-report-* 扩展。 */
|
|
1399
1474
|
export declare function reportParamsJsonSchema(defs: readonly ReportParamDef[]): Record<string, unknown>;
|
|
@@ -1802,6 +1877,9 @@ export declare interface ResolvePlanAssetsOptions extends AssetRenderOptions {
|
|
|
1802
1877
|
end?: number;
|
|
1803
1878
|
}
|
|
1804
1879
|
|
|
1880
|
+
/** Resolve a stable business cell after requery/reordering; missing rows never fall back to another row. */
|
|
1881
|
+
export declare function resolveReportDrillReturn(plan: RenderPlan, state: ReportDrillReturnState): ReportCellAddress | null;
|
|
1882
|
+
|
|
1805
1883
|
/** 描边解析:颜色 + 线宽(pt) */
|
|
1806
1884
|
export declare function resolveStroke(style: Pick<ComponentStyle, "borderColor" | "lineColor" | "lineWidthPt"> | undefined, fallbackColor?: string): {
|
|
1807
1885
|
color: string;
|
|
@@ -2073,6 +2151,8 @@ export declare function validateRenderPlan(input: unknown): ValidationResult;
|
|
|
2073
2151
|
/** Check configuration before opening an input, including JSON/JavaScript callers. */
|
|
2074
2152
|
export declare function validateReportCellFieldDefinition(context: ReportCellContext, field: ReportCellFieldOptions): void;
|
|
2075
2153
|
|
|
2154
|
+
export declare function validateReportDrillActions(actions: readonly ReportDrillAction[]): void;
|
|
2155
|
+
|
|
2076
2156
|
/** 模板参数配置错误也统一返回结构化问题,不让无效默认值或边界静默进入后端。 */
|
|
2077
2157
|
export declare function validateReportParamDefinitions(defs: readonly ReportParamDef[]): ReportParamIssue[];
|
|
2078
2158
|
|