@ni/nimble-components 23.0.0 → 24.0.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.
- package/dist/all-components-bundle.js +336 -310
- package/dist/all-components-bundle.js.map +1 -1
- package/dist/all-components-bundle.min.js +3592 -3619
- package/dist/all-components-bundle.min.js.map +1 -1
- package/dist/esm/menu-button/index.d.ts +2 -2
- package/dist/esm/menu-button/index.js +4 -2
- package/dist/esm/menu-button/index.js.map +1 -1
- package/dist/esm/menu-button/template.js +1 -0
- package/dist/esm/menu-button/template.js.map +1 -1
- package/dist/esm/menu-button/types.d.ts +1 -1
- package/dist/esm/menu-button/types.js +1 -1
- package/dist/esm/menu-button/types.js.map +1 -1
- package/dist/esm/patterns/button/styles.js +42 -42
- package/dist/esm/patterns/button/styles.js.map +1 -1
- package/dist/esm/theme-provider/design-token-comments.js +0 -2
- package/dist/esm/theme-provider/design-token-comments.js.map +1 -1
- package/dist/esm/theme-provider/design-token-names.js +0 -2
- package/dist/esm/theme-provider/design-token-names.js.map +1 -1
- package/dist/esm/theme-provider/design-tokens.d.ts +0 -2
- package/dist/esm/theme-provider/design-tokens.js +4 -6
- package/dist/esm/theme-provider/design-tokens.js.map +1 -1
- package/dist/esm/toggle-button/index.d.ts +7 -1
- package/dist/esm/toggle-button/index.js +3 -0
- package/dist/esm/toggle-button/index.js.map +1 -1
- package/dist/esm/toggle-button/styles.js +27 -58
- package/dist/esm/toggle-button/styles.js.map +1 -1
- package/dist/esm/toggle-button/types.d.ts +1 -1
- package/dist/esm/toggle-button/types.js +1 -1
- package/dist/esm/toggle-button/types.js.map +1 -1
- package/dist/esm/wafer-map/index.d.ts +13 -6
- package/dist/esm/wafer-map/index.js +33 -16
- package/dist/esm/wafer-map/index.js.map +1 -1
- package/dist/esm/wafer-map/modules/data-manager.js +1 -1
- package/dist/esm/wafer-map/modules/data-manager.js.map +1 -1
- package/dist/esm/wafer-map/modules/experimental/hover-handler.d.ts +23 -0
- package/dist/esm/wafer-map/modules/experimental/hover-handler.js +80 -0
- package/dist/esm/wafer-map/modules/experimental/hover-handler.js.map +1 -0
- package/dist/esm/wafer-map/modules/{worker-renderer.d.ts → experimental/worker-renderer.d.ts} +1 -1
- package/dist/esm/wafer-map/modules/{worker-renderer.js → experimental/worker-renderer.js} +1 -1
- package/dist/esm/wafer-map/modules/experimental/worker-renderer.js.map +1 -0
- package/dist/esm/wafer-map/modules/hover-handler.d.ts +10 -2
- package/dist/esm/wafer-map/modules/hover-handler.js +43 -26
- package/dist/esm/wafer-map/modules/hover-handler.js.map +1 -1
- package/dist/esm/wafer-map/modules/prerendering.d.ts +1 -3
- package/dist/esm/wafer-map/modules/prerendering.js +5 -6
- package/dist/esm/wafer-map/modules/prerendering.js.map +1 -1
- package/dist/esm/wafer-map/modules/wafer-map-validator.js +17 -23
- package/dist/esm/wafer-map/modules/wafer-map-validator.js.map +1 -1
- package/dist/esm/wafer-map/modules/zoom-handler.d.ts +11 -7
- package/dist/esm/wafer-map/modules/zoom-handler.js +27 -37
- package/dist/esm/wafer-map/modules/zoom-handler.js.map +1 -1
- package/dist/esm/wafer-map/template.d.ts +1 -1
- package/dist/esm/wafer-map/types.d.ts +11 -0
- package/dist/esm/wafer-map/types.js.map +1 -1
- package/dist/tokens-internal.scss +0 -12
- package/dist/tokens.scss +0 -6
- package/package.json +3 -3
- package/dist/esm/wafer-map/modules/event-coordinator.d.ts +0 -19
- package/dist/esm/wafer-map/modules/event-coordinator.js +0 -35
- package/dist/esm/wafer-map/modules/event-coordinator.js.map +0 -1
- package/dist/esm/wafer-map/modules/worker-renderer.js.map +0 -1
|
@@ -5,32 +5,49 @@ import { WaferMapOriginLocation } from '../types';
|
|
|
5
5
|
export class HoverHandler {
|
|
6
6
|
constructor(wafermap) {
|
|
7
7
|
this.wafermap = wafermap;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
31
|
+
this.onMouseOut = (_event) => {
|
|
15
32
|
this.wafermap.hoverDie = undefined;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
30
|
-
|
|
42
|
+
/**
|
|
43
|
+
* @internal
|
|
44
|
+
*/
|
|
45
|
+
disconnect() {
|
|
46
|
+
this.wafermap.removeEventListener('mousemove', this.onMouseMove);
|
|
47
|
+
this.wafermap.removeEventListener('mouseout', this.onMouseOut);
|
|
31
48
|
}
|
|
32
|
-
calculateDieCoordinates(
|
|
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(
|
|
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;
|
|
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
|
|
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
|
|
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 (
|
|
24
|
-
&&
|
|
25
|
-
&&
|
|
26
|
-
&&
|
|
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
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
||
|
|
51
|
-
|| valueField
|
|
52
|
-
|| !DataType.isInt(
|
|
53
|
-
|
|
54
|
-
||
|
|
55
|
-
|
|
56
|
-
|| !DataType.
|
|
57
|
-
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAInD;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IAI1B,YAAoC,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;QAH9C,0BAAqB,GAAG,KAAK,CAAC;QAC9B,2BAAsB,GAAG,KAAK,CAAC;IAEkB,CAAC;IACnD,WAAW;QACd,OAAO;YACH,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;YACjD,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;SACtD,CAAC;IACN,CAAC;IAEM,OAAO;QACV,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;IACrE,CAAC;IAEM,sBAAsB;QACzB,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;QACnC,IACI,
|
|
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
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
|
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.
|
|
10
|
-
this.
|
|
11
|
-
this.
|
|
12
|
-
|
|
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
|
-
|
|
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.
|
|
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,
|
|
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
|
|
2
|
+
export declare const template: import("@microsoft/fast-element").ViewTemplate<WaferMap<import("./types").WaferRequiredFields>, any>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Float64, Int32 } from 'apache-arrow';
|
|
1
2
|
export declare const WaferMapOriginLocation: {
|
|
2
3
|
readonly bottomLeft: "bottom-left";
|
|
3
4
|
readonly bottomRight: "bottom-right";
|
|
@@ -29,6 +30,11 @@ export interface WaferMapDie {
|
|
|
29
30
|
metadata?: unknown;
|
|
30
31
|
tags?: string[];
|
|
31
32
|
}
|
|
33
|
+
export interface HoverDie {
|
|
34
|
+
index: number;
|
|
35
|
+
x: number;
|
|
36
|
+
y: number;
|
|
37
|
+
}
|
|
32
38
|
export interface WaferMapColorScale {
|
|
33
39
|
colors: string[];
|
|
34
40
|
values: string[];
|
|
@@ -60,3 +66,8 @@ export interface WaferMapValidity extends ValidityObject {
|
|
|
60
66
|
readonly invalidGridDimensions: boolean;
|
|
61
67
|
readonly invalidDiesTableSchema: boolean;
|
|
62
68
|
}
|
|
69
|
+
export type WaferRequiredFields = {
|
|
70
|
+
colIndex: Int32;
|
|
71
|
+
rowIndex: Int32;
|
|
72
|
+
value: Float64;
|
|
73
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/wafer-map/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/wafer-map/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IAClC,UAAU,EAAE,aAAa;IACzB,WAAW,EAAE,cAAc;IAC3B,OAAO,EAAE,UAAU;IACnB,QAAQ,EAAE,WAAW;CACf,CAAC;AAKX,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAC/B,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;CACR,CAAC;AAKX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;CACN,CAAC;AAKX,MAAM,CAAC,MAAM,sBAAsB,GAAG;IAClC,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;CACZ,CAAC","sourcesContent":["import type { Float64, Int32 } from 'apache-arrow';\n\nexport const WaferMapOriginLocation = {\n bottomLeft: 'bottom-left',\n bottomRight: 'bottom-right',\n topLeft: 'top-left',\n topRight: 'top-right'\n} as const;\n\nexport type WaferMapOriginLocation =\n (typeof WaferMapOriginLocation)[keyof typeof WaferMapOriginLocation];\n\nexport const WaferMapOrientation = {\n top: 'top',\n bottom: 'bottom',\n left: 'left',\n right: 'right'\n} as const;\n\nexport type WaferMapOrientation =\n (typeof WaferMapOrientation)[keyof typeof WaferMapOrientation];\n\nexport const HoverDieOpacity = {\n show: 'show',\n hide: 'hide'\n} as const;\n\nexport type HoverDieOpacity =\n (typeof HoverDieOpacity)[keyof typeof HoverDieOpacity];\n\nexport const WaferMapColorScaleMode = {\n linear: 'linear',\n ordinal: 'ordinal'\n} as const;\n\nexport type WaferMapColorScaleMode =\n (typeof WaferMapColorScaleMode)[keyof typeof WaferMapColorScaleMode];\n\nexport interface WaferMapDie {\n value: string;\n x: number;\n y: number;\n // The metadata field is not used by the wafer-map and is only for optionally storing arbitrary metadata.\n metadata?: unknown;\n tags?: string[];\n}\n\nexport interface HoverDie {\n index: number;\n x: number;\n y: number;\n}\n\nexport interface WaferMapColorScale {\n colors: string[];\n values: string[];\n}\n\nexport interface Dimensions {\n readonly width: number;\n readonly height: number;\n}\n\nexport interface Margin {\n readonly top: number;\n readonly right: number;\n readonly bottom: number;\n readonly left: number;\n}\n\nexport interface DieRenderInfo {\n readonly x: number;\n readonly y: number;\n readonly fillStyle: string;\n readonly text: string;\n}\n\nexport interface PointCoordinates {\n readonly x: number;\n readonly y: number;\n}\n\nexport interface ValidityObject {\n [key: string]: boolean;\n}\nexport interface WaferMapValidity extends ValidityObject {\n readonly invalidGridDimensions: boolean;\n readonly invalidDiesTableSchema: boolean;\n}\n\n// Apache arrow probably should not be using a Record and index types on TypeMap\n// because in strict checking they end up required.\n// See: https://github.com/apache/arrow/issues/12663#issuecomment-1088244575\n// We can work around that issue by using a type alias instead of an interface\n// Where index signatures are looser.\n// See: https://github.com/microsoft/TypeScript/issues/15300#issuecomment-1317901527\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport type WaferRequiredFields = {\n colIndex: Int32,\n rowIndex: Int32,\n value: Float64\n};\n"]}
|
|
@@ -44,12 +44,6 @@ $ni-nimble-internal-button-fill-primary-color: --ni-nimble-button-fill-primary-c
|
|
|
44
44
|
/// Requires SCSS interpolation to set, ie `#{$ni-nimble-internal-button-primary-font-color}: <new value>;`.
|
|
45
45
|
$ni-nimble-internal-button-primary-font-color: --ni-nimble-button-primary-font-color;
|
|
46
46
|
|
|
47
|
-
/// Internal property for $ni-nimble-button-fill-active-primary-color.
|
|
48
|
-
/// Not intended for general use. If used, inform Nimble squad of use-case.
|
|
49
|
-
/// Used to override a token value (generally making it no longer theme-aware).
|
|
50
|
-
/// Requires SCSS interpolation to set, ie `#{$ni-nimble-internal-button-fill-active-primary-color}: <new value>;`.
|
|
51
|
-
$ni-nimble-internal-button-fill-active-primary-color: --ni-nimble-button-fill-active-primary-color;
|
|
52
|
-
|
|
53
47
|
/// Internal property for $ni-nimble-button-fill-accent-color.
|
|
54
48
|
/// Not intended for general use. If used, inform Nimble squad of use-case.
|
|
55
49
|
/// Used to override a token value (generally making it no longer theme-aware).
|
|
@@ -74,12 +68,6 @@ $ni-nimble-internal-button-accent-outline-font-color: --ni-nimble-button-accent-
|
|
|
74
68
|
/// Requires SCSS interpolation to set, ie `#{$ni-nimble-internal-button-border-accent-outline-color}: <new value>;`.
|
|
75
69
|
$ni-nimble-internal-button-border-accent-outline-color: --ni-nimble-button-border-accent-outline-color;
|
|
76
70
|
|
|
77
|
-
/// Internal property for $ni-nimble-button-fill-accent-active-color.
|
|
78
|
-
/// Not intended for general use. If used, inform Nimble squad of use-case.
|
|
79
|
-
/// Used to override a token value (generally making it no longer theme-aware).
|
|
80
|
-
/// Requires SCSS interpolation to set, ie `#{$ni-nimble-internal-button-fill-accent-active-color}: <new value>;`.
|
|
81
|
-
$ni-nimble-internal-button-fill-accent-active-color: --ni-nimble-button-fill-accent-active-color;
|
|
82
|
-
|
|
83
71
|
/// Internal property for $ni-nimble-fill-selected-color.
|
|
84
72
|
/// Not intended for general use. If used, inform Nimble squad of use-case.
|
|
85
73
|
/// Used to override a token value (generally making it no longer theme-aware).
|
package/dist/tokens.scss
CHANGED
|
@@ -26,9 +26,6 @@ $ni-nimble-button-fill-primary-color: var($ni-nimble-internal-button-fill-primar
|
|
|
26
26
|
/// Font color for "primary" appearance-variant buttons
|
|
27
27
|
$ni-nimble-button-primary-font-color: var($ni-nimble-internal-button-primary-font-color);
|
|
28
28
|
|
|
29
|
-
/// Active fill color for "primary" appearance-variant buttons
|
|
30
|
-
$ni-nimble-button-fill-active-primary-color: var($ni-nimble-internal-button-fill-active-primary-color);
|
|
31
|
-
|
|
32
29
|
/// Control fill color for "accent" appearance-variant buttons
|
|
33
30
|
$ni-nimble-button-fill-accent-color: var($ni-nimble-internal-button-fill-accent-color);
|
|
34
31
|
|
|
@@ -41,9 +38,6 @@ $ni-nimble-button-accent-outline-font-color: var($ni-nimble-internal-button-acce
|
|
|
41
38
|
/// Border color for "accent" appearance-variant outline buttons
|
|
42
39
|
$ni-nimble-button-border-accent-outline-color: var($ni-nimble-internal-button-border-accent-outline-color);
|
|
43
40
|
|
|
44
|
-
/// Active fill color for "accent" appearance-variant buttons
|
|
45
|
-
$ni-nimble-button-fill-accent-active-color: var($ni-nimble-internal-button-fill-accent-active-color);
|
|
46
|
-
|
|
47
41
|
/// Control fill color when a control is selected
|
|
48
42
|
$ni-nimble-fill-selected-color: var($ni-nimble-internal-fill-selected-color);
|
|
49
43
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ni/nimble-components",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "24.0.0",
|
|
4
4
|
"description": "Styled web components for the NI Nimble Design System",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "npm run generate-icons && npm run generate-workers && npm run build-components && npm run bundle-components && npm run generate-scss && npm run build-storybook",
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"@microsoft/fast-element": "^1.12.0",
|
|
69
69
|
"@microsoft/fast-foundation": "2.49.4",
|
|
70
70
|
"@microsoft/fast-web-utilities": "^6.0.0",
|
|
71
|
-
"@ni/nimble-tokens": "^6.13.
|
|
71
|
+
"@ni/nimble-tokens": "^6.13.1",
|
|
72
72
|
"@tanstack/table-core": "^8.10.7",
|
|
73
73
|
"@tanstack/virtual-core": "^3.0.0-beta.68",
|
|
74
74
|
"@tiptap/core": "^2.2.2",
|
|
@@ -151,7 +151,7 @@
|
|
|
151
151
|
"karma-spec-reporter": "^0.0.36",
|
|
152
152
|
"karma-webkit-launcher": "^2.1.0",
|
|
153
153
|
"karma-webpack": "^5.0.0",
|
|
154
|
-
"playwright": "1.
|
|
154
|
+
"playwright": "1.42.0",
|
|
155
155
|
"prettier-eslint": "^16.3.0",
|
|
156
156
|
"prettier-eslint-cli": "^8.0.1",
|
|
157
157
|
"remark-gfm": "^3.0.1",
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { WaferMapDie } from '../types';
|
|
2
|
-
import type { WaferMap } from '..';
|
|
3
|
-
export interface EventCoordinatorCallbacks {
|
|
4
|
-
dieSelected: (die: WaferMapDie) => void;
|
|
5
|
-
}
|
|
6
|
-
/**
|
|
7
|
-
* EventCoordinator deals with user interactions and events
|
|
8
|
-
*/
|
|
9
|
-
export declare class EventCoordinator {
|
|
10
|
-
private readonly wafermap;
|
|
11
|
-
private readonly zoomHandler;
|
|
12
|
-
private readonly hoverHandler;
|
|
13
|
-
constructor(wafermap: WaferMap);
|
|
14
|
-
attachEvents(): void;
|
|
15
|
-
detachEvents(): void;
|
|
16
|
-
private readonly onWheelMove;
|
|
17
|
-
private readonly onMouseMove;
|
|
18
|
-
private readonly onMouseOut;
|
|
19
|
-
}
|