@agile-team/mach-report 2.0.0 → 2.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.
Files changed (77) hide show
  1. package/LICENSE +2 -4
  2. package/LICENSING.md +15 -0
  3. package/README.md +232 -76
  4. package/dist/ReportPreview-Dwdsyk9b.js +1558 -0
  5. package/dist/ReportPreview-VHAIfsz1.cjs +6 -0
  6. package/dist/index.cjs +5 -5
  7. package/dist/index.d.cts +738 -13
  8. package/dist/index.d.ts +738 -13
  9. package/dist/index.js +821 -631
  10. package/dist/pdf.cjs +47 -47
  11. package/dist/pdf.d.cts +155 -6
  12. package/dist/pdf.d.ts +155 -6
  13. package/dist/pdf.js +3542 -3466
  14. package/dist/plugin-Bl00j_CP.cjs +1 -0
  15. package/dist/plugin-DVScnZ4C.js +25 -0
  16. package/dist/report-params-BB85g7mg.js +10 -0
  17. package/dist/report-params-D1NeY-eR.cjs +1 -0
  18. package/dist/sql.cjs +65 -64
  19. package/dist/sql.d.cts +109 -5
  20. package/dist/sql.d.ts +109 -5
  21. package/dist/sql.js +7947 -7922
  22. package/dist/style.css +1 -1
  23. package/dist/vue/async.d.cts +769 -320
  24. package/dist/vue/async.d.ts +769 -320
  25. package/dist/vue/index.d.cts +1321 -14
  26. package/dist/vue/index.d.ts +1321 -14
  27. package/dist/vue-async.cjs +1 -1
  28. package/dist/vue-async.js +11 -12
  29. package/dist/vue.cjs +1 -1
  30. package/dist/vue.js +129 -49
  31. package/dist/xlsx.cjs +20 -20
  32. package/dist/xlsx.d.cts +2292 -5
  33. package/dist/xlsx.d.ts +2292 -5
  34. package/dist/xlsx.js +5452 -5443
  35. package/package.json +6 -2
  36. package/dist/ReportPreview-Cr0IH1Rz.cjs +0 -6
  37. package/dist/ReportPreview-DwknBgsJ.js +0 -1266
  38. package/dist/builder/template-builder.d.ts +0 -69
  39. package/dist/defaults.d.ts +0 -23
  40. package/dist/format.d.ts +0 -48
  41. package/dist/layout/paginate.d.ts +0 -97
  42. package/dist/layout/textwrap.d.ts +0 -36
  43. package/dist/pdf/font-loader.d.ts +0 -6
  44. package/dist/pdf/index.d.ts +0 -2
  45. package/dist/pdf/render-pdf.d.ts +0 -25
  46. package/dist/plugin-Cj3c2wJc.cjs +0 -1
  47. package/dist/plugin-DJf_6_fl.js +0 -18
  48. package/dist/render/canvas.d.ts +0 -76
  49. package/dist/render/dom.d.ts +0 -10
  50. package/dist/render/grid-geometry.d.ts +0 -41
  51. package/dist/render/style.d.ts +0 -33
  52. package/dist/render/window.d.ts +0 -23
  53. package/dist/schema/render-plan.d.ts +0 -88
  54. package/dist/schema/validate.d.ts +0 -15
  55. package/dist/sql/ast-check.d.ts +0 -14
  56. package/dist/sql/compile.d.ts +0 -31
  57. package/dist/sql/expr.d.ts +0 -21
  58. package/dist/sql/index.d.ts +0 -4
  59. package/dist/sql/tokenizer.d.ts +0 -25
  60. package/dist/units.d.ts +0 -11
  61. package/dist/vue/ReportParamPanel.d.ts +0 -19
  62. package/dist/vue/ReportPreview.d.ts +0 -200
  63. package/dist/vue/ReportToolbar.d.ts +0 -42
  64. package/dist/vue/adapters.d.ts +0 -34
  65. package/dist/vue/composables/useHighlight.d.ts +0 -8
  66. package/dist/vue/composables/usePageWindow.d.ts +0 -25
  67. package/dist/vue/composables/usePrintExport.d.ts +0 -40
  68. package/dist/vue/composables/useReportSearch.d.ts +0 -73
  69. package/dist/vue/composables/useZoom.d.ts +0 -15
  70. package/dist/vue/config.d.ts +0 -108
  71. package/dist/vue/controller.d.ts +0 -29
  72. package/dist/vue/errors.d.ts +0 -16
  73. package/dist/vue/injection-keys.d.ts +0 -14
  74. package/dist/vue/local-adapter.d.ts +0 -11
  75. package/dist/vue/pdf-exporter.d.ts +0 -13
  76. package/dist/vue/plugin.d.ts +0 -332
  77. package/dist/xlsx/render-xlsx.d.ts +0 -20
@@ -0,0 +1,6 @@
1
+ "use strict";var Mt=Object.create;var Ue=Object.defineProperty;var Ft=Object.getOwnPropertyDescriptor;var Tt=Object.getOwnPropertyNames;var Dt=Object.getPrototypeOf,Nt=Object.prototype.hasOwnProperty;var Vt=(t,n,s,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of Tt(n))!Nt.call(t,r)&&r!==s&&Ue(t,r,{get:()=>n[r],enumerable:!(a=Ft(n,r))||a.enumerable});return t};var Ke=(t,n,s)=>(s=t!=null?Mt(Dt(t)):{},Vt(n||!t||!t.__esModule?Ue(s,"default",{value:t,enumerable:!0}):s,t));const e=require("vue"),oe=require("@agile-team/mach-report"),ie=require("./plugin-Bl00j_CP.cjs");function Ne(t){return t==null?[]:Array.isArray(t)?t.map(String).filter(n=>n!==""):String(t).split(",").map(n=>n.trim()).filter(n=>n!=="")}function Lt(t){return Ne(t).join(",")}class be extends Error{constructor(n){super(n),this.name="PlanLoadError"}}function Ot(t={}){const{baseUrl:n="",headers:s,credentials:a,timeoutMs:r=3e4}=t,o=n.replace(/\/+$/,"");return async({url:l,method:p,params:g,signal:f})=>{let c=`${o}${l}`;if(g&&Object.keys(g).length>0){const w=c.indexOf("#"),T=w>=0?c.slice(w):"",M=w>=0?c.slice(0,w):c,C=M.indexOf("?"),F=C>=0?M.slice(0,C):M,N=new URLSearchParams(C>=0?M.slice(C+1):"");for(const[I,H]of Object.entries(g))N.set(I,H);c=`${F}?${N}${T}`}const d=(w,T)=>{const M=new be(w);return Object.defineProperty(M,"cause",{value:T,configurable:!0,writable:!0}),M};if(f?.aborted)throw d(`请求已取消: ${l}`,f.reason);const v=new AbortController;let h;const $=()=>{v.signal.aborted||(h="external",v.abort(f?.reason))};f?.addEventListener("abort",$,{once:!0});const B=setTimeout(()=>{v.signal.aborted||(h="timeout",v.abort())},r);try{const w=await fetch(c,{method:p.toUpperCase(),headers:{Accept:"application/json",...s},credentials:a,signal:v.signal});if(!w.ok)throw new be(`HTTP ${w.status} ${l}`);return await w.json()}catch(w){throw h==="timeout"?d(`请求超时(${r}ms): ${l}`,w):h==="external"?d(`请求已取消: ${l}`,w):w instanceof be?w:d(`请求失败(${l}): ${w instanceof Error?w.message:String(w)}`,w)}finally{clearTimeout(B),f?.removeEventListener("abort",$)}}}function Je(t,n,s={}){const a=s.pxPerMm??3.7795275590551185,r=e.computed(()=>Math.max(0,e.unref(s.gapPx)??18)),o=e.ref(0),l=e.ref(800),p=e.computed(()=>(t.value?.pages??[]).map(v=>v.pageHeightMm*a)),g=e.computed(()=>{const v=t.value?.pages??[];let h=0,$=0;for(const B of v)h+=B.pageHeightMm*a+r.value,$=Math.max($,B.pageWidthMm*a);return{w:$,h}}),f=e.computed(()=>oe.computePageWindow({pageHeightsPx:p.value,viewportHeightPx:l.value/n.value,scrollTopPx:o.value/n.value,overscan:1,gapPx:r.value})),c=e.computed(()=>{const v=t.value;if(!v)return[];const{start:h,end:$}=f.value;return $<h?[]:v.pages.slice(h,$+1).map((B,w)=>({page:B,index:h+w}))});function d(v,h){let $=0;return B=>{$||($=requestAnimationFrame(()=>{if($=0,o.value=B.scrollTop,l.value=B.clientHeight||800,h.value<=0)return;const w=B.querySelectorAll(".mrp-page-holder");if(!w.length)return;const T=B.getBoundingClientRect().top+56;let M=1;w.forEach(C=>{C.getBoundingClientRect().top<=T&&(M=Number(C.dataset.page??1))}),v.value=Math.max(1,Math.min(h.value,M))}))}}return{contentSize:g,windowRange:f,visiblePages:c,makeScrollHandler:d,refreshViewport(v){v&&(l.value=v.clientHeight||800)}}}function Xe(t){const n=e.ref(1),s=e.ref("fit");function a(){requestAnimationFrame(()=>{const o=t();!o||!o.viewport||(n.value=Math.min(1,Math.max(.3,(o.viewport.clientWidth-48)/Math.max(1,o.pageWidthPx))))})}function r(o){o==="fit"?(s.value="fit",a()):(s.value="raw",n.value=o/100)}return{zoom:n,zoomMode:s,applyFitZoom:a,setZoom:r}}const Pe=8;function xe(){return new Promise(t=>setTimeout(t,0))}function we(t){return`p${Math.round(t.pageWidthMm)}x${Math.round(t.pageHeightMm)}`}function Ve(t){const n=new Map;return t.pages.forEach(r=>{n.has(we(r))||n.set(we(r),r)}),`<!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
+ ${[...n.values()].map(r=>`@page ${we(r)}{size:${Math.round(r.pageWidthMm)}mm ${Math.round(r.pageHeightMm)}mm;margin:0;}`).join(`
5
+ `)}
6
+ body{margin:0;background:#fff;}`}</style></head><body>`}function Le(t){const n=oe.renderPage(t,96,{},document);return n.style.page=we(t),n.outerHTML}function Oe(t){return{head:Ve(t),pageChunks:t.pages.map(Le)}}async function zt(t,n={}){const s={schemaVersion:"mach-report-batch-print",pages:t.flatMap(l=>l.pages)};if(s.pages.length===0)return;const a=Ve(s),r=document.createElement("iframe");r.style.cssText="position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;",document.body.appendChild(r);let o=!1;try{const l=r.contentDocument;l.open(),l.write(a);for(let p=0;p<s.pages.length;p++)l.write(Le(s.pages[p])),p%Pe===Pe-1&&(n.onProgress?.(p+1,s.pages.length),await xe());l.write("</body></html>"),l.close(),await xe(),n.onProgress?.(s.pages.length,s.pages.length),o=!0,r.contentWindow?.focus(),r.contentWindow?.print()}catch(l){n.onError?.(l instanceof Error?`批量打印失败: ${l.message}`:"批量打印失败")}finally{o?setTimeout(()=>r.remove(),6e4):r.remove()}}function Qe(t){const{head:n,pageChunks:s}=Oe(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]-->${n.replace(/^<!doctype html><html><head>/,"")}`}${s.join("")}</body></html>`,filename:"mach-report.doc"}}function _e(t,n){let s=null,a=!1,r=!1,o=0;const l=new Map,p=new Map;let g=null,f=null,c=null,d=null,v=null;function h(i,m){return!r&&t.value===i&&o===m}function $(){if(r)return;const i=[...l.values()].reverse().find(m=>h(m.plan,m.epoch))?.format??null;i!==g&&(g=i,n.onBusy?.(i))}function B(i,m,y){const P={};return l.set(P,{plan:i,epoch:m,format:y}),$(),P}function w(i){l.delete(i),$()}function T(){for(const[i,m]of p)h(m.plan,m.epoch)||(i.close(),p.delete(i))}const M=e.watch(t,()=>{o++,$(),T()},{flush:"sync"});function C(){s?.remove(),s=null}function F(){r=!0,o++,M(),C(),T(),l.clear(),n.onPrinting?.(!1)}function N(i,m){const y=URL.createObjectURL(i);setTimeout(()=>URL.revokeObjectURL(y),1e4);const P=document.createElement("a");P.href=y,P.download=m,P.click()}async function I(){if(a)return;const i=t.value;if(r||!i||i.pages.length===0)return;const m=o;a=!0,n.onPrinting?.(!0),C();const y=Ve(i);s=document.createElement("iframe"),s.style.cssText="position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;",document.body.appendChild(s);const P=s;try{const x=P.contentDocument;x.open(),x.write(y);for(let z=0;z<i.pages.length;z++)if(x.write(Le(i.pages[z])),z%Pe===Pe-1&&await xe(),P!==s)return;if(x.write("</body></html>"),x.close(),await xe(),!h(i,m)||P!==s)return;P.contentWindow?.focus(),P.contentWindow?.print()}catch{P===s&&C(),h(i,m)&&n.onError("调用打印失败,请改用导出 PDF","print")}finally{a=!1,r||n.onPrinting?.(!1)}}function H(i,m){if(f?.plan===i&&f.epoch===m)return f.promise;const y=Promise.resolve().then(()=>{if(!h(i,m))throw new Error("报表已切换或卸载");return n.getPdfExporter()(i,P=>{h(i,m)&&n.onWarning?.(P)})}).finally(()=>{f?.promise===y&&(f=null)});return f={plan:i,epoch:m,promise:y},y}async function S(){const i=t.value;if(r||!i||i.pages.length===0)return;const m=o;if(c?.plan===i&&c.epoch===m)return c.promise;const y=B(i,m,"PDF"),P=(async()=>{try{const x=await H(i,m);if(!h(i,m))return;N(new Blob([x],{type:"application/pdf"}),"mach-report.pdf")}catch(x){h(i,m)&&n.onError(x instanceof Error?`PDF 导出失败: ${x.message}`:"PDF 导出失败","pdf")}finally{w(y),c?.token===y&&(c=null)}})();return c={plan:i,epoch:m,promise:P,token:y},P}async function U(){const i=t.value;if(r||!i||i.pages.length===0)return;const m=o;if(d?.plan===i&&d.epoch===m)return d.promise;const y=B(i,m,"Excel"),P=(async()=>{try{const{renderPlanToXlsx:x}=await import("@agile-team/mach-report/xlsx");if(!h(i,m))return;const{buffer:z,warnings:L}=await x(i);if(!h(i,m)||(L.length>0&&n.onWarning?.(`Excel 有 ${L.length} 处内容未导出:${L.slice(0,2).join(";")}`),!h(i,m)))return;N(new Blob([z],{type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}),"mach-report.xlsx")}catch(x){h(i,m)&&n.onError(x instanceof Error?`Excel 导出失败: ${x.message}`:"Excel 导出失败","export")}finally{w(y),d?.token===y&&(d=null)}})();return d={plan:i,epoch:m,promise:P,token:y},P}async function A(){const i=t.value;if(r||!i||i.pages.length===0)return;const m=o;if(v?.plan===i&&v.epoch===m)return v.promise;const y=B(i,m,"图片"),P=(async()=>{try{const{blobs:x}=await oe.renderPlanToImages(i,{dpr:Math.min(2,typeof devicePixelRatio=="number"?devicePixelRatio:1)});if(!h(i,m))return;x.forEach((z,L)=>{N(z,x.length>1?`mach-report-page-${L+1}.png`:"mach-report.png")})}catch(x){h(i,m)&&n.onError(x instanceof Error?`图片导出失败: ${x.message}`:"图片导出失败","export")}finally{w(y),v?.token===y&&(v=null)}})();return v={plan:i,epoch:m,promise:P,token:y},P}function J(){const i=t.value;if(!(r||!i||i.pages.length===0))try{const{html:m,filename:y}=Qe(i);N(new Blob([m],{type:"application/msword;charset=utf-8"}),y)}catch(m){n.onError(m instanceof Error?`Word 导出失败: ${m.message}`:"Word 导出失败","export")}}async function V(i){const m=t.value;if(!(r||!m||m.pages.length===0)){if(i==="pdf"){await S();return}if(i==="xlsx"||i==="excel"){await U();return}if(i==="png"||i==="image"){await A();return}if(i==="word"||i==="doc"){J();return}if(i!=="html"){n.onError(`不支持的导出格式:${i}`,"export");return}try{const{head:y,pageChunks:P}=Oe(m),x=`${y}${P.join("")}</body></html>`;N(new Blob([x],{type:"text/html;charset=utf-8"}),"mach-report.html")}catch(y){n.onError(y instanceof Error?`HTML 导出失败: ${y.message}`:"HTML 导出失败","export")}}}function q(){const i=t.value;if(r||!i||i.pages.length===0)return;const m=o,y=window.open("","_blank");if(!y){n.onError("浏览器拦截了弹窗,请允许弹窗后重试","pdf");return}p.set(y,{plan:i,epoch:m});const P=B(i,m,"PDF");H(i,m).then(x=>{if(!h(i,m)||y.closed){p.delete(y)&&y.close();return}const z=URL.createObjectURL(new Blob([x],{type:"application/pdf"}));setTimeout(()=>URL.revokeObjectURL(z),6e4);const L=y.document;L.title="PDF 预览",L.documentElement.style.height="100%",L.body.style.cssText="margin:0;height:100%;";const X=L.createElement("iframe");X.title="PDF 预览",X.style.cssText="display:block;width:100%;height:100%;border:0;",X.src=z,L.body.replaceChildren(X),p.delete(y)}).catch(x=>{y.close(),p.delete(y),h(i,m)&&n.onError(x instanceof Error?`PDF 预览失败: ${x.message}`:"PDF 预览失败","pdf")}).finally(()=>w(P))}return{print:I,exportAs:V,exportImages:A,exportWord:J,openPdfWindow:q,releasePrintFrame:C,dispose:F}}const et="mrp-hit";function Wt(t){t.querySelectorAll(`mark.${et}`).forEach(s=>{const a=s.parentNode;if(a){for(;s.firstChild;)a.insertBefore(s.firstChild,s);s.remove(),a.normalize()}})}function It(t,n){const s=n.trim();if(!s)return 0;const a=s.toLowerCase(),r=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,{acceptNode(p){const g=p.parentElement;return!g||g.closest("mark")||/^(SCRIPT|STYLE)$/.test(g.tagName)?NodeFilter.FILTER_REJECT:(p.nodeValue??"").toLowerCase().includes(a)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),o=[];for(let p=r.nextNode();p;p=r.nextNode())o.push(p);let l=0;for(const p of o){const g=p.nodeValue??"",f=g.toLowerCase(),c=p.parentElement;if(!c)continue;const d=document.createDocumentFragment();let v=0,h=f.indexOf(a);for(;h>=0;){h>v&&d.appendChild(document.createTextNode(g.slice(v,h)));const $=document.createElement("mark");$.className=et,$.textContent=g.slice(h,h+s.length),d.appendChild($),l++,v=h+s.length,h=f.indexOf(a,v)}v<g.length&&d.appendChild(document.createTextNode(g.slice(v))),c.replaceChild(d,p)}return l}function Ge(t,n){let s=0,a=t.toLowerCase().indexOf(n);for(;a>=0;)s++,a=t.toLowerCase().indexOf(n,a+n.length);return s}function Ht(t){const{plan:n,gotoPage:s,highlight:a,clearHighlights:r}=t,o=t.debounceMs??200,l=e.ref(!1),p=e.ref(""),g=e.ref(""),f=e.ref(0);let c=null;const d=e.computed(()=>{const C=p.value.trim().toLowerCase(),F=n.value;if(!C||!F)return[];const N=[];return F.pages.forEach((I,H)=>{for(const S of I.components)if(S.grid){for(const U of S.grid.cells??[])for(const A of U??[])if(typeof A?.text=="string")for(let J=0;J<Ge(A.text,C);J++)N.push(H)}else if(S.kind==="text"&&typeof S.text=="string")for(let U=0;U<Ge(S.text,C);U++)N.push(H)}),N}),v=e.computed(()=>d.value.length);function h(C){if(g.value=C,c&&clearTimeout(c),C.trim()===""){c=null,p.value="",f.value=0;return}c=setTimeout(()=>{c=null,p.value=g.value,f.value=0;const F=d.value[0];F!=null&&s(F+1)},o)}function $(C){const F=d.value.length;F!==0&&(f.value=(f.value+C+F)%F,s(d.value[f.value]+1))}function B(){l.value=!l.value}function w(C){const F=p.value.trim();F&&a(C,F)}function T(C){r(C)}function M(){g.value="",p.value="",f.value=0,c&&clearTimeout(c),c=null}return{visible:l,query:p,matchIndex:f,matchCount:v,toggle:B,onInput:h,onNav:$,apply:w,clear:T,reset:M}}function At(t,n){const s=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}}),a=e.computed(()=>!s.value||!n.plan.value?0:Math.round(JSON.stringify(n.plan.value).length/1024)),r=e.computed(()=>!s.value||!n.plan.value?null:{pages:n.pageCount.value,window:`${n.windowRange.value.start}-${n.windowRange.value.end}`,zoom:`${Math.round(n.zoom.value*100)}%`,loadMs:`${n.loadMs.value}ms`,planKB:a.value});return{enabled:s,debugStats:r}}function qt(t,n){const{thumbsRoot:s,visible:a,renderThumbCanvas:r}=n;let o=null;function l(f,c){if(!t.value||f.childElementCount>0)return;const d=r(c);d&&(d.style.width="100%",d.style.height="100%",d.style.display="block",f.appendChild(d))}return{schedule:()=>{!a.value||!t.value||!s.value||typeof IntersectionObserver>"u"||(o?.disconnect(),o=new IntersectionObserver(f=>{for(const c of f){if(!c.isIntersecting)continue;const d=c.target;l(d,Number(d.dataset.thumb??1)-1),o?.unobserve(d)}},{root:s.value,rootMargin:"200px"}),s.value.querySelectorAll("[data-thumb]").forEach(f=>{o.observe(f)}))},destroy:()=>{o?.disconnect(),o=null}}}function jt(){const t=e.shallowRef(0);return{loadMs:t,start(){return typeof performance<"u"?performance.now():0},end(n){t.value=n?Math.round(performance.now()-n):0}}}const Ut={class:"mrp-toolbar"},Kt={class:"mrp-title"},Gt=["disabled"],Zt={class:"mrp-pageinfo"},Yt=["disabled"],Jt={key:1,class:"mrp-search"},Xt=["placeholder","value"],Qt={key:0,class:"mrp-search-count"},_t=["disabled"],en=["disabled"],tn=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 n=t,s=e.ref(null);e.watch(()=>n.search.visible,r=>{r&&e.nextTick(()=>s.value?.focus())});function a(r,o,l){return r.replace("{cur}",String(o)).replace("{total}",String(l))}return(r,o)=>(e.openBlock(),e.createElementBlock("div",Ut,[e.createElementVNode("span",Kt,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]=l=>r.$emit("goto",t.currentPage-1))},e.toDisplayString(t.messages.prevPage),9,Gt),e.createElementVNode("span",Zt,e.toDisplayString(a(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]=l=>r.$emit("goto",t.currentPage+1))},e.toDisplayString(t.messages.nextPage),9,Yt)],64)):e.createCommentVNode("",!0),o[17]||(o[17]=e.createElementVNode("span",{class:"mrp-spacer"},null,-1)),t.search.visible?(e.openBlock(),e.createElementBlock("div",Jt,[e.createElementVNode("input",{ref_key:"searchInputRef",ref:s,class:"mrp-search-input",type:"text",placeholder:t.messages.searchPlaceholder,value:t.search.query,onInput:o[2]||(o[2]=l=>r.$emit("search-input",l.target.value))},null,40,Xt),t.search.query?(e.openBlock(),e.createElementBlock("span",Qt,e.toDisplayString(a(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]=l=>r.$emit("search-nav",-1))},e.toDisplayString(t.messages.prevMatch),9,_t),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.search.matchCount===0,onClick:o[4]||(o[4]=l=>r.$emit("search-nav",1))},e.toDisplayString(t.messages.nextMatch),9,en)])):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]=l=>r.$emit("search-toggle"))}," 🔍 ",2),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.thumbsVisible}]),type:"button",onClick:o[6]||(o[6]=l=>r.$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]=l=>r.$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]=l=>r.$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]=l=>r.$emit("zoom",150))}," 150% ",2),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:2,class:"mrp-nav",type:"button",onClick:o[10]||(o[10]=l=>r.$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]=l=>r.$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]=l=>r.$emit("export","xlsx"))},e.toDisplayString(t.messages.exportExcel),1)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:5,class:"mrp-nav",type:"button",onClick:o[13]||(o[13]=l=>r.$emit("export","png"))},e.toDisplayString(t.messages.exportImage),1)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:6,class:"mrp-nav",type:"button",onClick:o[14]||(o[14]=l=>r.$emit("export","word"))},e.toDisplayString(t.messages.exportWord),1)):e.createCommentVNode("",!0),t.showPrint?(e.openBlock(),e.createElementBlock("button",{key:7,class:"mrp-nav",type:"button",onClick:o[15]||(o[15]=l=>r.$emit("print"))},e.toDisplayString(t.messages.print),1)):e.createCommentVNode("",!0),t.showPdfWindow?(e.openBlock(),e.createElementBlock("button",{key:8,class:"mrp-nav",type:"button",onClick:o[16]||(o[16]=l=>r.$emit("pdf-window"))},e.toDisplayString(t.messages.pdfWindow),1)):e.createCommentVNode("",!0)]))}}),ze=(t,n)=>{const s=t.__vccOpts||t;for(const[a,r]of n)s[a]=r;return s},tt=ze(tn,[["__scopeId","data-v-48cc0980"]]),nn={class:"mrp-params"},on={class:"mrp-params-title"},rn={class:"mrp-params-grid"},an={class:"mrp-param-label"},ln={key:0,class:"mrp-param-star"},sn=["value","onChange"],un={value:"",disabled:"",hidden:""},cn=["value"],dn=["type","placeholder","value","onInput"],fn={class:"mrp-params-actions"},pn=e.defineComponent({__name:"ReportParamPanel",props:{defs:{},modelValue:{},messages:{},attempted:{type:Boolean}},emits:["update:modelValue","query","reset"],setup(t,{emit:n}){const s=t,a=n,r=e.ref({...s.modelValue});e.watch(()=>s.modelValue,g=>{r.value={...g}});const o=e.computed(()=>s.defs.map(g=>({def:g,label:g.label??g.field,value:r.value[g.field]??""})));function l(g,f){r.value={...r.value,[g]:f},a("update:modelValue",{...r.value})}function p(g){const f=s.defs.find(c=>c.field===g);return s.attempted&&f?.required===!0&&!(r.value[g]??"").trim()}return(g,f)=>(e.openBlock(),e.createElementBlock("div",nn,[e.createElementVNode("span",on,e.toDisplayString(t.messages.paramsTitle),1),e.createElementVNode("div",rn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.value,c=>(e.openBlock(),e.createElementBlock("label",{key:c.def.field,class:e.normalizeClass(["mrp-param",{"mrp-param-missing":p(c.def.field)}])},[e.createElementVNode("span",an,[e.createTextVNode(e.toDisplayString(c.label),1),c.def.required?(e.openBlock(),e.createElementBlock("i",ln,"*")):e.createCommentVNode("",!0)]),(c.def.type??"text")==="select"?(e.openBlock(),e.createElementBlock("select",{key:0,class:"mrp-param-input",value:c.value,onChange:d=>l(c.def.field,d.target.value),onKeydown:f[0]||(f[0]=e.withKeys(d=>g.$emit("query"),["enter"]))},[e.createElementVNode("option",un,e.toDisplayString(c.def.placeholder??`请选择${c.label}`),1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.def.options??[],d=>(e.openBlock(),e.createElementBlock("option",{key:d.value,value:d.value},e.toDisplayString(d.label),9,cn))),128))],40,sn)):(e.openBlock(),e.createElementBlock("input",{key:1,class:"mrp-param-input",type:c.def.type==="number"?"number":c.def.type==="date"?"date":"text",placeholder:c.def.placeholder??`请输入${c.label}`,value:c.value,onInput:d=>l(c.def.field,d.target.value),onKeydown:f[1]||(f[1]=e.withKeys(d=>g.$emit("query"),["enter"]))},null,40,dn))],2))),128))]),e.createElementVNode("div",fn,[e.createElementVNode("button",{class:"mrp-nav mrp-param-query",type:"button",onClick:f[2]||(f[2]=c=>g.$emit("query"))},e.toDisplayString(t.messages.query),1),e.createElementVNode("button",{class:"mrp-nav",type:"button",onClick:f[3]||(f[3]=c=>g.$emit("reset"))},e.toDisplayString(t.messages.reset),1)])]))}}),nt=ze(pn,[["__scopeId","data-v-aafce92d"]]),ot={title:"报表预览",prevPage:"‹ 上一页",nextPage:"下一页 ›",pageInfo:"{cur} / {total}",fitWidth:"适宽",exportHtml:"导出 HTML",exportPdf:"导出 PDF",exportExcel:"导出 Excel",exportImage:"导出图片",exportWord:"导出 Word",exporting:"正在生成 {format}…",print:"打印",pdfWindow:"PDF 窗口",loading:"报表渲染中…",empty:"暂无预览数据",errorPrefix:"",retry:"重试",pdfFontUnavailable:"PDF 字体尚未就绪,请联系管理员检查字体配置;预览及其它导出仍可使用。",searchPlaceholder:"搜索报表内容",matchInfo:"{cur}/{total}",prevMatch:"‹",nextMatch:"›",thumbnails:"缩略图",paramsTitle:"查询条件",query:"查 询",reset:"重 置",paramRequired:"请填写{label}"},rt={shellBg:"#525659",shellFg:"#e8e8e8",toolbarBg:"#323639",toolbarBorder:"#22252a",toolbarFg:"#e8e8e8",btnFg:"#cfcfcf",btnBorder:"#4a4d52",btnHoverBg:"#414549",btnHoverFg:"#ffffff",btnActiveBg:"#2d5fb8"};function at(t={}){return{...t,defaults:t.defaults??{},presets:t.presets??{}}}function mn(t){return t}const te={showExport:!0,showPrint:!0,showPdfWindow:!0,showParams:!0,gapPx:18,pdfFontUrl:"/simhei.ttf",logger:console},gn={warn:()=>{},info:()=>{}};function Ee(t,n){return{...t,...n,theme:{...t?.theme,...n?.theme},messages:{...t?.messages,...n?.messages}}}function lt(t,n){const s=n?t?.presets?.[n]:t?.defaultPreset?t?.presets?.[t.defaultPreset]:void 0,a=Ee(t?.defaults,s);return{showExport:a.showExport??te.showExport,showPrint:a.showPrint??te.showPrint,showPdfWindow:a.showPdfWindow??te.showPdfWindow,showParams:a.showParams??te.showParams,gapPx:a.gapPx??te.gapPx,pdfFontUrl:a.pdfFontUrl??te.pdfFontUrl,theme:{...rt,...a.theme},messages:{...ot,...a.messages},logger:a.logger??te.logger}}function st(t){const n={};return t.shellBg!=null&&(n["--mrp-shell-bg"]=t.shellBg),t.shellFg!=null&&(n["--mrp-shell-fg"]=t.shellFg),t.toolbarBg!=null&&(n["--mrp-toolbar-bg"]=t.toolbarBg),t.toolbarBorder!=null&&(n["--mrp-toolbar-border"]=t.toolbarBorder),t.toolbarFg!=null&&(n["--mrp-toolbar-fg"]=t.toolbarFg),t.btnFg!=null&&(n["--mrp-btn-fg"]=t.btnFg),t.btnBorder!=null&&(n["--mrp-btn-border"]=t.btnBorder),t.btnHoverBg!=null&&(n["--mrp-btn-hover-bg"]=t.btnHoverBg),t.btnHoverFg!=null&&(n["--mrp-btn-hover-fg"]=t.btnHoverFg),t.btnActiveBg!=null&&(n["--mrp-btn-active-bg"]=t.btnActiveBg),n}function hn(t){const n=e.inject(ie.MACH_REPORT_CONFIG_KEY,null),s=e.computed(()=>{const a=n?.value??null,r="defaults"in t||"presets"in t||"defaultPreset"in t?at(t):{defaults:t,presets:{}};if(!a)return r;const o={...a.presets,...r.presets};for(const l of Object.keys(o))o[l]=Ee(Ee(a.presets[l],r.defaults),r.presets[l]);return{defaults:Ee(a.defaults,r.defaults),presets:o,defaultPreset:r.defaultPreset??a.defaultPreset}});e.provide(ie.MACH_REPORT_CONFIG_KEY,s)}function it(){return e.inject(ie.MACH_REPORT_CONFIG_KEY,e.computed(()=>null))}const Ze=new Map,se=new Map,vn=15e3;function De(t,n){return Object.assign(new Error(t),{cause:n})}function pe(t,n){return`PDF 字体 ${JSON.stringify(t)}:${n}。请部署支持报表文字的字体文件,并将 pdfFontUrl 配置为可访问的字体 URL;西文报表可设为空串`}function ke(t){if(t?.reason instanceof Error&&t.reason.name==="AbortError")return t.reason;const n=De("PDF 字体检查已取消",t?.reason);return n.name="AbortError",n}async function yn(t,n){let s=!1;const a=setTimeout(()=>{s=!0,n.abort()},vn);try{const r=await fetch(t,{method:"HEAD",signal:n.signal});if(n.signal.aborted)throw ke(n.signal);if(r.status===405||r.status===501||r.type==="opaque")return{status:"unverified",fontUrl:t,message:`PDF 字体 ${JSON.stringify(t)} 无法通过 HEAD 检查验证;仍可尝试导出,届时会加载并校验字体`};if(!r.ok){const l=new Error(`字体请求返回 HTTP ${r.status}`);return{status:"error",fontUrl:t,message:pe(t,l.message),cause:l}}const o=r.headers.get("content-type")??"";if(/text\/html|application\/xhtml\+xml/i.test(o)){const l=new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件");return{status:"error",fontUrl:t,message:pe(t,l.message),cause:l}}if(/^text\//i.test(o)||/(?:\/|\+)json(?:\s*;|$)/i.test(o)){const l=new Error(`字体 URL 返回 ${o} 文本响应,不是字体文件`);return{status:"error",fontUrl:t,message:pe(t,l.message),cause:l}}return{status:"available",fontUrl:t,message:"PDF 字体资源可达;文字覆盖范围将在实际导出时校验"}}catch(r){if(n.signal.aborted&&!s)throw ke(n.signal);return{status:"error",fontUrl:t,message:pe(t,s?"字体检查超时,请检查网络或字体服务":"字体检查失败,请检查网络、字体服务或跨域访问配置"),cause:r}}finally{clearTimeout(a)}}function bn(t,n){if(n?.aborted)return Promise.reject(ke(n));if(!t)return Promise.resolve({status:"disabled",fontUrl:t,message:"已停用自定义 PDF 字体;内置字体用于西文,其他文字会在导出时校验"});const s=Ze.get(t);if(s)return Promise.resolve(s);let a=se.get(t);if(!a){const o=new AbortController;a={controller:o,promise:yn(t,o),subscribers:0};const l=a;se.set(t,l),l.promise=l.promise.then(p=>(!o.signal.aborted&&p.status==="available"&&Ze.set(t,p),p)).finally(()=>{se.get(t)===l&&se.delete(t)})}const r=a;return r.subscribers++,new Promise((o,l)=>{let p=!1;const g=()=>p?!1:(p=!0,r.subscribers--,n?.removeEventListener("abort",f),!0),f=()=>{g()&&(r.subscribers===0&&(se.get(t)===r&&se.delete(t),r.controller.abort()),l(ke(n)))};n?.addEventListener("abort",f,{once:!0}),r.promise.then(c=>{g()&&o(c)},c=>{g()&&l(c)}),n?.aborted&&f()})}function ut(t={fontUrl:"/simhei.ttf"}){let n=null;const s=async(a,r)=>{n||(n=await import("@agile-team/mach-report/pdf"));let o=null;if(t.fontUrl)try{if(o=await n.loadFontWithCache(t.fontUrl,{strict:!0}),!o?.byteLength)throw new Error("字体文件为空或加载失败")}catch(d){const v=d instanceof Error?d.message:String(d);throw De(pe(t.fontUrl,v),d)}let l;try{l=await n.renderPlanToPdf(a,o?{customFontBytes:o}:{})}catch(d){if(!o)throw d;const v=d instanceof Error?d.message:String(d);throw De(`PDF 生成失败:${v}。当前字体 URL 为 ${JSON.stringify(t.fontUrl)};请确认该文件是有效字体,或重新配置 pdfFontUrl`,d)}const{bytes:p,unsupportedTextCount:g,pageErrors:f,fidelityWarnings:c}=l;if(g>0)throw new Error(`PDF 中有 ${g} 行文字无法编码;请部署支持所用文字的字体并配置 pdfFontUrl`);if(f.length>0)throw new Error(`PDF 有 ${f.length} 页渲染失败:${f[0]}`);return c.length>0&&r?.(`PDF 有 ${c.length} 处版式降级:${c.slice(0,2).join(";")}`),p};return s.checkFont=a=>bn(t.fontUrl,a),s}class ne extends Error{constructor(n,s,a){super(s),this.name="MachReportError",this.code=n,this.cause=a}}function ct(t){return t instanceof ne?{code:t.code,cause:t.cause}:{code:"render",cause:t}}const wn={key:2,class:"mrp-export-notice mrp-export-warning",role:"status"},En={class:"mrp-main"},Pn={key:0,class:"mrp-state"},xn={key:1,class:"mrp-state mrp-error"},kn={key:2,class:"mrp-state"},Cn=["data-page"],$n=["onClick"],Bn=["data-thumb"],Sn={class:"mrp-thumb-no"},Rn={class:"mrp-overlay"},Mn={key:3,class:"mrp-debug","aria-hidden":"true"},ye=96/25.4,Ye="mach-report:ui",Fn=e.defineComponent({__name:"ReportPreview",props:{reportId:{type:[String,Array],default:null},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","warning"],setup(t,{expose:n,emit:s}){e.useCssVars(u=>({v45530c0c:C.value+"px"}));const a=t,r=s,o=e.shallowRef(null),l=e.ref(!1),p=e.ref(""),g=e.shallowRef(null),f=e.ref(null),c=e.ref(!1),d=e.shallowRef(Object.freeze({status:"unchecked",fontUrl:""})),v=e.ref(null),h=e.ref(1),$=e.ref(null),B=e.ref(null),w=e.ref(null),T=e.ref(!1),M=jt(),C=e.computed(()=>Math.max(0,P.value)),F=e.inject(ie.MACH_REPORT_FETCHER_KEY,null),N=e.inject(ie.MACH_REPORT_PDF_EXPORTER_KEY,null),I=e.computed(()=>Ne(a.reportId)),H=e.computed(()=>a.fetcher??F),S=e.computed(()=>o.value?.pages.length??0),U=e.computed(()=>Object.freeze({loading:l.value,hasPlan:S.value>0,pageCount:S.value,currentPage:h.value,exporting:f.value,printing:c.value,canExport:!l.value&&S.value>0&&f.value===null,canPrint:!l.value&&S.value>0&&!c.value,error:g.value,pdfFont:d.value}));function A(u,b,E){g.value=Object.freeze({message:u,code:b,cause:E}),r("error",u,{code:b,cause:E})}const J=it(),V=e.computed(()=>lt(J.value,a.preset)),q=e.computed(()=>({...V.value.messages,...a.messages})),i=e.computed(()=>a.showExport??V.value.showExport),m=e.computed(()=>a.showPrint??V.value.showPrint),y=e.computed(()=>a.showPdfWindow??V.value.showPdfWindow),P=e.computed(()=>a.gapPx??V.value.gapPx),x=e.computed(()=>a.showParams??V.value.showParams);let z=null,L=null;function X(){if(N)return N;const u=V.value.pdfFontUrl;return(!L||z!==u)&&(z=u,L=ut({fontUrl:u})),L}let me=0,ue=null,ce=!1;function Ce(){me++,ue?.abort(),ue=null}async function ge(){if(ce)throw new ne("config","报表预览已卸载");Ce();const u=me,b=new AbortController;ue=b;const E=V.value.pdfFontUrl;d.value=Object.freeze({status:"checking",fontUrl:E});try{const k=X(),O=k.checkFont?await k.checkFont(b.signal):{status:"unverified",fontUrl:"",message:"自定义 PDF 导出器未提供字体预检查;字体由宿主确认"};return!ce&&u===me&&!b.signal.aborted&&(d.value=Object.freeze({...O})),O}catch(k){if(b.signal.aborted)throw k;const O={status:"error",fontUrl:E,message:k instanceof Error?k.message:"PDF 字体检查失败",cause:k};return!ce&&u===me&&(d.value=Object.freeze(O)),O}finally{ue===b&&(ue=null)}}function ft(){ge().catch(()=>{})}e.watch([o,()=>V.value.pdfFontUrl,i,y],()=>{const u=d.value.fontUrl===V.value.pdfFontUrl;Ce(),(!u||d.value.status==="checking")&&(d.value=Object.freeze({status:"unchecked",fontUrl:V.value.pdfFontUrl})),!ce&&S.value>0&&(i.value||y.value)&&ge().catch(()=>{})},{immediate:!0});const Z=e.computed(()=>a.paramDefs??H.value?.getParamDefs?.(I.value)??[]),Q=e.ref({}),$e=e.ref(!1);function de(u){const b={};for(const E of u)b[E.field]=a.params[E.field]??E.defaultValue??"";Q.value=b,$e.value=!1}de(Z.value),e.watch(Z,u=>de(u)),e.watch(I,()=>de(Z.value)),e.watch(()=>JSON.stringify(a.params),()=>de(Z.value));const pt=e.computed(()=>{const u={...a.params};for(const[b,E]of Object.entries(Q.value))E===""?delete u[b]:u[b]=E;return u});function mt(){return Z.value.filter(u=>u.required===!0&&!(Q.value[u.field]??"").trim())}function gt(){$e.value=!0;const u=mt();if(u.length>0){const b=u[0].label??u[0].field,E=q.value.paramRequired.replace("{label}",b);p.value=E,A(E,"param");return}_()}function ht(){de(Z.value)}const vt=e.computed(()=>({height:a.height,...st(V.value.theme)})),{zoom:W,zoomMode:re,applyFitZoom:We,setZoom:Be}=Xe(()=>({viewport:B.value,pageWidthPx:(o.value?.pages[0]?.pageWidthMm??210)*ye})),yt=Je(o,W,{pxPerMm:ye,gapPx:P}),{contentSize:Se,windowRange:fe,visiblePages:bt,makeScrollHandler:wt,refreshViewport:Ie}=yt,Et=wt(h,S);function Re(u){re.value="raw",W.value=Math.min(3,Math.max(.3,u))}function he(){Pt(),o.value=null,h.value=1,D.reset()}let Y=0,K=null;async function _(){const u=++Y;K?.abort(),K=null;const b=H.value;if(l.value=!1,g.value=null,I.value.length===0){p.value="缺少报表 ID",he(),A(p.value,"param");return}if(!b){p.value="未提供渲染数据源 fetcher",he(),A(p.value,"config");return}l.value=!0,p.value="",v.value=null,he();const E=M.start(),k=new AbortController;K=k;const O=new Set;function le(R){u!==Y||k.signal.aborted||O.has(R)||(O.add(R),V.value.logger.warn("[mach-report] 报表告警:",R),r("warning",R))}try{const R=await b({reportIds:I.value,params:{...pt.value},signal:k.signal,onWarning:le});if(u!==Y)return;const j=oe.validateRenderPlan(R);if(!j.ok){const ee=j.errors.slice(0,3).map(je=>`${je.path}: ${je.message}`).join("; ");throw new ne("validate",`渲染计划校验失败(${j.errors.length} 处): ${ee}`)}if(j.warnings.forEach(ee=>le(`${ee.path}: ${ee.message}`)),u!==Y||k.signal.aborted)return;o.value=R,h.value=1,M.end(E),B.value&&(B.value.scrollTop=0),re.value==="fit"&&We(),r("loaded",R.pages.length)}catch(R){if(u!==Y)return;const j=R instanceof ne?R:R instanceof oe.ReportSourceError?new ne(R.code,R.message,R.cause):new ne("fetch",R instanceof Error?R.message:"预览加载失败",R);p.value=j.message;const ee=ct(j);A(j.message,ee.code,ee.cause)}finally{u===Y&&(l.value=!1),K===k&&(K=null)}}function G(u){if(S.value<=0)return;const b=Math.max(1,Math.min(S.value,u));h.value=b;const E=B.value;if(!E)return;let k=0;for(let O=0;O<b-1;O++)k+=(o.value?.pages[O]?.pageHeightMm??0)*ye+C.value;E.scrollTop=k*W.value}const ve=_e(o,{getPdfExporter:X,onError:(u,b)=>{v.value={kind:"error",message:u},A(u,b??"print")},onWarning:u=>{v.value={kind:"warning",message:u},r("warning",u)},onBusy:u=>{f.value=u,u?v.value={kind:"progress",message:q.value.exporting.replace("{format}",u)}:v.value?.kind==="progress"&&(v.value=null)},onPrinting:u=>{c.value=u}}),{releasePrintFrame:Pt,dispose:xt}=ve;async function Me(){g.value=null,await ve.print()}async function Fe(u){g.value=null,await ve.exportAs(u)}function Te(){g.value=null,ve.openPdfWindow()}async function He(u,b={}){Q.value={...Q.value,...u},b.reload!==!1&&await _()}const kt={reload:_,print:Me,exportAs:Fe,openPdfWindow:Te,gotoPage:G,setParams:He,checkPdfFont:ge,get state(){return U.value}};e.provide(ie.MACH_REPORT_CONTROLLER_KEY,kt);const D=Ht({plan:o,gotoPage:G,highlight:It,clearHighlights:Wt});function Ct(u){u.ctrlKey&&(u.preventDefault(),Re(W.value*(u.deltaY<0?1.1:1/1.1)))}function $t(u){if((u.ctrlKey||u.metaKey)&&u.key.toLowerCase()==="f"){u.preventDefault(),D.visible.value||D.toggle();return}switch(u.key){case"PageDown":u.preventDefault(),G(h.value+1);break;case"PageUp":u.preventDefault(),G(h.value-1);break;case"Home":u.preventDefault(),G(1);break;case"End":u.preventDefault(),G(S.value);break;case"+":case"=":u.preventDefault(),Re(W.value*1.1);break;case"-":u.preventDefault(),Re(W.value/1.1);break}}function Bt(){try{localStorage.setItem(Ye,JSON.stringify({zoomMode:re.value==="fit"?"fit":Math.round(W.value*100)}))}catch{}}e.watch([re,W],Bt),e.watchEffect(()=>{const u=o.value;if(!u)return;const b=$.value;if(!b)return;b.querySelectorAll(".mrp-page-holder").forEach(k=>{const O=Number(k.dataset.page??0)-1,le=u.pages[O];if(!le||k.childElementCount>0){if(k.firstElementChild){const j=k.firstElementChild;D.clear(j),D.apply(j)}return}k.style.width=`${le.pageWidthMm*ye}px`;const R=oe.renderPage(le,96,{},document);D.apply(R),k.appendChild(R)})},{flush:"post"}),e.watch(()=>D.query.value,u=>{u||$.value?.querySelectorAll(".mrp-page-holder").forEach(b=>{D.clear(b)})});const Ae=qt(o,{thumbsRoot:w,visible:T,renderThumbCanvas:u=>{try{const{canvases:b}=oe.renderPlanToCanvas(o.value,{start:u,end:u,dpr:.2});return b[0]??null}catch{return null}}});e.watchEffect(()=>{Ae.schedule()},{flush:"post"});const St=e.computed(()=>a.debug),{debugStats:ae}=At(St,{plan:o,pageCount:S,windowRange:fe,zoom:W,loadMs:M.loadMs});function qe(){Ie(B.value),re.value==="fit"&&We()}function Rt(){try{const u=JSON.parse(localStorage.getItem(Ye)??"{}");u.zoomMode==="fit"?Be("fit"):typeof u.zoomMode=="number"&&Be(u.zoomMode)}catch{}}return e.onMounted(()=>{window.addEventListener("resize",qe),Ie(B.value),Rt(),a.autoLoad&&_()}),e.onUnmounted(()=>{ce=!0,Ce(),Y++,K?.abort(),K=null,window.removeEventListener("resize",qe),Ae.destroy(),D.reset(),xt()}),e.watch(()=>[JSON.stringify(I.value),JSON.stringify(a.params),H.value],()=>{if(a.autoLoad){_();return}Y++,K?.abort(),K=null,l.value=!1,p.value="",g.value=null,v.value=null,he()}),n({reload:_,print:Me,exportAs:Fe,openPdfWindow:Te,gotoPage:G,setParams:He,checkPdfFont:ge,state:U}),(u,b)=>(e.openBlock(),e.createElementBlock("div",{class:"mach-report-preview",style:e.normalizeStyle(vt.value)},[x.value&&Z.value.length>0?(e.openBlock(),e.createBlock(nt,{key:0,defs:Z.value,modelValue:Q.value,"onUpdate:modelValue":b[0]||(b[0]=E=>Q.value=E),messages:q.value,attempted:$e.value,onQuery:gt,onReset:ht},null,8,["defs","modelValue","messages","attempted"])):e.createCommentVNode("",!0),e.createVNode(tt,{"page-count":S.value,"current-page":h.value,"zoom-mode":e.unref(re),zoom:e.unref(W),"show-export":i.value,"show-print":m.value,"show-pdf-window":y.value,messages:q.value,search:{visible:e.unref(D).visible.value,query:e.unref(D).query.value,matchIndex:e.unref(D).matchIndex.value,matchCount:e.unref(D).matchCount.value},"thumbs-visible":T.value,onGoto:G,onZoom:e.unref(Be),onExport:b[1]||(b[1]=E=>Fe(E)),onPrint:Me,onPdfWindow:Te,onSearchInput:e.unref(D).onInput,onSearchNav:e.unref(D).onNav,onSearchToggle:e.unref(D).toggle,onThumbsToggle:b[2]||(b[2]=E=>T.value=!T.value)},null,8,["page-count","current-page","zoom-mode","zoom","show-export","show-print","show-pdf-window","messages","search","thumbs-visible","onZoom","onSearchInput","onSearchNav","onSearchToggle"]),v.value?(e.openBlock(),e.createElementBlock("div",{key:1,class:e.normalizeClass(["mrp-export-notice",`mrp-export-${v.value.kind}`]),role:"alert"},e.toDisplayString(v.value.message),3)):e.createCommentVNode("",!0),d.value.status==="error"&&(i.value||y.value)?(e.openBlock(),e.createElementBlock("div",wn,[e.createTextVNode(e.toDisplayString(q.value.pdfFontUnavailable)+" ",1),e.createElementVNode("button",{type:"button",onClick:ft},e.toDisplayString(q.value.retry),1)])):e.createCommentVNode("",!0),e.createElementVNode("div",En,[e.createElementVNode("div",{ref_key:"viewportRef",ref:B,class:"mrp-body",tabindex:"0",onWheel:Ct,onKeydown:$t,onScrollPassive:b[3]||(b[3]=E=>e.unref(Et)(E.target))},[l.value?(e.openBlock(),e.createElementBlock("div",Pn,e.toDisplayString(q.value.loading),1)):p.value?(e.openBlock(),e.createElementBlock("div",xn,[e.createTextVNode(e.toDisplayString(p.value)+" ",1),e.createElementVNode("button",{class:"mrp-retry",type:"button",onClick:_},e.toDisplayString(q.value.retry),1)])):!o.value||S.value===0?(e.openBlock(),e.createElementBlock("div",kn,e.toDisplayString(q.value.empty),1)):(e.openBlock(),e.createElementBlock("div",{key:3,class:"mrp-scale",style:e.normalizeStyle({width:`${e.unref(Se).w*e.unref(W)}px`,height:`${e.unref(Se).h*e.unref(W)}px`})},[e.createElementVNode("div",{ref_key:"containerRef",ref:$,class:"mrp-scale-inner",style:e.normalizeStyle({transform:`scale(${e.unref(W)})`,transformOrigin:"top left",width:`${e.unref(Se).w}px`})},[e.unref(fe).padTopPx>0?(e.openBlock(),e.createElementBlock("div",{key:0,class:"mrp-spacer-top",style:e.normalizeStyle({height:`${e.unref(fe).padTopPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(bt),E=>(e.openBlock(),e.createElementBlock("div",{key:E.index,class:"mrp-page-holder","data-page":E.index+1},null,8,Cn))),128)),e.unref(fe).padBottomPx>0?(e.openBlock(),e.createElementBlock("div",{key:1,class:"mrp-spacer-bottom",style:e.normalizeStyle({height:`${e.unref(fe).padBottomPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0)],4)],4))],544),T.value&&S.value>0?(e.openBlock(),e.createElementBlock("aside",{key:0,ref_key:"thumbsRef",ref:w,class:"mrp-thumbs"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.value?.pages??[],(E,k)=>(e.openBlock(),e.createElementBlock("div",{key:k,class:e.normalizeClass(["mrp-thumb",{"mrp-thumb-active":k+1===h.value}]),onClick:O=>G(k+1)},[e.createElementVNode("div",{class:"mrp-thumb-box","data-thumb":k+1,style:e.normalizeStyle({height:`${Math.round(E.pageHeightMm/E.pageWidthMm*116)}px`})},null,12,Bn),e.createElementVNode("span",Sn,e.toDisplayString(k+1),1)],10,$n))),128))],512)):e.createCommentVNode("",!0)]),e.createElementVNode("div",Rn,[e.renderSlot(u.$slots,"default",{},void 0,!0)]),e.unref(ae)?(e.openBlock(),e.createElementBlock("div",Mn,[b[4]||(b[4]=e.createElementVNode("div",null,"mach-report debug",-1)),e.createElementVNode("div",null,"pages: "+e.toDisplayString(e.unref(ae).pages)+" | window: ["+e.toDisplayString(e.unref(ae).window)+"]",1),e.createElementVNode("div",null,"zoom: "+e.toDisplayString(e.unref(ae).zoom)+" | load: "+e.toDisplayString(e.unref(ae).loadMs),1),e.createElementVNode("div",null,"plan: "+e.toDisplayString(e.unref(ae).planKB)+"KB",1)])):e.createCommentVNode("",!0)],4))}}),dt=ze(Fn,[["__scopeId","data-v-28af6d98"]]),Tn=Object.freeze(Object.defineProperty({__proto__:null,default:dt},Symbol.toStringTag,{value:"Module"}));exports.DEFAULT_MESSAGES=ot;exports.DEFAULT_THEME=rt;exports.MachReportError=ne;exports.PlanLoadError=be;exports.ReportParamPanel=nt;exports.ReportPreview=dt;exports.ReportPreview$1=Tn;exports.ReportToolbar=tt;exports.SILENT_LOGGER=gn;exports.buildPrintDocument=Oe;exports.buildWordHtml=Qe;exports.createDefaultPdfExporter=ut;exports.createFetchRequest=Ot;exports.defineMachReportConfig=at;exports.defineMachReportPreset=mn;exports.joinReportIds=Lt;exports.normalizeReportIds=Ne;exports.printPlans=zt;exports.provideMachReportConfig=hn;exports.resolveConfig=lt;exports.themeToCssVars=st;exports.toErrorDetail=ct;exports.useMachReportConfig=it;exports.usePageWindow=Je;exports.usePrintExport=_e;exports.useZoom=Xe;
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("./style-CFZ-HE2s.cjs"),ae=require("./grid-geometry-BXpOxznT.cjs");function le(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 o=new Date(e);return Number.isNaN(o.getTime())?null:o}function V(e,t){return e.toLocaleString("en-US",{minimumFractionDigits:t,maximumFractionDigits:t})}function xe(e,t){const o=n=>String(n).padStart(2,"0");return t.replace(/YYYY/g,String(e.getFullYear())).replace(/MM/g,o(e.getMonth()+1)).replace(/DD/g,o(e.getDate())).replace(/hh/g,o(e.getHours())).replace(/mm/g,o(e.getMinutes())).replace(/ss/g,o(e.getSeconds()))}function Ee(e,t,o){return o!=null?t?V(e,o):e.toFixed(o):t?V(e):String(e)}function U(e){const t=typeof e=="number"?e:Number(String(e).replace(/,/g,""));return Number.isFinite(t)?t:null}function q(e,t){if(e==null||e===""||!t)return String(e??"");switch(t.kind){case"number":{const o=U(e);return o==null?String(e):Ee(o,t.thousands===!0,t.digits)}case"percent":{const o=U(e);return o==null?String(e):`${V(o*100,t.digits??2)}%`}case"date":{const o=t.pattern??"YYYY-MM-DD",n=e instanceof Date?e:le(String(e));return n?xe(n,o):String(e)}default:return String(e)}}function de(e,t){const o=e[t.field];if(o==null||o==="")return!1;if(typeof t.value=="number"){const a=U(o);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(o),r=String(t.value);switch(t.op){case"==":return n===r;case"!=":return n!==r;case">":return n>r;case">=":return n>=r;case"<":return n<r;case"<=":return n<=r}return!1}const ke=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function I(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ce(e,t,o,n){const r=e[t];r!=null&&(typeof r!="number"||!Number.isFinite(r))&&n.push({path:`${o}.${t}`,message:`应为有限数字,实际 ${JSON.stringify(r)}`})}function J(e,t,o,n=[]){if(!I(e)){o.push({path:t,message:"组件应为对象"});return}const r=e.kind;typeof r!="string"?o.push({path:`${t}.kind`,message:"组件缺少 kind 字符串"}):ke.has(r)||n.push({path:`${t}.kind`,message:`未知组件类型 ${JSON.stringify(r)},将以兜底方式渲染`});for(const i of["leftMm","topMm","widthMm","heightMm"])Ce(e,i,t,o);e.leftMm!=null&&e.widthMm!=null&&(e.leftMm<-100||e.widthMm<0)&&o.push({path:t,message:"几何数值异常(leftMm<-100 或 widthMm<0)"});const a=e.grid;a!==void 0&&(!I(a)||!Array.isArray(a.cells)?o.push({path:`${t}.grid.cells`,message:"grid.cells 应为二维数组"}):a.cells.forEach((i,d)=>{if(!Array.isArray(i)){o.push({path:`${t}.grid.cells.${d}`,message:"行应为数组"});return}i.forEach((h,g)=>{h!=null&&I(h)&&Array.isArray(h.children)&&h.children.forEach((m,s)=>{J(m,`${t}.grid.cells.${d}.${g}.children.${s}`,o,n)})})}));const l=e.richParagraphs;l!==void 0&&(Array.isArray(l)?l.forEach((i,d)=>{(!I(i)||!Array.isArray(i.segments))&&o.push({path:`${t}.richParagraphs.${d}`,message:"段落缺少 segments 数组"})}):o.push({path:`${t}.richParagraphs`,message:"richParagraphs 应为数组"}))}function ce(e,t,o,n=[]){if(!I(e)){o.push({path:t,message:"页应为对象"});return}const r=e.pageWidthMm,a=e.pageHeightMm;(typeof r!="number"||!(r>0&&r<3e3))&&o.push({path:`${t}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(r)}`}),(typeof a!="number"||!(a>0&&a<5e3))&&o.push({path:`${t}.pageHeightMm`,message:`页高非法: ${JSON.stringify(a)}`});const l=e.components;l!==void 0&&!Array.isArray(l)?o.push({path:`${t}.components`,message:"components 应为数组"}):Array.isArray(l)&&l.forEach((i,d)=>J(i,`${t}.components.${d}`,o,n))}function he(e){const t=[],o=[],n=I(e)?e.pages:void 0;if(!Array.isArray(n))t.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"});else{n.forEach((a,l)=>ce(a,`$.pages.${l}`,t,o)),n.length>2e3&&o.push({path:"$.pages",message:`页数异常大(${n.length} 页),渲染与打印耗时可能显著增加`});const r=n.reduce((a,l)=>a+(I(l)&&Array.isArray(l.components)?l.components.length:0),0);r>5e4&&o.push({path:"$.pages",message:`组件总数异常大(${r} 个),可能触发浏览器性能限制`})}return{ok:t.length===0,errors:t,warnings:o}}function Ae(e){const t=he(e);if(!t.ok){const o=t.errors.slice(0,3).map(n=>`${n.path}: ${n.message}`).join("; ");throw new Error(`渲染计划校验失败(${t.errors.length} 处): ${o}`)}return e.pages}function re(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 He(e,t){const n=(e.fontSizePt??c.DEFAULT_FONT_PT)*c.LINE_HEIGHT*25.4/72,r=(e.paddingMm??1)*2;return Math.max(e.rowHeightMm??0,t*n+r)}function me(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 o=e.fontSizePt??c.DEFAULT_FONT_PT,n=e.paddingMm??1,r=e.columns.map(s=>s.style?{align:"left",verticalAlign:"middle",...s.style}:{align:"left",verticalAlign:"middle"}),a=e.columns.map(s=>({bold:e.headerBold??!0,align:"center",verticalAlign:"middle",backgroundColor:e.headerBackgroundColor,...s.style||{}})),l=e.columns.map(s=>s.header),i=l.map((s,u)=>c.wrapText(s,e.columns[u].widthMm-n*2,{fontSizePt:o,bold:e.headerBold??!0},t)),d=Math.max(...i.map(s=>s.length),1),h=He(e,d),g=l.map((s,u)=>({text:s,style:a[u]})),m=e.border===!1?{borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}:{borderBottom:!0,borderLeft:!0,borderRight:!0,borderTop:!0};return{fontSizePt:o,paddingMm:n,cellStyles:r,borderStyle:m,headerHeightMm:h,headerGrid:{cells:[g],rowHeightsMm:[h]},columns:e.columns}}function ie(e,t,o){const n=e.columns,r=new Array(n.length);let a=1;for(let g=0;g<n.length;g++){const m=n[g];r[g]=m.format?q(t[m.field],m.format):me(t[m.field])}const l=new Array(n.length);for(let g=0;g<n.length;g++){const m=c.wrapText(r[g],n[g].widthMm-e.paddingMm*2,{fontSizePt:e.fontSizePt},o);l[g]=m,m.length>a&&(a=m.length)}const i=e.fontSizePt*c.LINE_HEIGHT*25.4/72,d=Math.max(e.rowHeightFloorMm,a*i+e.paddingMm*2),h=new Array(n.length);for(let g=0;g<n.length;g++){const m=n[g];let s=e.cellStyles[g];if(m.rules){for(const u of m.rules)if(de(t,u.when)){s={...s??{},...u.style};break}}h[g]={text:r[g],style:s}}return{grid:{cells:[h],rowHeightsMm:[d]},heightMm:d}}function Re(e,t,o={}){const n=typeof o=="number"?{mmPerRow:o}:o,r=n.mmPerRow??0,a=n.measurer??c.heuristicMeasurer,l=[],i=[];let d=0;const h=m=>`${m}_${(++d).toString(36)}`,g=[];for(const m of e.pages){const s=re(m),u=()=>Ne(m,s),f=s.marginTopMm,w=[],A=()=>{if(i.push({pageWidthMm:s.widthMm,pageHeightMm:s.heightMm,marginTopMm:s.marginTopMm,marginBottomMm:s.marginBottomMm,marginLeftMm:s.marginLeftMm,marginRightMm:s.marginRightMm,components:s.components}),w.length>0){const v=i.length;for(const S of w){const k={...S,text:String(S.text??"").replace(/\{page\}/g,String(v))};i[i.length-1].components.push(k),k.text.includes("{totalPages}")&&g.push(k)}}};for(const v of m.components){if(v.kind!=="list"){if(v.kind==="text"&&typeof v.text=="string"){const M=v.text;if(M.includes("{page}")||M.includes("{totalPages}")){w.push(v);continue}}s.components.push(v);continue}const S=v,k=t[S.dataset];Array.isArray(k)||l.push(`数据集 ${S.dataset} 未提供数据,列表 ${S.id??""} 输出为空`);const y=Array.isArray(k)?k:[],W=S.columns.reduce((M,b)=>M+b.widthMm,0),G=W>S.widthMm?S.widthMm/W:1,x=G===1?S:{...S,columns:S.columns.map(M=>({...M,widthMm:M.widthMm*G}))},N={...$e(x,a),rowHeightFloorMm:x.rowHeightMm??0},D={kind:"rect",leftMm:S.leftMm,topMm:0,widthMm:S.widthMm,heightMm:N.headerHeightMm,grid:N.headerGrid,nid:h("listh"),style:N.borderStyle};let p=S.topMm;const H=(M,b)=>{M.components.push({...D,topMm:b})};H(s,p),p+=N.headerHeightMm+r;const _=M=>{if(p+M>u()){A();const b=re(m);s.components=b.components,s.heightMm=b.heightMm,x.headerEveryPage!==!1?(H(s,S.topMm),p=S.topMm+N.headerHeightMm):p=f}},T=(M,b,P)=>{_(b),s.components.push({kind:"rect",leftMm:S.leftMm,topMm:p,widthMm:S.widthMm,heightMm:b,grid:M,nid:h(P),style:N.borderStyle}),p+=b},$=()=>ie(N,{},a).heightMm,C=(M,b,P,E)=>{const F=[],ne=Math.max(1,Math.min(E,x.columns.length));F.push({text:M,colSpan:ne,style:{bold:!0,...P}});for(let Y=ne;Y<x.columns.length;Y++){const ve=x.columns[Y];F.push({text:b.get(ve.field)??"",style:P})}const Pe=N.fontSizePt*c.LINE_HEIGHT*25.4/72,oe=Math.max(N.rowHeightFloorMm,Pe+N.paddingMm*2);return{grid:{cells:[F],rowHeightsMm:[oe]},heightMm:oe}},z=(M,b)=>{let P=0;for(const E of M){const F=typeof E[b]=="number"?E[b]:Number(E[b]);Number.isFinite(F)&&(P+=F)}return P},j=(M,b)=>{const P=x.columns.find(E=>E.field===b);return q(z(M,b),P?.format??{kind:"number",thousands:!0})},L=x.groupBy,ye=typeof x.grandTotal=="object"&&x.grandTotal.fields||L?.subtotal||[],Q=x.columns.findIndex(M=>ye.includes(M.field)),ee=Q>0?Q:1,O=[];if(L){const M=new Map;for(const b of y){const P=me(b[L.field]),E=M.get(P);E?E.push(b):M.set(P,[b])}for(const[b,P]of M){O.push({kind:"groupHeader",label:(L.headerTemplate??"{value}").replace(/\{value\}/g,b)});for(const E of P)O.push({kind:"row",row:E});L.subtotal&&L.subtotal.length>0&&O.push({kind:"subtotal",label:L.subtotalLabel??"小计",rows:P})}}else for(const M of y)O.push({kind:"row",row:M});const te=$();for(const M of O)if(M.kind==="row"){const b=ie(N,M.row,a);T(b.grid,b.heightMm,"listr")}else if(M.kind==="groupHeader"){const b=C(M.label,new Map,L?.headerStyle??{},x.columns.length);L?.keepWithNext!==!1&&p+b.heightMm+te>u()&&_(b.heightMm+te),T(b.grid,b.heightMm,"listg")}else if(M.kind==="subtotal"){const b=new Map;for(const E of L.subtotal??[])b.set(E,j(M.rows,E));const P=C(M.label,b,L?.subtotalStyle??{},ee);T(P.grid,P.heightMm,"listst")}if(x.grandTotal){const M=typeof x.grandTotal=="object"?x.grandTotal:void 0,b=M?.fields??L?.subtotal??[];if(b.length>0){const P=new Map;for(const F of b)P.set(F,j(y,F));const E=C(M?.label??"合计",P,M?.style??{},ee);T(E.grid,E.heightMm,"listgt")}else l.push(`列表 ${S.id??""} 配置了 grandTotal 但未提供合计字段(groupBy.subtotal 或 grandTotal.fields)`)}}A()}for(const m of g){const s=m.text;typeof s=="string"&&s.includes("{totalPages}")&&(m.text=s.replace(/\{totalPages\}/g,String(i.length)))}return{plan:{schemaVersion:c.RENDER_PLAN_SCHEMA_VERSION,pages:i},warnings:l}}const _e={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 R(e,t){return t?.classNames?.[e]??_e[e]}class B{constructor(){this.props=[]}add(t,o){return o==null||o===!1||o===""?this:(this.props.push([t,String(o)]),this)}mm(t,o,n,r=2){return this.add(t,`${c.round(c.mmToPx(o,n),r)}px`)}toString(){let t="";for(const[o,n]of this.props)t+=`${o}:${n};`;return t}applyTo(t){const o=this.toString();o&&(t.style.cssText=o)}}function ge(e,t,o){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 r=c.resolveFontSize(n,o);e.add("font-size",`${c.round(r.fontSizePx,2)}px`)}function Le(e,t,o,n,r){const a=r.createElement("table");if(a.className=R("grid",n),new B().add("width","100%").add("height","100%").add("border-collapse","collapse").add("table-layout",e.colWidthsMm?"fixed":"auto").applyTo(a),e.colWidthsMm){const h=r.createElement("colgroup");for(const g of e.colWidthsMm){const m=r.createElement("col");new B().mm("width",g,o).applyTo(m),h.appendChild(m)}a.appendChild(h)}const l=c.resolveBoxBorders(t.style),i=c.resolveStroke(t.style),d=l.inner?`${c.round(i.widthPt*o/72,2)}px solid ${i.color}`:"";return e.cells.forEach((h,g)=>{const m=r.createElement("tr");m.className=R("row",n),e.rowHeightsMm?.[g]!=null&&new B().mm("height",e.rowHeightsMm[g],o).applyTo(m),(h||[]).forEach(s=>{const u=r.createElement("td");u.className=R("cell",n),s?.colSpan&&(u.colSpan=s.colSpan),s?.rowSpan&&(u.rowSpan=s.rowSpan);const f=new B;if(d&&f.add("border",d),s?.style){const w=s.style;f.add("text-align",w.align).add("vertical-align",w.verticalAlign).add("background-color",w.backgroundColor).add("color",w.color).add("font-weight",w.bold?"700":void 0),f.add("font-size",`${c.round(c.resolveFontSize(w,o).fontSizePx,2)}px`)}if(f.applyTo(u),s?.text!=null&&(u.textContent=s.text),s?.children?.length)for(const w of s.children)u.appendChild(K(w,o,n,r));m.appendChild(u)}),a.appendChild(m)}),a}function Be(e,t,o,n){const r=n.createElement("div");r.className=R("text",o);const a=e.style||{},l=new B().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(ge(l,e,t),l.applyTo(r),c.isRichText(e)){const i=n.createElement("div");i.className=R("rich",o);for(const d of e.richParagraphs){const h=n.createElement("div");h.className=R("paragraph",o),new B().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(h);for(const m of d.segments||[]){const s=n.createElement("span");if(s.className=R("segment",o),s.textContent=m.kind==="field"?m.field??"":m.text??"",m.style){const u=new B().add("color",m.style.color).add("font-weight",m.style.bold?"700":void 0);u.add("font-size",`${c.round(c.resolveFontSize(m.style,t).fontSizePx,2)}px`),u.applyTo(s)}h.appendChild(s)}i.appendChild(h)}return r.appendChild(i),r}if(Array.isArray(e.lines)&&e.lines.length>0){const i=n.createElement("div");i.className=R("lines",o),a.lineHeight!=null&&new B().add("line-height",String(a.lineHeight)).applyTo(i);for(const d of e.lines){const h=n.createElement("div");h.className=R("line",o),h.textContent=d,i.appendChild(h)}return r.appendChild(i),r}return r.textContent=e.text??"",r}function Fe(e,t,o){const n=o.createElement("img");return n.className=R("image",t),n.src=e.imageData,new B().add("width","100%").add("height","100%").add("object-fit","contain").add("display","block").applyTo(n),n.alt=e.kind,n}function se(e,t,o,n){const r=n.createElement("div");r.className=R("shape",o);const a=e.style||{},l=c.resolveStroke(a),i=c.resolveBoxBorders(a),d=`${c.round(l.widthPt*t/72,2)}px solid ${l.color}`,h=new B;return e.grid||e.kind==="rect"?(i.top&&h.add("border-top",d),i.right&&h.add("border-right",d),i.bottom&&h.add("border-bottom",d),i.left&&h.add("border-left",d)):e.kind==="ellipse"?(i.inner&&h.add("border",d).add("border-radius","50%"),a.backgroundColor&&h.add("background-color",a.backgroundColor)):e.kind==="line"&&h.add("height","0").add("border-top",d),h.add("box-sizing","border-box").add("width","100%").add("height","100%"),h.applyTo(r),r}function K(e,t,o,n){const r=n.createElement("div");r.className=`${R("comp",o)} mr-kind-${e.kind}`;const a=new B().add("position","absolute").mm("left",e.leftMm,t).mm("top",e.topMm,t).mm("width",e.widthMm,t).mm("height",e.heightMm,t).add("box-sizing","border-box");if(ge(a,e,t),a.applyTo(r),c.isImageBackedComponent(e))return r.appendChild(Fe(e,o,n)),r;if(e.kind==="text")return r.appendChild(Be(e,t,o,n)),r;if(e.grid){const i=se(e,t,o,n);return i.appendChild(Le(e.grid,e,t,o,n)),r.appendChild(i),r}if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse"||e.kind==="chart")return r.appendChild(se(e,t,o,n)),r;const l=n.createElement("div");return l.className=R("unknown",o),l.textContent=e.fallbackText??"",r.appendChild(l),r}function fe(e,t,o,n){const r=n.createElement("div");r.className=R("page",o),new B().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(r);for(const a of e.components)r.appendChild(K(a,t,o,n));return r}function ze(e,t,o={}){const n=o.dpi??96,r=t.createElement("div");return r.className=R("root",o),r.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(a=>{r.appendChild(fe(a,n,o,t))}),r}function ue(e){const{pageHeightsPx:t,viewportHeightPx:o,scrollTopPx:n,overscan:r=1,gapPx:a=0}=e,l=t.length;if(l===0)return{start:0,end:-1,padTopPx:0,padBottomPx:0};const i=Math.max(0,a),d=new Array(l+1);d[0]=0;for(let y=0;y<l;y++)d[y+1]=d[y]+Math.max(0,t[y]??0)+i;const h=d[l],g=Math.max(0,n);let m=0,s=0,u=l-1;for(;s<=u;){const y=s+u>>1;d[y]<=g?(m=y,s=y+1):u=y-1}const f=Math.max(0,Math.min(l-1,m-r)),w=d[m]+Math.max(0,o);let A=l-1;for(s=0,u=l-1;s<=u;){const y=s+u>>1;d[y+1]<w?s=y+1:(A=y,u=y-1)}const v=Math.min(l-1,A+r),S=d[f],k=Math.max(0,h-d[v+1]);return{start:f,end:v,padTopPx:S,padBottomPx:k}}const X=96/25.4;function Z(e,t=96){const o=t/96*X;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*o)),heightPx:Math.max(1,Math.round(e.pageHeightMm*o))}}function Ie(e,t,o){const n=document.createElement("canvas"),{widthPx:r,heightPx:a}=Z(e,o);n.width=Math.round(r*t),n.height=Math.round(a*t),n.style.width=`${r}px`,n.style.height=`${a}px`;const l=n.getContext("2d");if(!l)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return l.scale(t,t),l.fillStyle="#ffffff",l.fillRect(0,0,r,a),{canvas:n,ctx:l}}function De(e,t=96){return c.resolveFontSize(e,t).fontSizePx}function pe(e,t,o,n,r,a,l,i="top"){e.font=`${t.bold?"bold ":""}${t.fontSizePx}px ${l}`,e.fillStyle=t.color,e.textBaseline="alphabetic";const d=t.fontSizePx*t.lineHeight,h=t.text===""?[""]:t.text.split(`
2
- `),g=h.length*d;let m=n;i==="middle"?m=n+(a-g)/2:i==="bottom"&&(m=n+a-g),h.forEach((s,u)=>{e.textAlign=t.align==="center"?"center":t.align==="right"?"right":"left";const f=t.align==="center"?o+r/2:t.align==="right"?o+r:o;e.fillText(s,f,m+u*d+t.fontSizePx*.8,r)}),e.textAlign="left"}function Oe(e,t,o,n,r,a,l,i,d,h,g){const m=ae.resolveGridLayout(t,a/i,l/i),s=c.resolveBoxBorders(o.style),u=c.resolveStroke(o.style);for(const f of m.cells){const w=f.cell.style?.backgroundColor;w&&(e.fillStyle=w,e.fillRect(n+f.xMm*i,r+f.yMm*i,f.widthMm*i,f.heightMm*i))}if(s.inner){e.strokeStyle=u.color,e.lineWidth=c.ptToPx(u.widthPt,d);for(const f of m.edges)e.beginPath(),f.kind==="v"?(e.moveTo(n+f.pos*i,r+f.from*i),e.lineTo(n+f.pos*i,r+f.to*i)):(e.moveTo(n+f.from*i,r+f.pos*i),e.lineTo(n+f.to*i,r+f.pos*i)),e.stroke();e.beginPath(),s.top&&(e.moveTo(n,r),e.lineTo(n+a,r)),s.right&&(e.moveTo(n+a,r),e.lineTo(n+a,r+l)),s.bottom&&(e.moveTo(n+a,r+l),e.lineTo(n,r+l)),s.left&&(e.moveTo(n,r+l),e.lineTo(n,r)),e.stroke()}for(const f of m.cells){const w=typeof f.cell.text=="string"?f.cell.text:"";if(!w)continue;const A=f.cell.style,v=A?.fontSize??c.DEFAULT_FONT_PT,S=c.wrapText(w,f.widthMm-1,{fontSizePt:v},g).join(`
3
- `);pe(e,{text:S,fontSizePx:c.resolveFontSize(A,d).fontSizePx,bold:A?.bold??!1,color:A?.color??c.resolveTextColor(o.style,c.DEFAULT_TEXT_COLOR),align:A?.align??"left",lineHeight:c.LINE_HEIGHT},n+(f.xMm+.5)*i,r+f.yMm*i,Math.max(0,(f.widthMm-1)*i),f.heightMm*i,h,A?.verticalAlign??"middle")}}function Me(e,t,o,n,r,a){const l=t.leftMm*o,i=t.topMm*o,d=t.widthMm*o,h=t.heightMm*o,g=t.style??{};if(t.grid){Oe(e,t.grid,t,l,i,d,h,o,n,r,a);return}switch(t.kind){case"text":{const m=g.fontSize??c.DEFAULT_FONT_PT,s=c.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 d=require("./style-CFZ-HE2s.cjs"),fe=require("./grid-geometry-BXpOxznT.cjs"),Ce=require("./report-params-D1NeY-eR.cjs");function ge(e){const t=/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(e.trim());if(t){const r=new Date(Number(t[1]),Number(t[2])-1,Number(t[3]));return Number.isNaN(r.getTime())?null:r}const n=new Date(e);return Number.isNaN(n.getTime())?null:n}function Z(e,t){return e.toLocaleString("en-US",{minimumFractionDigits:t,maximumFractionDigits:t})}function Ae(e,t){const n=r=>String(r).padStart(2,"0");return t.replace(/YYYY/g,String(e.getFullYear())).replace(/MM/g,n(e.getMonth()+1)).replace(/DD/g,n(e.getDate())).replace(/hh/g,n(e.getHours())).replace(/mm/g,n(e.getMinutes())).replace(/ss/g,n(e.getSeconds()))}function Re(e,t,n){return n!=null?t?Z(e,n):e.toFixed(n):t?Z(e):String(e)}function q(e){const t=typeof e=="number"?e:Number(String(e).replace(/,/g,""));return Number.isFinite(t)?t:null}function K(e,t){if(e==null||e===""||!t)return String(e??"");switch(t.kind){case"number":{const n=q(e);return n==null?String(e):Re(n,t.thousands===!0,t.digits)}case"percent":{const n=q(e);return n==null?String(e):`${Z(n*100,t.digits??2)}%`}case"date":{const n=t.pattern??"YYYY-MM-DD",r=e instanceof Date?e:ge(String(e));return r?Ae(r,n):String(e)}default:return String(e)}}function ue(e,t){const n=e[t.field];if(n==null||n==="")return!1;if(typeof t.value=="number"){const i=q(n);if(i==null)return!1;switch(t.op){case">":return i>t.value;case">=":return i>=t.value;case"<":return i<t.value;case"<=":return i<=t.value;case"==":return i===t.value;case"!=":return i!==t.value}}const r=String(n),o=String(t.value);switch(t.op){case"==":return r===o;case"!=":return r!==o;case">":return r>o;case">=":return r>=o;case"<":return r<o;case"<=":return r<=o}return!1}const He=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function j(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ne(e,t,n,r){const o=e[t];(typeof o!="number"||!Number.isFinite(o))&&r.push({path:`${n}.${t}`,message:`应为有限数字,实际 ${JSON.stringify(o)}`})}function X(e,t,n,r=[]){if(!j(e)){n.push({path:t,message:"组件应为对象"});return}const o=e.kind;typeof o!="string"?n.push({path:`${t}.kind`,message:"组件缺少 kind 字符串"}):He.has(o)||r.push({path:`${t}.kind`,message:`未知组件类型 ${JSON.stringify(o)},将以兜底方式渲染`});for(const s of["leftMm","topMm","widthMm","heightMm"])Ne(e,s,t,n);typeof e.leftMm=="number"&&e.leftMm<-100&&n.push({path:`${t}.leftMm`,message:"几何数值异常(leftMm<-100)"});for(const s of["widthMm","heightMm"])typeof e[s]=="number"&&e[s]<0&&n.push({path:`${t}.${s}`,message:"组件尺寸不能为负数"});const i=e.grid;i!==void 0&&(!j(i)||!Array.isArray(i.cells)?n.push({path:`${t}.grid.cells`,message:"grid.cells 应为二维数组"}):i.cells.forEach((s,l)=>{if(!Array.isArray(s)){n.push({path:`${t}.grid.cells.${l}`,message:"行应为数组"});return}s.forEach((m,f)=>{m!=null&&j(m)&&Array.isArray(m.children)&&m.children.forEach((h,c)=>{X(h,`${t}.grid.cells.${l}.${f}.children.${c}`,n,r)})})}));const a=e.richParagraphs;a!==void 0&&(Array.isArray(a)?a.forEach((s,l)=>{(!j(s)||!Array.isArray(s.segments))&&n.push({path:`${t}.richParagraphs.${l}`,message:"段落缺少 segments 数组"})}):n.push({path:`${t}.richParagraphs`,message:"richParagraphs 应为数组"}))}function pe(e,t,n,r=[]){if(!j(e)){n.push({path:t,message:"页应为对象"});return}const o=e.pageWidthMm,i=e.pageHeightMm;(typeof o!="number"||!(o>0&&o<3e3))&&n.push({path:`${t}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(o)}`}),(typeof i!="number"||!(i>0&&i<5e3))&&n.push({path:`${t}.pageHeightMm`,message:`页高非法: ${JSON.stringify(i)}`});const a=e.components;Array.isArray(a)?Array.isArray(a)&&a.forEach((s,l)=>X(s,`${t}.components.${l}`,n,r)):n.push({path:`${t}.components`,message:"components 应为数组"})}function Q(e){const t=[],n=[],r=j(e)?e.pages:void 0;if(!Array.isArray(r))t.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"});else{r.forEach((i,a)=>pe(i,`$.pages.${a}`,t,n)),r.length>2e3&&n.push({path:"$.pages",message:`页数异常大(${r.length} 页),渲染与打印耗时可能显著增加`});const o=r.reduce((i,a)=>i+(j(a)&&Array.isArray(a.components)?a.components.length:0),0);o>5e4&&n.push({path:"$.pages",message:`组件总数异常大(${o} 个),可能触发浏览器性能限制`})}return{ok:t.length===0,errors:t,warnings:n}}function Le(e){const t=Q(e);if(!t.ok){const n=t.errors.slice(0,3).map(r=>`${r.path}: ${r.message}`).join("; ");throw new Error(`渲染计划校验失败(${t.errors.length} 处): ${n}`)}return e.pages}function de(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 Fe(e,t){const r=(e.fontSizePt??d.DEFAULT_FONT_PT)*d.LINE_HEIGHT*25.4/72,o=(e.paddingMm??1)*2;return Math.max(e.rowHeightMm??0,t*r+o)}function Me(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 Be(e,t){const n=e.fontSizePt??d.DEFAULT_FONT_PT,r=e.paddingMm??1,o=e.columns.map(u=>({fontSize:n,align:"left",verticalAlign:"middle",...u.style})),i=e.columns.map(u=>({fontSize:n,bold:e.headerBold??!0,align:"center",verticalAlign:"middle",backgroundColor:e.headerBackgroundColor,...u.style||{}})),a=e.columns.map(u=>u.header),s=a.map((u,g)=>d.wrapText(u,e.columns[g].widthMm-r*2,{fontSizePt:n,bold:e.headerBold??!0},t)),l=Math.max(...s.map(u=>u.length),1),m=Fe(e,l),f=a.map((u,g)=>({text:u,style:i[g]})),h=e.border===!1?{borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}:{borderBottom:!0,borderLeft:!0,borderRight:!0,borderTop:!0},c=e.columns.map(u=>u.widthMm);return{fontSizePt:n,paddingMm:r,cellStyles:o,borderStyle:h,headerHeightMm:m,headerGrid:{cells:[f],colWidthsMm:c,rowHeightsMm:[m]},colWidthsMm:c,columns:e.columns}}function me(e,t,n){const r=e.columns,o=new Array(r.length);let i=1;for(let f=0;f<r.length;f++){const h=r[f];o[f]=h.format?K(t[h.field],h.format):Me(t[h.field])}const a=new Array(r.length);for(let f=0;f<r.length;f++){const h=d.wrapText(o[f],r[f].widthMm-e.paddingMm*2,{fontSizePt:e.fontSizePt},n);a[f]=h,h.length>i&&(i=h.length)}const s=e.fontSizePt*d.LINE_HEIGHT*25.4/72,l=Math.max(e.rowHeightFloorMm,i*s+e.paddingMm*2),m=new Array(r.length);for(let f=0;f<r.length;f++){const h=r[f];let c=e.cellStyles[f];if(h.rules){for(const u of h.rules)if(ue(t,u.when)){c={...c??{},...u.style};break}}m[f]={text:o[f],style:c}}return{grid:{cells:[m],colWidthsMm:e.colWidthsMm,rowHeightsMm:[l]},heightMm:l}}function we(e,t,n={}){const r=typeof n=="number"?{mmPerRow:n}:n,o=r.mmPerRow??0,i=r.measurer??d.heuristicMeasurer,a=[],s=[];let l=0;const m=h=>`${h}_${(++l).toString(36)}`,f=[];for(const h of e.pages){const c=de(h),u=()=>_e(h,c),g=c.marginTopMm,S=[],P=()=>{if(s.push({pageWidthMm:c.widthMm,pageHeightMm:c.heightMm,marginTopMm:c.marginTopMm,marginBottomMm:c.marginBottomMm,marginLeftMm:c.marginLeftMm,marginRightMm:c.marginRightMm,components:c.components}),S.length>0){const x=s.length;for(const w of S){const v={...w,text:String(w.text??"").replace(/\{page\}/g,String(x))};s[s.length-1].components.push(v),v.text.includes("{totalPages}")&&f.push(v)}}};for(const x of h.components){if(x.kind!=="list"){if(x.kind==="text"&&typeof x.text=="string"){const y=x.text;if(y.includes("{page}")||y.includes("{totalPages}")){S.push(x);continue}}c.components.push(x);continue}const w=x,v=t[w.dataset];Array.isArray(v)||a.push(`数据集 ${w.dataset} 未提供数据,列表 ${w.id??""} 输出为空`);const p=Array.isArray(v)?v:[],E=w.columns.reduce((y,M)=>y+M.widthMm,0),G=E>w.widthMm?w.widthMm/E:1,C=G===1?w:{...w,columns:w.columns.map(y=>({...y,widthMm:y.widthMm*G}))},k={...Be(C,i),rowHeightFloorMm:C.rowHeightMm??0},U={kind:"rect",leftMm:w.leftMm,topMm:0,widthMm:w.widthMm,heightMm:k.headerHeightMm,grid:k.headerGrid,nid:m("listh"),style:k.borderStyle};let b=w.topMm;const H=(y,M)=>{y.components.push({...U,topMm:M})};H(c,b),b+=k.headerHeightMm+o;const _=y=>{if(b+y>u()){P();const M=de(h);c.components=M.components,c.heightMm=M.heightMm,C.headerEveryPage!==!1?(H(c,w.topMm),b=w.topMm+k.headerHeightMm):b=g}},T=(y,M,$)=>{const A=C.headerEveryPage!==!1?w.topMm+k.headerHeightMm:g,B=u()-A;M>B&&a.push(`列表 ${w.id??w.dataset} 行高 ${M.toFixed(2)}mm 超出单页可用高度 ${B.toFixed(2)}mm,预览与打印可能截断内容`),_(M),c.components.push({kind:"rect",leftMm:w.leftMm,topMm:b,widthMm:w.widthMm,heightMm:M,grid:y,nid:m($),style:k.borderStyle}),b+=M},N=()=>me(k,{},i).heightMm,R=(y,M,$,A)=>{const B=[],se=Math.max(1,Math.min(A,C.columns.length)),le={fontSize:k.fontSizePt,...$};B.push({text:y,colSpan:se,style:{bold:!0,...le}});for(let J=se;J<C.columns.length;J++){const $e=C.columns[J];B.push({text:M.get($e.field)??"",style:le})}const ke=k.fontSizePt*d.LINE_HEIGHT*25.4/72,ce=Math.max(k.rowHeightFloorMm,ke+k.paddingMm*2);return{grid:{cells:[B],colWidthsMm:k.colWidthsMm,rowHeightsMm:[ce]},heightMm:ce}},I=(y,M)=>{let $=0;for(const A of y){const B=typeof A[M]=="number"?A[M]:Number(A[M]);Number.isFinite(B)&&($+=B)}return $},Y=(y,M)=>{const $=C.columns.find(A=>A.field===M);return K(I(y,M),$?.format??{kind:"number",thousands:!0})},F=C.groupBy,ie=y=>{const M=C.columns.findIndex($=>y.includes($.field));return M>0?M:1},V=[];if(F){const y=new Map;for(const M of p){const $=Me(M[F.field]),A=y.get($);A?A.push(M):y.set($,[M])}for(const[M,$]of y){V.push({kind:"groupHeader",label:(F.headerTemplate??"{value}").replace(/\{value\}/g,M)});for(const A of $)V.push({kind:"row",row:A});F.subtotal&&F.subtotal.length>0&&V.push({kind:"subtotal",label:F.subtotalLabel??"小计",rows:$})}}else for(const y of p)V.push({kind:"row",row:y});const ae=N();for(const y of V)if(y.kind==="row"){const M=me(k,y.row,i);T(M.grid,M.heightMm,"listr")}else if(y.kind==="groupHeader"){const M=R(y.label,new Map,F?.headerStyle??{},C.columns.length);F?.keepWithNext!==!1&&b+M.heightMm+ae>u()&&_(M.heightMm+ae),T(M.grid,M.heightMm,"listg")}else if(y.kind==="subtotal"){const M=new Map;for(const A of F.subtotal??[])M.set(A,Y(y.rows,A));const $=R(y.label,M,F?.subtotalStyle??{},ie(F.subtotal??[]));T($.grid,$.heightMm,"listst")}if(C.grandTotal){const y=typeof C.grandTotal=="object"?C.grandTotal:void 0,M=y?.fields??F?.subtotal??[];if(M.length>0){const $=new Map;for(const B of M)$.set(B,Y(p,B));const A=R(y?.label??"合计",$,y?.style??{},ie(M));T(A.grid,A.heightMm,"listgt")}else a.push(`列表 ${w.id??""} 配置了 grandTotal 但未提供合计字段(groupBy.subtotal 或 grandTotal.fields)`)}}P()}for(const h of f){const c=h.text;typeof c=="string"&&c.includes("{totalPages}")&&(h.text=c.replace(/\{totalPages\}/g,String(s.length)))}return{plan:{schemaVersion:d.RENDER_PLAN_SCHEMA_VERSION,pages:s},warnings:a}}const ze={root:"mr-root",page:"mr-page",comp:"mr-comp",text:"mr-text",lines:"mr-lines",line:"mr-line",rich:"mr-rich",paragraph:"mr-paragraph",segment:"mr-segment",image:"mr-image",shape:"mr-shape",grid:"mr-grid",row:"mr-row",cell:"mr-cell",unknown:"mr-unknown"};function L(e,t){return t?.classNames?.[e]??ze[e]}class z{constructor(){this.props=[]}add(t,n){return n==null||n===!1||n===""?this:(this.props.push([t,String(n)]),this)}mm(t,n,r,o=2){return this.add(t,`${d.round(d.mmToPx(n,r),o)}px`)}toString(){let t="";for(const[n,r]of this.props)t+=`${n}:${r};`;return t}applyTo(t){const n=this.toString();n&&(t.style.cssText=n)}}function be(e,t,n){const r=t.style||{};e.add("color",r.color).add("background-color",r.backgroundColor).add("font-family",r.fontFamily).add("font-weight",r.bold?"700":void 0).add("font-style",r.italic?"italic":void 0).add("text-decoration",r.underline?"underline":void 0).add("letter-spacing",r.letterSpacing!=null?`${r.letterSpacing}pt`:void 0).add("opacity",r.opacity!=null?String(r.opacity):void 0).add("transform",r.rotateDeg?`rotate(${r.rotateDeg}deg)`:void 0);const o=d.resolveFontSize(r,n);e.add("font-size",`${d.round(o.fontSizePx,2)}px`)}function De(e,t,n,r,o){const i=o.createElement("table");if(i.className=L("grid",r),new z().add("width","100%").add("height","100%").add("border-collapse","collapse").add("table-layout",e.colWidthsMm?"fixed":"auto").applyTo(i),e.colWidthsMm){const m=o.createElement("colgroup");for(const f of e.colWidthsMm){const h=o.createElement("col");new z().mm("width",f,n).applyTo(h),m.appendChild(h)}i.appendChild(m)}const a=d.resolveBoxBorders(t.style),s=d.resolveStroke(t.style),l=a.inner?`${d.round(s.widthPt*n/72,2)}px solid ${s.color}`:"";return e.cells.forEach((m,f)=>{const h=o.createElement("tr");h.className=L("row",r),e.rowHeightsMm?.[f]!=null&&new z().mm("height",e.rowHeightsMm[f],n).applyTo(h),(m||[]).forEach(c=>{const u=o.createElement("td");u.className=L("cell",r),c?.colSpan&&(u.colSpan=c.colSpan),c?.rowSpan&&(u.rowSpan=c.rowSpan);const g=new z;if(l&&g.add("border",l),c?.style){const S=c.style;g.add("text-align",S.align).add("vertical-align",S.verticalAlign).add("background-color",S.backgroundColor).add("color",S.color).add("font-weight",S.bold?"700":void 0),g.add("font-size",`${d.round(d.resolveFontSize(S,n).fontSizePx,2)}px`)}if(g.applyTo(u),c?.text!=null&&(u.textContent=c.text),c?.children?.length)for(const S of c.children)u.appendChild(ee(S,n,r,o));h.appendChild(u)}),i.appendChild(h)}),i}function Oe(e,t,n,r){const o=r.createElement("div");o.className=L("text",n);const i=e.style||{},a=new z().add("text-align",i.align).add("display","flex").add("flex-direction","column").add("justify-content",i.verticalAlign==="middle"?"center":i.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow","hidden");if(be(a,e,t),a.applyTo(o),d.isRichText(e)){const s=r.createElement("div");s.className=L("rich",n);for(const l of e.richParagraphs){const m=r.createElement("div");m.className=L("paragraph",n),new z().add("text-align",l.align).add("line-height",l.lineHeight!=null?String(l.lineHeight):void 0).mm("margin-top",l.spaceBeforeMm??0,t).mm("margin-bottom",l.spaceAfterMm??0,t).mm("text-indent",l.indentMm??0,t).applyTo(m);for(const h of l.segments||[]){const c=r.createElement("span");if(c.className=L("segment",n),c.textContent=h.kind==="field"?h.field??"":h.text??"",h.style){const u=new z().add("color",h.style.color).add("font-weight",h.style.bold?"700":void 0);u.add("font-size",`${d.round(d.resolveFontSize(h.style,t).fontSizePx,2)}px`),u.applyTo(c)}m.appendChild(c)}s.appendChild(m)}return o.appendChild(s),o}if(Array.isArray(e.lines)&&e.lines.length>0){const s=r.createElement("div");s.className=L("lines",n),i.lineHeight!=null&&new z().add("line-height",String(i.lineHeight)).applyTo(s);for(const l of e.lines){const m=r.createElement("div");m.className=L("line",n),m.textContent=l,s.appendChild(m)}return o.appendChild(s),o}return o.textContent=e.text??"",o}function Ie(e,t,n){const r=n.createElement("img");return r.className=L("image",t),r.src=e.imageData,new z().add("width","100%").add("height","100%").add("object-fit","contain").add("display","block").applyTo(r),r.alt=e.kind,r}function he(e,t,n,r){const o=r.createElement("div");o.className=L("shape",n);const i=e.style||{},a=d.resolveStroke(i),s=d.resolveBoxBorders(i),l=`${d.round(a.widthPt*t/72,2)}px solid ${a.color}`,m=new z;return e.grid||e.kind==="rect"?(s.top&&m.add("border-top",l),s.right&&m.add("border-right",l),s.bottom&&m.add("border-bottom",l),s.left&&m.add("border-left",l)):e.kind==="ellipse"?(s.inner&&m.add("border",l).add("border-radius","50%"),i.backgroundColor&&m.add("background-color",i.backgroundColor)):e.kind==="line"&&m.add("height","0").add("border-top",l),m.add("box-sizing","border-box").add("width","100%").add("height","100%"),m.applyTo(o),o}function ee(e,t,n,r){const o=r.createElement("div");o.className=`${L("comp",n)} mr-kind-${e.kind}`;const i=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(be(i,e,t),i.applyTo(o),d.isImageBackedComponent(e))return o.appendChild(Ie(e,n,r)),o;if(e.kind==="text")return o.appendChild(Oe(e,t,n,r)),o;if(e.grid){const s=he(e,t,n,r);return s.appendChild(De(e.grid,e,t,n,r)),o.appendChild(s),o}if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse"||e.kind==="chart")return o.appendChild(he(e,t,n,r)),o;const a=r.createElement("div");return a.className=L("unknown",n),a.textContent=e.fallbackText??"",o.appendChild(a),o}function ye(e,t,n,r){const o=r.createElement("div");o.className=L("page",n),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 i of e.components)o.appendChild(ee(i,t,n,r));return o}function We(e,t,n={}){const r=n.dpi??96,o=t.createElement("div");return o.className=L("root",n),o.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(i=>{o.appendChild(ye(i,r,n,t))}),o}function Se(e){const{pageHeightsPx:t,viewportHeightPx:n,scrollTopPx:r,overscan:o=1,gapPx:i=0}=e,a=t.length;if(a===0)return{start:0,end:-1,padTopPx:0,padBottomPx:0};const s=Math.max(0,i),l=new Array(a+1);l[0]=0;for(let p=0;p<a;p++)l[p+1]=l[p]+Math.max(0,t[p]??0)+s;const m=l[a],f=Math.max(0,r);let h=0,c=0,u=a-1;for(;c<=u;){const p=c+u>>1;l[p]<=f?(h=p,c=p+1):u=p-1}const g=Math.max(0,Math.min(a-1,h-o)),S=l[h]+Math.max(0,n);let P=a-1;for(c=0,u=a-1;c<=u;){const p=c+u>>1;l[p+1]<S?c=p+1:(P=p,u=p-1)}const x=Math.min(a-1,P+o),w=l[g],v=Math.max(0,m-l[x+1]);return{start:g,end:x,padTopPx:w,padBottomPx:v}}const te=96/25.4;function ne(e,t=96){const n=t/96*te;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*n)),heightPx:Math.max(1,Math.round(e.pageHeightMm*n))}}function je(e,t,n){const r=document.createElement("canvas"),{widthPx:o,heightPx:i}=ne(e,n);r.width=Math.round(o*t),r.height=Math.round(i*t),r.style.width=`${o}px`,r.style.height=`${i}px`;const a=r.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,i),{canvas:r,ctx:a}}function Ge(e,t=96){return d.resolveFontSize(e,t).fontSizePx}function Te(e,t,n,r,o,i,a,s="top"){e.font=`${t.bold?"bold ":""}${t.fontSizePx}px ${a}`,e.fillStyle=t.color,e.textBaseline="alphabetic";const l=t.fontSizePx*t.lineHeight,m=t.text===""?[""]:t.text.split(`
2
+ `),f=m.length*l;let h=r;s==="middle"?h=r+(i-f)/2:s==="bottom"&&(h=r+i-f),m.forEach((c,u)=>{e.textAlign=t.align==="center"?"center":t.align==="right"?"right":"left";const g=t.align==="center"?n+o/2:t.align==="right"?n+o:n;e.fillText(c,g,h+u*l+t.fontSizePx*.8,o)}),e.textAlign="left"}function Ue(e,t,n,r,o,i,a,s,l,m,f){const h=fe.resolveGridLayout(t,i/s,a/s),c=d.resolveBoxBorders(n.style),u=d.resolveStroke(n.style);for(const g of h.cells){const S=g.cell.style?.backgroundColor;S&&(e.fillStyle=S,e.fillRect(r+g.xMm*s,o+g.yMm*s,g.widthMm*s,g.heightMm*s))}if(c.inner){e.strokeStyle=u.color,e.lineWidth=d.ptToPx(u.widthPt,l);for(const g of h.edges)e.beginPath(),g.kind==="v"?(e.moveTo(r+g.pos*s,o+g.from*s),e.lineTo(r+g.pos*s,o+g.to*s)):(e.moveTo(r+g.from*s,o+g.pos*s),e.lineTo(r+g.to*s,o+g.pos*s)),e.stroke();e.beginPath(),c.top&&(e.moveTo(r,o),e.lineTo(r+i,o)),c.right&&(e.moveTo(r+i,o),e.lineTo(r+i,o+a)),c.bottom&&(e.moveTo(r+i,o+a),e.lineTo(r,o+a)),c.left&&(e.moveTo(r,o+a),e.lineTo(r,o)),e.stroke()}for(const g of h.cells){const S=typeof g.cell.text=="string"?g.cell.text:"";if(!S)continue;const P=g.cell.style,x=P?.fontSize??d.DEFAULT_FONT_PT,w=d.wrapText(S,g.widthMm-1,{fontSizePt:x},f).join(`
3
+ `);Te(e,{text:w,fontSizePx:d.resolveFontSize(P,l).fontSizePx,bold:P?.bold??!1,color:P?.color??d.resolveTextColor(n.style,d.DEFAULT_TEXT_COLOR),align:P?.align??"left",lineHeight:d.LINE_HEIGHT},r+(g.xMm+.5)*s,o+g.yMm*s,Math.max(0,(g.widthMm-1)*s),g.heightMm*s,m,P?.verticalAlign??"middle")}}function ve(e,t,n,r,o,i){const a=t.leftMm*n,s=t.topMm*n,l=t.widthMm*n,m=t.heightMm*n,f=t.style??{};if(t.grid){Ue(e,t.grid,t,a,s,l,m,n,r,o,i);return}switch(t.kind){case"text":{const h=f.fontSize??d.DEFAULT_FONT_PT,c=d.isRichText(t)?t.richParagraphs.map(u=>(u.segments??[]).map(g=>g.text??g.field??"").join("")).join(`
4
4
  `):Array.isArray(t.lines)&&t.lines.length>0?t.lines.join(`
5
- `):c.wrapText(t.text??"",t.widthMm,{fontSizePt:m},a).join(`
6
- `);pe(e,{text:s,fontSizePx:c.resolveFontSize(g,n).fontSizePx,bold:g.bold??!1,color:c.resolveTextColor(g),align:g.align??"left",lineHeight:c.resolveLineHeight(g)},l,i,d,h,r,g.verticalAlign);break}case"rect":{const m=c.resolveStroke(g),s=c.resolveBoxBorders(g);g.backgroundColor&&(e.fillStyle=g.backgroundColor,e.fillRect(l,i,d,h)),s.inner&&(e.strokeStyle=m.color,e.lineWidth=c.ptToPx(m.widthPt,n),e.beginPath(),s.top&&(e.moveTo(l,i),e.lineTo(l+d,i)),s.right&&(e.moveTo(l+d,i),e.lineTo(l+d,i+h)),s.bottom&&(e.moveTo(l+d,i+h),e.lineTo(l,i+h)),s.left&&(e.moveTo(l,i+h),e.lineTo(l,i)),e.stroke());break}case"line":{const m=c.resolveStroke({...g,borderColor:g.lineColor??g.borderColor});e.strokeStyle=m.color,e.lineWidth=c.ptToPx(m.widthPt,n),e.beginPath(),e.moveTo(l,i+h/2),e.lineTo(l+d,i+h/2),e.stroke();break}case"ellipse":{const m=c.resolveStroke(g);e.strokeStyle=m.color,e.lineWidth=c.ptToPx(m.widthPt,n),g.backgroundColor&&(e.fillStyle=g.backgroundColor,e.beginPath(),e.ellipse(l+d/2,i+h/2,d/2,h/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(l+d/2,i+h/2,d/2,h/2,0,0,Math.PI*2),e.stroke();break}}}async function We(e,t={}){if(typeof document>"u")throw new Error("renderPlanToImages 需要浏览器环境(SSR/Node 请在客户端钩子中调用)");const{format:o="png",quality:n=.92,...r}=t,{canvases:a}=be(e,r),l=o==="jpeg"?"image/jpeg":"image/png",i=[];for(const d of a)i.push(await new Promise(h=>d.toBlob(g=>h(g),l,n))??new Blob([],{type:l}));return{blobs:i}}function be(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const o=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,r=n/96*X,a=t.fontFamily??'"Microsoft YaHei", sans-serif',l=t.measurer??c.heuristicMeasurer,i=Math.max(0,t.start??0),d=Math.min(e.pages.length-1,t.end??e.pages.length-1),h=[];for(let g=i;g<=d;g++){const m=e.pages[g],{canvas:s,ctx:u}=Ie(m,o,n);for(const f of m.components)Me(u,f,r,n,a,l);h.push(s)}return{canvases:h}}function Ge(e,t={}){const o=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,r=n/96*X,a=t.fontFamily??'"Microsoft YaHei", sans-serif',l=t.measurer??c.heuristicMeasurer,i=t.overscan??1,d=t.gapPx??18,h=t.pagesPerFrame??1,g=e.pages.map(p=>p.pageHeightMm*r),m=Math.max(1,...e.pages.map(p=>p.pageWidthMm*r)),s={start:0,end:-1};let u=null,f=null,w=null,A=null,v=[],S=0,k=[];function y(){const p=u;p.innerHTML="",f=document.createElement("div"),f.style.cssText=`width:${m}px;margin:0 auto;`,w=document.createElement("div"),A=document.createElement("div"),f.appendChild(w),v=[];const H=Math.min(e.pages.length,3+i*2);for(let _=0;_<H;_++){const T=document.createElement("div");T.style.cssText=`margin:0 auto ${d}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,f.appendChild(T),v.push(T)}f.appendChild(A),p.appendChild(f)}function W(p,H){const _=e.pages[H],{widthPx:T,heightPx:$}=Z(_,n);let C=p.firstElementChild;(!C||C.tagName!=="CANVAS")&&(C=document.createElement("canvas"),p.innerHTML="",p.appendChild(C)),C.width=Math.round(T*o),C.height=Math.round($*o),C.style.width=`${T}px`,C.style.height=`${$}px`;const z=C.getContext("2d");if(z){z.setTransform(1,0,0,1,0,0),z.scale(o,o),z.fillStyle="#ffffff",z.fillRect(0,0,T,$);for(const j of _.components)Me(z,j,r,n,a,l);C.dataset.canvasPage=String(H),p.style.height=`${$}px`,p.style.width=`${T}px`}}function G(p){s.start=p.start,s.end=p.end,w.style.height=`${p.start*d+g.slice(0,p.start).reduce((T,$)=>T+$,0)}px`;const H=e.pages.length-1-p.end;A.style.height=`${H*d+g.slice(p.end+1).reduce((T,$)=>T+$,0)}px`;const _=p.end-p.start+1;v.forEach((T,$)=>{if($<_){T.style.display="";const C=p.start+$;T.style.height=`${g[C]??0}px`}else T.style.display="none"}),k=[];for(let T=p.start;T<=p.end;T++){const $=v[T-p.start];if(!$)continue;$.firstElementChild?.dataset?.canvasPage!==String(T)&&k.push(T)}x()}function x(){S||k.length===0||(S=requestAnimationFrame(()=>{S=0;let p=Math.max(1,h);for(;k.length>0&&p-- >0;){const H=k.shift(),_=v[H-s.start];_&&W(_,H)}k.length>0&&x()}))}function N(){S||(S=requestAnimationFrame(()=>{S=0;const p=u,H=ue({pageHeightsPx:g,viewportHeightPx:p.clientHeight,scrollTopPx:p.scrollTop,overscan:i,gapPx:d});H.start!==s.start||H.end!==s.end?G(H):x()}))}let D=null;return{attach(p){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");u=p,y(),p.addEventListener("scroll",N,{passive:!0}),typeof ResizeObserver<"u"&&(D=new ResizeObserver(()=>N()),D.observe(p)),N()},destroy(){S&&cancelAnimationFrame(S),S=0,D?.disconnect(),D=null,u?.removeEventListener("scroll",N),k=[],f?.remove(),u=null},window(){return{...s}}}}function Se(e,t,o){let n,r;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,r=a.heightMm}else typeof e=="number"?(n=e,r=t??297):(n=e.widthMm,r=e.heightMm);return o?{widthMm:r,heightMm:n}:{widthMm:n,heightMm:r}}class Te{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}params(t){return this.templateParams=t,this}page(t="a4",o={},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:l,heightMm:i}=Se(t,typeof o=="number"?o:void 0,a.landscape),d=a.margins??{};return this.pending=new we(this,{widthMm:l,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 we{constructor(t,o){this.parent=t,this.page=o,this.components=[]}text(t,o={},n={}){return this.components.push({kind:"text",leftMm:o.leftMm??0,topMm:o.topMm??0,widthMm:o.widthMm??60,heightMm:o.heightMm??8,text:t,style:n}),this}list(t,o,n,r={}){return this.components.push({kind:"list",leftMm:o.leftMm??10,topMm:o.topMm??30,widthMm:o.widthMm??180,dataset:t,columns:n,...r}),this}rect(t,o={}){return this.components.push({kind:"rect",...t,style:o}),this}line(t,o,n,r={}){return this.components.push({kind:"line",leftMm:t,topMm:o,widthMm:n,heightMm:.5,style:r}),this}barcode(t,o){return this.components.push({kind:"barcode",leftMm:o.leftMm??0,topMm:o.topMm??0,widthMm:o.widthMm??40,heightMm:o.heightMm??12,fallbackText:t}),this}qrcode(t,o,n,r){return this.components.push({kind:"qrcode",leftMm:n,topMm:r,widthMm:o,heightMm:o,fallbackText:t}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function je(){return new Te}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_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.wrapText=c.wrapText;exports.resolveGridLayout=ae.resolveGridLayout;exports.PageBuilder=we;exports.TemplateBuilder=Te;exports.assertRenderPlan=Ae;exports.classOf=R;exports.computePageWindow=ue;exports.createCanvasPager=Ge;exports.createTemplate=je;exports.evalStyleRule=de;exports.formatValue=q;exports.measurePageSizePx=Z;exports.paginateTemplate=Re;exports.parseDateLocal=le;exports.planFontSizePx=De;exports.renderComponent=K;exports.renderPage=fe;exports.renderPlan=ze;exports.renderPlanToCanvas=be;exports.renderPlanToImages=We;exports.resolvePaper=Se;exports.toNumber=U;exports.validateComponent=J;exports.validatePage=ce;exports.validateRenderPlan=he;
5
+ `):d.wrapText(t.text??"",t.widthMm,{fontSizePt:h},i).join(`
6
+ `);Te(e,{text:c,fontSizePx:d.resolveFontSize(f,r).fontSizePx,bold:f.bold??!1,color:d.resolveTextColor(f),align:f.align??"left",lineHeight:d.resolveLineHeight(f)},a,s,l,m,o,f.verticalAlign);break}case"rect":{const h=d.resolveStroke(f),c=d.resolveBoxBorders(f);f.backgroundColor&&(e.fillStyle=f.backgroundColor,e.fillRect(a,s,l,m)),c.inner&&(e.strokeStyle=h.color,e.lineWidth=d.ptToPx(h.widthPt,r),e.beginPath(),c.top&&(e.moveTo(a,s),e.lineTo(a+l,s)),c.right&&(e.moveTo(a+l,s),e.lineTo(a+l,s+m)),c.bottom&&(e.moveTo(a+l,s+m),e.lineTo(a,s+m)),c.left&&(e.moveTo(a,s+m),e.lineTo(a,s)),e.stroke());break}case"line":{const h=d.resolveStroke({...f,borderColor:f.lineColor??f.borderColor});e.strokeStyle=h.color,e.lineWidth=d.ptToPx(h.widthPt,r),e.beginPath(),e.moveTo(a,s+m/2),e.lineTo(a+l,s+m/2),e.stroke();break}case"ellipse":{const h=d.resolveStroke(f);e.strokeStyle=h.color,e.lineWidth=d.ptToPx(h.widthPt,r),f.backgroundColor&&(e.fillStyle=f.backgroundColor,e.beginPath(),e.ellipse(a+l/2,s+m/2,l/2,m/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(a+l/2,s+m/2,l/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:n="png",quality:r=.92,...o}=t,{canvases:i}=Pe(e,o),a=n==="jpeg"?"image/jpeg":"image/png",s=[];for(const l of i)s.push(await new Promise(m=>l.toBlob(f=>m(f),a,r))??new Blob([],{type:a}));return{blobs:s}}function Pe(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,o=r/96*te,i=t.fontFamily??'"Microsoft YaHei", sans-serif',a=t.measurer??d.heuristicMeasurer,s=Math.max(0,t.start??0),l=Math.min(e.pages.length-1,t.end??e.pages.length-1),m=[];for(let f=s;f<=l;f++){const h=e.pages[f],{canvas:c,ctx:u}=je(h,n,r);for(const g of h.components)ve(u,g,o,r,i,a);m.push(c)}return{canvases:m}}function Ye(e,t={}){const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,o=r/96*te,i=t.fontFamily??'"Microsoft YaHei", sans-serif',a=t.measurer??d.heuristicMeasurer,s=t.overscan??1,l=t.gapPx??18,m=t.pagesPerFrame??1,f=e.pages.map(b=>b.pageHeightMm*o),h=Math.max(1,...e.pages.map(b=>b.pageWidthMm*o)),c={start:0,end:-1};let u=null,g=null,S=null,P=null,x=[],w=0,v=[];function p(){const b=u;b.innerHTML="",g=document.createElement("div"),g.style.cssText=`width:${h}px;margin:0 auto;`,S=document.createElement("div"),P=document.createElement("div"),g.appendChild(S),x=[];const H=Math.min(e.pages.length,3+s*2);for(let _=0;_<H;_++){const T=document.createElement("div");T.style.cssText=`margin:0 auto ${l}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,g.appendChild(T),x.push(T)}g.appendChild(P),b.appendChild(g)}function E(b,H){const _=e.pages[H],{widthPx:T,heightPx:N}=ne(_,r);let R=b.firstElementChild;(!R||R.tagName!=="CANVAS")&&(R=document.createElement("canvas"),b.innerHTML="",b.appendChild(R)),R.width=Math.round(T*n),R.height=Math.round(N*n),R.style.width=`${T}px`,R.style.height=`${N}px`;const I=R.getContext("2d");if(I){I.setTransform(1,0,0,1,0,0),I.scale(n,n),I.fillStyle="#ffffff",I.fillRect(0,0,T,N);for(const Y of _.components)ve(I,Y,o,r,i,a);R.dataset.canvasPage=String(H),b.style.height=`${N}px`,b.style.width=`${T}px`}}function G(b){c.start=b.start,c.end=b.end,S.style.height=`${b.start*l+f.slice(0,b.start).reduce((T,N)=>T+N,0)}px`;const H=e.pages.length-1-b.end;P.style.height=`${H*l+f.slice(b.end+1).reduce((T,N)=>T+N,0)}px`;const _=b.end-b.start+1;x.forEach((T,N)=>{if(N<_){T.style.display="";const R=b.start+N;T.style.height=`${f[R]??0}px`}else T.style.display="none"}),v=[];for(let T=b.start;T<=b.end;T++){const N=x[T-b.start];if(!N)continue;N.firstElementChild?.dataset?.canvasPage!==String(T)&&v.push(T)}C()}function C(){w||v.length===0||(w=requestAnimationFrame(()=>{w=0;let b=Math.max(1,m);for(;v.length>0&&b-- >0;){const H=v.shift(),_=x[H-c.start];_&&E(_,H)}v.length>0&&C()}))}function k(){w||(w=requestAnimationFrame(()=>{w=0;const b=u,H=Se({pageHeightsPx:f,viewportHeightPx:b.clientHeight,scrollTopPx:b.scrollTop,overscan:s,gapPx:l});H.start!==c.start||H.end!==c.end?G(H):C()}))}let U=null;return{attach(b){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");u=b,p(),b.addEventListener("scroll",k,{passive:!0}),typeof ResizeObserver<"u"&&(U=new ResizeObserver(()=>k()),U.observe(b)),k()},destroy(){w&&cancelAnimationFrame(w),w=0,U?.disconnect(),U=null,u?.removeEventListener("scroll",k),v=[],g?.remove(),u=null},window(){return{...c}}}}function re(e,t,n){let r,o;if(typeof e=="string"){const i=d.PAPER_SIZES[e];if(!i)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(d.PAPER_SIZES).join("/")})`);r=i.widthMm,o=i.heightMm}else typeof e=="number"?(r=e,o=t??297):(r=e.widthMm,o=e.heightMm);return n?{widthMm:o,heightMm:r}:{widthMm:r,heightMm:o}}class Ee{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}params(t){return this.templateParams=t,this}page(t="a4",n={},r){this.collect();const i=r!=null&&!("margins"in r)&&!("landscape"in r)&&("marginTopMm"in r||"marginBottomMm"in r||"marginLeftMm"in r||"marginRightMm"in r)?{margins:r}:typeof n=="number"?r??{}:n,{widthMm:a,heightMm:s}=re(t,typeof n=="number"?n:void 0,i.landscape),l=i.margins??{};return this.pending=new xe(this,{widthMm:a,heightMm:s,marginTopMm:l.marginTopMm??10,marginBottomMm:l.marginBottomMm??10,marginLeftMm:l.marginLeftMm??10,marginRightMm:l.marginRightMm??10}),this.pending}collect(){this.pending&&(this.pages.push(this.pending.buildPage()),this.pending=null)}build(){if(this.collect(),this.pages.length===0)throw new Error("模板至少需要一页:先调用 .page() 添加内容");return this.templateParams?{params:this.templateParams,pages:this.pages}:{pages:this.pages}}}class xe{constructor(t,n){this.parent=t,this.page=n,this.components=[]}text(t,n={},r={}){return this.components.push({kind:"text",leftMm:n.leftMm??0,topMm:n.topMm??0,widthMm:n.widthMm??60,heightMm:n.heightMm??8,text:t,style:r}),this}list(t,n,r,o={}){return this.components.push({kind:"list",leftMm:n.leftMm??10,topMm:n.topMm??30,widthMm:n.widthMm??180,dataset:t,columns:r,...o}),this}rect(t,n={}){return this.components.push({kind:"rect",...t,style:n}),this}line(t,n,r,o={}){return this.components.push({kind:"line",leftMm:t,topMm:n,widthMm:r,heightMm:.5,style:o}),this}barcode(t,n){return this.components.push({kind:"barcode",leftMm:n.leftMm??0,topMm:n.topMm??0,widthMm:n.widthMm??40,heightMm:n.heightMm??12,fallbackText:t}),this}qrcode(t,n,r,o){return this.components.push({kind:"qrcode",leftMm:r,topMm:o,widthMm:n,heightMm:n,fallbackText:t}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function qe(){return new Ee}function O(e,t,n=!1){if(!Number.isFinite(e)||(n?e<0:e<=0))throw new Error(`${t} 必须是有限${n?"非负":"正"}数`)}function Je(e){if(!e||typeof e!="object")throw new Error("标准明细模板需要 options 对象");if(!Array.isArray(e.columns)||e.columns.length===0)throw new Error("columns 至少需要一列");const t=e.paper===void 0?"a4":e.paper;if(typeof t!="string"&&(typeof t!="object"||t===null)||e.landscape!==void 0&&typeof e.landscape!="boolean")throw new Error("paper 必须是纸张预设名或 { widthMm, heightMm } 对象,landscape 必须是布尔值");if(typeof t=="string"&&!Object.prototype.hasOwnProperty.call(d.PAPER_SIZES,t))throw new Error(`未知纸张预设 "${t}"(可用:${Object.keys(d.PAPER_SIZES).join("/")})`);const{widthMm:n,heightMm:r}=re(t,void 0,e.landscape);if(O(n,"纸张 widthMm"),O(r,"纸张 heightMm"),e.margins!==void 0&&(!e.margins||typeof e.margins!="object"||Array.isArray(e.margins)))throw new Error("margins 必须是页边距对象");const o=e.margins??{},i={marginTopMm:o.marginTopMm===void 0?10:o.marginTopMm,marginBottomMm:o.marginBottomMm===void 0?10:o.marginBottomMm,marginLeftMm:o.marginLeftMm===void 0?10:o.marginLeftMm,marginRightMm:o.marginRightMm===void 0?10:o.marginRightMm};for(const[p,E]of Object.entries(i))O(E,p,!0);const a=n-i.marginLeftMm-i.marginRightMm,s=r-i.marginTopMm-i.marginBottomMm;if(a<=0||s<=0)throw new Error("页边距占满纸张,必须保留正的可用宽度和高度");const l=e.dataset===void 0?"detail":e.dataset;if(typeof l!="string"||!l.trim())throw new Error("dataset 必须是非空字符串");if(e.title!==void 0&&typeof e.title!="string")throw new Error("title 必须是字符串");const m=e.titleHeightMm===void 0?10:e.titleHeightMm,f=e.titleGapMm===void 0?4:e.titleGapMm;O(m,"titleHeightMm"),O(f,"titleGapMm",!0);const h=e.title!==void 0&&e.title.length>0,c=h?m+f:0;if(c>=s)throw new Error("标题高度与间距占满页面,必须为表格保留可用高度");if(e.listOptions!==void 0&&(!e.listOptions||typeof e.listOptions!="object"||Array.isArray(e.listOptions)))throw new Error("listOptions 必须是列表配置对象");const u=e.listOptions??{};for(const p of["fontSizePt","rowHeightMm","paddingMm"]){const E=u[p];E!==void 0&&O(E,`listOptions.${p}`,p==="paddingMm")}let g=0,S=0;for(const[p,E]of e.columns.entries()){if(!E||typeof E.header!="string"||typeof E.field!="string"||!E.field.trim())throw new Error(`columns[${p}] 需要字符串 header 与非空 field`);E.flex!==void 0&&O(E.flex,`columns[${p}].flex`),E.widthMm!==void 0?(O(E.widthMm,`columns[${p}].widthMm`),g+=E.widthMm):S=Math.max(S,E.flex??1)}if(g>a)throw new Error(`固定列宽 ${g}mm 超出页面可用宽度 ${a}mm`);const P=a-g;if(S>0&&P<=0)throw new Error("固定列占满页面可用宽度,自动列需要正的剩余宽度");const x=S>0?e.columns.reduce((p,E)=>p+(E.widthMm===void 0?(E.flex??1)/S:0),0):0,w=e.columns.map(({widthMm:p,flex:E,...G},C)=>{const k=p??P*((E??1)/S)/x;return O(k,`columns[${C}] 分配后的 widthMm`),{...G,widthMm:k}}),v={widthMm:n,heightMm:r,...i,components:[]};return h&&v.components.push({kind:"text",text:e.title,leftMm:i.marginLeftMm,topMm:i.marginTopMm,widthMm:a,heightMm:m,style:{fontSize:16,bold:!0,align:"center",verticalAlign:"middle",...e.titleStyle}}),v.components.push({...u,kind:"list",dataset:l,columns:w,leftMm:i.marginLeftMm,topMm:i.marginTopMm+c,widthMm:S>0?a:g}),e.params===void 0?{pages:[v]}:{params:e.params,pages:[v]}}function Ze(e){if(!("mapData"in e))return e;const{load:t,mapData:n,...r}=e;return{...r,load:async o=>{const i=await t(o);W(o.signal);try{return n(i,o)}catch(a){throw new D("validate",`报表 ${o.reportId} 数据映射失败`,a)}}}}class D extends Error{constructor(t,n,r){super(n),this.name="ReportSourceError",this.code=t,this.cause=r}}function oe(e){const t=new Error("报表加载已取消");return t.name="AbortError",Object.defineProperty(t,"cause",{value:e.reason}),t}function W(e){if(e?.aborted)throw oe(e)}function Ke(e,t){return t?new Promise((n,r)=>{const o=()=>t.removeEventListener("abort",i),i=()=>{o(),r(oe(t))};t.addEventListener("abort",i,{once:!0}),t.aborted&&i(),Promise.resolve(e).then(a=>{o(),n(a)},a=>{o(),r(a)})}):Promise.resolve(e)}function Xe(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new D("validate",`报表 ${t} 的数据集应为对象`);for(const[n,r]of Object.entries(e))if(!Array.isArray(r)||r.some(o=>!o||typeof o!="object"||Array.isArray(o)))throw new D("validate",`报表 ${t} 的数据集 ${n} 应为对象数组`)}function Qe(e,t={}){function n(o){const i=Object.prototype.hasOwnProperty.call(e,o)?e[o]:void 0;if(!i)throw new D("config",`未注册报表 ${o}`);return i}return Object.assign(async({reportIds:o,params:i,signal:a,onWarning:s})=>{if(W(a),o.length===0)throw new D("config","缺少报表 ID");const l=o.map(n),m=[],f=[];for(const[g,S]of l.entries()){W(a);const P=o[g],x={reportId:P,params:{...i},signal:a};let w;try{w=await Ke(S.load?S.load(x):S.datasets??{},a)}catch(p){throw a?.aborted?oe(a):p instanceof D?p:new D("fetch",`报表 ${P} 取数失败:${p instanceof Error?p.message:String(p)}`,p)}W(a),Xe(w,P);let v;try{v=we(S.template,w,S.pagination)}catch(p){throw new D("validate",`报表 ${P} 排版失败:${p instanceof Error?p.message:String(p)}`,p)}for(const p of v.plan.pages)m.push(p);f.push(...v.warnings.map(p=>`${P}: ${p}`))}W(a);const h={schemaVersion:d.RENDER_PLAN_SCHEMA_VERSION,pages:m},c=Q(h);if(!c.ok)throw new D("validate",`渲染计划校验失败:${c.errors.slice(0,3).map(g=>`${g.path}: ${g.message}`).join("; ")}`);f.push(...c.warnings.map(g=>`${g.path}: ${g.message}`));const u=s??t.onWarning??(g=>console.warn("[mach-report]",g));for(const g of f)W(a),u(g);return W(a),h},{getParamDefs:o=>Ce.getReportParamDefs(e,o)})}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_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.wrapText=d.wrapText;exports.resolveGridLayout=fe.resolveGridLayout;exports.PageBuilder=xe;exports.ReportSourceError=D;exports.TemplateBuilder=Ee;exports.assertRenderPlan=Le;exports.classOf=L;exports.computePageWindow=Se;exports.createCanvasPager=Ye;exports.createReportSource=Qe;exports.createTableTemplate=Je;exports.createTemplate=qe;exports.defineReport=Ze;exports.evalStyleRule=ue;exports.formatValue=K;exports.measurePageSizePx=ne;exports.paginateTemplate=we;exports.parseDateLocal=ge;exports.planFontSizePx=Ge;exports.renderComponent=ee;exports.renderPage=ye;exports.renderPlan=We;exports.renderPlanToCanvas=Pe;exports.renderPlanToImages=Ve;exports.resolvePaper=re;exports.toNumber=q;exports.validateComponent=X;exports.validatePage=pe;exports.validateRenderPlan=Q;