@wafertools/wafermap 0.33.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/AGENTS.md +6 -6
  2. package/CHANGELOG.md +212 -0
  3. package/README.md +5 -5
  4. package/dist/packages/canvas-adapter/chartPopulation.d.ts +15 -10
  5. package/dist/packages/canvas-adapter/chartPopulation.js +1 -1
  6. package/dist/packages/canvas-adapter/charts/barPanel.d.ts +7 -0
  7. package/dist/packages/canvas-adapter/charts/barPanel.js +1 -1
  8. package/dist/packages/canvas-adapter/charts/binCluster.d.ts +7 -1
  9. package/dist/packages/canvas-adapter/charts/binCluster.js +1 -1
  10. package/dist/packages/canvas-adapter/charts/boxplot.js +1 -1
  11. package/dist/packages/canvas-adapter/charts/capability.js +1 -1
  12. package/dist/packages/canvas-adapter/charts/chartShell.d.ts +55 -3
  13. package/dist/packages/canvas-adapter/charts/chartShell.js +1 -1
  14. package/dist/packages/canvas-adapter/charts/correlation.js +1 -2
  15. package/dist/packages/canvas-adapter/charts/groupedBarPlot.d.ts +2 -0
  16. package/dist/packages/canvas-adapter/charts/groupedBarPlot.js +1 -1
  17. package/dist/packages/canvas-adapter/charts/histogram.d.ts +16 -0
  18. package/dist/packages/canvas-adapter/charts/histogram.js +1 -1
  19. package/dist/packages/canvas-adapter/charts/palette.d.ts +2 -0
  20. package/dist/packages/canvas-adapter/charts/palette.js +1 -1
  21. package/dist/packages/canvas-adapter/charts/plotChart.d.ts +27 -0
  22. package/dist/packages/canvas-adapter/charts/plotChart.js +1 -0
  23. package/dist/packages/canvas-adapter/charts/pointInteractions.d.ts +45 -0
  24. package/dist/packages/canvas-adapter/charts/pointInteractions.js +1 -0
  25. package/dist/packages/canvas-adapter/charts/regionYieldDiagram.d.ts +2 -0
  26. package/dist/packages/canvas-adapter/charts/regionYieldDiagram.js +1 -1
  27. package/dist/packages/canvas-adapter/charts/scatter.d.ts +19 -0
  28. package/dist/packages/canvas-adapter/charts/scatter.js +1 -1
  29. package/dist/packages/canvas-adapter/charts/sweep.d.ts +12 -0
  30. package/dist/packages/canvas-adapter/charts/sweep.js +1 -1
  31. package/dist/packages/canvas-adapter/charts/testPassRate.d.ts +7 -0
  32. package/dist/packages/canvas-adapter/charts/testPassRate.js +1 -1
  33. package/dist/packages/canvas-adapter/charts/trend.d.ts +11 -0
  34. package/dist/packages/canvas-adapter/charts/trend.js +1 -1
  35. package/dist/packages/canvas-adapter/confirmDialog.d.ts +13 -0
  36. package/dist/packages/canvas-adapter/confirmDialog.js +1 -0
  37. package/dist/packages/canvas-adapter/dataTab.d.ts +131 -0
  38. package/dist/packages/canvas-adapter/dataTab.js +1 -0
  39. package/dist/packages/canvas-adapter/dieList.d.ts +39 -4
  40. package/dist/packages/canvas-adapter/dieList.js +6 -7
  41. package/dist/packages/canvas-adapter/drilldown.d.ts +20 -3
  42. package/dist/packages/canvas-adapter/drilldown.js +1 -1
  43. package/dist/packages/canvas-adapter/guideWindow.d.ts +96 -0
  44. package/dist/packages/canvas-adapter/guideWindow.js +1 -0
  45. package/dist/packages/canvas-adapter/identityHeader.d.ts +16 -0
  46. package/dist/packages/canvas-adapter/identityHeader.js +1 -1
  47. package/dist/packages/canvas-adapter/index.d.ts +3 -3
  48. package/dist/packages/canvas-adapter/index.js +1 -1
  49. package/dist/packages/canvas-adapter/insightsTab.d.ts +73 -54
  50. package/dist/packages/canvas-adapter/insightsTab.js +1 -1
  51. package/dist/packages/canvas-adapter/maplessSummary.d.ts +2 -2
  52. package/dist/packages/canvas-adapter/plotEditor.d.ts +29 -0
  53. package/dist/packages/canvas-adapter/plotEditor.js +1 -0
  54. package/dist/packages/canvas-adapter/plotItems.d.ts +32 -0
  55. package/dist/packages/canvas-adapter/plotItems.js +1 -0
  56. package/dist/packages/canvas-adapter/plotModal.d.ts +30 -0
  57. package/dist/packages/canvas-adapter/plotModal.js +1 -0
  58. package/dist/packages/canvas-adapter/plotStore.d.ts +52 -0
  59. package/dist/packages/canvas-adapter/plotStore.js +1 -0
  60. package/dist/packages/canvas-adapter/plotTab.d.ts +30 -0
  61. package/dist/packages/canvas-adapter/plotTab.js +1 -0
  62. package/dist/packages/canvas-adapter/renderWaferGallery.d.ts +3 -2
  63. package/dist/packages/canvas-adapter/renderWaferGallery.js +1 -1
  64. package/dist/packages/canvas-adapter/renderWaferMap.d.ts +21 -2
  65. package/dist/packages/canvas-adapter/renderWaferMap.js +1 -1
  66. package/dist/packages/canvas-adapter/summaryPanel.d.ts +27 -8
  67. package/dist/packages/canvas-adapter/summaryPanel.js +2 -4
  68. package/dist/packages/canvas-adapter/summaryRail.d.ts +7 -0
  69. package/dist/packages/canvas-adapter/summaryRail.js +1 -0
  70. package/dist/packages/canvas-adapter/sweepEditor.d.ts +17 -0
  71. package/dist/packages/canvas-adapter/sweepEditor.js +1 -0
  72. package/dist/packages/canvas-adapter/tableExport.d.ts +22 -0
  73. package/dist/packages/canvas-adapter/tableExport.js +3 -0
  74. package/dist/packages/canvas-adapter/toolbar.d.ts +25 -97
  75. package/dist/packages/canvas-adapter/toolbar.js +2 -2
  76. package/dist/packages/canvas-adapter/userGuideHtml.d.ts +1 -1
  77. package/dist/packages/canvas-adapter/userGuideHtml.js +337 -42
  78. package/dist/packages/canvas-adapter/version.d.ts +2 -2
  79. package/dist/packages/canvas-adapter/version.js +1 -1
  80. package/dist/packages/canvas-adapter/viewSwitch.d.ts +13 -0
  81. package/dist/packages/canvas-adapter/viewSwitch.js +1 -0
  82. package/dist/packages/canvas-adapter/virtualTable.d.ts +44 -0
  83. package/dist/packages/canvas-adapter/virtualTable.js +1 -0
  84. package/dist/packages/core/classify.d.ts +3 -2
  85. package/dist/packages/core/classify.js +1 -1
  86. package/dist/packages/core/passBins.d.ts +17 -4
  87. package/dist/packages/core/passBins.js +1 -1
  88. package/dist/packages/core/ringCount.d.ts +22 -0
  89. package/dist/packages/core/ringCount.js +1 -0
  90. package/dist/packages/core/tableCsv.d.ts +43 -0
  91. package/dist/packages/core/tableCsv.js +3 -0
  92. package/dist/packages/renderer/binColors.d.ts +6 -6
  93. package/dist/packages/renderer/binColors.js +1 -1
  94. package/dist/packages/renderer/buildView.d.ts +1 -1
  95. package/dist/packages/renderer/buildView.js +1 -1
  96. package/dist/packages/renderer/buildWaferMap.js +1 -1
  97. package/dist/packages/stats/analyzeWaferLot.js +1 -1
  98. package/dist/packages/stats/analyzeWaferMap.js +1 -1
  99. package/dist/packages/stats/binPareto.d.ts +1 -1
  100. package/dist/packages/stats/binPareto.js +1 -1
  101. package/dist/packages/stats/histogram.d.ts +27 -0
  102. package/dist/packages/stats/histogram.js +1 -1
  103. package/dist/packages/stats/index.d.ts +2 -0
  104. package/dist/packages/stats/index.js +1 -1
  105. package/dist/packages/stats/lotDrift.js +1 -1
  106. package/dist/packages/stats/lotPattern.js +1 -1
  107. package/dist/packages/stats/math.d.ts +9 -6
  108. package/dist/packages/stats/math.js +1 -1
  109. package/dist/packages/stats/patternClassification.d.ts +1 -1
  110. package/dist/packages/stats/patternClassification.js +1 -1
  111. package/dist/packages/stats/plotData.d.ts +258 -0
  112. package/dist/packages/stats/plotData.js +1 -0
  113. package/dist/packages/stats/plotId.d.ts +3 -0
  114. package/dist/packages/stats/plotId.js +1 -0
  115. package/dist/packages/stats/plotSpec.d.ts +119 -0
  116. package/dist/packages/stats/plotSpec.js +4 -0
  117. package/dist/packages/stats/presentation.d.ts +2 -0
  118. package/dist/packages/stats/presentation.js +1 -1
  119. package/dist/packages/stats/regions.d.ts +6 -0
  120. package/dist/packages/stats/regions.js +1 -1
  121. package/dist/packages/stats/renderSummaryReport.d.ts +8 -3
  122. package/dist/packages/stats/renderSummaryReport.js +15 -15
  123. package/dist/packages/stats/reportHtml.d.ts +1 -1
  124. package/dist/packages/stats/reportHtml.js +36 -29
  125. package/dist/packages/stats/scatter.d.ts +6 -0
  126. package/dist/packages/stats/scatter.js +1 -1
  127. package/dist/packages/stats/sweep.d.ts +37 -1
  128. package/dist/packages/stats/sweep.js +1 -1
  129. package/dist/packages/stats/sweepText.d.ts +14 -0
  130. package/dist/packages/stats/sweepText.js +1 -0
  131. package/dist/packages/stats/sweepXFromName.d.ts +14 -0
  132. package/dist/packages/stats/sweepXFromName.js +1 -1
  133. package/dist/packages/stats/synthesis.d.ts +14 -4
  134. package/dist/packages/stats/synthesis.js +1 -1
  135. package/dist/packages/stats/testPassRate.d.ts +6 -0
  136. package/dist/packages/stats/testPassRate.js +1 -1
  137. package/dist/packages/stats/trend.js +1 -1
  138. package/dist/packages/stats/types.d.ts +1 -1
  139. package/dist/packages/stats/yield.d.ts +15 -6
  140. package/dist/packages/stats/yield.js +1 -1
  141. package/llms.txt +15 -3
  142. package/package.json +3 -3
@@ -1 +1 @@
1
- import{getUniqueTestNumbers as No,resolveTestNumber as zo,findTestDef as _o,collectMetadataValues as Ko}from"../renderer/buildView.js";import{metadataCategoricalValue as Go}from"../core/metadata.js";import{resolveBinColorsForMaps as qo,mergeBinDefs as et,binColorWarning as Xo,mixedPassBinsWarning as Uo,binColorsEqual as Yo}from"../renderer/binColors.js";import{itemPassBins as Zo,INPUT_DEFAULT_PASS_BINS as Qo}from"../core/passBins.js";import{NO_DATA_FILL as Jo}from"../renderer/colorMap.js";import{metadataValueColor as ei}from"../renderer/colorMap.js";import{resolveCanvasTheme as ti}from"./canvasTheme.js";import{ICONS as Fe}from"./icons.js";import{SHADOW as He,LEADING as tt,TRACKING as ni,controlStyle as oi,wireControlHover as Ot,SPACE as w,EDGE_GUTTER as ie,MAP_CHROME_INSET as ii,RADIUS as _,FONT as I,CLR as g,sevColor as kn,MODE_LABELS as si,BIN_LEGEND_MODES as On,STACKED_MODES as be,Z_ABOVE as Tn,applyOverlayZ as ai,getTooltip as li,hideTooltip as Ln,createToolbarHelpers as ri,buildModeMenuEl as di,openDetachWindow as ci,openFloatingWindow as ui,openModal as fi,openReportModal as pi,copyWmapThemeTokens as mi,syncWmapPopupTheme as gi,openUserGuideWindow as hi,makePaletteBtn as yi,makeLogScaleBtn as bi,makeLegendStyleBtn as wi,makeOverlaysBtn as vi,makeOrientationBtn as Ci,menuLayerFor as Rn,saveImageBlob as xi,markMenuTrigger as je,wireMenuA11y as In,wireExpandToggle as Wn,wireTooltip as $n,requestedPassFailDisplay as An,overlayMenuRows as Si,anyOverlayActive as Mi,openCompactDiagnostics as Di,roomForPanel as Pn,logWmapVersionOnce as Ei,buildDataModeEntries as Bi,metadataKeyHasData as ki,metadataModeEntry as Oi}from"./toolbar.js";import{waferDisplayLabel as nt,waferIdentityLabel as Fn}from"../core/waferLabel.js";import{metadataDisplayValue as Ti}from"../core/metadata.js";import{withExportContext as Li}from"./exportName.js";import{sortBinsForDisplay as Ri}from"../stats/binPareto.js";import{diePassStatus as Ii}from"../core/dies.js";import{aggregateValues as Wi,aggregateBinCounts as Hn}from"../core/aggregates.js";import{renderWaferMap as $i,renderWaferMapCard as jn,toPublicViewOptions as Vn}from"./renderWaferMap.js";import{hasDrilldownTargets as Ai,waferPopulation as Pi}from"./chartPopulation.js";import{classifyChanged as Fi,COLOR_KEYS as Hi,findingBin as ji}from"./renderWaferMap.js";import{findingPatternKey as Nn}from"../stats/filterFindings.js";import{buildWaferMap as Vi,getTestPassStatus as zn,isParametricTest as Tt,getDieTestValue as Ni}from"../renderer/buildWaferMap.js";import{analyzeWaferMap as ot}from"../stats/analyzeWaferMap.js";import{collectWarnings as zi,buildWarningsMenuEl as _i,severityOf as Ki}from"./warnings.js";import{asList as _n,compareNatural as Lt,arrayEqual as it,toggleHighlight as Kn}from"../core/utils.js";import{buildCompactMap as Gi,compactLayoutOffered as qi}from"../core/compact.js";import{createSummaryPanelEl as Rt,buildMetadataStripRow as Xi,buildCompactMetadataRows as Gn,metadataEntries as qn,renderLotSummaryContentSteps as Ui,reportMapsFromItems as Yi}from"./summaryPanel.js";import{prettyKey as Zi}from"../stats/facets.js";import{testLabel as Qi,markedTestLabel as Ji,derivedFields as es}from"../renderer/testLabel.js";import{mergeTestDefs as ts}from"../stats/mergeTestDefs.js";import{getDieKey as ns,hasPosition as os}from"../core/dies.js";import{testValue as is}from"../core/dieTable.js";import{runChunked as ss}from"./chunked.js";function Xn(f){if(typeof f!="number"||!Number.isFinite(f))return;const x=Math.round(f);return x>=1?x:void 0}const It=12;function as(f,x,p){let P=x;if(x.length>It){const S=x.slice(0,It-1),W=x.slice(It-1),H=W.reduce((U,se)=>U+se.count,0);P=[...S,{color:g.label,count:H,label:`Other (${W.length} bins)`}]}const E=f.createElement("div");Object.assign(E.style,{display:"flex",columnGap:"1px",width:"100%",height:"8px",borderRadius:_.control,overflow:"hidden",border:`1px solid ${g.menuBorder}`,boxSizing:"border-box",marginTop:w.xs,flexShrink:"0"}),E.setAttribute("role","img"),E.setAttribute("aria-label",`Population split: ${P.map(S=>`${S.label} ${st(S.count/p*100)}`).join(", ")}`);for(const S of P){const W=S.count/p*100,H=f.createElement("div");Object.assign(H.style,{flex:`${W} 1 0`,minWidth:W>0?"2px":"0",background:S.color}),$n(H,`${S.label} \xB7 ${S.count.toLocaleString()} dies \xB7 ${st(W)}`),E.appendChild(H)}return E}function st(f){return f>0&&f<.1?"<0.1%":`${f.toFixed(1)}%`}function Un(f,x,p){const P=new Map;let E=0,S=0;for(const W of f){const H=p?new Set(p(W)):void 0;for(const U of W.dies){if(U.partial||U.edgeExcluded)continue;const se=x(U);se!==void 0&&(P.set(se,(P.get(se)??0)+1),E++,H&&Ii(U,H)&&S++)}}return{counts:P,total:E,pass:S}}function Yn(f,x){const p=f.ownerDocument.createElement("div");Object.assign(p.style,{display:"flex",alignItems:"center",gap:"5px",cursor:"pointer",userSelect:"none",padding:`${w.xxs} ${w.xs}`,borderRadius:_.control});const P=f.ownerDocument.createElement("span");Object.assign(P.style,{display:"inline-block",width:"13px",height:"13px",flexShrink:"0",background:x.color,border:x.isActive?`2px solid ${g.iconActive}`:`1px solid ${g.menuBorder}`,borderRadius:_.control,boxSizing:"border-box"});const E=f.ownerDocument.createElement("span");if(E.textContent=x.label,Object.assign(E.style,{fontWeight:x.isActive?"700":"400",color:x.isActive?g.iconActive:g.text,whiteSpace:"nowrap"}),p.appendChild(P),p.appendChild(E),x.count!==void 0){const S=f.ownerDocument.createElement("span");if(S.textContent=x.count.toLocaleString(),Object.assign(S.style,{color:x.isActive?g.iconActive:g.text,fontWeight:x.isActive?"700":"400",whiteSpace:"nowrap"}),p.appendChild(S),x.percent!==void 0){const W=f.ownerDocument.createElement("span");W.textContent=st(x.percent),Object.assign(W.style,{color:g.label,whiteSpace:"nowrap"}),p.appendChild(W)}}p.setAttribute("role","button"),p.setAttribute("aria-pressed",x.isActive?"true":"false"),p.tabIndex=0,p.addEventListener("mouseenter",()=>{p.style.background=g.bgHover}),p.addEventListener("mouseleave",()=>{p.style.background="transparent"}),p.addEventListener("focus",()=>{p.style.background=g.bgHover}),p.addEventListener("blur",()=>{p.style.background="transparent"}),p.addEventListener("click",S=>x.onClick(S.ctrlKey||S.metaKey)),p.addEventListener("keydown",S=>{(S.key==="Enter"||S.key===" ")&&(S.preventDefault(),x.onClick(S.ctrlKey||S.metaKey))}),f.appendChild(p)}export function renderWaferGallery(f,x,p={}){Ei();const P=6;let E=Xn(p.columns);const S=p.showHelpButton??!1,W=p.userGuideExtension,H=p.insights?.enabled??!1,U=p.insights?.sweeps?{sweeps:p.insights.sweeps}:void 0,se=ai(p.zIndex),ce=p.summaryPanel,Zn=e=>[...Zo(e)],Wt=()=>v.flatMap(e=>e?[e.ringCount??4]:[]),at=()=>Wt()[0]??4;function Qn(e){const t=[...new Set(e)].sort((n,o)=>n-o);return t.length<2?null:{code:"ring-count-mixed",severity:"warning",message:`These wafers were built with different ring counts (${t.join(", ")}). Each card and each wafer's findings use their own; the lot's ring yield in the Summary panel, report and Insights uses ${e[0]} rings.`}}let z=p.lotStatsSummary,we=p.viewOptions?.legendPosition??"default",Ve=p.perCardLegend??!1;function ve(){const e=l.plotMode??"hardBin";return On.has(e)?null:l.colorbarRangeMode==="data"?"Each map has its own value range, so it keeps its own colour bar":"These wafers have no shared colour bar for value mode, so each map keeps its own"}function $t(){const e=Ve||ve()!==null;for(const t of M)t&&t.setOptions({showLegend:e})}let l={plotMode:"hardBin",showDieLabels:!1,showRingBoundaries:!1,showQuadrantBoundaries:!1,rotation:0,flipX:!1,flipY:!1,...p.viewOptions},M=[],Q=[],ue=[],k=[];const Ce=Li(()=>{const e=k.filter(n=>n!=null),t=[...new Set(e.map(n=>Ti(n.wafer.metadata?.lot)).filter(n=>n!==void 0))].sort(Lt);return{prefix:p.downloadFilename,lots:t,...e.length===1?{wafer:Fn(e[0])}:{waferCount:e.length}}},p.onSaveImage,p.onSaveText);let v=x.map(e=>typeof e=="function"?null:e);function At(){return ts(v)}function xe(){if(v.some(e=>e?.testDefs?.length))return At().defs}let Se=0,Ne=0;const K=new Map;let Jn=0,F=null,ae=null,Pt=new Set,y=null,eo={};function Ft(e){return v[e]?.statsSummary??z?.perWafer.find(t=>t.waferIndex===e)?.summary}function lt(){return!!(v.some(e=>e?.statsSummary?.findings.length)||z?.perWafer.some(e=>e.summary.findings.length))}const to=li(),fe=ri(to),{makeBtn:J,setActive:Me,makeSep:G,makeMenuRow:no,makeMenuSection:oo,makeDropdown:Ht,closeOpenMenu:ze,getOpenMenu:De,setOpenMenu:Ee}=fe;f.ownerDocument.addEventListener("click",ze,!0);const jt=()=>Ln();window.addEventListener("blur",jt);let Vt=p.findingsNotice;function Nt(e){Pt=new Set(e);const t=[...A.querySelectorAll(".wmap-gallery-card")];let n;t.forEach((o,c)=>{const r=Pt.has(c);o.style.outline=r?`3px solid ${g.findingHighlight}`:"",o.style.outlineOffset=r?"-3px":"",r&&n===void 0&&(n=o)}),n?.scrollIntoView?.({behavior:"smooth",block:"nearest"})}function zt(){Nt([])}let rt=!1;function _t(){rt=!0;for(const e of M)e&&e.clearSelection();rt=!1}function Kt(e){return t=>{!rt&&ae!==null&&(ke(),j()),e.onSelect?.(t)}}function dt(e,t){const n=new Set(e),o=t??M.map((c,r)=>r);for(const c of o){const r=k[c],s=M[c];if(!r||!s)continue;const d=r.dies.filter(i=>n.has(ns(i)));s.setSelection(d)}}function io(){const e=[];for(let t=0;t<v.length;t++){const n=v[t];if(!n)continue;const o=Ft(t)?.findings??[];o.length&&e.push({index:t,item:n,unusualCount:o.filter(c=>c.severity==="unusual").length,notableCount:o.filter(c=>c.severity==="notable").length,totalCount:o.length})}return e}function so(e){const t=k[e]??v[e];t&&Ae(e,t)}function ao(e){const t=Ft(e)?.findings??[];if(t.length)return{total:t.length,unusual:t.filter(n=>n.severity==="unusual").length,notable:t.filter(n=>n.severity==="notable").length}}function lo(){import("../stats/renderSummaryReport.js").then(({renderLotReportHtml:e})=>{pi(e(Yi(v,Qo,at())),{anchor:f})})}function ro(){if(!y)return;y.innerHTML="";const e=io();if(v.length>0){const n=f.ownerDocument.createElement("div"),o=e.length,c=v.filter(Boolean).length;n.textContent=o===0?`No findings on any of the ${c} wafers`:`${o} of ${c} wafer${c===1?"":"s"} with findings`,Object.assign(n.style,{fontSize:I.body,color:g.label,marginBottom:w.md}),y.appendChild(n)}if(e.length>0){const n=f.ownerDocument.createElement("button");n.type="button",n.textContent="Summary report",Object.assign(n.style,{...oi("outlined"),marginBottom:w.lg,display:"block",width:"100%",textAlign:"left"}),Ot(n),n.addEventListener("click",lo),y.appendChild(n)}if(e.length===0){const n=f.ownerDocument.createElement("div");Object.assign(n.style,{color:g.icon,fontSize:I.body,padding:"4px 0"}),n.textContent="No findings on any wafer.",y.appendChild(n)}else for(const{index:n,item:o,unusualCount:c,notableCount:r,totalCount:s}of e){const d=c?"unusual":r?"notable":"info",i=c+r||s,a=f.ownerDocument.createElement("button");a.type="button",Object.assign(a.style,{display:"flex",alignItems:"center",justifyContent:"space-between",width:"100%",padding:"5px 8px",marginBottom:w.xs,border:"none",borderLeft:`3px solid ${kn(d)}`,borderRadius:_.control,background:g.bgHover,cursor:"pointer",fontSize:I.body,textAlign:"left",boxSizing:"border-box"}),a.addEventListener("mouseover",()=>{a.style.background=g.bgActive}),a.addEventListener("mouseout",()=>{a.style.background=g.bgHover});const u=f.ownerDocument.createElement("span");u.textContent=nt(o,n),Object.assign(u.style,{color:g.iconHover,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"});const m=f.ownerDocument.createElement("span");m.textContent=String(i),a.setAttribute("aria-label",`${nt(o,n)} \u2014 ${i} finding${i===1?"":"s"}${c?`, ${c} unusual`:""} \u2014 view wafer`),Object.assign(m.style,{marginLeft:w.sm,flexShrink:"0",background:kn(d),color:"#fff",borderRadius:_.container,padding:"1px 5px",fontSize:I.body,fontWeight:"600"}),a.appendChild(u),a.appendChild(m),a.addEventListener("click",()=>Ae(n,o)),y.appendChild(a)}const t=f.ownerDocument.createElement("div");t.style.height="12px",y.appendChild(t)}let pe=null,Be=null;function j(){if(y)if(pe?.cancel(),pe=null,z){const e=et(v.map(n=>n?.hbinDefs)),t=et(v.map(n=>n?.sbinDefs));pe=ss(Ui(y,{lotSummary:z,items:v,hbinDefs:e.length?e:void 0,sbinDefs:t.length?t:void 0,testDefs:xe(),ringCount:at(),binColors:l.binColors,plotMode:l.plotMode??"hardBin",fallbackFormat:l.fallbackFormat,activeFindingId:ae,warnings:p.warnings?.display??!0?ee:[],findingsFilter:eo,findingsNotice:Vt,onFindingsFilterChange:j,onSaveText:Ce.onSaveText,onFindingClick:(n,o)=>{ae===n.id?ke():uo(n,o),j()},onWaferClick:so,findingsFor:ao,dieListOptions:p.dieList}),{onDone:()=>{const n=Be;Be=null,n?.()}})}else ro()}function co(e){const t=e.highlight;return t?.kind==="wafer"&&t.waferIndices?.length?t.waferIndices:null}let _e=[];function Gt(){if(_e.length!==0){for(const e of _e)M[e]?.setOptions({plotMode:l.plotMode,activeTest:l.activeTest});_e=[]}}function ke(){ae=null,zt(),_t(),Gt(),R({highlightBin:void 0},{fireCallback:!1})}function qt(){ae!==null&&(ke(),j())}function uo(e,t){if(ae===e.id){ke();return}ae=e.id,t.style.background=g.bgActive,t.style.fontWeight="600",Gt();const{kind:n,index:o}=e.variable;if(n==="test"){const r=o??0,s=xe();if(s===void 0||s.some(i=>i.testNumber===r))R({plotMode:"value",activeTest:r,highlightBin:void 0},{fireCallback:!1});else{R({highlightBin:void 0},{fireCallback:!1});const a=be.has(l.plotMode??"hardBin")?null:co(e);if(a){for(const u of a)M[u]?.setOptions({plotMode:"value",activeTest:r});_e=[...a]}}}else R({plotMode:n==="softBin"?"softBin":"hardBin",highlightBin:ji(e)},{fireCallback:!1});zt(),_t();const c=e.highlight;if(c.kind==="wafer"){Nt(c.waferIndices);const r=Nn(e);for(const s of c.waferIndices){const d=c.dieKeysByWafer?void 0:k[s]?.statsSummary?.findings.find(a=>Nn(a)===r),i=c.dieKeysByWafer?.[s]??d?.highlight?.dieKeys;i?.length&&dt(i,[s])}}else c.kind==="bin"?c.dieKeys?.length&&dt(c.dieKeys):(c.kind==="region"||c.kind==="dies")&&c.dieKeys?.length&&dt(c.dieKeys)}function le(){if(!F)return;const e=!!y;F.style.display=(z||lt())&&e&&!Re?"flex":"none";const t=y?y.style.display!=="none":!1;(z?.hasNotableFindings||v.some(o=>o?.statsSummary?.hasNotableFindings))&&!t?F.style.color=g.findingIndicator:F.dataset.active||(F.style.color=g.icon)}const $=f.ownerDocument.createElement("div");$.dataset.wmapToolbar="gallery",Object.assign($.style,{flexShrink:"0",marginLeft:"auto",display:"inline-flex",flexDirection:"row",alignItems:"center",gap:"0",background:g.menuBg,border:`1px solid ${g.menuBorder}`,borderRadius:_.control,padding:"0",boxShadow:He.panel,flexWrap:"wrap",minWidth:"0",overflowX:"auto"});const Xt=()=>{const e=De();e&&(e.remove(),Ee(null)),je(Y,!1)},Y=J("mode","Plot mode",()=>{if(De()){Xt();return}const e=v.flatMap(b=>b?.dies??[]),t=xe(),{testEntries:n,binEntries:o,stackedEntries:c}=Bi(e,t,{includeStacked:!0}),r=v.filter(Boolean).length,s=b=>{if(b===void 0)return r;let O=0;for(const T of v)T?.dies?.some(V=>zn(V,b)!==void 0||is(V,b)!==void 0)&&O++;return O},d=r<2?n:n.map(b=>{const O=s(b.activeTest);return O===r?b:{...b,label:`${b.label} \u2014 ${O} of ${r} wafers`}}),i=l.plotMode??"hardBin",a=l.activeTest??0;function u(b){return b.plotMode!==i?!1:b.plotMode==="value"?a===(b.activeTest??0):b.plotMode==="metadata"?l.activeMetadataKey===b.activeMetadataKey:!0}function m(b,O){b.activeTest!==void 0?R({plotMode:"value",activeTest:b.activeTest,activeMetadataKey:void 0,logScale:b.logScale}):b.activeMetadataKey!==void 0?R({plotMode:b.plotMode,activeTest:void 0,activeMetadataKey:b.activeMetadataKey,passFailDisplay:"off"}):R({plotMode:b.plotMode,activeTest:void 0,activeMetadataKey:void 0,passFailDisplay:"off"}),O.remove(),Ee(null),je(Y,!1)}const D=new Set,B=v.flatMap(b=>b?.metadataFields??[]).filter(b=>!D.has(b.key)&&D.add(b.key)).filter(b=>ki(e,b.key)).map(Oi),C=di(Y.getBoundingClientRect(),d,o,c,u,m,{makeMenuRow:no,makeMenuSection:oo},i,Y.ownerDocument.defaultView??window,B);Rn(Y).appendChild(C),Ee(C),je(Y,!0),In(C,Y,Xt)});je(Y,!1);const fo=()=>k.flatMap(e=>e?[...e.hbinDefs??[],...e.sbinDefs??[]]:[]).some(e=>e.color),{btn:po,sync:Ut}=yi(fe,()=>({...l,plotMode:l.plotMode??"hardBin"}),fo,e=>R(e));Ut();const mo=x.some(e=>typeof e!="function"&&(e.reticles?.length??0)>0);function Ke(){const e=xe(),{testNumber:t}=zo(l.activeTest??0,e);return{testNumber:t,td:_o(e,t)}}function Yt(){if((l.plotMode??"hardBin")!=="value")return!1;const{td:e}=Ke();return e!==void 0&&(e.limitLow!==void 0||e.limitHigh!==void 0)}function Oe(){if((l.plotMode??"hardBin")!=="value")return!1;const{td:e}=Ke();return e!==void 0&&!Tt(e)}function go(){if((l.plotMode??"hardBin")!=="value")return!1;const{testNumber:e,td:t}=Ke();return v.some(n=>n?.dies?.some(o=>zn(o,e,t)!==void 0))}function ho(e,t){if(!t||!Tt(t))return;const n=t.limitLow!==void 0||t.limitHigh!==void 0;if((An(l)==="spec"&&n?"spec":l.colorbarRangeMode??"spec")==="spec"&&n)return;let r=1/0,s=-1/0;for(const d of v)if(d)for(const i of d.dies){const a=Ni(i,e);a!==void 0&&(a<r&&(r=a),a>s&&(s=a))}if(isFinite(r))return r===s?[r,r+1]:[r,s]}function Ge(e,t,n){const o=l[e];if(o===t||o!=null&&t!=null&&n(o,t))return!1;l={...l,[e]:t};for(const c of M)c&&c.setOptions({[e]:t});return!0}function Zt(){if((l.plotMode??"hardBin")!=="metadata")return;const e=l.activeMetadataKey;if(!e)return;const t=new Set;for(const n of v)if(n)for(const o of Ko(n.dies,e))t.add(o);return{key:e,values:[...t].sort(Lt)}}function ct(){Ge("metadataValueOrder",Zt(),(e,t)=>e.key===t.key&&it(e.values,t.values))}function ut(){if((l.plotMode??"hardBin")!=="value")return;const{testNumber:e,td:t}=Ke(),n=ho(e,t);Ge("valueRange",n?{test:e,range:n}:void 0,(c,r)=>{const s=a=>Array.isArray(a)?{test:void 0,range:a}:{test:a.test,range:a.range},d=s(c),i=s(r);return d.test===i.test&&it(d.range,i.range)})}let ft=!1;function yo(){if(ft)return;ft=!0,(f.ownerDocument.defaultView?.requestAnimationFrame??(t=>setTimeout(()=>t(0),0)))(()=>{ft=!1,ut(),ct(),tn(),en()})}let pt=!1;function bo(){if(pt)return;pt=!0,(f.ownerDocument.defaultView?.requestAnimationFrame??(t=>setTimeout(()=>t(0),0)))(()=>{pt=!1,Ze()})}let Qt=[];function me(){const{colors:e,mixedHardBins:t}=qo(v.filter(n=>n!=null),{binColorScheme:l.binColorScheme,useDefinedBinColors:l.useDefinedBinColors});return Qt=t,e}function mt(){return k.filter(e=>e!=null).flatMap(e=>e.dies)}function Jt(){return l.compact?Gi(mt()):void 0}const wo=(e,t)=>it(e.columns,t.columns)&&it(e.rows,t.rows);function en(){Ge("compactMap",Jt(),wo)&&hn()}function vo(){return qi(mt(),k.filter(e=>e!=null).map(e=>e.reticleConfig))}function tn(){Ge("binColors",me(),Yo),Te()}const Co=vi(fe,()=>Si(l,mo,{functionalActive:Oe(),hasLimits:Yt()&&!Oe(),hasRecorded:go()&&!Oe(),binMode:(l.plotMode??"hardBin")==="hardBin"||(l.plotMode??"hardBin")==="softBin"},e=>R(e),{on:!!l.compact,offered:vo(),onChange:e=>R({compact:e}),onDiagnostics:()=>Di(mt(),k.filter(e=>e!=null).map(e=>e.reticleConfig),{anchor:f,onSaveText:Ce.onSaveText})}),()=>Mi(l)),{btn:xo,sync:nn}=wi(fe,()=>({plotMode:l.plotMode,legendPosition:we}),e=>{we=e;for(const t of M)t&&t.setOptions({legendPosition:we})},{get:()=>Ve,set:e=>{Ve=e,$t()},blockedReason:ve});nn();const So=[{value:"mean",label:"Mean"},{value:"median",label:"Median"},{value:"stddev",label:"Std Dev"},{value:"min",label:"Min"},{value:"max",label:"Max"},{value:"count",label:"Count"}],on=Ht("aggr","Aggregation method",()=>So,()=>l.aggregationMethod??"mean",e=>R({aggregationMethod:e}));function sn(){const e=l.plotMode==="stackedValues";on.style.display=e?"":"none"}sn();const{btn:Mo,sync:an}=bi(fe,()=>({...l,functionalActive:Oe()}),e=>R(e));an();const qe=J("specRange","Colorbar range: test limits",()=>{const e=l.colorbarRangeMode==="data"?"spec":"data";R({colorbarRangeMode:e})});function ln(){const e=(l.plotMode??"hardBin")==="value"&&Yt()&&An(l)==="off"&&!Oe();qe.style.display=e?"":"none";const t=(l.colorbarRangeMode??"spec")==="spec";Me(qe,t),qe.ariaLabel=t?"Colorbar range: test limits (click for data range)":"Colorbar range: data range (click for test limits)"}ln();const Do=Ci(fe,()=>l,e=>R(e)),Eo=J("downloadAll","Download gallery PNG",Ho),Bo=Ht("columns","Columns",()=>[{value:"auto",label:"Auto"},{value:"1",label:"1 column"},{value:"2",label:"2 columns"},{value:"3",label:"3 columns"},{value:"4",label:"4 columns"},{value:"5",label:"5 columns"}],()=>E!=null?String(E):"auto",e=>bn(e==="auto"?void 0:Number(e))),L=f.ownerDocument.createElement("div");Object.assign(L.style,{display:"inline-flex",alignItems:"center",gap:"0"}),$.appendChild(L),L.appendChild(Y),L.appendChild(po),L.appendChild(on),L.appendChild(Mo),L.appendChild(qe),L.appendChild(G()),L.appendChild(Co),L.appendChild(G()),L.appendChild(xo),L.appendChild(G()),L.appendChild(Do),L.appendChild(G()),L.appendChild(Bo),L.appendChild(G()),L.appendChild(Eo),(z||lt())&&(F=J("findings","Summary panel",()=>{if(!y)return;const e=y.style.display!=="none";e||j(),y.style.display=e?"none":"flex",Me(F,!e),le()}),$.appendChild(G()),$.appendChild(F));let q=null,Xe=null,ee=[],rn=!1;function Te(){const e=zi({lotStatsSummary:z,result:{warnings:[...v.flatMap(n=>n?.warnings??[]),...At().warnings]},extra:[l.binColors&&Xo(l.binColors,l.plotMode),Uo(Qt),Qn(Wt())].filter(n=>!!n)}),t=e.length!==ee.length||e.some((n,o)=>n.code!==ee[o]?.code||n.message!==ee[o]?.message);ee=e,(t||!rn)&&(rn=!0,p.warnings?.onWarning?.(e)),ko()}function ko(){if(!q||!Xe)return;const e=ee.length,t=e>0;if(q.style.display=t?"flex":"none",Xe.style.display=t?"":"none",!t)return;const n=Ki(ee[0]),o=`${e} data ${e===1?"warning":"warnings"}`;q.style.color=n==="error"?g.errText:g.warnText,q.ariaLabel=n==="error"?`${o} \u2014 some wafers may be positionally wrong`:o}(p.warnings?.display??!0)&&(Xe=G(),q=J("warning","Data warnings",()=>{const e=De();if(ze(new MouseEvent("click")),e)return;const t=_i(q.getBoundingClientRect(),ee,q.ownerDocument.defaultView??window);Rn(f).appendChild(t),Ee(t),In(t,q,()=>ze(new MouseEvent("click")))}),je(q,!1),$.appendChild(Xe),$.appendChild(q)),Te();let re=null;H&&(re=J("analysis","Insights",()=>{un(!Re)}),re.dataset.wmapInsightsBtn="1",$.appendChild(G()),$.appendChild(re));function dn(){import("./userGuideHtml.js").then(e=>hi({buildWaferMap:Vi,renderWaferMap:$i,renderWaferGallery,analyzeWaferMap:ot},e.USER_GUIDE_HTML,W,f))}S&&($.appendChild(G()),$.appendChild(J("help","User guide",()=>dn())));const ge=f.ownerDocument.createElement("div");ge.dataset.wmapGalleryMeta="1",Object.assign(ge.style,{flex:"1",minWidth:"0",overflow:"hidden",display:"flex",alignItems:"center",padding:`${w.sm} ${w.lg}`,fontSize:I.sub,lineHeight:tt.none,boxSizing:"border-box"});const Ue=f.ownerDocument.createElement("div");Object.assign(Ue.style,{background:g.canvasBg,display:"flex",alignItems:"stretch",gap:w.lg,paddingBottom:w.lg,minWidth:"0"});const te=f.ownerDocument.createElement("div");te.dataset.wmapGalleryLegend="1",Object.assign(te.style,{display:"flex",flexDirection:"column",gap:w.sm,background:g.menuBg,border:`1px solid ${g.menuBorder}`,borderRadius:_.container,padding:`${w.sm} ${w.lg}`,marginBottom:w.lg,boxShadow:He.panel,fontSize:I.body,lineHeight:tt.none,boxSizing:"border-box",width:"100%",minWidth:"0"});const X=f.ownerDocument.createElement("div");Object.assign(X.style,{display:"flex",flexDirection:"row",alignItems:"flex-start"});let he=null,Le=null,cn=null;function Oo(){return H?he?Promise.resolve(he):(cn??=import("./insightsTab.js").then(({createInsightsTab:e})=>(he=e({getItems:()=>v,getLotStats:()=>z,getBinColors:()=>l.binColors??me(),getRingCount:at,defaultView:p.insights?.defaultView,sweeps:p.insights?.sweeps,onRemoveSweeps:p.insights?.onRemoveSweeps,onOpenGuide:void 0,showMetadataStrip:!1,onSaveImage:Ce.onSaveImage,onSaveText:Ce.onSaveText,ownerDocument:f.ownerDocument,openWafer:(t,n,o)=>{const c=v[t];if(!c)return;let r=null;const s=fi({title:n,onClose:()=>r?.destroy(),anchor:f});Cn(s,n,c.wafer.metadata??void 0),r=St(s.contentWrap,c,o,void 0,Pn(s))}}),Le=he.el,Le.style.display="none",f.appendChild(Le),he)),cn):Promise.resolve(null)}let Re=!1;function un(e){H&&(Re=e,Le&&(Le.style.display=e?"flex":"none"),X.style.display=e?"none":"flex",L.style.display=e?"none":"inline-flex",$.style.display="inline-flex",re&&(Me(re,e),re.innerHTML=e?Fe.wafer:Fe.analysis,re.ariaLabel=e?"Back to gallery view":"Insights"),le(),Ze(),e&&Oo().then(t=>{!t||!Re||(t.el.style.display="flex",t.render())}))}H&&p.insights?.defaultOpen&&queueMicrotask(()=>un(!0));const fn=4,Ye=240,gt=480,To=720,Lo=1.25;let de=gt;function pn(e){const t=P*2+110+2,n=mn();if(n)return Math.ceil(n.across*fn+t);let o=null;for(const c of e){if(c==null||!c.dies?.length)continue;const r=c.dies[0].width;if(!(r>0))continue;const s=c.wafer.radius*2*(fn/r),d=Math.ceil(s+t);(o==null||d>o)&&(o=d)}return o}function Ro(e){const t=pn(e);return t==null?Ye:Math.min(de,Math.max(Ye,t))}function Io(e){const t=pn(e);if(t==null)return!1;const n=Math.min(To,Math.max(gt,t));return n<=de?!1:(de=n,!0)}function mn(){const e=l.compact?l.compactMap:void 0,t=k.find(c=>c?.dies?.length)?.dies[0];if(!e||!t||e.columns.length===0||e.rows.length===0||!(t.width>0)||!(t.height>0))return;const n=(l.rotation??0)%180!==0,o=l.showXYIndicator?2.5:0;return{across:(n?e.rows.length:e.columns.length)+o,down:(n?e.columns.length:e.rows.length)+o,cellAspect:n?t.height/t.width:t.width/t.height}}function gn(e,t){const n=mn();if(!n){e.style.aspectRatio="1",t.style.flex="1",t.style.width="",t.style.aspectRatio="";return}e.style.aspectRatio="auto",t.style.flex="none",t.style.width="100%",t.style.aspectRatio=String(n.across*n.cellAspect/n.down)}function Wo(){for(const e of Q)e?.parentElement&&gn(e.parentElement,e)}function hn(){de=gt,Ie=Ye,bt(k.map(e=>e??null)),yt(),Wo()}function ht(){return E!=null?"none":`${de}px`}function yt(){const e=ht();for(const t of Array.from(A.children))t.classList.contains("wmap-gallery-card")&&(t.style.maxWidth=e,t.style.maxHeight=e)}let Ie=Ye,yn=0;function bt(e){if(Io(e)&&yt(),E==null){const n=Ro(e);n>Ie&&(Ie=n)}vt()}function bn(e){E=Xn(e),yt(),vt()}function wt(e){return`repeat(${e}, minmax(0, ${E!=null?"1fr":`${de}px`}))`}function wn(e){A.style.gridTemplateColumns!==e&&(A.style.gridTemplateColumns=e)}function vt(){if(E!=null){wn(wt(E));return}const e=Math.max(1,yn),t=12,n=A.clientWidth||0,o=r=>(n-t*(r-1))/r;let c=Math.max(1,Math.ceil(Math.sqrt(e)));if(n>0){const r=Math.min(de,Ie*Lo),s=d=>{let i=0;for(;i<e&&o(i+1)>=d;)i++;return i};c=s(r)||s(Ie)||1}wn(wt(c))}const A=f.ownerDocument.createElement("div");if(Object.assign(A.style,{flex:"1 1 0",minWidth:"0",display:"grid",gridTemplateColumns:wt(1),gap:w.xl,paddingLeft:ie,paddingRight:ie,justifyContent:"start",alignContent:"start",isolation:"isolate"}),ce?.placement){const e=ce.placement;y=Rt(e,ie,f.ownerDocument),y.style.maxHeight="calc(100vh - 80px)",y.style.position="sticky",y.style.top="8px",y.style.display="flex",y.style.flexDirection="column"}else if(z||lt()){const e=!!ce?.defaultOpen;y=Rt("right",ie,f.ownerDocument),y.style.maxHeight="calc(100vh - 80px)",y.style.position="sticky",y.style.top="8px",y.style.flexDirection="column",y.style.display=e?"flex":"none",j()}le(),y?.style.display!=="none"&&F&&Me(F,!0),(ce?.placement??"right")==="left"?(y&&X.appendChild(y),X.appendChild(A)):(X.appendChild(A),y&&X.appendChild(y));const We=f.ownerDocument.createElement("div");Object.assign(We.style,{position:"sticky",top:"0",display:"flex",flexDirection:"column",paddingLeft:ie,paddingRight:ie,paddingTop:ie,zIndex:"1",background:g.menuBg}),Ue.appendChild(ge),Ue.appendChild($),We.appendChild(Ue),We.appendChild(te),f.appendChild(We),f.appendChild(X);function Ze(){te.innerHTML="";const e=l.plotMode??"hardBin",t=!Re&&On.has(e),n=k.filter(h=>h!=null),o=n.find(h=>h.isLotStack),c=Xi(n.map(h=>({metadata:h.wafer.metadata??void 0})),o?{lotSize:o.lotSize??n.length,aggrMethod:o.aggrMethod}:void 0),r=e==="metadata",s=l.activeMetadataKey,d=t&&!r?Un(n,h=>(e==="softBin"?h.sbin:h.hbin)??void 0,Zn):{counts:new Map,total:0,pass:0},i=t&&!r?l.binColors??me():void 0,a=i?e==="softBin"?i.pass.soft:i.pass.hard:new Set,u=Ri(d.counts.entries(),a).map(([h])=>h),m=t&&r&&s?Un(n,h=>Go(h.metadata?.[s])):{counts:new Map,total:0,pass:0},D=r?Zt()?.values:void 0,B=t&&r?(D??[...m.counts.keys()].sort(Lt)).filter(h=>m.counts.has(h)):[];if(ge.innerHTML="",c&&ge.appendChild(c),ge.style.display=c?"flex":"none",!u.length&&!B.length){te.style.display="none";return}te.style.display="flex";const C=f.ownerDocument.createElement("div");Object.assign(C.style,{display:"flex",flexWrap:"wrap",alignItems:"center",gap:`${w.sm} ${w.xl}`,maxHeight:"86px",overflowY:"auto",overflowX:"hidden"}),te.appendChild(C);const b=_n(l.highlightBin),O=k.flatMap(h=>h?.metadataFields??[]).find(h=>h.key===s),T=r?O?.label??(s?Zi(s):"Metadata"):si[e],V=f.ownerDocument.createElement("span");if(V.textContent=T,Object.assign(V.style,{fontSize:I.body,fontWeight:"700",letterSpacing:ni,textTransform:"uppercase",color:g.label,flexShrink:"0"}),C.appendChild(V),!r&&d.total>0){const h=d.pass,N=h/d.total*100,ne=f.ownerDocument.createElement("span");ne.textContent=`Yield ${st(N)}`,Object.assign(ne.style,{fontSize:I.body,fontWeight:"700",color:g.value,whiteSpace:"nowrap",flexShrink:"0"});const oe=f.ownerDocument.createElement("span");oe.textContent=`${h.toLocaleString()} / ${d.total.toLocaleString()} dies`,Object.assign(oe.style,{fontSize:I.body,color:g.label,whiteSpace:"nowrap",flexShrink:"0"}),C.appendChild(ne),C.appendChild(oe)}if(r){const h=_n(l.highlightMetadataValue);B.forEach((N,ne)=>{const oe=h.includes(N),Je=O?.values?.find(kt=>kt.value===N),Bt=Je?.color??ei(ne),Bn=m.counts.get(N)??0;Yn(C,{color:Bt,isActive:oe,label:Je?.label??N,count:Bn,percent:m.total>0?Bn/m.total*100:void 0,onClick:kt=>{const Vo=Kn(l.highlightMetadataValue,N,kt);qt(),R({highlightMetadataValue:Vo})}})});return}const Pe=e==="softBin"?k.flatMap(h=>h?.sbinDefs??[]):k.flatMap(h=>h?.hbinDefs??[]),Mn=new Set,Dt=[];for(const h of Pe)Mn.has(h.bin)||(Mn.add(h.bin),Dt.push(h));const Et=Dt.length>0?new Map(Dt.map(h=>[h.bin,h])):null,Dn=i??l.binColors??me(),jo=e==="softBin"?Dn.soft:Dn.hard,En=h=>jo.get(h)??Jo;for(const h of u){const N=b.includes(h),ne=Et?.get(h),oe=d.counts.get(h)??0;Yn(C,{color:En(h),isActive:N,label:ne?.name?`${h} \xB7 ${ne.name}`:`Bin ${h}`,count:oe,percent:d.total>0?oe/d.total*100:void 0,onClick:Je=>{const Bt=Kn(l.highlightBin,h,Je);qt(),R({highlightBin:Bt})}})}d.total>0&&u.length>1&&te.appendChild(as(f.ownerDocument,[...d.counts.entries()].sort(([,h],[,N])=>N-h).map(([h,N])=>({color:En(h),count:N,label:Et?.get(h)?.name?`${h} \xB7 ${Et.get(h).name}`:`Bin ${h}`})),d.total))}function $e(e){const t=v.filter(d=>d!==null);if(!t.length)return[];const n=t.map(d=>d.dies.filter(os)),o=t[0].wafer,c=t.length,r=o.metadata?{...o,metadata:(({wafer:d,waferId:i,...a})=>a)(o.metadata)}:o;function s(d,i){return{...d,stats:{...d.stats,isLotStack:!0,aggregationMethod:i,lotSize:c}}}if(e==="stackedValues"){const d=xe();let i=d?.filter(Tt);if(d!==void 0&&i?.length===0)return[];if(d?.length||(i=No(t.flatMap(m=>m.dies)).map(m=>({testNumber:m,name:Qi(void 0,m)}))),!i?.length)return[];const a=l.aggregationMethod??"mean";return i.map(u=>{const m=Wi(n,a,u.testNumber),D={testNumber:0,name:u.name,unit:u.unit,...es(u)};return{wafer:r,dies:m,testDefs:[D],label:`${Ji(u,u.testNumber)} \xB7 ${a}`,isLotStack:!0,aggrMethod:a,lotSize:c,statsSummary:s(ot({wafer:r,dies:m,testDefs:[D]},{testNumbers:[0]}),a)}})}if(e==="stackedBins"){let d=et(t.map(i=>i?.hbinDefs));return(!d||d.length===0)&&(d=[...new Set(t.flatMap(a=>a.dies.map(u=>u.hbin).filter(u=>u!=null)))].sort((a,u)=>a-u).map(a=>({bin:a,name:`Bin ${a}`}))),d.map(i=>{const a=Hn(n,i.bin,"hard"),u=[{bin:i.bin,name:i.name}];return{wafer:r,dies:a,hbinDefs:u,label:`${i.bin} \xB7 ${i.name}`,isLotStack:!0,aggrMethod:"countBin",lotSize:c,statsSummary:s(ot({wafer:r,dies:a,hbinDefs:u}),"countBin")}})}if(e==="stackedSoftBins"){let d=et(t.map(i=>i?.sbinDefs));return(!d||d.length===0)&&(d=[...new Set(t.flatMap(a=>a.dies.map(u=>u.sbin).filter(u=>u!=null)))].sort((a,u)=>a-u).map(a=>({bin:a,name:`Bin ${a}`}))),d.map(i=>{const a=Hn(n,i.bin,"soft"),u=[{bin:i.bin,name:i.name}];return{wafer:r,dies:a,sbinDefs:u,label:`${i.bin} \xB7 ${i.name}`,isLotStack:!0,aggrMethod:"countBin",lotSize:c,statsSummary:s(ot({wafer:r,dies:a,sbinDefs:u}),"countBin")}})}return t}function Ct(e){const t=v.length;return e==="stackedBins"||e==="stackedSoftBins"?{valueRange:[0,t],lotSize:t}:e==="stackedValues"?{aggregationMethod:l.aggregationMethod??"mean",valueRange:void 0,lotSize:void 0}:{}}function R(e,{fireCallback:t=!0}={}){const n=Object.keys(e),o=l.plotMode,c=ve()!==null;l={...l,...e};const r=l.plotMode,s=be.has(r),d=o!==void 0&&be.has(o),i=Ne>0;if("binColorScheme"in e||"useDefinedBinColors"in e){const u=me();l={...l,binColors:u},e={...e,binColors:u}}if("compact"in e){const u=Jt();l={...l,compactMap:u},e={...e,compactMap:u}}if(("compact"in e||l.compact&&("rotation"in e||"showXYIndicator"in e))&&hn(),e.plotMode!==void 0)if(s){const u=Ct(r);if(l={...l,...u},i)for(const m of M)m&&m.setOptions(e);else Z($e(r))}else if(d){const{valueRange:u,lotSize:m,aggregationMethod:D,...B}=l;if(l=B,i)for(const C of M)C&&C.setOptions(e);else Z(v.filter(C=>C!==null))}else for(const u of M)u&&u.setOptions(e);else if(e.aggregationMethod!==void 0&&r==="stackedValues")if(i)for(const u of M)u&&u.setOptions(e);else Z($e("stackedValues"));else for(const u of M)u&&u.setOptions(e);ve()!==null!==c&&$t(),Ze(),sn(),nn(),Ut();const a=e.plotMode!==void 0&&e.plotMode!==o;(Hi.some(u=>u in e)||a)&&j(),Te(),an(),ln(),ut(),ct(),t&&p.onViewOptionsChange?.(Vn(l),n,Fi(n))}function vn(e,t,n){const o=e.createElement("div");Object.assign(o.style,{display:"flex",alignItems:"center",gap:w.xs,flex:"1",minWidth:"0"});const c=e.createElement("span");c.textContent=t,Object.assign(c.style,{fontWeight:"700",fontSize:I.sub,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}),o.appendChild(c);const r=qn(n??{});let s=null;if(r.length>0){const d=e.createElement("span");Object.assign(d.style,{fontSize:I.body,lineHeight:tt.none,color:g.label,flexShrink:"0"}),d.textContent="\u25BE",o.appendChild(d),Object.assign(o.style,{cursor:"pointer",borderRadius:_.control}),o.addEventListener("mouseenter",()=>{o.style.background=g.bgHover}),o.addEventListener("mouseleave",()=>{o.style.background="none"}),s=e.createElement("div"),s.dataset.wmapCardMetaPanel="1",Object.assign(s.style,{position:"absolute",top:"0",left:"0",right:"0",zIndex:Tn,background:g.menuBg,borderBottom:`1px solid ${g.menuBorder}`,boxShadow:He.menu,padding:`${w.md} ${w.lg}`,fontSize:I.body,display:"none"});const i=Gn(n??{});i&&s.appendChild(i),o.setAttribute("aria-expanded","false"),o.setAttribute("aria-label",`Wafer info for ${t||"this card"}. Click to expand.`),Wn(o,a=>{d.textContent=a?"\u25B4":"\u25BE",o.setAttribute("aria-expanded",String(a)),s&&(s.style.display=a?"block":"none")})}return{wrap:o,metaPanel:s}}function Cn(e,t,n){const o=e.box.querySelector("[data-wmap-window-title]"),c=qn(n??{});if(!o||c.length===0)return;const r=o.parentElement,s=f.ownerDocument.createElement("div");Object.assign(s.style,{display:"flex",alignItems:"center",gap:w.xs,flex:"1",minWidth:"0",cursor:"pointer"}),Ot(s,"bare"),r?.insertBefore(s,o),s.appendChild(o);const d=f.ownerDocument.createElement("span");Object.assign(d.style,{fontSize:I.body,lineHeight:tt.none,color:g.label,flexShrink:"0"}),d.textContent="\u25BE",s.appendChild(d);const i=f.ownerDocument.createElement("div");i.dataset.wmapCardMetaPanel="1",Object.assign(i.style,{position:"absolute",top:"0",left:"0",right:"0",zIndex:Tn,background:g.menuBg,borderBottom:`1px solid ${g.menuBorder}`,boxShadow:He.menu,padding:`${w.md} ${w.lg}`,fontSize:I.body,display:"none"});const a=Gn(n??{});a&&i.appendChild(a),e.contentWrap.style.position="relative",e.contentWrap.appendChild(i),s.setAttribute("aria-expanded","false"),s.setAttribute("aria-label",`Wafer info for ${t}. Click to expand.`),Wn(s,u=>{d.textContent=u?"\u25B4":"\u25BE",s.setAttribute("aria-expanded",String(u)),i.style.display=u?"block":"none"})}function xt(e,t,n){const o=f.ownerDocument.createElement("div");o.className="wmap-gallery-card",Object.assign(o.style,{background:g.menuBg,border:`1px solid ${g.menuBorder}`,borderRadius:_.container,boxShadow:He.panel,overflow:"hidden",display:"flex",flexDirection:"column",position:"relative",aspectRatio:"1",maxWidth:ht(),maxHeight:ht()});const c=f.ownerDocument.createElement("div");Object.assign(c.style,{display:"flex",alignItems:"center",padding:`${w.md} ${w.lg} ${w.sm}`,borderBottom:`1px solid ${g.menuBorder}`,flexShrink:"0",gap:w.sm});const{wrap:r,metaPanel:s}=vn(document,nt(e,t),e.wafer.metadata??void 0);c.appendChild(r);const d=f.ownerDocument.createElement("button");d.dataset.wmapExpandBtn="1",d.setAttribute("aria-label","Open full view"),$n(d),d.innerHTML=Fe.expand,Object.assign(d.style,{display:"flex",alignItems:"center",justifyContent:"center",border:`1px solid ${g.menuBorder}`,borderRadius:_.control,background:g.panelBg,color:g.label,padding:w.xxs,cursor:"pointer",flexShrink:"0",width:"22px",height:"22px"}),Ot(d),c.appendChild(d),o.appendChild(c);const i=f.ownerDocument.createElement("div");Object.assign(i.style,{position:"relative",flex:"1",minHeight:"0",overflow:"hidden",display:"flex",flexDirection:"column"}),o.appendChild(i),gn(o,i),s&&i.appendChild(s),A.appendChild(o),o.addEventListener("contextmenu",D=>{if(D.defaultPrevented)return;const B=p.insights?.sweeps;if(!Ai(e.testDefs,B))return;D.preventDefault();const C=e.viewOptions?{...l,...e.viewOptions}:l,b=Pi(e.dies,{waferLabel:Fn(e),testDefs:e.testDefs,isLotStack:e.isLotStack,activeTest:C.plotMode==="value"?C.activeTest:void 0,waferIndex:t}),O={x:D.clientX,y:D.clientY};import("./drilldown.js").then(({openDrilldownMenu:T})=>{o.isConnected&&T(O,o,b,{sweeps:B,onSaveImage:m.getSaveImageHook()})})});const a=Ve||ve()!==null,u=e.viewOptions?{...l,...e.viewOptions}:l,m=jn(i,e,{viewOptions:{...u,showLegend:a,legendPosition:we},showTooltip:!0,padding:P,statsSummary:e.statsSummary,onSaveImage:p.onSaveImage,onSaveText:p.onSaveText,downloadFilename:p.downloadFilename,onClick:e.onClick,onSelect:Kt(e),insights:U,onExpand:()=>Ae(t,e),showIdentity:!1,chromeInset:ii,drawWhenVisible:!0});return m.setViewControlsVisible(!1),m.setSummaryVisible(!1),d.onclick=()=>Ae(t,e),{card:o,ctrl:m,canvasWrapper:i,expandBtn:d}}function $o(e){const t=ue[e];if(!t)return;const n=[...K.values()].find(o=>o.cardIndex===e);n?(t.innerHTML=Fe.minimize,t.setAttribute("aria-label","Reattach to gallery"),t.onclick=()=>Po(n.id)):(t.innerHTML=Fe.expand,t.setAttribute("aria-label","Open full view"),t.onclick=()=>Ae(e,k[e]))}function Z(e){Fo(),De()?.remove(),Ee(null),ke(),k=[];for(const i of M)i&&i.destroy();M=[],Q=[],ue=[],Ne=0,A.innerHTML="",yn=e.length,bt(e.map(i=>typeof i=="function"?null:i));const t=[];for(let i=0;i<e.length;i++){const a=e[i];if(typeof a=="function"){const u=f.ownerDocument.createElement("div");u.className="wmap-gallery-card",Object.assign(u.style,{background:g.menuBg,border:`1px solid ${g.menuBorder}`,borderRadius:_.container,aspectRatio:"1",display:"flex",alignItems:"center",justifyContent:"center"});const m=f.ownerDocument.createElement("span");m.textContent="\u2026",Object.assign(m.style,{color:g.label,fontSize:"18px"}),u.appendChild(m),A.appendChild(u),k.push(null),M.push(null),Q.push(null),ue.push(null),t.push({index:i,factory:a,placeholder:u}),Ne++}else{const{ctrl:u,canvasWrapper:m,expandBtn:D}=xt(a,i,e.length);k.push(a),M.push(u),Q.push(m),ue.push(D)}}tn(),Ze(),ut(),ct(),en();const n=++Se,o=()=>{setTimeout(()=>{n===Se&&p.onItemsResolved?.()},0)},c=i=>{setTimeout(()=>{n===Se&&p.onItemResolved?.(i,e.length)},0)};let r=e.length-t.length;r>0&&c(r);let s=0;function d(){if(n!==Se)return;if(s>=t.length){if(be.has(l.plotMode)){const O=l.plotMode;Z($e(O));return}Be=o,j(),pe||(Be=null,o());return}const{index:i,factory:a,placeholder:u}=t[s++],m=a();k[i]=m,v[i]=m,bt([m]);const{card:D,ctrl:B,canvasWrapper:C,expandBtn:b}=xt(m,i,e.length);M[i]=B,Q[i]=C,ue[i]=b,Ne--,u.replaceWith(D),c(++r),bo(),yo(),!y&&!ce?.placement&&m.statsSummary?.findings.length&&(y=Rt("right",ie,f.ownerDocument),y.style.maxHeight="calc(100vh - 80px)",y.style.position="sticky",y.style.top="8px",y.style.flexDirection="column",y.style.display="none",(ce?.placement??"right")==="left"?X.insertBefore(y,A):X.appendChild(y),j(),F||(F=J("findings","Summary panel",()=>{if(!y)return;const T=y.style.display!=="none";T||j(),y.style.display=T?"none":"flex",Me(F,!T),le()}),$.appendChild(G()),$.appendChild(F)),le()),le(),setTimeout(d,0)}t.length>0?setTimeout(d,0):o()}if(be.has(l.plotMode)&&v.length>0){const e=Ct(l.plotMode);l={...l,...e},Z($e(l.plotMode))}else Z(x);Te();let ye=0;const xn=new(f.ownerDocument.defaultView??window).ResizeObserver(()=>{if(ye)return;ye=(f.ownerDocument.defaultView??window).requestAnimationFrame(()=>{ye=0,E==null&&vt()})});xn.observe(A),y&&j();function Ao(e,t){const n=Q[e];if(!n)return;n.innerHTML="",Object.assign(n.style,{alignItems:"center",justifyContent:"center"});const o=f.ownerDocument.createElement("span");o.textContent=t?"Opened in its own window":"Opened in the wafer viewer",Object.assign(o.style,{color:g.label,fontSize:I.body,textAlign:"center",padding:"0 12px"}),n.appendChild(o)}function Ae(e,t){for(const s of K.values())if(s.cardIndex===e)return;const n=nt(t,e),o=Jn++,c=M[e]?.getOptions(),r=ci(n);if(r){const s=r.document;s.title=n,Object.assign(s.documentElement.style,{height:"100%"}),Object.assign(s.body.style,{margin:"0",height:"100vh",overflow:"hidden",display:"flex",flexDirection:"column",fontFamily:I.family}),mi(f,s.documentElement);const d=gi(f,s.documentElement,()=>b.setOptions({})),i=s.createElement("div");i.dataset.wmapWindowBanner="1",i.textContent=n,Object.assign(i.style,{display:"none",padding:`${w.sm} ${w.xl}`,fontSize:I.body,fontWeight:"700",background:g.warnBg,color:g.warnText,borderBottom:`1px solid ${g.warnBorder}`,flexShrink:"0"}),s.body.appendChild(i);const a=s.createElement("div");Object.assign(a.style,{flex:"1",minHeight:"0",display:"flex",flexDirection:"column"}),s.body.appendChild(a);const{wrap:u,metaPanel:m}=vn(s,n,t.wafer.metadata??void 0),D=s.createElement("div");Object.assign(D.style,{display:"flex",alignItems:"center",padding:`${w.md} ${w.lg} ${w.sm}`,borderBottom:`1px solid ${g.menuBorder}`,flexShrink:"0",gap:w.sm}),D.appendChild(u),a.appendChild(D);const B=s.createElement("div");Object.assign(B.style,{position:"relative",flex:"1",minHeight:"0",overflow:"hidden",display:"flex",flexDirection:"column"}),m&&B.appendChild(m),a.appendChild(B);let C=0;const b=St(B,t,void 0,c,(T,V)=>{const Pe=T?V:-C;try{r.resizeBy(Pe,0),C=T?V:0}catch{}}),O=setInterval(()=>{r.closed&&Qe(o)},400);r.addEventListener("pagehide",()=>Qe(o)),K.set(o,{id:o,ctrl:b,cardIndex:e,label:n,closePollId:O,stopThemeSync:d,close:()=>{r.closed||r.close()},setTitle:T=>{s.title=T,i.textContent=T,i.style.display="block"}})}else{const s=ui({title:n,onClose:()=>Qe(o),anchor:f});s.contentWrap.style.flexDirection="column",Cn(s,n,t.wafer.metadata??void 0);const d=St(s.contentWrap,t,void 0,c,Pn(s));K.set(o,{id:o,ctrl:d,cardIndex:e,label:n,closePollId:null,close:()=>s.close(),setTitle:i=>{const a=s.box.querySelector("[data-wmap-window-title]");a&&(a.textContent=i,a.title=i)}})}M[e]?.destroy(),M[e]=null,Ao(e,r!==null),$o(e)}function St(e,t,n,o,c){const r=t.viewOptions?{...l,...t.viewOptions}:l,s=o?{...r,...o}:r,i={...n!==void 0?{...s,plotMode:"value",activeTest:n}:s,showLegend:!0,legendPosition:we},a=jn(e,t,{viewOptions:i,showTooltip:!0,padding:P,statsSummary:t.statsSummary,onSaveImage:p.onSaveImage,onSaveText:p.onSaveText,downloadFilename:p.downloadFilename,onClick:t.onClick,onSelect:Kt(t),insights:U,showExpandButton:!1,onSummaryPanelChange:c,showIdentity:!1});return a.setViewControlsVisible(!0),a.setSummaryVisible(!0),a.setExpandVisible(!1),a}function Qe(e){const t=K.get(e);if(!t||(K.delete(e),t.closePollId!=null&&clearInterval(t.closePollId),t.stopThemeSync?.(),t.ctrl.destroy(),t.cardIndex===null))return;const n=t.cardIndex,o=k[n];if(!o)return;const{card:c,ctrl:r,canvasWrapper:s,expandBtn:d}=xt(o,n,k.length);Q[n]?.parentElement?.replaceWith(c),M[n]=r,Q[n]=s,ue[n]=d}function Po(e){const t=K.get(e);t&&(t.close(),Qe(e))}function Fo(){for(const e of K.values())e.cardIndex!==null&&(e.cardIndex=null,e.setTitle(`${e.label} \u2014 unlinked from gallery`))}function Mt(){for(const e of M)e?.drawPendingNow()}const Sn=f.ownerDocument.defaultView??window;Sn.addEventListener("beforeprint",Mt);function Ho(){Mt();const e=[...A.querySelectorAll("canvas")];if(!e.length)return;const t=e.length,n=Math.ceil(Math.sqrt(t)),o=Math.ceil(t/n),c=e[0].width,r=e[0].height,s=8,d=(f.ownerDocument.defaultView??window).devicePixelRatio||1,i=Math.round(26*d),a=Math.round(12*d),u=f.ownerDocument.createElement("canvas");u.width=n*c+(n-1)*s,u.height=o*(r+i)+(o-1)*s;const m=u.getContext("2d"),D=ti(A);m.fillStyle=D.background,m.fillRect(0,0,u.width,u.height),e.forEach((B,C)=>{const b=C%n,O=Math.floor(C/n),T=b*(c+s),V=O*(r+i+s),Pe=B.closest(".wmap-gallery-card")?.querySelector("span")?.textContent??"";m.fillStyle=D.surface,m.fillRect(T,V,c,i),m.fillStyle=D.text,m.font=`700 ${a}px system-ui, sans-serif`,m.textAlign="left",m.textBaseline="middle",m.fillText(Pe,T+Math.round(10*d),V+i/2,c-Math.round(20*d)),m.drawImage(B,T,V+i)}),u.toBlob(B=>{if(!B)return;const C=M.find(b=>b!=null)?.getExportTitle();xi(B,["gallery",C].filter(Boolean).join(" "),Ce.onSaveImage)})}return{setItems(e){v=e.map(n=>typeof n=="function"?null:n);const t=l.plotMode;if(be.has(t))if(e.some(o=>typeof o=="function"))Z(e);else{const o=Ct(t);l={...l,...o},Z($e(t))}else Z(e)},setOptions(e){R(e,{fireCallback:!1})},getOptions(){return Vn(l)},setFindingsNotice(e){Vt=e,j()},setColumns(e){bn(e)},getBinColors(){return l.binColors??me()},setLotStatsSummary(e){z=e,Te(),y&&j(),le()},openUserGuide:dn,destroy(){Se++,Sn.removeEventListener("beforeprint",Mt),pe?.cancel(),pe=null,Be=null;for(const e of[...K.values()])e.closePollId!=null&&clearInterval(e.closePollId),e.close(),e.ctrl.destroy();K.clear();for(const e of M)e&&e.destroy();M=[],De()?.remove(),xn.disconnect(),ye&&((f.ownerDocument.defaultView??window).cancelAnimationFrame(ye),ye=0),f.ownerDocument.removeEventListener("click",ze,!0),window.removeEventListener("blur",jt),se(),Ln(),We.remove(),X.remove(),y?.remove(),he?.destroy()}}}
1
+ import{createViewSwitch as bi}from"./viewSwitch.js";import{createSummaryRail as wi}from"./summaryRail.js";import{getUniqueTestNumbers as vi,resolveTestNumber as Si,findTestDef as Ci,collectMetadataValues as xi}from"../renderer/buildView.js";import{metadataCategoricalValue as Mi}from"../core/metadata.js";import{resolveBinColorsForMaps as ki,mergeBinDefs as mt,binColorWarning as Di,mixedPassBinsWarning as Bi,binColorsEqual as Ei}from"../renderer/binColors.js";import{commonPassBins as Oi,itemPassBins as to}from"../core/passBins.js";import{requireRingCount as ne}from"../core/ringCount.js";import{NO_DATA_FILL as Ti}from"../renderer/colorMap.js";import{metadataValueColor as Li}from"../renderer/colorMap.js";import{resolveCanvasTheme as Wi}from"./canvasTheme.js";import{ICONS as _t}from"./icons.js";import{SHADOW as qt,LEADING as no,TRACKING as Ri,controlStyle as $i,wireControlHover as Xt,SPACE as k,EDGE_GUTTER as fe,MAP_CHROME_INSET as Ai,RADIUS as _,FONT as j,CLR as b,sevColor as oo,MODE_LABELS as Ii,BIN_LEGEND_MODES as io,STACKED_MODES as Oe,applyOverlayZ as Pi,getTooltip as Fi,hideTooltip as so,createToolbarHelpers as Hi,buildModeMenuEl as ji,openDetachWindow as Vi,openFloatingWindow as zi,openModal as Ni,copyWmapThemeTokens as Gi,syncWmapPopupTheme as Ki,makePaletteBtn as _i,makeLogScaleBtn as qi,makeLegendStyleBtn as Xi,makeOverlaysBtn as Ui,makeOrientationBtn as Yi,menuLayerFor as ao,saveImageBlob as Zi,markMenuTrigger as Ze,wireMenuA11y as lo,wireTooltip as Ut,requestedPassFailDisplay as ro,overlayMenuRows as Qi,anyOverlayActive as Ji,openCompactDiagnostics as es,roomForPanel as co,logWmapVersionOnce as ts,buildDataModeEntries as ns,metadataKeyHasData as os,metadataModeEntry as is}from"./toolbar.js";import{openReportModal as ss,openUserGuideWindow as as}from"./guideWindow.js";import{waferDisplayLabel as gt,waferIdentityLabel as ye}from"../core/waferLabel.js";import{metadataDisplayValue as ls}from"../core/metadata.js";import{withExportContext as rs}from"./exportName.js";import{sortBinsForDisplay as cs}from"../stats/binPareto.js";import{diePassStatus as ds}from"../core/dies.js";import{aggregateValues as us,aggregateBinCounts as uo}from"../core/aggregates.js";import{renderWaferMap as fs,renderWaferMapCard as fo,toPublicViewOptions as po}from"./renderWaferMap.js";import{waferPopulation as ps,selectionPopulation as ms,LOT_STACK_REASON as Yt}from"./chartPopulation.js";import{sourceFromBins as mo}from"./plotItems.js";import{plotStoreFor as gs}from"./plotStore.js";import{classifyChanged as hs,COLOR_KEYS as ys,findingBin as bs}from"./renderWaferMap.js";import{findingPatternKey as go}from"../stats/filterFindings.js";import{buildWaferMap as ws,getTestPassStatus as ho,isParametricTest as Zt,getDieTestValue as vs}from"../renderer/buildWaferMap.js";import{analyzeWaferMap as ht}from"../stats/analyzeWaferMap.js";import{collectWarnings as Ss,buildWarningsMenuEl as Cs,severityOf as xs}from"./warnings.js";import{asList as Qt,compareNatural as Jt,arrayEqual as yt,toggleHighlight as yo}from"../core/utils.js";import{buildCompactMap as Ms,compactLayoutOffered as ks}from"../core/compact.js";import{attachExpandableMetadata as bo}from"./identityHeader.js";import{createSummaryPanelEl as en,buildMetadataStripRow as Ds,metadataEntries as Bs,renderLotSummaryContentSteps as Es,reportMapsFromItems as Os}from"./summaryPanel.js";import{prettyKey as Ts}from"../stats/facets.js";import{testLabel as Ls,markedTestLabel as Ws,derivedFields as Rs}from"../renderer/testLabel.js";import{mergeTestDefs as $s}from"../stats/mergeTestDefs.js";import{getDieKey as bt,hasPosition as As}from"../core/dies.js";import{testValue as Is}from"../core/dieTable.js";import{runChunked as Ps}from"./chunked.js";function wo(d){if(typeof d!="number"||!Number.isFinite(d))return;const D=Math.round(d);return D>=1?D:void 0}const tn=12;function Fs(d,D,m){let H=D;if(D.length>tn){const x=D.slice(0,tn-1),E=D.slice(tn-1),V=E.reduce((R,oe)=>R+oe.count,0);H=[...x,{color:b.label,count:V,label:`Other (${E.length} bins)`}]}const O=d.createElement("div");Object.assign(O.style,{display:"flex",columnGap:"1px",width:"100%",height:"8px",borderRadius:_.control,overflow:"hidden",border:`1px solid ${b.menuBorder}`,boxSizing:"border-box",marginTop:k.xs,flexShrink:"0"}),O.setAttribute("role","img"),O.setAttribute("aria-label",`Population split: ${H.map(x=>`${x.label} ${wt(x.count/m*100)}`).join(", ")}`);for(const x of H){const E=x.count/m*100,V=d.createElement("div");Object.assign(V.style,{flex:`${E} 1 0`,minWidth:E>0?"2px":"0",background:x.color}),Ut(V,`${x.label} \xB7 ${x.count.toLocaleString()} dies \xB7 ${wt(E)}`),O.appendChild(V)}return O}function wt(d){return d>0&&d<.1?"<0.1%":`${d.toFixed(1)}%`}function vo(d,D,m){const H=new Map;let O=0,x=0;for(const E of d){const V=m?new Set(m(E)):void 0;for(const R of E.dies){if(R.partial||R.edgeExcluded)continue;const oe=D(R);oe!==void 0&&(H.set(oe,(H.get(oe)??0)+1),O++,V&&ds(R,V)&&x++)}}return{counts:H,total:O,pass:x}}function So(d,D){const m=d.ownerDocument.createElement("div");Object.assign(m.style,{display:"flex",alignItems:"center",gap:"5px",cursor:"pointer",userSelect:"none",padding:`${k.xxs} ${k.xs}`,borderRadius:_.control});const H=d.ownerDocument.createElement("span");Object.assign(H.style,{display:"inline-block",width:"13px",height:"13px",flexShrink:"0",background:D.color,border:D.isActive?`2px solid ${b.iconActive}`:`1px solid ${b.menuBorder}`,borderRadius:_.control,boxSizing:"border-box"});const O=d.ownerDocument.createElement("span");if(O.textContent=D.label,Object.assign(O.style,{fontWeight:D.isActive?"700":"400",color:D.isActive?b.iconActive:b.text,whiteSpace:"nowrap"}),m.appendChild(H),m.appendChild(O),D.count!==void 0){const x=d.ownerDocument.createElement("span");if(x.textContent=D.count.toLocaleString(),Object.assign(x.style,{color:D.isActive?b.iconActive:b.text,fontWeight:D.isActive?"700":"400",whiteSpace:"nowrap"}),m.appendChild(x),D.percent!==void 0){const E=d.ownerDocument.createElement("span");E.textContent=wt(D.percent),Object.assign(E.style,{color:b.label,whiteSpace:"nowrap"}),m.appendChild(E)}}if(m.setAttribute("role","button"),m.setAttribute("aria-pressed",D.isActive?"true":"false"),m.tabIndex=0,m.addEventListener("mouseenter",()=>{m.style.background=b.bgHover}),m.addEventListener("mouseleave",()=>{m.style.background="transparent"}),m.addEventListener("focus",()=>{m.style.background=b.bgHover}),m.addEventListener("blur",()=>{m.style.background="transparent"}),m.addEventListener("click",x=>D.onClick(x.ctrlKey||x.metaKey)),m.addEventListener("keydown",x=>{if(x.key==="Enter"||x.key===" ")x.preventDefault(),D.onClick(x.ctrlKey||x.metaKey);else if(D.onMenu&&(x.key==="ContextMenu"||x.key==="F10"&&x.shiftKey)){x.preventDefault();const E=m.getBoundingClientRect();D.onMenu({x:E.left+E.width/2,y:E.bottom},m)}}),D.onMenu){const x=D.onMenu;m.addEventListener("contextmenu",E=>{E.preventDefault(),x({x:E.clientX,y:E.clientY},m)}),Ut(m,"Right-click: charts and tables for these dies")}d.appendChild(m)}export function renderWaferGallery(d,D,m={}){ts();const H=6;let O=wo(m.columns);const x=m.showHelpButton??!1,E=m.userGuideExtension,V=m.insights?.enabled??!0,R=gs(m.insights),oe={enabled:!1,plotStore:R},Co=Pi(m.zIndex),be=m.summaryPanel,pe=e=>[...to(e)],nn=()=>M.flatMap(e=>e?[ne(e,"renderWaferGallery")]:[]),vt=()=>nn()[0];function xo(e){const t=[...new Set(e)].sort((n,o)=>n-o);return t.length<2?null:{code:"ring-count-mixed",severity:"warning",message:`These wafers were built with different ring counts (${t.join(", ")}). Each card and each wafer's findings use their own; the lot's ring yield in the Summary panel, report and Insights uses ${e[0]} rings.`}}let z=m.lotStatsSummary,Te=m.viewOptions?.legendPosition??"default",Qe=m.perCardLegend??!1;function Le(){const e=l.plotMode??"hardBin";return io.has(e)?null:l.colorbarRangeMode==="data"?"Each map has its own value range, so it keeps its own colour bar":"These wafers have no shared colour bar for value mode, so each map keeps its own"}function on(){const e=Qe||Le()!==null;for(const t of C)t&&t.setOptions({showLegend:e})}let l={plotMode:"hardBin",showDieLabels:!1,showRingBoundaries:!1,showQuadrantBoundaries:!1,rotation:0,flipX:!1,flipY:!1,...m.viewOptions},C=[],ie=[],we=[],B=[];const P=rs(()=>{const e=B.filter(n=>n!=null),t=[...new Set(e.map(n=>ls(n.wafer.metadata?.lot)).filter(n=>n!==void 0))].sort(Jt);return{prefix:m.downloadFilename,lots:t,...e.length===1?{wafer:ye(e[0])}:{waferCount:e.length}}},m.onSaveImage,m.onSaveText);let M=D.map(e=>typeof e=="function"?null:e);function ve(){return $s(M)}function We(){if(M.some(e=>e?.testDefs?.length))return ve().defs}let Re=0,Je=0;const U=new Map;let Mo=0,$=null,se=null,sn=new Set,w=null,ko={};function an(e){return M[e]?.statsSummary??z?.perWafer.find(t=>t.waferIndex===e)?.summary}function St(){return!!(M.some(e=>e?.statsSummary?.findings.length)||z?.perWafer.some(e=>e.summary.findings.length))}const Do=Fi(),Se=Hi(Do),{makeBtn:ae,setActive:$e,makeSep:Q,makeMenuRow:Bo,makeMenuSection:Eo,makeDropdown:ln,closeOpenMenu:et,getOpenMenu:Ae,setOpenMenu:Ie}=Se;d.ownerDocument.addEventListener("click",et,!0);const rn=()=>so();window.addEventListener("blur",rn);let cn=m.findingsNotice;function dn(e){sn=new Set(e);const t=[...A.querySelectorAll(".wmap-gallery-card")];let n;t.forEach((o,i)=>{const s=sn.has(i);o.style.outline=s?`3px solid ${b.findingHighlight}`:"",o.style.outlineOffset=s?"-3px":"",s&&n===void 0&&(n=o)}),n?.scrollIntoView?.({behavior:"smooth",block:"nearest"})}function un(){dn([])}let tt=!1;function fn(){tt=!0;for(const e of C)e&&e.clearSelection();tt=!1}function pn(e){return t=>{!tt&&se!==null&&(He(),N()),kt.set(e,t.length),J&&!Pe&&!tt&&Oo(e,t),e.onSelect?.(t)}}function le(e,t){e!==void 0&&(C.forEach((n,o)=>{n&&o!==e&&n.locateDie(null)}),C[e]?.locateDie(t),A.querySelectorAll(".wmap-gallery-card")[e]?.scrollIntoView?.({block:"center",behavior:"smooth"}))}let J=!1,Pe=!1,me=new Set;function Oo(e,t){Pe=!0;try{me=new Set(t.map(n=>bt(n))),B.forEach((n,o)=>{const i=C[o];!i||!n||n===e||i.setSelection(n.dies.filter(s=>me.has(bt(s))))})}finally{Pe=!1}lt()}function mn(){me=new Set,Pe=!0;try{for(const e of C)e?.clearSelection()}finally{Pe=!1}lt()}function Ct(){if(!J||me.size===0)return;const e=[];let t=!1;if(B.forEach((i,s)=>{if(!i)return;const a=i.dies.filter(f=>me.has(bt(f)));a.length!==0&&(i.isLotStack&&(t=!0),e.push({label:ye(i)??i.label??`Wafer ${s+1}`,dies:a,waferIndex:s,wafer:i.wafer,passBins:pe(i),ringCount:ne(i,"renderWaferGallery")}))}),e.length===0)return;const n=ve(),o=l;return{source:{items:e,population:e.length===1?`selected on ${e[0].label}`:`selected at the same die positions on ${e.length} wafers`,testDefs:n.defs,activeTest:o.plotMode==="value"?o.activeTest:void 0,notMeasuredReason:t?Yt:void 0},ctx:{plots:R,onSaveImage:P.onSaveImage,onSaveText:P.onSaveText,onLocateDie:(i,s)=>le(s,i)}}}function gn(){const e=[];let t=!1;if(B.forEach((o,i)=>{const s=o?C[i]?.getSelectedDies()??[]:[];!o||s.length===0||(o.isLotStack&&(t=!0),e.push({label:ye(o)??o.label??`Wafer ${i+1}`,dies:s,waferIndex:i,wafer:o.wafer,passBins:pe(o),ringCount:ne(o,"renderWaferGallery")}))}),e.length<2)return;const n=l;return{source:{items:e,population:`selected on ${e.length} wafers`,testDefs:ve().defs,activeTest:n.plotMode==="value"?n.activeTest:void 0,notMeasuredReason:t?Yt:void 0},ctx:{plots:R,onSaveImage:P.onSaveImage,onSaveText:P.onSaveText,onLocateDie:(o,i)=>le(i,o)}}}function To(e){const t=Ct()??bn(e);if(t)return t;const n=gn(),o=n?.source.items.some(i=>i.waferIndex===e);return n&&o?{...n,narrowable:!0}:void 0}function xt(e,t,n){se!==e&&t.click();const o=w;if(!o)return;const i=z?.findings.find(a=>a.id===e),s=Ct()??gn()??Wo()??(i?hn(wn(i)):void 0);s&&import("./drilldown.js").then(({openDrilldownMenu:a})=>{o.isConnected&&a(n,o,s.source,{plots:R,...s.ctx})})}function Lo(e,t,n,o){const i=Qt(l.highlightBin),s=i.length>1&&i.includes(t)?[...i]:[t],a=[];let f=!1;B.forEach((g,S)=>{g&&(g.isLotStack&&(f=!0),a.push({label:ye(g)??g.label??`Wafer ${S+1}`,dies:g.dies,waferIndex:S,wafer:g.wafer,passBins:pe(g),ringCount:ne(g,"renderWaferGallery")}))});const r=ve().defs,p=mo(a,e,s,r,void 0,f);if(!p)return;const c={plots:R,onSaveImage:P.onSaveImage,onSaveText:P.onSaveText,onLocateDie:(g,S)=>le(S,g)},u=s.length>1?mo(a,e,[t],r,void 0,f):null,h=u?{...c,narrower:{label:`Only ${e} bin ${t}`,backLabel:"All filtered bins",source:u,ctx:c}}:c;import("./drilldown.js").then(({openDrilldownMenu:g})=>{o.isConnected&&g(n,o,p,h)})}function hn(e,t=""){const n=[];let o=!1;for(const s of[...e??[]].sort((a,f)=>a-f)){const a=B[s];a&&(a.isLotStack&&(o=!0),n.push({label:ye(a)??a.label??`Wafer ${s+1}`,dies:a.dies,waferIndex:s,wafer:a.wafer,passBins:pe(a),ringCount:ne(a,"renderWaferGallery")}))}if(n.length===0)return;const i=l;return{source:{items:n,population:n.length===1?`on ${n[0].label}`:`on ${n.length} ${t}wafers`,testDefs:ve().defs,activeTest:i.plotMode==="value"?i.activeTest:void 0,notMeasuredReason:o?Yt:void 0},ctx:{plots:R,onSaveImage:P.onSaveImage,onSaveText:P.onSaveText,onLocateDie:(s,a)=>le(a,s)}}}function Wo(){let e;for(let i=0;i<C.length;i++)if((C[i]?.getSelectedDies().length??0)!==0){if(e!==void 0)return;e=i}const t=e===void 0?void 0:B[e];if(e===void 0||!t)return;const n=C[e].getSelectedDies(),o=l;return{source:ms(n,{waferLabel:ye(t),testDefs:t.testDefs,isLotStack:t.isLotStack,activeTest:o.plotMode==="value"?o.activeTest:void 0,waferIndex:e,wafer:t.wafer,passBins:pe(t),ringCount:ne(t,"renderWaferGallery")}),ctx:{onSaveImage:P.onSaveImage,onSaveText:P.onSaveText,onLocateDie:(i,s)=>le(s??e,i)}}}function Ro(e){e||mn(),J=e,lt()}function Mt(e,t){const n=new Set(e),o=t??C.map((i,s)=>s);for(const i of o){const s=B[i],a=C[i];if(!s||!a)continue;const f=s.dies.filter(r=>n.has(bt(r)));a.setSelection(f)}}const q=new Set,kt=new Map;function yn(){[...A.querySelectorAll(".wmap-gallery-card")].forEach((n,o)=>{n.style.outline=q.has(o)?`2px solid ${b.iconActive}`:"",n.style.outlineOffset=q.has(o)?"-2px":""});const t=q.size;Y.style.display=t>0?"":"none",Y.textContent=`${t} wafer${t===1?"":"s"} picked \u2715`,Y.ariaLabel=`${t} wafer${t===1?"":"s"} picked. Click to clear.`}function $o(e){e<0||(q.has(e)?q.delete(e):q.add(e),yn())}function Ao(){q.clear(),yn()}function bn(e){if(!(q.size===0||!q.has(e))){for(const t of kt.values())if(t>0)return;return hn([...q],"picked ")}}function Io(){const e=[];for(let t=0;t<M.length;t++){const n=M[t];if(!n)continue;const o=an(t)?.findings??[];o.length&&e.push({index:t,item:n,unusualCount:o.filter(i=>i.severity==="unusual").length,notableCount:o.filter(i=>i.severity==="notable").length,totalCount:o.length})}return e}function Po(e){const t=B[e]??M[e];t&&Xe(e,t)}function Fo(e){const t=an(e)?.findings??[];if(t.length)return{total:t.length,unusual:t.filter(n=>n.severity==="unusual").length,notable:t.filter(n=>n.severity==="notable").length}}function Ho(){import("../stats/renderSummaryReport.js").then(({renderLotReportHtml:e})=>{ss(e(Os(M,vt())),{anchor:d})})}function jo(){if(!w)return;w.innerHTML="";const e=Io();if(M.length>0){const n=d.ownerDocument.createElement("div"),o=e.length,i=M.filter(Boolean).length;n.textContent=o===0?`No findings on any of the ${i} wafers`:`${o} of ${i} wafer${i===1?"":"s"} with findings`,Object.assign(n.style,{fontSize:j.body,color:b.label,marginBottom:k.md}),w.appendChild(n)}if(e.length>0){const n=d.ownerDocument.createElement("button");n.type="button",n.textContent="Summary report",Object.assign(n.style,{...$i("outlined"),marginBottom:k.lg,display:"block",width:"100%",textAlign:"left"}),Xt(n),n.addEventListener("click",Ho),w.appendChild(n)}if(e.length===0){const n=d.ownerDocument.createElement("div");Object.assign(n.style,{color:b.icon,fontSize:j.body,padding:"4px 0"}),n.textContent="No findings on any wafer.",w.appendChild(n)}else for(const{index:n,item:o,unusualCount:i,notableCount:s,totalCount:a}of e){const f=i?"unusual":s?"notable":"info",r=i+s||a,p=d.ownerDocument.createElement("button");p.type="button",Object.assign(p.style,{display:"flex",alignItems:"center",justifyContent:"space-between",width:"100%",padding:"5px 8px",marginBottom:k.xs,border:"none",borderLeft:`3px solid ${oo(f)}`,borderRadius:_.control,background:b.bgHover,cursor:"pointer",fontSize:j.body,textAlign:"left",boxSizing:"border-box"}),p.addEventListener("mouseover",()=>{p.style.background=b.bgActive}),p.addEventListener("mouseout",()=>{p.style.background=b.bgHover});const c=d.ownerDocument.createElement("span");c.textContent=gt(o,n),Object.assign(c.style,{color:b.iconHover,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"});const u=d.ownerDocument.createElement("span");u.textContent=String(r),p.setAttribute("aria-label",`${gt(o,n)} \u2014 ${r} finding${r===1?"":"s"}${i?`, ${i} unusual`:""} \u2014 view wafer`),Object.assign(u.style,{marginLeft:k.sm,flexShrink:"0",background:oo(f),color:"#fff",borderRadius:_.container,padding:"1px 5px",fontSize:j.body,fontWeight:"600"}),p.appendChild(c),p.appendChild(u),p.addEventListener("click",()=>Xe(n,o)),w.appendChild(p)}const t=d.ownerDocument.createElement("div");t.style.height="12px",w.appendChild(t)}let Ce=null,Fe=null;function N(){if(w)if(Ce?.cancel(),Ce=null,z){const e=mt(M.map(n=>n?.hbinDefs)),t=mt(M.map(n=>n?.sbinDefs));Ce=Ps(Es(w,{lotSummary:z,items:M,hbinDefs:e.length?e:void 0,sbinDefs:t.length?t:void 0,testDefs:We(),ringCount:vt(),binColors:l.binColors,plotMode:l.plotMode??"hardBin",fallbackFormat:l.fallbackFormat,activeFindingId:se,warnings:m.warnings?.display??!0?re:[],findingsFilter:ko,findingsNotice:cn,onFindingsFilterChange:N,onSaveText:P.onSaveText,onFindingClick:(n,o)=>{se===n.id?He():Vo(n,o),N()},onWaferClick:Po,findingsFor:Fo,dieListOptions:m.dieList,onLocateDie:(n,o)=>le(o,n)}),{onDone:()=>{const n=Fe;Fe=null,n?.()}})}else jo()}function wn(e){const t=e.highlight;return t?.kind==="wafer"&&t.waferIndices?.length?t.waferIndices:null}let nt=[];function vn(){if(nt.length!==0){for(const e of nt)C[e]?.setOptions({plotMode:l.plotMode,activeTest:l.activeTest});nt=[]}}function He(){se=null,un(),fn(),vn(),I({highlightBin:void 0},{fireCallback:!1})}function Sn(){se!==null&&(He(),N())}function Vo(e,t){if(se===e.id){He();return}se=e.id,t.style.background=b.bgActive,t.style.fontWeight="600",vn();const{kind:n,index:o}=e.variable;if(n==="test"){const s=o??0,a=We();if(a===void 0||a.some(r=>r.testNumber===s))I({plotMode:"value",activeTest:s,highlightBin:void 0},{fireCallback:!1});else{I({highlightBin:void 0},{fireCallback:!1});const p=Oe.has(l.plotMode??"hardBin")?null:wn(e);if(p){for(const c of p)C[c]?.setOptions({plotMode:"value",activeTest:s});nt=[...p]}}}else I({plotMode:n==="softBin"?"softBin":"hardBin",highlightBin:bs(e)},{fireCallback:!1});un(),fn();const i=e.highlight;if(i.kind==="wafer"){dn(i.waferIndices);const s=go(e);for(const a of i.waferIndices){const f=i.dieKeysByWafer?void 0:B[a]?.statsSummary?.findings.find(p=>go(p)===s),r=i.dieKeysByWafer?.[a]??f?.highlight?.dieKeys;r?.length&&Mt(r,[a])}}else i.kind==="bin"?i.dieKeys?.length&&Mt(i.dieKeys):(i.kind==="region"||i.kind==="dies")&&i.dieKeys?.length&&Mt(i.dieKeys)}let ot=null;function Cn(){if(!ot)return;const e=w?w.style.display!=="none":!0,t=!!$&&$.style.display!=="none",n=!!(z?.hasNotableFindings||M.some(o=>o?.statsSummary?.hasNotableFindings));ot.sync(t&&!e,n)}function ge(){if(!$)return;const e=!!w;$.style.display=(z||St())&&e&&!ct?"flex":"none";const t=w?w.style.display!=="none":!1;(z?.hasNotableFindings||M.some(o=>o?.statsSummary?.hasNotableFindings))&&!t?$.style.color=b.findingIndicator:$.dataset.active||($.style.color=b.icon),Cn()}const G=d.ownerDocument.createElement("div");G.dataset.wmapToolbar="gallery",Object.assign(G.style,{flexShrink:"0",marginLeft:"auto",display:"inline-flex",flexDirection:"row",alignItems:"center",gap:"0",background:b.menuBg,border:`1px solid ${b.menuBorder}`,borderRadius:_.control,padding:"0",boxShadow:qt.panel,flexWrap:"wrap",minWidth:"0",overflowX:"auto"});const xn=()=>{const e=Ae();e&&(e.remove(),Ie(null)),Ze(ee,!1)},ee=ae("mode","Plot mode",()=>{if(Ae()){xn();return}const e=M.flatMap(v=>v?.dies??[]),t=We(),{testEntries:n,binEntries:o,stackedEntries:i}=ns(e,t,{includeStacked:!0}),s=M.filter(Boolean).length,a=v=>{if(v===void 0)return s;let L=0;for(const W of M)W?.dies?.some(F=>ho(F,v)!==void 0||Is(F,v)!==void 0)&&L++;return L},f=s<2?n:n.map(v=>{const L=a(v.activeTest);return L===s?v:{...v,label:`${v.label} \u2014 ${L} of ${s} wafers`}}),r=l.plotMode??"hardBin",p=l.activeTest??0;function c(v){return v.plotMode!==r?!1:v.plotMode==="value"?p===(v.activeTest??0):v.plotMode==="metadata"?l.activeMetadataKey===v.activeMetadataKey:!0}function u(v,L){v.activeTest!==void 0?I({plotMode:"value",activeTest:v.activeTest,activeMetadataKey:void 0,logScale:v.logScale}):v.activeMetadataKey!==void 0?I({plotMode:v.plotMode,activeTest:void 0,activeMetadataKey:v.activeMetadataKey,passFailDisplay:"off"}):I({plotMode:v.plotMode,activeTest:void 0,activeMetadataKey:void 0,passFailDisplay:"off"}),L.remove(),Ie(null),Ze(ee,!1)}const h=new Set,g=M.flatMap(v=>v?.metadataFields??[]).filter(v=>!h.has(v.key)&&h.add(v.key)).filter(v=>os(e,v.key)).map(is),S=ji(ee.getBoundingClientRect(),f,o,i,c,u,{makeMenuRow:Bo,makeMenuSection:Eo},r,ee.ownerDocument.defaultView??window,g);ao(ee).appendChild(S),Ie(S),Ze(ee,!0),lo(S,ee,xn)});Ze(ee,!1);const zo=()=>B.flatMap(e=>e?[...e.hbinDefs??[],...e.sbinDefs??[]]:[]).some(e=>e.color),{btn:No,sync:Mn}=_i(Se,()=>({...l,plotMode:l.plotMode??"hardBin"}),zo,e=>I(e));Mn();const Go=D.some(e=>typeof e!="function"&&(e.reticles?.length??0)>0);function it(){const e=We(),{testNumber:t}=Si(l.activeTest??0,e);return{testNumber:t,td:Ci(e,t)}}function kn(){if((l.plotMode??"hardBin")!=="value")return!1;const{td:e}=it();return e!==void 0&&(e.limitLow!==void 0||e.limitHigh!==void 0)}function je(){if((l.plotMode??"hardBin")!=="value")return!1;const{td:e}=it();return e!==void 0&&!Zt(e)}function Ko(){if((l.plotMode??"hardBin")!=="value")return!1;const{testNumber:e,td:t}=it();return M.some(n=>n?.dies?.some(o=>ho(o,e,t)!==void 0))}function _o(e,t){if(!t||!Zt(t))return;const n=t.limitLow!==void 0||t.limitHigh!==void 0;if((ro(l)==="spec"&&n?"spec":l.colorbarRangeMode??"spec")==="spec"&&n)return;let s=1/0,a=-1/0;for(const f of M)if(f)for(const r of f.dies){const p=vs(r,e);p!==void 0&&(p<s&&(s=p),p>a&&(a=p))}if(isFinite(s))return s===a?[s,s+1]:[s,a]}function st(e,t,n){const o=l[e];if(o===t||o!=null&&t!=null&&n(o,t))return!1;l={...l,[e]:t};for(const i of C)i&&i.setOptions({[e]:t});return!0}function Dn(){if((l.plotMode??"hardBin")!=="metadata")return;const e=l.activeMetadataKey;if(!e)return;const t=new Set;for(const n of M)if(n)for(const o of xi(n.dies,e))t.add(o);return{key:e,values:[...t].sort(Jt)}}function Dt(){st("metadataValueOrder",Dn(),(e,t)=>e.key===t.key&&yt(e.values,t.values))}function Bt(){if((l.plotMode??"hardBin")!=="value")return;const{testNumber:e,td:t}=it(),n=_o(e,t);st("valueRange",n?{test:e,range:n}:void 0,(i,s)=>{const a=p=>Array.isArray(p)?{test:void 0,range:p}:{test:p.test,range:p.range},f=a(i),r=a(s);return f.test===r.test&&yt(f.range,r.range)})}let Et=!1;function qo(){if(Et)return;Et=!0,(d.ownerDocument.defaultView?.requestAnimationFrame??(t=>setTimeout(()=>t(0),0)))(()=>{Et=!1,Bt(),Dt(),Tn(),On()})}let Ot=!1;function Xo(){if(Ot)return;Ot=!0,(d.ownerDocument.defaultView?.requestAnimationFrame??(t=>setTimeout(()=>t(0),0)))(()=>{Ot=!1,ft()})}let Bn=[];function xe(){const{colors:e,mixedHardBins:t}=ki(M.filter(n=>n!=null),{binColorScheme:l.binColorScheme,useDefinedBinColors:l.useDefinedBinColors});return Bn=t,e}function Tt(){return B.filter(e=>e!=null).flatMap(e=>e.dies)}function En(){return l.compact?Ms(Tt()):void 0}const Uo=(e,t)=>yt(e.columns,t.columns)&&yt(e.rows,t.rows);function On(){st("compactMap",En(),Uo)&&Nn()}function Yo(){return ks(Tt(),B.filter(e=>e!=null).map(e=>e.reticleConfig))}function Tn(){st("binColors",xe(),Ei),ze()}const Zo=Ui(Se,()=>Qi(l,Go,{functionalActive:je(),hasLimits:kn()&&!je(),hasRecorded:Ko()&&!je(),binMode:(l.plotMode??"hardBin")==="hardBin"||(l.plotMode??"hardBin")==="softBin"},e=>I(e),{on:!!l.compact,offered:Yo(),onChange:e=>I({compact:e}),onDiagnostics:()=>es(Tt(),B.filter(e=>e!=null).map(e=>e.reticleConfig),{anchor:d,onSaveText:P.onSaveText})}),()=>Ji(l)),{btn:Qo,sync:Ln}=Xi(Se,()=>({plotMode:l.plotMode,legendPosition:Te}),e=>{Te=e;for(const t of C)t&&t.setOptions({legendPosition:Te})},{get:()=>Qe,set:e=>{Qe=e,on()},blockedReason:Le});Ln();const Jo=[{value:"mean",label:"Mean"},{value:"median",label:"Median"},{value:"stddev",label:"Std Dev"},{value:"min",label:"Min"},{value:"max",label:"Max"},{value:"count",label:"Count"}],Wn=ln("aggr","Aggregation method",()=>Jo,()=>l.aggregationMethod??"mean",e=>I({aggregationMethod:e}));function Rn(){const e=l.plotMode==="stackedValues";Wn.style.display=e?"":"none"}Rn();const{btn:ei,sync:$n}=qi(Se,()=>({...l,functionalActive:je()}),e=>I(e));$n();const at=ae("specRange","Colorbar range: test limits",()=>{const e=l.colorbarRangeMode==="data"?"spec":"data";I({colorbarRangeMode:e})});function An(){const e=(l.plotMode??"hardBin")==="value"&&kn()&&ro(l)==="off"&&!je();at.style.display=e?"":"none";const t=(l.colorbarRangeMode??"spec")==="spec";$e(at,t),at.ariaLabel=t?"Colorbar range: test limits (click for data range)":"Colorbar range: data range (click for test limits)"}An();const ti=Yi(Se,()=>l,e=>I(e)),ni=ae("downloadAll","Download gallery PNG",gi),Me=ae("boxSelect","Select the same dies on every wafer",()=>{J&&me.size>0?mn():Ro(!J)});Me.style.position="relative";const Ve=d.ownerDocument.createElement("span");Ve.dataset.wmapSelectAcrossCount="1",Object.assign(Ve.style,{position:"absolute",top:"0",right:"0",minWidth:"14px",height:"14px",boxSizing:"border-box",padding:"0 3px",borderRadius:_.pill,background:b.iconActive,color:b.menuBg,fontSize:"11px",lineHeight:"14px",fontWeight:"700",textAlign:"center",pointerEvents:"none",display:"none"}),Me.appendChild(Ve);function lt(){$e(Me,J);const e=J?me.size:0;Ve.style.display=e>0?"block":"none",Ve.textContent=e>99?"99+":String(e),Me.ariaLabel=J?e>0?`Select the same dies on every wafer: on, ${e.toLocaleString()} die position${e===1?"":"s"} selected (click to clear the selection)`:"Select the same dies on every wafer: on (click to turn off)":"Select the same dies on every wafer: off (click to turn on)",Me.setAttribute("aria-pressed",String(J))}const Y=d.ownerDocument.createElement("button");Y.type="button",Y.dataset.wmapPickedWafers="1",Object.assign(Y.style,{display:"none",border:"none",background:b.bgActive,color:b.iconActive,borderRadius:_.control,padding:`${k.xs} ${k.md}`,fontSize:j.body,cursor:"pointer",whiteSpace:"nowrap",flexShrink:"0"}),Xt(Y,"bare"),Y.addEventListener("click",Ao);const oi=ln("columns","Columns",()=>[{value:"auto",label:"Auto"},{value:"1",label:"1 column"},{value:"2",label:"2 columns"},{value:"3",label:"3 columns"},{value:"4",label:"4 columns"},{value:"5",label:"5 columns"}],()=>O!=null?String(O):"auto",e=>Kn(e==="auto"?void 0:Number(e))),T=d.ownerDocument.createElement("div");Object.assign(T.style,{display:"inline-flex",alignItems:"center",gap:"0"}),G.appendChild(T),T.appendChild(ee),T.appendChild(No),T.appendChild(Wn),T.appendChild(ei),T.appendChild(at),T.appendChild(Q()),T.appendChild(Zo),T.appendChild(Q()),T.appendChild(Qo),T.appendChild(Q()),T.appendChild(ti),T.appendChild(Q()),T.appendChild(oi),T.appendChild(Q()),T.appendChild(Me),T.appendChild(Y),T.appendChild(ni),lt(),(z||St())&&($=ae("findings","Summary panel",()=>{if(!w)return;const e=w.style.display!=="none";e||N(),w.style.display=e?"none":"flex",$e($,!e),ge()}),G.appendChild(Q()),G.appendChild($));let Z=null,rt=null,re=[],In=!1;function ze(){const e=Ss({lotStatsSummary:z,result:{warnings:[...M.flatMap(n=>n?.warnings??[]),...ve().warnings]},extra:[l.binColors&&Di(l.binColors,l.plotMode),Bi(Bn),xo(nn())].filter(n=>!!n)}),t=e.length!==re.length||e.some((n,o)=>n.code!==re[o]?.code||n.message!==re[o]?.message);re=e,(t||!In)&&(In=!0,m.warnings?.onWarning?.(e)),ii()}function ii(){if(!Z||!rt)return;const e=re.length,t=e>0;if(Z.style.display=t?"flex":"none",rt.style.display=t?"":"none",!t)return;const n=xs(re[0]),o=`${e} data ${e===1?"warning":"warnings"}`;Z.style.color=n==="error"?b.errText:b.warnText,Z.ariaLabel=n==="error"?`${o} \u2014 some wafers may be positionally wrong`:o}(m.warnings?.display??!0)&&(rt=Q(),Z=ae("warning","Data warnings",()=>{const e=Ae();if(et(new MouseEvent("click")),e)return;const t=Cs(Z.getBoundingClientRect(),re,Z.ownerDocument.defaultView??window);ao(d).appendChild(t),Ie(t),lo(t,Z,()=>et(new MouseEvent("click")))}),Ze(Z,!1),G.appendChild(rt),G.appendChild(Z)),ze();function Pn(){import("./userGuideHtml.js").then(e=>as({buildWaferMap:ws,renderWaferMap:fs,renderWaferGallery,analyzeWaferMap:ht},e.USER_GUIDE_HTML,E,d))}x&&(G.appendChild(Q()),G.appendChild(ae("help","User guide",()=>Pn())));const ke=d.ownerDocument.createElement("div");ke.dataset.wmapGalleryMeta="1",Object.assign(ke.style,{flex:"1",minWidth:"0",overflow:"hidden",display:"flex",alignItems:"center",padding:`${k.sm} ${k.lg}`,fontSize:j.sub,lineHeight:no.none,boxSizing:"border-box"});const Ne=d.ownerDocument.createElement("div");Object.assign(Ne.style,{background:b.canvasBg,display:"flex",alignItems:"stretch",gap:k.lg,paddingBottom:k.lg,minWidth:"0"});const ce=d.ownerDocument.createElement("div");ce.dataset.wmapGalleryLegend="1",Object.assign(ce.style,{display:"flex",flexDirection:"column",gap:k.sm,background:b.menuBg,border:`1px solid ${b.menuBorder}`,borderRadius:_.container,padding:`${k.sm} ${k.lg}`,marginBottom:k.lg,boxShadow:qt.panel,fontSize:j.body,lineHeight:no.none,boxSizing:"border-box",width:"100%",minWidth:"0"});const X=d.ownerDocument.createElement("div");Object.assign(X.style,{display:"flex",flexDirection:"row",alignItems:"flex-start"});let De=null,Ge=null,Fn=null;function si(){return V?De?Promise.resolve(De):(Fn??=import("./insightsTab.js").then(({createInsightsTab:e})=>(De=e({getItems:()=>M,getLotStats:()=>z,getBinColors:()=>l.binColors??xe(),getRingCount:()=>ne({ringCount:vt()},"the Insights tab"),defaultView:m.insights?.defaultView,plotStore:R,onPickPlotsFile:m.insights?.onPickPlotsFile,onOpenGuide:void 0,showMetadataStrip:!1,onSaveImage:P.onSaveImage,onSaveText:P.onSaveText,ownerDocument:d.ownerDocument,locateDie:(t,n)=>{Wt(!1),le(n,t)},openWafer:(t,n,o)=>{const i=M[t];if(!i)return;let s=null;const a=Ni({title:n,onClose:()=>s?.destroy(),anchor:d});Xn(a,n,i.wafer.metadata??void 0),s=Vt(a.contentWrap,i,o,void 0,co(a))}}),Ge=De.el,Ge.style.display="none",d.appendChild(Ge),De)),Fn):Promise.resolve(null)}let ct=!1,Lt=null;function Wt(e){V&&(ct=e,Lt?.setInsightsOpen(e),Ge&&(Ge.style.display=e?"flex":"none"),X.style.display=e?"none":"flex",T.style.display=e?"none":"inline-flex",G.style.display="inline-flex",ge(),ft(),e&&si().then(t=>{!t||!ct||(t.el.style.display="flex",t.render())}))}V&&m.insights?.defaultOpen&&queueMicrotask(()=>Wt(!0));const Hn=4,dt=240,Rt=480,ai=720,li=1.25;let he=Rt;function jn(e){const t=H*2+110+2,n=Vn();if(n)return Math.ceil(n.across*Hn+t);let o=null;for(const i of e){if(i==null||!i.dies?.length)continue;const s=i.dies[0].width;if(!(s>0))continue;const a=i.wafer.radius*2*(Hn/s),f=Math.ceil(a+t);(o==null||f>o)&&(o=f)}return o}function ri(e){const t=jn(e);return t==null?dt:Math.min(he,Math.max(dt,t))}function ci(e){const t=jn(e);if(t==null)return!1;const n=Math.min(ai,Math.max(Rt,t));return n<=he?!1:(he=n,!0)}function Vn(){const e=l.compact?l.compactMap:void 0,t=B.find(i=>i?.dies?.length)?.dies[0];if(!e||!t||e.columns.length===0||e.rows.length===0||!(t.width>0)||!(t.height>0))return;const n=(l.rotation??0)%180!==0,o=l.showXYIndicator?2.5:0;return{across:(n?e.rows.length:e.columns.length)+o,down:(n?e.columns.length:e.rows.length)+o,cellAspect:n?t.height/t.width:t.width/t.height}}function zn(e,t){const n=Vn();if(!n){e.style.aspectRatio="1",t.style.flex="1",t.style.width="",t.style.aspectRatio="";return}e.style.aspectRatio="auto",t.style.flex="none",t.style.width="100%",t.style.aspectRatio=String(n.across*n.cellAspect/n.down)}function di(){for(const e of ie)e?.parentElement&&zn(e.parentElement,e)}function Nn(){he=Rt,Ke=dt,It(B.map(e=>e??null)),At(),di()}function $t(){return O!=null?"none":`${he}px`}function At(){const e=$t();for(const t of Array.from(A.children))t.classList.contains("wmap-gallery-card")&&(t.style.maxWidth=e,t.style.maxHeight=e)}let Ke=dt,Gn=0;function It(e){if(ci(e)&&At(),O==null){const n=ri(e);n>Ke&&(Ke=n)}Ft()}function Kn(e){O=wo(e),At(),Ft()}function Pt(e){return`repeat(${e}, minmax(0, ${O!=null?"1fr":`${he}px`}))`}function _n(e){A.style.gridTemplateColumns!==e&&(A.style.gridTemplateColumns=e)}function Ft(){if(O!=null){_n(Pt(O));return}const e=Math.max(1,Gn),t=12,n=A.clientWidth||0,o=s=>(n-t*(s-1))/s;let i=Math.max(1,Math.ceil(Math.sqrt(e)));if(n>0){const s=Math.min(he,Ke*li),a=f=>{let r=0;for(;r<e&&o(r+1)>=f;)r++;return r};i=a(s)||a(Ke)||1}_n(Pt(i))}const A=d.ownerDocument.createElement("div");if(Object.assign(A.style,{flex:"1 1 0",minWidth:"0",display:"grid",gridTemplateColumns:Pt(1),gap:k.xl,paddingLeft:fe,paddingRight:fe,justifyContent:"start",alignContent:"start",isolation:"isolate"}),be?.placement){const e=be.placement;w=en(e,fe,d.ownerDocument,xt),w.style.maxHeight="calc(100vh - 80px)",w.style.position="sticky",w.style.top="8px",w.style.display="flex",w.style.flexDirection="column"}else if(z||St()){const e=!!be?.defaultOpen;w=en("right",fe,d.ownerDocument,xt),w.style.maxHeight="calc(100vh - 80px)",w.style.position="sticky",w.style.top="8px",w.style.flexDirection="column",w.style.display=e?"flex":"none",N()}ge(),w?.style.display!=="none"&&$&&$e($,!0);const ut=be?.placement??"right";ut==="left"?(w&&X.appendChild(w),X.appendChild(A)):(X.appendChild(A),w&&X.appendChild(w)),(ut==="left"||ut==="right")&&(ot=wi(d.ownerDocument,ut,()=>$?.click()),X.appendChild(ot.el),Cn());const _e=d.ownerDocument.createElement("div");Object.assign(_e.style,{position:"sticky",top:"0",display:"flex",flexDirection:"column",paddingLeft:fe,paddingRight:fe,paddingTop:fe,zIndex:"1",background:b.menuBg}),Ne.appendChild(ke),Ne.appendChild(G),V&&(Lt=bi(d.ownerDocument,"Maps","lot",e=>Wt(e)),Ne.appendChild(Lt.el)),_e.appendChild(Ne),_e.appendChild(ce),d.appendChild(_e),d.appendChild(X);function ft(){ce.innerHTML="";const e=l.plotMode??"hardBin",t=!ct&&io.has(e),n=B.filter(y=>y!=null),o=n.find(y=>y.isLotStack),i=Ds(n.map(y=>({metadata:y.wafer.metadata??void 0})),o?{lotSize:o.lotSize??n.length,aggrMethod:o.aggrMethod}:void 0),s=e==="metadata",a=l.activeMetadataKey,f=t&&!s?vo(n,y=>(e==="softBin"?y.sbin:y.hbin)??void 0,pe):{counts:new Map,total:0,pass:0},r=t&&!s?l.binColors??xe():void 0,p=r?e==="softBin"?r.pass.soft:r.pass.hard:new Set,c=cs(f.counts.entries(),p).map(([y])=>y),u=t&&s&&a?vo(n,y=>Mi(y.metadata?.[a])):{counts:new Map,total:0,pass:0},h=s?Dn()?.values:void 0,g=t&&s?(h??[...u.counts.keys()].sort(Jt)).filter(y=>u.counts.has(y)):[];if(ke.innerHTML="",i&&ke.appendChild(i),ke.style.display=i?"flex":"none",!c.length&&!g.length){ce.style.display="none";return}ce.style.display="flex";const S=d.ownerDocument.createElement("div");Object.assign(S.style,{display:"flex",flexWrap:"wrap",alignItems:"center",gap:`${k.sm} ${k.xl}`,maxHeight:"86px",overflowY:"auto",overflowX:"hidden"}),ce.appendChild(S);const v=Qt(l.highlightBin),L=B.flatMap(y=>y?.metadataFields??[]).find(y=>y.key===a),W=s?L?.label??(a?Ts(a):"Metadata"):Ii[e],F=d.ownerDocument.createElement("span");if(F.textContent=W,Object.assign(F.style,{fontSize:j.body,fontWeight:"700",letterSpacing:Ri,textTransform:"uppercase",color:b.label,flexShrink:"0"}),S.appendChild(F),!s&&f.total>0){const y=f.pass,K=y/f.total*100,de=d.ownerDocument.createElement("span");de.textContent=`Yield ${wt(K)}`,Object.assign(de.style,{fontSize:j.body,fontWeight:"700",color:b.value,whiteSpace:"nowrap",flexShrink:"0"});const ue=d.ownerDocument.createElement("span");ue.textContent=`${y.toLocaleString()} / ${f.total.toLocaleString()} dies`,Object.assign(ue.style,{fontSize:j.body,color:b.label,whiteSpace:"nowrap",flexShrink:"0"}),S.appendChild(de),S.appendChild(ue)}if(s){const y=Qt(l.highlightMetadataValue);g.forEach((K,de)=>{const ue=y.includes(K),Ee=L?.values?.find(Kt=>Kt.value===K),Ye=Ee?.color??Li(de),eo=u.counts.get(K)??0;So(S,{color:Ye,isActive:ue,label:Ee?.label??K,count:eo,percent:u.total>0?eo/u.total*100:void 0,onClick:Kt=>{const yi=yo(l.highlightMetadataValue,K,Kt);Sn(),I({highlightMetadataValue:yi})}})});return}const Ue=e==="softBin"?B.flatMap(y=>y?.sbinDefs??[]):B.flatMap(y=>y?.hbinDefs??[]),Zn=new Set,Nt=[];for(const y of Ue)Zn.has(y.bin)||(Zn.add(y.bin),Nt.push(y));const Gt=Nt.length>0?new Map(Nt.map(y=>[y.bin,y])):null,Qn=r??l.binColors??xe(),hi=e==="softBin"?Qn.soft:Qn.hard,Jn=y=>hi.get(y)??Ti;for(const y of c){const K=v.includes(y),de=Gt?.get(y),ue=f.counts.get(y)??0;So(S,{color:Jn(y),isActive:K,label:de?.name?`${y} \xB7 ${de.name}`:`Bin ${y}`,count:ue,percent:f.total>0?ue/f.total*100:void 0,onMenu:(Ee,Ye)=>Lo(e==="softBin"?"soft":"hard",y,Ee,Ye),onClick:Ee=>{const Ye=yo(l.highlightBin,y,Ee);Sn(),I({highlightBin:Ye})}})}f.total>0&&c.length>1&&ce.appendChild(Fs(d.ownerDocument,[...f.counts.entries()].sort(([,y],[,K])=>K-y).map(([y,K])=>({color:Jn(y),count:K,label:Gt?.get(y)?.name?`${y} \xB7 ${Gt.get(y).name}`:`Bin ${y}`})),f.total))}function qe(e){const t=M.filter(c=>c!==null);if(!t.length)return[];const n=t.map(c=>c.dies.filter(As)),o=t[0].wafer,i=t.length,s=Oi(t.map(c=>to(c)));if(!s)return[];const a=new Set(t.map(c=>ne(c,"renderWaferGallery")));if(a.size!==1)return[];const f=[...a][0],r=o.metadata?{...o,metadata:(({wafer:c,waferId:u,...h})=>h)(o.metadata)}:o;function p(c,u){return{...c,stats:{...c.stats,isLotStack:!0,aggregationMethod:u,lotSize:i}}}if(e==="stackedValues"){const c=We();let u=c?.filter(Zt);if(c!==void 0&&u?.length===0)return[];if(c?.length||(u=vi(t.flatMap(S=>S.dies)).map(S=>({testNumber:S,name:Ls(void 0,S)}))),!u?.length)return[];const h=l.aggregationMethod??"mean";return u.map(g=>{const S=us(n,h,g.testNumber),v={testNumber:0,name:g.name,unit:g.unit,...Rs(g)};return{wafer:r,dies:S,passBins:[...s],ringCount:f,testDefs:[v],label:`${Ws(g,g.testNumber)} \xB7 ${h}`,isLotStack:!0,aggrMethod:h,lotSize:i,statsSummary:p(ht({wafer:r,dies:S,passBins:[...s],ringCount:f,testDefs:[v]},{testNumbers:[0]}),h)}})}if(e==="stackedBins"){let c=mt(t.map(u=>u?.hbinDefs));return(!c||c.length===0)&&(c=[...new Set(t.flatMap(h=>h.dies.map(g=>g.hbin).filter(g=>g!=null)))].sort((h,g)=>h-g).map(h=>({bin:h,name:`Bin ${h}`}))),c.map(u=>{const h=uo(n,u.bin,"hard"),g=[{bin:u.bin,name:u.name}];return{wafer:r,dies:h,passBins:[...s],ringCount:f,hbinDefs:g,label:`${u.bin} \xB7 ${u.name}`,isLotStack:!0,aggrMethod:"countBin",lotSize:i,statsSummary:p(ht({wafer:r,dies:h,passBins:[...s],ringCount:f,hbinDefs:g}),"countBin")}})}if(e==="stackedSoftBins"){let c=mt(t.map(u=>u?.sbinDefs));return(!c||c.length===0)&&(c=[...new Set(t.flatMap(h=>h.dies.map(g=>g.sbin).filter(g=>g!=null)))].sort((h,g)=>h-g).map(h=>({bin:h,name:`Bin ${h}`}))),c.map(u=>{const h=uo(n,u.bin,"soft"),g=[{bin:u.bin,name:u.name}];return{wafer:r,dies:h,passBins:[...s],ringCount:f,sbinDefs:g,label:`${u.bin} \xB7 ${u.name}`,isLotStack:!0,aggrMethod:"countBin",lotSize:i,statsSummary:p(ht({wafer:r,dies:h,passBins:[...s],ringCount:f,sbinDefs:g}),"countBin")}})}return t}function Ht(e){const t=M.length;return e==="stackedBins"||e==="stackedSoftBins"?{valueRange:[0,t],lotSize:t}:e==="stackedValues"?{aggregationMethod:l.aggregationMethod??"mean",valueRange:void 0,lotSize:void 0}:{}}function I(e,{fireCallback:t=!0}={}){const n=Object.keys(e),o=l.plotMode,i=Le()!==null;l={...l,...e};const s=l.plotMode,a=Oe.has(s),f=o!==void 0&&Oe.has(o),r=Je>0;if("binColorScheme"in e||"useDefinedBinColors"in e){const c=xe();l={...l,binColors:c},e={...e,binColors:c}}if("compact"in e){const c=En();l={...l,compactMap:c},e={...e,compactMap:c}}if(("compact"in e||l.compact&&("rotation"in e||"showXYIndicator"in e))&&Nn(),e.plotMode!==void 0)if(a){const c=Ht(s);if(l={...l,...c},r)for(const u of C)u&&u.setOptions(e);else te(qe(s))}else if(f){const{valueRange:c,lotSize:u,aggregationMethod:h,...g}=l;if(l=g,r)for(const S of C)S&&S.setOptions(e);else te(M.filter(S=>S!==null))}else for(const c of C)c&&c.setOptions(e);else if(e.aggregationMethod!==void 0&&s==="stackedValues")if(r)for(const c of C)c&&c.setOptions(e);else te(qe("stackedValues"));else for(const c of C)c&&c.setOptions(e);Le()!==null!==i&&on(),ft(),Rn(),Ln(),Mn();const p=e.plotMode!==void 0&&e.plotMode!==o;(ys.some(c=>c in e)||p)&&N(),ze(),$n(),An(),Bt(),Dt(),t&&m.onViewOptionsChange?.(po(l),n,hs(n))}function qn(e,t,n){const o=e.createElement("div");Object.assign(o.style,{display:"flex",alignItems:"center",gap:k.xs,flex:"1",minWidth:"0"});const i=e.createElement("span");i.textContent=t,Object.assign(i.style,{fontWeight:"700",fontSize:j.sub,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}),o.appendChild(i);const s=bo(e,o,t,n);return{wrap:o,metaPanel:s}}function Xn(e,t,n){const o=e.box.querySelector("[data-wmap-window-title]");if(!o||Bs(n??{}).length===0)return;const i=o.parentElement,s=d.ownerDocument.createElement("div");Object.assign(s.style,{display:"flex",alignItems:"center",gap:k.xs,flex:"1",minWidth:"0"}),i?.insertBefore(s,o),s.appendChild(o);const a=bo(d.ownerDocument,s,t,n);a&&(e.contentWrap.style.position="relative",e.contentWrap.appendChild(a))}function jt(e,t,n){const o=d.ownerDocument.createElement("div");o.className="wmap-gallery-card",Object.assign(o.style,{background:b.menuBg,border:`1px solid ${b.menuBorder}`,borderRadius:_.container,boxShadow:qt.panel,overflow:"hidden",display:"flex",flexDirection:"column",position:"relative",aspectRatio:"1",maxWidth:$t(),maxHeight:$t()});const i=d.ownerDocument.createElement("div");Object.assign(i.style,{display:"flex",alignItems:"center",padding:`${k.md} ${k.lg} ${k.sm}`,borderBottom:`1px solid ${b.menuBorder}`,flexShrink:"0",gap:k.sm});const{wrap:s,metaPanel:a}=qn(document,gt(e,t),e.wafer.metadata??void 0);i.appendChild(s);const f=d.ownerDocument.createElement("button");f.dataset.wmapExpandBtn="1",f.setAttribute("aria-label","Open full view"),Ut(f),f.innerHTML=_t.expand,Object.assign(f.style,{display:"flex",alignItems:"center",justifyContent:"center",border:`1px solid ${b.menuBorder}`,borderRadius:_.control,background:b.panelBg,color:b.label,padding:k.xxs,cursor:"pointer",flexShrink:"0",width:"22px",height:"22px"}),Xt(f),i.appendChild(f),i.addEventListener("click",h=>{(h.ctrlKey||h.metaKey)&&(h.preventDefault(),h.stopPropagation(),$o(B.indexOf(e)))},!0),o.appendChild(i);const r=d.ownerDocument.createElement("div");Object.assign(r.style,{position:"relative",flex:"1",minHeight:"0",overflow:"hidden",display:"flex",flexDirection:"column"}),o.appendChild(r),zn(o,r),a&&r.appendChild(a),A.appendChild(o),o.addEventListener("contextmenu",h=>{if(h.defaultPrevented)return;h.preventDefault();const g=e.viewOptions?{...l,...e.viewOptions}:l,S=Ct()??bn(t),v=S?.source??ps(e.dies,{waferLabel:ye(e),testDefs:e.testDefs,isLotStack:e.isLotStack,activeTest:g.plotMode==="value"?g.activeTest:void 0,waferIndex:t,wafer:e.wafer,passBins:pe(e),ringCount:ne(e,"renderWaferGallery")}),L={x:h.clientX,y:h.clientY};import("./drilldown.js").then(({openDrilldownMenu:W})=>{o.isConnected&&W(L,o,v,S?{plots:R,...S.ctx}:{plots:R,onSaveImage:u.getSaveImageHook(),onSaveText:u.getSaveTextHook(),onLocateDie:F=>le(t,F)})})});const p=Qe||Le()!==null,c=e.viewOptions?{...l,...e.viewOptions}:l,u=fo(r,e,{viewOptions:{...c,showLegend:p,legendPosition:Te},showTooltip:!0,padding:H,statsSummary:e.statsSummary,onSaveImage:m.onSaveImage,onSaveText:m.onSaveText,downloadFilename:m.downloadFilename,onClick:e.onClick,onSelect:pn(e),drilldownSourceOverride:()=>To(t),insights:oe,onExpand:()=>Xe(t,e),showIdentity:!1,chromeInset:Ai,drawWhenVisible:!0});return u.setViewControlsVisible(!1),u.setSummaryVisible(!1),f.onclick=()=>Xe(t,e),{card:o,ctrl:u,canvasWrapper:r,expandBtn:f}}function ui(e){const t=we[e];if(!t)return;const n=[...U.values()].find(o=>o.cardIndex===e);n?(t.innerHTML=_t.minimize,t.setAttribute("aria-label","Reattach to gallery"),t.onclick=()=>pi(n.id)):(t.innerHTML=_t.expand,t.setAttribute("aria-label","Open full view"),t.onclick=()=>Xe(e,B[e]))}function te(e){mi(),Ae()?.remove(),Ie(null),He(),B=[],q.clear(),kt.clear(),Y.style.display="none";for(const r of C)r&&r.destroy();C=[],ie=[],we=[],Je=0,A.innerHTML="",Gn=e.length,It(e.map(r=>typeof r=="function"?null:r));const t=[];for(let r=0;r<e.length;r++){const p=e[r];if(typeof p=="function"){const c=d.ownerDocument.createElement("div");c.className="wmap-gallery-card",Object.assign(c.style,{background:b.menuBg,border:`1px solid ${b.menuBorder}`,borderRadius:_.container,aspectRatio:"1",display:"flex",alignItems:"center",justifyContent:"center"});const u=d.ownerDocument.createElement("span");u.textContent="\u2026",Object.assign(u.style,{color:b.label,fontSize:"18px"}),c.appendChild(u),A.appendChild(c),B.push(null),C.push(null),ie.push(null),we.push(null),t.push({index:r,factory:p,placeholder:c}),Je++}else{const{ctrl:c,canvasWrapper:u,expandBtn:h}=jt(p,r,e.length);B.push(p),C.push(c),ie.push(u),we.push(h)}}Tn(),ft(),Bt(),Dt(),On();const n=++Re,o=()=>{setTimeout(()=>{n===Re&&m.onItemsResolved?.()},0)},i=r=>{setTimeout(()=>{n===Re&&m.onItemResolved?.(r,e.length)},0)};let s=e.length-t.length;s>0&&i(s);let a=0;function f(){if(n!==Re)return;if(a>=t.length){if(Oe.has(l.plotMode)){const L=l.plotMode;te(qe(L));return}Fe=o,N(),Ce||(Fe=null,o());return}const{index:r,factory:p,placeholder:c}=t[a++],u=p();B[r]=u,M[r]=u,It([u]);const{card:h,ctrl:g,canvasWrapper:S,expandBtn:v}=jt(u,r,e.length);C[r]=g,ie[r]=S,we[r]=v,Je--,c.replaceWith(h),i(++s),Xo(),qo(),!w&&!be?.placement&&u.statsSummary?.findings.length&&(w=en("right",fe,d.ownerDocument,xt),w.style.maxHeight="calc(100vh - 80px)",w.style.position="sticky",w.style.top="8px",w.style.flexDirection="column",w.style.display="none",(be?.placement??"right")==="left"?X.insertBefore(w,A):X.appendChild(w),N(),$||($=ae("findings","Summary panel",()=>{if(!w)return;const W=w.style.display!=="none";W||N(),w.style.display=W?"none":"flex",$e($,!W),ge()}),G.appendChild(Q()),G.appendChild($)),ge()),ge(),setTimeout(f,0)}t.length>0?setTimeout(f,0):o()}if(Oe.has(l.plotMode)&&M.length>0){const e=Ht(l.plotMode);l={...l,...e},te(qe(l.plotMode))}else te(D);ze();let Be=0;const Un=new(d.ownerDocument.defaultView??window).ResizeObserver(()=>{if(Be)return;Be=(d.ownerDocument.defaultView??window).requestAnimationFrame(()=>{Be=0,O==null&&Ft()})});Un.observe(A),w&&N();function fi(e,t){const n=ie[e];if(!n)return;n.innerHTML="",Object.assign(n.style,{alignItems:"center",justifyContent:"center"});const o=d.ownerDocument.createElement("span");o.textContent=t?"Opened in its own window":"Opened in the wafer viewer",Object.assign(o.style,{color:b.label,fontSize:j.body,textAlign:"center",padding:"0 12px"}),n.appendChild(o)}function Xe(e,t){for(const a of U.values())if(a.cardIndex===e)return;const n=gt(t,e),o=Mo++,i=C[e]?.getOptions(),s=Vi(n);if(s){const a=s.document;a.title=n,Object.assign(a.documentElement.style,{height:"100%"}),Object.assign(a.body.style,{margin:"0",height:"100vh",overflow:"hidden",display:"flex",flexDirection:"column",fontFamily:j.family}),Gi(d,a.documentElement);const f=Ki(d,a.documentElement,()=>v.setOptions({})),r=a.createElement("div");r.dataset.wmapWindowBanner="1",r.textContent=n,Object.assign(r.style,{display:"none",padding:`${k.sm} ${k.xl}`,fontSize:j.body,fontWeight:"700",background:b.warnBg,color:b.warnText,borderBottom:`1px solid ${b.warnBorder}`,flexShrink:"0"}),a.body.appendChild(r);const p=a.createElement("div");Object.assign(p.style,{flex:"1",minHeight:"0",display:"flex",flexDirection:"column"}),a.body.appendChild(p);const{wrap:c,metaPanel:u}=qn(a,n,t.wafer.metadata??void 0),h=a.createElement("div");Object.assign(h.style,{display:"flex",alignItems:"center",padding:`${k.md} ${k.lg} ${k.sm}`,borderBottom:`1px solid ${b.menuBorder}`,flexShrink:"0",gap:k.sm}),h.appendChild(c),p.appendChild(h);const g=a.createElement("div");Object.assign(g.style,{position:"relative",flex:"1",minHeight:"0",overflow:"hidden",display:"flex",flexDirection:"column"}),u&&g.appendChild(u),p.appendChild(g);let S=0;const v=Vt(g,t,void 0,i,(W,F)=>{const Ue=W?F:-S;try{s.resizeBy(Ue,0),S=W?F:0}catch{}}),L=setInterval(()=>{s.closed&&pt(o)},400);s.addEventListener("pagehide",()=>pt(o)),U.set(o,{id:o,ctrl:v,cardIndex:e,label:n,closePollId:L,stopThemeSync:f,close:()=>{s.closed||s.close()},setTitle:W=>{a.title=W,r.textContent=W,r.style.display="block"}})}else{const a=zi({title:n,onClose:()=>pt(o),anchor:d});a.contentWrap.style.flexDirection="column",Xn(a,n,t.wafer.metadata??void 0);const f=Vt(a.contentWrap,t,void 0,i,co(a));U.set(o,{id:o,ctrl:f,cardIndex:e,label:n,closePollId:null,close:()=>a.close(),setTitle:r=>{const p=a.box.querySelector("[data-wmap-window-title]");p&&(p.textContent=r,p.title=r)}})}C[e]?.destroy(),C[e]=null,fi(e,s!==null),ui(e)}function Vt(e,t,n,o,i){const s=t.viewOptions?{...l,...t.viewOptions}:l,a=o?{...s,...o}:s,r={...n!==void 0?{...a,plotMode:"value",activeTest:n}:a,showLegend:!0,legendPosition:Te},p=fo(e,t,{viewOptions:r,showTooltip:!0,padding:H,statsSummary:t.statsSummary,onSaveImage:m.onSaveImage,onSaveText:m.onSaveText,downloadFilename:m.downloadFilename,onClick:t.onClick,onSelect:pn(t),insights:oe,showExpandButton:!1,onSummaryPanelChange:i,showIdentity:!1});return p.setViewControlsVisible(!0),p.setSummaryVisible(!0),p.setExpandVisible(!1),p}function pt(e){const t=U.get(e);if(!t||(U.delete(e),t.closePollId!=null&&clearInterval(t.closePollId),t.stopThemeSync?.(),t.ctrl.destroy(),t.cardIndex===null))return;const n=t.cardIndex,o=B[n];if(!o)return;const{card:i,ctrl:s,canvasWrapper:a,expandBtn:f}=jt(o,n,B.length);ie[n]?.parentElement?.replaceWith(i),C[n]=s,ie[n]=a,we[n]=f}function pi(e){const t=U.get(e);t&&(t.close(),pt(e))}function mi(){for(const e of U.values())e.cardIndex!==null&&(e.cardIndex=null,e.setTitle(`${e.label} \u2014 unlinked from gallery`))}function zt(){for(const e of C)e?.drawPendingNow()}const Yn=d.ownerDocument.defaultView??window;Yn.addEventListener("beforeprint",zt);function gi(){zt();const e=[...A.querySelectorAll("canvas")];if(!e.length)return;const t=e.length,n=Math.ceil(Math.sqrt(t)),o=Math.ceil(t/n),i=e[0].width,s=e[0].height,a=8,f=(d.ownerDocument.defaultView??window).devicePixelRatio||1,r=Math.round(26*f),p=Math.round(12*f),c=d.ownerDocument.createElement("canvas");c.width=n*i+(n-1)*a,c.height=o*(s+r)+(o-1)*a;const u=c.getContext("2d"),h=Wi(A);u.fillStyle=h.background,u.fillRect(0,0,c.width,c.height),e.forEach((g,S)=>{const v=S%n,L=Math.floor(S/n),W=v*(i+a),F=L*(s+r+a),Ue=g.closest(".wmap-gallery-card")?.querySelector("span")?.textContent??"";u.fillStyle=h.surface,u.fillRect(W,F,i,r),u.fillStyle=h.text,u.font=`700 ${p}px system-ui, sans-serif`,u.textAlign="left",u.textBaseline="middle",u.fillText(Ue,W+Math.round(10*f),F+r/2,i-Math.round(20*f)),u.drawImage(g,W,F+r)}),c.toBlob(g=>{if(!g)return;const S=C.find(v=>v!=null)?.getExportTitle();Zi(g,["gallery",S].filter(Boolean).join(" "),P.onSaveImage)})}return{setItems(e){M=e.map(n=>typeof n=="function"?null:n);const t=l.plotMode;if(Oe.has(t))if(e.some(o=>typeof o=="function"))te(e);else{const o=Ht(t);l={...l,...o},te(qe(t))}else te(e)},setOptions(e){I(e,{fireCallback:!1})},getOptions(){return po(l)},setFindingsNotice(e){cn=e,N()},setColumns(e){Kn(e)},getBinColors(){return l.binColors??xe()},setLotStatsSummary(e){z=e,ze(),w&&N(),ge()},openUserGuide:Pn,destroy(){R.flush(),Re++,Yn.removeEventListener("beforeprint",zt),Ce?.cancel(),Ce=null,Fe=null;for(const e of[...U.values()])e.closePollId!=null&&clearInterval(e.closePollId),e.close(),e.ctrl.destroy();U.clear();for(const e of C)e&&e.destroy();C=[],Ae()?.remove(),Un.disconnect(),Be&&((d.ownerDocument.defaultView??window).cancelAnimationFrame(Be),Be=0),d.ownerDocument.removeEventListener("click",et,!0),window.removeEventListener("blur",rn),Co(),so(),_e.remove(),X.remove(),w?.remove(),De?.destroy()}}}
@@ -3,10 +3,13 @@ import type { Die } from '../core/dies.js';
3
3
  import { type ToCanvasOptions } from './toCanvas.js';
4
4
  import type { WaferMapResult } from '../renderer/buildWaferMap.js';
5
5
  import type { StatsFinding, StatsSummary } from '../stats/types.js';
6
- import { type SaveImageHandler, type SaveTextHandler, type UserGuideExtension } from './toolbar.js';
6
+ import { type SaveImageHandler, type SaveTextHandler } from './toolbar.js';
7
+ import { type UserGuideExtension } from './guideWindow.js';
7
8
  import type { SummaryPanelOptions, FindingsNotice } from './summaryPanel.js';
8
9
  import { type WarningsOptions } from './warnings.js';
9
10
  import type { InsightsOptions } from './insightsTab.js';
11
+ import type { DrilldownContext } from './drilldown.js';
12
+ import { type DrilldownSource } from './chartPopulation.js';
10
13
  import { type DieListDisplayOptions } from './dieList.js';
11
14
  import { type BinColors } from '../renderer/binColors.js';
12
15
  import { type CompactMap } from '../core/compact.js';
@@ -224,7 +227,7 @@ export interface RenderOptions extends ForwardedDrawOptions {
224
227
  /**
225
228
  * A prefix for every file the map saves — PNGs and CSVs alike. The lot,
226
229
  * wafer and content follow it (`<prefix>_W05_hard-bin.png`), except any the
227
- * prefix already names. See docs/api.md §5.4.5.
230
+ * prefix already names. See docs/api/render-map.md §5.4.5.
228
231
  */
229
232
  downloadFilename?: string;
230
233
  /**
@@ -454,6 +457,16 @@ export interface CardRenderOptions extends Omit<RenderOptions, 'viewOptions'> {
454
457
  chromeInset?: string;
455
458
  /** Replaces the expand action for both the expand button and the E key. */
456
459
  onExpand?: () => void;
460
+ /**
461
+ * A host that owns a wider selection than this map's (the gallery, selecting the same die positions
462
+ * on every wafer) supplies the drilldown population and context here. Returns `undefined` to fall back
463
+ * to this map's own selection or wafer.
464
+ */
465
+ drilldownSourceOverride?: () => {
466
+ source: DrilldownSource;
467
+ ctx?: Partial<DrilldownContext>;
468
+ narrowable?: boolean;
469
+ } | undefined;
457
470
  /**
458
471
  * Draw the canvas only while it is on screen (or near it). An off-screen card
459
472
  * keeps its view up to date and is drawn when it scrolls into view, or by
@@ -476,6 +489,8 @@ export interface CardController extends WaferMapController {
476
489
  getOptions(): CardViewOptions;
477
490
  /** Show or hide the Summary toolbar button without affecting the panel's content. */
478
491
  setSummaryVisible(visible: boolean): void;
492
+ /** The dies selected on this map now. */
493
+ getSelectedDies(): Die[];
479
494
  /** Show or hide the view-control toolbar buttons (mode, orientation, etc). */
480
495
  setViewControlsVisible(visible: boolean): void;
481
496
  /** Show or hide the expand toolbar button. */
@@ -484,8 +499,12 @@ export interface CardController extends WaferMapController {
484
499
  getExportTitle(): string;
485
500
  /** This map's save hook, naming files for its own wafer — for a save the gallery starts on a card's behalf. */
486
501
  getSaveImageHook(): SaveImageHandler;
502
+ /** The same for CSV: names files for this map's own wafer. */
503
+ getSaveTextHook(): SaveTextHandler;
487
504
  /** Draw now if a `drawWhenVisible` card skipped drawing while off screen. */
488
505
  drawPendingNow(): void;
506
+ /** Ring one die — a row clicked in a table — and bring it into view; `null` removes the ring. */
507
+ locateDie(die: Die | null): void;
489
508
  }
490
509
  /** @internal The public view of a card's options: everything but the gallery's shared state. */
491
510
  /** The bin a finding is about — what the legend filter shows while the finding
@@ -1 +1 @@
1
- import{buildView as Xi,buildHoverText as Ni,findTestDef as Ct,resolveTestNumber as tn,buildMapTitle as _i}from"../renderer/buildView.js";import{drawMapCanvas as ji,BIN_LEGEND_W as ti,BIN_LEGEND_W_COMPACT as Ki,BIN_LEGEND_ADAPT_COMPACT as $i,BIN_LEGEND_ADAPT_FLOATING as Gi,PATH_SHAPES as Ui}from"./toCanvas.js";import{buildWaferMap as Zi,getTestPassStatus as Qi,isParametricTest as nn}from"../renderer/buildWaferMap.js";import{analyzeWaferMap as qi}from"../stats/analyzeWaferMap.js";import{SHADOW as Ji,LEADING as ni,wireControlHover as ii,SPACE as Y,EDGE_GUTTER as eo,RADIUS as oi,FONT as St,CLR as E,applyOverlayZ as to,getTooltip as si,hideTooltip as Mt,positionTooltip as li,createToolbarHelpers as no,buildModeMenuEl as io,openReparentedModal as oo,openUserGuideWindow as so,makePaletteBtn as lo,makeLogScaleBtn as ao,makeLegendStyleBtn as ro,makeOverlaysBtn as co,makeOrientationBtn as fo,menuLayerFor as ai,saveImageBlob as po,markMenuTrigger as nt,wireMenuA11y as ri,wireExpandToggle as uo,nextFrame as on,requestedPassFailDisplay as go,overlayMenuRows as ho,anyOverlayActive as mo,openCompactDiagnostics as yo,roomForPanel as bo,logWmapVersionOnce as vo,buildDataModeEntries as xo,metadataKeyHasData as wo,metadataModeEntry as Co}from"./toolbar.js";import{waferIdentityLabel as So}from"../core/waferLabel.js";import{metadataDisplayValue as Mo}from"../core/metadata.js";import{withExportContext as Eo}from"./exportName.js";import{createSummaryPanelEl as sn,wrapWithSummaryPanel as ln,renderWaferSummaryContentSteps as Do}from"./summaryPanel.js";import{runChunked as Bo}from"./chunked.js";import{collectWarnings as ko,buildWarningsMenuEl as Lo,severityOf as To}from"./warnings.js";import{ICONS as di}from"./icons.js";import{hasDrilldownTargets as Po,selectionPopulation as Oo,waferPopulation as Ro}from"./chartPopulation.js";import{createIdentityHeader as Io,collapsedLabel as an}from"./identityHeader.js";import{getDieKey as ye,hasPosition as ci,isPositionedDie as Ao}from"../core/dies.js";import{buildDieListSection as Wo}from"./dieList.js";import{buildMaplessSummary as Fo}from"./maplessSummary.js";import{resolveBinColors as zo,binColorWarning as Ho}from"../renderer/binColors.js";import{INPUT_DEFAULT_PASS_BINS as Vo}from"../core/passBins.js";import{toggleHighlight as fi}from"../core/utils.js";import{buildCompactMap as Yo,compactLayoutOffered as Xo}from"../core/compact.js";const pi=new Set(["binColorScheme","valueColorScheme","reverseValueScheme","useDefinedBinColors","rotation","flipX","flipY","showDieLabels","showRingBoundaries","showQuadrantBoundaries","showReticle","showXYIndicator","compact","showAxes","legendPosition","logScale","colorbarRangeMode","markFailingDies","fallbackFormat"]);export const COLOR_KEYS=["binColorScheme","valueColorScheme","reverseValueScheme","useDefinedBinColors","binColors"];export function classifyChanged(k){const m=k.some(p=>pi.has(p)),S=k.some(p=>!pi.has(p));return m&&S?"mixed":m?"preference":"state"}export function findingBin(k){const{kind:m,bin:S}=k.variable;return m==="hardBin"||m==="softBin"?S:void 0}export function toPublicViewOptions(k){const{metadataValueOrder:m,binColors:S,lotSize:p,compactMap:L,...it}=k;return it}export function renderWaferMap(k,m,S={}){return renderWaferMapCard(k,m,S)}export function renderWaferMapCard(k,m,S={}){vo();const p=k.ownerDocument,L=p.defaultView??window,it=()=>ie.label,rn=()=>So({label:it(),wafer:K}),ue=Eo(()=>{const e=Mo(K.metadata?.lot);return{prefix:S.downloadFilename,lots:e!==void 0?[e]:[],...ie.isLotStack?{stackedWafers:h?.lotSize??!0}:{wafer:rn()}}},S.onSaveImage,S.onSaveText);function dn(){const e=h.plotMode==="softBin"||h.plotMode==="stackedSoftBins"?ee:J,{primary:t,secondary:n}=_i(h,d.fallbackFormat,e);return[t,ie.isLotStack?"":n].filter(Boolean).join(" ")||"wafer-map"}L.getComputedStyle(k).position==="static"&&(k.style.position="relative");const ui=k.clientHeight;S.height!=null&&(k.style.height=typeof S.height=="number"?`${S.height}px`:S.height);const Et=m.dataCoverage?m.dataCoverage.unpositionedDies:m.dies.filter(e=>!ci(e)).length,Fe=(m.dataCoverage?m.dataCoverage.totalDies:m.dies.length-Et)===0&&Et>0,ze=p.createElement("div");Object.assign(ze.style,{display:"flex",flexDirection:"column",width:"100%",height:"100%"}),k.appendChild(ze);const ke=p.createElement("div");Object.assign(ke.style,{position:"relative",width:"100%",flex:"1 1 auto",minHeight:"0"});const be=S.chromeInset??eo,q=p.createElement("div");Object.assign(q.style,{display:"flex",alignItems:"stretch",gap:Y.sm,background:E.canvasBg,paddingBottom:Y.lg,paddingTop:be,paddingLeft:be,paddingRight:be,flexShrink:"0",minWidth:"0"}),ze.appendChild(q),ze.appendChild(ke);function He(){const e=[...q.children].some(t=>t.style.display!=="none");q.style.display=e?"flex":"none"}const M=p.createElement("div");Object.assign(M.style,{position:"relative",width:"100%",height:"100%"});const s=p.createElement("canvas");Object.assign(s.style,{width:"100%",height:"100%",display:"block"}),M.appendChild(s),ke.appendChild(M);let ot=null;if(Et>0){let n=function(){if(t){const r=Wo(e,m.testDefs,{...S.dieList,onSaveText:ue.onSaveText,waferMetadata:K.metadata,metadataFields:xe,ownerDocument:p});if(r)return r}const o=Ct(m.testDefs,d.activeTest??0),l=nn(o)?d.logScale??o?.logScale??!1:!1;return Fo(e,m.testDefs,{plotMode:d.plotMode??"hardBin",activeTest:d.activeTest,hbinDefs:J,sbinDefs:ee,binColors:h.binColors,valueColorScheme:d.valueColorScheme,reverseValueScheme:d.reverseValueScheme,logScale:l,colorbarRangeMode:d.colorbarRangeMode,valueRangeDies:m.dies})},i=function(o){const l=p.createElement("button");return l.type="button",ii(l),Object.assign(l.style,{fontSize:St.body,padding:`${Y.xxs} ${Y.sm}`,borderRadius:oi.control,flexShrink:"0",border:`1px solid ${E.menuBorder}`,background:E.menuBg,color:E.text,cursor:"pointer"}),l.textContent=t?"View chart":"View die list",l.addEventListener("click",r=>{r.stopPropagation(),t=!t,l.textContent=t?"View chart":"View die list",o()}),l};const e=m.dies.filter(o=>!ci(o));let t=!1;if(Fe){const o=p.createElement("div");Object.assign(o.style,{position:"absolute",inset:"0",background:E.panelBg,padding:Y.xl,boxSizing:"border-box",overflow:"hidden",display:"flex",flexDirection:"column",gap:Y.md,zIndex:"1"});const l=p.createElement("div");Object.assign(l.style,{display:"flex",justifyContent:"space-between",alignItems:"flex-start",gap:Y.md});const r=p.createElement("span");Object.assign(r.style,{fontSize:St.body,color:E.label,lineHeight:ni.base}),r.textContent="No die position data for this wafer.",l.appendChild(r);const a=p.createElement("div");Object.assign(a.style,{flex:"1",minHeight:"0",overflow:"auto",display:"flex",flexDirection:"column"}),l.appendChild(i(()=>a.replaceChildren(n()))),o.appendChild(l),o.appendChild(a),M.appendChild(o),ot=()=>{t||a.replaceChildren(n())}}else{const o=p.createElement("div");Object.assign(o.style,{position:"absolute",left:"0",right:"0",bottom:"0",zIndex:"3",background:E.panelBg,borderTop:`1px solid ${E.menuBorder}`,fontSize:St.body,color:E.text,cursor:"pointer",padding:`${Y.xs} ${Y.md}`,display:"flex",alignItems:"center",justifyContent:"space-between",gap:Y.md}),ii(o,"bare");const l=p.createElement("span");l.textContent=`+${e.length} ${e.length===1?"die":"dies"} without position data`,o.appendChild(l);const r=p.createElement("span");r.textContent="\u25BE",Object.assign(r.style,{fontSize:St.body,lineHeight:ni.none,color:E.label,flexShrink:"0"}),o.appendChild(r),o.setAttribute("aria-expanded","false"),o.setAttribute("aria-label",`${e.length} dies without position data. Click to view.`);let a=null,c=null;uo(o,f=>{if(r.textContent=f?"\u25B4":"\u25BE",o.setAttribute("aria-expanded",String(f)),f){a=p.createElement("div");const g=o.getBoundingClientRect().height||28;Object.assign(a.style,{position:"absolute",left:"0",right:"0",bottom:`${g}px`,top:"20%",zIndex:"2",background:E.panelBg,borderTop:`1px solid ${E.menuBorder}`,padding:Y.md,boxSizing:"border-box",display:"flex",flexDirection:"column",gap:Y.md}),a.addEventListener("click",N=>N.stopPropagation());const v=p.createElement("div");Object.assign(v.style,{display:"flex",justifyContent:"flex-end"}),v.appendChild(i(()=>{c&&c.replaceChildren(n())})),a.appendChild(v),c=p.createElement("div"),Object.assign(c.style,{flex:"1",minHeight:"0",overflow:"auto",display:"flex",flexDirection:"column"}),c.appendChild(n()),a.appendChild(c),M.appendChild(a)}else a&&(a.remove(),a=null,c=null)}),M.appendChild(o),ot=()=>{c&&!t&&c.replaceChildren(n())}}}const{onHover:st,onClick:gi,onSelect:ae,onViewOptionsChange:hi,showTooltip:mi=!0,showToolbar:Ve=!0,showIdentity:cn=!0,summaryPanel:Ye,showHelpButton:fn=!1,userGuideExtension:yi,onExpand:pn,showExpandButton:un=!0,zIndex:bi,insights:ve,warnings:gn,viewOptions:vi={},...Le}=S,Xe=ve?.enabled??!1,xi=.4,wi=20,lt=[...m.passBins??Vo],hn=gn?.display??!0,Ci=to(bi);let ge=S.statsSummary,he=[],mn=!1,at=null,yn=!1;function Dt(){const e=ko({result:m,statsSummary:ge,extra:at?[at]:[]}),t=e.length!==he.length||e.some((n,i)=>n.code!==he[i]?.code||n.message!==he[i]?.message);he=e,(t||!mn)&&(mn=!0,gn?.onWarning?.(e))}Dt();let ie=m,K=m.wafer,re=m.dies,x=new Set;const Si={sweeps:ve?.sweeps,onSaveImage:ue.onSaveImage},Bt=()=>!Fe&&Po(te,ve?.sweeps);let bn=null,rt=null,dt=!1,vn=!1,J=m.hbinDefs,ee=m.sbinDefs,te=m.testDefs,xe=m.metadataFields,xn=m.reticles?.length?m.reticles:void 0,ct=m.reticleConfig,wn=m.dataAxisFlip,kt=m.isLotStack??!1,Lt=m.aggrMethod,Tt=m.lotSize;const Mi=Ve&&Xe;let $=null,oe=null,se=null;cn&&($=Io(an(K.metadata??{},Ne())??"",K.metadata,{lotStack:Ne(),ownerDocument:p}),M.appendChild($.metaPanel),$.metaPanel.style.visibility="visible",$.isEmpty()||(oe=Cn($.wrap),q.insertBefore(oe,q.firstChild),He()));function Cn(e){const t=p.createElement("div");return Object.assign(t.style,{display:"flex",alignItems:"center",padding:`${Y.sm} ${Y.lg}`,flex:"1 1 auto",minWidth:"0",overflow:"hidden",gap:Y.sm}),Object.assign(e.style,{flex:"1",minWidth:"0"}),t.appendChild(e),t}function Ne(){return kt?{lotSize:Tt??1,aggrMethod:Lt}:void 0}function Ei(){if(!$)return;$.update(an(K.metadata??{},Ne())??"",K.metadata,Ne());const e=oe?.isConnected??!1,t=!$.isEmpty();!t&&e?(oe.remove(),oe=null):t&&!e&&(oe=Cn($.wrap),oe.style.display="",q.insertBefore(oe,q.firstChild),He())}const Di=[...J??[],...ee??[]].some(e=>e.color);let d={plotMode:"hardBin",showDieLabels:!1,showRingBoundaries:!1,showQuadrantBoundaries:!1,showReticle:!1,showXYIndicator:!1,compact:!1,rotation:0,flipX:!1,flipY:!1,legendPosition:"default",...vi},G=null,le=!1,Sn=null;function Bi(){return Xe?G?Promise.resolve(G):(Sn??=import("./insightsTab.js").then(({createInsightsTab:e})=>(G=e({getItems:()=>[{wafer:K,dies:re,hbinDefs:J,sbinDefs:ee,testDefs:te,label:it(),passBins:lt,statsSummary:ge}],getBinColors:()=>h.binColors,getRingCount:()=>ie.ringCount??4,onSaveImage:ue.onSaveImage,onSaveText:ue.onSaveText,defaultView:ve?.defaultView,sweeps:ve?.sweeps,onRemoveSweeps:ve?.onRemoveSweeps,showMetadataStrip:!1,contentInset:be,backTab:Mi?void 0:{label:"Map",onBack:()=>_e(!1)},onOpenGuide:fn&&!Ve?()=>Qt():void 0,focusTest:t=>{P({plotMode:"value",activeTest:t,highlightBin:void 0}),_e(!1)},ownerDocument:p}),Object.assign(G.el.style,{position:"absolute",inset:"0",background:E.canvasBg,overflowY:"auto",paddingTop:"0"}),G.el.style.display="none",ke.appendChild(G.el),G)),Sn):Promise.resolve(null)}let Mn=0;const Pt=["wheel","touchstart","pointerdown","keydown"];function ki(e,t){if(t<=0)return;let n=!1;const i=[],o=()=>{n=!0;for(const r of i)L.clearTimeout(r);i.length=0;for(const r of Pt)e.removeEventListener(r,o)},l=()=>n||!le?!0:(e.scrollTop=t,e.scrollTop>=t);if(!l()){for(const r of Pt)e.addEventListener(r,o,{passive:!0,once:!0});for(const r of[0,50,150,300,600])i.push(L.setTimeout(()=>{l()},r));i.push(L.setTimeout(()=>{for(const r of Pt)e.removeEventListener(r,o)},700))}}function _e(e){if(!Xe)return;const t=le;le=e,G&&!e&&t&&(Mn=G.el.scrollTop),G&&(G.el.style.display=e?"flex":"none"),M.style.visibility=e?"hidden":"",H&&(H.style.display=e||Fe?"none":"flex"),I&&(I.style.display=e?"none":"flex"),se&&(se.style.display=Ee?"none":"flex"),ce&&(ce.style.display="flex"),oe&&(oe.style.display=""),He(),$&&e&&$.collapse(),gt(),X&&(X.innerHTML=e?di.wafer:di.analysis,X.ariaLabel=e?"Back to wafer view":"Insights"),e&&Bi().then(n=>{!n||!le||(n.el.style.display="flex",n.render(),ki(n.el,Mn))})}Xe&&ve?.defaultOpen&&queueMicrotask(()=>_e(!0));let h,je,_=null,T=null,Ot=[],Rt;function En(e){Rt!==e&&(Rt=e,C())}let we=null,It=Le.legendOffset??{x:0,y:0},Ke=!1,Te=!1,$e={x:0,y:0},At={x:0,y:0},Ce=!1,Pe=!1,j="select",Oe={x:0,y:0},ft={x:0,y:0},W={x:0,y:0},F={x:0,y:0},Ge=!1,Re=!1;function Wt(){const e=d,t=re.filter(Ao);h=Xi(K,t,{compact:d.compact?d.compactMap??Yo(t):void 0,plotMode:e.plotMode,binColorScheme:e.binColorScheme,valueColorScheme:e.valueColorScheme,reverseValueScheme:e.reverseValueScheme,useDefinedBinColors:e.useDefinedBinColors,binColors:e.binColors??zo(re,{passBins:lt,binColorScheme:e.binColorScheme,hbinDefs:J,sbinDefs:ee,useDefinedBinColors:e.useDefinedBinColors}),passBins:lt,showDieLabels:e.showDieLabels,showRingBoundaries:e.showRingBoundaries,showQuadrantBoundaries:e.showQuadrantBoundaries,showReticle:e.showReticle,showXYIndicator:e.showXYIndicator,reticles:xn,ringCount:ie.ringCount??4,highlightBin:e.highlightBin,highlightMetadataValue:e.highlightMetadataValue,activeTest:e.activeTest,activeMetadataKey:e.activeMetadataKey,testDefs:te,valueRange:e.valueRange,metadataValueOrder:e.metadataValueOrder,logScale:e.logScale,isLotStack:kt,aggregationMethod:Lt??e.aggregationMethod,lotSize:Tt??e.lotSize,dataAxisFlip:wn,colorbarRangeMode:e.colorbarRangeMode,passFailDisplay:e.passFailDisplay,fallbackFormat:e.fallbackFormat,interactiveTransform:{rotation:e.rotation??0,flipX:e.flipX??!1,flipY:e.flipY??!1}},{hbinDefs:J,sbinDefs:ee,metadataFields:xe}),je=void 0;const n=e.binColors?null:Ho(h.binColors,h.plotMode);n?.message!==at?.message&&(at=n,Dt(),yn&&Ht())}Wt();function Dn(){return d.showAxes??Le.showAxes??T!==null}function Li(){return Xo(re,[ct])}let U=null,Se=null,Ie=null,Bn=S.findingsNotice,Ti={},O=null,de=null;function Pi(e){const{kind:t,index:n}=e.variable;P(t==="test"?{plotMode:"value",activeTest:n??0,highlightBin:void 0}:{plotMode:t==="softBin"?"softBin":"hardBin",highlightBin:findingBin(e)});const i=e.highlight;(i.kind==="bin"||i.kind==="region"||i.kind==="dies")&&Tn(i.dieKeys)}const Ue=new Map,Ft=new WeakSet;function zt(e){if(Ue.get(e)?.cancel(),Ue.delete(e),e.style.display==="none"){Ft.add(e);return}Ft.delete(e);const t=Bo(Do(e,{wafer:K,dies:re,yieldSummary:ie.yield,dataCoverage:ie.dataCoverage,hbinDefs:J,sbinDefs:ee,testDefs:te,statsSummary:ge,warnings:hn?he:[],passBins:lt,ringCount:ie.ringCount??4,binColors:h.binColors,plotMode:d.plotMode??"hardBin",metadataShownElsewhere:cn,fallbackFormat:d.fallbackFormat,activeFindingId:Ie,findingsFilter:Ti,findingsNotice:Bn,onFindingsFilterChange:me,onSaveText:ue.onSaveText,metadataFields:xe,dieListOptions:S.dieList,onFindingClick:(n,i)=>{Ie===n.id?(Ie=null,Tn([]),P({highlightBin:void 0})):(Ie=n.id,Pi(n)),me()}}));t.done||Ue.set(e,t)}function me(){U&&zt(U)}function Ze(){O&&zt(O)}if(Ye?.placement){const e=Ye.placement;U=sn(e,be,p);const t=M.parentElement,n=M.nextSibling;Se=ln(M,U,e),t?.insertBefore(Se,n),me()}else if(ge){const e=Ye?.defaultOpen??!Ve;O=sn("right",be,p),O.style.display=e?"block":"none";const t=M.parentElement,n=M.nextSibling;de=ln(M,O,"right"),t?.insertBefore(de,n),Ze()}const z=mi?si(p):null;let ce=null,R=null,H=null,I=null,pt=null,Z=null,kn=null,X=null,fe=null,ut=null;yn=!0;function Ht(){if(!fe||!ut)return;const e=he.length,t=e>0;if(fe.style.display=t?"flex":"none",ut.style.display=t?"":"none",!t)return;const n=To(he[0]),i=`${e} data ${e===1?"warning":"warnings"}`;fe.style.color=n==="error"?E.errText:E.warnText,fe.ariaLabel=n==="error"?`${i} \u2014 the map may be positionally wrong`:i}let Vt=null,Ln=null,Yt=null,Xt=null,Nt=null,_t=null;function Me(e="selection"){Ie!==null&&(Ie=null,e==="selection"?P({highlightBin:void 0}):(x=new Set,ae?.([])),me())}function Tn(e){x=new Set(e??[]),ae&&ae(Qe()),C()}function gt(){if(!Z)return;const e=!!(U??O);Z.style.display=ge&&e&&!le?"flex":"none";const t=U??O,n=t?t.style.display!=="none":!1;ge?.hasNotableFindings&&!n?Z.style.color=E.findingIndicator:Z.dataset.active||(Z.style.color=E.icon)}let Pn=null;function On(e){const t=U??O;if(!t)return;const n=t.style.display!=="none",i=M.getBoundingClientRect().width;if(t.style.display=e?"block":"none",e!==n){const o=i-M.getBoundingClientRect().width;(S.onSummaryPanelChange??ht)?.(e,e?o:0)}e&&Ft.has(t)&&zt(t),Z&&Pn?.(Z,e),gt()}if(Ve){let g=function(y){j=y,i(N,y==="zoom"),i(w,y==="pan"),pt&&i(pt,y==="select"),s.style.cursor=y==="pan"?"grab":"crosshair"};ce=p.createElement("div"),ce.dataset.wmapToolbar="single",Object.assign(ce.style,{marginLeft:"auto",flexShrink:"0",display:"flex",flexDirection:"row",alignItems:"center",flexWrap:"wrap-reverse",justifyContent:"flex-end",maxWidth:"100%",background:E.menuBg,border:`1px solid ${E.menuBorder}`,borderRadius:oi.control,boxShadow:Ji.panel,pointerEvents:"auto"});const e=si(p),t=no(e),{makeBtn:n,setActive:i,makeSep:o,makeMenuRow:l,makeMenuSection:r,closeOpenMenu:a,getOpenMenu:c,setOpenMenu:f}=t;Pn=i,Vt=a,Ln=c,p.addEventListener("click",a,!0),H=p.createElement("div"),Object.assign(H.style,{display:Fe?"none":"flex",alignItems:"center",gap:"0",flexWrap:"wrap",justifyContent:"flex-end"}),ce.appendChild(H);const v=n("download","Download PNG",Ai);H.appendChild(v),H.appendChild(o());const N=n("zoomMode","Zoom (drag to zoom region)",()=>g("zoom")),ne=n("zoomIn","Zoom in",()=>We(s.clientWidth/2,s.clientHeight/2,1.2)),b=n("zoomOut","Zoom out",()=>We(s.clientWidth/2,s.clientHeight/2,1/1.2)),D=n("reset","Reset zoom (double-click)",()=>bt());H.appendChild(N),H.appendChild(ne),H.appendChild(b),H.appendChild(D),H.appendChild(o());const w=n("pan","Pan (drag to move)",()=>g("pan"));H.appendChild(w),pt=n("boxSelect","Select (drag to select dies)",()=>g("select")),H.appendChild(pt);{const y=n("drilldown","Chart this wafer",()=>{const V=y.getBoundingClientRect();Xn({x:V.left,y:V.bottom+4},y)});y.setAttribute("aria-haspopup","menu"),rt=y,Yn(),H.appendChild(y)}g(j);{let y=function(u){return u.plotMode!==(d.plotMode??"hardBin")?!1:u.plotMode==="value"?(d.activeTest??0)===(u.activeTest??0):u.plotMode==="metadata"?d.activeMetadataKey===u.activeMetadataKey:!0},V=function(u,B){u.activeTest!==void 0?P({plotMode:u.plotMode,activeTest:u.activeTest,activeMetadataKey:void 0,logScale:u.logScale}):u.activeMetadataKey!==void 0?P({plotMode:u.plotMode,activeTest:void 0,activeMetadataKey:u.activeMetadataKey,passFailDisplay:"off"}):P({plotMode:u.plotMode,activeTest:void 0,activeMetadataKey:void 0,passFailDisplay:"off"}),B.remove(),f(null),nt(A,!1)};R=p.createElement("div"),Object.assign(R.style,{display:"flex",alignItems:"center",gap:"0",flexWrap:"wrap",justifyContent:"flex-end"}),ce.appendChild(R),I=p.createElement("div"),Object.assign(I.style,{display:"flex",alignItems:"center",gap:"0"}),R.appendChild(I),I.appendChild(o());const pe=()=>{const u=c();u&&(u.remove(),f(null)),nt(A,!1)},A=n("mode","Plot mode",()=>{if(c()){pe();return}const u=re,B=h.testDefs,{testEntries:wt,binEntries:De,stackedEntries:et}=xo(u,B,{includeStacked:h.isLotStack}),en=(xe??[]).filter(Be=>wo(u,Be.key)).map(Co),tt=io(A.getBoundingClientRect(),wt,De,et,y,V,{makeMenuRow:l,makeMenuSection:r},d.plotMode??"hardBin",A.ownerDocument.defaultView??window,en);ai(A).appendChild(tt),f(tt),nt(A,!0),ri(tt,A,pe)});nt(A,!1);const{btn:vt,sync:Je}=lo(t,()=>({...d,plotMode:d.plotMode??"hardBin"}),()=>Di,P);Xt=Je,Xt();const qt=co(t,()=>{const u=!!h.hasReticle,B=(d.plotMode??"hardBin")==="value",{testNumber:wt}=tn(d.activeTest??0,h.testDefs),De=Ct(h.testDefs,wt),et=B&&De!==void 0&&!nn(De),en=B&&!et&&(De?.limitLow!==void 0||De?.limitHigh!==void 0),tt=B&&!et&&h.dies.some(Be=>Qi(Be,wt,De)!==void 0);return ho({...d,showAxes:Dn()},u,{functionalActive:et,hasLimits:en,hasRecorded:tt,binMode:(d.plotMode??"hardBin")==="hardBin"||(d.plotMode??"hardBin")==="softBin"},Be=>P(Be),{on:!!d.compact,offered:Li(),onChange:Be=>P({compact:Be}),onDiagnostics:()=>yo(re,[ct],{anchor:s,onSaveText:ue.onSaveText})})},()=>mo(d)),{btn:Jt,sync:Fi}=ro(t,()=>d,u=>P({legendPosition:u}));Yt=Fi,Yt();const ei=()=>{const{testNumber:u}=tn(d.activeTest??0,te),B=Ct(te,u);return B!==void 0&&!nn(B)},{btn:zi,sync:Hi}=ao(t,()=>({...d,functionalActive:ei()}),u=>P(u));Nt=Hi,Nt();const Vi=()=>{const{testNumber:u}=tn(d.activeTest??0,te),B=Ct(te,u);return B!==void 0&&(B.limitLow!==void 0||B.limitHigh!==void 0)},xt=n("specRange","Colorbar range: test limits",()=>{const u=d.colorbarRangeMode==="data"?"spec":"data";P({colorbarRangeMode:u})});_t=()=>{const u=d.plotMode==="value"&&Vi()&&go(d)==="off"&&!ei();xt.style.display=u?"":"none";const B=(d.colorbarRangeMode??"spec")==="spec";i(xt,B),xt.ariaLabel=B?"Colorbar range: test limits (click for data range)":"Colorbar range: data range (click for test limits)"},_t();const Yi=fo(t,()=>d,u=>P(u));I.appendChild(A),I.appendChild(vt),I.appendChild(zi),I.appendChild(xt),Fe||(I.appendChild(o()),I.appendChild(qt),I.appendChild(o()),I.appendChild(Jt),I.appendChild(o()),I.appendChild(Yi)),ge&&(Z=n("findings","Summary panel",()=>{const u=U??O;u&&On(u.style.display==="none")}),R.appendChild(o()),R.appendChild(Z),O?.style.display!=="none"&&i(Z,!0),gt()),hn&&(ut=o(),fe=n("warning","Data warnings",()=>{const u=c();if(a(new MouseEvent("click")),u)return;const B=Lo(fe.getBoundingClientRect(),he,L);ai(ke).appendChild(B),f(B),ri(B,fe,()=>a(new MouseEvent("click")))}),nt(fe,!1),R.appendChild(ut),R.appendChild(fe),Ht()),Xe&&(R.appendChild(o()),X=n("analysis","Insights",()=>{_e(!le),i(X,le)}),X.dataset.wmapInsightsBtn="1",R.appendChild(X)),un&&(R.appendChild(o()),se=n("expand","Expand (E)",pn??Rn),R.appendChild(se)),fn&&(R.appendChild(o()),kn=n("help","User guide",()=>Qt()),R.appendChild(kn))}q.appendChild(ce),He()}let Ee=null,ht=null;function Rn(){Ee&&(Ee.close(),Ee=null);const e=ke;e.style.flex="1",e.style.minWidth="0",e.style.minHeight="0";const t=an(K.metadata??{},Ne()),n=q.childElementCount>0?[q,e]:[e],i=oo(n,{ownerDocument:p,boxSize:le?{width:"min(96vw, 1600px)",height:"min(92vh, 1000px)"}:void 0,onClosed:()=>{Ee=null,ht=null,se&&(se.style.display="flex"),le||s.focus({preventScroll:!0})}});if(!i)return;i.box.setAttribute("aria-label",t??"Expanded wafer map"),n.length>1&&(i.contentWrap.style.flexDirection="column"),Ee=i,ht=bo(i);const o=U??O,l=Se??de;if(o&&l&&o.style.display!=="none"){const r=parseFloat(p.defaultView?.getComputedStyle(l).columnGap??"")||0,a=o.getBoundingClientRect().width+r;a>0&&ht(!0,a)}se&&(se.style.display="none")}function In(e){("binColorScheme"in e||"useDefinedBinColors"in e)&&!("binColors"in e)&&d.binColors!==void 0&&(e={...e,binColors:void 0});const t=d.plotMode;d={...d,...e},("compact"in e||"compactMap"in e)&&(_=null,T=null),e.plotMode!==void 0&&e.plotMode,Object.keys(e).every(l=>l==="legendPosition"||l==="showLegend"||l==="markFailingDies"||l==="showAxes")||Wt(),Yt?.(),Xt?.(),Nt?.(),_t?.(),C();const i=e.plotMode!==void 0&&e.plotMode!==t,o=COLOR_KEYS.some(l=>l in e);(o||i)&&(me(),Ze()),(o||i||e.activeTest!==void 0||e.logScale!==void 0||e.colorbarRangeMode!==void 0)&&ot?.()}function P(e){In(e);const t=Object.keys(e);hi?.(d,t,classifyChanged(t))}let jt=!1;const Kt=S.drawWhenVisible&&L.IntersectionObserver?new L.IntersectionObserver(e=>{Ae=e[e.length-1].isIntersecting,Ae&&mt&&C()},{rootMargin:"25%"}):null;let Ae=Kt===null,mt=!1;Kt?.observe(s);function $t(){jt||(jt=!0,on(()=>{jt=!1,C()},L))}function C(){if(!Ae){mt=!0;return}mt=!1;const e=T??void 0,t=h.dies[0],n=t?{x:t.width,y:t.height}:Le.diePitchMm,i=Math.floor(s.clientWidth||s.width),o=!!(J?.length||ee?.length||h.dies.some(v=>v.hbin!=null||v.sbin!=null)),l=d.legendPosition??"default",r=d.showLegend??!0,a=l==="default"||l==="compact",c=(Le.colorbarWidth??16)+28,f=o&&a?l!=="default"?Math.max(ti,c):i<Gi?0:i<$i?Math.max(Ki,c):Math.max(ti,c):void 0,g=ji(s,h,{...Le,minRightReserve:r?f:0,showColorbar:r&&(Le.showColorbar??!0),markFailingDies:d.markFailingDies??!1,legendPosition:l,legendOffset:It,diePitchMm:n,fallbackFormat:d.fallbackFormat,showAxes:Dn(),viewport:e,activeBin:d.plotMode==="metadata"?d.highlightMetadataValue:d.highlightBin,hoverBin:Rt,afterDies:x.size>0?Oi:void 0,hbinDefs:J,sbinDefs:ee,metadataFields:xe});Ot=g.binLegendRows,we=g.legendBox??null,T===null&&(_=g.viewport),Pe&&Ii(),Yn()}function Oi(e,t,n){const i=h.hoverPoints,o=h.rectangles[0],l=o?o.width/2*t.ppm:t.ppm*.5,r=o?o.height/2*t.ppm:t.ppm*.5,a=new Set;x.size>0&&(je??=new Map(h.dies.map((b,D)=>[ye(b),D])));for(const b of x){const D=je.get(b);D!==void 0&&a.add(D)}if(!a.size)return;e.save(),e.setLineDash([]),e.fillStyle=n.background,e.globalAlpha=.7;let c=0;e.beginPath();for(let b=0;b<i.length;b++)a.has(b)||(e.rect(t.originX+i[b].x*t.ppm-l,t.originY-i[b].y*t.ppm-r,l*2,r*2),++c===Ui&&(e.fill(),e.beginPath(),c=0));c&&e.fill(),e.globalAlpha=1;const{cw:f,ch:g}=Ri(t,l,r),v=new Map,N=b=>Math.round(b*100),ne=(b,D,w,y)=>{const V=`${N(b)},${N(D)},${N(w)},${N(y)}`;v.has(V)?v.delete(V):v.set(V,[b,D,w,y])};for(const b of a){const D=t.originX+i[b].x*t.ppm,w=t.originY-i[b].y*t.ppm,y=D-f,V=D+f,pe=w-g,A=w+g;ne(y,pe,V,pe),ne(y,A,V,A),ne(y,pe,y,A),ne(V,pe,V,A)}e.strokeStyle=n.text,e.lineWidth=2,e.lineCap="square",e.beginPath();for(const[b,D,w,y]of v.values())e.moveTo(b,D),e.lineTo(w,y);e.stroke(),e.restore()}function Ri(e,t,n){const i=h.hoverPoints,o=h.dies;let l=0,r=0;for(let a=0;a<o.length&&(!l||!r);a++){const c=o[a];if(!(c.x==null||c.y==null))for(const f of[je.get(`${c.x+1},${c.y}`),je.get(`${c.x},${c.y+1}`)]){if(f===void 0)continue;const g=Math.abs(i[f].x-i[a].x)*e.ppm,v=Math.abs(i[f].y-i[a].y)*e.ppm;g>v?l||=g/2:r||=v/2}}return{cw:l||t,ch:r||n}}function Ii(){const e=s.getContext("2d"),t=Math.min(W.x,F.x),n=Math.min(W.y,F.y),i=Math.abs(F.x-W.x),o=Math.abs(F.y-W.y);e.save(),e.fillStyle="rgba(0,0,0,0.08)",e.fillRect(t,n,i,o),e.setLineDash([5,3]),e.strokeStyle="rgba(255,255,255,0.9)",e.lineWidth=3,e.strokeRect(t,n,i,o),e.strokeStyle="rgba(0,0,0,0.9)",e.lineWidth=1.5,e.strokeRect(t,n,i,o),e.restore()}function An(){if(!mt)return;const e=Ae;Ae=!0,C(),Ae=e}function Ai(){An(),s.toBlob(e=>{e&&po(e,dn(),ue.onSaveImage)})}function Wn(e){return _?Math.max(_.ppm*xi,Math.min(_.ppm*wi,e)):e}function We(e,t,n){const i=T??_;if(!i)return;const o=Wn(i.ppm*n),l=o/i.ppm,r=e-(e-i.originX)*l,a=t-(t-i.originY)*l,c=(_?.snapDist??1)/(o/(_?.ppm??o));T={originX:r,originY:a,ppm:o,snapDist:c},C()}function Q(){return T??_}function Fn(e){if(e.ctrlKey||e.metaKey){e.preventDefault();const t=s.getBoundingClientRect(),n=e.deltaY<0?1.12:1/1.12;We(e.clientX-t.left,e.clientY-t.top,n)}else if(T!==null){e.preventDefault();const t=Q(),n=T.snapDist;T={originX:t.originX-e.deltaX,originY:t.originY-e.deltaY,ppm:t.ppm,snapDist:n},C()}}function Gt(e,t,n){return e>=n.x&&e<n.x+n.w&&t>=n.y&&t<n.y+n.h}function zn(e){if(dt=!1,e.button!==0||!Q())return;s.focus({preventScroll:!0}),s.setPointerCapture(e.pointerId);const t=s.getBoundingClientRect(),n=e.clientX-t.left,i=e.clientY-t.top;if(we&&d.legendPosition==="floating"&&Gt(n,i,we)){Te=!0,$e={x:n,y:i},At={...It};return}if(Ge&&j!=="pan"){Re=!0,Ce=!0,Oe={x:n,y:i},ft={x:Q().originX,y:Q().originY},s.style.cursor="grabbing";return}if(j==="zoom"||j==="select"){Pe=!0,W=F={x:n,y:i};return}Ce=!0,Oe={x:n,y:i},ft={x:Q().originX,y:Q().originY},s.style.cursor="grabbing"}function Hn(e){const t=s.getBoundingClientRect(),n=e.clientX-t.left,i=e.clientY-t.top;if(Pe){F={x:n,y:i},$t();return}if(Te){const g=n-$e.x,v=i-$e.y;g*g+v*v>16&&(Te=!1,Ke=!0,s.style.cursor="grabbing")}if(Ke){It={x:At.x+(n-$e.x),y:At.y+(i-$e.y)},$t();return}if(Ce){const g=Q(),v=T?.snapDist??_?.snapDist??1;T={originX:ft.x+(n-Oe.x),originY:ft.y+(i-Oe.y),ppm:g.ppm,snapDist:v},$t();return}const o=Q();if(!o)return;const l=(n-o.originX)/o.ppm,r=(o.originY-i)/o.ppm,c=Zt(l,r,o.snapDist)?.die??null,f=Ot.find(g=>n>=g.x&&n<g.x+g.w&&i>=g.y&&i<g.y+g.h);if(En(f?f.bin:void 0),f){s.style.cursor="pointer",z&&(z.textContent=f.label??`Bin ${f.bin}`,z.style.display="block",li(z,s,e.clientX,e.clientY,{followPointer:!0})),st?.(null,e);return}j==="pan"&&(s.style.cursor=c?"crosshair":"grab"),z&&(c?(z.innerHTML=Ni(c,h.plotMode,{testDefs:te,hbinDefs:J,sbinDefs:ee,fallbackFormat:d.fallbackFormat,aggrMethod:h.aggrMethod,lotSize:h.lotSize,metadataFields:xe,activeTest:h.activeTest,reticleConfig:ct}),z.style.display="block",li(z,s,e.clientX,e.clientY,{followPointer:!0})):z.style.display="none"),st?.(c,e)}function Vn(e){const t=s.getBoundingClientRect(),n=e.clientX-t.left,i=e.clientY-t.top,o=e.ctrlKey||e.metaKey;if(z&&(n<0||i<0||n>t.width||i>t.height)&&(z.style.display="none"),Pe){Pe=!1,F={x:n,y:i};const a=n-W.x,c=i-W.y,f=Q();if(j==="zoom"){if(a*a+c*c<25)We(n,i,2);else if(f){const g=Math.min(W.x,F.x),v=Math.max(W.x,F.x),N=Math.min(W.y,F.y),ne=Math.max(W.y,F.y),b=v-g,D=ne-N;if(b>4&&D>4){const w=s.clientWidth,y=s.clientHeight,V=w/b,pe=y/D,A=Math.min(V,pe),vt=Wn(f.ppm*A),Je=vt/f.ppm,qt=(g+v)/2,Jt=(N+ne)/2;T={originX:w/2-(qt-f.originX)*Je,originY:y/2-(Jt-f.originY)*Je,ppm:vt,snapDist:f.snapDist/Je}}}C(),s.style.cursor="crosshair";return}if(a*a+c*c<25)Ut(n,i,o,e);else if(f){const g=(Math.min(W.x,F.x)-f.originX)/f.ppm,v=(Math.max(W.x,F.x)-f.originX)/f.ppm,N=(f.originY-Math.max(W.y,F.y))/f.ppm,ne=(f.originY-Math.min(W.y,F.y))/f.ppm,b=h.hoverPoints,D=[];for(let w=0;w<b.length;w++)if(b[w].x>=g&&b[w].x<=v&&b[w].y>=N&&b[w].y<=ne){const y=h.dies[w];y&&D.push(y)}if(o)for(const w of D){const y=ye(w);x.has(y)?x.delete(y):x.add(y)}else x=new Set(D.map(w=>ye(w)));Me(),ae?.(Qe())}C(),s.style.cursor="crosshair";return}if(Te){Te=!1,Ut(n,i,o,e);return}if(Ke){Ke=!1,s.style.cursor="grab";return}if(!Ce)return;if(Ce=!1,Re){Re=!1,s.style.cursor=Ge||j==="pan"?"grab":"crosshair";return}s.style.cursor=j==="pan"?"grab":"crosshair";const l=n-Oe.x,r=i-Oe.y;l*l+r*r<25&&Ut(n,i,o,e)}function Ut(e,t,n,i){for(const a of Ot)if(e>=a.x&&e<a.x+a.w&&t>=a.y&&t<a.y+a.h){Me("legend"),typeof a.bin=="number"?P({highlightBin:fi(d.highlightBin,a.bin,n)}):P({highlightMetadataValue:fi(d.highlightMetadataValue,a.bin,n)});return}if(we&&Gt(e,t,we))return;const o=Q();if(!o)return;const r=Zt((e-o.originX)/o.ppm,(o.originY-t)/o.ppm,o.snapDist)?.die??null;if(r){gi?.(r,i);const a=ye(r);n?x.has(a)?x.delete(a):x.add(a):x.size===1&&x.has(a)?x=new Set:x=new Set([a]),Me(),ae?.(Qe()),C()}else n||(x=new Set,Me(),ae?.([]),C())}function Qe(){const e=[],t=h.hoverPoints;for(let n=0;n<t.length;n++){const i=h.dies[n];i&&x.has(ye(i))&&e.push(i)}return e}function Yn(){rt&&(rt.style.display=Bt()?"flex":"none",rt.ariaLabel=x.size>0?"Chart the selected dies (or right-click)":"Chart this wafer (or right-click)")}function Wi(){const e={waferLabel:rn(),testDefs:te,isLotStack:ie.isLotStack,activeTest:d.plotMode==="value"?d.activeTest:void 0};return x.size>0?Oo(Qe(),e):Ro(re,e)}function Xn(e,t){if(!Bt())return;const n=Wi();import("./drilldown.js").then(({openDrilldownMenu:i})=>{vn||(bn=i(e,t,n,Si))})}function Nn(e){e.stopPropagation();const t=dt;if(dt=!1,!Bt()||le)return;const n=s.getBoundingClientRect();if(!t){const o=e.clientX-n.left,l=e.clientY-n.top;if(we&&Gt(o,l,we))return;const r=Q(),a=r?Zt((o-r.originX)/r.ppm,(r.originY-l)/r.ppm,r.snapDist)?.die:void 0;a&&!x.has(ye(a))&&(x=new Set([ye(a)]),Me(),ae?.(Qe()),C())}e.preventDefault();const i=t?{x:n.left+n.width/2,y:n.top+n.height/2}:{x:e.clientX,y:e.clientY};Xn(i,s)}function _n(){En(void 0),z&&Mt(p),st?.(null,new MouseEvent("mouseleave")),s.style.cursor=j==="pan"?"grab":"crosshair"}function jn(){Ce=!1,Re=!1,Pe=!1,Te=!1,Ke=!1,z&&Mt(p),st?.(null,new MouseEvent("mouseleave")),s.style.cursor=j==="pan"?"grab":"crosshair",C()}function Zt(e,t,n){const i=h.hoverPoints,o=h.rectangles;for(let c=0;c<o.length;c++){const f=o[c];if(Math.abs(e-f.x)<=f.width/2&&Math.abs(t-f.y)<=f.height/2){const g=h.dies[c];return g?{die:g,index:c}:null}}let l=null,r=-1,a=n*n;for(let c=0;c<i.length;c++){const f=i[c].x-e,g=i[c].y-t,v=f*f+g*g;v<a&&(a=v,l=h.dies[c]??null,r=c)}return l?{die:l,index:r}:null}const Kn=new L.ResizeObserver(()=>{_=null,T=null,C()});Kn.observe(s),S.height==null&&ui<=0&&on(()=>on(()=>{k.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 qe=L.matchMedia(`(resolution: ${L.devicePixelRatio}dppx)`);const yt=()=>{qe.removeEventListener("change",yt),qe=L.matchMedia(`(resolution: ${L.devicePixelRatio}dppx)`),qe.addEventListener("change",yt),C()};qe.addEventListener("change",yt);const $n=L.matchMedia("(prefers-color-scheme: dark)"),Gn=()=>C();$n.addEventListener("change",Gn);const Un=()=>{z&&Mt(p)};L.addEventListener("blur",Un);function Zn(e){if((e.key==="ContextMenu"||e.shiftKey&&e.key==="F10")&&(dt=!0),e.key==="Escape"&&x.size>0&&(x=new Set,Me(),ae?.([]),C()),(e.key==="e"||e.key==="E")&&un&&(e.stopPropagation(),(pn??Rn)()),(e.ctrlKey||e.metaKey)&&(e.key==="="||e.key==="+"?(e.preventDefault(),We(s.clientWidth/2,s.clientHeight/2,1.2)):e.key==="-"?(e.preventDefault(),We(s.clientWidth/2,s.clientHeight/2,1/1.2)):e.key==="0"&&(e.preventDefault(),bt())),!e.ctrlKey&&!e.metaKey&&!e.shiftKey){const n=Q();if(n){const i=T?.snapDist??_?.snapDist??1;let o=0,l=0;e.key==="ArrowLeft"&&(o=20,e.preventDefault()),e.key==="ArrowRight"&&(o=-20,e.preventDefault()),e.key==="ArrowUp"&&(l=20,e.preventDefault()),e.key==="ArrowDown"&&(l=-20,e.preventDefault()),(o||l)&&(T={originX:n.originX+o,originY:n.originY+l,ppm:n.ppm,snapDist:i},C())}e.key===" "&&!Ge&&(e.preventDefault(),Ge=!0,j!=="pan"&&(s.style.cursor="grab"))}}function Qn(e){e.key===" "&&(Ge=!1,Re&&(Ce=!1,Re=!1),s.style.cursor=j==="pan"?"grab":"crosshair")}s.style.cursor="crosshair",s.setAttribute("tabindex","0"),s.addEventListener("wheel",Fn,{passive:!1}),s.addEventListener("pointerdown",zn),s.addEventListener("pointermove",Hn),s.addEventListener("pointerup",Vn),s.addEventListener("pointerleave",_n),s.addEventListener("pointercancel",jn);const qn=()=>bt();s.addEventListener("dblclick",qn),s.addEventListener("keydown",Zn),s.addEventListener("keyup",Qn),s.addEventListener("contextmenu",Nn);const Jn=e=>{e.stopPropagation()};s.addEventListener("click",Jn),s.clientWidth,C(),ot?.();function bt(){_=null,T=null,C()}function Qt(){import("./userGuideHtml.js").then(e=>so({buildWaferMap:Zi,renderWaferMap,renderWaferGallery:void 0,analyzeWaferMap:qi},e.USER_GUIDE_HTML,yi,k))}return He(),{setResult(e){ie=e,K=e.wafer,re=e.dies,J=e.hbinDefs,ee=e.sbinDefs,te=e.testDefs,xe=e.metadataFields,xn=e.reticles?.length?e.reticles:void 0,ct=e.reticleConfig,wn=e.dataAxisFlip,kt=e.isLotStack,Lt=e.aggrMethod,Tt=e.lotSize,Ei(),Wt(),C(),U&&me()},setOptions(e){In(e)},getOptions(){return{...d}},resetZoom:bt,setSelection(e){x=new Set(e.map(t=>ye(t))),C()},clearSelection(){x=new Set,Me(),ae?.([]),C()},setFindingsNotice(e){Bn=e,U?me():O&&Ze()},setStatsSummary(e){if(ge=e,Dt(),Ht(),U)me();else if(O)Ze();else if(e&&!Ye?.placement){const t=Ye?.defaultOpen??!Ve;O=sn("right",be,p),O.style.display=t?"block":"none";const n=M.parentElement,i=M.nextSibling;de=ln(M,O,"right"),n?.insertBefore(de,i),Ze()}gt()},closeSummaryPanel(){On(!1)},getExportTitle(){return dn()},getSaveImageHook(){return ue.onSaveImage},drawPendingNow:An,getBinColors(){return h.binColors},setSummaryVisible(e){Z&&(Z.style.display=e?"flex":"none")},setViewControlsVisible(e){R&&(R.style.display=e?"flex":"none")},setExpandVisible(e){se&&(se.style.display=e?"flex":"none")},openUserGuide:Qt,setInsightsOpen(e){_e(e),X&&(e?(X.dataset.active="1",X.style.background=E.bgActive,X.style.color=E.iconActive):(delete X.dataset.active,X.style.background="transparent",X.style.color=E.icon))},destroy(){vn=!0;for(const e of Ue.values())e.cancel();Ue.clear(),Ee?.close(),Ln?.()?.remove(),Vt&&p.removeEventListener("click",Vt,!0),s.removeEventListener("wheel",Fn),s.removeEventListener("pointerdown",zn),s.removeEventListener("pointermove",Hn),s.removeEventListener("pointerup",Vn),s.removeEventListener("pointerleave",_n),s.removeEventListener("pointercancel",jn),s.removeEventListener("dblclick",qn),s.removeEventListener("keydown",Zn),s.removeEventListener("keyup",Qn),s.removeEventListener("contextmenu",Nn),bn?.(),s.removeEventListener("click",Jn),Kn.disconnect(),Kt?.disconnect(),qe.removeEventListener("change",yt),$n.removeEventListener("change",Gn),L.removeEventListener("blur",Un),Ci(),z&&Mt(p),ce?.remove(),Se&&(Se.parentElement?.insertBefore(M,Se),Se.remove()),de&&(de.parentElement?.insertBefore(M,de),de.remove()),M.remove(),s.style.cursor="",G?.destroy(),$?.destroy(),ze.remove()}}}
1
+ import{createViewSwitch as Ji}from"./viewSwitch.js";import{createSummaryRail as eo}from"./summaryRail.js";import{buildView as to,buildHoverText as no,findTestDef as Lt,resolveTestNumber as gn,buildMapTitle as io}from"../renderer/buildView.js";import{drawMapCanvas as oo,BIN_LEGEND_W as pi,BIN_LEGEND_W_COMPACT as lo,BIN_LEGEND_ADAPT_COMPACT as so,BIN_LEGEND_ADAPT_FLOATING as ao,PATH_SHAPES as ro}from"./toCanvas.js";import{buildWaferMap as co,getTestPassStatus as fo,isParametricTest as mn}from"../renderer/buildWaferMap.js";import{analyzeWaferMap as po}from"../stats/analyzeWaferMap.js";import{SHADOW as uo,LEADING as ui,wireControlHover as hi,SPACE as X,EDGE_GUTTER as ho,RADIUS as gi,FONT as Pt,CLR as k,applyOverlayZ as go,getTooltip as mi,hideTooltip as Tt,positionTooltip as yi,createToolbarHelpers as mo,buildModeMenuEl as yo,openReparentedModal as bo,makePaletteBtn as vo,makeLogScaleBtn as xo,makeLegendStyleBtn as wo,makeOverlaysBtn as Co,makeOrientationBtn as So,menuLayerFor as bi,saveImageBlob as Mo,markMenuTrigger as it,wireMenuA11y as vi,wireExpandToggle as Eo,nextFrame as yn,requestedPassFailDisplay as Do,overlayMenuRows as ko,anyOverlayActive as Bo,openCompactDiagnostics as Lo,roomForPanel as Po,logWmapVersionOnce as To,buildDataModeEntries as Oo,metadataKeyHasData as Ro,metadataModeEntry as Wo}from"./toolbar.js";import{openUserGuideWindow as Io}from"./guideWindow.js";import{waferIdentityLabel as Fo}from"../core/waferLabel.js";import{metadataDisplayValue as Ao}from"../core/metadata.js";import{withExportContext as zo}from"./exportName.js";import{createSummaryPanelEl as bn,wrapWithSummaryPanel as vn,renderWaferSummaryContentSteps as Ho}from"./summaryPanel.js";import{runChunked as Vo}from"./chunked.js";import{collectWarnings as Yo,buildWarningsMenuEl as Xo,severityOf as No}from"./warnings.js";import{plotStoreFor as $o}from"./plotStore.js";import{selectionPopulation as jo,waferPopulation as Ko}from"./chartPopulation.js";import{sourceFromBins as xi}from"./plotItems.js";import{createIdentityHeader as _o,collapsedLabel as xn}from"./identityHeader.js";import{getDieKey as re,hasPosition as wi,isPositionedDie as Go}from"../core/dies.js";import{buildDieListSection as Uo}from"./dieList.js";import{buildMaplessSummary as Zo}from"./maplessSummary.js";import{resolveBinColors as Qo,binColorWarning as qo}from"../renderer/binColors.js";import{requirePassBins as Jo}from"../core/passBins.js";import{requireRingCount as ot}from"../core/ringCount.js";import{asList as el,toggleHighlight as Ci}from"../core/utils.js";import{buildCompactMap as tl,compactLayoutOffered as nl}from"../core/compact.js";const Si=new Set(["binColorScheme","valueColorScheme","reverseValueScheme","useDefinedBinColors","rotation","flipX","flipY","showDieLabels","showRingBoundaries","showQuadrantBoundaries","showReticle","showXYIndicator","compact","showAxes","legendPosition","logScale","colorbarRangeMode","markFailingDies","fallbackFormat"]);export const COLOR_KEYS=["binColorScheme","valueColorScheme","reverseValueScheme","useDefinedBinColors","binColors"];export function classifyChanged(P){const m=P.some(p=>Si.has(p)),S=P.some(p=>!Si.has(p));return m&&S?"mixed":m?"preference":"state"}export function findingBin(P){const{kind:m,bin:S}=P.variable;return m==="hardBin"||m==="softBin"?S:void 0}export function toPublicViewOptions(P){const{metadataValueOrder:m,binColors:S,lotSize:p,compactMap:T,...lt}=P;return lt}export function renderWaferMap(P,m,S={}){return renderWaferMapCard(P,m,S)}export function renderWaferMapCard(P,m,S={}){To();const p=P.ownerDocument,T=p.defaultView??window,lt=()=>F.label,Ot=()=>Fo({label:lt(),wafer:U}),oe=zo(()=>{const e=Ao(U.metadata?.lot);return{prefix:S.downloadFilename,lots:e!==void 0?[e]:[],...F.isLotStack?{stackedWafers:g?.lotSize??!0}:{wafer:Ot()}}},S.onSaveImage,S.onSaveText);function wn(){const e=g.plotMode==="softBin"||g.plotMode==="stackedSoftBins"?te:ee,{primary:t,secondary:n}=io(g,c.fallbackFormat,e);return[t,F.isLotStack?"":n].filter(Boolean).join(" ")||"wafer-map"}T.getComputedStyle(P).position==="static"&&(P.style.position="relative");const Mi=P.clientHeight;S.height!=null&&(P.style.height=typeof S.height=="number"?`${S.height}px`:S.height);const Rt=m.dataCoverage?m.dataCoverage.unpositionedDies:m.dies.filter(e=>!wi(e)).length,Ye=(m.dataCoverage?m.dataCoverage.totalDies:m.dies.length-Rt)===0&&Rt>0,Xe=p.createElement("div");Object.assign(Xe.style,{display:"flex",flexDirection:"column",width:"100%",height:"100%"}),P.appendChild(Xe);const Le=p.createElement("div");Object.assign(Le.style,{position:"relative",width:"100%",flex:"1 1 auto",minHeight:"0"});const be=S.chromeInset??ho,G=p.createElement("div");Object.assign(G.style,{display:"flex",alignItems:"stretch",gap:X.sm,background:k.canvasBg,paddingBottom:X.lg,paddingTop:be,paddingLeft:be,paddingRight:be,flexShrink:"0",minWidth:"0"}),Xe.appendChild(G),Xe.appendChild(Le);function Ne(){const e=[...G.children].some(t=>t.style.display!=="none");G.style.display=e?"flex":"none"}const M=p.createElement("div");Object.assign(M.style,{position:"relative",width:"100%",height:"100%"});const a=p.createElement("canvas");Object.assign(a.style,{width:"100%",height:"100%",display:"block"}),M.appendChild(a),Le.appendChild(M);let st=null;if(Rt>0){let n=function(){if(t){const d=Uo(e,m.testDefs,{...S.dieList,onSaveText:oe.onSaveText,waferMetadata:U.metadata,metadataFields:xe,ownerDocument:p});if(d)return d}const o=Lt(m.testDefs,c.activeTest??0),l=mn(o)?c.logScale??o?.logScale??!1:!1;return Zo(e,m.testDefs,{plotMode:c.plotMode??"hardBin",activeTest:c.activeTest,hbinDefs:ee,sbinDefs:te,binColors:g.binColors,valueColorScheme:c.valueColorScheme,reverseValueScheme:c.reverseValueScheme,logScale:l,colorbarRangeMode:c.colorbarRangeMode,valueRangeDies:m.dies})},i=function(o){const l=p.createElement("button");return l.type="button",hi(l),Object.assign(l.style,{fontSize:Pt.body,padding:`${X.xxs} ${X.sm}`,borderRadius:gi.control,flexShrink:"0",border:`1px solid ${k.menuBorder}`,background:k.menuBg,color:k.text,cursor:"pointer"}),l.textContent=t?"View chart":"View die list",l.addEventListener("click",d=>{d.stopPropagation(),t=!t,l.textContent=t?"View chart":"View die list",o()}),l};const e=m.dies.filter(o=>!wi(o));let t=!1;if(Ye){const o=p.createElement("div");Object.assign(o.style,{position:"absolute",inset:"0",background:k.panelBg,padding:X.xl,boxSizing:"border-box",overflow:"hidden",display:"flex",flexDirection:"column",gap:X.md,zIndex:"1"});const l=p.createElement("div");Object.assign(l.style,{display:"flex",justifyContent:"space-between",alignItems:"flex-start",gap:X.md});const d=p.createElement("span");Object.assign(d.style,{fontSize:Pt.body,color:k.label,lineHeight:ui.base}),d.textContent="No die position data for this wafer.",l.appendChild(d);const s=p.createElement("div");Object.assign(s.style,{flex:"1",minHeight:"0",overflow:"auto",display:"flex",flexDirection:"column"}),l.appendChild(i(()=>s.replaceChildren(n()))),o.appendChild(l),o.appendChild(s),M.appendChild(o),st=()=>{t||s.replaceChildren(n())}}else{const o=p.createElement("div");Object.assign(o.style,{position:"absolute",left:"0",right:"0",bottom:"0",zIndex:"3",background:k.panelBg,borderTop:`1px solid ${k.menuBorder}`,fontSize:Pt.body,color:k.text,cursor:"pointer",padding:`${X.xs} ${X.md}`,display:"flex",alignItems:"center",justifyContent:"space-between",gap:X.md}),hi(o,"bare");const l=p.createElement("span");l.textContent=`+${e.length} ${e.length===1?"die":"dies"} without position data`,o.appendChild(l);const d=p.createElement("span");d.textContent="\u25BE",Object.assign(d.style,{fontSize:Pt.body,lineHeight:ui.none,color:k.label,flexShrink:"0"}),o.appendChild(d),o.setAttribute("aria-expanded","false"),o.setAttribute("aria-label",`${e.length} dies without position data. Click to view.`);let s=null,r=null;Eo(o,f=>{if(d.textContent=f?"\u25B4":"\u25BE",o.setAttribute("aria-expanded",String(f)),f){s=p.createElement("div");const u=o.getBoundingClientRect().height||28;Object.assign(s.style,{position:"absolute",left:"0",right:"0",bottom:`${u}px`,top:"20%",zIndex:"2",background:k.panelBg,borderTop:`1px solid ${k.menuBorder}`,padding:X.md,boxSizing:"border-box",display:"flex",flexDirection:"column",gap:X.md}),s.addEventListener("click",W=>W.stopPropagation());const b=p.createElement("div");Object.assign(b.style,{display:"flex",justifyContent:"flex-end"}),b.appendChild(i(()=>{r&&r.replaceChildren(n())})),s.appendChild(b),r=p.createElement("div"),Object.assign(r.style,{flex:"1",minHeight:"0",overflow:"auto",display:"flex",flexDirection:"column"}),r.appendChild(n()),s.appendChild(r),M.appendChild(s)}else s&&(s.remove(),s=null,r=null)}),M.appendChild(o),st=()=>{r&&!t&&r.replaceChildren(n())}}}const{onHover:at,onClick:Ei,onSelect:de,onViewOptionsChange:Di,showTooltip:ki=!0,showToolbar:Pe=!0,showIdentity:Cn=!0,summaryPanel:$e,showHelpButton:Sn=!1,userGuideExtension:Bi,onExpand:Mn,showExpandButton:En=!0,zIndex:Li,insights:Te,warnings:Dn,viewOptions:Pi={},...Oe}=S,rt=Te?.enabled??Pe;let dt=null;rt&&(dt=Ji(p,"Map","wafer",e=>Ke(e)),Pe||(dt.el.style.marginLeft="auto"),G.appendChild(dt.el));const Ti=.4,Oi=20,Re=[...Jo(m,"renderWaferMap")],kn=Dn?.display??!0,Ri=go(Li);let ce=S.statsSummary,he=[],Bn=!1,ct=null,Ln=!1;function Wt(){const e=Yo({result:m,statsSummary:ce,extra:ct?[ct]:[]}),t=e.length!==he.length||e.some((n,i)=>n.code!==he[i]?.code||n.message!==he[i]?.message);he=e,(t||!Bn)&&(Bn=!0,Dn?.onWarning?.(e))}Wt();let F=m,U=m.wafer,le=m.dies,x=new Set,ve=null;const It=Te?.plotStore??$o(Te),ft={plots:It,onSaveImage:oe.onSaveImage,onSaveText:oe.onSaveText,onLocateDie:e=>Mt(e)},pt=()=>!Ye;let Ft=null,ut=null,ht=!1,At=!1,ee=m.hbinDefs,te=m.sbinDefs,Z=m.testDefs,xe=m.metadataFields,Pn=m.reticles?.length?m.reticles:void 0,gt=m.reticleConfig,Tn=m.dataAxisFlip,zt=m.isLotStack??!1,Ht=m.aggrMethod,Vt=m.lotSize,Q=null,se=null,ae=null;Cn&&(Q=_o(xn(U.metadata??{},je())??"",U.metadata,{lotStack:je(),ownerDocument:p}),M.appendChild(Q.metaPanel),Q.metaPanel.style.visibility="visible",Q.isEmpty()||(se=On(Q.wrap),G.insertBefore(se,G.firstChild),Ne()));function On(e){const t=p.createElement("div");return Object.assign(t.style,{display:"flex",alignItems:"center",padding:`${X.sm} ${X.lg}`,flex:"1 1 auto",minWidth:"0",overflow:"hidden",gap:X.sm}),Object.assign(e.style,{flex:"1",minWidth:"0"}),t.appendChild(e),t}function je(){return zt?{lotSize:Vt??1,aggrMethod:Ht}:void 0}function Wi(){if(!Q)return;Q.update(xn(U.metadata??{},je())??"",U.metadata,je());const e=se?.isConnected??!1,t=!Q.isEmpty();!t&&e?(se.remove(),se=null):t&&!e&&(se=On(Q.wrap),se.style.display="",G.insertBefore(se,G.firstChild),Ne())}const Ii=[...ee??[],...te??[]].some(e=>e.color);let c={plotMode:"hardBin",showDieLabels:!1,showRingBoundaries:!1,showQuadrantBoundaries:!1,showReticle:!1,showXYIndicator:!1,compact:!1,rotation:0,flipX:!1,flipY:!1,legendPosition:"default",...Pi},q=null,ge=!1,Rn=null;function Fi(){return rt?q?Promise.resolve(q):(Rn??=import("./insightsTab.js").then(({createInsightsTab:e})=>(q=e({getItems:()=>[{wafer:U,dies:le,hbinDefs:ee,sbinDefs:te,testDefs:Z,label:lt(),passBins:Re,statsSummary:ce}],getBinColors:()=>g.binColors,getRingCount:()=>ot(F,"renderWaferMap"),onSaveImage:oe.onSaveImage,onSaveText:oe.onSaveText,defaultView:Te?.defaultView,plotStore:It,onPickPlotsFile:Te?.onPickPlotsFile,showMetadataStrip:!1,contentInset:be,onOpenGuide:Sn&&!Pe?()=>fn():void 0,focusTest:t=>{O({plotMode:"value",activeTest:t,highlightBin:void 0}),Ke(!1)},locateDie:t=>{Ke(!1),Mt(t)},ownerDocument:p}),Object.assign(q.el.style,{position:"absolute",inset:"0",background:k.canvasBg,overflowY:"auto",paddingTop:"0"}),q.el.style.display="none",Le.appendChild(q.el),q)),Rn):Promise.resolve(null)}let Wn=0;const Yt=["wheel","touchstart","pointerdown","keydown"];function Ai(e,t){if(t<=0)return;let n=!1;const i=[],o=()=>{n=!0;for(const d of i)T.clearTimeout(d);i.length=0;for(const d of Yt)e.removeEventListener(d,o)},l=()=>n||!ge?!0:(e.scrollTop=t,e.scrollTop>=t);if(!l()){for(const d of Yt)e.addEventListener(d,o,{passive:!0,once:!0});for(const d of[0,50,150,300,600])i.push(T.setTimeout(()=>{l()},d));i.push(T.setTimeout(()=>{for(const d of Yt)e.removeEventListener(d,o)},700))}}function Ke(e){if(!rt)return;const t=ge;ge=e,dt?.setInsightsOpen(e),q&&!e&&t&&(Wn=q.el.scrollTop),q&&(q.el.style.display=e?"flex":"none"),M.style.visibility=e?"hidden":"",V&&(V.style.display=e||Ye?"none":"flex"),R&&(R.style.display=e?"none":"flex"),ae&&(ae.style.display=De?"none":"flex"),fe&&(fe.style.display="flex"),se&&(se.style.display=""),Ne(),Q&&e&&Q.collapse(),wt(),e&&Fi().then(n=>{!n||!ge||(n.el.style.display="flex",n.render(),Ai(n.el,Wn))})}rt&&Te?.defaultOpen&&queueMicrotask(()=>Ke(!0));let g,we,K=null,B=null,mt=[],Xt;function In(e){Xt!==e&&(Xt=e,w())}let Ce=null,Nt=Oe.legendOffset??{x:0,y:0},_e=!1,We=!1,Ge={x:0,y:0},$t={x:0,y:0},Se=!1,Ie=!1,_="select",Fe={x:0,y:0},yt={x:0,y:0},A={x:0,y:0},z={x:0,y:0},Ue=!1,Ae=!1;function jt(){const e=c,t=le.filter(Go);g=to(U,t,{compact:c.compact?c.compactMap??tl(t):void 0,plotMode:e.plotMode,binColorScheme:e.binColorScheme,valueColorScheme:e.valueColorScheme,reverseValueScheme:e.reverseValueScheme,useDefinedBinColors:e.useDefinedBinColors,binColors:e.binColors??Qo(le,{passBins:Re,binColorScheme:e.binColorScheme,hbinDefs:ee,sbinDefs:te,useDefinedBinColors:e.useDefinedBinColors}),passBins:Re,showDieLabels:e.showDieLabels,showRingBoundaries:e.showRingBoundaries,showQuadrantBoundaries:e.showQuadrantBoundaries,showReticle:e.showReticle,showXYIndicator:e.showXYIndicator,reticles:Pn,ringCount:ot(F,"renderWaferMap"),highlightBin:e.highlightBin,highlightMetadataValue:e.highlightMetadataValue,activeTest:e.activeTest,activeMetadataKey:e.activeMetadataKey,testDefs:Z,valueRange:e.valueRange,metadataValueOrder:e.metadataValueOrder,logScale:e.logScale,isLotStack:zt,aggregationMethod:Ht??e.aggregationMethod,lotSize:Vt??e.lotSize,dataAxisFlip:Tn,colorbarRangeMode:e.colorbarRangeMode,passFailDisplay:e.passFailDisplay,fallbackFormat:e.fallbackFormat,interactiveTransform:{rotation:e.rotation??0,flipX:e.flipX??!1,flipY:e.flipY??!1}},{hbinDefs:ee,sbinDefs:te,metadataFields:xe}),we=void 0;const n=e.binColors?null:qo(g.binColors,g.plotMode);n?.message!==ct?.message&&(ct=n,Wt(),Ln&&Ut())}jt();function Fn(){return c.showAxes??Oe.showAxes??B!==null}function zi(){return nl(le,[gt])}let N=null,me=null,Me=null,An=S.findingsNotice,Hi={},L=null,ne=null;function Vi(e){const{kind:t,index:n}=e.variable;O(t==="test"?{plotMode:"value",activeTest:n??0,highlightBin:void 0}:{plotMode:t==="softBin"?"softBin":"hardBin",highlightBin:findingBin(e)});const i=e.highlight;(i.kind==="bin"||i.kind==="region"||i.kind==="dies")&&Yn(i.dieKeys)}const Ze=new Map,Kt=new WeakSet;function _t(e){if(Ze.get(e)?.cancel(),Ze.delete(e),e.style.display==="none"){Kt.add(e);return}Kt.delete(e);const t=Vo(Ho(e,{wafer:U,dies:le,yieldSummary:F.yield,dataCoverage:F.dataCoverage,hbinDefs:ee,sbinDefs:te,testDefs:Z,statsSummary:ce,warnings:kn?he:[],passBins:Re,ringCount:ot(F,"renderWaferMap"),binColors:g.binColors,plotMode:c.plotMode??"hardBin",metadataShownElsewhere:Cn,fallbackFormat:c.fallbackFormat,activeFindingId:Me,findingsFilter:Hi,findingsNotice:An,onFindingsFilterChange:ye,onSaveText:oe.onSaveText,metadataFields:xe,dieListOptions:S.dieList,onLocateDie:n=>Mt(n),onFindingClick:(n,i)=>{Me===n.id?(Me=null,Yn([]),O({highlightBin:void 0})):(Me=n.id,Vi(n)),ye()}}));t.done||Ze.set(e,t)}function ye(){N&&_t(N)}function Qe(){L&&_t(L)}let bt=null;function Gt(e,t){t!=="right"&&t!=="left"||(bt=eo(p,t,()=>tn(!0)),e.appendChild(bt.el))}function zn(){if(!bt)return;const e=N??L,t=e?e.style.display!=="none":!0,n=!!j&&j.style.display!=="none";bt.sync(n&&!t,!!ce?.hasNotableFindings)}if($e?.placement){const e=$e.placement;N=bn(e,be,p,rn);const t=M.parentElement,n=M.nextSibling;me=vn(M,N,e),Gt(me,e),t?.insertBefore(me,n),ye()}else if(ce){const e=$e?.defaultOpen??!Pe;L=bn("right",be,p,rn),L.style.display=e?"block":"none";const t=M.parentElement,n=M.nextSibling;ne=vn(M,L,"right"),Gt(ne,"right"),t?.insertBefore(ne,n),Qe()}const H=ki?mi(p):null;let fe=null,$=null,V=null,R=null,vt=null,j=null,Hn=null,pe=null,xt=null;Ln=!0;function Ut(){if(!pe||!xt)return;const e=he.length,t=e>0;if(pe.style.display=t?"flex":"none",xt.style.display=t?"":"none",!t)return;const n=No(he[0]),i=`${e} data ${e===1?"warning":"warnings"}`;pe.style.color=n==="error"?k.errText:k.warnText,pe.ariaLabel=n==="error"?`${i} \u2014 the map may be positionally wrong`:i}let Zt=null,Vn=null,Qt=null,qt=null,Jt=null,en=null;function Ee(e="selection"){Me!==null&&(Me=null,e==="selection"?O({highlightBin:void 0}):(x=new Set,de?.([])),ye())}function Yn(e){x=new Set(e??[]),de&&de(Ve()),w()}function wt(){if(!j)return;const e=!!(N??L);j.style.display=ce&&e&&!ge?"flex":"none";const t=N??L,n=t?t.style.display!=="none":!1;ce?.hasNotableFindings&&!n?j.style.color=k.findingIndicator:j.dataset.active||(j.style.color=k.icon),zn()}let Xn=null;function tn(e){const t=N??L;if(!t)return;const n=t.style.display!=="none",i=M.getBoundingClientRect().width;if(t.style.display=e?"block":"none",e!==n){const o=i-M.getBoundingClientRect().width;(S.onSummaryPanelChange??Ct)?.(e,e?o:0)}e&&Kt.has(t)&&_t(t),j&&Xn?.(j,e),wt()}if(Pe){let u=function(y){_=y,i(W,y==="zoom"),i(C,y==="pan"),vt&&i(vt,y==="select"),a.style.cursor=y==="pan"?"grab":"crosshair"};fe=p.createElement("div"),fe.dataset.wmapToolbar="single",Object.assign(fe.style,{marginLeft:"auto",flexShrink:"0",display:"flex",flexDirection:"row",alignItems:"center",flexWrap:"wrap-reverse",justifyContent:"flex-end",maxWidth:"100%",background:k.menuBg,border:`1px solid ${k.menuBorder}`,borderRadius:gi.control,boxShadow:uo.panel,pointerEvents:"auto"});const e=mi(p),t=mo(e),{makeBtn:n,setActive:i,makeSep:o,makeMenuRow:l,makeMenuSection:d,closeOpenMenu:s,getOpenMenu:r,setOpenMenu:f}=t;Xn=i,Zt=s,Vn=r,p.addEventListener("click",s,!0),V=p.createElement("div"),Object.assign(V.style,{display:Ye?"none":"flex",alignItems:"center",gap:"0",flexWrap:"wrap",justifyContent:"flex-end"}),fe.appendChild(V);const b=n("download","Download PNG",Ki);V.appendChild(b),V.appendChild(o());const W=n("zoomMode","Zoom (drag to zoom region)",()=>u("zoom")),ie=n("zoomIn","Zoom in",()=>He(a.clientWidth/2,a.clientHeight/2,1.2)),v=n("zoomOut","Zoom out",()=>He(a.clientWidth/2,a.clientHeight/2,1/1.2)),E=n("reset","Reset zoom (double-click)",()=>Je());V.appendChild(W),V.appendChild(ie),V.appendChild(v),V.appendChild(E),V.appendChild(o());const C=n("pan","Pan (drag to move)",()=>u("pan"));V.appendChild(C),vt=n("boxSelect","Select (drag to select dies)",()=>u("select")),V.appendChild(vt);{const y=n("drilldown","Chart this wafer",()=>{const Y=y.getBoundingClientRect();dn({x:Y.left,y:Y.bottom+4},y)});y.setAttribute("aria-haspopup","menu"),ut=y,qn(),V.appendChild(y)}u(_);{let y=function(h){return h.plotMode!==(c.plotMode??"hardBin")?!1:h.plotMode==="value"?(c.activeTest??0)===(h.activeTest??0):h.plotMode==="metadata"?c.activeMetadataKey===h.activeMetadataKey:!0},Y=function(h,D){h.activeTest!==void 0?O({plotMode:h.plotMode,activeTest:h.activeTest,activeMetadataKey:void 0,logScale:h.logScale}):h.activeMetadataKey!==void 0?O({plotMode:h.plotMode,activeTest:void 0,activeMetadataKey:h.activeMetadataKey,passFailDisplay:"off"}):O({plotMode:h.plotMode,activeTest:void 0,activeMetadataKey:void 0,passFailDisplay:"off"}),D.remove(),f(null),it(I,!1)};$=p.createElement("div"),Object.assign($.style,{display:"flex",alignItems:"center",gap:"0",flexWrap:"wrap",justifyContent:"flex-end"}),fe.appendChild($),R=p.createElement("div"),Object.assign(R.style,{display:"flex",alignItems:"center",gap:"0"}),$.appendChild(R),R.appendChild(o());const ue=()=>{const h=r();h&&(h.remove(),f(null)),it(I,!1)},I=n("mode","Plot mode",()=>{if(r()){ue();return}const h=le,D=g.testDefs,{testEntries:Bt,binEntries:ke,stackedEntries:tt}=Oo(h,D,{includeStacked:g.isLotStack}),hn=(xe??[]).filter(Be=>Ro(h,Be.key)).map(Wo),nt=yo(I.getBoundingClientRect(),Bt,ke,tt,y,Y,{makeMenuRow:l,makeMenuSection:d},c.plotMode??"hardBin",I.ownerDocument.defaultView??window,hn);bi(I).appendChild(nt),f(nt),it(I,!0),vi(nt,I,ue)});it(I,!1);const{btn:Dt,sync:et}=vo(t,()=>({...c,plotMode:c.plotMode??"hardBin"}),()=>Ii,O);qt=et,qt();const pn=Co(t,()=>{const h=!!g.hasReticle,D=(c.plotMode??"hardBin")==="value",{testNumber:Bt}=gn(c.activeTest??0,g.testDefs),ke=Lt(g.testDefs,Bt),tt=D&&ke!==void 0&&!mn(ke),hn=D&&!tt&&(ke?.limitLow!==void 0||ke?.limitHigh!==void 0),nt=D&&!tt&&g.dies.some(Be=>fo(Be,Bt,ke)!==void 0);return ko({...c,showAxes:Fn()},h,{functionalActive:tt,hasLimits:hn,hasRecorded:nt,binMode:(c.plotMode??"hardBin")==="hardBin"||(c.plotMode??"hardBin")==="softBin"},Be=>O(Be),{on:!!c.compact,offered:zi(),onChange:Be=>O({compact:Be}),onDiagnostics:()=>Lo(le,[gt],{anchor:a,onSaveText:oe.onSaveText})})},()=>Bo(c)),{btn:un,sync:Gi}=wo(t,()=>c,h=>O({legendPosition:h}));Qt=Gi,Qt();const fi=()=>{const{testNumber:h}=gn(c.activeTest??0,Z),D=Lt(Z,h);return D!==void 0&&!mn(D)},{btn:Ui,sync:Zi}=xo(t,()=>({...c,functionalActive:fi()}),h=>O(h));Jt=Zi,Jt();const Qi=()=>{const{testNumber:h}=gn(c.activeTest??0,Z),D=Lt(Z,h);return D!==void 0&&(D.limitLow!==void 0||D.limitHigh!==void 0)},kt=n("specRange","Colorbar range: test limits",()=>{const h=c.colorbarRangeMode==="data"?"spec":"data";O({colorbarRangeMode:h})});en=()=>{const h=c.plotMode==="value"&&Qi()&&Do(c)==="off"&&!fi();kt.style.display=h?"":"none";const D=(c.colorbarRangeMode??"spec")==="spec";i(kt,D),kt.ariaLabel=D?"Colorbar range: test limits (click for data range)":"Colorbar range: data range (click for test limits)"},en();const qi=So(t,()=>c,h=>O(h));R.appendChild(I),R.appendChild(Dt),R.appendChild(Ui),R.appendChild(kt),Ye||(R.appendChild(o()),R.appendChild(pn),R.appendChild(o()),R.appendChild(un),R.appendChild(o()),R.appendChild(qi)),ce&&(j=n("findings","Summary panel",()=>{const h=N??L;h&&tn(h.style.display==="none")}),$.appendChild(o()),$.appendChild(j),L?.style.display!=="none"&&i(j,!0),wt()),kn&&(xt=o(),pe=n("warning","Data warnings",()=>{const h=r();if(s(new MouseEvent("click")),h)return;const D=Xo(pe.getBoundingClientRect(),he,T);bi(Le).appendChild(D),f(D),vi(D,pe,()=>s(new MouseEvent("click")))}),it(pe,!1),$.appendChild(xt),$.appendChild(pe),Ut()),En&&($.appendChild(o()),ae=n("expand","Expand (E)",Mn??Nn),$.appendChild(ae)),Sn&&($.appendChild(o()),Hn=n("help","User guide",()=>fn()),$.appendChild(Hn))}G.appendChild(fe),Ne()}let De=null,Ct=null;function Nn(){De&&(De.close(),De=null);const e=Le;e.style.flex="1",e.style.minWidth="0",e.style.minHeight="0";const t=xn(U.metadata??{},je()),n=G.childElementCount>0?[G,e]:[e],i=bo(n,{ownerDocument:p,boxSize:ge?{width:"min(96vw, 1600px)",height:"min(92vh, 1000px)"}:void 0,onClosed:()=>{De=null,Ct=null,ae&&(ae.style.display="flex"),ge||a.focus({preventScroll:!0})}});if(!i)return;i.box.setAttribute("aria-label",t??"Expanded wafer map"),n.length>1&&(i.contentWrap.style.flexDirection="column"),De=i,Ct=Po(i);const o=N??L,l=me??ne;if(o&&l&&o.style.display!=="none"){const d=parseFloat(p.defaultView?.getComputedStyle(l).columnGap??"")||0,s=o.getBoundingClientRect().width+d;s>0&&Ct(!0,s)}ae&&(ae.style.display="none")}function $n(e){("binColorScheme"in e||"useDefinedBinColors"in e)&&!("binColors"in e)&&c.binColors!==void 0&&(e={...e,binColors:void 0});const t=c.plotMode;c={...c,...e},("compact"in e||"compactMap"in e)&&(K=null,B=null),e.plotMode!==void 0&&e.plotMode,Object.keys(e).every(l=>l==="legendPosition"||l==="showLegend"||l==="markFailingDies"||l==="showAxes")||jt(),Qt?.(),qt?.(),Jt?.(),en?.(),w();const i=e.plotMode!==void 0&&e.plotMode!==t,o=COLOR_KEYS.some(l=>l in e);(o||i)&&(ye(),Qe()),(o||i||e.activeTest!==void 0||e.logScale!==void 0||e.colorbarRangeMode!==void 0)&&st?.()}function O(e){$n(e);const t=Object.keys(e);Di?.(c,t,classifyChanged(t))}let nn=!1;const on=S.drawWhenVisible&&T.IntersectionObserver?new T.IntersectionObserver(e=>{ze=e[e.length-1].isIntersecting,ze&&St&&w()},{rootMargin:"25%"}):null;let ze=on===null,St=!1;on?.observe(a);function ln(){nn||(nn=!0,yn(()=>{nn=!1,w()},T))}function w(){if(!ze){St=!0;return}St=!1;const e=B??void 0,t=g.dies[0],n=t?{x:t.width,y:t.height}:Oe.diePitchMm,i=Math.floor(a.clientWidth||a.width),o=!!(ee?.length||te?.length||g.dies.some(b=>b.hbin!=null||b.sbin!=null)),l=c.legendPosition??"default",d=c.showLegend??!0,s=l==="default"||l==="compact",r=(Oe.colorbarWidth??16)+28,f=o&&s?l!=="default"?Math.max(pi,r):i<ao?0:i<so?Math.max(lo,r):Math.max(pi,r):void 0,u=oo(a,g,{...Oe,minRightReserve:d?f:0,showColorbar:d&&(Oe.showColorbar??!0),markFailingDies:c.markFailingDies??!1,legendPosition:l,legendOffset:Nt,diePitchMm:n,fallbackFormat:c.fallbackFormat,showAxes:Fn(),viewport:e,activeBin:c.plotMode==="metadata"?c.highlightMetadataValue:c.highlightBin,hoverBin:Xt,afterDies:x.size>0||ve!==null?Yi:void 0,hbinDefs:ee,sbinDefs:te,metadataFields:xe});mt=u.binLegendRows,Ce=u.legendBox??null,B===null&&(K=u.viewport),Ie&&ji(),qn()}function Yi(e,t,n){x.size>0&&Ni(e,t,n),ve!==null&&Xi(e,t,n)}function Xi(e,t,n){we??=new Map(g.dies.map((b,W)=>[re(b),W]));const i=ve===null?void 0:we.get(ve);if(i===void 0)return;const o=g.hoverPoints[i],l=g.rectangles[0],d=l?l.width/2*t.ppm:t.ppm*.5,s=l?l.height/2*t.ppm:t.ppm*.5,r=t.originX+o.x*t.ppm,f=t.originY-o.y*t.ppm,u=Math.max(d,s)*1.25+5;e.save(),e.setLineDash([]),e.beginPath(),e.arc(r,f,u,0,Math.PI*2),e.strokeStyle=n.background,e.lineWidth=6,e.stroke(),e.strokeStyle=n.text,e.lineWidth=3,e.stroke(),e.restore()}function Mt(e){if(ve=e===null?null:re(e),e!==null&&B!==null){Je();return}w()}function jn(){ve!==null&&(ve=null,w())}function Ni(e,t,n){const i=g.hoverPoints,o=g.rectangles[0],l=o?o.width/2*t.ppm:t.ppm*.5,d=o?o.height/2*t.ppm:t.ppm*.5,s=new Set;x.size>0&&(we??=new Map(g.dies.map((v,E)=>[re(v),E])));for(const v of x){const E=we.get(v);E!==void 0&&s.add(E)}if(!s.size)return;e.save(),e.setLineDash([]),e.fillStyle=n.background,e.globalAlpha=.7;let r=0;e.beginPath();for(let v=0;v<i.length;v++)s.has(v)||(e.rect(t.originX+i[v].x*t.ppm-l,t.originY-i[v].y*t.ppm-d,l*2,d*2),++r===ro&&(e.fill(),e.beginPath(),r=0));r&&e.fill(),e.globalAlpha=1;const{cw:f,ch:u}=$i(t,l,d),b=new Map,W=v=>Math.round(v*100),ie=(v,E,C,y)=>{const Y=`${W(v)},${W(E)},${W(C)},${W(y)}`;b.has(Y)?b.delete(Y):b.set(Y,[v,E,C,y])};for(const v of s){const E=t.originX+i[v].x*t.ppm,C=t.originY-i[v].y*t.ppm,y=E-f,Y=E+f,ue=C-u,I=C+u;ie(y,ue,Y,ue),ie(y,I,Y,I),ie(y,ue,y,I),ie(Y,ue,Y,I)}e.strokeStyle=n.text,e.lineWidth=2,e.lineCap="square",e.beginPath();for(const[v,E,C,y]of b.values())e.moveTo(v,E),e.lineTo(C,y);e.stroke(),e.restore()}function $i(e,t,n){const i=g.hoverPoints,o=g.dies;let l=0,d=0;for(let s=0;s<o.length&&(!l||!d);s++){const r=o[s];if(!(r.x==null||r.y==null))for(const f of[we.get(`${r.x+1},${r.y}`),we.get(`${r.x},${r.y+1}`)]){if(f===void 0)continue;const u=Math.abs(i[f].x-i[s].x)*e.ppm,b=Math.abs(i[f].y-i[s].y)*e.ppm;u>b?l||=u/2:d||=b/2}}return{cw:l||t,ch:d||n}}function ji(){const e=a.getContext("2d"),t=Math.min(A.x,z.x),n=Math.min(A.y,z.y),i=Math.abs(z.x-A.x),o=Math.abs(z.y-A.y);e.save(),e.fillStyle="rgba(0,0,0,0.08)",e.fillRect(t,n,i,o),e.setLineDash([5,3]),e.strokeStyle="rgba(255,255,255,0.9)",e.lineWidth=3,e.strokeRect(t,n,i,o),e.strokeStyle="rgba(0,0,0,0.9)",e.lineWidth=1.5,e.strokeRect(t,n,i,o),e.restore()}function Kn(){if(!St)return;const e=ze;ze=!0,w(),ze=e}function Ki(){Kn(),a.toBlob(e=>{e&&Mo(e,wn(),oe.onSaveImage)})}function _n(e){return K?Math.max(K.ppm*Ti,Math.min(K.ppm*Oi,e)):e}function He(e,t,n){const i=B??K;if(!i)return;const o=_n(i.ppm*n),l=o/i.ppm,d=e-(e-i.originX)*l,s=t-(t-i.originY)*l,r=(K?.snapDist??1)/(o/(K?.ppm??o));B={originX:d,originY:s,ppm:o,snapDist:r},w()}function J(){return B??K}function Gn(e){if(e.ctrlKey||e.metaKey){e.preventDefault();const t=a.getBoundingClientRect(),n=e.deltaY<0?1.12:1/1.12;He(e.clientX-t.left,e.clientY-t.top,n)}else if(B!==null){e.preventDefault();const t=J(),n=B.snapDist;B={originX:t.originX-e.deltaX,originY:t.originY-e.deltaY,ppm:t.ppm,snapDist:n},w()}}function sn(e,t,n){return e>=n.x&&e<n.x+n.w&&t>=n.y&&t<n.y+n.h}function Un(e){if(ht=!1,e.button!==0||(jn(),!J()))return;a.focus({preventScroll:!0}),a.setPointerCapture(e.pointerId);const t=a.getBoundingClientRect(),n=e.clientX-t.left,i=e.clientY-t.top;if(Ce&&c.legendPosition==="floating"&&sn(n,i,Ce)){We=!0,Ge={x:n,y:i},$t={...Nt};return}if(Ue&&_!=="pan"){Ae=!0,Se=!0,Fe={x:n,y:i},yt={x:J().originX,y:J().originY},a.style.cursor="grabbing";return}if(_==="zoom"||_==="select"){Ie=!0,A=z={x:n,y:i};return}Se=!0,Fe={x:n,y:i},yt={x:J().originX,y:J().originY},a.style.cursor="grabbing"}function Zn(e){const t=a.getBoundingClientRect(),n=e.clientX-t.left,i=e.clientY-t.top;if(Ie){z={x:n,y:i},ln();return}if(We){const u=n-Ge.x,b=i-Ge.y;u*u+b*b>16&&(We=!1,_e=!0,a.style.cursor="grabbing")}if(_e){Nt={x:$t.x+(n-Ge.x),y:$t.y+(i-Ge.y)},ln();return}if(Se){const u=J(),b=B?.snapDist??K?.snapDist??1;B={originX:yt.x+(n-Fe.x),originY:yt.y+(i-Fe.y),ppm:u.ppm,snapDist:b},ln();return}const o=J();if(!o)return;const l=(n-o.originX)/o.ppm,d=(o.originY-i)/o.ppm,r=cn(l,d,o.snapDist)?.die??null,f=mt.find(u=>n>=u.x&&n<u.x+u.w&&i>=u.y&&i<u.y+u.h);if(In(f?f.bin:void 0),f){a.style.cursor="pointer",H&&(H.textContent=f.label??`Bin ${f.bin}`,H.style.display="block",yi(H,a,e.clientX,e.clientY,{followPointer:!0})),at?.(null,e);return}_==="pan"&&(a.style.cursor=r?"crosshair":"grab"),H&&(r?(H.innerHTML=no(r,g.plotMode,{testDefs:Z,hbinDefs:ee,sbinDefs:te,fallbackFormat:c.fallbackFormat,aggrMethod:g.aggrMethod,lotSize:g.lotSize,metadataFields:xe,activeTest:g.activeTest,reticleConfig:gt}),H.style.display="block",yi(H,a,e.clientX,e.clientY,{followPointer:!0})):H.style.display="none"),at?.(r,e)}function Qn(e){const t=a.getBoundingClientRect(),n=e.clientX-t.left,i=e.clientY-t.top,o=e.ctrlKey||e.metaKey;if(H&&(n<0||i<0||n>t.width||i>t.height)&&(H.style.display="none"),Ie){Ie=!1,z={x:n,y:i};const s=n-A.x,r=i-A.y,f=J();if(_==="zoom"){if(s*s+r*r<25)He(n,i,2);else if(f){const u=Math.min(A.x,z.x),b=Math.max(A.x,z.x),W=Math.min(A.y,z.y),ie=Math.max(A.y,z.y),v=b-u,E=ie-W;if(v>4&&E>4){const C=a.clientWidth,y=a.clientHeight,Y=C/v,ue=y/E,I=Math.min(Y,ue),Dt=_n(f.ppm*I),et=Dt/f.ppm,pn=(u+b)/2,un=(W+ie)/2;B={originX:C/2-(pn-f.originX)*et,originY:y/2-(un-f.originY)*et,ppm:Dt,snapDist:f.snapDist/et}}}w(),a.style.cursor="crosshair";return}if(s*s+r*r<25)an(n,i,o,e);else if(f){const u=(Math.min(A.x,z.x)-f.originX)/f.ppm,b=(Math.max(A.x,z.x)-f.originX)/f.ppm,W=(f.originY-Math.max(A.y,z.y))/f.ppm,ie=(f.originY-Math.min(A.y,z.y))/f.ppm,v=g.hoverPoints,E=[];for(let C=0;C<v.length;C++)if(v[C].x>=u&&v[C].x<=b&&v[C].y>=W&&v[C].y<=ie){const y=g.dies[C];y&&E.push(y)}if(o)for(const C of E){const y=re(C);x.has(y)?x.delete(y):x.add(y)}else x=new Set(E.map(C=>re(C)));Ee(),de?.(Ve())}w(),a.style.cursor="crosshair";return}if(We){We=!1,an(n,i,o,e);return}if(_e){_e=!1,a.style.cursor="grab";return}if(!Se)return;if(Se=!1,Ae){Ae=!1,a.style.cursor=Ue||_==="pan"?"grab":"crosshair";return}a.style.cursor=_==="pan"?"grab":"crosshair";const l=n-Fe.x,d=i-Fe.y;l*l+d*d<25&&an(n,i,o,e)}function an(e,t,n,i){for(const s of mt)if(e>=s.x&&e<s.x+s.w&&t>=s.y&&t<s.y+s.h){Ee("legend"),typeof s.bin=="number"?O({highlightBin:Ci(c.highlightBin,s.bin,n)}):O({highlightMetadataValue:Ci(c.highlightMetadataValue,s.bin,n)});return}if(Ce&&sn(e,t,Ce))return;const o=J();if(!o)return;const d=cn((e-o.originX)/o.ppm,(o.originY-t)/o.ppm,o.snapDist)?.die??null;if(d){Ei?.(d,i);const s=re(d);n?x.has(s)?x.delete(s):x.add(s):x.size===1&&x.has(s)?x=new Set:x=new Set([s]),Ee(),de?.(Ve()),w()}else n||(x=new Set,Ee(),de?.([]),w())}function Ve(){const e=[],t=g.hoverPoints;for(let n=0;n<t.length;n++){const i=g.dies[n];i&&x.has(re(i))&&e.push(i)}return e}function qn(){ut&&(ut.style.display=pt()?"flex":"none",ut.ariaLabel=x.size>0?"Charts and tables for the selected dies (or right-click)":"Charts and tables for this wafer (or right-click)")}function Jn(){const e={waferLabel:Ot(),testDefs:Z,isLotStack:F.isLotStack,wafer:F.wafer,passBins:Re,ringCount:ot(F,"renderWaferMap"),activeTest:c.plotMode==="value"?c.activeTest:void 0};return x.size>0?jo(Ve(),e):Ko(le,e)}function rn(e,t,n){Me!==e&&t.click(),dn(n,N??L??a)}function _i(e,t){if(!pt())return;const n=c.plotMode==="softBin"?"soft":"hard",i=el(c.highlightBin),o=i.length>1&&i.includes(e)?[...i]:[e],l=[{label:Ot()??"this wafer",dies:le,wafer:F.wafer,passBins:Re,ringCount:ot(F,"renderWaferMap")}],d=xi(l,n,o,Z);if(!d)return;const s={...ft},r=o.length>1?xi(l,n,[e],Z):null;r&&(s.narrower={label:`Only ${n} bin ${e}`,backLabel:"All filtered bins",source:r,ctx:ft});const f=a;import("./drilldown.js").then(({openDrilldownMenu:u})=>{At||(Ft=u(t,f,d,s))})}function dn(e,t){if(!pt())return;const n=S.drilldownSourceOverride?.(),i=n?.source??Jn(),o={...ft,...n?.ctx};if(n?.narrowable){const l=Jn(),d=l.items.reduce((s,r)=>s+r.dies.length,0);o.narrower={label:`Only this wafer \u2014 ${d.toLocaleString()} die${d===1?"":"s"}`,source:l,ctx:ft}}import("./drilldown.js").then(({openDrilldownMenu:l})=>{At||(Ft=l(e,t,i,o))})}function ei(e){e.stopPropagation();const t=ht;if(ht=!1,!pt()||ge)return;const n=a.getBoundingClientRect();if(!t){const o=e.clientX-n.left,l=e.clientY-n.top,d=mt.find(f=>o>=f.x&&o<f.x+f.w&&l>=f.y&&l<f.y+f.h);if(d&&typeof d.bin=="number"&&!F.isLotStack&&(c.plotMode===void 0||c.plotMode==="hardBin"||c.plotMode==="softBin")){e.preventDefault(),_i(d.bin,{x:e.clientX,y:e.clientY});return}if(Ce&&sn(o,l,Ce))return;const s=J(),r=s?cn((o-s.originX)/s.ppm,(s.originY-l)/s.ppm,s.snapDist)?.die:void 0;r&&!x.has(re(r))&&(x=new Set([re(r)]),Ee(),de?.(Ve()),w())}e.preventDefault();const i=t?{x:n.left+n.width/2,y:n.top+n.height/2}:{x:e.clientX,y:e.clientY};dn(i,a)}function ti(){In(void 0),H&&Tt(p),at?.(null,new MouseEvent("mouseleave")),a.style.cursor=_==="pan"?"grab":"crosshair"}function ni(){Se=!1,Ae=!1,Ie=!1,We=!1,_e=!1,H&&Tt(p),at?.(null,new MouseEvent("mouseleave")),a.style.cursor=_==="pan"?"grab":"crosshair",w()}function cn(e,t,n){const i=g.hoverPoints,o=g.rectangles;for(let r=0;r<o.length;r++){const f=o[r];if(Math.abs(e-f.x)<=f.width/2&&Math.abs(t-f.y)<=f.height/2){const u=g.dies[r];return u?{die:u,index:r}:null}}let l=null,d=-1,s=n*n;for(let r=0;r<i.length;r++){const f=i[r].x-e,u=i[r].y-t,b=f*f+u*u;b<s&&(s=b,l=g.dies[r]??null,d=r)}return l?{die:l,index:d}:null}const ii=new T.ResizeObserver(()=>{K=null,B=null,w()});ii.observe(a),S.height==null&&Mi<=0&&yn(()=>yn(()=>{P.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 qe=T.matchMedia(`(resolution: ${T.devicePixelRatio}dppx)`);const Et=()=>{qe.removeEventListener("change",Et),qe=T.matchMedia(`(resolution: ${T.devicePixelRatio}dppx)`),qe.addEventListener("change",Et),w()};qe.addEventListener("change",Et);const oi=T.matchMedia("(prefers-color-scheme: dark)"),li=()=>w();oi.addEventListener("change",li);const si=()=>{H&&Tt(p)};T.addEventListener("blur",si);function ai(e){if((e.key==="ContextMenu"||e.shiftKey&&e.key==="F10")&&(ht=!0),e.key==="Escape"&&jn(),e.key==="Escape"&&x.size>0&&(x=new Set,Ee(),de?.([]),w()),(e.key==="e"||e.key==="E")&&En&&(e.stopPropagation(),(Mn??Nn)()),(e.ctrlKey||e.metaKey)&&(e.key==="="||e.key==="+"?(e.preventDefault(),He(a.clientWidth/2,a.clientHeight/2,1.2)):e.key==="-"?(e.preventDefault(),He(a.clientWidth/2,a.clientHeight/2,1/1.2)):e.key==="0"&&(e.preventDefault(),Je())),!e.ctrlKey&&!e.metaKey&&!e.shiftKey){const n=J();if(n){const i=B?.snapDist??K?.snapDist??1;let o=0,l=0;e.key==="ArrowLeft"&&(o=20,e.preventDefault()),e.key==="ArrowRight"&&(o=-20,e.preventDefault()),e.key==="ArrowUp"&&(l=20,e.preventDefault()),e.key==="ArrowDown"&&(l=-20,e.preventDefault()),(o||l)&&(B={originX:n.originX+o,originY:n.originY+l,ppm:n.ppm,snapDist:i},w())}e.key===" "&&!Ue&&(e.preventDefault(),Ue=!0,_!=="pan"&&(a.style.cursor="grab"))}}function ri(e){e.key===" "&&(Ue=!1,Ae&&(Se=!1,Ae=!1),a.style.cursor=_==="pan"?"grab":"crosshair")}a.style.cursor="crosshair",a.setAttribute("tabindex","0"),a.addEventListener("wheel",Gn,{passive:!1}),a.addEventListener("pointerdown",Un),a.addEventListener("pointermove",Zn),a.addEventListener("pointerup",Qn),a.addEventListener("pointerleave",ti),a.addEventListener("pointercancel",ni);const di=()=>Je();a.addEventListener("dblclick",di),a.addEventListener("keydown",ai),a.addEventListener("keyup",ri),a.addEventListener("contextmenu",ei);const ci=e=>{e.stopPropagation()};a.addEventListener("click",ci),a.clientWidth,w(),st?.();function Je(){K=null,B=null,w()}function fn(){import("./userGuideHtml.js").then(e=>Io({buildWaferMap:co,renderWaferMap,renderWaferGallery:void 0,analyzeWaferMap:po},e.USER_GUIDE_HTML,Bi,P))}return Ne(),{setResult(e){F=e,U=e.wafer,le=e.dies,ee=e.hbinDefs,te=e.sbinDefs,Z=e.testDefs,xe=e.metadataFields,Pn=e.reticles?.length?e.reticles:void 0,gt=e.reticleConfig,Tn=e.dataAxisFlip,zt=e.isLotStack,Ht=e.aggrMethod,Vt=e.lotSize,Wi(),jt(),w(),N&&ye()},setOptions(e){$n(e)},getOptions(){return{...c}},resetZoom:Je,setSelection(e){x=new Set(e.map(t=>re(t))),w()},getSelectedDies:()=>Ve(),clearSelection(){x=new Set,Ee(),de?.([]),w()},setFindingsNotice(e){An=e,N?ye():L&&Qe()},setStatsSummary(e){if(ce=e,Wt(),Ut(),N)ye();else if(L)Qe();else if(e&&!$e?.placement){const t=$e?.defaultOpen??!Pe;L=bn("right",be,p,rn),L.style.display=t?"block":"none";const n=M.parentElement,i=M.nextSibling;ne=vn(M,L,"right"),Gt(ne,"right"),n?.insertBefore(ne,i),Qe()}wt()},closeSummaryPanel(){tn(!1)},getExportTitle(){return wn()},getSaveImageHook(){return oe.onSaveImage},locateDie:Mt,getSaveTextHook(){return oe.onSaveText},drawPendingNow:Kn,getBinColors(){return g.binColors},setSummaryVisible(e){j&&(j.style.display=e?"flex":"none"),zn()},setViewControlsVisible(e){$&&($.style.display=e?"flex":"none")},setExpandVisible(e){ae&&(ae.style.display=e?"flex":"none")},openUserGuide:fn,setInsightsOpen(e){Ke(e)},destroy(){At=!0,It.flush();for(const e of Ze.values())e.cancel();Ze.clear(),De?.close(),Vn?.()?.remove(),Zt&&p.removeEventListener("click",Zt,!0),a.removeEventListener("wheel",Gn),a.removeEventListener("pointerdown",Un),a.removeEventListener("pointermove",Zn),a.removeEventListener("pointerup",Qn),a.removeEventListener("pointerleave",ti),a.removeEventListener("pointercancel",ni),a.removeEventListener("dblclick",di),a.removeEventListener("keydown",ai),a.removeEventListener("keyup",ri),a.removeEventListener("contextmenu",ei),Ft?.(),a.removeEventListener("click",ci),ii.disconnect(),on?.disconnect(),qe.removeEventListener("change",Et),oi.removeEventListener("change",li),T.removeEventListener("blur",si),Ri(),H&&Tt(p),fe?.remove(),me&&(me.parentElement?.insertBefore(M,me),me.remove()),ne&&(ne.parentElement?.insertBefore(M,ne),ne.remove()),M.remove(),a.style.cursor="",q?.destroy(),Q?.destroy(),Xe.remove()}}}