@agile-team/mach-report 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("./style-B3vxGDZd.cjs"),ne=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function B(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function re(e,n,r,t){const i=e[n];i!=null&&(typeof i!="number"||!Number.isFinite(i))&&t.push({path:`${r}.${n}`,message:`应为有限数字,实际 ${JSON.stringify(i)}`})}function I(e,n,r,t=[]){if(!B(e)){r.push({path:n,message:"组件应为对象"});return}const i=e.kind;typeof i!="string"?r.push({path:`${n}.kind`,message:"组件缺少 kind 字符串"}):ne.has(i)||t.push({path:`${n}.kind`,message:`未知组件类型 ${JSON.stringify(i)},将以兜底方式渲染`});for(const o of["leftMm","topMm","widthMm","heightMm"])re(e,o,n,r);e.leftMm!=null&&e.widthMm!=null&&(e.leftMm<-100||e.widthMm<0)&&r.push({path:n,message:"几何数值异常(leftMm<-100 或 widthMm<0)"});const d=e.grid;d!==void 0&&(!B(d)||!Array.isArray(d.cells)?r.push({path:`${n}.grid.cells`,message:"grid.cells 应为二维数组"}):d.cells.forEach((o,l)=>{if(!Array.isArray(o)){r.push({path:`${n}.grid.cells.${l}`,message:"行应为数组"});return}o.forEach((h,c)=>{h!=null&&B(h)&&Array.isArray(h.children)&&h.children.forEach((m,g)=>{I(m,`${n}.grid.cells.${l}.${c}.children.${g}`,r,t)})})}));const a=e.richParagraphs;a!==void 0&&(Array.isArray(a)?a.forEach((o,l)=>{(!B(o)||!Array.isArray(o.segments))&&r.push({path:`${n}.richParagraphs.${l}`,message:"段落缺少 segments 数组"})}):r.push({path:`${n}.richParagraphs`,message:"richParagraphs 应为数组"}))}function V(e,n,r,t=[]){if(!B(e)){r.push({path:n,message:"页应为对象"});return}const i=e.pageWidthMm,d=e.pageHeightMm;(typeof i!="number"||!(i>0&&i<3e3))&&r.push({path:`${n}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(i)}`}),(typeof d!="number"||!(d>0&&d<5e3))&&r.push({path:`${n}.pageHeightMm`,message:`页高非法: ${JSON.stringify(d)}`});const a=e.components;a!==void 0&&!Array.isArray(a)?r.push({path:`${n}.components`,message:"components 应为数组"}):Array.isArray(a)&&a.forEach((o,l)=>I(o,`${n}.components.${l}`,r,t))}function U(e){const n=[],r=[],t=B(e)?e.pages:void 0;return Array.isArray(t)?t.forEach((i,d)=>V(i,`$.pages.${d}`,n,r)):n.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"}),{ok:n.length===0,errors:n,warnings:r}}function ie(e){const n=U(e);if(!n.ok){const r=n.errors.slice(0,3).map(t=>`${t.path}: ${t.message}`).join("; ");throw new Error(`渲染计划校验失败(${n.errors.length} 处): ${r}`)}return e.pages}function G(e){return{widthMm:e.widthMm,heightMm:e.heightMm,marginTopMm:e.marginTopMm??0,marginBottomMm:e.marginBottomMm??0,marginLeftMm:e.marginLeftMm??0,marginRightMm:e.marginRightMm??0,components:[]}}function oe(e,n){return n.heightMm-(e.marginBottomMm??n.marginBottomMm)}function ae(e,n){const t=(e.fontSizePt??s.DEFAULT_FONT_PT)*s.LINE_HEIGHT*25.4/72,i=(e.paddingMm??1)*2;return Math.max(e.rowHeightMm??0,n*t+i)}function se(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number")return String(e);if(typeof e=="boolean")return e?"是":"否";if(e instanceof Date)return e.toISOString().slice(0,10);try{return JSON.stringify(e)}catch{return String(e)}}function le(e,n){const r=e.fontSizePt??s.DEFAULT_FONT_PT,t=e.paddingMm??1,i=e.columns.map(g=>g.style?{align:"left",verticalAlign:"middle",...g.style}:{align:"left",verticalAlign:"middle"}),d=e.columns.map(g=>({bold:e.headerBold??!0,align:"center",verticalAlign:"middle",backgroundColor:e.headerBackgroundColor,...g.style||{}})),a=e.columns.map(g=>g.header),o=a.map((g,u)=>s.wrapText(g,e.columns[u].widthMm-t*2,{fontSizePt:r,bold:e.headerBold??!0},n)),l=Math.max(...o.map(g=>g.length),1),h=ae(e,l),c=a.map((g,u)=>({text:g,style:d[u]})),m=e.border===!1?{borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}:{borderBottom:!0,borderLeft:!0,borderRight:!0,borderTop:!0};return{fontSizePt:r,paddingMm:t,cellStyles:i,borderStyle:m,headerHeightMm:h,headerGrid:{cells:[c],rowHeightsMm:[h]},columns:e.columns}}function de(e,n,r){const t=e.columns,i=new Array(t.length);let d=1;for(let c=0;c<t.length;c++)i[c]=se(n[t[c].field]);const a=new Array(t.length);for(let c=0;c<t.length;c++){const m=s.wrapText(i[c],t[c].widthMm-e.paddingMm*2,{fontSizePt:e.fontSizePt},r);a[c]=m,m.length>d&&(d=m.length)}const o=e.fontSizePt*s.LINE_HEIGHT*25.4/72,l=Math.max(e.rowHeightFloorMm,d*o+e.paddingMm*2),h=new Array(t.length);for(let c=0;c<t.length;c++)h[c]={text:i[c],style:e.cellStyles[c]};return{grid:{cells:[h],rowHeightsMm:[l]},heightMm:l}}function he(e,n,r={}){const t=typeof r=="number"?{mmPerRow:r}:r,i=t.mmPerRow??0,d=t.measurer??s.heuristicMeasurer,a=[],o=[];let l=0;const h=c=>`${c}_${(++l).toString(36)}`;for(const c of e.pages){const m=G(c),g=()=>oe(c,m),u=m.marginTopMm,f=()=>{o.push({pageWidthMm:m.widthMm,pageHeightMm:m.heightMm,marginTopMm:m.marginTopMm,marginBottomMm:m.marginBottomMm,marginLeftMm:m.marginLeftMm,marginRightMm:m.marginRightMm,components:m.components})};for(const b of c.components){if(b.kind!=="list"){m.components.push(b);continue}const M=b,C=n[M.dataset];Array.isArray(C)||a.push(`数据集 ${M.dataset} 未提供数据,列表 ${M.id??""} 输出为空`);const P=Array.isArray(C)?C:[],H=M.columns.reduce((y,w)=>y+w.widthMm,0),S=H>M.widthMm?M.widthMm/H:1,F=S===1?M:{...M,columns:M.columns.map(y=>({...y,widthMm:y.widthMm*S}))},_={...le(F,d),rowHeightFloorMm:F.rowHeightMm??0},z={kind:"rect",leftMm:M.leftMm,topMm:0,widthMm:M.widthMm,heightMm:_.headerHeightMm,grid:_.headerGrid,nid:h("listh"),style:_.borderStyle};let $=M.topMm;const p=(y,w)=>{y.components.push({...z,topMm:w})};p(m,$),$+=_.headerHeightMm+i;for(let y=0;y<P.length;y++){const w=de(_,P[y],d);if($+w.heightMm>g()){f();const T=G(c);m.components=T.components,m.heightMm=T.heightMm,F.headerEveryPage!==!1?(p(m,M.topMm),$=M.topMm+_.headerHeightMm):$=u}m.components.push({kind:"rect",leftMm:M.leftMm,topMm:$,widthMm:M.widthMm,heightMm:w.heightMm,grid:w.grid,nid:h("listr"),style:_.borderStyle}),$+=w.heightMm}}f()}return{plan:{schemaVersion:s.RENDER_PLAN_SCHEMA_VERSION,pages:o},warnings:a}}const ce={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 x(e,n){return n?.classNames?.[e]??ce[e]}class R{constructor(){this.props=[]}add(n,r){return r==null||r===!1||r===""?this:(this.props.push([n,String(r)]),this)}mm(n,r,t,i=2){return this.add(n,`${s.round(s.mmToPx(r,t),i)}px`)}toString(){let n="";for(const[r,t]of this.props)n+=`${r}:${t};`;return n}applyTo(n){const r=this.toString();r&&(n.style.cssText=r)}}function J(e,n,r){const t=n.style||{};e.add("color",t.color).add("background-color",t.backgroundColor).add("font-family",t.fontFamily).add("font-weight",t.bold?"700":void 0).add("font-style",t.italic?"italic":void 0).add("text-decoration",t.underline?"underline":void 0).add("letter-spacing",t.letterSpacing!=null?`${t.letterSpacing}pt`:void 0).add("opacity",t.opacity!=null?String(t.opacity):void 0).add("transform",t.rotateDeg?`rotate(${t.rotateDeg}deg)`:void 0);const i=s.resolveFontSize(t,r);e.add("font-size",`${s.round(i.fontSizePx,2)}px`)}function me(e,n,r,t,i){const d=i.createElement("table");if(d.className=x("grid",t),new R().add("width","100%").add("height","100%").add("border-collapse","collapse").add("table-layout",e.colWidthsMm?"fixed":"auto").applyTo(d),e.colWidthsMm){const h=i.createElement("colgroup");for(const c of e.colWidthsMm){const m=i.createElement("col");new R().mm("width",c,r).applyTo(m),h.appendChild(m)}d.appendChild(h)}const a=s.resolveBoxBorders(n.style),o=s.resolveStroke(n.style),l=a.inner?`${s.round(o.widthPt*r/72,2)}px solid ${o.color}`:"";return e.cells.forEach((h,c)=>{const m=i.createElement("tr");m.className=x("row",t),e.rowHeightsMm?.[c]!=null&&new R().mm("height",e.rowHeightsMm[c],r).applyTo(m),(h||[]).forEach(g=>{const u=i.createElement("td");u.className=x("cell",t),g?.colSpan&&(u.colSpan=g.colSpan),g?.rowSpan&&(u.rowSpan=g.rowSpan);const f=new R;if(l&&f.add("border",l),g?.style){const b=g.style;f.add("text-align",b.align).add("vertical-align",b.verticalAlign).add("background-color",b.backgroundColor).add("color",b.color).add("font-weight",b.bold?"700":void 0),f.add("font-size",`${s.round(s.resolveFontSize(b,r).fontSizePx,2)}px`)}if(f.applyTo(u),g?.text!=null&&(u.textContent=g.text),g?.children?.length)for(const b of g.children)u.appendChild(O(b,r,t,i));m.appendChild(u)}),d.appendChild(m)}),d}function ge(e,n,r,t){const i=t.createElement("div");i.className=x("text",r);const d=e.style||{},a=new R().add("text-align",d.align).add("display","flex").add("flex-direction","column").add("justify-content",d.verticalAlign==="middle"?"center":d.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow","hidden");if(J(a,e,n),a.applyTo(i),s.isRichText(e)){const o=t.createElement("div");o.className=x("rich",r);for(const l of e.richParagraphs){const h=t.createElement("div");h.className=x("paragraph",r),new R().add("text-align",l.align).add("line-height",l.lineHeight!=null?String(l.lineHeight):void 0).mm("margin-top",l.spaceBeforeMm??0,n).mm("margin-bottom",l.spaceAfterMm??0,n).mm("text-indent",l.indentMm??0,n).applyTo(h);for(const m of l.segments||[]){const g=t.createElement("span");if(g.className=x("segment",r),g.textContent=m.kind==="field"?m.field??"":m.text??"",m.style){const u=new R().add("color",m.style.color).add("font-weight",m.style.bold?"700":void 0);u.add("font-size",`${s.round(s.resolveFontSize(m.style,n).fontSizePx,2)}px`),u.applyTo(g)}h.appendChild(g)}o.appendChild(h)}return i.appendChild(o),i}if(Array.isArray(e.lines)&&e.lines.length>0){const o=t.createElement("div");o.className=x("lines",r),d.lineHeight!=null&&new R().add("line-height",String(d.lineHeight)).applyTo(o);for(const l of e.lines){const h=t.createElement("div");h.className=x("line",r),h.textContent=l,o.appendChild(h)}return i.appendChild(o),i}return i.textContent=e.text??"",i}function fe(e,n,r){const t=r.createElement("img");return t.className=x("image",n),t.src=e.imageData,new R().add("width","100%").add("height","100%").add("object-fit","contain").add("display","block").applyTo(t),t.alt=e.kind,t}function j(e,n,r,t){const i=t.createElement("div");i.className=x("shape",r);const d=e.style||{},a=s.resolveStroke(d),o=s.resolveBoxBorders(d),l=`${s.round(a.widthPt*n/72,2)}px solid ${a.color}`,h=new R;return e.grid||e.kind==="rect"?(o.top&&h.add("border-top",l),o.right&&h.add("border-right",l),o.bottom&&h.add("border-bottom",l),o.left&&h.add("border-left",l)):e.kind==="ellipse"?(o.inner&&h.add("border",l).add("border-radius","50%"),d.backgroundColor&&h.add("background-color",d.backgroundColor)):e.kind==="line"&&h.add("height","0").add("border-top",l),h.add("box-sizing","border-box").add("width","100%").add("height","100%"),h.applyTo(i),i}function O(e,n,r,t){const i=t.createElement("div");i.className=`${x("comp",r)} mr-kind-${e.kind}`;const d=new R().add("position","absolute").mm("left",e.leftMm,n).mm("top",e.topMm,n).mm("width",e.widthMm,n).mm("height",e.heightMm,n).add("box-sizing","border-box");if(J(d,e,n),d.applyTo(i),s.isImageBackedComponent(e))return i.appendChild(fe(e,r,t)),i;if(e.kind==="text")return i.appendChild(ge(e,n,r,t)),i;if(e.grid){const o=j(e,n,r,t);return o.appendChild(me(e.grid,e,n,r,t)),i.appendChild(o),i}if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse"||e.kind==="chart")return i.appendChild(j(e,n,r,t)),i;const a=t.createElement("div");return a.className=x("unknown",r),a.textContent=e.fallbackText??"",i.appendChild(a),i}function q(e,n,r,t){const i=t.createElement("div");i.className=x("page",r),new R().add("position","relative").mm("width",e.pageWidthMm,n).mm("height",e.pageHeightMm,n).add("background-color","#fff").add("overflow","hidden").add("box-sizing","border-box").applyTo(i);for(const d of e.components)i.appendChild(O(d,n,r,t));return i}function ue(e,n,r={}){const t=r.dpi??96,i=n.createElement("div");return i.className=x("root",r),i.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(d=>{i.appendChild(q(d,t,r,n))}),i}function K(e){const{pageHeightsPx:n,viewportHeightPx:r,scrollTopPx:t,overscan:i=1,gapPx:d=0}=e,a=n.length;if(a===0)return{start:0,end:-1,padTopPx:0,padBottomPx:0};const o=Math.max(0,d),l=new Array(a+1);l[0]=0;for(let S=0;S<a;S++)l[S+1]=l[S]+Math.max(0,n[S]??0)+o;const h=l[a],c=Math.max(0,t);let m=0,g=0,u=a-1;for(;g<=u;){const S=g+u>>1;l[S]<=c?(m=S,g=S+1):u=S-1}const f=Math.max(0,Math.min(a-1,m-i)),b=l[m]+Math.max(0,r);let M=a-1;for(g=0,u=a-1;g<=u;){const S=g+u>>1;l[S+1]<b?g=S+1:(M=S,u=S-1)}const C=Math.min(a-1,M+i),P=l[f],H=Math.max(0,h-l[C+1]);return{start:f,end:C,padTopPx:P,padBottomPx:H}}const D=96/25.4;function W(e,n=96){const r=n/96*D;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*r)),heightPx:Math.max(1,Math.round(e.pageHeightMm*r))}}function pe(e,n,r){const t=document.createElement("canvas"),{widthPx:i,heightPx:d}=W(e,r);t.width=Math.round(i*n),t.height=Math.round(d*n),t.style.width=`${i}px`,t.style.height=`${d}px`;const a=t.getContext("2d");if(!a)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return a.scale(n,n),a.fillStyle="#ffffff",a.fillRect(0,0,i,d),{canvas:t,ctx:a}}function Me(e,n=96){return s.resolveFontSize(e,n).fontSizePx}function X(e,n,r,t,i,d,a,o="top"){e.font=`${n.bold?"bold ":""}${n.fontSizePx}px ${a}`,e.fillStyle=n.color,e.textBaseline="alphabetic";const l=n.fontSizePx*n.lineHeight,h=n.text===""?[""]:n.text.split(`
2
- `),c=h.length*l;let m=t;o==="middle"?m=t+(d-c)/2:o==="bottom"&&(m=t+d-c),h.forEach((g,u)=>{e.textAlign=n.align==="center"?"center":n.align==="right"?"right":"left";const f=n.align==="center"?r+i/2:n.align==="right"?r+i:r;e.fillText(g,f,m+u*l+n.fontSizePx*.8,i)}),e.textAlign="left"}function Te(e,n,r,t,i,d,a,o,l,h,c){const m=s.resolveGridLayout(n,d/o,a/o),g=s.resolveBoxBorders(r.style),u=s.resolveStroke(r.style);for(const f of m.cells){const b=f.cell.style?.backgroundColor;b&&(e.fillStyle=b,e.fillRect(t+f.xMm*o,i+f.yMm*o,f.widthMm*o,f.heightMm*o))}if(g.inner){e.strokeStyle=u.color,e.lineWidth=s.ptToPx(u.widthPt,l);for(const f of m.edges)e.beginPath(),f.kind==="v"?(e.moveTo(t+f.pos*o,i+f.from*o),e.lineTo(t+f.pos*o,i+f.to*o)):(e.moveTo(t+f.from*o,i+f.pos*o),e.lineTo(t+f.to*o,i+f.pos*o)),e.stroke();e.beginPath(),g.top&&(e.moveTo(t,i),e.lineTo(t+d,i)),g.right&&(e.moveTo(t+d,i),e.lineTo(t+d,i+a)),g.bottom&&(e.moveTo(t+d,i+a),e.lineTo(t,i+a)),g.left&&(e.moveTo(t,i+a),e.lineTo(t,i)),e.stroke()}for(const f of m.cells){const b=typeof f.cell.text=="string"?f.cell.text:"";if(!b)continue;const M=f.cell.style,C=M?.fontSize??s.DEFAULT_FONT_PT,P=s.wrapText(b,f.widthMm-1,{fontSizePt:C},c).join(`
3
- `);X(e,{text:P,fontSizePx:s.resolveFontSize(M,l).fontSizePx,bold:M?.bold??!1,color:M?.color??s.resolveTextColor(r.style,s.DEFAULT_TEXT_COLOR),align:M?.align??"left",lineHeight:s.LINE_HEIGHT},t+(f.xMm+.5)*o,i+f.yMm*o,Math.max(0,(f.widthMm-1)*o),f.heightMm*o,h,M?.verticalAlign??"middle")}}function Z(e,n,r,t,i,d){const a=n.leftMm*r,o=n.topMm*r,l=n.widthMm*r,h=n.heightMm*r,c=n.style??{};if(n.grid){Te(e,n.grid,n,a,o,l,h,r,t,i,d);return}switch(n.kind){case"text":{const m=c.fontSize??s.DEFAULT_FONT_PT,g=s.isRichText(n)?n.richParagraphs.map(u=>(u.segments??[]).map(f=>f.text??f.field??"").join("")).join(`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("./style-B3vxGDZd.cjs"),re=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function B(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ie(e,n,r,t){const i=e[n];i!=null&&(typeof i!="number"||!Number.isFinite(i))&&t.push({path:`${r}.${n}`,message:`应为有限数字,实际 ${JSON.stringify(i)}`})}function O(e,n,r,t=[]){if(!B(e)){r.push({path:n,message:"组件应为对象"});return}const i=e.kind;typeof i!="string"?r.push({path:`${n}.kind`,message:"组件缺少 kind 字符串"}):re.has(i)||t.push({path:`${n}.kind`,message:`未知组件类型 ${JSON.stringify(i)},将以兜底方式渲染`});for(const o of["leftMm","topMm","widthMm","heightMm"])ie(e,o,n,r);e.leftMm!=null&&e.widthMm!=null&&(e.leftMm<-100||e.widthMm<0)&&r.push({path:n,message:"几何数值异常(leftMm<-100 或 widthMm<0)"});const l=e.grid;l!==void 0&&(!B(l)||!Array.isArray(l.cells)?r.push({path:`${n}.grid.cells`,message:"grid.cells 应为二维数组"}):l.cells.forEach((o,d)=>{if(!Array.isArray(o)){r.push({path:`${n}.grid.cells.${d}`,message:"行应为数组"});return}o.forEach((h,c)=>{h!=null&&B(h)&&Array.isArray(h.children)&&h.children.forEach((m,g)=>{O(m,`${n}.grid.cells.${d}.${c}.children.${g}`,r,t)})})}));const a=e.richParagraphs;a!==void 0&&(Array.isArray(a)?a.forEach((o,d)=>{(!B(o)||!Array.isArray(o.segments))&&r.push({path:`${n}.richParagraphs.${d}`,message:"段落缺少 segments 数组"})}):r.push({path:`${n}.richParagraphs`,message:"richParagraphs 应为数组"}))}function U(e,n,r,t=[]){if(!B(e)){r.push({path:n,message:"页应为对象"});return}const i=e.pageWidthMm,l=e.pageHeightMm;(typeof i!="number"||!(i>0&&i<3e3))&&r.push({path:`${n}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(i)}`}),(typeof l!="number"||!(l>0&&l<5e3))&&r.push({path:`${n}.pageHeightMm`,message:`页高非法: ${JSON.stringify(l)}`});const a=e.components;a!==void 0&&!Array.isArray(a)?r.push({path:`${n}.components`,message:"components 应为数组"}):Array.isArray(a)&&a.forEach((o,d)=>O(o,`${n}.components.${d}`,r,t))}function J(e){const n=[],r=[],t=B(e)?e.pages:void 0;if(!Array.isArray(t))n.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"});else{t.forEach((l,a)=>U(l,`$.pages.${a}`,n,r)),t.length>2e3&&r.push({path:"$.pages",message:`页数异常大(${t.length} 页),渲染与打印耗时可能显著增加`});const i=t.reduce((l,a)=>l+(B(a)&&Array.isArray(a.components)?a.components.length:0),0);i>5e4&&r.push({path:"$.pages",message:`组件总数异常大(${i} 个),可能触发浏览器性能限制`})}return{ok:n.length===0,errors:n,warnings:r}}function oe(e){const n=J(e);if(!n.ok){const r=n.errors.slice(0,3).map(t=>`${t.path}: ${t.message}`).join("; ");throw new Error(`渲染计划校验失败(${n.errors.length} 处): ${r}`)}return e.pages}function j(e){return{widthMm:e.widthMm,heightMm:e.heightMm,marginTopMm:e.marginTopMm??0,marginBottomMm:e.marginBottomMm??0,marginLeftMm:e.marginLeftMm??0,marginRightMm:e.marginRightMm??0,components:[]}}function ae(e,n){return n.heightMm-(e.marginBottomMm??n.marginBottomMm)}function se(e,n){const t=(e.fontSizePt??s.DEFAULT_FONT_PT)*s.LINE_HEIGHT*25.4/72,i=(e.paddingMm??1)*2;return Math.max(e.rowHeightMm??0,n*t+i)}function le(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number")return String(e);if(typeof e=="boolean")return e?"是":"否";if(e instanceof Date)return e.toISOString().slice(0,10);try{return JSON.stringify(e)}catch{return String(e)}}function de(e,n){const r=e.fontSizePt??s.DEFAULT_FONT_PT,t=e.paddingMm??1,i=e.columns.map(g=>g.style?{align:"left",verticalAlign:"middle",...g.style}:{align:"left",verticalAlign:"middle"}),l=e.columns.map(g=>({bold:e.headerBold??!0,align:"center",verticalAlign:"middle",backgroundColor:e.headerBackgroundColor,...g.style||{}})),a=e.columns.map(g=>g.header),o=a.map((g,p)=>s.wrapText(g,e.columns[p].widthMm-t*2,{fontSizePt:r,bold:e.headerBold??!0},n)),d=Math.max(...o.map(g=>g.length),1),h=se(e,d),c=a.map((g,p)=>({text:g,style:l[p]})),m=e.border===!1?{borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}:{borderBottom:!0,borderLeft:!0,borderRight:!0,borderTop:!0};return{fontSizePt:r,paddingMm:t,cellStyles:i,borderStyle:m,headerHeightMm:h,headerGrid:{cells:[c],rowHeightsMm:[h]},columns:e.columns}}function he(e,n,r){const t=e.columns,i=new Array(t.length);let l=1;for(let c=0;c<t.length;c++)i[c]=le(n[t[c].field]);const a=new Array(t.length);for(let c=0;c<t.length;c++){const m=s.wrapText(i[c],t[c].widthMm-e.paddingMm*2,{fontSizePt:e.fontSizePt},r);a[c]=m,m.length>l&&(l=m.length)}const o=e.fontSizePt*s.LINE_HEIGHT*25.4/72,d=Math.max(e.rowHeightFloorMm,l*o+e.paddingMm*2),h=new Array(t.length);for(let c=0;c<t.length;c++)h[c]={text:i[c],style:e.cellStyles[c]};return{grid:{cells:[h],rowHeightsMm:[d]},heightMm:d}}function ce(e,n,r={}){const t=typeof r=="number"?{mmPerRow:r}:r,i=t.mmPerRow??0,l=t.measurer??s.heuristicMeasurer,a=[],o=[];let d=0;const h=c=>`${c}_${(++d).toString(36)}`;for(const c of e.pages){const m=j(c),g=()=>ae(c,m),p=m.marginTopMm,f=()=>{o.push({pageWidthMm:m.widthMm,pageHeightMm:m.heightMm,marginTopMm:m.marginTopMm,marginBottomMm:m.marginBottomMm,marginLeftMm:m.marginLeftMm,marginRightMm:m.marginRightMm,components:m.components})};for(const T of c.components){if(T.kind!=="list"){m.components.push(T);continue}const M=T,x=n[M.dataset];Array.isArray(x)||a.push(`数据集 ${M.dataset} 未提供数据,列表 ${M.id??""} 输出为空`);const v=Array.isArray(x)?x:[],R=M.columns.reduce((u,b)=>u+b.widthMm,0),S=R>M.widthMm?M.widthMm/R:1,z=S===1?M:{...M,columns:M.columns.map(u=>({...u,widthMm:u.widthMm*S}))},_={...de(z,l),rowHeightFloorMm:z.rowHeightMm??0},I={kind:"rect",leftMm:M.leftMm,topMm:0,widthMm:M.widthMm,heightMm:_.headerHeightMm,grid:_.headerGrid,nid:h("listh"),style:_.borderStyle};let $=M.topMm;const L=(u,b)=>{u.components.push({...I,topMm:b})};L(m,$),$+=_.headerHeightMm+i;for(let u=0;u<v.length;u++){const b=he(_,v[u],l);if($+b.heightMm>g()){f();const k=j(c);m.components=k.components,m.heightMm=k.heightMm,z.headerEveryPage!==!1?(L(m,M.topMm),$=M.topMm+_.headerHeightMm):$=p}m.components.push({kind:"rect",leftMm:M.leftMm,topMm:$,widthMm:M.widthMm,heightMm:b.heightMm,grid:b.grid,nid:h("listr"),style:_.borderStyle}),$+=b.heightMm}}f()}return{plan:{schemaVersion:s.RENDER_PLAN_SCHEMA_VERSION,pages:o},warnings:a}}const me={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 E(e,n){return n?.classNames?.[e]??me[e]}class H{constructor(){this.props=[]}add(n,r){return r==null||r===!1||r===""?this:(this.props.push([n,String(r)]),this)}mm(n,r,t,i=2){return this.add(n,`${s.round(s.mmToPx(r,t),i)}px`)}toString(){let n="";for(const[r,t]of this.props)n+=`${r}:${t};`;return n}applyTo(n){const r=this.toString();r&&(n.style.cssText=r)}}function q(e,n,r){const t=n.style||{};e.add("color",t.color).add("background-color",t.backgroundColor).add("font-family",t.fontFamily).add("font-weight",t.bold?"700":void 0).add("font-style",t.italic?"italic":void 0).add("text-decoration",t.underline?"underline":void 0).add("letter-spacing",t.letterSpacing!=null?`${t.letterSpacing}pt`:void 0).add("opacity",t.opacity!=null?String(t.opacity):void 0).add("transform",t.rotateDeg?`rotate(${t.rotateDeg}deg)`:void 0);const i=s.resolveFontSize(t,r);e.add("font-size",`${s.round(i.fontSizePx,2)}px`)}function ge(e,n,r,t,i){const l=i.createElement("table");if(l.className=E("grid",t),new H().add("width","100%").add("height","100%").add("border-collapse","collapse").add("table-layout",e.colWidthsMm?"fixed":"auto").applyTo(l),e.colWidthsMm){const h=i.createElement("colgroup");for(const c of e.colWidthsMm){const m=i.createElement("col");new H().mm("width",c,r).applyTo(m),h.appendChild(m)}l.appendChild(h)}const a=s.resolveBoxBorders(n.style),o=s.resolveStroke(n.style),d=a.inner?`${s.round(o.widthPt*r/72,2)}px solid ${o.color}`:"";return e.cells.forEach((h,c)=>{const m=i.createElement("tr");m.className=E("row",t),e.rowHeightsMm?.[c]!=null&&new H().mm("height",e.rowHeightsMm[c],r).applyTo(m),(h||[]).forEach(g=>{const p=i.createElement("td");p.className=E("cell",t),g?.colSpan&&(p.colSpan=g.colSpan),g?.rowSpan&&(p.rowSpan=g.rowSpan);const f=new H;if(d&&f.add("border",d),g?.style){const T=g.style;f.add("text-align",T.align).add("vertical-align",T.verticalAlign).add("background-color",T.backgroundColor).add("color",T.color).add("font-weight",T.bold?"700":void 0),f.add("font-size",`${s.round(s.resolveFontSize(T,r).fontSizePx,2)}px`)}if(f.applyTo(p),g?.text!=null&&(p.textContent=g.text),g?.children?.length)for(const T of g.children)p.appendChild(D(T,r,t,i));m.appendChild(p)}),l.appendChild(m)}),l}function fe(e,n,r,t){const i=t.createElement("div");i.className=E("text",r);const l=e.style||{},a=new H().add("text-align",l.align).add("display","flex").add("flex-direction","column").add("justify-content",l.verticalAlign==="middle"?"center":l.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow","hidden");if(q(a,e,n),a.applyTo(i),s.isRichText(e)){const o=t.createElement("div");o.className=E("rich",r);for(const d of e.richParagraphs){const h=t.createElement("div");h.className=E("paragraph",r),new H().add("text-align",d.align).add("line-height",d.lineHeight!=null?String(d.lineHeight):void 0).mm("margin-top",d.spaceBeforeMm??0,n).mm("margin-bottom",d.spaceAfterMm??0,n).mm("text-indent",d.indentMm??0,n).applyTo(h);for(const m of d.segments||[]){const g=t.createElement("span");if(g.className=E("segment",r),g.textContent=m.kind==="field"?m.field??"":m.text??"",m.style){const p=new H().add("color",m.style.color).add("font-weight",m.style.bold?"700":void 0);p.add("font-size",`${s.round(s.resolveFontSize(m.style,n).fontSizePx,2)}px`),p.applyTo(g)}h.appendChild(g)}o.appendChild(h)}return i.appendChild(o),i}if(Array.isArray(e.lines)&&e.lines.length>0){const o=t.createElement("div");o.className=E("lines",r),l.lineHeight!=null&&new H().add("line-height",String(l.lineHeight)).applyTo(o);for(const d of e.lines){const h=t.createElement("div");h.className=E("line",r),h.textContent=d,o.appendChild(h)}return i.appendChild(o),i}return i.textContent=e.text??"",i}function ue(e,n,r){const t=r.createElement("img");return t.className=E("image",n),t.src=e.imageData,new H().add("width","100%").add("height","100%").add("object-fit","contain").add("display","block").applyTo(t),t.alt=e.kind,t}function V(e,n,r,t){const i=t.createElement("div");i.className=E("shape",r);const l=e.style||{},a=s.resolveStroke(l),o=s.resolveBoxBorders(l),d=`${s.round(a.widthPt*n/72,2)}px solid ${a.color}`,h=new H;return e.grid||e.kind==="rect"?(o.top&&h.add("border-top",d),o.right&&h.add("border-right",d),o.bottom&&h.add("border-bottom",d),o.left&&h.add("border-left",d)):e.kind==="ellipse"?(o.inner&&h.add("border",d).add("border-radius","50%"),l.backgroundColor&&h.add("background-color",l.backgroundColor)):e.kind==="line"&&h.add("height","0").add("border-top",d),h.add("box-sizing","border-box").add("width","100%").add("height","100%"),h.applyTo(i),i}function D(e,n,r,t){const i=t.createElement("div");i.className=`${E("comp",r)} mr-kind-${e.kind}`;const l=new H().add("position","absolute").mm("left",e.leftMm,n).mm("top",e.topMm,n).mm("width",e.widthMm,n).mm("height",e.heightMm,n).add("box-sizing","border-box");if(q(l,e,n),l.applyTo(i),s.isImageBackedComponent(e))return i.appendChild(ue(e,r,t)),i;if(e.kind==="text")return i.appendChild(fe(e,n,r,t)),i;if(e.grid){const o=V(e,n,r,t);return o.appendChild(ge(e.grid,e,n,r,t)),i.appendChild(o),i}if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse"||e.kind==="chart")return i.appendChild(V(e,n,r,t)),i;const a=t.createElement("div");return a.className=E("unknown",r),a.textContent=e.fallbackText??"",i.appendChild(a),i}function K(e,n,r,t){const i=t.createElement("div");i.className=E("page",r),new H().add("position","relative").mm("width",e.pageWidthMm,n).mm("height",e.pageHeightMm,n).add("background-color","#fff").add("overflow","hidden").add("box-sizing","border-box").applyTo(i);for(const l of e.components)i.appendChild(D(l,n,r,t));return i}function pe(e,n,r={}){const t=r.dpi??96,i=n.createElement("div");return i.className=E("root",r),i.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(l=>{i.appendChild(K(l,t,r,n))}),i}function X(e){const{pageHeightsPx:n,viewportHeightPx:r,scrollTopPx:t,overscan:i=1,gapPx:l=0}=e,a=n.length;if(a===0)return{start:0,end:-1,padTopPx:0,padBottomPx:0};const o=Math.max(0,l),d=new Array(a+1);d[0]=0;for(let S=0;S<a;S++)d[S+1]=d[S]+Math.max(0,n[S]??0)+o;const h=d[a],c=Math.max(0,t);let m=0,g=0,p=a-1;for(;g<=p;){const S=g+p>>1;d[S]<=c?(m=S,g=S+1):p=S-1}const f=Math.max(0,Math.min(a-1,m-i)),T=d[m]+Math.max(0,r);let M=a-1;for(g=0,p=a-1;g<=p;){const S=g+p>>1;d[S+1]<T?g=S+1:(M=S,p=S-1)}const x=Math.min(a-1,M+i),v=d[f],R=Math.max(0,h-d[x+1]);return{start:f,end:x,padTopPx:v,padBottomPx:R}}const W=96/25.4;function G(e,n=96){const r=n/96*W;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*r)),heightPx:Math.max(1,Math.round(e.pageHeightMm*r))}}function Me(e,n,r){const t=document.createElement("canvas"),{widthPx:i,heightPx:l}=G(e,r);t.width=Math.round(i*n),t.height=Math.round(l*n),t.style.width=`${i}px`,t.style.height=`${l}px`;const a=t.getContext("2d");if(!a)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return a.scale(n,n),a.fillStyle="#ffffff",a.fillRect(0,0,i,l),{canvas:t,ctx:a}}function Te(e,n=96){return s.resolveFontSize(e,n).fontSizePx}function Z(e,n,r,t,i,l,a,o="top"){e.font=`${n.bold?"bold ":""}${n.fontSizePx}px ${a}`,e.fillStyle=n.color,e.textBaseline="alphabetic";const d=n.fontSizePx*n.lineHeight,h=n.text===""?[""]:n.text.split(`
2
+ `),c=h.length*d;let m=t;o==="middle"?m=t+(l-c)/2:o==="bottom"&&(m=t+l-c),h.forEach((g,p)=>{e.textAlign=n.align==="center"?"center":n.align==="right"?"right":"left";const f=n.align==="center"?r+i/2:n.align==="right"?r+i:r;e.fillText(g,f,m+p*d+n.fontSizePx*.8,i)}),e.textAlign="left"}function be(e,n,r,t,i,l,a,o,d,h,c){const m=s.resolveGridLayout(n,l/o,a/o),g=s.resolveBoxBorders(r.style),p=s.resolveStroke(r.style);for(const f of m.cells){const T=f.cell.style?.backgroundColor;T&&(e.fillStyle=T,e.fillRect(t+f.xMm*o,i+f.yMm*o,f.widthMm*o,f.heightMm*o))}if(g.inner){e.strokeStyle=p.color,e.lineWidth=s.ptToPx(p.widthPt,d);for(const f of m.edges)e.beginPath(),f.kind==="v"?(e.moveTo(t+f.pos*o,i+f.from*o),e.lineTo(t+f.pos*o,i+f.to*o)):(e.moveTo(t+f.from*o,i+f.pos*o),e.lineTo(t+f.to*o,i+f.pos*o)),e.stroke();e.beginPath(),g.top&&(e.moveTo(t,i),e.lineTo(t+l,i)),g.right&&(e.moveTo(t+l,i),e.lineTo(t+l,i+a)),g.bottom&&(e.moveTo(t+l,i+a),e.lineTo(t,i+a)),g.left&&(e.moveTo(t,i+a),e.lineTo(t,i)),e.stroke()}for(const f of m.cells){const T=typeof f.cell.text=="string"?f.cell.text:"";if(!T)continue;const M=f.cell.style,x=M?.fontSize??s.DEFAULT_FONT_PT,v=s.wrapText(T,f.widthMm-1,{fontSizePt:x},c).join(`
3
+ `);Z(e,{text:v,fontSizePx:s.resolveFontSize(M,d).fontSizePx,bold:M?.bold??!1,color:M?.color??s.resolveTextColor(r.style,s.DEFAULT_TEXT_COLOR),align:M?.align??"left",lineHeight:s.LINE_HEIGHT},t+(f.xMm+.5)*o,i+f.yMm*o,Math.max(0,(f.widthMm-1)*o),f.heightMm*o,h,M?.verticalAlign??"middle")}}function Y(e,n,r,t,i,l){const a=n.leftMm*r,o=n.topMm*r,d=n.widthMm*r,h=n.heightMm*r,c=n.style??{};if(n.grid){be(e,n.grid,n,a,o,d,h,r,t,i,l);return}switch(n.kind){case"text":{const m=c.fontSize??s.DEFAULT_FONT_PT,g=s.isRichText(n)?n.richParagraphs.map(p=>(p.segments??[]).map(f=>f.text??f.field??"").join("")).join(`
4
4
  `):Array.isArray(n.lines)&&n.lines.length>0?n.lines.join(`
5
- `):s.wrapText(n.text??"",n.widthMm,{fontSizePt:m},d).join(`
6
- `);X(e,{text:g,fontSizePx:s.resolveFontSize(c,t).fontSizePx,bold:c.bold??!1,color:s.resolveTextColor(c),align:c.align??"left",lineHeight:s.resolveLineHeight(c)},a,o,l,h,i,c.verticalAlign);break}case"rect":{const m=s.resolveStroke(c),g=s.resolveBoxBorders(c);c.backgroundColor&&(e.fillStyle=c.backgroundColor,e.fillRect(a,o,l,h)),g.inner&&(e.strokeStyle=m.color,e.lineWidth=s.ptToPx(m.widthPt,t),e.beginPath(),g.top&&(e.moveTo(a,o),e.lineTo(a+l,o)),g.right&&(e.moveTo(a+l,o),e.lineTo(a+l,o+h)),g.bottom&&(e.moveTo(a+l,o+h),e.lineTo(a,o+h)),g.left&&(e.moveTo(a,o+h),e.lineTo(a,o)),e.stroke());break}case"line":{const m=s.resolveStroke({...c,borderColor:c.lineColor??c.borderColor});e.strokeStyle=m.color,e.lineWidth=s.ptToPx(m.widthPt,t),e.beginPath(),e.moveTo(a,o+h/2),e.lineTo(a+l,o+h/2),e.stroke();break}case"ellipse":{const m=s.resolveStroke(c);e.strokeStyle=m.color,e.lineWidth=s.ptToPx(m.widthPt,t),c.backgroundColor&&(e.fillStyle=c.backgroundColor,e.beginPath(),e.ellipse(a+l/2,o+h/2,l/2,h/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(a+l/2,o+h/2,l/2,h/2,0,0,Math.PI*2),e.stroke();break}}}function be(e,n={}){const r=n.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),t=n.dpi??96,i=t/96*D,d=n.fontFamily??'"Microsoft YaHei", sans-serif',a=n.measurer??s.heuristicMeasurer,o=Math.max(0,n.start??0),l=Math.min(e.pages.length-1,n.end??e.pages.length-1),h=[];for(let c=o;c<=l;c++){const m=e.pages[c],{canvas:g,ctx:u}=pe(m,r,t);for(const f of m.components)Z(u,f,i,t,d,a);h.push(g)}return{canvases:h}}function ye(e,n={}){const r=n.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),t=n.dpi??96,i=t/96*D,d=n.fontFamily??'"Microsoft YaHei", sans-serif',a=n.measurer??s.heuristicMeasurer,o=n.overscan??1,l=n.gapPx??18,h=n.pagesPerFrame??1,c=e.pages.map(p=>p.pageHeightMm*i),m=Math.max(1,...e.pages.map(p=>p.pageWidthMm*i)),g={start:0,end:-1};let u=null,f=null,b=null,M=null,C=[],P=0,H=[];function S(){const p=u;p.innerHTML="",f=document.createElement("div"),f.style.cssText=`width:${m}px;margin:0 auto;`,b=document.createElement("div"),M=document.createElement("div"),f.appendChild(b),C=[];const y=Math.min(e.pages.length,3+o*2);for(let w=0;w<y;w++){const T=document.createElement("div");T.style.cssText=`margin:0 auto ${l}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,f.appendChild(T),C.push(T)}f.appendChild(M),p.appendChild(f)}function F(p,y){const w=e.pages[y],{widthPx:T,heightPx:k}=W(w,t);let A=p.firstElementChild;(!A||A.tagName!=="CANVAS")&&(A=document.createElement("canvas"),p.innerHTML="",p.appendChild(A)),A.width=Math.round(T*r),A.height=Math.round(k*r),A.style.width=`${T}px`,A.style.height=`${k}px`;const N=A.getContext("2d");if(N){N.setTransform(1,0,0,1,0,0),N.scale(r,r),N.fillStyle="#ffffff",N.fillRect(0,0,T,k);for(const te of w.components)Z(N,te,i,t,d,a);A.dataset.canvasPage=String(y),p.style.height=`${k}px`,p.style.width=`${T}px`}}function _(p){g.start=p.start,g.end=p.end,b.style.height=`${p.start*l+c.slice(0,p.start).reduce((T,k)=>T+k,0)}px`;const y=e.pages.length-1-p.end;M.style.height=`${y*l+c.slice(p.end+1).reduce((T,k)=>T+k,0)}px`;const w=p.end-p.start+1;C.forEach((T,k)=>{if(k<w){T.style.display="";const A=p.start+k;T.style.height=`${c[A]??0}px`}else T.style.display="none"}),H=[];for(let T=p.start;T<=p.end;T++){const k=C[T-p.start];if(!k)continue;k.firstElementChild?.dataset?.canvasPage!==String(T)&&H.push(T)}z()}function z(){P||H.length===0||(P=requestAnimationFrame(()=>{P=0;let p=Math.max(1,h);for(;H.length>0&&p-- >0;){const y=H.shift(),w=C[y-g.start];w&&F(w,y)}H.length>0&&z()}))}function $(){P||(P=requestAnimationFrame(()=>{P=0;const p=u,y=K({pageHeightsPx:c,viewportHeightPx:p.clientHeight,scrollTopPx:p.scrollTop,overscan:o,gapPx:l});y.start!==g.start||y.end!==g.end?_(y):z()}))}return{attach(p){u=p,S(),p.addEventListener("scroll",$,{passive:!0}),$()},destroy(){P&&cancelAnimationFrame(P),P=0,u?.removeEventListener("scroll",$),H=[],f?.remove(),u=null},window(){return{...g}}}}function v(e,n){return typeof e=="number"&&Number.isFinite(e)?e:n}function E(e,n=""){return typeof e=="string"?e:n}function L(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Se(e){return e==="Center"?"center":e==="Right"?"right":"left"}function we(e){return e==="Center"?"middle":e==="Bottom"?"bottom":"top"}function ve(e){const n=parseFloat(E(e.FontSize,"10.5"));return{fontSize:Number.isFinite(n)?n:10.5,fontFamily:E(e.FontFamily,"黑体")||void 0,bold:E(e.FontWeight)==="bold"||void 0,italic:E(e.FontStyle)==="italic"||void 0,underline:e.Underline===!0||void 0,color:E(e.FontColor)||void 0,backgroundColor:E(e.BackgroundColor)||void 0,align:Se(E(e.HorAlignment,"Left")),verticalAlign:we(E(e.VertAlignment,"Top")),lineHeight:(()=>{const r=parseFloat(E(e.RowSpace,"1"));return Number.isFinite(r)&&r!==1?r:void 0})(),borderColor:E(e.BorderColor)||void 0,borderTop:e.BorderTop!==!1,borderRight:e.BorderRight!==!1,borderBottom:e.BorderBottom!==!1,borderLeft:e.BorderLeft!==!1}}function Pe(e,n){const r=E(e.uitype),t={kind:"text",leftMm:v(e.left,0),topMm:v(e.top,0),widthMm:v(e.width,40),heightMm:v(e.height,8),nid:E(e.nid)||void 0,style:ve(e)};switch(r){case"text":{t.kind="text";const i=e.Text??e.text??e.Value;t.text=i==null?"":String(i);const d=e.Lines??e.lines;return Array.isArray(d)&&(t.lines=d.map(a=>String(a))),t}case"richtext":return t.kind="text",t.text=E(e.Text),n.push(`富文本 ${t.nid??""} 导入为纯文本(版式细节可能损失)`),t;case"image":case"barcode":case"qrcode":case"chart":return t.kind=r==="image"?"image":r,t.fallbackText=`[${r}]`,n.push(`图片类组件 ${t.nid??""} 需运行时数据(imageData),已导入为占位`),t;case"table":{t.kind="rect";const i=e.Cells??e.cells;if(Array.isArray(i)){const d={cells:i.map(a=>Array.isArray(a)?a.map(o=>({text:L(o)?E(o.Text??o.text):"",colSpan:L(o)?v(o.ColSpan,1):1})):[])};t.grid=d}else t.fallbackText="[table]",n.push(`表格 ${t.nid??""} 缺少 Cells,导入为空框`);return t}case"subreport":return n.push(`子报表 ${t.nid??""} 暂不支持导入,已跳过`),null;default:return E(e.ShapeType)==="hline"||r==="hline"||r==="vline"?(t.kind="line",t):r==="rect"||r==="oval"||r==="shape"?(t.kind=r==="oval"?"ellipse":"rect",t):(n.push(`未知组件类型 ${r},已跳过`),null)}}function Ee(e){const n=[];let r=null;if(typeof e=="string")try{const h=JSON.parse(e);L(h)&&(r=h)}catch{return{template:{pages:[]},warnings:["content 不是合法 JSON"]}}else L(e)&&(r=e);if(!r)return{template:{pages:[]},warnings:["content 为空"]};const t=L(r.GlobalConfig)?r.GlobalConfig:{},i=v(t.paperWidthMm,210),d=v(t.paperHeightMm,297),a={top:v(t.marginTop,10),bottom:v(t.marginBottom,10),left:v(t.marginLeft,10),right:v(t.marginRight,10)},o=Array.isArray(r.children)?r.children.filter(h=>L(h)&&E(h.uitype)==="page"):[];o.length===0&&n.push("content 中没有 uitype=page 的页节点");const l=o.map(h=>{const c=h,m=Array.isArray(c.children)?c.children:[],g=[];for(const u of m){if(!L(u))continue;const f=Pe(u,n);f&&g.push(f)}return{widthMm:v(c.width,i),heightMm:v(c.DesignHeight,d),marginTopMm:v(c.MarginTop,a.top),marginBottomMm:v(c.MarginBottom,a.bottom),marginLeftMm:v(c.MarginLeft,a.left),marginRightMm:v(c.MarginRight,a.right),components:g}});return l.length===0&&(n.push("转换结果为空页,已回退一张空白页"),l.push({widthMm:i,heightMm:d,...a,components:[]})),{template:{pages:l},warnings:n}}function Y(e,n,r){let t,i;if(typeof e=="string"){const d=s.PAPER_SIZES[e];if(!d)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(s.PAPER_SIZES).join("/")})`);t=d.widthMm,i=d.heightMm}else typeof e=="number"?(t=e,i=n??297):(t=e.widthMm,i=e.heightMm);return r?{widthMm:i,heightMm:t}:{widthMm:t,heightMm:i}}class Q{constructor(){this.pages=[],this.pending=null}page(n="a4",r={},t){this.collect();const d=t!=null&&!("margins"in t)&&!("landscape"in t)&&("marginTopMm"in t||"marginBottomMm"in t||"marginLeftMm"in t||"marginRightMm"in t)?{margins:t}:t??{},{widthMm:a,heightMm:o}=Y(n,typeof r=="number"?r:void 0,d.landscape),l=d.margins??{};return this.pending=new ee(this,{widthMm:a,heightMm:o,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{pages:this.pages}}}class ee{constructor(n,r){this.parent=n,this.page=r,this.components=[]}text(n,r={},t={}){return this.components.push({kind:"text",leftMm:r.leftMm??0,topMm:r.topMm??0,widthMm:r.widthMm??60,heightMm:r.heightMm??8,text:n,style:t}),this}list(n,r,t,i={}){return this.components.push({kind:"list",leftMm:r.leftMm??10,topMm:r.topMm??30,widthMm:r.widthMm??180,dataset:n,columns:t,...i}),this}rect(n,r={}){return this.components.push({kind:"rect",...n,style:r}),this}line(n,r,t,i={}){return this.components.push({kind:"line",leftMm:n,topMm:r,widthMm:t,heightMm:.5,style:i}),this}barcode(n,r){return this.components.push({kind:"barcode",leftMm:r.leftMm??0,topMm:r.topMm??0,widthMm:r.widthMm??40,heightMm:r.heightMm??12,fallbackText:n}),this}qrcode(n,r,t,i){return this.components.push({kind:"qrcode",leftMm:t,topMm:i,widthMm:r,heightMm:r,fallbackText:n}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function xe(){return new Q}exports.CSS_DPI=s.CSS_DPI;exports.DEFAULT_BORDER_PT=s.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_PT=s.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=s.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=s.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=s.LINE_HEIGHT;exports.MM_PER_INCH=s.MM_PER_INCH;exports.PAPER_SIZES=s.PAPER_SIZES;exports.RENDER_PLAN_SCHEMA_VERSION=s.RENDER_PLAN_SCHEMA_VERSION;exports.SCHEMA_VERSION_JH4J=s.SCHEMA_VERSION_JH4J;exports.SCHEMA_VERSION_LOCAL=s.SCHEMA_VERSION_LOCAL;exports.SCHEMA_VERSION_MACH=s.SCHEMA_VERSION_MACH;exports.charWidthEm=s.charWidthEm;exports.createCanvasMeasurer=s.createCanvasMeasurer;exports.createHeuristicMeasurer=s.createHeuristicMeasurer;exports.heuristicMeasurer=s.heuristicMeasurer;exports.isImageBackedComponent=s.isImageBackedComponent;exports.isRichText=s.isRichText;exports.measureTextMm=s.measureTextMm;exports.mmToPx=s.mmToPx;exports.mmToPxFactor=s.mmToPxFactor;exports.ptToPx=s.ptToPx;exports.pxToMm=s.pxToMm;exports.resolveBoxBorders=s.resolveBoxBorders;exports.resolveFontSize=s.resolveFontSize;exports.resolveGridLayout=s.resolveGridLayout;exports.resolveLineHeight=s.resolveLineHeight;exports.resolveStroke=s.resolveStroke;exports.resolveTextColor=s.resolveTextColor;exports.round=s.round;exports.toRenderPlan=s.toRenderPlan;exports.wrapText=s.wrapText;exports.PageBuilder=ee;exports.TemplateBuilder=Q;exports.assertRenderPlan=ie;exports.classOf=x;exports.computePageWindow=K;exports.createCanvasPager=ye;exports.createTemplate=xe;exports.importJh4jTemplateContent=Ee;exports.measurePageSizePx=W;exports.paginateTemplate=he;exports.planFontSizePx=Me;exports.renderComponent=O;exports.renderPage=q;exports.renderPlan=ue;exports.renderPlanToCanvas=be;exports.resolvePaper=Y;exports.validateComponent=I;exports.validatePage=V;exports.validateRenderPlan=U;
5
+ `):s.wrapText(n.text??"",n.widthMm,{fontSizePt:m},l).join(`
6
+ `);Z(e,{text:g,fontSizePx:s.resolveFontSize(c,t).fontSizePx,bold:c.bold??!1,color:s.resolveTextColor(c),align:c.align??"left",lineHeight:s.resolveLineHeight(c)},a,o,d,h,i,c.verticalAlign);break}case"rect":{const m=s.resolveStroke(c),g=s.resolveBoxBorders(c);c.backgroundColor&&(e.fillStyle=c.backgroundColor,e.fillRect(a,o,d,h)),g.inner&&(e.strokeStyle=m.color,e.lineWidth=s.ptToPx(m.widthPt,t),e.beginPath(),g.top&&(e.moveTo(a,o),e.lineTo(a+d,o)),g.right&&(e.moveTo(a+d,o),e.lineTo(a+d,o+h)),g.bottom&&(e.moveTo(a+d,o+h),e.lineTo(a,o+h)),g.left&&(e.moveTo(a,o+h),e.lineTo(a,o)),e.stroke());break}case"line":{const m=s.resolveStroke({...c,borderColor:c.lineColor??c.borderColor});e.strokeStyle=m.color,e.lineWidth=s.ptToPx(m.widthPt,t),e.beginPath(),e.moveTo(a,o+h/2),e.lineTo(a+d,o+h/2),e.stroke();break}case"ellipse":{const m=s.resolveStroke(c);e.strokeStyle=m.color,e.lineWidth=s.ptToPx(m.widthPt,t),c.backgroundColor&&(e.fillStyle=c.backgroundColor,e.beginPath(),e.ellipse(a+d/2,o+h/2,d/2,h/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(a+d/2,o+h/2,d/2,h/2,0,0,Math.PI*2),e.stroke();break}}}function ye(e,n={}){if(typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const r=n.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),t=n.dpi??96,i=t/96*W,l=n.fontFamily??'"Microsoft YaHei", sans-serif',a=n.measurer??s.heuristicMeasurer,o=Math.max(0,n.start??0),d=Math.min(e.pages.length-1,n.end??e.pages.length-1),h=[];for(let c=o;c<=d;c++){const m=e.pages[c],{canvas:g,ctx:p}=Me(m,r,t);for(const f of m.components)Y(p,f,i,t,l,a);h.push(g)}return{canvases:h}}function Se(e,n={}){const r=n.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),t=n.dpi??96,i=t/96*W,l=n.fontFamily??'"Microsoft YaHei", sans-serif',a=n.measurer??s.heuristicMeasurer,o=n.overscan??1,d=n.gapPx??18,h=n.pagesPerFrame??1,c=e.pages.map(u=>u.pageHeightMm*i),m=Math.max(1,...e.pages.map(u=>u.pageWidthMm*i)),g={start:0,end:-1};let p=null,f=null,T=null,M=null,x=[],v=0,R=[];function S(){const u=p;u.innerHTML="",f=document.createElement("div"),f.style.cssText=`width:${m}px;margin:0 auto;`,T=document.createElement("div"),M=document.createElement("div"),f.appendChild(T),x=[];const b=Math.min(e.pages.length,3+o*2);for(let k=0;k<b;k++){const y=document.createElement("div");y.style.cssText=`margin:0 auto ${d}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,f.appendChild(y),x.push(y)}f.appendChild(M),u.appendChild(f)}function z(u,b){const k=e.pages[b],{widthPx:y,heightPx:C}=G(k,t);let A=u.firstElementChild;(!A||A.tagName!=="CANVAS")&&(A=document.createElement("canvas"),u.innerHTML="",u.appendChild(A)),A.width=Math.round(y*r),A.height=Math.round(C*r),A.style.width=`${y}px`,A.style.height=`${C}px`;const F=A.getContext("2d");if(F){F.setTransform(1,0,0,1,0,0),F.scale(r,r),F.fillStyle="#ffffff",F.fillRect(0,0,y,C);for(const ne of k.components)Y(F,ne,i,t,l,a);A.dataset.canvasPage=String(b),u.style.height=`${C}px`,u.style.width=`${y}px`}}function _(u){g.start=u.start,g.end=u.end,T.style.height=`${u.start*d+c.slice(0,u.start).reduce((y,C)=>y+C,0)}px`;const b=e.pages.length-1-u.end;M.style.height=`${b*d+c.slice(u.end+1).reduce((y,C)=>y+C,0)}px`;const k=u.end-u.start+1;x.forEach((y,C)=>{if(C<k){y.style.display="";const A=u.start+C;y.style.height=`${c[A]??0}px`}else y.style.display="none"}),R=[];for(let y=u.start;y<=u.end;y++){const C=x[y-u.start];if(!C)continue;C.firstElementChild?.dataset?.canvasPage!==String(y)&&R.push(y)}I()}function I(){v||R.length===0||(v=requestAnimationFrame(()=>{v=0;let u=Math.max(1,h);for(;R.length>0&&u-- >0;){const b=R.shift(),k=x[b-g.start];k&&z(k,b)}R.length>0&&I()}))}function $(){v||(v=requestAnimationFrame(()=>{v=0;const u=p,b=X({pageHeightsPx:c,viewportHeightPx:u.clientHeight,scrollTopPx:u.scrollTop,overscan:o,gapPx:d});b.start!==g.start||b.end!==g.end?_(b):I()}))}let L=null;return{attach(u){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");p=u,S(),u.addEventListener("scroll",$,{passive:!0}),typeof ResizeObserver<"u"&&(L=new ResizeObserver(()=>$()),L.observe(u)),$()},destroy(){v&&cancelAnimationFrame(v),v=0,L?.disconnect(),L=null,p?.removeEventListener("scroll",$),R=[],f?.remove(),p=null},window(){return{...g}}}}function w(e,n){return typeof e=="number"&&Number.isFinite(e)?e:n}function P(e,n=""){return typeof e=="string"?e:n}function N(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function we(e){return e==="Center"?"center":e==="Right"?"right":"left"}function ve(e){return e==="Center"?"middle":e==="Bottom"?"bottom":"top"}function Pe(e){const n=parseFloat(P(e.FontSize,"10.5"));return{fontSize:Number.isFinite(n)?n:10.5,fontFamily:P(e.FontFamily,"黑体")||void 0,bold:P(e.FontWeight)==="bold"||void 0,italic:P(e.FontStyle)==="italic"||void 0,underline:e.Underline===!0||void 0,color:P(e.FontColor)||void 0,backgroundColor:P(e.BackgroundColor)||void 0,align:we(P(e.HorAlignment,"Left")),verticalAlign:ve(P(e.VertAlignment,"Top")),lineHeight:(()=>{const r=parseFloat(P(e.RowSpace,"1"));return Number.isFinite(r)&&r!==1?r:void 0})(),borderColor:P(e.BorderColor)||void 0,borderTop:e.BorderTop!==!1,borderRight:e.BorderRight!==!1,borderBottom:e.BorderBottom!==!1,borderLeft:e.BorderLeft!==!1}}function Ee(e,n){const r=P(e.uitype),t={kind:"text",leftMm:w(e.left,0),topMm:w(e.top,0),widthMm:w(e.width,40),heightMm:w(e.height,8),nid:P(e.nid)||void 0,style:Pe(e)};switch(r){case"text":{t.kind="text";const i=e.Text??e.text??e.Value;t.text=i==null?"":String(i);const l=e.Lines??e.lines;return Array.isArray(l)&&(t.lines=l.map(a=>String(a))),t}case"richtext":return t.kind="text",t.text=P(e.Text),n.push(`富文本 ${t.nid??""} 导入为纯文本(版式细节可能损失)`),t;case"image":case"barcode":case"qrcode":case"chart":return t.kind=r==="image"?"image":r,t.fallbackText=`[${r}]`,n.push(`图片类组件 ${t.nid??""} 需运行时数据(imageData),已导入为占位`),t;case"table":{t.kind="rect";const i=e.Cells??e.cells;if(Array.isArray(i)){const l={cells:i.map(a=>Array.isArray(a)?a.map(o=>({text:N(o)?P(o.Text??o.text):"",colSpan:N(o)?w(o.ColSpan,1):1})):[])};t.grid=l}else t.fallbackText="[table]",n.push(`表格 ${t.nid??""} 缺少 Cells,导入为空框`);return t}case"subreport":return n.push(`子报表 ${t.nid??""} 暂不支持导入,已跳过`),null;default:return P(e.ShapeType)==="hline"||r==="hline"||r==="vline"?(t.kind="line",t):r==="rect"||r==="oval"||r==="shape"?(t.kind=r==="oval"?"ellipse":"rect",t):(n.push(`未知组件类型 ${r},已跳过`),null)}}function xe(e){const n=[];let r=null;if(typeof e=="string")try{const h=JSON.parse(e);N(h)&&(r=h)}catch{return{template:{pages:[]},warnings:["content 不是合法 JSON"]}}else N(e)&&(r=e);if(!r)return{template:{pages:[]},warnings:["content 为空"]};const t=N(r.GlobalConfig)?r.GlobalConfig:{},i=w(t.paperWidthMm,210),l=w(t.paperHeightMm,297),a={top:w(t.marginTop,10),bottom:w(t.marginBottom,10),left:w(t.marginLeft,10),right:w(t.marginRight,10)},o=Array.isArray(r.children)?r.children.filter(h=>N(h)&&P(h.uitype)==="page"):[];o.length===0&&n.push("content 中没有 uitype=page 的页节点");const d=o.map(h=>{const c=h,m=Array.isArray(c.children)?c.children:[],g=[];for(const p of m){if(!N(p))continue;const f=Ee(p,n);f&&g.push(f)}return{widthMm:w(c.width,i),heightMm:w(c.DesignHeight,l),marginTopMm:w(c.MarginTop,a.top),marginBottomMm:w(c.MarginBottom,a.bottom),marginLeftMm:w(c.MarginLeft,a.left),marginRightMm:w(c.MarginRight,a.right),components:g}});return d.length===0&&(n.push("转换结果为空页,已回退一张空白页"),d.push({widthMm:i,heightMm:l,...a,components:[]})),{template:{pages:d},warnings:n}}function Q(e,n,r){let t,i;if(typeof e=="string"){const l=s.PAPER_SIZES[e];if(!l)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(s.PAPER_SIZES).join("/")})`);t=l.widthMm,i=l.heightMm}else typeof e=="number"?(t=e,i=n??297):(t=e.widthMm,i=e.heightMm);return r?{widthMm:i,heightMm:t}:{widthMm:t,heightMm:i}}class ee{constructor(){this.pages=[],this.pending=null}page(n="a4",r={},t){this.collect();const l=t!=null&&!("margins"in t)&&!("landscape"in t)&&("marginTopMm"in t||"marginBottomMm"in t||"marginLeftMm"in t||"marginRightMm"in t)?{margins:t}:t??{},{widthMm:a,heightMm:o}=Q(n,typeof r=="number"?r:void 0,l.landscape),d=l.margins??{};return this.pending=new te(this,{widthMm:a,heightMm:o,marginTopMm:d.marginTopMm??10,marginBottomMm:d.marginBottomMm??10,marginLeftMm:d.marginLeftMm??10,marginRightMm:d.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{pages:this.pages}}}class te{constructor(n,r){this.parent=n,this.page=r,this.components=[]}text(n,r={},t={}){return this.components.push({kind:"text",leftMm:r.leftMm??0,topMm:r.topMm??0,widthMm:r.widthMm??60,heightMm:r.heightMm??8,text:n,style:t}),this}list(n,r,t,i={}){return this.components.push({kind:"list",leftMm:r.leftMm??10,topMm:r.topMm??30,widthMm:r.widthMm??180,dataset:n,columns:t,...i}),this}rect(n,r={}){return this.components.push({kind:"rect",...n,style:r}),this}line(n,r,t,i={}){return this.components.push({kind:"line",leftMm:n,topMm:r,widthMm:t,heightMm:.5,style:i}),this}barcode(n,r){return this.components.push({kind:"barcode",leftMm:r.leftMm??0,topMm:r.topMm??0,widthMm:r.widthMm??40,heightMm:r.heightMm??12,fallbackText:n}),this}qrcode(n,r,t,i){return this.components.push({kind:"qrcode",leftMm:t,topMm:i,widthMm:r,heightMm:r,fallbackText:n}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function Ce(){return new ee}exports.CSS_DPI=s.CSS_DPI;exports.DEFAULT_BORDER_PT=s.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_PT=s.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=s.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=s.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=s.LINE_HEIGHT;exports.MM_PER_INCH=s.MM_PER_INCH;exports.PAPER_SIZES=s.PAPER_SIZES;exports.RENDER_PLAN_SCHEMA_VERSION=s.RENDER_PLAN_SCHEMA_VERSION;exports.SCHEMA_VERSION_JH4J=s.SCHEMA_VERSION_JH4J;exports.SCHEMA_VERSION_LOCAL=s.SCHEMA_VERSION_LOCAL;exports.SCHEMA_VERSION_MACH=s.SCHEMA_VERSION_MACH;exports.charWidthEm=s.charWidthEm;exports.createCanvasMeasurer=s.createCanvasMeasurer;exports.createHeuristicMeasurer=s.createHeuristicMeasurer;exports.heuristicMeasurer=s.heuristicMeasurer;exports.isImageBackedComponent=s.isImageBackedComponent;exports.isRichText=s.isRichText;exports.measureTextMm=s.measureTextMm;exports.mmToPx=s.mmToPx;exports.mmToPxFactor=s.mmToPxFactor;exports.ptToPx=s.ptToPx;exports.pxToMm=s.pxToMm;exports.resolveBoxBorders=s.resolveBoxBorders;exports.resolveFontSize=s.resolveFontSize;exports.resolveGridLayout=s.resolveGridLayout;exports.resolveLineHeight=s.resolveLineHeight;exports.resolveStroke=s.resolveStroke;exports.resolveTextColor=s.resolveTextColor;exports.round=s.round;exports.toRenderPlan=s.toRenderPlan;exports.wrapText=s.wrapText;exports.PageBuilder=te;exports.TemplateBuilder=ee;exports.assertRenderPlan=oe;exports.classOf=E;exports.computePageWindow=X;exports.createCanvasPager=Se;exports.createTemplate=Ce;exports.importJh4jTemplateContent=xe;exports.measurePageSizePx=G;exports.paginateTemplate=ce;exports.planFontSizePx=Te;exports.renderComponent=D;exports.renderPage=K;exports.renderPlan=pe;exports.renderPlanToCanvas=ye;exports.resolvePaper=Q;exports.validateComponent=O;exports.validatePage=U;exports.validateRenderPlan=J;