@ni/nimble-components 22.1.1 → 23.0.1

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 (44) hide show
  1. package/dist/all-components-bundle.js +280 -210
  2. package/dist/all-components-bundle.js.map +1 -1
  3. package/dist/all-components-bundle.min.js +3428 -3424
  4. package/dist/all-components-bundle.min.js.map +1 -1
  5. package/dist/esm/theme-provider/design-token-comments.js +24 -16
  6. package/dist/esm/theme-provider/design-token-comments.js.map +1 -1
  7. package/dist/esm/theme-provider/design-token-names.d.ts +1 -1
  8. package/dist/esm/theme-provider/design-token-names.js +25 -16
  9. package/dist/esm/theme-provider/design-token-names.js.map +1 -1
  10. package/dist/esm/theme-provider/design-tokens.d.ts +3 -2
  11. package/dist/esm/theme-provider/design-tokens.js +5 -3
  12. package/dist/esm/theme-provider/design-tokens.js.map +1 -1
  13. package/dist/esm/wafer-map/index.d.ts +13 -6
  14. package/dist/esm/wafer-map/index.js +33 -16
  15. package/dist/esm/wafer-map/index.js.map +1 -1
  16. package/dist/esm/wafer-map/modules/data-manager.js +1 -1
  17. package/dist/esm/wafer-map/modules/data-manager.js.map +1 -1
  18. package/dist/esm/wafer-map/modules/experimental/hover-handler.d.ts +23 -0
  19. package/dist/esm/wafer-map/modules/experimental/hover-handler.js +80 -0
  20. package/dist/esm/wafer-map/modules/experimental/hover-handler.js.map +1 -0
  21. package/dist/esm/wafer-map/modules/{worker-renderer.d.ts → experimental/worker-renderer.d.ts} +1 -1
  22. package/dist/esm/wafer-map/modules/{worker-renderer.js → experimental/worker-renderer.js} +1 -1
  23. package/dist/esm/wafer-map/modules/experimental/worker-renderer.js.map +1 -0
  24. package/dist/esm/wafer-map/modules/hover-handler.d.ts +10 -2
  25. package/dist/esm/wafer-map/modules/hover-handler.js +43 -26
  26. package/dist/esm/wafer-map/modules/hover-handler.js.map +1 -1
  27. package/dist/esm/wafer-map/modules/prerendering.d.ts +1 -3
  28. package/dist/esm/wafer-map/modules/prerendering.js +5 -6
  29. package/dist/esm/wafer-map/modules/prerendering.js.map +1 -1
  30. package/dist/esm/wafer-map/modules/wafer-map-validator.js +17 -23
  31. package/dist/esm/wafer-map/modules/wafer-map-validator.js.map +1 -1
  32. package/dist/esm/wafer-map/modules/zoom-handler.d.ts +11 -7
  33. package/dist/esm/wafer-map/modules/zoom-handler.js +27 -37
  34. package/dist/esm/wafer-map/modules/zoom-handler.js.map +1 -1
  35. package/dist/esm/wafer-map/template.d.ts +1 -1
  36. package/dist/esm/wafer-map/types.d.ts +11 -0
  37. package/dist/esm/wafer-map/types.js.map +1 -1
  38. package/dist/tokens-internal.scss +96 -48
  39. package/dist/tokens.scss +56 -32
  40. package/package.json +3 -3
  41. package/dist/esm/wafer-map/modules/event-coordinator.d.ts +0 -19
  42. package/dist/esm/wafer-map/modules/event-coordinator.js +0 -35
  43. package/dist/esm/wafer-map/modules/event-coordinator.js.map +0 -1
  44. package/dist/esm/wafer-map/modules/worker-renderer.js.map +0 -1
@@ -0,0 +1,23 @@
1
+ import type { WaferMap } from '../..';
2
+ /**
3
+ * HoverHandler deals with user interactions and events like hovering
4
+ */
5
+ export declare class HoverHandler {
6
+ private readonly wafermap;
7
+ constructor(wafermap: WaferMap);
8
+ /**
9
+ * @internal
10
+ */
11
+ connect(): void;
12
+ /**
13
+ * @internal
14
+ */
15
+ disconnect(): void;
16
+ /**
17
+ * @internal
18
+ * keep public for testing until data manager refactor
19
+ */
20
+ readonly onMouseMove: (event: MouseEvent) => void;
21
+ private readonly onMouseOut;
22
+ private calculateDieCoordinates;
23
+ }
@@ -0,0 +1,80 @@
1
+ import { WaferMapOriginLocation } from '../../types';
2
+ /**
3
+ * HoverHandler deals with user interactions and events like hovering
4
+ */
5
+ export class HoverHandler {
6
+ constructor(wafermap) {
7
+ this.wafermap = wafermap;
8
+ /**
9
+ * @internal
10
+ * keep public for testing until data manager refactor
11
+ */
12
+ this.onMouseMove = (event) => {
13
+ if (!this.wafermap.isExperimentalRenderer()) {
14
+ return;
15
+ }
16
+ // get original mouse position in case we are in zoom.
17
+ const invertedPoint = this.wafermap.transform.invert([
18
+ event.offsetX,
19
+ event.offsetY
20
+ ]);
21
+ // does not work yet until data manager will parse diesTable
22
+ const dieCoordinates = this.calculateDieCoordinates({
23
+ x: invertedPoint[0],
24
+ y: invertedPoint[1]
25
+ });
26
+ const colIndex = this.wafermap
27
+ .diesTable.getChild('colIndex')
28
+ .toArray();
29
+ const rowIndex = this.wafermap
30
+ .diesTable.getChild('rowIndex')
31
+ .toArray();
32
+ // will replace iterating with arquero filtering after fixing errors
33
+ for (let i = 0; i < colIndex.length; i++) {
34
+ if (colIndex[i] === dieCoordinates.x
35
+ && rowIndex[i] === dieCoordinates.y) {
36
+ this.wafermap.hoverDie = {
37
+ index: i,
38
+ x: dieCoordinates.x,
39
+ y: dieCoordinates.y
40
+ };
41
+ return;
42
+ }
43
+ }
44
+ this.wafermap.hoverDie = undefined;
45
+ };
46
+ this.onMouseOut = (_event) => {
47
+ this.wafermap.hoverDie = undefined;
48
+ };
49
+ }
50
+ /**
51
+ * @internal
52
+ */
53
+ connect() {
54
+ this.wafermap.addEventListener('mousemove', this.onMouseMove);
55
+ this.wafermap.addEventListener('mouseout', this.onMouseOut);
56
+ }
57
+ /**
58
+ * @internal
59
+ */
60
+ disconnect() {
61
+ this.wafermap.removeEventListener('mousemove', this.onMouseMove);
62
+ this.wafermap.removeEventListener('mouseout', this.onMouseOut);
63
+ }
64
+ calculateDieCoordinates(mousePosition) {
65
+ const originLocation = this.wafermap.originLocation;
66
+ const xRoundFunction = originLocation === WaferMapOriginLocation.bottomLeft
67
+ || originLocation === WaferMapOriginLocation.topLeft
68
+ ? Math.floor
69
+ : Math.ceil;
70
+ const yRoundFunction = originLocation === WaferMapOriginLocation.bottomLeft
71
+ || originLocation === WaferMapOriginLocation.bottomRight
72
+ ? Math.floor
73
+ : Math.ceil;
74
+ // go to x and y scale to get the x,y values of the die.
75
+ const x = xRoundFunction(this.wafermap.dataManager.invertedHorizontalScale(mousePosition.x - this.wafermap.dataManager.margin.left));
76
+ const y = yRoundFunction(this.wafermap.dataManager.invertedVerticalScale(mousePosition.y - this.wafermap.dataManager.margin.top));
77
+ return { x, y };
78
+ }
79
+ }
80
+ //# sourceMappingURL=hover-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover-handler.js","sourceRoot":"","sources":["../../../../../src/wafer-map/modules/experimental/hover-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAEvE;;GAEG;AACH,MAAM,OAAO,YAAY;IACrB,YAAoC,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;QAkBtD;;;WAGG;QACa,gBAAW,GAAG,CAAC,KAAiB,EAAQ,EAAE;YACtD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,EAAE,EAAE;gBACzC,OAAO;aACV;YACD,sDAAsD;YACtD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC;gBACjD,KAAK,CAAC,OAAO;gBACb,KAAK,CAAC,OAAO;aAChB,CAAC,CAAC;YAEH,4DAA4D;YAC5D,MAAM,cAAc,GAAG,IAAI,CAAC,uBAAuB,CAAC;gBAChD,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;gBACnB,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;aACtB,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;iBACzB,SAAU,CAAC,QAAQ,CAAC,UAAU,CAAE;iBAChC,OAAO,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;iBACzB,SAAU,CAAC,QAAQ,CAAC,UAAU,CAAE;iBAChC,OAAO,EAAE,CAAC;YAEf,oEAAoE;YACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACtC,IACI,QAAQ,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC;uBAC7B,QAAQ,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,EACrC;oBACE,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG;wBACrB,KAAK,EAAE,CAAC;wBACR,CAAC,EAAE,cAAc,CAAC,CAAC;wBACnB,CAAC,EAAE,cAAc,CAAC,CAAC;qBACtB,CAAC;oBACF,OAAO;iBACV;aACJ;YACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAC;QACvC,CAAC,CAAC;QAEe,eAAU,GAAG,CAAC,MAAkB,EAAQ,EAAE;YACvD,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAC;QACvC,CAAC,CAAC;IA/DuD,CAAC;IAE1D;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9D,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACI,UAAU;QACb,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACnE,CAAC;IAiDO,uBAAuB,CAC3B,aAA+B;QAE/B,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;QACpD,MAAM,cAAc,GAAG,cAAc,KAAK,sBAAsB,CAAC,UAAU;eACpE,cAAc,KAAK,sBAAsB,CAAC,OAAO;YACpD,CAAC,CAAC,IAAI,CAAC,KAAK;YACZ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAChB,MAAM,cAAc,GAAG,cAAc,KAAK,sBAAsB,CAAC,UAAU;eACpE,cAAc,KAAK,sBAAsB,CAAC,WAAW;YACxD,CAAC,CAAC,IAAI,CAAC,KAAK;YACZ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAChB,wDAAwD;QACxD,MAAM,CAAC,GAAG,cAAc,CACpB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,uBAAuB,CAC7C,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAC1D,CACJ,CAAC;QACF,MAAM,CAAC,GAAG,cAAc,CACpB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,qBAAqB,CAC3C,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CACzD,CACJ,CAAC;QACF,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACpB,CAAC;CACJ","sourcesContent":["import type { WaferMap } from '../..';\nimport { PointCoordinates, WaferMapOriginLocation } from '../../types';\n\n/**\n * HoverHandler deals with user interactions and events like hovering\n */\nexport class HoverHandler {\n public constructor(private readonly wafermap: WaferMap) {}\n\n /**\n * @internal\n */\n public connect(): void {\n this.wafermap.addEventListener('mousemove', this.onMouseMove);\n this.wafermap.addEventListener('mouseout', this.onMouseOut);\n }\n\n /**\n * @internal\n */\n public disconnect(): void {\n this.wafermap.removeEventListener('mousemove', this.onMouseMove);\n this.wafermap.removeEventListener('mouseout', this.onMouseOut);\n }\n\n /**\n * @internal\n * keep public for testing until data manager refactor\n */\n public readonly onMouseMove = (event: MouseEvent): void => {\n if (!this.wafermap.isExperimentalRenderer()) {\n return;\n }\n // get original mouse position in case we are in zoom.\n const invertedPoint = this.wafermap.transform.invert([\n event.offsetX,\n event.offsetY\n ]);\n\n // does not work yet until data manager will parse diesTable\n const dieCoordinates = this.calculateDieCoordinates({\n x: invertedPoint[0],\n y: invertedPoint[1]\n });\n const colIndex = this.wafermap\n .diesTable!.getChild('colIndex')!\n .toArray();\n const rowIndex = this.wafermap\n .diesTable!.getChild('rowIndex')!\n .toArray();\n\n // will replace iterating with arquero filtering after fixing errors\n for (let i = 0; i < colIndex.length; i++) {\n if (\n colIndex[i] === dieCoordinates.x\n && rowIndex[i] === dieCoordinates.y\n ) {\n this.wafermap.hoverDie = {\n index: i,\n x: dieCoordinates.x,\n y: dieCoordinates.y\n };\n return;\n }\n }\n this.wafermap.hoverDie = undefined;\n };\n\n private readonly onMouseOut = (_event: MouseEvent): void => {\n this.wafermap.hoverDie = undefined;\n };\n\n private calculateDieCoordinates(\n mousePosition: PointCoordinates\n ): PointCoordinates {\n const originLocation = this.wafermap.originLocation;\n const xRoundFunction = originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.topLeft\n ? Math.floor\n : Math.ceil;\n const yRoundFunction = originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.bottomRight\n ? Math.floor\n : Math.ceil;\n // go to x and y scale to get the x,y values of the die.\n const x = xRoundFunction(\n this.wafermap.dataManager.invertedHorizontalScale(\n mousePosition.x - this.wafermap.dataManager.margin.left\n )\n );\n const y = yRoundFunction(\n this.wafermap.dataManager.invertedVerticalScale(\n mousePosition.y - this.wafermap.dataManager.margin.top\n )\n );\n return { x, y };\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { WaferMap } from '..';
1
+ import type { WaferMap } from '../..';
2
2
  /**
3
3
  * Responsible for drawing the dies inside the wafer map, adding dieText and scaling the canvas
4
4
  */
@@ -1,4 +1,4 @@
1
- import { HoverDieOpacity } from '../types';
1
+ import { HoverDieOpacity } from '../../types';
2
2
  /**
3
3
  * Responsible for drawing the dies inside the wafer map, adding dieText and scaling the canvas
4
4
  */
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-renderer.js","sourceRoot":"","sources":["../../../../../src/wafer-map/modules/experimental/worker-renderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;GAEG;AACH,MAAM,OAAO,cAAc;IACvB,YAAoC,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;IAAG,CAAC;IAEnD,4BAA4B;QAC/B,iDAAiD;QACjD,IAAI,CAAC,SAAS,EAAE,CAAC;IACrB,CAAC;IAEM,SAAS;QACZ,+CAA+C;QAC/C,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,WAAW;QACd,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK;cAClE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,MAAM;cACpE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS;YAC7D,CAAC,CAAC,eAAe,CAAC,IAAI;YACtB,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;IAClE,CAAC;IAEO,uBAAuB;QAC3B,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,eAAe,CACrD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAC3B,CAAC;YACF,IAAI,OAAO,KAAK,SAAS,EAAE;gBACvB,OAAO,EAAE,CAAC;aACb;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CACnD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAC3B,CAAC;YACF,IAAI,OAAO,KAAK,SAAS,EAAE;gBACvB,OAAO,EAAE,CAAC;aACb;YACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;gBACnD,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI;gBAC/C,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG;aACjD,CAAC,CAAC;YACH,OAAO,aAAa,gBAAgB,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC;SACtE;QACD,OAAO,EAAE,CAAC;IACd,CAAC;CACJ","sourcesContent":["import type { WaferMap } from '../..';\nimport { HoverDieOpacity } from '../../types';\n\n/**\n * Responsible for drawing the dies inside the wafer map, adding dieText and scaling the canvas\n */\nexport class WorkerRenderer {\n public constructor(private readonly wafermap: WaferMap) {}\n\n public updateSortedDiesAndDrawWafer(): void {\n // redundant function for backwards compatibility\n this.drawWafer();\n }\n\n public drawWafer(): void {\n // rendering will be implemented in a future PR\n this.renderHover();\n }\n\n public renderHover(): void {\n this.wafermap.hoverWidth = this.wafermap.dataManager.dieDimensions.width\n * this.wafermap.transform.k;\n this.wafermap.hoverHeight = this.wafermap.dataManager.dieDimensions.height\n * this.wafermap.transform.k;\n this.wafermap.hoverOpacity = this.wafermap.hoverDie === undefined\n ? HoverDieOpacity.hide\n : HoverDieOpacity.show;\n this.wafermap.hoverTransform = this.calculateHoverTransform();\n }\n\n private calculateHoverTransform(): string {\n if (this.wafermap.hoverDie !== undefined) {\n const scaledX = this.wafermap.dataManager.horizontalScale(\n this.wafermap.hoverDie.x\n );\n if (scaledX === undefined) {\n return '';\n }\n const scaledY = this.wafermap.dataManager.verticalScale(\n this.wafermap.hoverDie.y\n );\n if (scaledY === undefined) {\n return '';\n }\n const transformedPoint = this.wafermap.transform.apply([\n scaledX + this.wafermap.dataManager.margin.left,\n scaledY + this.wafermap.dataManager.margin.top\n ]);\n return `translate(${transformedPoint[0]}, ${transformedPoint[1]})`;\n }\n return '';\n }\n}\n"]}
@@ -5,8 +5,16 @@ import type { WaferMap } from '..';
5
5
  export declare class HoverHandler {
6
6
  private readonly wafermap;
7
7
  constructor(wafermap: WaferMap);
8
- mousemove(event: MouseEvent): void;
9
- mouseout(): void;
8
+ /**
9
+ * @internal
10
+ */
11
+ connect(): void;
12
+ /**
13
+ * @internal
14
+ */
15
+ disconnect(): void;
16
+ private readonly onMouseMove;
17
+ private readonly onMouseOut;
10
18
  private calculateDieCoordinates;
11
19
  private hoversOverDie;
12
20
  }
@@ -5,32 +5,49 @@ import { WaferMapOriginLocation } from '../types';
5
5
  export class HoverHandler {
6
6
  constructor(wafermap) {
7
7
  this.wafermap = wafermap;
8
- }
9
- mousemove(event) {
10
- const mousePosition = {
11
- x: event.offsetX,
12
- y: event.offsetY
8
+ this.onMouseMove = (event) => {
9
+ if (this.wafermap.isExperimentalRenderer()) {
10
+ return;
11
+ }
12
+ const mousePosition = {
13
+ x: event.offsetX,
14
+ y: event.offsetY
15
+ };
16
+ if (!this.hoversOverDie(mousePosition)) {
17
+ this.wafermap.hoverDie = undefined;
18
+ return;
19
+ }
20
+ // get original mouse position in case we are in zoom.
21
+ const invertedPoint = this.wafermap.transform.invert([
22
+ mousePosition.x,
23
+ mousePosition.y
24
+ ]);
25
+ const dieCoordinates = this.calculateDieCoordinates({
26
+ x: invertedPoint[0],
27
+ y: invertedPoint[1]
28
+ });
29
+ this.wafermap.hoverDie = this.wafermap.dataManager.getWaferMapDie(dieCoordinates);
13
30
  };
14
- if (!this.hoversOverDie(this.wafermap, mousePosition)) {
31
+ this.onMouseOut = (_event) => {
15
32
  this.wafermap.hoverDie = undefined;
16
- return;
17
- }
18
- // get original mouse position in case we are in zoom.
19
- const invertedPoint = this.wafermap.transform.invert([
20
- mousePosition.x,
21
- mousePosition.y
22
- ]);
23
- const dieCoordinates = this.calculateDieCoordinates(this.wafermap, {
24
- x: invertedPoint[0],
25
- y: invertedPoint[1]
26
- });
27
- this.wafermap.hoverDie = this.wafermap.dataManager.getWaferMapDie(dieCoordinates);
33
+ };
34
+ }
35
+ /**
36
+ * @internal
37
+ */
38
+ connect() {
39
+ this.wafermap.addEventListener('mousemove', this.onMouseMove);
40
+ this.wafermap.addEventListener('mouseout', this.onMouseOut);
28
41
  }
29
- mouseout() {
30
- this.wafermap.hoverDie = undefined;
42
+ /**
43
+ * @internal
44
+ */
45
+ disconnect() {
46
+ this.wafermap.removeEventListener('mousemove', this.onMouseMove);
47
+ this.wafermap.removeEventListener('mouseout', this.onMouseOut);
31
48
  }
32
- calculateDieCoordinates(wafermap, mousePosition) {
33
- const originLocation = wafermap.originLocation;
49
+ calculateDieCoordinates(mousePosition) {
50
+ const originLocation = this.wafermap.originLocation;
34
51
  const xRoundFunction = originLocation === WaferMapOriginLocation.bottomLeft
35
52
  || originLocation === WaferMapOriginLocation.topLeft
36
53
  ? Math.floor
@@ -40,12 +57,12 @@ export class HoverHandler {
40
57
  ? Math.floor
41
58
  : Math.ceil;
42
59
  // go to x and y scale to get the x,y values of the die.
43
- const x = xRoundFunction(wafermap.dataManager.invertedHorizontalScale(mousePosition.x - wafermap.dataManager.margin.left));
44
- const y = yRoundFunction(wafermap.dataManager.invertedVerticalScale(mousePosition.y - wafermap.dataManager.margin.top));
60
+ const x = xRoundFunction(this.wafermap.dataManager.invertedHorizontalScale(mousePosition.x - this.wafermap.dataManager.margin.left));
61
+ const y = yRoundFunction(this.wafermap.dataManager.invertedVerticalScale(mousePosition.y - this.wafermap.dataManager.margin.top));
45
62
  return { x, y };
46
63
  }
47
- hoversOverDie(wafermap, mousePosition) {
48
- const rgba = wafermap.canvasContext.getImageData(mousePosition.x, mousePosition.y, 1, 1).data;
64
+ hoversOverDie(mousePosition) {
65
+ const rgba = this.wafermap.canvasContext.getImageData(mousePosition.x, mousePosition.y, 1, 1).data;
49
66
  let rgbaSum = 0;
50
67
  for (const color of rgba) {
51
68
  rgbaSum += color;
@@ -1 +1 @@
1
- {"version":3,"file":"hover-handler.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/hover-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAEpE;;GAEG;AACH,MAAM,OAAO,YAAY;IACrB,YAAoC,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;IAAG,CAAC;IACnD,SAAS,CAAC,KAAiB;QAC9B,MAAM,aAAa,GAAqB;YACpC,CAAC,EAAE,KAAK,CAAC,OAAO;YAChB,CAAC,EAAE,KAAK,CAAC,OAAO;SACnB,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE;YACnD,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAC;YACnC,OAAO;SACV;QACD,sDAAsD;QACtD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC;YACjD,aAAa,CAAC,CAAC;YACf,aAAa,CAAC,CAAC;SAClB,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC/D,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;YACnB,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IACtF,CAAC;IAEM,QAAQ;QACX,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAC;IACvC,CAAC;IAEO,uBAAuB,CAC3B,QAAkB,EAClB,aAA+B;QAE/B,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;QAC/C,MAAM,cAAc,GAAG,cAAc,KAAK,sBAAsB,CAAC,UAAU;eACpE,cAAc,KAAK,sBAAsB,CAAC,OAAO;YACpD,CAAC,CAAC,IAAI,CAAC,KAAK;YACZ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAChB,MAAM,cAAc,GAAG,cAAc,KAAK,sBAAsB,CAAC,UAAU;eACpE,cAAc,KAAK,sBAAsB,CAAC,WAAW;YACxD,CAAC,CAAC,IAAI,CAAC,KAAK;YACZ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAChB,wDAAwD;QACxD,MAAM,CAAC,GAAG,cAAc,CACpB,QAAQ,CAAC,WAAW,CAAC,uBAAuB,CACxC,aAAa,CAAC,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CACrD,CACJ,CAAC;QACF,MAAM,CAAC,GAAG,cAAc,CACpB,QAAQ,CAAC,WAAW,CAAC,qBAAqB,CACtC,aAAa,CAAC,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CACpD,CACJ,CAAC;QACF,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACpB,CAAC;IAEO,aAAa,CACjB,QAAkB,EAClB,aAA+B;QAE/B,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,YAAY,CAC5C,aAAa,CAAC,CAAC,EACf,aAAa,CAAC,CAAC,EACf,CAAC,EACD,CAAC,CACJ,CAAC,IAAI,CAAC;QACP,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE;YACtB,OAAO,IAAI,KAAK,CAAC;SACpB;QACD,OAAO,OAAO,GAAG,CAAC,CAAC;IACvB,CAAC;CACJ","sourcesContent":["import type { WaferMap } from '..';\nimport { PointCoordinates, WaferMapOriginLocation } from '../types';\n\n/**\n * HoverHandler deals with user interactions and events like hovering\n */\nexport class HoverHandler {\n public constructor(private readonly wafermap: WaferMap) {}\n public mousemove(event: MouseEvent): void {\n const mousePosition: PointCoordinates = {\n x: event.offsetX,\n y: event.offsetY\n };\n\n if (!this.hoversOverDie(this.wafermap, mousePosition)) {\n this.wafermap.hoverDie = undefined;\n return;\n }\n // get original mouse position in case we are in zoom.\n const invertedPoint = this.wafermap.transform.invert([\n mousePosition.x,\n mousePosition.y\n ]);\n\n const dieCoordinates = this.calculateDieCoordinates(this.wafermap, {\n x: invertedPoint[0],\n y: invertedPoint[1]\n });\n\n this.wafermap.hoverDie = this.wafermap.dataManager.getWaferMapDie(dieCoordinates);\n }\n\n public mouseout(): void {\n this.wafermap.hoverDie = undefined;\n }\n\n private calculateDieCoordinates(\n wafermap: WaferMap,\n mousePosition: PointCoordinates\n ): PointCoordinates {\n const originLocation = wafermap.originLocation;\n const xRoundFunction = originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.topLeft\n ? Math.floor\n : Math.ceil;\n const yRoundFunction = originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.bottomRight\n ? Math.floor\n : Math.ceil;\n // go to x and y scale to get the x,y values of the die.\n const x = xRoundFunction(\n wafermap.dataManager.invertedHorizontalScale(\n mousePosition.x - wafermap.dataManager.margin.left\n )\n );\n const y = yRoundFunction(\n wafermap.dataManager.invertedVerticalScale(\n mousePosition.y - wafermap.dataManager.margin.top\n )\n );\n return { x, y };\n }\n\n private hoversOverDie(\n wafermap: WaferMap,\n mousePosition: PointCoordinates\n ): boolean {\n const rgba = wafermap.canvasContext.getImageData(\n mousePosition.x,\n mousePosition.y,\n 1,\n 1\n ).data;\n let rgbaSum = 0;\n for (const color of rgba) {\n rgbaSum += color;\n }\n return rgbaSum > 0;\n }\n}\n"]}
1
+ {"version":3,"file":"hover-handler.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/hover-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { WaferMap } from '..';\nimport { PointCoordinates, WaferMapOriginLocation } from '../types';\n\n/**\n * HoverHandler deals with user interactions and events like hovering\n */\nexport class HoverHandler {\n public constructor(private readonly wafermap: WaferMap) {}\n\n /**\n * @internal\n */\n public connect(): void {\n this.wafermap.addEventListener('mousemove', this.onMouseMove);\n this.wafermap.addEventListener('mouseout', this.onMouseOut);\n }\n\n /**\n * @internal\n */\n public disconnect(): void {\n this.wafermap.removeEventListener('mousemove', this.onMouseMove);\n this.wafermap.removeEventListener('mouseout', this.onMouseOut);\n }\n\n private readonly onMouseMove = (event: MouseEvent): void => {\n if (this.wafermap.isExperimentalRenderer()) {\n return;\n }\n const mousePosition: PointCoordinates = {\n x: event.offsetX,\n y: event.offsetY\n };\n\n if (!this.hoversOverDie(mousePosition)) {\n this.wafermap.hoverDie = undefined;\n return;\n }\n // get original mouse position in case we are in zoom.\n const invertedPoint = this.wafermap.transform.invert([\n mousePosition.x,\n mousePosition.y\n ]);\n\n const dieCoordinates = this.calculateDieCoordinates({\n x: invertedPoint[0],\n y: invertedPoint[1]\n });\n\n this.wafermap.hoverDie = this.wafermap.dataManager.getWaferMapDie(dieCoordinates);\n };\n\n private readonly onMouseOut = (_event: MouseEvent): void => {\n this.wafermap.hoverDie = undefined;\n };\n\n private calculateDieCoordinates(\n mousePosition: PointCoordinates\n ): PointCoordinates {\n const originLocation = this.wafermap.originLocation;\n const xRoundFunction = originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.topLeft\n ? Math.floor\n : Math.ceil;\n const yRoundFunction = originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.bottomRight\n ? Math.floor\n : Math.ceil;\n // go to x and y scale to get the x,y values of the die.\n const x = xRoundFunction(\n this.wafermap.dataManager.invertedHorizontalScale(\n mousePosition.x - this.wafermap.dataManager.margin.left\n )\n );\n const y = yRoundFunction(\n this.wafermap.dataManager.invertedVerticalScale(\n mousePosition.y - this.wafermap.dataManager.margin.top\n )\n );\n return { x, y };\n }\n\n private hoversOverDie(mousePosition: PointCoordinates): boolean {\n const rgba = this.wafermap.canvasContext.getImageData(\n mousePosition.x,\n mousePosition.y,\n 1,\n 1\n ).data;\n let rgbaSum = 0;\n for (const color of rgba) {\n rgbaSum += color;\n }\n return rgbaSum > 0;\n }\n}\n"]}
@@ -1,13 +1,11 @@
1
1
  import { ScaleLinear, ScaleOrdinal } from 'd3-scale';
2
2
  import type { DieRenderInfo } from '../types';
3
3
  import type { WaferMap } from '..';
4
- import type { DataManager } from './data-manager';
5
4
  /**
6
5
  * Prerendering prepares render-ready dies data to be used by the rendering module
7
6
  */
8
7
  export declare class Prerendering {
9
8
  private readonly wafermap;
10
- private readonly dataManager;
11
9
  get labelsFontSize(): number;
12
10
  get diesRenderInfo(): DieRenderInfo[];
13
11
  d3ColorScale: ScaleOrdinal<string, string> | ScaleLinear<string, string>;
@@ -17,7 +15,7 @@ export declare class Prerendering {
17
15
  private readonly nonHighlightedOpacity;
18
16
  private readonly emptyDieColor;
19
17
  private readonly nanDieColor;
20
- constructor(wafermap: WaferMap, dataManager: Readonly<DataManager>);
18
+ constructor(wafermap: WaferMap);
21
19
  updateLabelsFontSize(): void;
22
20
  updateDiesRenderInfo(): void;
23
21
  private computeDieRenderInfo;
@@ -11,16 +11,15 @@ export class Prerendering {
11
11
  get diesRenderInfo() {
12
12
  return this._diesRenderInfo;
13
13
  }
14
- constructor(wafermap, dataManager) {
14
+ constructor(wafermap) {
15
15
  this.wafermap = wafermap;
16
- this.dataManager = dataManager;
17
16
  this.fontSizeFactor = 0.8;
18
17
  this.nonHighlightedOpacity = 0.3;
19
18
  this.emptyDieColor = 'rgba(218,223,236,1)';
20
19
  this.nanDieColor = 'rgba(122,122,122,1)';
21
20
  }
22
21
  updateLabelsFontSize() {
23
- this._labelsFontSize = this.calculateLabelsFontSize(this.dataManager.dieDimensions, this.wafermap.maxCharacters);
22
+ this._labelsFontSize = this.calculateLabelsFontSize(this.wafermap.dataManager.dieDimensions, this.wafermap.maxCharacters);
24
23
  this.updateDiesRenderInfo();
25
24
  }
26
25
  updateDiesRenderInfo() {
@@ -31,9 +30,9 @@ export class Prerendering {
31
30
  .filter(isDieRenderInfo);
32
31
  }
33
32
  computeDieRenderInfo(die) {
34
- const margin = this.dataManager.margin;
35
- const scaledX = this.dataManager.horizontalScale(die.x);
36
- const scaledY = this.dataManager.verticalScale(die.y);
33
+ const margin = this.wafermap.dataManager.margin;
34
+ const scaledX = this.wafermap.dataManager.horizontalScale(die.x);
35
+ const scaledY = this.wafermap.dataManager.verticalScale(die.y);
37
36
  if (scaledX === undefined || scaledY === undefined) {
38
37
  return null;
39
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"prerendering.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/prerendering.ts"],"names":[],"mappings":"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","sourcesContent":["import { ScaleLinear, scaleLinear, ScaleOrdinal, scaleOrdinal } from 'd3-scale';\nimport { ColorRGBA64, parseColor } from '@microsoft/fast-colors';\nimport { WaferMapColorScaleMode } from '../types';\nimport type {\n Dimensions,\n DieRenderInfo,\n WaferMapColorScale,\n WaferMapDie\n} from '../types';\nimport type { WaferMap } from '..';\nimport type { DataManager } from './data-manager';\n\n/**\n * Prerendering prepares render-ready dies data to be used by the rendering module\n */\nexport class Prerendering {\n public get labelsFontSize(): number {\n return this._labelsFontSize;\n }\n\n public get diesRenderInfo(): DieRenderInfo[] {\n return this._diesRenderInfo;\n }\n\n public d3ColorScale!:\n | ScaleOrdinal<string, string>\n | ScaleLinear<string, string>;\n\n private _labelsFontSize!: number;\n private _diesRenderInfo!: DieRenderInfo[];\n\n private readonly fontSizeFactor = 0.8;\n private readonly nonHighlightedOpacity = 0.3;\n private readonly emptyDieColor = 'rgba(218,223,236,1)';\n private readonly nanDieColor = 'rgba(122,122,122,1)';\n\n public constructor(\n private readonly wafermap: WaferMap,\n private readonly dataManager: Readonly<DataManager>\n ) {}\n\n public updateLabelsFontSize(): void {\n this._labelsFontSize = this.calculateLabelsFontSize(\n this.dataManager.dieDimensions,\n this.wafermap.maxCharacters\n );\n this.updateDiesRenderInfo();\n }\n\n public updateDiesRenderInfo(): void {\n this.d3ColorScale = this.createD3ColorScale(\n this.wafermap.colorScale,\n this.wafermap.colorScaleMode\n );\n const isDieRenderInfo = (\n info: DieRenderInfo | null\n ): info is DieRenderInfo => info !== null;\n this._diesRenderInfo = this.wafermap.dies\n .map(die => this.computeDieRenderInfo(die))\n .filter(isDieRenderInfo);\n }\n\n private computeDieRenderInfo(die: WaferMapDie): DieRenderInfo | null {\n const margin = this.dataManager.margin;\n\n const scaledX = this.dataManager.horizontalScale(die.x);\n const scaledY = this.dataManager.verticalScale(die.y);\n\n if (scaledX === undefined || scaledY === undefined) {\n return null;\n }\n\n return {\n x: scaledX + margin.right,\n y: scaledY + margin.top,\n fillStyle: this.calculateFillStyle(\n die.value,\n this.wafermap.colorScaleMode,\n this.wafermap.highlightedTags,\n die.tags\n ),\n text: this.buildLabel(\n die.value,\n this.wafermap.maxCharacters,\n this.wafermap.dieLabelsHidden,\n this.wafermap.dieLabelsSuffix\n )\n };\n }\n\n private calculateLabelsFontSize(\n dieDimensions: Dimensions,\n maxCharacters: number\n ): number {\n return Math.min(\n dieDimensions.height,\n (dieDimensions.width / (Math.max(2, maxCharacters) * 0.5))\n * this.fontSizeFactor\n );\n }\n\n private createD3ColorScale(\n colorScale: WaferMapColorScale,\n colorScaleMode: WaferMapColorScaleMode\n ): ScaleOrdinal<string, string> | ScaleLinear<string, string> {\n if (this.isColorScaleLinear(colorScaleMode)) {\n return scaleLinear<string, string>()\n .domain(colorScale.values.map(item => +item))\n .range(colorScale.colors);\n }\n return scaleOrdinal<string, string>()\n .domain(colorScale.values)\n .range(colorScale.colors);\n }\n\n private dieHasData(dieData: string): boolean {\n return dieData !== null && dieData !== undefined && dieData !== '';\n }\n\n private buildLabel(\n value: string,\n maxCharacters: number,\n dieLabelsHidden: boolean,\n dieLabelsSuffix: string\n ): string {\n if (dieLabelsHidden || !this.dieHasData(value)) {\n return '';\n }\n const label = `${value}${dieLabelsSuffix}`;\n if (label.length > maxCharacters) {\n return `${label.substring(0, maxCharacters)}…`;\n }\n return label;\n }\n\n private calculateOpacity(\n dieTags?: string[],\n highlightedTags?: string[]\n ): number {\n if (!highlightedTags || highlightedTags.length === 0) {\n return 1;\n }\n const highlightedSet = new Set(highlightedTags);\n\n if (dieTags?.some(dieTag => highlightedSet.has(dieTag))) {\n return 1;\n }\n\n return this.nonHighlightedOpacity;\n }\n\n private isColorScaleLinear(\n colorScaleMode: WaferMapColorScaleMode\n ): this is { d3ColorScale: ScaleLinear<string, string> } {\n return colorScaleMode === WaferMapColorScaleMode.linear;\n }\n\n private isColorScaleOrdinal(\n colorScaleMode: WaferMapColorScaleMode\n ): this is { d3ColorScale: ScaleOrdinal<string, string> } {\n return colorScaleMode === WaferMapColorScaleMode.ordinal;\n }\n\n private calculateFillStyle(\n value: string,\n colorScaleMode: WaferMapColorScaleMode,\n highlightedTags?: string[],\n dieTags?: string[]\n ): string {\n let colorValue: string = this.emptyDieColor;\n if (this.dieHasData(value)) {\n if (isNaN(+value)) {\n colorValue = this.nanDieColor;\n } else if (this.isColorScaleLinear(colorScaleMode)) {\n colorValue = this.d3ColorScale(+value);\n } else if (this.isColorScaleOrdinal(colorScaleMode)) {\n colorValue = this.d3ColorScale(value);\n }\n }\n if (colorValue === undefined) {\n return this.emptyDieColor;\n }\n let rgbColor: ColorRGBA64 | null = parseColor(colorValue);\n if (rgbColor === null) {\n return this.emptyDieColor;\n }\n\n rgbColor = new ColorRGBA64(\n rgbColor.r,\n rgbColor.g,\n rgbColor.b,\n this.calculateOpacity(dieTags, highlightedTags)\n );\n return rgbColor.toStringWebRGBA();\n }\n}\n"]}
1
+ {"version":3,"file":"prerendering.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/prerendering.ts"],"names":[],"mappings":"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","sourcesContent":["import { ScaleLinear, scaleLinear, ScaleOrdinal, scaleOrdinal } from 'd3-scale';\nimport { ColorRGBA64, parseColor } from '@microsoft/fast-colors';\nimport { WaferMapColorScaleMode } from '../types';\nimport type {\n Dimensions,\n DieRenderInfo,\n WaferMapColorScale,\n WaferMapDie\n} from '../types';\nimport type { WaferMap } from '..';\n\n/**\n * Prerendering prepares render-ready dies data to be used by the rendering module\n */\nexport class Prerendering {\n public get labelsFontSize(): number {\n return this._labelsFontSize;\n }\n\n public get diesRenderInfo(): DieRenderInfo[] {\n return this._diesRenderInfo;\n }\n\n public d3ColorScale!:\n | ScaleOrdinal<string, string>\n | ScaleLinear<string, string>;\n\n private _labelsFontSize!: number;\n private _diesRenderInfo!: DieRenderInfo[];\n\n private readonly fontSizeFactor = 0.8;\n private readonly nonHighlightedOpacity = 0.3;\n private readonly emptyDieColor = 'rgba(218,223,236,1)';\n private readonly nanDieColor = 'rgba(122,122,122,1)';\n\n public constructor(private readonly wafermap: WaferMap) {}\n\n public updateLabelsFontSize(): void {\n this._labelsFontSize = this.calculateLabelsFontSize(\n this.wafermap.dataManager.dieDimensions,\n this.wafermap.maxCharacters\n );\n this.updateDiesRenderInfo();\n }\n\n public updateDiesRenderInfo(): void {\n this.d3ColorScale = this.createD3ColorScale(\n this.wafermap.colorScale,\n this.wafermap.colorScaleMode\n );\n const isDieRenderInfo = (\n info: DieRenderInfo | null\n ): info is DieRenderInfo => info !== null;\n this._diesRenderInfo = this.wafermap.dies\n .map(die => this.computeDieRenderInfo(die))\n .filter(isDieRenderInfo);\n }\n\n private computeDieRenderInfo(die: WaferMapDie): DieRenderInfo | null {\n const margin = this.wafermap.dataManager.margin;\n\n const scaledX = this.wafermap.dataManager.horizontalScale(die.x);\n const scaledY = this.wafermap.dataManager.verticalScale(die.y);\n\n if (scaledX === undefined || scaledY === undefined) {\n return null;\n }\n\n return {\n x: scaledX + margin.right,\n y: scaledY + margin.top,\n fillStyle: this.calculateFillStyle(\n die.value,\n this.wafermap.colorScaleMode,\n this.wafermap.highlightedTags,\n die.tags\n ),\n text: this.buildLabel(\n die.value,\n this.wafermap.maxCharacters,\n this.wafermap.dieLabelsHidden,\n this.wafermap.dieLabelsSuffix\n )\n };\n }\n\n private calculateLabelsFontSize(\n dieDimensions: Dimensions,\n maxCharacters: number\n ): number {\n return Math.min(\n dieDimensions.height,\n (dieDimensions.width / (Math.max(2, maxCharacters) * 0.5))\n * this.fontSizeFactor\n );\n }\n\n private createD3ColorScale(\n colorScale: WaferMapColorScale,\n colorScaleMode: WaferMapColorScaleMode\n ): ScaleOrdinal<string, string> | ScaleLinear<string, string> {\n if (this.isColorScaleLinear(colorScaleMode)) {\n return scaleLinear<string, string>()\n .domain(colorScale.values.map(item => +item))\n .range(colorScale.colors);\n }\n return scaleOrdinal<string, string>()\n .domain(colorScale.values)\n .range(colorScale.colors);\n }\n\n private dieHasData(dieData: string): boolean {\n return dieData !== null && dieData !== undefined && dieData !== '';\n }\n\n private buildLabel(\n value: string,\n maxCharacters: number,\n dieLabelsHidden: boolean,\n dieLabelsSuffix: string\n ): string {\n if (dieLabelsHidden || !this.dieHasData(value)) {\n return '';\n }\n const label = `${value}${dieLabelsSuffix}`;\n if (label.length > maxCharacters) {\n return `${label.substring(0, maxCharacters)}…`;\n }\n return label;\n }\n\n private calculateOpacity(\n dieTags?: string[],\n highlightedTags?: string[]\n ): number {\n if (!highlightedTags || highlightedTags.length === 0) {\n return 1;\n }\n const highlightedSet = new Set(highlightedTags);\n\n if (dieTags?.some(dieTag => highlightedSet.has(dieTag))) {\n return 1;\n }\n\n return this.nonHighlightedOpacity;\n }\n\n private isColorScaleLinear(\n colorScaleMode: WaferMapColorScaleMode\n ): this is { d3ColorScale: ScaleLinear<string, string> } {\n return colorScaleMode === WaferMapColorScaleMode.linear;\n }\n\n private isColorScaleOrdinal(\n colorScaleMode: WaferMapColorScaleMode\n ): this is { d3ColorScale: ScaleOrdinal<string, string> } {\n return colorScaleMode === WaferMapColorScaleMode.ordinal;\n }\n\n private calculateFillStyle(\n value: string,\n colorScaleMode: WaferMapColorScaleMode,\n highlightedTags?: string[],\n dieTags?: string[]\n ): string {\n let colorValue: string = this.emptyDieColor;\n if (this.dieHasData(value)) {\n if (isNaN(+value)) {\n colorValue = this.nanDieColor;\n } else if (this.isColorScaleLinear(colorScaleMode)) {\n colorValue = this.d3ColorScale(+value);\n } else if (this.isColorScaleOrdinal(colorScaleMode)) {\n colorValue = this.d3ColorScale(value);\n }\n }\n if (colorValue === undefined) {\n return this.emptyDieColor;\n }\n let rgbColor: ColorRGBA64 | null = parseColor(colorValue);\n if (rgbColor === null) {\n return this.emptyDieColor;\n }\n\n rgbColor = new ColorRGBA64(\n rgbColor.r,\n rgbColor.g,\n rgbColor.b,\n this.calculateOpacity(dieTags, highlightedTags)\n );\n return rgbColor.toStringWebRGBA();\n }\n}\n"]}
@@ -20,10 +20,10 @@ export class WaferMapValidator {
20
20
  }
21
21
  validateGridDimensions() {
22
22
  this.invalidGridDimensions = false;
23
- if (typeof this.wafermap.gridMinX === 'undefined'
24
- && typeof this.wafermap.gridMaxX === 'undefined'
25
- && typeof this.wafermap.gridMinY === 'undefined'
26
- && typeof this.wafermap.gridMaxY === 'undefined') {
23
+ if (this.wafermap.gridMinX === undefined
24
+ && this.wafermap.gridMaxX === undefined
25
+ && this.wafermap.gridMinY === undefined
26
+ && this.wafermap.gridMaxY === undefined) {
27
27
  this.invalidGridDimensions = false;
28
28
  }
29
29
  else if (typeof this.wafermap.gridMinX !== 'number'
@@ -42,25 +42,19 @@ export class WaferMapValidator {
42
42
  this.invalidDiesTableSchema = false;
43
43
  }
44
44
  else {
45
- const colIndexField = this.wafermap.diesTable.schema.fields.findIndex(f => f.name === 'colIndex');
46
- const rowIndexField = this.wafermap.diesTable.schema.fields.findIndex(f => f.name === 'rowIndex');
47
- const valueField = this.wafermap.diesTable.schema.fields.findIndex(f => f.name === 'value');
48
- if (this.wafermap.diesTable.numCols < 3
49
- || colIndexField === -1
50
- || rowIndexField === -1
51
- || valueField === -1
52
- || !DataType.isInt(this.wafermap.diesTable.schema.fields[colIndexField].type)
53
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
54
- || this.wafermap.diesTable.schema.fields[colIndexField].type
55
- .bitWidth !== 32
56
- || !DataType.isInt(this.wafermap.diesTable.schema.fields[rowIndexField].type)
57
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
58
- || this.wafermap.diesTable.schema.fields[rowIndexField].type
59
- .bitWidth !== 32
60
- || !DataType.isFloat(this.wafermap.diesTable.schema.fields[valueField].type)
61
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
62
- || this.wafermap.diesTable.schema.fields[valueField].type
63
- .precision !== Precision.DOUBLE) {
45
+ const fields = this.wafermap.diesTable.schema.fields;
46
+ const colField = fields.find(field => field.name === 'colIndex');
47
+ const rowField = fields.find(field => field.name === 'rowIndex');
48
+ const valueField = fields.find(field => field.name === 'value');
49
+ if (!colField
50
+ || !rowField
51
+ || !valueField
52
+ || !DataType.isInt(colField.type)
53
+ || colField.type.bitWidth !== 32
54
+ || !DataType.isInt(rowField.type)
55
+ || rowField.type.bitWidth !== 32
56
+ || !DataType.isFloat(valueField.type)
57
+ || valueField.type.precision !== Precision.DOUBLE) {
64
58
  this.invalidDiesTableSchema = true;
65
59
  }
66
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wafer-map-validator.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/wafer-map-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import { DataType, Precision } from 'apache-arrow';\nimport type { WaferMap } from '..';\nimport type { WaferMapValidity } from '../types';\n\n/**\n * Helper class for the nimble-wafer-map to validate that the wafer maps's grid dimensions\n * configuration is valid and report which aspects of the configuration are valid or invalid.\n */\nexport class WaferMapValidator {\n private invalidGridDimensions = false;\n private invalidDiesTableSchema = false;\n\n public constructor(private readonly wafermap: WaferMap) {}\n public getValidity(): WaferMapValidity {\n return {\n invalidGridDimensions: this.invalidGridDimensions,\n invalidDiesTableSchema: this.invalidDiesTableSchema\n };\n }\n\n public isValid(): boolean {\n return Object.values(this.getValidity()).every(x => x === false);\n }\n\n public validateGridDimensions(): boolean {\n this.invalidGridDimensions = false;\n if (\n typeof this.wafermap.gridMinX === 'undefined'\n && typeof this.wafermap.gridMaxX === 'undefined'\n && typeof this.wafermap.gridMinY === 'undefined'\n && typeof this.wafermap.gridMaxY === 'undefined'\n ) {\n this.invalidGridDimensions = false;\n } else if (\n typeof this.wafermap.gridMinX !== 'number'\n || typeof this.wafermap.gridMaxX !== 'number'\n || typeof this.wafermap.gridMinY !== 'number'\n || typeof this.wafermap.gridMaxY !== 'number'\n || this.wafermap.gridMaxX < this.wafermap.gridMinX\n || this.wafermap.gridMaxY < this.wafermap.gridMinY\n ) {\n this.invalidGridDimensions = true;\n }\n return !this.invalidGridDimensions;\n }\n\n public validateDiesTableSchema(): boolean {\n this.invalidDiesTableSchema = false;\n if (this.wafermap.diesTable === undefined) {\n this.invalidDiesTableSchema = false;\n } else {\n const colIndexField = this.wafermap.diesTable.schema.fields.findIndex(\n f => f.name === 'colIndex'\n );\n const rowIndexField = this.wafermap.diesTable.schema.fields.findIndex(\n f => f.name === 'rowIndex'\n );\n const valueField = this.wafermap.diesTable.schema.fields.findIndex(\n f => f.name === 'value'\n );\n if (\n this.wafermap.diesTable.numCols < 3\n || colIndexField === -1\n || rowIndexField === -1\n || valueField === -1\n || !DataType.isInt(\n this.wafermap.diesTable.schema.fields[colIndexField]!.type\n )\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n || this.wafermap.diesTable.schema.fields[colIndexField]!.type\n .bitWidth !== 32\n || !DataType.isInt(\n this.wafermap.diesTable.schema.fields[rowIndexField]!.type\n )\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n || this.wafermap.diesTable.schema.fields[rowIndexField]!.type\n .bitWidth !== 32\n || !DataType.isFloat(\n this.wafermap.diesTable.schema.fields[valueField]!.type\n )\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n || this.wafermap.diesTable.schema.fields[valueField]!.type\n .precision !== Precision.DOUBLE\n ) {\n this.invalidDiesTableSchema = true;\n }\n }\n return !this.invalidDiesTableSchema;\n }\n}\n"]}
1
+ {"version":3,"file":"wafer-map-validator.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/wafer-map-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import { DataType, Precision } from 'apache-arrow';\nimport type { WaferMap } from '..';\nimport type { WaferMapValidity } from '../types';\n\n/**\n * Helper class for the nimble-wafer-map to validate that the wafer maps's grid dimensions\n * configuration is valid and report which aspects of the configuration are valid or invalid.\n */\nexport class WaferMapValidator {\n private invalidGridDimensions = false;\n private invalidDiesTableSchema = false;\n\n public constructor(private readonly wafermap: WaferMap) {}\n public getValidity(): WaferMapValidity {\n return {\n invalidGridDimensions: this.invalidGridDimensions,\n invalidDiesTableSchema: this.invalidDiesTableSchema\n };\n }\n\n public isValid(): boolean {\n return Object.values(this.getValidity()).every(x => x === false);\n }\n\n public validateGridDimensions(): boolean {\n this.invalidGridDimensions = false;\n if (\n this.wafermap.gridMinX === undefined\n && this.wafermap.gridMaxX === undefined\n && this.wafermap.gridMinY === undefined\n && this.wafermap.gridMaxY === undefined\n ) {\n this.invalidGridDimensions = false;\n } else if (\n typeof this.wafermap.gridMinX !== 'number'\n || typeof this.wafermap.gridMaxX !== 'number'\n || typeof this.wafermap.gridMinY !== 'number'\n || typeof this.wafermap.gridMaxY !== 'number'\n || this.wafermap.gridMaxX < this.wafermap.gridMinX\n || this.wafermap.gridMaxY < this.wafermap.gridMinY\n ) {\n this.invalidGridDimensions = true;\n }\n return !this.invalidGridDimensions;\n }\n\n public validateDiesTableSchema(): boolean {\n this.invalidDiesTableSchema = false;\n if (this.wafermap.diesTable === undefined) {\n this.invalidDiesTableSchema = false;\n } else {\n const fields = this.wafermap.diesTable.schema.fields;\n const colField = fields.find(field => field.name === 'colIndex');\n const rowField = fields.find(field => field.name === 'rowIndex');\n const valueField = fields.find(field => field.name === 'value');\n if (\n !colField\n || !rowField\n || !valueField\n || !DataType.isInt(colField.type)\n || colField.type.bitWidth !== 32\n || !DataType.isInt(rowField.type)\n || rowField.type.bitWidth !== 32\n || !DataType.isFloat(valueField.type)\n || valueField.type.precision !== Precision.DOUBLE\n ) {\n this.invalidDiesTableSchema = true;\n }\n }\n return !this.invalidDiesTableSchema;\n }\n}\n"]}
@@ -4,13 +4,17 @@ import type { WaferMap } from '..';
4
4
  */
5
5
  export declare class ZoomHandler {
6
6
  private readonly wafermap;
7
- private zoomTransform;
8
- private readonly minScale;
7
+ private readonly scaleExtent;
9
8
  private readonly minExtentPoint;
10
- private readonly extentPadding;
11
- private zoomBehavior;
12
9
  constructor(wafermap: WaferMap);
13
- createZoomBehavior(): void;
14
- private rescale;
15
- private getZoomMax;
10
+ /**
11
+ * @internal
12
+ */
13
+ connect(): void;
14
+ /**
15
+ * @internal
16
+ */
17
+ disconnect(): void;
18
+ private createZoomBehavior;
19
+ private readonly onWheelMove;
16
20
  }
@@ -1,55 +1,45 @@
1
1
  import { select } from 'd3-selection';
2
- import { zoom, zoomIdentity, zoomTransform } from 'd3-zoom';
2
+ import { zoom } from 'd3-zoom';
3
3
  /**
4
4
  * ZoomHandler deals with user interactions and events like zooming
5
5
  */
6
6
  export class ZoomHandler {
7
7
  constructor(wafermap) {
8
8
  this.wafermap = wafermap;
9
- this.zoomTransform = zoomIdentity;
10
- this.minScale = 1.1;
11
- this.minExtentPoint = [-100, -100];
12
- this.extentPadding = 100;
9
+ this.scaleExtent = [1, 100];
10
+ this.minExtentPoint = [0, 0];
11
+ this.onWheelMove = (event) => {
12
+ event.preventDefault();
13
+ };
14
+ }
15
+ /**
16
+ * @internal
17
+ */
18
+ connect() {
19
+ this.createZoomBehavior();
20
+ this.wafermap.addEventListener('wheel', this.onWheelMove, {
21
+ passive: false
22
+ });
23
+ }
24
+ /**
25
+ * @internal
26
+ */
27
+ disconnect() {
28
+ zoom().on('zoom', null)(select(this.wafermap));
29
+ this.wafermap.removeEventListener('wheel', this.onWheelMove);
13
30
  }
14
31
  createZoomBehavior() {
15
- this.zoomBehavior = zoom()
16
- .scaleExtent([
17
- 1.1,
18
- this.getZoomMax(this.wafermap.canvasWidth * this.wafermap.canvasHeight, this.wafermap.dataManager.containerDimensions.width
19
- * this.wafermap.dataManager.containerDimensions.height)
20
- ])
32
+ zoom()
33
+ .scaleExtent(this.scaleExtent)
21
34
  .translateExtent([
22
35
  this.minExtentPoint,
23
- [
24
- this.wafermap.canvasWidth + this.extentPadding,
25
- this.wafermap.canvasHeight + this.extentPadding
26
- ]
36
+ [this.wafermap.canvasWidth, this.wafermap.canvasHeight]
27
37
  ])
28
- .filter((event) => {
29
- const transform = zoomTransform(this.wafermap.canvas);
30
- const filterEval = transform.k >= this.minScale || event.type === 'wheel';
31
- return filterEval;
32
- })
33
38
  .on('zoom', (event) => {
34
39
  // D3 will automatically remove existing handlers when adding new ones
35
40
  // See: https://github.com/d3/d3-zoom/blob/v3.0.0/README.md#zoom_on
36
- this.rescale(event);
37
- });
38
- this.zoomBehavior(select(this.wafermap.canvas));
39
- }
40
- rescale(event) {
41
- const transform = event.transform;
42
- if (transform.k === this.minScale) {
43
- this.zoomTransform = zoomIdentity;
44
- this.zoomBehavior.transform(select(this.wafermap.canvas), zoomIdentity);
45
- }
46
- else {
47
- this.zoomTransform = transform;
48
- }
49
- this.wafermap.transform = this.zoomTransform;
50
- }
51
- getZoomMax(canvasArea, dataArea) {
52
- return Math.ceil((dataArea / canvasArea) * 100);
41
+ this.wafermap.transform = event.transform;
42
+ })(select(this.wafermap));
53
43
  }
54
44
  }
55
45
  //# sourceMappingURL=zoom-handler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zoom-handler.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/zoom-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EACH,IAAI,EAEJ,YAAY,EAEZ,aAAa,EAChB,MAAM,SAAS,CAAC;AAOjB;;GAEG;AACH,MAAM,OAAO,WAAW;IAOpB,YAAoC,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;QAN9C,kBAAa,GAAkB,YAAY,CAAC;QACnC,aAAQ,GAAG,GAAG,CAAC;QACf,mBAAc,GAAqB,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QAChD,kBAAa,GAAG,GAAG,CAAC;IAGoB,CAAC;IAEnD,kBAAkB;QACrB,IAAI,CAAC,YAAY,GAAG,IAAI,EAAE;aACrB,WAAW,CAAC;YACT,GAAG;YACH,IAAI,CAAC,UAAU,CACX,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EACtD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,mBAAmB,CAAC,KAAK;kBAC7C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,mBAAmB,CAAC,MAAM,CAC7D;SACJ,CAAC;aACD,eAAe,CAAC;YACb,IAAI,CAAC,cAAc;YACnB;gBACI,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa;gBAC9C,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa;aAClD;SACJ,CAAC;aACD,MAAM,CAAC,CAAC,KAAY,EAAE,EAAE;YACrB,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACtD,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;YAC1E,OAAO,UAAU,CAAC;QACtB,CAAC,CAAC;aACD,EAAE,CAAC,MAAM,EAAE,CAAC,KAAgB,EAAE,EAAE;YAC7B,sEAAsE;YACtE,mEAAmE;YACnE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEP,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAiB,CAAC,CAAC,CAAC;IAC/D,CAAC;IAEO,OAAO,CAAC,KAAgB;QAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAClC,IAAI,SAAS,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE;YAC/B,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;YAClC,IAAI,CAAC,YAAY,CAAC,SAAS,CACvB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAiB,CAAC,EACvC,YAAY,CACf,CAAC;SACL;aAAM;YACH,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;SAClC;QAED,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;IACjD,CAAC;IAEO,UAAU,CAAC,UAAkB,EAAE,QAAgB;QACnD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;IACpD,CAAC;CACJ","sourcesContent":["import { select } from 'd3-selection';\nimport {\n zoom,\n ZoomBehavior,\n zoomIdentity,\n ZoomTransform,\n zoomTransform\n} from 'd3-zoom';\nimport type { WaferMap } from '..';\n\ninterface ZoomEvent {\n transform: ZoomTransform;\n}\n\n/**\n * ZoomHandler deals with user interactions and events like zooming\n */\nexport class ZoomHandler {\n private zoomTransform: ZoomTransform = zoomIdentity;\n private readonly minScale = 1.1;\n private readonly minExtentPoint: [number, number] = [-100, -100];\n private readonly extentPadding = 100;\n private zoomBehavior!: ZoomBehavior<Element, unknown>;\n\n public constructor(private readonly wafermap: WaferMap) {}\n\n public createZoomBehavior(): void {\n this.zoomBehavior = zoom()\n .scaleExtent([\n 1.1,\n this.getZoomMax(\n this.wafermap.canvasWidth * this.wafermap.canvasHeight,\n this.wafermap.dataManager.containerDimensions.width\n * this.wafermap.dataManager.containerDimensions.height\n )\n ])\n .translateExtent([\n this.minExtentPoint,\n [\n this.wafermap.canvasWidth + this.extentPadding,\n this.wafermap.canvasHeight + this.extentPadding\n ]\n ])\n .filter((event: Event) => {\n const transform = zoomTransform(this.wafermap.canvas);\n const filterEval = transform.k >= this.minScale || event.type === 'wheel';\n return filterEval;\n })\n .on('zoom', (event: ZoomEvent) => {\n // D3 will automatically remove existing handlers when adding new ones\n // See: https://github.com/d3/d3-zoom/blob/v3.0.0/README.md#zoom_on\n this.rescale(event);\n });\n\n this.zoomBehavior(select(this.wafermap.canvas as Element));\n }\n\n private rescale(event: ZoomEvent): void {\n const transform = event.transform;\n if (transform.k === this.minScale) {\n this.zoomTransform = zoomIdentity;\n this.zoomBehavior.transform(\n select(this.wafermap.canvas as Element),\n zoomIdentity\n );\n } else {\n this.zoomTransform = transform;\n }\n\n this.wafermap.transform = this.zoomTransform;\n }\n\n private getZoomMax(canvasArea: number, dataArea: number): number {\n return Math.ceil((dataArea / canvasArea) * 100);\n }\n}\n"]}
1
+ {"version":3,"file":"zoom-handler.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/zoom-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,IAAI,EAAiB,MAAM,SAAS,CAAC;AAO9C;;GAEG;AACH,MAAM,OAAO,WAAW;IAIpB,YAAoC,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;QAHrC,gBAAW,GAAqB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACzC,mBAAc,GAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAoC1C,gBAAW,GAAG,CAAC,KAAY,EAAQ,EAAE;YAClD,KAAK,CAAC,cAAc,EAAE,CAAC;QAC3B,CAAC,CAAC;IApCuD,CAAC;IAE1D;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE;YACtD,OAAO,EAAE,KAAK;SACjB,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,UAAU;QACb,IAAI,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAmB,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACjE,CAAC;IAEO,kBAAkB;QACtB,IAAI,EAAE;aACD,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;aAC7B,eAAe,CAAC;YACb,IAAI,CAAC,cAAc;YACnB,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;SAC1D,CAAC;aACD,EAAE,CAAC,MAAM,EAAE,CAAC,KAAgB,EAAE,EAAE;YAC7B,sEAAsE;YACtE,mEAAmE;YACnE,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAC9C,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAmB,CAAC,CAAC,CAAC;IAC7C,CAAC;CAKJ","sourcesContent":["import { select } from 'd3-selection';\nimport { zoom, ZoomTransform } from 'd3-zoom';\nimport type { WaferMap } from '..';\n\ninterface ZoomEvent {\n transform: ZoomTransform;\n}\n\n/**\n * ZoomHandler deals with user interactions and events like zooming\n */\nexport class ZoomHandler {\n private readonly scaleExtent: [number, number] = [1, 100];\n private readonly minExtentPoint: [number, number] = [0, 0];\n\n public constructor(private readonly wafermap: WaferMap) {}\n\n /**\n * @internal\n */\n public connect(): void {\n this.createZoomBehavior();\n this.wafermap.addEventListener('wheel', this.onWheelMove, {\n passive: false\n });\n }\n\n /**\n * @internal\n */\n public disconnect(): void {\n zoom().on('zoom', null)(select(this.wafermap as Element));\n this.wafermap.removeEventListener('wheel', this.onWheelMove);\n }\n\n private createZoomBehavior(): void {\n zoom()\n .scaleExtent(this.scaleExtent)\n .translateExtent([\n this.minExtentPoint,\n [this.wafermap.canvasWidth, this.wafermap.canvasHeight]\n ])\n .on('zoom', (event: ZoomEvent) => {\n // D3 will automatically remove existing handlers when adding new ones\n // See: https://github.com/d3/d3-zoom/blob/v3.0.0/README.md#zoom_on\n this.wafermap.transform = event.transform;\n })(select(this.wafermap as Element));\n }\n\n private readonly onWheelMove = (event: Event): void => {\n event.preventDefault();\n };\n}\n"]}
@@ -1,2 +1,2 @@
1
1
  import type { WaferMap } from '.';
2
- export declare const template: import("@microsoft/fast-element").ViewTemplate<WaferMap, any>;
2
+ export declare const template: import("@microsoft/fast-element").ViewTemplate<WaferMap<import("./types").WaferRequiredFields>, any>;