@wafertools/wafermap 0.26.1 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/AGENTS.md +10 -2
  2. package/CHANGELOG.md +670 -0
  3. package/README.md +46 -3
  4. package/dist/packages/canvas-adapter/canvasTheme.d.ts +4 -0
  5. package/dist/packages/canvas-adapter/canvasTheme.js +1 -1
  6. package/dist/packages/canvas-adapter/charts/barPanel.d.ts +16 -0
  7. package/dist/packages/canvas-adapter/charts/barPanel.js +1 -1
  8. package/dist/packages/canvas-adapter/charts/binCluster.d.ts +0 -1
  9. package/dist/packages/canvas-adapter/charts/binCluster.js +1 -1
  10. package/dist/packages/canvas-adapter/charts/boxplot.d.ts +21 -2
  11. package/dist/packages/canvas-adapter/charts/boxplot.js +1 -1
  12. package/dist/packages/canvas-adapter/charts/capability.d.ts +10 -11
  13. package/dist/packages/canvas-adapter/charts/capability.js +1 -1
  14. package/dist/packages/canvas-adapter/charts/chartShell.d.ts +337 -3
  15. package/dist/packages/canvas-adapter/charts/chartShell.js +1 -1
  16. package/dist/packages/canvas-adapter/charts/correlation.d.ts +8 -10
  17. package/dist/packages/canvas-adapter/charts/correlation.js +2 -1
  18. package/dist/packages/canvas-adapter/charts/groupedBarPlot.d.ts +50 -0
  19. package/dist/packages/canvas-adapter/charts/groupedBarPlot.js +1 -0
  20. package/dist/packages/canvas-adapter/charts/histogram.d.ts +12 -2
  21. package/dist/packages/canvas-adapter/charts/histogram.js +1 -1
  22. package/dist/packages/canvas-adapter/charts/regionYieldDiagram.d.ts +0 -1
  23. package/dist/packages/canvas-adapter/charts/regionYieldDiagram.js +1 -1
  24. package/dist/packages/canvas-adapter/charts/scatter.d.ts +6 -1
  25. package/dist/packages/canvas-adapter/charts/scatter.js +1 -1
  26. package/dist/packages/canvas-adapter/charts/testPassRate.d.ts +20 -0
  27. package/dist/packages/canvas-adapter/charts/testPassRate.js +1 -0
  28. package/dist/packages/canvas-adapter/charts/trend.d.ts +37 -0
  29. package/dist/packages/canvas-adapter/charts/trend.js +1 -0
  30. package/dist/packages/canvas-adapter/dieList.js +7 -7
  31. package/dist/packages/canvas-adapter/hitGrid.d.ts +22 -0
  32. package/dist/packages/canvas-adapter/hitGrid.js +1 -0
  33. package/dist/packages/canvas-adapter/identityHeader.d.ts +46 -0
  34. package/dist/packages/canvas-adapter/identityHeader.js +1 -0
  35. package/dist/packages/canvas-adapter/index.d.ts +2 -1
  36. package/dist/packages/canvas-adapter/index.js +1 -1
  37. package/dist/packages/canvas-adapter/insightsTab.d.ts +51 -5
  38. package/dist/packages/canvas-adapter/insightsTab.js +1 -1
  39. package/dist/packages/canvas-adapter/maplessSummary.d.ts +5 -1
  40. package/dist/packages/canvas-adapter/maplessSummary.js +1 -1
  41. package/dist/packages/canvas-adapter/renderWaferGallery.d.ts +15 -2
  42. package/dist/packages/canvas-adapter/renderWaferGallery.js +1 -20
  43. package/dist/packages/canvas-adapter/renderWaferMap.d.ts +110 -18
  44. package/dist/packages/canvas-adapter/renderWaferMap.js +1 -1
  45. package/dist/packages/canvas-adapter/summaryPanel.d.ts +233 -37
  46. package/dist/packages/canvas-adapter/summaryPanel.js +3 -3
  47. package/dist/packages/canvas-adapter/toCanvas.d.ts +6 -0
  48. package/dist/packages/canvas-adapter/toCanvas.js +1 -1
  49. package/dist/packages/canvas-adapter/toolbar.d.ts +352 -15
  50. package/dist/packages/canvas-adapter/toolbar.js +2 -2
  51. package/dist/packages/canvas-adapter/userGuideHtml.d.ts +1 -1
  52. package/dist/packages/canvas-adapter/userGuideHtml.js +115 -41
  53. package/dist/packages/canvas-adapter/version.d.ts +2 -2
  54. package/dist/packages/canvas-adapter/version.js +1 -1
  55. package/dist/packages/canvas-adapter/warnings.d.ts +21 -0
  56. package/dist/packages/canvas-adapter/warnings.js +1 -1
  57. package/dist/packages/core/dies.d.ts +11 -0
  58. package/dist/packages/core/dies.js +1 -1
  59. package/dist/packages/core/utils.d.ts +11 -0
  60. package/dist/packages/core/utils.js +1 -1
  61. package/dist/packages/renderer/binColors.d.ts +80 -0
  62. package/dist/packages/renderer/binColors.js +1 -0
  63. package/dist/packages/renderer/buildView.d.ts +100 -6
  64. package/dist/packages/renderer/buildView.js +1 -1
  65. package/dist/packages/renderer/buildWaferMap.d.ts +112 -7
  66. package/dist/packages/renderer/buildWaferMap.js +1 -1
  67. package/dist/packages/renderer/colorMap.d.ts +16 -15
  68. package/dist/packages/renderer/colorMap.js +1 -1
  69. package/dist/packages/renderer/colorSchemes.d.ts +45 -26
  70. package/dist/packages/renderer/colorSchemes.js +1 -1
  71. package/dist/packages/renderer/index.d.ts +3 -1
  72. package/dist/packages/renderer/index.js +1 -1
  73. package/dist/packages/stats/analyzeWaferLot.js +1 -1
  74. package/dist/packages/stats/analyzeWaferMap.js +1 -1
  75. package/dist/packages/stats/binPareto.d.ts +15 -0
  76. package/dist/packages/stats/binPareto.js +1 -1
  77. package/dist/packages/stats/clusterDetection.js +1 -1
  78. package/dist/packages/stats/connectedComponents.d.ts +14 -0
  79. package/dist/packages/stats/connectedComponents.js +1 -0
  80. package/dist/packages/stats/correlation.d.ts +26 -0
  81. package/dist/packages/stats/correlation.js +1 -1
  82. package/dist/packages/stats/facets.js +1 -1
  83. package/dist/packages/stats/filterFindings.d.ts +18 -0
  84. package/dist/packages/stats/filterFindings.js +1 -1
  85. package/dist/packages/stats/findingsNarrative.js +1 -1
  86. package/dist/packages/stats/histogram.d.ts +47 -2
  87. package/dist/packages/stats/histogram.js +1 -1
  88. package/dist/packages/stats/index.d.ts +6 -0
  89. package/dist/packages/stats/index.js +1 -1
  90. package/dist/packages/stats/mergeTestDefs.d.ts +44 -0
  91. package/dist/packages/stats/mergeTestDefs.js +1 -0
  92. package/dist/packages/stats/metadataColumns.d.ts +20 -4
  93. package/dist/packages/stats/metadataColumns.js +1 -1
  94. package/dist/packages/stats/patternClassification.js +1 -1
  95. package/dist/packages/stats/population.d.ts +23 -0
  96. package/dist/packages/stats/population.js +1 -0
  97. package/dist/packages/stats/renderFindingsReport.js +15 -15
  98. package/dist/packages/stats/renderSummaryReport.js +35 -32
  99. package/dist/packages/stats/reportHtml.js +38 -13
  100. package/dist/packages/stats/testPassRate.d.ts +85 -0
  101. package/dist/packages/stats/testPassRate.js +1 -0
  102. package/dist/packages/stats/trend.d.ts +40 -0
  103. package/dist/packages/stats/trend.js +1 -0
  104. package/dist/packages/stats/types.d.ts +117 -6
  105. package/dist/packages/stats/yield.js +1 -1
  106. package/llms.txt +6 -0
  107. package/package.json +9 -5
  108. package/dist/packages/canvas-adapter/metadataBadge.d.ts +0 -30
  109. package/dist/packages/canvas-adapter/metadataBadge.js +0 -1
@@ -72,7 +72,7 @@ export const USER_GUIDE_HTML=`<div class="wmap-guide">
72
72
  .wmap-guide-toc{display:none!important}
73
73
  }
74
74
  </style>
75
- <h1 id="wafer-map-user-guide">Wafer Map \u2014 User Guide<span class="wmap-guide-version" title="Built 2026-08-28T14:50:01.535Z">v0.26.1</span></h1>
75
+ <h1 id="wafer-map-user-guide">Wafer Map \u2014 User Guide<span class="wmap-guide-version" title="Built 2026-09-11T18:10:20.393Z">v0.28.0</span></h1>
76
76
  <p class="wmap-guide-online-link">This is a quick reference. <a href="https://wafertools.github.io/wafermap/user-guide/" target="_blank" rel="noopener">View the full illustrated guide online \u2197</a></p>
77
77
  <p>This guide describes the display and analysis features of the wafer map viewer.
78
78
  It is written for users who may be semiconductor test engineers, device engineers, and yield engineers
@@ -250,7 +250,7 @@ verdicts, as an alternative to spec-limit judgement.</p>
250
250
  <p>The toolbar sits at the top-right of the map and is always visible. Controls that
251
251
  are not applicable to the current mode are hidden automatically. (Hovering the map
252
252
  shows die tooltips \u2014 a separate thing from the toolbar, which is always present.)</p>
253
- <p><img src="data:image/png;base64,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" alt="Single-map toolbar"></p>
253
+ <p><img src="data:image/png;base64,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" alt="Single-map toolbar"></p>
254
254
  <h3 id="single-map">Single map</h3>
255
255
  <table>
256
256
  <thead>
@@ -268,12 +268,12 @@ shows die tooltips \u2014 a separate thing from the toolbar, which is always pre
268
268
  <tr>
269
269
  <td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0yIDEyczMuNi03IDEwLTcgMTAgNyAxMCA3LTMuNiA3LTEwIDctMTAtNy0xMC03eiIvPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjMiLz48L3N2Zz4K" width="20" height="20"></td>
270
270
  <td>Overlays</td>
271
- <td>Check-menu of optional display layers: XY axis indicator, ring boundaries, quadrant lines, die coordinate labels, reticle grid (when geometry is configured), Spec pass/fail (Test Value mode with limits), and Test pass/fail (Test Value mode, active test is functional or has recorded verdicts).</td>
271
+ <td>Check-menu of optional display layers: XY axis indicator, ring boundaries, quadrant lines, die coordinate labels, reticle grid (when geometry is configured), Spec pass/fail (Test Value mode with limits), Test pass/fail (Test Value mode, active test is functional or has recorded verdicts), and <strong>Mark failing dies</strong> (bin modes only). <strong>Clear overlays</strong> at the foot turns off everything in the menu at once, and is greyed when nothing is on \u2014 so the menu also answers &quot;is anything active?&quot; without you auditing every row.</td>
272
272
  </tr>
273
273
  <tr>
274
274
  <td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Im0xNC42MjIgMTcuODk3LTEwLjY4LTIuOTEzIi8+PHBhdGggZD0iTTE4LjM3NiAyLjYyMmExIDEgMCAxIDEgMy4wMDIgMy4wMDJMMTcuMzYgOS42NDNhLjUuNSAwIDAgMCAwIC43MDdsLjk0NC45NDRhMi40MSAyLjQxIDAgMCAxIDAgMy40MDhsLS45NDQuOTQ0YS41LjUgMCAwIDEtLjcwNyAwTDguMzU0IDcuMzQ4YS41LjUgMCAwIDEgMC0uNzA3bC45NDQtLjk0NGEyLjQxIDIuNDEgMCAwIDEgMy40MDggMGwuOTQ0Ljk0NGEuNS41IDAgMCAwIC43MDcgMHoiLz48cGF0aCBkPSJNOSA4Yy0xLjgwNCAyLjcxLTMuOTcgMy40Ni02LjU4MyAzLjk0OGEuNTA3LjUwNyAwIDAgMC0uMzAyLjgxOWw3LjMyIDguODgzYTEgMSAwIDAgMCAxLjE4NS4yMDRDMTIuNzM1IDIwLjQwNSAxNiAxNi43OTIgMTYgMTUiLz48L3N2Zz4K" width="20" height="20"></td>
275
275
  <td>Colour scheme</td>
276
- <td>Switches the colour palette used for value and stacked modes. Available schemes depend on what the application has registered.</td>
276
+ <td>Picks the colours for the map on screen. In Hard Bin and Soft Bin modes it lists <strong>bin colours</strong> (Default, Colour-blind safe); in every other mode \u2014 including the stacked modes, which show values \u2014 it lists <strong>value colours</strong>. The two are separate choices, so changing one never resets the other. When bin definitions carry their own colours, <strong>Use colours from bin definitions</strong> turns them on or off. (<strong>Mark failing dies</strong> is in Overlays, beside the pass/fail display it belongs with.)</td>
277
277
  </tr>
278
278
  <tr>
279
279
  <td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik01IDIxIEw1IDMiLz48cGF0aCBkPSJNMy41IDUgTDUgMyBMNi41IDUiLz48cGF0aCBkPSJNNSAyMSBMMjEgMjEiLz48cGF0aCBkPSJNMTkgMTkuNSBMMjEgMjEgTDE5IDIyLjUiLz48cGF0aCBkPSJNNiAyMCBDIDYgMTIsIDEwIDcsIDIwIDYiLz48L3N2Zz4K" width="20" height="20"></td>
@@ -293,7 +293,7 @@ shows die tooltips \u2014 a separate thing from the toolbar, which is always pre
293
293
  <tr>
294
294
  <td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIi8+PHBvbHlnb24gcG9pbnRzPSIxNi4yNCA3Ljc2IDE0LjEyIDE0LjEyIDcuNzYgMTYuMjQgOS44OCA5Ljg4IDE2LjI0IDcuNzYiIGZpbGw9IiMzNzQxNTEiIHN0cm9rZT0ibm9uZSIvPjwvc3ZnPgo=" width="20" height="20"></td>
295
295
  <td>Orientation</td>
296
- <td>Menu of display transforms: <strong>Rotate 90\xB0 clockwise</strong> (applies cumulatively), <strong>Flip horizontal</strong>, <strong>Flip vertical</strong>. These change only how the wafer is drawn \u2014 die coordinates in tooltips and labels are always the original values, whatever the orientation.</td>
296
+ <td>Menu of display transforms: <strong>Rotate 90\xB0 clockwise</strong> (applies cumulatively), <strong>Flip horizontal</strong>, <strong>Flip vertical</strong>, and <strong>Reset orientation</strong>. These change only how the wafer is drawn \u2014 die coordinates in tooltips and labels are always the original values, whatever the orientation. Reset is worth knowing about: rotation and mirroring do not combine in the order you applied them, so undoing a few clicks by clicking again does not reliably get you back \u2014 Reset does, and is greyed when you are already there.</td>
297
297
  </tr>
298
298
  <tr>
299
299
  <td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Im0xMyAxMy41IDItMi41LTItMi41Ii8+PHBhdGggZD0ibTIxIDIxLTQuMy00LjMiLz48cGF0aCBkPSJNOSA4LjUgNyAxMWwyIDIuNSIvPjxjaXJjbGUgY3g9IjExIiBjeT0iMTEiIHI9IjgiLz48L3N2Zz4K" width="20" height="20"></td>
@@ -333,7 +333,7 @@ shows die tooltips \u2014 a separate thing from the toolbar, which is always pre
333
333
  <tr>
334
334
  <td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0xNSAzaDZ2NiIvPjxwYXRoIGQ9Ik05IDIxSDN2LTYiLz48cGF0aCBkPSJNMjEgM2wtNyA3Ii8+PHBhdGggZD0iTTMgMjFsNy03Ii8+PC9zdmc+Cg==" width="20" height="20"></td>
335
335
  <td>Expand</td>
336
- <td>Opens the map in an enlarged modal overlay. A maximise button in the modal grows it to fill the window (or press <strong>F</strong>). Press <strong>Esc</strong> or click outside to close. Useful for detailed inspection without changing the main view. Hidden while the Insights tab is open \u2014 each chart inside Insights has its own expand button instead.</td>
336
+ <td>Opens the map in an enlarged modal overlay. A maximise button in the modal grows it to fill the window (or press <strong>F</strong>). Press <strong>Esc</strong> or click outside to close. Useful for detailed inspection without changing the main view. Works in the Insights view too, where it opens the whole chart suite in a wide modal \u2014 useful because those charts interact and are best read side by side. Individual charts also have their own expand button.</td>
337
337
  </tr>
338
338
  <tr>
339
339
  <td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0xMy45OTcgNGEyIDIgMCAwIDEgMS43NiAxLjA1bC40ODYuOUEyIDIgMCAwIDAgMTguMDAzIDdIMjBhMiAyIDAgMCAxIDIgMnY5YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjlhMiAyIDAgMCAxIDItMmgxLjk5N2EyIDIgMCAwIDAgMS43NTktMS4wNDhsLjQ4OS0uOTA0QTIgMiAwIDAgMSAxMC4wMDQgNHoiLz48Y2lyY2xlIGN4PSIxMiIgY3k9IjEzIiByPSIzIi8+PC9zdmc+Cg==" width="20" height="20"></td>
@@ -343,7 +343,7 @@ shows die tooltips \u2014 a separate thing from the toolbar, which is always pre
343
343
  <tr>
344
344
  <td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNOCAydjQiLz48cGF0aCBkPSJNMTIgMnY0Ii8+PHBhdGggZD0iTTE2IDJ2NCIvPjxyZWN0IHdpZHRoPSIxNiIgaGVpZ2h0PSIxOCIgeD0iNCIgeT0iNCIgcng9IjIiLz48cGF0aCBkPSJNOCAxMGg2Ii8+PHBhdGggZD0iTTggMTRoOCIvPjxwYXRoIGQ9Ik04IDE4aDUiLz48L3N2Zz4K" width="20" height="20"></td>
345
345
  <td>Findings</td>
346
- <td>Opens or closes the Findings sidebar (see <a href="#6-findings-sidebar" onclick="(function(e){e.preventDefault();var g=e.target.closest('.wmap-guide');var el=g&&g.querySelector('[id=\\'6-findings-sidebar\\']');if(el)el.scrollIntoView({behavior:'smooth'});})(event)">Section 6</a>).</td>
346
+ <td>Opens or closes the Summary panel (see <a href="#6-summary-panel" onclick="(function(e){e.preventDefault();var g=e.target.closest('.wmap-guide');var el=g&&g.querySelector('[id=\\'6-summary-panel\\']');if(el)el.scrollIntoView({behavior:'smooth'});})(event)">Section 6</a>).</td>
347
347
  </tr>
348
348
  <tr>
349
349
  <td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMTAuMjkgMy44NiAxLjgyIDE4YTIgMiAwIDAgMCAxLjcxIDNoMTYuOTRhMiAyIDAgMCAwIDEuNzEtM0wxMy43MSAzLjg2YTIgMiAwIDAgMC0zLjQyIDB6Ii8+PHBhdGggZD0iTTEyIDl2NCIvPjxwYXRoIGQ9Ik0xMiAxN2guMDEiLz48L3N2Zz4K" width="20" height="20"></td>
@@ -365,6 +365,13 @@ without closing it; click it again to restore.</p>
365
365
  that bin and dim all others. Click again to clear. Useful for isolating a specific
366
366
  failure category across the wafer.</p>
367
367
  <div data-wmap-demo="bin-highlight" class="wmap-demo"></div><p><em>Bin 2 (Fail) highlighted \u2014 all other bins are dimmed.</em></p>
368
+ <p><strong>Bin colours</strong> \u2014 a bin&#39;s colour tells you whether it passed before you read the legend:
369
+ passing bins are always shades of green and failing bins never are, whichever bin numbers
370
+ your test program uses. The bins with the most dies get the most distinct colours. In a
371
+ gallery the colours are worked out across every wafer it shows, so a bin is the same
372
+ colour on every card. If there are more bins than the colour scheme has distinct colours, some bins
373
+ have to share one \u2014 a <strong>Data warnings</strong> entry names them, and you can tell them apart with
374
+ the legend, the tooltip, or by highlighting one bin at a time.</p>
368
375
  <h3 id="overlays">Overlays</h3>
369
376
  <p>Use the <strong>Overlays</strong> menu to toggle optional display layers on and off:</p>
370
377
  <ul>
@@ -445,7 +452,7 @@ failure category across the wafer.</p>
445
452
  <tr>
446
453
  <td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Im0xNC42MjIgMTcuODk3LTEwLjY4LTIuOTEzIi8+PHBhdGggZD0iTTE4LjM3NiAyLjYyMmExIDEgMCAxIDEgMy4wMDIgMy4wMDJMMTcuMzYgOS42NDNhLjUuNSAwIDAgMCAwIC43MDdsLjk0NC45NDRhMi40MSAyLjQxIDAgMCAxIDAgMy40MDhsLS45NDQuOTQ0YS41LjUgMCAwIDEtLjcwNyAwTDguMzU0IDcuMzQ4YS41LjUgMCAwIDEgMC0uNzA3bC45NDQtLjk0NGEyLjQxIDIuNDEgMCAwIDEgMy40MDggMGwuOTQ0Ljk0NGEuNS41IDAgMCAwIC43MDcgMHoiLz48cGF0aCBkPSJNOSA4Yy0xLjgwNCAyLjcxLTMuOTcgMy40Ni02LjU4MyAzLjk0OGEuNTA3LjUwNyAwIDAgMC0uMzAyLjgxOWw3LjMyIDguODgzYTEgMSAwIDAgMCAxLjE4NS4yMDRDMTIuNzM1IDIwLjQwNSAxNiAxNi43OTIgMTYgMTUiLz48L3N2Zz4K" width="20" height="20"></td>
447
454
  <td>Colour scheme</td>
448
- <td>Switches the colour palette for all cards.</td>
455
+ <td>Picks bin colours (bin modes) or value colours (other modes) for all cards.</td>
449
456
  </tr>
450
457
  <tr>
451
458
  <td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIi8+PHBvbHlnb24gcG9pbnRzPSIxNi4yNCA3Ljc2IDE0LjEyIDE0LjEyIDcuNzYgMTYuMjQgOS44OCA5Ljg4IDE2LjI0IDcuNzYiIGZpbGw9IiMzNzQxNTEiIHN0cm9rZT0ibm9uZSIvPjwvc3ZnPgo=" width="20" height="20"></td>
@@ -484,18 +491,18 @@ failure category across the wafer.</p>
484
491
  </tr>
485
492
  <tr>
486
493
  <td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNOCAydjQiLz48cGF0aCBkPSJNMTIgMnY0Ii8+PHBhdGggZD0iTTE2IDJ2NCIvPjxyZWN0IHdpZHRoPSIxNiIgaGVpZ2h0PSIxOCIgeD0iNCIgeT0iNCIgcng9IjIiLz48cGF0aCBkPSJNOCAxMGg2Ii8+PHBhdGggZD0iTTggMTRoOCIvPjxwYXRoIGQ9Ik04IDE4aDUiLz48L3N2Zz4K" width="20" height="20"></td>
487
- <td>Findings</td>
488
- <td>Opens or closes the lot-level Findings sidebar.</td>
494
+ <td>Summary panel</td>
495
+ <td>Opens or closes the Summary panel covering every wafer in the gallery.</td>
489
496
  </tr>
490
497
  <tr>
491
498
  <td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMyAzdjE4aDE4Ii8+PHBhdGggZD0iTTE4IDE3VjkiLz48cGF0aCBkPSJNMTMgMTdWNSIvPjxwYXRoIGQ9Ik04IDE3di0zIi8+PC9zdmc+Cg==" width="20" height="20"></td>
492
499
  <td>Insights</td>
493
- <td>Swaps the grid for a lot-wide chart suite \u2014 yield, bin breakdown, process capability, and more (see <a href="#8-insights-tab" onclick="(function(e){e.preventDefault();var g=e.target.closest('.wmap-guide');var el=g&&g.querySelector('[id=\\'8-insights-tab\\']');if(el)el.scrollIntoView({behavior:'smooth'});})(event)">Section 8</a>). Only shown when the application has enabled it.</td>
500
+ <td>Swaps the grid for a chart suite covering every wafer \u2014 yield, bin breakdown, process capability, and more (see <a href="#8-insights-tab" onclick="(function(e){e.preventDefault();var g=e.target.closest('.wmap-guide');var el=g&&g.querySelector('[id=\\'8-insights-tab\\']');if(el)el.scrollIntoView({behavior:'smooth'});})(event)">Section 8</a>). Only shown when the application has enabled it.</td>
494
501
  </tr>
495
502
  <tr>
496
503
  <td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMTAuMjkgMy44NiAxLjgyIDE4YTIgMiAwIDAgMCAxLjcxIDNoMTYuOTRhMiAyIDAgMCAwIDEuNzEtM0wxMy43MSAzLjg2YTIgMiAwIDAgMC0zLjQyIDB6Ii8+PHBhdGggZD0iTTEyIDl2NCIvPjxwYXRoIGQ9Ik0xMiAxN2guMDEiLz48L3N2Zz4K" width="20" height="20"></td>
497
504
  <td>Data warnings</td>
498
- <td>Appears only when something is worth reporting about the lot. Collected across every wafer and de-duplicated, so a problem affecting the whole lot is stated once rather than repeated per card.</td>
505
+ <td>Appears only when something is worth reporting about the wafers shown. Collected across every wafer and de-duplicated, so a problem affecting all of them is stated once rather than repeated per card.</td>
499
506
  </tr>
500
507
  <tr>
501
508
  <td><img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiMzNzQxNTEiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIvPjxwYXRoIGQ9Ik05LjA5IDlhMyAzIDAgMCAxIDUuODMgMWMwIDItMyAzLTMgMyIvPjxwYXRoIGQ9Ik0xMiAxN2guMDEiLz48L3N2Zz4K" width="20" height="20"></td>
@@ -600,26 +607,55 @@ findings (ring, quadrant, sector), the panel groups them together \u2014 the pat
600
607
  classification is the primary finding and the regional findings provide
601
608
  supporting detail.</p>
602
609
  <hr>
603
- <h2 id="6-findings-sidebar">6. Findings sidebar</h2>
604
- <p>The Findings sidebar shows detected anomalies for the current wafer or lot,
605
- always docked next to the map so a clicked finding can highlight the affected
606
- dies right there. Open it from the toolbar. Severity, kind, and region filter
607
- controls at the top of the sidebar narrow the list down.</p>
608
- <div data-wmap-demo="summary-panel" class="wmap-demo"></div><p><em>The Findings sidebar open alongside a single wafer. Click any finding to
609
- highlight the affected dies; use the filter controls to narrow by severity,
610
- kind, or region.</em></p>
611
- <p>Yield, bin breakdown, ring/quadrant regional yield, and per-test statistics \u2014
612
- previously shown in this same panel \u2014 now live in the
613
- <a href="#8-insights-tab" onclick="(function(e){e.preventDefault();var g=e.target.closest('.wmap-guide');var el=g&&g.querySelector('[id=\\'8-insights-tab\\']');if(el)el.scrollIntoView({behavior:'smooth'});})(event)">Insights tab</a>&#39;s Overview sub-tab instead, since that content
614
- doesn&#39;t need the map on screen the way a finding&#39;s highlight does.</p>
610
+ <h2 id="6-summary-panel">6. Summary panel</h2>
611
+ <p>The Summary panel docks next to the map and gives you the wafer or lot at a
612
+ glance, with findings sitting directly under the headline numbers so a clicked
613
+ finding can highlight the affected dies right there. Open it from the toolbar.</p>
614
+ <div data-wmap-demo="summary-panel" class="wmap-demo"></div><p><em>The Summary panel open alongside a single wafer. Click any finding to
615
+ highlight the affected dies.</em></p>
616
+ <p>Sections, top to bottom:</p>
617
+ <ul>
618
+ <li><strong>Summary</strong> \u2014 die and wafer counts, yield, and the population the rest of the
619
+ panel is computed over. For several wafers the heading names them: <strong>Lot
620
+ LOT123 \xB7 13 wafers</strong> when every wafer comes from that one lot, otherwise
621
+ <strong>26 wafers from 2 lots</strong> (or just <strong>13 wafers</strong> when the data records no lot).
622
+ The panel only says &quot;lot&quot; when it really is one lot. &quot;Mean wafer yield&quot; is an
623
+ <em>unweighted</em> mean of each wafer&#39;s own yield; it is deliberately not the same
624
+ statistic as the bin breakdown&#39;s pass-bin share, which weights every die
625
+ equally. The two agree only when die counts are even across the wafers.</li>
626
+ <li><strong>Findings</strong> \u2014 detected anomalies, most severe first. Severity chips narrow
627
+ the list; Kind and Region dropdowns appear once there are enough findings to
628
+ be worth narrowing.</li>
629
+ <li><strong>Bin breakdown</strong> \u2014 bars as a share of dies, pass bins first and then failing
630
+ bins by descending count, so the dominant failure mode is at the top. It
631
+ follows the map&#39;s plot mode: a soft-bin map gets a soft-bin breakdown. When a
632
+ wafer carries both bin types, a <strong>Hard / Soft</strong> selector in the section header
633
+ overrides that.</li>
634
+ <li><strong>Region yield</strong> \u2014 ring yield by default, with a <strong>Ring / Quadrant</strong> selector.
635
+ Ring is the default because edge roll-off is the pattern that dominates real
636
+ wafer maps; a genuinely asymmetric quadrant is reported as a finding above,
637
+ with a significance test behind it.</li>
638
+ <li><strong>Wafer yield</strong> (several wafers only) \u2014 one bar per wafer with the median
639
+ marked. Wafers are in slot order by default, since that is what makes a
640
+ slot-correlated pattern visible; a <strong>Slot / Yield</strong> selector re-sorts. Wafers
641
+ far below the rest are labelled &quot;low outlier&quot;.</li>
642
+ <li><strong>Test values</strong> \u2014 per test: mean, <strong>Ppk</strong>, and spec yield. Ppk (not Cpk)
643
+ because it measures against the <em>overall</em> spread, including wafer-to-wafer
644
+ variation, which is what the dies actually ship against. The full descriptive
645
+ statistics \u2014 min, quartiles, median, max, \u03C3, both spec limits, and all four
646
+ capability indices \u2014 are in the summary report and the CSV export.</li>
647
+ <li><strong>Functional tests</strong> \u2014 pass/fail counts and pass rate per functional test.</li>
648
+ </ul>
649
+ <p>Every section header can be collapsed, and stays collapsed as the panel
650
+ re-renders.</p>
615
651
  <p>A <strong>Summary report</strong> button (when present) opens a printable full-detail
616
- report in a new window or tab, still covering everything findings-adjacent \u2014
617
- yield, bin breakdown, ring and quadrant statistics, per-test statistics, and
618
- the findings list \u2014 and can be saved as a PDF from your browser&#39;s print
619
- dialog.</p>
652
+ report \u2014 yield, bin breakdown, ring and quadrant statistics, the full per-test
653
+ table with Cp/Cpk/Pp/Ppk, and the findings list \u2014 and can be saved as a PDF
654
+ from your browser&#39;s print dialog.</p>
620
655
  <h3 id="why-some-findings-name-two-bins">Why some findings name two bins</h3>
621
- <p>A finding may read <strong>&quot;hard bin 3 and soft bin 3 (same dies)&quot;</strong>. That is one
656
+ <p>A finding may read <strong>&quot;hard bin and soft bin 3 (Fail) (same dies)&quot;</strong>. That is one
622
657
  group of dies counted in two bin spaces, not two separate groups added together.
658
+ (When the two bins carry different names, both are spelled out in full.)
623
659
  Hard and soft bins are independent numbering systems, so this wording appears
624
660
  only when the two happen to cover exactly the same dies \u2014 reporting it twice
625
661
  would look like two independent problems.</p>
@@ -629,9 +665,11 @@ itself: &quot;pass-bin occurrence is 22 points lower&quot; and &quot;yield is 22
629
665
  are the same sentence.</p>
630
666
  <p>Nothing is discarded \u2014 an application reading the findings programmatically
631
667
  still receives every one of them.</p>
632
- <p>For <strong>lot-level views</strong> (gallery), the sidebar shows lot-level findings by
633
- default, with a <strong>Wafers</strong> tab listing every wafer that has its own per-wafer
634
- findings \u2014 click a row to open that wafer.</p>
668
+ <p>For <strong>lot-level views</strong> (gallery), the panel shows lot-level findings, and the
669
+ <strong>Wafer Yield</strong> section badges each wafer with its own findings count \u2014 click a
670
+ row to open that wafer. There is no separate wafers tab: every wafer appears in
671
+ that one list, including the ones with no findings, which is what lets you see a
672
+ low-yielding wafer that nothing flagged.</p>
635
673
  <hr>
636
674
  <h2 id="7-lot-stack-maps">7. Lot-stack maps</h2>
637
675
  <p>A lot-stack map combines multiple individual wafer results into a single
@@ -715,16 +753,52 @@ hides the other&#39;s toolbar button, since Findings has nothing to highlight
715
753
  against once the map is replaced.</p>
716
754
  <p>Insights is organized into three sub-tabs:</p>
717
755
  <ul>
718
- <li><strong>Overview</strong> \u2014 a yield bar (labelled with the pass bins actually in use), a
719
- hard/soft bin pareto, and ring/quadrant regional yield and per-test
720
- min/mean/max/spec-yield statistics.</li>
721
- <li><strong>Distributions</strong> \u2014 process capability (Cp/Cpk/Pp/Ppk for tests with both a
756
+ <li><p><strong>Overview</strong> \u2014 a <strong>test pass rate</strong> chart showing which test fails most (and,
757
+ with &quot;Group by&quot; active, whether it fails more in one split than another). It
758
+ offers up to three ways of judging, whichever the data supports: <strong>Spec
759
+ limits</strong> (the value against its limits), <strong>Tester flag</strong> (the pass/fail the
760
+ tester itself recorded, which a parametric test carries whether or not limits
761
+ were exported), and <strong>Functional</strong> for pass/fail-only tests. The two
762
+ parametric views can disagree \u2014 guard bands and dynamic limits routinely cause
763
+ it \u2014 so the card reports how many dies the two judged differently rather than
764
+ picking one for you. Alongside it, headline tiles stating the population (wafers, dies analysed,
765
+ and for a lot the mean wafer yield \u2014 an <em>unweighted</em> mean of each wafer&#39;s own
766
+ yield, not the die-weighted figure), a yield bar labelled with the pass bins
767
+ actually in use and marked with the median, a hard/soft bin pareto, and
768
+ ring/quadrant regional yield plus the full per-test statistics table.</p>
769
+ </li>
770
+ <li><p><strong>Distributions</strong> \u2014 process capability (Cp/Cpk/Pp/Ppk for tests with both a
722
771
  lower and upper spec limit; tests missing a spec still appear, normalized
723
- onto their own range and sorted by variability), a test-value box plot, and
724
- a value histogram. Clicking a capability box drives the box plot and
725
- histogram onto that same test automatically.</li>
726
- <li><strong>Correlation</strong> \u2014 a test-to-test correlation matrix and a die-level scatter
727
- plot. Clicking a matrix cell drives the scatter plot onto that pair.</li>
772
+ onto their own range and sorted by variability), a test-value box plot, a
773
+ value histogram, and a <strong>wafer-to-wafer trend</strong> \u2014 one point per wafer at its
774
+ mean, \xB11\u03C3 whiskers, the mean of all wafers dashed across (labelled the &quot;lot
775
+ mean&quot; when they all come from one lot), and spec limits where the
776
+ test has them. The trend is always in slot order, deliberately: drift across
777
+ a cassette only reads in the physical sequence, so there is no sort control
778
+ to destroy it. Clicking a capability box drives the box plot, histogram and
779
+ trend onto that same test automatically.</p>
780
+ <p>The box plot, histogram and trend share one row of axis controls, kept in
781
+ sync across all three so switching between them never re-reads the same
782
+ data on a different scale: <strong>Axis includes limits</strong> widens the axis to cover
783
+ LSL/USL even where the data sits well clear of them (on by default only when
784
+ doing so still leaves the data at least a third of the axis \u2014 otherwise a
785
+ generous spec window would squash a perfectly capable distribution into a
786
+ sliver), and <strong>Clip outliers</strong> narrows the axis to a robust range (the
787
+ Tukey fence, 1.5\xD7 IQR beyond Q1/Q3) so a handful of extreme values don&#39;t
788
+ stretch the axis until the rest of the distribution reads as a flat line.
789
+ Clipping affects the AXIS only \u2014 every reported statistic (mean, \u03C3, Cpk,
790
+ the box&#39;s own five-number summary) is computed from every value; nothing is
791
+ excluded from the numbers, and the panel states how many points sit outside
792
+ the visible range when some do. The box plot additionally has its own
793
+ <strong>Log scale</strong> toggle, independent of the shared pair above (available once
794
+ every plotted value is positive) \u2014 the histogram and trend charts do not
795
+ offer one.</p>
796
+ </li>
797
+ <li><p><strong>Correlation</strong> \u2014 a test-to-test correlation matrix and a die-level scatter
798
+ plot, both stating the sample size the coefficients are computed over.
799
+ Clicking a matrix cell drives the scatter plot onto that pair, where <code>r</code> and
800
+ <code>n</code> for that pair are printed and update as you filter the legend.</p>
801
+ </li>
728
802
  </ul>
729
803
  <p>In a gallery with more than one wafer, a <strong>Group by</strong> control appears whenever
730
804
  wafer metadata (lot, product, test program, temperature, split, or a custom
@@ -1,3 +1,3 @@
1
- export declare const WMAP_VERSION = "0.26.1";
2
- export declare const WMAP_BUILD_TIME = "2026-08-28T14:51:07.720Z";
1
+ export declare const WMAP_VERSION = "0.28.0";
2
+ export declare const WMAP_BUILD_TIME = "2026-09-11T18:13:58.943Z";
3
3
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- export const WMAP_VERSION="0.26.1",WMAP_BUILD_TIME="2026-08-28T14:51:07.720Z";
1
+ export const WMAP_VERSION="0.28.0",WMAP_BUILD_TIME="2026-09-11T18:13:58.943Z";
@@ -41,11 +41,32 @@ export declare function collectWarnings(sources: {
41
41
  result?: Partial<Pick<WaferMapResult, 'warnings'>> | null;
42
42
  statsSummary?: StatsSummary | null;
43
43
  lotStatsSummary?: LotStatsSummary | null;
44
+ /** Advisories about the VIEW rather than the data — e.g. `bin-colours-shared`,
45
+ * which depends on the plot mode and palette on screen. Raised by the
46
+ * renderer that owns the view. */
47
+ extra?: readonly WaferWarning[];
44
48
  }): WaferWarning[];
45
49
  /**
46
50
  * The Summary panel banner. One block per severity present, so an "dies may be
47
51
  * mis-positioned" error is never visually flattened into an advisory.
48
52
  */
53
+ /**
54
+ * One-line summaries, by `code`.
55
+ *
56
+ * These advisories explain a geometry decision and its consequences, so the
57
+ * prose is necessarily long — the `inferred-pitch` message runs to about ten
58
+ * lines in a 300px panel. Rendered in full and undismissable, it pushed the
59
+ * panel's actual content (the yield figures, the findings) below the fold on
60
+ * every open of every wafer in a lot with inferred geometry, which is the
61
+ * common case for the data this library exists to plot. Worse, it is
62
+ * per-result and unchanging: once read it carries no new information, but it
63
+ * cost the same space every time.
64
+ *
65
+ * Keyed on `code` rather than derived from the message, because the messages
66
+ * are prose and may be reworded — the same rule hosts are told to follow when
67
+ * branching on these.
68
+ */
69
+ export declare const SHORT_LABEL: Record<string, string>;
49
70
  export declare function buildWarningsBanner(warnings: WaferWarning[], ownerDocument?: Document): HTMLDivElement;
50
71
  /**
51
72
  * The popup opened by the toolbar's warning indicator.
@@ -1 +1 @@
1
- import{CLR as r,Z_BASE as E}from"./toolbar.js";const b={error:0,warning:1,info:2};export function severityOf(e){return e.severity??"warning"}export function collectWarnings(e){const s=[],i=new Set,n=t=>{if(!t?.message)return;const o=`${t.code}\0${t.message}`;i.has(o)||(i.add(o),s.push(t))};for(const t of e.result?.warnings??[])n(t);for(const t of e.statsSummary?.stats.warnings??[])n(t);for(const t of e.lotStatsSummary?.perWafer??[])for(const o of t.summary.stats.warnings??[])n(o);return s.sort((t,o)=>b[severityOf(t)]-b[severityOf(o)])}function h(e){return e==="error"?{bg:r.errBg,border:r.errBorder,text:r.errText}:{bg:r.warnBg,border:r.warnBorder,text:r.warnText}}function w(e){return e==="error"?"\u26D4":e==="info"?"\u2139":"\u26A0"}export function buildWarningsBanner(e,s=document){const i=s.createElement("div");Object.assign(i.style,{marginBottom:"10px"});for(const n of e){const t=severityOf(n),o=h(t),a=s.createElement("div");Object.assign(a.style,{background:o.bg,border:`1px solid ${o.border}`,borderRadius:"4px",padding:"7px 9px",marginBottom:"6px",fontSize:"10px",color:o.text,lineHeight:"1.5"}),a.setAttribute("role","status"),a.textContent=`${w(t)} ${n.message}`,i.appendChild(a)}return i}export function buildWarningsMenuEl(e,s,i=window){const n=i.document,t=n.createElement("div"),o=280,y=e.left+o<=(i.innerWidth??1/0)?e.left:Math.max(4,e.right-o);Object.assign(t.style,{position:"fixed",top:`${e.bottom+4}px`,left:`${y}px`,background:r.menuBg,border:`1px solid ${r.menuBorder}`,borderRadius:"4px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",zIndex:E,width:`${o}px`,maxHeight:"320px",overflowY:"auto",padding:"4px 0",pointerEvents:"auto"}),t.setAttribute("role","dialog"),t.setAttribute("aria-label","Data warnings");const p=n.createElement("div");Object.assign(p.style,{padding:"6px 12px 4px",fontSize:"10px",fontWeight:"700",letterSpacing:"0.06em",textTransform:"uppercase",color:r.label}),p.textContent=s.length===1?"1 warning":`${s.length} warnings`,t.appendChild(p);for(const l of s){const f=severityOf(l),m=h(f),d=n.createElement("div");Object.assign(d.style,{display:"flex",gap:"8px",padding:"8px 12px",fontSize:"11px",lineHeight:"1.5",color:r.text,borderTop:`1px solid ${r.menuBorder}`,alignItems:"flex-start"});const c=n.createElement("span");Object.assign(c.style,{color:m.text,flexShrink:"0"}),c.textContent=w(f),d.appendChild(c);const g=n.createElement("div"),x=n.createElement("div");Object.assign(x.style,{fontWeight:"700",color:m.text,marginBottom:"2px"}),x.textContent=l.code,g.appendChild(x);const u=n.createElement("div");u.textContent=l.message,g.appendChild(u),d.appendChild(g),t.appendChild(d)}return t}
1
+ import{SHADOW as w,TRACKING as O,SPACE as s,RADIUS as E,FONT as y,CLR as d,Z_BASE as A}from"./toolbar.js";const $={error:0,warning:1,info:2};export function severityOf(t){return t.severity??"warning"}export function collectWarnings(t){const o=[],i=new Set,n=e=>{if(!e?.message)return;const r=`${e.code}\0${e.message}`;i.has(r)||(i.add(r),o.push(e))};for(const e of t.result?.warnings??[])n(e);for(const e of t.statsSummary?.stats.warnings??[])n(e);for(const e of t.lotStatsSummary?.perWafer??[])for(const r of e.summary.stats.warnings??[])n(r);for(const e of t.extra??[])n(e);return o.sort((e,r)=>$[severityOf(e)]-$[severityOf(r)])}function v(t){return t==="error"?{bg:d.errBg,border:d.errBorder,text:d.errText}:{bg:d.warnBg,border:d.warnBorder,text:d.warnText}}function C(t){return t==="error"?"\u26D4":t==="info"?"\u2139":"\u26A0"}export const SHORT_LABEL={"partial-coverage":"Partial wafer coverage","geometry-conflict":"Geometry conflict","non-standard-diameter":"Non-standard wafer diameter","diameter-exceeds-die-extent":"Diameter exceeds die extent","edge-exclusion-exceeds-radius":"Edge exclusion exceeds radius","test-count-capped":"Test analysis skipped","test-def-collision":"Test definitions disagree","analysis-option-corrected":"Analysis option corrected"};function S(t){const o=t.code?SHORT_LABEL[t.code]:void 0;if(o)return o;const i=t.message.split(/(?<=\.)\s/)[0]??t.message;return i.length>60?`${i.slice(0,57)}\u2026`:i}export function buildWarningsBanner(t,o=document){const i=o.createElement("div");Object.assign(i.style,{marginBottom:s.lg});for(const n of t){const e=severityOf(n),r=v(e),m=o.createElement("div");Object.assign(m.style,{background:r.bg,border:`1px solid ${r.border}`,borderRadius:E.control,marginBottom:s.sm,fontSize:y.body,color:r.text,lineHeight:"1.5"}),m.setAttribute("role","status");const a=o.createElement("button");a.type="button",Object.assign(a.style,{display:"flex",alignItems:"center",gap:s.sm,width:"100%",background:"none",border:"none",font:"inherit",color:"inherit",textAlign:"left",padding:`${s.sm} ${s.lg}`,cursor:"pointer"});const g=o.createElement("span");Object.assign(g.style,{flex:"1",minWidth:"0"}),g.textContent=`${C(e)} ${S(n)}`;const l=o.createElement("span");Object.assign(l.style,{flexShrink:"0"}),a.append(g,l);const p=o.createElement("div");Object.assign(p.style,{padding:`0 ${s.lg} ${s.sm}`}),p.textContent=n.message;let c=!1;const f=()=>{l.textContent=c?"\u25B4":"\u25BE",p.style.display=c?"block":"none",a.setAttribute("aria-expanded",String(c)),a.setAttribute("aria-label",`${S(n)}. ${c?"Click to collapse.":"Click to expand for detail."}`)};f(),a.addEventListener("click",()=>{c=!c,f()}),a.addEventListener("mouseenter",()=>{l.style.opacity="0.65"}),a.addEventListener("mouseleave",()=>{l.style.opacity="1"}),m.append(a,p),i.appendChild(m)}return i}export function buildWarningsMenuEl(t,o,i=window){const n=i.document,e=n.createElement("div"),r=280,a=t.left+r<=(i.innerWidth??1/0)?t.left:Math.max(4,t.right-r);Object.assign(e.style,{position:"fixed",top:`${t.bottom+4}px`,left:`${a}px`,background:d.menuBg,border:`1px solid ${d.menuBorder}`,borderRadius:E.control,boxShadow:w.menu,zIndex:A,width:`${r}px`,maxHeight:"320px",overflowY:"auto",padding:"4px 0",pointerEvents:"auto"}),e.setAttribute("role","dialog"),e.setAttribute("aria-label","Data warnings");const g=n.createElement("div");Object.assign(g.style,{padding:`${s.sm} ${s.xl} ${s.xs}`,fontSize:y.body,fontWeight:"700",letterSpacing:O,textTransform:"uppercase",color:d.label}),g.textContent=o.length===1?"1 warning":`${o.length} warnings`,e.appendChild(g);for(const l of o){const p=severityOf(l),c=v(p),f=n.createElement("div");Object.assign(f.style,{display:"flex",gap:s.md,padding:`${s.md} ${s.xl}`,fontSize:y.body,lineHeight:"1.5",color:d.text,borderTop:`1px solid ${d.menuBorder}`,alignItems:"flex-start"});const x=n.createElement("span");Object.assign(x.style,{color:c.text,flexShrink:"0"}),x.textContent=C(p),f.appendChild(x);const u=n.createElement("div"),b=n.createElement("div");Object.assign(b.style,{fontWeight:"700",color:c.text,marginBottom:s.xxs}),b.textContent=l.code,u.appendChild(b);const h=n.createElement("div");h.textContent=l.message,u.appendChild(h),f.appendChild(u),e.appendChild(f)}return e}
@@ -144,6 +144,17 @@ export declare function getDieKey(die: {
144
144
  id?: string;
145
145
  }): string;
146
146
  export declare function isYieldEligibleDie(die: Die, options?: DieEligibilityOptions): boolean;
147
+ /**
148
+ * Whether a die passed: its hard bin (else its soft bin) is in `passBins`.
149
+ * `undefined` when the die carries no bin at all — no verdict, never a fail.
150
+ *
151
+ * THE per-die pass rule. Yield, the failing-die hatch and bin colouring all
152
+ * judge a die through this, so the map cannot call a die failing that the yield
153
+ * figure beside it counted as passing. Note it judges the DIE, not whichever
154
+ * bin is being plotted: in soft-bin mode the plotted bin is a soft bin, and
155
+ * testing that number against hard pass bins answers a different question.
156
+ */
157
+ export declare function diePassStatus(die: Pick<Die, 'hbin' | 'sbin'>, passBins: ReadonlySet<number>): boolean | undefined;
147
158
  /**
148
159
  * Generate a rectangular grid of dies centered on the wafer.
149
160
  * Each die carries its width/height for use by the renderer.
@@ -1 +1 @@
1
- export function hasPosition(e){return e.x!=null&&e.y!=null}export function isPositionedDie(e){return e.x!=null&&e.y!=null}export function getDieKey(e){return hasPosition(e)?`${e.x},${e.y}`:`id:${e.id}`}export function isYieldEligibleDie(e,t={}){return!(!t.includePartial&&e.partial||!t.includeEdgeExcluded&&e.edgeExcluded)}export function generateDies(e,t){const{width:u,height:l,offset:o={x:0,y:0}}=t,i=t.gridSize??Math.ceil(e.radius/Math.min(u,l))+1,c=[];for(let n=-i;n<=i;n++)for(let r=-i;r<=i;r++){const s=e.center.x+r*u+o.x,x=e.center.y+n*l+o.y;c.push({id:`${r}_${n}`,x:r,y:n,physX:s,physY:x,width:u,height:l})}return c}
1
+ export function hasPosition(e){return e.x!=null&&e.y!=null}export function isPositionedDie(e){return e.x!=null&&e.y!=null}export function getDieKey(e){return hasPosition(e)?`${e.x},${e.y}`:`id:${e.id}`}export function isYieldEligibleDie(e,n={}){return!(!n.includePartial&&e.partial||!n.includeEdgeExcluded&&e.edgeExcluded)}export function diePassStatus(e,n){const t=e.hbin??e.sbin;return t===void 0?void 0:n.has(t)}export function generateDies(e,n){const{width:t,height:o,offset:s={x:0,y:0}}=n,u=n.gridSize??Math.ceil(e.radius/Math.min(t,o))+1,l=[];for(let i=-u;i<=u;i++)for(let r=-u;r<=u;r++){const c=e.center.x+r*t+s.x,d=e.center.y+i*o+s.y;l.push({id:`${r}_${i}`,x:r,y:i,physX:c,physY:d,width:t,height:o})}return l}
@@ -57,4 +57,15 @@ export declare function percentile98(values: number[]): number;
57
57
  * For pitch estimation, values should be pre-rounded to absorb noise.
58
58
  */
59
59
  export declare function modeOf(values: number[]): number | null;
60
+ /**
61
+ * CSV field escaper — quoting plus the formula-injection guard above.
62
+ *
63
+ * Lives here rather than in `canvas-adapter/summaryPanel.ts`, its original home:
64
+ * it is a pure string function with no DOM, and it now has consumers in the
65
+ * summary panel, the die list AND the correlation chart. Importing summaryPanel
66
+ * from a chart to reach it would have inverted the dependency (summaryPanel
67
+ * already imports charts/chartShell), so the third consumer made the wrong home
68
+ * obvious. Every CSV this library writes must go through it.
69
+ */
70
+ export declare function csvField(value: string): string;
60
71
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- export function compareNatural(t,n){return t.localeCompare(n,"en",{numeric:!0})}export function prettyKey(t){return t.replace(/([A-Z])/g," $1").replace(/_/g," ").trim().replace(/^./,n=>n.toUpperCase())}export function clamp01(t){return Math.max(0,Math.min(1,t))}export function mean(t){if(t.length===0)return NaN;let n=0;for(const e of t)n+=e;return n/t.length}export function medianOfSorted(t){const n=t.length;if(n===0)return 0;const e=Math.floor(n/2);return n%2===1?t[e]:(t[e-1]+t[e])/2}export function median(t){return medianOfSorted([...t].sort((n,e)=>n-e))}export function percentile98(t){if(t.length===0)return 0;const n=[...t].sort((o,r)=>o-r),e=Math.floor(n.length*.98);return n[Math.min(e,n.length-1)]}export function modeOf(t){if(!t.length)return null;const n=new Map;for(const r of t)n.set(r,(n.get(r)??0)+1);let e=0,o=t[0];for(const[r,c]of n)c>e&&(e=c,o=r);return o}
1
+ export function compareNatural(t,n){return t.localeCompare(n,"en",{numeric:!0})}export function prettyKey(t){return t.replace(/([A-Z])/g," $1").replace(/_/g," ").trim().replace(/^./,n=>n.toUpperCase())}export function clamp01(t){return Math.max(0,Math.min(1,t))}export function mean(t){if(t.length===0)return NaN;let n=0;for(const r of t)n+=r;return n/t.length}export function medianOfSorted(t){const n=t.length;if(n===0)return 0;const r=Math.floor(n/2);return n%2===1?t[r]:(t[r-1]+t[r])/2}export function median(t){return medianOfSorted([...t].sort((n,r)=>n-r))}export function percentile98(t){if(t.length===0)return 0;const n=[...t].sort((o,e)=>o-e),r=Math.floor(n.length*.98);return n[Math.min(r,n.length-1)]}export function modeOf(t){if(!t.length)return null;const n=new Map;for(const e of t)n.set(e,(n.get(e)??0)+1);let r=0,o=t[0];for(const[e,c]of n)c>r&&(r=c,o=e);return o}const i=/^[=+\-@]/;export function csvField(t){const n=i.test(t)&&Number.isNaN(Number(t))?`'${t}`:t;return/[",\n\r]/.test(n)?`"${n.replace(/"/g,'""')}"`:n}
@@ -0,0 +1,80 @@
1
+ import type { Die } from '../core/dies.js';
2
+ import type { BinDef, WaferWarning } from './buildWaferMap.js';
3
+ /**
4
+ * Resolved bin → colour assignments for one population, per bin type.
5
+ *
6
+ * Plain Maps, not functions, so a View carrying them survives the worker's
7
+ * structured clone. Hard and soft bins are independent number spaces, so they
8
+ * are resolved and looked up separately — hard bin 3 and soft bin 3 are
9
+ * different categories and usually different colours.
10
+ */
11
+ export interface BinColors {
12
+ hard: Map<number, string>;
13
+ soft: Map<number, string>;
14
+ /**
15
+ * Bins drawn in a colour that another bin of the same type also has — the
16
+ * population has more pass or fail bins than the palette has colours, or a
17
+ * defined colour duplicates one. Empty when every bin is distinguishable by
18
+ * colour alone. Ascending bin number.
19
+ */
20
+ shared: {
21
+ hard: number[];
22
+ soft: number[];
23
+ };
24
+ }
25
+ export interface BinColorOptions {
26
+ /** Which bins pass. Default `[1]`. Must match the `passBins` behind the yield figure. */
27
+ passBins?: readonly number[];
28
+ /** Registered bin palette name (`registerBinColorScheme`). Default `'default'`. */
29
+ binColorScheme?: string;
30
+ hbinDefs?: readonly BinDef[];
31
+ sbinDefs?: readonly BinDef[];
32
+ /**
33
+ * Honour `BinDef.color` where a definition supplies one. Default true —
34
+ * colours that arrive with the data (a site's standard bin colour sheet) win
35
+ * over the palette. The palette still colours every bin without one.
36
+ */
37
+ useDefinedBinColors?: boolean;
38
+ }
39
+ /**
40
+ * Assign every bin present in `dies` a colour — the ONE rule for bin colour,
41
+ * shared by the map, its legends, the summary panels and the Insights charts.
42
+ *
43
+ * Why not a function of the bin number, as it used to be:
44
+ * - **Pass/fail comes from `passBins`, never the number.** Passing bins take
45
+ * the palette's pass colours (greens) and failing bins its fail colours, so
46
+ * with `passBins: [1, 3]` bin 3 is green and a failing bin 12 is not. Keying
47
+ * colour on the number made bin 1 green even when it failed.
48
+ * - **Rank, not hash.** Bins are ordered by die count (then bin number) and
49
+ * take palette slots in that order, so the bins that dominate the map get
50
+ * the most distinct colours and no two bins collide until the palette is
51
+ * exhausted. Hashing collided from the start: two of the first sixteen soft
52
+ * bins shared a colour exactly.
53
+ * - **Soft bins are pass-aware too.** A soft bin passes when every die
54
+ * carrying it passes (by the same per-die rule yield uses); otherwise, or
55
+ * when no die says, it takes a fail colour. The library has the data to
56
+ * decide, so the caller never supplies it.
57
+ *
58
+ * A gallery resolves ONCE over every wafer it shows and hands the result to every
59
+ * card (`ViewOptions.binColors`), so a bin is the same colour on every wafer.
60
+ * A lone map resolves over its own dies.
61
+ */
62
+ export declare function resolveBinColors(dies: Iterable<Die>, options?: BinColorOptions): BinColors;
63
+ /**
64
+ * True when `colors` has an entry for every bin on these dies — i.e. it was
65
+ * resolved over a population that includes them. `buildView` checks this
66
+ * before trusting a caller-supplied assignment, since a stale one would leave
67
+ * real bins without a colour.
68
+ */
69
+ export declare function binColorsCover(colors: BinColors, dies: Iterable<Die>): boolean;
70
+ /**
71
+ * The advisory for bins sharing a colour on the bin map being shown, or null
72
+ * (none share, or `plotMode` is not a bin mode). One builder so the single map
73
+ * and the gallery word it identically.
74
+ *
75
+ * Severity `'warning'`: every die is still drawn correctly, but the viewer can
76
+ * no longer tell those bins apart by colour — an expected capability is
77
+ * degraded, which is what that level means.
78
+ */
79
+ export declare function binColorWarning(colors: BinColors, plotMode: string | undefined): WaferWarning | null;
80
+ //# sourceMappingURL=binColors.d.ts.map
@@ -0,0 +1 @@
1
+ import{diePassStatus as p}from"../core/dies.js";import{getBinColorScheme as m}from"./colorSchemes.js";export function resolveBinColors(r,o={}){const s=new Set(o.passBins??[1]),i=m(o.binColorScheme),l=o.useDefinedBinColors??!0,a=new Map,f=new Map,c=new Map;for(const e of r)if(e.hbin!=null&&a.set(e.hbin,(a.get(e.hbin)??0)+1),e.sbin!=null){f.set(e.sbin,(f.get(e.sbin)??0)+1);const n=p(e,s)===!0;c.set(e.sbin,(c.get(e.sbin)??!0)&&n)}const d=b(a,e=>s.has(e),i,l?o.hbinDefs:void 0),h=b(f,e=>c.get(e)===!0,i,l?o.sbinDefs:void 0);return{hard:d.colors,soft:h.colors,shared:{hard:d.shared,soft:h.shared}}}export function binColorsCover(r,o){for(const s of o)if(s.hbin!=null&&!r.hard.has(s.hbin)||s.sbin!=null&&!r.soft.has(s.sbin))return!1;return!0}export function binColorWarning(r,o){const s=o==="softBin"?"soft":o==="hardBin"?"hard":null;if(!s)return null;const i=r.shared[s];if(!i.length)return null;const l=i.length>8?`${i.slice(0,8).join(", ")} and ${i.length-8} more`:i.join(", ");return{code:"bin-colors-shared",severity:"warning",message:`${s==="hard"?"Hard":"Soft"} bins ${l} are drawn in a colour another bin also has, so colour alone cannot tell them apart. There are more bins than the colour scheme has distinct colours (or a bin definition repeats one). Use the legend, the tooltip, or highlight one bin at a time.`}}function b(r,o,s,i){const l=new Map;for(const n of i??[])n.color&&l.set(n.bin,n.color);const a=new Map,f=[],c=[];for(const n of r.keys()){const t=l.get(n);t!==void 0?a.set(n,t):(o(n)?f:c).push(n)}const d=(n,t)=>r.get(t)-r.get(n)||n-t;for(const[n,t]of[[f,s.pass],[c,s.fail]])n.sort(d),n.forEach((u,g)=>a.set(u,t[g%t.length]));const h=new Map;for(const[n,t]of a){const u=t.toLowerCase();h.set(u,[...h.get(u)??[],n])}const e=[...h.values()].filter(n=>n.length>1).flat().sort((n,t)=>n-t);return{colors:a,shared:e}}