@agile-team/mach-report 2.13.0 → 2.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/README.md +10 -2
  2. package/dist/ExcelBindingWizard-CLT2p7P3.cjs +1 -0
  3. package/dist/ExcelBindingWizard-CvsWR8Ga.js +1485 -0
  4. package/dist/{ParamEditor-BLaE5q5W.js → ParamEditor-CflQV3eQ.js} +191 -187
  5. package/dist/ParamEditor-vIDzvpPV.cjs +1 -0
  6. package/dist/ReportBatchPanel-DkxTzBkD.cjs +1 -0
  7. package/dist/{ReportBatchPanel-CW2HV9I8.js → ReportBatchPanel-LqVgiqp7.js} +3 -3
  8. package/dist/ReportPreview-CvbqLUzM.cjs +6 -0
  9. package/dist/ReportPreview-D_ywJ_-H.js +4533 -0
  10. package/dist/{ReportTemplateLibrary-BZB-XWjj.js → ReportTemplateLibrary-MjWEtc7X.js} +1 -1
  11. package/dist/ReportTemplateLibrary-cQ1sqNYo.cjs +1 -0
  12. package/dist/RuleEditor-BaR6xUiI.cjs +1 -0
  13. package/dist/RuleEditor-ChuXMlei.js +2037 -0
  14. package/dist/TemplateOutlinePanel-BHKP89Xz.cjs +1 -0
  15. package/dist/TemplateOutlinePanel-Dci6aRn1.js +96 -0
  16. package/dist/TemplateReusePanel-B7Gmyc1z.js +388 -0
  17. package/dist/TemplateReusePanel-CY5eO2Sh.cjs +1 -0
  18. package/dist/TemplateReviewPanel-DjlX3xpt.js +592 -0
  19. package/dist/TemplateReviewPanel-JvZe9_4G.cjs +1 -0
  20. package/dist/{batch-mRqhhhjt.js → batch-DzaTNLWI.js} +23 -16
  21. package/dist/batch-xMkqYiTr.cjs +1 -0
  22. package/dist/config-0UIohTS7.cjs +1 -0
  23. package/dist/{config-XVwG87IA.js → config-Dt9NtCPl.js} +223 -186
  24. package/dist/data-explanation-BktvER5B.cjs +1 -0
  25. package/dist/data-explanation-C_J6jYNi.js +16 -0
  26. package/dist/designer-Ci1LizA9.js +5020 -0
  27. package/dist/designer-rtmVIIdN.cjs +2 -0
  28. package/dist/designer.cjs +1 -2
  29. package/dist/designer.d.cts +290 -3
  30. package/dist/designer.d.ts +290 -3
  31. package/dist/designer.js +21 -4312
  32. package/dist/font-loader-DHto6Lra.js +297 -0
  33. package/dist/font-loader-vhCT8znW.cjs +1 -0
  34. package/dist/index.cjs +8 -8
  35. package/dist/index.d.cts +157 -1
  36. package/dist/index.d.ts +157 -1
  37. package/dist/index.js +720 -639
  38. package/dist/{template-review-PgEe_Wr9.js → json-snapshot-BeFT3Tso.js} +795 -585
  39. package/dist/json-snapshot-D1NTP2oI.cjs +2 -0
  40. package/dist/pdf-8UPQebOE.js +36288 -0
  41. package/dist/pdf-AyJGb22z.cjs +101 -0
  42. package/dist/pdf.cjs +1 -101
  43. package/dist/pdf.js +9 -36579
  44. package/dist/plugin-BGKf-Tqg.js +22 -0
  45. package/dist/{plugin-DzS6pxTA.cjs → plugin-CktLH_Iy.cjs} +1 -1
  46. package/dist/{region-binding-workflow-CcUq8W2Q.js → region-binding-workflow-DEJbhpCv.js} +1 -1
  47. package/dist/server/node.d.cts +46 -11
  48. package/dist/server/node.d.ts +46 -11
  49. package/dist/server-node.cjs +1 -1
  50. package/dist/server-node.js +294 -280
  51. package/dist/server.cjs +1 -1
  52. package/dist/server.d.cts +107 -12
  53. package/dist/server.d.ts +107 -12
  54. package/dist/server.js +711 -451
  55. package/dist/style.css +1 -1
  56. package/dist/template-bindings-BJR4k7qZ.cjs +1 -0
  57. package/dist/template-bindings-Daui7hLF.js +252 -0
  58. package/dist/template-fragments-CLkGo6To.js +187 -0
  59. package/dist/template-fragments-DFUpq5QM.cjs +1 -0
  60. package/dist/template-outline-B3xVkzSv.cjs +1 -0
  61. package/dist/template-outline-CFenM1PV.js +88 -0
  62. package/dist/{template-registry-BjE1VS6g.js → template-registry-COXDEJEM.js} +1 -1
  63. package/dist/{useLocalDraft-C07SYRnC.js → useLocalDraft-BnhcxXk_.js} +1 -1
  64. package/dist/{useLocalDraft-Yiw1wFgI.cjs → useLocalDraft-CioIfDb6.cjs} +1 -1
  65. package/dist/{validate-DbgEM1Hh.js → validate-CkQBWCeg.js} +3 -3
  66. package/dist/vue/async.d.cts +68 -2
  67. package/dist/vue/async.d.ts +68 -2
  68. package/dist/vue/index.d.cts +117 -3
  69. package/dist/vue/index.d.ts +117 -3
  70. package/dist/vue-async.cjs +1 -1
  71. package/dist/vue-async.js +5 -5
  72. package/dist/vue.cjs +1 -1
  73. package/dist/vue.js +78 -71
  74. package/dist/{workbook-session-BPb3TMnT.js → workbook-session-BfK1yHOO.js} +1 -1
  75. package/dist/worker.cjs +1 -1
  76. package/dist/worker.d.cts +46 -11
  77. package/dist/worker.d.ts +46 -11
  78. package/dist/worker.js +59 -55
  79. package/dist/xlsx.js +3 -3
  80. package/package.json +1 -1
  81. package/dist/ExcelBindingWizard-CeAf4QSE.js +0 -1465
  82. package/dist/ExcelBindingWizard-y0mT-AHR.cjs +0 -1
  83. package/dist/ParamEditor-MBBC7lUE.cjs +0 -1
  84. package/dist/ReportBatchPanel-Fp1ePFag.cjs +0 -1
  85. package/dist/ReportPreview-BN6fk7Wz.cjs +0 -6
  86. package/dist/ReportPreview-D2Jkyh1U.js +0 -4243
  87. package/dist/ReportTemplateLibrary-5fk5CQBO.cjs +0 -1
  88. package/dist/RuleEditor-ChRzNQuF.cjs +0 -1
  89. package/dist/RuleEditor-DzAmW5YH.js +0 -2024
  90. package/dist/TemplateReviewPanel-BKofGrV9.js +0 -222
  91. package/dist/TemplateReviewPanel-DwtOcLue.cjs +0 -1
  92. package/dist/batch-Bt3Fd27Z.cjs +0 -1
  93. package/dist/config-Bb7RiIO5.cjs +0 -1
  94. package/dist/plugin-D4wizDXB.js +0 -22
  95. package/dist/record-bindings-By_UKZ2g.cjs +0 -1
  96. package/dist/record-bindings-D-5jQlTj.js +0 -196
  97. package/dist/template-review-DGwWOoCv.cjs +0 -2
package/dist/index.cjs CHANGED
@@ -1,9 +1,9 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const I=require("./defaults-xhmcLLrf.cjs"),j=require("./record-bindings-By_UKZ2g.cjs"),u=require("./style-UgIJSA1F.cjs"),W=require("./render-plan-7xpGrCEl.cjs"),ee=require("./validate-BJ5HIWY8.cjs"),oe=require("./dataset-BkRmwgeJ.cjs"),C=require("./assets-C2U-e-Sz.cjs"),p=require("./template-review-DGwWOoCv.cjs"),ae=require("./grid-geometry-CZ_cYB6O.cjs"),Te=require("./grid-strokes-Cr7DwUux.cjs"),$=require("./capabilities-CsZ-pNHR.cjs"),We=require("./progress-BnLiS5eH.cjs"),je=require("./page-window-index-DEjnM6IB.cjs"),b=require("./template-registry-D3SjENi6.cjs"),H=require("./param-validation-DCK039V1.cjs"),se=require("./tree-BX380Rr7.cjs"),Ue={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 S(e,t){return t?.classNames?.[e]??Ue[e]}class qe{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,`${u.round(u.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 T(e,t="unset"){return new qe().add("all",t).add("display",e).add("box-sizing","border-box")}function Re(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(u.resolveLineHeight(t))).add("text-align",t.align);const r=u.resolveFontSize(t,n);e.add("font-size",`${u.round(r.fontSizePx,2)}px`)}function Ge(e,t,n){const r=t.style??{};Re(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 Ve(e,t,n,r,i,o){const s=e.cell,a=o.createElement("td");a.className=S("cell",i),a.dataset.mrRowIndex=String(e.ri),a.dataset.mrColumnIndex=String(e.ci),a.setAttribute("role",t.table?.role==="header"?"columnheader":"cell"),s.colSpan&&(a.colSpan=s.colSpan),s.rowSpan&&(a.rowSpan=s.rowSpan);const l=u.mergeComponentStyles(t.style,s.style),c=T("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",l.backgroundColor).add("vertical-align",l.verticalAlign??"middle");Re(c,l,r),c.applyTo(a);const d=o.createElement("div");d.className="mr-cell-content",T("flex").add("position","absolute").mm("left",n+(s.indentMm??0),r).mm("right",n,r).mm("top",n,r).mm("bottom",n,r).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(le(m,r,i,o));return a.appendChild(d),a}function Ye(e,t,n,r){return Te.resolveGridStrokes(e,t).map(i=>{const o=`${u.round(i.widthPt*n/72,2)}px solid ${i.color}`,s=r.createElement("div");s.className="mr-grid-edge",s.setAttribute("aria-hidden","true");const a=i.kind==="h";return T("block").add("position","absolute").add("pointer-events","none").mm("left",a?i.from:i.pos,n).mm("top",a?i.pos:i.from,n).mm("width",a?i.to-i.from:0,n).mm("height",a?0:i.to-i.from,n).add(a?"border-top":"border-left",o).applyTo(s),s})}function Je(e,t,n,r,i){const o=i.createElement("table");o.className=S("grid",r),o.setAttribute("role","table"),T("block").add("position","relative").add("width","100%").add("height","100%").applyTo(o);const s=ae.resolveGridLayout(e,t.widthMm,t.heightMm),a=i.createElement("tbody");T("contents").applyTo(a),o.appendChild(a);const l=e.cells.map(()=>{const d=i.createElement("tr");return d.className=S("row",r),d.setAttribute("role","row"),T("contents").applyTo(d),a.appendChild(d),d});for(const d of s.cells)l[d.ri].appendChild(Ve(d,t,e.paddingMm??.5,n,r,i));const c=i.createElement("div");return T("block").add("position","relative").add("width","100%").add("height","100%").applyTo(c),c.append(o,...Ye(s,t,n,i)),c}function Ke(e,t,n,r){const i=r.createElement("div");i.className=S("paragraph",n),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(i);for(const o of e.segments||[]){const s=r.createElement("span");s.className=S("segment",n),s.textContent=o.kind==="field"?o.field??"":o.text??"";const a=T("inline");if(o.style){const l=o.style;a.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)&&a.add("font-size",`${u.round(u.resolveFontSize(l,t).fontSizePx,2)}px`)}a.applyTo(s),i.appendChild(s)}return i}function Xe(e,t,n,r){if(W.isRichText(e)){const i=r.createElement("div");i.className=S("rich",n),T("block").applyTo(i);for(const o of e.richParagraphs)i.appendChild(Ke(o,t,n,r));return i}if(Array.isArray(e.lines)&&e.lines.length>0){const i=r.createElement("div");i.className=S("lines",n),T("block").applyTo(i);for(const o of e.lines){const s=r.createElement("div");s.className=S("line",n),s.textContent=o,T("block").add("white-space","pre").add("min-height","1lh").applyTo(s),i.appendChild(s)}return i}return e.text??""}function Ze(e,t,n,r){const i=r.createElement("div");i.className=S("text",n);const o=e.style||{};return T("flex").add("width","100%").add("height","100%").add("flex-direction","column").add("justify-content",o.verticalAlign==="middle"?"center":o.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(i),i.append(Xe(e,t,n,r)),i}function Qe(e,t,n){const r=n.createElement("img");return r.className=S("image",t),r.src=e.imageData,T("block").add("width","100%").add("height","100%").add("object-fit","contain").applyTo(r),r.alt=e.kind,r}function fe(e,t,n,r){const i=r.createElement("div");i.className=S("shape",n);const o=e.style||{},s=u.resolveStroke(o),a=u.resolveBoxBorders(o),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"?(a.top&&c.add("border-top",l),a.right&&c.add("border-right",l),a.bottom&&c.add("border-bottom",l),a.left&&c.add("border-left",l)):e.kind==="ellipse"?(a.inner&&c.add("border",l).add("border-radius","50%"),o.backgroundColor&&c.add("background-color",o.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(i),i}function et(e,t,n){const r=n.createElementNS("http://www.w3.org/2000/svg","svg"),i=u.mmToPx(e.widthMm,t),o=u.mmToPx(e.heightMm,t);r.setAttribute("width",String(Math.max(1,i))),r.setAttribute("height",String(Math.max(1,o))),r.setAttribute("aria-hidden","true"),r.style.overflow="visible",r.style.display="block";const s=n.createElementNS("http://www.w3.org/2000/svg","line");s.setAttribute("x1","0"),s.setAttribute("x2",String(i)),s.setAttribute("y1",e.lineDirection==="up"?String(o):"0"),s.setAttribute("y2",e.lineDirection==="up"?"0":String(o));const a=u.resolveStroke({...e.style,borderColor:e.style?.lineColor??e.style?.borderColor});return s.setAttribute("stroke",a.color),s.setAttribute("stroke-width",String(a.widthPt*t/72)),r.appendChild(s),r}function le(e,t,n,r){const i=r.createElement("div");i.className=`${S("comp",n)} mr-kind-${e.kind}`;const o=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(Ge(o,e,t),o.applyTo(i),W.isImageBackedComponent(e))return i.appendChild(Qe(e,n,r)),i;if(e.kind==="text")return i.appendChild(Ze(e,t,n,r)),i;if(e.grid){const a=fe(e,t,n,r);return a.appendChild(Je(e.grid,e,t,n,r)),i.appendChild(a),i}if(e.kind==="line"&&e.lineDirection)return i.appendChild(et(e,t,r)),i;if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse")return i.appendChild(fe(e,t,n,r)),i;const s=r.createElement("div");return s.className=S("unknown",n),T("block").applyTo(s),s.textContent=e.fallbackText??`[${e.kind}]`,s.dataset.mrUnsupported=e.kind,s.setAttribute("role","note"),i.appendChild(s),i}function xe(e,t,n,r){const i=r.createElement("div");return i.className=S("page",n),T("block","initial").add("position","relative").add("font-family",I.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",I.DEFAULT_TEXT_COLOR).add("overflow","hidden").add("box-sizing","border-box").applyTo(i),e.components.forEach((o,s)=>{const a=le(o,t,n,r);a.dataset.mrComponentIndex=String(s),i.appendChild(a)}),i}function tt(e,t,n={}){const r=n.dpi??96;$.reportOutputDiagnostics(e,"dom",n);const i=t.createElement("div");return i.className=S("root",n),T("block").applyTo(i),i.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(o=>{i.appendChild(xe(o,r,n,t))}),i}function k(e){if(e?.aborted)throw e.reason??new DOMException("The operation was aborted.","AbortError")}const nt=(e,t)=>(k(t),/^data:image\/(?:png|jpe?g|webp|gif|svg\+xml)[;,]/i.test(e)?new Promise((n,r)=>{const i=new Image,o=()=>{i.onload=null,i.onerror=null,t?.removeEventListener("abort",s)},s=()=>{o(),i.src="",r(t?.reason??new DOMException("The operation was aborted.","AbortError"))};i.onload=()=>{o(),n(i)},i.onerror=()=>{o(),r(new Error("Image could not be decoded for Canvas output."))},t?.addEventListener("abort",s,{once:!0}),i.src=e}):Promise.reject(new TypeError("Canvas imageData must be an image data URL; provide imageLoader for other sources.")));function rt(e,t,n){return k(n),n?new Promise((r,i)=>{const o=()=>i(n.reason??new DOMException("The operation was aborted.","AbortError"));n.addEventListener("abort",o,{once:!0}),Promise.resolve().then(()=>e(t,n)).then(r,i).finally(()=>n.removeEventListener("abort",o))}):e(t)}async function it(e,t,n){const r=new Map;for(const i of e.components)!W.isImageBackedComponent(i)||r.has(i.imageData)||r.set(i.imageData,await rt(t,i.imageData,n));return k(n),r}function ot(e,t,n,r,i,o){const s=t,a=s.naturalWidth??s.width??i,l=s.naturalHeight??s.height??o;if(a<=0||l<=0)throw new RangeError("Decoded Canvas image dimensions must be positive.");const c=Math.min(i/a,o/l),d=a*c,m=l*c;e.drawImage(t,n+(i-d)/2,r+(o-m)/2,d,m)}function Se(e){return je.createPageWindowIndex(e.pageHeightsPx,e.gapPx).window(e.viewportHeightPx,e.scrollTopPx,e.overscan)}const ce=96/25.4;function te(e,t=96){const n=t/96*ce;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*n)),heightPx:Math.max(1,Math.round(e.pageHeightMm*n))}}function Ce(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=te(e,n),o=Math.round(i.widthPx*t),s=Math.round(i.heightPx*t);if(!Number.isSafeInteger(o)||!Number.isSafeInteger(s)||o*s>r)throw new RangeError("Canvas page exceeds maxCanvasPixels; reduce resolution or split the report.");return{width:o,height:s}}function Pe(e,t,n,r){const i=document.createElement("canvas"),{widthPx:o,heightPx:s}=te(e,n),a=Ce(e,t,n,r);i.width=a.width,i.height=a.height,i.style.width=`${o}px`,i.style.height=`${s}px`;const l=i.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,o,s),{canvas:i,ctx:l}}function at(e,t=96){return u.resolveFontSize(e,t).fontSizePx}function Ae(e,t,n,r,i,o,s,a="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*l;let m=r;a==="middle"?m=r+(o-d)/2:a==="bottom"&&(m=r+o-d),c.forEach((h,g)=>{st(e,h,t,n,m+g*l+t.fontSizePx*.8,i)}),e.textAlign="left"}function st(e,t,n,r,i,o){const s=Array.from(t),a=n.letterSpacingPx??0;if(!a){e.textAlign=n.align==="center"?"center":n.align==="right"?"right":"left";const m=n.align==="center"?r+o/2:n.align==="right"?r+o:r;e.fillText(t,m,i);return}const l=e.measureText(t).width+Math.max(0,s.length-1)*a,c=n.align==="center"?r+(o-l)/2:n.align==="right"?r+o-l:r;e.textAlign="left";let d="";s.forEach((m,h)=>{e.fillText(m,c+e.measureText(d).width+h*a,i),d+=m})}function lt(e,t,n,r,i,o,s){for(const a of Te.resolveGridStrokes(t,n))e.strokeStyle=a.color,e.lineWidth=u.ptToPx(a.widthPt,s),e.beginPath(),a.kind==="v"?(e.moveTo(r+a.pos*o,i+a.from*o),e.lineTo(r+a.pos*o,i+a.to*o)):(e.moveTo(r+a.from*o,i+a.pos*o),e.lineTo(r+a.to*o,i+a.pos*o)),e.stroke()}function ct(e,t,n,r,i,o){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+o)),t.bottom&&(e.moveTo(n+i,r+o),e.lineTo(n,r+o)),t.left&&(e.moveTo(n,r+o),e.lineTo(n,r)),e.stroke()}function dt(e,t,n,r,i,o,s,a,l,c,d){const m=ae.resolveGridLayout(t,o/a,s/a);for(const g of m.cells){const w=g.cell.style?.backgroundColor??n.style?.backgroundColor;w&&(e.fillStyle=w,e.fillRect(r+g.xMm*a,i+g.yMm*a,g.widthMm*a,g.heightMm*a))}lt(e,m,n,r,i,a,l);const h=t.paddingMm??.5;for(const g of m.cells){const w=g.cell.text??"";if(!w)continue;const M=u.mergeComponentStyles(n.style,g.cell.style),_=u.resolveFontSize(M,l),L=g.cell.indentMm??0,P=Math.max(0,g.widthMm-2*h-L),F=C.wrapText(w,P,{fontSizePt:_.fontSizePt,bold:M.bold,italic:M.italic,fontFamily:M.fontFamily??c,letterSpacingPt:M.letterSpacing},d).join(`
3
- `);Ae(e,{text:F,fontSizePx:_.fontSizePx,bold:M.bold??!1,italic:M.italic,color:u.resolveTextColor(M,I.DEFAULT_TEXT_COLOR),align:M.align??"left",lineHeight:u.resolveLineHeight(M),letterSpacingPx:u.ptToPx(M.letterSpacing??0,l)},r+(g.xMm+h+L)*a,i+(g.yMm+h)*a,P*a,Math.max(0,g.heightMm-2*h)*a,M.fontFamily??c,M.verticalAlign??"middle")}}function mt(e,t,n,r,i,o,s,a,l){const c=t.style??{},d=u.resolveFontSize(c,s),m=W.isRichText(t)?t.richParagraphs.map(h=>h.segments.map(g=>g.text??g.field??"").join("")).join(`
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*l;let m=n;i==="middle"?m=n+(a-d)/2:i==="bottom"&&(m=n+a-d),c.forEach((h,g)=>{pt(e,h,t,r,m+g*l+t.fontSizePx*.8,o)}),e.textAlign="left"}function pt(e,t,r,n,o,a){const s=Array.from(t),i=r.letterSpacingPx??0;if(!i){e.textAlign=r.align==="center"?"center":r.align==="right"?"right":"left";const m=r.align==="center"?n+a/2:r.align==="right"?n+a:n;e.fillText(t,m,o);return}const l=e.measureText(t).width+Math.max(0,s.length-1)*i,c=r.align==="center"?n+(a-l)/2:r.align==="right"?n+a-l:n;e.textAlign="left";let d="";s.forEach((m,h)=>{e.fillText(m,c+e.measureText(d).width+h*i,o),d+=m})}function ft(e,t,r,n,o,a,s){for(const i of Le.resolveGridStrokes(t,r))e.strokeStyle=i.color,e.lineWidth=u.ptToPx(i.widthPt,s),e.beginPath(),i.kind==="v"?(e.moveTo(n+i.pos*a,o+i.from*a),e.lineTo(n+i.pos*a,o+i.to*a)):(e.moveTo(n+i.from*a,o+i.pos*a),e.lineTo(n+i.to*a,o+i.pos*a)),e.stroke()}function wt(e,t,r,n,o,a){e.beginPath(),t.top&&(e.moveTo(r,n),e.lineTo(r+o,n)),t.right&&(e.moveTo(r+o,n),e.lineTo(r+o,n+a)),t.bottom&&(e.moveTo(r+o,n+a),e.lineTo(r,n+a)),t.left&&(e.moveTo(r,n+a),e.lineTo(r,n)),e.stroke()}function vt(e,t,r,n,o,a,s,i,l,c,d){const m=de.resolveGridLayout(t,a/i,s/i);for(const g of m.cells){const p=g.cell.style?.backgroundColor??r.style?.backgroundColor;p&&(e.fillStyle=p,e.fillRect(n+g.xMm*i,o+g.yMm*i,g.widthMm*i,g.heightMm*i))}ft(e,m,r,n,o,i,l);const h=t.paddingMm??.5;for(const g of m.cells){const p=g.cell.text??"";if(!p)continue;const y=u.mergeComponentStyles(r.style,g.cell.style),L=u.resolveFontSize(y,l),R=g.cell.indentMm??0,x=Math.max(0,g.widthMm-2*h-R),I=A.wrapText(p,x,{fontSizePt:L.fontSizePt,bold:y.bold,italic:y.italic,fontFamily:y.fontFamily??c,letterSpacingPt:y.letterSpacing},d).join(`
3
+ `);Ne(e,{text:I,fontSizePx:L.fontSizePx,bold:y.bold??!1,italic:y.italic,color:u.resolveTextColor(y,$.DEFAULT_TEXT_COLOR),align:y.align??"left",lineHeight:u.resolveLineHeight(y),letterSpacingPx:u.ptToPx(y.letterSpacing??0,l)},n+(g.xMm+h+R)*i,o+(g.yMm+h)*i,x*i,Math.max(0,g.heightMm-2*h)*i,y.fontFamily??c,y.verticalAlign??"middle")}}function yt(e,t,r,n,o,a,s,i,l){const c=t.style??{},d=u.resolveFontSize(c,s),m=U.isRichText(t)?t.richParagraphs.map(h=>h.segments.map(g=>g.text??g.field??"").join("")).join(`
4
4
  `):t.lines?.length?t.lines.join(`
5
- `):C.wrapText(t.text??"",t.widthMm,{fontSizePt:d.fontSizePt,bold:c.bold,italic:c.italic,fontFamily:c.fontFamily??a,letterSpacingPt:c.letterSpacing},l).join(`
6
- `);Ae(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)},n,r,i,o,c.fontFamily??a,c.verticalAlign)}function de(e,t,n,r,i,o,s){const a=t.leftMm*n,l=t.topMm*n,c=t.widthMm*n,d=t.heightMm*n,m=t.style??{};if(W.isImageBackedComponent(t)){const h=s?.get(t.imageData);h?ot(e,h,a,l,c,d):we(e,t,a,l,c,d);return}if(t.grid){dt(e,t.grid,t,a,l,c,d,n,r,i,o);return}switch(t.kind){case"text":{mt(e,t,a,l,c,d,r,i,o);break}case"rect":{const h=u.resolveStroke(m),g=u.resolveBoxBorders(m);m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.fillRect(a,l,c,d)),g.inner&&(e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,r),ct(e,g,a,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,r),e.beginPath();const g=t.lineDirection==="up"?l+d:t.lineDirection==="down"?l:l+d/2,w=t.lineDirection==="up"?l:t.lineDirection==="down"?l+d:l+d/2;e.moveTo(a,g),e.lineTo(a+c,w),e.stroke();break}case"ellipse":{const h=u.resolveStroke(m);e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,r),m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.beginPath(),e.ellipse(a+c/2,l+d/2,c/2,d/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(a+c/2,l+d/2,c/2,d/2,0,0,Math.PI*2),e.stroke();break}default:we(e,t,a,l,c,d);break}}function we(e,t,n,r,i,o){e.save(),e.strokeStyle="#94a3b8",e.strokeRect(n,r,i,o),e.fillStyle="#64748b",e.font="12px sans-serif",e.fillText(t.fallbackText??`[${t.kind}]`,n+3,r+14),e.restore()}async function ut(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.");k(t.signal);const o=await C.resolvePlanAssets(e,{...t,format:"canvas"});e=o.plan;const s=[...o.diagnostics,...$.reportOutputDiagnostics(e,"canvas",t)],a=n==="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++){k(t.signal);const m=await Le(e.pages[d],d,i,s);try{l.push(await ht(m,a,r,t.signal))}finally{m.width=0,m.height=0}await We.outputCheckpoint(t,l.length,c-Math.max(0,t.start??0)+1)}return k(t.signal),{blobs:l,diagnostics:s}}function ht(e,t,n,r){return k(r),new Promise((i,o)=>{const s=()=>o(r?.reason??new DOMException("The operation was aborted.","AbortError"));r?.addEventListener("abort",s,{once:!0});try{e.toBlob(a=>{r?.removeEventListener("abort",s),a?i(a):o(new Error("Canvas encoding failed; no empty image was emitted."))},t,n)}catch(a){r?.removeEventListener("abort",s),o(a)}})}function gt(e,t={}){if(k(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*ce,o=t.fontFamily??I.DEFAULT_FONT_FAMILY,s=t.measurer??C.heuristicMeasurer,a=Math.max(0,t.start??0),l=Math.min(e.pages.length-1,t.end??e.pages.length-1),c=[],d=$.reportOutputDiagnostics(e,"canvas",t),m=pt(e,a,l);for(const h of m)$.notifyOutputDiagnostic(h,t),d.push(h);if(t.fidelity==="strict"&&m.length)throw new $.OutputFidelityError(d);for(let h=a;h<=l;h++){k(t.signal);const g=e.pages[h],{canvas:w,ctx:M}=Pe(g,n,r,t.maxCanvasPixels);for(const _ of g.components)de(M,_,i,r,o,s);c.push(w)}return{canvases:c,diagnostics:d}}function pt(e,t,n){return n<t?[]:e.pages.slice(t,n+1).flatMap((r,i)=>r.components.flatMap((o,s)=>W.isImageBackedComponent(o)?[{code:"async-image-required",severity:"warning",format:"canvas",pageIndex:t+i,componentIndex:s,kind:o.kind,nid:o.nid,message:"Use renderPlanToCanvasAsync or renderPlanToImages to decode and include images."}]:[]))}async function ft(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvasAsync 需要浏览器环境(Node 请使用 PDF 或 XLSX 输出)");k(t.signal);const n=await C.resolvePlanAssets(e,{...t,format:"canvas"});e=n.plan;const r=[...n.diagnostics,...$.reportOutputDiagnostics(e,"canvas",t)],i=[],o=Math.min(e.pages.length-1,t.end??e.pages.length-1);for(let s=Math.max(0,t.start??0);s<=o;s++)i.push(await Le(e.pages[s],s,t,r));return{canvases:i,diagnostics:r}}async function Le(e,t,n,r){const i=n.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),o=n.dpi??96,s=n.fontFamily??I.DEFAULT_FONT_FAMILY,a=await Ie(e,t,n,r);k(n.signal);const{canvas:l,ctx:c}=Pe(e,i,o,n.maxCanvasPixels);for(const d of e.components)de(c,d,o/25.4,o,s,n.measurer??C.heuristicMeasurer,a);return l}async function Ie(e,t,n,r){const i=n.imageLoader??nt;return it(e,async(o,s)=>{try{return await i(o,s)}catch(a){if(s?.aborted)throw a;const l=e.components.findIndex(m=>m.imageData===o),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 r.push(d),$.notifyOutputDiagnostic(d,n),a}},n.signal)}function wt(e,t={}){const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,i=r/96*ce,o=t.fontFamily??I.DEFAULT_FONT_FAMILY,s=t.measurer??C.heuristicMeasurer,a=t.overscan??1,l=t.gapPx??18,c=t.pagesPerFrame??1,d=e.pages.map(f=>f.pageHeightMm*i),m=Math.max(1,...e.pages.map(f=>f.pageWidthMm*i)),h={start:0,end:-1};let g=null,w=null,M=null,_=null,L=[],P=0,F=[],Y=0,G=new AbortController;const he=[];function _e(){const f=g;f.innerHTML="",w=document.createElement("div"),w.style.cssText=`width:${m}px;margin:0 auto;`,M=document.createElement("div"),_=document.createElement("div"),w.appendChild(M),L=[];const R=Math.min(e.pages.length,3+a*2);for(let z=0;z<R;z++){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;`,w.appendChild(E),L.push(E)}w.appendChild(_),f.appendChild(w)}async function Be(f,R){const z=Y,E=await C.resolvePlanAssets(e,{...t,signal:G.signal,format:"canvas",start:R,end:R});he.push(...E.diagnostics);const A=E.plan.pages[R],X=await Ie(A,R,{...t,signal:G.signal},he);if(z!==Y||!g)return;const{widthPx:re,heightPx:ie}=te(A,r);let B=f.firstElementChild;(!B||B.tagName!=="CANVAS")&&(B=document.createElement("canvas"),f.innerHTML="",f.appendChild(B));const pe=Ce(A,n,r,t.maxCanvasPixels);B.width=pe.width,B.height=pe.height,B.style.width=`${re}px`,B.style.height=`${ie}px`;const U=B.getContext("2d");if(U){U.setTransform(1,0,0,1,0,0),U.scale(n,n),U.fillStyle="#ffffff",U.fillRect(0,0,re,ie);for(const ze of A.components)de(U,ze,i,r,o,s,X);B.dataset.canvasPage=String(R),f.style.height=`${ie}px`,f.style.width=`${re}px`}}function He(f){Y++,h.start=f.start,h.end=f.end,M.style.height=`${f.start*l+d.slice(0,f.start).reduce((E,A)=>E+A,0)}px`;const R=e.pages.length-1-f.end;_.style.height=`${R*l+d.slice(f.end+1).reduce((E,A)=>E+A,0)}px`;const z=f.end-f.start+1;L.forEach((E,A)=>{if(A<z){E.style.display="";const X=f.start+A;E.style.height=`${d[X]??0}px`}else E.style.display="none"}),F=[];for(let E=f.start;E<=f.end;E++){const A=L[E-f.start];if(!A)continue;A.firstElementChild?.dataset?.canvasPage!==String(E)&&F.push(E)}ne()}function ne(){P||F.length===0||(P=requestAnimationFrame(()=>{P=0;let f=Math.max(1,c);for(;F.length>0&&f-- >0;){const R=F.shift(),z=L[R-h.start];z&&Be(z,R).catch(()=>{})}F.length>0&&ne()}))}function J(){P||(P=requestAnimationFrame(()=>{P=0;const f=g,R=Se({pageHeightsPx:d,viewportHeightPx:f.clientHeight,scrollTopPx:f.scrollTop,overscan:a,gapPx:l});R.start!==h.start||R.end!==h.end?He(R):ne()}))}let K=null;return{attach(f){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");k(t.signal),G=new AbortController,t.signal?.addEventListener("abort",ge,{once:!0}),$.reportOutputDiagnostics(e,"canvas",t),g=f,_e(),f.addEventListener("scroll",J,{passive:!0}),typeof ResizeObserver<"u"&&(K=new ResizeObserver(()=>J()),K.observe(f)),J()},destroy(){Y++,G.abort(),t.signal?.removeEventListener("abort",ge),P&&cancelAnimationFrame(P),P=0,K?.disconnect(),K=null,g?.removeEventListener("scroll",J),F=[],w?.remove(),g=null},window(){return{...h}}};function ge(){G.abort(t.signal?.reason)}}function me(e,t,n){let r,i;if(typeof e=="string"){const o=u.PAPER_SIZES[e];if(!o)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(u.PAPER_SIZES).join("/")})`);r=o.widthMm,i=o.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 ke{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 o=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:s,heightMm:a}=me(t,typeof n=="number"?n:void 0,o.landscape),l=o.margins??{};return this.pending=new De(this,{widthMm:s,heightMm:a,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 De{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 vt(){return new ke}function yt(e,t={}){return oe.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 D(e,t,n=!1){if(!Number.isFinite(e)||(n?e<0:e<=0))throw new Error(`${t} 必须是有限${n?"非负":"正"}数`)}function Z(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 bt(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 D(n,"columnWidthMm"),{layout:t,columnWidthMm:n}}function Mt(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 n=me(t,void 0,e.landscape),r=n.widthMm,i=n.heightMm;return D(r,"纸张 widthMm"),D(i,"纸张 heightMm"),{widthMm:r,heightMm:i}}function Et(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))D(i,r,!0);return n}function Tt(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;D(r,"titleHeightMm"),D(i,"titleGapMm",!0);const o=e.title!==void 0&&e.title.length>0,s=o?r+i:0;if(s>=t)throw new Error("标题高度与间距占满页面,必须为表格保留可用高度");return{dataset:n,titleHeightMm:r,hasTitle:o,titleSpaceMm:s}}function Rt(e){if(e.listOptions!==void 0&&(!e.listOptions||typeof e.listOptions!="object"||Array.isArray(e.listOptions)))throw new Error("listOptions 必须是列表配置对象");const t=e.listOptions??{};Z(t.align,"listOptions.align",!0),Z(t.headerAlign,"listOptions.headerAlign",!1);for(const n of["fontSizePt","rowHeightMm","paddingMm"]){const r=t[n];r!==void 0&&D(r,`listOptions.${n}`,n==="paddingMm")}return t}function xt(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`);Z(i.align,`columns[${r}].align`,!0),Z(i.headerAlign,`columns[${r}].headerAlign`,!1),i.flex!==void 0&&D(i.flex,`columns[${r}].flex`),i.widthMm!==void 0?(D(i.widthMm,`columns[${r}].widthMm`),t+=i.widthMm):n=Math.max(n,i.flex??1)}return{fixedWidthMm:t,maxFlex:n}}function St(e,t,n,r){const{fixedWidthMm:i,maxFlex:o}=xt(e.columns);if(t==="page"&&i>r)throw new Error(`固定列宽 ${i}mm 超出页面可用宽度 ${r}mm`);const s=r-i;if(t==="page"&&o>0&&s<=0)throw new Error("固定列占满页面可用宽度,自动列需要正的剩余宽度");const a=o>0?e.columns.reduce((c,d)=>c+(d.widthMm===void 0?(d.flex??1)/o:0),0):0;return{columns:e.columns.map(({widthMm:c,flex:d,...m},h)=>{const g=c??(t==="wide"?n*(d??1):s*((d??1)/o)/a);return D(g,`columns[${h}] 分配后的 widthMm`),{...m,widthMm:g}}),fixedWidthMm:i,maxFlex:o}}function Ct(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}=bt(e),r=Mt(e);let i=r.widthMm;const o=r.heightMm,s=Et(e);let a=i-s.marginLeftMm-s.marginRightMm;const l=o-s.marginTopMm-s.marginBottomMm;if(t==="page"&&a<=0||l<=0)throw new Error("页边距占满纸张,必须保留正的可用宽度和高度");const{dataset:c,titleHeightMm:d,hasTitle:m,titleSpaceMm:h}=Tt(e,l),g=Rt(e),{columns:w,fixedWidthMm:M,maxFlex:_}=St(e,t,n,a);t==="wide"&&(a=w.reduce((P,F)=>P+F.widthMm,0),D(a,"宽表总列宽"),i=a+s.marginLeftMm+s.marginRightMm,D(i,"宽表总宽度"));const L={widthMm:i,heightMm:o,...s,components:[],...t==="wide"?{layout:t}:{}};return m&&L.components.push({kind:"text",text:e.title,leftMm:s.marginLeftMm,topMm:s.marginTopMm,widthMm:a,heightMm:d,style:{fontSize:16,bold:!0,align:"center",verticalAlign:"middle",...e.titleStyle}}),L.components.push({align:"auto",headerAlign:"center",...g,kind:"list",...t==="wide"?{layout:t}:{},...m?{title:e.title}:{},dataset:c,columns:w,leftMm:s.marginLeftMm,topMm:s.marginTopMm+h,widthMm:t==="wide"||_>0?a:M}),e.params===void 0?{pages:[L]}:{params:e.params,pages:[L]}}function Pt(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,o=e.pages??[{components:e.components??[]}],s={repeat:{dataset:t,...n===void 0?{}:{rowKey:n},...r===void 0?{}:{copies:r}},...i===void 0?{}:{params:i},pages:o.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}}))},a=b.validateReportTemplate(s);if(!a.ok)throw new b.ReportTemplateError(a.errors);return JSON.parse(JSON.stringify(s))}function At(e){if(!e||typeof e!="object"||!e.repeat)throw new p.ReportSourceError("config","defineLabelReport 需要带 repeat 的固定标签模板");const t=b.validateReportTemplate(e);if(!t.ok)throw new b.ReportTemplateError(t.errors);return e.repeat.dataset}function ve(e,t){if(!Array.isArray(e))throw new p.ReportSourceError("validate","标签数据应为对象数组;请从业务响应中提取行数组");return{[t]:e}}function Lt(e){const{template:t,rows:n,load:r,dataSchema:i,params:o,pagination:s,dataValidation:a}=e,l=At(t);if(n!==void 0==(r!==void 0)||r!==void 0&&typeof r!="function")throw new p.ReportSourceError("config","标签报表应且只能配置 rows 或 load 其中一种数据来源");const c={template:t,params:o,pagination:s,dataValidation:a,...i===void 0?{}:{dataSchema:{[l]:i}}};return r?p.defineReport({...c,load:r,mapData:d=>ve(d,l)}):{...c,datasets:ve(n,l)}}function It(e){return e}class N extends Error{constructor(t,n){super(n),this.code=t,this.name="ReportTemplateStoreError"}}function O(e){return JSON.parse(JSON.stringify(e))}function x(e){if(!e?.aborted)return;const t=new Error("模板操作已取消");throw t.name="AbortError",t}function ye(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 kt(e,t={}){const n=async(s,a)=>{x(a);const l=await e.read(s,a);return x(a),l?O(l):void 0},r=async(s,a)=>{const l=await n(s,a.signal);if((l?.revision??null)!==a.expectedRevision)throw new N("conflict","模板已变化,请重新读取后提交");return l},i=async(s,a,l)=>{if(x(a.signal),!await e.compareAndSwap(s.id,a.expectedRevision,O(s),{signal:a.signal,...l?{publication:O(l)}:{}}))throw new N("conflict","模板已被其他请求更新");return O(s)},o=async(s,a,l,c)=>{if(t.beforePublish){x(l.signal);const g=await t.beforePublish({document:b.parseReportTemplate(a),previous:s.published?b.parseReportTemplate(s.published):void 0,signal:l.signal});if(!g||g.ok!==!0)throw new N("review",g?.issues?.find(w=>w.severity==="error")?.message??"模板发布检查未通过");x(l.signal)}const d=ye(s),m=b.parseReportTemplate({...a,revision:d}),h={revision:d,document:m,publishedAt:(t.now?.()??new Date).toISOString()};return c!==void 0&&(h.restoredFrom=c),i({id:s.id,revision:d,publishedRevision:d,published:m},l,h)};return{list:async s=>{x(s);const a=await e.list(s);return x(s),O(a)},get:async(s,a={})=>{const l=await n(s,a.signal),c=a.draft?l?.draft:l?.published;return c?b.parseReportTemplate(c):void 0},history:async(s,a)=>{x(a);const l=await e.history(s,a);return x(a),O(l)},saveDraft:async(s,a)=>{a={...a},x(a.signal);const l=b.parseReportTemplate(t.migrate?await t.migrate(s):s),c=await r(l.id,a),d=ye(c);return i({id:l.id,revision:d,draft:{...l,revision:d},...c?.publishedRevision?{publishedRevision:c.publishedRevision,published:c.published}:{}},a)},publish:async(s,a)=>{a={...a};const l=await r(s,a);if(!l)throw new N("missing","模板不存在");if(!l.draft)throw new N("draft","没有可发布的草稿");return o(l,l.draft,a)},rollback:async(s,a,l)=>{l={...l};const c=await r(s,l);if(!c)throw new N("missing","模板不存在");x(l.signal);const d=await e.getVersion(s,a,l.signal);if(!d)throw new N("history","历史修订不存在");return o(c,d.document,l,a)}}}function Dt(){const e=new Map,t=new Map;return{read:async(n,r)=>{x(r);const i=e.get(n);return i?O(i):void 0},list:async n=>(x(n),Array.from(e.values(),({id:r,revision:i,publishedRevision:o})=>({id:r,revision:i,...o?{publishedRevision:o}:{}}))),history:async(n,r)=>(x(r),Array.from(t.get(n)?.values()??[],i=>O(i))),getVersion:async(n,r,i)=>{x(i);const o=t.get(n)?.get(r);return o?O(o):void 0},compareAndSwap:async(n,r,i,o)=>{if(x(o.signal),(e.get(n)?.revision??null)!==r)return!1;if(i.id!==n)throw new N("history","状态 ID 与存储 ID 不一致");const s=O(i),a=o.publication;if(a){const l=t.get(n)??new Map;if(l.has(a.revision)||a.revision!==i.revision||a.document.id!==n)throw new N("history","发布修订不可覆盖,且必须与状态修订和模板 ID 一致");l.set(a.revision,O(a)),t.set(n,l)}return e.set(n,s),!0}}}function Ft(e,t){const n=e.publishedRevision??e.published?.revision;for(const r of[e.draftRevision,n])if(r!==void 0&&(typeof r!="string"||!r.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!==n))throw new TypeError("发布文档身份或修订不一致");if(!e.published&&n!==void 0&&n!==t.revision)throw new TypeError("发布修订需要对应的独立文档");return{...e.draftRevision===void 0?{}:{draftRevision:e.draftRevision},...n===void 0?{}:{publishedRevision:n}}}function Nt(e,t){const n=b.parseReportTemplate(e);if(t.id===n.id)throw new Error("复制模板应使用新的 ID");const{revision:r,...i}=n;return b.parseReportTemplate({...i,id:t.id,name:t.name})}function Ot(e){if(!Array.isArray(e)||e.length>1e3)throw new RangeError("本地模板目录最多 1000 项");const t=new Map,n=new Map,r=[];for(const i of e){const o=b.parseReportTemplate(i.document);if(t.has(o.id))throw new Error(`模板 ID 重复:${o.id}`);if(i.category!==void 0&&(typeof i.category!="string"||i.category.length>128)||i.tags!==void 0&&(!Array.isArray(i.tags)||i.tags.length>20||i.tags.some(c=>typeof c!="string"||c.length>128)))throw new TypeError("模板分类和标签无效");const s=Ft(i,o),{template:a,...l}=o;t.set(o.id,o),i.published?n.set(o.id,b.parseReportTemplate(i.published)):s.publishedRevision&&n.set(o.id,b.parseReportTemplate(o)),r.push({...l,...s,...i.category?{category:i.category}:{},...i.tags?{tags:[...i.tags]}:{}})}return r.sort((i,o)=>i.id<o.id?-1:1),{search:async i=>{be(i.signal);const o=i.limit??30;if(!Number.isSafeInteger(o)||o<1||o>100)throw new RangeError("模板每页数量应为 1–100");const s=i.query?.trim().toLocaleLowerCase()??"",a=r.filter(c=>(!i.category||c.category===i.category)&&(!i.cursor||c.id>i.cursor)&&(!s||[c.id,c.name,c.description,...c.tags??[]].some(d=>d?.toLocaleLowerCase().includes(s)))),l=new Map;for(const c of r)c.category&&l.set(c.category,(l.get(c.category)??0)+1);return JSON.parse(JSON.stringify({items:a.slice(0,o),...a.length>o?{next:a[o-1].id}:{},categories:Array.from(l,([c,d])=>({id:c,label:c,count:d}))}))},get:async(i,o)=>{be(o.signal);const s=o.mode==="published"?n.get(i):t.get(i);return s?b.parseReportTemplate(s):void 0}}}function be(e){if(!e?.aborted)return;const t=new Error("模板目录操作已取消");throw t.name="AbortError",t}function $t(e){return e.map(t=>t.map(n=>/[\t\r\n"]/.test(n)?`"${n.replace(/"/g,'""')}"`:n).join(" ")).join(`\r
7
- `)}function _t(e,t){const n=e[e.length-1];e.length>1&&n?.length===1&&n[0]===""&&/[\r\n]$/.test(t)&&e.pop()}function Bt(e,t=1e4){if(e.length>4*1024*1024)throw new Error("Clipboard text limit exceeded");const n=[[]];let r="",i=!1,o=!1,s=0;function a(){if(++s>t)throw new Error("Clipboard cell limit exceeded");n[n.length-1].push(r),r="",o=!1}for(let l=0;l<e.length;l++){const c=e[l];if(i){if(c!=='"'){r+=c;continue}if(e[l+1]==='"'){r+='"',l++;continue}i=!1,o=!0;continue}if(c==='"'&&!r&&!o){i=!0;continue}if(c===" "){a();continue}if(c==="\r"||c===`
8
- `){a(),n.push([]),c==="\r"&&e[l+1]===`
9
- `&&l++;continue}if(o)throw new Error("Invalid quoted clipboard value");r+=c}if(i)throw new Error("Unclosed clipboard quote");return a(),_t(n,e),n}class Fe extends Error{constructor(t,n,r){const i=typeof n.label=="string"?n.label:"单元格",o={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(o[t]),this.code=t,this.field=n,this.expected=r,this.name="ReportCellFieldError"}}function v(e,t,n){throw new Fe(t,e,n)}function Ne(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 Ht(e){const[t="",n="0"]=String(e).toLowerCase().split("e");return Math.max(0,(t.split(".")[1]?.length??0)-Number(n))}function zt(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&&Ht(t)>e.precision&&v(e,"precision",e.precision)}function Wt(e,t){Ne(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 Ut(e){[e.min,e.max].some(t=>t!==void 0&&!Ne(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 Gt(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 Oe(e,t){(!t||typeof t!="object"||Array.isArray(t)||!["text","number","boolean","enum","date"].includes(t.type))&&v(t??{type:"text"},"definition"),Gt(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"&&Ut(t),t.type==="enum"&&qt(e,t)}function Vt(e,t,n){if(!e.editable)throw new p.ReportCellEditError("readonly");n&&Oe(e,n);const r=p.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"&&zt(n,r),n.type==="date"&&Wt(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 y extends Error{constructor(t){super(`Report calculation: ${t}`),this.code=t,this.name="ReportCalculationError"}}function q(e){if(!e?.aborted)return;const t=new Error("Calculation cancelled");throw t.name="AbortError",t}async function Q(e,t=1){const n=Math.floor(e.scanned/2048);if(e.scanned+=t,e.scanned>e.maxScanned)throw new y("limit");q(e.signal),Math.floor(e.scanned/2048)>n&&(await e.yieldToHost(),q(e.signal))}function ue(e){return e.table?.role==="header"?-Math.max(1,e.grid?.cells.length??1):e.table?.rowIndex??0}function Me(e,t,n){if(![t.pageIndex,t.componentIndex,t.rowIndex,t.columnIndex].every(a=>Number.isSafeInteger(a)&&a>=0))throw new y("selection");const r=e.pages[t.pageIndex]?.components[t.componentIndex];if(!r?.grid||t.rowIndex>=r.grid.cells.length)throw new y("selection");const i=r.grid.colWidthsMm?.length??r.grid.cells.reduce((a,l)=>Math.max(a,l.length),1);if(t.columnIndex>=i)throw new y("selection");const o=r.table,s=e.pages[n.pageIndex]?.components[n.componentIndex]?.table;if(o&&s&&o.id===s.id){const a=s.columnKeys.indexOf(o.columnKeys[t.columnIndex]??"");if(a<0)throw new y("selection");return{grid:o.id,row:ue(r)+t.rowIndex,column:a}}return{grid:`${t.pageIndex}:${t.componentIndex}`,row:t.rowIndex,column:t.columnIndex}}function Yt(e,t,n){const r=Me(e,t.anchor,t.anchor),i=Me(e,t.focus,t.anchor);if(r.grid!==i.grid)throw new y("selection");const o=(Math.abs(r.row-i.row)+1)*(Math.abs(r.column-i.column)+1);if(!Number.isSafeInteger(o)||o>n)throw new y("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 Jt(e){if(!e)return!1;const t=e.replace(/"[^"]*"|\\.|\[(?![hms]+\])[^\]]*\]/gi,"");return/[ymdhs]/i.test(t)}function Kt(e){if(e.valueType==="text"||e.valueType==="boolean"||Jt(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 y("precision");return t}function Xt(e,t,n){if(e.seen.has(n))return;e.seen.add(n),e.selected++;const r=t?Kt(t):null;r===null?e.excluded++:e.values.push(r)}function Zt(e,t,n,r){return r.origin?e.table?.id===r.origin.id:`${t}:${n}`===r.grid}function Qt(e,t,n){return n.origin?n.origin.columnKeys.indexOf(e.table.columnKeys[t]??""):t}function en(e,t,n,r){const i=r.origin?ue(e)+t:t,o=Qt(e,n,r);return i<r.rowStart||i>r.rowEnd||o<r.columnStart||o>r.columnEnd?null:`${r.grid}:${i}:${o}`}function tn(e,t){const n=t.origin?ue(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 nn(e,t,n,r,i){const o=e.grid;if(t>r.maxScanned)throw new y("limit");const s=o.colWidthsMm?.length??o.cells.reduce((l,c)=>Math.max(l,c.length),1);if(s>r.maxScanned)throw new y("limit");const a=new Map;for(let l=0;l<t;l++){l>0&&l%2048===0&&(await r.yieldToHost(),q(r.signal));let c=0;for(const d of o.cells[l]){for(await Q(r);c<s&&(a.get(c)??0)>l;)c++;if(c>=s)break;const m=Math.max(1,Math.min(d?.colSpan??1,s-c)),h=Math.min(o.cells.length,l+Math.max(1,d?.rowSpan??1));m>1&&await Q(r,m-1);for(let w=c;w<c+m;w++)a.set(w,h);const g=en(e,l,c,n);g&&Xt(i,d,g),c+=m}}}async function rn(e,t,n){const r={values:[],seen:new Set,excluded:0,selected:0};for(let i=0;i<e.pages.length;i++){await Q(n);const o=e.pages[i];for(let s=0;s<o.components.length;s++){await Q(n);const a=o.components[s];if(!a.grid||!Zt(a,i,s,t)||a.table&&a.table.role!=="body")continue;const l=tn(a,t);l&&await nn(a,l,t,n,r)}}return r}function V(e){if(!Number.isFinite(e))throw new y("overflow");return e}function on(e){let t=0,n=0;for(const r of e){const i=r-n,o=V(t+i);n=o-t-i,t=o}return t}async function Ee(e,t){let n=[...e],r=new Array(e.length);for(let o=1;o<e.length;o*=2){for(let s=0;s<e.length;s+=o*2){const a=Math.min(s+o,e.length),l=Math.min(s+o*2,e.length);let c=s,d=a;for(let m=s;m<l;m++)r[m]=d>=l||c<a&&n[c]<=n[d]?n[c++]:n[d++],m%2048===0&&(await t.yieldToHost(),q(t.signal))}[n,r]=[r,n]}const i=Math.floor(n.length/2);return n.length%2?n[i]:V(n[i-1]/2+n[i]/2)}function an(e){const t=on(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 $e(e,t){if(typeof e!="string"||e.length>256)throw new y("expression");const n=e.toUpperCase().match(/(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?|[A-Z_]+|[()+\-*/]|\S/g)??[];if(!n.length||n.length>64)throw new y("expression");let r=0;function i(a){if(a>16)throw new y("expression");const l=n[r++];if(l==="+"||l==="-")return(l==="-"?-1:1)*i(a+1);if(l==="("){const c=o(0,a+1);if(n[r++]!==")")throw new y("expression");return c}if(l&&/^(?:SUM|AVERAGE|AVG|MIN|MAX|COUNT|MEDIAN)$/.test(l)&&Object.prototype.hasOwnProperty.call(t,l))return V(t[l]);if(l&&/^(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?$/.test(l))return V(Number(l));throw new y("expression")}function o(a,l){let c=i(l);for(;r<n.length;){const d=n[r],m=d==="+"||d==="-"?1:d==="*"||d==="/"?2:0;if(!m||m<a)break;r++;const h=o(m+1,l+1);if(d==="/"&&h===0)throw new y("division");c=V(d==="+"?c+h:d==="-"?c-h:d==="*"?c*h:c/h)}return c}const s=o(1,0);if(r!==n.length)throw new y("expression");return s}function sn(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 y("limit");if(!Number.isInteger(r)||r<0||r>12)throw new y("precision");return{maxCells:t,maxScanned:n,precision:r}}async function ln(e,t,n={}){const r=sn(n),i={scanned:0,maxScanned:r.maxScanned,signal:n.signal,yieldToHost:n.yieldToHost??(()=>new Promise(l=>setTimeout(l,0)))};q(i.signal);const o=await rn(e,Yt(e,t,r.maxCells),i),s=n.operation??"sum";if(!["sum","average","min","max","count","median","expression"].includes(s))throw new y("expression");let a=null;if(s==="count")a=o.values.length;else if(o.values.length)if(s==="median")a=await Ee(o.values,i);else{const l=an(o.values);s==="expression"?(/\bMEDIAN\b/i.test(n.expression??"")&&(l.MEDIAN=await Ee(o.values,i)),a=$e(n.expression??"",l)):a=l[s.toUpperCase()]}if(q(i.signal),a!==null&&Number.isInteger(a)&&!Number.isSafeInteger(a))throw new y("precision");return{value:a,formatted:a===null?"—":a.toFixed(r.precision),numericCells:o.values.length,excludedCells:o.excluded,selectedCells:o.selected,precision:r.precision}}exports.DEFAULT_BORDER_PT=I.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_FAMILY=I.DEFAULT_FONT_FAMILY;exports.DEFAULT_FONT_PT=I.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=I.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=I.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=I.LINE_HEIGHT;exports.SCHEMA_VERSION_MACH=I.SCHEMA_VERSION_MACH;exports.ReportBindingError=j.ReportBindingError;exports.evalStyleRule=j.evalStyleRule;exports.formatValue=j.formatValue;exports.parseDateLocal=j.parseDateLocal;exports.resolveComponentBinding=j.resolveComponentBinding;exports.toExcelNumberFormat=j.toExcelNumberFormat;exports.toNumber=j.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=W.RENDER_PLAN_SCHEMA_VERSION;exports.isImageBackedComponent=W.isImageBackedComponent;exports.isRichText=W.isRichText;exports.assertRenderPlan=ee.assertRenderPlan;exports.validateComponent=ee.validateComponent;exports.validatePage=ee.validatePage;exports.validateRenderPlan=ee.validateRenderPlan;exports.datasetJsonSchema=oe.datasetJsonSchema;exports.validateDatasetRows=oe.validateDatasetRows;exports.OutputAssetError=C.OutputAssetError;exports.charWidthEm=C.charWidthEm;exports.createCanvasMeasurer=C.createCanvasMeasurer;exports.createHeuristicMeasurer=C.createHeuristicMeasurer;exports.heuristicMeasurer=C.heuristicMeasurer;exports.measureTextMm=C.measureTextMm;exports.resolvePlanAssets=C.resolvePlanAssets;exports.wrapText=C.wrapText;exports.DEFAULT_LABEL_PAGE_LIMIT=p.DEFAULT_LABEL_PAGE_LIMIT;exports.PaginateCellLimitError=p.PaginateCellLimitError;exports.PaginatePageLimitError=p.PaginatePageLimitError;exports.ReportCellEditError=p.ReportCellEditError;exports.ReportSourceError=p.ReportSourceError;exports.applyReportCellEdit=p.applyReportCellEdit;exports.applyReportCellEditBatch=p.applyReportCellEditBatch;exports.applyReportEditResult=p.applyReportEditResult;exports.countTemplatePages=p.countTemplatePages;exports.createReportCellEdit=p.createReportCellEdit;exports.createReportCellEditBatch=p.createReportCellEditBatch;exports.createReportCellResolver=p.createReportCellResolver;exports.createReportEditSession=p.createReportEditSession;exports.createReportSource=p.createReportSource;exports.defineReport=p.defineReport;exports.diffReportTemplates=p.diffReportTemplates;exports.estimateListLayoutCells=p.estimateListLayoutCells;exports.formatReportCellEdit=p.formatReportCellEdit;exports.getReportCellContext=p.getReportCellContext;exports.getReportEditSession=p.getReportEditSession;exports.paginateTemplate=p.paginateTemplate;exports.paginateTemplatePages=p.paginateTemplatePages;exports.parseReportCellInput=p.parseReportCellInput;exports.projectListColumns=p.projectListColumns;exports.registerReportEditSession=p.registerReportEditSession;exports.relocateReportCellEdits=p.relocateReportCellEdits;exports.reportCellEditKey=p.reportCellEditKey;exports.reviewReportTemplate=p.reviewReportTemplate;exports.summarizeReportCellEdits=p.summarizeReportCellEdits;exports.resolveGridLayout=ae.resolveGridLayout;exports.OutputFidelityError=$.OutputFidelityError;exports.inspectOutputCapabilities=$.inspectOutputCapabilities;exports.reportOutputDiagnostics=$.reportOutputDiagnostics;exports.REPORT_TEMPLATE_DOCUMENT_VERSION=b.REPORT_TEMPLATE_DOCUMENT_VERSION;exports.ReportTemplateError=b.ReportTemplateError;exports.createTemplateRegistry=b.createTemplateRegistry;exports.defineReportTemplate=b.defineReportTemplate;exports.parseReportTemplate=b.parseReportTemplate;exports.serializeReportTemplate=b.serializeReportTemplate;exports.validateReportTemplate=b.validateReportTemplate;exports.validateReportTemplateDocument=b.validateReportTemplateDocument;exports.ReportParamValidationError=H.ReportParamValidationError;exports.assertReportParams=H.assertReportParams;exports.formatReportDateRange=H.formatReportDateRange;exports.isReportDate=H.isReportDate;exports.isReportMonth=H.isReportMonth;exports.isReportYear=H.isReportYear;exports.parseReportDateRange=H.parseReportDateRange;exports.reportParamsJsonSchema=H.reportParamsJsonSchema;exports.validateReportParamDefinitions=H.validateReportParamDefinitions;exports.validateReportParams=H.validateReportParams;exports.TreeRowLimitError=se.TreeRowLimitError;exports.createTreeTable=se.createTreeTable;exports.validateTreeOptions=se.validateTreeOptions;exports.PageBuilder=De;exports.ReportCalculationError=y;exports.ReportCellFieldError=Fe;exports.ReportTemplateStoreError=N;exports.TemplateBuilder=ke;exports.calculateReportSelection=ln;exports.classOf=S;exports.cloneReportTemplate=Nt;exports.columnsFromContract=yt;exports.computePageWindow=Se;exports.createCanvasPager=wt;exports.createLabelTemplate=Pt;exports.createLocalTemplateCatalog=Ot;exports.createMemoryTemplateStore=Dt;exports.createProviderReport=It;exports.createTableTemplate=Ct;exports.createTemplate=vt;exports.createTemplateManager=kt;exports.defineLabelReport=Lt;exports.evaluateReportAggregateExpression=$e;exports.formatReportClipboard=$t;exports.measurePageSizePx=te;exports.parseReportCellFieldInput=Vt;exports.parseReportClipboard=Bt;exports.planFontSizePx=at;exports.renderComponent=le;exports.renderPage=xe;exports.renderPlan=tt;exports.renderPlanToCanvas=gt;exports.renderPlanToCanvasAsync=ft;exports.renderPlanToImages=ut;exports.resolvePaper=me;exports.validateReportCellFieldDefinition=Oe;
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
+ `)}function Vt(e,t){const r=e[e.length-1];e.length>1&&r?.length===1&&r[0]===""&&/[\r\n]$/.test(t)&&e.pop()}function Gt(e,t=1e4){if(e.length>4*1024*1024)throw new Error("Clipboard text limit exceeded");const r=[[]];let n="",o=!1,a=!1,s=0;function i(){if(++s>t)throw new Error("Clipboard cell limit exceeded");r[r.length-1].push(n),n="",a=!1}for(let l=0;l<e.length;l++){const c=e[l];if(o){if(c!=='"'){n+=c;continue}if(e[l+1]==='"'){n+='"',l++;continue}o=!1,a=!0;continue}if(c==='"'&&!n&&!a){o=!0;continue}if(c===" "){i();continue}if(c==="\r"||c===`
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;
package/dist/index.d.cts CHANGED
@@ -16,6 +16,9 @@ export declare function applyReportCellEdit(plan: RenderPlan, edit: ReportCellEd
16
16
  /** Transactional from the caller's perspective: a later conflict never exposes earlier writes. */
17
17
  export declare function applyReportCellEditBatch(plan: RenderPlan, batch: Pick<ReportEditBatch, "edits">): RenderPlan;
18
18
 
19
+ /** Styles affect report content only, never the surrounding designer/preview theme. */
20
+ export declare function applyReportDocumentStyle(input: ReportTemplateDocument, pageIndex: number, indices: readonly number[], role: ReportDocumentStyle): ReportTemplateDocument;
21
+
19
22
  /** Refresh concurrency metadata without changing values, layout, or the host's source objects. */
20
23
  export declare function applyReportEditResult(plan: RenderPlan, batch: ReportEditBatch, result: void | ReportEditResult): RenderPlan;
21
24
 
@@ -102,6 +105,8 @@ export declare interface CanvasRenderResult {
102
105
  diagnostics: OutputDiagnostic[];
103
106
  }
104
107
 
108
+ export declare function captureTemplateFragment(document: ReportTemplateDocument, pageIndex: number, indices: readonly number[], identity: Pick<ReportTemplateFragment, "id" | "name" | "revision">): ReportTemplateFragment;
109
+
105
110
  export declare function charWidthEm(ch: string): number;
106
111
 
107
112
  export declare type ClassKey = "root" | "page" | "comp" | "text" | "lines" | "line" | "rich" | "paragraph" | "segment" | "image" | "shape" | "grid" | "row" | "cell" | "unknown";
@@ -125,6 +130,9 @@ export declare interface CodeOptions {
125
130
  showText?: boolean;
126
131
  }
127
132
 
133
+ /** A flat, indexed outline allows the UI to render a bounded search window. */
134
+ export declare function collectTemplateOutline(template: ReportTemplate): TemplateOutlineEntry[];
135
+
128
136
  /**
129
137
  * 列值格式化(声明式、JSON 可序列化)。
130
138
  * 在 paginate 的 cellText 出口统一消费:格式化发生在进 RenderPlan 之前,
@@ -490,6 +498,11 @@ export declare interface GridLayout {
490
498
  edges: GridEdge[];
491
499
  }
492
500
 
501
+ export declare function hasValidDataExplanation(value: {
502
+ target?: unknown;
503
+ valueState?: unknown;
504
+ }): boolean;
505
+
493
506
  /** 启发式测量器:无 Canvas 时的默认宽度估算 */
494
507
  export declare const heuristicMeasurer: TextMeasurer;
495
508
 
@@ -507,14 +520,32 @@ export declare interface ImageRenderResult {
507
520
  diagnostics: OutputDiagnostic[];
508
521
  }
509
522
 
523
+ /** Row-major physical imposition. Record → copy → face order is preserved; no duplex reordering. */
524
+ export declare function imposeLabelSheets(plan: RenderPlan, options: LabelSheetOptions): RenderPlan;
525
+
526
+ /** Explicit replacement is atomic and preserves surrounding components and the document CAS revision. */
527
+ export declare function insertTemplateFragment(input: ReportTemplateDocument, fragment: ReportTemplateFragment, options: TemplateFragmentInsertOptions): TemplateFragmentResult;
528
+
510
529
  export declare function inspectOutputCapabilities(plan: RenderPlan, format: OutputFormat): OutputDiagnostic[];
511
530
 
531
+ /** Includes rule, aggregate, relation and formula references; never evaluates expressions. */
532
+ export declare function inspectTemplateFieldUsage(template: ReportTemplate, dataset: string, field: string): TemplateFieldUsage[];
533
+
534
+ export declare function inspectTemplateFragmentBindings(fragment: ReportTemplateFragment): {
535
+ dataset: string;
536
+ fields: string[];
537
+ }[];
538
+
512
539
  export declare function isImageBackedComponent(comp: PlanComponent): boolean;
513
540
 
541
+ export declare function isReportDataTarget(value: unknown): value is ReportDataTarget;
542
+
514
543
  export declare function isReportDate(value: string): boolean;
515
544
 
516
545
  export declare function isReportMonth(value: string): boolean;
517
546
 
547
+ export declare function isReportValueState(value: unknown): value is ReportValueState;
548
+
518
549
  export declare function isReportYear(value: string): boolean;
519
550
 
520
551
  export declare function isRichText(comp: PlanComponent): boolean;
@@ -537,6 +568,44 @@ export declare type LabelReportDefinitionOptions = LabelReportDefinitionBase & (
537
568
  /** Named business row interfaces and readonly arrays need no index signature or conversion. */
538
569
  export declare type LabelReportRows = readonly object[];
539
570
 
571
+ export declare class LabelSheetError extends Error {
572
+ readonly path: string;
573
+ readonly code = "label-sheet";
574
+ constructor(message: string, path: string);
575
+ }
576
+
577
+ export declare interface LabelSheetOptions {
578
+ /** A4 defaults to 210 × 297 mm; custom sizes are explicit physical millimetres. */
579
+ paper?: "a4" | {
580
+ widthMm: number;
581
+ heightMm: number;
582
+ };
583
+ columns: number;
584
+ rows: number;
585
+ marginMm?: number | {
586
+ top: number;
587
+ left: number;
588
+ bottom: number;
589
+ right: number;
590
+ };
591
+ gapMm?: number | {
592
+ horizontal: number;
593
+ vertical: number;
594
+ };
595
+ /** Empty slots on the first sheet only (zero based, row-major). */
596
+ startSlot?: number;
597
+ /** Printer calibration; geometry outside the physical sheet is rejected. */
598
+ offsetMm?: {
599
+ x: number;
600
+ y: number;
601
+ };
602
+ maxSheets?: number;
603
+ maxComponents?: number;
604
+ /** Independent plain JSON snapshot budget, default 64 MB. */
605
+ maxSnapshotBytes?: number;
606
+ signal?: AbortSignal;
607
+ }
608
+
540
609
  export declare interface LabelTemplateOptions extends ReportTemplateRepeat {
541
610
  widthMm?: number;
542
611
  heightMm?: number;
@@ -1130,6 +1199,14 @@ export declare type ReportCellValue = string | number | boolean | null;
1130
1199
 
1131
1200
  export declare type ReportCellValueType = NonNullable<GridCell["valueType"]>;
1132
1201
 
1202
+ export declare interface ReportDataTarget {
1203
+ datasetId: string;
1204
+ field: string;
1205
+ rowKey?: string | number;
1206
+ /** Use table identity when the same dataset appears in several tables. */
1207
+ tableId?: string;
1208
+ }
1209
+
1133
1210
  /** Wire values deliberately remain strings in browsers, Workers and backend runtimes. */
1134
1211
  export declare interface ReportDateRange {
1135
1212
  start: string;
@@ -1162,6 +1239,16 @@ export declare interface ReportDiagnostic {
1162
1239
  message: string;
1163
1240
  path?: string;
1164
1241
  severity: "warning" | "error" | "info";
1242
+ /** Optional explanation supplied by the business source, not inferred from blank cells. */
1243
+ valueState?: ReportValueState;
1244
+ target?: ReportDataTarget;
1245
+ }
1246
+
1247
+ export declare interface ReportDocumentStyle {
1248
+ id: string;
1249
+ name: string;
1250
+ style: ComponentStyle;
1251
+ target?: "content" | "header";
1165
1252
  }
1166
1253
 
1167
1254
  export declare interface ReportEditBatch {
@@ -1231,7 +1318,8 @@ export declare interface ReportFetchInput extends ReportTaskMonitoring {
1231
1318
  signal?: AbortSignal;
1232
1319
  /** 本次分页与计划告警;未提供时使用数据源配置的告警通道。 */
1233
1320
  onWarning?: (message: string) => void;
1234
- onQueryResult?: (reportId: string, result: ReportQueryResult) => void;
1321
+ /** Index scopes diagnostics when reports share datasets or a report ID is repeated. */
1322
+ onQueryResult?: (reportId: string, result: ReportQueryResult, reportIndex?: number) => void;
1235
1323
  }
1236
1324
 
1237
1325
  export declare interface ReportFieldContract {
@@ -1517,6 +1605,15 @@ export declare interface ReportTemplateFixture {
1517
1605
  params?: Record<string, string>;
1518
1606
  }
1519
1607
 
1608
+ /** Plain JSON, versioned by the host; inserting never links mutable library objects. */
1609
+ export declare interface ReportTemplateFragment {
1610
+ id: string;
1611
+ name: string;
1612
+ revision: string;
1613
+ components: TemplateComponent[];
1614
+ repeatDataset?: string;
1615
+ }
1616
+
1520
1617
  export declare type ReportTemplateLoader = (context: ReportLoadContext) => ReportTemplate | Promise<ReportTemplate>;
1521
1618
 
1522
1619
  export declare interface ReportTemplateManager {
@@ -1581,6 +1678,11 @@ export declare interface ReportTemplateReview {
1581
1678
  }>;
1582
1679
  }
1583
1680
 
1681
+ export declare interface ReportTemplateReviewAsyncOptions extends ReportTemplateReviewOptions {
1682
+ signal?: AbortSignal;
1683
+ onProgress?: (progress: ReportTemplateReviewProgress) => void;
1684
+ }
1685
+
1584
1686
  export declare interface ReportTemplateReviewIssue {
1585
1687
  code: "template" | "compatibility" | "dataset" | "field" | "sample" | "layout" | "output" | "params";
1586
1688
  severity: "error" | "warning";
@@ -1606,6 +1708,13 @@ export declare interface ReportTemplateReviewOptions {
1606
1708
  strictOutputs?: boolean;
1607
1709
  }
1608
1710
 
1711
+ export declare interface ReportTemplateReviewProgress {
1712
+ completed: number;
1713
+ total: number;
1714
+ stage: "template" | "baseline" | "bindings" | "fixture";
1715
+ fixture?: string;
1716
+ }
1717
+
1609
1718
  /** compareAndSwap 必须由宿主数据库/文件适配器保证原子性,不能用先读再无条件写替代。 */
1610
1719
  export declare interface ReportTemplateStore {
1611
1720
  read(id: string, signal?: AbortSignal): Promise<ReportTemplateRecord | undefined>;
@@ -1634,6 +1743,9 @@ export declare interface ReportTemplateVersion {
1634
1743
  restoredFrom?: string;
1635
1744
  }
1636
1745
 
1746
+ /** Optional business explanations never replace raw data or schema validation. */
1747
+ export declare type ReportValueState = "missing-source" | "not-applicable" | "not-calculable";
1748
+
1637
1749
  /**
1638
1750
  * 边框开关解析:
1639
1751
  * - 未声明(undefined)→ 四边全开(与既有 rect 总有边框的行为兼容)
@@ -1702,6 +1814,9 @@ export declare function resolveTextColor(style: Pick<ComponentStyle, "color"> |
1702
1814
  /** Pure preflight uses explicit samples only; it never fetches business data or publishes a draft. */
1703
1815
  export declare function reviewReportTemplate(input: unknown, options?: ReportTemplateReviewOptions): ReportTemplateReview;
1704
1816
 
1817
+ /** Yields between structural/baseline checks and every bounded fixture; no fetching or persistence. */
1818
+ export declare function reviewReportTemplateAsync(input: unknown, options?: ReportTemplateReviewAsyncOptions): Promise<ReportTemplateReview>;
1819
+
1705
1820
  export declare interface RichParagraph {
1706
1821
  segments: RichSegment[];
1707
1822
  align?: ComponentStyle["align"];
@@ -1812,11 +1927,50 @@ export declare class TemplateBuilder {
1812
1927
 
1813
1928
  export declare type TemplateComponent = PlanComponent | ListComponent;
1814
1929
 
1930
+ export declare interface TemplateFieldUsage extends TemplateOutlineLocation {
1931
+ dataset: string;
1932
+ field: string;
1933
+ kind: "display" | "calculation" | "binding";
1934
+ }
1935
+
1936
+ export declare interface TemplateFragmentBindings {
1937
+ datasets?: Record<string, string>;
1938
+ fields?: Record<string, Record<string, string>>;
1939
+ }
1940
+
1941
+ export declare interface TemplateFragmentInsertOptions {
1942
+ pageIndex: number;
1943
+ leftMm?: number;
1944
+ topMm?: number;
1945
+ bindings?: TemplateFragmentBindings;
1946
+ replaceInstance?: string;
1947
+ }
1948
+
1949
+ export declare interface TemplateFragmentResult {
1950
+ document: ReportTemplateDocument;
1951
+ componentIndices: number[];
1952
+ instance: string;
1953
+ }
1954
+
1815
1955
  export declare interface TemplateMutationOptions {
1816
1956
  expectedRevision: string | null;
1817
1957
  signal?: AbortSignal;
1818
1958
  }
1819
1959
 
1960
+ export declare interface TemplateOutlineEntry extends TemplateOutlineLocation {
1961
+ kind: "page" | "component" | "field" | "calculation" | "binding";
1962
+ title: string;
1963
+ dataset?: string;
1964
+ depth: number;
1965
+ }
1966
+
1967
+ export declare interface TemplateOutlineLocation {
1968
+ path: string;
1969
+ pageIndex?: number;
1970
+ componentIndex?: number;
1971
+ field?: string;
1972
+ }
1973
+
1820
1974
  export declare interface TemplatePage {
1821
1975
  widthMm: number;
1822
1976
  heightMm: number;
@@ -1832,6 +1986,8 @@ export declare interface TemplatePage {
1832
1986
  meta?: Record<string, unknown>;
1833
1987
  }
1834
1988
 
1989
+ export declare function templatePathLocation(path: string): Pick<TemplateOutlineLocation, "pageIndex" | "componentIndex">;
1990
+
1835
1991
  export declare interface TemplateStoreWriteOptions {
1836
1992
  publication?: ReportTemplateVersion;
1837
1993
  signal?: AbortSignal;