@wafertools/wafermap 0.30.2 → 0.30.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.
- package/AGENTS.md +16 -5
- package/CHANGELOG.md +384 -0
- package/README.md +6 -3
- package/dist/packages/canvas-adapter/chartPopulation.d.ts +48 -0
- package/dist/packages/canvas-adapter/chartPopulation.js +1 -0
- package/dist/packages/canvas-adapter/charts/barPanel.d.ts +4 -1
- package/dist/packages/canvas-adapter/charts/barPanel.js +1 -1
- package/dist/packages/canvas-adapter/charts/boxplot.d.ts +4 -1
- package/dist/packages/canvas-adapter/charts/boxplot.js +1 -1
- package/dist/packages/canvas-adapter/charts/capability.js +1 -1
- package/dist/packages/canvas-adapter/charts/chartShell.d.ts +81 -7
- package/dist/packages/canvas-adapter/charts/chartShell.js +1 -1
- package/dist/packages/canvas-adapter/charts/correlation.js +2 -2
- package/dist/packages/canvas-adapter/charts/groupedBarPlot.js +1 -1
- package/dist/packages/canvas-adapter/charts/histogram.js +1 -1
- package/dist/packages/canvas-adapter/charts/regionYieldDiagram.js +1 -1
- package/dist/packages/canvas-adapter/charts/scatter.js +1 -1
- package/dist/packages/canvas-adapter/charts/sweep.d.ts +31 -0
- package/dist/packages/canvas-adapter/charts/sweep.js +1 -0
- package/dist/packages/canvas-adapter/charts/trend.d.ts +3 -1
- package/dist/packages/canvas-adapter/charts/trend.js +1 -1
- package/dist/packages/canvas-adapter/dieList.js +2 -2
- package/dist/packages/canvas-adapter/drilldown.d.ts +23 -0
- package/dist/packages/canvas-adapter/drilldown.js +1 -0
- package/dist/packages/canvas-adapter/icons.js +1 -1
- package/dist/packages/canvas-adapter/insightsTab.d.ts +55 -3
- package/dist/packages/canvas-adapter/insightsTab.js +1 -1
- package/dist/packages/canvas-adapter/renderWaferGallery.js +1 -1
- package/dist/packages/canvas-adapter/renderWaferMap.js +1 -1
- package/dist/packages/canvas-adapter/summaryPanel.js +3 -3
- package/dist/packages/canvas-adapter/toCanvas.js +1 -1
- package/dist/packages/canvas-adapter/toolbar.d.ts +30 -2
- package/dist/packages/canvas-adapter/toolbar.js +2 -2
- package/dist/packages/canvas-adapter/userGuideHtml.d.ts +1 -1
- package/dist/packages/canvas-adapter/userGuideHtml.js +126 -3
- package/dist/packages/canvas-adapter/version.d.ts +2 -2
- package/dist/packages/canvas-adapter/version.js +1 -1
- package/dist/packages/canvas-adapter/warnings.js +1 -1
- package/dist/packages/renderer/axisTicks.d.ts +32 -0
- package/dist/packages/renderer/axisTicks.js +1 -0
- package/dist/packages/renderer/buildView.d.ts +11 -37
- package/dist/packages/renderer/buildView.js +1 -1
- package/dist/packages/renderer/buildWaferMap.d.ts +58 -1
- package/dist/packages/renderer/buildWaferMap.js +1 -1
- package/dist/packages/renderer/deprecate.d.ts +13 -5
- package/dist/packages/renderer/deprecate.js +1 -1
- package/dist/packages/renderer/derivedTests/apply.d.ts +85 -0
- package/dist/packages/renderer/derivedTests/apply.js +1 -0
- package/dist/packages/renderer/derivedTests/evaluate.d.ts +48 -0
- package/dist/packages/renderer/derivedTests/evaluate.js +1 -0
- package/dist/packages/renderer/derivedTests/parser.d.ts +148 -0
- package/dist/packages/renderer/derivedTests/parser.js +2 -0
- package/dist/packages/renderer/fmt.d.ts +24 -2
- package/dist/packages/renderer/fmt.js +1 -1
- package/dist/packages/renderer/index.d.ts +1 -0
- package/dist/packages/renderer/index.js +1 -1
- package/dist/packages/renderer/spec.d.ts +49 -0
- package/dist/packages/renderer/spec.js +1 -0
- package/dist/packages/renderer/testLabel.d.ts +154 -0
- package/dist/packages/renderer/testLabel.js +1 -0
- package/dist/packages/stats/analyzeWaferMap.js +1 -1
- package/dist/packages/stats/capability.d.ts +4 -0
- package/dist/packages/stats/capability.js +1 -1
- package/dist/packages/stats/correlation.d.ts +3 -0
- package/dist/packages/stats/correlation.js +1 -1
- package/dist/packages/stats/deprecated.d.ts +3 -0
- package/dist/packages/stats/deprecated.js +1 -1
- package/dist/packages/stats/index.d.ts +2 -2
- package/dist/packages/stats/index.js +1 -1
- package/dist/packages/stats/mergeTestDefs.js +1 -1
- package/dist/packages/stats/renderFindingsReport.js +8 -28
- package/dist/packages/stats/renderSummaryReport.js +21 -30
- package/dist/packages/stats/reportHtml.d.ts +27 -0
- package/dist/packages/stats/reportHtml.js +35 -14
- package/dist/packages/stats/sweep.d.ts +178 -0
- package/dist/packages/stats/sweep.js +1 -0
- package/dist/packages/stats/sweepXFromName.d.ts +27 -0
- package/dist/packages/stats/sweepXFromName.js +1 -0
- package/dist/packages/stats/testPassRate.js +1 -1
- package/dist/packages/stats/types.d.ts +28 -1
- package/llms.txt +3 -2
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{getUniqueTestNumbers as ve}from"../renderer/buildView.js";import{dieHasTestData as ge}from"../renderer/buildWaferMap.js";import{prettyKey as ye}from"../core/utils.js";import{listBinColorSchemes as we,listValueColorSchemes as ke}from"../renderer/colorSchemes.js";import{ICONS as $}from"./icons.js";import{WMAP_VERSION as Ee,WMAP_BUILD_TIME as Ce}from"./version.js";import{openHtmlReport as Le}from"../stats/renderFindingsReport.js";import{buildWaferMap as Ae}from"../renderer/buildWaferMap.js";import{analyzeWaferMap as Me}from"../stats/analyzeWaferMap.js";let le=!1;export function logWmapVersionOnce(){le||(le=!0,console.log(`[wmap] v${Ee} (built ${Ce})`))}export const WMAP_TOKEN_NAMES=["z","icon","icon-hover","icon-active","bg-hover","bg-active","separator","surface","border","control-border","menu-hover","menu-active","font-family","font-size","density","panel-bg","text-muted","text","text-strong","warn-bg","warn-border","warn-text","err-bg","err-border","err-text","info-bg","info-text","selected","finding-indicator","canvas-bg","bar-fill"];const E=(e,n)=>`var(--wmap-${e}, ${n})`,q="var(--wmap-font-size, 12px)",Se="var(--wmap-density, 1)",N=e=>`calc(${e}px * ${Se})`;export function wireControlHover(e,n="outlined"){let t=null;const o=()=>{t&&(e.style.background=t.background,e.style.color=t.color)};e.addEventListener("mouseenter",()=>{e.dataset.on==="true"||e.disabled||(t||(t={background:e.style.background,color:e.style.color}),e.style.background=CLR.bgHover,e.style.color=CLR.iconHover)}),e.addEventListener("mouseleave",o),e.addEventListener("blur",o)}export function controlStyle(e,n=!1){const t={fontSize:FONT.body,cursor:"pointer",borderRadius:RADIUS.control};return e==="bare"?{...t,border:"none",background:"none",padding:"0",color:CLR.icon}:{...t,border:`1px solid ${CLR.controlBorder}`,background:e==="toggle"&&n?CLR.menuActive:"none",color:e==="toggle"&&n?CLR.iconActive:CLR.text,padding:`${SPACE.xxs} ${SPACE.lg}`}}export const SPACE={xxs:N(2),xs:N(4),sm:N(6),md:N(8),lg:N(10),xl:N(12),xxl:N(16),xxxl:N(24)},SHADOW={panel:"0 1px 4px rgba(0,0,0,0.10)",menu:"0 4px 12px rgba(0,0,0,0.15)",modal:"0 20px 60px rgba(0,0,0,0.40)"},MOTION={fast:"0.12s ease",base:"0.2s ease"},LEADING={none:"1",tight:"1.2",base:"1.45"},ALPHA={muted:"0.85",disabled:"0.4"},TRACKING="0.05em",EDGE_GUTTER=SPACE.xl,MAP_CHROME_INSET=SPACE.xs,RADIUS={control:"4px",container:"6px",pill:"999px"},FONT={family:"var(--wmap-font-family, inherit)",meta:`calc(${q} - 1px)`,body:q,sub:`calc(${q} + 1px)`,heading:`calc(${q} + 3px)`,stat:`calc(${q} + 8px)`};export function fontPx(e=0,n){const t=n?.ownerDocument??(typeof document<"u"?document:null);if(!t)return 12+e;const o=getComputedStyle(n??t.documentElement).getPropertyValue("--wmap-font-size").trim(),r=o?parseFloat(o):NaN;return(Number.isFinite(r)?r:12)+e}export const CLR={icon:E("icon","#506784"),iconHover:E("icon-hover","#2a3f5f"),iconActive:E("icon-active","#1a65ca"),bgHover:E("bg-hover","#edf0f8"),bgActive:E("bg-active","#dce8f8"),separator:E("separator","rgba(0,0,0,0.12)"),menuBg:E("surface","#fff"),menuBorder:E("border","rgba(0,0,0,0.12)"),controlBorder:E("control-border",E("border","rgba(0,0,0,0.30)")),menuHover:E("menu-hover","#f0f4fc"),menuActive:E("menu-active","#dce8f8"),canvasBg:`var(--wmap-canvas-bg, ${E("surface","#f5f5f5")})`,panelBg:E("panel-bg","#fafbfc"),label:E("text-muted","#647687"),value:E("text-strong","#1f2f43"),text:E("text","#333"),warnBg:E("warn-bg","#fffbe6"),warnBorder:E("warn-border","#f0c040"),warnText:E("warn-text","#7a5800"),errBg:E("err-bg","#fef2f2"),errBorder:E("err-border","#dc8a8a"),errText:E("err-text","#7a1c1c"),infoBg:E("info-bg","#dce8f8"),infoText:E("info-text","#334155"),findingHighlight:E("selected","#e07a20"),findingIndicator:E("finding-indicator","#b7551a"),barFill:E("bar-fill","#2a6fc0")};export function sevColor(e){return e==="unusual"?"#a84112":e==="notable"?"#8a6500":CLR.icon}export const ROTATIONS=[0,90,180,270],INLINE_TEST_LIMIT=6,MENU_SEARCH_THRESHOLD=8,DEFAULT_OVERLAY_Z=6e3,Z_BASE=`var(--wmap-z, ${DEFAULT_OVERLAY_Z})`,Z_ABOVE=`calc(var(--wmap-z, ${DEFAULT_OVERLAY_Z}) + 1)`,Z_MENU=`calc(var(--wmap-z, ${DEFAULT_OVERLAY_Z}) + 2)`,Z_ABOVE2=`calc(var(--wmap-z, ${DEFAULT_OVERLAY_Z}) + 3)`;export function applyOverlayZ(e){if(e==null)return()=>{};const 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 r=t.getPropertyValue(`--wmap-${o}`).trim();r&&n.style.setProperty(`--wmap-${o}`,r)}}export function syncWmapPopupTheme(e,n,t){const o=()=>{copyWmapThemeTokens(e,n),t?.()},r=new window.MutationObserver(o);r.observe(e,{attributes:!0,attributeFilter:["style","class"]}),r.observe(document.documentElement,{attributes:!0,attributeFilter:["style","class"]});const l=window.matchMedia("(prefers-color-scheme: dark)");return l.addEventListener("change",o),()=>{r.disconnect(),l.removeEventListener("change",o)}}let re=null;export function setDetachWindowOpener(e){re=e}export function openDetachWindow(e){return re?re(e):window.open("","_blank","width=560,height=600")}export const MODE_LABELS={value:"Test Value",hardBin:"Hard Bin",softBin:"Soft Bin",stackedValues:"Stacked Test Values",stackedBins:"Stacked Hard Bins",stackedSoftBins:"Stacked Soft Bins",metadata:"Metadata"},BIN_LEGEND_MODES=new Set(["hardBin","softBin","metadata"]),STACKED_MODES=new Set(["stackedValues","stackedBins","stackedSoftBins"]);export function saveImageBlob(e,n,t){const o=`${n}.png`;if(t){t(e,o);return}downloadBlob(e,o)}export function downloadBlob(e,n){const t=URL.createObjectURL(e),o=document.createElement("a");o.href=t,o.download=n,o.click(),URL.revokeObjectURL(t)}export function saveTextFile(e,n,t,o){if(o){o(e,n,t);return}downloadBlob(new Blob([e],{type:t}),n)}const Be='[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)}export function wireListNavigation(e,n,t){e.addEventListener("keydown",o=>{const r=n();if(r.length===0)return;const l=e.ownerDocument.activeElement,u=l?r.indexOf(l):-1;switch(o.key){case"ArrowDown":o.preventDefault(),r[u<0||u===r.length-1?0:u+1].focus();break;case"ArrowUp":o.preventDefault(),r[u<=0?r.length-1:u-1].focus();break;case"Home":o.preventDefault(),r[0].focus();break;case"End":o.preventDefault(),r[r.length-1].focus();break;case"Enter":case" ":u>=0&&(o.preventDefault(),r[u].click());break;case"Escape":case"Tab":o.preventDefault(),t();break}})}function J(e,n,t){const o=()=>Array.from(e.querySelectorAll(Be));wireListNavigation(e,o,()=>{t(),n?.focus()});const r=o()[0];r&&nextFrame(()=>r.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 ce=new WeakMap;export function menuLayerFor(e){const n=overlayRootFor(e),t=ce.get(n);if(t&&t.isConnected)return t;const r=e.ownerDocument.createElement("div");return r.dataset.wmapMenuLayer="1",Object.assign(r.style,{position:"fixed",inset:"0",zIndex:Z_MENU,pointerEvents:"none"}),n.appendChild(r),ce.set(n,r),r}const ae=new WeakMap;export function getTooltip(e=document){const n=ae.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:RADIUS.control,fontSize:FONT.sub,lineHeight:LEADING.base,maxWidth:"280px",maxHeight:"min(60vh, 480px)",overflow:"hidden",whiteSpace:"pre-wrap",zIndex:Z_ABOVE,display:"none",fontFamily:FONT.family,boxShadow:SHADOW.menu}),ae.set(e,t)),e.body.appendChild(t),t}export function hideTooltip(e=document){const n=ae.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 r=overlayRootFor(n);e.parentElement!==r&&r.appendChild(e);const l=e.ownerDocument.defaultView??window;e.style.left="0",e.style.top="0";const u=e.offsetWidth,i=e.offsetHeight,f=8,m=l.innerWidth,s=l.innerHeight;let y=t+14,a=o-8;y+u+f>m&&(y=t-u-6);const p=n.getBoundingClientRect();if(p.height>0&&p.height<=s*.4&&a<p.bottom&&a+i>p.top&&y<p.right&&y+u>p.left){const c=p.bottom+f,b=p.top-i-f;c+i+f<=s?a=c:b>=f&&(a=b)}a+i+f>s&&(a=s-i-f),a<f&&(a=f),e.style.left=`${y}px`,e.style.top=`${a}px`}export function wireTooltip(e,n,t={}){const o=()=>(typeof n=="function"?n():n)??e.getAttribute("aria-label")??"";t.asDataPoint&&(e.tabIndex=0,e.setAttribute("role","img"),typeof n=="string"&&e.setAttribute("aria-label",n));const r=u=>{const i=o();if(!i)return;const f=getTooltip(e.ownerDocument);if(f.textContent=i,f.style.display="block",u)positionTooltip(f,e,u.clientX,u.clientY);else{const m=e.getBoundingClientRect();positionTooltip(f,e,m.left+m.width/2,m.top)}},l=()=>hideTooltip(e.ownerDocument);e.addEventListener("mousemove",r),e.addEventListener("mouseleave",l),e.addEventListener("focus",()=>r()),e.addEventListener("blur",l)}export function buildDataModeEntries(e,n,t){const o=e.some(ge),r=e.some(s=>s.testValues!==void 0&&Object.keys(s.testValues).length>0),l=e.some(s=>s.hbin!=null),u=e.some(s=>s.sbin!=null),i=o?n!==void 0?n.map(s=>({plotMode:"value",activeTest:s.testNumber,label:s.unit?`${s.name} (${s.unit})`:s.name,logScale:s.logScale})):ve(e).map(s=>({plotMode:"value",activeTest:s,label:`Test ${s}`})):[],f=[...l?[{plotMode:"hardBin",label:MODE_LABELS.hardBin}]:[],...u?[{plotMode:"softBin",label:MODE_LABELS.softBin}]:[]],m=t.includeStacked?[...r?[{plotMode:"stackedValues",label:MODE_LABELS.stackedValues}]:[],...l?[{plotMode:"stackedBins",label:MODE_LABELS.stackedBins}]:[],...u?[{plotMode:"stackedSoftBins",label:MODE_LABELS.stackedSoftBins}]:[]]:[];return{testEntries:i,binEntries:f,stackedEntries:m}}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??ye(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:`${SPACE.xs} ${SPACE.md}`,fontSize:FONT.body,boxSizing:"border-box",background:CLR.menuBg,color:CLR.text,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,outline:"none"}),o.addEventListener("click",r=>r.stopPropagation()),o.addEventListener("mousedown",r=>r.stopPropagation()),o.addEventListener("keydown",r=>r.stopPropagation()),o.addEventListener("input",()=>e(o.value.trim().toLowerCase())),o.addEventListener("focus",()=>{o.style.borderColor=CLR.iconActive}),o.addEventListener("blur",()=>{o.style.borderColor=CLR.menuBorder}),queueMicrotask(()=>o.focus()),o}export function buildModeMenuEl(e,n,t,o,r,l,u,i,f=window,m=[]){const{makeMenuRow:s,makeMenuSection:y}=u,a=document.createElement("div"),p=180,d=e.left+p<=(f.innerWidth??1/0)?e.left:Math.max(4,e.right-p);if(Object.assign(a.style,{position:"fixed",top:`${e.bottom+4}px`,left:`${d}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,boxShadow:SHADOW.menu,zIndex:Z_BASE,minWidth:`${p}px`,padding:"4px 0",pointerEvents:"auto"}),n.length)if(a.appendChild(y("Test Value")),n.length<=INLINE_TEST_LIMIT)for(const c of n)a.appendChild(s(c.label,r(c),!0,b=>{b.stopPropagation(),l(c,a)}));else{const c=i==="value",b=s(MODE_LABELS.value+" \u25B6",c,!1,g=>{g.stopPropagation(),A(),M(),g.detail===0&&T()});b.setAttribute("aria-haspopup","menu"),b.style.display="flex",b.style.justifyContent="space-between",b.style.alignItems="center";let v=null,w=null;const A=()=>{w!==null&&(clearTimeout(w),w=null)},C=g=>{const S=g.target;S&&(b.contains(S)||v?.contains(S))||L()},L=()=>{A(),v?.remove(),v=null,f.document.removeEventListener("click",C),b.setAttribute("aria-expanded","false")},T=()=>{const g=v?.querySelector('input, [role="menuitemradio"]');g&&nextFrame(()=>g.focus(),f)},B=()=>{A(),w=setTimeout(L,300)},M=()=>{if(v)return;const g=b.getBoundingClientRect(),S=160,F=320,H=g.right+2+S<=(f.innerWidth??1/0)?g.right+2:Math.max(4,g.left-2-S),X=Math.min(g.top-4,Math.max(4,(f.innerHeight??1/0)-F-4));if(v=document.createElement("div"),v.setAttribute("data-wmap-submenu",""),v.setAttribute("role","menu"),Object.assign(v.style,{position:"fixed",top:`${X}px`,left:`${H}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,boxShadow:SHADOW.menu,zIndex:Z_ABOVE,minWidth:`${S}px`,maxHeight:`${F}px`,overflowY:"auto",padding:"4px 0",pointerEvents:"auto"}),n.length>MENU_SEARCH_THRESHOLD){const k=makeMenuSearchBox(j=>{for(const V of I)V.row.style.display=V.label.includes(j)?"":"none"},"Filter tests\u2026");Object.assign(k.style,{position:"sticky",top:"0",zIndex:"1",background:CLR.menuBg}),v.appendChild(k)}const I=[];for(const k of n){const j=s(k.label,r(k),!1,V=>{V.stopPropagation(),L(),l(k,a)});I.push({row:j,label:k.label.toLowerCase()}),v.appendChild(j)}v.addEventListener("mouseenter",A),v.addEventListener("mouseleave",B),wireListNavigation(v,()=>I.filter(k=>k.row.style.display!=="none").map(k=>k.row),()=>{L(),b.focus()}),(a.parentElement??f.document.body).appendChild(v),f.document.addEventListener("click",C),b.setAttribute("aria-expanded","true")};a.addEventListener("keydown",g=>{g.key==="Escape"&&L()}),b.addEventListener("mouseenter",()=>{A(),M()}),b.addEventListener("mouseleave",B),a.appendChild(b)}if(t.length){a.appendChild(y("Bins"));for(const c of t)a.appendChild(s(c.label,r(c),!1,b=>{b.stopPropagation(),l(c,a)}))}if(m.length){a.appendChild(y("Metadata"));for(const c of m)a.appendChild(s(c.label,r(c),!1,b=>{b.stopPropagation(),l(c,a)}))}if(o.length){a.appendChild(y("Lot Aggregation"));for(const c of o)a.appendChild(s(c.label,r(c),!1,b=>{b.stopPropagation(),l(c,a)}))}return a.setAttribute("role","menu"),a.setAttribute("aria-label","Plot mode"),a}export function markMenuTrigger(e,n){e.setAttribute("aria-haspopup","menu"),e.setAttribute("aria-expanded",n?"true":"false")}export function wireMenuA11y(e,n,t){J(e,n,t)}export function wireExpandToggle(e,n){const t=e.ownerDocument;let o=!1;function r(m){o!==m&&(o=m,n(o))}function l(){r(!1)}function u(){r(!o),o&&t.addEventListener("click",l,{once:!0})}const i=m=>{m.stopPropagation(),u()},f=m=>{m.key==="Enter"||m.key===" "?(m.preventDefault(),u()):m.key==="Escape"&&l()};return e.setAttribute("role","button"),e.tabIndex<0&&(e.tabIndex=0),e.addEventListener("click",i),e.addEventListener("keydown",f),{isOpen:()=>o,close:l,destroy(){e.removeEventListener("click",i),e.removeEventListener("keydown",f),t.removeEventListener("click",l)}}}export function buildCheckMenuEl(e,n,t,o=window){const{makeMenuSection:r}=t,l=o.document,u=l.createElement("div"),i=168,m=e.left+i<=(o.innerWidth??1/0)?e.left:Math.max(4,e.right-i);Object.assign(u.style,{position:"fixed",top:`${e.bottom+4}px`,left:`${m}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,boxShadow:SHADOW.menu,zIndex:Z_BASE,minWidth:`${i}px`,padding:"4px 0",pointerEvents:"auto"});for(const s of n)if("section"in s)u.appendChild(r(s.section));else{const y=s.enabled!==!1;if(!y&&!s.disabledHint)continue;const a=l.createElement("div");s.action?a.setAttribute("role","menuitem"):(a.setAttribute("role","menuitemcheckbox"),a.setAttribute("aria-checked",s.active?"true":"false")),a.tabIndex=-1,y||(a.setAttribute("aria-disabled","true"),wireTooltip(a,s.disabledHint)),Object.assign(a.style,{display:"flex",alignItems:"center",gap:SPACE.sm,padding:"6px 14px",fontSize:FONT.body,cursor:y?"pointer":"default",color:y?s.active?CLR.iconActive:CLR.text:CLR.label,fontWeight:s.active?"700":"400",background:s.active?CLR.menuActive:"transparent",whiteSpace:"nowrap"});const p=l.createElement("span");Object.assign(p.style,{width:"12px",flexShrink:"0",color:CLR.iconActive,visibility:s.active?"visible":"hidden"}),p.textContent=s.action?"":"\u2713",p.setAttribute("aria-hidden","true");const x=l.createElement("span");x.textContent=s.label,a.appendChild(p),a.appendChild(x),y?(a.addEventListener("mouseenter",()=>{s.active||(a.style.background=CLR.menuHover)}),a.addEventListener("mouseleave",()=>{a.style.background=s.active?CLR.menuActive:"transparent"}),a.addEventListener("focus",()=>{s.active||(a.style.background=CLR.menuHover)}),a.addEventListener("blur",()=>{a.style.background=s.active?CLR.menuActive:"transparent"}),a.addEventListener("click",d=>{d.stopPropagation(),s.onClick(d)})):a.addEventListener("click",d=>{d.stopPropagation()}),u.appendChild(a)}return u}export function createToolbarHelpers(e){const n=e.ownerDocument;let t=null;const o=a=>menuLayerFor(a);function r(a,p,x){const d=n.createElement("button");return d.innerHTML=$[a],d.type="button",d.ariaLabel=p,Object.assign(d.style,{display:"flex",alignItems:"center",justifyContent:"center",width:"28px",height:"28px",padding:"0",border:"none",borderRadius:RADIUS.control,background:"transparent",color:CLR.icon,cursor:"pointer",pointerEvents:"auto",transition:`background ${MOTION.fast}, color ${MOTION.fast}`,flexShrink:"0"}),d.addEventListener("mouseenter",c=>{d.dataset.active||(d.style.background=CLR.bgHover,d.style.color=CLR.iconHover),e.textContent=d.ariaLabel??p,e.style.display="block",positionTooltip(e,d,c.clientX,c.clientY)}),d.addEventListener("mousemove",c=>{e.style.display==="block"&&positionTooltip(e,d,c.clientX,c.clientY)}),d.addEventListener("mouseleave",()=>{d.dataset.active||(d.style.background="transparent",d.style.color=CLR.icon),e.style.display="none"}),d.addEventListener("click",()=>{e.style.display="none",x()}),d}function l(a,p){p?(a.dataset.active="1",a.style.background=CLR.bgActive,a.style.color=CLR.iconActive):(delete a.dataset.active,a.style.background="transparent",a.style.color=CLR.icon)}function u(){const a=n.createElement("div");return Object.assign(a.style,{width:"1px",height:"18px",background:CLR.separator,margin:"0 2px",flexShrink:"0"}),a}function i(a,p,x,d){const c=n.createElement("div");return c.textContent=a,c.setAttribute("role","menuitemradio"),c.setAttribute("aria-checked",p?"true":"false"),c.tabIndex=-1,Object.assign(c.style,{padding:`6px 14px 6px ${x?"26px":"14px"}`,fontSize:FONT.body,cursor:"pointer",color:p?CLR.iconActive:CLR.text,fontWeight:p?"700":"400",background:p?CLR.menuActive:"transparent",whiteSpace:"nowrap"}),c.addEventListener("mouseenter",()=>{p||(c.style.background=CLR.menuHover)}),c.addEventListener("mouseleave",()=>{c.style.background=p?CLR.menuActive:"transparent"}),c.addEventListener("focus",()=>{p||(c.style.background=CLR.menuHover)}),c.addEventListener("blur",()=>{c.style.background=p?CLR.menuActive:"transparent"}),c.addEventListener("click",d),c}function f(a){const p=n.createElement("div");return p.textContent=a,p.setAttribute("role","presentation"),Object.assign(p.style,{padding:"5px 14px 2px",fontSize:FONT.body,fontWeight:"600",letterSpacing:TRACKING,color:CLR.label,textTransform:"uppercase",pointerEvents:"none",userSelect:"none"}),p}function m(a,p,x,d,c){const b=()=>{t&&(t.remove(),t=null),v.setAttribute("aria-expanded","false")},v=r(a,p,()=>{if(t){b();return}const w=n.createElement("div"),A=v.getBoundingClientRect(),C=v.ownerDocument.defaultView??window,L=148,B=A.left+L<=(C.innerWidth??1/0)?A.left:Math.max(4,A.right-L);Object.assign(w.style,{position:"fixed",top:`${A.bottom+4}px`,left:`${B}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,boxShadow:SHADOW.menu,zIndex:Z_BASE,minWidth:`${L}px`,padding:"4px 0",pointerEvents:"auto"});for(const M of x()){const g=n.createElement("div");g.textContent=M.label,g.dataset.wmapDropdownValue=M.value;const S=M.value===d();g.setAttribute("role","menuitemradio"),g.setAttribute("aria-checked",S?"true":"false"),g.tabIndex=-1,Object.assign(g.style,{padding:"6px 14px",fontSize:FONT.body,cursor:"pointer",color:S?CLR.iconActive:CLR.text,fontWeight:S?"700":"400",background:S?CLR.menuActive:"transparent",whiteSpace:"nowrap"});const F=()=>{M.value!==d()&&(g.style.background=CLR.menuHover)},R=()=>{g.style.background=M.value===d()?CLR.menuActive:"transparent"};g.addEventListener("mouseenter",F),g.addEventListener("mouseleave",R),g.addEventListener("focus",F),g.addEventListener("blur",R),g.addEventListener("click",H=>{H.stopPropagation(),c(M.value),b()}),w.appendChild(g)}w.setAttribute("role","menu"),w.setAttribute("aria-label",p),o(v).appendChild(w),t=w,v.setAttribute("aria-expanded","true"),J(w,v,b)});return v.setAttribute("aria-haspopup","menu"),v.setAttribute("aria-expanded","false"),v}function s(a,p,x,d){function c(){return buildCheckMenuEl(v.getBoundingClientRect(),x().map(w=>"section"in w?w:{...w,onClick:A=>{w.onClick(A),d(v);const C=t;if(!C)return;const L=c();L.setAttribute("role","menu"),L.setAttribute("aria-label",p),C.replaceWith(L),t=L,J(L,v,b)}}),{makeMenuSection:f},v.ownerDocument.defaultView??window)}const b=()=>{t&&(t.remove(),t=null),v.setAttribute("aria-expanded","false")},v=r(a,p,()=>{if(t){b();return}const w=c();w.setAttribute("role","menu"),w.setAttribute("aria-label",p),o(v).appendChild(w),t=w,v.setAttribute("aria-expanded","true"),J(w,v,b)});return v.setAttribute("aria-haspopup","menu"),v.setAttribute("aria-expanded","false"),d(v),v}function y(a){const p=a.target?.closest?.("[data-wmap-submenu]");if(t&&!t.contains(a.target)&&!p&&(t.remove(),t=null,a.target?.getAttribute?.("aria-haspopup")!=="menu"))for(const d of document.querySelectorAll('[aria-haspopup="menu"][aria-expanded="true"]'))d.setAttribute("aria-expanded","false")}return{makeBtn:r,setActive:l,makeSep:u,makeMenuRow:i,makeMenuSection:f,makeDropdown:m,makeCheckMenuBtn:s,closeOpenMenu:y,getOpenMenu:()=>t,setOpenMenu:a=>{t=a}}}const Te=7e3;let De=0;function de(){return Te+ ++De}const He=32,Ie=6;let Oe=0;function $e(){return Oe++%Ie*He}function Re(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 ue(e){const n=e.mode==="modal",t=e.ownerDocument??document,o=t.defaultView??window,r=t.body.style.overflow;n&&(t.body.style.overflow="hidden");let l=null;n&&(l=t.createElement("div"),l.id="wmap-modal-backdrop",Object.assign(l.style,{position:"fixed",inset:"0",background:"rgba(0,0,0,0.6)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:Z_ABOVE,backdropFilter:"blur(3px)"}));const u=t.activeElement,i=t.createElement("div");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;const f=e.boxSize?.width??"min(90vw, 700px)",m=e.boxSize?.height??"min(90vh, 700px)";if(Object.assign(i.style,{position:"relative",background:CLR.menuBg,borderRadius:RADIUS.container,overflow:"hidden",display:"flex",flexDirection:"column",width:f,height:m,boxShadow:SHADOW.modal,minWidth:"320px",minHeight:"240px",maxWidth:"100vw",maxHeight:"100vh",zIndex:n?Z_ABOVE2:String(de())}),!n){const h=$e();Object.assign(i.style,{position:"fixed",top:`${Math.round(o.innerHeight*.08)+h}px`,left:`${Math.round(o.innerWidth*.08)+h}px`})}const s=t.createElement("div");Object.assign(s.style,{display:"flex",alignItems:"center",gap:SPACE.sm,padding:"10px 14px",borderBottom:`1px solid ${CLR.menuBorder}`,flexShrink:"0"});const y={border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,background:CLR.panelBg,cursor:"pointer",color:CLR.label,lineHeight:LEADING.none,padding:"0",display:"flex",alignItems:"center",justifyContent:"center",width:"28px",height:"28px"};if(e.title){const h=t.createElement("span");h.textContent=e.title,h.title=e.title,h.dataset.wmapWindowTitle="1",Object.assign(h.style,{fontWeight:"700",fontSize:"14px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",minWidth:"0"}),s.appendChild(h)}const a=t.createElement("div");a.style.flex="1",s.appendChild(a);let p=null;n||(p=t.createElement("button"),p.type="button",p.innerHTML=$.collapse,p.setAttribute("aria-label","Collapse"),wireTooltip(p),Object.assign(p.style,y),wireControlHover(p),p.addEventListener("click",()=>M(!C)),s.appendChild(p));let x=null;e.printable&&(x=t.createElement("button"),x.type="button",x.innerHTML=$.print,x.setAttribute("aria-label","Print / Save as PDF"),wireTooltip(x),Object.assign(x.style,y),wireControlHover(x),x.addEventListener("click",()=>{typeof e.printable=="function"?e.printable():o.print()}),s.appendChild(x));const d=t.createElement("button");d.type="button",d.innerHTML=$.maximize,d.setAttribute("aria-label","Maximize (F)"),wireTooltip(d),Object.assign(d.style,y),wireControlHover(d),d.addEventListener("click",()=>A(!b));const c=t.createElement("button");c.type="button",c.innerHTML=$.close,c.setAttribute("aria-label","Close (Esc)"),wireTooltip(c),Object.assign(c.style,y),wireControlHover(c),c.addEventListener("click",H),s.appendChild(d),s.appendChild(c);let b=!1,v="",w="";function A(h){b=h,d.innerHTML=b?$.minimize:$.maximize,d.setAttribute("aria-label",b?"Restore (F)":"Maximize (F)"),p&&(p.style.display=b?"none":""),k.style.display=b?"none":"block",b?(i.style.borderRadius="0",i.style.width="100vw",i.style.height="100vh",n||(v=i.style.top,w=i.style.left,i.style.top="0",i.style.left="0")):(i.style.borderRadius="12px",i.style.width=f,i.style.height=m,n||(i.style.top=v,i.style.left=w)),e.onMaximizeChange?.(b,i)}let C=!1,L="",T="";const B=220;function M(h){C=h,p.innerHTML=C?$.uncollapse:$.collapse,p.setAttribute("aria-label",C?"Show contents":"Collapse"),k.style.display=C?"none":"block",C?(L=i.style.height,T=i.style.width,i.style.minHeight="0",i.style.height="auto",i.style.minWidth="0",i.style.width=`${B}px`,d.disabled=!0,d.style.opacity="0.4",d.style.cursor="default",I.style.display="none"):(i.style.minHeight="240px",i.style.height=L||m,i.style.minWidth="320px",i.style.width=T||f,d.disabled=!1,d.style.opacity="1",d.style.cursor="pointer",I.style.display="flex")}function g(){const h=t.body.style.userSelect;return t.body.style.userSelect="none",()=>{t.body.style.userSelect=h}}n||(s.style.cursor="move",s.addEventListener("pointerdown",h=>{if(b||h.target.closest('button, [role="button"]'))return;h.preventDefault();const D=g(),W=h.clientX,z=h.clientY,O=i.offsetTop,_=i.offsetLeft,ne=o.innerHeight-s.offsetHeight,oe=o.innerWidth-40,Q=40-i.offsetWidth;s.setPointerCapture(h.pointerId);const Y=G=>{const ie=Math.min(Math.max(O+(G.clientY-z),0),ne),xe=Math.min(Math.max(_+(G.clientX-W),Q),oe);i.style.top=`${ie}px`,i.style.left=`${xe}px`},U=G=>{D(),s.releasePointerCapture(G.pointerId),s.removeEventListener("pointermove",Y),s.removeEventListener("pointerup",U)};s.addEventListener("pointermove",Y),s.addEventListener("pointerup",U)}));const S='button,[href],input,select,textarea,[tabindex]:not([tabindex="-1"]),[role="menuitem"],[role="menuitemradio"],[role="menuitemcheckbox"]';function F(h){const D=Array.from(i.querySelectorAll(S)).filter(_=>_.offsetParent!==null||_===t.activeElement);if(D.length===0){h.preventDefault(),i.focus();return}const W=D[0],z=D[D.length-1],O=t.activeElement;h.shiftKey&&(O===W||!i.contains(O))?(h.preventDefault(),z.focus()):!h.shiftKey&&O===z&&(h.preventDefault(),W.focus())}const R=h=>{if(h.key==="Escape"){H();return}if(n&&(h.key==="e"||h.key==="E")){H();return}if(n&&h.key==="Tab"){F(h);return}(h.key==="f"||h.key==="F")&&!C&&A(!b)};function H(){n?t.removeEventListener("keydown",R):i.removeEventListener("keydown",R),te.remove(),he(),hideTooltip(t),reparentTooltip(t.body),l?l.remove():i.remove(),n&&(t.body.style.overflow=r),u?.focus?.(),e.onClose()}function X(){n||(i.style.zIndex=String(de()))}const I=t.createElement("div");Object.assign(I.style,{flex:"1",minHeight:"0",minWidth:"0",display:"flex",overflow:"hidden"});const k=t.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 j=320,V=240,K=20;function Z(h,D){const W=o.innerWidth-i.offsetLeft,z=o.innerHeight-i.offsetTop,O=Math.min(Math.max(i.offsetWidth+h,j),W),_=Math.min(Math.max(i.offsetHeight+D,V),z);i.style.width=`${O}px`,i.style.height=`${_}px`}k.addEventListener("keydown",h=>{if(!(b||C))switch(h.key){case"ArrowRight":h.preventDefault(),Z(K,0);break;case"ArrowLeft":h.preventDefault(),Z(-K,0);break;case"ArrowDown":h.preventDefault(),Z(0,K);break;case"ArrowUp":h.preventDefault(),Z(0,-K);break}}),k.addEventListener("pointerdown",h=>{if(b||C)return;h.preventDefault();const D=g(),W=h.clientX,z=h.clientY,O=i.offsetWidth,_=i.offsetHeight,ne=o.innerWidth-i.offsetLeft,oe=o.innerHeight-i.offsetTop;k.setPointerCapture(h.pointerId);const Q=U=>{const G=Math.min(Math.max(O+(U.clientX-W),j),ne),ie=Math.min(Math.max(_+(U.clientY-z),V),oe);i.style.width=`${G}px`,i.style.height=`${ie}px`},Y=U=>{D(),k.releasePointerCapture(U.pointerId),k.removeEventListener("pointermove",Q),k.removeEventListener("pointerup",Y)};k.addEventListener("pointermove",Q),k.addEventListener("pointerup",Y)}),i.appendChild(s),i.appendChild(I),i.appendChild(k);const ee=e.anchor?overlayRootFor(e.anchor):t.body;l?(l.appendChild(i),ee.appendChild(l)):ee.appendChild(i);const he=Re(t,ee),te=t.createElement("style");return te.textContent=`@media print{
|
|
1
|
+
import{getUniqueTestNumbers as ke}from"../renderer/buildView.js";import{dieHasTestData as Ee}from"../renderer/buildWaferMap.js";import{testLabel as re,isDerivedTest as Ce,DERIVED_MARK as ce,DERIVED_KEY as de}from"../renderer/testLabel.js";import{prettyKey as Le}from"../core/utils.js";import{listBinColorSchemes as Ae,listValueColorSchemes as Me}from"../renderer/colorSchemes.js";import{ICONS as W}from"./icons.js";import{WMAP_VERSION as Se,WMAP_BUILD_TIME as Be}from"./version.js";import{openHtmlReport as De}from"../stats/renderFindingsReport.js";import{buildWaferMap as Te}from"../renderer/buildWaferMap.js";import{analyzeWaferMap as He}from"../stats/analyzeWaferMap.js";let ue=!1;export function logWmapVersionOnce(){ue||(ue=!0,console.log(`[wmap] v${Se} (built ${Be})`))}export const WMAP_TOKEN_NAMES=["z","icon","icon-hover","icon-active","bg-hover","bg-active","separator","surface","border","control-border","menu-hover","menu-active","font-family","font-size","density","panel-bg","text-muted","text","text-strong","warn-bg","warn-border","warn-text","err-bg","err-border","err-text","info-bg","info-text","selected","finding-indicator","canvas-bg","bar-fill"];const k=(e,t)=>`var(--wmap-${e}, ${t})`,K="var(--wmap-font-size, 12px)",Ie="var(--wmap-density, 1)",F=e=>`calc(${e}px * ${Ie})`;export function wireControlHover(e,t="outlined"){let n=null;const o=()=>{n&&(e.style.background=n.background,e.style.color=n.color)};e.addEventListener("mouseenter",()=>{e.dataset.on==="true"||e.disabled||(n||(n={background:e.style.background,color:e.style.color}),e.style.background=CLR.bgHover,e.style.color=CLR.iconHover)}),e.addEventListener("mouseleave",o),e.addEventListener("blur",o)}export function controlStyle(e,t=!1){const n={fontSize:FONT.body,cursor:"pointer",borderRadius:RADIUS.control};return e==="bare"?{...n,border:"none",background:"none",padding:"0",color:CLR.icon}:{...n,border:`1px solid ${CLR.controlBorder}`,background:e==="toggle"&&t?CLR.menuActive:"none",color:e==="toggle"&&t?CLR.iconActive:CLR.text,padding:`${SPACE.xxs} ${SPACE.lg}`}}export const SPACE={xxs:F(2),xs:F(4),sm:F(6),md:F(8),lg:F(10),xl:F(12),xxl:F(16),xxxl:F(24)},SHADOW={panel:"0 1px 4px rgba(0,0,0,0.10)",menu:"0 4px 12px rgba(0,0,0,0.15)",modal:"0 20px 60px rgba(0,0,0,0.40)"},MOTION={fast:"0.12s ease",base:"0.2s ease"},LEADING={none:"1",tight:"1.2",base:"1.45"},ALPHA={muted:"0.85",disabled:"0.4"},TRACKING="0.05em",EDGE_GUTTER=SPACE.xl,MAP_CHROME_INSET=SPACE.xs,RADIUS={control:"4px",container:"6px",pill:"999px"},FONT={family:"var(--wmap-font-family, inherit)",meta:`calc(${K} - 1px)`,body:K,sub:`calc(${K} + 1px)`,heading:`calc(${K} + 3px)`,stat:`calc(${K} + 8px)`};export function fontPx(e=0,t){const n=t?.ownerDocument??(typeof document<"u"?document:null);if(!n)return 12+e;const o=getComputedStyle(t??n.documentElement).getPropertyValue("--wmap-font-size").trim(),r=o?parseFloat(o):NaN;return(Number.isFinite(r)?r:12)+e}export const CLR={icon:k("icon","#506784"),iconHover:k("icon-hover","#2a3f5f"),iconActive:k("icon-active","#1a65ca"),bgHover:k("bg-hover","#edf0f8"),bgActive:k("bg-active","#dce8f8"),separator:k("separator","rgba(0,0,0,0.12)"),menuBg:k("surface","#fff"),menuBorder:k("border","rgba(0,0,0,0.12)"),controlBorder:k("control-border",k("border","rgba(0,0,0,0.30)")),menuHover:k("menu-hover","#f0f4fc"),menuActive:k("menu-active","#dce8f8"),canvasBg:`var(--wmap-canvas-bg, ${k("surface","#f5f5f5")})`,panelBg:k("panel-bg","#fafbfc"),label:k("text-muted","#647687"),value:k("text-strong","#1f2f43"),text:k("text","#333"),warnBg:k("warn-bg","#fffbe6"),warnBorder:k("warn-border","#f0c040"),warnText:k("warn-text","#7a5800"),errBg:k("err-bg","#fef2f2"),errBorder:k("err-border","#dc8a8a"),errText:k("err-text","#7a1c1c"),infoBg:k("info-bg","#dce8f8"),infoText:k("info-text","#334155"),findingHighlight:k("selected","#e07a20"),findingIndicator:k("finding-indicator","#b7551a"),barFill:k("bar-fill","#2a6fc0")};export function sevColor(e){return e==="unusual"?"#a84112":e==="notable"?"#8a6500":CLR.icon}export const ROTATIONS=[0,90,180,270],INLINE_TEST_LIMIT=6,MENU_SEARCH_THRESHOLD=8,DEFAULT_OVERLAY_Z=6e3,Z_BASE=`var(--wmap-z, ${DEFAULT_OVERLAY_Z})`,Z_ABOVE=`calc(var(--wmap-z, ${DEFAULT_OVERLAY_Z}) + 1)`,Z_MENU=`calc(var(--wmap-z, ${DEFAULT_OVERLAY_Z}) + 2)`,Z_ABOVE2=`calc(var(--wmap-z, ${DEFAULT_OVERLAY_Z}) + 3)`;export function applyOverlayZ(e){if(e==null)return()=>{};const t=document.documentElement,n=t.style.getPropertyValue("--wmap-z");return t.style.setProperty("--wmap-z",String(e)),()=>{n?t.style.setProperty("--wmap-z",n):t.style.removeProperty("--wmap-z")}}export function copyWmapThemeTokens(e,t){const n=getComputedStyle(e);for(const o of WMAP_TOKEN_NAMES){const r=n.getPropertyValue(`--wmap-${o}`).trim();r&&t.style.setProperty(`--wmap-${o}`,r)}}export function syncWmapPopupTheme(e,t,n){const o=()=>{copyWmapThemeTokens(e,t),n?.()},r=new window.MutationObserver(o);r.observe(e,{attributes:!0,attributeFilter:["style","class"]}),r.observe(document.documentElement,{attributes:!0,attributeFilter:["style","class"]});const l=window.matchMedia("(prefers-color-scheme: dark)");return l.addEventListener("change",o),()=>{r.disconnect(),l.removeEventListener("change",o)}}let ae=null;export function setDetachWindowOpener(e){ae=e}export function openDetachWindow(e){return ae?ae(e):window.open("","_blank","width=560,height=600")}export const MODE_LABELS={value:"Test Value",hardBin:"Hard Bin",softBin:"Soft Bin",stackedValues:"Stacked Test Values",stackedBins:"Stacked Hard Bins",stackedSoftBins:"Stacked Soft Bins",metadata:"Metadata"},BIN_LEGEND_MODES=new Set(["hardBin","softBin","metadata"]),STACKED_MODES=new Set(["stackedValues","stackedBins","stackedSoftBins"]);export function saveImageBlob(e,t,n){const o=`${t}.png`;if(n){n(e,o);return}downloadBlob(e,o)}export function downloadBlob(e,t){const n=URL.createObjectURL(e),o=document.createElement("a");o.href=n,o.download=t,o.click(),URL.revokeObjectURL(n)}export function saveTextFile(e,t,n,o){if(o){o(e,t,n);return}downloadBlob(new Blob([e],{type:n}),t)}const $e='[role="menuitem"],[role="menuitemradio"],[role="menuitemcheckbox"]';export function nextFrame(e,t=window){const n=t.requestAnimationFrame;typeof n=="function"?n.call(t,e):setTimeout(e,0)}export function wireListNavigation(e,t,n){e.addEventListener("keydown",o=>{const r=t();if(r.length===0)return;const l=e.ownerDocument.activeElement,p=l?r.indexOf(l):-1;switch(o.key){case"ArrowDown":o.preventDefault(),r[p<0||p===r.length-1?0:p+1].focus();break;case"ArrowUp":o.preventDefault(),r[p<=0?r.length-1:p-1].focus();break;case"Home":o.preventDefault(),r[0].focus();break;case"End":o.preventDefault(),r[r.length-1].focus();break;case"Enter":case" ":p>=0&&(o.preventDefault(),r[p].click());break;case"Escape":case"Tab":o.preventDefault(),n();break}})}function J(e,t,n){const o=()=>Array.from(e.querySelectorAll($e));wireListNavigation(e,o,()=>{n(),t?.focus()});const r=o()[0];r&&nextFrame(()=>r.focus())}export function overlayRootFor(e){let t=e;for(;t;){if(t.classList.contains("wmap-overlay-box")||t.tagName==="DIALOG"&&t.matches(":modal"))return t;t=t.parentElement}return e.ownerDocument.body}const pe=new WeakMap;export function menuLayerFor(e){const t=overlayRootFor(e),n=pe.get(t);if(n&&n.isConnected)return n;const r=e.ownerDocument.createElement("div");return r.dataset.wmapMenuLayer="1",Object.assign(r.style,{position:"fixed",inset:"0",zIndex:Z_MENU,pointerEvents:"none"}),t.appendChild(r),pe.set(t,r),r}const se=new WeakMap;export function getTooltip(e=document){const t=se.get(e);if(t&&t.isConnected)return t;const n=t??e.createElement("div");return t||(Object.assign(n.style,{position:"fixed",pointerEvents:"none",background:"rgba(30, 32, 40, 0.93)",color:"#f0f0f2",border:"1px solid rgba(255,255,255,0.10)",padding:"7px 11px",borderRadius:RADIUS.control,fontSize:FONT.sub,lineHeight:LEADING.base,maxWidth:"280px",maxHeight:"min(60vh, 480px)",overflow:"hidden",whiteSpace:"pre-wrap",zIndex:Z_ABOVE2,display:"none",fontFamily:FONT.family,boxShadow:SHADOW.menu}),se.set(e,n)),e.body.appendChild(n),n}export function hideTooltip(e=document){const t=se.get(e);t&&(t.style.display="none")}export function reparentTooltip(e){const t=e?.ownerDocument??document,n=getTooltip(t);(e??t.body).appendChild(n)}export function positionTooltip(e,t,n,o,r={}){const l=menuLayerFor(t);e.parentElement!==l&&l.appendChild(e);const p=e.ownerDocument.defaultView??window;e.style.left="0",e.style.top="0";const i=e.offsetWidth,b=e.offsetHeight,d=8,a=p.innerWidth,y=p.innerHeight;let s=n+14,f=o-8;s+i+d>a&&(s=n-i-6);const x=t.getBoundingClientRect();if(!r.followPointer&&x.height>0&&x.height<=y*.4&&f<x.bottom&&f+b>x.top&&s<x.right&&s+i>x.left){const u=x.bottom+d,h=x.top-b-d;u+b+d<=y?f=u:h>=d&&(f=h)}f+b+d>y&&(f=y-b-d),f<d&&(f=d),e.style.left=`${s}px`,e.style.top=`${f}px`}export function wireTooltip(e,t,n={}){const o=()=>(typeof t=="function"?t():t)??e.getAttribute("aria-label")??"";n.asDataPoint&&(e.tabIndex=0,e.setAttribute("role","img"),typeof t=="string"&&e.setAttribute("aria-label",t));const r=p=>{const i=o();if(!i)return;const b=getTooltip(e.ownerDocument);if(b.textContent=i,b.style.display="block",p)positionTooltip(b,e,p.clientX,p.clientY);else{const d=e.getBoundingClientRect();positionTooltip(b,e,d.left+d.width/2,d.top)}},l=()=>hideTooltip(e.ownerDocument);e.addEventListener("mousemove",r),e.addEventListener("mouseleave",l),e.addEventListener("focus",()=>r()),e.addEventListener("blur",l)}export function buildDataModeEntries(e,t,n){const o=e.some(Ee),r=e.some(a=>a.testValues!==void 0&&Object.keys(a.testValues).length>0),l=e.some(a=>a.hbin!=null),p=e.some(a=>a.sbin!=null),i=o?t!==void 0?t.map(a=>({plotMode:"value",activeTest:a.testNumber,label:a.unit?`${re(a,a.testNumber)} (${a.unit})`:re(a,a.testNumber),logScale:a.logScale,...Ce(a)?{derived:!0}:{}})):ke(e).map(a=>({plotMode:"value",activeTest:a,label:re(void 0,a)})):[],b=[...l?[{plotMode:"hardBin",label:MODE_LABELS.hardBin}]:[],...p?[{plotMode:"softBin",label:MODE_LABELS.softBin}]:[]],d=n.includeStacked?[...r?[{plotMode:"stackedValues",label:MODE_LABELS.stackedValues}]:[],...l?[{plotMode:"stackedBins",label:MODE_LABELS.stackedBins}]:[],...p?[{plotMode:"stackedSoftBins",label:MODE_LABELS.stackedSoftBins}]:[]]:[];return{testEntries:i,binEntries:b,stackedEntries:d}}export function metadataKeyHasData(e,t){return e.some(n=>n.metadata?.[t]!==void 0&&n.metadata?.[t]!==null)}export function metadataModeEntry(e){return{plotMode:"metadata",activeMetadataKey:e.key,label:e.label??Le(e.key)}}export function makeMenuSearchBox(e,t="Filter\u2026",n=document){const o=n.createElement("input");return o.type="text",o.placeholder=t,o.setAttribute("aria-label",t),Object.assign(o.style,{display:"block",width:"calc(100% - 20px)",margin:"2px 10px 6px",padding:`${SPACE.xs} ${SPACE.md}`,fontSize:FONT.body,boxSizing:"border-box",background:CLR.menuBg,color:CLR.text,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,outline:"none"}),o.addEventListener("click",r=>r.stopPropagation()),o.addEventListener("mousedown",r=>r.stopPropagation()),o.addEventListener("keydown",r=>r.stopPropagation()),o.addEventListener("input",()=>e(o.value.trim().toLowerCase())),o.addEventListener("focus",()=>{o.style.borderColor=CLR.iconActive}),o.addEventListener("blur",()=>{o.style.borderColor=CLR.menuBorder}),queueMicrotask(()=>o.focus()),o}export function buildModeMenuEl(e,t,n,o,r,l,p,i,b=window,d=[]){const{makeMenuRow:a,makeMenuSection:y}=p,s=document.createElement("div"),f=180,c=e.left+f<=(b.innerWidth??1/0)?e.left:Math.max(4,e.right-f);if(Object.assign(s.style,{position:"fixed",top:`${e.bottom+4}px`,left:`${c}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,boxShadow:SHADOW.menu,zIndex:Z_BASE,minWidth:`${f}px`,padding:"4px 0",pointerEvents:"auto"}),t.length)if(s.appendChild(y("Test Value")),t.length<=INLINE_TEST_LIMIT)for(const m of t)s.appendChild(a(m.label,r(m),!0,u=>{u.stopPropagation(),l(m,s)}));else{const m=i==="value",u=a(MODE_LABELS.value+" \u25B6",m,!1,g=>{g.stopPropagation(),A(),S(),g.detail===0&&T()});u.setAttribute("aria-haspopup","menu"),u.style.display="flex",u.style.justifyContent="space-between",u.style.alignItems="center";let h=null,w=null;const A=()=>{w!==null&&(clearTimeout(w),w=null)},E=g=>{const B=g.target;B&&(u.contains(B)||h?.contains(B))||C()},C=()=>{A(),h?.remove(),h=null,b.document.removeEventListener("click",E),u.setAttribute("aria-expanded","false")},T=()=>{const g=h?.querySelector('input, [role="menuitemradio"]');g&&nextFrame(()=>g.focus(),b)},D=()=>{A(),w=setTimeout(C,300)},S=()=>{if(h)return;const g=u.getBoundingClientRect(),B=160,V=320,I=g.right+2+B<=(b.innerWidth??1/0)?g.right+2:Math.max(4,g.left-2-B),Y=Math.min(g.top-4,Math.max(4,(b.innerHeight??1/0)-V-4));if(h=document.createElement("div"),h.setAttribute("data-wmap-submenu",""),h.setAttribute("role","menu"),Object.assign(h.style,{position:"fixed",top:`${Y}px`,left:`${I}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,boxShadow:SHADOW.menu,zIndex:Z_ABOVE,minWidth:`${B}px`,maxHeight:`${V}px`,overflowY:"auto",padding:"4px 0",pointerEvents:"auto"}),t.length>MENU_SEARCH_THRESHOLD){const L=makeMenuSearchBox(U=>{for(const O of $)O.row.style.display=O.label.includes(U)?"":"none"},"Filter tests\u2026");Object.assign(L.style,{position:"sticky",top:"0",zIndex:"1",background:CLR.menuBg}),h.appendChild(L)}const $=[],M=t.some(L=>L.derived);for(const L of t){const U=a(L.label,r(L),!1,O=>{O.stopPropagation(),C(),l(L,s)},M?{derived:L.derived===!0}:void 0);$.push({row:U,label:L.label.toLowerCase()}),h.appendChild(U)}if(M){const L=b.document.createElement("div");L.setAttribute("role","presentation"),L.textContent=`${ce} ${de}`,Object.assign(L.style,{padding:"6px 14px",fontSize:FONT.meta,color:CLR.label,borderTop:`1px solid ${CLR.menuBorder}`,marginTop:"4px",whiteSpace:"nowrap"}),h.appendChild(L)}h.addEventListener("mouseenter",A),h.addEventListener("mouseleave",D),wireListNavigation(h,()=>$.filter(L=>L.row.style.display!=="none").map(L=>L.row),()=>{C(),u.focus()}),(s.parentElement??b.document.body).appendChild(h),b.document.addEventListener("click",E),u.setAttribute("aria-expanded","true")};s.addEventListener("keydown",g=>{g.key==="Escape"&&C()}),u.addEventListener("mouseenter",()=>{A(),S()}),u.addEventListener("mouseleave",D),s.appendChild(u)}if(n.length){s.appendChild(y("Bins"));for(const m of n)s.appendChild(a(m.label,r(m),!1,u=>{u.stopPropagation(),l(m,s)}))}if(d.length){s.appendChild(y("Metadata"));for(const m of d)s.appendChild(a(m.label,r(m),!1,u=>{u.stopPropagation(),l(m,s)}))}if(o.length){s.appendChild(y("Lot Aggregation"));for(const m of o)s.appendChild(a(m.label,r(m),!1,u=>{u.stopPropagation(),l(m,s)}))}return s.setAttribute("role","menu"),s.setAttribute("aria-label","Plot mode"),s}export function markMenuTrigger(e,t){e.setAttribute("aria-haspopup","menu"),e.setAttribute("aria-expanded",t?"true":"false")}export function wireMenuA11y(e,t,n){J(e,t,n)}export function wireExpandToggle(e,t){const n=e.ownerDocument;let o=!1;function r(d){o!==d&&(o=d,t(o))}function l(){r(!1)}function p(){r(!o),o&&n.addEventListener("click",l,{once:!0})}const i=d=>{d.stopPropagation(),p()},b=d=>{d.key==="Enter"||d.key===" "?(d.preventDefault(),p()):d.key==="Escape"&&l()};return e.setAttribute("role","button"),e.tabIndex<0&&(e.tabIndex=0),e.addEventListener("click",i),e.addEventListener("keydown",b),{isOpen:()=>o,close:l,destroy(){e.removeEventListener("click",i),e.removeEventListener("keydown",b),n.removeEventListener("click",l)}}}export function buildCheckMenuEl(e,t,n,o=window){const{makeMenuSection:r}=n,l=o.document,p=l.createElement("div"),i=168,d=e.left+i<=(o.innerWidth??1/0)?e.left:Math.max(4,e.right-i);Object.assign(p.style,{position:"fixed",top:`${e.bottom+4}px`,left:`${d}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,boxShadow:SHADOW.menu,zIndex:Z_BASE,minWidth:`${i}px`,padding:"4px 0",pointerEvents:"auto"});for(const a of t)if("section"in a)p.appendChild(r(a.section));else{const y=a.enabled!==!1;if(!y&&!a.disabledHint)continue;const s=l.createElement("div");a.action?s.setAttribute("role","menuitem"):(s.setAttribute("role","menuitemcheckbox"),s.setAttribute("aria-checked",a.active?"true":"false")),s.tabIndex=-1,y||(s.setAttribute("aria-disabled","true"),wireTooltip(s,a.disabledHint)),Object.assign(s.style,{display:"flex",alignItems:"center",gap:SPACE.sm,padding:"6px 14px",fontSize:FONT.body,cursor:y?"pointer":"default",color:y?a.active?CLR.iconActive:CLR.text:CLR.label,fontWeight:a.active?"700":"400",background:a.active?CLR.menuActive:"transparent",whiteSpace:"nowrap"});const f=l.createElement("span");Object.assign(f.style,{width:"12px",flexShrink:"0",color:CLR.iconActive,visibility:a.active?"visible":"hidden"}),f.textContent=a.action?"":"\u2713",f.setAttribute("aria-hidden","true");const x=l.createElement("span");x.textContent=a.label,s.appendChild(f),s.appendChild(x),y?(s.addEventListener("mouseenter",()=>{a.active||(s.style.background=CLR.menuHover)}),s.addEventListener("mouseleave",()=>{s.style.background=a.active?CLR.menuActive:"transparent"}),s.addEventListener("focus",()=>{a.active||(s.style.background=CLR.menuHover)}),s.addEventListener("blur",()=>{s.style.background=a.active?CLR.menuActive:"transparent"}),s.addEventListener("click",c=>{c.stopPropagation(),a.onClick(c)})):s.addEventListener("click",c=>{c.stopPropagation()}),p.appendChild(s)}return p}export function createToolbarHelpers(e){const t=e.ownerDocument;let n=null;const o=s=>menuLayerFor(s);function r(s,f,x){const c=t.createElement("button");return c.innerHTML=W[s],c.type="button",c.ariaLabel=f,Object.assign(c.style,{display:"flex",alignItems:"center",justifyContent:"center",width:"28px",height:"28px",padding:"0",border:"none",borderRadius:RADIUS.control,background:"transparent",color:CLR.icon,cursor:"pointer",pointerEvents:"auto",transition:`background ${MOTION.fast}, color ${MOTION.fast}`,flexShrink:"0"}),c.addEventListener("mouseenter",m=>{c.dataset.active||(c.style.background=CLR.bgHover,c.style.color=CLR.iconHover),e.textContent=c.ariaLabel??f,e.style.display="block",positionTooltip(e,c,m.clientX,m.clientY)}),c.addEventListener("mousemove",m=>{e.style.display==="block"&&positionTooltip(e,c,m.clientX,m.clientY)}),c.addEventListener("mouseleave",()=>{c.dataset.active||(c.style.background="transparent",c.style.color=CLR.icon),e.style.display="none"}),c.addEventListener("click",()=>{e.style.display="none",x()}),c}function l(s,f){f?(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 p(){const s=t.createElement("div");return Object.assign(s.style,{width:"1px",height:"18px",background:CLR.separator,margin:"0 2px",flexShrink:"0"}),s}function i(s,f,x,c,m){const u=t.createElement("div");if(m){const h=t.createElement("span");h.textContent=m.derived?ce:"",h.setAttribute("aria-hidden","true"),Object.assign(h.style,{display:"inline-block",width:"1.1em"}),u.append(h,s),m.derived&&u.setAttribute("aria-label",`${s} \u2014 ${de.toLowerCase()}`)}else u.textContent=s;return u.setAttribute("role","menuitemradio"),u.setAttribute("aria-checked",f?"true":"false"),u.tabIndex=-1,Object.assign(u.style,{padding:`6px 14px 6px ${x?"26px":"14px"}`,fontSize:FONT.body,cursor:"pointer",color:f?CLR.iconActive:CLR.text,fontWeight:f?"700":"400",background:f?CLR.menuActive:"transparent",whiteSpace:"nowrap"}),u.addEventListener("mouseenter",()=>{f||(u.style.background=CLR.menuHover)}),u.addEventListener("mouseleave",()=>{u.style.background=f?CLR.menuActive:"transparent"}),u.addEventListener("focus",()=>{f||(u.style.background=CLR.menuHover)}),u.addEventListener("blur",()=>{u.style.background=f?CLR.menuActive:"transparent"}),u.addEventListener("click",c),u}function b(s){const f=t.createElement("div");return f.textContent=s,f.setAttribute("role","presentation"),Object.assign(f.style,{padding:"5px 14px 2px",fontSize:FONT.body,fontWeight:"600",letterSpacing:TRACKING,color:CLR.label,textTransform:"uppercase",pointerEvents:"none",userSelect:"none"}),f}function d(s,f,x,c,m){const u=()=>{n&&(n.remove(),n=null),h.setAttribute("aria-expanded","false")},h=r(s,f,()=>{if(n){u();return}const w=t.createElement("div"),A=h.getBoundingClientRect(),E=h.ownerDocument.defaultView??window,C=148,D=A.left+C<=(E.innerWidth??1/0)?A.left:Math.max(4,A.right-C);Object.assign(w.style,{position:"fixed",top:`${A.bottom+4}px`,left:`${D}px`,background:CLR.menuBg,border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,boxShadow:SHADOW.menu,zIndex:Z_BASE,minWidth:`${C}px`,padding:"4px 0",pointerEvents:"auto"});for(const S of x()){const g=t.createElement("div");g.textContent=S.label,g.dataset.wmapDropdownValue=S.value;const B=S.value===c();g.setAttribute("role","menuitemradio"),g.setAttribute("aria-checked",B?"true":"false"),g.tabIndex=-1,Object.assign(g.style,{padding:"6px 14px",fontSize:FONT.body,cursor:"pointer",color:B?CLR.iconActive:CLR.text,fontWeight:B?"700":"400",background:B?CLR.menuActive:"transparent",whiteSpace:"nowrap"});const V=()=>{S.value!==c()&&(g.style.background=CLR.menuHover)},z=()=>{g.style.background=S.value===c()?CLR.menuActive:"transparent"};g.addEventListener("mouseenter",V),g.addEventListener("mouseleave",z),g.addEventListener("focus",V),g.addEventListener("blur",z),g.addEventListener("click",I=>{I.stopPropagation(),m(S.value),u()}),w.appendChild(g)}w.setAttribute("role","menu"),w.setAttribute("aria-label",f),o(h).appendChild(w),n=w,h.setAttribute("aria-expanded","true"),J(w,h,u)});return h.setAttribute("aria-haspopup","menu"),h.setAttribute("aria-expanded","false"),h}function a(s,f,x,c){function m(){return buildCheckMenuEl(h.getBoundingClientRect(),x().map(w=>"section"in w?w:{...w,onClick:A=>{w.onClick(A),c(h);const E=n;if(!E)return;const C=m();C.setAttribute("role","menu"),C.setAttribute("aria-label",f),E.replaceWith(C),n=C,J(C,h,u)}}),{makeMenuSection:b},h.ownerDocument.defaultView??window)}const u=()=>{n&&(n.remove(),n=null),h.setAttribute("aria-expanded","false")},h=r(s,f,()=>{if(n){u();return}const w=m();w.setAttribute("role","menu"),w.setAttribute("aria-label",f),o(h).appendChild(w),n=w,h.setAttribute("aria-expanded","true"),J(w,h,u)});return h.setAttribute("aria-haspopup","menu"),h.setAttribute("aria-expanded","false"),c(h),h}function y(s){const f=s.target?.closest?.("[data-wmap-submenu]");if(n&&!n.contains(s.target)&&!f&&(n.remove(),n=null,s.target?.getAttribute?.("aria-haspopup")!=="menu"))for(const c of document.querySelectorAll('[aria-haspopup="menu"][aria-expanded="true"]'))c.setAttribute("aria-expanded","false")}return{makeBtn:r,setActive:l,makeSep:p,makeMenuRow:i,makeMenuSection:b,makeDropdown:d,makeCheckMenuBtn:a,closeOpenMenu:y,getOpenMenu:()=>n,setOpenMenu:s=>{n=s}}}const Oe=7e3;let Re=0;function fe(){return Oe+ ++Re}const We=32,ze=6;let _e=0;function Ne(){return _e++%ze*We}function Pe(e,t){if(t===e.body)return()=>{};let n=t;for(;n.parentElement&&n.parentElement!==e.body;)n=n.parentElement;return n===e.body?()=>{}:(n.classList.add("wmap-overlay-ancestor"),()=>n.classList.remove("wmap-overlay-ancestor"))}function me(e){const t=e.mode==="modal",n=e.ownerDocument??document,o=n.defaultView??window,r=n.body.style.overflow;t&&(n.body.style.overflow="hidden");let l=null;t&&(l=n.createElement("div"),l.id="wmap-modal-backdrop",Object.assign(l.style,{position:"fixed",inset:"0",background:"rgba(0,0,0,0.6)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:Z_ABOVE,backdropFilter:"blur(3px)"}));const p=n.activeElement,i=n.createElement("div");i.className=t?"wmap-modal-box wmap-overlay-box":"wmap-window-box wmap-overlay-box",i.setAttribute("role","dialog"),t&&i.setAttribute("aria-modal","true"),i.setAttribute("aria-label",e.title??"Expanded wafer map"),i.tabIndex=-1;const b=e.boxSize?.width??"min(90vw, 700px)";let d=e.boxSize?.height??"min(90vh, 700px)";if(Object.assign(i.style,{position:"relative",background:CLR.menuBg,borderRadius:RADIUS.container,overflow:"hidden",display:"flex",flexDirection:"column",width:b,height:d,boxShadow:SHADOW.modal,minWidth:"320px",minHeight:"240px",maxWidth:"100vw",maxHeight:"100vh",zIndex:t?Z_ABOVE2:String(fe())}),!t){const v=Ne();Object.assign(i.style,{position:"fixed",top:`${Math.round(o.innerHeight*.08)+v}px`,left:`${Math.round(o.innerWidth*.08)+v}px`})}const a=n.createElement("div");Object.assign(a.style,{display:"flex",alignItems:"center",gap:SPACE.sm,padding:"10px 14px",borderBottom:`1px solid ${CLR.menuBorder}`,flexShrink:"0"});const y={border:`1px solid ${CLR.menuBorder}`,borderRadius:RADIUS.control,background:CLR.panelBg,cursor:"pointer",color:CLR.label,lineHeight:LEADING.none,padding:"0",display:"flex",alignItems:"center",justifyContent:"center",width:"28px",height:"28px"};if(e.title){const v=n.createElement("span");v.textContent=e.title,v.title=e.title,v.dataset.wmapWindowTitle="1",Object.assign(v.style,{fontWeight:"700",fontSize:"14px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",minWidth:"0"}),a.appendChild(v)}const s=n.createElement("div");s.style.flex="1",a.appendChild(s);let f=null;t||(f=n.createElement("button"),f.type="button",f.innerHTML=W.collapse,f.setAttribute("aria-label","Collapse"),wireTooltip(f),Object.assign(f.style,y),wireControlHover(f),f.addEventListener("click",()=>S(!E)),a.appendChild(f));let x=null;e.printable&&(x=n.createElement("button"),x.type="button",x.innerHTML=W.print,x.setAttribute("aria-label","Print / Save as PDF"),wireTooltip(x),Object.assign(x.style,y),wireControlHover(x),x.addEventListener("click",()=>{typeof e.printable=="function"?e.printable():o.print()}),a.appendChild(x));const c=n.createElement("button");c.type="button",c.innerHTML=W.maximize,c.setAttribute("aria-label","Maximize (F)"),wireTooltip(c),Object.assign(c.style,y),wireControlHover(c),c.addEventListener("click",()=>A(!u));const m=n.createElement("button");m.type="button",m.innerHTML=W.close,m.setAttribute("aria-label","Close (Esc)"),wireTooltip(m),Object.assign(m.style,y),wireControlHover(m),m.addEventListener("click",I),a.appendChild(c),a.appendChild(m);let u=!1,h="",w="";function A(v){u=v,c.innerHTML=u?W.minimize:W.maximize,c.setAttribute("aria-label",u?"Restore (F)":"Maximize (F)"),f&&(f.style.display=u?"none":""),M.style.display=u?"none":"block",u?(i.style.borderRadius="0",i.style.width="100vw",i.style.height="100vh",t||(h=i.style.top,w=i.style.left,i.style.top="0",i.style.left="0")):(i.style.borderRadius="12px",i.style.width=b,i.style.height=d,t||(i.style.top=h,i.style.left=w)),e.onMaximizeChange?.(u,i)}let E=!1,C="",T="";const D=220;function S(v){E=v,f.innerHTML=E?W.uncollapse:W.collapse,f.setAttribute("aria-label",E?"Show contents":"Collapse"),M.style.display=E?"none":"block",E?(C=i.style.height,T=i.style.width,i.style.minHeight="0",i.style.height="auto",i.style.minWidth="0",i.style.width=`${D}px`,c.disabled=!0,c.style.opacity="0.4",c.style.cursor="default",$.style.display="none"):(i.style.minHeight="240px",i.style.height=C||d,i.style.minWidth="320px",i.style.width=T||b,c.disabled=!1,c.style.opacity="1",c.style.cursor="pointer",$.style.display="flex")}function g(){const v=n.body.style.userSelect;return n.body.style.userSelect="none",()=>{n.body.style.userSelect=v}}t||(a.style.cursor="move",a.addEventListener("pointerdown",v=>{if(u||v.target.closest('button, [role="button"]'))return;v.preventDefault();const H=g(),_=v.clientX,N=v.clientY,R=i.offsetTop,P=i.offsetLeft,ne=o.innerHeight-a.offsetHeight,oe=o.innerWidth-40,Q=40-i.offsetWidth;a.setPointerCapture(v.pointerId);const q=X=>{const ie=Math.min(Math.max(R+(X.clientY-N),0),ne),we=Math.min(Math.max(P+(X.clientX-_),Q),oe);i.style.top=`${ie}px`,i.style.left=`${we}px`},G=X=>{H(),a.releasePointerCapture(X.pointerId),a.removeEventListener("pointermove",q),a.removeEventListener("pointerup",G)};a.addEventListener("pointermove",q),a.addEventListener("pointerup",G)}));const B='button,[href],input,select,textarea,[tabindex]:not([tabindex="-1"]),[role="menuitem"],[role="menuitemradio"],[role="menuitemcheckbox"]';function V(v){const H=Array.from(i.querySelectorAll(B)).filter(P=>P.offsetParent!==null||P===n.activeElement);if(H.length===0){v.preventDefault(),i.focus();return}const _=H[0],N=H[H.length-1],R=n.activeElement;v.shiftKey&&(R===_||!i.contains(R))?(v.preventDefault(),N.focus()):!v.shiftKey&&R===N&&(v.preventDefault(),_.focus())}const z=v=>{if(v.key==="Escape"){I();return}if(t&&(v.key==="e"||v.key==="E")){I();return}if(t&&v.key==="Tab"){V(v);return}(v.key==="f"||v.key==="F")&&!E&&A(!u)};function I(){t?n.removeEventListener("keydown",z):i.removeEventListener("keydown",z),te.remove(),ge(),hideTooltip(n),reparentTooltip(n.body),l?l.remove():i.remove(),t&&(n.body.style.overflow=r),p?.focus?.(),e.onClose()}function Y(){t||(i.style.zIndex=String(fe()))}const $=n.createElement("div");Object.assign($.style,{flex:"1",minHeight:"0",minWidth:"0",display:"flex",overflow:"hidden"});const M=n.createElement("div");M.tabIndex=0,M.setAttribute("role","separator"),M.setAttribute("aria-label","Resize window (arrow keys, or drag)"),Object.assign(M.style,{position:"absolute",right:"0",bottom:"0",width:"16px",height:"16px",cursor:"nwse-resize",touchAction:"none"}),M.innerHTML='<svg viewBox="0 0 16 16" width="16" height="16" style="display:block"><path d="M15 15 L15 9 M15 15 L9 15 M15 15 L15 3 M15 15 L3 15" stroke="currentColor" stroke-width="1" opacity="0.35" fill="none"/></svg>',M.style.color=CLR.label;const L=320,U=240,O=20;function Z(v,H){const _=o.innerWidth-i.offsetLeft,N=o.innerHeight-i.offsetTop,R=Math.min(Math.max(i.offsetWidth+v,L),_),P=Math.min(Math.max(i.offsetHeight+H,U),N);i.style.width=`${R}px`,i.style.height=`${P}px`}M.addEventListener("keydown",v=>{if(!(u||E))switch(v.key){case"ArrowRight":v.preventDefault(),Z(O,0);break;case"ArrowLeft":v.preventDefault(),Z(-O,0);break;case"ArrowDown":v.preventDefault(),Z(0,O);break;case"ArrowUp":v.preventDefault(),Z(0,-O);break}}),M.addEventListener("pointerdown",v=>{if(u||E)return;v.preventDefault();const H=g(),_=v.clientX,N=v.clientY,R=i.offsetWidth,P=i.offsetHeight,ne=o.innerWidth-i.offsetLeft,oe=o.innerHeight-i.offsetTop;M.setPointerCapture(v.pointerId);const Q=G=>{const X=Math.min(Math.max(R+(G.clientX-_),L),ne),ie=Math.min(Math.max(P+(G.clientY-N),U),oe);i.style.width=`${X}px`,i.style.height=`${ie}px`},q=G=>{H(),M.releasePointerCapture(G.pointerId),M.removeEventListener("pointermove",Q),M.removeEventListener("pointerup",q)};M.addEventListener("pointermove",Q),M.addEventListener("pointerup",q)}),i.appendChild(a),i.appendChild($),i.appendChild(M);const ee=e.anchor?overlayRootFor(e.anchor):n.body;l?(l.appendChild(i),ee.appendChild(l)):ee.appendChild(i);const ge=Pe(n,ee),te=n.createElement("style");te.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
|
-
}`,t.head.appendChild(te),reparentTooltip(i),n?(l.addEventListener("click",h=>{h.target===l&&H()}),t.addEventListener("keydown",R)):(i.addEventListener("keydown",R),i.addEventListener("mousedown",X),X()),nextFrame(()=>(c.isConnected?c:i).focus(),o),{backdrop:l,box:i,contentWrap:I,close:H,bringToFront:X}}export function openModal(e){return ue({...e,mode:"modal"})}export function openFloatingWindow(e){return ue({...e,mode:"window"})}const se=new WeakSet;export function openReparentedModal(e,n={}){if(e.length===0||e.some(r=>se.has(r)))return null;const t=e.map(r=>({el:r,parent:r.parentElement,next:r.nextSibling})),o=openModal({ownerDocument:n.ownerDocument,title:n.title,boxSize:n.boxSize,anchor:e[0],onClose:()=>{for(const r of t){if(se.delete(r.el),!r.parent)continue;const l=r.next&&r.next.parentNode===r.parent?r.next:null;r.parent.insertBefore(r.el,l)}n.onClosed?.()}});for(const r of t)se.add(r.el),o.contentWrap.appendChild(r.el);return o}export function makePaletteBtn(e,n,t,o){const r=e.makeCheckMenuBtn("palette","Colour scheme",()=>{const u=n(),i=[];if(u.plotMode==="hardBin"||u.plotMode==="softBin"){const f=u.binColorScheme??"default";i.push({section:"Bin colours"});for(const m of we())i.push({label:m.label,active:f===m.name,onClick:()=>o({binColorScheme:m.name})});if(t()){const m=u.useDefinedBinColors??!0;i.push({section:"Bin definitions"}),i.push({label:"Use colours from bin definitions",active:m,onClick:()=>o({useDefinedBinColors:!m})})}}else{const f=u.valueColorScheme??"default";i.push({section:"Value colours"});for(const s of ke())i.push({label:s.label,active:f===s.name,onClick:()=>o({valueColorScheme:s.name})});const m=u.reverseValueScheme??!1;i.push({section:"Direction"}),i.push({label:"Reverse gradient",active:m,onClick:()=>o({reverseValueScheme:!m})})}return i},()=>{});function l(){r.style.display=n().plotMode==="metadata"?"none":""}return{btn:r,sync:l}}export function requestedPassFailDisplay(e){return e.passFailDisplay??"off"}export function overlayMenuRows(e,n,t,o){return[{label:"Ring boundaries",active:!!e.showRingBoundaries,onClick:()=>o({showRingBoundaries:!e.showRingBoundaries})},{label:"Quadrant lines",active:!!e.showQuadrantBoundaries,onClick:()=>o({showQuadrantBoundaries:!e.showQuadrantBoundaries})},{label:"Die labels",active:!!e.showDieLabels,onClick:()=>o({showDieLabels:!e.showDieLabels})},{label:"Reticle grid",active:!!e.showReticle,enabled:n,onClick:()=>o({showReticle:!e.showReticle})},{label:"XY indicator",active:!!e.showXYIndicator,onClick:()=>o({showXYIndicator:!e.showXYIndicator})},...passFailMenuRows({...t,display:requestedPassFailDisplay(e)},r=>o({passFailDisplay:r})),{label:"Mark failing dies",active:!!e.markFailingDies,enabled:t.binMode,disabledHint:t.binMode?void 0:"Available on hard/soft bin maps",onClick:()=>o({markFailingDies:!e.markFailingDies})},{section:""},{label:"Clear overlays",active:!1,action:!0,enabled:anyOverlayActive(e),disabledHint:"No overlays are active",onClick:()=>o({showRingBoundaries:!1,showQuadrantBoundaries:!1,showDieLabels:!1,showReticle:!1,showXYIndicator:!1,passFailDisplay:"off",markFailingDies:!1})}]}export function anyOverlayActive(e){return!!(e.showRingBoundaries||e.showQuadrantBoundaries||e.showDieLabels||e.showReticle||e.showXYIndicator||e.markFailingDies||requestedPassFailDisplay(e)!=="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 r(){const l=n(),u=l.plotMode,i=u==="value"||u==="stackedValues";o.style.display=i&&requestedPassFailDisplay(l)==="off"&&!l.functionalActive?"":"none",e.setActive(o,!!l.logScale)}return{btn:o,sync:r}}const We=[{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 r=e.makeCheckMenuBtn("legend","Legend style",()=>{const u=n().legendPosition??"default",i=[];let f=!0;if(o){const m=o.blockedReason();f=m?!0:o.get(),i.push({label:"Legend on each map",active:f,enabled:!m,disabledHint:m??void 0,onClick:()=>o.set(!o.get())})}if(pe(n().plotMode)){o&&i.push({section:"Position on each map"});for(const m of We)i.push({label:m.label,active:f&&u===m.value,enabled:f,disabledHint:f?void 0:'Turn on "Legend on each map" to position it',onClick:()=>t(m.value)})}return i},()=>{});function l(){r.style.display=o||pe(n().plotMode)?"":"none"}return{btn:r,sync:l}}function pe(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})},{section:""},{label:"Reset orientation",active:!1,action:!0,enabled:!!(n().rotation||n().flipX||n().flipY),disabledHint:"Already in the original orientation",onClick:()=>t({rotation:0,flipX:!1,flipY:!1})}],o=>{const{rotation:r,flipX:l,flipY:u}=n();e.setActive(o,!!(r||l||u))})}let P=null;const fe=40,ze=fe+8;function _e(e,n){const t=e.createElement("div");t.classList.add("wmap-guide-search"),t.style.cssText="display:flex;align-items:center;gap:2px;margin-left:10px;flex:1;min-width:80px;max-width:260px;";const o=e.createElement("input");o.type="text",o.placeholder="Search guide\u2026",o.setAttribute("aria-label","Search guide"),o.style.cssText=`flex:1;min-width:0;padding:4px 8px;font-size:12px;background:${CLR.menuBg};color:${CLR.text};border:1px solid ${CLR.menuBorder};border-radius:${RADIUS.control};outline:none;`,o.addEventListener("focus",()=>{o.style.borderColor=CLR.iconActive}),o.addEventListener("blur",()=>{o.style.borderColor=CLR.menuBorder});const r=e.createElement("span");r.setAttribute("role","status"),r.setAttribute("aria-live","polite"),r.style.cssText=`font-size:12px;color:${CLR.label};min-width:44px;text-align:center;flex-shrink:0;white-space:nowrap;`;function l(x,d){const c=e.createElement("button");return c.type="button",c.textContent=x,c.setAttribute("aria-label",d),c.disabled=!0,c.style.cssText=`border:none;background:none;cursor:pointer;padding:4px 6px;border-radius:${RADIUS.control};font-size:12px;color:${CLR.label};flex-shrink:0;opacity:0.4;`,c.addEventListener("mouseenter",()=>{c.disabled||(c.style.background=CLR.bgHover)}),c.addEventListener("mouseleave",()=>{c.style.background="none"}),c}const u=l("\u25B2","Previous match"),i=l("\u25BC","Next match");let f=[],m=-1;function s(){const x=f.length===0;u.disabled=x,i.disabled=x,u.style.opacity=x?"0.4":"",i.style.opacity=x?"0.4":""}function y(){for(const x of f)x.parentNode?.replaceChild(e.createTextNode(x.textContent??""),x);n.normalize(),f=[],m=-1}function a(x){if(f.length===0)return;m>=0&&(f[m].style.outline="none"),m=(x%f.length+f.length)%f.length;const d=f[m];d.style.outline=`2px solid ${CLR.iconActive}`,d.style.outlineOffset="1px",d.scrollIntoView({behavior:"smooth",block:"center"}),r.textContent=`${m+1}/${f.length}`}function p(x){y();const d=x.trim();if(!d){r.textContent="",s();return}const c=d.toLowerCase(),b=e.createTreeWalker(n,NodeFilter.SHOW_TEXT,{acceptNode(A){const C=A.parentElement;return!C||C.closest("script,style,.wmap-guide-toc")?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}}),v=[];let w;for(;w=b.nextNode();)v.push(w);for(const A of v){const C=A.textContent??"",L=C.toLowerCase();if(!L.includes(c))continue;const T=e.createDocumentFragment();let B=0,M=L.indexOf(c);for(;M!==-1;){M>B&&T.appendChild(e.createTextNode(C.slice(B,M)));const g=e.createElement("mark");g.textContent=C.slice(M,M+d.length),T.appendChild(g),f.push(g),B=M+d.length,M=L.indexOf(c,B)}B<C.length&&T.appendChild(e.createTextNode(C.slice(B))),A.parentNode?.replaceChild(T,A)}s(),f.length===0?r.textContent="No matches":a(0)}return o.addEventListener("input",()=>p(o.value)),o.addEventListener("keydown",x=>{x.key==="Enter"?(x.preventDefault(),a(m+(x.shiftKey?-1:1))):x.key==="Escape"&&(o.value?(o.value="",p("")):o.blur())}),u.addEventListener("click",()=>a(m-1)),i.addEventListener("click",()=>a(m+1)),t.append(o,r,u,i),t}function Ne(e,n,t){const o=[...n.querySelectorAll("h2[id]")];if(o.length<2)return;for(const d of n.querySelectorAll("h1[id],h2[id],h3[id],h4[id]"))d.style.scrollMarginTop=`${ze}px`;const r=e.createElement("div");r.classList.add("wmap-guide-toc"),r.style.cssText=`position:sticky;top:0;z-index:2;background:${CLR.menuBg};border-bottom:1px solid ${CLR.menuBorder};font-family:system-ui,-apple-system,"Segoe UI",sans-serif;`;const l=e.createElement("div");l.style.cssText=`display:flex;align-items:center;gap:4px;height:${fe}px;padding:0 12px;box-sizing:border-box;`;const u=e.createElement("span");u.innerHTML='<svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"/></svg>',u.style.cssText=`display:inline-flex;transition:transform ${MOTION.base};flex-shrink:0;`;const i=e.createElement("button");i.type="button";const f="wmap-guide-toc-panel";i.setAttribute("aria-expanded","false"),i.setAttribute("aria-controls",f),i.style.cssText=`display:flex;align-items:center;gap:6px;border:none;background:none;cursor:pointer;padding:6px 8px;margin:0 -8px 0 -8px;border-radius:${RADIUS.control};font-size:13px;font-weight:600;color:${CLR.text};`;const m=e.createElement("span");m.textContent=`Contents (${o.length})`,i.append(u,m),i.addEventListener("mouseenter",()=>{i.style.background=CLR.bgHover}),i.addEventListener("mouseleave",()=>{i.style.background="none"});const s=e.createElement("button");s.type="button",s.textContent="\u2191 Top",s.style.cssText=`margin-left:auto;border:none;background:none;cursor:pointer;padding:6px 8px;border-radius:${RADIUS.control};font-size:12px;color:${CLR.label};`,s.addEventListener("mouseenter",()=>{s.style.background=CLR.bgHover}),s.addEventListener("mouseleave",()=>{s.style.background="none"}),s.addEventListener("click",()=>{x.close(),n.scrollTo({top:0,behavior:"smooth"})}),t?l.append(i,_e(e,n),s):l.append(i,s);const y=e.createElement("div");y.id=f,y.hidden=!0,y.style.cssText="padding:2px 12px 12px;max-height:min(60vh,440px);overflow-y:auto;";const a=/^\s*\d+(?:\.\d+)*\.\s+/;for(const d of n.querySelectorAll("h2[id],h3[id],h4[id]")){const c=d.firstChild;c?.nodeType===Node.TEXT_NODE&&(c.textContent=(c.textContent??"").replace(a,""))}const p=e.createElement("ul");p.setAttribute("role","list"),p.style.cssText="list-style:none;margin:0;padding:0;columns:200px;column-gap:24px;";for(const d of o){const c=e.createElement("li");c.style.cssText="break-inside:avoid;";const b=e.createElement("a");b.href=`#${d.id}`,b.textContent=d.textContent??"",b.style.cssText=`display:block;padding:4px 6px;margin:0 -6px;border-radius:${RADIUS.control};font-size:12.5px;color:${CLR.iconActive};text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;`,b.addEventListener("mouseenter",()=>{b.style.background=CLR.bgHover}),b.addEventListener("mouseleave",()=>{b.style.background="none"}),b.addEventListener("click",v=>{v.preventDefault(),x.close(),d.scrollIntoView({behavior:"smooth",block:"start"})}),c.appendChild(b),p.appendChild(c)}y.appendChild(p);const x=wireExpandToggle(i,d=>{y.hidden=!d,i.setAttribute("aria-expanded",String(d)),u.style.transform=d?"rotate(180deg)":"none"});r.append(l,y),n.prepend(r)}function me(e,n,t,o,r){const l=n,u=l.__wmapDemoApi;l.__wmapDemoApi=o;const i=e.createElement("div");return i.classList.add("wmap-guide-content"),i.innerHTML=t,Ne(e,i,r),{content:i,restoreApi:()=>{l.__wmapDemoApi===o&&(l.__wmapDemoApi=u)}}}function be(e,n){const t=n,o=e.querySelector("script");if(o){const r=e.ownerDocument.createElement("script");r.textContent=o.textContent,e.appendChild(r);const l=e.querySelector(".wmap-guide");return l&&t.__wmapPopulateGuideDemos?.(l),t.__wmapDestroyGuideDemos}}function Pe(e,n,t,o){const r=o?.ownerDocument??document,l=r.defaultView??window,{content:u,restoreApi:i}=me(r,l,n,t,!0);Object.assign(u.style,{flex:"1",overflow:"auto",minHeight:"0",minWidth:"0"});let f;const m=openFloatingWindow({title:e,anchor:o,ownerDocument:r,printable:!0,onMaximizeChange:s=>{u.style.setProperty("--wmap-guide-reading-width",s?"1000px":"720px")},onClose:()=>{P===m&&(P=null),f?.(),i()}});return m.contentWrap.appendChild(u),f=be(u,l),m}function Fe(e,n,t,o){const r=e.document;r.title=n,Object.assign(r.documentElement.style,{height:"100%"}),Object.assign(r.body.style,{margin:"0",height:"100vh",overflow:"hidden",display:"flex",flexDirection:"column",fontFamily:FONT.family}),copyWmapThemeTokens(document.documentElement,r.documentElement);const l=syncWmapPopupTheme(document.documentElement,r.documentElement),{content:u,restoreApi:i}=me(r,e,t,o,!1);Object.assign(u.style,{flex:"1",overflow:"auto",minHeight:"0",minWidth:"0"}),r.body.appendChild(u);const f=be(u,e);let m=!1;const s=()=>{if(!m){m=!0,clearInterval(y),l();try{f?.()}catch{}i(),P===a&&(P=null)}},y=setInterval(()=>{e.closed&&s()},400);e.addEventListener("pagehide",s);const a={close:()=>{e.closed||e.close(),s()}};return a}export function openUserGuideWindow(e,n,t,o){P&&(P.close(),P=null);const r=t?.title??"Wafer Map \u2014 User Guide",l=(t?.html??"")+n,i=(o?.ownerDocument.defaultView??window).open("","_blank","width=800,height=820");P=i?Fe(i,r,l,e):Pe(r,l,e,o)}export function openWaferMapGuide(e,n){Promise.all([import("./userGuideHtml.js"),import("./renderWaferMap.js"),import("./renderWaferGallery.js")]).then(([t,o,r])=>{openUserGuideWindow({buildWaferMap:Ae,renderWaferMap:o.renderWaferMap,renderWaferGallery:r.renderWaferGallery,analyzeWaferMap:Me},t.USER_GUIDE_HTML,e,n)})}export function openReportModal(e,n){const t=n?.ownerDocument??document,o=t.createElement("iframe");o.srcdoc=e,o.title="Summary report",Object.assign(o.style,{border:"0",width:"100%",flex:"1",minHeight:"0",background:"#fff"});const r=t.createElement("div");Object.assign(r.style,{display:"flex",justifyContent:"flex-end",padding:"6px 14px",borderBottom:`1px solid ${CLR.menuBorder}`,flexShrink:"0"});const l=t.createElement("button");l.type="button",wireControlHover(l,"bare"),l.textContent="Open as full page \u2197",Object.assign(l.style,{border:"none",background:"none",color:CLR.iconActive,cursor:"pointer",fontSize:FONT.body,textDecoration:"underline",padding:"0"}),l.addEventListener("click",()=>Le(e)),r.appendChild(l);const u=openModal({title:"Summary report",anchor:n?.anchor,ownerDocument:t,printable:()=>o.contentWindow?.print(),onClose:()=>{}});return u.contentWrap.style.flexDirection="column",u.contentWrap.appendChild(r),u.contentWrap.appendChild(o),u}
|
|
9
|
+
}`,n.head.appendChild(te),reparentTooltip(i),t?(l.addEventListener("click",v=>{v.target===l&&I()}),n.addEventListener("keydown",z)):(i.addEventListener("keydown",z),i.addEventListener("mousedown",Y),Y()),nextFrame(()=>(m.isConnected?m:i).focus(),o);function ye(v){d=v,!u&&!E&&(i.style.height=v)}return{backdrop:l,box:i,contentWrap:$,close:I,bringToFront:Y,setNaturalHeight:ye}}export function openModal(e){return me({...e,mode:"modal"})}export function openFloatingWindow(e){return me({...e,mode:"window"})}const le=new WeakSet;export function openReparentedModal(e,t={}){if(e.length===0||e.some(r=>le.has(r)))return null;const n=e.map(r=>({el:r,parent:r.parentElement,next:r.nextSibling})),o=openModal({ownerDocument:t.ownerDocument,title:t.title,boxSize:t.boxSize,anchor:t.anchor??e[0],onClose:()=>{for(const r of n){if(le.delete(r.el),!r.parent)continue;const l=r.next&&r.next.parentNode===r.parent?r.next:null;r.parent.insertBefore(r.el,l)}t.onClosed?.()}});for(const r of n)le.add(r.el),o.contentWrap.appendChild(r.el);return o}export function makePaletteBtn(e,t,n,o){const r=e.makeCheckMenuBtn("palette","Colour scheme",()=>{const p=t(),i=[];if(p.plotMode==="hardBin"||p.plotMode==="softBin"){const b=p.binColorScheme??"default";i.push({section:"Bin colours"});for(const d of Ae())i.push({label:d.label,active:b===d.name,onClick:()=>o({binColorScheme:d.name})});if(n()){const d=p.useDefinedBinColors??!0;i.push({section:"Bin definitions"}),i.push({label:"Use colours from bin definitions",active:d,onClick:()=>o({useDefinedBinColors:!d})})}}else{const b=p.valueColorScheme??"default";i.push({section:"Value colours"});for(const a of Me())i.push({label:a.label,active:b===a.name,onClick:()=>o({valueColorScheme:a.name})});const d=p.reverseValueScheme??!1;i.push({section:"Direction"}),i.push({label:"Reverse gradient",active:d,onClick:()=>o({reverseValueScheme:!d})})}return i},()=>{});function l(){r.style.display=t().plotMode==="metadata"?"none":""}return{btn:r,sync:l}}export function requestedPassFailDisplay(e){return e.passFailDisplay??"off"}export function overlayMenuRows(e,t,n,o){return[{label:"Ring boundaries",active:!!e.showRingBoundaries,onClick:()=>o({showRingBoundaries:!e.showRingBoundaries})},{label:"Quadrant lines",active:!!e.showQuadrantBoundaries,onClick:()=>o({showQuadrantBoundaries:!e.showQuadrantBoundaries})},{label:"Die labels",active:!!e.showDieLabels,onClick:()=>o({showDieLabels:!e.showDieLabels})},{label:"Reticle grid",active:!!e.showReticle,enabled:t,onClick:()=>o({showReticle:!e.showReticle})},{label:"XY indicator",active:!!e.showXYIndicator,onClick:()=>o({showXYIndicator:!e.showXYIndicator})},...passFailMenuRows({...n,display:requestedPassFailDisplay(e)},r=>o({passFailDisplay:r})),{label:"Mark failing dies",active:!!e.markFailingDies,enabled:n.binMode,disabledHint:n.binMode?void 0:"Available on hard/soft bin maps",onClick:()=>o({markFailingDies:!e.markFailingDies})},{section:""},{label:"Clear overlays",active:!1,action:!0,enabled:anyOverlayActive(e),disabledHint:"No overlays are active",onClick:()=>o({showRingBoundaries:!1,showQuadrantBoundaries:!1,showDieLabels:!1,showReticle:!1,showXYIndicator:!1,passFailDisplay:"off",markFailingDies:!1})}]}export function anyOverlayActive(e){return!!(e.showRingBoundaries||e.showQuadrantBoundaries||e.showDieLabels||e.showReticle||e.showXYIndicator||e.markFailingDies||requestedPassFailDisplay(e)!=="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 o=e.makeBtn("logScale","Toggle log scale",()=>{n({logScale:!t().logScale})});function r(){const l=t(),p=l.plotMode,i=p==="value"||p==="stackedValues";o.style.display=i&&requestedPassFailDisplay(l)==="off"&&!l.functionalActive?"":"none",e.setActive(o,!!l.logScale)}return{btn:o,sync:r}}const Fe=[{value:"default",label:"Default (right)"},{value:"compact",label:"Compact (right)"},{value:"left",label:"Left"},{value:"top",label:"Top"},{value:"bottom",label:"Bottom"},{value:"floating",label:"Floating"}];export function makeLegendStyleBtn(e,t,n,o){const r=e.makeCheckMenuBtn("legend","Legend style",()=>{const p=t().legendPosition??"default",i=[];let b=!0;if(o){const d=o.blockedReason();b=d?!0:o.get(),i.push({label:"Legend on each map",active:b,enabled:!d,disabledHint:d??void 0,onClick:()=>o.set(!o.get())})}if(be(t().plotMode)){o&&i.push({section:"Position on each map"});for(const d of Fe)i.push({label:d.label,active:b&&p===d.value,enabled:b,disabledHint:b?void 0:'Turn on "Legend on each map" to position it',onClick:()=>n(d.value)})}return i},()=>{});function l(){r.style.display=o||be(t().plotMode)?"":"none"}return{btn:r,sync:l}}function be(e){return e==="hardBin"||e==="softBin"||e==="metadata"}export function makeOverlaysBtn(e,t,n){return e.makeCheckMenuBtn("overlays","Overlays",()=>t(),o=>e.setActive(o,n()))}export function makeOrientationBtn(e,t,n){return e.makeCheckMenuBtn("orient","Orientation",()=>[{section:"Rotate"},{label:"Rotate 90\xB0 clockwise",active:!1,onClick:()=>{const o=t().rotation??0;n({rotation:ROTATIONS[(ROTATIONS.indexOf(o)+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})},{section:""},{label:"Reset orientation",active:!1,action:!0,enabled:!!(t().rotation||t().flipX||t().flipY),disabledHint:"Already in the original orientation",onClick:()=>n({rotation:0,flipX:!1,flipY:!1})}],o=>{const{rotation:r,flipX:l,flipY:p}=t();e.setActive(o,!!(r||l||p))})}let j=null;const he=40,je=he+8;function Ve(e,t){const n=e.createElement("div");n.classList.add("wmap-guide-search"),n.style.cssText="display:flex;align-items:center;gap:2px;margin-left:10px;flex:1;min-width:80px;max-width:260px;";const o=e.createElement("input");o.type="text",o.placeholder="Search guide\u2026",o.setAttribute("aria-label","Search guide"),o.style.cssText=`flex:1;min-width:0;padding:4px 8px;font-size:12px;background:${CLR.menuBg};color:${CLR.text};border:1px solid ${CLR.menuBorder};border-radius:${RADIUS.control};outline:none;`,o.addEventListener("focus",()=>{o.style.borderColor=CLR.iconActive}),o.addEventListener("blur",()=>{o.style.borderColor=CLR.menuBorder});const r=e.createElement("span");r.setAttribute("role","status"),r.setAttribute("aria-live","polite"),r.style.cssText=`font-size:12px;color:${CLR.label};min-width:44px;text-align:center;flex-shrink:0;white-space:nowrap;`;function l(x,c){const m=e.createElement("button");return m.type="button",m.textContent=x,m.setAttribute("aria-label",c),m.disabled=!0,m.style.cssText=`border:none;background:none;cursor:pointer;padding:4px 6px;border-radius:${RADIUS.control};font-size:12px;color:${CLR.label};flex-shrink:0;opacity:0.4;`,m.addEventListener("mouseenter",()=>{m.disabled||(m.style.background=CLR.bgHover)}),m.addEventListener("mouseleave",()=>{m.style.background="none"}),m}const p=l("\u25B2","Previous match"),i=l("\u25BC","Next match");let b=[],d=-1;function a(){const x=b.length===0;p.disabled=x,i.disabled=x,p.style.opacity=x?"0.4":"",i.style.opacity=x?"0.4":""}function y(){for(const x of b)x.parentNode?.replaceChild(e.createTextNode(x.textContent??""),x);t.normalize(),b=[],d=-1}function s(x){if(b.length===0)return;d>=0&&(b[d].style.outline="none"),d=(x%b.length+b.length)%b.length;const c=b[d];c.style.outline=`2px solid ${CLR.iconActive}`,c.style.outlineOffset="1px",c.scrollIntoView({behavior:"smooth",block:"center"}),r.textContent=`${d+1}/${b.length}`}function f(x){y();const c=x.trim();if(!c){r.textContent="",a();return}const m=c.toLowerCase(),u=e.createTreeWalker(t,NodeFilter.SHOW_TEXT,{acceptNode(A){const E=A.parentElement;return!E||E.closest("script,style,.wmap-guide-toc")?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}}),h=[];let w;for(;w=u.nextNode();)h.push(w);for(const A of h){const E=A.textContent??"",C=E.toLowerCase();if(!C.includes(m))continue;const T=e.createDocumentFragment();let D=0,S=C.indexOf(m);for(;S!==-1;){S>D&&T.appendChild(e.createTextNode(E.slice(D,S)));const g=e.createElement("mark");g.textContent=E.slice(S,S+c.length),T.appendChild(g),b.push(g),D=S+c.length,S=C.indexOf(m,D)}D<E.length&&T.appendChild(e.createTextNode(E.slice(D))),A.parentNode?.replaceChild(T,A)}a(),b.length===0?r.textContent="No matches":s(0)}return o.addEventListener("input",()=>f(o.value)),o.addEventListener("keydown",x=>{x.key==="Enter"?(x.preventDefault(),s(d+(x.shiftKey?-1:1))):x.key==="Escape"&&(o.value?(o.value="",f("")):o.blur())}),p.addEventListener("click",()=>s(d-1)),i.addEventListener("click",()=>s(d+1)),n.append(o,r,p,i),n}function Ue(e,t,n){const o=[...t.querySelectorAll("h2[id]")];if(o.length<2)return;for(const c of t.querySelectorAll("h1[id],h2[id],h3[id],h4[id]"))c.style.scrollMarginTop=`${je}px`;const r=e.createElement("div");r.classList.add("wmap-guide-toc"),r.style.cssText=`position:sticky;top:0;z-index:2;background:${CLR.menuBg};border-bottom:1px solid ${CLR.menuBorder};font-family:system-ui,-apple-system,"Segoe UI",sans-serif;`;const l=e.createElement("div");l.style.cssText=`display:flex;align-items:center;gap:4px;height:${he}px;padding:0 12px;box-sizing:border-box;`;const p=e.createElement("span");p.innerHTML='<svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"/></svg>',p.style.cssText=`display:inline-flex;transition:transform ${MOTION.base};flex-shrink:0;`;const i=e.createElement("button");i.type="button";const b="wmap-guide-toc-panel";i.setAttribute("aria-expanded","false"),i.setAttribute("aria-controls",b),i.style.cssText=`display:flex;align-items:center;gap:6px;border:none;background:none;cursor:pointer;padding:6px 8px;margin:0 -8px 0 -8px;border-radius:${RADIUS.control};font-size:13px;font-weight:600;color:${CLR.text};`;const d=e.createElement("span");d.textContent=`Contents (${o.length})`,i.append(p,d),i.addEventListener("mouseenter",()=>{i.style.background=CLR.bgHover}),i.addEventListener("mouseleave",()=>{i.style.background="none"});const a=e.createElement("button");a.type="button",a.textContent="\u2191 Top",a.style.cssText=`margin-left:auto;border:none;background:none;cursor:pointer;padding:6px 8px;border-radius:${RADIUS.control};font-size:12px;color:${CLR.label};`,a.addEventListener("mouseenter",()=>{a.style.background=CLR.bgHover}),a.addEventListener("mouseleave",()=>{a.style.background="none"}),a.addEventListener("click",()=>{x.close(),t.scrollTo({top:0,behavior:"smooth"})}),n?l.append(i,Ve(e,t),a):l.append(i,a);const y=e.createElement("div");y.id=b,y.hidden=!0,y.style.cssText="padding:2px 12px 12px;max-height:min(60vh,440px);overflow-y:auto;";const s=/^\s*\d+(?:\.\d+)*\.\s+/;for(const c of t.querySelectorAll("h2[id],h3[id],h4[id]")){const m=c.firstChild;m?.nodeType===Node.TEXT_NODE&&(m.textContent=(m.textContent??"").replace(s,""))}const f=e.createElement("ul");f.setAttribute("role","list"),f.style.cssText="list-style:none;margin:0;padding:0;columns:200px;column-gap:24px;";for(const c of o){const m=e.createElement("li");m.style.cssText="break-inside:avoid;";const u=e.createElement("a");u.href=`#${c.id}`,u.textContent=c.textContent??"",u.style.cssText=`display:block;padding:4px 6px;margin:0 -6px;border-radius:${RADIUS.control};font-size:12.5px;color:${CLR.iconActive};text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;`,u.addEventListener("mouseenter",()=>{u.style.background=CLR.bgHover}),u.addEventListener("mouseleave",()=>{u.style.background="none"}),u.addEventListener("click",h=>{h.preventDefault(),x.close(),c.scrollIntoView({behavior:"smooth",block:"start"})}),m.appendChild(u),f.appendChild(m)}y.appendChild(f);const x=wireExpandToggle(i,c=>{y.hidden=!c,i.setAttribute("aria-expanded",String(c)),p.style.transform=c?"rotate(180deg)":"none"});r.append(l,y),t.prepend(r)}function xe(e,t,n,o,r){const l=t,p=l.__wmapDemoApi;l.__wmapDemoApi=o;const i=e.createElement("div");return i.classList.add("wmap-guide-content"),i.innerHTML=n,Ue(e,i,r),{content:i,restoreApi:()=>{l.__wmapDemoApi===o&&(l.__wmapDemoApi=p)}}}function ve(e,t){const n=t,o=e.querySelector("script");if(o){const r=e.ownerDocument.createElement("script");r.textContent=o.textContent,e.appendChild(r);const l=e.querySelector(".wmap-guide");return l&&n.__wmapPopulateGuideDemos?.(l),n.__wmapDestroyGuideDemos}}function Ge(e,t,n,o){const r=o?.ownerDocument??document,l=r.defaultView??window,{content:p,restoreApi:i}=xe(r,l,t,n,!0);Object.assign(p.style,{flex:"1",overflow:"auto",minHeight:"0",minWidth:"0"});let b;const d=openFloatingWindow({title:e,anchor:o,ownerDocument:r,printable:!0,onMaximizeChange:a=>{p.style.setProperty("--wmap-guide-reading-width",a?"1000px":"720px")},onClose:()=>{j===d&&(j=null),b?.(),i()}});return d.contentWrap.appendChild(p),b=ve(p,l),d}function Xe(e,t,n,o){const r=e.document;r.title=t,Object.assign(r.documentElement.style,{height:"100%"}),Object.assign(r.body.style,{margin:"0",height:"100vh",overflow:"hidden",display:"flex",flexDirection:"column",fontFamily:FONT.family}),copyWmapThemeTokens(document.documentElement,r.documentElement);const l=syncWmapPopupTheme(document.documentElement,r.documentElement),{content:p,restoreApi:i}=xe(r,e,n,o,!1);Object.assign(p.style,{flex:"1",overflow:"auto",minHeight:"0",minWidth:"0"}),r.body.appendChild(p);const b=ve(p,e);let d=!1;const a=()=>{if(!d){d=!0,clearInterval(y),l();try{b?.()}catch{}i(),j===s&&(j=null)}},y=setInterval(()=>{e.closed&&a()},400);e.addEventListener("pagehide",a);const s={close:()=>{e.closed||e.close(),a()}};return s}export function openUserGuideWindow(e,t,n,o){j&&(j.close(),j=null);const r=n?.title??"Wafer Map \u2014 User Guide",l=(n?.html??"")+t,i=(o?.ownerDocument.defaultView??window).open("","_blank","width=800,height=820");j=i?Xe(i,r,l,e):Ge(r,l,e,o)}export function openWaferMapGuide(e,t){Promise.all([import("./userGuideHtml.js"),import("./renderWaferMap.js"),import("./renderWaferGallery.js")]).then(([n,o,r])=>{openUserGuideWindow({buildWaferMap:Te,renderWaferMap:o.renderWaferMap,renderWaferGallery:r.renderWaferGallery,analyzeWaferMap:He},n.USER_GUIDE_HTML,e,t)})}export function openReportModal(e,t){const n=t?.ownerDocument??document,o=n.createElement("iframe");o.srcdoc=e,o.title="Summary report",Object.assign(o.style,{border:"0",width:"100%",flex:"1",minHeight:"0",background:"#fff"});const r=n.createElement("div");Object.assign(r.style,{display:"flex",justifyContent:"flex-end",padding:"6px 14px",borderBottom:`1px solid ${CLR.menuBorder}`,flexShrink:"0"});const l=n.createElement("button");l.type="button",wireControlHover(l,"bare"),l.textContent="Open as full page \u2197",Object.assign(l.style,{border:"none",background:"none",color:CLR.iconActive,cursor:"pointer",fontSize:FONT.body,textDecoration:"underline",padding:"0"}),l.addEventListener("click",()=>De(e)),r.appendChild(l);const p=openModal({title:"Summary report",anchor:t?.anchor,ownerDocument:n,printable:()=>o.contentWindow?.print(),onClose:()=>{}});return p.contentWrap.style.flexDirection="column",p.contentWrap.appendChild(r),p.contentWrap.appendChild(o),p}
|