@agile-team/mach-report 1.0.1 → 1.1.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.
@@ -0,0 +1,6 @@
1
+ "use strict";const e=require("vue"),O=require("@agile-team/mach-report"),V=require("./plugin-DxneRya8.cjs");function be(t,r,l={}){const n=l.pxPerMm??3.7795275590551185,a=l.gapPx??18,o=e.ref(0),s=e.ref(800),u=e.computed(()=>(t.value?.pages??[]).map(y=>y.pageHeightMm*n)),c=e.computed(()=>{const y=t.value?.pages??[];let b=0,m=0;for(const p of y)b+=p.pageHeightMm*n+a,m=Math.max(m,p.pageWidthMm*n);return{w:m,h:b}}),f=e.computed(()=>O.computePageWindow({pageHeightsPx:u.value,viewportHeightPx:s.value/r.value,scrollTopPx:o.value/r.value,overscan:1,gapPx:a})),d=e.computed(()=>{const y=t.value;if(!y)return[];const{start:b,end:m}=f.value;return m<b?[]:y.pages.slice(b,m+1).map((p,P)=>({page:p,index:b+P}))});function g(y,b){let m=0;return p=>{m||(m=requestAnimationFrame(()=>{if(m=0,o.value=p.scrollTop,s.value=p.clientHeight||800,b.value<=0)return;const P=p.querySelectorAll(".mrp-page-holder");if(!P.length)return;const k=p.getBoundingClientRect().top+56;let C=1;P.forEach(v=>{v.getBoundingClientRect().top<=k&&(C=Number(v.dataset.page??1))}),y.value=Math.max(1,Math.min(b.value,C))}))}}return{contentSize:c,windowRange:f,visiblePages:d,makeScrollHandler:g,refreshViewport(y){y&&(s.value=y.clientHeight||800)}}}function we(t){const r=e.ref(1),l=e.ref("fit");function n(){requestAnimationFrame(()=>{const o=t();!o||!o.viewport||(r.value=Math.min(1,Math.max(.3,(o.viewport.clientWidth-48)/Math.max(1,o.pageWidthPx))))})}function a(o){o==="fit"?(l.value="fit",n()):(l.value="raw",r.value=o/100)}return{zoom:r,zoomMode:l,applyFitZoom:n,setZoom:a}}const _=8;function ee(){return new Promise(t=>setTimeout(t,0))}function X(t){return`p${Math.round(t.pageWidthMm)}x${Math.round(t.pageHeightMm)}`}function A(t){const r=new Map;t.pages.forEach(s=>{r.has(X(s))||r.set(X(s),s)});const a=`<!doctype html><html><head><meta charset="utf-8"><style>${`.mr-page{margin:0 auto;page-break-after:always;}
2
+ .mr-page tr{break-inside:avoid;page-break-inside:avoid;}
3
+ .mr-comp{break-inside:avoid;page-break-inside:avoid;}
4
+ ${[...r.values()].map(s=>`@page ${X(s)}{size:${Math.round(s.pageWidthMm)}mm ${Math.round(s.pageHeightMm)}mm;margin:0;}`).join(`
5
+ `)}
6
+ body{margin:0;background:#fff;}`}</style></head><body>`,o=t.pages.map(s=>{const u=O.renderPage(s,96,{},document);return u.style.page=X(s),u.outerHTML});return{head:a,pageChunks:o}}async function Ye(t,r={}){const l={pages:t.flatMap(u=>u.pages)};if(l.pages.length===0)return;const{head:n,pageChunks:a}=A(l),o=document.createElement("iframe");o.style.cssText="position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;",document.body.appendChild(o);let s=!1;try{const u=o.contentDocument;u.open(),u.write(n);for(let c=0;c<a.length;c++)u.write(a[c]),c%_===_-1&&(r.onProgress?.(c+1,a.length),await ee());u.write("</body></html>"),u.close(),await ee(),r.onProgress?.(a.length,a.length),s=!0,o.contentWindow?.focus(),o.contentWindow?.print()}catch(u){r.onError?.(u instanceof Error?`批量打印失败: ${u.message}`:"批量打印失败")}finally{s?setTimeout(()=>o.remove(),6e4):o.remove()}}function Ee(t){const{head:r,pageChunks:l}=A(t);return{html:`${`<!doctype html><html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"><head><meta charset="utf-8"><!--[if gte mso 9]><xml><w:WordDocument><w:View>Print</w:View><w:Zoom>100</w:Zoom></w:WordDocument></xml><![endif]-->${r.replace(/^<!doctype html><html><head>/,"")}`}${l.join("")}</body></html>`,filename:"mach-report.doc"}}function Pe(t,r){let l=null,n=!1,a=null,o=null;function s(){l?.remove(),l=null}function u(m,p){const P=URL.createObjectURL(m),k=document.createElement("a");k.href=P,k.download=p,k.click(),setTimeout(()=>URL.revokeObjectURL(P),1e4)}async function c(){if(n)return;const m=t.value;if(!m||m.pages.length===0)return;n=!0,s();const{head:p,pageChunks:P}=A(m);l=document.createElement("iframe"),l.style.cssText="position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;",document.body.appendChild(l);const k=l;try{const C=k.contentDocument;C.open(),C.write(p);for(let v=0;v<P.length;v++)if(C.write(P[v]),v%_===_-1&&await ee(),k!==l)return;C.write("</body></html>"),C.close(),await ee(),k.contentWindow?.focus(),k.contentWindow?.print()}catch{r.onError("调用打印失败,请改用导出 PDF")}finally{n=!1}}async function f(){if(a)return a;const m=t.value;if(!(!m||m.pages.length===0))return a=(async()=>{try{const p=await r.getPdfExporter()(m);u(new Blob([p],{type:"application/pdf"}),"mach-report.pdf")}catch(p){r.onError(p instanceof Error?`PDF 导出失败: ${p.message}`:"PDF 导出失败")}finally{a=null}})(),a}async function d(){if(o)return o;const m=t.value;if(!(!m||m.pages.length===0))return o=(async()=>{try{const{blobs:p}=await O.renderPlanToImages(m,{dpr:Math.min(2,typeof devicePixelRatio=="number"?devicePixelRatio:1)});p.forEach((P,k)=>{u(P,p.length>1?`mach-report-page-${k+1}.png`:"mach-report.png")})}catch(p){r.onError(p instanceof Error?`图片导出失败: ${p.message}`:"图片导出失败","export")}finally{o=null}})(),o}function g(){const m=t.value;if(!(!m||m.pages.length===0))try{const{html:p,filename:P}=Ee(m);u(new Blob([p],{type:"application/msword;charset=utf-8"}),P)}catch(p){r.onError(p instanceof Error?`Word 导出失败: ${p.message}`:"Word 导出失败","export")}}function y(m){const p=t.value;if(!p||p.pages.length===0)return;if(m==="pdf"){f();return}if(m==="png"||m==="image"){d();return}if(m==="word"||m==="doc"){g();return}const{head:P,pageChunks:k}=A(p),C=`${P}${k.join("")}</body></html>`;u(new Blob([C],{type:"text/html;charset=utf-8"}),`mach-report.${m==="html"?"html":m}`)}function b(){const m=t.value;if(!m||m.pages.length===0)return;const{head:p,pageChunks:P}=A(m),k=`${p}${P.join("")}</body></html>`,C=new Blob([k],{type:"text/html;charset=utf-8"}),v=URL.createObjectURL(C),x=window.open(v,"_blank");if(!x){r.onError("浏览器拦截了弹窗,请允许弹窗后重试"),URL.revokeObjectURL(v);return}setTimeout(()=>x.print(),400),setTimeout(()=>URL.revokeObjectURL(v),1e4)}return{print:c,exportAs:y,exportImages:d,exportWord:g,openPdfWindow:b,releasePrintFrame:s}}const ke="mrp-hit";function Je(t){t.querySelectorAll(`mark.${ke}`).forEach(l=>{const n=l.parentNode;if(n){for(;l.firstChild;)n.insertBefore(l.firstChild,l);l.remove(),n.normalize()}})}function Xe(t,r){const l=r.trim();if(!l)return 0;const n=l.toLowerCase(),a=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,{acceptNode(u){const c=u.parentElement;return!c||c.closest("mark")||/^(SCRIPT|STYLE)$/.test(c.tagName)?NodeFilter.FILTER_REJECT:(u.nodeValue??"").toLowerCase().includes(n)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),o=[];for(let u=a.nextNode();u;u=a.nextNode())o.push(u);let s=0;for(const u of o){const c=u.nodeValue??"",f=c.toLowerCase(),d=u.parentElement;if(!d)continue;const g=document.createDocumentFragment();let y=0,b=f.indexOf(n);for(;b>=0;){b>y&&g.appendChild(document.createTextNode(c.slice(y,b)));const m=document.createElement("mark");m.className=ke,m.textContent=c.slice(b,b+l.length),g.appendChild(m),s++,y=b+l.length,b=f.indexOf(n,y)}y<c.length&&g.appendChild(document.createTextNode(c.slice(y))),d.replaceChild(g,u)}return s}function he(t,r){let l=0,n=t.toLowerCase().indexOf(r);for(;n>=0;)l++,n=t.toLowerCase().indexOf(r,n+r.length);return l}function Qe(t){const{plan:r,gotoPage:l,highlight:n,clearHighlights:a}=t,o=t.debounceMs??200,s=e.ref(!1),u=e.ref(""),c=e.ref(""),f=e.ref(0);let d=null;const g=e.computed(()=>{const v=u.value.trim().toLowerCase(),x=r.value;if(!v||!x)return[];const M=[];return x.pages.forEach((T,Z)=>{for(const D of T.components)if(D.grid){for(const z of D.grid.cells??[])for(const q of z??[])if(typeof q?.text=="string")for(let Y=0;Y<he(q.text,v);Y++)M.push(Z)}else if(D.kind==="text"&&typeof D.text=="string")for(let z=0;z<he(D.text,v);z++)M.push(Z)}),M}),y=e.computed(()=>g.value.length);function b(v){if(c.value=v,d&&clearTimeout(d),v.trim()===""){d=null,u.value="",f.value=0;return}d=setTimeout(()=>{d=null,u.value=c.value,f.value=0;const x=g.value[0];x!=null&&l(x+1)},o)}function m(v){const x=g.value.length;x!==0&&(f.value=(f.value+v+x)%x,l(g.value[f.value]+1))}function p(){s.value=!s.value}function P(v){const x=u.value.trim();x&&n(v,x)}function k(v){a(v)}function C(){c.value="",u.value="",f.value=0,d&&clearTimeout(d),d=null}return{visible:s,query:u,matchIndex:f,matchCount:y,toggle:p,onInput:b,onNav:m,apply:P,clear:k,reset:C}}function _e(t,r){const l=e.computed(()=>{if(t.value)return!0;if(typeof location>"u")return!1;try{return new URLSearchParams(location.search).get("mrp-debug")==="1"}catch{return!1}}),n=e.computed(()=>!l.value||!r.plan.value?0:Math.round(JSON.stringify(r.plan.value).length/1024)),a=e.computed(()=>!l.value||!r.plan.value?null:{pages:r.pageCount.value,window:`${r.windowRange.value.start}-${r.windowRange.value.end}`,zoom:`${Math.round(r.zoom.value*100)}%`,loadMs:`${r.loadMs.value}ms`,planKB:n.value});return{enabled:l,debugStats:a}}function et(t,r){const{thumbsRoot:l,visible:n,renderThumbCanvas:a}=r;let o=null;function s(f,d){if(!t.value||f.childElementCount>0)return;const g=a(d);g&&(g.style.width="100%",g.style.height="100%",g.style.display="block",f.appendChild(g))}return{schedule:()=>{!n.value||!t.value||!l.value||typeof IntersectionObserver>"u"||(o?.disconnect(),o=new IntersectionObserver(f=>{for(const d of f){if(!d.isIntersecting)continue;const g=d.target;s(g,Number(g.dataset.thumb??1)-1),o?.unobserve(g)}},{root:l.value,rootMargin:"200px"}),l.value.querySelectorAll("[data-thumb]").forEach(f=>{o.observe(f)}))},destroy:()=>{o?.disconnect(),o=null}}}function tt(){const t=e.shallowRef(0);return{loadMs:t,start(){return typeof performance<"u"?performance.now():0},end(r){t.value=r?Math.round(performance.now()-r):0}}}const ot={class:"mrp-toolbar"},nt={class:"mrp-title"},rt=["disabled"],at={class:"mrp-pageinfo"},lt=["disabled"],st={key:1,class:"mrp-search"},it=["placeholder","value"],ut={key:0,class:"mrp-search-count"},ct=["disabled"],dt=["disabled"],mt=e.defineComponent({__name:"ReportToolbar",props:{pageCount:{},currentPage:{},zoomMode:{},zoom:{},showExport:{type:Boolean},showPrint:{type:Boolean},showPdfWindow:{type:Boolean},messages:{},search:{},thumbsVisible:{type:Boolean}},emits:["goto","zoom","export","print","pdf-window","search-input","search-nav","search-toggle","thumbs-toggle"],setup(t){const r=t,l=e.ref(null);e.watch(()=>r.search.visible,a=>{a&&e.nextTick(()=>l.value?.focus())});function n(a,o,s){return a.replace("{cur}",String(o)).replace("{total}",String(s))}return(a,o)=>(e.openBlock(),e.createElementBlock("div",ot,[e.createElementVNode("span",nt,e.toDisplayString(t.messages.title),1),t.pageCount>0?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.currentPage<=1,onClick:o[0]||(o[0]=s=>a.$emit("goto",t.currentPage-1))},e.toDisplayString(t.messages.prevPage),9,rt),e.createElementVNode("span",at,e.toDisplayString(n(t.messages.pageInfo,t.currentPage,t.pageCount)),1),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.currentPage>=t.pageCount,onClick:o[1]||(o[1]=s=>a.$emit("goto",t.currentPage+1))},e.toDisplayString(t.messages.nextPage),9,lt)],64)):e.createCommentVNode("",!0),o[16]||(o[16]=e.createElementVNode("span",{class:"mrp-spacer"},null,-1)),t.search.visible?(e.openBlock(),e.createElementBlock("div",st,[e.createElementVNode("input",{ref_key:"searchInputRef",ref:l,class:"mrp-search-input",type:"text",placeholder:t.messages.searchPlaceholder,value:t.search.query,onInput:o[2]||(o[2]=s=>a.$emit("search-input",s.target.value))},null,40,it),t.search.query?(e.openBlock(),e.createElementBlock("span",ut,e.toDisplayString(n(t.messages.matchInfo,t.search.matchIndex+1,t.search.matchCount)),1)):e.createCommentVNode("",!0),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.search.matchCount===0,onClick:o[3]||(o[3]=s=>a.$emit("search-nav",-1))},e.toDisplayString(t.messages.prevMatch),9,ct),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.search.matchCount===0,onClick:o[4]||(o[4]=s=>a.$emit("search-nav",1))},e.toDisplayString(t.messages.nextMatch),9,dt)])):e.createCommentVNode("",!0),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.search.visible}]),type:"button",title:"Ctrl+F",onClick:o[5]||(o[5]=s=>a.$emit("search-toggle"))}," 🔍 ",2),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.thumbsVisible}]),type:"button",onClick:o[6]||(o[6]=s=>a.$emit("thumbs-toggle"))}," ▦ "+e.toDisplayString(t.messages.thumbnails),3),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.zoomMode==="fit"}]),type:"button",onClick:o[7]||(o[7]=s=>a.$emit("zoom","fit"))},e.toDisplayString(t.messages.fitWidth),3),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.zoomMode==="raw"&&Math.round(t.zoom*100)===100}]),type:"button",onClick:o[8]||(o[8]=s=>a.$emit("zoom",100))}," 100% ",2),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.zoomMode==="raw"&&Math.round(t.zoom*100)===150}]),type:"button",onClick:o[9]||(o[9]=s=>a.$emit("zoom",150))}," 150% ",2),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:2,class:"mrp-nav",type:"button",onClick:o[10]||(o[10]=s=>a.$emit("export","html"))},e.toDisplayString(t.messages.exportHtml),1)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:3,class:"mrp-nav",type:"button",onClick:o[11]||(o[11]=s=>a.$emit("export","pdf"))},e.toDisplayString(t.messages.exportPdf),1)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:4,class:"mrp-nav",type:"button",onClick:o[12]||(o[12]=s=>a.$emit("export","png"))},e.toDisplayString(t.messages.exportImage),1)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:5,class:"mrp-nav",type:"button",onClick:o[13]||(o[13]=s=>a.$emit("export","word"))},e.toDisplayString(t.messages.exportWord),1)):e.createCommentVNode("",!0),t.showPrint?(e.openBlock(),e.createElementBlock("button",{key:6,class:"mrp-nav",type:"button",onClick:o[14]||(o[14]=s=>a.$emit("print"))},e.toDisplayString(t.messages.print),1)):e.createCommentVNode("",!0),t.showPdfWindow?(e.openBlock(),e.createElementBlock("button",{key:7,class:"mrp-nav",type:"button",onClick:o[15]||(o[15]=s=>a.$emit("pdf-window"))},e.toDisplayString(t.messages.pdfWindow),1)):e.createCommentVNode("",!0)]))}}),ce=(t,r)=>{const l=t.__vccOpts||t;for(const[n,a]of r)l[n]=a;return l},Ce=ce(mt,[["__scopeId","data-v-f3aa8dfd"]]),pt={class:"mrp-params"},ft={class:"mrp-params-title"},gt={class:"mrp-params-grid"},vt={class:"mrp-param-label"},ht={key:0,class:"mrp-param-star"},yt=["value","onChange"],bt={value:"",disabled:"",hidden:""},wt=["value"],Et=["type","placeholder","value","onInput"],Pt={class:"mrp-params-actions"},kt=e.defineComponent({__name:"ReportParamPanel",props:{defs:{},modelValue:{},messages:{},attempted:{type:Boolean}},emits:["update:modelValue","query","reset"],setup(t,{emit:r}){const l=t,n=r,a=e.ref({...l.modelValue});e.watch(()=>l.modelValue,c=>{a.value={...c}});const o=e.computed(()=>l.defs.map(c=>({def:c,label:c.label??c.field,value:a.value[c.field]??""})));function s(c,f){a.value={...a.value,[c]:f},n("update:modelValue",{...a.value})}function u(c){const f=l.defs.find(d=>d.field===c);return l.attempted&&f?.required===!0&&!(a.value[c]??"").trim()}return(c,f)=>(e.openBlock(),e.createElementBlock("div",pt,[e.createElementVNode("span",ft,e.toDisplayString(t.messages.paramsTitle),1),e.createElementVNode("div",gt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.value,d=>(e.openBlock(),e.createElementBlock("label",{key:d.def.field,class:e.normalizeClass(["mrp-param",{"mrp-param-missing":u(d.def.field)}])},[e.createElementVNode("span",vt,[e.createTextVNode(e.toDisplayString(d.label),1),d.def.required?(e.openBlock(),e.createElementBlock("i",ht,"*")):e.createCommentVNode("",!0)]),(d.def.type??"text")==="select"?(e.openBlock(),e.createElementBlock("select",{key:0,class:"mrp-param-input",value:d.value,onChange:g=>s(d.def.field,g.target.value),onKeydown:f[0]||(f[0]=e.withKeys(g=>c.$emit("query"),["enter"]))},[e.createElementVNode("option",bt,e.toDisplayString(d.def.placeholder??`请选择${d.label}`),1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.def.options??[],g=>(e.openBlock(),e.createElementBlock("option",{key:g.value,value:g.value},e.toDisplayString(g.label),9,wt))),128))],40,yt)):(e.openBlock(),e.createElementBlock("input",{key:1,class:"mrp-param-input",type:d.def.type==="number"?"number":d.def.type==="date"?"date":"text",placeholder:d.def.placeholder??`请输入${d.label}`,value:d.value,onInput:g=>s(d.def.field,g.target.value),onKeydown:f[1]||(f[1]=e.withKeys(g=>c.$emit("query"),["enter"]))},null,40,Et))],2))),128))]),e.createElementVNode("div",Pt,[e.createElementVNode("button",{class:"mrp-nav mrp-param-query",type:"button",onClick:f[2]||(f[2]=d=>c.$emit("query"))},e.toDisplayString(t.messages.query),1),e.createElementVNode("button",{class:"mrp-nav",type:"button",onClick:f[3]||(f[3]=d=>c.$emit("reset"))},e.toDisplayString(t.messages.reset),1)])]))}}),xe=ce(kt,[["__scopeId","data-v-aafce92d"]]),Be={title:"报表预览",prevPage:"‹ 上一页",nextPage:"下一页 ›",pageInfo:"{cur} / {total}",fitWidth:"适宽",exportHtml:"导出 HTML",exportPdf:"导出 PDF",exportImage:"导出图片",exportWord:"导出 Word",print:"打印",pdfWindow:"PDF 窗口",loading:"报表渲染中…",empty:"暂无预览数据",errorPrefix:"",retry:"重试",searchPlaceholder:"搜索报表内容",matchInfo:"{cur}/{total}",prevMatch:"‹",nextMatch:"›",thumbnails:"缩略图",paramsTitle:"查询条件",query:"查 询",reset:"重 置",paramRequired:"请填写{label}"},$e={shellBg:"#525659",shellFg:"#e8e8e8",toolbarBg:"#323639",toolbarBorder:"#22252a",toolbarFg:"#e8e8e8",btnFg:"#cfcfcf",btnBorder:"#4a4d52",btnHoverBg:"#414549",btnHoverFg:"#ffffff",btnActiveBg:"#2d5fb8"};function Ct(t){return t}function xt(t){return t}const I={showExport:!0,showPrint:!0,showPdfWindow:!0,showParams:!0,gapPx:18,pdfFontUrl:"/simhei.ttf",logger:console},Bt={warn:()=>{},info:()=>{}};function Re(t,r){const l=r?t?.presets?.[r]:t?.defaultPreset?t?.presets?.[t.defaultPreset]:void 0,n={...t?.defaults,...l};return{showExport:n.showExport??I.showExport,showPrint:n.showPrint??I.showPrint,showPdfWindow:n.showPdfWindow??I.showPdfWindow,showParams:n.showParams??I.showParams,gapPx:n.gapPx??I.gapPx,pdfFontUrl:n.pdfFontUrl??I.pdfFontUrl,theme:{...$e,...n.theme},messages:{...Be,...n.messages},logger:n.logger??I.logger}}function Me(t){const r={};return t.shellBg!=null&&(r["--mrp-shell-bg"]=t.shellBg),t.shellFg!=null&&(r["--mrp-shell-fg"]=t.shellFg),t.toolbarBg!=null&&(r["--mrp-toolbar-bg"]=t.toolbarBg),t.toolbarBorder!=null&&(r["--mrp-toolbar-border"]=t.toolbarBorder),t.toolbarFg!=null&&(r["--mrp-toolbar-fg"]=t.toolbarFg),t.btnFg!=null&&(r["--mrp-btn-fg"]=t.btnFg),t.btnBorder!=null&&(r["--mrp-btn-border"]=t.btnBorder),t.btnHoverBg!=null&&(r["--mrp-btn-hover-bg"]=t.btnHoverBg),t.btnHoverFg!=null&&(r["--mrp-btn-hover-fg"]=t.btnHoverFg),t.btnActiveBg!=null&&(r["--mrp-btn-active-bg"]=t.btnActiveBg),r}function $t(t){const r=e.inject(V.MACH_REPORT_CONFIG_KEY,null),l=e.computed(()=>{const n=r?.value??null,a="defaults"in t&&"presets"in t?t:{defaults:t,presets:{}};return n?{defaults:{...n.defaults,...a.defaults},presets:{...n.presets,...a.presets},defaultPreset:a.defaultPreset??n.defaultPreset}:a});e.provide(V.MACH_REPORT_CONFIG_KEY,l)}function Se(){return e.inject(V.MACH_REPORT_CONFIG_KEY,e.computed(()=>null))}class G extends Error{constructor(r,l,n){super(l),this.name="MachReportError",this.code=r,this.cause=n}}function Te(t){return t instanceof G?{code:t.code,cause:t.cause}:{code:"render",cause:t}}const Rt={class:"mrp-main"},Mt={key:0,class:"mrp-state"},St={key:1,class:"mrp-state mrp-error"},Tt={key:2,class:"mrp-state"},Nt=["data-page"],Vt=["onClick"],Dt=["data-thumb"],Ft={class:"mrp-thumb-no"},It={class:"mrp-overlay"},zt={key:1,class:"mrp-debug","aria-hidden":"true"},Q=96/25.4,ye="mach-report:ui",Lt=e.defineComponent({__name:"ReportPreview",props:{tempId:{type:[String,Array],default:null},furnitureTempId:{type:String,default:""},params:{type:Object,default:()=>({})},height:{type:String,default:"100vh"},autoLoad:{type:Boolean,default:!0},showExport:{type:Boolean,default:void 0},showPrint:{type:Boolean,default:void 0},showPdfWindow:{type:Boolean,default:void 0},gapPx:{type:Number,default:void 0},messages:{type:Object,default:void 0},preset:{type:String,default:void 0},debug:{type:Boolean,default:!1},paramDefs:{type:Array,default:void 0},showParams:{type:Boolean,default:void 0},fetcher:{type:Function,default:null}},emits:["loaded","error"],setup(t,{expose:r,emit:l}){e.useCssVars(i=>({db73374c:m.value+"px"}));const n=t,a=l,o=e.shallowRef(null),s=e.ref(!1),u=e.ref(""),c=e.ref(1),f=e.ref(null),d=e.ref(null),g=e.ref(null),y=e.ref(!1),b=tt(),m=e.computed(()=>Math.max(0,q.value)),p=e.inject(V.MACH_REPORT_FETCHER_KEY,null),k=e.inject(V.MACH_REPORT_PDF_EXPORTER_KEY,null)??V.createDefaultPdfExporter({fontUrl:"/simhei.ttf"}),C=e.computed(()=>V.normalizeTempIds(n.tempId)),v=e.computed(()=>o.value?.pages.length??0),x=Se(),M=e.computed(()=>Re(x.value,n.preset)),T=e.computed(()=>({...M.value.messages,...n.messages})),Z=e.computed(()=>n.showExport??M.value.showExport),D=e.computed(()=>n.showPrint??M.value.showPrint),z=e.computed(()=>n.showPdfWindow??M.value.showPdfWindow),q=e.computed(()=>n.gapPx??M.value.gapPx),Y=e.computed(()=>n.showParams??M.value.showParams),L=e.computed(()=>n.paramDefs??[]),F=e.ref({}),te=e.ref(!1);function oe(i){const h={};for(const w of i)h[w.field]=n.params[w.field]??w.defaultValue??"";F.value=h,te.value=!1}oe(L.value),e.watch(L,i=>oe(i));const Ve=e.computed(()=>({...n.params,...Object.fromEntries(Object.entries(F.value).filter(([,i])=>i!==""))}));function De(){return L.value.filter(i=>i.required===!0&&!(F.value[i.field]??"").trim())}function Fe(){te.value=!0;const i=De();if(i.length>0){const h=i[0].label??i[0].field,w=T.value.paramRequired.replace("{label}",h);u.value=w,a("error",w,{code:"param"});return}N()}function Ie(){oe(L.value)}const ze=e.computed(()=>({height:n.height,...Me(M.value.theme)})),{zoom:R,zoomMode:W,applyFitZoom:de,setZoom:ne}=we(()=>({viewport:d.value,pageWidthPx:(o.value?.pages[0]?.pageWidthMm??210)*Q})),Le=be(o,R,{pxPerMm:Q,gapPx:q.value}),{contentSize:re,windowRange:U,visiblePages:We,makeScrollHandler:He,refreshViewport:me}=Le,Oe=He(c,v);function ae(i){W.value="raw",R.value=Math.min(3,Math.max(.3,i))}function le(){o.value=null,c.value=1,B.reset()}let J=0;async function N(){const i=++J,h=n.fetcher??p;if(C.value.length===0){u.value="缺少报表模板 ID",le(),a("error",u.value,{code:"param"});return}if(!h){u.value="未提供渲染数据源 fetcher",le(),a("error",u.value,{code:"config"});return}s.value=!0,u.value="",le();const w=b.start();try{const E=await h({tempIds:C.value,furnitureTempId:n.furnitureTempId||void 0,params:{...Ve.value}});if(i!==J)return;const $=O.validateRenderPlan(E);if(!$.ok){const j=$.errors.slice(0,3).map(K=>`${K.path}: ${K.message}`).join("; ");throw new G("validate",`渲染计划校验失败(${$.errors.length} 处): ${j}`)}$.warnings.length>0&&M.value.logger.warn("[mach-report] 渲染计划告警:",$.warnings),o.value=E,c.value=1,b.end(w),d.value&&(d.value.scrollTop=0),W.value==="fit"&&de(),a("loaded",E.pages.length)}catch(E){if(i!==J)return;const $=E instanceof G?E:new G("fetch",E instanceof Error?E.message:"预览加载失败",E);u.value=$.message,a("error",$.message,Te($))}finally{i===J&&(s.value=!1)}}function S(i){if(v.value<=0)return;const h=Math.max(1,Math.min(v.value,i));c.value=h;const w=d.value;if(!w)return;let E=0;for(let $=0;$<h-1;$++)E+=(o.value?.pages[$]?.pageHeightMm??0)*Q+m.value;w.scrollTop=E*R.value}const{print:se,exportAs:ie,openPdfWindow:ue,releasePrintFrame:Ae}=Pe(o,{getPdfExporter:()=>k,onError:(i,h)=>a("error",i,{code:h??"print"})});function pe(i,h={}){F.value={...F.value,...i},h.reload!==!1&&N()}const qe={reload:N,print:se,exportAs:ie,openPdfWindow:ue,gotoPage:S,setParams:pe};e.provide(V.MACH_REPORT_CONTROLLER_KEY,qe);const B=Qe({plan:o,gotoPage:S,highlight:Xe,clearHighlights:Je});function Ue(i){i.ctrlKey&&(i.preventDefault(),ae(R.value*(i.deltaY<0?1.1:1/1.1)))}function je(i){if((i.ctrlKey||i.metaKey)&&i.key.toLowerCase()==="f"){i.preventDefault(),B.visible.value||B.toggle();return}switch(i.key){case"PageDown":i.preventDefault(),S(c.value+1);break;case"PageUp":i.preventDefault(),S(c.value-1);break;case"Home":i.preventDefault(),S(1);break;case"End":i.preventDefault(),S(v.value);break;case"+":case"=":i.preventDefault(),ae(R.value*1.1);break;case"-":i.preventDefault(),ae(R.value/1.1);break}}function Ke(){try{localStorage.setItem(ye,JSON.stringify({zoomMode:W.value==="fit"?"fit":Math.round(R.value*100)}))}catch{}}e.watch([W,R],Ke),e.watchEffect(()=>{const i=o.value;if(!i)return;const h=f.value;if(!h)return;h.querySelectorAll(".mrp-page-holder").forEach(E=>{const $=Number(E.dataset.page??0)-1,j=i.pages[$];if(!j||E.childElementCount>0){if(E.firstElementChild){const ve=E.firstElementChild;B.clear(ve),B.apply(ve)}return}E.style.width=`${j.pageWidthMm*Q}px`;const K=O.renderPage(j,96,{},document);B.apply(K),E.appendChild(K)})},{flush:"post"}),e.watch(()=>B.query.value,i=>{i||f.value?.querySelectorAll(".mrp-page-holder").forEach(h=>{B.clear(h)})});const fe=et(o,{thumbsRoot:g,visible:y,renderThumbCanvas:i=>{try{const{canvases:h}=O.renderPlanToCanvas(o.value,{start:i,end:i,dpr:.2});return h[0]??null}catch{return null}}});e.watchEffect(()=>{fe.schedule()},{flush:"post"});const Ge=e.computed(()=>n.debug),{debugStats:H}=_e(Ge,{plan:o,pageCount:v,windowRange:U,zoom:R,loadMs:b.loadMs});function ge(){me(d.value),W.value==="fit"&&de()}function Ze(){try{const i=JSON.parse(localStorage.getItem(ye)??"{}");i.zoomMode==="fit"?ne("fit"):typeof i.zoomMode=="number"&&ne(i.zoomMode)}catch{}}return e.onMounted(()=>{window.addEventListener("resize",ge),me(d.value),Ze(),n.autoLoad&&N()}),e.onUnmounted(()=>{window.removeEventListener("resize",ge),fe.destroy(),B.reset(),Ae()}),e.watch(()=>[n.tempId,n.furnitureTempId,JSON.stringify(n.params)],()=>{n.autoLoad&&N()}),e.watch(()=>n.fetcher??p,()=>{n.autoLoad&&N()}),r({reload:N,print:se,exportAs:ie,openPdfWindow:ue,gotoPage:S,setParams:pe}),(i,h)=>(e.openBlock(),e.createElementBlock("div",{class:"mach-report-preview",style:e.normalizeStyle(ze.value)},[Y.value&&L.value.length>0?(e.openBlock(),e.createBlock(xe,{key:0,defs:L.value,modelValue:F.value,"onUpdate:modelValue":h[0]||(h[0]=w=>F.value=w),messages:T.value,attempted:te.value,onQuery:Fe,onReset:Ie},null,8,["defs","modelValue","messages","attempted"])):e.createCommentVNode("",!0),e.createVNode(Ce,{"page-count":v.value,"current-page":c.value,"zoom-mode":e.unref(W),zoom:e.unref(R),"show-export":Z.value,"show-print":D.value,"show-pdf-window":z.value,messages:T.value,search:{visible:e.unref(B).visible.value,query:e.unref(B).query.value,matchIndex:e.unref(B).matchIndex.value,matchCount:e.unref(B).matchCount.value},"thumbs-visible":y.value,onGoto:S,onZoom:e.unref(ne),onExport:h[1]||(h[1]=w=>e.unref(ie)(w)),onPrint:e.unref(se),onPdfWindow:e.unref(ue),onSearchInput:e.unref(B).onInput,onSearchNav:e.unref(B).onNav,onSearchToggle:e.unref(B).toggle,onThumbsToggle:h[2]||(h[2]=w=>y.value=!y.value)},null,8,["page-count","current-page","zoom-mode","zoom","show-export","show-print","show-pdf-window","messages","search","thumbs-visible","onZoom","onPrint","onPdfWindow","onSearchInput","onSearchNav","onSearchToggle"]),e.createElementVNode("div",Rt,[e.createElementVNode("div",{ref_key:"viewportRef",ref:d,class:"mrp-body",tabindex:"0",onWheel:Ue,onKeydown:je,onScrollPassive:h[3]||(h[3]=w=>e.unref(Oe)(w.target))},[s.value?(e.openBlock(),e.createElementBlock("div",Mt,e.toDisplayString(T.value.loading),1)):u.value?(e.openBlock(),e.createElementBlock("div",St,[e.createTextVNode(e.toDisplayString(u.value)+" ",1),e.createElementVNode("button",{class:"mrp-retry",type:"button",onClick:N},e.toDisplayString(T.value.retry),1)])):!o.value||v.value===0?(e.openBlock(),e.createElementBlock("div",Tt,e.toDisplayString(T.value.empty),1)):(e.openBlock(),e.createElementBlock("div",{key:3,class:"mrp-scale",style:e.normalizeStyle({width:`${e.unref(re).w*e.unref(R)}px`,height:`${e.unref(re).h*e.unref(R)}px`})},[e.createElementVNode("div",{ref_key:"containerRef",ref:f,class:"mrp-scale-inner",style:e.normalizeStyle({transform:`scale(${e.unref(R)})`,transformOrigin:"top left",width:`${e.unref(re).w}px`})},[e.unref(U).padTopPx>0?(e.openBlock(),e.createElementBlock("div",{key:0,class:"mrp-spacer-top",style:e.normalizeStyle({height:`${e.unref(U).padTopPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(We),w=>(e.openBlock(),e.createElementBlock("div",{key:w.index,class:"mrp-page-holder","data-page":w.index+1},null,8,Nt))),128)),e.unref(U).padBottomPx>0?(e.openBlock(),e.createElementBlock("div",{key:1,class:"mrp-spacer-bottom",style:e.normalizeStyle({height:`${e.unref(U).padBottomPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0)],4)],4))],544),y.value&&v.value>0?(e.openBlock(),e.createElementBlock("aside",{key:0,ref_key:"thumbsRef",ref:g,class:"mrp-thumbs"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.value?.pages??[],(w,E)=>(e.openBlock(),e.createElementBlock("div",{key:E,class:e.normalizeClass(["mrp-thumb",{"mrp-thumb-active":E+1===c.value}]),onClick:$=>S(E+1)},[e.createElementVNode("div",{class:"mrp-thumb-box","data-thumb":E+1,style:e.normalizeStyle({height:`${Math.round(w.pageHeightMm/w.pageWidthMm*116)}px`})},null,12,Dt),e.createElementVNode("span",Ft,e.toDisplayString(E+1),1)],10,Vt))),128))],512)):e.createCommentVNode("",!0)]),e.createElementVNode("div",It,[e.renderSlot(i.$slots,"default",{},void 0,!0)]),e.unref(H)?(e.openBlock(),e.createElementBlock("div",zt,[h[4]||(h[4]=e.createElementVNode("div",null,"mach-report debug",-1)),e.createElementVNode("div",null,"pages: "+e.toDisplayString(e.unref(H).pages)+" | window: ["+e.toDisplayString(e.unref(H).window)+"]",1),e.createElementVNode("div",null,"zoom: "+e.toDisplayString(e.unref(H).zoom)+" | load: "+e.toDisplayString(e.unref(H).loadMs),1),e.createElementVNode("div",null,"plan: "+e.toDisplayString(e.unref(H).planKB)+"KB",1)])):e.createCommentVNode("",!0)],4))}}),Ne=ce(Lt,[["__scopeId","data-v-4648d204"]]),Wt=Object.freeze(Object.defineProperty({__proto__:null,default:Ne},Symbol.toStringTag,{value:"Module"}));exports.DEFAULT_MESSAGES=Be;exports.DEFAULT_THEME=$e;exports.MachReportError=G;exports.ReportParamPanel=xe;exports.ReportPreview=Ne;exports.ReportPreview$1=Wt;exports.ReportToolbar=Ce;exports.SILENT_LOGGER=Bt;exports.buildPrintDocument=A;exports.buildWordHtml=Ee;exports.defineMachReportConfig=Ct;exports.defineMachReportPreset=xt;exports.printPlans=Ye;exports.provideMachReportConfig=$t;exports.resolveConfig=Re;exports.themeToCssVars=Me;exports.toErrorDetail=Te;exports.useMachReportConfig=Se;exports.usePageWindow=be;exports.usePrintExport=Pe;exports.useZoom=we;
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("./style-Xq08-IsV.cjs"),ce=require("./grid-geometry-BXpOxznT.cjs");function he(e){const t=/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(e.trim());if(t){const n=new Date(Number(t[1]),Number(t[2])-1,Number(t[3]));return Number.isNaN(n.getTime())?null:n}const r=new Date(e);return Number.isNaN(r.getTime())?null:r}function K(e,t){return e.toLocaleString("en-US",{minimumFractionDigits:t,maximumFractionDigits:t})}function Ce(e,t){const r=n=>String(n).padStart(2,"0");return t.replace(/YYYY/g,String(e.getFullYear())).replace(/MM/g,r(e.getMonth()+1)).replace(/DD/g,r(e.getDate())).replace(/hh/g,r(e.getHours())).replace(/mm/g,r(e.getMinutes())).replace(/ss/g,r(e.getSeconds()))}function ke(e,t,r){return r!=null?t?K(e,r):e.toFixed(r):t?K(e):String(e)}function Y(e){const t=typeof e=="number"?e:Number(String(e).replace(/,/g,""));return Number.isFinite(t)?t:null}function X(e,t){if(e==null||e===""||!t)return String(e??"");switch(t.kind){case"number":{const r=Y(e);return r==null?String(e):ke(r,t.thousands===!0,t.digits)}case"percent":{const r=Y(e);return r==null?String(e):`${K(r*100,t.digits??2)}%`}case"date":{const r=t.pattern??"YYYY-MM-DD",n=e instanceof Date?e:he(String(e));return n?Ce(n,r):String(e)}default:return String(e)}}function me(e,t){const r=e[t.field];if(r==null||r==="")return!1;if(typeof t.value=="number"){const s=Y(r);if(s==null)return!1;switch(t.op){case">":return s>t.value;case">=":return s>=t.value;case"<":return s<t.value;case"<=":return s<=t.value;case"==":return s===t.value;case"!=":return s!==t.value}}const n=String(r),o=String(t.value);switch(t.op){case"==":return n===o;case"!=":return n!==o;case">":return n>o;case">=":return n>=o;case"<":return n<o;case"<=":return n<=o}return!1}const Ae=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function W(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Re(e,t,r,n){const o=e[t];o!=null&&(typeof o!="number"||!Number.isFinite(o))&&n.push({path:`${r}.${t}`,message:`应为有限数字,实际 ${JSON.stringify(o)}`})}function Z(e,t,r,n=[]){if(!W(e)){r.push({path:t,message:"组件应为对象"});return}const o=e.kind;typeof o!="string"?r.push({path:`${t}.kind`,message:"组件缺少 kind 字符串"}):Ae.has(o)||n.push({path:`${t}.kind`,message:`未知组件类型 ${JSON.stringify(o)},将以兜底方式渲染`});for(const i of["leftMm","topMm","widthMm","heightMm"])Re(e,i,t,r);e.leftMm!=null&&e.widthMm!=null&&(e.leftMm<-100||e.widthMm<0)&&r.push({path:t,message:"几何数值异常(leftMm<-100 或 widthMm<0)"});const s=e.grid;s!==void 0&&(!W(s)||!Array.isArray(s.cells)?r.push({path:`${t}.grid.cells`,message:"grid.cells 应为二维数组"}):s.cells.forEach((i,c)=>{if(!Array.isArray(i)){r.push({path:`${t}.grid.cells.${c}`,message:"行应为数组"});return}i.forEach((h,m)=>{h!=null&&W(h)&&Array.isArray(h.children)&&h.children.forEach((g,l)=>{Z(g,`${t}.grid.cells.${c}.${m}.children.${l}`,r,n)})})}));const a=e.richParagraphs;a!==void 0&&(Array.isArray(a)?a.forEach((i,c)=>{(!W(i)||!Array.isArray(i.segments))&&r.push({path:`${t}.richParagraphs.${c}`,message:"段落缺少 segments 数组"})}):r.push({path:`${t}.richParagraphs`,message:"richParagraphs 应为数组"}))}function ge(e,t,r,n=[]){if(!W(e)){r.push({path:t,message:"页应为对象"});return}const o=e.pageWidthMm,s=e.pageHeightMm;(typeof o!="number"||!(o>0&&o<3e3))&&r.push({path:`${t}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(o)}`}),(typeof s!="number"||!(s>0&&s<5e3))&&r.push({path:`${t}.pageHeightMm`,message:`页高非法: ${JSON.stringify(s)}`});const a=e.components;a!==void 0&&!Array.isArray(a)?r.push({path:`${t}.components`,message:"components 应为数组"}):Array.isArray(a)&&a.forEach((i,c)=>Z(i,`${t}.components.${c}`,r,n))}function fe(e){const t=[],r=[],n=W(e)?e.pages:void 0;if(!Array.isArray(n))t.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"});else{n.forEach((s,a)=>ge(s,`$.pages.${a}`,t,r)),n.length>2e3&&r.push({path:"$.pages",message:`页数异常大(${n.length} 页),渲染与打印耗时可能显著增加`});const o=n.reduce((s,a)=>s+(W(a)&&Array.isArray(a.components)?a.components.length:0),0);o>5e4&&r.push({path:"$.pages",message:`组件总数异常大(${o} 个),可能触发浏览器性能限制`})}return{ok:t.length===0,errors:t,warnings:r}}function He(e){const t=fe(e);if(!t.ok){const r=t.errors.slice(0,3).map(n=>`${n.path}: ${n.message}`).join("; ");throw new Error(`渲染计划校验失败(${t.errors.length} 处): ${r}`)}return e.pages}function ae(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 Ne(e,t){return t.heightMm-(e.marginBottomMm??t.marginBottomMm)}function $e(e,t){const n=(e.fontSizePt??d.DEFAULT_FONT_PT)*d.LINE_HEIGHT*25.4/72,o=(e.paddingMm??1)*2;return Math.max(e.rowHeightMm??0,t*n+o)}function ue(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,t){const r=e.fontSizePt??d.DEFAULT_FONT_PT,n=e.paddingMm??1,o=e.columns.map(l=>l.style?{align:"left",verticalAlign:"middle",...l.style}:{align:"left",verticalAlign:"middle"}),s=e.columns.map(l=>({bold:e.headerBold??!0,align:"center",verticalAlign:"middle",backgroundColor:e.headerBackgroundColor,...l.style||{}})),a=e.columns.map(l=>l.header),i=a.map((l,u)=>d.wrapText(l,e.columns[u].widthMm-n*2,{fontSizePt:r,bold:e.headerBold??!0},t)),c=Math.max(...i.map(l=>l.length),1),h=$e(e,c),m=a.map((l,u)=>({text:l,style:s[u]})),g=e.border===!1?{borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}:{borderBottom:!0,borderLeft:!0,borderRight:!0,borderTop:!0};return{fontSizePt:r,paddingMm:n,cellStyles:o,borderStyle:g,headerHeightMm:h,headerGrid:{cells:[m],rowHeightsMm:[h]},columns:e.columns}}function le(e,t,r){const n=e.columns,o=new Array(n.length);let s=1;for(let m=0;m<n.length;m++){const g=n[m];o[m]=g.format?X(t[g.field],g.format):ue(t[g.field])}const a=new Array(n.length);for(let m=0;m<n.length;m++){const g=d.wrapText(o[m],n[m].widthMm-e.paddingMm*2,{fontSizePt:e.fontSizePt},r);a[m]=g,g.length>s&&(s=g.length)}const i=e.fontSizePt*d.LINE_HEIGHT*25.4/72,c=Math.max(e.rowHeightFloorMm,s*i+e.paddingMm*2),h=new Array(n.length);for(let m=0;m<n.length;m++){const g=n[m];let l=e.cellStyles[m];if(g.rules){for(const u of g.rules)if(me(t,u.when)){l={...l??{},...u.style};break}}h[m]={text:o[m],style:l}}return{grid:{cells:[h],rowHeightsMm:[c]},heightMm:c}}function _e(e,t,r={}){const n=typeof r=="number"?{mmPerRow:r}:r,o=n.mmPerRow??0,s=n.measurer??d.heuristicMeasurer,a=[],i=[];let c=0;const h=g=>`${g}_${(++c).toString(36)}`,m=[];for(const g of e.pages){const l=ae(g),u=()=>Ne(g,l),f=l.marginTopMm,T=[],R=()=>{if(i.push({pageWidthMm:l.widthMm,pageHeightMm:l.heightMm,marginTopMm:l.marginTopMm,marginBottomMm:l.marginBottomMm,marginLeftMm:l.marginLeftMm,marginRightMm:l.marginRightMm,components:l.components}),T.length>0){const P=i.length;for(const S of T){const C={...S,text:String(S.text??"").replace(/\{page\}/g,String(P))};i[i.length-1].components.push(C),C.text.includes("{totalPages}")&&m.push(C)}}};for(const P of g.components){if(P.kind!=="list"){if(P.kind==="text"&&typeof P.text=="string"){const M=P.text;if(M.includes("{page}")||M.includes("{totalPages}")){T.push(P);continue}}l.components.push(P);continue}const S=P,C=t[S.dataset];Array.isArray(C)||a.push(`数据集 ${S.dataset} 未提供数据,列表 ${S.id??""} 输出为空`);const w=Array.isArray(C)?C:[],V=S.columns.reduce((M,b)=>M+b.widthMm,0),U=V>S.widthMm?S.widthMm/V:1,v=U===1?S:{...S,columns:S.columns.map(M=>({...M,widthMm:M.widthMm*U}))},H={...Le(v,s),rowHeightFloorMm:v.rowHeightMm??0},G={kind:"rect",leftMm:S.leftMm,topMm:0,widthMm:S.widthMm,heightMm:H.headerHeightMm,grid:H.headerGrid,nid:h("listh"),style:H.borderStyle};let p=S.topMm;const N=(M,b)=>{M.components.push({...G,topMm:b})};N(l,p),p+=H.headerHeightMm+o;const F=M=>{if(p+M>u()){R();const b=ae(g);l.components=b.components,l.heightMm=b.heightMm,v.headerEveryPage!==!1?(N(l,S.topMm),p=S.topMm+H.headerHeightMm):p=f}},y=(M,b,x)=>{F(b),l.components.push({kind:"rect",leftMm:S.leftMm,topMm:p,widthMm:S.widthMm,heightMm:b,grid:M,nid:h(x),style:H.borderStyle}),p+=b},$=()=>le(H,{},s).heightMm,k=(M,b,x,E)=>{const I=[],ie=Math.max(1,Math.min(E,v.columns.length));I.push({text:M,colSpan:ie,style:{bold:!0,...x}});for(let q=ie;q<v.columns.length;q++){const Ee=v.columns[q];I.push({text:b.get(Ee.field)??"",style:x})}const ve=H.fontSizePt*d.LINE_HEIGHT*25.4/72,se=Math.max(H.rowHeightFloorMm,ve+H.paddingMm*2);return{grid:{cells:[I],rowHeightsMm:[se]},heightMm:se}},D=(M,b)=>{let x=0;for(const E of M){const I=typeof E[b]=="number"?E[b]:Number(E[b]);Number.isFinite(I)&&(x+=I)}return x},J=(M,b)=>{const x=v.columns.find(E=>E.field===b);return X(D(M,b),x?.format??{kind:"number",thousands:!0})},B=v.groupBy,Pe=typeof v.grandTotal=="object"&&v.grandTotal.fields||B?.subtotal||[],ne=v.columns.findIndex(M=>Pe.includes(M.field)),re=ne>0?ne:1,j=[];if(B){const M=new Map;for(const b of w){const x=ue(b[B.field]),E=M.get(x);E?E.push(b):M.set(x,[b])}for(const[b,x]of M){j.push({kind:"groupHeader",label:(B.headerTemplate??"{value}").replace(/\{value\}/g,b)});for(const E of x)j.push({kind:"row",row:E});B.subtotal&&B.subtotal.length>0&&j.push({kind:"subtotal",label:B.subtotalLabel??"小计",rows:x})}}else for(const M of w)j.push({kind:"row",row:M});const oe=$();for(const M of j)if(M.kind==="row"){const b=le(H,M.row,s);y(b.grid,b.heightMm,"listr")}else if(M.kind==="groupHeader"){const b=k(M.label,new Map,B?.headerStyle??{},v.columns.length);B?.keepWithNext!==!1&&p+b.heightMm+oe>u()&&F(b.heightMm+oe),y(b.grid,b.heightMm,"listg")}else if(M.kind==="subtotal"){const b=new Map;for(const E of B.subtotal??[])b.set(E,J(M.rows,E));const x=k(M.label,b,B?.subtotalStyle??{},re);y(x.grid,x.heightMm,"listst")}if(v.grandTotal){const M=typeof v.grandTotal=="object"?v.grandTotal:void 0,b=M?.fields??B?.subtotal??[];if(b.length>0){const x=new Map;for(const I of b)x.set(I,J(w,I));const E=k(M?.label??"合计",x,M?.style??{},re);y(E.grid,E.heightMm,"listgt")}else a.push(`列表 ${S.id??""} 配置了 grandTotal 但未提供合计字段(groupBy.subtotal 或 grandTotal.fields)`)}}R()}for(const g of m){const l=g.text;typeof l=="string"&&l.includes("{totalPages}")&&(g.text=l.replace(/\{totalPages\}/g,String(i.length)))}return{plan:{schemaVersion:d.RENDER_PLAN_SCHEMA_VERSION,pages:i},warnings:a}}const Fe={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,t){return t?.classNames?.[e]??Fe[e]}class z{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,`${d.round(d.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 pe(e,t,r){const n=t.style||{};e.add("color",n.color).add("background-color",n.backgroundColor).add("font-family",n.fontFamily).add("font-weight",n.bold?"700":void 0).add("font-style",n.italic?"italic":void 0).add("text-decoration",n.underline?"underline":void 0).add("letter-spacing",n.letterSpacing!=null?`${n.letterSpacing}pt`:void 0).add("opacity",n.opacity!=null?String(n.opacity):void 0).add("transform",n.rotateDeg?`rotate(${n.rotateDeg}deg)`:void 0);const o=d.resolveFontSize(n,r);e.add("font-size",`${d.round(o.fontSizePx,2)}px`)}function Be(e,t,r,n,o){const s=o.createElement("table");if(s.className=_("grid",n),new z().add("width","100%").add("height","100%").add("border-collapse","collapse").add("table-layout",e.colWidthsMm?"fixed":"auto").applyTo(s),e.colWidthsMm){const h=o.createElement("colgroup");for(const m of e.colWidthsMm){const g=o.createElement("col");new z().mm("width",m,r).applyTo(g),h.appendChild(g)}s.appendChild(h)}const a=d.resolveBoxBorders(t.style),i=d.resolveStroke(t.style),c=a.inner?`${d.round(i.widthPt*r/72,2)}px solid ${i.color}`:"";return e.cells.forEach((h,m)=>{const g=o.createElement("tr");g.className=_("row",n),e.rowHeightsMm?.[m]!=null&&new z().mm("height",e.rowHeightsMm[m],r).applyTo(g),(h||[]).forEach(l=>{const u=o.createElement("td");u.className=_("cell",n),l?.colSpan&&(u.colSpan=l.colSpan),l?.rowSpan&&(u.rowSpan=l.rowSpan);const f=new z;if(c&&f.add("border",c),l?.style){const T=l.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",`${d.round(d.resolveFontSize(T,r).fontSizePx,2)}px`)}if(f.applyTo(u),l?.text!=null&&(u.textContent=l.text),l?.children?.length)for(const T of l.children)u.appendChild(Q(T,r,n,o));g.appendChild(u)}),s.appendChild(g)}),s}function ze(e,t,r,n){const o=n.createElement("div");o.className=_("text",r);const s=e.style||{},a=new z().add("text-align",s.align).add("display","flex").add("flex-direction","column").add("justify-content",s.verticalAlign==="middle"?"center":s.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow","hidden");if(pe(a,e,t),a.applyTo(o),d.isRichText(e)){const i=n.createElement("div");i.className=_("rich",r);for(const c of e.richParagraphs){const h=n.createElement("div");h.className=_("paragraph",r),new z().add("text-align",c.align).add("line-height",c.lineHeight!=null?String(c.lineHeight):void 0).mm("margin-top",c.spaceBeforeMm??0,t).mm("margin-bottom",c.spaceAfterMm??0,t).mm("text-indent",c.indentMm??0,t).applyTo(h);for(const g of c.segments||[]){const l=n.createElement("span");if(l.className=_("segment",r),l.textContent=g.kind==="field"?g.field??"":g.text??"",g.style){const u=new z().add("color",g.style.color).add("font-weight",g.style.bold?"700":void 0);u.add("font-size",`${d.round(d.resolveFontSize(g.style,t).fontSizePx,2)}px`),u.applyTo(l)}h.appendChild(l)}i.appendChild(h)}return o.appendChild(i),o}if(Array.isArray(e.lines)&&e.lines.length>0){const i=n.createElement("div");i.className=_("lines",r),s.lineHeight!=null&&new z().add("line-height",String(s.lineHeight)).applyTo(i);for(const c of e.lines){const h=n.createElement("div");h.className=_("line",r),h.textContent=c,i.appendChild(h)}return o.appendChild(i),o}return o.textContent=e.text??"",o}function Ie(e,t,r){const n=r.createElement("img");return n.className=_("image",t),n.src=e.imageData,new z().add("width","100%").add("height","100%").add("object-fit","contain").add("display","block").applyTo(n),n.alt=e.kind,n}function de(e,t,r,n){const o=n.createElement("div");o.className=_("shape",r);const s=e.style||{},a=d.resolveStroke(s),i=d.resolveBoxBorders(s),c=`${d.round(a.widthPt*t/72,2)}px solid ${a.color}`,h=new z;return e.grid||e.kind==="rect"?(i.top&&h.add("border-top",c),i.right&&h.add("border-right",c),i.bottom&&h.add("border-bottom",c),i.left&&h.add("border-left",c)):e.kind==="ellipse"?(i.inner&&h.add("border",c).add("border-radius","50%"),s.backgroundColor&&h.add("background-color",s.backgroundColor)):e.kind==="line"&&h.add("height","0").add("border-top",c),h.add("box-sizing","border-box").add("width","100%").add("height","100%"),h.applyTo(o),o}function Q(e,t,r,n){const o=n.createElement("div");o.className=`${_("comp",r)} mr-kind-${e.kind}`;const s=new z().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(pe(s,e,t),s.applyTo(o),d.isImageBackedComponent(e))return o.appendChild(Ie(e,r,n)),o;if(e.kind==="text")return o.appendChild(ze(e,t,r,n)),o;if(e.grid){const i=de(e,t,r,n);return i.appendChild(Be(e.grid,e,t,r,n)),o.appendChild(i),o}if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse"||e.kind==="chart")return o.appendChild(de(e,t,r,n)),o;const a=n.createElement("div");return a.className=_("unknown",r),a.textContent=e.fallbackText??"",o.appendChild(a),o}function Me(e,t,r,n){const o=n.createElement("div");o.className=_("page",r),new z().add("position","relative").mm("width",e.pageWidthMm,t).mm("height",e.pageHeightMm,t).add("background-color","#fff").add("overflow","hidden").add("box-sizing","border-box").applyTo(o);for(const s of e.components)o.appendChild(Q(s,t,r,n));return o}function De(e,t,r={}){const n=r.dpi??96,o=t.createElement("div");return o.className=_("root",r),o.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(s=>{o.appendChild(Me(s,n,r,t))}),o}function be(e){const{pageHeightsPx:t,viewportHeightPx:r,scrollTopPx:n,overscan:o=1,gapPx:s=0}=e,a=t.length;if(a===0)return{start:0,end:-1,padTopPx:0,padBottomPx:0};const i=Math.max(0,s),c=new Array(a+1);c[0]=0;for(let w=0;w<a;w++)c[w+1]=c[w]+Math.max(0,t[w]??0)+i;const h=c[a],m=Math.max(0,n);let g=0,l=0,u=a-1;for(;l<=u;){const w=l+u>>1;c[w]<=m?(g=w,l=w+1):u=w-1}const f=Math.max(0,Math.min(a-1,g-o)),T=c[g]+Math.max(0,r);let R=a-1;for(l=0,u=a-1;l<=u;){const w=l+u>>1;c[w+1]<T?l=w+1:(R=w,u=w-1)}const P=Math.min(a-1,R+o),S=c[f],C=Math.max(0,h-c[P+1]);return{start:f,end:P,padTopPx:S,padBottomPx:C}}const ee=96/25.4;function te(e,t=96){const r=t/96*ee;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*r)),heightPx:Math.max(1,Math.round(e.pageHeightMm*r))}}function Oe(e,t,r){const n=document.createElement("canvas"),{widthPx:o,heightPx:s}=te(e,r);n.width=Math.round(o*t),n.height=Math.round(s*t),n.style.width=`${o}px`,n.style.height=`${s}px`;const a=n.getContext("2d");if(!a)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return a.scale(t,t),a.fillStyle="#ffffff",a.fillRect(0,0,o,s),{canvas:n,ctx:a}}function We(e,t=96){return d.resolveFontSize(e,t).fontSizePx}function Se(e,t,r,n,o,s,a,i="top"){e.font=`${t.bold?"bold ":""}${t.fontSizePx}px ${a}`,e.fillStyle=t.color,e.textBaseline="alphabetic";const c=t.fontSizePx*t.lineHeight,h=t.text===""?[""]:t.text.split(`
2
- `),m=h.length*c;let g=n;i==="middle"?g=n+(s-m)/2:i==="bottom"&&(g=n+s-m),h.forEach((l,u)=>{e.textAlign=t.align==="center"?"center":t.align==="right"?"right":"left";const f=t.align==="center"?r+o/2:t.align==="right"?r+o:r;e.fillText(l,f,g+u*c+t.fontSizePx*.8,o)}),e.textAlign="left"}function Ge(e,t,r,n,o,s,a,i,c,h,m){const g=ce.resolveGridLayout(t,s/i,a/i),l=d.resolveBoxBorders(r.style),u=d.resolveStroke(r.style);for(const f of g.cells){const T=f.cell.style?.backgroundColor;T&&(e.fillStyle=T,e.fillRect(n+f.xMm*i,o+f.yMm*i,f.widthMm*i,f.heightMm*i))}if(l.inner){e.strokeStyle=u.color,e.lineWidth=d.ptToPx(u.widthPt,c);for(const f of g.edges)e.beginPath(),f.kind==="v"?(e.moveTo(n+f.pos*i,o+f.from*i),e.lineTo(n+f.pos*i,o+f.to*i)):(e.moveTo(n+f.from*i,o+f.pos*i),e.lineTo(n+f.to*i,o+f.pos*i)),e.stroke();e.beginPath(),l.top&&(e.moveTo(n,o),e.lineTo(n+s,o)),l.right&&(e.moveTo(n+s,o),e.lineTo(n+s,o+a)),l.bottom&&(e.moveTo(n+s,o+a),e.lineTo(n,o+a)),l.left&&(e.moveTo(n,o+a),e.lineTo(n,o)),e.stroke()}for(const f of g.cells){const T=typeof f.cell.text=="string"?f.cell.text:"";if(!T)continue;const R=f.cell.style,P=R?.fontSize??d.DEFAULT_FONT_PT,S=d.wrapText(T,f.widthMm-1,{fontSizePt:P},m).join(`
3
- `);Se(e,{text:S,fontSizePx:d.resolveFontSize(R,c).fontSizePx,bold:R?.bold??!1,color:R?.color??d.resolveTextColor(r.style,d.DEFAULT_TEXT_COLOR),align:R?.align??"left",lineHeight:d.LINE_HEIGHT},n+(f.xMm+.5)*i,o+f.yMm*i,Math.max(0,(f.widthMm-1)*i),f.heightMm*i,h,R?.verticalAlign??"middle")}}function ye(e,t,r,n,o,s){const a=t.leftMm*r,i=t.topMm*r,c=t.widthMm*r,h=t.heightMm*r,m=t.style??{};if(t.grid){Ge(e,t.grid,t,a,i,c,h,r,n,o,s);return}switch(t.kind){case"text":{const g=m.fontSize??d.DEFAULT_FONT_PT,l=d.isRichText(t)?t.richParagraphs.map(u=>(u.segments??[]).map(f=>f.text??f.field??"").join("")).join(`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("./style-Xq08-IsV.cjs"),ce=require("./grid-geometry-BXpOxznT.cjs");function me(e){const t=/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(e.trim());if(t){const n=new Date(Number(t[1]),Number(t[2])-1,Number(t[3]));return Number.isNaN(n.getTime())?null:n}const r=new Date(e);return Number.isNaN(r.getTime())?null:r}function K(e,t){return e.toLocaleString("en-US",{minimumFractionDigits:t,maximumFractionDigits:t})}function ke(e,t){const r=n=>String(n).padStart(2,"0");return t.replace(/YYYY/g,String(e.getFullYear())).replace(/MM/g,r(e.getMonth()+1)).replace(/DD/g,r(e.getDate())).replace(/hh/g,r(e.getHours())).replace(/mm/g,r(e.getMinutes())).replace(/ss/g,r(e.getSeconds()))}function Ae(e,t,r){return r!=null?t?K(e,r):e.toFixed(r):t?K(e):String(e)}function Y(e){const t=typeof e=="number"?e:Number(String(e).replace(/,/g,""));return Number.isFinite(t)?t:null}function X(e,t){if(e==null||e===""||!t)return String(e??"");switch(t.kind){case"number":{const r=Y(e);return r==null?String(e):Ae(r,t.thousands===!0,t.digits)}case"percent":{const r=Y(e);return r==null?String(e):`${K(r*100,t.digits??2)}%`}case"date":{const r=t.pattern??"YYYY-MM-DD",n=e instanceof Date?e:me(String(e));return n?ke(n,r):String(e)}default:return String(e)}}function he(e,t){const r=e[t.field];if(r==null||r==="")return!1;if(typeof t.value=="number"){const a=Y(r);if(a==null)return!1;switch(t.op){case">":return a>t.value;case">=":return a>=t.value;case"<":return a<t.value;case"<=":return a<=t.value;case"==":return a===t.value;case"!=":return a!==t.value}}const n=String(r),o=String(t.value);switch(t.op){case"==":return n===o;case"!=":return n!==o;case">":return n>o;case">=":return n>=o;case"<":return n<o;case"<=":return n<=o}return!1}const Re=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function W(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function He(e,t,r,n){const o=e[t];o!=null&&(typeof o!="number"||!Number.isFinite(o))&&n.push({path:`${r}.${t}`,message:`应为有限数字,实际 ${JSON.stringify(o)}`})}function Z(e,t,r,n=[]){if(!W(e)){r.push({path:t,message:"组件应为对象"});return}const o=e.kind;typeof o!="string"?r.push({path:`${t}.kind`,message:"组件缺少 kind 字符串"}):Re.has(o)||n.push({path:`${t}.kind`,message:`未知组件类型 ${JSON.stringify(o)},将以兜底方式渲染`});for(const i of["leftMm","topMm","widthMm","heightMm"])He(e,i,t,r);e.leftMm!=null&&e.widthMm!=null&&(e.leftMm<-100||e.widthMm<0)&&r.push({path:t,message:"几何数值异常(leftMm<-100 或 widthMm<0)"});const a=e.grid;a!==void 0&&(!W(a)||!Array.isArray(a.cells)?r.push({path:`${t}.grid.cells`,message:"grid.cells 应为二维数组"}):a.cells.forEach((i,d)=>{if(!Array.isArray(i)){r.push({path:`${t}.grid.cells.${d}`,message:"行应为数组"});return}i.forEach((m,h)=>{m!=null&&W(m)&&Array.isArray(m.children)&&m.children.forEach((g,l)=>{Z(g,`${t}.grid.cells.${d}.${h}.children.${l}`,r,n)})})}));const s=e.richParagraphs;s!==void 0&&(Array.isArray(s)?s.forEach((i,d)=>{(!W(i)||!Array.isArray(i.segments))&&r.push({path:`${t}.richParagraphs.${d}`,message:"段落缺少 segments 数组"})}):r.push({path:`${t}.richParagraphs`,message:"richParagraphs 应为数组"}))}function ge(e,t,r,n=[]){if(!W(e)){r.push({path:t,message:"页应为对象"});return}const o=e.pageWidthMm,a=e.pageHeightMm;(typeof o!="number"||!(o>0&&o<3e3))&&r.push({path:`${t}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(o)}`}),(typeof a!="number"||!(a>0&&a<5e3))&&r.push({path:`${t}.pageHeightMm`,message:`页高非法: ${JSON.stringify(a)}`});const s=e.components;s!==void 0&&!Array.isArray(s)?r.push({path:`${t}.components`,message:"components 应为数组"}):Array.isArray(s)&&s.forEach((i,d)=>Z(i,`${t}.components.${d}`,r,n))}function fe(e){const t=[],r=[],n=W(e)?e.pages:void 0;if(!Array.isArray(n))t.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"});else{n.forEach((a,s)=>ge(a,`$.pages.${s}`,t,r)),n.length>2e3&&r.push({path:"$.pages",message:`页数异常大(${n.length} 页),渲染与打印耗时可能显著增加`});const o=n.reduce((a,s)=>a+(W(s)&&Array.isArray(s.components)?s.components.length:0),0);o>5e4&&r.push({path:"$.pages",message:`组件总数异常大(${o} 个),可能触发浏览器性能限制`})}return{ok:t.length===0,errors:t,warnings:r}}function Ne(e){const t=fe(e);if(!t.ok){const r=t.errors.slice(0,3).map(n=>`${n.path}: ${n.message}`).join("; ");throw new Error(`渲染计划校验失败(${t.errors.length} 处): ${r}`)}return e.pages}function ae(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 $e(e,t){return t.heightMm-(e.marginBottomMm??t.marginBottomMm)}function Le(e,t){const n=(e.fontSizePt??c.DEFAULT_FONT_PT)*c.LINE_HEIGHT*25.4/72,o=(e.paddingMm??1)*2;return Math.max(e.rowHeightMm??0,t*n+o)}function ue(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 _e(e,t){const r=e.fontSizePt??c.DEFAULT_FONT_PT,n=e.paddingMm??1,o=e.columns.map(l=>l.style?{align:"left",verticalAlign:"middle",...l.style}:{align:"left",verticalAlign:"middle"}),a=e.columns.map(l=>({bold:e.headerBold??!0,align:"center",verticalAlign:"middle",backgroundColor:e.headerBackgroundColor,...l.style||{}})),s=e.columns.map(l=>l.header),i=s.map((l,u)=>c.wrapText(l,e.columns[u].widthMm-n*2,{fontSizePt:r,bold:e.headerBold??!0},t)),d=Math.max(...i.map(l=>l.length),1),m=Le(e,d),h=s.map((l,u)=>({text:l,style:a[u]})),g=e.border===!1?{borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}:{borderBottom:!0,borderLeft:!0,borderRight:!0,borderTop:!0};return{fontSizePt:r,paddingMm:n,cellStyles:o,borderStyle:g,headerHeightMm:m,headerGrid:{cells:[h],rowHeightsMm:[m]},columns:e.columns}}function le(e,t,r){const n=e.columns,o=new Array(n.length);let a=1;for(let h=0;h<n.length;h++){const g=n[h];o[h]=g.format?X(t[g.field],g.format):ue(t[g.field])}const s=new Array(n.length);for(let h=0;h<n.length;h++){const g=c.wrapText(o[h],n[h].widthMm-e.paddingMm*2,{fontSizePt:e.fontSizePt},r);s[h]=g,g.length>a&&(a=g.length)}const i=e.fontSizePt*c.LINE_HEIGHT*25.4/72,d=Math.max(e.rowHeightFloorMm,a*i+e.paddingMm*2),m=new Array(n.length);for(let h=0;h<n.length;h++){const g=n[h];let l=e.cellStyles[h];if(g.rules){for(const u of g.rules)if(he(t,u.when)){l={...l??{},...u.style};break}}m[h]={text:o[h],style:l}}return{grid:{cells:[m],rowHeightsMm:[d]},heightMm:d}}function Be(e,t,r={}){const n=typeof r=="number"?{mmPerRow:r}:r,o=n.mmPerRow??0,a=n.measurer??c.heuristicMeasurer,s=[],i=[];let d=0;const m=g=>`${g}_${(++d).toString(36)}`,h=[];for(const g of e.pages){const l=ae(g),u=()=>$e(g,l),f=l.marginTopMm,T=[],R=()=>{if(i.push({pageWidthMm:l.widthMm,pageHeightMm:l.heightMm,marginTopMm:l.marginTopMm,marginBottomMm:l.marginBottomMm,marginLeftMm:l.marginLeftMm,marginRightMm:l.marginRightMm,components:l.components}),T.length>0){const v=i.length;for(const S of T){const C={...S,text:String(S.text??"").replace(/\{page\}/g,String(v))};i[i.length-1].components.push(C),C.text.includes("{totalPages}")&&h.push(C)}}};for(const v of g.components){if(v.kind!=="list"){if(v.kind==="text"&&typeof v.text=="string"){const M=v.text;if(M.includes("{page}")||M.includes("{totalPages}")){T.push(v);continue}}l.components.push(v);continue}const S=v,C=t[S.dataset];Array.isArray(C)||s.push(`数据集 ${S.dataset} 未提供数据,列表 ${S.id??""} 输出为空`);const w=Array.isArray(C)?C:[],V=S.columns.reduce((M,b)=>M+b.widthMm,0),U=V>S.widthMm?S.widthMm/V:1,x=U===1?S:{...S,columns:S.columns.map(M=>({...M,widthMm:M.widthMm*U}))},H={..._e(x,a),rowHeightFloorMm:x.rowHeightMm??0},j={kind:"rect",leftMm:S.leftMm,topMm:0,widthMm:S.widthMm,heightMm:H.headerHeightMm,grid:H.headerGrid,nid:m("listh"),style:H.borderStyle};let p=S.topMm;const N=(M,b)=>{M.components.push({...j,topMm:b})};N(l,p),p+=H.headerHeightMm+o;const B=M=>{if(p+M>u()){R();const b=ae(g);l.components=b.components,l.heightMm=b.heightMm,x.headerEveryPage!==!1?(N(l,S.topMm),p=S.topMm+H.headerHeightMm):p=f}},y=(M,b,P)=>{B(b),l.components.push({kind:"rect",leftMm:S.leftMm,topMm:p,widthMm:S.widthMm,heightMm:b,grid:M,nid:m(P),style:H.borderStyle}),p+=b},$=()=>le(H,{},a).heightMm,k=(M,b,P,E)=>{const I=[],ie=Math.max(1,Math.min(E,x.columns.length));I.push({text:M,colSpan:ie,style:{bold:!0,...P}});for(let q=ie;q<x.columns.length;q++){const Ce=x.columns[q];I.push({text:b.get(Ce.field)??"",style:P})}const Ee=H.fontSizePt*c.LINE_HEIGHT*25.4/72,se=Math.max(H.rowHeightFloorMm,Ee+H.paddingMm*2);return{grid:{cells:[I],rowHeightsMm:[se]},heightMm:se}},D=(M,b)=>{let P=0;for(const E of M){const I=typeof E[b]=="number"?E[b]:Number(E[b]);Number.isFinite(I)&&(P+=I)}return P},J=(M,b)=>{const P=x.columns.find(E=>E.field===b);return X(D(M,b),P?.format??{kind:"number",thousands:!0})},F=x.groupBy,xe=typeof x.grandTotal=="object"&&x.grandTotal.fields||F?.subtotal||[],ne=x.columns.findIndex(M=>xe.includes(M.field)),re=ne>0?ne:1,G=[];if(F){const M=new Map;for(const b of w){const P=ue(b[F.field]),E=M.get(P);E?E.push(b):M.set(P,[b])}for(const[b,P]of M){G.push({kind:"groupHeader",label:(F.headerTemplate??"{value}").replace(/\{value\}/g,b)});for(const E of P)G.push({kind:"row",row:E});F.subtotal&&F.subtotal.length>0&&G.push({kind:"subtotal",label:F.subtotalLabel??"小计",rows:P})}}else for(const M of w)G.push({kind:"row",row:M});const oe=$();for(const M of G)if(M.kind==="row"){const b=le(H,M.row,a);y(b.grid,b.heightMm,"listr")}else if(M.kind==="groupHeader"){const b=k(M.label,new Map,F?.headerStyle??{},x.columns.length);F?.keepWithNext!==!1&&p+b.heightMm+oe>u()&&B(b.heightMm+oe),y(b.grid,b.heightMm,"listg")}else if(M.kind==="subtotal"){const b=new Map;for(const E of F.subtotal??[])b.set(E,J(M.rows,E));const P=k(M.label,b,F?.subtotalStyle??{},re);y(P.grid,P.heightMm,"listst")}if(x.grandTotal){const M=typeof x.grandTotal=="object"?x.grandTotal:void 0,b=M?.fields??F?.subtotal??[];if(b.length>0){const P=new Map;for(const I of b)P.set(I,J(w,I));const E=k(M?.label??"合计",P,M?.style??{},re);y(E.grid,E.heightMm,"listgt")}else s.push(`列表 ${S.id??""} 配置了 grandTotal 但未提供合计字段(groupBy.subtotal 或 grandTotal.fields)`)}}R()}for(const g of h){const l=g.text;typeof l=="string"&&l.includes("{totalPages}")&&(g.text=l.replace(/\{totalPages\}/g,String(i.length)))}return{plan:{schemaVersion:c.RENDER_PLAN_SCHEMA_VERSION,pages:i},warnings:s}}const Fe={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,t){return t?.classNames?.[e]??Fe[e]}class z{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,`${c.round(c.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 pe(e,t,r){const n=t.style||{};e.add("color",n.color).add("background-color",n.backgroundColor).add("font-family",n.fontFamily).add("font-weight",n.bold?"700":void 0).add("font-style",n.italic?"italic":void 0).add("text-decoration",n.underline?"underline":void 0).add("letter-spacing",n.letterSpacing!=null?`${n.letterSpacing}pt`:void 0).add("opacity",n.opacity!=null?String(n.opacity):void 0).add("transform",n.rotateDeg?`rotate(${n.rotateDeg}deg)`:void 0);const o=c.resolveFontSize(n,r);e.add("font-size",`${c.round(o.fontSizePx,2)}px`)}function ze(e,t,r,n,o){const a=o.createElement("table");if(a.className=_("grid",n),new z().add("width","100%").add("height","100%").add("border-collapse","collapse").add("table-layout",e.colWidthsMm?"fixed":"auto").applyTo(a),e.colWidthsMm){const m=o.createElement("colgroup");for(const h of e.colWidthsMm){const g=o.createElement("col");new z().mm("width",h,r).applyTo(g),m.appendChild(g)}a.appendChild(m)}const s=c.resolveBoxBorders(t.style),i=c.resolveStroke(t.style),d=s.inner?`${c.round(i.widthPt*r/72,2)}px solid ${i.color}`:"";return e.cells.forEach((m,h)=>{const g=o.createElement("tr");g.className=_("row",n),e.rowHeightsMm?.[h]!=null&&new z().mm("height",e.rowHeightsMm[h],r).applyTo(g),(m||[]).forEach(l=>{const u=o.createElement("td");u.className=_("cell",n),l?.colSpan&&(u.colSpan=l.colSpan),l?.rowSpan&&(u.rowSpan=l.rowSpan);const f=new z;if(d&&f.add("border",d),l?.style){const T=l.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",`${c.round(c.resolveFontSize(T,r).fontSizePx,2)}px`)}if(f.applyTo(u),l?.text!=null&&(u.textContent=l.text),l?.children?.length)for(const T of l.children)u.appendChild(Q(T,r,n,o));g.appendChild(u)}),a.appendChild(g)}),a}function Ie(e,t,r,n){const o=n.createElement("div");o.className=_("text",r);const a=e.style||{},s=new z().add("text-align",a.align).add("display","flex").add("flex-direction","column").add("justify-content",a.verticalAlign==="middle"?"center":a.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow","hidden");if(pe(s,e,t),s.applyTo(o),c.isRichText(e)){const i=n.createElement("div");i.className=_("rich",r);for(const d of e.richParagraphs){const m=n.createElement("div");m.className=_("paragraph",r),new z().add("text-align",d.align).add("line-height",d.lineHeight!=null?String(d.lineHeight):void 0).mm("margin-top",d.spaceBeforeMm??0,t).mm("margin-bottom",d.spaceAfterMm??0,t).mm("text-indent",d.indentMm??0,t).applyTo(m);for(const g of d.segments||[]){const l=n.createElement("span");if(l.className=_("segment",r),l.textContent=g.kind==="field"?g.field??"":g.text??"",g.style){const u=new z().add("color",g.style.color).add("font-weight",g.style.bold?"700":void 0);u.add("font-size",`${c.round(c.resolveFontSize(g.style,t).fontSizePx,2)}px`),u.applyTo(l)}m.appendChild(l)}i.appendChild(m)}return o.appendChild(i),o}if(Array.isArray(e.lines)&&e.lines.length>0){const i=n.createElement("div");i.className=_("lines",r),a.lineHeight!=null&&new z().add("line-height",String(a.lineHeight)).applyTo(i);for(const d of e.lines){const m=n.createElement("div");m.className=_("line",r),m.textContent=d,i.appendChild(m)}return o.appendChild(i),o}return o.textContent=e.text??"",o}function De(e,t,r){const n=r.createElement("img");return n.className=_("image",t),n.src=e.imageData,new z().add("width","100%").add("height","100%").add("object-fit","contain").add("display","block").applyTo(n),n.alt=e.kind,n}function de(e,t,r,n){const o=n.createElement("div");o.className=_("shape",r);const a=e.style||{},s=c.resolveStroke(a),i=c.resolveBoxBorders(a),d=`${c.round(s.widthPt*t/72,2)}px solid ${s.color}`,m=new z;return e.grid||e.kind==="rect"?(i.top&&m.add("border-top",d),i.right&&m.add("border-right",d),i.bottom&&m.add("border-bottom",d),i.left&&m.add("border-left",d)):e.kind==="ellipse"?(i.inner&&m.add("border",d).add("border-radius","50%"),a.backgroundColor&&m.add("background-color",a.backgroundColor)):e.kind==="line"&&m.add("height","0").add("border-top",d),m.add("box-sizing","border-box").add("width","100%").add("height","100%"),m.applyTo(o),o}function Q(e,t,r,n){const o=n.createElement("div");o.className=`${_("comp",r)} mr-kind-${e.kind}`;const a=new z().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(pe(a,e,t),a.applyTo(o),c.isImageBackedComponent(e))return o.appendChild(De(e,r,n)),o;if(e.kind==="text")return o.appendChild(Ie(e,t,r,n)),o;if(e.grid){const i=de(e,t,r,n);return i.appendChild(ze(e.grid,e,t,r,n)),o.appendChild(i),o}if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse"||e.kind==="chart")return o.appendChild(de(e,t,r,n)),o;const s=n.createElement("div");return s.className=_("unknown",r),s.textContent=e.fallbackText??"",o.appendChild(s),o}function Me(e,t,r,n){const o=n.createElement("div");o.className=_("page",r),new z().add("position","relative").mm("width",e.pageWidthMm,t).mm("height",e.pageHeightMm,t).add("background-color","#fff").add("overflow","hidden").add("box-sizing","border-box").applyTo(o);for(const a of e.components)o.appendChild(Q(a,t,r,n));return o}function Oe(e,t,r={}){const n=r.dpi??96,o=t.createElement("div");return o.className=_("root",r),o.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(a=>{o.appendChild(Me(a,n,r,t))}),o}function be(e){const{pageHeightsPx:t,viewportHeightPx:r,scrollTopPx:n,overscan:o=1,gapPx:a=0}=e,s=t.length;if(s===0)return{start:0,end:-1,padTopPx:0,padBottomPx:0};const i=Math.max(0,a),d=new Array(s+1);d[0]=0;for(let w=0;w<s;w++)d[w+1]=d[w]+Math.max(0,t[w]??0)+i;const m=d[s],h=Math.max(0,n);let g=0,l=0,u=s-1;for(;l<=u;){const w=l+u>>1;d[w]<=h?(g=w,l=w+1):u=w-1}const f=Math.max(0,Math.min(s-1,g-o)),T=d[g]+Math.max(0,r);let R=s-1;for(l=0,u=s-1;l<=u;){const w=l+u>>1;d[w+1]<T?l=w+1:(R=w,u=w-1)}const v=Math.min(s-1,R+o),S=d[f],C=Math.max(0,m-d[v+1]);return{start:f,end:v,padTopPx:S,padBottomPx:C}}const ee=96/25.4;function te(e,t=96){const r=t/96*ee;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*r)),heightPx:Math.max(1,Math.round(e.pageHeightMm*r))}}function We(e,t,r){const n=document.createElement("canvas"),{widthPx:o,heightPx:a}=te(e,r);n.width=Math.round(o*t),n.height=Math.round(a*t),n.style.width=`${o}px`,n.style.height=`${a}px`;const s=n.getContext("2d");if(!s)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return s.scale(t,t),s.fillStyle="#ffffff",s.fillRect(0,0,o,a),{canvas:n,ctx:s}}function je(e,t=96){return c.resolveFontSize(e,t).fontSizePx}function Se(e,t,r,n,o,a,s,i="top"){e.font=`${t.bold?"bold ":""}${t.fontSizePx}px ${s}`,e.fillStyle=t.color,e.textBaseline="alphabetic";const d=t.fontSizePx*t.lineHeight,m=t.text===""?[""]:t.text.split(`
2
+ `),h=m.length*d;let g=n;i==="middle"?g=n+(a-h)/2:i==="bottom"&&(g=n+a-h),m.forEach((l,u)=>{e.textAlign=t.align==="center"?"center":t.align==="right"?"right":"left";const f=t.align==="center"?r+o/2:t.align==="right"?r+o:r;e.fillText(l,f,g+u*d+t.fontSizePx*.8,o)}),e.textAlign="left"}function Ge(e,t,r,n,o,a,s,i,d,m,h){const g=ce.resolveGridLayout(t,a/i,s/i),l=c.resolveBoxBorders(r.style),u=c.resolveStroke(r.style);for(const f of g.cells){const T=f.cell.style?.backgroundColor;T&&(e.fillStyle=T,e.fillRect(n+f.xMm*i,o+f.yMm*i,f.widthMm*i,f.heightMm*i))}if(l.inner){e.strokeStyle=u.color,e.lineWidth=c.ptToPx(u.widthPt,d);for(const f of g.edges)e.beginPath(),f.kind==="v"?(e.moveTo(n+f.pos*i,o+f.from*i),e.lineTo(n+f.pos*i,o+f.to*i)):(e.moveTo(n+f.from*i,o+f.pos*i),e.lineTo(n+f.to*i,o+f.pos*i)),e.stroke();e.beginPath(),l.top&&(e.moveTo(n,o),e.lineTo(n+a,o)),l.right&&(e.moveTo(n+a,o),e.lineTo(n+a,o+s)),l.bottom&&(e.moveTo(n+a,o+s),e.lineTo(n,o+s)),l.left&&(e.moveTo(n,o+s),e.lineTo(n,o)),e.stroke()}for(const f of g.cells){const T=typeof f.cell.text=="string"?f.cell.text:"";if(!T)continue;const R=f.cell.style,v=R?.fontSize??c.DEFAULT_FONT_PT,S=c.wrapText(T,f.widthMm-1,{fontSizePt:v},h).join(`
3
+ `);Se(e,{text:S,fontSizePx:c.resolveFontSize(R,d).fontSizePx,bold:R?.bold??!1,color:R?.color??c.resolveTextColor(r.style,c.DEFAULT_TEXT_COLOR),align:R?.align??"left",lineHeight:c.LINE_HEIGHT},n+(f.xMm+.5)*i,o+f.yMm*i,Math.max(0,(f.widthMm-1)*i),f.heightMm*i,m,R?.verticalAlign??"middle")}}function ye(e,t,r,n,o,a){const s=t.leftMm*r,i=t.topMm*r,d=t.widthMm*r,m=t.heightMm*r,h=t.style??{};if(t.grid){Ge(e,t.grid,t,s,i,d,m,r,n,o,a);return}switch(t.kind){case"text":{const g=h.fontSize??c.DEFAULT_FONT_PT,l=c.isRichText(t)?t.richParagraphs.map(u=>(u.segments??[]).map(f=>f.text??f.field??"").join("")).join(`
4
4
  `):Array.isArray(t.lines)&&t.lines.length>0?t.lines.join(`
5
- `):d.wrapText(t.text??"",t.widthMm,{fontSizePt:g},s).join(`
6
- `);Se(e,{text:l,fontSizePx:d.resolveFontSize(m,n).fontSizePx,bold:m.bold??!1,color:d.resolveTextColor(m),align:m.align??"left",lineHeight:d.resolveLineHeight(m)},a,i,c,h,o,m.verticalAlign);break}case"rect":{const g=d.resolveStroke(m),l=d.resolveBoxBorders(m);m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.fillRect(a,i,c,h)),l.inner&&(e.strokeStyle=g.color,e.lineWidth=d.ptToPx(g.widthPt,n),e.beginPath(),l.top&&(e.moveTo(a,i),e.lineTo(a+c,i)),l.right&&(e.moveTo(a+c,i),e.lineTo(a+c,i+h)),l.bottom&&(e.moveTo(a+c,i+h),e.lineTo(a,i+h)),l.left&&(e.moveTo(a,i+h),e.lineTo(a,i)),e.stroke());break}case"line":{const g=d.resolveStroke({...m,borderColor:m.lineColor??m.borderColor});e.strokeStyle=g.color,e.lineWidth=d.ptToPx(g.widthPt,n),e.beginPath(),e.moveTo(a,i+h/2),e.lineTo(a+c,i+h/2),e.stroke();break}case"ellipse":{const g=d.resolveStroke(m);e.strokeStyle=g.color,e.lineWidth=d.ptToPx(g.widthPt,n),m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.beginPath(),e.ellipse(a+c/2,i+h/2,c/2,h/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(a+c/2,i+h/2,c/2,h/2,0,0,Math.PI*2),e.stroke();break}}}function je(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const r=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,o=n/96*ee,s=t.fontFamily??'"Microsoft YaHei", sans-serif',a=t.measurer??d.heuristicMeasurer,i=Math.max(0,t.start??0),c=Math.min(e.pages.length-1,t.end??e.pages.length-1),h=[];for(let m=i;m<=c;m++){const g=e.pages[m],{canvas:l,ctx:u}=Oe(g,r,n);for(const f of g.components)ye(u,f,o,n,s,a);h.push(l)}return{canvases:h}}function Ve(e,t={}){const r=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,o=n/96*ee,s=t.fontFamily??'"Microsoft YaHei", sans-serif',a=t.measurer??d.heuristicMeasurer,i=t.overscan??1,c=t.gapPx??18,h=t.pagesPerFrame??1,m=e.pages.map(p=>p.pageHeightMm*o),g=Math.max(1,...e.pages.map(p=>p.pageWidthMm*o)),l={start:0,end:-1};let u=null,f=null,T=null,R=null,P=[],S=0,C=[];function w(){const p=u;p.innerHTML="",f=document.createElement("div"),f.style.cssText=`width:${g}px;margin:0 auto;`,T=document.createElement("div"),R=document.createElement("div"),f.appendChild(T),P=[];const N=Math.min(e.pages.length,3+i*2);for(let F=0;F<N;F++){const y=document.createElement("div");y.style.cssText=`margin:0 auto ${c}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,f.appendChild(y),P.push(y)}f.appendChild(R),p.appendChild(f)}function V(p,N){const F=e.pages[N],{widthPx:y,heightPx:$}=te(F,n);let k=p.firstElementChild;(!k||k.tagName!=="CANVAS")&&(k=document.createElement("canvas"),p.innerHTML="",p.appendChild(k)),k.width=Math.round(y*r),k.height=Math.round($*r),k.style.width=`${y}px`,k.style.height=`${$}px`;const D=k.getContext("2d");if(D){D.setTransform(1,0,0,1,0,0),D.scale(r,r),D.fillStyle="#ffffff",D.fillRect(0,0,y,$);for(const J of F.components)ye(D,J,o,n,s,a);k.dataset.canvasPage=String(N),p.style.height=`${$}px`,p.style.width=`${y}px`}}function U(p){l.start=p.start,l.end=p.end,T.style.height=`${p.start*c+m.slice(0,p.start).reduce((y,$)=>y+$,0)}px`;const N=e.pages.length-1-p.end;R.style.height=`${N*c+m.slice(p.end+1).reduce((y,$)=>y+$,0)}px`;const F=p.end-p.start+1;P.forEach((y,$)=>{if($<F){y.style.display="";const k=p.start+$;y.style.height=`${m[k]??0}px`}else y.style.display="none"}),C=[];for(let y=p.start;y<=p.end;y++){const $=P[y-p.start];if(!$)continue;$.firstElementChild?.dataset?.canvasPage!==String(y)&&C.push(y)}v()}function v(){S||C.length===0||(S=requestAnimationFrame(()=>{S=0;let p=Math.max(1,h);for(;C.length>0&&p-- >0;){const N=C.shift(),F=P[N-l.start];F&&V(F,N)}C.length>0&&v()}))}function H(){S||(S=requestAnimationFrame(()=>{S=0;const p=u,N=be({pageHeightsPx:m,viewportHeightPx:p.clientHeight,scrollTopPx:p.scrollTop,overscan:i,gapPx:c});N.start!==l.start||N.end!==l.end?U(N):v()}))}let G=null;return{attach(p){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");u=p,w(),p.addEventListener("scroll",H,{passive:!0}),typeof ResizeObserver<"u"&&(G=new ResizeObserver(()=>H()),G.observe(p)),H()},destroy(){S&&cancelAnimationFrame(S),S=0,G?.disconnect(),G=null,u?.removeEventListener("scroll",H),C=[],f?.remove(),u=null},window(){return{...l}}}}function A(e,t){return typeof e=="number"&&Number.isFinite(e)?e:t}function L(e,t=""){return typeof e=="string"?e:t}function O(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ue(e){return e==="Center"?"center":e==="Right"?"right":"left"}function Je(e){return e==="Center"?"middle":e==="Bottom"?"bottom":"top"}function Ye(e){const t=parseFloat(L(e.FontSize,"10.5"));return{fontSize:Number.isFinite(t)?t:10.5,fontFamily:L(e.FontFamily,"黑体")||void 0,bold:L(e.FontWeight)==="bold"||void 0,italic:L(e.FontStyle)==="italic"||void 0,underline:e.Underline===!0||void 0,color:L(e.FontColor)||void 0,backgroundColor:L(e.BackgroundColor)||void 0,align:Ue(L(e.HorAlignment,"Left")),verticalAlign:Je(L(e.VertAlignment,"Top")),lineHeight:(()=>{const r=parseFloat(L(e.RowSpace,"1"));return Number.isFinite(r)&&r!==1?r:void 0})(),borderColor:L(e.BorderColor)||void 0,borderTop:e.BorderTop!==!1,borderRight:e.BorderRight!==!1,borderBottom:e.BorderBottom!==!1,borderLeft:e.BorderLeft!==!1}}function qe(e,t){const r=L(e.uitype),n={kind:"text",leftMm:A(e.left,0),topMm:A(e.top,0),widthMm:A(e.width,40),heightMm:A(e.height,8),nid:L(e.nid)||void 0,style:Ye(e)};switch(r){case"text":{n.kind="text";const o=e.Text??e.text??e.Value;n.text=o==null?"":String(o);const s=e.Lines??e.lines;return Array.isArray(s)&&(n.lines=s.map(a=>String(a))),n}case"richtext":return n.kind="text",n.text=L(e.Text),t.push(`富文本 ${n.nid??""} 导入为纯文本(版式细节可能损失)`),n;case"image":case"barcode":case"qrcode":case"chart":return n.kind=r==="image"?"image":r,n.fallbackText=`[${r}]`,t.push(`图片类组件 ${n.nid??""} 需运行时数据(imageData),已导入为占位`),n;case"table":{n.kind="rect";const o=e.Cells??e.cells;if(Array.isArray(o)){const s={cells:o.map(a=>Array.isArray(a)?a.map(i=>({text:O(i)?L(i.Text??i.text):"",colSpan:O(i)?A(i.ColSpan,1):1})):[])};n.grid=s}else n.fallbackText="[table]",t.push(`表格 ${n.nid??""} 缺少 Cells,导入为空框`);return n}case"subreport":return t.push(`子报表 ${n.nid??""} 暂不支持导入,已跳过`),null;default:return L(e.ShapeType)==="hline"||r==="hline"||r==="vline"?(n.kind="line",n):r==="rect"||r==="oval"||r==="shape"?(n.kind=r==="oval"?"ellipse":"rect",n):(t.push(`未知组件类型 ${r},已跳过`),null)}}function Ke(e){const t=[];let r=null;if(typeof e=="string")try{const h=JSON.parse(e);O(h)&&(r=h)}catch{return{template:{pages:[]},warnings:["content 不是合法 JSON"]}}else O(e)&&(r=e);if(!r)return{template:{pages:[]},warnings:["content 为空"]};const n=O(r.GlobalConfig)?r.GlobalConfig:{},o=A(n.paperWidthMm,210),s=A(n.paperHeightMm,297),a={top:A(n.marginTop,10),bottom:A(n.marginBottom,10),left:A(n.marginLeft,10),right:A(n.marginRight,10)},i=Array.isArray(r.children)?r.children.filter(h=>O(h)&&L(h.uitype)==="page"):[];i.length===0&&t.push("content 中没有 uitype=page 的页节点");const c=i.map(h=>{const m=h,g=Array.isArray(m.children)?m.children:[],l=[];for(const u of g){if(!O(u))continue;const f=qe(u,t);f&&l.push(f)}return{widthMm:A(m.width,o),heightMm:A(m.DesignHeight,s),marginTopMm:A(m.MarginTop,a.top),marginBottomMm:A(m.MarginBottom,a.bottom),marginLeftMm:A(m.MarginLeft,a.left),marginRightMm:A(m.MarginRight,a.right),components:l}});return c.length===0&&(t.push("转换结果为空页,已回退一张空白页"),c.push({widthMm:o,heightMm:s,...a,components:[]})),{template:{pages:c},warnings:t}}function Te(e,t,r){let n,o;if(typeof e=="string"){const s=d.PAPER_SIZES[e];if(!s)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(d.PAPER_SIZES).join("/")})`);n=s.widthMm,o=s.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 we{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}params(t){return this.templateParams=t,this}page(t="a4",r={},n){this.collect();const s=n!=null&&!("margins"in n)&&!("landscape"in n)&&("marginTopMm"in n||"marginBottomMm"in n||"marginLeftMm"in n||"marginRightMm"in n)?{margins:n}:n??{},{widthMm:a,heightMm:i}=Te(t,typeof r=="number"?r:void 0,s.landscape),c=s.margins??{};return this.pending=new xe(this,{widthMm:a,heightMm:i,marginTopMm:c.marginTopMm??10,marginBottomMm:c.marginBottomMm??10,marginLeftMm:c.marginLeftMm??10,marginRightMm:c.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,pages:this.pages}:{pages:this.pages}}}class xe{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 Xe(){return new we}exports.CSS_DPI=d.CSS_DPI;exports.DEFAULT_BORDER_PT=d.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_PT=d.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=d.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=d.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=d.LINE_HEIGHT;exports.MM_PER_INCH=d.MM_PER_INCH;exports.PAPER_SIZES=d.PAPER_SIZES;exports.RENDER_PLAN_SCHEMA_VERSION=d.RENDER_PLAN_SCHEMA_VERSION;exports.SCHEMA_VERSION_JH4J=d.SCHEMA_VERSION_JH4J;exports.SCHEMA_VERSION_LOCAL=d.SCHEMA_VERSION_LOCAL;exports.SCHEMA_VERSION_MACH=d.SCHEMA_VERSION_MACH;exports.charWidthEm=d.charWidthEm;exports.createCanvasMeasurer=d.createCanvasMeasurer;exports.createHeuristicMeasurer=d.createHeuristicMeasurer;exports.heuristicMeasurer=d.heuristicMeasurer;exports.isImageBackedComponent=d.isImageBackedComponent;exports.isRichText=d.isRichText;exports.measureTextMm=d.measureTextMm;exports.mmToPx=d.mmToPx;exports.mmToPxFactor=d.mmToPxFactor;exports.ptToPx=d.ptToPx;exports.pxToMm=d.pxToMm;exports.resolveBoxBorders=d.resolveBoxBorders;exports.resolveFontSize=d.resolveFontSize;exports.resolveLineHeight=d.resolveLineHeight;exports.resolveStroke=d.resolveStroke;exports.resolveTextColor=d.resolveTextColor;exports.round=d.round;exports.toRenderPlan=d.toRenderPlan;exports.wrapText=d.wrapText;exports.resolveGridLayout=ce.resolveGridLayout;exports.PageBuilder=xe;exports.TemplateBuilder=we;exports.assertRenderPlan=He;exports.classOf=_;exports.computePageWindow=be;exports.createCanvasPager=Ve;exports.createTemplate=Xe;exports.evalStyleRule=me;exports.formatValue=X;exports.importJh4jTemplateContent=Ke;exports.measurePageSizePx=te;exports.paginateTemplate=_e;exports.parseDateLocal=he;exports.planFontSizePx=We;exports.renderComponent=Q;exports.renderPage=Me;exports.renderPlan=De;exports.renderPlanToCanvas=je;exports.resolvePaper=Te;exports.toNumber=Y;exports.validateComponent=Z;exports.validatePage=ge;exports.validateRenderPlan=fe;
5
+ `):c.wrapText(t.text??"",t.widthMm,{fontSizePt:g},a).join(`
6
+ `);Se(e,{text:l,fontSizePx:c.resolveFontSize(h,n).fontSizePx,bold:h.bold??!1,color:c.resolveTextColor(h),align:h.align??"left",lineHeight:c.resolveLineHeight(h)},s,i,d,m,o,h.verticalAlign);break}case"rect":{const g=c.resolveStroke(h),l=c.resolveBoxBorders(h);h.backgroundColor&&(e.fillStyle=h.backgroundColor,e.fillRect(s,i,d,m)),l.inner&&(e.strokeStyle=g.color,e.lineWidth=c.ptToPx(g.widthPt,n),e.beginPath(),l.top&&(e.moveTo(s,i),e.lineTo(s+d,i)),l.right&&(e.moveTo(s+d,i),e.lineTo(s+d,i+m)),l.bottom&&(e.moveTo(s+d,i+m),e.lineTo(s,i+m)),l.left&&(e.moveTo(s,i+m),e.lineTo(s,i)),e.stroke());break}case"line":{const g=c.resolveStroke({...h,borderColor:h.lineColor??h.borderColor});e.strokeStyle=g.color,e.lineWidth=c.ptToPx(g.widthPt,n),e.beginPath(),e.moveTo(s,i+m/2),e.lineTo(s+d,i+m/2),e.stroke();break}case"ellipse":{const g=c.resolveStroke(h);e.strokeStyle=g.color,e.lineWidth=c.ptToPx(g.widthPt,n),h.backgroundColor&&(e.fillStyle=h.backgroundColor,e.beginPath(),e.ellipse(s+d/2,i+m/2,d/2,m/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(s+d/2,i+m/2,d/2,m/2,0,0,Math.PI*2),e.stroke();break}}}async function Ve(e,t={}){if(typeof document>"u")throw new Error("renderPlanToImages 需要浏览器环境(SSR/Node 请在客户端钩子中调用)");const{format:r="png",quality:n=.92,...o}=t,{canvases:a}=Te(e,o),s=r==="jpeg"?"image/jpeg":"image/png",i=[];for(const d of a)i.push(await new Promise(m=>d.toBlob(h=>m(h),s,n))??new Blob([],{type:s}));return{blobs:i}}function Te(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const r=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,o=n/96*ee,a=t.fontFamily??'"Microsoft YaHei", sans-serif',s=t.measurer??c.heuristicMeasurer,i=Math.max(0,t.start??0),d=Math.min(e.pages.length-1,t.end??e.pages.length-1),m=[];for(let h=i;h<=d;h++){const g=e.pages[h],{canvas:l,ctx:u}=We(g,r,n);for(const f of g.components)ye(u,f,o,n,a,s);m.push(l)}return{canvases:m}}function Ue(e,t={}){const r=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,o=n/96*ee,a=t.fontFamily??'"Microsoft YaHei", sans-serif',s=t.measurer??c.heuristicMeasurer,i=t.overscan??1,d=t.gapPx??18,m=t.pagesPerFrame??1,h=e.pages.map(p=>p.pageHeightMm*o),g=Math.max(1,...e.pages.map(p=>p.pageWidthMm*o)),l={start:0,end:-1};let u=null,f=null,T=null,R=null,v=[],S=0,C=[];function w(){const p=u;p.innerHTML="",f=document.createElement("div"),f.style.cssText=`width:${g}px;margin:0 auto;`,T=document.createElement("div"),R=document.createElement("div"),f.appendChild(T),v=[];const N=Math.min(e.pages.length,3+i*2);for(let B=0;B<N;B++){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),v.push(y)}f.appendChild(R),p.appendChild(f)}function V(p,N){const B=e.pages[N],{widthPx:y,heightPx:$}=te(B,n);let k=p.firstElementChild;(!k||k.tagName!=="CANVAS")&&(k=document.createElement("canvas"),p.innerHTML="",p.appendChild(k)),k.width=Math.round(y*r),k.height=Math.round($*r),k.style.width=`${y}px`,k.style.height=`${$}px`;const D=k.getContext("2d");if(D){D.setTransform(1,0,0,1,0,0),D.scale(r,r),D.fillStyle="#ffffff",D.fillRect(0,0,y,$);for(const J of B.components)ye(D,J,o,n,a,s);k.dataset.canvasPage=String(N),p.style.height=`${$}px`,p.style.width=`${y}px`}}function U(p){l.start=p.start,l.end=p.end,T.style.height=`${p.start*d+h.slice(0,p.start).reduce((y,$)=>y+$,0)}px`;const N=e.pages.length-1-p.end;R.style.height=`${N*d+h.slice(p.end+1).reduce((y,$)=>y+$,0)}px`;const B=p.end-p.start+1;v.forEach((y,$)=>{if($<B){y.style.display="";const k=p.start+$;y.style.height=`${h[k]??0}px`}else y.style.display="none"}),C=[];for(let y=p.start;y<=p.end;y++){const $=v[y-p.start];if(!$)continue;$.firstElementChild?.dataset?.canvasPage!==String(y)&&C.push(y)}x()}function x(){S||C.length===0||(S=requestAnimationFrame(()=>{S=0;let p=Math.max(1,m);for(;C.length>0&&p-- >0;){const N=C.shift(),B=v[N-l.start];B&&V(B,N)}C.length>0&&x()}))}function H(){S||(S=requestAnimationFrame(()=>{S=0;const p=u,N=be({pageHeightsPx:h,viewportHeightPx:p.clientHeight,scrollTopPx:p.scrollTop,overscan:i,gapPx:d});N.start!==l.start||N.end!==l.end?U(N):x()}))}let j=null;return{attach(p){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");u=p,w(),p.addEventListener("scroll",H,{passive:!0}),typeof ResizeObserver<"u"&&(j=new ResizeObserver(()=>H()),j.observe(p)),H()},destroy(){S&&cancelAnimationFrame(S),S=0,j?.disconnect(),j=null,u?.removeEventListener("scroll",H),C=[],f?.remove(),u=null},window(){return{...l}}}}function A(e,t){return typeof e=="number"&&Number.isFinite(e)?e:t}function L(e,t=""){return typeof e=="string"?e:t}function O(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Je(e){return e==="Center"?"center":e==="Right"?"right":"left"}function Ye(e){return e==="Center"?"middle":e==="Bottom"?"bottom":"top"}function qe(e){const t=parseFloat(L(e.FontSize,"10.5"));return{fontSize:Number.isFinite(t)?t:10.5,fontFamily:L(e.FontFamily,"黑体")||void 0,bold:L(e.FontWeight)==="bold"||void 0,italic:L(e.FontStyle)==="italic"||void 0,underline:e.Underline===!0||void 0,color:L(e.FontColor)||void 0,backgroundColor:L(e.BackgroundColor)||void 0,align:Je(L(e.HorAlignment,"Left")),verticalAlign:Ye(L(e.VertAlignment,"Top")),lineHeight:(()=>{const r=parseFloat(L(e.RowSpace,"1"));return Number.isFinite(r)&&r!==1?r:void 0})(),borderColor:L(e.BorderColor)||void 0,borderTop:e.BorderTop!==!1,borderRight:e.BorderRight!==!1,borderBottom:e.BorderBottom!==!1,borderLeft:e.BorderLeft!==!1}}function Ke(e,t){const r=L(e.uitype),n={kind:"text",leftMm:A(e.left,0),topMm:A(e.top,0),widthMm:A(e.width,40),heightMm:A(e.height,8),nid:L(e.nid)||void 0,style:qe(e)};switch(r){case"text":{n.kind="text";const o=e.Text??e.text??e.Value;n.text=o==null?"":String(o);const a=e.Lines??e.lines;return Array.isArray(a)&&(n.lines=a.map(s=>String(s))),n}case"richtext":return n.kind="text",n.text=L(e.Text),t.push(`富文本 ${n.nid??""} 导入为纯文本(版式细节可能损失)`),n;case"image":case"barcode":case"qrcode":case"chart":return n.kind=r==="image"?"image":r,n.fallbackText=`[${r}]`,t.push(`图片类组件 ${n.nid??""} 需运行时数据(imageData),已导入为占位`),n;case"table":{n.kind="rect";const o=e.Cells??e.cells;if(Array.isArray(o)){const a={cells:o.map(s=>Array.isArray(s)?s.map(i=>({text:O(i)?L(i.Text??i.text):"",colSpan:O(i)?A(i.ColSpan,1):1})):[])};n.grid=a}else n.fallbackText="[table]",t.push(`表格 ${n.nid??""} 缺少 Cells,导入为空框`);return n}case"subreport":return t.push(`子报表 ${n.nid??""} 暂不支持导入,已跳过`),null;default:return L(e.ShapeType)==="hline"||r==="hline"||r==="vline"?(n.kind="line",n):r==="rect"||r==="oval"||r==="shape"?(n.kind=r==="oval"?"ellipse":"rect",n):(t.push(`未知组件类型 ${r},已跳过`),null)}}function Xe(e){const t=[];let r=null;if(typeof e=="string")try{const m=JSON.parse(e);O(m)&&(r=m)}catch{return{template:{pages:[]},warnings:["content 不是合法 JSON"]}}else O(e)&&(r=e);if(!r)return{template:{pages:[]},warnings:["content 为空"]};const n=O(r.GlobalConfig)?r.GlobalConfig:{},o=A(n.paperWidthMm,210),a=A(n.paperHeightMm,297),s={top:A(n.marginTop,10),bottom:A(n.marginBottom,10),left:A(n.marginLeft,10),right:A(n.marginRight,10)},i=Array.isArray(r.children)?r.children.filter(m=>O(m)&&L(m.uitype)==="page"):[];i.length===0&&t.push("content 中没有 uitype=page 的页节点");const d=i.map(m=>{const h=m,g=Array.isArray(h.children)?h.children:[],l=[];for(const u of g){if(!O(u))continue;const f=Ke(u,t);f&&l.push(f)}return{widthMm:A(h.width,o),heightMm:A(h.DesignHeight,a),marginTopMm:A(h.MarginTop,s.top),marginBottomMm:A(h.MarginBottom,s.bottom),marginLeftMm:A(h.MarginLeft,s.left),marginRightMm:A(h.MarginRight,s.right),components:l}});return d.length===0&&(t.push("转换结果为空页,已回退一张空白页"),d.push({widthMm:o,heightMm:a,...s,components:[]})),{template:{pages:d},warnings:t}}function we(e,t,r){let n,o;if(typeof e=="string"){const a=c.PAPER_SIZES[e];if(!a)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(c.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 Pe{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}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}:n??{},{widthMm:s,heightMm:i}=we(t,typeof r=="number"?r:void 0,a.landscape),d=a.margins??{};return this.pending=new ve(this,{widthMm:s,heightMm:i,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 this.templateParams?{params:this.templateParams,pages:this.pages}:{pages:this.pages}}}class ve{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 Ze(){return new Pe}exports.CSS_DPI=c.CSS_DPI;exports.DEFAULT_BORDER_PT=c.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_PT=c.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=c.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=c.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=c.LINE_HEIGHT;exports.MM_PER_INCH=c.MM_PER_INCH;exports.PAPER_SIZES=c.PAPER_SIZES;exports.RENDER_PLAN_SCHEMA_VERSION=c.RENDER_PLAN_SCHEMA_VERSION;exports.SCHEMA_VERSION_JH4J=c.SCHEMA_VERSION_JH4J;exports.SCHEMA_VERSION_LOCAL=c.SCHEMA_VERSION_LOCAL;exports.SCHEMA_VERSION_MACH=c.SCHEMA_VERSION_MACH;exports.charWidthEm=c.charWidthEm;exports.createCanvasMeasurer=c.createCanvasMeasurer;exports.createHeuristicMeasurer=c.createHeuristicMeasurer;exports.heuristicMeasurer=c.heuristicMeasurer;exports.isImageBackedComponent=c.isImageBackedComponent;exports.isRichText=c.isRichText;exports.measureTextMm=c.measureTextMm;exports.mmToPx=c.mmToPx;exports.mmToPxFactor=c.mmToPxFactor;exports.ptToPx=c.ptToPx;exports.pxToMm=c.pxToMm;exports.resolveBoxBorders=c.resolveBoxBorders;exports.resolveFontSize=c.resolveFontSize;exports.resolveLineHeight=c.resolveLineHeight;exports.resolveStroke=c.resolveStroke;exports.resolveTextColor=c.resolveTextColor;exports.round=c.round;exports.toRenderPlan=c.toRenderPlan;exports.wrapText=c.wrapText;exports.resolveGridLayout=ce.resolveGridLayout;exports.PageBuilder=ve;exports.TemplateBuilder=Pe;exports.assertRenderPlan=Ne;exports.classOf=_;exports.computePageWindow=be;exports.createCanvasPager=Ue;exports.createTemplate=Ze;exports.evalStyleRule=he;exports.formatValue=X;exports.importJh4jTemplateContent=Xe;exports.measurePageSizePx=te;exports.paginateTemplate=Be;exports.parseDateLocal=me;exports.planFontSizePx=je;exports.renderComponent=Q;exports.renderPage=Me;exports.renderPlan=Oe;exports.renderPlanToCanvas=Te;exports.renderPlanToImages=Ve;exports.resolvePaper=we;exports.toNumber=Y;exports.validateComponent=Z;exports.validatePage=ge;exports.validateRenderPlan=fe;