@wafertools/wafermap 0.24.2 → 0.25.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 (45) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/dist/packages/canvas-adapter/charts/barPanel.d.ts +5 -0
  3. package/dist/packages/canvas-adapter/charts/barPanel.js +1 -1
  4. package/dist/packages/canvas-adapter/charts/binCluster.d.ts +5 -0
  5. package/dist/packages/canvas-adapter/charts/binCluster.js +1 -1
  6. package/dist/packages/canvas-adapter/charts/boxplot.d.ts +5 -0
  7. package/dist/packages/canvas-adapter/charts/boxplot.js +1 -1
  8. package/dist/packages/canvas-adapter/charts/capability.d.ts +5 -0
  9. package/dist/packages/canvas-adapter/charts/capability.js +1 -1
  10. package/dist/packages/canvas-adapter/charts/chartShell.d.ts +24 -5
  11. package/dist/packages/canvas-adapter/charts/chartShell.js +1 -1
  12. package/dist/packages/canvas-adapter/charts/correlation.d.ts +5 -0
  13. package/dist/packages/canvas-adapter/charts/correlation.js +1 -1
  14. package/dist/packages/canvas-adapter/charts/histogram.d.ts +5 -0
  15. package/dist/packages/canvas-adapter/charts/histogram.js +1 -1
  16. package/dist/packages/canvas-adapter/charts/regionYieldDiagram.d.ts +5 -0
  17. package/dist/packages/canvas-adapter/charts/regionYieldDiagram.js +1 -1
  18. package/dist/packages/canvas-adapter/charts/scatter.d.ts +5 -0
  19. package/dist/packages/canvas-adapter/charts/scatter.js +1 -1
  20. package/dist/packages/canvas-adapter/dieList.d.ts +9 -0
  21. package/dist/packages/canvas-adapter/dieList.js +6 -6
  22. package/dist/packages/canvas-adapter/insightsTab.d.ts +5 -0
  23. package/dist/packages/canvas-adapter/insightsTab.js +1 -1
  24. package/dist/packages/canvas-adapter/metadataBadge.d.ts +4 -0
  25. package/dist/packages/canvas-adapter/metadataBadge.js +1 -1
  26. package/dist/packages/canvas-adapter/renderWaferGallery.d.ts +14 -1
  27. package/dist/packages/canvas-adapter/renderWaferGallery.js +7 -7
  28. package/dist/packages/canvas-adapter/renderWaferMap.d.ts +22 -0
  29. package/dist/packages/canvas-adapter/renderWaferMap.js +1 -1
  30. package/dist/packages/canvas-adapter/summaryPanel.d.ts +1 -1
  31. package/dist/packages/canvas-adapter/summaryPanel.js +3 -3
  32. package/dist/packages/canvas-adapter/toCanvas.d.ts +11 -0
  33. package/dist/packages/canvas-adapter/toCanvas.js +1 -1
  34. package/dist/packages/canvas-adapter/toolbar.d.ts +57 -8
  35. package/dist/packages/canvas-adapter/toolbar.js +2 -2
  36. package/dist/packages/canvas-adapter/userGuideHtml.d.ts +1 -1
  37. package/dist/packages/canvas-adapter/userGuideHtml.js +1 -1
  38. package/dist/packages/canvas-adapter/version.d.ts +2 -2
  39. package/dist/packages/canvas-adapter/version.js +1 -1
  40. package/dist/packages/canvas-adapter/warnings.d.ts +1 -1
  41. package/dist/packages/canvas-adapter/warnings.js +1 -1
  42. package/dist/packages/renderer/buildView.d.ts +22 -0
  43. package/dist/packages/renderer/buildView.js +1 -1
  44. package/dist/packages/stats/renderSummaryReport.js +1 -1
  45. package/package.json +5 -5
@@ -1,4 +1,4 @@
1
- import{getUniqueTestNumbers as ue}from"../renderer/buildView.js";import{dieHasTestData as pe}from"../renderer/buildWaferMap.js";import{prettyKey as me}from"../core/utils.js";import{listColorSchemes as oe}from"../renderer/colorSchemes.js";import{ICONS as _}from"./icons.js";import{WMAP_VERSION as fe,WMAP_BUILD_TIME as be}from"./version.js";let ie=!1;export function logWmapVersionOnce(){ie||(ie=!0,console.log(`[wmap] v${fe} (built ${be})`))}export const WMAP_TOKEN_NAMES=["z","icon","icon-hover","icon-active","bg-hover","bg-active","separator","surface","border","menu-hover","menu-active","panel-bg","text-muted","text","text-strong","warn-bg","warn-border","warn-text","err-bg","err-border","err-text","info-bg","info-text","selected","finding-indicator","canvas-bg"];const y=(e,t)=>`var(--wmap-${e}, ${t})`;export const CLR={icon:y("icon","#506784"),iconHover:y("icon-hover","#2a3f5f"),iconActive:y("icon-active","#1a65ca"),bgHover:y("bg-hover","#edf0f8"),bgActive:y("bg-active","#dce8f8"),separator:y("separator","rgba(0,0,0,0.12)"),menuBg:y("surface","#fff"),menuBorder:y("border","rgba(0,0,0,0.12)"),menuHover:y("menu-hover","#f0f4fc"),menuActive:y("menu-active","#dce8f8"),panelBg:y("panel-bg","#fafbfc"),label:y("text-muted","#647687"),value:y("text-strong","#1f2f43"),text:y("text","#333"),warnBg:y("warn-bg","#fffbe6"),warnBorder:y("warn-border","#f0c040"),warnText:y("warn-text","#7a5800"),errBg:y("err-bg","#fef2f2"),errBorder:y("err-border","#dc8a8a"),errText:y("err-text","#7a1c1c"),infoBg:y("info-bg","#dce8f8"),infoText:y("info-text","#334155"),findingHighlight:y("selected","#e07a20"),findingIndicator:y("finding-indicator","#b7551a")};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_ABOVE2=`calc(var(--wmap-z, ${DEFAULT_OVERLAY_Z}) + 2)`;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 a of WMAP_TOKEN_NAMES){const i=n.getPropertyValue(`--wmap-${a}`).trim();i&&t.style.setProperty(`--wmap-${a}`,i)}}export function syncWmapPopupTheme(e,t,n){const a=()=>{copyWmapThemeTokens(e,t),n?.()},i=new window.MutationObserver(a);i.observe(e,{attributes:!0,attributeFilter:["style","class"]}),i.observe(document.documentElement,{attributes:!0,attributeFilter:["style","class"]});const s=window.matchMedia("(prefers-color-scheme: dark)");return s.addEventListener("change",a),()=>{i.disconnect(),s.removeEventListener("change",a)}}let ee=null;export function setDetachWindowOpener(e){ee=e}export function openDetachWindow(e){return ee?ee(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 a=`${t}.png`;if(n){n(e,a);return}const i=URL.createObjectURL(e),s=document.createElement("a");s.href=i,s.download=a,s.click(),URL.revokeObjectURL(i)}export function saveTextFile(e,t,n,a){if(a){a(e,t,n);return}const i=new Blob([e],{type:n}),s=URL.createObjectURL(i),l=document.createElement("a");l.href=s,l.download=t,l.click(),URL.revokeObjectURL(s)}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)}function Oe(e,t,n){e.setAttribute("role","menu"),e.setAttribute("aria-label",t);for(const a of Array.from(e.children)){const i=n(a);i&&(a.setAttribute("role",i),a.tabIndex=-1)}}function G(e,t,n){const a=()=>Array.from(e.querySelectorAll(he));e.addEventListener("keydown",s=>{const l=a();if(l.length===0)return;const o=document.activeElement,d=o?l.indexOf(o):-1;switch(s.key){case"ArrowDown":s.preventDefault(),l[d<0||d===l.length-1?0:d+1].focus();break;case"ArrowUp":s.preventDefault(),l[d<=0?l.length-1:d-1].focus();break;case"Home":s.preventDefault(),l[0].focus();break;case"End":s.preventDefault(),l[l.length-1].focus();break;case"Enter":case" ":d>=0&&(s.preventDefault(),l[d].click());break;case"Escape":case"Tab":s.preventDefault(),n(),t?.focus();break}});const i=a()[0];i&&nextFrame(()=>i.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 te=new WeakMap;export function getTooltip(e=document){const t=te.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:"5px",fontSize:"13px",lineHeight:"1.55",maxWidth:"280px",maxHeight:"min(60vh, 480px)",overflow:"hidden",whiteSpace:"pre-wrap",zIndex:Z_ABOVE,display:"none",fontFamily:"system-ui, sans-serif",boxShadow:"0 3px 10px rgba(0,0,0,0.45)"}),te.set(e,n)),e.body.appendChild(n),n}export function hideTooltip(e=document){const t=te.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,a){const i=overlayRootFor(t);e.parentElement!==i&&i.appendChild(e);const s=e.ownerDocument.defaultView??window;e.style.left="0",e.style.top="0";const l=e.offsetWidth,o=e.offsetHeight,d=8;let h=n+14,c=a-8;h+l+d>s.innerWidth&&(h=n-l-6),c+o+d>s.innerHeight&&(c=s.innerHeight-o-d),c<d&&(c=d),e.style.left=`${h}px`,e.style.top=`${c}px`}export function buildDataModeEntries(e,t,n){const a=e.some(pe),i=e.some(c=>c.testValues!==void 0&&Object.keys(c.testValues).length>0),s=e.some(c=>c.hbin!=null),l=e.some(c=>c.sbin!=null),o=a?t?.length?t.map(c=>({plotMode:"value",activeTest:c.testNumber,label:c.unit?`${c.name} (${c.unit})`:c.name,logScale:c.logScale})):ue(e).map(c=>({plotMode:"value",activeTest:c,label:`Test ${c}`})):[],d=[...s?[{plotMode:"hardBin",label:MODE_LABELS.hardBin}]:[],...l?[{plotMode:"softBin",label:MODE_LABELS.softBin}]:[]],h=n.includeStacked?[...i?[{plotMode:"stackedValues",label:MODE_LABELS.stackedValues}]:[],...s?[{plotMode:"stackedBins",label:MODE_LABELS.stackedBins}]:[],...l?[{plotMode:"stackedSoftBins",label:MODE_LABELS.stackedSoftBins}]:[]]:[];return{testEntries:o,binEntries:d,stackedEntries:h}}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??me(e.key)}}export function makeMenuSearchBox(e,t="Filter\u2026"){const n=document.createElement("input");return n.type="text",n.placeholder=t,n.setAttribute("aria-label",t),Object.assign(n.style,{display:"block",width:"calc(100% - 20px)",margin:"2px 10px 6px",padding:"4px 8px",fontSize:"12px",boxSizing:"border-box",background:CLR.menuBg,color:CLR.text,border:`1px solid ${CLR.menuBorder}`,borderRadius:"4px",outline:"none"}),n.addEventListener("click",a=>a.stopPropagation()),n.addEventListener("mousedown",a=>a.stopPropagation()),n.addEventListener("keydown",a=>a.stopPropagation()),n.addEventListener("input",()=>e(n.value.trim().toLowerCase())),n.addEventListener("focus",()=>{n.style.borderColor=CLR.iconActive}),n.addEventListener("blur",()=>{n.style.borderColor=CLR.menuBorder}),queueMicrotask(()=>n.focus()),n}export function buildModeMenuEl(e,t,n,a,i,s,l,o,d=window,h=[]){const{makeMenuRow:c,makeMenuSection:p}=l,r=document.createElement("div"),v=180,x=e.left+v<=(d.innerWidth??1/0)?e.left:Math.max(4,e.right-v);if(Object.assign(r.style,{position:"fixed",top:`${e.bottom+4}px`,left:`${x}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:"4px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",zIndex:Z_BASE,minWidth:`${v}px`,padding:"4px 0",pointerEvents:"auto"}),t.length)if(r.appendChild(p("Test Value")),t.length<=INLINE_TEST_LIMIT)for(const g of t)r.appendChild(c(g.label,i(g),!0,f=>{f.stopPropagation(),s(g,r)}));else{const g=o==="value",f=c(MODE_LABELS.value+" \u25B6",g,!1,()=>{});f.style.display="flex",f.style.justifyContent="space-between",f.style.alignItems="center";let b=null,M=null;const A=()=>{M!==null&&(clearTimeout(M),M=null)},E=()=>{A(),b?.remove(),b=null},U=()=>{A(),M=setTimeout(E,300)},F=()=>{if(b)return;const L=f.getBoundingClientRect(),w=160,C=320,I=L.right+2+w<=(d.innerWidth??1/0)?L.right+2:Math.max(4,L.left-2-w),T=Math.min(L.top-4,Math.max(4,(d.innerHeight??1/0)-C-4));if(b=document.createElement("div"),Object.assign(b.style,{position:"fixed",top:`${T}px`,left:`${I}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:"4px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",zIndex:Z_ABOVE,minWidth:`${w}px`,maxHeight:`${C}px`,overflowY:"auto",padding:"4px 0",pointerEvents:"auto"}),t.length>MENU_SEARCH_THRESHOLD){const S=makeMenuSearchBox(j=>{for(const O of k)O.row.style.display=O.label.includes(j)?"":"none"},"Filter tests\u2026");Object.assign(S.style,{position:"sticky",top:"0",zIndex:"1",background:CLR.menuBg}),b.appendChild(S)}const k=[];for(const S of t){const j=c(S.label,i(S),!1,O=>{O.stopPropagation(),E(),s(S,r)});k.push({row:j,label:S.label.toLowerCase()}),b.appendChild(j)}b.addEventListener("mouseenter",A),b.addEventListener("mouseleave",U),(r.parentElement??d.document.body).appendChild(b),d.document.addEventListener("click",E,{once:!0})};f.addEventListener("mouseenter",()=>{A(),F()}),f.addEventListener("mouseleave",U),r.appendChild(f)}if(n.length){r.appendChild(p("Bins"));for(const g of n)r.appendChild(c(g.label,i(g),!1,f=>{f.stopPropagation(),s(g,r)}))}if(h.length){r.appendChild(p("Metadata"));for(const g of h)r.appendChild(c(g.label,i(g),!1,f=>{f.stopPropagation(),s(g,r)}))}if(a.length){r.appendChild(p("Lot Aggregation"));for(const g of a)r.appendChild(c(g.label,i(g),!1,f=>{f.stopPropagation(),s(g,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){G(e,t,n)}export function wireExpandToggle(e,t){const n=e.ownerDocument;let a=!1;function i(h){a!==h&&(a=h,t(a))}function s(){i(!1)}function l(){i(!a),a&&n.addEventListener("click",s,{once:!0})}const o=h=>{h.stopPropagation(),l()},d=h=>{h.key==="Enter"||h.key===" "?(h.preventDefault(),l()):h.key==="Escape"&&s()};return e.setAttribute("role","button"),e.tabIndex<0&&(e.tabIndex=0),e.addEventListener("click",o),e.addEventListener("keydown",d),{isOpen:()=>a,close:s,destroy(){e.removeEventListener("click",o),e.removeEventListener("keydown",d),n.removeEventListener("click",s)}}}export function buildCheckMenuEl(e,t,n,a=window){const{makeMenuRow:i,makeMenuSection:s}=n,l=document.createElement("div"),o=168,h=e.left+o<=(a.innerWidth??1/0)?e.left:Math.max(4,e.right-o);Object.assign(l.style,{position:"fixed",top:`${e.bottom+4}px`,left:`${h}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:"4px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",zIndex:Z_BASE,minWidth:`${o}px`,padding:"4px 0",pointerEvents:"auto"});for(const c of t)if("section"in c)l.appendChild(s(c.section));else{if(!(c.enabled!==!1))continue;const r=document.createElement("div");r.setAttribute("role","menuitemcheckbox"),r.setAttribute("aria-checked",c.active?"true":"false"),r.tabIndex=-1,Object.assign(r.style,{display:"flex",alignItems:"center",gap:"6px",padding:"6px 14px",fontSize:"12px",cursor:"pointer",color:c.active?CLR.iconActive:CLR.text,fontWeight:c.active?"700":"400",background:c.active?CLR.menuActive:"transparent",whiteSpace:"nowrap",outline:"none"});const v=document.createElement("span");Object.assign(v.style,{width:"12px",flexShrink:"0",color:CLR.iconActive,visibility:c.active?"visible":"hidden"}),v.textContent="\u2713",v.setAttribute("aria-hidden","true");const m=document.createElement("span");m.textContent=c.label,r.appendChild(v),r.appendChild(m),r.addEventListener("mouseenter",()=>{c.active||(r.style.background=CLR.menuHover)}),r.addEventListener("mouseleave",()=>{r.style.background=c.active?CLR.menuActive:"transparent"}),r.addEventListener("focus",()=>{c.active||(r.style.background=CLR.menuHover)}),r.addEventListener("blur",()=>{r.style.background=c.active?CLR.menuActive:"transparent"}),r.addEventListener("click",x=>{x.stopPropagation(),c.onClick(x)}),l.appendChild(r)}return l}export function createToolbarHelpers(e){let t=null;const n=p=>overlayRootFor(p);function a(p,r,v){const m=document.createElement("button");return m.innerHTML=_[p],m.type="button",m.ariaLabel=r,Object.assign(m.style,{display:"flex",alignItems:"center",justifyContent:"center",width:"28px",height:"28px",padding:"0",border:"none",borderRadius:"3px",background:"transparent",color:CLR.icon,cursor:"pointer",pointerEvents:"auto",transition:"background 0.12s, color 0.12s",flexShrink:"0"}),m.addEventListener("mouseenter",x=>{m.dataset.active||(m.style.background=CLR.bgHover,m.style.color=CLR.iconHover),e.innerHTML=m.ariaLabel??r,e.style.display="block",positionTooltip(e,m,x.clientX,x.clientY)}),m.addEventListener("mousemove",x=>{e.style.display==="block"&&positionTooltip(e,m,x.clientX,x.clientY)}),m.addEventListener("mouseleave",()=>{m.dataset.active||(m.style.background="transparent",m.style.color=CLR.icon),e.style.display="none"}),m.addEventListener("click",()=>{e.style.display="none",v()}),m}function i(p,r){r?(p.dataset.active="1",p.style.background=CLR.bgActive,p.style.color=CLR.iconActive):(delete p.dataset.active,p.style.background="transparent",p.style.color=CLR.icon)}function s(){const p=document.createElement("div");return Object.assign(p.style,{width:"1px",height:"18px",background:CLR.separator,margin:"0 2px",flexShrink:"0"}),p}function l(p,r,v,m){const x=document.createElement("div");return x.textContent=p,x.setAttribute("role","menuitemradio"),x.setAttribute("aria-checked",r?"true":"false"),x.tabIndex=-1,Object.assign(x.style,{padding:`6px 14px 6px ${v?"26px":"14px"}`,fontSize:"12px",cursor:"pointer",color:r?CLR.iconActive:CLR.text,fontWeight:r?"700":"400",background:r?CLR.menuActive:"transparent",whiteSpace:"nowrap",outline:"none"}),x.addEventListener("mouseenter",()=>{r||(x.style.background=CLR.menuHover)}),x.addEventListener("mouseleave",()=>{x.style.background=r?CLR.menuActive:"transparent"}),x.addEventListener("focus",()=>{r||(x.style.background=CLR.menuHover)}),x.addEventListener("blur",()=>{x.style.background=r?CLR.menuActive:"transparent"}),x.addEventListener("click",m),x}function o(p){const r=document.createElement("div");return r.textContent=p,r.setAttribute("role","presentation"),Object.assign(r.style,{padding:"5px 14px 2px",fontSize:"10px",fontWeight:"600",letterSpacing:"0.05em",color:CLR.label,textTransform:"uppercase",pointerEvents:"none",userSelect:"none"}),r}function d(p,r,v,m,x){const g=()=>{t&&(t.remove(),t=null),f.setAttribute("aria-expanded","false")},f=a(p,r,()=>{if(t){g();return}const b=document.createElement("div"),M=f.getBoundingClientRect(),A=f.ownerDocument.defaultView??window,E=148,F=M.left+E<=(A.innerWidth??1/0)?M.left:Math.max(4,M.right-E);Object.assign(b.style,{position:"fixed",top:`${M.bottom+4}px`,left:`${F}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:"4px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",zIndex:Z_BASE,minWidth:`${E}px`,padding:"4px 0",pointerEvents:"auto"});for(const L of v()){const w=document.createElement("div");w.textContent=L.label,w.dataset.wmapDropdownValue=L.value;const C=L.value===m();w.setAttribute("role","menuitemradio"),w.setAttribute("aria-checked",C?"true":"false"),w.tabIndex=-1,Object.assign(w.style,{padding:"6px 14px",fontSize:"12px",cursor:"pointer",color:C?CLR.iconActive:CLR.text,fontWeight:C?"700":"400",background:C?CLR.menuActive:"transparent",whiteSpace:"nowrap",outline:"none"});const D=()=>{L.value!==m()&&(w.style.background=CLR.menuHover)},I=()=>{w.style.background=L.value===m()?CLR.menuActive:"transparent"};w.addEventListener("mouseenter",D),w.addEventListener("mouseleave",I),w.addEventListener("focus",D),w.addEventListener("blur",I),w.addEventListener("click",T=>{T.stopPropagation(),x(L.value),g()}),b.appendChild(w)}b.setAttribute("role","menu"),b.setAttribute("aria-label",r),n(f).appendChild(b),t=b,f.setAttribute("aria-expanded","true"),G(b,f,g)});return f.setAttribute("aria-haspopup","menu"),f.setAttribute("aria-expanded","false"),f}function h(p,r,v,m){function x(){return buildCheckMenuEl(f.getBoundingClientRect(),v().map(b=>"section"in b?b:{...b,onClick:M=>{b.onClick(M),m(f);const A=t;if(!A)return;const E=x();E.setAttribute("role","menu"),E.setAttribute("aria-label",r),A.replaceWith(E),t=E,G(E,f,g)}}),{makeMenuRow:l,makeMenuSection:o},f.ownerDocument.defaultView??window)}const g=()=>{t&&(t.remove(),t=null),f.setAttribute("aria-expanded","false")},f=a(p,r,()=>{if(t){g();return}const b=x();b.setAttribute("role","menu"),b.setAttribute("aria-label",r),n(f).appendChild(b),t=b,f.setAttribute("aria-expanded","true"),G(b,f,g)});return f.setAttribute("aria-haspopup","menu"),f.setAttribute("aria-expanded","false"),m(f),f}function c(p){if(t&&!t.contains(p.target)&&(t.remove(),t=null,p.target?.getAttribute?.("aria-haspopup")!=="menu"))for(const v of document.querySelectorAll('[aria-haspopup="menu"][aria-expanded="true"]'))v.setAttribute("aria-expanded","false")}return{makeBtn:a,setActive:i,makeSep:s,makeMenuRow:l,makeMenuSection:o,makeDropdown:d,makeCheckMenuBtn:h,closeOpenMenu:c,getOpenMenu:()=>t,setOpenMenu:p=>{t=p}}}const xe=7e3;let ve=0;function ae(){return xe+ ++ve}const ge=32,ye=6;let we=0;function ke(){return we++%ye*ge}function Ee(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 re(e){const t=e.mode==="modal",n=e.ownerDocument??document,a=n.defaultView??window,i=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 l=n.activeElement,o=n.createElement("div");if(o.className=t?"wmap-modal-box wmap-overlay-box":"wmap-window-box wmap-overlay-box",o.setAttribute("role","dialog"),t&&o.setAttribute("aria-modal","true"),o.setAttribute("aria-label",e.title??"Expanded wafer map"),o.tabIndex=-1,Object.assign(o.style,{position:"relative",background:CLR.menuBg,borderRadius:"12px",overflow:"hidden",display:"flex",flexDirection:"column",width:"min(90vw, 700px)",height:"min(90vh, 700px)",boxShadow:"0 20px 60px rgba(0,0,0,0.4)",minWidth:"320px",minHeight:"240px",maxWidth:"100vw",maxHeight:"100vh",zIndex:t?Z_ABOVE2:String(ae())}),!t){const u=ke();Object.assign(o.style,{position:"fixed",top:`${Math.round(a.innerHeight*.08)+u}px`,left:`${Math.round(a.innerWidth*.08)+u}px`})}const d=n.createElement("div");Object.assign(d.style,{display:"flex",alignItems:"center",gap:"6px",padding:"10px 14px",borderBottom:`1px solid ${CLR.menuBorder}`,flexShrink:"0"});const h={border:`1px solid ${CLR.menuBorder}`,borderRadius:"4px",background:CLR.panelBg,cursor:"pointer",color:CLR.label,lineHeight:"1",padding:"0",display:"flex",alignItems:"center",justifyContent:"center",width:"28px",height:"28px"};if(e.title){const u=n.createElement("span");u.textContent=e.title,u.title=e.title,u.dataset.wmapWindowTitle="1",Object.assign(u.style,{fontWeight:"700",fontSize:"14px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",minWidth:"0"}),d.appendChild(u)}const c=n.createElement("div");c.style.flex="1",d.appendChild(c);let p=null;t||(p=n.createElement("button"),p.type="button",p.innerHTML=_.windowMinimize,p.title="Minimize",p.setAttribute("aria-label","Minimize"),Object.assign(p.style,h),p.addEventListener("click",()=>U(!b)),d.appendChild(p));const r=n.createElement("button");r.type="button",r.innerHTML=_.maximize,r.title="Maximize (F)",r.setAttribute("aria-label","Maximize"),Object.assign(r.style,h),r.addEventListener("click",()=>f(!m));const v=n.createElement("button");v.type="button",v.innerHTML=_.close,v.title="Close (Esc)",v.setAttribute("aria-label","Close"),Object.assign(v.style,h),v.addEventListener("click",D),d.appendChild(r),d.appendChild(v);let m=!1,x="",g="";function f(u){m=u,r.innerHTML=m?_.minimize:_.maximize,r.title=m?"Restore (F)":"Maximize (F)",r.setAttribute("aria-label",m?"Restore":"Maximize"),k.style.display=m?"none":"block",m?(o.style.borderRadius="0",o.style.width="100vw",o.style.height="100vh",t||(x=o.style.top,g=o.style.left,o.style.top="0",o.style.left="0")):(o.style.borderRadius="12px",o.style.width="min(90vw, 700px)",o.style.height="min(90vh, 700px)",t||(o.style.top=x,o.style.left=g)),e.onMaximizeChange?.(m,o)}let b=!1,M="",A="";const E=220;function U(u){b=u,p.innerHTML=b?_.windowRestore:_.windowMinimize,p.title=b?"Restore":"Minimize",p.setAttribute("aria-label",b?"Restore":"Minimize"),k.style.display=b?"none":"block",b?(M=o.style.height,A=o.style.width,o.style.minHeight="0",o.style.height="auto",o.style.minWidth="0",o.style.width=`${E}px`,r.disabled=!0,r.style.opacity="0.4",r.style.cursor="default",T.style.display="none"):(o.style.minHeight="240px",o.style.height=M||"min(90vh, 700px)",o.style.minWidth="320px",o.style.width=A||"min(90vw, 700px)",r.disabled=!1,r.style.opacity="1",r.style.cursor="pointer",T.style.display="flex")}function F(){const u=n.body.style.userSelect;return n.body.style.userSelect="none",()=>{n.body.style.userSelect=u}}t||(d.style.cursor="move",d.addEventListener("pointerdown",u=>{if(m||u.target.closest('button, [role="button"]'))return;u.preventDefault();const B=F(),W=u.clientX,z=u.clientY,H=o.offsetTop,R=o.offsetLeft,Z=a.innerHeight-d.offsetHeight,Q=a.innerWidth-40,X=40-o.offsetWidth;d.setPointerCapture(u.pointerId);const N=V=>{const J=Math.min(Math.max(H+(V.clientY-z),0),Z),de=Math.min(Math.max(R+(V.clientX-W),X),Q);o.style.top=`${J}px`,o.style.left=`${de}px`},P=V=>{B(),d.releasePointerCapture(V.pointerId),d.removeEventListener("pointermove",N),d.removeEventListener("pointerup",P)};d.addEventListener("pointermove",N),d.addEventListener("pointerup",P)}));const L='button,[href],input,select,textarea,[tabindex]:not([tabindex="-1"]),[role="menuitem"],[role="menuitemradio"],[role="menuitemcheckbox"]';function w(u){const B=Array.from(o.querySelectorAll(L)).filter(R=>R.offsetParent!==null||R===n.activeElement);if(B.length===0){u.preventDefault(),o.focus();return}const W=B[0],z=B[B.length-1],H=n.activeElement;u.shiftKey&&(H===W||!o.contains(H))?(u.preventDefault(),z.focus()):!u.shiftKey&&H===z&&(u.preventDefault(),W.focus())}const C=u=>{if(u.key==="Escape"){D();return}if(t&&(u.key==="e"||u.key==="E")){D();return}if(t&&u.key==="Tab"){w(u);return}(u.key==="f"||u.key==="F")&&!b&&f(!m)};function D(){t?n.removeEventListener("keydown",C):o.removeEventListener("keydown",C),q.remove(),ce(),hideTooltip(n),reparentTooltip(n.body),s?s.remove():o.remove(),t&&(n.body.style.overflow=i),l?.focus?.(),e.onClose()}function I(){t||(o.style.zIndex=String(ae()))}const T=n.createElement("div");Object.assign(T.style,{flex:"1",minHeight:"0",minWidth:"0",display:"flex",overflow:"hidden"});const k=n.createElement("div");k.tabIndex=0,k.setAttribute("role","separator"),k.setAttribute("aria-label","Resize window (arrow keys, or drag)"),Object.assign(k.style,{position:"absolute",right:"0",bottom:"0",width:"16px",height:"16px",cursor:"nwse-resize",touchAction:"none"}),k.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>',k.style.color=CLR.label;const S=320,j=240,O=20;function Y(u,B){const W=a.innerWidth-o.offsetLeft,z=a.innerHeight-o.offsetTop,H=Math.min(Math.max(o.offsetWidth+u,S),W),R=Math.min(Math.max(o.offsetHeight+B,j),z);o.style.width=`${H}px`,o.style.height=`${R}px`}k.addEventListener("keydown",u=>{if(!(m||b))switch(u.key){case"ArrowRight":u.preventDefault(),Y(O,0);break;case"ArrowLeft":u.preventDefault(),Y(-O,0);break;case"ArrowDown":u.preventDefault(),Y(0,O);break;case"ArrowUp":u.preventDefault(),Y(0,-O);break}}),k.addEventListener("pointerdown",u=>{if(m||b)return;u.preventDefault();const B=F(),W=u.clientX,z=u.clientY,H=o.offsetWidth,R=o.offsetHeight,Z=a.innerWidth-o.offsetLeft,Q=a.innerHeight-o.offsetTop;k.setPointerCapture(u.pointerId);const X=P=>{const V=Math.min(Math.max(H+(P.clientX-W),S),Z),J=Math.min(Math.max(R+(P.clientY-z),j),Q);o.style.width=`${V}px`,o.style.height=`${J}px`},N=P=>{B(),k.releasePointerCapture(P.pointerId),k.removeEventListener("pointermove",X),k.removeEventListener("pointerup",N)};k.addEventListener("pointermove",X),k.addEventListener("pointerup",N)}),o.appendChild(d),o.appendChild(T),o.appendChild(k);const K=e.anchor?overlayRootFor(e.anchor):n.body;s?(s.appendChild(o),K.appendChild(s)):K.appendChild(o);const ce=Ee(n,K),q=n.createElement("style");return q.textContent=`@media print{
1
+ import{getUniqueTestNumbers as fe}from"../renderer/buildView.js";import{dieHasTestData as me}from"../renderer/buildWaferMap.js";import{prettyKey as be}from"../core/utils.js";import{listColorSchemes as oe}from"../renderer/colorSchemes.js";import{ICONS as $}from"./icons.js";import{WMAP_VERSION as he,WMAP_BUILD_TIME as xe}from"./version.js";let ie=!1;export function logWmapVersionOnce(){ie||(ie=!0,console.log(`[wmap] v${he} (built ${xe})`))}export const WMAP_TOKEN_NAMES=["z","icon","icon-hover","icon-active","bg-hover","bg-active","separator","surface","border","menu-hover","menu-active","panel-bg","text-muted","text","text-strong","warn-bg","warn-border","warn-text","err-bg","err-border","err-text","info-bg","info-text","selected","finding-indicator","canvas-bg","bar-fill","bar-fill-muted"];const w=(e,n)=>`var(--wmap-${e}, ${n})`;export const CLR={icon:w("icon","#506784"),iconHover:w("icon-hover","#2a3f5f"),iconActive:w("icon-active","#1a65ca"),bgHover:w("bg-hover","#edf0f8"),bgActive:w("bg-active","#dce8f8"),separator:w("separator","rgba(0,0,0,0.12)"),menuBg:w("surface","#fff"),menuBorder:w("border","rgba(0,0,0,0.12)"),menuHover:w("menu-hover","#f0f4fc"),menuActive:w("menu-active","#dce8f8"),panelBg:w("panel-bg","#fafbfc"),label:w("text-muted","#647687"),value:w("text-strong","#1f2f43"),text:w("text","#333"),warnBg:w("warn-bg","#fffbe6"),warnBorder:w("warn-border","#f0c040"),warnText:w("warn-text","#7a5800"),errBg:w("err-bg","#fef2f2"),errBorder:w("err-border","#dc8a8a"),errText:w("err-text","#7a1c1c"),infoBg:w("info-bg","#dce8f8"),infoText:w("info-text","#334155"),findingHighlight:w("selected","#e07a20"),findingIndicator:w("finding-indicator","#b7551a"),barFill:w("bar-fill","#2a6fc0"),barFillMuted:w("bar-fill-muted","#94a3b8")};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 n=document.documentElement,t=n.style.getPropertyValue("--wmap-z");return n.style.setProperty("--wmap-z",String(e)),()=>{t?n.style.setProperty("--wmap-z",t):n.style.removeProperty("--wmap-z")}}export function copyWmapThemeTokens(e,n){const t=getComputedStyle(e);for(const o of WMAP_TOKEN_NAMES){const a=t.getPropertyValue(`--wmap-${o}`).trim();a&&n.style.setProperty(`--wmap-${o}`,a)}}export function syncWmapPopupTheme(e,n,t){const o=()=>{copyWmapThemeTokens(e,n),t?.()},a=new window.MutationObserver(o);a.observe(e,{attributes:!0,attributeFilter:["style","class"]}),a.observe(document.documentElement,{attributes:!0,attributeFilter:["style","class"]});const r=window.matchMedia("(prefers-color-scheme: dark)");return r.addEventListener("change",o),()=>{a.disconnect(),r.removeEventListener("change",o)}}let ee=null;export function setDetachWindowOpener(e){ee=e}export function openDetachWindow(e){return ee?ee(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,n,t){const o=`${n}.png`;if(t){t(e,o);return}const a=URL.createObjectURL(e),r=document.createElement("a");r.href=a,r.download=o,r.click(),URL.revokeObjectURL(a)}export function saveTextFile(e,n,t,o){if(o){o(e,n,t);return}const a=new Blob([e],{type:t}),r=URL.createObjectURL(a),d=document.createElement("a");d.href=r,d.download=n,d.click(),URL.revokeObjectURL(r)}const ve='[role="menuitem"],[role="menuitemradio"],[role="menuitemcheckbox"]';export function nextFrame(e,n=window){const t=n.requestAnimationFrame;typeof t=="function"?t.call(n,e):setTimeout(e,0)}function We(e,n,t){e.setAttribute("role","menu"),e.setAttribute("aria-label",n);for(const o of Array.from(e.children)){const a=t(o);a&&(o.setAttribute("role",a),o.tabIndex=-1)}}function X(e,n,t){const o=()=>Array.from(e.querySelectorAll(ve));e.addEventListener("keydown",r=>{const d=o();if(d.length===0)return;const i=e.ownerDocument.activeElement,l=i?d.indexOf(i):-1;switch(r.key){case"ArrowDown":r.preventDefault(),d[l<0||l===d.length-1?0:l+1].focus();break;case"ArrowUp":r.preventDefault(),d[l<=0?d.length-1:l-1].focus();break;case"Home":r.preventDefault(),d[0].focus();break;case"End":r.preventDefault(),d[d.length-1].focus();break;case"Enter":case" ":l>=0&&(r.preventDefault(),d[l].click());break;case"Escape":case"Tab":r.preventDefault(),t(),n?.focus();break}});const a=o()[0];a&&nextFrame(()=>a.focus())}export function overlayRootFor(e){let n=e;for(;n;){if(n.classList.contains("wmap-overlay-box")||n.tagName==="DIALOG"&&n.matches(":modal"))return n;n=n.parentElement}return e.ownerDocument.body}const ae=new WeakMap;export function menuLayerFor(e){const n=overlayRootFor(e),t=ae.get(n);if(t&&t.isConnected)return t;const a=e.ownerDocument.createElement("div");return a.dataset.wmapMenuLayer="1",Object.assign(a.style,{position:"fixed",inset:"0",zIndex:Z_MENU,pointerEvents:"none"}),n.appendChild(a),ae.set(n,a),a}const te=new WeakMap;export function getTooltip(e=document){const n=te.get(e);if(n&&n.isConnected)return n;const t=n??e.createElement("div");return n||(Object.assign(t.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:"5px",fontSize:"13px",lineHeight:"1.55",maxWidth:"280px",maxHeight:"min(60vh, 480px)",overflow:"hidden",whiteSpace:"pre-wrap",zIndex:Z_ABOVE,display:"none",fontFamily:"system-ui, sans-serif",boxShadow:"0 3px 10px rgba(0,0,0,0.45)"}),te.set(e,t)),e.body.appendChild(t),t}export function hideTooltip(e=document){const n=te.get(e);n&&(n.style.display="none")}export function reparentTooltip(e){const n=e?.ownerDocument??document,t=getTooltip(n);(e??n.body).appendChild(t)}export function positionTooltip(e,n,t,o){const a=overlayRootFor(n);e.parentElement!==a&&a.appendChild(e);const r=e.ownerDocument.defaultView??window;e.style.left="0",e.style.top="0";const d=e.offsetWidth,i=e.offsetHeight,l=8;let x=t+14,f=o-8;x+d+l>r.innerWidth&&(x=t-d-6),f+i+l>r.innerHeight&&(f=r.innerHeight-i-l),f<l&&(f=l),e.style.left=`${x}px`,e.style.top=`${f}px`}export function buildDataModeEntries(e,n,t){const o=e.some(me),a=e.some(f=>f.testValues!==void 0&&Object.keys(f.testValues).length>0),r=e.some(f=>f.hbin!=null),d=e.some(f=>f.sbin!=null),i=o?n?.length?n.map(f=>({plotMode:"value",activeTest:f.testNumber,label:f.unit?`${f.name} (${f.unit})`:f.name,logScale:f.logScale})):fe(e).map(f=>({plotMode:"value",activeTest:f,label:`Test ${f}`})):[],l=[...r?[{plotMode:"hardBin",label:MODE_LABELS.hardBin}]:[],...d?[{plotMode:"softBin",label:MODE_LABELS.softBin}]:[]],x=t.includeStacked?[...a?[{plotMode:"stackedValues",label:MODE_LABELS.stackedValues}]:[],...r?[{plotMode:"stackedBins",label:MODE_LABELS.stackedBins}]:[],...d?[{plotMode:"stackedSoftBins",label:MODE_LABELS.stackedSoftBins}]:[]]:[];return{testEntries:i,binEntries:l,stackedEntries:x}}export function metadataKeyHasData(e,n){return e.some(t=>t.metadata?.[n]!==void 0&&t.metadata?.[n]!==null)}export function metadataModeEntry(e){return{plotMode:"metadata",activeMetadataKey:e.key,label:e.label??be(e.key)}}export function makeMenuSearchBox(e,n="Filter\u2026",t=document){const o=t.createElement("input");return o.type="text",o.placeholder=n,o.setAttribute("aria-label",n),Object.assign(o.style,{display:"block",width:"calc(100% - 20px)",margin:"2px 10px 6px",padding:"4px 8px",fontSize:"12px",boxSizing:"border-box",background:CLR.menuBg,color:CLR.text,border:`1px solid ${CLR.menuBorder}`,borderRadius:"4px",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,n,t,o,a,r,d,i,l=window,x=[]){const{makeMenuRow:f,makeMenuSection:m}=d,s=document.createElement("div"),c=180,h=e.left+c<=(l.innerWidth??1/0)?e.left:Math.max(4,e.right-c);if(Object.assign(s.style,{position:"fixed",top:`${e.bottom+4}px`,left:`${h}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:"4px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",zIndex:Z_BASE,minWidth:`${c}px`,padding:"4px 0",pointerEvents:"auto"}),n.length)if(s.appendChild(m("Test Value")),n.length<=INLINE_TEST_LIMIT)for(const u of n)s.appendChild(f(u.label,a(u),!0,g=>{g.stopPropagation(),r(u,s)}));else{const u=i==="value",g=f(MODE_LABELS.value+" \u25B6",u,!1,()=>{});g.style.display="flex",g.style.justifyContent="space-between",g.style.alignItems="center";let b=null,y=null;const L=()=>{y!==null&&(clearTimeout(y),y=null)},S=()=>{L(),b?.remove(),b=null},M=()=>{L(),y=setTimeout(S,300)},N=()=>{if(b)return;const I=g.getBoundingClientRect(),A=160,k=320,W=I.right+2+A<=(l.innerWidth??1/0)?I.right+2:Math.max(4,I.left-2-A),B=Math.min(I.top-4,Math.max(4,(l.innerHeight??1/0)-k-4));if(b=document.createElement("div"),Object.assign(b.style,{position:"fixed",top:`${B}px`,left:`${W}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:"4px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",zIndex:Z_ABOVE,minWidth:`${A}px`,maxHeight:`${k}px`,overflowY:"auto",padding:"4px 0",pointerEvents:"auto"}),n.length>MENU_SEARCH_THRESHOLD){const D=makeMenuSearchBox(j=>{for(const H of E)H.row.style.display=H.label.includes(j)?"":"none"},"Filter tests\u2026");Object.assign(D.style,{position:"sticky",top:"0",zIndex:"1",background:CLR.menuBg}),b.appendChild(D)}const E=[];for(const D of n){const j=f(D.label,a(D),!1,H=>{H.stopPropagation(),S(),r(D,s)});E.push({row:j,label:D.label.toLowerCase()}),b.appendChild(j)}b.addEventListener("mouseenter",L),b.addEventListener("mouseleave",M),(s.parentElement??l.document.body).appendChild(b),l.document.addEventListener("click",S,{once:!0})};g.addEventListener("mouseenter",()=>{L(),N()}),g.addEventListener("mouseleave",M),s.appendChild(g)}if(t.length){s.appendChild(m("Bins"));for(const u of t)s.appendChild(f(u.label,a(u),!1,g=>{g.stopPropagation(),r(u,s)}))}if(x.length){s.appendChild(m("Metadata"));for(const u of x)s.appendChild(f(u.label,a(u),!1,g=>{g.stopPropagation(),r(u,s)}))}if(o.length){s.appendChild(m("Lot Aggregation"));for(const u of o)s.appendChild(f(u.label,a(u),!1,g=>{g.stopPropagation(),r(u,s)}))}return s.setAttribute("role","menu"),s.setAttribute("aria-label","Plot mode"),s}export function markMenuTrigger(e,n){e.setAttribute("aria-haspopup","menu"),e.setAttribute("aria-expanded",n?"true":"false")}export function wireMenuA11y(e,n,t){X(e,n,t)}export function wireExpandToggle(e,n){const t=e.ownerDocument;let o=!1;function a(x){o!==x&&(o=x,n(o))}function r(){a(!1)}function d(){a(!o),o&&t.addEventListener("click",r,{once:!0})}const i=x=>{x.stopPropagation(),d()},l=x=>{x.key==="Enter"||x.key===" "?(x.preventDefault(),d()):x.key==="Escape"&&r()};return e.setAttribute("role","button"),e.tabIndex<0&&(e.tabIndex=0),e.addEventListener("click",i),e.addEventListener("keydown",l),{isOpen:()=>o,close:r,destroy(){e.removeEventListener("click",i),e.removeEventListener("keydown",l),t.removeEventListener("click",r)}}}export function buildCheckMenuEl(e,n,t,o=window){const{makeMenuRow:a,makeMenuSection:r}=t,d=o.document,i=d.createElement("div"),l=168,f=e.left+l<=(o.innerWidth??1/0)?e.left:Math.max(4,e.right-l);Object.assign(i.style,{position:"fixed",top:`${e.bottom+4}px`,left:`${f}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:"4px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",zIndex:Z_BASE,minWidth:`${l}px`,padding:"4px 0",pointerEvents:"auto"});for(const m of n)if("section"in m)i.appendChild(r(m.section));else{const s=m.enabled!==!1;if(!s&&!m.disabledHint)continue;const c=d.createElement("div");c.setAttribute("role","menuitemcheckbox"),c.setAttribute("aria-checked",m.active?"true":"false"),c.tabIndex=-1,s||(c.setAttribute("aria-disabled","true"),c.title=m.disabledHint),Object.assign(c.style,{display:"flex",alignItems:"center",gap:"6px",padding:"6px 14px",fontSize:"12px",cursor:s?"pointer":"default",color:s?m.active?CLR.iconActive:CLR.text:CLR.label,fontWeight:m.active?"700":"400",background:m.active?CLR.menuActive:"transparent",whiteSpace:"nowrap",outline:"none"});const v=d.createElement("span");Object.assign(v.style,{width:"12px",flexShrink:"0",color:CLR.iconActive,visibility:m.active?"visible":"hidden"}),v.textContent="\u2713",v.setAttribute("aria-hidden","true");const h=d.createElement("span");h.textContent=m.label,c.appendChild(v),c.appendChild(h),s?(c.addEventListener("mouseenter",()=>{m.active||(c.style.background=CLR.menuHover)}),c.addEventListener("mouseleave",()=>{c.style.background=m.active?CLR.menuActive:"transparent"}),c.addEventListener("focus",()=>{m.active||(c.style.background=CLR.menuHover)}),c.addEventListener("blur",()=>{c.style.background=m.active?CLR.menuActive:"transparent"}),c.addEventListener("click",u=>{u.stopPropagation(),m.onClick(u)})):c.addEventListener("click",u=>{u.stopPropagation()}),i.appendChild(c)}return i}export function createToolbarHelpers(e){const n=e.ownerDocument;let t=null;const o=s=>menuLayerFor(s);function a(s,c,v){const h=n.createElement("button");return h.innerHTML=$[s],h.type="button",h.ariaLabel=c,Object.assign(h.style,{display:"flex",alignItems:"center",justifyContent:"center",width:"28px",height:"28px",padding:"0",border:"none",borderRadius:"3px",background:"transparent",color:CLR.icon,cursor:"pointer",pointerEvents:"auto",transition:"background 0.12s, color 0.12s",flexShrink:"0"}),h.addEventListener("mouseenter",u=>{h.dataset.active||(h.style.background=CLR.bgHover,h.style.color=CLR.iconHover),e.innerHTML=h.ariaLabel??c,e.style.display="block",positionTooltip(e,h,u.clientX,u.clientY)}),h.addEventListener("mousemove",u=>{e.style.display==="block"&&positionTooltip(e,h,u.clientX,u.clientY)}),h.addEventListener("mouseleave",()=>{h.dataset.active||(h.style.background="transparent",h.style.color=CLR.icon),e.style.display="none"}),h.addEventListener("click",()=>{e.style.display="none",v()}),h}function r(s,c){c?(s.dataset.active="1",s.style.background=CLR.bgActive,s.style.color=CLR.iconActive):(delete s.dataset.active,s.style.background="transparent",s.style.color=CLR.icon)}function d(){const s=n.createElement("div");return Object.assign(s.style,{width:"1px",height:"18px",background:CLR.separator,margin:"0 2px",flexShrink:"0"}),s}function i(s,c,v,h){const u=n.createElement("div");return u.textContent=s,u.setAttribute("role","menuitemradio"),u.setAttribute("aria-checked",c?"true":"false"),u.tabIndex=-1,Object.assign(u.style,{padding:`6px 14px 6px ${v?"26px":"14px"}`,fontSize:"12px",cursor:"pointer",color:c?CLR.iconActive:CLR.text,fontWeight:c?"700":"400",background:c?CLR.menuActive:"transparent",whiteSpace:"nowrap",outline:"none"}),u.addEventListener("mouseenter",()=>{c||(u.style.background=CLR.menuHover)}),u.addEventListener("mouseleave",()=>{u.style.background=c?CLR.menuActive:"transparent"}),u.addEventListener("focus",()=>{c||(u.style.background=CLR.menuHover)}),u.addEventListener("blur",()=>{u.style.background=c?CLR.menuActive:"transparent"}),u.addEventListener("click",h),u}function l(s){const c=n.createElement("div");return c.textContent=s,c.setAttribute("role","presentation"),Object.assign(c.style,{padding:"5px 14px 2px",fontSize:"10px",fontWeight:"600",letterSpacing:"0.05em",color:CLR.label,textTransform:"uppercase",pointerEvents:"none",userSelect:"none"}),c}function x(s,c,v,h,u){const g=()=>{t&&(t.remove(),t=null),b.setAttribute("aria-expanded","false")},b=a(s,c,()=>{if(t){g();return}const y=n.createElement("div"),L=b.getBoundingClientRect(),S=b.ownerDocument.defaultView??window,M=148,I=L.left+M<=(S.innerWidth??1/0)?L.left:Math.max(4,L.right-M);Object.assign(y.style,{position:"fixed",top:`${L.bottom+4}px`,left:`${I}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:"4px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",zIndex:Z_BASE,minWidth:`${M}px`,padding:"4px 0",pointerEvents:"auto"});for(const A of v()){const k=n.createElement("div");k.textContent=A.label,k.dataset.wmapDropdownValue=A.value;const C=A.value===h();k.setAttribute("role","menuitemradio"),k.setAttribute("aria-checked",C?"true":"false"),k.tabIndex=-1,Object.assign(k.style,{padding:"6px 14px",fontSize:"12px",cursor:"pointer",color:C?CLR.iconActive:CLR.text,fontWeight:C?"700":"400",background:C?CLR.menuActive:"transparent",whiteSpace:"nowrap",outline:"none"});const W=()=>{A.value!==h()&&(k.style.background=CLR.menuHover)},B=()=>{k.style.background=A.value===h()?CLR.menuActive:"transparent"};k.addEventListener("mouseenter",W),k.addEventListener("mouseleave",B),k.addEventListener("focus",W),k.addEventListener("blur",B),k.addEventListener("click",E=>{E.stopPropagation(),u(A.value),g()}),y.appendChild(k)}y.setAttribute("role","menu"),y.setAttribute("aria-label",c),o(b).appendChild(y),t=y,b.setAttribute("aria-expanded","true"),X(y,b,g)});return b.setAttribute("aria-haspopup","menu"),b.setAttribute("aria-expanded","false"),b}function f(s,c,v,h){function u(){return buildCheckMenuEl(b.getBoundingClientRect(),v().map(y=>"section"in y?y:{...y,onClick:L=>{y.onClick(L),h(b);const S=t;if(!S)return;const M=u();M.setAttribute("role","menu"),M.setAttribute("aria-label",c),S.replaceWith(M),t=M,X(M,b,g)}}),{makeMenuRow:i,makeMenuSection:l},b.ownerDocument.defaultView??window)}const g=()=>{t&&(t.remove(),t=null),b.setAttribute("aria-expanded","false")},b=a(s,c,()=>{if(t){g();return}const y=u();y.setAttribute("role","menu"),y.setAttribute("aria-label",c),o(b).appendChild(y),t=y,b.setAttribute("aria-expanded","true"),X(y,b,g)});return b.setAttribute("aria-haspopup","menu"),b.setAttribute("aria-expanded","false"),h(b),b}function m(s){if(t&&!t.contains(s.target)&&(t.remove(),t=null,s.target?.getAttribute?.("aria-haspopup")!=="menu"))for(const v of document.querySelectorAll('[aria-haspopup="menu"][aria-expanded="true"]'))v.setAttribute("aria-expanded","false")}return{makeBtn:a,setActive:r,makeSep:d,makeMenuRow:i,makeMenuSection:l,makeDropdown:x,makeCheckMenuBtn:f,closeOpenMenu:m,getOpenMenu:()=>t,setOpenMenu:s=>{t=s}}}const ge=7e3;let ye=0;function re(){return ge+ ++ye}const we=32,ke=6;let Ee=0;function Le(){return Ee++%ke*we}function Me(e,n){if(n===e.body)return()=>{};let t=n;for(;t.parentElement&&t.parentElement!==e.body;)t=t.parentElement;return t===e.body?()=>{}:(t.classList.add("wmap-overlay-ancestor"),()=>t.classList.remove("wmap-overlay-ancestor"))}function se(e){const n=e.mode==="modal",t=e.ownerDocument??document,o=t.defaultView??window,a=t.body.style.overflow;n&&(t.body.style.overflow="hidden");let r=null;n&&(r=t.createElement("div"),r.id="wmap-modal-backdrop",Object.assign(r.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 d=t.activeElement,i=t.createElement("div");if(i.className=n?"wmap-modal-box wmap-overlay-box":"wmap-window-box wmap-overlay-box",i.setAttribute("role","dialog"),n&&i.setAttribute("aria-modal","true"),i.setAttribute("aria-label",e.title??"Expanded wafer map"),i.tabIndex=-1,Object.assign(i.style,{position:"relative",background:CLR.menuBg,borderRadius:"12px",overflow:"hidden",display:"flex",flexDirection:"column",width:"min(90vw, 700px)",height:"min(90vh, 700px)",boxShadow:"0 20px 60px rgba(0,0,0,0.4)",minWidth:"320px",minHeight:"240px",maxWidth:"100vw",maxHeight:"100vh",zIndex:n?Z_ABOVE2:String(re())}),!n){const p=Le();Object.assign(i.style,{position:"fixed",top:`${Math.round(o.innerHeight*.08)+p}px`,left:`${Math.round(o.innerWidth*.08)+p}px`})}const l=t.createElement("div");Object.assign(l.style,{display:"flex",alignItems:"center",gap:"6px",padding:"10px 14px",borderBottom:`1px solid ${CLR.menuBorder}`,flexShrink:"0"});const x={border:`1px solid ${CLR.menuBorder}`,borderRadius:"4px",background:CLR.panelBg,cursor:"pointer",color:CLR.label,lineHeight:"1",padding:"0",display:"flex",alignItems:"center",justifyContent:"center",width:"28px",height:"28px"};if(e.title){const p=t.createElement("span");p.textContent=e.title,p.title=e.title,p.dataset.wmapWindowTitle="1",Object.assign(p.style,{fontWeight:"700",fontSize:"14px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",minWidth:"0"}),l.appendChild(p)}const f=t.createElement("div");f.style.flex="1",l.appendChild(f);let m=null;n||(m=t.createElement("button"),m.type="button",m.innerHTML=$.windowMinimize,m.title="Minimize",m.setAttribute("aria-label","Minimize"),Object.assign(m.style,x),m.addEventListener("click",()=>M(!b)),l.appendChild(m));const s=t.createElement("button");s.type="button",s.innerHTML=$.maximize,s.title="Maximize (F)",s.setAttribute("aria-label","Maximize"),Object.assign(s.style,x),s.addEventListener("click",()=>g(!v));const c=t.createElement("button");c.type="button",c.innerHTML=$.close,c.title="Close (Esc)",c.setAttribute("aria-label","Close"),Object.assign(c.style,x),c.addEventListener("click",C),l.appendChild(s),l.appendChild(c);let v=!1,h="",u="";function g(p){v=p,s.innerHTML=v?$.minimize:$.maximize,s.title=v?"Restore (F)":"Maximize (F)",s.setAttribute("aria-label",v?"Restore":"Maximize"),E.style.display=v?"none":"block",v?(i.style.borderRadius="0",i.style.width="100vw",i.style.height="100vh",n||(h=i.style.top,u=i.style.left,i.style.top="0",i.style.left="0")):(i.style.borderRadius="12px",i.style.width="min(90vw, 700px)",i.style.height="min(90vh, 700px)",n||(i.style.top=h,i.style.left=u)),e.onMaximizeChange?.(v,i)}let b=!1,y="",L="";const S=220;function M(p){b=p,m.innerHTML=b?$.windowRestore:$.windowMinimize,m.title=b?"Restore":"Minimize",m.setAttribute("aria-label",b?"Restore":"Minimize"),E.style.display=b?"none":"block",b?(y=i.style.height,L=i.style.width,i.style.minHeight="0",i.style.height="auto",i.style.minWidth="0",i.style.width=`${S}px`,s.disabled=!0,s.style.opacity="0.4",s.style.cursor="default",B.style.display="none"):(i.style.minHeight="240px",i.style.height=y||"min(90vh, 700px)",i.style.minWidth="320px",i.style.width=L||"min(90vw, 700px)",s.disabled=!1,s.style.opacity="1",s.style.cursor="pointer",B.style.display="flex")}function N(){const p=t.body.style.userSelect;return t.body.style.userSelect="none",()=>{t.body.style.userSelect=p}}n||(l.style.cursor="move",l.addEventListener("pointerdown",p=>{if(v||p.target.closest('button, [role="button"]'))return;p.preventDefault();const T=N(),z=p.clientX,R=p.clientY,O=i.offsetTop,_=i.offsetLeft,q=o.innerHeight-l.offsetHeight,Q=o.innerWidth-40,G=40-i.offsetWidth;l.setPointerCapture(p.pointerId);const U=V=>{const J=Math.min(Math.max(O+(V.clientY-R),0),q),pe=Math.min(Math.max(_+(V.clientX-z),G),Q);i.style.top=`${J}px`,i.style.left=`${pe}px`},F=V=>{T(),l.releasePointerCapture(V.pointerId),l.removeEventListener("pointermove",U),l.removeEventListener("pointerup",F)};l.addEventListener("pointermove",U),l.addEventListener("pointerup",F)}));const I='button,[href],input,select,textarea,[tabindex]:not([tabindex="-1"]),[role="menuitem"],[role="menuitemradio"],[role="menuitemcheckbox"]';function A(p){const T=Array.from(i.querySelectorAll(I)).filter(_=>_.offsetParent!==null||_===t.activeElement);if(T.length===0){p.preventDefault(),i.focus();return}const z=T[0],R=T[T.length-1],O=t.activeElement;p.shiftKey&&(O===z||!i.contains(O))?(p.preventDefault(),R.focus()):!p.shiftKey&&O===R&&(p.preventDefault(),z.focus())}const k=p=>{if(p.key==="Escape"){C();return}if(n&&(p.key==="e"||p.key==="E")){C();return}if(n&&p.key==="Tab"){A(p);return}(p.key==="f"||p.key==="F")&&!b&&g(!v)};function C(){n?t.removeEventListener("keydown",k):i.removeEventListener("keydown",k),Z.remove(),ue(),hideTooltip(t),reparentTooltip(t.body),r?r.remove():i.remove(),n&&(t.body.style.overflow=a),d?.focus?.(),e.onClose()}function W(){n||(i.style.zIndex=String(re()))}const B=t.createElement("div");Object.assign(B.style,{flex:"1",minHeight:"0",minWidth:"0",display:"flex",overflow:"hidden"});const E=t.createElement("div");E.tabIndex=0,E.setAttribute("role","separator"),E.setAttribute("aria-label","Resize window (arrow keys, or drag)"),Object.assign(E.style,{position:"absolute",right:"0",bottom:"0",width:"16px",height:"16px",cursor:"nwse-resize",touchAction:"none"}),E.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>',E.style.color=CLR.label;const D=320,j=240,H=20;function Y(p,T){const z=o.innerWidth-i.offsetLeft,R=o.innerHeight-i.offsetTop,O=Math.min(Math.max(i.offsetWidth+p,D),z),_=Math.min(Math.max(i.offsetHeight+T,j),R);i.style.width=`${O}px`,i.style.height=`${_}px`}E.addEventListener("keydown",p=>{if(!(v||b))switch(p.key){case"ArrowRight":p.preventDefault(),Y(H,0);break;case"ArrowLeft":p.preventDefault(),Y(-H,0);break;case"ArrowDown":p.preventDefault(),Y(0,H);break;case"ArrowUp":p.preventDefault(),Y(0,-H);break}}),E.addEventListener("pointerdown",p=>{if(v||b)return;p.preventDefault();const T=N(),z=p.clientX,R=p.clientY,O=i.offsetWidth,_=i.offsetHeight,q=o.innerWidth-i.offsetLeft,Q=o.innerHeight-i.offsetTop;E.setPointerCapture(p.pointerId);const G=F=>{const V=Math.min(Math.max(O+(F.clientX-z),D),q),J=Math.min(Math.max(_+(F.clientY-R),j),Q);i.style.width=`${V}px`,i.style.height=`${J}px`},U=F=>{T(),E.releasePointerCapture(F.pointerId),E.removeEventListener("pointermove",G),E.removeEventListener("pointerup",U)};E.addEventListener("pointermove",G),E.addEventListener("pointerup",U)}),i.appendChild(l),i.appendChild(B),i.appendChild(E);const K=e.anchor?overlayRootFor(e.anchor):t.body;r?(r.appendChild(i),K.appendChild(r)):K.appendChild(i);const ue=Me(t,K),Z=t.createElement("style");return Z.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(q),reparentTooltip(o),t?(s.addEventListener("click",u=>{u.target===s&&D()}),n.addEventListener("keydown",C)):(o.addEventListener("keydown",C),o.addEventListener("mousedown",I),I()),nextFrame(()=>(v.isConnected?v:o).focus(),a),{backdrop:s,box:o,contentWrap:T,close:D,bringToFront:I}}export function openModal(e){return re({...e,mode:"modal"})}export function openFloatingWindow(e){return re({...e,mode:"window"})}const ne=new WeakSet;export function openReparentedModal(e,t={}){if(e.length===0||e.some(i=>ne.has(i)))return null;const n=e.map(i=>({el:i,parent:i.parentElement,next:i.nextSibling})),a=openModal({ownerDocument:t.ownerDocument,title:t.title,anchor:e[0],onClose:()=>{for(const i of n){if(ne.delete(i.el),!i.parent)continue;const s=i.next&&i.next.parentNode===i.parent?i.next:null;i.parent.insertBefore(i.el,s)}t.onClosed?.()}});for(const i of n)ne.add(i.el),a.contentWrap.appendChild(i.el);return a}export function makePaletteBtn(e,t,n,a,i){const s=e.makeDropdown("palette","Colour scheme",()=>{const d=t()==="hardBin"||t()==="softBin"?oe().filter(h=>h.name==="default"||h.name==="accessible"):oe();return[...a()?[{value:"custom",label:"Custom"}]:[],...d.map(h=>({value:h.name,label:h.label}))]},()=>n(),o=>i(o));function l(){s.style.display=t()==="metadata"?"none":""}return{btn:s,sync:l}}export function requestedPassFailDisplay(e){return e.passFailDisplay??"off"}export function passFailMenuRows(e,t){if(e.functionalActive)return[];const n=[];return e.hasLimits&&n.push({label:"Spec 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 a=e.makeBtn("logScale","Toggle log scale",()=>{n({logScale:!t().logScale})});function i(){const s=t(),l=s.plotMode,o=l==="value"||l==="stackedValues";a.style.display=o&&requestedPassFailDisplay(s)==="off"&&!s.functionalActive?"":"none",e.setActive(a,!!s.logScale)}return{btn:a,sync:i}}export function makeLegendStyleBtn(e,t,n){const a=e.makeDropdown("legend","Legend style",()=>[{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"}],()=>t().legendPosition??"default",s=>n(s));function i(){const s=t().plotMode;a.style.display=s==="hardBin"||s==="softBin"||s==="metadata"?"":"none"}return{btn:a,sync:i}}export function makeOverlaysBtn(e,t,n){return e.makeCheckMenuBtn("overlays","Overlays",()=>t(),a=>e.setActive(a,n()))}export function makeOrientationBtn(e,t,n){return e.makeCheckMenuBtn("orient","Orientation",()=>[{section:"Rotate"},{label:"Rotate 90\xB0 clockwise",active:!1,onClick:()=>{const a=t().rotation??0;n({rotation:ROTATIONS[(ROTATIONS.indexOf(a)+1)%4]})}},{section:"Flip"},{label:"Flip horizontal",active:!!t().flipX,onClick:()=>n({flipX:!t().flipX})},{label:"Flip vertical",active:!!t().flipY,onClick:()=>n({flipY:!t().flipY})}],a=>{const{rotation:i,flipX:s,flipY:l}=t();e.setActive(a,!!(i||s||l))})}let $=null;function se(e,t,n,a){const i=t,s=i.__wmapDemoApi;i.__wmapDemoApi=a;const l=e.createElement("div");return l.classList.add("wmap-guide-content"),l.innerHTML=n,{content:l,restoreApi:()=>{i.__wmapDemoApi===a&&(i.__wmapDemoApi=s)}}}function le(e,t){const n=t,a=e.querySelector("script");if(a){const i=e.ownerDocument.createElement("script");i.textContent=a.textContent,e.appendChild(i);const s=e.querySelector(".wmap-guide");return s&&n.__wmapPopulateGuideDemos?.(s),n.__wmapDestroyGuideDemos}}function Me(e,t,n,a){const{content:i,restoreApi:s}=se(document,window,t,n);Object.assign(i.style,{flex:"1",overflow:"auto",minHeight:"0",minWidth:"0"});let l;const o=openFloatingWindow({title:e,anchor:a,onMaximizeChange:d=>{i.querySelector(".wmap-guide")?.classList.toggle("wmap-guide--max",d)},onClose:()=>{$===o&&($=null),l?.(),s()}});return o.contentWrap.appendChild(i),l=le(i,window),o}function Le(e,t,n,a){const i=e.document;i.title=t,Object.assign(i.documentElement.style,{height:"100%"}),Object.assign(i.body.style,{margin:"0",height:"100vh",overflow:"hidden",display:"flex",flexDirection:"column",fontFamily:'system-ui, -apple-system, "Segoe UI", sans-serif'}),copyWmapThemeTokens(document.documentElement,i.documentElement);const s=syncWmapPopupTheme(document.documentElement,i.documentElement),{content:l,restoreApi:o}=se(i,e,n,a);Object.assign(l.style,{flex:"1",overflow:"auto",minHeight:"0",minWidth:"0"}),i.body.appendChild(l);const d=le(l,e);let h=!1;const c=()=>{if(!h){h=!0,clearInterval(p),s();try{d?.()}catch{}o(),$===r&&($=null)}},p=setInterval(()=>{e.closed&&c()},400);e.addEventListener("pagehide",c);const r={close:()=>{e.closed||e.close(),c()}};return r}export function openUserGuideWindow(e,t,n,a){$&&($.close(),$=null);const i=n?.title??"Wafer Map \u2014 User Guide",s=(n?.html??"")+t,l=window.open("","_blank","width=800,height=820");$=l?Le(l,i,s,e):Me(i,s,e,a)}
9
+ }`,t.head.appendChild(Z),reparentTooltip(i),n?(r.addEventListener("click",p=>{p.target===r&&C()}),t.addEventListener("keydown",k)):(i.addEventListener("keydown",k),i.addEventListener("mousedown",W),W()),nextFrame(()=>(c.isConnected?c:i).focus(),o),{backdrop:r,box:i,contentWrap:B,close:C,bringToFront:W}}export function openModal(e){return se({...e,mode:"modal"})}export function openFloatingWindow(e){return se({...e,mode:"window"})}const ne=new WeakSet;export function openReparentedModal(e,n={}){if(e.length===0||e.some(a=>ne.has(a)))return null;const t=e.map(a=>({el:a,parent:a.parentElement,next:a.nextSibling})),o=openModal({ownerDocument:n.ownerDocument,title:n.title,anchor:e[0],onClose:()=>{for(const a of t){if(ne.delete(a.el),!a.parent)continue;const r=a.next&&a.next.parentNode===a.parent?a.next:null;a.parent.insertBefore(a.el,r)}n.onClosed?.()}});for(const a of t)ne.add(a.el),o.contentWrap.appendChild(a.el);return o}export function makePaletteBtn(e,n,t,o,a,r){const d=()=>n()==="hardBin"||n()==="softBin",i=e.makeCheckMenuBtn("palette","Colour scheme",()=>{const x=d()?oe().filter(s=>s.name==="default"||s.name==="accessible"):oe(),f=t(),m=[];r&&m.push({section:"Scheme"}),o()&&m.push({label:"Custom",active:f==="custom",onClick:()=>a("custom")});for(const s of x)m.push({label:s.label,active:f===s.name,onClick:()=>a(s.name)});return r&&(m.push({section:"Encoding"}),m.push({label:"Mark failing dies",active:r.get(),enabled:d(),disabledHint:d()?void 0:"Available on hard/soft bin maps",onClick:()=>r.set(!r.get())})),m},()=>{});function l(){i.style.display=n()==="metadata"?"none":""}return{btn:i,sync:l}}export function requestedPassFailDisplay(e){return e.passFailDisplay??"off"}export function passFailMenuRows(e,n){if(e.functionalActive)return[];const t=[];return e.hasLimits&&t.push({label:"Spec pass/fail",active:e.display==="spec",onClick:()=>n(e.display==="spec"?"off":"spec")}),e.hasRecorded&&t.push({label:"Test pass/fail",active:e.display==="test",onClick:()=>n(e.display==="test"?"off":"test")}),t}export function makeLogScaleBtn(e,n,t){const o=e.makeBtn("logScale","Toggle log scale",()=>{t({logScale:!n().logScale})});function a(){const r=n(),d=r.plotMode,i=d==="value"||d==="stackedValues";o.style.display=i&&requestedPassFailDisplay(r)==="off"&&!r.functionalActive?"":"none",e.setActive(o,!!r.logScale)}return{btn:o,sync:a}}const Ae=[{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,n,t,o){const a=e.makeCheckMenuBtn("legend","Legend style",()=>{const d=n().legendPosition??"default",i=[];if(le(n().plotMode)){o&&i.push({section:"Position"});for(const l of Ae)i.push({label:l.label,active:d===l.value,onClick:()=>t(l.value)})}if(o){const l=o.blockedReason();i.push({section:"Per map"}),i.push({label:"Legend on each map",active:l?!0:o.get(),enabled:!l,disabledHint:l??void 0,onClick:()=>o.set(!o.get())})}return i},()=>{});function r(){a.style.display=o||le(n().plotMode)?"":"none"}return{btn:a,sync:r}}function le(e){return e==="hardBin"||e==="softBin"||e==="metadata"}export function makeOverlaysBtn(e,n,t){return e.makeCheckMenuBtn("overlays","Overlays",()=>n(),o=>e.setActive(o,t()))}export function makeOrientationBtn(e,n,t){return e.makeCheckMenuBtn("orient","Orientation",()=>[{section:"Rotate"},{label:"Rotate 90\xB0 clockwise",active:!1,onClick:()=>{const o=n().rotation??0;t({rotation:ROTATIONS[(ROTATIONS.indexOf(o)+1)%4]})}},{section:"Flip"},{label:"Flip horizontal",active:!!n().flipX,onClick:()=>t({flipX:!n().flipX})},{label:"Flip vertical",active:!!n().flipY,onClick:()=>t({flipY:!n().flipY})}],o=>{const{rotation:a,flipX:r,flipY:d}=n();e.setActive(o,!!(a||r||d))})}let P=null;function ce(e,n,t,o){const a=n,r=a.__wmapDemoApi;a.__wmapDemoApi=o;const d=e.createElement("div");return d.classList.add("wmap-guide-content"),d.innerHTML=t,{content:d,restoreApi:()=>{a.__wmapDemoApi===o&&(a.__wmapDemoApi=r)}}}function de(e,n){const t=n,o=e.querySelector("script");if(o){const a=e.ownerDocument.createElement("script");a.textContent=o.textContent,e.appendChild(a);const r=e.querySelector(".wmap-guide");return r&&t.__wmapPopulateGuideDemos?.(r),t.__wmapDestroyGuideDemos}}function Ce(e,n,t,o){const a=o?.ownerDocument??document,r=a.defaultView??window,{content:d,restoreApi:i}=ce(a,r,n,t);Object.assign(d.style,{flex:"1",overflow:"auto",minHeight:"0",minWidth:"0"});let l;const x=openFloatingWindow({title:e,anchor:o,ownerDocument:a,onMaximizeChange:f=>{d.querySelector(".wmap-guide")?.classList.toggle("wmap-guide--max",f)},onClose:()=>{P===x&&(P=null),l?.(),i()}});return x.contentWrap.appendChild(d),l=de(d,r),x}function Se(e,n,t,o){const a=e.document;a.title=n,Object.assign(a.documentElement.style,{height:"100%"}),Object.assign(a.body.style,{margin:"0",height:"100vh",overflow:"hidden",display:"flex",flexDirection:"column",fontFamily:'system-ui, -apple-system, "Segoe UI", sans-serif'}),copyWmapThemeTokens(document.documentElement,a.documentElement);const r=syncWmapPopupTheme(document.documentElement,a.documentElement),{content:d,restoreApi:i}=ce(a,e,t,o);Object.assign(d.style,{flex:"1",overflow:"auto",minHeight:"0",minWidth:"0"}),a.body.appendChild(d);const l=de(d,e);let x=!1;const f=()=>{if(!x){x=!0,clearInterval(m),r();try{l?.()}catch{}i(),P===s&&(P=null)}},m=setInterval(()=>{e.closed&&f()},400);e.addEventListener("pagehide",f);const s={close:()=>{e.closed||e.close(),f()}};return s}export function openUserGuideWindow(e,n,t,o){P&&(P.close(),P=null);const a=t?.title??"Wafer Map \u2014 User Guide",r=(t?.html??"")+n,i=(o?.ownerDocument.defaultView??window).open("","_blank","width=800,height=820");P=i?Se(i,a,r,e):Ce(a,r,e,o)}