@wafertools/wafermap 0.33.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/AGENTS.md +6 -6
  2. package/CHANGELOG.md +212 -0
  3. package/README.md +5 -5
  4. package/dist/packages/canvas-adapter/chartPopulation.d.ts +15 -10
  5. package/dist/packages/canvas-adapter/chartPopulation.js +1 -1
  6. package/dist/packages/canvas-adapter/charts/barPanel.d.ts +7 -0
  7. package/dist/packages/canvas-adapter/charts/barPanel.js +1 -1
  8. package/dist/packages/canvas-adapter/charts/binCluster.d.ts +7 -1
  9. package/dist/packages/canvas-adapter/charts/binCluster.js +1 -1
  10. package/dist/packages/canvas-adapter/charts/boxplot.js +1 -1
  11. package/dist/packages/canvas-adapter/charts/capability.js +1 -1
  12. package/dist/packages/canvas-adapter/charts/chartShell.d.ts +55 -3
  13. package/dist/packages/canvas-adapter/charts/chartShell.js +1 -1
  14. package/dist/packages/canvas-adapter/charts/correlation.js +1 -2
  15. package/dist/packages/canvas-adapter/charts/groupedBarPlot.d.ts +2 -0
  16. package/dist/packages/canvas-adapter/charts/groupedBarPlot.js +1 -1
  17. package/dist/packages/canvas-adapter/charts/histogram.d.ts +16 -0
  18. package/dist/packages/canvas-adapter/charts/histogram.js +1 -1
  19. package/dist/packages/canvas-adapter/charts/palette.d.ts +2 -0
  20. package/dist/packages/canvas-adapter/charts/palette.js +1 -1
  21. package/dist/packages/canvas-adapter/charts/plotChart.d.ts +27 -0
  22. package/dist/packages/canvas-adapter/charts/plotChart.js +1 -0
  23. package/dist/packages/canvas-adapter/charts/pointInteractions.d.ts +45 -0
  24. package/dist/packages/canvas-adapter/charts/pointInteractions.js +1 -0
  25. package/dist/packages/canvas-adapter/charts/regionYieldDiagram.d.ts +2 -0
  26. package/dist/packages/canvas-adapter/charts/regionYieldDiagram.js +1 -1
  27. package/dist/packages/canvas-adapter/charts/scatter.d.ts +19 -0
  28. package/dist/packages/canvas-adapter/charts/scatter.js +1 -1
  29. package/dist/packages/canvas-adapter/charts/sweep.d.ts +12 -0
  30. package/dist/packages/canvas-adapter/charts/sweep.js +1 -1
  31. package/dist/packages/canvas-adapter/charts/testPassRate.d.ts +7 -0
  32. package/dist/packages/canvas-adapter/charts/testPassRate.js +1 -1
  33. package/dist/packages/canvas-adapter/charts/trend.d.ts +11 -0
  34. package/dist/packages/canvas-adapter/charts/trend.js +1 -1
  35. package/dist/packages/canvas-adapter/confirmDialog.d.ts +13 -0
  36. package/dist/packages/canvas-adapter/confirmDialog.js +1 -0
  37. package/dist/packages/canvas-adapter/dataTab.d.ts +131 -0
  38. package/dist/packages/canvas-adapter/dataTab.js +1 -0
  39. package/dist/packages/canvas-adapter/dieList.d.ts +39 -4
  40. package/dist/packages/canvas-adapter/dieList.js +6 -7
  41. package/dist/packages/canvas-adapter/drilldown.d.ts +20 -3
  42. package/dist/packages/canvas-adapter/drilldown.js +1 -1
  43. package/dist/packages/canvas-adapter/guideWindow.d.ts +96 -0
  44. package/dist/packages/canvas-adapter/guideWindow.js +1 -0
  45. package/dist/packages/canvas-adapter/identityHeader.d.ts +16 -0
  46. package/dist/packages/canvas-adapter/identityHeader.js +1 -1
  47. package/dist/packages/canvas-adapter/index.d.ts +3 -3
  48. package/dist/packages/canvas-adapter/index.js +1 -1
  49. package/dist/packages/canvas-adapter/insightsTab.d.ts +73 -54
  50. package/dist/packages/canvas-adapter/insightsTab.js +1 -1
  51. package/dist/packages/canvas-adapter/maplessSummary.d.ts +2 -2
  52. package/dist/packages/canvas-adapter/plotEditor.d.ts +29 -0
  53. package/dist/packages/canvas-adapter/plotEditor.js +1 -0
  54. package/dist/packages/canvas-adapter/plotItems.d.ts +32 -0
  55. package/dist/packages/canvas-adapter/plotItems.js +1 -0
  56. package/dist/packages/canvas-adapter/plotModal.d.ts +30 -0
  57. package/dist/packages/canvas-adapter/plotModal.js +1 -0
  58. package/dist/packages/canvas-adapter/plotStore.d.ts +52 -0
  59. package/dist/packages/canvas-adapter/plotStore.js +1 -0
  60. package/dist/packages/canvas-adapter/plotTab.d.ts +30 -0
  61. package/dist/packages/canvas-adapter/plotTab.js +1 -0
  62. package/dist/packages/canvas-adapter/renderWaferGallery.d.ts +3 -2
  63. package/dist/packages/canvas-adapter/renderWaferGallery.js +1 -1
  64. package/dist/packages/canvas-adapter/renderWaferMap.d.ts +21 -2
  65. package/dist/packages/canvas-adapter/renderWaferMap.js +1 -1
  66. package/dist/packages/canvas-adapter/summaryPanel.d.ts +27 -8
  67. package/dist/packages/canvas-adapter/summaryPanel.js +2 -4
  68. package/dist/packages/canvas-adapter/summaryRail.d.ts +7 -0
  69. package/dist/packages/canvas-adapter/summaryRail.js +1 -0
  70. package/dist/packages/canvas-adapter/sweepEditor.d.ts +17 -0
  71. package/dist/packages/canvas-adapter/sweepEditor.js +1 -0
  72. package/dist/packages/canvas-adapter/tableExport.d.ts +22 -0
  73. package/dist/packages/canvas-adapter/tableExport.js +3 -0
  74. package/dist/packages/canvas-adapter/toolbar.d.ts +25 -97
  75. package/dist/packages/canvas-adapter/toolbar.js +2 -2
  76. package/dist/packages/canvas-adapter/userGuideHtml.d.ts +1 -1
  77. package/dist/packages/canvas-adapter/userGuideHtml.js +337 -42
  78. package/dist/packages/canvas-adapter/version.d.ts +2 -2
  79. package/dist/packages/canvas-adapter/version.js +1 -1
  80. package/dist/packages/canvas-adapter/viewSwitch.d.ts +13 -0
  81. package/dist/packages/canvas-adapter/viewSwitch.js +1 -0
  82. package/dist/packages/canvas-adapter/virtualTable.d.ts +44 -0
  83. package/dist/packages/canvas-adapter/virtualTable.js +1 -0
  84. package/dist/packages/core/classify.d.ts +3 -2
  85. package/dist/packages/core/classify.js +1 -1
  86. package/dist/packages/core/passBins.d.ts +17 -4
  87. package/dist/packages/core/passBins.js +1 -1
  88. package/dist/packages/core/ringCount.d.ts +22 -0
  89. package/dist/packages/core/ringCount.js +1 -0
  90. package/dist/packages/core/tableCsv.d.ts +43 -0
  91. package/dist/packages/core/tableCsv.js +3 -0
  92. package/dist/packages/renderer/binColors.d.ts +6 -6
  93. package/dist/packages/renderer/binColors.js +1 -1
  94. package/dist/packages/renderer/buildView.d.ts +1 -1
  95. package/dist/packages/renderer/buildView.js +1 -1
  96. package/dist/packages/renderer/buildWaferMap.js +1 -1
  97. package/dist/packages/stats/analyzeWaferLot.js +1 -1
  98. package/dist/packages/stats/analyzeWaferMap.js +1 -1
  99. package/dist/packages/stats/binPareto.d.ts +1 -1
  100. package/dist/packages/stats/binPareto.js +1 -1
  101. package/dist/packages/stats/histogram.d.ts +27 -0
  102. package/dist/packages/stats/histogram.js +1 -1
  103. package/dist/packages/stats/index.d.ts +2 -0
  104. package/dist/packages/stats/index.js +1 -1
  105. package/dist/packages/stats/lotDrift.js +1 -1
  106. package/dist/packages/stats/lotPattern.js +1 -1
  107. package/dist/packages/stats/math.d.ts +9 -6
  108. package/dist/packages/stats/math.js +1 -1
  109. package/dist/packages/stats/patternClassification.d.ts +1 -1
  110. package/dist/packages/stats/patternClassification.js +1 -1
  111. package/dist/packages/stats/plotData.d.ts +258 -0
  112. package/dist/packages/stats/plotData.js +1 -0
  113. package/dist/packages/stats/plotId.d.ts +3 -0
  114. package/dist/packages/stats/plotId.js +1 -0
  115. package/dist/packages/stats/plotSpec.d.ts +119 -0
  116. package/dist/packages/stats/plotSpec.js +4 -0
  117. package/dist/packages/stats/presentation.d.ts +2 -0
  118. package/dist/packages/stats/presentation.js +1 -1
  119. package/dist/packages/stats/regions.d.ts +6 -0
  120. package/dist/packages/stats/regions.js +1 -1
  121. package/dist/packages/stats/renderSummaryReport.d.ts +8 -3
  122. package/dist/packages/stats/renderSummaryReport.js +15 -15
  123. package/dist/packages/stats/reportHtml.d.ts +1 -1
  124. package/dist/packages/stats/reportHtml.js +36 -29
  125. package/dist/packages/stats/scatter.d.ts +6 -0
  126. package/dist/packages/stats/scatter.js +1 -1
  127. package/dist/packages/stats/sweep.d.ts +37 -1
  128. package/dist/packages/stats/sweep.js +1 -1
  129. package/dist/packages/stats/sweepText.d.ts +14 -0
  130. package/dist/packages/stats/sweepText.js +1 -0
  131. package/dist/packages/stats/sweepXFromName.d.ts +14 -0
  132. package/dist/packages/stats/sweepXFromName.js +1 -1
  133. package/dist/packages/stats/synthesis.d.ts +14 -4
  134. package/dist/packages/stats/synthesis.js +1 -1
  135. package/dist/packages/stats/testPassRate.d.ts +6 -0
  136. package/dist/packages/stats/testPassRate.js +1 -1
  137. package/dist/packages/stats/trend.js +1 -1
  138. package/dist/packages/stats/types.d.ts +1 -1
  139. package/dist/packages/stats/yield.d.ts +15 -6
  140. package/dist/packages/stats/yield.js +1 -1
  141. package/llms.txt +15 -3
  142. package/package.json +3 -3
@@ -1,4 +1,4 @@
1
- import{getUniqueTestNumbers as Ce}from"../renderer/buildView.js";import{dieHasValues as Le}from"../core/dieTable.js";import{dieHasTestData as Ae}from"../renderer/buildWaferMap.js";import{testLabel as re,isDerivedTest as Me,DERIVED_MARK as ce,DERIVED_KEY as de}from"../renderer/testLabel.js";import{prettyKey as Se}from"../core/utils.js";import{diagnoseMpwLayout as Be,formatMpwDiagnostics as De}from"../core/compact.js";import{listBinColorSchemes as Te,listValueColorSchemes as He}from"../renderer/colorSchemes.js";import{ICONS as F}from"./icons.js";import{WMAP_VERSION as ue,WMAP_BUILD_TIME as Oe}from"./version.js";import{openHtmlReport as Ie}from"../stats/renderFindingsReport.js";import{buildWaferMap as $e}from"../renderer/buildWaferMap.js";import{analyzeWaferMap as Re}from"../stats/analyzeWaferMap.js";let pe=!1;export function logWmapVersionOnce(){pe||(pe=!0,console.log(`[wmap] v${ue} (built ${Oe})`))}export const WMAP_TOKEN_NAMES=["z","icon","icon-hover","icon-active","bg-hover","bg-active","separator","surface","border","control-border","menu-hover","menu-active","font-family","font-size","density","panel-bg","text-muted","text","text-strong","warn-bg","warn-border","warn-text","err-bg","err-border","err-text","info-bg","info-text","selected","finding-indicator","canvas-bg","bar-fill"];const E=(e,t)=>`var(--wmap-${e}, ${t})`,J="var(--wmap-font-size, 12px)",We="var(--wmap-density, 1)",U=e=>`calc(${e}px * ${We})`;export function wireControlHover(e,t="outlined"){let n=null;const o=()=>{n&&(e.style.background=n.background,e.style.color=n.color)};e.addEventListener("mouseenter",()=>{e.dataset.on==="true"||e.disabled||(n||(n={background:e.style.background,color:e.style.color}),e.style.background=CLR.bgHover,e.style.color=CLR.iconHover)}),e.addEventListener("mouseleave",o),e.addEventListener("blur",o)}export function controlStyle(e,t=!1){const n={fontSize:FONT.body,cursor:"pointer",borderRadius:RADIUS.control};return e==="bare"?{...n,border:"none",background:"none",padding:"0",color:CLR.icon}:{...n,border:`1px solid ${CLR.controlBorder}`,background:e==="toggle"&&t?CLR.menuActive:"none",color:e==="toggle"&&t?CLR.iconActive:CLR.text,padding:`${SPACE.xxs} ${SPACE.lg}`}}export const SPACE={xxs:U(2),xs:U(4),sm:U(6),md:U(8),lg:U(10),xl:U(12),xxl:U(16),xxxl:U(24)},SHADOW={panel:"0 1px 4px rgba(0,0,0,0.10)",menu:"0 4px 12px rgba(0,0,0,0.15)",modal:"0 20px 60px rgba(0,0,0,0.40)"},MOTION={fast:"0.12s ease",base:"0.2s ease"},LEADING={none:"1",tight:"1.2",base:"1.45"},ALPHA={muted:"0.85",disabled:"0.4"},TRACKING="0.05em",EDGE_GUTTER=SPACE.xl,MAP_CHROME_INSET=SPACE.xs,RADIUS={control:"4px",container:"6px",pill:"999px"},FONT={family:"var(--wmap-font-family, inherit)",meta:`calc(${J} - 1px)`,body:J,sub:`calc(${J} + 1px)`,heading:`calc(${J} + 3px)`,stat:`calc(${J} + 8px)`};export function fontPx(e=0,t){const n=t?.ownerDocument??(typeof document<"u"?document:null);if(!n)return 12+e;const o=getComputedStyle(t??n.documentElement).getPropertyValue("--wmap-font-size").trim(),r=o?parseFloat(o):NaN;return(Number.isFinite(r)?r:12)+e}export const CLR={icon:E("icon","#506784"),iconHover:E("icon-hover","#2a3f5f"),iconActive:E("icon-active","#1a65ca"),bgHover:E("bg-hover","#edf0f8"),bgActive:E("bg-active","#dce8f8"),separator:E("separator","rgba(0,0,0,0.12)"),menuBg:E("surface","#fff"),menuBorder:E("border","rgba(0,0,0,0.12)"),controlBorder:E("control-border",E("border","rgba(0,0,0,0.30)")),menuHover:E("menu-hover","#f0f4fc"),menuActive:E("menu-active","#dce8f8"),canvasBg:`var(--wmap-canvas-bg, ${E("surface","#f5f5f5")})`,panelBg:E("panel-bg","#fafbfc"),label:E("text-muted","#647687"),value:E("text-strong","#1f2f43"),text:E("text","#333"),warnBg:E("warn-bg","#fffbe6"),warnBorder:E("warn-border","#f0c040"),warnText:E("warn-text","#7a5800"),errBg:E("err-bg","#fef2f2"),errBorder:E("err-border","#dc8a8a"),errText:E("err-text","#7a1c1c"),infoBg:E("info-bg","#dce8f8"),infoText:E("info-text","#334155"),findingHighlight:E("selected","#e07a20"),findingIndicator:E("finding-indicator","#b7551a"),barFill:E("bar-fill","#2a6fc0")};export function sevColor(e){return e==="unusual"?"#a84112":e==="notable"?"#8a6500":CLR.icon}export const ROTATIONS=[0,90,180,270],INLINE_TEST_LIMIT=6,MENU_SEARCH_THRESHOLD=8,DEFAULT_OVERLAY_Z=6e3,Z_BASE=`var(--wmap-z, ${DEFAULT_OVERLAY_Z})`,Z_ABOVE=`calc(var(--wmap-z, ${DEFAULT_OVERLAY_Z}) + 1)`,Z_MENU=`calc(var(--wmap-z, ${DEFAULT_OVERLAY_Z}) + 2)`,Z_ABOVE2=`calc(var(--wmap-z, ${DEFAULT_OVERLAY_Z}) + 3)`;export function applyOverlayZ(e){if(e==null)return()=>{};const t=document.documentElement,n=t.style.getPropertyValue("--wmap-z");return t.style.setProperty("--wmap-z",String(e)),()=>{n?t.style.setProperty("--wmap-z",n):t.style.removeProperty("--wmap-z")}}export function copyWmapThemeTokens(e,t){const n=getComputedStyle(e);for(const o of WMAP_TOKEN_NAMES){const r=n.getPropertyValue(`--wmap-${o}`).trim();r&&t.style.setProperty(`--wmap-${o}`,r)}}export function syncWmapPopupTheme(e,t,n){const o=()=>{copyWmapThemeTokens(e,t),n?.()},r=new window.MutationObserver(o);r.observe(e,{attributes:!0,attributeFilter:["style","class"]}),r.observe(document.documentElement,{attributes:!0,attributeFilter:["style","class"]});const s=window.matchMedia("(prefers-color-scheme: dark)");return s.addEventListener("change",o),()=>{r.disconnect(),s.removeEventListener("change",o)}}let ae=null;export function setDetachWindowOpener(e){ae=e}export function openDetachWindow(e){return ae?ae(e):window.open("","_blank","width=560,height=600")}export const MODE_LABELS={value:"Test Value",hardBin:"Hard Bin",softBin:"Soft Bin",stackedValues:"Stacked Test Values",stackedBins:"Stacked Hard Bins",stackedSoftBins:"Stacked Soft Bins",metadata:"Metadata"},BIN_LEGEND_MODES=new Set(["hardBin","softBin","metadata"]),STACKED_MODES=new Set(["stackedValues","stackedBins","stackedSoftBins"]);export function saveImageBlob(e,t,n){const o=`${t}.png`;if(n){n(e,o);return}downloadBlob(e,o)}export function downloadBlob(e,t){const n=URL.createObjectURL(e),o=document.createElement("a");o.href=n,o.download=t,o.click(),URL.revokeObjectURL(n)}export function roomForPanel(e){let t=null;return(n,o)=>{t?.(),t=n?e.reserveWidth(o):null}}export function openCompactDiagnostics(e,t,n){const o=De(Be(e,t),ue),r=n.anchor.ownerDocument,s=openModal({title:"Layout diagnostics",anchor:n.anchor,ownerDocument:r,onClose:()=>{},boxSize:{width:"min(680px, 94vw)",height:"min(480px, 90vh)"}}),m=s.contentWrap;Object.assign(m.style,{flexDirection:"column",padding:"14px 16px",gap:"10px",boxSizing:"border-box"});const i=r.createElement("p");i.textContent="This is everything the compact layout looked at. It holds counts and scores only: no die positions, bins, test values or wafer names. If the layout was not detected the way you expect, send it to whoever supports this software.",Object.assign(i.style,{margin:"0",fontSize:FONT.body,color:CLR.text,lineHeight:"1.4"});const c=r.createElement("textarea");c.value=o,c.readOnly=!0,c.setAttribute("aria-label","Layout diagnostics"),Object.assign(c.style,{flex:"1",minHeight:"0",resize:"none",fontFamily:"ui-monospace, monospace",fontSize:FONT.body,padding:"8px",border:`1px solid ${CLR.separator}`,borderRadius:RADIUS.control,color:CLR.text,background:CLR.menuBg});const d=r.createElement("div");Object.assign(d.style,{display:"flex",gap:"8px",alignItems:"center"});const a=r.createElement("span");a.setAttribute("role","status"),Object.assign(a.style,{fontSize:FONT.body,color:CLR.text});const g=(h,u)=>{const p=r.createElement("button");return p.type="button",p.textContent=h,Object.assign(p.style,controlStyle("outlined"),{padding:"5px 12px",color:CLR.text}),wireControlHover(p,"outlined"),p.addEventListener("click",u),p},l=g("Copy",()=>{const h=r.defaultView,u=()=>{c.focus(),c.select();let p=!1;try{p=r.execCommand("copy")}catch{p=!1}a.textContent=p?"Copied":"Copying is not available here. Select the text, or save it as a file."};h?.navigator.clipboard?h.navigator.clipboard.writeText(o).then(()=>{a.textContent="Copied"},u):u()}),b=g("Save as file",()=>{saveTextFile(o,"wafermap-layout-diagnostics.txt","text/plain",n.onSaveText),a.textContent=n.onSaveText?"":"Saved"});return d.append(l,b,a),m.append(i,c,d),c.focus(),c.select(),s}export function saveTextFile(e,t,n,o){if(o){o(e,t,n);return}downloadBlob(new Blob([e],{type:n}),t)}const ze='[role="menuitem"],[role="menuitemradio"],[role="menuitemcheckbox"]';export function nextFrame(e,t=window){const n=t.requestAnimationFrame;typeof n=="function"?n.call(t,e):setTimeout(e,0)}export function wireListNavigation(e,t,n){e.addEventListener("keydown",o=>{const r=t();if(r.length===0)return;const s=e.ownerDocument.activeElement,m=s?r.indexOf(s):-1;switch(o.key){case"ArrowDown":o.preventDefault(),r[m<0||m===r.length-1?0:m+1].focus();break;case"ArrowUp":o.preventDefault(),r[m<=0?r.length-1:m-1].focus();break;case"Home":o.preventDefault(),r[0].focus();break;case"End":o.preventDefault(),r[r.length-1].focus();break;case"Enter":case" ":m>=0&&(o.preventDefault(),r[m].click());break;case"Escape":case"Tab":o.preventDefault(),n();break}})}function te(e,t,n){const o=()=>Array.from(e.querySelectorAll(ze));wireListNavigation(e,o,()=>{n(),t?.focus()});const r=o()[0];r&&nextFrame(()=>r.focus())}export function overlayRootFor(e){let t=e;for(;t;){if(t.classList.contains("wmap-overlay-box")||t.tagName==="DIALOG"&&t.matches(":modal"))return t;t=t.parentElement}return e.ownerDocument.body}const fe=new WeakMap;export function menuLayerFor(e){const t=overlayRootFor(e),n=fe.get(t);if(n&&n.isConnected)return n;const r=e.ownerDocument.createElement("div");return r.dataset.wmapMenuLayer="1",Object.assign(r.style,{position:"fixed",inset:"0",zIndex:Z_MENU,pointerEvents:"none"}),t.appendChild(r),fe.set(t,r),r}const se=new WeakMap;export function getTooltip(e=document){const t=se.get(e);if(t&&t.isConnected)return t;const n=t??e.createElement("div");return t||(Object.assign(n.style,{position:"fixed",pointerEvents:"none",background:"rgba(30, 32, 40, 0.93)",color:"#f0f0f2",border:"1px solid rgba(255,255,255,0.10)",padding:"7px 11px",borderRadius:RADIUS.control,fontSize:FONT.sub,lineHeight:LEADING.base,maxWidth:"280px",maxHeight:"min(60vh, 480px)",overflow:"hidden",whiteSpace:"pre-wrap",zIndex:Z_ABOVE2,display:"none",fontFamily:FONT.family,boxShadow:SHADOW.menu}),se.set(e,n)),e.body.appendChild(n),n}export function hideTooltip(e=document){const t=se.get(e);t&&(t.style.display="none")}export function reparentTooltip(e){const t=e?.ownerDocument??document,n=getTooltip(t);(e??t.body).appendChild(n)}export function positionTooltip(e,t,n,o,r={}){const s=menuLayerFor(t);e.parentElement!==s&&s.appendChild(e);const m=e.ownerDocument.defaultView??window;e.style.left="0",e.style.top="0";const i=e.offsetWidth,c=e.offsetHeight,d=8,a=m.innerWidth,g=m.innerHeight;let l=n+14,b=o-8;l+i+d>a&&(l=n-i-6);const h=t.getBoundingClientRect();if(!r.followPointer&&h.height>0&&h.height<=g*.4&&b<h.bottom&&b+c>h.top&&l<h.right&&l+i>h.left){const f=h.bottom+d,x=h.top-c-d;f+c+d<=g?b=f:x>=d&&(b=x)}b+c+d>g&&(b=g-c-d),b<d&&(b=d),e.style.left=`${l}px`,e.style.top=`${b}px`}export function wireTooltip(e,t,n={}){const o=()=>(typeof t=="function"?t():t)??e.getAttribute("aria-label")??"";n.asDataPoint&&(e.tabIndex=0,e.setAttribute("role","img"),typeof t=="string"&&e.setAttribute("aria-label",t));const r=m=>{const i=o();if(!i)return;const c=getTooltip(e.ownerDocument);if(c.textContent=i,c.style.display="block",m)positionTooltip(c,e,m.clientX,m.clientY);else{const d=e.getBoundingClientRect();positionTooltip(c,e,d.left+d.width/2,d.top)}},s=()=>hideTooltip(e.ownerDocument);e.addEventListener("mousemove",r),e.addEventListener("mouseleave",s),e.addEventListener("focus",()=>r()),e.addEventListener("blur",s)}export function buildDataModeEntries(e,t,n){const o=e.some(Ae),r=e.some(Le),s=e.some(a=>a.hbin!=null),m=e.some(a=>a.sbin!=null),i=o?t!==void 0?t.map(a=>({plotMode:"value",activeTest:a.testNumber,label:a.unit?`${re(a,a.testNumber)} (${a.unit})`:re(a,a.testNumber),logScale:a.logScale,...Me(a)?{derived:!0}:{}})):Ce(e).map(a=>({plotMode:"value",activeTest:a,label:re(void 0,a)})):[],c=[...s?[{plotMode:"hardBin",label:MODE_LABELS.hardBin}]:[],...m?[{plotMode:"softBin",label:MODE_LABELS.softBin}]:[]],d=n.includeStacked?[...r?[{plotMode:"stackedValues",label:MODE_LABELS.stackedValues}]:[],...s?[{plotMode:"stackedBins",label:MODE_LABELS.stackedBins}]:[],...m?[{plotMode:"stackedSoftBins",label:MODE_LABELS.stackedSoftBins}]:[]]:[];return{testEntries:i,binEntries:c,stackedEntries:d}}export function metadataKeyHasData(e,t){return e.some(n=>n.metadata?.[t]!==void 0&&n.metadata?.[t]!==null)}export function metadataModeEntry(e){return{plotMode:"metadata",activeMetadataKey:e.key,label:e.label??Se(e.key)}}export function makeMenuSearchBox(e,t="Filter\u2026",n=document){const o=n.createElement("input");return o.type="text",o.placeholder=t,o.setAttribute("aria-label",t),Object.assign(o.style,{display:"block",width:"calc(100% - 20px)",margin:"2px 10px 6px",padding:`${SPACE.xs} ${SPACE.md}`,fontSize:FONT.body,boxSizing:"border-box",background:CLR.menuBg,color:CLR.text,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,outline:"none"}),o.addEventListener("click",r=>r.stopPropagation()),o.addEventListener("mousedown",r=>r.stopPropagation()),o.addEventListener("keydown",r=>r.stopPropagation()),o.addEventListener("input",()=>e(o.value.trim().toLowerCase())),o.addEventListener("focus",()=>{o.style.borderColor=CLR.iconActive}),o.addEventListener("blur",()=>{o.style.borderColor=CLR.menuBorder}),queueMicrotask(()=>o.focus()),o}export function buildModeMenuEl(e,t,n,o,r,s,m,i,c=window,d=[]){const{makeMenuRow:a,makeMenuSection:g}=m,l=document.createElement("div"),b=180,u=e.left+b<=(c.innerWidth??1/0)?e.left:Math.max(4,e.right-b);if(Object.assign(l.style,{position:"fixed",top:`${e.bottom+4}px`,left:`${u}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,boxShadow:SHADOW.menu,zIndex:Z_BASE,minWidth:`${b}px`,padding:"4px 0",pointerEvents:"auto"}),t.length)if(l.appendChild(g("Test Value")),t.length<=INLINE_TEST_LIMIT)for(const p of t)l.appendChild(a(p.label,r(p),!0,f=>{f.stopPropagation(),s(p,l)}));else{const p=i==="value",f=a(MODE_LABELS.value+" \u25B6",p,!1,y=>{y.stopPropagation(),A(),S(),y.detail===0&&$()});f.setAttribute("aria-haspopup","menu"),f.style.display="flex",f.style.justifyContent="space-between",f.style.alignItems="center";let x=null,w=null;const A=()=>{w!==null&&(clearTimeout(w),w=null)},k=y=>{const B=y.target;B&&(f.contains(B)||x?.contains(B))||C()},C=()=>{A(),x?.remove(),x=null,c.document.removeEventListener("click",k),f.setAttribute("aria-expanded","false")},$=()=>{const y=x?.querySelector('input, [role="menuitemradio"]');y&&nextFrame(()=>y.focus(),c)},D=()=>{A(),w=setTimeout(C,300)},S=()=>{if(x)return;const y=f.getBoundingClientRect(),B=160,X=320,W=y.right+2+B<=(c.innerWidth??1/0)?y.right+2:Math.max(4,y.left-2-B),Z=Math.min(y.top-4,Math.max(4,(c.innerHeight??1/0)-X-4));if(x=document.createElement("div"),x.setAttribute("data-wmap-submenu",""),x.setAttribute("role","menu"),Object.assign(x.style,{position:"fixed",top:`${Z}px`,left:`${W}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,boxShadow:SHADOW.menu,zIndex:Z_ABOVE,minWidth:`${B}px`,maxHeight:`${X}px`,overflowY:"auto",padding:"4px 0",pointerEvents:"auto"}),t.length>MENU_SEARCH_THRESHOLD){const L=makeMenuSearchBox(Y=>{for(const _ of z)_.row.style.display=_.label.includes(Y)?"":"none"},"Filter tests\u2026");Object.assign(L.style,{position:"sticky",top:"0",zIndex:"1",background:CLR.menuBg}),x.appendChild(L)}const z=[],M=t.some(L=>L.derived);for(const L of t){const Y=a(L.label,r(L),!1,_=>{_.stopPropagation(),C(),s(L,l)},M?{derived:L.derived===!0}:void 0);z.push({row:Y,label:L.label.toLowerCase()}),x.appendChild(Y)}if(M){const L=c.document.createElement("div");L.setAttribute("role","presentation"),L.textContent=`${ce} ${de}`,Object.assign(L.style,{padding:"6px 14px",fontSize:FONT.meta,color:CLR.label,borderTop:`1px solid ${CLR.menuBorder}`,marginTop:"4px",whiteSpace:"nowrap"}),x.appendChild(L)}x.addEventListener("mouseenter",A),x.addEventListener("mouseleave",D),wireListNavigation(x,()=>z.filter(L=>L.row.style.display!=="none").map(L=>L.row),()=>{C(),f.focus()}),(l.parentElement??c.document.body).appendChild(x),c.document.addEventListener("click",k),f.setAttribute("aria-expanded","true")};l.addEventListener("keydown",y=>{y.key==="Escape"&&C()}),f.addEventListener("mouseenter",()=>{A(),S()}),f.addEventListener("mouseleave",D),l.appendChild(f)}if(n.length){l.appendChild(g("Bins"));for(const p of n)l.appendChild(a(p.label,r(p),!1,f=>{f.stopPropagation(),s(p,l)}))}if(d.length){l.appendChild(g("Metadata"));for(const p of d)l.appendChild(a(p.label,r(p),!1,f=>{f.stopPropagation(),s(p,l)}))}if(o.length){l.appendChild(g("Lot Aggregation"));for(const p of o)l.appendChild(a(p.label,r(p),!1,f=>{f.stopPropagation(),s(p,l)}))}return l.setAttribute("role","menu"),l.setAttribute("aria-label","Plot mode"),l}export function markMenuTrigger(e,t){e.setAttribute("aria-haspopup","menu"),e.setAttribute("aria-expanded",t?"true":"false")}export function wireMenuA11y(e,t,n){te(e,t,n)}export function wireExpandToggle(e,t){const n=e.ownerDocument;let o=!1;function r(d){o!==d&&(o=d,t(o))}function s(){r(!1)}function m(){r(!o),o&&n.addEventListener("click",s,{once:!0})}const i=d=>{d.stopPropagation(),m()},c=d=>{d.key==="Enter"||d.key===" "?(d.preventDefault(),m()):d.key==="Escape"&&s()};return e.setAttribute("role","button"),e.tabIndex<0&&(e.tabIndex=0),e.addEventListener("click",i),e.addEventListener("keydown",c),{isOpen:()=>o,close:s,destroy(){e.removeEventListener("click",i),e.removeEventListener("keydown",c),n.removeEventListener("click",s)}}}export function buildCheckMenuEl(e,t,n,o=window){const{makeMenuSection:r}=n,s=o.document,m=s.createElement("div"),i=168,d=e.left+i<=(o.innerWidth??1/0)?e.left:Math.max(4,e.right-i);Object.assign(m.style,{position:"fixed",top:`${e.bottom+4}px`,left:`${d}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,boxShadow:SHADOW.menu,zIndex:Z_BASE,minWidth:`${i}px`,padding:"4px 0",pointerEvents:"auto"});for(const a of t)if("section"in a)m.appendChild(r(a.section));else{const g=a.enabled!==!1;if(!g&&!a.disabledHint)continue;const l=s.createElement("div");a.action?l.setAttribute("role","menuitem"):(l.setAttribute("role","menuitemcheckbox"),l.setAttribute("aria-checked",a.active?"true":"false")),l.tabIndex=-1,g||(l.setAttribute("aria-disabled","true"),wireTooltip(l,a.disabledHint)),Object.assign(l.style,{display:"flex",alignItems:"center",gap:SPACE.sm,padding:"6px 14px",fontSize:FONT.body,cursor:g?"pointer":"default",color:g?a.active?CLR.iconActive:CLR.text:CLR.label,fontWeight:a.active?"700":"400",background:a.active?CLR.menuActive:"transparent",whiteSpace:"nowrap"});const b=s.createElement("span");Object.assign(b.style,{width:"12px",flexShrink:"0",color:CLR.iconActive,visibility:a.active?"visible":"hidden"}),b.textContent=a.action?"":"\u2713",b.setAttribute("aria-hidden","true");const h=s.createElement("span");h.textContent=a.label,l.appendChild(b),l.appendChild(h),g?(l.addEventListener("mouseenter",()=>{a.active||(l.style.background=CLR.menuHover)}),l.addEventListener("mouseleave",()=>{l.style.background=a.active?CLR.menuActive:"transparent"}),l.addEventListener("focus",()=>{a.active||(l.style.background=CLR.menuHover)}),l.addEventListener("blur",()=>{l.style.background=a.active?CLR.menuActive:"transparent"}),l.addEventListener("click",u=>{u.stopPropagation(),a.onClick(u)})):l.addEventListener("click",u=>{u.stopPropagation()}),m.appendChild(l)}return m}export function createToolbarHelpers(e){const t=e.ownerDocument;let n=null;const o=l=>menuLayerFor(l);function r(l,b,h){const u=t.createElement("button");return u.innerHTML=F[l],u.type="button",u.ariaLabel=b,Object.assign(u.style,{display:"flex",alignItems:"center",justifyContent:"center",width:"28px",height:"28px",padding:"0",border:"none",borderRadius:RADIUS.control,background:"transparent",color:CLR.icon,cursor:"pointer",pointerEvents:"auto",transition:`background ${MOTION.fast}, color ${MOTION.fast}`,flexShrink:"0"}),u.addEventListener("mouseenter",p=>{u.dataset.active||(u.style.background=CLR.bgHover,u.style.color=CLR.iconHover),e.textContent=u.ariaLabel??b,e.style.display="block",positionTooltip(e,u,p.clientX,p.clientY)}),u.addEventListener("mousemove",p=>{e.style.display==="block"&&positionTooltip(e,u,p.clientX,p.clientY)}),u.addEventListener("mouseleave",()=>{u.dataset.active||(u.style.background="transparent",u.style.color=CLR.icon),e.style.display="none"}),u.addEventListener("click",()=>{e.style.display="none",h()}),u}function s(l,b){b?(l.dataset.active="1",l.style.background=CLR.bgActive,l.style.color=CLR.iconActive):(delete l.dataset.active,l.style.background="transparent",l.style.color=CLR.icon)}function m(){const l=t.createElement("div");return Object.assign(l.style,{width:"1px",height:"18px",background:CLR.separator,margin:"0 2px",flexShrink:"0"}),l}function i(l,b,h,u,p){const f=t.createElement("div");if(p){const x=t.createElement("span");x.textContent=p.derived?ce:"",x.setAttribute("aria-hidden","true"),Object.assign(x.style,{display:"inline-block",width:"1.1em"}),f.append(x,l),p.derived&&f.setAttribute("aria-label",`${l} \u2014 ${de.toLowerCase()}`)}else f.textContent=l;return f.setAttribute("role","menuitemradio"),f.setAttribute("aria-checked",b?"true":"false"),f.tabIndex=-1,Object.assign(f.style,{padding:`6px 14px 6px ${h?"26px":"14px"}`,fontSize:FONT.body,cursor:"pointer",color:b?CLR.iconActive:CLR.text,fontWeight:b?"700":"400",background:b?CLR.menuActive:"transparent",whiteSpace:"nowrap"}),f.addEventListener("mouseenter",()=>{b||(f.style.background=CLR.menuHover)}),f.addEventListener("mouseleave",()=>{f.style.background=b?CLR.menuActive:"transparent"}),f.addEventListener("focus",()=>{b||(f.style.background=CLR.menuHover)}),f.addEventListener("blur",()=>{f.style.background=b?CLR.menuActive:"transparent"}),f.addEventListener("click",u),f}function c(l){const b=t.createElement("div");return b.textContent=l,b.setAttribute("role","presentation"),Object.assign(b.style,{padding:"5px 14px 2px",fontSize:FONT.body,fontWeight:"600",letterSpacing:TRACKING,color:CLR.label,textTransform:"uppercase",pointerEvents:"none",userSelect:"none"}),b}function d(l,b,h,u,p){const f=()=>{n&&(n.remove(),n=null),x.setAttribute("aria-expanded","false")},x=r(l,b,()=>{if(n){f();return}const w=t.createElement("div"),A=x.getBoundingClientRect(),k=x.ownerDocument.defaultView??window,C=148,D=A.left+C<=(k.innerWidth??1/0)?A.left:Math.max(4,A.right-C);Object.assign(w.style,{position:"fixed",top:`${A.bottom+4}px`,left:`${D}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,boxShadow:SHADOW.menu,zIndex:Z_BASE,minWidth:`${C}px`,padding:"4px 0",pointerEvents:"auto"});for(const S of h()){const y=t.createElement("div");y.textContent=S.label,y.dataset.wmapDropdownValue=S.value;const B=S.value===u();y.setAttribute("role","menuitemradio"),y.setAttribute("aria-checked",B?"true":"false"),y.tabIndex=-1,Object.assign(y.style,{padding:"6px 14px",fontSize:FONT.body,cursor:"pointer",color:B?CLR.iconActive:CLR.text,fontWeight:B?"700":"400",background:B?CLR.menuActive:"transparent",whiteSpace:"nowrap"});const X=()=>{S.value!==u()&&(y.style.background=CLR.menuHover)},P=()=>{y.style.background=S.value===u()?CLR.menuActive:"transparent"};y.addEventListener("mouseenter",X),y.addEventListener("mouseleave",P),y.addEventListener("focus",X),y.addEventListener("blur",P),y.addEventListener("click",W=>{W.stopPropagation(),p(S.value),f()}),w.appendChild(y)}w.setAttribute("role","menu"),w.setAttribute("aria-label",b),o(x).appendChild(w),n=w,x.setAttribute("aria-expanded","true"),te(w,x,f)});return x.setAttribute("aria-haspopup","menu"),x.setAttribute("aria-expanded","false"),x}function a(l,b,h,u){function p(){return buildCheckMenuEl(x.getBoundingClientRect(),h().map(w=>"section"in w?w:{...w,onClick:A=>{w.closeMenu&&f(),w.onClick(A),u(x);const k=n;if(!k)return;const C=p();C.setAttribute("role","menu"),C.setAttribute("aria-label",b),k.replaceWith(C),n=C,te(C,x,f)}}),{makeMenuSection:c},x.ownerDocument.defaultView??window)}const f=()=>{n&&(n.remove(),n=null),x.setAttribute("aria-expanded","false")},x=r(l,b,()=>{if(n){f();return}const w=p();w.setAttribute("role","menu"),w.setAttribute("aria-label",b),o(x).appendChild(w),n=w,x.setAttribute("aria-expanded","true"),te(w,x,f)});return x.setAttribute("aria-haspopup","menu"),x.setAttribute("aria-expanded","false"),u(x),x}function g(l){const b=l.target?.closest?.("[data-wmap-submenu]");if(n&&!n.contains(l.target)&&!b&&(n.remove(),n=null,l.target?.getAttribute?.("aria-haspopup")!=="menu"))for(const u of document.querySelectorAll('[aria-haspopup="menu"][aria-expanded="true"]'))u.setAttribute("aria-expanded","false")}return{makeBtn:r,setActive:s,makeSep:m,makeMenuRow:i,makeMenuSection:c,makeDropdown:d,makeCheckMenuBtn:a,closeOpenMenu:g,getOpenMenu:()=>n,setOpenMenu:l=>{n=l}}}const _e=7e3;let Ne=0;function me(){return _e+ ++Ne}const Fe=32,Pe=6;let je=0;function Ve(){return je++%Pe*Fe}function Ue(e,t){if(t===e.body)return()=>{};let n=t;for(;n.parentElement&&n.parentElement!==e.body;)n=n.parentElement;return n===e.body?()=>{}:(n.classList.add("wmap-overlay-ancestor"),()=>n.classList.remove("wmap-overlay-ancestor"))}function be(e){const t=e.mode==="modal",n=e.ownerDocument??document,o=n.defaultView??window,r=n.body.style.overflow;t&&(n.body.style.overflow="hidden");let s=null;t&&(s=n.createElement("div"),s.id="wmap-modal-backdrop",Object.assign(s.style,{position:"fixed",inset:"0",background:"rgba(0,0,0,0.6)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:Z_ABOVE,backdropFilter:"blur(3px)"}));const m=n.activeElement,i=n.createElement("div");i.className=t?"wmap-modal-box wmap-overlay-box":"wmap-window-box wmap-overlay-box",i.setAttribute("role","dialog"),t&&i.setAttribute("aria-modal","true"),i.setAttribute("aria-label",e.title??"Expanded wafer map"),i.tabIndex=-1;let c=e.boxSize?.width??"min(90vw, 700px)",d=e.boxSize?.height??"min(90vh, 700px)";if(Object.assign(i.style,{position:"relative",background:CLR.menuBg,borderRadius:RADIUS.container,overflow:"hidden",display:"flex",flexDirection:"column",width:c,height:d,boxShadow:SHADOW.modal,minWidth:"320px",minHeight:"240px",maxWidth:"100vw",maxHeight:"100vh",zIndex:t?Z_ABOVE2:String(me())}),!t){const v=Ve();Object.assign(i.style,{position:"fixed",top:`${Math.round(o.innerHeight*.08)+v}px`,left:`${Math.round(o.innerWidth*.08)+v}px`})}const a=n.createElement("div");Object.assign(a.style,{display:"flex",alignItems:"center",gap:SPACE.sm,padding:"10px 14px",borderBottom:`1px solid ${CLR.menuBorder}`,flexShrink:"0"});const g={border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,background:CLR.panelBg,cursor:"pointer",color:CLR.label,lineHeight:LEADING.none,padding:"0",display:"flex",alignItems:"center",justifyContent:"center",width:"28px",height:"28px"};if(e.title){const v=n.createElement("span");v.textContent=e.title,v.title=e.title,v.dataset.wmapWindowTitle="1",Object.assign(v.style,{fontWeight:"700",fontSize:"14px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",minWidth:"0"}),a.appendChild(v)}const l=n.createElement("div");l.style.flex="1",a.appendChild(l);let b=null;t||(b=n.createElement("button"),b.type="button",b.innerHTML=F.collapse,b.setAttribute("aria-label","Collapse"),wireTooltip(b),Object.assign(b.style,g),wireControlHover(b),b.addEventListener("click",()=>S(!k)),a.appendChild(b));let h=null;e.printable&&(h=n.createElement("button"),h.type="button",h.innerHTML=F.print,h.setAttribute("aria-label","Print / Save as PDF"),wireTooltip(h),Object.assign(h.style,g),wireControlHover(h),h.addEventListener("click",()=>{typeof e.printable=="function"?e.printable():o.print()}),a.appendChild(h));const u=n.createElement("button");u.type="button",u.innerHTML=F.maximize,u.setAttribute("aria-label","Maximize (F)"),wireTooltip(u),Object.assign(u.style,g),wireControlHover(u),u.addEventListener("click",()=>A(!f));const p=n.createElement("button");p.type="button",p.innerHTML=F.close,p.setAttribute("aria-label","Close (Esc)"),wireTooltip(p),Object.assign(p.style,g),wireControlHover(p),p.addEventListener("click",W),a.appendChild(u),a.appendChild(p);let f=!1,x="",w="";function A(v){f=v,u.innerHTML=f?F.minimize:F.maximize,u.setAttribute("aria-label",f?"Restore (F)":"Maximize (F)"),b&&(b.style.display=f?"none":""),M.style.display=f?"none":"block",f?(i.style.borderRadius="0",i.style.width="100vw",i.style.height="100vh",t||(x=i.style.top,w=i.style.left,i.style.top="0",i.style.left="0")):(i.style.borderRadius="12px",i.style.width=c,i.style.height=d,t||(i.style.top=x,i.style.left=w)),e.onMaximizeChange?.(f,i)}let k=!1,C="",$="";const D=220;function S(v){k=v,b.innerHTML=k?F.uncollapse:F.collapse,b.setAttribute("aria-label",k?"Show contents":"Collapse"),M.style.display=k?"none":"block",k?(C=i.style.height,$=i.style.width,i.style.minHeight="0",i.style.height="auto",i.style.minWidth="0",i.style.width=`${D}px`,u.disabled=!0,u.style.opacity="0.4",u.style.cursor="default",z.style.display="none"):(i.style.minHeight="240px",i.style.height=C||d,i.style.minWidth="320px",i.style.width=$||c,u.disabled=!1,u.style.opacity="1",u.style.cursor="pointer",z.style.display="flex")}function y(){const v=n.body.style.userSelect;return n.body.style.userSelect="none",()=>{n.body.style.userSelect=v}}t||(a.style.cursor="move",a.addEventListener("pointerdown",v=>{if(f||v.target.closest('button, [role="button"]'))return;v.preventDefault();const T=y(),H=v.clientX,O=v.clientY,I=i.offsetTop,R=i.offsetLeft,Q=o.innerHeight-a.offsetHeight,j=o.innerWidth-40,N=40-i.offsetWidth;a.setPointerCapture(v.pointerId);const V=K=>{const ie=Math.min(Math.max(I+(K.clientY-O),0),Q),Ee=Math.min(Math.max(R+(K.clientX-H),N),j);i.style.top=`${ie}px`,i.style.left=`${Ee}px`},q=K=>{T(),a.releasePointerCapture(K.pointerId),a.removeEventListener("pointermove",V),a.removeEventListener("pointerup",q)};a.addEventListener("pointermove",V),a.addEventListener("pointerup",q)}));const B='button,[href],input,select,textarea,[tabindex]:not([tabindex="-1"]),[role="menuitem"],[role="menuitemradio"],[role="menuitemcheckbox"]';function X(v){const T=Array.from(i.querySelectorAll(B)).filter(R=>R.offsetParent!==null||R===n.activeElement);if(T.length===0){v.preventDefault(),i.focus();return}const H=T[0],O=T[T.length-1],I=n.activeElement;v.shiftKey&&(I===H||!i.contains(I))?(v.preventDefault(),O.focus()):!v.shiftKey&&I===O&&(v.preventDefault(),H.focus())}const P=v=>{if(v.key==="Escape"){W();return}if(t&&(v.key==="e"||v.key==="E")){W();return}if(t&&v.key==="Tab"){X(v);return}(v.key==="f"||v.key==="F")&&!k&&A(!f)};function W(){t?n.removeEventListener("keydown",P):i.removeEventListener("keydown",P),oe.remove(),ye(),hideTooltip(n),reparentTooltip(n.body),s?s.remove():i.remove(),t&&(n.body.style.overflow=r),m?.focus?.(),e.onClose()}function Z(){t||(i.style.zIndex=String(me()))}const z=n.createElement("div");Object.assign(z.style,{flex:"1",minHeight:"0",minWidth:"0",display:"flex",overflow:"hidden"});const M=n.createElement("div");M.tabIndex=0,M.setAttribute("role","separator"),M.setAttribute("aria-label","Resize window (arrow keys, or drag)"),Object.assign(M.style,{position:"absolute",right:"0",bottom:"0",width:"16px",height:"16px",cursor:"nwse-resize",touchAction:"none"}),M.innerHTML='<svg viewBox="0 0 16 16" width="16" height="16" style="display:block"><path d="M15 15 L15 9 M15 15 L9 15 M15 15 L15 3 M15 15 L3 15" stroke="currentColor" stroke-width="1" opacity="0.35" fill="none"/></svg>',M.style.color=CLR.label;const L=320,Y=240,_=20;function ee(v,T){const H=o.innerWidth-i.offsetLeft,O=o.innerHeight-i.offsetTop,I=Math.min(Math.max(i.offsetWidth+v,L),H),R=Math.min(Math.max(i.offsetHeight+T,Y),O);i.style.width=`${I}px`,i.style.height=`${R}px`}M.addEventListener("keydown",v=>{if(!(f||k))switch(v.key){case"ArrowRight":v.preventDefault(),ee(_,0);break;case"ArrowLeft":v.preventDefault(),ee(-_,0);break;case"ArrowDown":v.preventDefault(),ee(0,_);break;case"ArrowUp":v.preventDefault(),ee(0,-_);break}}),M.addEventListener("pointerdown",v=>{if(f||k)return;v.preventDefault();const T=y(),H=v.clientX,O=v.clientY,I=i.offsetWidth,R=i.offsetHeight,Q=o.innerWidth-i.offsetLeft,j=o.innerHeight-i.offsetTop;M.setPointerCapture(v.pointerId);const N=q=>{const K=Math.min(Math.max(I+(q.clientX-H),L),Q),ie=Math.min(Math.max(R+(q.clientY-O),Y),j);i.style.width=`${K}px`,i.style.height=`${ie}px`},V=q=>{T(),M.releasePointerCapture(q.pointerId),M.removeEventListener("pointermove",N),M.removeEventListener("pointerup",V)};M.addEventListener("pointermove",N),M.addEventListener("pointerup",V)}),i.appendChild(a),i.appendChild(z),i.appendChild(M);const ne=e.anchor?overlayRootFor(e.anchor):n.body;s?(s.appendChild(i),ne.appendChild(s)):ne.appendChild(i);const ye=Ue(n,ne),oe=n.createElement("style");oe.textContent=`@media print{
1
+ import{getUniqueTestNumbers as we}from"../renderer/buildView.js";import{dieHasValues as ke}from"../core/dieTable.js";import{dieHasTestData as Ee}from"../renderer/buildWaferMap.js";import{testLabel as ae,isDerivedTest as Ce,DERIVED_MARK as ce,DERIVED_KEY as de}from"../renderer/testLabel.js";import{prettyKey as Le}from"../core/utils.js";import{diagnoseMpwLayout as Ae,formatMpwDiagnostics as Me}from"../core/compact.js";import{listBinColorSchemes as Se,listValueColorSchemes as Be}from"../renderer/colorSchemes.js";import{ICONS as R}from"./icons.js";import{WMAP_VERSION as ue,WMAP_BUILD_TIME as De}from"./version.js";let pe=!1;export function logWmapVersionOnce(){pe||(pe=!0,console.log(`[wmap] v${ue} (built ${De})`))}export const WMAP_TOKEN_NAMES=["z","icon","icon-hover","icon-active","bg-hover","bg-active","separator","surface","border","control-border","menu-hover","menu-active","font-family","font-size","density","panel-bg","text-muted","text","text-strong","warn-bg","warn-border","warn-text","err-bg","err-border","err-text","info-bg","info-text","selected","finding-indicator","canvas-bg","bar-fill"];const k=(e,t)=>`var(--wmap-${e}, ${t})`,Q="var(--wmap-font-size, 12px)",Te="var(--wmap-density, 1)",F=e=>`calc(${e}px * ${Te})`;export function wireControlHover(e,t="outlined"){let n=null;const o=()=>{n&&(e.style.background=n.background,e.style.color=n.color)};e.addEventListener("mouseenter",()=>{e.dataset.on==="true"||e.disabled||(n||(n={background:e.style.background,color:e.style.color}),e.style.background=CLR.bgHover,e.style.color=CLR.iconHover)}),e.addEventListener("mouseleave",o),e.addEventListener("blur",o)}export function controlStyle(e,t=!1){const n={fontSize:FONT.body,cursor:"pointer",borderRadius:RADIUS.control};return e==="bare"?{...n,border:"none",background:"none",padding:"0",color:CLR.icon}:{...n,border:`1px solid ${CLR.controlBorder}`,background:e==="toggle"&&t?CLR.menuActive:"none",color:e==="toggle"&&t?CLR.iconActive:CLR.text,padding:`${SPACE.xxs} ${SPACE.lg}`}}export const SPACE={xxs:F(2),xs:F(4),sm:F(6),md:F(8),lg:F(10),xl:F(12),xxl:F(16),xxxl:F(24)},SHADOW={panel:"0 1px 4px rgba(0,0,0,0.10)",menu:"0 4px 12px rgba(0,0,0,0.15)",modal:"0 20px 60px rgba(0,0,0,0.40)"},MOTION={fast:"0.12s ease",base:"0.2s ease"},LEADING={none:"1",tight:"1.2",base:"1.45"},ALPHA={muted:"0.85",disabled:"0.4"},TRACKING="0.05em",EDGE_GUTTER=SPACE.xl,MAP_CHROME_INSET=SPACE.xs,RADIUS={control:"4px",container:"6px",pill:"999px"},FONT={family:"var(--wmap-font-family, inherit)",meta:`calc(${Q} - 1px)`,body:Q,sub:`calc(${Q} + 1px)`,heading:`calc(${Q} + 3px)`,stat:`calc(${Q} + 8px)`};export function fontPx(e=0,t){const n=t?.ownerDocument??(typeof document<"u"?document:null);if(!n)return 12+e;const o=getComputedStyle(t??n.documentElement).getPropertyValue("--wmap-font-size").trim(),a=o?parseFloat(o):NaN;return(Number.isFinite(a)?a:12)+e}export const CLR={icon:k("icon","#506784"),iconHover:k("icon-hover","#2a3f5f"),iconActive:k("icon-active","#1a65ca"),bgHover:k("bg-hover","#edf0f8"),bgActive:k("bg-active","#dce8f8"),separator:k("separator","rgba(0,0,0,0.12)"),menuBg:k("surface","#fff"),menuBorder:k("border","rgba(0,0,0,0.12)"),controlBorder:k("control-border",k("border","rgba(0,0,0,0.30)")),menuHover:k("menu-hover","#f0f4fc"),menuActive:k("menu-active","#dce8f8"),canvasBg:`var(--wmap-canvas-bg, ${k("surface","#f5f5f5")})`,panelBg:k("panel-bg","#fafbfc"),label:k("text-muted","#647687"),value:k("text-strong","#1f2f43"),text:k("text","#333"),warnBg:k("warn-bg","#fffbe6"),warnBorder:k("warn-border","#f0c040"),warnText:k("warn-text","#7a5800"),errBg:k("err-bg","#fef2f2"),errBorder:k("err-border","#dc8a8a"),errText:k("err-text","#7a1c1c"),infoBg:k("info-bg","#dce8f8"),infoText:k("info-text","#334155"),findingHighlight:k("selected","#e07a20"),findingIndicator:k("finding-indicator","#b7551a"),barFill:k("bar-fill","#2a6fc0")};export function sevColor(e){return e==="unusual"?"#a84112":e==="notable"?"#8a6500":CLR.icon}export const ROTATIONS=[0,90,180,270],INLINE_TEST_LIMIT=6,MENU_SEARCH_THRESHOLD=8,DEFAULT_OVERLAY_Z=6e3,Z_BASE=`var(--wmap-z, ${DEFAULT_OVERLAY_Z})`,Z_ABOVE=`calc(var(--wmap-z, ${DEFAULT_OVERLAY_Z}) + 1)`,Z_MENU=`calc(var(--wmap-z, ${DEFAULT_OVERLAY_Z}) + 2)`,Z_ABOVE2=`calc(var(--wmap-z, ${DEFAULT_OVERLAY_Z}) + 3)`;export function applyOverlayZ(e){if(e==null)return()=>{};const t=document.documentElement,n=t.style.getPropertyValue("--wmap-z");return t.style.setProperty("--wmap-z",String(e)),()=>{n?t.style.setProperty("--wmap-z",n):t.style.removeProperty("--wmap-z")}}export function copyWmapThemeTokens(e,t){const n=getComputedStyle(e);for(const o of WMAP_TOKEN_NAMES){const a=n.getPropertyValue(`--wmap-${o}`).trim();a&&t.style.setProperty(`--wmap-${o}`,a)}}export function syncWmapPopupTheme(e,t,n){const o=()=>{copyWmapThemeTokens(e,t),n?.()},a=new window.MutationObserver(o);a.observe(e,{attributes:!0,attributeFilter:["style","class"]}),a.observe(document.documentElement,{attributes:!0,attributeFilter:["style","class"]});const l=window.matchMedia("(prefers-color-scheme: dark)");return l.addEventListener("change",o),()=>{a.disconnect(),l.removeEventListener("change",o)}}let re=null;export function setDetachWindowOpener(e){re=e}export function openDetachWindow(e){return re?re(e):window.open("","_blank","width=560,height=600")}export const MODE_LABELS={value:"Test Value",hardBin:"Hard Bin",softBin:"Soft Bin",stackedValues:"Stacked Test Values",stackedBins:"Stacked Hard Bins",stackedSoftBins:"Stacked Soft Bins",metadata:"Metadata"},BIN_LEGEND_MODES=new Set(["hardBin","softBin","metadata"]),STACKED_MODES=new Set(["stackedValues","stackedBins","stackedSoftBins"]);export function saveImageBlob(e,t,n){const o=`${t}.png`;if(n){n(e,o);return}downloadBlob(e,o)}export function markNoPrint(e){e.setAttribute("data-wmap-noprint","1");const t=e.ownerDocument;if(!t.getElementById("wmap-noprint-style")){const n=t.createElement("style");n.id="wmap-noprint-style",n.textContent="@media print{[data-wmap-noprint]{display:none!important}}",t.head.appendChild(n)}}export function downloadBlob(e,t){const n=URL.createObjectURL(e),o=document.createElement("a");o.href=n,o.download=t,o.click(),URL.revokeObjectURL(n)}export function roomForPanel(e){let t=null;return(n,o)=>{t?.(),t=n?e.reserveWidth(o):null}}export function openCompactDiagnostics(e,t,n){const o=Me(Ae(e,t),ue),a=n.anchor.ownerDocument,l=openModal({title:"Layout diagnostics",anchor:n.anchor,ownerDocument:a,onClose:()=>{},boxSize:{width:"min(680px, 94vw)",height:"min(480px, 90vh)"}}),x=l.contentWrap;Object.assign(x.style,{flexDirection:"column",padding:"14px 16px",gap:"10px",boxSizing:"border-box"});const i=a.createElement("p");i.textContent="This is everything the compact layout looked at. It holds counts and scores only: no die positions, bins, test values or wafer names. If the layout was not detected the way you expect, send it to whoever supports this software.",Object.assign(i.style,{margin:"0",fontSize:FONT.body,color:CLR.text,lineHeight:"1.4"});const f=a.createElement("textarea");f.value=o,f.readOnly=!0,f.setAttribute("aria-label","Layout diagnostics"),Object.assign(f.style,{flex:"1",minHeight:"0",resize:"none",fontFamily:"ui-monospace, monospace",fontSize:FONT.body,padding:"8px",border:`1px solid ${CLR.separator}`,borderRadius:RADIUS.control,color:CLR.text,background:CLR.menuBg});const u=a.createElement("div");Object.assign(u.style,{display:"flex",gap:"8px",alignItems:"center"});const s=a.createElement("span");s.setAttribute("role","status"),Object.assign(s.style,{fontSize:FONT.body,color:CLR.text});const C=(y,p)=>{const m=a.createElement("button");return m.type="button",m.textContent=y,Object.assign(m.style,controlStyle("outlined"),{padding:"5px 12px",color:CLR.text}),wireControlHover(m,"outlined"),m.addEventListener("click",p),m},r=C("Copy",()=>{const y=a.defaultView,p=()=>{f.focus(),f.select();let m=!1;try{m=a.execCommand("copy")}catch{m=!1}s.textContent=m?"Copied":"Copying is not available here. Select the text, or save it as a file."};y?.navigator.clipboard?y.navigator.clipboard.writeText(o).then(()=>{s.textContent="Copied"},p):p()}),d=C("Save as file",()=>{saveTextFile(o,"wafermap-layout-diagnostics.txt","text/plain",n.onSaveText),s.textContent=n.onSaveText?"":"Saved"});return u.append(r,d,s),x.append(i,f,u),f.focus(),f.select(),l}export function saveTextFile(e,t,n,o){if(o){o(e,t,n);return}downloadBlob(typeof e=="string"?new Blob([e],{type:n}):e,t)}const He='[role="menuitem"],[role="menuitemradio"],[role="menuitemcheckbox"]';export function nextFrame(e,t=window){const n=t.requestAnimationFrame;typeof n=="function"?n.call(t,e):setTimeout(e,0)}export function wireListNavigation(e,t,n){e.addEventListener("keydown",o=>{const a=t();if(a.length===0)return;const l=e.ownerDocument.activeElement,x=l?a.indexOf(l):-1;switch(o.key){case"ArrowDown":o.preventDefault(),a[x<0||x===a.length-1?0:x+1].focus();break;case"ArrowUp":o.preventDefault(),a[x<=0?a.length-1:x-1].focus();break;case"Home":o.preventDefault(),a[0].focus();break;case"End":o.preventDefault(),a[a.length-1].focus();break;case"Enter":case" ":x>=0&&(o.preventDefault(),a[x].click());break;case"Escape":case"Tab":o.preventDefault(),n();break}})}function te(e,t,n){const o=()=>Array.from(e.querySelectorAll(He));wireListNavigation(e,o,()=>{n(),t?.focus()});const a=o()[0];a&&nextFrame(()=>a.focus())}export function overlayRootFor(e){let t=e;for(;t;){if(t.classList.contains("wmap-overlay-box")||t.tagName==="DIALOG"&&t.matches(":modal"))return t;t=t.parentElement}return e.ownerDocument.body}const fe=new WeakMap;export function menuLayerFor(e){const t=overlayRootFor(e),n=fe.get(t);if(n&&n.isConnected)return n;const a=e.ownerDocument.createElement("div");return a.dataset.wmapMenuLayer="1",Object.assign(a.style,{position:"fixed",inset:"0",zIndex:Z_MENU,pointerEvents:"none"}),t.appendChild(a),fe.set(t,a),a}const se=new WeakMap;export function getTooltip(e=document){const t=se.get(e);if(t&&t.isConnected)return t;const n=t??e.createElement("div");return t||(Object.assign(n.style,{position:"fixed",pointerEvents:"none",background:"rgba(30, 32, 40, 0.93)",color:"#f0f0f2",border:"1px solid rgba(255,255,255,0.10)",padding:"7px 11px",borderRadius:RADIUS.control,fontSize:FONT.sub,lineHeight:LEADING.base,maxWidth:"280px",maxHeight:"min(60vh, 480px)",overflow:"hidden",whiteSpace:"pre-wrap",zIndex:Z_ABOVE2,display:"none",fontFamily:FONT.family,boxShadow:SHADOW.menu}),se.set(e,n)),e.body.appendChild(n),n}export function hideTooltip(e=document){const t=se.get(e);t&&(t.style.display="none")}export function reparentTooltip(e){const t=e?.ownerDocument??document,n=getTooltip(t);(e??t.body).appendChild(n)}export function positionTooltip(e,t,n,o,a={}){const l=menuLayerFor(t);e.parentElement!==l&&l.appendChild(e);const x=e.ownerDocument.defaultView??window;e.style.left="0",e.style.top="0";const i=e.offsetWidth,f=e.offsetHeight,u=8,s=x.innerWidth,C=x.innerHeight;let r=n+14,d=o-8;r+i+u>s&&(r=n-i-6);const y=t.getBoundingClientRect();if(!a.followPointer&&y.height>0&&y.height<=C*.4&&d<y.bottom&&d+f>y.top&&r<y.right&&r+i>y.left){const h=y.bottom+u,c=y.top-f-u;h+f+u<=C?d=h:c>=u&&(d=c)}d+f+u>C&&(d=C-f-u),d<u&&(d=u),e.style.left=`${r}px`,e.style.top=`${d}px`}export function wireTooltip(e,t,n={}){const o=()=>(typeof t=="function"?t():t)??e.getAttribute("aria-label")??"";n.asDataPoint&&(e.tabIndex=0,e.setAttribute("role","img"),typeof t=="string"&&e.setAttribute("aria-label",t));const a=x=>{const i=o();if(!i)return;const f=getTooltip(e.ownerDocument);if(f.textContent=i,f.style.display="block",x)positionTooltip(f,e,x.clientX,x.clientY);else{const u=e.getBoundingClientRect();positionTooltip(f,e,u.left+u.width/2,u.top)}},l=()=>hideTooltip(e.ownerDocument);e.addEventListener("mousemove",a),e.addEventListener("mouseleave",l),e.addEventListener("focus",()=>a()),e.addEventListener("blur",l)}export function buildDataModeEntries(e,t,n){const o=e.some(Ee),a=e.some(ke),l=e.some(s=>s.hbin!=null),x=e.some(s=>s.sbin!=null),i=o?t!==void 0?t.map(s=>({plotMode:"value",activeTest:s.testNumber,label:s.unit?`${ae(s,s.testNumber)} (${s.unit})`:ae(s,s.testNumber),logScale:s.logScale,...Ce(s)?{derived:!0}:{}})):we(e).map(s=>({plotMode:"value",activeTest:s,label:ae(void 0,s)})):[],f=[...l?[{plotMode:"hardBin",label:MODE_LABELS.hardBin}]:[],...x?[{plotMode:"softBin",label:MODE_LABELS.softBin}]:[]],u=n.includeStacked?[...a?[{plotMode:"stackedValues",label:MODE_LABELS.stackedValues}]:[],...l?[{plotMode:"stackedBins",label:MODE_LABELS.stackedBins}]:[],...x?[{plotMode:"stackedSoftBins",label:MODE_LABELS.stackedSoftBins}]:[]]:[];return{testEntries:i,binEntries:f,stackedEntries:u}}export function metadataKeyHasData(e,t){return e.some(n=>n.metadata?.[t]!==void 0&&n.metadata?.[t]!==null)}export function metadataModeEntry(e){return{plotMode:"metadata",activeMetadataKey:e.key,label:e.label??Le(e.key)}}export function makeMenuSearchBox(e,t="Filter\u2026",n=document){const o=n.createElement("input");return o.type="text",o.placeholder=t,o.setAttribute("aria-label",t),Object.assign(o.style,{display:"block",width:"calc(100% - 20px)",margin:"2px 10px 6px",padding:`${SPACE.xs} ${SPACE.md}`,fontSize:FONT.body,boxSizing:"border-box",background:CLR.menuBg,color:CLR.text,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,outline:"none"}),o.addEventListener("click",a=>a.stopPropagation()),o.addEventListener("mousedown",a=>a.stopPropagation()),o.addEventListener("keydown",a=>a.stopPropagation()),o.addEventListener("input",()=>e(o.value.trim().toLowerCase())),o.addEventListener("focus",()=>{o.style.borderColor=CLR.iconActive}),o.addEventListener("blur",()=>{o.style.borderColor=CLR.menuBorder}),queueMicrotask(()=>o.focus()),o}export function buildModeMenuEl(e,t,n,o,a,l,x,i,f=window,u=[]){const{makeMenuRow:s,makeMenuSection:C}=x,r=document.createElement("div"),d=180,p=e.left+d<=(f.innerWidth??1/0)?e.left:Math.max(4,e.right-d);if(Object.assign(r.style,{position:"fixed",top:`${e.bottom+4}px`,left:`${p}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,boxShadow:SHADOW.menu,zIndex:Z_BASE,minWidth:`${d}px`,padding:"4px 0",pointerEvents:"auto"}),t.length)if(r.appendChild(C("Test Value")),t.length<=INLINE_TEST_LIMIT)for(const m of t)r.appendChild(s(m.label,a(m),!0,h=>{h.stopPropagation(),l(m,r)}));else{const m=i==="value",h=s(MODE_LABELS.value+" \u25B6",m,!1,g=>{g.stopPropagation(),L(),D(),g.detail===0&&Z()});h.setAttribute("aria-haspopup","menu"),h.style.display="flex",h.style.justifyContent="space-between",h.style.alignItems="center";let c=null,E=null;const L=()=>{E!==null&&(clearTimeout(E),E=null)},H=g=>{const A=g.target;A&&(h.contains(A)||c?.contains(A))||w()},w=()=>{L(),c?.remove(),c=null,f.document.removeEventListener("click",H),h.setAttribute("aria-expanded","false")},Z=()=>{const g=c?.querySelector('input, [role="menuitemradio"]');g&&nextFrame(()=>g.focus(),f)},N=()=>{L(),E=setTimeout(w,300)},D=()=>{if(c)return;const g=h.getBoundingClientRect(),A=160,_=320,$=g.right+2+A<=(f.innerWidth??1/0)?g.right+2:Math.max(4,g.left-2-A),j=Math.min(g.top-4,Math.max(4,(f.innerHeight??1/0)-_-4));if(c=document.createElement("div"),c.setAttribute("data-wmap-submenu",""),c.setAttribute("role","menu"),Object.assign(c.style,{position:"fixed",top:`${j}px`,left:`${$}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,boxShadow:SHADOW.menu,zIndex:Z_ABOVE,minWidth:`${A}px`,maxHeight:`${_}px`,overflowY:"auto",padding:"4px 0",pointerEvents:"auto"}),t.length>MENU_SEARCH_THRESHOLD){const v=makeMenuSearchBox(Y=>{for(const X of V)X.row.style.display=X.label.includes(Y)?"":"none"},"Filter tests\u2026");Object.assign(v.style,{position:"sticky",top:"0",zIndex:"1",background:CLR.menuBg}),c.appendChild(v)}const V=[],W=t.some(v=>v.derived);for(const v of t){const Y=s(v.label,a(v),!1,X=>{X.stopPropagation(),w(),l(v,r)},W?{derived:v.derived===!0}:void 0);V.push({row:Y,label:v.label.toLowerCase()}),c.appendChild(Y)}if(W){const v=f.document.createElement("div");v.setAttribute("role","presentation"),v.textContent=`${ce} ${de}`,Object.assign(v.style,{padding:"6px 14px",fontSize:FONT.meta,color:CLR.label,borderTop:`1px solid ${CLR.menuBorder}`,marginTop:"4px",whiteSpace:"nowrap"}),c.appendChild(v)}c.addEventListener("mouseenter",L),c.addEventListener("mouseleave",N),wireListNavigation(c,()=>V.filter(v=>v.row.style.display!=="none").map(v=>v.row),()=>{w(),h.focus()}),(r.parentElement??f.document.body).appendChild(c),f.document.addEventListener("click",H),h.setAttribute("aria-expanded","true")};r.addEventListener("keydown",g=>{g.key==="Escape"&&w()}),h.addEventListener("mouseenter",()=>{L(),D()}),h.addEventListener("mouseleave",N),r.appendChild(h)}if(n.length){r.appendChild(C("Bins"));for(const m of n)r.appendChild(s(m.label,a(m),!1,h=>{h.stopPropagation(),l(m,r)}))}if(u.length){r.appendChild(C("Metadata"));for(const m of u)r.appendChild(s(m.label,a(m),!1,h=>{h.stopPropagation(),l(m,r)}))}if(o.length){r.appendChild(C("Lot Aggregation"));for(const m of o)r.appendChild(s(m.label,a(m),!1,h=>{h.stopPropagation(),l(m,r)}))}return r.setAttribute("role","menu"),r.setAttribute("aria-label","Plot mode"),r}export function markMenuTrigger(e,t){e.setAttribute("aria-haspopup","menu"),e.setAttribute("aria-expanded",t?"true":"false")}export function wireMenuA11y(e,t,n){te(e,t,n)}export function wireExpandToggle(e,t){const n=e.ownerDocument;let o=!1;function a(u){o!==u&&(o=u,t(o))}function l(){a(!1)}function x(){a(!o),o&&n.addEventListener("click",l,{once:!0})}const i=u=>{u.stopPropagation(),x()},f=u=>{u.key==="Enter"||u.key===" "?(u.preventDefault(),x()):u.key==="Escape"&&l()};return e.setAttribute("role","button"),e.tabIndex<0&&(e.tabIndex=0),e.addEventListener("click",i),e.addEventListener("keydown",f),{isOpen:()=>o,close:l,destroy(){e.removeEventListener("click",i),e.removeEventListener("keydown",f),n.removeEventListener("click",l)}}}export function buildCheckMenuEl(e,t,n,o=window){const{makeMenuSection:a}=n,l=o.document,x=l.createElement("div"),i=168,u=e.left+i<=(o.innerWidth??1/0)?e.left:Math.max(4,e.right-i);Object.assign(x.style,{position:"fixed",top:`${e.bottom+4}px`,left:`${u}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,boxShadow:SHADOW.menu,zIndex:Z_BASE,minWidth:`${i}px`,padding:"4px 0",pointerEvents:"auto"});for(const s of t)if("section"in s)x.appendChild(a(s.section));else{const C=s.enabled!==!1;if(!C&&!s.disabledHint)continue;const r=l.createElement("div");s.action?r.setAttribute("role","menuitem"):(r.setAttribute("role","menuitemcheckbox"),r.setAttribute("aria-checked",s.active?"true":"false")),r.tabIndex=-1,C||(r.setAttribute("aria-disabled","true"),wireTooltip(r,s.disabledHint)),Object.assign(r.style,{display:"flex",alignItems:"center",gap:SPACE.sm,padding:"6px 14px",fontSize:FONT.body,cursor:C?"pointer":"default",color:C?s.active?CLR.iconActive:CLR.text:CLR.label,fontWeight:s.active?"700":"400",background:s.active?CLR.menuActive:"transparent",whiteSpace:"nowrap"});const d=l.createElement("span");Object.assign(d.style,{width:"12px",flexShrink:"0",color:CLR.iconActive,visibility:s.active?"visible":"hidden"}),d.textContent=s.action?"":"\u2713",d.setAttribute("aria-hidden","true");const y=l.createElement("span");y.textContent=s.label,r.appendChild(d),r.appendChild(y),C?(r.addEventListener("mouseenter",()=>{s.active||(r.style.background=CLR.menuHover)}),r.addEventListener("mouseleave",()=>{r.style.background=s.active?CLR.menuActive:"transparent"}),r.addEventListener("focus",()=>{s.active||(r.style.background=CLR.menuHover)}),r.addEventListener("blur",()=>{r.style.background=s.active?CLR.menuActive:"transparent"}),r.addEventListener("click",p=>{p.stopPropagation(),s.onClick(p)})):r.addEventListener("click",p=>{p.stopPropagation()}),x.appendChild(r)}return x}export function createToolbarHelpers(e){const t=e.ownerDocument;let n=null;const o=r=>menuLayerFor(r);function a(r,d,y){const p=t.createElement("button");return p.innerHTML=R[r],p.type="button",p.ariaLabel=d,Object.assign(p.style,{display:"flex",alignItems:"center",justifyContent:"center",width:"28px",height:"28px",padding:"0",border:"none",borderRadius:RADIUS.control,background:"transparent",color:CLR.icon,cursor:"pointer",pointerEvents:"auto",transition:`background ${MOTION.fast}, color ${MOTION.fast}`,flexShrink:"0"}),p.addEventListener("mouseenter",m=>{p.dataset.active||(p.style.background=CLR.bgHover,p.style.color=CLR.iconHover),e.textContent=p.ariaLabel??d,e.style.display="block",positionTooltip(e,p,m.clientX,m.clientY)}),p.addEventListener("mousemove",m=>{e.style.display==="block"&&positionTooltip(e,p,m.clientX,m.clientY)}),p.addEventListener("mouseleave",()=>{p.dataset.active||(p.style.background="transparent",p.style.color=CLR.icon),e.style.display="none"}),p.addEventListener("click",()=>{e.style.display="none",y()}),p}function l(r,d){d?(r.dataset.active="1",r.style.background=CLR.bgActive,r.style.color=CLR.iconActive):(delete r.dataset.active,r.style.background="transparent",r.style.color=CLR.icon)}function x(){const r=t.createElement("div");return Object.assign(r.style,{width:"1px",height:"18px",background:CLR.separator,margin:"0 2px",flexShrink:"0"}),r}function i(r,d,y,p,m){const h=t.createElement("div");if(m){const c=t.createElement("span");c.textContent=m.derived?ce:"",c.setAttribute("aria-hidden","true"),Object.assign(c.style,{display:"inline-block",width:"1.1em"}),h.append(c,r),m.derived&&h.setAttribute("aria-label",`${r} \u2014 ${de.toLowerCase()}`)}else h.textContent=r;return h.setAttribute("role","menuitemradio"),h.setAttribute("aria-checked",d?"true":"false"),h.tabIndex=-1,Object.assign(h.style,{padding:`6px 14px 6px ${y?"26px":"14px"}`,fontSize:FONT.body,cursor:"pointer",color:d?CLR.iconActive:CLR.text,fontWeight:d?"700":"400",background:d?CLR.menuActive:"transparent",whiteSpace:"nowrap"}),h.addEventListener("mouseenter",()=>{d||(h.style.background=CLR.menuHover)}),h.addEventListener("mouseleave",()=>{h.style.background=d?CLR.menuActive:"transparent"}),h.addEventListener("focus",()=>{d||(h.style.background=CLR.menuHover)}),h.addEventListener("blur",()=>{h.style.background=d?CLR.menuActive:"transparent"}),h.addEventListener("click",p),h}function f(r){const d=t.createElement("div");return d.textContent=r,d.setAttribute("role","presentation"),Object.assign(d.style,{padding:"5px 14px 2px",fontSize:FONT.body,fontWeight:"600",letterSpacing:TRACKING,color:CLR.label,textTransform:"uppercase",pointerEvents:"none",userSelect:"none"}),d}function u(r,d,y,p,m){const h=()=>{n&&(n.remove(),n=null),c.setAttribute("aria-expanded","false")},c=a(r,d,()=>{if(n){h();return}const E=t.createElement("div"),L=c.getBoundingClientRect(),H=c.ownerDocument.defaultView??window,w=148,N=L.left+w<=(H.innerWidth??1/0)?L.left:Math.max(4,L.right-w);Object.assign(E.style,{position:"fixed",top:`${L.bottom+4}px`,left:`${N}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,boxShadow:SHADOW.menu,zIndex:Z_BASE,minWidth:`${w}px`,padding:"4px 0",pointerEvents:"auto"});for(const D of y()){const g=t.createElement("div");g.textContent=D.label,g.dataset.wmapDropdownValue=D.value;const A=D.value===p();g.setAttribute("role","menuitemradio"),g.setAttribute("aria-checked",A?"true":"false"),g.tabIndex=-1,Object.assign(g.style,{padding:"6px 14px",fontSize:FONT.body,cursor:"pointer",color:A?CLR.iconActive:CLR.text,fontWeight:A?"700":"400",background:A?CLR.menuActive:"transparent",whiteSpace:"nowrap"});const _=()=>{D.value!==p()&&(g.style.background=CLR.menuHover)},G=()=>{g.style.background=D.value===p()?CLR.menuActive:"transparent"};g.addEventListener("mouseenter",_),g.addEventListener("mouseleave",G),g.addEventListener("focus",_),g.addEventListener("blur",G),g.addEventListener("click",$=>{$.stopPropagation(),m(D.value),h()}),E.appendChild(g)}E.setAttribute("role","menu"),E.setAttribute("aria-label",d),o(c).appendChild(E),n=E,c.setAttribute("aria-expanded","true"),te(E,c,h)});return c.setAttribute("aria-haspopup","menu"),c.setAttribute("aria-expanded","false"),c}function s(r,d,y,p){function m(){return buildCheckMenuEl(c.getBoundingClientRect(),y().map(E=>"section"in E?E:{...E,onClick:L=>{E.closeMenu&&h(),E.onClick(L),p(c);const H=n;if(!H)return;const w=m();w.setAttribute("role","menu"),w.setAttribute("aria-label",d),H.replaceWith(w),n=w,te(w,c,h)}}),{makeMenuSection:f},c.ownerDocument.defaultView??window)}const h=()=>{n&&(n.remove(),n=null),c.setAttribute("aria-expanded","false")},c=a(r,d,()=>{if(n){h();return}const E=m();E.setAttribute("role","menu"),E.setAttribute("aria-label",d),o(c).appendChild(E),n=E,c.setAttribute("aria-expanded","true"),te(E,c,h)});return c.setAttribute("aria-haspopup","menu"),c.setAttribute("aria-expanded","false"),p(c),c}function C(r){const d=r.target?.closest?.("[data-wmap-submenu]");if(n&&!n.contains(r.target)&&!d&&(n.remove(),n=null,r.target?.getAttribute?.("aria-haspopup")!=="menu"))for(const p of document.querySelectorAll('[aria-haspopup="menu"][aria-expanded="true"]'))p.setAttribute("aria-expanded","false")}return{makeBtn:a,setActive:l,makeSep:x,makeMenuRow:i,makeMenuSection:f,makeDropdown:u,makeCheckMenuBtn:s,closeOpenMenu:C,getOpenMenu:()=>n,setOpenMenu:r=>{n=r}}}const Oe=7e3;let Ie=0;function me(){return Oe+ ++Ie}const Re=32,$e=6;let We=0;function ze(){return We++%$e*Re}function Pe(e,t){if(t===e.body)return()=>{};let n=t;for(;n.parentElement&&n.parentElement!==e.body;)n=n.parentElement;return n===e.body?()=>{}:(n.classList.add("wmap-overlay-ancestor"),()=>n.classList.remove("wmap-overlay-ancestor"))}function be(e){const t=e.mode==="modal",n=e.ownerDocument??document,o=n.defaultView??window,a=n.body.style.overflow;t&&(n.body.style.overflow="hidden");let l=null;t&&(l=n.createElement("div"),l.id="wmap-modal-backdrop",Object.assign(l.style,{position:"fixed",inset:"0",background:"rgba(0,0,0,0.6)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:Z_ABOVE,backdropFilter:"blur(3px)"}));const x=n.activeElement,i=n.createElement("div");i.className=t?"wmap-modal-box wmap-overlay-box":"wmap-window-box wmap-overlay-box",i.setAttribute("role","dialog"),t&&i.setAttribute("aria-modal","true"),i.setAttribute("aria-label",e.title??"Expanded wafer map"),i.tabIndex=-1;let f=e.boxSize?.width??"min(90vw, 700px)",u=e.boxSize?.height??"min(90vh, 700px)";if(Object.assign(i.style,{position:"relative",background:CLR.menuBg,borderRadius:RADIUS.container,overflow:"hidden",display:"flex",flexDirection:"column",width:f,height:u,boxShadow:SHADOW.modal,minWidth:"320px",minHeight:"240px",maxWidth:"100vw",maxHeight:"100vh",zIndex:t?Z_ABOVE2:String(me())}),!t){const b=ze();Object.assign(i.style,{position:"fixed",top:`${Math.round(o.innerHeight*.08)+b}px`,left:`${Math.round(o.innerWidth*.08)+b}px`})}const s=n.createElement("div");Object.assign(s.style,{display:"flex",alignItems:"center",gap:SPACE.sm,padding:"10px 14px",borderBottom:`1px solid ${CLR.menuBorder}`,flexShrink:"0"});const C={border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,background:CLR.panelBg,cursor:"pointer",color:CLR.label,lineHeight:LEADING.none,padding:"0",display:"flex",alignItems:"center",justifyContent:"center",width:"28px",height:"28px"};if(e.title){const b=n.createElement("span");b.textContent=e.title,b.title=e.title,b.dataset.wmapWindowTitle="1",Object.assign(b.style,{fontWeight:"700",fontSize:"14px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",minWidth:"0"}),s.appendChild(b)}const r=n.createElement("div");r.style.flex="1",s.appendChild(r);let d=null;t||(d=n.createElement("button"),d.type="button",d.innerHTML=R.collapse,d.setAttribute("aria-label","Collapse"),wireTooltip(d),Object.assign(d.style,C),wireControlHover(d),d.addEventListener("click",()=>g(!w)),s.appendChild(d));let y=null;e.printable&&(y=n.createElement("button"),y.type="button",y.innerHTML=R.print,y.setAttribute("aria-label","Print / Save as PDF"),wireTooltip(y),Object.assign(y.style,C),wireControlHover(y),y.addEventListener("click",()=>{typeof e.printable=="function"?e.printable():o.print()}),s.appendChild(y));const p=n.createElement("button");p.type="button",p.innerHTML=R.maximize,p.setAttribute("aria-label","Maximize (F)"),wireTooltip(p),Object.assign(p.style,C),wireControlHover(p),p.addEventListener("click",()=>H(!c));const m=n.createElement("button");m.type="button",m.innerHTML=R.close,m.setAttribute("aria-label","Close (Esc)"),wireTooltip(m),Object.assign(m.style,C),wireControlHover(m),m.addEventListener("click",j);const h=e.maximizable!==!1;h&&s.appendChild(p),s.appendChild(m);let c=!1,E="",L="";function H(b){c=b,p.innerHTML=c?R.minimize:R.maximize,p.setAttribute("aria-label",c?"Restore (F)":"Maximize (F)"),d&&(d.style.display=c?"none":""),v.style.display=c?"none":"block",c?(i.style.borderRadius="0",i.style.width="100vw",i.style.height="100vh",t||(E=i.style.top,L=i.style.left,i.style.top="0",i.style.left="0")):(i.style.borderRadius="12px",i.style.width=f,i.style.height=u,t||(i.style.top=E,i.style.left=L)),e.onMaximizeChange?.(c,i)}let w=!1,Z="",N="";const D=220;function g(b){w=b,d.innerHTML=w?R.uncollapse:R.collapse,d.setAttribute("aria-label",w?"Show contents":"Collapse"),v.style.display=w?"none":"block",w?(Z=i.style.height,N=i.style.width,i.style.minHeight="0",i.style.height="auto",i.style.minWidth="0",i.style.width=`${D}px`,p.disabled=!0,p.style.opacity="0.4",p.style.cursor="default",W.style.display="none"):(i.style.minHeight="240px",i.style.height=Z||u,i.style.minWidth="320px",i.style.width=N||f,p.disabled=!1,p.style.opacity="1",p.style.cursor="pointer",W.style.display="flex")}function A(){const b=n.body.style.userSelect;return n.body.style.userSelect="none",()=>{n.body.style.userSelect=b}}t||(s.style.cursor="move",s.addEventListener("pointerdown",b=>{if(c||b.target.closest('button, [role="button"]'))return;b.preventDefault();const M=A(),S=b.clientX,B=b.clientY,T=i.offsetTop,O=i.offsetLeft,q=o.innerHeight-s.offsetHeight,z=o.innerWidth-40,I=40-i.offsetWidth;s.setPointerCapture(b.pointerId);const P=K=>{const ie=Math.min(Math.max(T+(K.clientY-B),0),q),ge=Math.min(Math.max(O+(K.clientX-S),I),z);i.style.top=`${ie}px`,i.style.left=`${ge}px`},U=K=>{M(),s.releasePointerCapture(K.pointerId),s.removeEventListener("pointermove",P),s.removeEventListener("pointerup",U)};s.addEventListener("pointermove",P),s.addEventListener("pointerup",U)}));const _='button,[href],input,select,textarea,[tabindex]:not([tabindex="-1"]),[role="menuitem"],[role="menuitemradio"],[role="menuitemcheckbox"]';function G(b){const M=Array.from(i.querySelectorAll(_)).filter(O=>O.offsetParent!==null||O===n.activeElement);if(M.length===0){b.preventDefault(),i.focus();return}const S=M[0],B=M[M.length-1],T=n.activeElement;b.shiftKey&&(T===S||!i.contains(T))?(b.preventDefault(),B.focus()):!b.shiftKey&&T===B&&(b.preventDefault(),S.focus())}const $=b=>{if(b.key==="Escape"){j();return}if(t&&(b.key==="e"||b.key==="E")){j();return}if(t&&b.key==="Tab"){G(b);return}h&&(b.key==="f"||b.key==="F")&&!w&&H(!c)};function j(){t?n.removeEventListener("keydown",$):i.removeEventListener("keydown",$),oe.remove(),xe(),hideTooltip(n),reparentTooltip(n.body),l?l.remove():i.remove(),t&&(n.body.style.overflow=a),x?.focus?.(),e.onClose()}function V(){t||(i.style.zIndex=String(me()))}const W=n.createElement("div");Object.assign(W.style,{flex:"1",minHeight:"0",minWidth:"0",display:"flex",overflow:"hidden"});const v=n.createElement("div");v.tabIndex=0,v.setAttribute("role","separator"),v.setAttribute("aria-label","Resize window (arrow keys, or drag)"),Object.assign(v.style,{position:"absolute",right:"0",bottom:"0",width:"16px",height:"16px",cursor:"nwse-resize",touchAction:"none"}),v.innerHTML='<svg viewBox="0 0 16 16" width="16" height="16" style="display:block"><path d="M15 15 L15 9 M15 15 L9 15 M15 15 L15 3 M15 15 L3 15" stroke="currentColor" stroke-width="1" opacity="0.35" fill="none"/></svg>',v.style.color=CLR.label;const Y=320,X=240,J=20;function ee(b,M){const S=o.innerWidth-i.offsetLeft,B=o.innerHeight-i.offsetTop,T=Math.min(Math.max(i.offsetWidth+b,Y),S),O=Math.min(Math.max(i.offsetHeight+M,X),B);i.style.width=`${T}px`,i.style.height=`${O}px`}v.addEventListener("keydown",b=>{if(!(c||w))switch(b.key){case"ArrowRight":b.preventDefault(),ee(J,0);break;case"ArrowLeft":b.preventDefault(),ee(-J,0);break;case"ArrowDown":b.preventDefault(),ee(0,J);break;case"ArrowUp":b.preventDefault(),ee(0,-J);break}}),v.addEventListener("pointerdown",b=>{if(c||w)return;b.preventDefault();const M=A(),S=b.clientX,B=b.clientY,T=i.offsetWidth,O=i.offsetHeight,q=o.innerWidth-i.offsetLeft,z=o.innerHeight-i.offsetTop;v.setPointerCapture(b.pointerId);const I=U=>{const K=Math.min(Math.max(T+(U.clientX-S),Y),q),ie=Math.min(Math.max(O+(U.clientY-B),X),z);i.style.width=`${K}px`,i.style.height=`${ie}px`},P=U=>{M(),v.releasePointerCapture(U.pointerId),v.removeEventListener("pointermove",I),v.removeEventListener("pointerup",P)};v.addEventListener("pointermove",I),v.addEventListener("pointerup",P)}),i.appendChild(s),i.appendChild(W),i.appendChild(v);const ne=e.anchor?overlayRootFor(e.anchor):n.body;l?(l.appendChild(i),ne.appendChild(l)):ne.appendChild(i);const xe=Pe(n,ne),oe=n.createElement("style");oe.textContent=`@media print{
2
2
  body{overflow:visible!important;height:auto!important}
3
3
  body>*:not(.wmap-overlay-box):not(#wmap-modal-backdrop):not(.wmap-overlay-ancestor){display:none!important}
4
4
  #wmap-modal-backdrop{position:static!important;background:none!important;backdrop-filter:none!important;display:block!important}
@@ -6,4 +6,4 @@ body>*:not(.wmap-overlay-box):not(#wmap-modal-backdrop):not(.wmap-overlay-ancest
6
6
  .wmap-overlay-box>div:first-child{display:none!important}
7
7
  .wmap-overlay-box>div:nth-child(2){display:block!important;overflow:visible!important;height:auto!important;flex:none!important;min-height:0!important;min-width:0!important}
8
8
  .wmap-overlay-box>div:nth-child(3){display:none!important}
9
- }`,n.head.appendChild(oe),reparentTooltip(i),t?(s.addEventListener("click",v=>{v.target===s&&W()}),n.addEventListener("keydown",P)):(i.addEventListener("keydown",P),i.addEventListener("mousedown",Z),Z()),nextFrame(()=>(p.isConnected?p:i).focus(),o);function we(v){d=v,!f&&!k&&(i.style.height=v)}function ke(v){const T=()=>{};if(f||k||!(v>0))return T;const H=i.getBoundingClientRect(),O=Math.min(H.width+v,o.innerWidth*.96);if(!(O>H.width+.5))return T;const I=i.style.width,R=c,Q=i.style.left,j=`${Math.round(O)}px`;i.style.width=j,c=j;let N=null;if(!t){const V=H.left+O-o.innerWidth;V>0&&(N=`${Math.max(0,Math.round(H.left-V-8))}px`,i.style.left=N)}return()=>{i.style.width===j&&!f&&!k&&(i.style.width=I),c===j&&(c=R),N!==null&&i.style.left===N&&(i.style.left=Q)}}return{backdrop:s,box:i,contentWrap:z,close:W,bringToFront:Z,setNaturalHeight:we,reserveWidth:ke}}export function openModal(e){return be({...e,mode:"modal"})}export function openFloatingWindow(e){return be({...e,mode:"window"})}const le=new WeakSet;export function openReparentedModal(e,t={}){if(e.length===0||e.some(r=>le.has(r)))return null;const n=e.map(r=>({el:r,parent:r.parentElement,next:r.nextSibling})),o=openModal({ownerDocument:t.ownerDocument,title:t.title,boxSize:t.boxSize,anchor:t.anchor??e[0],onClose:()=>{for(const r of n){if(le.delete(r.el),!r.parent)continue;const s=r.next&&r.next.parentNode===r.parent?r.next:null;r.parent.insertBefore(r.el,s)}t.onClosed?.()}});for(const r of n)le.add(r.el),o.contentWrap.appendChild(r.el);return o}export function makePaletteBtn(e,t,n,o){const r=e.makeCheckMenuBtn("palette","Colour scheme",()=>{const m=t(),i=[];if(m.plotMode==="hardBin"||m.plotMode==="softBin"){const c=m.binColorScheme??"default";i.push({section:"Bin colours"});for(const d of Te())i.push({label:d.label,active:c===d.name,onClick:()=>o({binColorScheme:d.name})});if(n()){const d=m.useDefinedBinColors??!0;i.push({section:"Bin definitions"}),i.push({label:"Use colours from bin definitions",active:d,onClick:()=>o({useDefinedBinColors:!d})})}}else{const c=m.valueColorScheme??"default";i.push({section:"Value colours"});for(const a of He())i.push({label:a.label,active:c===a.name,onClick:()=>o({valueColorScheme:a.name})});const d=m.reverseValueScheme??!1;i.push({section:"Direction"}),i.push({label:"Reverse gradient",active:d,onClick:()=>o({reverseValueScheme:!d})})}return i},()=>{});function s(){r.style.display=t().plotMode==="metadata"?"none":""}return{btn:r,sync:s}}export function requestedPassFailDisplay(e){return e.passFailDisplay??"off"}export function overlayMenuRows(e,t,n,o,r){const s=r?.on?{enabled:!1,disabledHint:"Not drawn in the compact layout"}:void 0;return[...r?[{label:"Compact layout",active:r.on,enabled:r.offered||r.on,disabledHint:"Needs a repeating multi-project layout",onClick:()=>r.onChange(!r.on)},{label:"Layout diagnostics",active:!1,action:!0,closeMenu:!0,onClick:()=>r.onDiagnostics()},{section:""}]:[],{label:"Ring boundaries",active:!!e.showRingBoundaries,...s,onClick:()=>o({showRingBoundaries:!e.showRingBoundaries})},{label:"Quadrant lines",active:!!e.showQuadrantBoundaries,...s,onClick:()=>o({showQuadrantBoundaries:!e.showQuadrantBoundaries})},{label:"Die labels",active:!!e.showDieLabels,onClick:()=>o({showDieLabels:!e.showDieLabels})},{label:"Reticle grid",active:!!e.showReticle,enabled:r?.on?!1:t,...s?{disabledHint:s.disabledHint}:{},onClick:()=>o({showReticle:!e.showReticle})},{label:"XY indicator",active:!!e.showXYIndicator,onClick:()=>o({showXYIndicator:!e.showXYIndicator})},{label:"Axis labels",active:!!e.showAxes,onClick:()=>o({showAxes:!e.showAxes})},...passFailMenuRows({...n,display:requestedPassFailDisplay(e)},m=>o({passFailDisplay:m})),{label:"Mark failing dies",active:!!e.markFailingDies,enabled:n.binMode,disabledHint:n.binMode?void 0:"Available on hard/soft bin maps",onClick:()=>o({markFailingDies:!e.markFailingDies})},{section:""},{label:"Clear overlays",active:!1,action:!0,enabled:anyOverlayActive(e),disabledHint:"No overlays are active",onClick:()=>o({showRingBoundaries:!1,showQuadrantBoundaries:!1,showDieLabels:!1,showReticle:!1,showXYIndicator:!1,showAxes:void 0,passFailDisplay:"off",markFailingDies:!1})}]}export function anyOverlayActive(e){return!!(e.showRingBoundaries||e.showQuadrantBoundaries||e.showDieLabels||e.showReticle||e.showXYIndicator||e.showAxes===!0||e.markFailingDies||requestedPassFailDisplay(e)!=="off")}export function passFailMenuRows(e,t){if(e.functionalActive)return[];const n=[];return e.hasLimits&&n.push({label:"Limit pass/fail",active:e.display==="spec",onClick:()=>t(e.display==="spec"?"off":"spec")}),e.hasRecorded&&n.push({label:"Test pass/fail",active:e.display==="test",onClick:()=>t(e.display==="test"?"off":"test")}),n}export function makeLogScaleBtn(e,t,n){const o=e.makeBtn("logScale","Toggle log scale",()=>{n({logScale:!t().logScale})});function r(){const s=t(),m=s.plotMode,i=m==="value"||m==="stackedValues";o.style.display=i&&requestedPassFailDisplay(s)==="off"&&!s.functionalActive?"":"none",e.setActive(o,!!s.logScale)}return{btn:o,sync:r}}const Ge=[{value:"default",label:"Default (right)"},{value:"compact",label:"Compact (right)"},{value:"left",label:"Left"},{value:"top",label:"Top"},{value:"bottom",label:"Bottom"},{value:"floating",label:"Floating"}];export function makeLegendStyleBtn(e,t,n,o){const r=e.makeCheckMenuBtn("legend","Legend style",()=>{const m=t().legendPosition??"default",i=[];let c=!0;if(o){const d=o.blockedReason();c=d?!0:o.get(),i.push({label:"Legend on each map",active:c,enabled:!d,disabledHint:d??void 0,onClick:()=>o.set(!o.get())})}if(he(t().plotMode)){o&&i.push({section:"Position on each map"});for(const d of Ge)i.push({label:d.label,active:c&&m===d.value,enabled:c,disabledHint:c?void 0:'Turn on "Legend on each map" to position it',onClick:()=>n(d.value)})}return i},()=>{});function s(){r.style.display=o||he(t().plotMode)?"":"none"}return{btn:r,sync:s}}function he(e){return e==="hardBin"||e==="softBin"||e==="metadata"}export function makeOverlaysBtn(e,t,n){return e.makeCheckMenuBtn("overlays","Overlays",()=>t(),o=>e.setActive(o,n()))}export function makeOrientationBtn(e,t,n){const o=r=>n({...r,showXYIndicator:!0});return e.makeCheckMenuBtn("orient","Orientation",()=>[{section:"Rotate"},{label:"Rotate 90\xB0 clockwise",active:!1,onClick:()=>{const r=t().rotation??0;o({rotation:ROTATIONS[(ROTATIONS.indexOf(r)+1)%4]})}},{section:"Flip"},{label:"Flip horizontal",active:!!t().flipX,onClick:()=>o({flipX:!t().flipX})},{label:"Flip vertical",active:!!t().flipY,onClick:()=>o({flipY:!t().flipY})},{section:""},{label:"Reset orientation",active:!1,action:!0,enabled:!!(t().rotation||t().flipX||t().flipY),disabledHint:"Already in the original orientation",onClick:()=>n({rotation:0,flipX:!1,flipY:!1})}],r=>{const{rotation:s,flipX:m,flipY:i}=t();e.setActive(r,!!(s||m||i))})}let G=null;const xe=40,Xe=xe+8;function Ye(e,t){const n=e.createElement("div");n.classList.add("wmap-guide-search"),n.style.cssText="display:flex;align-items:center;gap:2px;margin-left:10px;flex:1;min-width:80px;max-width:260px;";const o=e.createElement("input");o.type="text",o.placeholder="Search guide\u2026",o.setAttribute("aria-label","Search guide"),o.style.cssText=`flex:1;min-width:0;padding:4px 8px;font-size:12px;background:${CLR.menuBg};color:${CLR.text};border:1px solid ${CLR.menuBorder};border-radius:${RADIUS.control};outline:none;`,o.addEventListener("focus",()=>{o.style.borderColor=CLR.iconActive}),o.addEventListener("blur",()=>{o.style.borderColor=CLR.menuBorder});const r=e.createElement("span");r.setAttribute("role","status"),r.setAttribute("aria-live","polite"),r.style.cssText=`font-size:12px;color:${CLR.label};min-width:44px;text-align:center;flex-shrink:0;white-space:nowrap;`;function s(h,u){const p=e.createElement("button");return p.type="button",p.textContent=h,p.setAttribute("aria-label",u),p.disabled=!0,p.style.cssText=`border:none;background:none;cursor:pointer;padding:4px 6px;border-radius:${RADIUS.control};font-size:12px;color:${CLR.label};flex-shrink:0;opacity:0.4;`,p.addEventListener("mouseenter",()=>{p.disabled||(p.style.background=CLR.bgHover)}),p.addEventListener("mouseleave",()=>{p.style.background="none"}),p}const m=s("\u25B2","Previous match"),i=s("\u25BC","Next match");let c=[],d=-1;function a(){const h=c.length===0;m.disabled=h,i.disabled=h,m.style.opacity=h?"0.4":"",i.style.opacity=h?"0.4":""}function g(){for(const h of c)h.parentNode?.replaceChild(e.createTextNode(h.textContent??""),h);t.normalize(),c=[],d=-1}function l(h){if(c.length===0)return;d>=0&&(c[d].style.outline="none"),d=(h%c.length+c.length)%c.length;const u=c[d];u.style.outline=`2px solid ${CLR.iconActive}`,u.style.outlineOffset="1px",u.scrollIntoView({behavior:"smooth",block:"center"}),r.textContent=`${d+1}/${c.length}`}function b(h){g();const u=h.trim();if(!u){r.textContent="",a();return}const p=u.toLowerCase(),f=e.createTreeWalker(t,NodeFilter.SHOW_TEXT,{acceptNode(A){const k=A.parentElement;return!k||k.closest("script,style,.wmap-guide-toc")?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}}),x=[];let w;for(;w=f.nextNode();)x.push(w);for(const A of x){const k=A.textContent??"",C=k.toLowerCase();if(!C.includes(p))continue;const $=e.createDocumentFragment();let D=0,S=C.indexOf(p);for(;S!==-1;){S>D&&$.appendChild(e.createTextNode(k.slice(D,S)));const y=e.createElement("mark");y.textContent=k.slice(S,S+u.length),$.appendChild(y),c.push(y),D=S+u.length,S=C.indexOf(p,D)}D<k.length&&$.appendChild(e.createTextNode(k.slice(D))),A.parentNode?.replaceChild($,A)}a(),c.length===0?r.textContent="No matches":l(0)}return o.addEventListener("input",()=>b(o.value)),o.addEventListener("keydown",h=>{h.key==="Enter"?(h.preventDefault(),l(d+(h.shiftKey?-1:1))):h.key==="Escape"&&(o.value?(o.value="",b("")):o.blur())}),m.addEventListener("click",()=>l(d-1)),i.addEventListener("click",()=>l(d+1)),n.append(o,r,m,i),n}function qe(e,t,n){const o=[...t.querySelectorAll("h2[id]")];if(o.length<2)return;for(const u of t.querySelectorAll("h1[id],h2[id],h3[id],h4[id]"))u.style.scrollMarginTop=`${Xe}px`;const r=e.createElement("div");r.classList.add("wmap-guide-toc"),r.style.cssText=`position:sticky;top:0;z-index:2;background:${CLR.menuBg};border-bottom:1px solid ${CLR.menuBorder};font-family:system-ui,-apple-system,"Segoe UI",sans-serif;`;const s=e.createElement("div");s.style.cssText=`display:flex;align-items:center;gap:4px;height:${xe}px;padding:0 12px;box-sizing:border-box;`;const m=e.createElement("span");m.innerHTML='<svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"/></svg>',m.style.cssText=`display:inline-flex;transition:transform ${MOTION.base};flex-shrink:0;`;const i=e.createElement("button");i.type="button";const c="wmap-guide-toc-panel";i.setAttribute("aria-expanded","false"),i.setAttribute("aria-controls",c),i.style.cssText=`display:flex;align-items:center;gap:6px;border:none;background:none;cursor:pointer;padding:6px 8px;margin:0 -8px 0 -8px;border-radius:${RADIUS.control};font-size:13px;font-weight:600;color:${CLR.text};`;const d=e.createElement("span");d.textContent=`Contents (${o.length})`,i.append(m,d),i.addEventListener("mouseenter",()=>{i.style.background=CLR.bgHover}),i.addEventListener("mouseleave",()=>{i.style.background="none"});const a=e.createElement("button");a.type="button",a.textContent="\u2191 Top",a.style.cssText=`margin-left:auto;border:none;background:none;cursor:pointer;padding:6px 8px;border-radius:${RADIUS.control};font-size:12px;color:${CLR.label};`,a.addEventListener("mouseenter",()=>{a.style.background=CLR.bgHover}),a.addEventListener("mouseleave",()=>{a.style.background="none"}),a.addEventListener("click",()=>{h.close(),t.scrollTo({top:0,behavior:"smooth"})}),n?s.append(i,Ye(e,t),a):s.append(i,a);const g=e.createElement("div");g.id=c,g.hidden=!0,g.style.cssText="padding:2px 12px 12px;max-height:min(60vh,440px);overflow-y:auto;";const l=/^\s*\d+(?:\.\d+)*\.\s+/;for(const u of t.querySelectorAll("h2[id],h3[id],h4[id]")){const p=u.firstChild;p?.nodeType===Node.TEXT_NODE&&(p.textContent=(p.textContent??"").replace(l,""))}const b=e.createElement("ul");b.setAttribute("role","list"),b.style.cssText="list-style:none;margin:0;padding:0;columns:200px;column-gap:24px;";for(const u of o){const p=e.createElement("li");p.style.cssText="break-inside:avoid;";const f=e.createElement("a");f.href=`#${u.id}`,f.textContent=u.textContent??"",f.style.cssText=`display:block;padding:4px 6px;margin:0 -6px;border-radius:${RADIUS.control};font-size:12.5px;color:${CLR.iconActive};text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;`,f.addEventListener("mouseenter",()=>{f.style.background=CLR.bgHover}),f.addEventListener("mouseleave",()=>{f.style.background="none"}),f.addEventListener("click",x=>{x.preventDefault(),h.close(),u.scrollIntoView({behavior:"smooth",block:"start"})}),p.appendChild(f),b.appendChild(p)}g.appendChild(b);const h=wireExpandToggle(i,u=>{g.hidden=!u,i.setAttribute("aria-expanded",String(u)),m.style.transform=u?"rotate(180deg)":"none"});r.append(s,g),t.prepend(r)}function ve(e,t,n,o,r){const s=t,m=s.__wmapDemoApi;s.__wmapDemoApi=o;const i=e.createElement("div");return i.classList.add("wmap-guide-content"),i.innerHTML=n,qe(e,i,r),{content:i,restoreApi:()=>{s.__wmapDemoApi===o&&(s.__wmapDemoApi=m)}}}function ge(e,t){const n=t,o=e.querySelector("script");if(o){const r=e.ownerDocument.createElement("script");r.textContent=o.textContent,e.appendChild(r);const s=e.querySelector(".wmap-guide");return s&&n.__wmapPopulateGuideDemos?.(s),n.__wmapDestroyGuideDemos}}function Ke(e,t,n,o){const r=o?.ownerDocument??document,s=r.defaultView??window,{content:m,restoreApi:i}=ve(r,s,t,n,!0);Object.assign(m.style,{flex:"1",overflow:"auto",minHeight:"0",minWidth:"0"});let c;const d=openFloatingWindow({title:e,anchor:o,ownerDocument:r,printable:!0,onMaximizeChange:a=>{m.style.setProperty("--wmap-guide-reading-width",a?"1000px":"720px")},onClose:()=>{G===d&&(G=null),c?.(),i()}});return d.contentWrap.appendChild(m),c=ge(m,s),d}function Ze(e,t,n,o){const r=e.document;r.title=t,Object.assign(r.documentElement.style,{height:"100%"}),Object.assign(r.body.style,{margin:"0",height:"100vh",overflow:"hidden",display:"flex",flexDirection:"column",fontFamily:FONT.family}),copyWmapThemeTokens(document.documentElement,r.documentElement);const s=syncWmapPopupTheme(document.documentElement,r.documentElement),{content:m,restoreApi:i}=ve(r,e,n,o,!1);Object.assign(m.style,{flex:"1",overflow:"auto",minHeight:"0",minWidth:"0"}),r.body.appendChild(m);const c=ge(m,e);let d=!1;const a=()=>{if(!d){d=!0,clearInterval(g),s();try{c?.()}catch{}i(),G===l&&(G=null)}},g=setInterval(()=>{e.closed&&a()},400);e.addEventListener("pagehide",a);const l={close:()=>{e.closed||e.close(),a()}};return l}export function openUserGuideWindow(e,t,n,o){G&&(G.close(),G=null);const r=n?.title??"Wafer Map \u2014 User Guide",s=(n?.html??"")+t,i=(o?.ownerDocument.defaultView??window).open("","_blank","width=800,height=820");G=i?Ze(i,r,s,e):Ke(r,s,e,o)}export function openWaferMapGuide(e,t){Promise.all([import("./userGuideHtml.js"),import("./renderWaferMap.js"),import("./renderWaferGallery.js")]).then(([n,o,r])=>{openUserGuideWindow({buildWaferMap:$e,renderWaferMap:o.renderWaferMap,renderWaferGallery:r.renderWaferGallery,analyzeWaferMap:Re},n.USER_GUIDE_HTML,e,t)})}export function openReportModal(e,t){const n=t?.ownerDocument??document,o=n.createElement("iframe");o.srcdoc=e,o.title="Summary report",Object.assign(o.style,{border:"0",width:"100%",flex:"1",minHeight:"0",background:"#fff"});const r=n.createElement("div");Object.assign(r.style,{display:"flex",justifyContent:"flex-end",padding:"6px 14px",borderBottom:`1px solid ${CLR.menuBorder}`,flexShrink:"0"});const s=n.createElement("button");s.type="button",wireControlHover(s,"bare"),s.textContent="Open as full page \u2197",Object.assign(s.style,{border:"none",background:"none",color:CLR.iconActive,cursor:"pointer",fontSize:FONT.body,textDecoration:"underline",padding:"0"}),s.addEventListener("click",()=>Ie(e)),r.appendChild(s);const m=n.defaultView??window,i=d=>{if(d.source!==o.contentWindow)return;const a=d.data?.wmapFinding;typeof a=="string"&&t?.onFinding?.(a,c)};t?.onFinding&&m.addEventListener("message",i);const c=openModal({title:"Summary report",anchor:t?.anchor,ownerDocument:n,printable:()=>o.contentWindow?.print(),onClose:()=>m.removeEventListener("message",i)});return c.contentWrap.style.flexDirection="column",c.contentWrap.appendChild(r),c.contentWrap.appendChild(o),c}
9
+ }`,n.head.appendChild(oe),reparentTooltip(i),t?(l.addEventListener("click",b=>{b.target===l&&j()}),n.addEventListener("keydown",$)):(i.addEventListener("keydown",$),i.addEventListener("mousedown",V),V()),nextFrame(()=>(e.initialFocus?.()??(m.isConnected?m:i)).focus(),o);function ve(b){u=b,!c&&!w&&(i.style.height=b)}function ye(b){const M=()=>{};if(c||w||!(b>0))return M;const S=i.getBoundingClientRect(),B=Math.min(S.width+b,o.innerWidth*.96);if(!(B>S.width+.5))return M;const T=i.style.width,O=f,q=i.style.left,z=`${Math.round(B)}px`;i.style.width=z,f=z;let I=null;if(!t){const P=S.left+B-o.innerWidth;P>0&&(I=`${Math.max(0,Math.round(S.left-P-8))}px`,i.style.left=I)}return()=>{i.style.width===z&&!c&&!w&&(i.style.width=T),f===z&&(f=O),I!==null&&i.style.left===I&&(i.style.left=q)}}return{backdrop:l,box:i,contentWrap:W,close:j,bringToFront:V,setNaturalHeight:ve,reserveWidth:ye}}export function openModal(e){return be({...e,mode:"modal"})}export function openFloatingWindow(e){return be({...e,mode:"window"})}const le=new WeakSet;export function openReparentedModal(e,t={}){if(e.length===0||e.some(a=>le.has(a)))return null;const n=e.map(a=>({el:a,parent:a.parentElement,next:a.nextSibling})),o=openModal({ownerDocument:t.ownerDocument,title:t.title,boxSize:t.boxSize,anchor:t.anchor??e[0],onClose:()=>{for(const a of n){if(le.delete(a.el),!a.parent)continue;const l=a.next&&a.next.parentNode===a.parent?a.next:null;a.parent.insertBefore(a.el,l)}t.onClosed?.()}});for(const a of n)le.add(a.el),o.contentWrap.appendChild(a.el);return o}export function makePaletteBtn(e,t,n,o){const a=e.makeCheckMenuBtn("palette","Colour scheme",()=>{const x=t(),i=[];if(x.plotMode==="hardBin"||x.plotMode==="softBin"){const f=x.binColorScheme??"default";i.push({section:"Bin colours"});for(const u of Se())i.push({label:u.label,active:f===u.name,onClick:()=>o({binColorScheme:u.name})});if(n()){const u=x.useDefinedBinColors??!0;i.push({section:"Bin definitions"}),i.push({label:"Use colours from bin definitions",active:u,onClick:()=>o({useDefinedBinColors:!u})})}}else{const f=x.valueColorScheme??"default";i.push({section:"Value colours"});for(const s of Be())i.push({label:s.label,active:f===s.name,onClick:()=>o({valueColorScheme:s.name})});const u=x.reverseValueScheme??!1;i.push({section:"Direction"}),i.push({label:"Reverse gradient",active:u,onClick:()=>o({reverseValueScheme:!u})})}return i},()=>{});function l(){a.style.display=t().plotMode==="metadata"?"none":""}return{btn:a,sync:l}}export function requestedPassFailDisplay(e){return e.passFailDisplay??"off"}export function overlayMenuRows(e,t,n,o,a){const l=a?.on?{enabled:!1,disabledHint:"Not drawn in the compact layout"}:void 0;return[...a?[{label:"Compact layout",active:a.on,enabled:a.offered||a.on,disabledHint:"Needs a repeating multi-project layout",onClick:()=>a.onChange(!a.on)},{label:"Layout diagnostics",active:!1,action:!0,closeMenu:!0,onClick:()=>a.onDiagnostics()},{section:""}]:[],{label:"Ring boundaries",active:!!e.showRingBoundaries,...l,onClick:()=>o({showRingBoundaries:!e.showRingBoundaries})},{label:"Quadrant lines",active:!!e.showQuadrantBoundaries,...l,onClick:()=>o({showQuadrantBoundaries:!e.showQuadrantBoundaries})},{label:"Die labels",active:!!e.showDieLabels,onClick:()=>o({showDieLabels:!e.showDieLabels})},{label:"Reticle grid",active:!!e.showReticle,enabled:a?.on?!1:t,...l?{disabledHint:l.disabledHint}:{},onClick:()=>o({showReticle:!e.showReticle})},{label:"XY indicator",active:!!e.showXYIndicator,onClick:()=>o({showXYIndicator:!e.showXYIndicator})},{label:"Axis labels",active:!!e.showAxes,onClick:()=>o({showAxes:!e.showAxes})},...passFailMenuRows({...n,display:requestedPassFailDisplay(e)},x=>o({passFailDisplay:x})),{label:"Mark failing dies",active:!!e.markFailingDies,enabled:n.binMode,disabledHint:n.binMode?void 0:"Available on hard/soft bin maps",onClick:()=>o({markFailingDies:!e.markFailingDies})},{section:""},{label:"Clear overlays",active:!1,action:!0,enabled:anyOverlayActive(e),disabledHint:"No overlays are active",onClick:()=>o({showRingBoundaries:!1,showQuadrantBoundaries:!1,showDieLabels:!1,showReticle:!1,showXYIndicator:!1,showAxes:void 0,passFailDisplay:"off",markFailingDies:!1})}]}export function anyOverlayActive(e){return!!(e.showRingBoundaries||e.showQuadrantBoundaries||e.showDieLabels||e.showReticle||e.showXYIndicator||e.showAxes===!0||e.markFailingDies||requestedPassFailDisplay(e)!=="off")}export function passFailMenuRows(e,t){if(e.functionalActive)return[];const n=[];return e.hasLimits&&n.push({label:"Limit pass/fail",active:e.display==="spec",onClick:()=>t(e.display==="spec"?"off":"spec")}),e.hasRecorded&&n.push({label:"Test pass/fail",active:e.display==="test",onClick:()=>t(e.display==="test"?"off":"test")}),n}export function makeLogScaleBtn(e,t,n){const o=e.makeBtn("logScale","Toggle log scale",()=>{n({logScale:!t().logScale})});function a(){const l=t(),x=l.plotMode,i=x==="value"||x==="stackedValues";o.style.display=i&&requestedPassFailDisplay(l)==="off"&&!l.functionalActive?"":"none",e.setActive(o,!!l.logScale)}return{btn:o,sync:a}}const Fe=[{value:"default",label:"Default (right)"},{value:"compact",label:"Compact (right)"},{value:"left",label:"Left"},{value:"top",label:"Top"},{value:"bottom",label:"Bottom"},{value:"floating",label:"Floating"}];export function makeLegendStyleBtn(e,t,n,o){const a=e.makeCheckMenuBtn("legend","Legend style",()=>{const x=t().legendPosition??"default",i=[];let f=!0;if(o){const u=o.blockedReason();f=u?!0:o.get(),i.push({label:"Legend on each map",active:f,enabled:!u,disabledHint:u??void 0,onClick:()=>o.set(!o.get())})}if(he(t().plotMode)){o&&i.push({section:"Position on each map"});for(const u of Fe)i.push({label:u.label,active:f&&x===u.value,enabled:f,disabledHint:f?void 0:'Turn on "Legend on each map" to position it',onClick:()=>n(u.value)})}return i},()=>{});function l(){a.style.display=o||he(t().plotMode)?"":"none"}return{btn:a,sync:l}}function he(e){return e==="hardBin"||e==="softBin"||e==="metadata"}export function makeOverlaysBtn(e,t,n){return e.makeCheckMenuBtn("overlays","Overlays",()=>t(),o=>e.setActive(o,n()))}export function makeOrientationBtn(e,t,n){const o=a=>n({...a,showXYIndicator:!0});return e.makeCheckMenuBtn("orient","Orientation",()=>[{section:"Rotate"},{label:"Rotate 90\xB0 clockwise",active:!1,onClick:()=>{const a=t().rotation??0;o({rotation:ROTATIONS[(ROTATIONS.indexOf(a)+1)%4]})}},{section:"Flip"},{label:"Flip horizontal",active:!!t().flipX,onClick:()=>o({flipX:!t().flipX})},{label:"Flip vertical",active:!!t().flipY,onClick:()=>o({flipY:!t().flipY})},{section:""},{label:"Reset orientation",active:!1,action:!0,enabled:!!(t().rotation||t().flipX||t().flipY),disabledHint:"Already in the original orientation",onClick:()=>n({rotation:0,flipX:!1,flipY:!1})}],a=>{const{rotation:l,flipX:x,flipY:i}=t();e.setActive(a,!!(l||x||i))})}