@wafertools/wafermap 0.24.1 → 0.24.3

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 (38) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/packages/canvas-adapter/charts/barPanel.d.ts +5 -0
  3. package/dist/packages/canvas-adapter/charts/barPanel.js +1 -1
  4. package/dist/packages/canvas-adapter/charts/binCluster.d.ts +5 -0
  5. package/dist/packages/canvas-adapter/charts/binCluster.js +1 -1
  6. package/dist/packages/canvas-adapter/charts/boxplot.d.ts +5 -0
  7. package/dist/packages/canvas-adapter/charts/boxplot.js +1 -1
  8. package/dist/packages/canvas-adapter/charts/capability.d.ts +5 -0
  9. package/dist/packages/canvas-adapter/charts/capability.js +1 -1
  10. package/dist/packages/canvas-adapter/charts/chartShell.d.ts +8 -5
  11. package/dist/packages/canvas-adapter/charts/chartShell.js +1 -1
  12. package/dist/packages/canvas-adapter/charts/correlation.d.ts +5 -0
  13. package/dist/packages/canvas-adapter/charts/correlation.js +1 -1
  14. package/dist/packages/canvas-adapter/charts/histogram.d.ts +5 -0
  15. package/dist/packages/canvas-adapter/charts/histogram.js +1 -1
  16. package/dist/packages/canvas-adapter/charts/regionYieldDiagram.d.ts +5 -0
  17. package/dist/packages/canvas-adapter/charts/regionYieldDiagram.js +1 -1
  18. package/dist/packages/canvas-adapter/charts/scatter.d.ts +5 -0
  19. package/dist/packages/canvas-adapter/charts/scatter.js +1 -1
  20. package/dist/packages/canvas-adapter/dieList.d.ts +9 -0
  21. package/dist/packages/canvas-adapter/dieList.js +6 -6
  22. package/dist/packages/canvas-adapter/insightsTab.d.ts +5 -0
  23. package/dist/packages/canvas-adapter/insightsTab.js +1 -1
  24. package/dist/packages/canvas-adapter/metadataBadge.d.ts +4 -0
  25. package/dist/packages/canvas-adapter/metadataBadge.js +1 -1
  26. package/dist/packages/canvas-adapter/renderWaferGallery.js +6 -6
  27. package/dist/packages/canvas-adapter/renderWaferMap.js +1 -1
  28. package/dist/packages/canvas-adapter/summaryPanel.d.ts +1 -1
  29. package/dist/packages/canvas-adapter/summaryPanel.js +3 -3
  30. package/dist/packages/canvas-adapter/toolbar.d.ts +4 -2
  31. package/dist/packages/canvas-adapter/toolbar.js +2 -2
  32. package/dist/packages/canvas-adapter/userGuideHtml.d.ts +1 -1
  33. package/dist/packages/canvas-adapter/userGuideHtml.js +1 -1
  34. package/dist/packages/canvas-adapter/version.d.ts +2 -2
  35. package/dist/packages/canvas-adapter/version.js +1 -1
  36. package/dist/packages/canvas-adapter/warnings.d.ts +1 -1
  37. package/dist/packages/canvas-adapter/warnings.js +1 -1
  38. package/package.json +5 -5
@@ -1 +1 @@
1
- import{buildView as oi,buildHoverText as ai,findTestDef as it,resolveTestNumber as Et}from"../renderer/buildView.js";import{toCanvas as si,BIN_LEGEND_W as wn,BIN_LEGEND_W_COMPACT as li,BIN_LEGEND_ADAPT_COMPACT as ri,BIN_LEGEND_ADAPT_FLOATING as di}from"./toCanvas.js";import{buildWaferMap as ci,getTestPassStatus as pi,isParametricTest as Bt}from"../renderer/buildWaferMap.js";import{analyzeWaferMap as fi}from"../stats/analyzeWaferMap.js";import{CLR as x,Z_BASE as ui,applyOverlayZ as gi,getTooltip as Sn,hideTooltip as ot,reparentTooltip as hi,positionTooltip as Dt,createToolbarHelpers as mi,buildModeMenuEl as yi,openReparentedModal as bi,openUserGuideWindow as vi,makePaletteBtn as xi,makeLogScaleBtn as wi,makeLegendStyleBtn as Si,makeOverlaysBtn as Ci,makeOrientationBtn as Mi,overlayRootFor as Cn,saveImageBlob as Ei,markMenuTrigger as Ye,wireMenuA11y as Mn,wireExpandToggle as Bi,nextFrame as kt,passFailMenuRows as Di,requestedPassFailDisplay as Lt,logWmapVersionOnce as ki,buildDataModeEntries as Li,metadataKeyHasData as Ti,metadataModeEntry as Pi}from"./toolbar.js";import{createSummaryPanelEl as Tt,wrapWithSummaryPanel as Pt,renderWaferSummaryContent as Oi}from"./summaryPanel.js";import{collectWarnings as Ri,buildWarningsMenuEl as Ii,severityOf as Wi}from"./warnings.js";import"../stats/facets.js";import{ICONS as En}from"./icons.js";import{hardBinColor as Hi,softBinColor as Ai,metadataValueColor as Fi}from"../renderer/colorMap.js";import{createInsightsTab as Yi}from"./insightsTab.js";import{createMetadataBadge as zi}from"./metadataBadge.js";import{getDieKey as Ee,hasPosition as Bn,isPositionedDie as Xi}from"../core/dies.js";import{buildDieListSection as Ni}from"./dieList.js";import{buildMaplessSummary as Ki}from"./maplessSummary.js";const Dn=new Set(["colorScheme","rotation","flipX","flipY","showDieLabels","showPartialDies","showRingBoundaries","showQuadrantBoundaries","showReticle","showXYIndicator","ringCount","legendPosition","logScale","colorbarRangeMode"]);export function classifyChanged(N){const h=N.some(W=>Dn.has(W)),w=N.some(W=>!Dn.has(W));return h&&w?"mixed":h?"preference":"state"}export function renderWaferMap(N,h,w={}){ki();const W=N.ownerDocument,_=W.defaultView??window;_.getComputedStyle(N).position==="static"&&(N.style.position="relative");const kn=N.clientHeight;w.height!=null&&(N.style.height=typeof w.height=="number"?`${w.height}px`:w.height);const at=h.dataCoverage?h.dataCoverage.unpositionedDies:h.dies.filter(e=>!Bn(e)).length,ze=(h.dataCoverage?h.dataCoverage.totalDies:h.dies.length-at)===0&&at>0,q=document.createElement("div");Object.assign(q.style,{position:"relative",width:"100%",height:"100%"}),w.maxSize!=null&&(q.style.maxWidth=`${w.maxSize}px`,q.style.maxHeight=`${w.maxSize}px`),N.appendChild(q);const S=document.createElement("div");Object.assign(S.style,{position:"relative",width:"100%",height:"100%"});const a=document.createElement("canvas");Object.assign(a.style,{width:"100%",height:"100%",display:"block"}),S.appendChild(a),q.appendChild(S);let Xe=null;if(at>0){let n=function(){if(t){const u=Ni(e,h.testDefs,{...w.dieList,onSaveText:w.onSaveText,waferMetadata:J.metadata,metadataFields:se});if(u)return u}const i=it(h.testDefs,l.activeTest??0),r=Bt(i)?l.logScale??i?.logScale??!1:!1;return Ki(e,h.testDefs,{plotMode:l.plotMode??"hardBin",activeTest:l.activeTest,hbinDefs:$,sbinDefs:G,colorScheme:l.colorScheme,logScale:r,colorbarRangeMode:l.colorbarRangeMode,valueRangeDies:h.dies})},o=function(i){const r=document.createElement("button");return r.type="button",Object.assign(r.style,{fontSize:"10px",padding:"2px 6px",borderRadius:"4px",flexShrink:"0",border:`1px solid ${x.menuBorder}`,background:x.menuBg,color:x.text,cursor:"pointer"}),r.textContent=t?"View chart":"View die list",r.addEventListener("click",u=>{u.stopPropagation(),t=!t,r.textContent=t?"View chart":"View die list",i()}),r};const e=h.dies.filter(i=>!Bn(i));let t=!1;if(ze){const i=document.createElement("div");Object.assign(i.style,{position:"absolute",inset:"0",background:x.panelBg,padding:"12px",paddingTop:w.showToolbar??!0?"44px":"12px",boxSizing:"border-box",overflow:"hidden",display:"flex",flexDirection:"column",gap:"8px",zIndex:"1"});const r=document.createElement("div");Object.assign(r.style,{display:"flex",justifyContent:"space-between",alignItems:"flex-start",gap:"8px"});const u=document.createElement("span");Object.assign(u.style,{fontSize:"11px",color:x.label,lineHeight:"1.4"}),u.textContent="No die position data for this wafer.",r.appendChild(u);const s=document.createElement("div");Object.assign(s.style,{flex:"1",minHeight:"0",overflow:"auto",display:"flex",flexDirection:"column"}),r.appendChild(o(()=>s.replaceChildren(n()))),i.appendChild(r),i.appendChild(s),S.appendChild(i),Xe=()=>{t||s.replaceChildren(n())}}else{const i=document.createElement("div");Object.assign(i.style,{position:"absolute",left:"0",right:"0",bottom:"0",zIndex:"3",background:x.panelBg,borderTop:`1px solid ${x.menuBorder}`,fontSize:"11px",color:x.text,cursor:"pointer",padding:"4px 8px",display:"flex",alignItems:"center",justifyContent:"space-between",gap:"8px"});const r=document.createElement("span");r.textContent=`+${e.length} ${e.length===1?"die":"dies"} without position data`,i.appendChild(r);const u=document.createElement("span");u.textContent="\u25BE",Object.assign(u.style,{fontSize:"12px",lineHeight:"1",color:x.label,flexShrink:"0"}),i.appendChild(u),i.setAttribute("aria-expanded","false"),i.setAttribute("aria-label",`${e.length} dies without position data. Click to view.`);let s=null,d=null;Bi(i,c=>{if(u.textContent=c?"\u25B4":"\u25BE",i.setAttribute("aria-expanded",String(c)),c){s=document.createElement("div");const p=i.getBoundingClientRect().height||28;Object.assign(s.style,{position:"absolute",left:"0",right:"0",bottom:`${p}px`,top:"20%",zIndex:"2",background:x.panelBg,borderTop:`1px solid ${x.menuBorder}`,padding:"8px",boxSizing:"border-box",display:"flex",flexDirection:"column",gap:"8px"}),s.addEventListener("click",Q=>Q.stopPropagation());const g=document.createElement("div");Object.assign(g.style,{display:"flex",justifyContent:"flex-end"}),g.appendChild(o(()=>{d&&d.replaceChildren(n())})),s.appendChild(g),d=document.createElement("div"),Object.assign(d.style,{flex:"1",minHeight:"0",overflow:"auto",display:"flex",flexDirection:"column"}),d.appendChild(n()),s.appendChild(d),S.appendChild(s)}else s&&(s.remove(),s=null,d=null)}),S.appendChild(i),Xe=()=>{d&&!t&&d.replaceChildren(n())}}}const{onHover:Ne,onClick:Ln,onSelect:de,onViewOptionsChange:Tn,showTooltip:Pn=!0,showToolbar:he=!0,showMetadataBadge:On=!0,toolbarControls:Ot="full",showPlotModeSelector:Rn=!0,minZoom:In=.4,maxZoom:Wn=20,summaryPanel:Be,renderTooltip:Rt,passBins:It=[1],showHelpButton:Hn=!1,userGuideExtension:An,onExpand:Wt,showExpandButton:Ht=!0,zIndex:Fn,insights:At,warnings:Ft,viewOptions:Yn={},...ce}=w,zn=At?.enabled??!1,Yt=Ft?.display??!0,Xn=gi(Fn);let De=ce.fallbackFormat,ie=w.statsSummary,oe=[],zt=!1;function Xt(){const e=Ri({result:h,statsSummary:ie}),t=e.length!==oe.length||e.some((n,o)=>n.code!==oe[o]?.code||n.message!==oe[o]?.message);oe=e,(t||!zt)&&(zt=!0,Ft?.onWarning?.(e))}Xt();let st=h,J=h.wafer,ae=h.dies,M=new Set,$=h.hbinDefs,G=h.sbinDefs,ee=h.testDefs,se=h.metadataFields,Nt=h.reticles?.length?h.reticles:void 0,Kt=h.reticleConfig,Vt=h.view?.dataAxisFlip,lt=h.isLotStack??!1,rt=h.aggrMethod,dt=h.lotSize,jt=!1,L=null;On&&(L=zi(J.metadata,{lotStack:_t()}),L.isEmpty()||S.appendChild(L.el));function _t(){return lt?{lotSize:dt??1,aggrMethod:rt}:void 0}function Nn(){if(!L)return;L.update(J.metadata,_t());const e=L.el.isConnected;L.isEmpty()&&e?L.el.remove():!L.isEmpty()&&!e&&S.appendChild(L.el)}const $t=[...$??[],...G??[]].some(e=>e.color);let l={plotMode:"hardBin",colorScheme:$t?"custom":"default",showDieLabels:!1,showPartialDies:!0,showRingBoundaries:!1,showQuadrantBoundaries:!1,showReticle:!1,showXYIndicator:!1,ringCount:4,rotation:0,flipX:!1,flipY:!1,legendPosition:ce.legendPosition??"default",...Yn},le=null,me=!1;zn&&(le=Yi({getItems:()=>[{wafer:J,dies:ae,hbinDefs:$,sbinDefs:G,testDefs:ee,label:String(J.metadata?.waferId??""),statsSummary:ie}],getColorSchemeName:()=>l.colorScheme??"default",passBins:It,getRingCount:()=>l.ringCount??4,onSaveImage:w.onSaveImage,onSaveText:w.onSaveText,defaultView:At?.defaultView,backTab:{label:"Map",onBack:()=>ct(!1)}}),Object.assign(le.el.style,{position:"absolute",inset:"0",background:x.panelBg,overflowY:"auto",paddingTop:he?"44px":"0"}),q.appendChild(le.el));function ct(e){le&&(me=e,le.el.style.display=e?"flex":"none",A&&(A.style.display=e||ze?"none":"flex"),D&&(D.style.display=e?"none":"flex"),Z&&(Z.style.display=e?"none":"flex"),L&&(L.el.style.display=e||jt?"none":""),Ze(),F&&(F.innerHTML=e?En.wafer:En.analysis,F.ariaLabel=e?"Back to wafer view":"Insights"),e&&le.render())}let m,Gt,H=null,T=null,pt=[],ke=null,ft=ce.legendOffset??{x:0,y:0},Le=!1,ye=!1,Te={x:0,y:0},ut={x:0,y:0},pe=!1,be=!1,Y="pan",ve={x:0,y:0},Ke={x:0,y:0},P={x:0,y:0},O={x:0,y:0},Pe=!1,xe=!1;function Oe(){const e=l;m=oi(J,ae.filter(Xi),{plotMode:e.plotMode,colorScheme:e.colorScheme,showDieLabels:e.showDieLabels,showPartialDies:e.showPartialDies,showRingBoundaries:e.showRingBoundaries,showQuadrantBoundaries:e.showQuadrantBoundaries,showReticle:e.showReticle,showXYIndicator:e.showXYIndicator,reticles:Nt,ringCount:e.ringCount,highlightBin:e.highlightBin,highlightMetadataValue:e.highlightMetadataValue,activeTest:e.activeTest,activeMetadataKey:e.activeMetadataKey,testDefs:ee,valueRange:e.valueRange,logScale:e.logScale,isLotStack:lt,aggregationMethod:rt??e.aggregationMethod,lotSize:dt??e.lotSize,dataAxisFlip:Vt,colorbarRangeMode:e.colorbarRangeMode,passFailDisplay:e.passFailDisplay,fallbackFormat:De,interactiveTransform:{rotation:e.rotation??0,flipX:e.flipX??!1,flipY:e.flipY??!1}},{hbinDefs:$,sbinDefs:G,metadataFields:se}),Gt=new Map(m.dies.map((t,n)=>[Ee(t),n]))}Oe();let z=null,fe=null,Ve=null,Kn={},R=null,te=null;function Vn(e){const{kind:t,index:n}=e.variable;C(t==="test"?{plotMode:"value",activeTest:n??0,highlightBin:void 0}:t==="softBin"?{plotMode:"softBin",highlightBin:void 0}:{plotMode:"hardBin",highlightBin:void 0});const o=e.highlight;o.kind==="bin"?(vt(o.dieKeys),C({highlightBin:o.bin})):(o.kind==="region"||o.kind==="dies")&&vt(o.dieKeys)}function Zt(e){Oi(e,{wafer:J,dies:ae,yieldSummary:st.yield,dataCoverage:st.dataCoverage,hbinDefs:$,sbinDefs:G,testDefs:ee,statsSummary:ie,warnings:Yt?oe:[],passBins:It,ringCount:l.ringCount??4,colorScheme:l.colorScheme,fallbackFormat:De,activeFindingId:Ve,findingsFilter:Kn,onFindingsFilterChange:ue,onSaveText:w.onSaveText,metadataFields:se,dieListOptions:w.dieList,onFindingClick:(t,n)=>{Ve===t.id?(Ve=null,vt([]),C({highlightBin:void 0})):(Ve=t.id,Vn(t)),ue()}})}function ue(){z&&Zt(z)}function je(){R&&Zt(R)}function Qt(e,t){he&&(t==="right"||t==="top")&&(e.style.paddingTop="44px")}if(Be?.placement){const e=Be.placement;z=Tt(e),Qt(z,e);const t=S.parentElement,n=S.nextSibling;fe=Pt(S,z,e),t?.insertBefore(fe,n),ue()}else if(ie){const e=Be?.defaultOpen??!he;R=Tt("right"),Qt(R,"right"),R.style.display=e?"block":"none";const t=S.parentElement,n=S.nextSibling;te=Pt(S,R,"right"),t?.insertBefore(te,n),je()}const b=Pn?Sn(W):null;let E=null,B=null,A=null,D=null,_e=null,I=null,Z=null,$e=null,F=null,ne=null,Ge=null;function Ut(){if(!ne||!Ge)return;const e=oe.length,t=e>0;if(ne.style.display=t?"flex":"none",Ge.style.display=t?"":"none",!t)return;const n=Wi(oe[0]),o=`${e} data ${e===1?"warning":"warnings"}`;ne.style.color=n==="error"?x.errText:x.warnText,ne.ariaLabel=n==="error"?`${o} \u2014 the map may be positionally wrong`:o}const jn=24;let we=null,gt=null,qt=null,ht=null,mt=null,yt=null,bt=null;function vt(e){M=new Set(e??[]),de&&de(Ct()),v()}function Ze(){if(!I)return;const e=!!(z??R);I.style.display=ie&&e&&!me?"flex":"none";const t=z??R,n=t?t.style.display!=="none":!1;ie?.hasNotableFindings&&!n?I.style.color=x.findingIndicator:I.dataset.active||(I.style.color=x.icon)}if(he){let Q=function(U){Y=U,o(K,U==="zoom"),o(Ie,U==="pan"),_e&&o(_e,U==="select"),a.style.cursor=U==="pan"?"grab":"crosshair"},qe=function(){we&&(clearTimeout(we),we=null),E&&(E.style.opacity="1")},Je=function(){we=setTimeout(()=>{E&&(E.style.opacity="0.35")},600)};E=document.createElement("div"),E.dataset.wmapToolbar="single",Object.assign(E.style,{position:"absolute",top:"4px",right:"4px",display:"flex",flexDirection:"row",alignItems:"center",flexWrap:"wrap-reverse",justifyContent:"flex-end",maxWidth:"calc(100% - 8px)",background:x.menuBg,border:`1px solid ${x.menuBorder}`,borderRadius:"4px",boxShadow:"0 1px 4px rgba(0,0,0,0.12)",zIndex:ui,opacity:"0.35",transition:"opacity 0.2s ease",pointerEvents:"auto"});const e=Sn(W),t=mi(e),{makeBtn:n,setActive:o,makeSep:i,makeMenuRow:r,makeMenuSection:u,makeDropdown:s,makeCheckMenuBtn:d,closeOpenMenu:c,getOpenMenu:p,setOpenMenu:g}=t;gt=c,qt=p,W.addEventListener("click",c,!0),A=document.createElement("div"),Object.assign(A.style,{display:ze?"none":"flex",alignItems:"center",gap:"0",flexWrap:"wrap",justifyContent:"flex-end"}),E.appendChild(A);const Me=n("download","Download PNG",Gn);A.appendChild(Me),A.appendChild(i());const K=n("zoomMode","Zoom (drag to zoom region)",()=>Q("zoom")),re=n("zoomIn","Zoom in",()=>Ce(a.clientWidth/2,a.clientHeight/2,1.2)),k=n("zoomOut","Zoom out",()=>Ce(a.clientWidth/2,a.clientHeight/2,1/1.2)),V=n("reset","Reset zoom (double-click)",()=>Ue());A.appendChild(K),A.appendChild(re),A.appendChild(k),A.appendChild(V),A.appendChild(i());const Ie=n("pan","Pan (drag to move)",()=>Q("pan"));if(A.appendChild(Ie),_e=n("boxSelect","Select (drag to select dies)",()=>Q("select")),A.appendChild(_e),o(Ie,!0),Ot!=="view-only"){let U=function(f){return f.plotMode!==(l.plotMode??"hardBin")?!1:f.plotMode==="value"?(l.activeTest??0)===(f.activeTest??0):f.plotMode==="metadata"?l.activeMetadataKey===f.activeMetadataKey:!0},We=function(f,y){f.activeTest!==void 0?C({plotMode:f.plotMode,activeTest:f.activeTest,activeMetadataKey:void 0,logScale:f.logScale}):f.activeMetadataKey!==void 0?C({plotMode:f.plotMode,activeTest:void 0,activeMetadataKey:f.activeMetadataKey,passFailDisplay:"off"}):C({plotMode:f.plotMode,activeTest:void 0,activeMetadataKey:void 0,passFailDisplay:"off"}),y.remove(),g(null),Ye(j,!1)};B=document.createElement("div"),Object.assign(B.style,{display:"flex",alignItems:"center",gap:"0",flexWrap:"wrap",justifyContent:"flex-end"}),E.appendChild(B),D=document.createElement("div"),Object.assign(D.style,{display:"flex",alignItems:"center",gap:"0"}),B.appendChild(D),D.appendChild(i());const et=()=>{const f=p();f&&(f.remove(),g(null)),Ye(j,!1)},j=n("mode","Plot mode",()=>{if(p()){et();return}const f=ae,y=m.testDefs,{testEntries:nt,binEntries:ge,stackedEntries:He}=Li(f,y,{includeStacked:m.isLotStack}),Mt=(se??[]).filter(Fe=>Ti(f,Fe.key)).map(Pi),Ae=yi(j.getBoundingClientRect(),nt,ge,He,U,We,{makeMenuRow:r,makeMenuSection:u},l.plotMode??"hardBin",j.ownerDocument.defaultView??window,Mt);Cn(j).appendChild(Ae),g(Ae),Ye(j,!0),Mn(Ae,j,et)});Ye(j,!1);const{btn:Zn,sync:Qn}=xi(t,()=>l.plotMode??"hardBin",()=>l.colorScheme??"default",()=>$t,f=>C({colorScheme:f}));mt=Qn,mt();const Un=Ci(t,()=>{const f=!!m.hasReticle,y=(l.plotMode??"hardBin")==="value",{testNumber:nt}=Et(l.activeTest??0,m.testDefs),ge=it(m.testDefs,nt),He=y&&ge!==void 0&&!Bt(ge),Mt=y&&!He&&(ge?.limitLow!==void 0||ge?.limitHigh!==void 0),Ae=y&&!He&&m.dies.some(Fe=>pi(Fe,nt,ge)!==void 0);return[{label:"Ring boundaries",active:!!l.showRingBoundaries,onClick:()=>C({showRingBoundaries:!l.showRingBoundaries})},{label:"Quadrant lines",active:!!l.showQuadrantBoundaries,onClick:()=>C({showQuadrantBoundaries:!l.showQuadrantBoundaries})},{label:"Die labels",active:!!l.showDieLabels,onClick:()=>C({showDieLabels:!l.showDieLabels})},{label:"Reticle grid",active:!!l.showReticle,enabled:f,onClick:()=>C({showReticle:!l.showReticle})},{label:"XY indicator",active:!!l.showXYIndicator,onClick:()=>C({showXYIndicator:!l.showXYIndicator})},...Di({functionalActive:He,hasLimits:Mt,hasRecorded:Ae,display:Lt(l)},Fe=>C({passFailDisplay:Fe}))]},()=>!!(l.showRingBoundaries||l.showQuadrantBoundaries||l.showDieLabels||l.showReticle||l.showXYIndicator||Lt(l)!=="off")),{btn:qn,sync:Jn}=Si(t,()=>l,f=>C({legendPosition:f}));ht=Jn,ht();const xn=()=>{const{testNumber:f}=Et(l.activeTest??0,ee),y=it(ee,f);return y!==void 0&&!Bt(y)},{btn:ei,sync:ti}=wi(t,()=>({...l,functionalActive:xn()}),f=>C(f));yt=ti,yt();const ni=()=>{const{testNumber:f}=Et(l.activeTest??0,ee),y=it(ee,f);return y!==void 0&&(y.limitLow!==void 0||y.limitHigh!==void 0)},tt=n("specRange","Colorbar range: spec limits",()=>{const f=l.colorbarRangeMode==="data"?"spec":"data";C({colorbarRangeMode:f})});bt=()=>{const f=l.plotMode==="value"&&ni()&&Lt(l)==="off"&&!xn();tt.style.display=f?"":"none";const y=(l.colorbarRangeMode??"spec")==="spec";o(tt,y),tt.ariaLabel=y?"Colorbar range: spec limits (click for data range)":"Colorbar range: data range (click for spec limits)"},bt();const ii=Mi(t,()=>l,f=>C(f));Rn&&D.appendChild(j),D.appendChild(Zn),D.appendChild(ei),D.appendChild(tt),ze||(D.appendChild(i()),D.appendChild(Un),D.appendChild(i()),D.appendChild(qn),D.appendChild(i()),D.appendChild(ii)),ie&&(I=n("findings","Summary panel",()=>{const f=z??R;if(!f)return;const y=f.style.display!=="none";f.style.display=y?"none":"block",o(I,!y),Ze()}),B.appendChild(i()),B.appendChild(I),R?.style.display!=="none"&&o(I,!0),Ze()),Yt&&(Ge=i(),ne=n("warning","Data warnings",()=>{const f=p();if(c(new MouseEvent("click")),f)return;const y=Ii(ne.getBoundingClientRect(),oe);Cn(q).appendChild(y),g(y),Mn(y,ne,()=>c(new MouseEvent("click")))}),Ye(ne,!1),B.appendChild(Ge),B.appendChild(ne),Ut()),Ht&&(B.appendChild(i()),Z=n("expand","Expand (E)",Wt??Jt),B.appendChild(Z)),le&&(B.appendChild(i()),F=n("analysis","Insights",()=>{ct(!me),o(F,me)}),F.dataset.wmapInsightsBtn="1",B.appendChild(F)),Hn&&(B.appendChild(i()),$e=n("help","User guide",()=>vn()),B.appendChild($e))}q.appendChild(E),a.addEventListener("mouseenter",qe),a.addEventListener("mouseleave",Je),E.addEventListener("mouseenter",qe),E.addEventListener("mouseleave",Je)}let Se=null;function Jt(){Se&&(Se.close(),Se=null);const e=fe??te??S;e.style.flex="1",e.style.minWidth="0",e.style.minHeight="0";const t=bi(E?[e,E]:[e],{ownerDocument:W,onClosed:()=>{Se=null,Z&&(Z.style.display="flex"),a.focus({preventScroll:!0})}});t&&(E&&(t.contentWrap.style.position="relative"),Se=t,Z&&(Z.style.display="none"))}function en(e){const t=l.plotMode;if(l={...l,...e},e.plotMode!==void 0&&e.plotMode!==t){H=null;const i=l.plotMode;(i==="hardBin"||i==="softBin")&&!new Set(["default","accessible","custom"]).has(l.colorScheme??"")&&(l={...l,colorScheme:"default"})}Object.keys(e).every(i=>i==="legendPosition")||Oe(),ht?.(),mt?.(),yt?.(),bt?.(),v();const o=e.plotMode!==void 0&&e.plotMode!==t;(e.colorScheme!==void 0||o)&&(ue(),je()),(e.colorScheme!==void 0||o||e.activeTest!==void 0||e.logScale!==void 0||e.colorbarRangeMode!==void 0)&&Xe?.()}function C(e){en(e);const t=Object.keys(e);Tn?.(l,t,classifyChanged(t))}let xt=!1;function wt(){xt||(xt=!0,kt(()=>{xt=!1,v()},_))}function v(){const e=T??void 0,t=m.dies[0],n=t?{x:t.width,y:t.height}:ce.diePitchMm,o=Math.floor(a.clientWidth||a.width),i=!!($?.length||G?.length||m.dies.some(p=>p.hbin!=null||p.sbin!=null)),r=l.legendPosition??"default",u=r==="default"||r==="compact",s=(ce.colorbarWidth??16)+28,d=i&&u?r!=="default"?Math.max(wn,s):o<di?0:o<ri?Math.max(li,s):Math.max(wn,s):void 0,c=si(a,m,{...ce,topClearance:he?jn:0,minRightReserve:d,legendPosition:r,legendOffset:ft,diePitchMm:n,fallbackFormat:De,showAxes:ce.showAxes??T!==null,viewport:e,activeBin:l.plotMode==="metadata"?l.highlightMetadataValue:l.highlightBin,hbinDefs:$,sbinDefs:G,metadataFields:se});pt=c.binLegendRows,ke=c.legendBox??null,H||(H=c.viewport),M.size>0&&_n(),be&&$n()}function _n(){const e=X();if(!e)return;const t=a.getContext("2d"),n=m.hoverPoints,o=m.rectangles[0],i=o?o.width/2*e.ppm:e.ppm*.5,r=o?o.height/2*e.ppm:e.ppm*.5,u=Math.max(1,Math.min(3,i*.08)),s=i-u,d=r-u,c=[];for(const p of M){const g=Gt.get(p);g!==void 0&&c.push({sx:e.originX+n[g].x*e.ppm,sy:e.originY-n[g].y*e.ppm})}if(c.length){t.save(),t.setLineDash([]),t.fillStyle="rgba(0,0,0,0.12)",t.beginPath();for(const{sx:p,sy:g}of c)t.rect(p-s,g-d,s*2,d*2);t.fill(),t.strokeStyle="rgba(255,255,255,0.9)",t.lineWidth=3,t.beginPath();for(const{sx:p,sy:g}of c)t.rect(p-s,g-d,s*2,d*2);t.stroke(),t.strokeStyle="rgba(0,0,0,0.9)",t.lineWidth=1.5,t.beginPath();for(const{sx:p,sy:g}of c)t.rect(p-s,g-d,s*2,d*2);t.stroke(),t.restore()}}function $n(){const e=a.getContext("2d"),t=Math.min(P.x,O.x),n=Math.min(P.y,O.y),o=Math.abs(O.x-P.x),i=Math.abs(O.y-P.y);e.save(),e.fillStyle="rgba(0,0,0,0.08)",e.fillRect(t,n,o,i),e.setLineDash([5,3]),e.strokeStyle="rgba(255,255,255,0.9)",e.lineWidth=3,e.strokeRect(t,n,o,i),e.strokeStyle="rgba(0,0,0,0.9)",e.lineWidth=1.5,e.strokeRect(t,n,o,i),e.restore()}function Gn(){a.toBlob(e=>{e&&Ei(e,w.downloadFilename??"wafermap",w.onSaveImage)})}function tn(e){return H?Math.max(H.ppm*In,Math.min(H.ppm*Wn,e)):e}function Ce(e,t,n){const o=T??H;if(!o)return;const i=tn(o.ppm*n),r=i/o.ppm,u=e-(e-o.originX)*r,s=t-(t-o.originY)*r,d=(H?.snapDist??1)/(i/(H?.ppm??i));T={originX:u,originY:s,ppm:i,snapDist:d},v()}function X(){return T??H}function nn(e){if(e.ctrlKey||e.metaKey){e.preventDefault();const t=a.getBoundingClientRect(),n=e.deltaY<0?1.12:1/1.12;Ce(e.clientX-t.left,e.clientY-t.top,n)}else if(T!==null){e.preventDefault();const t=X(),n=T.snapDist;T={originX:t.originX-e.deltaX,originY:t.originY-e.deltaY,ppm:t.ppm,snapDist:n},v()}}function on(e,t,n){return e>=n.x&&e<n.x+n.w&&t>=n.y&&t<n.y+n.h}function an(e){if(e.button!==0||!X())return;a.focus({preventScroll:!0}),a.setPointerCapture(e.pointerId);const t=a.getBoundingClientRect(),n=e.clientX-t.left,o=e.clientY-t.top;if(ke&&l.legendPosition==="floating"&&on(n,o,ke)){ye=!0,Te={x:n,y:o},ut={...ft};return}if(Pe&&Y!=="pan"){xe=!0,pe=!0,ve={x:n,y:o},Ke={x:X().originX,y:X().originY},a.style.cursor="grabbing";return}if(Y==="zoom"||Y==="select"){be=!0,P=O={x:n,y:o};return}pe=!0,ve={x:n,y:o},Ke={x:X().originX,y:X().originY},a.style.cursor="grabbing"}function sn(e){const t=a.getBoundingClientRect(),n=e.clientX-t.left,o=e.clientY-t.top;if(be){O={x:n,y:o},wt();return}if(ye){const p=n-Te.x,g=o-Te.y;p*p+g*g>16&&(ye=!1,Le=!0,a.style.cursor="grabbing")}if(Le){ft={x:ut.x+(n-Te.x),y:ut.y+(o-Te.y)},wt();return}if(pe){const p=X(),g=T?.snapDist??H?.snapDist??1;T={originX:Ke.x+(n-ve.x),originY:Ke.y+(o-ve.y),ppm:p.ppm,snapDist:g},wt();return}const i=X();if(!i)return;const r=(n-i.originX)/i.ppm,u=(i.originY-o)/i.ppm,d=cn(r,u,i.snapDist)?.die??null,c=pt.find(p=>n>=p.x&&n<p.x+p.w&&o>=p.y&&o<p.y+p.h);if(c){a.style.cursor="pointer",b&&(b.innerHTML=c.label??`Bin ${c.bin}`,b.style.display="block",Dt(b,a,e.clientX,e.clientY)),Ne?.(null,e);return}if(Y==="pan"&&(a.style.cursor=d?"crosshair":"grab"),b)if(d)if(Rt){const p=Rt(d);p===null?b.style.display="none":(typeof p=="string"?b.innerHTML=p:(b.innerHTML="",b.appendChild(p)),b.style.display="block",Dt(b,a,e.clientX,e.clientY))}else b.innerHTML=ai(d,m.plotMode,{testDefs:ee,hbinDefs:$,sbinDefs:G,fallbackFormat:De,aggrMethod:m.aggrMethod,lotSize:m.lotSize,waferMeta:J.metadata,metadataFields:se,activeTest:m.activeTest,reticleConfig:Kt}),b.style.display="block",Dt(b,a,e.clientX,e.clientY);else b.style.display="none";Ne?.(d,e)}function ln(e){const t=a.getBoundingClientRect(),n=e.clientX-t.left,o=e.clientY-t.top,i=e.ctrlKey||e.metaKey;if(b&&(n<0||o<0||n>t.width||o>t.height)&&(b.style.display="none"),be){be=!1,O={x:n,y:o};const s=n-P.x,d=o-P.y,c=X();if(Y==="zoom"){if(s*s+d*d<25)Ce(n,o,2);else if(c){const p=Math.min(P.x,O.x),g=Math.max(P.x,O.x),Q=Math.min(P.y,O.y),Me=Math.max(P.y,O.y),K=g-p,re=Me-Q;if(K>4&&re>4){const k=a.clientWidth,V=a.clientHeight,Ie=k/K,qe=V/re,Je=Math.min(Ie,qe),U=tn(c.ppm*Je),We=U/c.ppm,et=(p+g)/2,j=(Q+Me)/2;T={originX:k/2-(et-c.originX)*We,originY:V/2-(j-c.originY)*We,ppm:U,snapDist:c.snapDist/We}}}v(),a.style.cursor="crosshair";return}if(s*s+d*d<25)St(n,o,i,e);else if(c){const p=(Math.min(P.x,O.x)-c.originX)/c.ppm,g=(Math.max(P.x,O.x)-c.originX)/c.ppm,Q=(c.originY-Math.max(P.y,O.y))/c.ppm,Me=(c.originY-Math.min(P.y,O.y))/c.ppm,K=m.hoverPoints,re=[];for(let k=0;k<K.length;k++)if(K[k].x>=p&&K[k].x<=g&&K[k].y>=Q&&K[k].y<=Me){const V=m.dies[k];V&&re.push(V)}if(i)for(const k of re){const V=Ee(k);M.has(V)?M.delete(V):M.add(V)}else M=new Set(re.map(k=>Ee(k)));de?.(Ct())}v(),a.style.cursor="crosshair";return}if(ye){ye=!1,St(n,o,i,e);return}if(Le){Le=!1,a.style.cursor="grab";return}if(!pe)return;if(pe=!1,xe){xe=!1,a.style.cursor=Pe||Y==="pan"?"grab":"crosshair";return}a.style.cursor=Y==="pan"?"grab":"crosshair";const r=n-ve.x,u=o-ve.y;r*r+u*u<25&&St(n,o,i,e)}function St(e,t,n,o){for(const s of pt)if(e>=s.x&&e<s.x+s.w&&t>=s.y&&t<s.y+s.h){if(typeof s.bin=="number"){const d=l.highlightBin===s.bin?void 0:s.bin;C({highlightBin:d})}else{const d=l.highlightMetadataValue===s.bin?void 0:s.bin;C({highlightMetadataValue:d})}return}if(ke&&on(e,t,ke))return;const i=X();if(!i)return;const u=cn((e-i.originX)/i.ppm,(i.originY-t)/i.ppm,i.snapDist)?.die??null;if(u){Ln?.(u,o);const s=Ee(u);n?M.has(s)?M.delete(s):M.add(s):M=new Set([s]),de?.(Ct()),v()}else n||(M=new Set,de?.([]),v())}function Ct(){const e=[],t=m.hoverPoints;for(let n=0;n<t.length;n++){const o=m.dies[n];o&&M.has(Ee(o))&&e.push(o)}return e}function rn(){b&&ot(W),Ne?.(null,new MouseEvent("mouseleave")),a.style.cursor=Y==="pan"?"grab":"crosshair"}function dn(){pe=!1,xe=!1,be=!1,ye=!1,Le=!1,b&&ot(W),Ne?.(null,new MouseEvent("mouseleave")),a.style.cursor=Y==="pan"?"grab":"crosshair",v()}function cn(e,t,n){const o=m.hoverPoints,i=m.rectangles;for(let d=0;d<i.length;d++){const c=i[d];if(Math.abs(e-c.x)<=c.width/2&&Math.abs(t-c.y)<=c.height/2){const p=m.dies[d];return p?{die:p,index:d}:null}}let r=null,u=-1,s=n*n;for(let d=0;d<o.length;d++){const c=o[d].x-e,p=o[d].y-t,g=c*c+p*p;g<s&&(s=g,r=m.dies[d]??null,u=d)}return r?{die:r,index:u}:null}const pn=new _.ResizeObserver(()=>{H=null,T=null,v()});pn.observe(a),w.height==null&&kn<=0&&kt(()=>kt(()=>{N.clientHeight>0||console.warn("[wafermap] The map container has zero height, so the map cannot render. renderWaferMap fills its container \u2014 give the container a resolved height: an explicit CSS `height` (e.g. 600px), a height-resolved flex/grid parent, or `position:absolute; inset:0`. Alternatively pass `{ height: 600 }` in the render options and the library will size it for you.")}));let Re=_.matchMedia(`(resolution: ${_.devicePixelRatio}dppx)`);const Qe=()=>{Re.removeEventListener("change",Qe),Re=_.matchMedia(`(resolution: ${_.devicePixelRatio}dppx)`),Re.addEventListener("change",Qe),v()};Re.addEventListener("change",Qe);const fn=_.matchMedia("(prefers-color-scheme: dark)"),un=()=>v();fn.addEventListener("change",un);const gn=()=>{b&&ot(W)};_.addEventListener("blur",gn);function hn(e){if(e.key==="Escape"&&M.size>0&&(M=new Set,de?.([]),v()),(e.key==="e"||e.key==="E")&&Ot!=="view-only"&&Ht&&!me&&(e.stopPropagation(),(Wt??Jt)()),(e.ctrlKey||e.metaKey)&&(e.key==="="||e.key==="+"?(e.preventDefault(),Ce(a.clientWidth/2,a.clientHeight/2,1.2)):e.key==="-"?(e.preventDefault(),Ce(a.clientWidth/2,a.clientHeight/2,1/1.2)):e.key==="0"&&(e.preventDefault(),Ue())),!e.ctrlKey&&!e.metaKey&&!e.shiftKey){const n=X();if(n){const o=T?.snapDist??H?.snapDist??1;let i=0,r=0;e.key==="ArrowLeft"&&(i=20,e.preventDefault()),e.key==="ArrowRight"&&(i=-20,e.preventDefault()),e.key==="ArrowUp"&&(r=20,e.preventDefault()),e.key==="ArrowDown"&&(r=-20,e.preventDefault()),(i||r)&&(T={originX:n.originX+i,originY:n.originY+r,ppm:n.ppm,snapDist:o},v())}e.key===" "&&!Pe&&(e.preventDefault(),Pe=!0,Y!=="pan"&&(a.style.cursor="grab"))}}function mn(e){e.key===" "&&(Pe=!1,xe&&(pe=!1,xe=!1),a.style.cursor=Y==="pan"?"grab":"crosshair")}a.style.cursor="grab",a.setAttribute("tabindex","0"),a.addEventListener("wheel",nn,{passive:!1}),a.addEventListener("pointerdown",an),a.addEventListener("pointermove",sn),a.addEventListener("pointerup",ln),a.addEventListener("pointerleave",rn),a.addEventListener("pointercancel",dn);const yn=()=>Ue();a.addEventListener("dblclick",yn),a.addEventListener("keydown",hn),a.addEventListener("keyup",mn);const bn=e=>{e.stopPropagation()};a.addEventListener("click",bn),a.clientWidth,v(),Xe?.();function Ue(){H=null,T=null,v()}function vn(){import("./userGuideHtml.js").then(e=>vi({buildWaferMap:ci,renderWaferMap,renderWaferGallery:void 0,analyzeWaferMap:fi},e.USER_GUIDE_HTML,An,N))}return{setDies(e){ae=e,Oe(),v(),z&&ue()},setResult(e){st=e,J=e.wafer,ae=e.dies,$=e.hbinDefs,G=e.sbinDefs,ee=e.testDefs,se=e.metadataFields,Nt=e.reticles?.length?e.reticles:void 0,Kt=e.reticleConfig,Vt=e.view?.dataAxisFlip,lt=e.isLotStack,rt=e.aggrMethod,dt=e.lotSize,Nn(),Oe(),v(),z&&ue()},setOptions(e){en(e)},getOptions(){return{...l}},resetZoom:Ue,setSelection(e){M=new Set(e.map(t=>Ee(t))),v()},clearSelection(){M=new Set,de?.([]),v()},setFallbackFormat(e){De=e,Oe(),v()},setStatsSummary(e){if(ie=e,Xt(),Ut(),z)ue();else if(R)je();else if(e&&!Be?.placement){const t=Be?.defaultOpen??!he;R=Tt("right"),R.style.display=t?"block":"none";const n=S.parentElement,o=S.nextSibling;te=Pt(S,R,"right"),n?.insertBefore(te,o),je()}Ze()},setSummaryVisible(e){I&&(I.style.display=e?"flex":"none")},setViewControlsVisible(e){B&&(B.style.display=e?"flex":"none")},setExpandVisible(e){Z&&(Z.style.display=e?"flex":"none")},setHelpButtonVisible(e){$e&&($e.style.display=e?"flex":"none")},setMetadataBadgeVisible(e){jt=!e,L&&(L.el.style.display=e&&!me?"":"none")},openUserGuide:vn,setInsightsOpen(e){ct(e),F&&(e?(F.dataset.active="1",F.style.background=x.bgActive,F.style.color=x.iconActive):(delete F.dataset.active,F.style.background="transparent",F.style.color=x.icon))},closeSummaryPanel(){const e=z??R;!e||e.style.display==="none"||(e.style.display="none",I&&(delete I.dataset.active,I.style.background="transparent",I.style.color=x.icon))},setTooltipParent(e){b&&hi(e)},getActiveLegend(){const e=l.plotMode;if(e==="metadata"){const i=l.activeMetadataKey;if(!i)return null;const r=se?.find(s=>s.key===i),u=[...new Set(ae.map(s=>s.metadata?.[i]).filter(s=>s!=null&&(typeof s=="string"||typeof s=="number"||typeof s=="boolean")).map(String))].sort();return u.length?u.map((s,d)=>{const c=r?.values?.find(g=>g.value===s),p=c?.color??Fi(d);return{bin:s,name:c?.label??s,color:p}}):null}if(e!=="hardBin"&&e!=="softBin")return null;const t=e==="hardBin",n=t?$:G,o=[...new Set(ae.map(i=>t?i.hbin:i.sbin).filter(i=>i!==void 0))].sort((i,r)=>i-r);return o.length?o.map(i=>{const r=n?.find(s=>s.bin===i),u=r?.color??(t?Hi(i):Ai(i));return{bin:i,name:r?.name??`Bin ${i}`,color:u}}):null},destroy(){Se?.close(),we&&clearTimeout(we),qt?.()?.remove(),gt&&W.removeEventListener("click",gt,!0),a.removeEventListener("wheel",nn),a.removeEventListener("pointerdown",an),a.removeEventListener("pointermove",sn),a.removeEventListener("pointerup",ln),a.removeEventListener("pointerleave",rn),a.removeEventListener("pointercancel",dn),a.removeEventListener("dblclick",yn),a.removeEventListener("keydown",hn),a.removeEventListener("keyup",mn),a.removeEventListener("click",bn),pn.disconnect(),Re.removeEventListener("change",Qe),fn.removeEventListener("change",un),_.removeEventListener("blur",gn),Xn(),b&&ot(W),E?.remove(),fe&&(fe.parentElement?.insertBefore(S,fe),fe.remove()),te&&(te.parentElement?.insertBefore(S,te),te.remove()),S.remove(),a.style.cursor="",le?.destroy(),L?.destroy(),q.remove()}}}
1
+ import{buildView as oi,buildHoverText as ai,findTestDef as it,resolveTestNumber as Et}from"../renderer/buildView.js";import{toCanvas as si,BIN_LEGEND_W as wn,BIN_LEGEND_W_COMPACT as li,BIN_LEGEND_ADAPT_COMPACT as ri,BIN_LEGEND_ADAPT_FLOATING as di}from"./toCanvas.js";import{buildWaferMap as ci,getTestPassStatus as pi,isParametricTest as Bt}from"../renderer/buildWaferMap.js";import{analyzeWaferMap as fi}from"../stats/analyzeWaferMap.js";import{CLR as w,Z_BASE as ui,applyOverlayZ as gi,getTooltip as Sn,hideTooltip as ot,reparentTooltip as hi,positionTooltip as Dt,createToolbarHelpers as mi,buildModeMenuEl as yi,openReparentedModal as bi,openUserGuideWindow as vi,makePaletteBtn as xi,makeLogScaleBtn as wi,makeLegendStyleBtn as Si,makeOverlaysBtn as Ci,makeOrientationBtn as Mi,overlayRootFor as Cn,saveImageBlob as Ei,markMenuTrigger as Ye,wireMenuA11y as Mn,wireExpandToggle as Bi,nextFrame as kt,passFailMenuRows as Di,requestedPassFailDisplay as Lt,logWmapVersionOnce as ki,buildDataModeEntries as Li,metadataKeyHasData as Ti,metadataModeEntry as Pi}from"./toolbar.js";import{createSummaryPanelEl as Tt,wrapWithSummaryPanel as Pt,renderWaferSummaryContent as Oi}from"./summaryPanel.js";import{collectWarnings as Ri,buildWarningsMenuEl as Ii,severityOf as Wi}from"./warnings.js";import"../stats/facets.js";import{ICONS as En}from"./icons.js";import{hardBinColor as Hi,softBinColor as Ai,metadataValueColor as Fi}from"../renderer/colorMap.js";import{createInsightsTab as Yi}from"./insightsTab.js";import{createMetadataBadge as zi}from"./metadataBadge.js";import{getDieKey as Ee,hasPosition as Bn,isPositionedDie as Xi}from"../core/dies.js";import{buildDieListSection as Ni}from"./dieList.js";import{buildMaplessSummary as Ki}from"./maplessSummary.js";const Dn=new Set(["colorScheme","rotation","flipX","flipY","showDieLabels","showPartialDies","showRingBoundaries","showQuadrantBoundaries","showReticle","showXYIndicator","ringCount","legendPosition","logScale","colorbarRangeMode"]);export function classifyChanged(N){const m=N.some(g=>Dn.has(g)),S=N.some(g=>!Dn.has(g));return m&&S?"mixed":m?"preference":"state"}export function renderWaferMap(N,m,S={}){ki();const g=N.ownerDocument,K=g.defaultView??window;K.getComputedStyle(N).position==="static"&&(N.style.position="relative");const kn=N.clientHeight;S.height!=null&&(N.style.height=typeof S.height=="number"?`${S.height}px`:S.height);const at=m.dataCoverage?m.dataCoverage.unpositionedDies:m.dies.filter(e=>!Bn(e)).length,ze=(m.dataCoverage?m.dataCoverage.totalDies:m.dies.length-at)===0&&at>0,q=g.createElement("div");Object.assign(q.style,{position:"relative",width:"100%",height:"100%"}),S.maxSize!=null&&(q.style.maxWidth=`${S.maxSize}px`,q.style.maxHeight=`${S.maxSize}px`),N.appendChild(q);const C=g.createElement("div");Object.assign(C.style,{position:"relative",width:"100%",height:"100%"});const a=g.createElement("canvas");Object.assign(a.style,{width:"100%",height:"100%",display:"block"}),C.appendChild(a),q.appendChild(C);let Xe=null;if(at>0){let n=function(){if(t){const u=Ni(e,m.testDefs,{...S.dieList,onSaveText:S.onSaveText,waferMetadata:J.metadata,metadataFields:se,ownerDocument:g});if(u)return u}const i=it(m.testDefs,l.activeTest??0),r=Bt(i)?l.logScale??i?.logScale??!1:!1;return Ki(e,m.testDefs,{plotMode:l.plotMode??"hardBin",activeTest:l.activeTest,hbinDefs:$,sbinDefs:G,colorScheme:l.colorScheme,logScale:r,colorbarRangeMode:l.colorbarRangeMode,valueRangeDies:m.dies})},o=function(i){const r=g.createElement("button");return r.type="button",Object.assign(r.style,{fontSize:"10px",padding:"2px 6px",borderRadius:"4px",flexShrink:"0",border:`1px solid ${w.menuBorder}`,background:w.menuBg,color:w.text,cursor:"pointer"}),r.textContent=t?"View chart":"View die list",r.addEventListener("click",u=>{u.stopPropagation(),t=!t,r.textContent=t?"View chart":"View die list",i()}),r};const e=m.dies.filter(i=>!Bn(i));let t=!1;if(ze){const i=g.createElement("div");Object.assign(i.style,{position:"absolute",inset:"0",background:w.panelBg,padding:"12px",paddingTop:S.showToolbar??!0?"44px":"12px",boxSizing:"border-box",overflow:"hidden",display:"flex",flexDirection:"column",gap:"8px",zIndex:"1"});const r=g.createElement("div");Object.assign(r.style,{display:"flex",justifyContent:"space-between",alignItems:"flex-start",gap:"8px"});const u=g.createElement("span");Object.assign(u.style,{fontSize:"11px",color:w.label,lineHeight:"1.4"}),u.textContent="No die position data for this wafer.",r.appendChild(u);const s=g.createElement("div");Object.assign(s.style,{flex:"1",minHeight:"0",overflow:"auto",display:"flex",flexDirection:"column"}),r.appendChild(o(()=>s.replaceChildren(n()))),i.appendChild(r),i.appendChild(s),C.appendChild(i),Xe=()=>{t||s.replaceChildren(n())}}else{const i=g.createElement("div");Object.assign(i.style,{position:"absolute",left:"0",right:"0",bottom:"0",zIndex:"3",background:w.panelBg,borderTop:`1px solid ${w.menuBorder}`,fontSize:"11px",color:w.text,cursor:"pointer",padding:"4px 8px",display:"flex",alignItems:"center",justifyContent:"space-between",gap:"8px"});const r=g.createElement("span");r.textContent=`+${e.length} ${e.length===1?"die":"dies"} without position data`,i.appendChild(r);const u=g.createElement("span");u.textContent="\u25BE",Object.assign(u.style,{fontSize:"12px",lineHeight:"1",color:w.label,flexShrink:"0"}),i.appendChild(u),i.setAttribute("aria-expanded","false"),i.setAttribute("aria-label",`${e.length} dies without position data. Click to view.`);let s=null,d=null;Bi(i,c=>{if(u.textContent=c?"\u25B4":"\u25BE",i.setAttribute("aria-expanded",String(c)),c){s=g.createElement("div");const p=i.getBoundingClientRect().height||28;Object.assign(s.style,{position:"absolute",left:"0",right:"0",bottom:`${p}px`,top:"20%",zIndex:"2",background:w.panelBg,borderTop:`1px solid ${w.menuBorder}`,padding:"8px",boxSizing:"border-box",display:"flex",flexDirection:"column",gap:"8px"}),s.addEventListener("click",Q=>Q.stopPropagation());const h=g.createElement("div");Object.assign(h.style,{display:"flex",justifyContent:"flex-end"}),h.appendChild(o(()=>{d&&d.replaceChildren(n())})),s.appendChild(h),d=g.createElement("div"),Object.assign(d.style,{flex:"1",minHeight:"0",overflow:"auto",display:"flex",flexDirection:"column"}),d.appendChild(n()),s.appendChild(d),C.appendChild(s)}else s&&(s.remove(),s=null,d=null)}),C.appendChild(i),Xe=()=>{d&&!t&&d.replaceChildren(n())}}}const{onHover:Ne,onClick:Ln,onSelect:de,onViewOptionsChange:Tn,showTooltip:Pn=!0,showToolbar:he=!0,showMetadataBadge:On=!0,toolbarControls:Ot="full",showPlotModeSelector:Rn=!0,minZoom:In=.4,maxZoom:Wn=20,summaryPanel:Be,renderTooltip:Rt,passBins:It=[1],showHelpButton:Hn=!1,userGuideExtension:An,onExpand:Wt,showExpandButton:Ht=!0,zIndex:Fn,insights:At,warnings:Ft,viewOptions:Yn={},...ce}=S,zn=At?.enabled??!1,Yt=Ft?.display??!0,Xn=gi(Fn);let De=ce.fallbackFormat,ie=S.statsSummary,oe=[],zt=!1;function Xt(){const e=Ri({result:m,statsSummary:ie}),t=e.length!==oe.length||e.some((n,o)=>n.code!==oe[o]?.code||n.message!==oe[o]?.message);oe=e,(t||!zt)&&(zt=!0,Ft?.onWarning?.(e))}Xt();let st=m,J=m.wafer,ae=m.dies,E=new Set,$=m.hbinDefs,G=m.sbinDefs,ee=m.testDefs,se=m.metadataFields,Nt=m.reticles?.length?m.reticles:void 0,Kt=m.reticleConfig,Vt=m.view?.dataAxisFlip,lt=m.isLotStack??!1,rt=m.aggrMethod,dt=m.lotSize,jt=!1,T=null;On&&(T=zi(J.metadata,{lotStack:_t(),ownerDocument:g}),T.isEmpty()||C.appendChild(T.el));function _t(){return lt?{lotSize:dt??1,aggrMethod:rt}:void 0}function Nn(){if(!T)return;T.update(J.metadata,_t());const e=T.el.isConnected;T.isEmpty()&&e?T.el.remove():!T.isEmpty()&&!e&&C.appendChild(T.el)}const $t=[...$??[],...G??[]].some(e=>e.color);let l={plotMode:"hardBin",colorScheme:$t?"custom":"default",showDieLabels:!1,showPartialDies:!0,showRingBoundaries:!1,showQuadrantBoundaries:!1,showReticle:!1,showXYIndicator:!1,ringCount:4,rotation:0,flipX:!1,flipY:!1,legendPosition:ce.legendPosition??"default",...Yn},le=null,me=!1;zn&&(le=Yi({getItems:()=>[{wafer:J,dies:ae,hbinDefs:$,sbinDefs:G,testDefs:ee,label:String(J.metadata?.waferId??""),statsSummary:ie}],getColorSchemeName:()=>l.colorScheme??"default",passBins:It,getRingCount:()=>l.ringCount??4,onSaveImage:S.onSaveImage,onSaveText:S.onSaveText,defaultView:At?.defaultView,backTab:{label:"Map",onBack:()=>ct(!1)},ownerDocument:g}),Object.assign(le.el.style,{position:"absolute",inset:"0",background:w.panelBg,overflowY:"auto",paddingTop:he?"44px":"0"}),q.appendChild(le.el));function ct(e){le&&(me=e,le.el.style.display=e?"flex":"none",A&&(A.style.display=e||ze?"none":"flex"),k&&(k.style.display=e?"none":"flex"),Z&&(Z.style.display=e?"none":"flex"),T&&(T.el.style.display=e||jt?"none":""),Ze(),F&&(F.innerHTML=e?En.wafer:En.analysis,F.ariaLabel=e?"Back to wafer view":"Insights"),e&&le.render())}let y,Gt,H=null,P=null,pt=[],ke=null,ft=ce.legendOffset??{x:0,y:0},Le=!1,ye=!1,Te={x:0,y:0},ut={x:0,y:0},pe=!1,be=!1,Y="pan",ve={x:0,y:0},Ke={x:0,y:0},O={x:0,y:0},R={x:0,y:0},Pe=!1,xe=!1;function Oe(){const e=l;y=oi(J,ae.filter(Xi),{plotMode:e.plotMode,colorScheme:e.colorScheme,showDieLabels:e.showDieLabels,showPartialDies:e.showPartialDies,showRingBoundaries:e.showRingBoundaries,showQuadrantBoundaries:e.showQuadrantBoundaries,showReticle:e.showReticle,showXYIndicator:e.showXYIndicator,reticles:Nt,ringCount:e.ringCount,highlightBin:e.highlightBin,highlightMetadataValue:e.highlightMetadataValue,activeTest:e.activeTest,activeMetadataKey:e.activeMetadataKey,testDefs:ee,valueRange:e.valueRange,logScale:e.logScale,isLotStack:lt,aggregationMethod:rt??e.aggregationMethod,lotSize:dt??e.lotSize,dataAxisFlip:Vt,colorbarRangeMode:e.colorbarRangeMode,passFailDisplay:e.passFailDisplay,fallbackFormat:De,interactiveTransform:{rotation:e.rotation??0,flipX:e.flipX??!1,flipY:e.flipY??!1}},{hbinDefs:$,sbinDefs:G,metadataFields:se}),Gt=new Map(y.dies.map((t,n)=>[Ee(t),n]))}Oe();let z=null,fe=null,Ve=null,Kn={},I=null,te=null;function Vn(e){const{kind:t,index:n}=e.variable;M(t==="test"?{plotMode:"value",activeTest:n??0,highlightBin:void 0}:t==="softBin"?{plotMode:"softBin",highlightBin:void 0}:{plotMode:"hardBin",highlightBin:void 0});const o=e.highlight;o.kind==="bin"?(vt(o.dieKeys),M({highlightBin:o.bin})):(o.kind==="region"||o.kind==="dies")&&vt(o.dieKeys)}function Zt(e){Oi(e,{wafer:J,dies:ae,yieldSummary:st.yield,dataCoverage:st.dataCoverage,hbinDefs:$,sbinDefs:G,testDefs:ee,statsSummary:ie,warnings:Yt?oe:[],passBins:It,ringCount:l.ringCount??4,colorScheme:l.colorScheme,fallbackFormat:De,activeFindingId:Ve,findingsFilter:Kn,onFindingsFilterChange:ue,onSaveText:S.onSaveText,metadataFields:se,dieListOptions:S.dieList,onFindingClick:(t,n)=>{Ve===t.id?(Ve=null,vt([]),M({highlightBin:void 0})):(Ve=t.id,Vn(t)),ue()}})}function ue(){z&&Zt(z)}function je(){I&&Zt(I)}function Qt(e,t){he&&(t==="right"||t==="top")&&(e.style.paddingTop="44px")}if(Be?.placement){const e=Be.placement;z=Tt(e,g),Qt(z,e);const t=C.parentElement,n=C.nextSibling;fe=Pt(C,z,e),t?.insertBefore(fe,n),ue()}else if(ie){const e=Be?.defaultOpen??!he;I=Tt("right",g),Qt(I,"right"),I.style.display=e?"block":"none";const t=C.parentElement,n=C.nextSibling;te=Pt(C,I,"right"),t?.insertBefore(te,n),je()}const v=Pn?Sn(g):null;let B=null,D=null,A=null,k=null,_e=null,W=null,Z=null,$e=null,F=null,ne=null,Ge=null;function Ut(){if(!ne||!Ge)return;const e=oe.length,t=e>0;if(ne.style.display=t?"flex":"none",Ge.style.display=t?"":"none",!t)return;const n=Wi(oe[0]),o=`${e} data ${e===1?"warning":"warnings"}`;ne.style.color=n==="error"?w.errText:w.warnText,ne.ariaLabel=n==="error"?`${o} \u2014 the map may be positionally wrong`:o}const jn=24;let we=null,gt=null,qt=null,ht=null,mt=null,yt=null,bt=null;function vt(e){E=new Set(e??[]),de&&de(Ct()),x()}function Ze(){if(!W)return;const e=!!(z??I);W.style.display=ie&&e&&!me?"flex":"none";const t=z??I,n=t?t.style.display!=="none":!1;ie?.hasNotableFindings&&!n?W.style.color=w.findingIndicator:W.dataset.active||(W.style.color=w.icon)}if(he){let Q=function(U){Y=U,o(V,U==="zoom"),o(Ie,U==="pan"),_e&&o(_e,U==="select"),a.style.cursor=U==="pan"?"grab":"crosshair"},qe=function(){we&&(clearTimeout(we),we=null),B&&(B.style.opacity="1")},Je=function(){we=setTimeout(()=>{B&&(B.style.opacity="0.35")},600)};B=g.createElement("div"),B.dataset.wmapToolbar="single",Object.assign(B.style,{position:"absolute",top:"4px",right:"4px",display:"flex",flexDirection:"row",alignItems:"center",flexWrap:"wrap-reverse",justifyContent:"flex-end",maxWidth:"calc(100% - 8px)",background:w.menuBg,border:`1px solid ${w.menuBorder}`,borderRadius:"4px",boxShadow:"0 1px 4px rgba(0,0,0,0.12)",zIndex:ui,opacity:"0.35",transition:"opacity 0.2s ease",pointerEvents:"auto"});const e=Sn(g),t=mi(e),{makeBtn:n,setActive:o,makeSep:i,makeMenuRow:r,makeMenuSection:u,makeDropdown:s,makeCheckMenuBtn:d,closeOpenMenu:c,getOpenMenu:p,setOpenMenu:h}=t;gt=c,qt=p,g.addEventListener("click",c,!0),A=g.createElement("div"),Object.assign(A.style,{display:ze?"none":"flex",alignItems:"center",gap:"0",flexWrap:"wrap",justifyContent:"flex-end"}),B.appendChild(A);const Me=n("download","Download PNG",Gn);A.appendChild(Me),A.appendChild(i());const V=n("zoomMode","Zoom (drag to zoom region)",()=>Q("zoom")),re=n("zoomIn","Zoom in",()=>Ce(a.clientWidth/2,a.clientHeight/2,1.2)),L=n("zoomOut","Zoom out",()=>Ce(a.clientWidth/2,a.clientHeight/2,1/1.2)),j=n("reset","Reset zoom (double-click)",()=>Ue());A.appendChild(V),A.appendChild(re),A.appendChild(L),A.appendChild(j),A.appendChild(i());const Ie=n("pan","Pan (drag to move)",()=>Q("pan"));if(A.appendChild(Ie),_e=n("boxSelect","Select (drag to select dies)",()=>Q("select")),A.appendChild(_e),o(Ie,!0),Ot!=="view-only"){let U=function(f){return f.plotMode!==(l.plotMode??"hardBin")?!1:f.plotMode==="value"?(l.activeTest??0)===(f.activeTest??0):f.plotMode==="metadata"?l.activeMetadataKey===f.activeMetadataKey:!0},We=function(f,b){f.activeTest!==void 0?M({plotMode:f.plotMode,activeTest:f.activeTest,activeMetadataKey:void 0,logScale:f.logScale}):f.activeMetadataKey!==void 0?M({plotMode:f.plotMode,activeTest:void 0,activeMetadataKey:f.activeMetadataKey,passFailDisplay:"off"}):M({plotMode:f.plotMode,activeTest:void 0,activeMetadataKey:void 0,passFailDisplay:"off"}),b.remove(),h(null),Ye(_,!1)};D=g.createElement("div"),Object.assign(D.style,{display:"flex",alignItems:"center",gap:"0",flexWrap:"wrap",justifyContent:"flex-end"}),B.appendChild(D),k=g.createElement("div"),Object.assign(k.style,{display:"flex",alignItems:"center",gap:"0"}),D.appendChild(k),k.appendChild(i());const et=()=>{const f=p();f&&(f.remove(),h(null)),Ye(_,!1)},_=n("mode","Plot mode",()=>{if(p()){et();return}const f=ae,b=y.testDefs,{testEntries:nt,binEntries:ge,stackedEntries:He}=Li(f,b,{includeStacked:y.isLotStack}),Mt=(se??[]).filter(Fe=>Ti(f,Fe.key)).map(Pi),Ae=yi(_.getBoundingClientRect(),nt,ge,He,U,We,{makeMenuRow:r,makeMenuSection:u},l.plotMode??"hardBin",_.ownerDocument.defaultView??window,Mt);Cn(_).appendChild(Ae),h(Ae),Ye(_,!0),Mn(Ae,_,et)});Ye(_,!1);const{btn:Zn,sync:Qn}=xi(t,()=>l.plotMode??"hardBin",()=>l.colorScheme??"default",()=>$t,f=>M({colorScheme:f}));mt=Qn,mt();const Un=Ci(t,()=>{const f=!!y.hasReticle,b=(l.plotMode??"hardBin")==="value",{testNumber:nt}=Et(l.activeTest??0,y.testDefs),ge=it(y.testDefs,nt),He=b&&ge!==void 0&&!Bt(ge),Mt=b&&!He&&(ge?.limitLow!==void 0||ge?.limitHigh!==void 0),Ae=b&&!He&&y.dies.some(Fe=>pi(Fe,nt,ge)!==void 0);return[{label:"Ring boundaries",active:!!l.showRingBoundaries,onClick:()=>M({showRingBoundaries:!l.showRingBoundaries})},{label:"Quadrant lines",active:!!l.showQuadrantBoundaries,onClick:()=>M({showQuadrantBoundaries:!l.showQuadrantBoundaries})},{label:"Die labels",active:!!l.showDieLabels,onClick:()=>M({showDieLabels:!l.showDieLabels})},{label:"Reticle grid",active:!!l.showReticle,enabled:f,onClick:()=>M({showReticle:!l.showReticle})},{label:"XY indicator",active:!!l.showXYIndicator,onClick:()=>M({showXYIndicator:!l.showXYIndicator})},...Di({functionalActive:He,hasLimits:Mt,hasRecorded:Ae,display:Lt(l)},Fe=>M({passFailDisplay:Fe}))]},()=>!!(l.showRingBoundaries||l.showQuadrantBoundaries||l.showDieLabels||l.showReticle||l.showXYIndicator||Lt(l)!=="off")),{btn:qn,sync:Jn}=Si(t,()=>l,f=>M({legendPosition:f}));ht=Jn,ht();const xn=()=>{const{testNumber:f}=Et(l.activeTest??0,ee),b=it(ee,f);return b!==void 0&&!Bt(b)},{btn:ei,sync:ti}=wi(t,()=>({...l,functionalActive:xn()}),f=>M(f));yt=ti,yt();const ni=()=>{const{testNumber:f}=Et(l.activeTest??0,ee),b=it(ee,f);return b!==void 0&&(b.limitLow!==void 0||b.limitHigh!==void 0)},tt=n("specRange","Colorbar range: spec limits",()=>{const f=l.colorbarRangeMode==="data"?"spec":"data";M({colorbarRangeMode:f})});bt=()=>{const f=l.plotMode==="value"&&ni()&&Lt(l)==="off"&&!xn();tt.style.display=f?"":"none";const b=(l.colorbarRangeMode??"spec")==="spec";o(tt,b),tt.ariaLabel=b?"Colorbar range: spec limits (click for data range)":"Colorbar range: data range (click for spec limits)"},bt();const ii=Mi(t,()=>l,f=>M(f));Rn&&k.appendChild(_),k.appendChild(Zn),k.appendChild(ei),k.appendChild(tt),ze||(k.appendChild(i()),k.appendChild(Un),k.appendChild(i()),k.appendChild(qn),k.appendChild(i()),k.appendChild(ii)),ie&&(W=n("findings","Summary panel",()=>{const f=z??I;if(!f)return;const b=f.style.display!=="none";f.style.display=b?"none":"block",o(W,!b),Ze()}),D.appendChild(i()),D.appendChild(W),I?.style.display!=="none"&&o(W,!0),Ze()),Yt&&(Ge=i(),ne=n("warning","Data warnings",()=>{const f=p();if(c(new MouseEvent("click")),f)return;const b=Ii(ne.getBoundingClientRect(),oe,K);Cn(q).appendChild(b),h(b),Mn(b,ne,()=>c(new MouseEvent("click")))}),Ye(ne,!1),D.appendChild(Ge),D.appendChild(ne),Ut()),Ht&&(D.appendChild(i()),Z=n("expand","Expand (E)",Wt??Jt),D.appendChild(Z)),le&&(D.appendChild(i()),F=n("analysis","Insights",()=>{ct(!me),o(F,me)}),F.dataset.wmapInsightsBtn="1",D.appendChild(F)),Hn&&(D.appendChild(i()),$e=n("help","User guide",()=>vn()),D.appendChild($e))}q.appendChild(B),a.addEventListener("mouseenter",qe),a.addEventListener("mouseleave",Je),B.addEventListener("mouseenter",qe),B.addEventListener("mouseleave",Je)}let Se=null;function Jt(){Se&&(Se.close(),Se=null);const e=fe??te??C;e.style.flex="1",e.style.minWidth="0",e.style.minHeight="0";const t=bi(B?[e,B]:[e],{ownerDocument:g,onClosed:()=>{Se=null,Z&&(Z.style.display="flex"),a.focus({preventScroll:!0})}});t&&(B&&(t.contentWrap.style.position="relative"),Se=t,Z&&(Z.style.display="none"))}function en(e){const t=l.plotMode;if(l={...l,...e},e.plotMode!==void 0&&e.plotMode!==t){H=null;const i=l.plotMode;(i==="hardBin"||i==="softBin")&&!new Set(["default","accessible","custom"]).has(l.colorScheme??"")&&(l={...l,colorScheme:"default"})}Object.keys(e).every(i=>i==="legendPosition")||Oe(),ht?.(),mt?.(),yt?.(),bt?.(),x();const o=e.plotMode!==void 0&&e.plotMode!==t;(e.colorScheme!==void 0||o)&&(ue(),je()),(e.colorScheme!==void 0||o||e.activeTest!==void 0||e.logScale!==void 0||e.colorbarRangeMode!==void 0)&&Xe?.()}function M(e){en(e);const t=Object.keys(e);Tn?.(l,t,classifyChanged(t))}let xt=!1;function wt(){xt||(xt=!0,kt(()=>{xt=!1,x()},K))}function x(){const e=P??void 0,t=y.dies[0],n=t?{x:t.width,y:t.height}:ce.diePitchMm,o=Math.floor(a.clientWidth||a.width),i=!!($?.length||G?.length||y.dies.some(p=>p.hbin!=null||p.sbin!=null)),r=l.legendPosition??"default",u=r==="default"||r==="compact",s=(ce.colorbarWidth??16)+28,d=i&&u?r!=="default"?Math.max(wn,s):o<di?0:o<ri?Math.max(li,s):Math.max(wn,s):void 0,c=si(a,y,{...ce,topClearance:he?jn:0,minRightReserve:d,legendPosition:r,legendOffset:ft,diePitchMm:n,fallbackFormat:De,showAxes:ce.showAxes??P!==null,viewport:e,activeBin:l.plotMode==="metadata"?l.highlightMetadataValue:l.highlightBin,hbinDefs:$,sbinDefs:G,metadataFields:se});pt=c.binLegendRows,ke=c.legendBox??null,H||(H=c.viewport),E.size>0&&_n(),be&&$n()}function _n(){const e=X();if(!e)return;const t=a.getContext("2d"),n=y.hoverPoints,o=y.rectangles[0],i=o?o.width/2*e.ppm:e.ppm*.5,r=o?o.height/2*e.ppm:e.ppm*.5,u=Math.max(1,Math.min(3,i*.08)),s=i-u,d=r-u,c=[];for(const p of E){const h=Gt.get(p);h!==void 0&&c.push({sx:e.originX+n[h].x*e.ppm,sy:e.originY-n[h].y*e.ppm})}if(c.length){t.save(),t.setLineDash([]),t.fillStyle="rgba(0,0,0,0.12)",t.beginPath();for(const{sx:p,sy:h}of c)t.rect(p-s,h-d,s*2,d*2);t.fill(),t.strokeStyle="rgba(255,255,255,0.9)",t.lineWidth=3,t.beginPath();for(const{sx:p,sy:h}of c)t.rect(p-s,h-d,s*2,d*2);t.stroke(),t.strokeStyle="rgba(0,0,0,0.9)",t.lineWidth=1.5,t.beginPath();for(const{sx:p,sy:h}of c)t.rect(p-s,h-d,s*2,d*2);t.stroke(),t.restore()}}function $n(){const e=a.getContext("2d"),t=Math.min(O.x,R.x),n=Math.min(O.y,R.y),o=Math.abs(R.x-O.x),i=Math.abs(R.y-O.y);e.save(),e.fillStyle="rgba(0,0,0,0.08)",e.fillRect(t,n,o,i),e.setLineDash([5,3]),e.strokeStyle="rgba(255,255,255,0.9)",e.lineWidth=3,e.strokeRect(t,n,o,i),e.strokeStyle="rgba(0,0,0,0.9)",e.lineWidth=1.5,e.strokeRect(t,n,o,i),e.restore()}function Gn(){a.toBlob(e=>{e&&Ei(e,S.downloadFilename??"wafermap",S.onSaveImage)})}function tn(e){return H?Math.max(H.ppm*In,Math.min(H.ppm*Wn,e)):e}function Ce(e,t,n){const o=P??H;if(!o)return;const i=tn(o.ppm*n),r=i/o.ppm,u=e-(e-o.originX)*r,s=t-(t-o.originY)*r,d=(H?.snapDist??1)/(i/(H?.ppm??i));P={originX:u,originY:s,ppm:i,snapDist:d},x()}function X(){return P??H}function nn(e){if(e.ctrlKey||e.metaKey){e.preventDefault();const t=a.getBoundingClientRect(),n=e.deltaY<0?1.12:1/1.12;Ce(e.clientX-t.left,e.clientY-t.top,n)}else if(P!==null){e.preventDefault();const t=X(),n=P.snapDist;P={originX:t.originX-e.deltaX,originY:t.originY-e.deltaY,ppm:t.ppm,snapDist:n},x()}}function on(e,t,n){return e>=n.x&&e<n.x+n.w&&t>=n.y&&t<n.y+n.h}function an(e){if(e.button!==0||!X())return;a.focus({preventScroll:!0}),a.setPointerCapture(e.pointerId);const t=a.getBoundingClientRect(),n=e.clientX-t.left,o=e.clientY-t.top;if(ke&&l.legendPosition==="floating"&&on(n,o,ke)){ye=!0,Te={x:n,y:o},ut={...ft};return}if(Pe&&Y!=="pan"){xe=!0,pe=!0,ve={x:n,y:o},Ke={x:X().originX,y:X().originY},a.style.cursor="grabbing";return}if(Y==="zoom"||Y==="select"){be=!0,O=R={x:n,y:o};return}pe=!0,ve={x:n,y:o},Ke={x:X().originX,y:X().originY},a.style.cursor="grabbing"}function sn(e){const t=a.getBoundingClientRect(),n=e.clientX-t.left,o=e.clientY-t.top;if(be){R={x:n,y:o},wt();return}if(ye){const p=n-Te.x,h=o-Te.y;p*p+h*h>16&&(ye=!1,Le=!0,a.style.cursor="grabbing")}if(Le){ft={x:ut.x+(n-Te.x),y:ut.y+(o-Te.y)},wt();return}if(pe){const p=X(),h=P?.snapDist??H?.snapDist??1;P={originX:Ke.x+(n-ve.x),originY:Ke.y+(o-ve.y),ppm:p.ppm,snapDist:h},wt();return}const i=X();if(!i)return;const r=(n-i.originX)/i.ppm,u=(i.originY-o)/i.ppm,d=cn(r,u,i.snapDist)?.die??null,c=pt.find(p=>n>=p.x&&n<p.x+p.w&&o>=p.y&&o<p.y+p.h);if(c){a.style.cursor="pointer",v&&(v.innerHTML=c.label??`Bin ${c.bin}`,v.style.display="block",Dt(v,a,e.clientX,e.clientY)),Ne?.(null,e);return}if(Y==="pan"&&(a.style.cursor=d?"crosshair":"grab"),v)if(d)if(Rt){const p=Rt(d);p===null?v.style.display="none":(typeof p=="string"?v.innerHTML=p:(v.innerHTML="",v.appendChild(p)),v.style.display="block",Dt(v,a,e.clientX,e.clientY))}else v.innerHTML=ai(d,y.plotMode,{testDefs:ee,hbinDefs:$,sbinDefs:G,fallbackFormat:De,aggrMethod:y.aggrMethod,lotSize:y.lotSize,waferMeta:J.metadata,metadataFields:se,activeTest:y.activeTest,reticleConfig:Kt}),v.style.display="block",Dt(v,a,e.clientX,e.clientY);else v.style.display="none";Ne?.(d,e)}function ln(e){const t=a.getBoundingClientRect(),n=e.clientX-t.left,o=e.clientY-t.top,i=e.ctrlKey||e.metaKey;if(v&&(n<0||o<0||n>t.width||o>t.height)&&(v.style.display="none"),be){be=!1,R={x:n,y:o};const s=n-O.x,d=o-O.y,c=X();if(Y==="zoom"){if(s*s+d*d<25)Ce(n,o,2);else if(c){const p=Math.min(O.x,R.x),h=Math.max(O.x,R.x),Q=Math.min(O.y,R.y),Me=Math.max(O.y,R.y),V=h-p,re=Me-Q;if(V>4&&re>4){const L=a.clientWidth,j=a.clientHeight,Ie=L/V,qe=j/re,Je=Math.min(Ie,qe),U=tn(c.ppm*Je),We=U/c.ppm,et=(p+h)/2,_=(Q+Me)/2;P={originX:L/2-(et-c.originX)*We,originY:j/2-(_-c.originY)*We,ppm:U,snapDist:c.snapDist/We}}}x(),a.style.cursor="crosshair";return}if(s*s+d*d<25)St(n,o,i,e);else if(c){const p=(Math.min(O.x,R.x)-c.originX)/c.ppm,h=(Math.max(O.x,R.x)-c.originX)/c.ppm,Q=(c.originY-Math.max(O.y,R.y))/c.ppm,Me=(c.originY-Math.min(O.y,R.y))/c.ppm,V=y.hoverPoints,re=[];for(let L=0;L<V.length;L++)if(V[L].x>=p&&V[L].x<=h&&V[L].y>=Q&&V[L].y<=Me){const j=y.dies[L];j&&re.push(j)}if(i)for(const L of re){const j=Ee(L);E.has(j)?E.delete(j):E.add(j)}else E=new Set(re.map(L=>Ee(L)));de?.(Ct())}x(),a.style.cursor="crosshair";return}if(ye){ye=!1,St(n,o,i,e);return}if(Le){Le=!1,a.style.cursor="grab";return}if(!pe)return;if(pe=!1,xe){xe=!1,a.style.cursor=Pe||Y==="pan"?"grab":"crosshair";return}a.style.cursor=Y==="pan"?"grab":"crosshair";const r=n-ve.x,u=o-ve.y;r*r+u*u<25&&St(n,o,i,e)}function St(e,t,n,o){for(const s of pt)if(e>=s.x&&e<s.x+s.w&&t>=s.y&&t<s.y+s.h){if(typeof s.bin=="number"){const d=l.highlightBin===s.bin?void 0:s.bin;M({highlightBin:d})}else{const d=l.highlightMetadataValue===s.bin?void 0:s.bin;M({highlightMetadataValue:d})}return}if(ke&&on(e,t,ke))return;const i=X();if(!i)return;const u=cn((e-i.originX)/i.ppm,(i.originY-t)/i.ppm,i.snapDist)?.die??null;if(u){Ln?.(u,o);const s=Ee(u);n?E.has(s)?E.delete(s):E.add(s):E=new Set([s]),de?.(Ct()),x()}else n||(E=new Set,de?.([]),x())}function Ct(){const e=[],t=y.hoverPoints;for(let n=0;n<t.length;n++){const o=y.dies[n];o&&E.has(Ee(o))&&e.push(o)}return e}function rn(){v&&ot(g),Ne?.(null,new MouseEvent("mouseleave")),a.style.cursor=Y==="pan"?"grab":"crosshair"}function dn(){pe=!1,xe=!1,be=!1,ye=!1,Le=!1,v&&ot(g),Ne?.(null,new MouseEvent("mouseleave")),a.style.cursor=Y==="pan"?"grab":"crosshair",x()}function cn(e,t,n){const o=y.hoverPoints,i=y.rectangles;for(let d=0;d<i.length;d++){const c=i[d];if(Math.abs(e-c.x)<=c.width/2&&Math.abs(t-c.y)<=c.height/2){const p=y.dies[d];return p?{die:p,index:d}:null}}let r=null,u=-1,s=n*n;for(let d=0;d<o.length;d++){const c=o[d].x-e,p=o[d].y-t,h=c*c+p*p;h<s&&(s=h,r=y.dies[d]??null,u=d)}return r?{die:r,index:u}:null}const pn=new K.ResizeObserver(()=>{H=null,P=null,x()});pn.observe(a),S.height==null&&kn<=0&&kt(()=>kt(()=>{N.clientHeight>0||console.warn("[wafermap] The map container has zero height, so the map cannot render. renderWaferMap fills its container \u2014 give the container a resolved height: an explicit CSS `height` (e.g. 600px), a height-resolved flex/grid parent, or `position:absolute; inset:0`. Alternatively pass `{ height: 600 }` in the render options and the library will size it for you.")}));let Re=K.matchMedia(`(resolution: ${K.devicePixelRatio}dppx)`);const Qe=()=>{Re.removeEventListener("change",Qe),Re=K.matchMedia(`(resolution: ${K.devicePixelRatio}dppx)`),Re.addEventListener("change",Qe),x()};Re.addEventListener("change",Qe);const fn=K.matchMedia("(prefers-color-scheme: dark)"),un=()=>x();fn.addEventListener("change",un);const gn=()=>{v&&ot(g)};K.addEventListener("blur",gn);function hn(e){if(e.key==="Escape"&&E.size>0&&(E=new Set,de?.([]),x()),(e.key==="e"||e.key==="E")&&Ot!=="view-only"&&Ht&&!me&&(e.stopPropagation(),(Wt??Jt)()),(e.ctrlKey||e.metaKey)&&(e.key==="="||e.key==="+"?(e.preventDefault(),Ce(a.clientWidth/2,a.clientHeight/2,1.2)):e.key==="-"?(e.preventDefault(),Ce(a.clientWidth/2,a.clientHeight/2,1/1.2)):e.key==="0"&&(e.preventDefault(),Ue())),!e.ctrlKey&&!e.metaKey&&!e.shiftKey){const n=X();if(n){const o=P?.snapDist??H?.snapDist??1;let i=0,r=0;e.key==="ArrowLeft"&&(i=20,e.preventDefault()),e.key==="ArrowRight"&&(i=-20,e.preventDefault()),e.key==="ArrowUp"&&(r=20,e.preventDefault()),e.key==="ArrowDown"&&(r=-20,e.preventDefault()),(i||r)&&(P={originX:n.originX+i,originY:n.originY+r,ppm:n.ppm,snapDist:o},x())}e.key===" "&&!Pe&&(e.preventDefault(),Pe=!0,Y!=="pan"&&(a.style.cursor="grab"))}}function mn(e){e.key===" "&&(Pe=!1,xe&&(pe=!1,xe=!1),a.style.cursor=Y==="pan"?"grab":"crosshair")}a.style.cursor="grab",a.setAttribute("tabindex","0"),a.addEventListener("wheel",nn,{passive:!1}),a.addEventListener("pointerdown",an),a.addEventListener("pointermove",sn),a.addEventListener("pointerup",ln),a.addEventListener("pointerleave",rn),a.addEventListener("pointercancel",dn);const yn=()=>Ue();a.addEventListener("dblclick",yn),a.addEventListener("keydown",hn),a.addEventListener("keyup",mn);const bn=e=>{e.stopPropagation()};a.addEventListener("click",bn),a.clientWidth,x(),Xe?.();function Ue(){H=null,P=null,x()}function vn(){import("./userGuideHtml.js").then(e=>vi({buildWaferMap:ci,renderWaferMap,renderWaferGallery:void 0,analyzeWaferMap:fi},e.USER_GUIDE_HTML,An,N))}return{setDies(e){ae=e,Oe(),x(),z&&ue()},setResult(e){st=e,J=e.wafer,ae=e.dies,$=e.hbinDefs,G=e.sbinDefs,ee=e.testDefs,se=e.metadataFields,Nt=e.reticles?.length?e.reticles:void 0,Kt=e.reticleConfig,Vt=e.view?.dataAxisFlip,lt=e.isLotStack,rt=e.aggrMethod,dt=e.lotSize,Nn(),Oe(),x(),z&&ue()},setOptions(e){en(e)},getOptions(){return{...l}},resetZoom:Ue,setSelection(e){E=new Set(e.map(t=>Ee(t))),x()},clearSelection(){E=new Set,de?.([]),x()},setFallbackFormat(e){De=e,Oe(),x()},setStatsSummary(e){if(ie=e,Xt(),Ut(),z)ue();else if(I)je();else if(e&&!Be?.placement){const t=Be?.defaultOpen??!he;I=Tt("right",g),I.style.display=t?"block":"none";const n=C.parentElement,o=C.nextSibling;te=Pt(C,I,"right"),n?.insertBefore(te,o),je()}Ze()},setSummaryVisible(e){W&&(W.style.display=e?"flex":"none")},setViewControlsVisible(e){D&&(D.style.display=e?"flex":"none")},setExpandVisible(e){Z&&(Z.style.display=e?"flex":"none")},setHelpButtonVisible(e){$e&&($e.style.display=e?"flex":"none")},setMetadataBadgeVisible(e){jt=!e,T&&(T.el.style.display=e&&!me?"":"none")},openUserGuide:vn,setInsightsOpen(e){ct(e),F&&(e?(F.dataset.active="1",F.style.background=w.bgActive,F.style.color=w.iconActive):(delete F.dataset.active,F.style.background="transparent",F.style.color=w.icon))},closeSummaryPanel(){const e=z??I;!e||e.style.display==="none"||(e.style.display="none",W&&(delete W.dataset.active,W.style.background="transparent",W.style.color=w.icon))},setTooltipParent(e){v&&hi(e)},getActiveLegend(){const e=l.plotMode;if(e==="metadata"){const i=l.activeMetadataKey;if(!i)return null;const r=se?.find(s=>s.key===i),u=[...new Set(ae.map(s=>s.metadata?.[i]).filter(s=>s!=null&&(typeof s=="string"||typeof s=="number"||typeof s=="boolean")).map(String))].sort();return u.length?u.map((s,d)=>{const c=r?.values?.find(h=>h.value===s),p=c?.color??Fi(d);return{bin:s,name:c?.label??s,color:p}}):null}if(e!=="hardBin"&&e!=="softBin")return null;const t=e==="hardBin",n=t?$:G,o=[...new Set(ae.map(i=>t?i.hbin:i.sbin).filter(i=>i!==void 0))].sort((i,r)=>i-r);return o.length?o.map(i=>{const r=n?.find(s=>s.bin===i),u=r?.color??(t?Hi(i):Ai(i));return{bin:i,name:r?.name??`Bin ${i}`,color:u}}):null},destroy(){Se?.close(),we&&clearTimeout(we),qt?.()?.remove(),gt&&g.removeEventListener("click",gt,!0),a.removeEventListener("wheel",nn),a.removeEventListener("pointerdown",an),a.removeEventListener("pointermove",sn),a.removeEventListener("pointerup",ln),a.removeEventListener("pointerleave",rn),a.removeEventListener("pointercancel",dn),a.removeEventListener("dblclick",yn),a.removeEventListener("keydown",hn),a.removeEventListener("keyup",mn),a.removeEventListener("click",bn),pn.disconnect(),Re.removeEventListener("change",Qe),fn.removeEventListener("change",un),K.removeEventListener("blur",gn),Xn(),v&&ot(g),B?.remove(),fe&&(fe.parentElement?.insertBefore(C,fe),fe.remove()),te&&(te.parentElement?.insertBefore(C,te),te.remove()),C.remove(),a.style.cursor="",le?.destroy(),T?.destroy(),q.remove()}}}
@@ -237,7 +237,7 @@ export declare function buildFindingsSectionWithFilter(source: StatsSummary | Lo
237
237
  export declare function buildLotTestSection(allDies: Die[], testDefs: TestDef[] | undefined, fallbackFormat?: 'si' | 'engineering', perWaferSummaries?: StatsSummary[],
238
238
  /** Optional host hook for the "Export CSV" button — see `saveTextFile` (toolbar.ts). */
239
239
  onSaveText?: SaveTextHandler): HTMLDivElement | null;
240
- export declare function createSummaryPanelEl(placement: 'right' | 'left' | 'top' | 'bottom'): HTMLDivElement;
240
+ export declare function createSummaryPanelEl(placement: 'right' | 'left' | 'top' | 'bottom', ownerDocument?: Document): HTMLDivElement;
241
241
  /** Wrap the canvas + panel in a flex container according to placement. */
242
242
  export declare function wrapWithSummaryPanel(content: HTMLElement, panel: HTMLDivElement, placement: 'right' | 'left' | 'top' | 'bottom'): HTMLDivElement;
243
243
  /** Render all wafer-level sections into a panel element. Clears existing content. */
@@ -1,3 +1,3 @@
1
- import{isParametricTest as xt}from"../renderer/buildWaferMap.js";import{buildRingRegions as K,buildQuadrantRegions as Z,buildRegionYieldData as bt}from"../stats/regions.js";import{computeFunctionalYield as vt}from"../stats/analyzeWaferMap.js";import{openHtmlReport as J}from"../stats/renderFindingsReport.js";import{renderSummaryReportHtml as yt,renderLotSummaryReportHtml as wt}from"../stats/renderSummaryReport.js";import{buildFindingsNarrative as Ct}from"../stats/findingsNarrative.js";import{filterFindings as St}from"../stats/filterFindings.js";import{buildFacetTable as kt,prettyKey as tt}from"../stats/facets.js";import{commonMetadata as et}from"../stats/facets.js";import{resolveMetadataColumns as Bt}from"../stats/metadataColumns.js";import{getColorScheme as $t}from"../renderer/colorSchemes.js";import{buildWarningsBanner as _,collectWarnings as nt}from"./warnings.js";export{_ as buildWarningsBanner};import{fmt as it,fmtAggregationMethod as Lt,plainBinTerms as P}from"../renderer/fmt.js";import{getUniqueTestNumbers as Dt}from"../renderer/buildView.js";import{quantile as Q}from"../stats/math.js";import{makeLabeledSelect as ot}from"./charts/chartShell.js";import{CLR as y,sevColor as G,openModal as at,saveTextFile as rt}from"./toolbar.js";import{buildDieListSection as Rt}from"./dieList.js";import{medianOfSorted as Ft}from"../core/utils.js";import{metadataDisplayValue as Tt}from"../core/metadata.js";const Et=y.panelBg,Y=`1px solid ${y.menuBorder}`,Nt="12px",W=y.label,z=y.value,st="10px";function l(t,i,e){const n=document.createElement(t);return i&&Object.assign(n.style,i),e!==void 0&&(n.textContent=e),n}function H(t){return l("div",{fontSize:st,fontWeight:"700",letterSpacing:"0.06em",textTransform:"uppercase",color:W,marginBottom:"6px"},t)}function lt(t,i=!0,e){const n=l("div"),o=document.createElement("button");o.type="button",Object.assign(o.style,{display:"flex",alignItems:"center",gap:"4px",width:"100%",background:"none",border:"none",cursor:"pointer",padding:"0 0 6px",textAlign:"left"});const d=l("span",{fontSize:"9px",color:W,transition:"transform 0.15s",transform:i?"rotate(90deg)":"rotate(0deg)",display:"inline-block",lineHeight:"1",marginRight:"1px"},"\u25B6"),f=l("span",{fontSize:st,fontWeight:"700",letterSpacing:"0.06em",textTransform:"uppercase",color:W,flex:"1"},t);if(o.setAttribute("aria-expanded",i?"true":"false"),o.appendChild(d),o.appendChild(f),e){const a=l("span",{fontSize:"9px",fontWeight:"700",background:y.warnBg,color:y.warnText,borderRadius:"10px",padding:"1px 5px"},e);o.appendChild(a)}const c=l("div");c.style.display=i?"block":"none";let s=i;return o.addEventListener("click",()=>{s=!s,c.style.display=s?"block":"none",d.style.transform=s?"rotate(90deg)":"rotate(0deg)",o.setAttribute("aria-expanded",s?"true":"false")}),n.appendChild(o),n.appendChild(c),{outer:n,content:c}}function dt(){return l("div",{height:"1px",background:y.separator,margin:`${Nt} 0`,flexShrink:"0"})}function U(t,i,e="#2a6fc0",n,o,d){const f=l("div",{marginBottom:"5px"}),c=l("div",{display:"flex",justifyContent:"space-between",fontSize:"11px",color:z,marginBottom:"2px"}),s=l("span",{},t),a=l("span",{fontWeight:"600"},`${i.toFixed(1)}%`);c.appendChild(s),c.appendChild(a);const p=n!==void 0?n:Math.min(100,Math.max(0,i)),v=d?"#94a3b8":e,h=l("div",{position:"relative",height:"9px",background:y.bgActive,borderRadius:"4px",overflow:"hidden"}),T=l("div",{height:"100%",width:`${p}%`,background:v,borderRadius:"4px",transition:"width 0.3s ease"});if(h.appendChild(T),o!==void 0){const N=l("div",{position:"absolute",top:"0",bottom:"0",left:`${o}%`,width:"1px",background:y.infoText,opacity:"0.5"});h.appendChild(N)}return f.appendChild(c),f.appendChild(h),f}function O(t,i,e){const n=l("div",{background:y.menuBg,border:Y,borderRadius:"6px",padding:"8px 10px",textAlign:"center",flex:"1"}),o=l("div",{fontSize:"20px",fontWeight:"700",color:z,lineHeight:"1.2"},t),d=l("div",{fontSize:"10px",color:W,marginTop:"2px"},i);return n.appendChild(o),n.appendChild(d),e&&n.appendChild(l("div",{fontSize:"9px",color:W,opacity:"0.85"},e)),n}function Mt(t,i){const e=l("div",{display:"flex",justifyContent:"space-between",fontSize:"11px",gap:"8px",marginBottom:"3px"}),n=l("span",{color:W,flexShrink:"0"},t),o=l("span",{color:z,textAlign:"right",fontWeight:"500",wordBreak:"break-all"},i);return e.appendChild(n),e.appendChild(o),e}function It(t,i){const e=l("div",{display:"flex",fontSize:"11px",gap:"6px",marginBottom:"3px"}),n=l("span",{color:W,flexShrink:"0"},`${t}:`),o=l("span",{color:z,fontWeight:"500",wordBreak:"break-all"},i);return e.appendChild(n),e.appendChild(o),e}export function metadataEntries(t){const i=[];for(const[e,n]of Object.entries(t)){const o=Tt(n);o!==void 0&&i.push([e,o])}return i}export function buildFacetSummaryChips(t,i=3){if(!t.length)return null;const e=l("div",{display:"flex",flexWrap:"wrap",alignItems:"baseline",gap:"4px 10px",fontSize:"11px"});for(const n of t){const o=l("span",{whiteSpace:"nowrap"}),d=l("span",{color:W},`${tt(n.key)}: `);o.appendChild(d);const f=n.values.slice(0,i),c=n.values.length-f.length;let s=f.map(a=>a.value).join(", ");c>0&&(s+=` +${c} more`),o.appendChild(document.createTextNode(s)),e.appendChild(o)}return e}export function buildMetadataStripRow(t,i,e){const n=kt(t,e),o=buildFacetSummaryChips(n);if(!o&&!i)return null;const d=l("div",{display:"flex",flexWrap:"wrap",alignItems:"baseline",gap:"4px 14px"});if(i){const f=l("span",{fontWeight:"500",whiteSpace:"nowrap"},i.aggrMethod?`${i.lotSize} wafers stacked \xB7 ${i.aggrMethod}`:`${i.lotSize} wafers stacked`);d.appendChild(f)}return o&&d.appendChild(o),d}const Wt={display:"flex",flexDirection:"column",gap:"6px",background:y.menuBg,border:`1px solid ${y.menuBorder}`,borderRadius:"6px",padding:"6px 10px",boxShadow:"0 1px 4px rgba(0,0,0,0.10)",fontSize:"12px",lineHeight:"1",boxSizing:"border-box",width:"100%",minWidth:"0"};export function buildMetadataStripBox(t,i,e){const n=buildMetadataStripRow(t,i,e);if(!n)return null;const o=l("div",Wt);return o.appendChild(n),o}export function buildCompactMetadataRows(t){const i=metadataEntries(t);if(!i.length)return null;const e=l("div");for(const[n,o]of i)e.appendChild(It(tt(n),o));return e}export function buildMetadataInfoSection(t,i){const e=buildMetadataStripRow(t,i,{facetableOnly:t.length>1});if(!e)return null;const n=l("div");return n.appendChild(H("Wafer Info")),n.appendChild(e),n}export function buildYieldSection(t,i,e=[1]){const n=l("div");n.appendChild(H("Summary"));const o=l("div",{display:"flex",gap:"6px",marginBottom:"8px"});if(o.appendChild(O(String(t.totalDies),"Total dies")),t.partialDies>0&&o.appendChild(O(String(t.partialDies),"Partial")),t.yieldPercent!==null){const d=e.length===1?`bin ${e[0]}`:`bins ${e.join(", ")}`;o.appendChild(O(`${t.yieldPercent.toFixed(1)}%`,"Yield",`pass: ${d}`))}return n.appendChild(o),t.edgeExcludedDies>0&&n.appendChild(Mt("Edge excluded (outer zone)",String(t.edgeExcludedDies))),n}export function buildBinSection(t,i,e,n,o){const d=new Map;if(o)for(const[p,v]of Object.entries(o))d.set(Number(p),v);else for(const p of t){if(p.partial||p.edgeExcluded)continue;const v=e==="hard"?p.hbin:p.sbin;v!=null&&d.set(v,(d.get(v)??0)+1)}if(!d.size)return null;const f=[...d.values()].reduce((p,v)=>p+v,0),c=i?new Map(i.map(p=>[p.bin,p])):null,s=[...d.entries()].sort((p,v)=>p[0]-v[0]),a=l("div");a.appendChild(H(e==="hard"?"Hard Bin Breakdown":"Soft Bin Breakdown"));for(const[p,v]of s){const h=c?.get(p),T=h?.name?`Bin ${p} \xB7 ${h.name}`:`Bin ${p}`,N=v/f*100,B=$t(n),E=(n==="custom"?h?.color:void 0)??B.forBin(p);a.appendChild(U(`${T} (${v})`,N,E))}return a}export function buildLotBinSection(t,i,e,n){return buildBinSection(t,i,e,n)}function j(t,i,e,n,o,d){const f=bt(t,i,e,n,o);if(!f.length)return null;const c=l("div");c.appendChild(H(d));for(const{label:s,n:a,yieldPercent:p}of f)c.appendChild(U(`${s} (N=${a})`,p));return c}export function buildRingSection(t,i,e,n){return j([t],[i],e,n,K,"Ring Yield")}export function buildQuadrantSection(t,i,e,n){return j([t],[i],e,n,Z,"Quadrant Yield")}export function buildLotRingSection(t,i,e,n){return j(t,i,e,n,K,"Ring Yield")}export function buildLotQuadrantSection(t,i,e,n){return j(t,i,e,n,Z,"Quadrant Yield")}export function buildLotOverviewSection(t){const i=l("div");i.appendChild(H("Lot Summary"));const e=l("div",{display:"flex",gap:"6px",marginBottom:"8px"});e.appendChild(O(String(t.stats.waferCount),"Wafers"));const n=t.perWafer.map(o=>o.summary.stats.yieldPercent).filter(o=>o!==null);if(n.length){const o=n.reduce((d,f)=>d+f,0)/n.length;e.appendChild(O(`${o.toFixed(1)}%`,"Mean wafer yield"))}return i.appendChild(e),i}export function buildPerWaferYieldSection(t,i,e){const n=t.perWafer.map(a=>({waferIndex:a.waferIndex,label:(i[a.waferIndex]?.label??`W${a.waferIndex+1}`).replace(/\s*·\s*\d+(\.\d+)?%$/,""),yieldPct:a.summary.stats.yieldPercent})).filter(a=>a.yieldPct!==null);if(!n.length)return null;const o=Math.min(...n.map(a=>a.yieldPct)),d=Math.max(...n.map(a=>a.yieldPct)),f=o===d?"":` (${o.toFixed(1)}\u2013${d.toFixed(1)}%)`,c=Ft([...n.map(a=>a.yieldPct)].sort((a,p)=>a-p)),s=l("div");s.appendChild(H("Wafer Yield"+f));for(const{waferIndex:a,label:p,yieldPct:v}of n){const h=U(p,v,void 0,void 0,c,v<c);e&&(h.style.cursor="pointer",h.style.borderRadius="4px",h.style.padding="2px 3px",h.style.marginLeft="-3px",h.style.marginRight="-3px",h.setAttribute("role","button"),h.setAttribute("aria-label",`${p}, ${v.toFixed(1)}% yield \u2014 view wafer`),h.tabIndex=0,h.addEventListener("mouseenter",()=>{h.style.background=y.bgHover}),h.addEventListener("mouseleave",()=>{h.style.background=""}),h.addEventListener("focus",()=>{h.style.background=y.bgHover}),h.addEventListener("blur",()=>{h.style.background=""}),h.addEventListener("click",()=>e(a)),h.addEventListener("keydown",T=>{(T.key==="Enter"||T.key===" ")&&(T.preventDefault(),e(a))})),s.appendChild(h)}return s}function zt(t){const i=[...t].sort((o,d)=>o-d),e=t.reduce((o,d)=>o+d,0)/t.length,n=t.reduce((o,d)=>o+(d-e)**2,0)/t.length;return{min:i[0],max:i[i.length-1],mean:e,count:t.length,stddev:Math.sqrt(n),median:Q(i,.5),q1:Q(i,.25),q3:Q(i,.75)}}function pt(t,i){if(!t)return[];const e=t.waferMetadata??(t.perWaferMetadata?et(t.perWaferMetadata.map(n=>({metadata:n}))):void 0);return!e||!Object.keys(e).length?[]:Bt({waferMetadata:e,waferPlacement:"csv",reservedLabels:i}).columns}export function csvField(t){return/[",\n]/.test(t)?`"${t.replace(/"/g,'""')}"`:t}export function buildTestSection(t,i,e,n,o,d){const f=t.filter(r=>!r.partial&&!r.edgeExcluded),c=new Map((n?.perTestStats??[]).map(r=>[r.testNumber,r])),s=new Map((n?.testSpecYield??[]).map(r=>[r.testNumber,r]));let a;if(i?.length?a=i.filter(xt).map(r=>({testNumber:r.testNumber,name:r.name,unit:r.unit,limitLow:r.limitLow,limitHigh:r.limitHigh})):a=Dt(f).map(m=>({testNumber:m,name:`Test ${m}`})),!a.length)return null;const p=a.filter(r=>f.some(m=>{const D=m.testValues?.[r.testNumber];return D!==void 0&&isFinite(D)}));if(!p.length)return null;const v=p.some(r=>r.limitLow!==void 0||r.limitHigh!==void 0),h=[];for(const r of p){const m=c.get(r.testNumber),D=m&&m.stddev!==void 0&&m.median!==void 0&&m.q1!==void 0&&m.q3!==void 0;let w;if(D){const b=m;w={testNumber:r.testNumber,min:b.min,max:b.max,mean:b.mean,count:b.count,stddev:b.stddev,median:b.median,q1:b.q1,q3:b.q3}}else{const b=f.map(F=>F.testValues?.[r.testNumber]).filter(F=>F!==void 0&&isFinite(F));if(!b.length)continue;w={testNumber:r.testNumber,...zt(b)}}let x=null,S=0;if(r.limitLow!==void 0||r.limitHigh!==void 0){const b=s.get(r.testNumber);if(b)({yieldPercent:x,totalDies:S}=b);else{const F=f.map(g=>g.testValues?.[r.testNumber]).filter(g=>g!==void 0&&isFinite(g)),I=F.filter(g=>r.limitLow!==void 0&&g<r.limitLow||r.limitHigh!==void 0&&g>r.limitHigh).length;S=F.length,x=F.length>0?(F.length-I)/F.length*100:null}}h.push({entry:r,stats:w,specYieldPct:x,specN:S})}if(!h.length)return null;const T=l("div"),N=l("div",{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:"6px"}),B=H(d?.populationLabel?`Test Values (${h.length}) \u2014 ${d.populationLabel}`:`Test Values (${h.length})`);B.style.marginBottom="0",N.appendChild(B);const E=document.createElement("button");E.type="button",E.textContent="Export CSV",Object.assign(E.style,{background:"none",border:Y,borderRadius:"4px",cursor:"pointer",fontSize:"10px",color:y.iconHover,padding:"2px 7px"}),E.addEventListener("click",()=>{const r=["Test","Unit","N","Min","Q1","Median","Mean","Q3","Max","StdDev"];v&&r.push("LSL","USL","Spec Yield %","Spec Yield N");const m=pt(d,r),w=[[...m.map(S=>S.label),...r].map(csvField).join(",")],x=S=>it(S,void 0,"engineering");for(const{entry:S,stats:b,specYieldPct:F,specN:I}of h){const g=[...m.map(M=>M.constant??""),S.name,S.unit??"",String(b.count),x(b.min),x(b.q1),x(b.median),x(b.mean),x(b.q3),x(b.max),x(b.stddev)];v&&g.push(S.limitLow!==void 0?x(S.limitLow):"",S.limitHigh!==void 0?x(S.limitHigh):"",F!==null?F.toFixed(1):"",S.limitLow!==void 0||S.limitHigh!==void 0?String(I):""),w.push(g.map(csvField).join(","))}rt(w.join(`
2
- `),"test-values.csv","text/csv",o)}),N.appendChild(E),T.appendChild(N);const R=l("table",{width:"100%",borderCollapse:"collapse",fontSize:"11px"}),L=document.createElement("thead"),u=document.createElement("tr"),$=["Test","N","Min","Q1","Median","Mean","Q3","Max","StdDev"];v&&$.push("LSL","USL","Spec yield");for(const r of $){const m=l("th",{textAlign:r==="Test"?"left":"right",fontWeight:"700",fontSize:"10px",letterSpacing:"0.03em",textTransform:"uppercase",color:W,padding:"3px 8px 5px",borderBottom:`1px solid ${y.menuBorder}`,whiteSpace:"nowrap"},r);u.appendChild(m)}L.appendChild(u),R.appendChild(L);const k=document.createElement("tbody");for(const{entry:r,stats:m,specYieldPct:D,specN:w}of h){const x=F=>it(F,r.unit,e),S=document.createElement("tr"),b=(F,I="right")=>{const g=l("td",{textAlign:I,padding:"4px 8px",borderBottom:`1px solid ${y.menuBorder}`,color:z,whiteSpace:"nowrap"},F);S.appendChild(g)};b(r.name,"left"),b(`${m.count}`),b(x(m.min)),b(x(m.q1)),b(x(m.median)),b(x(m.mean)),b(x(m.q3)),b(x(m.max)),b(x(m.stddev)),v&&(b(r.limitLow!==void 0?x(r.limitLow):"\u2014"),b(r.limitHigh!==void 0?x(r.limitHigh):"\u2014"),b(D!==null?`${D.toFixed(1)}% (N=${w})`:"\u2014")),k.appendChild(S)}R.appendChild(k);const C=l("div",{overflowX:"auto"});return C.appendChild(R),T.appendChild(C),T}export function buildFunctionalTestSection(t,i,e,n,o){const d=e??vt(t,i);if(!d?.length)return null;const f=l("div"),c=l("div",{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:"6px"}),s=H(o?.populationLabel?`Functional Tests (${d.length}) \u2014 ${o.populationLabel}`:`Functional Tests (${d.length})`);s.style.marginBottom="0",c.appendChild(s);const a=document.createElement("button");a.type="button",a.textContent="Export CSV",Object.assign(a.style,{background:"none",border:Y,borderRadius:"4px",cursor:"pointer",fontSize:"10px",color:y.iconHover,padding:"2px 7px"}),a.addEventListener("click",()=>{const B=["Test","N","Pass","Fail","Pass Rate %"],E=pt(o,B),R=[[...E.map(L=>L.label),...B].map(csvField).join(",")];for(const L of d)R.push([...E.map(u=>u.constant??""),L.label,String(L.totalDies),String(L.passDies),String(L.failDies),L.passRatePercent!==null?L.passRatePercent.toFixed(1):""].map(csvField).join(","));rt(R.join(`
3
- `),"functional-tests.csv","text/csv",n)}),c.appendChild(a),f.appendChild(c);const p=l("table",{width:"100%",borderCollapse:"collapse",fontSize:"11px"}),v=document.createElement("thead"),h=document.createElement("tr");for(const B of["Test","N","Pass","Fail","Pass rate"])h.appendChild(l("th",{textAlign:B==="Test"?"left":"right",fontWeight:"700",fontSize:"10px",letterSpacing:"0.03em",textTransform:"uppercase",color:W,padding:"3px 8px 5px",borderBottom:`1px solid ${y.menuBorder}`,whiteSpace:"nowrap"},B));v.appendChild(h),p.appendChild(v);const T=document.createElement("tbody");for(const B of d){const E=document.createElement("tr"),R=(L,u="right")=>{E.appendChild(l("td",{textAlign:u,padding:"4px 8px",borderBottom:`1px solid ${y.menuBorder}`,color:z,whiteSpace:"nowrap"},L))};R(B.label,"left"),R(String(B.totalDies)),R(String(B.passDies)),R(String(B.failDies)),R(B.passRatePercent!==null?`${B.passRatePercent.toFixed(1)}% (N=${B.totalDies})`:"\u2014"),T.appendChild(E)}p.appendChild(T);const N=l("div",{overflowX:"auto"});return N.appendChild(p),f.appendChild(N),f}export function buildLotFunctionalSection(t,i,e,n){const o=e?.length?{perWaferMetadata:e.map(d=>d.wafer??{}),populationLabel:`${e.length} wafer${e.length===1?"":"s"} pooled`}:void 0;if(e?.length&&e.every(d=>d.stats.functionalYield!==void 0)){const d=new Map;for(const c of e)for(const s of c.stats.functionalYield??[]){const a=d.get(s.testNumber)??{label:s.label,passDies:0,failDies:0,totalDies:0};a.passDies+=s.passDies,a.failDies+=s.failDies,a.totalDies+=s.totalDies,d.set(s.testNumber,a)}const f=[...d.entries()].map(([c,s])=>({testNumber:c,...s,passRatePercent:s.totalDies>0?s.passDies/s.totalDies*100:null}));if(f.length)return buildFunctionalTestSection(t,i,f,n,o)}return buildFunctionalTestSection(t,i,void 0,n,o)}const A={unusual:0,notable:1,info:2};function X(t){return l("span",{display:"inline-block",width:"7px",height:"7px",borderRadius:"50%",background:G(t),flexShrink:"0"})}function ct(t,i){let e=t.summary;return i&&(e.startsWith(`${i} has `)?e=e.slice(i.length+5):e.startsWith(`${i} `)&&(e=e.slice(i.length+1))),e=P(e),e.length?e[0].toUpperCase()+e.slice(1):e}export function buildFindingsSection(t,i,e,n,o=!1){if(!t.length)return null;const d=t.some(u=>u.severity==="unusual"||u.severity==="notable"),f=d?t.filter(u=>u.severity!=="info").length.toString():void 0,{outer:c,content:s}=o?(()=>{const u=l("div");return{outer:u,content:u}})():lt(`Findings (${t.length})`,d,f);function a(u){return u.reduce(($,k)=>A[k.severity]<A[$]?k.severity:$,"info")}function p(u){const $=new Map;for(const C of u){const r=`${C.comparison.family}\0${C.comparison.left}`,m=$.get(r)??[];m.push(C),$.set(r,m)}const k=[...$.entries()].map(([C,r])=>{const m=[...r].sort((D,w)=>A[D.severity]-A[w.severity]);return{key:C,findings:m,worst:a(m)}});return k.sort((C,r)=>A[C.worst]-A[r.worst]),k}function v(u,$){const C={ring:"Ring",quadrant:"Quadrant",sector:"Sector","reticle-position":"Reticle","test-site":"Test site",cluster:"Cluster","edge-arc":"Edge arc",wafer:"Wafer"}[u]??u;return $.toLowerCase().startsWith(C.toLowerCase())?$:`${C}: ${$}`}const h=t.filter(u=>u.comparison.family==="spatial-pattern"),T=new Set([...h.flatMap(u=>u.relatedIds??[]),...t.flatMap(u=>u.absorbedIds??[])]),N=t.filter(u=>u.comparison.family!=="spatial-pattern"&&!T.has(u.id)),B=p(N);function E(u,$=!1,k){const C=n===u.id,r=document.createElement("button");return r.type="button",r.dataset.wmapFinding=u.id,r.textContent=ct(u,k),r.title=u.summary,r.setAttribute("aria-current",C?"true":"false"),Object.assign(r.style,{border:`1px solid ${y.menuBorder}`,borderLeft:`3px solid ${G(u.severity)}`,background:C?y.bgActive:y.menuBg,borderRadius:"6px",padding:$?"6px 10px":"8px 10px",textAlign:"left",fontSize:$?"10px":"11px",fontWeight:C?"600":"400",color:y.iconHover,cursor:"pointer",width:"100%",marginBottom:"4px"}),r.addEventListener("click",()=>e(u,r)),r}const R=P(Ct(t)??"");if(R){const u=l("div",{background:y.bgActive,borderRadius:"6px",padding:"8px 10px",marginBottom:"8px",display:"flex",gap:"8px",alignItems:"flex-start"}),$=l("span",{flex:"1",fontSize:"12px",lineHeight:"1.5",color:y.iconHover},R);u.appendChild($);const k=l("button",{flexShrink:"0",border:"none",background:"none",fontSize:"10px",color:y.icon,cursor:"pointer",padding:"0",lineHeight:"1.5",whiteSpace:"nowrap"},"Detail \u25B8");k.type="button",k.addEventListener("click",()=>{const C=at({title:"Findings Summary",onClose:()=>{},anchor:k}),r=l("p",{fontSize:"16px",lineHeight:"1.6",color:y.iconHover,padding:"20px 24px 16px",margin:"0",borderBottom:`1px solid ${y.menuBorder}`,flexShrink:"0"},R);C.contentWrap.appendChild(r);const m=l("div",{overflowY:"auto",padding:"16px 24px",flex:"1"}),D=(w,x)=>{const S=l("div",{display:"flex",alignItems:"center",gap:"7px",fontSize:"13px",fontWeight:"600",color:z,marginTop:"10px",marginBottom:"4px"});return S.appendChild(X(w)),S.appendChild(l("span",{},x)),S};for(const w of h){m.appendChild(D(w.severity,w.comparison.left)),m.appendChild(l("div",{fontSize:"13px",color:y.iconHover,padding:"3px 0 3px 15px",marginBottom:"2px"},P(w.summary)));const x=t.filter(S=>w.relatedIds?.includes(S.id));for(const S of x)m.appendChild(l("div",{fontSize:"12px",color:y.icon,padding:"2px 0 2px 23px",marginBottom:"2px"},P(S.summary)))}for(const w of B){const[x,S]=w.key.split("\0");m.appendChild(D(w.worst,v(x,S)));for(const b of w.findings)m.appendChild(l("div",{fontSize:"13px",color:y.iconHover,padding:"3px 0 3px 15px",marginBottom:"2px"},ct(b,S)))}C.contentWrap.appendChild(m),Object.assign(C.contentWrap.style,{flexDirection:"column",overflow:"hidden"})}),u.appendChild(k),s.appendChild(u)}let L=!0;for(const u of h){L||s.appendChild(l("div",{height:"1px",background:y.separator,margin:"4px 0"})),L=!1;const $=t.filter(D=>u.relatedIds?.includes(D.id)),k=$.length>0,C=l("div",{position:"relative",marginBottom:k?"2px":"4px"}),r=n===u.id,m=document.createElement("button");if(m.type="button",m.dataset.wmapFinding=u.id,Object.assign(m.style,{border:`1px solid ${y.menuBorder}`,borderLeft:`3px solid ${G(u.severity)}`,background:r?y.bgActive:y.menuBg,borderRadius:"6px",padding:"8px 32px 8px 10px",textAlign:"left",fontSize:"11px",fontWeight:r?"600":"500",color:y.iconHover,cursor:"pointer",width:"100%"}),m.textContent=P(u.summary),m.title=u.summary,m.setAttribute("aria-current",r?"true":"false"),m.addEventListener("click",()=>e(u,m)),C.appendChild(m),k){const D=l("div",{display:"none",paddingLeft:"12px",marginBottom:"4px"});for(const S of $)D.appendChild(E(S,!0));C.appendChild(D);let w=!1;const x=l("button",{position:"absolute",top:"50%",right:"8px",transform:"translateY(-50%)",border:"none",background:"none",fontSize:"10px",color:y.icon,cursor:"pointer",padding:"2px 4px",lineHeight:"1"},"\u25B8");x.type="button",x.title="Show supporting findings",x.setAttribute("aria-label","Show supporting findings"),x.setAttribute("aria-expanded","false"),x.addEventListener("click",S=>{S.stopPropagation(),w=!w,D.style.display=w?"block":"none",x.textContent=w?"\u25BE":"\u25B8";const b=w?"Hide supporting findings":"Show supporting findings";x.title=b,x.setAttribute("aria-label",b),x.setAttribute("aria-expanded",String(w))}),C.appendChild(x)}s.appendChild(C)}for(const u of B){L||s.appendChild(l("div",{height:"1px",background:y.separator,margin:"4px 0"})),L=!1;const[$,k]=u.key.split("\0"),C=l("div",{display:"flex",alignItems:"center",gap:"6px",fontSize:"11px",fontWeight:"600",color:z,margin:"2px 0 4px"});C.appendChild(X(u.worst)),C.appendChild(l("span",{},v($,k))),s.appendChild(C);for(const r of u.findings)s.appendChild(E(r,!1,k))}return c}const Ht=[{value:"",label:"All kinds"},{value:"yield",label:"Yield"},{value:"hardBin",label:"Hard bin"},{value:"softBin",label:"Soft bin"},{value:"test",label:"Test value"},{value:"functionalTest",label:"Functional test"},{value:"spatialPattern",label:"Spatial pattern"}],At=[{value:"",label:"All regions"},{value:"ring",label:"Ring"},{value:"quadrant",label:"Quadrant"},{value:"reticle-position",label:"Reticle position"},{value:"test-site",label:"Test site"},{value:"wafer",label:"Wafer"},{value:"sector",label:"Sector"},{value:"cluster",label:"Cluster"},{value:"edge-arc",label:"Edge arc"},{value:"spatial-pattern",label:"Spatial pattern"}],Pt=["unusual","notable","info"],Yt={unusual:"Unusual",notable:"Notable",info:"Info"};function Ot(t,i,e){const n=l("div",{display:"flex",flexWrap:"wrap",alignItems:"center",gap:"10px",marginBottom:"10px",paddingBottom:"10px",borderBottom:`1px solid ${y.separator}`}),o={unusual:0,notable:0,info:0};for(const s of t)o[s.severity]++;const d=Pt.filter(s=>o[s]>0),f=new Set(i.severity===void 0?d:Array.isArray(i.severity)?i.severity:[i.severity]),c=l("div",{display:"flex",gap:"4px",flexWrap:"wrap"});for(const s of d){const a=document.createElement("button");a.type="button";const p=()=>{const v=f.has(s);a.setAttribute("aria-pressed",v?"true":"false"),Object.assign(a.style,{display:"inline-flex",alignItems:"center",gap:"5px",border:`1px solid ${y.menuBorder}`,borderRadius:"10px",background:v?y.bgActive:"none",opacity:v?"1":"0.5",color:y.text,fontSize:"11px",padding:"2px 8px",cursor:"pointer"})};a.appendChild(X(s)),a.appendChild(l("span",{},`${Yt[s]} ${o[s]}`)),a.title=f.has(s)?"Click to hide these findings":"Click to show these findings",p(),a.addEventListener("click",()=>{f.has(s)?f.delete(s):f.add(s),i.severity=f.size===d.length?void 0:[...f],e()}),c.appendChild(a)}return n.appendChild(c),n.appendChild(ot("Kind:",Ht,i.kind??"",s=>{i.kind=s||void 0,e()},{maxWidth:"130px"})),n.appendChild(ot("Region:",At,i.family??"",s=>{i.family=s||void 0,e()},{maxWidth:"150px"})),n}export function buildFindingsSectionWithFilter(t,i,e,n,o){if(!t.findings.length)return null;const d=t.findings.some(v=>v.severity==="unusual"||v.severity==="notable"),f=d?t.findings.filter(v=>v.severity!=="info").length.toString():void 0,{outer:c,content:s}=lt(`Findings (${t.findings.length})`,d,f);s.appendChild(Ot(t.findings,n,o));const a=St(t,n);if(!a.length)return s.appendChild(l("div",{color:W,fontSize:"11px",textAlign:"center",padding:"16px 8px"},"No findings match the current filter.")),c;const p=buildFindingsSection(a,t,i,e,!0);return p&&s.appendChild(p),c}export function buildLotTestSection(t,i,e,n,o){const d=n?.length?{perWaferMetadata:n.map(c=>c.wafer??{}),populationLabel:`${n.length} wafer${n.length===1?"":"s"} pooled`}:void 0;let f;if(n?.length&&n.every(c=>c.stats.perTestStats!==void 0)){const c=new Map;for(const s of n)for(const a of s.stats.perTestStats??[]){const p=c.get(a.testNumber);p?(p.n+=a.count,p.sum+=a.mean*a.count,p.min=Math.min(p.min,a.min),p.max=Math.max(p.max,a.max)):c.set(a.testNumber,{n:a.count,sum:a.mean*a.count,min:a.min,max:a.max})}f={perTestStats:[...c.entries()].map(([s,a])=>({testNumber:s,count:a.n,min:a.min,max:a.max,mean:a.sum/a.n}))}}if(n?.length&&n.every(c=>c.stats.testSpecYield!==void 0)){const c=new Map;for(const s of n)for(const a of s.stats.testSpecYield??[]){const p=c.get(a.testNumber);p?(p.passDies+=a.passDies,p.totalDies+=a.totalDies):c.set(a.testNumber,{passDies:a.passDies,totalDies:a.totalDies})}f={...f,testSpecYield:[...c.entries()].map(([s,a])=>({testNumber:s,totalDies:a.totalDies,yieldPercent:a.totalDies>0?a.passDies/a.totalDies*100:null}))}}return buildTestSection(t,i,e,f,o,d)}export function createSummaryPanelEl(t){const i=t==="top"||t==="bottom",e=l("div",{background:Et,border:Y,borderRadius:"8px",padding:"12px",overflowY:i?"hidden":"auto",overflowX:i?"auto":"hidden",flexShrink:"0",boxSizing:"border-box",fontFamily:"system-ui, sans-serif",fontSize:"12px",boxShadow:"0 1px 4px rgba(0,0,0,0.08)"});return i?(e.style.height="180px",e.style.width="100%"):(e.style.width="260px",e.style.maxHeight="100%"),e}export function wrapWithSummaryPanel(t,i,e){const n=e==="top"||e==="bottom",o=l("div",{display:"flex",flexDirection:n?"column":"row",gap:"8px",width:"100%",height:"100%",flex:"1 1 0",minHeight:"0",boxSizing:"border-box",alignItems:n?"flex-start":"stretch"});return t.style.flex="1 1 0",t.style.minWidth="0",t.style.minHeight="0",e==="right"||e==="bottom"?(o.appendChild(t),o.appendChild(i)):(o.appendChild(i),o.appendChild(t)),o}function ut(t){return l("div",{fontSize:"13px",fontWeight:"700",color:z,marginBottom:"10px"},t)}function q(t,i){const e=l("button",{background:"none",border:Y,borderRadius:"4px",cursor:"pointer",fontSize:"10px",color:y.iconHover,padding:"2px 7px"},t);return e.type="button",e.addEventListener("click",i),e}function ft(...t){const i=t.filter(n=>!!n);if(!i.length)return null;const e=l("div",{display:"flex",flexWrap:"wrap",gap:"6px",marginBottom:"10px"});for(const n of i)e.appendChild(n);return e}function mt(t,i,e,n,o,d,f,c,s){const a=at({title:"Die list",onClose:()=>{},anchor:t}),p=Rt(i,e,{...f,title:n,onSaveText:c,waferMetadata:o,metadataFields:d,extraColumn:s});p&&a.contentWrap.appendChild(p)}export function renderWaferSummaryContent(t,i){const e=t.scrollTop;t.innerHTML="";const{wafer:n,dies:o,yieldSummary:d,dataCoverage:f,hbinDefs:c,sbinDefs:s,testDefs:a,statsSummary:p,passBins:v=[1],ringCount:h=4,colorScheme:T,fallbackFormat:N,onFindingClick:B,activeFindingId:E=null,findingsFilter:R,onFindingsFilterChange:L,onSaveText:u,metadataFields:$,dieListOptions:k}=i;t.appendChild(ut("Wafer Summary"));const C=i.warnings??nt({statsSummary:p});C.length&&t.appendChild(_(C));const r=d&&f?q("Summary report",()=>{J(yt({wafer:n,dies:o,yieldSummary:d,dataCoverage:f,hbinDefs:c,sbinDefs:s,testDefs:a,statsSummary:p,passBins:v,ringCount:h}))}):null,m=(k?.enabled??!0)&&o.length?q("View die list",()=>{mt(t,o,a,`Die list \u2014 ${o.length} dies`,n.metadata,$,k,u)}):null,D=ft(r,m);D&&t.appendChild(D);const w=[],x=p?.stats.isLotStack?p.stats:void 0,S=x?.lotSize!==void 0?{lotSize:x.lotSize,aggrMethod:Lt(x.aggregationMethod)}:void 0;w.push(buildMetadataInfoSection([{metadata:n.metadata??void 0}],S)),d&&f&&w.push(buildYieldSection(d,f,v));const b=o.some(M=>M.hbin!=null),F=o.some(M=>M.sbin!=null);b?w.push(buildBinSection(o,c,"hard",T,p?.stats.hardBinCounts)):F&&w.push(buildBinSection(o,s,"soft",T,p?.stats.softBinCounts)),w.push(buildRingSection(o,n,h,v)),w.push(buildQuadrantSection(o,n,h,v));const I=n.metadata?{waferMetadata:n.metadata}:void 0;w.push(buildTestSection(o,a,N,p?.stats,u,I)),w.push(buildFunctionalTestSection(o,a,p?.stats.functionalYield,u,I)),p&&B&&R&&L&&w.push(buildFindingsSectionWithFilter(p,B,E,R,L));let g=!0;for(const M of w)M&&(g||t.appendChild(dt()),g=!1,t.appendChild(M));t.appendChild(l("div",{height:"12px",flexShrink:"0"})),t.scrollTop=e}export function renderLotSummaryContent(t,i){const e=t.scrollTop;t.innerHTML="";const{lotSummary:n,items:o,hbinDefs:d,sbinDefs:f,testDefs:c,passBins:s=[1],ringCount:a=4,colorScheme:p,fallbackFormat:v,onFindingClick:h,activeFindingId:T=null,onWaferClick:N,findingsFilter:B,onFindingsFilterChange:E,onSaveText:R,dieListOptions:L}=i;t.appendChild(ut(`Lot Summary \u2014 ${n.stats.waferCount} wafer${n.stats.waferCount===1?"":"s"}`));const u=i.warnings??nt({lotStatsSummary:n});u.length&&t.appendChild(_(u));const $=q("Summary report",()=>{J(wt({items:o.map((g,M)=>({label:g?.label??`W${M+1}`,wafer:g?.wafer,dies:g?.dies,statsSummary:g?.statsSummary})),hbinDefs:d,sbinDefs:f,testDefs:c,passBins:s,ringCount:a}))}),k=[],C=[],r=[],m=new WeakMap;for(let g=0;g<o.length;g++){const M=o[g];if(!M){C.push([]);continue}M.wafer&&k.push(M.wafer);const V=M.dies??[],ht=M.label??`W${g+1}`;for(const gt of V)m.set(gt,ht);C.push(V),r.push(...V)}const D=L?.enabled??!0?q("View die list",()=>{r.length&&mt(t,r,c,`Die list \u2014 ${r.length} dies across ${o.length} wafer${o.length===1?"":"s"}`,et(o.filter(g=>!!g).map(g=>({metadata:g.wafer?.metadata}))),o.find(g=>g?.metadataFields?.length)?.metadataFields,L,R,{label:"Wafer",get:g=>m.get(g)})}):null,w=ft($,D);w&&t.appendChild(w);const x=r.some(g=>g.hbin!=null),S=r.some(g=>g.sbin!=null),b=o.map(g=>g?.statsSummary).filter(g=>!!g),F=[buildLotOverviewSection(n),buildMetadataInfoSection(o.filter(g=>g!==null).map(g=>({metadata:g.wafer?.metadata}))),buildPerWaferYieldSection(n,o,N),x?buildLotBinSection(r,d,"hard",p):S?buildLotBinSection(r,f,"soft",p):null,buildLotRingSection(C,k,a,s),buildLotQuadrantSection(C,k,a,s),c?.length?buildLotTestSection(r,c,v,b,R):null,c?.length?buildLotFunctionalSection(r,c,b,R):null];h&&B&&E&&F.push(buildFindingsSectionWithFilter(n,h,T,B,E));let I=!0;for(const g of F)g&&(I||t.appendChild(dt()),I=!1,t.appendChild(g));t.appendChild(l("div",{height:"12px",flexShrink:"0"})),t.scrollTop=e}
1
+ import{isParametricTest as xt}from"../renderer/buildWaferMap.js";import{buildRingRegions as K,buildQuadrantRegions as Z,buildRegionYieldData as bt}from"../stats/regions.js";import{computeFunctionalYield as vt}from"../stats/analyzeWaferMap.js";import{openHtmlReport as J}from"../stats/renderFindingsReport.js";import{renderSummaryReportHtml as wt,renderLotSummaryReportHtml as yt}from"../stats/renderSummaryReport.js";import{buildFindingsNarrative as Ct}from"../stats/findingsNarrative.js";import{filterFindings as St}from"../stats/filterFindings.js";import{buildFacetTable as kt,prettyKey as tt}from"../stats/facets.js";import{commonMetadata as et}from"../stats/facets.js";import{resolveMetadataColumns as Bt}from"../stats/metadataColumns.js";import{getColorScheme as $t}from"../renderer/colorSchemes.js";import{buildWarningsBanner as _,collectWarnings as nt}from"./warnings.js";export{_ as buildWarningsBanner};import{fmt as it,fmtAggregationMethod as Lt,plainBinTerms as P}from"../renderer/fmt.js";import{getUniqueTestNumbers as Dt}from"../renderer/buildView.js";import{quantile as Q}from"../stats/math.js";import{makeLabeledSelect as ot}from"./charts/chartShell.js";import{CLR as w,sevColor as G,openModal as at,saveTextFile as rt}from"./toolbar.js";import{buildDieListSection as Rt}from"./dieList.js";import{medianOfSorted as Ft}from"../core/utils.js";import{metadataDisplayValue as Tt}from"../core/metadata.js";const Et=w.panelBg,Y=`1px solid ${w.menuBorder}`,Nt="12px",I=w.label,z=w.value,st="10px";function l(t,i,n,e=document){const o=e.createElement(t);return i&&Object.assign(o.style,i),n!==void 0&&(o.textContent=n),o}function H(t){return l("div",{fontSize:st,fontWeight:"700",letterSpacing:"0.06em",textTransform:"uppercase",color:I,marginBottom:"6px"},t)}function lt(t,i=!0,n){const e=l("div"),o=document.createElement("button");o.type="button",Object.assign(o.style,{display:"flex",alignItems:"center",gap:"4px",width:"100%",background:"none",border:"none",cursor:"pointer",padding:"0 0 6px",textAlign:"left"});const d=l("span",{fontSize:"9px",color:I,transition:"transform 0.15s",transform:i?"rotate(90deg)":"rotate(0deg)",display:"inline-block",lineHeight:"1",marginRight:"1px"},"\u25B6"),f=l("span",{fontSize:st,fontWeight:"700",letterSpacing:"0.06em",textTransform:"uppercase",color:I,flex:"1"},t);if(o.setAttribute("aria-expanded",i?"true":"false"),o.appendChild(d),o.appendChild(f),n){const a=l("span",{fontSize:"9px",fontWeight:"700",background:w.warnBg,color:w.warnText,borderRadius:"10px",padding:"1px 5px"},n);o.appendChild(a)}const c=l("div");c.style.display=i?"block":"none";let s=i;return o.addEventListener("click",()=>{s=!s,c.style.display=s?"block":"none",d.style.transform=s?"rotate(90deg)":"rotate(0deg)",o.setAttribute("aria-expanded",s?"true":"false")}),e.appendChild(o),e.appendChild(c),{outer:e,content:c}}function dt(){return l("div",{height:"1px",background:w.separator,margin:`${Nt} 0`,flexShrink:"0"})}function U(t,i,n=w.barFill,e,o,d){const f=l("div",{marginBottom:"5px"}),c=l("div",{display:"flex",justifyContent:"space-between",fontSize:"11px",color:z,marginBottom:"2px"}),s=l("span",{},t),a=l("span",{fontWeight:"600"},`${i.toFixed(1)}%`);c.appendChild(s),c.appendChild(a);const p=e!==void 0?e:Math.min(100,Math.max(0,i)),h=d?w.barFillMuted:n,g=l("div",{position:"relative",height:"9px",background:w.bgActive,borderRadius:"4px",overflow:"hidden"}),T=l("div",{height:"100%",width:`${p}%`,background:h,borderRadius:"4px",transition:"width 0.3s ease"});if(g.appendChild(T),o!==void 0){const N=l("div",{position:"absolute",top:"0",bottom:"0",left:`${o}%`,width:"1px",background:w.infoText,opacity:"0.5"});g.appendChild(N)}return f.appendChild(c),f.appendChild(g),f}function O(t,i,n){const e=l("div",{background:w.menuBg,border:Y,borderRadius:"6px",padding:"8px 10px",textAlign:"center",flex:"1"}),o=l("div",{fontSize:"20px",fontWeight:"700",color:z,lineHeight:"1.2"},t),d=l("div",{fontSize:"10px",color:I,marginTop:"2px"},i);return e.appendChild(o),e.appendChild(d),n&&e.appendChild(l("div",{fontSize:"9px",color:I,opacity:"0.85"},n)),e}function Mt(t,i){const n=l("div",{display:"flex",justifyContent:"space-between",fontSize:"11px",gap:"8px",marginBottom:"3px"}),e=l("span",{color:I,flexShrink:"0"},t),o=l("span",{color:z,textAlign:"right",fontWeight:"500",wordBreak:"break-all"},i);return n.appendChild(e),n.appendChild(o),n}function Wt(t,i){const n=l("div",{display:"flex",fontSize:"11px",gap:"6px",marginBottom:"3px"}),e=l("span",{color:I,flexShrink:"0"},`${t}:`),o=l("span",{color:z,fontWeight:"500",wordBreak:"break-all"},i);return n.appendChild(e),n.appendChild(o),n}export function metadataEntries(t){const i=[];for(const[n,e]of Object.entries(t)){const o=Tt(e);o!==void 0&&i.push([n,o])}return i}export function buildFacetSummaryChips(t,i=3){if(!t.length)return null;const n=l("div",{display:"flex",flexWrap:"wrap",alignItems:"baseline",gap:"4px 10px",fontSize:"11px"});for(const e of t){const o=l("span",{whiteSpace:"nowrap"}),d=l("span",{color:I},`${tt(e.key)}: `);o.appendChild(d);const f=e.values.slice(0,i),c=e.values.length-f.length;let s=f.map(a=>a.value).join(", ");c>0&&(s+=` +${c} more`),o.appendChild(document.createTextNode(s)),n.appendChild(o)}return n}export function buildMetadataStripRow(t,i,n){const e=kt(t,n),o=buildFacetSummaryChips(e);if(!o&&!i)return null;const d=l("div",{display:"flex",flexWrap:"wrap",alignItems:"baseline",gap:"4px 14px"});if(i){const f=l("span",{fontWeight:"500",whiteSpace:"nowrap"},i.aggrMethod?`${i.lotSize} wafers stacked \xB7 ${i.aggrMethod}`:`${i.lotSize} wafers stacked`);d.appendChild(f)}return o&&d.appendChild(o),d}const It={display:"flex",flexDirection:"column",gap:"6px",background:w.menuBg,border:`1px solid ${w.menuBorder}`,borderRadius:"6px",padding:"6px 10px",boxShadow:"0 1px 4px rgba(0,0,0,0.10)",fontSize:"12px",lineHeight:"1",boxSizing:"border-box",width:"100%",minWidth:"0"};export function buildMetadataStripBox(t,i,n){const e=buildMetadataStripRow(t,i,n);if(!e)return null;const o=l("div",It);return o.appendChild(e),o}export function buildCompactMetadataRows(t){const i=metadataEntries(t);if(!i.length)return null;const n=l("div");for(const[e,o]of i)n.appendChild(Wt(tt(e),o));return n}export function buildMetadataInfoSection(t,i){const n=buildMetadataStripRow(t,i,{facetableOnly:t.length>1});if(!n)return null;const e=l("div");return e.appendChild(H("Wafer Info")),e.appendChild(n),e}export function buildYieldSection(t,i,n=[1]){const e=l("div");e.appendChild(H("Summary"));const o=l("div",{display:"flex",gap:"6px",marginBottom:"8px"});if(o.appendChild(O(String(t.totalDies),"Total dies")),t.partialDies>0&&o.appendChild(O(String(t.partialDies),"Partial")),t.yieldPercent!==null){const d=n.length===1?`bin ${n[0]}`:`bins ${n.join(", ")}`;o.appendChild(O(`${t.yieldPercent.toFixed(1)}%`,"Yield",`pass: ${d}`))}return e.appendChild(o),t.edgeExcludedDies>0&&e.appendChild(Mt("Edge excluded (outer zone)",String(t.edgeExcludedDies))),e}export function buildBinSection(t,i,n,e,o){const d=new Map;if(o)for(const[p,h]of Object.entries(o))d.set(Number(p),h);else for(const p of t){if(p.partial||p.edgeExcluded)continue;const h=n==="hard"?p.hbin:p.sbin;h!=null&&d.set(h,(d.get(h)??0)+1)}if(!d.size)return null;const f=[...d.values()].reduce((p,h)=>p+h,0),c=i?new Map(i.map(p=>[p.bin,p])):null,s=[...d.entries()].sort((p,h)=>p[0]-h[0]),a=l("div");a.appendChild(H(n==="hard"?"Hard Bin Breakdown":"Soft Bin Breakdown"));for(const[p,h]of s){const g=c?.get(p),T=g?.name?`Bin ${p} \xB7 ${g.name}`:`Bin ${p}`,N=h/f*100,B=$t(e),E=(e==="custom"?g?.color:void 0)??B.forBin(p);a.appendChild(U(`${T} (${h})`,N,E))}return a}export function buildLotBinSection(t,i,n,e){return buildBinSection(t,i,n,e)}function j(t,i,n,e,o,d){const f=bt(t,i,n,e,o);if(!f.length)return null;const c=l("div");c.appendChild(H(d));for(const{label:s,n:a,yieldPercent:p}of f)c.appendChild(U(`${s} (N=${a})`,p));return c}export function buildRingSection(t,i,n,e){return j([t],[i],n,e,K,"Ring Yield")}export function buildQuadrantSection(t,i,n,e){return j([t],[i],n,e,Z,"Quadrant Yield")}export function buildLotRingSection(t,i,n,e){return j(t,i,n,e,K,"Ring Yield")}export function buildLotQuadrantSection(t,i,n,e){return j(t,i,n,e,Z,"Quadrant Yield")}export function buildLotOverviewSection(t){const i=l("div");i.appendChild(H("Lot Summary"));const n=l("div",{display:"flex",gap:"6px",marginBottom:"8px"});n.appendChild(O(String(t.stats.waferCount),"Wafers"));const e=t.perWafer.map(o=>o.summary.stats.yieldPercent).filter(o=>o!==null);if(e.length){const o=e.reduce((d,f)=>d+f,0)/e.length;n.appendChild(O(`${o.toFixed(1)}%`,"Mean wafer yield"))}return i.appendChild(n),i}export function buildPerWaferYieldSection(t,i,n){const e=t.perWafer.map(a=>({waferIndex:a.waferIndex,label:(i[a.waferIndex]?.label??`W${a.waferIndex+1}`).replace(/\s*·\s*\d+(\.\d+)?%$/,""),yieldPct:a.summary.stats.yieldPercent})).filter(a=>a.yieldPct!==null);if(!e.length)return null;const o=Math.min(...e.map(a=>a.yieldPct)),d=Math.max(...e.map(a=>a.yieldPct)),f=o===d?"":` (${o.toFixed(1)}\u2013${d.toFixed(1)}%)`,c=Ft([...e.map(a=>a.yieldPct)].sort((a,p)=>a-p)),s=l("div");s.appendChild(H("Wafer Yield"+f));for(const{waferIndex:a,label:p,yieldPct:h}of e){const g=U(p,h,void 0,void 0,c,h<c);n&&(g.style.cursor="pointer",g.style.borderRadius="4px",g.style.padding="2px 3px",g.style.marginLeft="-3px",g.style.marginRight="-3px",g.setAttribute("role","button"),g.setAttribute("aria-label",`${p}, ${h.toFixed(1)}% yield \u2014 view wafer`),g.tabIndex=0,g.addEventListener("mouseenter",()=>{g.style.background=w.bgHover}),g.addEventListener("mouseleave",()=>{g.style.background=""}),g.addEventListener("focus",()=>{g.style.background=w.bgHover}),g.addEventListener("blur",()=>{g.style.background=""}),g.addEventListener("click",()=>n(a)),g.addEventListener("keydown",T=>{(T.key==="Enter"||T.key===" ")&&(T.preventDefault(),n(a))})),s.appendChild(g)}return s}function zt(t){const i=[...t].sort((o,d)=>o-d),n=t.reduce((o,d)=>o+d,0)/t.length,e=t.reduce((o,d)=>o+(d-n)**2,0)/t.length;return{min:i[0],max:i[i.length-1],mean:n,count:t.length,stddev:Math.sqrt(e),median:Q(i,.5),q1:Q(i,.25),q3:Q(i,.75)}}function pt(t,i){if(!t)return[];const n=t.waferMetadata??(t.perWaferMetadata?et(t.perWaferMetadata.map(e=>({metadata:e}))):void 0);return!n||!Object.keys(n).length?[]:Bt({waferMetadata:n,waferPlacement:"csv",reservedLabels:i}).columns}export function csvField(t){return/[",\n]/.test(t)?`"${t.replace(/"/g,'""')}"`:t}export function buildTestSection(t,i,n,e,o,d){const f=t.filter(r=>!r.partial&&!r.edgeExcluded),c=new Map((e?.perTestStats??[]).map(r=>[r.testNumber,r])),s=new Map((e?.testSpecYield??[]).map(r=>[r.testNumber,r]));let a;if(i?.length?a=i.filter(xt).map(r=>({testNumber:r.testNumber,name:r.name,unit:r.unit,limitLow:r.limitLow,limitHigh:r.limitHigh})):a=Dt(f).map(m=>({testNumber:m,name:`Test ${m}`})),!a.length)return null;const p=a.filter(r=>f.some(m=>{const D=m.testValues?.[r.testNumber];return D!==void 0&&isFinite(D)}));if(!p.length)return null;const h=p.some(r=>r.limitLow!==void 0||r.limitHigh!==void 0),g=[];for(const r of p){const m=c.get(r.testNumber),D=m&&m.stddev!==void 0&&m.median!==void 0&&m.q1!==void 0&&m.q3!==void 0;let y;if(D){const v=m;y={testNumber:r.testNumber,min:v.min,max:v.max,mean:v.mean,count:v.count,stddev:v.stddev,median:v.median,q1:v.q1,q3:v.q3}}else{const v=f.map(F=>F.testValues?.[r.testNumber]).filter(F=>F!==void 0&&isFinite(F));if(!v.length)continue;y={testNumber:r.testNumber,...zt(v)}}let b=null,S=0;if(r.limitLow!==void 0||r.limitHigh!==void 0){const v=s.get(r.testNumber);if(v)({yieldPercent:b,totalDies:S}=v);else{const F=f.map(x=>x.testValues?.[r.testNumber]).filter(x=>x!==void 0&&isFinite(x)),W=F.filter(x=>r.limitLow!==void 0&&x<r.limitLow||r.limitHigh!==void 0&&x>r.limitHigh).length;S=F.length,b=F.length>0?(F.length-W)/F.length*100:null}}g.push({entry:r,stats:y,specYieldPct:b,specN:S})}if(!g.length)return null;const T=l("div"),N=l("div",{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:"6px"}),B=H(d?.populationLabel?`Test Values (${g.length}) \u2014 ${d.populationLabel}`:`Test Values (${g.length})`);B.style.marginBottom="0",N.appendChild(B);const E=document.createElement("button");E.type="button",E.textContent="Export CSV",Object.assign(E.style,{background:"none",border:Y,borderRadius:"4px",cursor:"pointer",fontSize:"10px",color:w.iconHover,padding:"2px 7px"}),E.addEventListener("click",()=>{const r=["Test","Unit","N","Min","Q1","Median","Mean","Q3","Max","StdDev"];h&&r.push("LSL","USL","Spec Yield %","Spec Yield N");const m=pt(d,r),y=[[...m.map(S=>S.label),...r].map(csvField).join(",")],b=S=>it(S,void 0,"engineering");for(const{entry:S,stats:v,specYieldPct:F,specN:W}of g){const x=[...m.map(M=>M.constant??""),S.name,S.unit??"",String(v.count),b(v.min),b(v.q1),b(v.median),b(v.mean),b(v.q3),b(v.max),b(v.stddev)];h&&x.push(S.limitLow!==void 0?b(S.limitLow):"",S.limitHigh!==void 0?b(S.limitHigh):"",F!==null?F.toFixed(1):"",S.limitLow!==void 0||S.limitHigh!==void 0?String(W):""),y.push(x.map(csvField).join(","))}rt(y.join(`
2
+ `),"test-values.csv","text/csv",o)}),N.appendChild(E),T.appendChild(N);const R=l("table",{width:"100%",borderCollapse:"collapse",fontSize:"11px"}),L=document.createElement("thead"),u=document.createElement("tr"),$=["Test","N","Min","Q1","Median","Mean","Q3","Max","StdDev"];h&&$.push("LSL","USL","Spec yield");for(const r of $){const m=l("th",{textAlign:r==="Test"?"left":"right",fontWeight:"700",fontSize:"10px",letterSpacing:"0.03em",textTransform:"uppercase",color:I,padding:"3px 8px 5px",borderBottom:`1px solid ${w.menuBorder}`,whiteSpace:"nowrap"},r);u.appendChild(m)}L.appendChild(u),R.appendChild(L);const k=document.createElement("tbody");for(const{entry:r,stats:m,specYieldPct:D,specN:y}of g){const b=F=>it(F,r.unit,n),S=document.createElement("tr"),v=(F,W="right")=>{const x=l("td",{textAlign:W,padding:"4px 8px",borderBottom:`1px solid ${w.menuBorder}`,color:z,whiteSpace:"nowrap"},F);S.appendChild(x)};v(r.name,"left"),v(`${m.count}`),v(b(m.min)),v(b(m.q1)),v(b(m.median)),v(b(m.mean)),v(b(m.q3)),v(b(m.max)),v(b(m.stddev)),h&&(v(r.limitLow!==void 0?b(r.limitLow):"\u2014"),v(r.limitHigh!==void 0?b(r.limitHigh):"\u2014"),v(D!==null?`${D.toFixed(1)}% (N=${y})`:"\u2014")),k.appendChild(S)}R.appendChild(k);const C=l("div",{overflowX:"auto"});return C.appendChild(R),T.appendChild(C),T}export function buildFunctionalTestSection(t,i,n,e,o){const d=n??vt(t,i);if(!d?.length)return null;const f=l("div"),c=l("div",{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:"6px"}),s=H(o?.populationLabel?`Functional Tests (${d.length}) \u2014 ${o.populationLabel}`:`Functional Tests (${d.length})`);s.style.marginBottom="0",c.appendChild(s);const a=document.createElement("button");a.type="button",a.textContent="Export CSV",Object.assign(a.style,{background:"none",border:Y,borderRadius:"4px",cursor:"pointer",fontSize:"10px",color:w.iconHover,padding:"2px 7px"}),a.addEventListener("click",()=>{const B=["Test","N","Pass","Fail","Pass Rate %"],E=pt(o,B),R=[[...E.map(L=>L.label),...B].map(csvField).join(",")];for(const L of d)R.push([...E.map(u=>u.constant??""),L.label,String(L.totalDies),String(L.passDies),String(L.failDies),L.passRatePercent!==null?L.passRatePercent.toFixed(1):""].map(csvField).join(","));rt(R.join(`
3
+ `),"functional-tests.csv","text/csv",e)}),c.appendChild(a),f.appendChild(c);const p=l("table",{width:"100%",borderCollapse:"collapse",fontSize:"11px"}),h=document.createElement("thead"),g=document.createElement("tr");for(const B of["Test","N","Pass","Fail","Pass rate"])g.appendChild(l("th",{textAlign:B==="Test"?"left":"right",fontWeight:"700",fontSize:"10px",letterSpacing:"0.03em",textTransform:"uppercase",color:I,padding:"3px 8px 5px",borderBottom:`1px solid ${w.menuBorder}`,whiteSpace:"nowrap"},B));h.appendChild(g),p.appendChild(h);const T=document.createElement("tbody");for(const B of d){const E=document.createElement("tr"),R=(L,u="right")=>{E.appendChild(l("td",{textAlign:u,padding:"4px 8px",borderBottom:`1px solid ${w.menuBorder}`,color:z,whiteSpace:"nowrap"},L))};R(B.label,"left"),R(String(B.totalDies)),R(String(B.passDies)),R(String(B.failDies)),R(B.passRatePercent!==null?`${B.passRatePercent.toFixed(1)}% (N=${B.totalDies})`:"\u2014"),T.appendChild(E)}p.appendChild(T);const N=l("div",{overflowX:"auto"});return N.appendChild(p),f.appendChild(N),f}export function buildLotFunctionalSection(t,i,n,e){const o=n?.length?{perWaferMetadata:n.map(d=>d.wafer??{}),populationLabel:`${n.length} wafer${n.length===1?"":"s"} pooled`}:void 0;if(n?.length&&n.every(d=>d.stats.functionalYield!==void 0)){const d=new Map;for(const c of n)for(const s of c.stats.functionalYield??[]){const a=d.get(s.testNumber)??{label:s.label,passDies:0,failDies:0,totalDies:0};a.passDies+=s.passDies,a.failDies+=s.failDies,a.totalDies+=s.totalDies,d.set(s.testNumber,a)}const f=[...d.entries()].map(([c,s])=>({testNumber:c,...s,passRatePercent:s.totalDies>0?s.passDies/s.totalDies*100:null}));if(f.length)return buildFunctionalTestSection(t,i,f,e,o)}return buildFunctionalTestSection(t,i,void 0,e,o)}const A={unusual:0,notable:1,info:2};function X(t){return l("span",{display:"inline-block",width:"7px",height:"7px",borderRadius:"50%",background:G(t),flexShrink:"0"})}function ct(t,i){let n=t.summary;return i&&(n.startsWith(`${i} has `)?n=n.slice(i.length+5):n.startsWith(`${i} `)&&(n=n.slice(i.length+1))),n=P(n),n.length?n[0].toUpperCase()+n.slice(1):n}export function buildFindingsSection(t,i,n,e,o=!1){if(!t.length)return null;const d=t.some(u=>u.severity==="unusual"||u.severity==="notable"),f=d?t.filter(u=>u.severity!=="info").length.toString():void 0,{outer:c,content:s}=o?(()=>{const u=l("div");return{outer:u,content:u}})():lt(`Findings (${t.length})`,d,f);function a(u){return u.reduce(($,k)=>A[k.severity]<A[$]?k.severity:$,"info")}function p(u){const $=new Map;for(const C of u){const r=`${C.comparison.family}\0${C.comparison.left}`,m=$.get(r)??[];m.push(C),$.set(r,m)}const k=[...$.entries()].map(([C,r])=>{const m=[...r].sort((D,y)=>A[D.severity]-A[y.severity]);return{key:C,findings:m,worst:a(m)}});return k.sort((C,r)=>A[C.worst]-A[r.worst]),k}function h(u,$){const C={ring:"Ring",quadrant:"Quadrant",sector:"Sector","reticle-position":"Reticle","test-site":"Test site",cluster:"Cluster","edge-arc":"Edge arc",wafer:"Wafer"}[u]??u;return $.toLowerCase().startsWith(C.toLowerCase())?$:`${C}: ${$}`}const g=t.filter(u=>u.comparison.family==="spatial-pattern"),T=new Set([...g.flatMap(u=>u.relatedIds??[]),...t.flatMap(u=>u.absorbedIds??[])]),N=t.filter(u=>u.comparison.family!=="spatial-pattern"&&!T.has(u.id)),B=p(N);function E(u,$=!1,k){const C=e===u.id,r=document.createElement("button");return r.type="button",r.dataset.wmapFinding=u.id,r.textContent=ct(u,k),r.title=u.summary,r.setAttribute("aria-current",C?"true":"false"),Object.assign(r.style,{border:`1px solid ${w.menuBorder}`,borderLeft:`3px solid ${G(u.severity)}`,background:C?w.bgActive:w.menuBg,borderRadius:"6px",padding:$?"6px 10px":"8px 10px",textAlign:"left",fontSize:$?"10px":"11px",fontWeight:C?"600":"400",color:w.iconHover,cursor:"pointer",width:"100%",marginBottom:"4px"}),r.addEventListener("click",()=>n(u,r)),r}const R=P(Ct(t)??"");if(R){const u=l("div",{background:w.bgActive,borderRadius:"6px",padding:"8px 10px",marginBottom:"8px",display:"flex",gap:"8px",alignItems:"flex-start"}),$=l("span",{flex:"1",fontSize:"12px",lineHeight:"1.5",color:w.iconHover},R);u.appendChild($);const k=l("button",{flexShrink:"0",border:"none",background:"none",fontSize:"10px",color:w.icon,cursor:"pointer",padding:"0",lineHeight:"1.5",whiteSpace:"nowrap"},"Detail \u25B8");k.type="button",k.addEventListener("click",()=>{const C=at({title:"Findings Summary",onClose:()=>{},anchor:k}),r=l("p",{fontSize:"16px",lineHeight:"1.6",color:w.iconHover,padding:"20px 24px 16px",margin:"0",borderBottom:`1px solid ${w.menuBorder}`,flexShrink:"0"},R);C.contentWrap.appendChild(r);const m=l("div",{overflowY:"auto",padding:"16px 24px",flex:"1"}),D=(y,b)=>{const S=l("div",{display:"flex",alignItems:"center",gap:"7px",fontSize:"13px",fontWeight:"600",color:z,marginTop:"10px",marginBottom:"4px"});return S.appendChild(X(y)),S.appendChild(l("span",{},b)),S};for(const y of g){m.appendChild(D(y.severity,y.comparison.left)),m.appendChild(l("div",{fontSize:"13px",color:w.iconHover,padding:"3px 0 3px 15px",marginBottom:"2px"},P(y.summary)));const b=t.filter(S=>y.relatedIds?.includes(S.id));for(const S of b)m.appendChild(l("div",{fontSize:"12px",color:w.icon,padding:"2px 0 2px 23px",marginBottom:"2px"},P(S.summary)))}for(const y of B){const[b,S]=y.key.split("\0");m.appendChild(D(y.worst,h(b,S)));for(const v of y.findings)m.appendChild(l("div",{fontSize:"13px",color:w.iconHover,padding:"3px 0 3px 15px",marginBottom:"2px"},ct(v,S)))}C.contentWrap.appendChild(m),Object.assign(C.contentWrap.style,{flexDirection:"column",overflow:"hidden"})}),u.appendChild(k),s.appendChild(u)}let L=!0;for(const u of g){L||s.appendChild(l("div",{height:"1px",background:w.separator,margin:"4px 0"})),L=!1;const $=t.filter(D=>u.relatedIds?.includes(D.id)),k=$.length>0,C=l("div",{position:"relative",marginBottom:k?"2px":"4px"}),r=e===u.id,m=document.createElement("button");if(m.type="button",m.dataset.wmapFinding=u.id,Object.assign(m.style,{border:`1px solid ${w.menuBorder}`,borderLeft:`3px solid ${G(u.severity)}`,background:r?w.bgActive:w.menuBg,borderRadius:"6px",padding:"8px 32px 8px 10px",textAlign:"left",fontSize:"11px",fontWeight:r?"600":"500",color:w.iconHover,cursor:"pointer",width:"100%"}),m.textContent=P(u.summary),m.title=u.summary,m.setAttribute("aria-current",r?"true":"false"),m.addEventListener("click",()=>n(u,m)),C.appendChild(m),k){const D=l("div",{display:"none",paddingLeft:"12px",marginBottom:"4px"});for(const S of $)D.appendChild(E(S,!0));C.appendChild(D);let y=!1;const b=l("button",{position:"absolute",top:"50%",right:"8px",transform:"translateY(-50%)",border:"none",background:"none",fontSize:"10px",color:w.icon,cursor:"pointer",padding:"2px 4px",lineHeight:"1"},"\u25B8");b.type="button",b.title="Show supporting findings",b.setAttribute("aria-label","Show supporting findings"),b.setAttribute("aria-expanded","false"),b.addEventListener("click",S=>{S.stopPropagation(),y=!y,D.style.display=y?"block":"none",b.textContent=y?"\u25BE":"\u25B8";const v=y?"Hide supporting findings":"Show supporting findings";b.title=v,b.setAttribute("aria-label",v),b.setAttribute("aria-expanded",String(y))}),C.appendChild(b)}s.appendChild(C)}for(const u of B){L||s.appendChild(l("div",{height:"1px",background:w.separator,margin:"4px 0"})),L=!1;const[$,k]=u.key.split("\0"),C=l("div",{display:"flex",alignItems:"center",gap:"6px",fontSize:"11px",fontWeight:"600",color:z,margin:"2px 0 4px"});C.appendChild(X(u.worst)),C.appendChild(l("span",{},h($,k))),s.appendChild(C);for(const r of u.findings)s.appendChild(E(r,!1,k))}return c}const Ht=[{value:"",label:"All kinds"},{value:"yield",label:"Yield"},{value:"hardBin",label:"Hard bin"},{value:"softBin",label:"Soft bin"},{value:"test",label:"Test value"},{value:"functionalTest",label:"Functional test"},{value:"spatialPattern",label:"Spatial pattern"}],At=[{value:"",label:"All regions"},{value:"ring",label:"Ring"},{value:"quadrant",label:"Quadrant"},{value:"reticle-position",label:"Reticle position"},{value:"test-site",label:"Test site"},{value:"wafer",label:"Wafer"},{value:"sector",label:"Sector"},{value:"cluster",label:"Cluster"},{value:"edge-arc",label:"Edge arc"},{value:"spatial-pattern",label:"Spatial pattern"}],Pt=["unusual","notable","info"],Yt={unusual:"Unusual",notable:"Notable",info:"Info"};function Ot(t,i,n){const e=l("div",{display:"flex",flexWrap:"wrap",alignItems:"center",gap:"10px",marginBottom:"10px",paddingBottom:"10px",borderBottom:`1px solid ${w.separator}`}),o={unusual:0,notable:0,info:0};for(const s of t)o[s.severity]++;const d=Pt.filter(s=>o[s]>0),f=new Set(i.severity===void 0?d:Array.isArray(i.severity)?i.severity:[i.severity]),c=l("div",{display:"flex",gap:"4px",flexWrap:"wrap"});for(const s of d){const a=document.createElement("button");a.type="button";const p=()=>{const h=f.has(s);a.setAttribute("aria-pressed",h?"true":"false"),Object.assign(a.style,{display:"inline-flex",alignItems:"center",gap:"5px",border:`1px solid ${w.menuBorder}`,borderRadius:"10px",background:h?w.bgActive:"none",opacity:h?"1":"0.5",color:w.text,fontSize:"11px",padding:"2px 8px",cursor:"pointer"})};a.appendChild(X(s)),a.appendChild(l("span",{},`${Yt[s]} ${o[s]}`)),a.title=f.has(s)?"Click to hide these findings":"Click to show these findings",p(),a.addEventListener("click",()=>{f.has(s)?f.delete(s):f.add(s),i.severity=f.size===d.length?void 0:[...f],n()}),c.appendChild(a)}return e.appendChild(c),e.appendChild(ot("Kind:",Ht,i.kind??"",s=>{i.kind=s||void 0,n()},{maxWidth:"130px"})),e.appendChild(ot("Region:",At,i.family??"",s=>{i.family=s||void 0,n()},{maxWidth:"150px"})),e}export function buildFindingsSectionWithFilter(t,i,n,e,o){if(!t.findings.length)return null;const d=t.findings.some(h=>h.severity==="unusual"||h.severity==="notable"),f=d?t.findings.filter(h=>h.severity!=="info").length.toString():void 0,{outer:c,content:s}=lt(`Findings (${t.findings.length})`,d,f);s.appendChild(Ot(t.findings,e,o));const a=St(t,e);if(!a.length)return s.appendChild(l("div",{color:I,fontSize:"11px",textAlign:"center",padding:"16px 8px"},"No findings match the current filter.")),c;const p=buildFindingsSection(a,t,i,n,!0);return p&&s.appendChild(p),c}export function buildLotTestSection(t,i,n,e,o){const d=e?.length?{perWaferMetadata:e.map(c=>c.wafer??{}),populationLabel:`${e.length} wafer${e.length===1?"":"s"} pooled`}:void 0;let f;if(e?.length&&e.every(c=>c.stats.perTestStats!==void 0)){const c=new Map;for(const s of e)for(const a of s.stats.perTestStats??[]){const p=c.get(a.testNumber);p?(p.n+=a.count,p.sum+=a.mean*a.count,p.min=Math.min(p.min,a.min),p.max=Math.max(p.max,a.max)):c.set(a.testNumber,{n:a.count,sum:a.mean*a.count,min:a.min,max:a.max})}f={perTestStats:[...c.entries()].map(([s,a])=>({testNumber:s,count:a.n,min:a.min,max:a.max,mean:a.sum/a.n}))}}if(e?.length&&e.every(c=>c.stats.testSpecYield!==void 0)){const c=new Map;for(const s of e)for(const a of s.stats.testSpecYield??[]){const p=c.get(a.testNumber);p?(p.passDies+=a.passDies,p.totalDies+=a.totalDies):c.set(a.testNumber,{passDies:a.passDies,totalDies:a.totalDies})}f={...f,testSpecYield:[...c.entries()].map(([s,a])=>({testNumber:s,totalDies:a.totalDies,yieldPercent:a.totalDies>0?a.passDies/a.totalDies*100:null}))}}return buildTestSection(t,i,n,f,o,d)}export function createSummaryPanelEl(t,i=document){const n=t==="top"||t==="bottom",e=l("div",{background:Et,border:Y,borderRadius:"6px",padding:"12px",overflowY:n?"hidden":"auto",overflowX:n?"auto":"hidden",flexShrink:"0",boxSizing:"border-box",fontFamily:"system-ui, sans-serif",fontSize:"12px",boxShadow:"0 1px 4px rgba(0,0,0,0.08)"},void 0,i);return n?(e.style.height="180px",e.style.width="100%"):(e.style.width="260px",e.style.maxHeight="100%"),e}export function wrapWithSummaryPanel(t,i,n){const e=n==="top"||n==="bottom",o=l("div",{display:"flex",flexDirection:e?"column":"row",gap:"8px",width:"100%",height:"100%",flex:"1 1 0",minHeight:"0",boxSizing:"border-box",alignItems:e?"flex-start":"stretch"});return t.style.flex="1 1 0",t.style.minWidth="0",t.style.minHeight="0",n==="right"||n==="bottom"?(o.appendChild(t),o.appendChild(i)):(o.appendChild(i),o.appendChild(t)),o}function ut(t){return l("div",{fontSize:"13px",fontWeight:"700",color:z,marginBottom:"10px"},t)}function q(t,i){const n=l("button",{background:"none",border:Y,borderRadius:"4px",cursor:"pointer",fontSize:"10px",color:w.iconHover,padding:"2px 7px"},t);return n.type="button",n.addEventListener("click",i),n}function ft(...t){const i=t.filter(e=>!!e);if(!i.length)return null;const n=l("div",{display:"flex",flexWrap:"wrap",gap:"6px",marginBottom:"10px"});for(const e of i)n.appendChild(e);return n}function mt(t,i,n,e,o,d,f,c,s){const a=t.ownerDocument,p=at({title:"Die list",onClose:()=>{},anchor:t,ownerDocument:a});p.contentWrap.style.padding="14px 16px";const h=Rt(i,n,{...f,title:e,onSaveText:c,waferMetadata:o,metadataFields:d,extraColumn:s,ownerDocument:a});h&&p.contentWrap.appendChild(h)}export function renderWaferSummaryContent(t,i){const n=t.scrollTop;t.innerHTML="";const{wafer:e,dies:o,yieldSummary:d,dataCoverage:f,hbinDefs:c,sbinDefs:s,testDefs:a,statsSummary:p,passBins:h=[1],ringCount:g=4,colorScheme:T,fallbackFormat:N,onFindingClick:B,activeFindingId:E=null,findingsFilter:R,onFindingsFilterChange:L,onSaveText:u,metadataFields:$,dieListOptions:k}=i;t.appendChild(ut("Wafer Summary"));const C=i.warnings??nt({statsSummary:p});C.length&&t.appendChild(_(C,t.ownerDocument));const r=d&&f?q("Summary report",()=>{J(wt({wafer:e,dies:o,yieldSummary:d,dataCoverage:f,hbinDefs:c,sbinDefs:s,testDefs:a,statsSummary:p,passBins:h,ringCount:g}))}):null,m=(k?.enabled??!0)&&o.length?q("View die list",()=>{mt(t,o,a,`Die list \u2014 ${o.length} dies`,e.metadata,$,k,u)}):null,D=ft(r,m);D&&t.appendChild(D);const y=[],b=p?.stats.isLotStack?p.stats:void 0,S=b?.lotSize!==void 0?{lotSize:b.lotSize,aggrMethod:Lt(b.aggregationMethod)}:void 0;y.push(buildMetadataInfoSection([{metadata:e.metadata??void 0}],S)),d&&f&&y.push(buildYieldSection(d,f,h));const v=o.some(M=>M.hbin!=null),F=o.some(M=>M.sbin!=null);v?y.push(buildBinSection(o,c,"hard",T,p?.stats.hardBinCounts)):F&&y.push(buildBinSection(o,s,"soft",T,p?.stats.softBinCounts)),y.push(buildRingSection(o,e,g,h)),y.push(buildQuadrantSection(o,e,g,h));const W=e.metadata?{waferMetadata:e.metadata}:void 0;y.push(buildTestSection(o,a,N,p?.stats,u,W)),y.push(buildFunctionalTestSection(o,a,p?.stats.functionalYield,u,W)),p&&B&&R&&L&&y.push(buildFindingsSectionWithFilter(p,B,E,R,L));let x=!0;for(const M of y)M&&(x||t.appendChild(dt()),x=!1,t.appendChild(M));t.appendChild(l("div",{height:"12px",flexShrink:"0"})),t.scrollTop=n}export function renderLotSummaryContent(t,i){const n=t.scrollTop;t.innerHTML="";const{lotSummary:e,items:o,hbinDefs:d,sbinDefs:f,testDefs:c,passBins:s=[1],ringCount:a=4,colorScheme:p,fallbackFormat:h,onFindingClick:g,activeFindingId:T=null,onWaferClick:N,findingsFilter:B,onFindingsFilterChange:E,onSaveText:R,dieListOptions:L}=i;t.appendChild(ut(`Lot Summary \u2014 ${e.stats.waferCount} wafer${e.stats.waferCount===1?"":"s"}`));const u=i.warnings??nt({lotStatsSummary:e});u.length&&t.appendChild(_(u,t.ownerDocument));const $=q("Summary report",()=>{J(yt({items:o.map((x,M)=>({label:x?.label??`W${M+1}`,wafer:x?.wafer,dies:x?.dies,statsSummary:x?.statsSummary})),hbinDefs:d,sbinDefs:f,testDefs:c,passBins:s,ringCount:a}))}),k=[],C=[],r=[],m=new WeakMap;for(let x=0;x<o.length;x++){const M=o[x];if(!M){C.push([]);continue}M.wafer&&k.push(M.wafer);const V=M.dies??[],ht=M.label??`W${x+1}`;for(const gt of V)m.set(gt,ht);C.push(V),r.push(...V)}const D=L?.enabled??!0?q("View die list",()=>{r.length&&mt(t,r,c,`Die list \u2014 ${r.length} dies across ${o.length} wafer${o.length===1?"":"s"}`,et(o.filter(x=>!!x).map(x=>({metadata:x.wafer?.metadata}))),o.find(x=>x?.metadataFields?.length)?.metadataFields,L,R,{label:"Wafer",get:x=>m.get(x)})}):null,y=ft($,D);y&&t.appendChild(y);const b=r.some(x=>x.hbin!=null),S=r.some(x=>x.sbin!=null),v=o.map(x=>x?.statsSummary).filter(x=>!!x),F=[buildLotOverviewSection(e),buildMetadataInfoSection(o.filter(x=>x!==null).map(x=>({metadata:x.wafer?.metadata}))),buildPerWaferYieldSection(e,o,N),b?buildLotBinSection(r,d,"hard",p):S?buildLotBinSection(r,f,"soft",p):null,buildLotRingSection(C,k,a,s),buildLotQuadrantSection(C,k,a,s),c?.length?buildLotTestSection(r,c,h,v,R):null,c?.length?buildLotFunctionalSection(r,c,v,R):null];g&&B&&E&&F.push(buildFindingsSectionWithFilter(e,g,T,B,E));let W=!0;for(const x of F)x&&(W||t.appendChild(dt()),W=!1,t.appendChild(x));t.appendChild(l("div",{height:"12px",flexShrink:"0"})),t.scrollTop=n}
@@ -3,7 +3,7 @@ import type { Die } from '../core/dies.js';
3
3
  import type { TestDef, MetadataFieldDef } from '../renderer/buildWaferMap.js';
4
4
  import type { StatsSeverity } from '../stats/types.js';
5
5
  export declare function logWmapVersionOnce(): void;
6
- export declare const WMAP_TOKEN_NAMES: readonly ["z", "icon", "icon-hover", "icon-active", "bg-hover", "bg-active", "separator", "surface", "border", "menu-hover", "menu-active", "panel-bg", "text-muted", "text", "text-strong", "warn-bg", "warn-border", "warn-text", "err-bg", "err-border", "err-text", "info-bg", "info-text", "selected", "finding-indicator", "canvas-bg"];
6
+ export declare const WMAP_TOKEN_NAMES: readonly ["z", "icon", "icon-hover", "icon-active", "bg-hover", "bg-active", "separator", "surface", "border", "menu-hover", "menu-active", "panel-bg", "text-muted", "text", "text-strong", "warn-bg", "warn-border", "warn-text", "err-bg", "err-border", "err-text", "info-bg", "info-text", "selected", "finding-indicator", "canvas-bg", "bar-fill", "bar-fill-muted"];
7
7
  export type WmapTokenName = (typeof WMAP_TOKEN_NAMES)[number];
8
8
  export declare const CLR: {
9
9
  icon: string;
@@ -30,6 +30,8 @@ export declare const CLR: {
30
30
  infoText: string;
31
31
  findingHighlight: string;
32
32
  findingIndicator: string;
33
+ barFill: string;
34
+ barFillMuted: string;
33
35
  };
34
36
  /**
35
37
  * Findings-severity → colour, shared by summaryPanel.ts (severity dots/borders
@@ -265,7 +267,7 @@ export declare function metadataModeEntry(field: MetadataFieldDef): ModeEntry;
265
267
  * stopped from bubbling so typing (including Space/arrow keys) lands in the
266
268
  * input rather than triggering the host menu's own keyboard navigation.
267
269
  */
268
- export declare function makeMenuSearchBox(onFilter: (query: string) => void, placeholder?: string): HTMLInputElement;
270
+ export declare function makeMenuSearchBox(onFilter: (query: string) => void, placeholder?: string, ownerDocument?: Document): HTMLInputElement;
269
271
  /**
270
272
  * Build the plot-mode dropdown menu element.
271
273
  * Shared between renderWaferMap and renderWaferGallery.