@wafertools/wafermap 0.24.1 → 0.24.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/packages/canvas-adapter/charts/barPanel.d.ts +5 -0
  3. package/dist/packages/canvas-adapter/charts/barPanel.js +1 -1
  4. package/dist/packages/canvas-adapter/charts/binCluster.d.ts +5 -0
  5. package/dist/packages/canvas-adapter/charts/binCluster.js +1 -1
  6. package/dist/packages/canvas-adapter/charts/boxplot.d.ts +5 -0
  7. package/dist/packages/canvas-adapter/charts/boxplot.js +1 -1
  8. package/dist/packages/canvas-adapter/charts/capability.d.ts +5 -0
  9. package/dist/packages/canvas-adapter/charts/capability.js +1 -1
  10. package/dist/packages/canvas-adapter/charts/chartShell.d.ts +8 -5
  11. package/dist/packages/canvas-adapter/charts/chartShell.js +1 -1
  12. package/dist/packages/canvas-adapter/charts/correlation.d.ts +5 -0
  13. package/dist/packages/canvas-adapter/charts/correlation.js +1 -1
  14. package/dist/packages/canvas-adapter/charts/histogram.d.ts +5 -0
  15. package/dist/packages/canvas-adapter/charts/histogram.js +1 -1
  16. package/dist/packages/canvas-adapter/charts/regionYieldDiagram.d.ts +5 -0
  17. package/dist/packages/canvas-adapter/charts/regionYieldDiagram.js +1 -1
  18. package/dist/packages/canvas-adapter/charts/scatter.d.ts +5 -0
  19. package/dist/packages/canvas-adapter/charts/scatter.js +1 -1
  20. package/dist/packages/canvas-adapter/dieList.d.ts +9 -0
  21. package/dist/packages/canvas-adapter/dieList.js +6 -6
  22. package/dist/packages/canvas-adapter/insightsTab.d.ts +5 -0
  23. package/dist/packages/canvas-adapter/insightsTab.js +1 -1
  24. package/dist/packages/canvas-adapter/metadataBadge.d.ts +4 -0
  25. package/dist/packages/canvas-adapter/metadataBadge.js +1 -1
  26. package/dist/packages/canvas-adapter/renderWaferGallery.js +6 -6
  27. package/dist/packages/canvas-adapter/renderWaferMap.js +1 -1
  28. package/dist/packages/canvas-adapter/summaryPanel.d.ts +1 -1
  29. package/dist/packages/canvas-adapter/summaryPanel.js +3 -3
  30. package/dist/packages/canvas-adapter/toolbar.d.ts +4 -2
  31. package/dist/packages/canvas-adapter/toolbar.js +2 -2
  32. package/dist/packages/canvas-adapter/userGuideHtml.d.ts +1 -1
  33. package/dist/packages/canvas-adapter/userGuideHtml.js +1 -1
  34. package/dist/packages/canvas-adapter/version.d.ts +2 -2
  35. package/dist/packages/canvas-adapter/version.js +1 -1
  36. package/dist/packages/canvas-adapter/warnings.d.ts +1 -1
  37. package/dist/packages/canvas-adapter/warnings.js +1 -1
  38. package/package.json +5 -5
@@ -1,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 ue}from"../renderer/buildView.js";import{dieHasTestData as pe}from"../renderer/buildWaferMap.js";import{prettyKey as fe}from"../core/utils.js";import{listColorSchemes as oe}from"../renderer/colorSchemes.js";import{ICONS as $}from"./icons.js";import{WMAP_VERSION as me,WMAP_BUILD_TIME as be}from"./version.js";let ie=!1;export function logWmapVersionOnce(){ie||(ie=!0,console.log(`[wmap] v${me} (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","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_ABOVE2=`calc(var(--wmap-z, ${DEFAULT_OVERLAY_Z}) + 2)`;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),c=document.createElement("a");c.href=r,c.download=n,c.click(),URL.revokeObjectURL(r)}const he='[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 Oe(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 G(e,n,t){const o=()=>Array.from(e.querySelectorAll(he));e.addEventListener("keydown",r=>{const c=o();if(c.length===0)return;const i=e.ownerDocument.activeElement,d=i?c.indexOf(i):-1;switch(r.key){case"ArrowDown":r.preventDefault(),c[d<0||d===c.length-1?0:d+1].focus();break;case"ArrowUp":r.preventDefault(),c[d<=0?c.length-1:d-1].focus();break;case"Home":r.preventDefault(),c[0].focus();break;case"End":r.preventDefault(),c[c.length-1].focus();break;case"Enter":case" ":d>=0&&(r.preventDefault(),c[d].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 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 c=e.offsetWidth,i=e.offsetHeight,d=8;let b=t+14,m=o-8;b+c+d>r.innerWidth&&(b=t-c-6),m+i+d>r.innerHeight&&(m=r.innerHeight-i-d),m<d&&(m=d),e.style.left=`${b}px`,e.style.top=`${m}px`}export function buildDataModeEntries(e,n,t){const o=e.some(pe),a=e.some(m=>m.testValues!==void 0&&Object.keys(m.testValues).length>0),r=e.some(m=>m.hbin!=null),c=e.some(m=>m.sbin!=null),i=o?n?.length?n.map(m=>({plotMode:"value",activeTest:m.testNumber,label:m.unit?`${m.name} (${m.unit})`:m.name,logScale:m.logScale})):ue(e).map(m=>({plotMode:"value",activeTest:m,label:`Test ${m}`})):[],d=[...r?[{plotMode:"hardBin",label:MODE_LABELS.hardBin}]:[],...c?[{plotMode:"softBin",label:MODE_LABELS.softBin}]:[]],b=t.includeStacked?[...a?[{plotMode:"stackedValues",label:MODE_LABELS.stackedValues}]:[],...r?[{plotMode:"stackedBins",label:MODE_LABELS.stackedBins}]:[],...c?[{plotMode:"stackedSoftBins",label:MODE_LABELS.stackedSoftBins}]:[]]:[];return{testEntries:i,binEntries:d,stackedEntries:b}}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??fe(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,c,i,d=window,b=[]){const{makeMenuRow:m,makeMenuSection:h}=c,s=document.createElement("div"),l=180,x=e.left+l<=(d.innerWidth??1/0)?e.left:Math.max(4,e.right-l);if(Object.assign(s.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:`${l}px`,padding:"4px 0",pointerEvents:"auto"}),n.length)if(s.appendChild(h("Test Value")),n.length<=INLINE_TEST_LIMIT)for(const u of n)s.appendChild(m(u.label,a(u),!0,g=>{g.stopPropagation(),r(u,s)}));else{const u=i==="value",g=m(MODE_LABELS.value+" \u25B6",u,!1,()=>{});g.style.display="flex",g.style.justifyContent="space-between",g.style.alignItems="center";let f=null,y=null;const M=()=>{y!==null&&(clearTimeout(y),y=null)},S=()=>{M(),f?.remove(),f=null},L=()=>{M(),y=setTimeout(S,300)},U=()=>{if(f)return;const W=g.getBoundingClientRect(),A=160,k=320,I=W.right+2+A<=(d.innerWidth??1/0)?W.right+2:Math.max(4,W.left-2-A),B=Math.min(W.top-4,Math.max(4,(d.innerHeight??1/0)-k-4));if(f=document.createElement("div"),Object.assign(f.style,{position:"fixed",top:`${B}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:`${A}px`,maxHeight:`${k}px`,overflowY:"auto",padding:"4px 0",pointerEvents:"auto"}),n.length>MENU_SEARCH_THRESHOLD){const D=makeMenuSearchBox(F=>{for(const O of E)O.row.style.display=O.label.includes(F)?"":"none"},"Filter tests\u2026");Object.assign(D.style,{position:"sticky",top:"0",zIndex:"1",background:CLR.menuBg}),f.appendChild(D)}const E=[];for(const D of n){const F=m(D.label,a(D),!1,O=>{O.stopPropagation(),S(),r(D,s)});E.push({row:F,label:D.label.toLowerCase()}),f.appendChild(F)}f.addEventListener("mouseenter",M),f.addEventListener("mouseleave",L),(s.parentElement??d.document.body).appendChild(f),d.document.addEventListener("click",S,{once:!0})};g.addEventListener("mouseenter",()=>{M(),U()}),g.addEventListener("mouseleave",L),s.appendChild(g)}if(t.length){s.appendChild(h("Bins"));for(const u of t)s.appendChild(m(u.label,a(u),!1,g=>{g.stopPropagation(),r(u,s)}))}if(b.length){s.appendChild(h("Metadata"));for(const u of b)s.appendChild(m(u.label,a(u),!1,g=>{g.stopPropagation(),r(u,s)}))}if(o.length){s.appendChild(h("Lot Aggregation"));for(const u of o)s.appendChild(m(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){G(e,n,t)}export function wireExpandToggle(e,n){const t=e.ownerDocument;let o=!1;function a(b){o!==b&&(o=b,n(o))}function r(){a(!1)}function c(){a(!o),o&&t.addEventListener("click",r,{once:!0})}const i=b=>{b.stopPropagation(),c()},d=b=>{b.key==="Enter"||b.key===" "?(b.preventDefault(),c()):b.key==="Escape"&&r()};return e.setAttribute("role","button"),e.tabIndex<0&&(e.tabIndex=0),e.addEventListener("click",i),e.addEventListener("keydown",d),{isOpen:()=>o,close:r,destroy(){e.removeEventListener("click",i),e.removeEventListener("keydown",d),t.removeEventListener("click",r)}}}export function buildCheckMenuEl(e,n,t,o=window){const{makeMenuRow:a,makeMenuSection:r}=t,c=o.document,i=c.createElement("div"),d=168,m=e.left+d<=(o.innerWidth??1/0)?e.left:Math.max(4,e.right-d);Object.assign(i.style,{position:"fixed",top:`${e.bottom+4}px`,left:`${m}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:`${d}px`,padding:"4px 0",pointerEvents:"auto"});for(const h of n)if("section"in h)i.appendChild(r(h.section));else{if(!(h.enabled!==!1))continue;const l=c.createElement("div");l.setAttribute("role","menuitemcheckbox"),l.setAttribute("aria-checked",h.active?"true":"false"),l.tabIndex=-1,Object.assign(l.style,{display:"flex",alignItems:"center",gap:"6px",padding:"6px 14px",fontSize:"12px",cursor:"pointer",color:h.active?CLR.iconActive:CLR.text,fontWeight:h.active?"700":"400",background:h.active?CLR.menuActive:"transparent",whiteSpace:"nowrap",outline:"none"});const v=c.createElement("span");Object.assign(v.style,{width:"12px",flexShrink:"0",color:CLR.iconActive,visibility:h.active?"visible":"hidden"}),v.textContent="\u2713",v.setAttribute("aria-hidden","true");const x=c.createElement("span");x.textContent=h.label,l.appendChild(v),l.appendChild(x),l.addEventListener("mouseenter",()=>{h.active||(l.style.background=CLR.menuHover)}),l.addEventListener("mouseleave",()=>{l.style.background=h.active?CLR.menuActive:"transparent"}),l.addEventListener("focus",()=>{h.active||(l.style.background=CLR.menuHover)}),l.addEventListener("blur",()=>{l.style.background=h.active?CLR.menuActive:"transparent"}),l.addEventListener("click",u=>{u.stopPropagation(),h.onClick(u)}),i.appendChild(l)}return i}export function createToolbarHelpers(e){const n=e.ownerDocument;let t=null;const o=s=>overlayRootFor(s);function a(s,l,v){const x=n.createElement("button");return x.innerHTML=$[s],x.type="button",x.ariaLabel=l,Object.assign(x.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"}),x.addEventListener("mouseenter",u=>{x.dataset.active||(x.style.background=CLR.bgHover,x.style.color=CLR.iconHover),e.innerHTML=x.ariaLabel??l,e.style.display="block",positionTooltip(e,x,u.clientX,u.clientY)}),x.addEventListener("mousemove",u=>{e.style.display==="block"&&positionTooltip(e,x,u.clientX,u.clientY)}),x.addEventListener("mouseleave",()=>{x.dataset.active||(x.style.background="transparent",x.style.color=CLR.icon),e.style.display="none"}),x.addEventListener("click",()=>{e.style.display="none",v()}),x}function r(s,l){l?(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 c(){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,l,v,x){const u=n.createElement("div");return u.textContent=s,u.setAttribute("role","menuitemradio"),u.setAttribute("aria-checked",l?"true":"false"),u.tabIndex=-1,Object.assign(u.style,{padding:`6px 14px 6px ${v?"26px":"14px"}`,fontSize:"12px",cursor:"pointer",color:l?CLR.iconActive:CLR.text,fontWeight:l?"700":"400",background:l?CLR.menuActive:"transparent",whiteSpace:"nowrap",outline:"none"}),u.addEventListener("mouseenter",()=>{l||(u.style.background=CLR.menuHover)}),u.addEventListener("mouseleave",()=>{u.style.background=l?CLR.menuActive:"transparent"}),u.addEventListener("focus",()=>{l||(u.style.background=CLR.menuHover)}),u.addEventListener("blur",()=>{u.style.background=l?CLR.menuActive:"transparent"}),u.addEventListener("click",x),u}function d(s){const l=n.createElement("div");return l.textContent=s,l.setAttribute("role","presentation"),Object.assign(l.style,{padding:"5px 14px 2px",fontSize:"10px",fontWeight:"600",letterSpacing:"0.05em",color:CLR.label,textTransform:"uppercase",pointerEvents:"none",userSelect:"none"}),l}function b(s,l,v,x,u){const g=()=>{t&&(t.remove(),t=null),f.setAttribute("aria-expanded","false")},f=a(s,l,()=>{if(t){g();return}const y=n.createElement("div"),M=f.getBoundingClientRect(),S=f.ownerDocument.defaultView??window,L=148,W=M.left+L<=(S.innerWidth??1/0)?M.left:Math.max(4,M.right-L);Object.assign(y.style,{position:"fixed",top:`${M.bottom+4}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_BASE,minWidth:`${L}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===x();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 I=()=>{A.value!==x()&&(k.style.background=CLR.menuHover)},B=()=>{k.style.background=A.value===x()?CLR.menuActive:"transparent"};k.addEventListener("mouseenter",I),k.addEventListener("mouseleave",B),k.addEventListener("focus",I),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",l),o(f).appendChild(y),t=y,f.setAttribute("aria-expanded","true"),G(y,f,g)});return f.setAttribute("aria-haspopup","menu"),f.setAttribute("aria-expanded","false"),f}function m(s,l,v,x){function u(){return buildCheckMenuEl(f.getBoundingClientRect(),v().map(y=>"section"in y?y:{...y,onClick:M=>{y.onClick(M),x(f);const S=t;if(!S)return;const L=u();L.setAttribute("role","menu"),L.setAttribute("aria-label",l),S.replaceWith(L),t=L,G(L,f,g)}}),{makeMenuRow:i,makeMenuSection:d},f.ownerDocument.defaultView??window)}const g=()=>{t&&(t.remove(),t=null),f.setAttribute("aria-expanded","false")},f=a(s,l,()=>{if(t){g();return}const y=u();y.setAttribute("role","menu"),y.setAttribute("aria-label",l),o(f).appendChild(y),t=y,f.setAttribute("aria-expanded","true"),G(y,f,g)});return f.setAttribute("aria-haspopup","menu"),f.setAttribute("aria-expanded","false"),x(f),f}function h(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:c,makeMenuRow:i,makeMenuSection:d,makeDropdown:b,makeCheckMenuBtn:m,closeOpenMenu:h,getOpenMenu:()=>t,setOpenMenu:s=>{t=s}}}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,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 re(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 c=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(ae())}),!n){const p=ke();Object.assign(i.style,{position:"fixed",top:`${Math.round(o.innerHeight*.08)+p}px`,left:`${Math.round(o.innerWidth*.08)+p}px`})}const d=t.createElement("div");Object.assign(d.style,{display:"flex",alignItems:"center",gap:"6px",padding:"10px 14px",borderBottom:`1px solid ${CLR.menuBorder}`,flexShrink:"0"});const b={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"}),d.appendChild(p)}const m=t.createElement("div");m.style.flex="1",d.appendChild(m);let h=null;n||(h=t.createElement("button"),h.type="button",h.innerHTML=$.windowMinimize,h.title="Minimize",h.setAttribute("aria-label","Minimize"),Object.assign(h.style,b),h.addEventListener("click",()=>L(!f)),d.appendChild(h));const s=t.createElement("button");s.type="button",s.innerHTML=$.maximize,s.title="Maximize (F)",s.setAttribute("aria-label","Maximize"),Object.assign(s.style,b),s.addEventListener("click",()=>g(!v));const l=t.createElement("button");l.type="button",l.innerHTML=$.close,l.title="Close (Esc)",l.setAttribute("aria-label","Close"),Object.assign(l.style,b),l.addEventListener("click",C),d.appendChild(s),d.appendChild(l);let v=!1,x="",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||(x=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=x,i.style.left=u)),e.onMaximizeChange?.(v,i)}let f=!1,y="",M="";const S=220;function L(p){f=p,h.innerHTML=f?$.windowRestore:$.windowMinimize,h.title=f?"Restore":"Minimize",h.setAttribute("aria-label",f?"Restore":"Minimize"),E.style.display=f?"none":"block",f?(y=i.style.height,M=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=M||"min(90vw, 700px)",s.disabled=!1,s.style.opacity="1",s.style.cursor="pointer",B.style.display="flex")}function U(){const p=t.body.style.userSelect;return t.body.style.userSelect="none",()=>{t.body.style.userSelect=p}}n||(d.style.cursor="move",d.addEventListener("pointerdown",p=>{if(v||p.target.closest('button, [role="button"]'))return;p.preventDefault();const T=U(),z=p.clientX,R=p.clientY,H=i.offsetTop,_=i.offsetLeft,Z=o.innerHeight-d.offsetHeight,Q=o.innerWidth-40,X=40-i.offsetWidth;d.setPointerCapture(p.pointerId);const N=V=>{const J=Math.min(Math.max(H+(V.clientY-R),0),Z),de=Math.min(Math.max(_+(V.clientX-z),X),Q);i.style.top=`${J}px`,i.style.left=`${de}px`},P=V=>{T(),d.releasePointerCapture(V.pointerId),d.removeEventListener("pointermove",N),d.removeEventListener("pointerup",P)};d.addEventListener("pointermove",N),d.addEventListener("pointerup",P)}));const W='button,[href],input,select,textarea,[tabindex]:not([tabindex="-1"]),[role="menuitem"],[role="menuitemradio"],[role="menuitemcheckbox"]';function A(p){const T=Array.from(i.querySelectorAll(W)).filter(_=>_.offsetParent!==null||_===t.activeElement);if(T.length===0){p.preventDefault(),i.focus();return}const z=T[0],R=T[T.length-1],H=t.activeElement;p.shiftKey&&(H===z||!i.contains(H))?(p.preventDefault(),R.focus()):!p.shiftKey&&H===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")&&!f&&g(!v)};function C(){n?t.removeEventListener("keydown",k):i.removeEventListener("keydown",k),q.remove(),ce(),hideTooltip(t),reparentTooltip(t.body),r?r.remove():i.remove(),n&&(t.body.style.overflow=a),c?.focus?.(),e.onClose()}function I(){n||(i.style.zIndex=String(ae()))}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,F=240,O=20;function Y(p,T){const z=o.innerWidth-i.offsetLeft,R=o.innerHeight-i.offsetTop,H=Math.min(Math.max(i.offsetWidth+p,D),z),_=Math.min(Math.max(i.offsetHeight+T,F),R);i.style.width=`${H}px`,i.style.height=`${_}px`}E.addEventListener("keydown",p=>{if(!(v||f))switch(p.key){case"ArrowRight":p.preventDefault(),Y(O,0);break;case"ArrowLeft":p.preventDefault(),Y(-O,0);break;case"ArrowDown":p.preventDefault(),Y(0,O);break;case"ArrowUp":p.preventDefault(),Y(0,-O);break}}),E.addEventListener("pointerdown",p=>{if(v||f)return;p.preventDefault();const T=U(),z=p.clientX,R=p.clientY,H=i.offsetWidth,_=i.offsetHeight,Z=o.innerWidth-i.offsetLeft,Q=o.innerHeight-i.offsetTop;E.setPointerCapture(p.pointerId);const X=P=>{const V=Math.min(Math.max(H+(P.clientX-z),D),Z),J=Math.min(Math.max(_+(P.clientY-R),F),Q);i.style.width=`${V}px`,i.style.height=`${J}px`},N=P=>{T(),E.releasePointerCapture(P.pointerId),E.removeEventListener("pointermove",X),E.removeEventListener("pointerup",N)};E.addEventListener("pointermove",X),E.addEventListener("pointerup",N)}),i.appendChild(d),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 ce=Ee(t,K),q=t.createElement("style");return q.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"});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"}),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(q),reparentTooltip(i),n?(r.addEventListener("click",p=>{p.target===r&&C()}),t.addEventListener("keydown",k)):(i.addEventListener("keydown",k),i.addEventListener("mousedown",I),I()),nextFrame(()=>(l.isConnected?l:i).focus(),o),{backdrop:r,box:i,contentWrap:B,close:C,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,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){const r=e.makeDropdown("palette","Colour scheme",()=>{const d=n()==="hardBin"||n()==="softBin"?oe().filter(b=>b.name==="default"||b.name==="accessible"):oe();return[...o()?[{value:"custom",label:"Custom"}]:[],...d.map(b=>({value:b.name,label:b.label}))]},()=>t(),i=>a(i));function c(){r.style.display=n()==="metadata"?"none":""}return{btn:r,sync:c}}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(),c=r.plotMode,i=c==="value"||c==="stackedValues";o.style.display=i&&requestedPassFailDisplay(r)==="off"&&!r.functionalActive?"":"none",e.setActive(o,!!r.logScale)}return{btn:o,sync:a}}export function makeLegendStyleBtn(e,n,t){const o=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"}],()=>n().legendPosition??"default",r=>t(r));function a(){const r=n().plotMode;o.style.display=r==="hardBin"||r==="softBin"||r==="metadata"?"":"none"}return{btn:o,sync:a}}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:c}=n();e.setActive(o,!!(a||r||c))})}let j=null;function se(e,n,t,o){const a=n,r=a.__wmapDemoApi;a.__wmapDemoApi=o;const c=e.createElement("div");return c.classList.add("wmap-guide-content"),c.innerHTML=t,{content:c,restoreApi:()=>{a.__wmapDemoApi===o&&(a.__wmapDemoApi=r)}}}function le(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 Me(e,n,t,o){const a=o?.ownerDocument??document,r=a.defaultView??window,{content:c,restoreApi:i}=se(a,r,n,t);Object.assign(c.style,{flex:"1",overflow:"auto",minHeight:"0",minWidth:"0"});let d;const b=openFloatingWindow({title:e,anchor:o,ownerDocument:a,onMaximizeChange:m=>{c.querySelector(".wmap-guide")?.classList.toggle("wmap-guide--max",m)},onClose:()=>{j===b&&(j=null),d?.(),i()}});return b.contentWrap.appendChild(c),d=le(c,r),b}function Le(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:c,restoreApi:i}=se(a,e,t,o);Object.assign(c.style,{flex:"1",overflow:"auto",minHeight:"0",minWidth:"0"}),a.body.appendChild(c);const d=le(c,e);let b=!1;const m=()=>{if(!b){b=!0,clearInterval(h),r();try{d?.()}catch{}i(),j===s&&(j=null)}},h=setInterval(()=>{e.closed&&m()},400);e.addEventListener("pagehide",m);const s={close:()=>{e.closed||e.close(),m()}};return s}export function openUserGuideWindow(e,n,t,o){j&&(j.close(),j=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");j=i?Le(i,a,r,e):Me(a,r,e,o)}