@wafertools/wafermap 0.32.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 (167) hide show
  1. package/AGENTS.md +7 -7
  2. package/CHANGELOG.md +374 -1
  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 +57 -15
  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 +51 -2
  65. package/dist/packages/canvas-adapter/renderWaferMap.js +1 -1
  66. package/dist/packages/canvas-adapter/summaryPanel.d.ts +49 -11
  67. package/dist/packages/canvas-adapter/summaryPanel.js +2 -3
  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/toCanvas.js +1 -1
  75. package/dist/packages/canvas-adapter/toolbar.d.ts +74 -93
  76. package/dist/packages/canvas-adapter/toolbar.js +2 -2
  77. package/dist/packages/canvas-adapter/userGuideHtml.d.ts +1 -1
  78. package/dist/packages/canvas-adapter/userGuideHtml.js +409 -51
  79. package/dist/packages/canvas-adapter/version.d.ts +2 -2
  80. package/dist/packages/canvas-adapter/version.js +1 -1
  81. package/dist/packages/canvas-adapter/viewSwitch.d.ts +13 -0
  82. package/dist/packages/canvas-adapter/viewSwitch.js +1 -0
  83. package/dist/packages/canvas-adapter/virtualTable.d.ts +44 -0
  84. package/dist/packages/canvas-adapter/virtualTable.js +1 -0
  85. package/dist/packages/core/aggregates.d.ts +6 -0
  86. package/dist/packages/core/aggregates.js +1 -1
  87. package/dist/packages/core/classify.d.ts +3 -2
  88. package/dist/packages/core/classify.js +1 -1
  89. package/dist/packages/core/compact.d.ts +205 -0
  90. package/dist/packages/core/compact.js +3 -0
  91. package/dist/packages/core/passBins.d.ts +23 -4
  92. package/dist/packages/core/passBins.js +1 -1
  93. package/dist/packages/core/ringCount.d.ts +22 -0
  94. package/dist/packages/core/ringCount.js +1 -0
  95. package/dist/packages/core/tableCsv.d.ts +43 -0
  96. package/dist/packages/core/tableCsv.js +3 -0
  97. package/dist/packages/renderer/axisTicks.d.ts +14 -0
  98. package/dist/packages/renderer/axisTicks.js +1 -1
  99. package/dist/packages/renderer/binColors.d.ts +6 -6
  100. package/dist/packages/renderer/binColors.js +1 -1
  101. package/dist/packages/renderer/buildView.d.ts +27 -2
  102. package/dist/packages/renderer/buildView.js +1 -1
  103. package/dist/packages/renderer/buildWaferMap.js +1 -1
  104. package/dist/packages/renderer/compactView.d.ts +22 -0
  105. package/dist/packages/renderer/compactView.js +1 -0
  106. package/dist/packages/renderer/xyIndicator.d.ts +27 -0
  107. package/dist/packages/renderer/xyIndicator.js +1 -0
  108. package/dist/packages/stats/analyzeWaferLot.d.ts +28 -0
  109. package/dist/packages/stats/analyzeWaferLot.js +1 -1
  110. package/dist/packages/stats/analyzeWaferMap.d.ts +36 -1
  111. package/dist/packages/stats/analyzeWaferMap.js +1 -1
  112. package/dist/packages/stats/binPareto.d.ts +1 -1
  113. package/dist/packages/stats/binPareto.js +1 -1
  114. package/dist/packages/stats/binRows.d.ts +38 -0
  115. package/dist/packages/stats/binRows.js +1 -0
  116. package/dist/packages/stats/filterFindings.d.ts +25 -0
  117. package/dist/packages/stats/filterFindings.js +1 -1
  118. package/dist/packages/stats/findingText.d.ts +9 -0
  119. package/dist/packages/stats/findingText.js +2 -0
  120. package/dist/packages/stats/histogram.d.ts +27 -0
  121. package/dist/packages/stats/histogram.js +1 -1
  122. package/dist/packages/stats/index.d.ts +2 -0
  123. package/dist/packages/stats/index.js +1 -1
  124. package/dist/packages/stats/lotDrift.d.ts +16 -0
  125. package/dist/packages/stats/lotDrift.js +1 -0
  126. package/dist/packages/stats/lotPattern.d.ts +33 -0
  127. package/dist/packages/stats/lotPattern.js +1 -0
  128. package/dist/packages/stats/math.d.ts +60 -6
  129. package/dist/packages/stats/math.js +1 -1
  130. package/dist/packages/stats/patternClassification.d.ts +32 -1
  131. package/dist/packages/stats/patternClassification.js +1 -1
  132. package/dist/packages/stats/plotData.d.ts +258 -0
  133. package/dist/packages/stats/plotData.js +1 -0
  134. package/dist/packages/stats/plotId.d.ts +3 -0
  135. package/dist/packages/stats/plotId.js +1 -0
  136. package/dist/packages/stats/plotSpec.d.ts +119 -0
  137. package/dist/packages/stats/plotSpec.js +4 -0
  138. package/dist/packages/stats/presentation.d.ts +44 -0
  139. package/dist/packages/stats/presentation.js +1 -0
  140. package/dist/packages/stats/regions.d.ts +15 -0
  141. package/dist/packages/stats/regions.js +1 -1
  142. package/dist/packages/stats/renderSummaryReport.d.ts +23 -5
  143. package/dist/packages/stats/renderSummaryReport.js +32 -27
  144. package/dist/packages/stats/reportHtml.d.ts +54 -9
  145. package/dist/packages/stats/reportHtml.js +145 -55
  146. package/dist/packages/stats/scatter.d.ts +6 -0
  147. package/dist/packages/stats/scatter.js +1 -1
  148. package/dist/packages/stats/sweep.d.ts +37 -1
  149. package/dist/packages/stats/sweep.js +1 -1
  150. package/dist/packages/stats/sweepText.d.ts +14 -0
  151. package/dist/packages/stats/sweepText.js +1 -0
  152. package/dist/packages/stats/sweepXFromName.d.ts +14 -0
  153. package/dist/packages/stats/sweepXFromName.js +1 -1
  154. package/dist/packages/stats/synthesis.d.ts +76 -0
  155. package/dist/packages/stats/synthesis.js +2 -0
  156. package/dist/packages/stats/testPassRate.d.ts +6 -0
  157. package/dist/packages/stats/testPassRate.js +1 -1
  158. package/dist/packages/stats/trend.js +1 -1
  159. package/dist/packages/stats/types.d.ts +2 -2
  160. package/dist/packages/stats/yield.d.ts +15 -6
  161. package/dist/packages/stats/yield.js +1 -1
  162. package/dist/packages/stats/yieldRows.d.ts +31 -0
  163. package/dist/packages/stats/yieldRows.js +1 -0
  164. package/llms.txt +16 -4
  165. package/package.json +3 -3
  166. package/dist/packages/stats/findingsNarrative.d.ts +0 -3
  167. package/dist/packages/stats/findingsNarrative.js +0 -1
@@ -1 +1 @@
1
- import{getUniqueTestNumbers as Ro,resolveTestNumber as Wo,findTestDef as Io,collectMetadataValues as $o}from"../renderer/buildView.js";import{metadataCategoricalValue as Ao}from"../core/metadata.js";import{resolveBinColorsForMaps as Po,mergeBinDefs as Ze,binColorWarning as Fo,mixedPassBinsWarning as Ho,binColorsEqual as jo}from"../renderer/binColors.js";import{itemPassBins as Vo,INPUT_DEFAULT_PASS_BINS as No}from"../core/passBins.js";import{NO_DATA_FILL as zo}from"../renderer/colorMap.js";import{metadataValueColor as _o}from"../renderer/colorMap.js";import{resolveCanvasTheme as Ko}from"./canvasTheme.js";import{ICONS as $e}from"./icons.js";import{SHADOW as Ae,LEADING as Qe,TRACKING as Go,controlStyle as qo,wireControlHover as Mt,SPACE as w,EDGE_GUTTER as oe,MAP_CHROME_INSET as Uo,RADIUS as z,FONT as T,CLR as g,sevColor as vn,MODE_LABELS as Xo,BIN_LEGEND_MODES as xn,STACKED_MODES as be,Z_ABOVE as Cn,applyOverlayZ as Yo,getTooltip as Zo,hideTooltip as Sn,createToolbarHelpers as Qo,buildModeMenuEl as Jo,openDetachWindow as ei,openFloatingWindow as ti,openModal as ni,openReportModal as oi,copyWmapThemeTokens as ii,syncWmapPopupTheme as li,openUserGuideWindow as si,makePaletteBtn as ai,makeLogScaleBtn as ri,makeLegendStyleBtn as di,makeOverlaysBtn as ci,makeOrientationBtn as ui,menuLayerFor as Mn,saveImageBlob as fi,markMenuTrigger as Pe,wireMenuA11y as Dn,wireExpandToggle as En,wireTooltip as kn,requestedPassFailDisplay as Bn,overlayMenuRows as pi,anyOverlayActive as mi,logWmapVersionOnce as gi,buildDataModeEntries as hi,metadataKeyHasData as yi,metadataModeEntry as bi}from"./toolbar.js";import{waferDisplayLabel as Je,waferIdentityLabel as On}from"../core/waferLabel.js";import{metadataDisplayValue as wi}from"../core/metadata.js";import{withExportContext as vi}from"./exportName.js";import{sortBinsForDisplay as xi}from"../stats/binPareto.js";import{diePassStatus as Ci}from"../core/dies.js";import{aggregateValues as Si,aggregateBinCounts as Tn}from"../core/aggregates.js";import{renderWaferMap as Mi,renderWaferMapCard as Ln,toPublicViewOptions as Rn}from"./renderWaferMap.js";import{hasDrilldownTargets as Di,waferPopulation as Ei}from"./chartPopulation.js";import{classifyChanged as ki,COLOR_KEYS as Bi,findingBin as Oi}from"./renderWaferMap.js";import{findingPatternKey as Wn}from"../stats/filterFindings.js";import{buildWaferMap as Ti,getTestPassStatus as In,isParametricTest as Dt,getDieTestValue as Li}from"../renderer/buildWaferMap.js";import{analyzeWaferMap as et}from"../stats/analyzeWaferMap.js";import{collectWarnings as Ri,buildWarningsMenuEl as Wi,severityOf as Ii}from"./warnings.js";import{asList as $n,compareNatural as Et,arrayEqual as An,toggleHighlight as Pn}from"../core/utils.js";import{createSummaryPanelEl as kt,buildMetadataStripRow as $i,buildCompactMetadataRows as Fn,metadataEntries as Hn,renderLotSummaryContentSteps as Ai,reportMapsFromItems as Pi}from"./summaryPanel.js";import{renderLotReportHtml as Fi}from"../stats/renderSummaryReport.js";import{prettyKey as Hi}from"../stats/facets.js";import{testLabel as ji,markedTestLabel as Vi,derivedFields as Ni}from"../renderer/testLabel.js";import{mergeTestDefs as zi}from"../stats/mergeTestDefs.js";import{getDieKey as _i,hasPosition as Ki}from"../core/dies.js";import{testValue as Gi}from"../core/dieTable.js";import{runChunked as qi}from"./chunked.js";function jn(f){if(typeof f!="number"||!Number.isFinite(f))return;const C=Math.round(f);return C>=1?C:void 0}const Bt=12;function Ui(f,C,p){let A=C;if(C.length>Bt){const S=C.slice(0,Bt-1),W=C.slice(Bt-1),F=W.reduce((X,ie)=>X+ie.count,0);A=[...S,{color:g.label,count:F,label:`Other (${W.length} bins)`}]}const E=f.createElement("div");Object.assign(E.style,{display:"flex",columnGap:"1px",width:"100%",height:"8px",borderRadius:z.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: ${A.map(S=>`${S.label} ${tt(S.count/p*100)}`).join(", ")}`);for(const S of A){const W=S.count/p*100,F=f.createElement("div");Object.assign(F.style,{flex:`${W} 1 0`,minWidth:W>0?"2px":"0",background:S.color}),kn(F,`${S.label} \xB7 ${S.count.toLocaleString()} dies \xB7 ${tt(W)}`),E.appendChild(F)}return E}function tt(f){return f>0&&f<.1?"<0.1%":`${f.toFixed(1)}%`}function Vn(f,C,p){const A=new Map;let E=0,S=0;for(const W of f){const F=p?new Set(p(W)):void 0;for(const X of W.dies){if(X.partial||X.edgeExcluded)continue;const ie=C(X);ie!==void 0&&(A.set(ie,(A.get(ie)??0)+1),E++,F&&Ci(X,F)&&S++)}}return{counts:A,total:E,pass:S}}function Nn(f,C){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:z.control});const A=f.ownerDocument.createElement("span");Object.assign(A.style,{display:"inline-block",width:"13px",height:"13px",flexShrink:"0",background:C.color,border:C.isActive?`2px solid ${g.iconActive}`:`1px solid ${g.menuBorder}`,borderRadius:z.control,boxSizing:"border-box"});const E=f.ownerDocument.createElement("span");if(E.textContent=C.label,Object.assign(E.style,{fontWeight:C.isActive?"700":"400",color:C.isActive?g.iconActive:g.text,whiteSpace:"nowrap"}),p.appendChild(A),p.appendChild(E),C.count!==void 0){const S=f.ownerDocument.createElement("span");if(S.textContent=C.count.toLocaleString(),Object.assign(S.style,{color:C.isActive?g.iconActive:g.text,fontWeight:C.isActive?"700":"400",whiteSpace:"nowrap"}),p.appendChild(S),C.percent!==void 0){const W=f.ownerDocument.createElement("span");W.textContent=tt(C.percent),Object.assign(W.style,{color:g.label,whiteSpace:"nowrap"}),p.appendChild(W)}}p.setAttribute("role","button"),p.setAttribute("aria-pressed",C.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=>C.onClick(S.ctrlKey||S.metaKey)),p.addEventListener("keydown",S=>{(S.key==="Enter"||S.key===" ")&&(S.preventDefault(),C.onClick(S.ctrlKey||S.metaKey))}),f.appendChild(p)}export function renderWaferGallery(f,C,p={}){gi();const A=6;let E=jn(p.columns);const S=p.showHelpButton??!1,W=p.userGuideExtension,F=p.insights?.enabled??!1,X=p.insights?.sweeps?{sweeps:p.insights.sweeps}:void 0,ie=Yo(p.zIndex),de=p.summaryPanel,zn=e=>[...Vo(e)],Ot=()=>v.flatMap(e=>e?[e.ringCount??4]:[]),nt=()=>Ot()[0]??4;function _n(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 N=p.lotStatsSummary,we=p.viewOptions?.legendPosition??"default",Fe=p.perCardLegend??!1;function ve(){const e=c.plotMode??"hardBin";return xn.has(e)?null:c.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 Tt(){const e=Fe||ve()!==null;for(const t of M)t&&t.setOptions({showLegend:e})}let c={plotMode:"hardBin",showDieLabels:!1,showRingBoundaries:!1,showQuadrantBoundaries:!1,rotation:0,flipX:!1,flipY:!1,...p.viewOptions},M=[],le=[],ce=[],L=[];const He=vi(()=>{const e=L.filter(n=>n!=null),t=[...new Set(e.map(n=>wi(n.wafer.metadata?.lot)).filter(n=>n!==void 0))].sort(Et);return{prefix:p.downloadFilename,lots:t,...e.length===1?{wafer:On(e[0])}:{waferCount:e.length}}},p.onSaveImage,p.onSaveText);let v=C.map(e=>typeof e=="function"?null:e);function Lt(){return zi(v)}function xe(){if(v.some(e=>e?.testDefs?.length))return Lt().defs}let Ce=0,je=0;const _=new Map;let Kn=0,P=null,se=null,Rt=new Set,y=null,Gn={};function Wt(e){return v[e]?.statsSummary??N?.perWafer.find(t=>t.waferIndex===e)?.summary}function ot(){return!!(v.some(e=>e?.statsSummary?.findings.length)||N?.perWafer.some(e=>e.summary.findings.length))}const qn=Zo(),ue=Qo(qn),{makeBtn:Q,setActive:Se,makeSep:K,makeMenuRow:Un,makeMenuSection:Xn,makeDropdown:It,closeOpenMenu:Ve,getOpenMenu:Me,setOpenMenu:De}=ue;f.ownerDocument.addEventListener("click",Ve,!0);const $t=()=>Sn();window.addEventListener("blur",$t);let At=p.findingsNotice;function Pt(e){Rt=new Set(e);const t=[...$.querySelectorAll(".wmap-gallery-card")];let n;t.forEach((o,d)=>{const s=Rt.has(d);o.style.outline=s?`3px solid ${g.findingHighlight}`:"",o.style.outlineOffset=s?"-3px":"",s&&n===void 0&&(n=o)}),n?.scrollIntoView?.({behavior:"smooth",block:"nearest"})}function Ft(){Pt([])}let it=!1;function Ht(){it=!0;for(const e of M)e&&e.clearSelection();it=!1}function jt(e){return t=>{!it&&se!==null&&(ke(),H()),e.onSelect?.(t)}}function lt(e,t){const n=new Set(e),o=t??M.map((d,s)=>s);for(const d of o){const s=L[d],l=M[d];if(!s||!l)continue;const a=s.dies.filter(i=>n.has(_i(i)));l.setSelection(a)}}function Yn(){const e=[];for(let t=0;t<v.length;t++){const n=v[t];if(!n)continue;const o=Wt(t)?.findings??[];o.length&&e.push({index:t,item:n,unusualCount:o.filter(d=>d.severity==="unusual").length,notableCount:o.filter(d=>d.severity==="notable").length,totalCount:o.length})}return e}function Zn(e){const t=L[e]??v[e];t&&Ie(e,t)}function Qn(e){const t=Wt(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 Jn(){oi(Fi(Pi(v,No,nt())),{anchor:f})}function eo(){if(!y)return;y.innerHTML="";const e=Yn();if(v.length>0){const n=f.ownerDocument.createElement("div"),o=e.length,d=v.filter(Boolean).length;n.textContent=o===0?`No findings on any of the ${d} wafers`:`${o} of ${d} wafer${d===1?"":"s"} with findings`,Object.assign(n.style,{fontSize:T.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,{...qo("outlined"),marginBottom:w.lg,display:"block",width:"100%",textAlign:"left"}),Mt(n),n.addEventListener("click",Jn),y.appendChild(n)}if(e.length===0){const n=f.ownerDocument.createElement("div");Object.assign(n.style,{color:g.icon,fontSize:T.body,padding:"4px 0"}),n.textContent="No findings on any wafer.",y.appendChild(n)}else for(const{index:n,item:o,unusualCount:d,notableCount:s,totalCount:l}of e){const a=d?"unusual":s?"notable":"info",i=d+s||l,r=f.ownerDocument.createElement("button");r.type="button",Object.assign(r.style,{display:"flex",alignItems:"center",justifyContent:"space-between",width:"100%",padding:"5px 8px",marginBottom:w.xs,border:"none",borderLeft:`3px solid ${vn(a)}`,borderRadius:z.control,background:g.bgHover,cursor:"pointer",fontSize:T.body,textAlign:"left",boxSizing:"border-box"}),r.addEventListener("mouseover",()=>{r.style.background=g.bgActive}),r.addEventListener("mouseout",()=>{r.style.background=g.bgHover});const u=f.ownerDocument.createElement("span");u.textContent=Je(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),r.setAttribute("aria-label",`${Je(o,n)} \u2014 ${i} finding${i===1?"":"s"}${d?`, ${d} unusual`:""} \u2014 view wafer`),Object.assign(m.style,{marginLeft:w.sm,flexShrink:"0",background:vn(a),color:"#fff",borderRadius:z.container,padding:"1px 5px",fontSize:T.body,fontWeight:"600"}),r.appendChild(u),r.appendChild(m),r.addEventListener("click",()=>Ie(n,o)),y.appendChild(r)}const t=f.ownerDocument.createElement("div");t.style.height="12px",y.appendChild(t)}let fe=null,Ee=null;function H(){if(y)if(fe?.cancel(),fe=null,N){const e=Ze(v.map(n=>n?.hbinDefs)),t=Ze(v.map(n=>n?.sbinDefs));fe=qi(Ai(y,{lotSummary:N,items:v,hbinDefs:e.length?e:void 0,sbinDefs:t.length?t:void 0,testDefs:xe(),ringCount:nt(),binColors:c.binColors,plotMode:c.plotMode??"hardBin",fallbackFormat:c.fallbackFormat,activeFindingId:se,warnings:p.warnings?.display??!0?J:[],findingsFilter:Gn,findingsNotice:At,onFindingsFilterChange:H,onSaveText:He.onSaveText,onFindingClick:(n,o)=>{se===n.id?ke():no(n,o),H()},onWaferClick:Zn,findingsFor:Qn,dieListOptions:p.dieList}),{onDone:()=>{const n=Ee;Ee=null,n?.()}})}else eo()}function to(e){const t=e.highlight;return t?.kind==="wafer"&&t.waferIndices?.length?t.waferIndices:null}let Ne=[];function Vt(){if(Ne.length!==0){for(const e of Ne)M[e]?.setOptions({plotMode:c.plotMode,activeTest:c.activeTest});Ne=[]}}function ke(){se=null,Ft(),Ht(),Vt(),R({highlightBin:void 0},{fireCallback:!1})}function Nt(){se!==null&&(ke(),H())}function no(e,t){if(se===e.id){ke();return}se=e.id,t.style.background=g.bgActive,t.style.fontWeight="600",Vt();const{kind:n,index:o}=e.variable;if(n==="test"){const s=o??0,l=xe();if(l===void 0||l.some(i=>i.testNumber===s))R({plotMode:"value",activeTest:s,highlightBin:void 0},{fireCallback:!1});else{R({highlightBin:void 0},{fireCallback:!1});const r=be.has(c.plotMode??"hardBin")?null:to(e);if(r){for(const u of r)M[u]?.setOptions({plotMode:"value",activeTest:s});Ne=[...r]}}}else R({plotMode:n==="softBin"?"softBin":"hardBin",highlightBin:Oi(e)},{fireCallback:!1});Ft(),Ht();const d=e.highlight;if(d.kind==="wafer"){Pt(d.waferIndices);const s=Wn(e);for(const l of d.waferIndices){const a=d.dieKeysByWafer?void 0:L[l]?.statsSummary?.findings.find(r=>Wn(r)===s),i=d.dieKeysByWafer?.[l]??a?.highlight?.dieKeys;i?.length&&lt(i,[l])}}else d.kind==="bin"?d.dieKeys?.length&&lt(d.dieKeys):(d.kind==="region"||d.kind==="dies")&&d.dieKeys?.length&&lt(d.dieKeys)}function ae(){if(!P)return;const e=!!y;P.style.display=(N||ot())&&e&&!Le?"flex":"none";const t=y?y.style.display!=="none":!1;(N?.hasNotableFindings||v.some(o=>o?.statsSummary?.hasNotableFindings))&&!t?P.style.color=g.findingIndicator:P.dataset.active||(P.style.color=g.icon)}const I=f.ownerDocument.createElement("div");I.dataset.wmapToolbar="gallery",Object.assign(I.style,{flexShrink:"0",marginLeft:"auto",display:"inline-flex",flexDirection:"row",alignItems:"center",gap:"0",background:g.menuBg,border:`1px solid ${g.menuBorder}`,borderRadius:z.control,padding:"0",boxShadow:Ae.panel,flexWrap:"wrap",minWidth:"0",overflowX:"auto"});const zt=()=>{const e=Me();e&&(e.remove(),De(null)),Pe(Y,!1)},Y=Q("mode","Plot mode",()=>{if(Me()){zt();return}const e=v.flatMap(b=>b?.dies??[]),t=xe(),{testEntries:n,binEntries:o,stackedEntries:d}=hi(e,t,{includeStacked:!0}),s=v.filter(Boolean).length,l=b=>{if(b===void 0)return s;let B=0;for(const j of v)j?.dies?.some(U=>In(U,b)!==void 0||Gi(U,b)!==void 0)&&B++;return B},a=s<2?n:n.map(b=>{const B=l(b.activeTest);return B===s?b:{...b,label:`${b.label} \u2014 ${B} of ${s} wafers`}}),i=c.plotMode??"hardBin",r=c.activeTest??0;function u(b){return b.plotMode!==i?!1:b.plotMode==="value"?r===(b.activeTest??0):b.plotMode==="metadata"?c.activeMetadataKey===b.activeMetadataKey:!0}function m(b,B){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"}),B.remove(),De(null),Pe(Y,!1)}const D=new Set,k=v.flatMap(b=>b?.metadataFields??[]).filter(b=>!D.has(b.key)&&D.add(b.key)).filter(b=>yi(e,b.key)).map(bi),x=Jo(Y.getBoundingClientRect(),a,o,d,u,m,{makeMenuRow:Un,makeMenuSection:Xn},i,Y.ownerDocument.defaultView??window,k);Mn(Y).appendChild(x),De(x),Pe(Y,!0),Dn(x,Y,zt)});Pe(Y,!1);const oo=()=>L.flatMap(e=>e?[...e.hbinDefs??[],...e.sbinDefs??[]]:[]).some(e=>e.color),{btn:io,sync:_t}=ai(ue,()=>({...c,plotMode:c.plotMode??"hardBin"}),oo,e=>R(e));_t();const lo=C.some(e=>typeof e!="function"&&(e.reticles?.length??0)>0);function ze(){const e=xe(),{testNumber:t}=Wo(c.activeTest??0,e);return{testNumber:t,td:Io(e,t)}}function Kt(){if((c.plotMode??"hardBin")!=="value")return!1;const{td:e}=ze();return e!==void 0&&(e.limitLow!==void 0||e.limitHigh!==void 0)}function Be(){if((c.plotMode??"hardBin")!=="value")return!1;const{td:e}=ze();return e!==void 0&&!Dt(e)}function so(){if((c.plotMode??"hardBin")!=="value")return!1;const{testNumber:e,td:t}=ze();return v.some(n=>n?.dies?.some(o=>In(o,e,t)!==void 0))}function ao(e,t){if(!t||!Dt(t))return;const n=t.limitLow!==void 0||t.limitHigh!==void 0;if((Bn(c)==="spec"&&n?"spec":c.colorbarRangeMode??"spec")==="spec"&&n)return;let s=1/0,l=-1/0;for(const a of v)if(a)for(const i of a.dies){const r=Li(i,e);r!==void 0&&(r<s&&(s=r),r>l&&(l=r))}if(isFinite(s))return s===l?[s,s+1]:[s,l]}function st(e,t,n){const o=c[e];if(o===t||o!=null&&t!=null&&n(o,t))return!1;c={...c,[e]:t};for(const d of M)d&&d.setOptions({[e]:t});return!0}function Gt(){if((c.plotMode??"hardBin")!=="metadata")return;const e=c.activeMetadataKey;if(!e)return;const t=new Set;for(const n of v)if(n)for(const o of $o(n.dies,e))t.add(o);return{key:e,values:[...t].sort(Et)}}function at(){st("metadataValueOrder",Gt(),(e,t)=>e.key===t.key&&An(e.values,t.values))}function rt(){if((c.plotMode??"hardBin")!=="value")return;const{testNumber:e,td:t}=ze(),n=ao(e,t);st("valueRange",n?{test:e,range:n}:void 0,(d,s)=>{const l=r=>Array.isArray(r)?{test:void 0,range:r}:{test:r.test,range:r.range},a=l(d),i=l(s);return a.test===i.test&&An(a.range,i.range)})}let dt=!1;function ro(){if(dt)return;dt=!0,(f.ownerDocument.defaultView?.requestAnimationFrame??(t=>setTimeout(()=>t(0),0)))(()=>{dt=!1,rt(),at(),Ut()})}let ct=!1;function co(){if(ct)return;ct=!0,(f.ownerDocument.defaultView?.requestAnimationFrame??(t=>setTimeout(()=>t(0),0)))(()=>{ct=!1,Ue()})}let qt=[];function pe(){const{colors:e,mixedHardBins:t}=Po(v.filter(n=>n!=null),{binColorScheme:c.binColorScheme,useDefinedBinColors:c.useDefinedBinColors});return qt=t,e}function Ut(){st("binColors",pe(),jo),Oe()}const uo=ci(ue,()=>pi(c,lo,{functionalActive:Be(),hasLimits:Kt()&&!Be(),hasRecorded:so()&&!Be(),binMode:(c.plotMode??"hardBin")==="hardBin"||(c.plotMode??"hardBin")==="softBin"},e=>R(e)),()=>mi(c)),{btn:fo,sync:Xt}=di(ue,()=>({plotMode:c.plotMode,legendPosition:we}),e=>{we=e;for(const t of M)t&&t.setOptions({legendPosition:we})},{get:()=>Fe,set:e=>{Fe=e,Tt()},blockedReason:ve});Xt();const po=[{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"}],Yt=It("aggr","Aggregation method",()=>po,()=>c.aggregationMethod??"mean",e=>R({aggregationMethod:e}));function Zt(){const e=c.plotMode==="stackedValues";Yt.style.display=e?"":"none"}Zt();const{btn:mo,sync:Qt}=ri(ue,()=>({...c,functionalActive:Be()}),e=>R(e));Qt();const _e=Q("specRange","Colorbar range: test limits",()=>{const e=c.colorbarRangeMode==="data"?"spec":"data";R({colorbarRangeMode:e})});function Jt(){const e=(c.plotMode??"hardBin")==="value"&&Kt()&&Bn(c)==="off"&&!Be();_e.style.display=e?"":"none";const t=(c.colorbarRangeMode??"spec")==="spec";Se(_e,t),_e.ariaLabel=t?"Colorbar range: test limits (click for data range)":"Colorbar range: data range (click for test limits)"}Jt();const go=ui(ue,()=>c,e=>R(e)),ho=Q("downloadAll","Download gallery PNG",Oo),yo=It("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=>cn(e==="auto"?void 0:Number(e))),O=f.ownerDocument.createElement("div");Object.assign(O.style,{display:"inline-flex",alignItems:"center",gap:"0"}),I.appendChild(O),O.appendChild(Y),O.appendChild(io),O.appendChild(Yt),O.appendChild(mo),O.appendChild(_e),O.appendChild(K()),O.appendChild(uo),O.appendChild(K()),O.appendChild(fo),O.appendChild(K()),O.appendChild(go),O.appendChild(K()),O.appendChild(yo),O.appendChild(K()),O.appendChild(ho),(N||ot())&&(P=Q("findings","Summary panel",()=>{if(!y)return;const e=y.style.display!=="none";e||H(),y.style.display=e?"none":"flex",Se(P,!e),ae()}),I.appendChild(K()),I.appendChild(P));let G=null,Ke=null,J=[],en=!1;function Oe(){const e=Ri({lotStatsSummary:N,result:{warnings:[...v.flatMap(n=>n?.warnings??[]),...Lt().warnings]},extra:[c.binColors&&Fo(c.binColors,c.plotMode),Ho(qt),_n(Ot())].filter(n=>!!n)}),t=e.length!==J.length||e.some((n,o)=>n.code!==J[o]?.code||n.message!==J[o]?.message);J=e,(t||!en)&&(en=!0,p.warnings?.onWarning?.(e)),bo()}function bo(){if(!G||!Ke)return;const e=J.length,t=e>0;if(G.style.display=t?"flex":"none",Ke.style.display=t?"":"none",!t)return;const n=Ii(J[0]),o=`${e} data ${e===1?"warning":"warnings"}`;G.style.color=n==="error"?g.errText:g.warnText,G.ariaLabel=n==="error"?`${o} \u2014 some wafers may be positionally wrong`:o}(p.warnings?.display??!0)&&(Ke=K(),G=Q("warning","Data warnings",()=>{const e=Me();if(Ve(new MouseEvent("click")),e)return;const t=Wi(G.getBoundingClientRect(),J,G.ownerDocument.defaultView??window);Mn(f).appendChild(t),De(t),Dn(t,G,()=>Ve(new MouseEvent("click")))}),Pe(G,!1),I.appendChild(Ke),I.appendChild(G)),Oe();let re=null;F&&(re=Q("analysis","Insights",()=>{on(!Le)}),re.dataset.wmapInsightsBtn="1",I.appendChild(K()),I.appendChild(re));function tn(){import("./userGuideHtml.js").then(e=>si({buildWaferMap:Ti,renderWaferMap:Mi,renderWaferGallery,analyzeWaferMap:et},e.USER_GUIDE_HTML,W,f))}S&&(I.appendChild(K()),I.appendChild(Q("help","User guide",()=>tn())));const me=f.ownerDocument.createElement("div");me.dataset.wmapGalleryMeta="1",Object.assign(me.style,{flex:"1",minWidth:"0",overflow:"hidden",display:"flex",alignItems:"center",padding:`${w.sm} ${w.lg}`,fontSize:T.sub,lineHeight:Qe.none,boxSizing:"border-box"});const Ge=f.ownerDocument.createElement("div");Object.assign(Ge.style,{background:g.canvasBg,display:"flex",alignItems:"stretch",gap:w.lg,paddingBottom:w.lg,minWidth:"0"});const ee=f.ownerDocument.createElement("div");ee.dataset.wmapGalleryLegend="1",Object.assign(ee.style,{display:"flex",flexDirection:"column",gap:w.sm,background:g.menuBg,border:`1px solid ${g.menuBorder}`,borderRadius:z.container,padding:`${w.sm} ${w.lg}`,marginBottom:w.lg,boxShadow:Ae.panel,fontSize:T.body,lineHeight:Qe.none,boxSizing:"border-box",width:"100%",minWidth:"0"});const q=f.ownerDocument.createElement("div");Object.assign(q.style,{display:"flex",flexDirection:"row",alignItems:"flex-start"});let ge=null,Te=null,nn=null;function wo(){return F?ge?Promise.resolve(ge):(nn??=import("./insightsTab.js").then(({createInsightsTab:e})=>(ge=e({getItems:()=>v,getLotStats:()=>N,getBinColors:()=>c.binColors??pe(),getRingCount:nt,defaultView:p.insights?.defaultView,sweeps:p.insights?.sweeps,onRemoveSweeps:p.insights?.onRemoveSweeps,onOpenGuide:void 0,showMetadataStrip:!1,onSaveImage:He.onSaveImage,onSaveText:He.onSaveText,ownerDocument:f.ownerDocument,openWafer:(t,n,o)=>{const d=v[t];if(!d)return;let s=null;const l=ni({title:n,onClose:()=>s?.destroy(),anchor:f});pn(l,n,d.wafer.metadata??void 0),s=yt(l.contentWrap,d,o)}}),Te=ge.el,Te.style.display="none",f.appendChild(Te),ge)),nn):Promise.resolve(null)}let Le=!1;function on(e){F&&(Le=e,Te&&(Te.style.display=e?"flex":"none"),q.style.display=e?"none":"flex",O.style.display=e?"none":"inline-flex",I.style.display="inline-flex",re&&(Se(re,e),re.innerHTML=e?$e.wafer:$e.analysis,re.ariaLabel=e?"Back to gallery view":"Insights"),ae(),Ue(),e&&wo().then(t=>{!t||!Le||(t.el.style.display="flex",t.render())}))}F&&p.insights?.defaultOpen&&queueMicrotask(()=>on(!0));const vo=4,ut=240,ln=480,xo=720,Co=1.25;let he=ln;function sn(e){const t=A*2+110+2;let n=null;for(const o of e){if(o==null||!o.dies?.length)continue;const d=o.dies[0].width;if(!(d>0))continue;const s=o.wafer.radius*2*(vo/d),l=Math.ceil(s+t);(n==null||l>n)&&(n=l)}return n}function So(e){const t=sn(e);return t==null?ut:Math.min(he,Math.max(ut,t))}function Mo(e){const t=sn(e);if(t==null)return!1;const n=Math.min(xo,Math.max(ln,t));return n<=he?!1:(he=n,!0)}function ft(){return E!=null?"none":`${he}px`}function an(){const e=ft();for(const t of Array.from($.children))t.classList.contains("wmap-gallery-card")&&(t.style.maxWidth=e,t.style.maxHeight=e)}let qe=ut,rn=0;function dn(e){if(Mo(e)&&an(),E==null){const n=So(e);n>qe&&(qe=n)}mt()}function cn(e){E=jn(e),an(),mt()}function pt(e){return`repeat(${e}, minmax(0, ${E!=null?"1fr":`${he}px`}))`}function un(e){$.style.gridTemplateColumns!==e&&($.style.gridTemplateColumns=e)}function mt(){if(E!=null){un(pt(E));return}const e=Math.max(1,rn),t=12,n=$.clientWidth||0,o=s=>(n-t*(s-1))/s;let d=Math.max(1,Math.ceil(Math.sqrt(e)));if(n>0){const s=Math.min(he,qe*Co),l=a=>{let i=0;for(;i<e&&o(i+1)>=a;)i++;return i};d=l(s)||l(qe)||1}un(pt(d))}const $=f.ownerDocument.createElement("div");if(Object.assign($.style,{flex:"1 1 0",minWidth:"0",display:"grid",gridTemplateColumns:pt(1),gap:w.xl,paddingLeft:oe,paddingRight:oe,justifyContent:"start",alignContent:"start",isolation:"isolate"}),de?.placement){const e=de.placement;y=kt(e,oe,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(N||ot()){const e=!!de?.defaultOpen;y=kt("right",oe,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",H()}ae(),y?.style.display!=="none"&&P&&Se(P,!0),(de?.placement??"right")==="left"?(y&&q.appendChild(y),q.appendChild($)):(q.appendChild($),y&&q.appendChild(y));const Re=f.ownerDocument.createElement("div");Object.assign(Re.style,{position:"sticky",top:"0",display:"flex",flexDirection:"column",paddingLeft:oe,paddingRight:oe,paddingTop:oe,zIndex:"1",background:g.menuBg}),Ge.appendChild(me),Ge.appendChild(I),Re.appendChild(Ge),Re.appendChild(ee),f.appendChild(Re),f.appendChild(q);function Ue(){ee.innerHTML="";const e=c.plotMode??"hardBin",t=!Le&&xn.has(e),n=L.filter(h=>h!=null),o=n.find(h=>h.isLotStack),d=$i(n.map(h=>({metadata:h.wafer.metadata??void 0})),o?{lotSize:o.lotSize??n.length,aggrMethod:o.aggrMethod}:void 0),s=e==="metadata",l=c.activeMetadataKey,a=t&&!s?Vn(n,h=>(e==="softBin"?h.sbin:h.hbin)??void 0,zn):{counts:new Map,total:0,pass:0},i=t&&!s?c.binColors??pe():void 0,r=i?e==="softBin"?i.pass.soft:i.pass.hard:new Set,u=xi(a.counts.entries(),r).map(([h])=>h),m=t&&s&&l?Vn(n,h=>Ao(h.metadata?.[l])):{counts:new Map,total:0,pass:0},D=s?Gt()?.values:void 0,k=t&&s?(D??[...m.counts.keys()].sort(Et)).filter(h=>m.counts.has(h)):[];if(me.innerHTML="",d&&me.appendChild(d),me.style.display=d?"flex":"none",!u.length&&!k.length){ee.style.display="none";return}ee.style.display="flex";const x=f.ownerDocument.createElement("div");Object.assign(x.style,{display:"flex",flexWrap:"wrap",alignItems:"center",gap:`${w.sm} ${w.xl}`,maxHeight:"86px",overflowY:"auto",overflowX:"hidden"}),ee.appendChild(x);const b=$n(c.highlightBin),B=L.flatMap(h=>h?.metadataFields??[]).find(h=>h.key===l),j=s?B?.label??(l?Hi(l):"Metadata"):Xo[e],U=f.ownerDocument.createElement("span");if(U.textContent=j,Object.assign(U.style,{fontSize:T.body,fontWeight:"700",letterSpacing:Go,textTransform:"uppercase",color:g.label,flexShrink:"0"}),x.appendChild(U),!s&&a.total>0){const h=a.pass,V=h/a.total*100,te=f.ownerDocument.createElement("span");te.textContent=`Yield ${tt(V)}`,Object.assign(te.style,{fontSize:T.body,fontWeight:"700",color:g.value,whiteSpace:"nowrap",flexShrink:"0"});const ne=f.ownerDocument.createElement("span");ne.textContent=`${h.toLocaleString()} / ${a.total.toLocaleString()} dies`,Object.assign(ne.style,{fontSize:T.body,color:g.label,whiteSpace:"nowrap",flexShrink:"0"}),x.appendChild(te),x.appendChild(ne)}if(s){const h=$n(c.highlightMetadataValue);k.forEach((V,te)=>{const ne=h.includes(V),Ye=B?.values?.find(St=>St.value===V),Ct=Ye?.color??_o(te),wn=m.counts.get(V)??0;Nn(x,{color:Ct,isActive:ne,label:Ye?.label??V,count:wn,percent:m.total>0?wn/m.total*100:void 0,onClick:St=>{const Lo=Pn(c.highlightMetadataValue,V,St);Nt(),R({highlightMetadataValue:Lo})}})});return}const wt=e==="softBin"?L.flatMap(h=>h?.sbinDefs??[]):L.flatMap(h=>h?.hbinDefs??[]),hn=new Set,vt=[];for(const h of wt)hn.has(h.bin)||(hn.add(h.bin),vt.push(h));const xt=vt.length>0?new Map(vt.map(h=>[h.bin,h])):null,yn=i??c.binColors??pe(),To=e==="softBin"?yn.soft:yn.hard,bn=h=>To.get(h)??zo;for(const h of u){const V=b.includes(h),te=xt?.get(h),ne=a.counts.get(h)??0;Nn(x,{color:bn(h),isActive:V,label:te?.name?`${h} \xB7 ${te.name}`:`Bin ${h}`,count:ne,percent:a.total>0?ne/a.total*100:void 0,onClick:Ye=>{const Ct=Pn(c.highlightBin,h,Ye);Nt(),R({highlightBin:Ct})}})}a.total>0&&u.length>1&&ee.appendChild(Ui(f.ownerDocument,[...a.counts.entries()].sort(([,h],[,V])=>V-h).map(([h,V])=>({color:bn(h),count:V,label:xt?.get(h)?.name?`${h} \xB7 ${xt.get(h).name}`:`Bin ${h}`})),a.total))}function We(e){const t=v.filter(a=>a!==null);if(!t.length)return[];const n=t.map(a=>a.dies.filter(Ki)),o=t[0].wafer,d=t.length,s=o.metadata?{...o,metadata:(({wafer:a,waferId:i,...r})=>r)(o.metadata)}:o;function l(a,i){return{...a,stats:{...a.stats,isLotStack:!0,aggregationMethod:i,lotSize:d}}}if(e==="stackedValues"){const a=xe();let i=a?.filter(Dt);if(a!==void 0&&i?.length===0)return[];if(a?.length||(i=Ro(t.flatMap(m=>m.dies)).map(m=>({testNumber:m,name:ji(void 0,m)}))),!i?.length)return[];const r=c.aggregationMethod??"mean";return i.map(u=>{const m=Si(n,r,u.testNumber),D={testNumber:0,name:u.name,unit:u.unit,...Ni(u)};return{wafer:s,dies:m,testDefs:[D],label:`${Vi(u,u.testNumber)} \xB7 ${r}`,isLotStack:!0,aggrMethod:r,lotSize:d,statsSummary:l(et({wafer:s,dies:m,testDefs:[D]},{testNumbers:[0]}),r)}})}if(e==="stackedBins"){let a=Ze(t.map(i=>i?.hbinDefs));return(!a||a.length===0)&&(a=[...new Set(t.flatMap(r=>r.dies.map(u=>u.hbin).filter(u=>u!=null)))].sort((r,u)=>r-u).map(r=>({bin:r,name:`Bin ${r}`}))),a.map(i=>{const r=Tn(n,i.bin,"hard"),u=[{bin:i.bin,name:i.name}];return{wafer:s,dies:r,hbinDefs:u,label:`${i.bin} \xB7 ${i.name}`,isLotStack:!0,aggrMethod:"countBin",lotSize:d,statsSummary:l(et({wafer:s,dies:r,hbinDefs:u}),"countBin")}})}if(e==="stackedSoftBins"){let a=Ze(t.map(i=>i?.sbinDefs));return(!a||a.length===0)&&(a=[...new Set(t.flatMap(r=>r.dies.map(u=>u.sbin).filter(u=>u!=null)))].sort((r,u)=>r-u).map(r=>({bin:r,name:`Bin ${r}`}))),a.map(i=>{const r=Tn(n,i.bin,"soft"),u=[{bin:i.bin,name:i.name}];return{wafer:s,dies:r,sbinDefs:u,label:`${i.bin} \xB7 ${i.name}`,isLotStack:!0,aggrMethod:"countBin",lotSize:d,statsSummary:l(et({wafer:s,dies:r,sbinDefs:u}),"countBin")}})}return t}function gt(e){const t=v.length;return e==="stackedBins"||e==="stackedSoftBins"?{valueRange:[0,t],lotSize:t}:e==="stackedValues"?{aggregationMethod:c.aggregationMethod??"mean",valueRange:void 0,lotSize:void 0}:{}}function R(e,{fireCallback:t=!0}={}){const n=Object.keys(e),o=c.plotMode,d=ve()!==null;c={...c,...e};const s=c.plotMode,l=be.has(s),a=o!==void 0&&be.has(o),i=je>0;if("binColorScheme"in e||"useDefinedBinColors"in e){const u=pe();c={...c,binColors:u},e={...e,binColors:u}}if(e.plotMode!==void 0)if(l){const u=gt(s);if(c={...c,...u},i)for(const m of M)m&&m.setOptions(e);else Z(We(s))}else if(a){const{valueRange:u,lotSize:m,aggregationMethod:D,...k}=c;if(c=k,i)for(const x of M)x&&x.setOptions(e);else Z(v.filter(x=>x!==null))}else for(const u of M)u&&u.setOptions(e);else if(e.aggregationMethod!==void 0&&s==="stackedValues")if(i)for(const u of M)u&&u.setOptions(e);else Z(We("stackedValues"));else for(const u of M)u&&u.setOptions(e);ve()!==null!==d&&Tt(),Ue(),Zt(),Xt(),_t();const r=e.plotMode!==void 0&&e.plotMode!==o;(Bi.some(u=>u in e)||r)&&H(),Oe(),Qt(),Jt(),rt(),at(),t&&p.onViewOptionsChange?.(Rn(c),n,ki(n))}function fn(e,t,n){const o=e.createElement("div");Object.assign(o.style,{display:"flex",alignItems:"center",gap:w.xs,flex:"1",minWidth:"0"});const d=e.createElement("span");d.textContent=t,Object.assign(d.style,{fontWeight:"700",fontSize:T.sub,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}),o.appendChild(d);const s=Hn(n??{});let l=null;if(s.length>0){const a=e.createElement("span");Object.assign(a.style,{fontSize:T.body,lineHeight:Qe.none,color:g.label,flexShrink:"0"}),a.textContent="\u25BE",o.appendChild(a),Object.assign(o.style,{cursor:"pointer",borderRadius:z.control}),o.addEventListener("mouseenter",()=>{o.style.background=g.bgHover}),o.addEventListener("mouseleave",()=>{o.style.background="none"}),l=e.createElement("div"),l.dataset.wmapCardMetaPanel="1",Object.assign(l.style,{position:"absolute",top:"0",left:"0",right:"0",zIndex:Cn,background:g.menuBg,borderBottom:`1px solid ${g.menuBorder}`,boxShadow:Ae.menu,padding:`${w.md} ${w.lg}`,fontSize:T.body,display:"none"});const i=Fn(n??{});i&&l.appendChild(i),o.setAttribute("aria-expanded","false"),o.setAttribute("aria-label",`Wafer info for ${t||"this card"}. Click to expand.`),En(o,r=>{a.textContent=r?"\u25B4":"\u25BE",o.setAttribute("aria-expanded",String(r)),l&&(l.style.display=r?"block":"none")})}return{wrap:o,metaPanel:l}}function pn(e,t,n){const o=e.box.querySelector("[data-wmap-window-title]"),d=Hn(n??{});if(!o||d.length===0)return;const s=o.parentElement,l=f.ownerDocument.createElement("div");Object.assign(l.style,{display:"flex",alignItems:"center",gap:w.xs,flex:"1",minWidth:"0",cursor:"pointer"}),Mt(l,"bare"),s?.insertBefore(l,o),l.appendChild(o);const a=f.ownerDocument.createElement("span");Object.assign(a.style,{fontSize:T.body,lineHeight:Qe.none,color:g.label,flexShrink:"0"}),a.textContent="\u25BE",l.appendChild(a);const i=f.ownerDocument.createElement("div");i.dataset.wmapCardMetaPanel="1",Object.assign(i.style,{position:"absolute",top:"0",left:"0",right:"0",zIndex:Cn,background:g.menuBg,borderBottom:`1px solid ${g.menuBorder}`,boxShadow:Ae.menu,padding:`${w.md} ${w.lg}`,fontSize:T.body,display:"none"});const r=Fn(n??{});r&&i.appendChild(r),e.contentWrap.style.position="relative",e.contentWrap.appendChild(i),l.setAttribute("aria-expanded","false"),l.setAttribute("aria-label",`Wafer info for ${t}. Click to expand.`),En(l,u=>{a.textContent=u?"\u25B4":"\u25BE",l.setAttribute("aria-expanded",String(u)),i.style.display=u?"block":"none"})}function ht(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:z.container,boxShadow:Ae.panel,overflow:"hidden",display:"flex",flexDirection:"column",position:"relative",aspectRatio:"1",maxWidth:ft(),maxHeight:ft()});const d=f.ownerDocument.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});const{wrap:s,metaPanel:l}=fn(document,Je(e,t),e.wafer.metadata??void 0);d.appendChild(s);const a=f.ownerDocument.createElement("button");a.dataset.wmapExpandBtn="1",a.setAttribute("aria-label","Open full view"),kn(a),a.innerHTML=$e.expand,Object.assign(a.style,{display:"flex",alignItems:"center",justifyContent:"center",border:`1px solid ${g.menuBorder}`,borderRadius:z.control,background:g.panelBg,color:g.label,padding:w.xxs,cursor:"pointer",flexShrink:"0",width:"22px",height:"22px"}),Mt(a),d.appendChild(a),o.appendChild(d);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),l&&i.appendChild(l),$.appendChild(o),o.addEventListener("contextmenu",D=>{if(D.defaultPrevented)return;const k=p.insights?.sweeps;if(!Di(e.testDefs,k))return;D.preventDefault();const x=e.viewOptions?{...c,...e.viewOptions}:c,b=Ei(e.dies,{waferLabel:On(e),testDefs:e.testDefs,isLotStack:e.isLotStack,activeTest:x.plotMode==="value"?x.activeTest:void 0,waferIndex:t}),B={x:D.clientX,y:D.clientY};import("./drilldown.js").then(({openDrilldownMenu:j})=>{o.isConnected&&j(B,o,b,{sweeps:k,onSaveImage:m.getSaveImageHook()})})});const r=Fe||ve()!==null,u=e.viewOptions?{...c,...e.viewOptions}:c,m=Ln(i,e,{viewOptions:{...u,showLegend:r,legendPosition:we},showTooltip:!0,padding:A,statsSummary:e.statsSummary,onSaveImage:p.onSaveImage,onSaveText:p.onSaveText,downloadFilename:p.downloadFilename,onClick:e.onClick,onSelect:jt(e),insights:X,onExpand:()=>Ie(t,e),showIdentity:!1,chromeInset:Uo,drawWhenVisible:!0});return m.setViewControlsVisible(!1),m.setSummaryVisible(!1),a.onclick=()=>Ie(t,e),{card:o,ctrl:m,canvasWrapper:i,expandBtn:a}}function Do(e){const t=ce[e];if(!t)return;const n=[..._.values()].find(o=>o.cardIndex===e);n?(t.innerHTML=$e.minimize,t.setAttribute("aria-label","Reattach to gallery"),t.onclick=()=>ko(n.id)):(t.innerHTML=$e.expand,t.setAttribute("aria-label","Open full view"),t.onclick=()=>Ie(e,L[e]))}function Z(e){Bo(),Me()?.remove(),De(null),ke(),L=[];for(const i of M)i&&i.destroy();M=[],le=[],ce=[],je=0,$.innerHTML="",rn=e.length,dn(e.map(i=>typeof i=="function"?null:i));const t=[];for(let i=0;i<e.length;i++){const r=e[i];if(typeof r=="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:z.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),$.appendChild(u),L.push(null),M.push(null),le.push(null),ce.push(null),t.push({index:i,factory:r,placeholder:u}),je++}else{const{ctrl:u,canvasWrapper:m,expandBtn:D}=ht(r,i,e.length);L.push(r),M.push(u),le.push(m),ce.push(D)}}Ut(),Ue(),rt(),at();const n=++Ce,o=()=>{setTimeout(()=>{n===Ce&&p.onItemsResolved?.()},0)},d=i=>{setTimeout(()=>{n===Ce&&p.onItemResolved?.(i,e.length)},0)};let s=e.length-t.length;s>0&&d(s);let l=0;function a(){if(n!==Ce)return;if(l>=t.length){if(be.has(c.plotMode)){const B=c.plotMode;Z(We(B));return}Ee=o,H(),fe||(Ee=null,o());return}const{index:i,factory:r,placeholder:u}=t[l++],m=r();L[i]=m,v[i]=m,dn([m]);const{card:D,ctrl:k,canvasWrapper:x,expandBtn:b}=ht(m,i,e.length);M[i]=k,le[i]=x,ce[i]=b,je--,u.replaceWith(D),d(++s),co(),ro(),!y&&!de?.placement&&m.statsSummary?.findings.length&&(y=kt("right",oe,f.ownerDocument),y.style.maxHeight="calc(100vh - 80px)",y.style.position="sticky",y.style.top="8px",y.style.flexDirection="column",y.style.display="none",(de?.placement??"right")==="left"?q.insertBefore(y,$):q.appendChild(y),H(),P||(P=Q("findings","Summary panel",()=>{if(!y)return;const j=y.style.display!=="none";j||H(),y.style.display=j?"none":"flex",Se(P,!j),ae()}),I.appendChild(K()),I.appendChild(P)),ae()),ae(),setTimeout(a,0)}t.length>0?setTimeout(a,0):o()}if(be.has(c.plotMode)&&v.length>0){const e=gt(c.plotMode);c={...c,...e},Z(We(c.plotMode))}else Z(C);Oe();let ye=0;const mn=new(f.ownerDocument.defaultView??window).ResizeObserver(()=>{if(ye)return;ye=(f.ownerDocument.defaultView??window).requestAnimationFrame(()=>{ye=0,E==null&&mt()})});mn.observe($),y&&H();function Eo(e,t){const n=le[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:T.body,textAlign:"center",padding:"0 12px"}),n.appendChild(o)}function Ie(e,t){for(const l of _.values())if(l.cardIndex===e)return;const n=Je(t,e),o=Kn++,d=M[e]?.getOptions(),s=ei(n);if(s){const l=s.document;l.title=n,Object.assign(l.documentElement.style,{height:"100%"}),Object.assign(l.body.style,{margin:"0",height:"100vh",overflow:"hidden",display:"flex",flexDirection:"column",fontFamily:T.family}),ii(f,l.documentElement);const a=li(f,l.documentElement,()=>x.setOptions({})),i=l.createElement("div");i.dataset.wmapWindowBanner="1",i.textContent=n,Object.assign(i.style,{display:"none",padding:`${w.sm} ${w.xl}`,fontSize:T.body,fontWeight:"700",background:g.warnBg,color:g.warnText,borderBottom:`1px solid ${g.warnBorder}`,flexShrink:"0"}),l.body.appendChild(i);const r=l.createElement("div");Object.assign(r.style,{flex:"1",minHeight:"0",display:"flex",flexDirection:"column"}),l.body.appendChild(r);const{wrap:u,metaPanel:m}=fn(l,n,t.wafer.metadata??void 0),D=l.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),r.appendChild(D);const k=l.createElement("div");Object.assign(k.style,{position:"relative",flex:"1",minHeight:"0",overflow:"hidden",display:"flex",flexDirection:"column"}),m&&k.appendChild(m),r.appendChild(k);const x=yt(k,t,void 0,d),b=setInterval(()=>{s.closed&&Xe(o)},400);s.addEventListener("pagehide",()=>Xe(o)),_.set(o,{id:o,ctrl:x,cardIndex:e,label:n,closePollId:b,stopThemeSync:a,close:()=>{s.closed||s.close()},setTitle:B=>{l.title=B,i.textContent=B,i.style.display="block"}})}else{const l=ti({title:n,onClose:()=>Xe(o),anchor:f});l.contentWrap.style.flexDirection="column",pn(l,n,t.wafer.metadata??void 0);const a=yt(l.contentWrap,t,void 0,d);_.set(o,{id:o,ctrl:a,cardIndex:e,label:n,closePollId:null,close:()=>l.close(),setTitle:i=>{const r=l.box.querySelector("[data-wmap-window-title]");r&&(r.textContent=i,r.title=i)}})}M[e]?.destroy(),M[e]=null,Eo(e,s!==null),Do(e)}function yt(e,t,n,o){const d=t.viewOptions?{...c,...t.viewOptions}:c,s=o?{...d,...o}:d,a={...n!==void 0?{...s,plotMode:"value",activeTest:n}:s,showLegend:!0,legendPosition:we},i=Ln(e,t,{viewOptions:a,showTooltip:!0,padding:A,statsSummary:t.statsSummary,onSaveImage:p.onSaveImage,onSaveText:p.onSaveText,downloadFilename:p.downloadFilename,onClick:t.onClick,onSelect:jt(t),insights:X,showExpandButton:!1,showIdentity:!1});return i.setViewControlsVisible(!0),i.setSummaryVisible(!0),i.setExpandVisible(!1),i}function Xe(e){const t=_.get(e);if(!t||(_.delete(e),t.closePollId!=null&&clearInterval(t.closePollId),t.stopThemeSync?.(),t.ctrl.destroy(),t.cardIndex===null))return;const n=t.cardIndex,o=L[n];if(!o)return;const{card:d,ctrl:s,canvasWrapper:l,expandBtn:a}=ht(o,n,L.length);le[n]?.parentElement?.replaceWith(d),M[n]=s,le[n]=l,ce[n]=a}function ko(e){const t=_.get(e);t&&(t.close(),Xe(e))}function Bo(){for(const e of _.values())e.cardIndex!==null&&(e.cardIndex=null,e.setTitle(`${e.label} \u2014 unlinked from gallery`))}function bt(){for(const e of M)e?.drawPendingNow()}const gn=f.ownerDocument.defaultView??window;gn.addEventListener("beforeprint",bt);function Oo(){bt();const e=[...$.querySelectorAll("canvas")];if(!e.length)return;const t=e.length,n=Math.ceil(Math.sqrt(t)),o=Math.ceil(t/n),d=e[0].width,s=e[0].height,l=8,a=(f.ownerDocument.defaultView??window).devicePixelRatio||1,i=Math.round(26*a),r=Math.round(12*a),u=f.ownerDocument.createElement("canvas");u.width=n*d+(n-1)*l,u.height=o*(s+i)+(o-1)*l;const m=u.getContext("2d"),D=Ko($);m.fillStyle=D.background,m.fillRect(0,0,u.width,u.height),e.forEach((k,x)=>{const b=x%n,B=Math.floor(x/n),j=b*(d+l),U=B*(s+i+l),wt=k.closest(".wmap-gallery-card")?.querySelector("span")?.textContent??"";m.fillStyle=D.surface,m.fillRect(j,U,d,i),m.fillStyle=D.text,m.font=`700 ${r}px system-ui, sans-serif`,m.textAlign="left",m.textBaseline="middle",m.fillText(wt,j+Math.round(10*a),U+i/2,d-Math.round(20*a)),m.drawImage(k,j,U+i)}),u.toBlob(k=>{if(!k)return;const x=M.find(b=>b!=null)?.getExportTitle();fi(k,["gallery",x].filter(Boolean).join(" "),He.onSaveImage)})}return{setItems(e){v=e.map(n=>typeof n=="function"?null:n);const t=c.plotMode;if(be.has(t))if(e.some(o=>typeof o=="function"))Z(e);else{const o=gt(t);c={...c,...o},Z(We(t))}else Z(e)},setOptions(e){R(e,{fireCallback:!1})},getOptions(){return Rn(c)},setFindingsNotice(e){At=e,H()},setColumns(e){cn(e)},getBinColors(){return c.binColors??pe()},setLotStatsSummary(e){N=e,Oe(),y&&H(),ae()},openUserGuide:tn,destroy(){Ce++,gn.removeEventListener("beforeprint",bt),fe?.cancel(),fe=null,Ee=null;for(const e of[..._.values()])e.closePollId!=null&&clearInterval(e.closePollId),e.close(),e.ctrl.destroy();_.clear();for(const e of M)e&&e.destroy();M=[],Me()?.remove(),mn.disconnect(),ye&&((f.ownerDocument.defaultView??window).cancelAnimationFrame(ye),ye=0),f.ownerDocument.removeEventListener("click",Ve,!0),window.removeEventListener("blur",$t),ie(),Sn(),Re.remove(),q.remove(),y?.remove(),ge?.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,12 +3,16 @@ 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';
15
+ import { type CompactMap } from '../core/compact.js';
12
16
  /**
13
17
  * Stable display preferences — worth persisting to localStorage or a user profile.
14
18
  * These describe how the user wants to view wafer maps in general.
@@ -46,6 +50,23 @@ export interface WaferPreferences {
46
50
  showQuadrantBoundaries?: boolean;
47
51
  showReticle?: boolean;
48
52
  showXYIndicator?: boolean;
53
+ /**
54
+ * Draw the axis labels (original die coordinates along the bottom and left edges). Unset, they
55
+ * appear while the map is zoomed and not otherwise; `true` shows them always, `false` never.
56
+ * The Overlays menu's **Axis labels** row sets it. Showing them reserves room for the labels,
57
+ * so the map is a little smaller.
58
+ */
59
+ showAxes?: boolean;
60
+ /**
61
+ * Draw the dies on a compact grid with the empty rows and columns removed and each group of
62
+ * dies outlined, instead of at their physical positions. Default false. The toolbar offers
63
+ * the toggle when the occupied rows and columns repeat at a regular pitch (a multi-project
64
+ * wafer), or at the supplied `reticleConfig` width and height; setting it here applies it
65
+ * regardless. Only the layout changes: every die is still drawn and counted, and axis labels
66
+ * stay original die coordinates. The wafer outline, rings, quadrants, reticle grid and XY
67
+ * indicator are not drawn in this layout.
68
+ */
69
+ compact?: boolean;
49
70
  /** Legend position for bin modes. Default 'default'. */
50
71
  legendPosition?: 'default' | 'compact' | 'bottom' | 'top' | 'left' | 'floating';
51
72
  /**
@@ -206,7 +227,7 @@ export interface RenderOptions extends ForwardedDrawOptions {
206
227
  /**
207
228
  * A prefix for every file the map saves — PNGs and CSVs alike. The lot,
208
229
  * wafer and content follow it (`<prefix>_W05_hard-bin.png`), except any the
209
- * prefix already names. See docs/api.md §5.4.5.
230
+ * prefix already names. See docs/api/render-map.md §5.4.5.
210
231
  */
211
232
  downloadFilename?: string;
212
233
  /**
@@ -411,6 +432,11 @@ export interface CardSharedState {
411
432
  * `stackedBins`/`stackedSoftBins` hover tooltips.
412
433
  */
413
434
  lotSize?: number;
435
+ /**
436
+ * The compact layout to draw when `compact` is on, built over every die the gallery shows,
437
+ * so all cards share one grid and stay comparable. A lone map builds its own from its dies.
438
+ */
439
+ compactMap?: CompactMap;
414
440
  }
415
441
  /** @internal */
416
442
  export type CardViewOptions = WaferViewOptions & CardSharedState;
@@ -431,6 +457,16 @@ export interface CardRenderOptions extends Omit<RenderOptions, 'viewOptions'> {
431
457
  chromeInset?: string;
432
458
  /** Replaces the expand action for both the expand button and the E key. */
433
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;
434
470
  /**
435
471
  * Draw the canvas only while it is on screen (or near it). An off-screen card
436
472
  * keeps its view up to date and is drawn when it scrolls into view, or by
@@ -439,6 +475,13 @@ export interface CardRenderOptions extends Omit<RenderOptions, 'viewOptions'> {
439
475
  * spent most of a mode switch drawing cards nobody could see.
440
476
  */
441
477
  drawWhenVisible?: boolean;
478
+ /**
479
+ * Told when the Summary panel opens or closes beside the map, with the width it took from the
480
+ * map when it opened. For a host that owns the box this map sits in and can widen it by that
481
+ * much, so the map keeps its size (`renderWaferGallery` does this for its detached windows).
482
+ * Without it a map expanded by its own Expand button does the same for its own modal.
483
+ */
484
+ onSummaryPanelChange?: (open: boolean, widthPx: number) => void;
442
485
  }
443
486
  /** @internal */
444
487
  export interface CardController extends WaferMapController {
@@ -446,6 +489,8 @@ export interface CardController extends WaferMapController {
446
489
  getOptions(): CardViewOptions;
447
490
  /** Show or hide the Summary toolbar button without affecting the panel's content. */
448
491
  setSummaryVisible(visible: boolean): void;
492
+ /** The dies selected on this map now. */
493
+ getSelectedDies(): Die[];
449
494
  /** Show or hide the view-control toolbar buttons (mode, orientation, etc). */
450
495
  setViewControlsVisible(visible: boolean): void;
451
496
  /** Show or hide the expand toolbar button. */
@@ -454,8 +499,12 @@ export interface CardController extends WaferMapController {
454
499
  getExportTitle(): string;
455
500
  /** This map's save hook, naming files for its own wafer — for a save the gallery starts on a card's behalf. */
456
501
  getSaveImageHook(): SaveImageHandler;
502
+ /** The same for CSV: names files for this map's own wafer. */
503
+ getSaveTextHook(): SaveTextHandler;
457
504
  /** Draw now if a `drawWhenVisible` card skipped drawing while off screen. */
458
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;
459
508
  }
460
509
  /** @internal The public view of a card's options: everything but the gallery's shared state. */
461
510
  /** The bin a finding is about — what the legend filter shows while the finding
@@ -1 +1 @@
1
- import{buildView as Hi,buildHoverText as Vi,findTestDef as vt,resolveTestNumber as qt,buildMapTitle as Yi}from"../renderer/buildView.js";import{drawMapCanvas as Xi,BIN_LEGEND_W as Jn,BIN_LEGEND_W_COMPACT as Ni,BIN_LEGEND_ADAPT_COMPACT as ji,BIN_LEGEND_ADAPT_FLOATING as _i,PATH_SHAPES as Ki}from"./toCanvas.js";import{buildWaferMap as $i,getTestPassStatus as Gi,isParametricTest as Jt}from"../renderer/buildWaferMap.js";import{analyzeWaferMap as Ui}from"../stats/analyzeWaferMap.js";import{SHADOW as Zi,LEADING as ei,wireControlHover as ti,SPACE as Y,EDGE_GUTTER as Qi,RADIUS as ni,FONT as xt,CLR as M,applyOverlayZ as qi,getTooltip as ii,hideTooltip as wt,positionTooltip as oi,createToolbarHelpers as Ji,buildModeMenuEl as eo,openReparentedModal as to,openUserGuideWindow as no,makePaletteBtn as io,makeLogScaleBtn as oo,makeLegendStyleBtn as so,makeOverlaysBtn as lo,makeOrientationBtn as ao,menuLayerFor as si,saveImageBlob as ro,markMenuTrigger as nt,wireMenuA11y as li,wireExpandToggle as co,nextFrame as en,requestedPassFailDisplay as fo,overlayMenuRows as po,anyOverlayActive as uo,logWmapVersionOnce as go,buildDataModeEntries as ho,metadataKeyHasData as mo,metadataModeEntry as yo}from"./toolbar.js";import{waferIdentityLabel as bo}from"../core/waferLabel.js";import{metadataDisplayValue as vo}from"../core/metadata.js";import{withExportContext as xo}from"./exportName.js";import{createSummaryPanelEl as tn,wrapWithSummaryPanel as nn,renderWaferSummaryContentSteps as wo}from"./summaryPanel.js";import{runChunked as Co}from"./chunked.js";import{collectWarnings as So,buildWarningsMenuEl as Mo,severityOf as Eo}from"./warnings.js";import{ICONS as ai}from"./icons.js";import{hasDrilldownTargets as Do,selectionPopulation as ko,waferPopulation as Bo}from"./chartPopulation.js";import{createIdentityHeader as Lo,collapsedLabel as on}from"./identityHeader.js";import{getDieKey as he,hasPosition as ri,isPositionedDie as To}from"../core/dies.js";import{buildDieListSection as Po}from"./dieList.js";import{buildMaplessSummary as Oo}from"./maplessSummary.js";import{resolveBinColors as Ro,binColorWarning as Io}from"../renderer/binColors.js";import{INPUT_DEFAULT_PASS_BINS as Wo}from"../core/passBins.js";import{toggleHighlight as di}from"../core/utils.js";const ci=new Set(["binColorScheme","valueColorScheme","reverseValueScheme","useDefinedBinColors","rotation","flipX","flipY","showDieLabels","showRingBoundaries","showQuadrantBoundaries","showReticle","showXYIndicator","legendPosition","logScale","colorbarRangeMode","markFailingDies","fallbackFormat"]);export const COLOR_KEYS=["binColorScheme","valueColorScheme","reverseValueScheme","useDefinedBinColors","binColors"];export function classifyChanged(L){const m=L.some(p=>ci.has(p)),S=L.some(p=>!ci.has(p));return m&&S?"mixed":m?"preference":"state"}export function findingBin(L){const{kind:m,bin:S}=L.variable;return m==="hardBin"||m==="softBin"?S:void 0}export function toPublicViewOptions(L){const{metadataValueOrder:m,binColors:S,lotSize:p,...B}=L;return B}export function renderWaferMap(L,m,S={}){return renderWaferMapCard(L,m,S)}export function renderWaferMapCard(L,m,S={}){go();const p=L.ownerDocument,B=p.defaultView??window,sn=()=>ie.label,ln=()=>bo({label:sn(),wafer:_}),me=xo(()=>{const e=vo(_.metadata?.lot);return{prefix:S.downloadFilename,lots:e!==void 0?[e]:[],...ie.isLotStack?{stackedWafers:h?.lotSize??!0}:{wafer:ln()}}},S.onSaveImage,S.onSaveText);function an(){const e=h.plotMode==="softBin"||h.plotMode==="stackedSoftBins"?J:q,{primary:t,secondary:n}=Yi(h,c.fallbackFormat,e);return[t,ie.isLotStack?"":n].filter(Boolean).join(" ")||"wafer-map"}B.getComputedStyle(L).position==="static"&&(L.style.position="relative");const fi=L.clientHeight;S.height!=null&&(L.style.height=typeof S.height=="number"?`${S.height}px`:S.height);const Ct=m.dataCoverage?m.dataCoverage.unpositionedDies:m.dies.filter(e=>!ri(e)).length,Ae=(m.dataCoverage?m.dataCoverage.totalDies:m.dies.length-Ct)===0&&Ct>0,Fe=p.createElement("div");Object.assign(Fe.style,{display:"flex",flexDirection:"column",width:"100%",height:"100%"}),L.appendChild(Fe);const De=p.createElement("div");Object.assign(De.style,{position:"relative",width:"100%",flex:"1 1 auto",minHeight:"0"});const ye=S.chromeInset??Qi,Q=p.createElement("div");Object.assign(Q.style,{display:"flex",alignItems:"stretch",gap:Y.sm,background:M.canvasBg,paddingBottom:Y.lg,paddingTop:ye,paddingLeft:ye,paddingRight:ye,flexShrink:"0",minWidth:"0"}),Fe.appendChild(Q),Fe.appendChild(De);function ze(){const e=[...Q.children].some(t=>t.style.display!=="none");Q.style.display=e?"flex":"none"}const k=p.createElement("div");Object.assign(k.style,{position:"relative",width:"100%",height:"100%"});const s=p.createElement("canvas");Object.assign(s.style,{width:"100%",height:"100%",display:"block"}),k.appendChild(s),De.appendChild(k);let it=null;if(Ct>0){let n=function(){if(t){const r=Po(e,m.testDefs,{...S.dieList,onSaveText:me.onSaveText,waferMetadata:_.metadata,metadataFields:xe,ownerDocument:p});if(r)return r}const o=vt(m.testDefs,c.activeTest??0),a=Jt(o)?c.logScale??o?.logScale??!1:!1;return Oo(e,m.testDefs,{plotMode:c.plotMode??"hardBin",activeTest:c.activeTest,hbinDefs:q,sbinDefs:J,binColors:h.binColors,valueColorScheme:c.valueColorScheme,reverseValueScheme:c.reverseValueScheme,logScale:a,colorbarRangeMode:c.colorbarRangeMode,valueRangeDies:m.dies})},i=function(o){const a=p.createElement("button");return a.type="button",ti(a),Object.assign(a.style,{fontSize:xt.body,padding:`${Y.xxs} ${Y.sm}`,borderRadius:ni.control,flexShrink:"0",border:`1px solid ${M.menuBorder}`,background:M.menuBg,color:M.text,cursor:"pointer"}),a.textContent=t?"View chart":"View die list",a.addEventListener("click",r=>{r.stopPropagation(),t=!t,a.textContent=t?"View chart":"View die list",o()}),a};const e=m.dies.filter(o=>!ri(o));let t=!1;if(Ae){const o=p.createElement("div");Object.assign(o.style,{position:"absolute",inset:"0",background:M.panelBg,padding:Y.xl,boxSizing:"border-box",overflow:"hidden",display:"flex",flexDirection:"column",gap:Y.md,zIndex:"1"});const a=p.createElement("div");Object.assign(a.style,{display:"flex",justifyContent:"space-between",alignItems:"flex-start",gap:Y.md});const r=p.createElement("span");Object.assign(r.style,{fontSize:xt.body,color:M.label,lineHeight:ei.base}),r.textContent="No die position data for this wafer.",a.appendChild(r);const l=p.createElement("div");Object.assign(l.style,{flex:"1",minHeight:"0",overflow:"auto",display:"flex",flexDirection:"column"}),a.appendChild(i(()=>l.replaceChildren(n()))),o.appendChild(a),o.appendChild(l),k.appendChild(o),it=()=>{t||l.replaceChildren(n())}}else{const o=p.createElement("div");Object.assign(o.style,{position:"absolute",left:"0",right:"0",bottom:"0",zIndex:"3",background:M.panelBg,borderTop:`1px solid ${M.menuBorder}`,fontSize:xt.body,color:M.text,cursor:"pointer",padding:`${Y.xs} ${Y.md}`,display:"flex",alignItems:"center",justifyContent:"space-between",gap:Y.md}),ti(o,"bare");const a=p.createElement("span");a.textContent=`+${e.length} ${e.length===1?"die":"dies"} without position data`,o.appendChild(a);const r=p.createElement("span");r.textContent="\u25BE",Object.assign(r.style,{fontSize:xt.body,lineHeight:ei.none,color:M.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 l=null,d=null;co(o,f=>{if(r.textContent=f?"\u25B4":"\u25BE",o.setAttribute("aria-expanded",String(f)),f){l=p.createElement("div");const g=o.getBoundingClientRect().height||28;Object.assign(l.style,{position:"absolute",left:"0",right:"0",bottom:`${g}px`,top:"20%",zIndex:"2",background:M.panelBg,borderTop:`1px solid ${M.menuBorder}`,padding:Y.md,boxSizing:"border-box",display:"flex",flexDirection:"column",gap:Y.md}),l.addEventListener("click",N=>N.stopPropagation());const v=p.createElement("div");Object.assign(v.style,{display:"flex",justifyContent:"flex-end"}),v.appendChild(i(()=>{d&&d.replaceChildren(n())})),l.appendChild(v),d=p.createElement("div"),Object.assign(d.style,{flex:"1",minHeight:"0",overflow:"auto",display:"flex",flexDirection:"column"}),d.appendChild(n()),l.appendChild(d),k.appendChild(l)}else l&&(l.remove(),l=null,d=null)}),k.appendChild(o),it=()=>{d&&!t&&d.replaceChildren(n())}}}const{onHover:ot,onClick:pi,onSelect:ae,onViewOptionsChange:ui,showTooltip:gi=!0,showToolbar:He=!0,showIdentity:rn=!0,summaryPanel:Ve,showHelpButton:dn=!1,userGuideExtension:hi,onExpand:cn,showExpandButton:fn=!0,zIndex:mi,insights:be,warnings:pn,viewOptions:yi={},...ke}=S,Ye=be?.enabled??!1,bi=.4,vi=20,st=[...m.passBins??Wo],un=pn?.display??!0,xi=qi(mi);let fe=S.statsSummary,pe=[],gn=!1,lt=null,hn=!1;function St(){const e=So({result:m,statsSummary:fe,extra:lt?[lt]:[]}),t=e.length!==pe.length||e.some((n,i)=>n.code!==pe[i]?.code||n.message!==pe[i]?.message);pe=e,(t||!gn)&&(gn=!0,pn?.onWarning?.(e))}St();let ie=m,_=m.wafer,ve=m.dies,x=new Set;const wi={sweeps:be?.sweeps,onSaveImage:me.onSaveImage},Mt=()=>!Ae&&Do(ee,be?.sweeps);let mn=null,at=null,rt=!1,yn=!1,q=m.hbinDefs,J=m.sbinDefs,ee=m.testDefs,xe=m.metadataFields,bn=m.reticles?.length?m.reticles:void 0,vn=m.reticleConfig,xn=m.dataAxisFlip,Et=m.isLotStack??!1,Dt=m.aggrMethod,kt=m.lotSize;const Ci=He&&Ye;let K=null,oe=null,se=null;rn&&(K=Lo(on(_.metadata??{},Xe())??"",_.metadata,{lotStack:Xe(),ownerDocument:p}),k.appendChild(K.metaPanel),K.metaPanel.style.visibility="visible",K.isEmpty()||(oe=wn(K.wrap),Q.insertBefore(oe,Q.firstChild),ze()));function wn(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 Xe(){return Et?{lotSize:kt??1,aggrMethod:Dt}:void 0}function Si(){if(!K)return;K.update(on(_.metadata??{},Xe())??"",_.metadata,Xe());const e=oe?.isConnected??!1,t=!K.isEmpty();!t&&e?(oe.remove(),oe=null):t&&!e&&(oe=wn(K.wrap),oe.style.display="",Q.insertBefore(oe,Q.firstChild),ze())}const Mi=[...q??[],...J??[]].some(e=>e.color);let c={plotMode:"hardBin",showDieLabels:!1,showRingBoundaries:!1,showQuadrantBoundaries:!1,showReticle:!1,showXYIndicator:!1,rotation:0,flipX:!1,flipY:!1,legendPosition:"default",...yi},$=null,le=!1,Cn=null;function Ei(){return Ye?$?Promise.resolve($):(Cn??=import("./insightsTab.js").then(({createInsightsTab:e})=>($=e({getItems:()=>[{wafer:_,dies:ve,hbinDefs:q,sbinDefs:J,testDefs:ee,label:sn(),passBins:st,statsSummary:fe}],getBinColors:()=>h.binColors,getRingCount:()=>ie.ringCount??4,onSaveImage:me.onSaveImage,onSaveText:me.onSaveText,defaultView:be?.defaultView,sweeps:be?.sweeps,onRemoveSweeps:be?.onRemoveSweeps,showMetadataStrip:!1,contentInset:ye,backTab:Ci?void 0:{label:"Map",onBack:()=>Ne(!1)},onOpenGuide:dn&&!He?()=>Gt():void 0,focusTest:t=>{R({plotMode:"value",activeTest:t,highlightBin:void 0}),Ne(!1)},ownerDocument:p}),Object.assign($.el.style,{position:"absolute",inset:"0",background:M.canvasBg,overflowY:"auto",paddingTop:"0"}),$.el.style.display="none",De.appendChild($.el),$)),Cn):Promise.resolve(null)}let Sn=0;const Bt=["wheel","touchstart","pointerdown","keydown"];function Di(e,t){if(t<=0)return;let n=!1;const i=[],o=()=>{n=!0;for(const r of i)B.clearTimeout(r);i.length=0;for(const r of Bt)e.removeEventListener(r,o)},a=()=>n||!le?!0:(e.scrollTop=t,e.scrollTop>=t);if(!a()){for(const r of Bt)e.addEventListener(r,o,{passive:!0,once:!0});for(const r of[0,50,150,300,600])i.push(B.setTimeout(()=>{a()},r));i.push(B.setTimeout(()=>{for(const r of Bt)e.removeEventListener(r,o)},700))}}function Ne(e){if(!Ye)return;const t=le;le=e,$&&!e&&t&&(Sn=$.el.scrollTop),$&&($.el.style.display=e?"flex":"none"),k.style.visibility=e?"hidden":"",H&&(H.style.display=e||Ae?"none":"flex"),O&&(O.style.display=e?"none":"flex"),se&&(se.style.display=Me?"none":"flex"),re&&(re.style.display="flex"),oe&&(oe.style.display=""),ze(),K&&e&&K.collapse(),pt(),X&&(X.innerHTML=e?ai.wafer:ai.analysis,X.ariaLabel=e?"Back to wafer view":"Insights"),e&&Ei().then(n=>{!n||!le||(n.el.style.display="flex",n.render(),Di(n.el,Sn))})}Ye&&be?.defaultOpen&&queueMicrotask(()=>Ne(!0));let h,je,G=null,T=null,Lt=[],Tt;function Mn(e){Tt!==e&&(Tt=e,C())}let we=null,Pt=ke.legendOffset??{x:0,y:0},_e=!1,Be=!1,Ke={x:0,y:0},Ot={x:0,y:0},Ce=!1,Le=!1,j="select",Te={x:0,y:0},dt={x:0,y:0},W={x:0,y:0},A={x:0,y:0},$e=!1,Pe=!1;function Rt(){const e=c;h=Hi(_,ve.filter(To),{plotMode:e.plotMode,binColorScheme:e.binColorScheme,valueColorScheme:e.valueColorScheme,reverseValueScheme:e.reverseValueScheme,useDefinedBinColors:e.useDefinedBinColors,binColors:e.binColors??Ro(ve,{passBins:st,binColorScheme:e.binColorScheme,hbinDefs:q,sbinDefs:J,useDefinedBinColors:e.useDefinedBinColors}),passBins:st,showDieLabels:e.showDieLabels,showRingBoundaries:e.showRingBoundaries,showQuadrantBoundaries:e.showQuadrantBoundaries,showReticle:e.showReticle,showXYIndicator:e.showXYIndicator,reticles:bn,ringCount:ie.ringCount??4,highlightBin:e.highlightBin,highlightMetadataValue:e.highlightMetadataValue,activeTest:e.activeTest,activeMetadataKey:e.activeMetadataKey,testDefs:ee,valueRange:e.valueRange,metadataValueOrder:e.metadataValueOrder,logScale:e.logScale,isLotStack:Et,aggregationMethod:Dt??e.aggregationMethod,lotSize:kt??e.lotSize,dataAxisFlip:xn,colorbarRangeMode:e.colorbarRangeMode,passFailDisplay:e.passFailDisplay,fallbackFormat:e.fallbackFormat,interactiveTransform:{rotation:e.rotation??0,flipX:e.flipX??!1,flipY:e.flipY??!1}},{hbinDefs:q,sbinDefs:J,metadataFields:xe}),je=void 0;const t=e.binColors?null:Io(h.binColors,h.plotMode);t?.message!==lt?.message&&(lt=t,St(),hn&&At())}Rt();let te=null,Oe=null,Re=null,En=S.findingsNotice,ki={},F=null,ue=null;function Bi(e){const{kind:t,index:n}=e.variable;R(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")&&Bn(i.dieKeys)}const Ge=new Map,It=new WeakSet;function Wt(e){if(Ge.get(e)?.cancel(),Ge.delete(e),e.style.display==="none"){It.add(e);return}It.delete(e);const t=Co(wo(e,{wafer:_,dies:ve,yieldSummary:ie.yield,dataCoverage:ie.dataCoverage,hbinDefs:q,sbinDefs:J,testDefs:ee,statsSummary:fe,warnings:un?pe:[],passBins:st,ringCount:ie.ringCount??4,binColors:h.binColors,plotMode:c.plotMode??"hardBin",metadataShownElsewhere:rn,fallbackFormat:c.fallbackFormat,activeFindingId:Re,findingsFilter:ki,findingsNotice:En,onFindingsFilterChange:ge,onSaveText:me.onSaveText,metadataFields:xe,dieListOptions:S.dieList,onFindingClick:(n,i)=>{Re===n.id?(Re=null,Bn([]),R({highlightBin:void 0})):(Re=n.id,Bi(n)),ge()}}));t.done||Ge.set(e,t)}function ge(){te&&Wt(te)}function Ue(){F&&Wt(F)}if(Ve?.placement){const e=Ve.placement;te=tn(e,ye,p);const t=k.parentElement,n=k.nextSibling;Oe=nn(k,te,e),t?.insertBefore(Oe,n),ge()}else if(fe){const e=Ve?.defaultOpen??!He;F=tn("right",ye,p),F.style.display=e?"block":"none";const t=k.parentElement,n=k.nextSibling;ue=nn(k,F,"right"),t?.insertBefore(ue,n),Ue()}const z=gi?ii(p):null;let re=null,P=null,H=null,O=null,ct=null,U=null,Dn=null,X=null,de=null,ft=null;hn=!0;function At(){if(!de||!ft)return;const e=pe.length,t=e>0;if(de.style.display=t?"flex":"none",ft.style.display=t?"":"none",!t)return;const n=Eo(pe[0]),i=`${e} data ${e===1?"warning":"warnings"}`;de.style.color=n==="error"?M.errText:M.warnText,de.ariaLabel=n==="error"?`${i} \u2014 the map may be positionally wrong`:i}let Ft=null,kn=null,zt=null,Ht=null,Vt=null,Yt=null;function Se(e="selection"){Re!==null&&(Re=null,e==="selection"?R({highlightBin:void 0}):(x=new Set,ae?.([])),ge())}function Bn(e){x=new Set(e??[]),ae&&ae(Ze()),C()}function pt(){if(!U)return;const e=!!(te??F);U.style.display=fe&&e&&!le?"flex":"none";const t=te??F,n=t?t.style.display!=="none":!1;fe?.hasNotableFindings&&!n?U.style.color=M.findingIndicator:U.dataset.active||(U.style.color=M.icon)}let Ln=null;function Tn(e){const t=te??F;t&&(t.style.display=e?"block":"none",e&&It.has(t)&&Wt(t),U&&Ln?.(U,e),pt())}if(He){let g=function(y){j=y,i(N,y==="zoom"),i(w,y==="pan"),ct&&i(ct,y==="select"),s.style.cursor=y==="pan"?"grab":"crosshair"};re=p.createElement("div"),re.dataset.wmapToolbar="single",Object.assign(re.style,{marginLeft:"auto",flexShrink:"0",display:"flex",flexDirection:"row",alignItems:"center",flexWrap:"wrap-reverse",justifyContent:"flex-end",maxWidth:"100%",background:M.menuBg,border:`1px solid ${M.menuBorder}`,borderRadius:ni.control,boxShadow:Zi.panel,pointerEvents:"auto"});const e=ii(p),t=Ji(e),{makeBtn:n,setActive:i,makeSep:o,makeMenuRow:a,makeMenuSection:r,closeOpenMenu:l,getOpenMenu:d,setOpenMenu:f}=t;Ln=i,Ft=l,kn=d,p.addEventListener("click",l,!0),H=p.createElement("div"),Object.assign(H.style,{display:Ae?"none":"flex",alignItems:"center",gap:"0",flexWrap:"wrap",justifyContent:"flex-end"}),re.appendChild(H);const v=n("download","Download PNG",Oi);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)),E=n("reset","Reset zoom (double-click)",()=>ht());H.appendChild(N),H.appendChild(ne),H.appendChild(b),H.appendChild(E),H.appendChild(o());const w=n("pan","Pan (drag to move)",()=>g("pan"));H.appendChild(w),ct=n("boxSelect","Select (drag to select dies)",()=>g("select")),H.appendChild(ct);{const y=n("drilldown","Chart this wafer",()=>{const V=y.getBoundingClientRect();Vn({x:V.left,y:V.bottom+4},y)});y.setAttribute("aria-haspopup","menu"),at=y,Hn(),H.appendChild(y)}g(j);{let y=function(u){return u.plotMode!==(c.plotMode??"hardBin")?!1:u.plotMode==="value"?(c.activeTest??0)===(u.activeTest??0):u.plotMode==="metadata"?c.activeMetadataKey===u.activeMetadataKey:!0},V=function(u,D){u.activeTest!==void 0?R({plotMode:u.plotMode,activeTest:u.activeTest,activeMetadataKey:void 0,logScale:u.logScale}):u.activeMetadataKey!==void 0?R({plotMode:u.plotMode,activeTest:void 0,activeMetadataKey:u.activeMetadataKey,passFailDisplay:"off"}):R({plotMode:u.plotMode,activeTest:void 0,activeMetadataKey:void 0,passFailDisplay:"off"}),D.remove(),f(null),nt(I,!1)};P=p.createElement("div"),Object.assign(P.style,{display:"flex",alignItems:"center",gap:"0",flexWrap:"wrap",justifyContent:"flex-end"}),re.appendChild(P),O=p.createElement("div"),Object.assign(O.style,{display:"flex",alignItems:"center",gap:"0"}),P.appendChild(O),O.appendChild(o());const ce=()=>{const u=d();u&&(u.remove(),f(null)),nt(I,!1)},I=n("mode","Plot mode",()=>{if(d()){ce();return}const u=ve,D=h.testDefs,{testEntries:bt,binEntries:Ee,stackedEntries:Je}=ho(u,D,{includeStacked:h.isLotStack}),Qt=(xe??[]).filter(tt=>mo(u,tt.key)).map(yo),et=eo(I.getBoundingClientRect(),bt,Ee,Je,y,V,{makeMenuRow:a,makeMenuSection:r},c.plotMode??"hardBin",I.ownerDocument.defaultView??window,Qt);si(I).appendChild(et),f(et),nt(I,!0),li(et,I,ce)});nt(I,!1);const{btn:mt,sync:qe}=io(t,()=>({...c,plotMode:c.plotMode??"hardBin"}),()=>Mi,R);Ht=qe,Ht();const Ut=lo(t,()=>{const u=!!h.hasReticle,D=(c.plotMode??"hardBin")==="value",{testNumber:bt}=qt(c.activeTest??0,h.testDefs),Ee=vt(h.testDefs,bt),Je=D&&Ee!==void 0&&!Jt(Ee),Qt=D&&!Je&&(Ee?.limitLow!==void 0||Ee?.limitHigh!==void 0),et=D&&!Je&&h.dies.some(tt=>Gi(tt,bt,Ee)!==void 0);return po(c,u,{functionalActive:Je,hasLimits:Qt,hasRecorded:et,binMode:(c.plotMode??"hardBin")==="hardBin"||(c.plotMode??"hardBin")==="softBin"},tt=>R(tt))},()=>uo(c)),{btn:Zt,sync:Ii}=so(t,()=>c,u=>R({legendPosition:u}));zt=Ii,zt();const qn=()=>{const{testNumber:u}=qt(c.activeTest??0,ee),D=vt(ee,u);return D!==void 0&&!Jt(D)},{btn:Wi,sync:Ai}=oo(t,()=>({...c,functionalActive:qn()}),u=>R(u));Vt=Ai,Vt();const Fi=()=>{const{testNumber:u}=qt(c.activeTest??0,ee),D=vt(ee,u);return D!==void 0&&(D.limitLow!==void 0||D.limitHigh!==void 0)},yt=n("specRange","Colorbar range: test limits",()=>{const u=c.colorbarRangeMode==="data"?"spec":"data";R({colorbarRangeMode:u})});Yt=()=>{const u=c.plotMode==="value"&&Fi()&&fo(c)==="off"&&!qn();yt.style.display=u?"":"none";const D=(c.colorbarRangeMode??"spec")==="spec";i(yt,D),yt.ariaLabel=D?"Colorbar range: test limits (click for data range)":"Colorbar range: data range (click for test limits)"},Yt();const zi=ao(t,()=>c,u=>R(u));O.appendChild(I),O.appendChild(mt),O.appendChild(Wi),O.appendChild(yt),Ae||(O.appendChild(o()),O.appendChild(Ut),O.appendChild(o()),O.appendChild(Zt),O.appendChild(o()),O.appendChild(zi)),fe&&(U=n("findings","Summary panel",()=>{const u=te??F;u&&Tn(u.style.display==="none")}),P.appendChild(o()),P.appendChild(U),F?.style.display!=="none"&&i(U,!0),pt()),un&&(ft=o(),de=n("warning","Data warnings",()=>{const u=d();if(l(new MouseEvent("click")),u)return;const D=Mo(de.getBoundingClientRect(),pe,B);si(De).appendChild(D),f(D),li(D,de,()=>l(new MouseEvent("click")))}),nt(de,!1),P.appendChild(ft),P.appendChild(de),At()),Ye&&(P.appendChild(o()),X=n("analysis","Insights",()=>{Ne(!le),i(X,le)}),X.dataset.wmapInsightsBtn="1",P.appendChild(X)),fn&&(P.appendChild(o()),se=n("expand","Expand (E)",cn??Pn),P.appendChild(se)),dn&&(P.appendChild(o()),Dn=n("help","User guide",()=>Gt()),P.appendChild(Dn))}Q.appendChild(re),ze()}let Me=null;function Pn(){Me&&(Me.close(),Me=null);const e=De;e.style.flex="1",e.style.minWidth="0",e.style.minHeight="0";const t=on(_.metadata??{},Xe()),n=Q.childElementCount>0?[Q,e]:[e],i=to(n,{ownerDocument:p,boxSize:le?{width:"min(96vw, 1600px)",height:"min(92vh, 1000px)"}:void 0,onClosed:()=>{Me=null,se&&(se.style.display="flex"),le||s.focus({preventScroll:!0})}});i&&(i.box.setAttribute("aria-label",t??"Expanded wafer map"),n.length>1&&(i.contentWrap.style.flexDirection="column"),Me=i,se&&(se.style.display="none"))}function On(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},e.plotMode!==void 0&&e.plotMode,Object.keys(e).every(a=>a==="legendPosition"||a==="showLegend"||a==="markFailingDies")||Rt(),zt?.(),Ht?.(),Vt?.(),Yt?.(),C();const i=e.plotMode!==void 0&&e.plotMode!==t,o=COLOR_KEYS.some(a=>a in e);(o||i)&&(ge(),Ue()),(o||i||e.activeTest!==void 0||e.logScale!==void 0||e.colorbarRangeMode!==void 0)&&it?.()}function R(e){On(e);const t=Object.keys(e);ui?.(c,t,classifyChanged(t))}let Xt=!1;const Nt=S.drawWhenVisible&&B.IntersectionObserver?new B.IntersectionObserver(e=>{Ie=e[e.length-1].isIntersecting,Ie&&ut&&C()},{rootMargin:"25%"}):null;let Ie=Nt===null,ut=!1;Nt?.observe(s);function jt(){Xt||(Xt=!0,en(()=>{Xt=!1,C()},B))}function C(){if(!Ie){ut=!0;return}ut=!1;const e=T??void 0,t=h.dies[0],n=t?{x:t.width,y:t.height}:ke.diePitchMm,i=Math.floor(s.clientWidth||s.width),o=!!(q?.length||J?.length||h.dies.some(v=>v.hbin!=null||v.sbin!=null)),a=c.legendPosition??"default",r=c.showLegend??!0,l=a==="default"||a==="compact",d=(ke.colorbarWidth??16)+28,f=o&&l?a!=="default"?Math.max(Jn,d):i<_i?0:i<ji?Math.max(Ni,d):Math.max(Jn,d):void 0,g=Xi(s,h,{...ke,minRightReserve:r?f:0,showColorbar:r&&(ke.showColorbar??!0),markFailingDies:c.markFailingDies??!1,legendPosition:a,legendOffset:Pt,diePitchMm:n,fallbackFormat:c.fallbackFormat,showAxes:ke.showAxes??T!==null,viewport:e,activeBin:c.plotMode==="metadata"?c.highlightMetadataValue:c.highlightBin,hoverBin:Tt,afterDies:x.size>0?Li:void 0,hbinDefs:q,sbinDefs:J,metadataFields:xe});Lt=g.binLegendRows,we=g.legendBox??null,T===null&&(G=g.viewport),Le&&Pi(),Hn()}function Li(e,t,n){const i=h.hoverPoints,o=h.rectangles[0],a=o?o.width/2*t.ppm:t.ppm*.5,r=o?o.height/2*t.ppm:t.ppm*.5,l=new Set;x.size>0&&(je??=new Map(h.dies.map((b,E)=>[he(b),E])));for(const b of x){const E=je.get(b);E!==void 0&&l.add(E)}if(!l.size)return;e.save(),e.setLineDash([]),e.fillStyle=n.background,e.globalAlpha=.7;let d=0;e.beginPath();for(let b=0;b<i.length;b++)l.has(b)||(e.rect(t.originX+i[b].x*t.ppm-a,t.originY-i[b].y*t.ppm-r,a*2,r*2),++d===Ki&&(e.fill(),e.beginPath(),d=0));d&&e.fill(),e.globalAlpha=1;const{cw:f,ch:g}=Ti(t,a,r),v=new Map,N=b=>Math.round(b*100),ne=(b,E,w,y)=>{const V=`${N(b)},${N(E)},${N(w)},${N(y)}`;v.has(V)?v.delete(V):v.set(V,[b,E,w,y])};for(const b of l){const E=t.originX+i[b].x*t.ppm,w=t.originY-i[b].y*t.ppm,y=E-f,V=E+f,ce=w-g,I=w+g;ne(y,ce,V,ce),ne(y,I,V,I),ne(y,ce,y,I),ne(V,ce,V,I)}e.strokeStyle=n.text,e.lineWidth=2,e.lineCap="square",e.beginPath();for(const[b,E,w,y]of v.values())e.moveTo(b,E),e.lineTo(w,y);e.stroke(),e.restore()}function Ti(e,t,n){const i=h.hoverPoints,o=h.dies;let a=0,r=0;for(let l=0;l<o.length&&(!a||!r);l++){const d=o[l];if(!(d.x==null||d.y==null))for(const f of[je.get(`${d.x+1},${d.y}`),je.get(`${d.x},${d.y+1}`)]){if(f===void 0)continue;const g=Math.abs(i[f].x-i[l].x)*e.ppm,v=Math.abs(i[f].y-i[l].y)*e.ppm;g>v?a||=g/2:r||=v/2}}return{cw:a||t,ch:r||n}}function Pi(){const e=s.getContext("2d"),t=Math.min(W.x,A.x),n=Math.min(W.y,A.y),i=Math.abs(A.x-W.x),o=Math.abs(A.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 Rn(){if(!ut)return;const e=Ie;Ie=!0,C(),Ie=e}function Oi(){Rn(),s.toBlob(e=>{e&&ro(e,an(),me.onSaveImage)})}function In(e){return G?Math.max(G.ppm*bi,Math.min(G.ppm*vi,e)):e}function We(e,t,n){const i=T??G;if(!i)return;const o=In(i.ppm*n),a=o/i.ppm,r=e-(e-i.originX)*a,l=t-(t-i.originY)*a,d=(G?.snapDist??1)/(o/(G?.ppm??o));T={originX:r,originY:l,ppm:o,snapDist:d},C()}function Z(){return T??G}function Wn(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=Z(),n=T.snapDist;T={originX:t.originX-e.deltaX,originY:t.originY-e.deltaY,ppm:t.ppm,snapDist:n},C()}}function _t(e,t,n){return e>=n.x&&e<n.x+n.w&&t>=n.y&&t<n.y+n.h}function An(e){if(rt=!1,e.button!==0||!Z())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&&c.legendPosition==="floating"&&_t(n,i,we)){Be=!0,Ke={x:n,y:i},Ot={...Pt};return}if($e&&j!=="pan"){Pe=!0,Ce=!0,Te={x:n,y:i},dt={x:Z().originX,y:Z().originY},s.style.cursor="grabbing";return}if(j==="zoom"||j==="select"){Le=!0,W=A={x:n,y:i};return}Ce=!0,Te={x:n,y:i},dt={x:Z().originX,y:Z().originY},s.style.cursor="grabbing"}function Fn(e){const t=s.getBoundingClientRect(),n=e.clientX-t.left,i=e.clientY-t.top;if(Le){A={x:n,y:i},jt();return}if(Be){const g=n-Ke.x,v=i-Ke.y;g*g+v*v>16&&(Be=!1,_e=!0,s.style.cursor="grabbing")}if(_e){Pt={x:Ot.x+(n-Ke.x),y:Ot.y+(i-Ke.y)},jt();return}if(Ce){const g=Z(),v=T?.snapDist??G?.snapDist??1;T={originX:dt.x+(n-Te.x),originY:dt.y+(i-Te.y),ppm:g.ppm,snapDist:v},jt();return}const o=Z();if(!o)return;const a=(n-o.originX)/o.ppm,r=(o.originY-i)/o.ppm,d=$t(a,r,o.snapDist)?.die??null,f=Lt.find(g=>n>=g.x&&n<g.x+g.w&&i>=g.y&&i<g.y+g.h);if(Mn(f?f.bin:void 0),f){s.style.cursor="pointer",z&&(z.textContent=f.label??`Bin ${f.bin}`,z.style.display="block",oi(z,s,e.clientX,e.clientY,{followPointer:!0})),ot?.(null,e);return}j==="pan"&&(s.style.cursor=d?"crosshair":"grab"),z&&(d?(z.innerHTML=Vi(d,h.plotMode,{testDefs:ee,hbinDefs:q,sbinDefs:J,fallbackFormat:c.fallbackFormat,aggrMethod:h.aggrMethod,lotSize:h.lotSize,metadataFields:xe,activeTest:h.activeTest,reticleConfig:vn}),z.style.display="block",oi(z,s,e.clientX,e.clientY,{followPointer:!0})):z.style.display="none"),ot?.(d,e)}function zn(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"),Le){Le=!1,A={x:n,y:i};const l=n-W.x,d=i-W.y,f=Z();if(j==="zoom"){if(l*l+d*d<25)We(n,i,2);else if(f){const g=Math.min(W.x,A.x),v=Math.max(W.x,A.x),N=Math.min(W.y,A.y),ne=Math.max(W.y,A.y),b=v-g,E=ne-N;if(b>4&&E>4){const w=s.clientWidth,y=s.clientHeight,V=w/b,ce=y/E,I=Math.min(V,ce),mt=In(f.ppm*I),qe=mt/f.ppm,Ut=(g+v)/2,Zt=(N+ne)/2;T={originX:w/2-(Ut-f.originX)*qe,originY:y/2-(Zt-f.originY)*qe,ppm:mt,snapDist:f.snapDist/qe}}}C(),s.style.cursor="crosshair";return}if(l*l+d*d<25)Kt(n,i,o,e);else if(f){const g=(Math.min(W.x,A.x)-f.originX)/f.ppm,v=(Math.max(W.x,A.x)-f.originX)/f.ppm,N=(f.originY-Math.max(W.y,A.y))/f.ppm,ne=(f.originY-Math.min(W.y,A.y))/f.ppm,b=h.hoverPoints,E=[];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&&E.push(y)}if(o)for(const w of E){const y=he(w);x.has(y)?x.delete(y):x.add(y)}else x=new Set(E.map(w=>he(w)));Se(),ae?.(Ze())}C(),s.style.cursor="crosshair";return}if(Be){Be=!1,Kt(n,i,o,e);return}if(_e){_e=!1,s.style.cursor="grab";return}if(!Ce)return;if(Ce=!1,Pe){Pe=!1,s.style.cursor=$e||j==="pan"?"grab":"crosshair";return}s.style.cursor=j==="pan"?"grab":"crosshair";const a=n-Te.x,r=i-Te.y;a*a+r*r<25&&Kt(n,i,o,e)}function Kt(e,t,n,i){for(const l of Lt)if(e>=l.x&&e<l.x+l.w&&t>=l.y&&t<l.y+l.h){Se("legend"),typeof l.bin=="number"?R({highlightBin:di(c.highlightBin,l.bin,n)}):R({highlightMetadataValue:di(c.highlightMetadataValue,l.bin,n)});return}if(we&&_t(e,t,we))return;const o=Z();if(!o)return;const r=$t((e-o.originX)/o.ppm,(o.originY-t)/o.ppm,o.snapDist)?.die??null;if(r){pi?.(r,i);const l=he(r);n?x.has(l)?x.delete(l):x.add(l):x.size===1&&x.has(l)?x=new Set:x=new Set([l]),Se(),ae?.(Ze()),C()}else n||(x=new Set,Se(),ae?.([]),C())}function Ze(){const e=[],t=h.hoverPoints;for(let n=0;n<t.length;n++){const i=h.dies[n];i&&x.has(he(i))&&e.push(i)}return e}function Hn(){at&&(at.style.display=Mt()?"flex":"none",at.ariaLabel=x.size>0?"Chart the selected dies (or right-click)":"Chart this wafer (or right-click)")}function Ri(){const e={waferLabel:ln(),testDefs:ee,isLotStack:ie.isLotStack,activeTest:c.plotMode==="value"?c.activeTest:void 0};return x.size>0?ko(Ze(),e):Bo(ve,e)}function Vn(e,t){if(!Mt())return;const n=Ri();import("./drilldown.js").then(({openDrilldownMenu:i})=>{yn||(mn=i(e,t,n,wi))})}function Yn(e){e.stopPropagation();const t=rt;if(rt=!1,!Mt()||le)return;const n=s.getBoundingClientRect();if(!t){const o=e.clientX-n.left,a=e.clientY-n.top;if(we&&_t(o,a,we))return;const r=Z(),l=r?$t((o-r.originX)/r.ppm,(r.originY-a)/r.ppm,r.snapDist)?.die:void 0;l&&!x.has(he(l))&&(x=new Set([he(l)]),Se(),ae?.(Ze()),C())}e.preventDefault();const i=t?{x:n.left+n.width/2,y:n.top+n.height/2}:{x:e.clientX,y:e.clientY};Vn(i,s)}function Xn(){Mn(void 0),z&&wt(p),ot?.(null,new MouseEvent("mouseleave")),s.style.cursor=j==="pan"?"grab":"crosshair"}function Nn(){Ce=!1,Pe=!1,Le=!1,Be=!1,_e=!1,z&&wt(p),ot?.(null,new MouseEvent("mouseleave")),s.style.cursor=j==="pan"?"grab":"crosshair",C()}function $t(e,t,n){const i=h.hoverPoints,o=h.rectangles;for(let d=0;d<o.length;d++){const f=o[d];if(Math.abs(e-f.x)<=f.width/2&&Math.abs(t-f.y)<=f.height/2){const g=h.dies[d];return g?{die:g,index:d}:null}}let a=null,r=-1,l=n*n;for(let d=0;d<i.length;d++){const f=i[d].x-e,g=i[d].y-t,v=f*f+g*g;v<l&&(l=v,a=h.dies[d]??null,r=d)}return a?{die:a,index:r}:null}const jn=new B.ResizeObserver(()=>{G=null,T=null,C()});jn.observe(s),S.height==null&&fi<=0&&en(()=>en(()=>{L.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=B.matchMedia(`(resolution: ${B.devicePixelRatio}dppx)`);const gt=()=>{Qe.removeEventListener("change",gt),Qe=B.matchMedia(`(resolution: ${B.devicePixelRatio}dppx)`),Qe.addEventListener("change",gt),C()};Qe.addEventListener("change",gt);const _n=B.matchMedia("(prefers-color-scheme: dark)"),Kn=()=>C();_n.addEventListener("change",Kn);const $n=()=>{z&&wt(p)};B.addEventListener("blur",$n);function Gn(e){if((e.key==="ContextMenu"||e.shiftKey&&e.key==="F10")&&(rt=!0),e.key==="Escape"&&x.size>0&&(x=new Set,Se(),ae?.([]),C()),(e.key==="e"||e.key==="E")&&fn&&(e.stopPropagation(),(cn??Pn)()),(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(),ht())),!e.ctrlKey&&!e.metaKey&&!e.shiftKey){const n=Z();if(n){const i=T?.snapDist??G?.snapDist??1;let o=0,a=0;e.key==="ArrowLeft"&&(o=20,e.preventDefault()),e.key==="ArrowRight"&&(o=-20,e.preventDefault()),e.key==="ArrowUp"&&(a=20,e.preventDefault()),e.key==="ArrowDown"&&(a=-20,e.preventDefault()),(o||a)&&(T={originX:n.originX+o,originY:n.originY+a,ppm:n.ppm,snapDist:i},C())}e.key===" "&&!$e&&(e.preventDefault(),$e=!0,j!=="pan"&&(s.style.cursor="grab"))}}function Un(e){e.key===" "&&($e=!1,Pe&&(Ce=!1,Pe=!1),s.style.cursor=j==="pan"?"grab":"crosshair")}s.style.cursor="crosshair",s.setAttribute("tabindex","0"),s.addEventListener("wheel",Wn,{passive:!1}),s.addEventListener("pointerdown",An),s.addEventListener("pointermove",Fn),s.addEventListener("pointerup",zn),s.addEventListener("pointerleave",Xn),s.addEventListener("pointercancel",Nn);const Zn=()=>ht();s.addEventListener("dblclick",Zn),s.addEventListener("keydown",Gn),s.addEventListener("keyup",Un),s.addEventListener("contextmenu",Yn);const Qn=e=>{e.stopPropagation()};s.addEventListener("click",Qn),s.clientWidth,C(),it?.();function ht(){G=null,T=null,C()}function Gt(){import("./userGuideHtml.js").then(e=>no({buildWaferMap:$i,renderWaferMap,renderWaferGallery:void 0,analyzeWaferMap:Ui},e.USER_GUIDE_HTML,hi,L))}return ze(),{setResult(e){ie=e,_=e.wafer,ve=e.dies,q=e.hbinDefs,J=e.sbinDefs,ee=e.testDefs,xe=e.metadataFields,bn=e.reticles?.length?e.reticles:void 0,vn=e.reticleConfig,xn=e.dataAxisFlip,Et=e.isLotStack,Dt=e.aggrMethod,kt=e.lotSize,Si(),Rt(),C(),te&&ge()},setOptions(e){On(e)},getOptions(){return{...c}},resetZoom:ht,setSelection(e){x=new Set(e.map(t=>he(t))),C()},clearSelection(){x=new Set,Se(),ae?.([]),C()},setFindingsNotice(e){En=e,te?ge():F&&Ue()},setStatsSummary(e){if(fe=e,St(),At(),te)ge();else if(F)Ue();else if(e&&!Ve?.placement){const t=Ve?.defaultOpen??!He;F=tn("right",ye,p),F.style.display=t?"block":"none";const n=k.parentElement,i=k.nextSibling;ue=nn(k,F,"right"),n?.insertBefore(ue,i),Ue()}pt()},closeSummaryPanel(){Tn(!1)},getExportTitle(){return an()},getSaveImageHook(){return me.onSaveImage},drawPendingNow:Rn,getBinColors(){return h.binColors},setSummaryVisible(e){U&&(U.style.display=e?"flex":"none")},setViewControlsVisible(e){P&&(P.style.display=e?"flex":"none")},setExpandVisible(e){se&&(se.style.display=e?"flex":"none")},openUserGuide:Gt,setInsightsOpen(e){Ne(e),X&&(e?(X.dataset.active="1",X.style.background=M.bgActive,X.style.color=M.iconActive):(delete X.dataset.active,X.style.background="transparent",X.style.color=M.icon))},destroy(){yn=!0;for(const e of Ge.values())e.cancel();Ge.clear(),Me?.close(),kn?.()?.remove(),Ft&&p.removeEventListener("click",Ft,!0),s.removeEventListener("wheel",Wn),s.removeEventListener("pointerdown",An),s.removeEventListener("pointermove",Fn),s.removeEventListener("pointerup",zn),s.removeEventListener("pointerleave",Xn),s.removeEventListener("pointercancel",Nn),s.removeEventListener("dblclick",Zn),s.removeEventListener("keydown",Gn),s.removeEventListener("keyup",Un),s.removeEventListener("contextmenu",Yn),mn?.(),s.removeEventListener("click",Qn),jn.disconnect(),Nt?.disconnect(),Qe.removeEventListener("change",gt),_n.removeEventListener("change",Kn),B.removeEventListener("blur",$n),xi(),z&&wt(p),re?.remove(),Oe&&(Oe.parentElement?.insertBefore(k,Oe),Oe.remove()),ue&&(ue.parentElement?.insertBefore(k,ue),ue.remove()),k.remove(),s.style.cursor="",$?.destroy(),K?.destroy(),Fe.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()}}}