@ni/nimble-components 29.1.7 → 29.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/all-components-bundle.js +861 -470
  2. package/dist/all-components-bundle.js.map +1 -1
  3. package/dist/all-components-bundle.min.js +2873 -2758
  4. package/dist/all-components-bundle.min.js.map +1 -1
  5. package/dist/esm/all-components.d.ts +1 -0
  6. package/dist/esm/all-components.js +1 -0
  7. package/dist/esm/all-components.js.map +1 -1
  8. package/dist/esm/combobox/template.js +1 -1
  9. package/dist/esm/combobox/template.js.map +1 -1
  10. package/dist/esm/list-option/template.js +1 -0
  11. package/dist/esm/list-option/template.js.map +1 -1
  12. package/dist/esm/list-option-group/index.d.ts +65 -0
  13. package/dist/esm/list-option-group/index.js +130 -0
  14. package/dist/esm/list-option-group/index.js.map +1 -0
  15. package/dist/esm/list-option-group/styles.d.ts +1 -0
  16. package/dist/esm/list-option-group/styles.js +62 -0
  17. package/dist/esm/list-option-group/styles.js.map +1 -0
  18. package/dist/esm/list-option-group/template.d.ts +2 -0
  19. package/dist/esm/list-option-group/template.js +37 -0
  20. package/dist/esm/list-option-group/template.js.map +1 -0
  21. package/dist/esm/rich-text/mention-listbox/template.js +3 -3
  22. package/dist/esm/rich-text/mention-listbox/template.js.map +1 -1
  23. package/dist/esm/select/index.d.ts +11 -2
  24. package/dist/esm/select/index.js +149 -36
  25. package/dist/esm/select/index.js.map +1 -1
  26. package/dist/esm/select/template.d.ts +4 -0
  27. package/dist/esm/select/template.js +11 -2
  28. package/dist/esm/select/template.js.map +1 -1
  29. package/dist/esm/select/testing/select.pageobject.d.ts +4 -1
  30. package/dist/esm/select/testing/select.pageobject.js +15 -0
  31. package/dist/esm/select/testing/select.pageobject.js.map +1 -1
  32. package/dist/esm/wafer-map/{modules/experimental → experimental}/computations.d.ts +25 -8
  33. package/dist/esm/wafer-map/{modules/experimental → experimental}/computations.js +87 -8
  34. package/dist/esm/wafer-map/experimental/computations.js.map +1 -0
  35. package/dist/esm/wafer-map/{modules/experimental → experimental}/hover-handler.d.ts +1 -1
  36. package/dist/esm/wafer-map/{modules/experimental → experimental}/hover-handler.js +3 -5
  37. package/dist/esm/wafer-map/experimental/hover-handler.js.map +1 -0
  38. package/dist/esm/wafer-map/experimental/worker-renderer.d.ts +24 -0
  39. package/dist/esm/wafer-map/experimental/worker-renderer.js +75 -0
  40. package/dist/esm/wafer-map/experimental/worker-renderer.js.map +1 -0
  41. package/dist/esm/wafer-map/index.d.ts +4 -3
  42. package/dist/esm/wafer-map/index.js +54 -18
  43. package/dist/esm/wafer-map/index.js.map +1 -1
  44. package/dist/esm/wafer-map/modules/computations.d.ts +1 -1
  45. package/dist/esm/wafer-map/modules/computations.js.map +1 -1
  46. package/dist/esm/wafer-map/modules/data-manager.d.ts +2 -1
  47. package/dist/esm/wafer-map/modules/data-manager.js.map +1 -1
  48. package/dist/esm/wafer-map/modules/prerendering.js.map +1 -1
  49. package/dist/esm/wafer-map/modules/wafer-map-update-tracker.d.ts +4 -0
  50. package/dist/esm/wafer-map/modules/wafer-map-update-tracker.js +37 -2
  51. package/dist/esm/wafer-map/modules/wafer-map-update-tracker.js.map +1 -1
  52. package/dist/esm/wafer-map/types.d.ts +0 -16
  53. package/dist/esm/wafer-map/types.js.map +1 -1
  54. package/dist/esm/wafer-map/workers/matrix-renderer.d.ts +1 -1
  55. package/dist/esm/wafer-map/workers/matrix-renderer.js +1 -1
  56. package/dist/esm/wafer-map/workers/matrix-renderer.js.map +1 -1
  57. package/dist/esm/wafer-map/workers/types.d.ts +39 -0
  58. package/dist/esm/wafer-map/workers/types.js +2 -0
  59. package/dist/esm/wafer-map/workers/types.js.map +1 -0
  60. package/package.json +1 -1
  61. package/dist/esm/wafer-map/modules/experimental/computations.js.map +0 -1
  62. package/dist/esm/wafer-map/modules/experimental/data-manager.d.ts +0 -21
  63. package/dist/esm/wafer-map/modules/experimental/data-manager.js +0 -41
  64. package/dist/esm/wafer-map/modules/experimental/data-manager.js.map +0 -1
  65. package/dist/esm/wafer-map/modules/experimental/hover-handler.js.map +0 -1
  66. package/dist/esm/wafer-map/modules/experimental/prerendering.d.ts +0 -18
  67. package/dist/esm/wafer-map/modules/experimental/prerendering.js +0 -63
  68. package/dist/esm/wafer-map/modules/experimental/prerendering.js.map +0 -1
  69. package/dist/esm/wafer-map/modules/experimental/worker-renderer.d.ts +0 -13
  70. package/dist/esm/wafer-map/modules/experimental/worker-renderer.js +0 -96
  71. package/dist/esm/wafer-map/modules/experimental/worker-renderer.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/select/template.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n html,\n ref,\n slotted,\n ViewTemplate,\n when\n} from '@microsoft/fast-element';\nimport {\n endSlotTemplate,\n FoundationElementTemplate,\n SelectOptions,\n startSlotTemplate,\n isListboxOption\n} from '@microsoft/fast-foundation';\nimport type { Select } from '.';\nimport { anchoredRegionTag } from '../anchored-region';\nimport { DropdownPosition } from '../patterns/dropdown/types';\nimport { overflow } from '../utilities/directive/overflow';\nimport { iconMagnifyingGlassTag } from '../icons/magnifying-glass';\nimport {\n filterNoResultsLabel,\n filterSearchLabel\n} from '../label-provider/core/label-tokens';\nimport { FilterMode } from './types';\nimport { buttonTag } from '../button';\nimport { iconTimesTag } from '../icons/times';\n\n/* eslint-disable @typescript-eslint/indent */\n// prettier-ignore\nexport const template: FoundationElementTemplate<\nViewTemplate<Select>,\nSelectOptions\n> = (context, definition) => html<Select>`\n <template\n class=\"${x => [\n x.collapsible && 'collapsible',\n x.collapsible && x.open && 'open',\n x.disabled && 'disabled',\n x.collapsible && x.position,\n ].filter(Boolean).join(' ')}\"\n aria-activedescendant=\"${x => (x.filterMode === FilterMode.none ? x.ariaActiveDescendant : null)}\"\n aria-controls=\"${x => (x.filterMode === FilterMode.none ? x.ariaControls : null)}\"\n aria-disabled=\"${x => x.ariaDisabled}\"\n aria-expanded=\"${x => x.ariaExpanded}\"\n aria-haspopup=\"${x => (x.collapsible ? 'listbox' : null)}\"\n aria-multiselectable=\"${x => x.ariaMultiSelectable}\"\n ?open=\"${x => x.open}\"\n role=\"combobox\"\n tabindex=\"${x => (!x.disabled ? '0' : null)}\"\n @click=\"${(x, c) => x.clickHandler(c.event as MouseEvent)}\"\n @contentchange=\"${x => x.updateDisplayValue()}\"\n @focusin=\"${(x, c) => x.focusinHandler(c.event as FocusEvent)}\"\n @focusout=\"${(x, c) => x.focusoutHandler(c.event as FocusEvent)}\"\n @keydown=\"${(x, c) => x.keydownHandler(c.event as KeyboardEvent)}\"\n @mousedown=\"${(x, c) => x.mousedownHandler(c.event as MouseEvent)}\"\n >\n ${when(x => x.collapsible, html<Select>`\n <div\n class=\"control\"\n part=\"control\"\n ?disabled=\"${x => x.disabled}\"\n ${ref('control')}\n >\n ${startSlotTemplate(context, definition)}\n <slot name=\"button-container\">\n <div class=\"selected-value ${x => (x.displayPlaceholder ? 'placeholder' : '')}\" part=\"selected-value\" ${overflow('hasOverflow')} title=${x => (x.hasOverflow && x.displayValue ? x.displayValue : null)}>\n <slot name=\"selected-value\">${x => x.displayValue}</slot>\n </div>\n ${when(x => !x.disabled && x.clearable && !x.displayPlaceholder && x.selectedIndex >= 0, html<Select>`\n <${buttonTag} \n class=\"clear-button\"\n tabindex=\"-1\"\n part=\"clear-button\"\n content-hidden\n appearance=\"ghost\"\n @click=\"${(x, c) => x.clearClickHandler(c.event as MouseEvent)}\">\n <${iconTimesTag} slot=\"start\"></${iconTimesTag}>\n </${buttonTag}>\n `)}\n <div aria-hidden=\"true\" class=\"indicator\" part=\"indicator\">\n <slot name=\"indicator\">\n ${definition.indicator || ''}\n </slot>\n </div>\n </slot>\n ${endSlotTemplate(context, definition)}\n </div>\n `)\n }\n <${anchoredRegionTag}\n ${ref('anchoredRegion')}\n class=\"anchored-region\"\n fixed-placement\n auto-update-mode=\"auto\"\n vertical-default-position=\"${x => (x.positionAttribute === DropdownPosition.above ? 'top' : 'bottom')}\"\n vertical-positioning-mode=\"${x => (!x.positionAttribute ? 'dynamic' : 'locktodefault')}\"\n horizontal-default-position=\"center\"\n horizontal-positioning-mode=\"locktodefault\"\n horizontal-scaling=\"anchor\"\n @loaded=\"${x => x.regionLoadedHandler()}\"\n ?hidden=\"${x => (x.collapsible ? !x.open : false)}\">\n <div class=\"listbox-background\">\n <div\n class=\"\n listbox \n ${x => (x.filteredOptions.length === 0 ? 'empty' : '')}\n ${x => x.positionAttribute}\n \"\n id=\"${x => x.listboxId}\"\n part=\"listbox\"\n role=\"listbox\"\n ?disabled=\"${x => x.disabled}\"\n ${ref('listbox')}\n >\n ${when(x => x.filterMode !== FilterMode.none, html<Select>`\n <div class=\"filter-field ${x => x.positionAttribute}\">\n <${iconMagnifyingGlassTag} class=\"filter-icon\"></${iconMagnifyingGlassTag}>\n <input\n ${ref('filterInput')}\n class=\"filter-input\"\n aria-controls=\"${x => x.ariaControls}\"\n aria-activedescendant=\"${x => x.ariaActiveDescendant}\"\n @input=\"${(x, c) => x.inputHandler(c.event as InputEvent)}\"\n @click=\"${(x, c) => x.inputClickHandler(c.event as MouseEvent)}\"\n placeholder=\"${x => filterSearchLabel.getValueFor(x)}\"\n value=\"${x => x.filter}\"\n />\n </div>\n `)}\n <div ${ref('scrollableRegion')}\n class=\"scrollable-region\">\n <slot\n ${slotted({\n filter: (n: Node) => n instanceof HTMLElement && isListboxOption(n),\n flatten: true,\n property: 'slottedOptions',\n })}\n ></slot>\n </div>\n ${when(x => (x.filterMode !== FilterMode.none && x.filteredOptions.length === 0), html<Select>`\n <span class=\"no-results-label ${x => x.positionAttribute}\">\n ${x => filterNoResultsLabel.getValueFor(x)}\n </span>\n `)}\n </div>\n </div>\n </${anchoredRegionTag}>\n </template>\n`;\n"]}
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/select/template.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n html,\n ref,\n slotted,\n ViewTemplate,\n when\n} from '@microsoft/fast-element';\nimport {\n endSlotTemplate,\n FoundationElementTemplate,\n SelectOptions,\n startSlotTemplate\n} from '@microsoft/fast-foundation';\nimport type { Select } from '.';\nimport { anchoredRegionTag } from '../anchored-region';\nimport { DropdownPosition } from '../patterns/dropdown/types';\nimport { overflow } from '../utilities/directive/overflow';\nimport { iconMagnifyingGlassTag } from '../icons/magnifying-glass';\nimport {\n filterNoResultsLabel,\n filterSearchLabel\n} from '../label-provider/core/label-tokens';\nimport { FilterMode } from './types';\nimport { ListOptionGroup } from '../list-option-group';\nimport { buttonTag } from '../button';\nimport { iconTimesTag } from '../icons/times';\nimport { ListOption } from '../list-option';\n\nexport const isListOption = (\n el: Element | undefined | null\n): el is ListOption => {\n return el instanceof ListOption;\n};\n\nexport const isListOptionGroup = (\n n: Element | undefined | null\n): n is ListOptionGroup => {\n return n instanceof ListOptionGroup;\n};\n\n/* eslint-disable @typescript-eslint/indent */\n// prettier-ignore\nexport const template: FoundationElementTemplate<\nViewTemplate<Select>,\nSelectOptions\n> = (context, definition) => html<Select>`\n <template\n class=\"${x => [\n x.collapsible && 'collapsible',\n x.collapsible && x.open && 'open',\n x.disabled && 'disabled',\n x.collapsible && x.position,\n ].filter(Boolean).join(' ')}\"\n aria-activedescendant=\"${x => (x.filterMode === FilterMode.none ? x.ariaActiveDescendant : null)}\"\n aria-controls=\"${x => (x.filterMode === FilterMode.none ? x.ariaControls : null)}\"\n aria-disabled=\"${x => x.ariaDisabled}\"\n aria-expanded=\"${x => x.ariaExpanded}\"\n aria-haspopup=\"${x => (x.collapsible ? 'listbox' : null)}\"\n aria-multiselectable=\"${x => x.ariaMultiSelectable}\"\n ?open=\"${x => x.open}\"\n role=\"combobox\"\n tabindex=\"${x => (!x.disabled ? '0' : null)}\"\n @click=\"${(x, c) => x.clickHandler(c.event as MouseEvent)}\"\n @contentchange=\"${x => x.updateDisplayValue()}\"\n @focusin=\"${(x, c) => x.focusinHandler(c.event as FocusEvent)}\"\n @focusout=\"${(x, c) => x.focusoutHandler(c.event as FocusEvent)}\"\n @keydown=\"${(x, c) => x.keydownHandler(c.event as KeyboardEvent)}\"\n @mousedown=\"${(x, c) => x.mousedownHandler(c.event as MouseEvent)}\"\n >\n ${when(x => x.collapsible, html<Select>`\n <div\n class=\"control\"\n part=\"control\"\n ?disabled=\"${x => x.disabled}\"\n ${ref('control')}\n >\n ${startSlotTemplate(context, definition)}\n <slot name=\"button-container\">\n <div class=\"selected-value ${x => (x.displayPlaceholder ? 'placeholder' : '')}\" part=\"selected-value\" ${overflow('hasOverflow')} title=${x => (x.hasOverflow && x.displayValue ? x.displayValue : null)}>\n <slot name=\"selected-value\">${x => x.displayValue}</slot>\n </div>\n ${when(x => !x.disabled && x.clearable && !x.displayPlaceholder && x.selectedIndex >= 0, html<Select>`\n <${buttonTag} \n class=\"clear-button\"\n tabindex=\"-1\"\n part=\"clear-button\"\n content-hidden\n appearance=\"ghost\"\n @click=\"${(x, c) => x.clearClickHandler(c.event as MouseEvent)}\">\n <${iconTimesTag} slot=\"start\"></${iconTimesTag}>\n </${buttonTag}>\n `)}\n <div aria-hidden=\"true\" class=\"indicator\" part=\"indicator\">\n <slot name=\"indicator\">\n ${definition.indicator || ''}\n </slot>\n </div>\n </slot>\n ${endSlotTemplate(context, definition)}\n </div>\n `)\n }\n <${anchoredRegionTag}\n ${ref('anchoredRegion')}\n class=\"anchored-region\"\n fixed-placement\n auto-update-mode=\"auto\"\n vertical-default-position=\"${x => (x.positionAttribute === DropdownPosition.above ? 'top' : 'bottom')}\"\n vertical-positioning-mode=\"${x => (!x.positionAttribute ? 'dynamic' : 'locktodefault')}\"\n horizontal-default-position=\"center\"\n horizontal-positioning-mode=\"locktodefault\"\n horizontal-scaling=\"anchor\"\n @loaded=\"${x => x.regionLoadedHandler()}\"\n ?hidden=\"${x => (x.collapsible ? !x.open : false)}\">\n <div class=\"listbox-background\">\n <div\n class=\"\n listbox \n ${x => (x.filteredOptions.length === 0 ? 'empty' : '')}\n ${x => x.positionAttribute}\n \"\n id=\"${x => x.listboxId}\"\n part=\"listbox\"\n role=\"listbox\"\n ?disabled=\"${x => x.disabled}\"\n ${ref('listbox')}\n >\n ${when(x => x.filterMode !== FilterMode.none, html<Select>`\n <div class=\"filter-field ${x => x.positionAttribute}\">\n <${iconMagnifyingGlassTag} class=\"filter-icon\"></${iconMagnifyingGlassTag}>\n <input\n ${ref('filterInput')}\n class=\"filter-input\"\n aria-controls=\"${x => x.ariaControls}\"\n aria-activedescendant=\"${x => x.ariaActiveDescendant}\"\n @input=\"${(x, c) => x.inputHandler(c.event as InputEvent)}\"\n @click=\"${(x, c) => x.inputClickHandler(c.event as MouseEvent)}\"\n placeholder=\"${x => filterSearchLabel.getValueFor(x)}\"\n value=\"${x => x.filter}\"\n />\n </div>\n `)}\n <div ${ref('scrollableRegion')}\n class=\"scrollable-region\">\n <slot\n name=\"option\"\n ${slotted({\n filter: (n: Node) => n instanceof HTMLElement && (isListOption(n) || isListOptionGroup(n)),\n flatten: true,\n property: 'slottedOptions',\n })}\n ></slot>\n </div>\n ${when(x => (x.filterMode !== FilterMode.none && x.filteredOptions.length === 0), html<Select>`\n <span class=\"no-results-label ${x => x.positionAttribute}\">\n ${x => filterNoResultsLabel.getValueFor(x)}\n </span>\n `)}\n </div>\n </div>\n </${anchoredRegionTag}>\n </template>\n`;\n"]}
@@ -5,7 +5,7 @@ import type { ListOption } from '../../list-option';
5
5
  * of querying and interacting with the component during tests.
6
6
  */
7
7
  export declare class SelectPageObject {
8
- private readonly selectElement;
8
+ protected readonly selectElement: Select;
9
9
  constructor(selectElement: Select);
10
10
  openAndSetFilterText(filterText: string): Promise<void>;
11
11
  closeDropdown(): Promise<void>;
@@ -14,6 +14,8 @@ export declare class SelectPageObject {
14
14
  getSelectedOption(): ListOption | null;
15
15
  getActiveOption(): ListOption | null;
16
16
  getDisplayText(): string;
17
+ getGroupLabels(): string[];
18
+ getGroupOptionLabels(groupIndex: number): string[];
17
19
  /**
18
20
  * Either opens or closes the dropdown depending on its current state
19
21
  */
@@ -35,6 +37,7 @@ export declare class SelectPageObject {
35
37
  pressArrowUpKey(): void;
36
38
  pressCharacterKey(character: string): void;
37
39
  pressSpaceKey(): Promise<void>;
40
+ clearFilter(): void;
38
41
  isDropdownVisible(): boolean;
39
42
  isClearButtonVisible(): boolean;
40
43
  isFilterInputVisible(): boolean;
@@ -48,6 +48,13 @@ export class SelectPageObject {
48
48
  ?.textContent ?? '';
49
49
  return displayText.trim();
50
50
  }
51
+ getGroupLabels() {
52
+ return Array.from(this.selectElement.querySelectorAll('[role="group"]') ?? []).map(group => group.labelContent);
53
+ }
54
+ getGroupOptionLabels(groupIndex) {
55
+ const group = Array.from(this.selectElement.querySelectorAll('[role="group"]') ?? [])[groupIndex];
56
+ return Array.from(group?.querySelectorAll('[role="option"]') ?? []).map(option => option.textContent?.trim() ?? '');
57
+ }
51
58
  /**
52
59
  * Either opens or closes the dropdown depending on its current state
53
60
  */
@@ -155,6 +162,14 @@ export class SelectPageObject {
155
162
  }
156
163
  await waitForUpdatesAsync();
157
164
  }
165
+ clearFilter() {
166
+ if (this.selectElement.filterMode === FilterMode.none) {
167
+ throw new Error('Select has filterMode of "none" so there is no filter input');
168
+ }
169
+ const filterInput = this.getFilterInput();
170
+ filterInput.value = '';
171
+ filterInput?.dispatchEvent(new InputEvent('input', { inputType: 'deleteContentBackward' }));
172
+ }
158
173
  isDropdownVisible() {
159
174
  return (this.selectElement.shadowRoot?.querySelector('.listbox') !== null);
160
175
  }
@@ -1 +1 @@
1
- {"version":3,"file":"select.pageobject.js","sourceRoot":"","sources":["../../../../src/select/testing/select.pageobject.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n keyEnter,\n keyEscape,\n keyArrowDown,\n keyArrowUp,\n keySpace,\n keyTab\n} from '@microsoft/fast-web-utilities';\nimport type { Select } from '..';\nimport type { ListOption } from '../../list-option';\nimport { waitForUpdatesAsync } from '../../testing/async-helpers';\nimport { FilterMode } from '../types';\nimport type { Button } from '../../button';\n\n/**\n * Page object for the `nimble-select` component to provide consistent ways\n * of querying and interacting with the component during tests.\n */\nexport class SelectPageObject {\n public constructor(private readonly selectElement: Select) {}\n\n public async openAndSetFilterText(filterText: string): Promise<void> {\n if (this.selectElement.filterMode === FilterMode.none) {\n throw new Error(\n 'Can not set filter text with filterMode set to \"none\".'\n );\n }\n this.clickSelect();\n const filterInput = this.getFilterInput();\n if (filterInput) {\n filterInput.value = filterText;\n }\n\n await waitForUpdatesAsync();\n const inputEvent = new InputEvent('input');\n filterInput?.dispatchEvent(inputEvent);\n await waitForUpdatesAsync();\n }\n\n public async closeDropdown(): Promise<void> {\n this.selectElement.open = false;\n await waitForUpdatesAsync();\n }\n\n public async setOptions(options: ListOption[]): Promise<void> {\n options.forEach(option => {\n option.setAttribute('role', 'option');\n });\n this.selectElement.slottedOptions = options;\n await waitForUpdatesAsync();\n }\n\n public getFilteredOptions(): ListOption[] {\n return this.selectElement.filteredOptions as ListOption[];\n }\n\n public getSelectedOption(): ListOption | null {\n return (this.selectElement.selectedOptions[0] as ListOption) ?? null;\n }\n\n public getActiveOption(): ListOption | null {\n return (\n (this.selectElement.options.find(\n o => (o as ListOption).activeOption\n ) as ListOption) ?? null\n );\n }\n\n public getDisplayText(): string {\n const displayText = this.selectElement.shadowRoot?.querySelector('.selected-value')\n ?.textContent ?? '';\n return displayText.trim();\n }\n\n /**\n * Either opens or closes the dropdown depending on its current state\n */\n public clickSelect(): void {\n this.selectElement.click();\n }\n\n public clickActiveItem(): void {\n if (!this.selectElement.open) {\n throw new Error('Select must be open to click selectedItem');\n }\n\n const selectedOption = this.getActiveOption();\n if (!selectedOption) {\n throw new Error('No option is selected to click');\n }\n this.clickOption(this.selectElement.options.indexOf(selectedOption));\n }\n\n public async clickFilterInput(): Promise<void> {\n if (!this.selectElement.filterInput) {\n throw new Error('Filter input is not available.');\n }\n this.selectElement.filterInput.click();\n await waitForUpdatesAsync();\n }\n\n public clickOption(index: number): void {\n if (index >= this.selectElement.options.length) {\n throw new Error(\n '\"index\" greater than number of current displayed options'\n );\n }\n\n const option = this.selectElement.options[index]!;\n option.scrollIntoView();\n option.click();\n }\n\n /**\n * Click the option with the text provided by the 'displayText' parameter.\n * @param value The text of the option to be selected\n */\n public clickOptionWithDisplayText(displayText: string): void {\n if (!this.selectElement.open) {\n this.clickSelect();\n }\n const optionIndex = this.selectElement.options.findIndex(\n o => o.text === displayText\n );\n if (optionIndex === -1) {\n throw new Error(`No option with \"text\" of ${displayText}`);\n }\n\n this.clickOption(optionIndex);\n }\n\n public clickClearButton(): void {\n if (!this.selectElement.clearable) {\n throw new Error(\n 'Select must set \"clearable\" in order to click clear button'\n );\n }\n\n if (\n this.selectElement.selectedIndex === -1\n || this.selectElement.displayPlaceholder\n ) {\n throw new Error(\n 'Select must have a selected element in order to click clear button'\n );\n }\n\n const clearButton = this.getClearButton();\n clearButton?.click();\n }\n\n public async clickAway(): Promise<void> {\n this.selectElement.dispatchEvent(new Event('focusout'));\n await waitForUpdatesAsync();\n }\n\n public pressEnterKey(): void {\n this.selectElement.dispatchEvent(\n new KeyboardEvent('keydown', { key: keyEnter })\n );\n }\n\n public pressEscapeKey(): void {\n this.selectElement.dispatchEvent(\n new KeyboardEvent('keydown', { key: keyEscape })\n );\n }\n\n public pressTabKey(): void {\n this.selectElement.dispatchEvent(\n new KeyboardEvent('keydown', { key: keyTab })\n );\n this.selectElement.dispatchEvent(new FocusEvent('focusout'));\n }\n\n public pressArrowDownKey(): void {\n this.selectElement.dispatchEvent(\n new KeyboardEvent('keydown', { key: keyArrowDown })\n );\n }\n\n public pressArrowUpKey(): void {\n this.selectElement.dispatchEvent(\n new KeyboardEvent('keydown', { key: keyArrowUp })\n );\n }\n\n public pressCharacterKey(character: string): void {\n if (character.length !== 1) {\n throw new Error(\n 'character parameter must contain only a single character'\n );\n }\n\n if (\n this.selectElement.open\n && this.selectElement.filterMode !== FilterMode.none\n ) {\n const filterInput = this.selectElement.filterInput!;\n filterInput.value += character;\n }\n const inputElement = this.selectElement.open\n && this.selectElement.filterMode !== FilterMode.none\n ? this.selectElement.filterInput\n : this.selectElement;\n inputElement!.dispatchEvent(new InputEvent('input'));\n this.selectElement.dispatchEvent(\n new KeyboardEvent('keydown', { key: character })\n );\n }\n\n public async pressSpaceKey(): Promise<void> {\n const alreadyOpen = this.selectElement.open;\n this.selectElement.dispatchEvent(\n new KeyboardEvent('keydown', { key: keySpace, bubbles: true })\n );\n await waitForUpdatesAsync();\n if (\n this.selectElement.filterMode === FilterMode.standard\n && alreadyOpen\n ) {\n // add space to end of current filter\n const filterValue = `${\n this.selectElement.filterInput?.value ?? ''\n } `;\n if (this.selectElement.filterInput) {\n this.selectElement.filterInput.value = filterValue;\n }\n this.selectElement.filterInput?.dispatchEvent(\n new InputEvent('input', { inputType: 'insertText' })\n );\n }\n await waitForUpdatesAsync();\n }\n\n public isDropdownVisible(): boolean {\n return (\n this.selectElement.shadowRoot?.querySelector('.listbox') !== null\n );\n }\n\n public isClearButtonVisible(): boolean {\n return this.getClearButton() != null;\n }\n\n public isFilterInputVisible(): boolean {\n return (\n this.selectElement.shadowRoot?.querySelector('.filter-field')\n !== null\n );\n }\n\n public isOptionVisible(index: number): boolean {\n if (index >= this.selectElement.options.length) {\n throw new Error('Indexing past number of options');\n }\n const option = this.selectElement.options[index]!;\n const optionRects = option.getClientRects();\n return optionRects.length > 0 && optionRects[0]!.height !== 0;\n }\n\n public isNoResultsLabelVisible(): boolean {\n return (\n this.selectElement.shadowRoot?.querySelector(\n '.no-results-label'\n ) !== null\n );\n }\n\n public getFilterInputText(): string {\n return this.selectElement.filterInput?.value ?? '';\n }\n\n private getFilterInput(): HTMLInputElement | null | undefined {\n if (this.selectElement.filterMode === FilterMode.none) {\n throw new Error(\n 'Select has filterMode of \"none\" so there is no filter input'\n );\n }\n return this.selectElement.filterInput;\n }\n\n private getClearButton(): Button | null | undefined {\n return this.selectElement.shadowRoot?.querySelector<Button>(\n '.clear-button'\n );\n }\n}\n"]}
1
+ {"version":3,"file":"select.pageobject.js","sourceRoot":"","sources":["../../../../src/select/testing/select.pageobject.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n keyEnter,\n keyEscape,\n keyArrowDown,\n keyArrowUp,\n keySpace,\n keyTab\n} from '@microsoft/fast-web-utilities';\nimport type { Select } from '..';\nimport type { ListOption } from '../../list-option';\nimport { waitForUpdatesAsync } from '../../testing/async-helpers';\nimport { FilterMode } from '../types';\nimport type { Button } from '../../button';\nimport type { ListOptionGroup } from '../../list-option-group';\n\n/**\n * Page object for the `nimble-select` component to provide consistent ways\n * of querying and interacting with the component during tests.\n */\nexport class SelectPageObject {\n public constructor(protected readonly selectElement: Select) {}\n\n public async openAndSetFilterText(filterText: string): Promise<void> {\n if (this.selectElement.filterMode === FilterMode.none) {\n throw new Error(\n 'Can not set filter text with filterMode set to \"none\".'\n );\n }\n this.clickSelect();\n const filterInput = this.getFilterInput();\n if (filterInput) {\n filterInput.value = filterText;\n }\n\n await waitForUpdatesAsync();\n const inputEvent = new InputEvent('input');\n filterInput?.dispatchEvent(inputEvent);\n await waitForUpdatesAsync();\n }\n\n public async closeDropdown(): Promise<void> {\n this.selectElement.open = false;\n await waitForUpdatesAsync();\n }\n\n public async setOptions(options: ListOption[]): Promise<void> {\n options.forEach(option => {\n option.setAttribute('role', 'option');\n });\n this.selectElement.slottedOptions = options;\n await waitForUpdatesAsync();\n }\n\n public getFilteredOptions(): ListOption[] {\n return this.selectElement.filteredOptions as ListOption[];\n }\n\n public getSelectedOption(): ListOption | null {\n return (this.selectElement.selectedOptions[0] as ListOption) ?? null;\n }\n\n public getActiveOption(): ListOption | null {\n return (\n (this.selectElement.options.find(\n o => (o as ListOption).activeOption\n ) as ListOption) ?? null\n );\n }\n\n public getDisplayText(): string {\n const displayText = this.selectElement.shadowRoot?.querySelector('.selected-value')\n ?.textContent ?? '';\n return displayText.trim();\n }\n\n public getGroupLabels(): string[] {\n return Array.from(\n this.selectElement.querySelectorAll<ListOptionGroup>(\n '[role=\"group\"]'\n ) ?? []\n ).map(group => group.labelContent);\n }\n\n public getGroupOptionLabels(groupIndex: number): string[] {\n const group = Array.from(\n this.selectElement.querySelectorAll<ListOptionGroup>(\n '[role=\"group\"]'\n ) ?? []\n )[groupIndex];\n return Array.from(\n group?.querySelectorAll<ListOption>('[role=\"option\"]') ?? []\n ).map(option => option.textContent?.trim() ?? '');\n }\n\n /**\n * Either opens or closes the dropdown depending on its current state\n */\n public clickSelect(): void {\n this.selectElement.click();\n }\n\n public clickActiveItem(): void {\n if (!this.selectElement.open) {\n throw new Error('Select must be open to click selectedItem');\n }\n\n const selectedOption = this.getActiveOption();\n if (!selectedOption) {\n throw new Error('No option is selected to click');\n }\n this.clickOption(this.selectElement.options.indexOf(selectedOption));\n }\n\n public async clickFilterInput(): Promise<void> {\n if (!this.selectElement.filterInput) {\n throw new Error('Filter input is not available.');\n }\n this.selectElement.filterInput.click();\n await waitForUpdatesAsync();\n }\n\n public clickOption(index: number): void {\n if (index >= this.selectElement.options.length) {\n throw new Error(\n '\"index\" greater than number of current displayed options'\n );\n }\n\n const option = this.selectElement.options[index]!;\n option.scrollIntoView();\n option.click();\n }\n\n /**\n * Click the option with the text provided by the 'displayText' parameter.\n * @param value The text of the option to be selected\n */\n public clickOptionWithDisplayText(displayText: string): void {\n if (!this.selectElement.open) {\n this.clickSelect();\n }\n const optionIndex = this.selectElement.options.findIndex(\n o => o.text === displayText\n );\n if (optionIndex === -1) {\n throw new Error(`No option with \"text\" of ${displayText}`);\n }\n\n this.clickOption(optionIndex);\n }\n\n public clickClearButton(): void {\n if (!this.selectElement.clearable) {\n throw new Error(\n 'Select must set \"clearable\" in order to click clear button'\n );\n }\n\n if (\n this.selectElement.selectedIndex === -1\n || this.selectElement.displayPlaceholder\n ) {\n throw new Error(\n 'Select must have a selected element in order to click clear button'\n );\n }\n\n const clearButton = this.getClearButton();\n clearButton?.click();\n }\n\n public async clickAway(): Promise<void> {\n this.selectElement.dispatchEvent(new Event('focusout'));\n await waitForUpdatesAsync();\n }\n\n public pressEnterKey(): void {\n this.selectElement.dispatchEvent(\n new KeyboardEvent('keydown', { key: keyEnter })\n );\n }\n\n public pressEscapeKey(): void {\n this.selectElement.dispatchEvent(\n new KeyboardEvent('keydown', { key: keyEscape })\n );\n }\n\n public pressTabKey(): void {\n this.selectElement.dispatchEvent(\n new KeyboardEvent('keydown', { key: keyTab })\n );\n this.selectElement.dispatchEvent(new FocusEvent('focusout'));\n }\n\n public pressArrowDownKey(): void {\n this.selectElement.dispatchEvent(\n new KeyboardEvent('keydown', { key: keyArrowDown })\n );\n }\n\n public pressArrowUpKey(): void {\n this.selectElement.dispatchEvent(\n new KeyboardEvent('keydown', { key: keyArrowUp })\n );\n }\n\n public pressCharacterKey(character: string): void {\n if (character.length !== 1) {\n throw new Error(\n 'character parameter must contain only a single character'\n );\n }\n\n if (\n this.selectElement.open\n && this.selectElement.filterMode !== FilterMode.none\n ) {\n const filterInput = this.selectElement.filterInput!;\n filterInput.value += character;\n }\n const inputElement = this.selectElement.open\n && this.selectElement.filterMode !== FilterMode.none\n ? this.selectElement.filterInput\n : this.selectElement;\n inputElement!.dispatchEvent(new InputEvent('input'));\n this.selectElement.dispatchEvent(\n new KeyboardEvent('keydown', { key: character })\n );\n }\n\n public async pressSpaceKey(): Promise<void> {\n const alreadyOpen = this.selectElement.open;\n this.selectElement.dispatchEvent(\n new KeyboardEvent('keydown', { key: keySpace, bubbles: true })\n );\n await waitForUpdatesAsync();\n if (\n this.selectElement.filterMode === FilterMode.standard\n && alreadyOpen\n ) {\n // add space to end of current filter\n const filterValue = `${\n this.selectElement.filterInput?.value ?? ''\n } `;\n if (this.selectElement.filterInput) {\n this.selectElement.filterInput.value = filterValue;\n }\n this.selectElement.filterInput?.dispatchEvent(\n new InputEvent('input', { inputType: 'insertText' })\n );\n }\n await waitForUpdatesAsync();\n }\n\n public clearFilter(): void {\n if (this.selectElement.filterMode === FilterMode.none) {\n throw new Error(\n 'Select has filterMode of \"none\" so there is no filter input'\n );\n }\n const filterInput = this.getFilterInput();\n filterInput!.value = '';\n filterInput?.dispatchEvent(\n new InputEvent('input', { inputType: 'deleteContentBackward' })\n );\n }\n\n public isDropdownVisible(): boolean {\n return (\n this.selectElement.shadowRoot?.querySelector('.listbox') !== null\n );\n }\n\n public isClearButtonVisible(): boolean {\n return this.getClearButton() != null;\n }\n\n public isFilterInputVisible(): boolean {\n return (\n this.selectElement.shadowRoot?.querySelector('.filter-field')\n !== null\n );\n }\n\n public isOptionVisible(index: number): boolean {\n if (index >= this.selectElement.options.length) {\n throw new Error('Indexing past number of options');\n }\n const option = this.selectElement.options[index]!;\n const optionRects = option.getClientRects();\n return optionRects.length > 0 && optionRects[0]!.height !== 0;\n }\n\n public isNoResultsLabelVisible(): boolean {\n return (\n this.selectElement.shadowRoot?.querySelector(\n '.no-results-label'\n ) !== null\n );\n }\n\n public getFilterInputText(): string {\n return this.selectElement.filterInput?.value ?? '';\n }\n\n private getFilterInput(): HTMLInputElement | null | undefined {\n if (this.selectElement.filterMode === FilterMode.none) {\n throw new Error(\n 'Select has filterMode of \"none\" so there is no filter input'\n );\n }\n return this.selectElement.filterInput;\n }\n\n private getClearButton(): Button | null | undefined {\n return this.selectElement.shadowRoot?.querySelector<Button>(\n '.clear-button'\n );\n }\n}\n"]}
@@ -1,25 +1,40 @@
1
1
  import { ScaleLinear } from 'd3-scale';
2
- import type { WaferMap } from '../..';
3
- import { Dimensions, Margin } from '../../types';
2
+ import type { WaferMap } from '..';
3
+ import type { ColorScale, Dimensions, Margin } from '../workers/types';
4
4
  /**
5
5
  * Computations calculates and stores different measures which are used in the Wafermap
6
6
  */
7
7
  export declare class Computations {
8
8
  private readonly wafermap;
9
+ get horizontalScale(): ScaleLinear<number, number>;
10
+ get verticalScale(): ScaleLinear<number, number>;
9
11
  get containerDimensions(): Dimensions;
10
12
  get dieDimensions(): Dimensions;
11
13
  get margin(): Margin;
12
- get horizontalScale(): ScaleLinear<number, number>;
13
- get verticalScale(): ScaleLinear<number, number>;
14
+ get verticalCoefficient(): number;
15
+ get horizontalCoefficient(): number;
16
+ get horizontalConstant(): number;
17
+ get verticalConstant(): number;
18
+ get labelsFontSize(): number;
19
+ get colorScale(): ColorScale;
20
+ private _horizontalScale;
21
+ private _verticalScale;
14
22
  private _containerDimensions;
15
23
  private _dieDimensions;
16
24
  private _margin;
17
- private _horizontalScale;
18
- private _verticalScale;
19
- private readonly defaultPadding;
25
+ private _verticalCoefficient;
26
+ private _horizontalCoefficient;
27
+ private _horizontalConstant;
28
+ private _verticalConstant;
29
+ private _labelsFontSize;
30
+ private _colorScale;
20
31
  private readonly baseMarginPercentage;
32
+ private readonly fontSizeFactor;
33
+ private readonly colorScaleResolution;
21
34
  constructor(wafermap: WaferMap);
22
- update(): void;
35
+ componentResizeUpdate(): void;
36
+ inputDataUpdate(): void;
37
+ colorAndTextUpdate(): void;
23
38
  private gridDimensionsValidAndDefined;
24
39
  private calculateGridDimensionsFromBoundingBox;
25
40
  private calculateGridDimensionsFromDies;
@@ -27,4 +42,6 @@ export declare class Computations {
27
42
  private createHorizontalScale;
28
43
  private createVerticalScale;
29
44
  private calculateMarginAddition;
45
+ private calculateColorScale;
46
+ private calculateLabelsFontSize;
30
47
  }
@@ -1,9 +1,16 @@
1
1
  import { scaleLinear } from 'd3-scale';
2
- import { WaferMapOriginLocation } from '../../types';
2
+ import { ticks } from 'd3-array';
3
+ import { WaferMapColorScaleMode, WaferMapOriginLocation } from '../types';
3
4
  /**
4
5
  * Computations calculates and stores different measures which are used in the Wafermap
5
6
  */
6
7
  export class Computations {
8
+ get horizontalScale() {
9
+ return this._horizontalScale;
10
+ }
11
+ get verticalScale() {
12
+ return this._verticalScale;
13
+ }
7
14
  get containerDimensions() {
8
15
  return this._containerDimensions;
9
16
  }
@@ -13,18 +20,31 @@ export class Computations {
13
20
  get margin() {
14
21
  return this._margin;
15
22
  }
16
- get horizontalScale() {
17
- return this._horizontalScale;
23
+ get verticalCoefficient() {
24
+ return this._verticalCoefficient;
18
25
  }
19
- get verticalScale() {
20
- return this._verticalScale;
26
+ get horizontalCoefficient() {
27
+ return this._horizontalCoefficient;
28
+ }
29
+ get horizontalConstant() {
30
+ return this._horizontalConstant;
31
+ }
32
+ get verticalConstant() {
33
+ return this._verticalConstant;
34
+ }
35
+ get labelsFontSize() {
36
+ return this._labelsFontSize;
37
+ }
38
+ get colorScale() {
39
+ return this._colorScale;
21
40
  }
22
41
  constructor(wafermap) {
23
42
  this.wafermap = wafermap;
24
- this.defaultPadding = 0;
25
43
  this.baseMarginPercentage = 0.04;
44
+ this.fontSizeFactor = 0.8;
45
+ this.colorScaleResolution = 10;
26
46
  }
27
- update() {
47
+ componentResizeUpdate() {
28
48
  const canvasDimensions = {
29
49
  width: this.wafermap.canvasWidth,
30
50
  height: this.wafermap.canvasHeight
@@ -43,7 +63,14 @@ export class Computations {
43
63
  left: canvasDiameter * this.baseMarginPercentage
44
64
  };
45
65
  this._margin = this.calculateMarginAddition(baseMargin, canvasMargin);
46
- this._containerDimensions = this.calculateContainerDimensions(canvasDimensions, this._margin);
66
+ this._containerDimensions = this.calculateContainerDimensions(canvasDimensions, this.margin);
67
+ this.inputDataUpdate();
68
+ }
69
+ inputDataUpdate() {
70
+ if (this._containerDimensions === undefined) {
71
+ this.componentResizeUpdate();
72
+ return;
73
+ }
47
74
  const containerDiameter = Math.min(this._containerDimensions.width, this._containerDimensions.height);
48
75
  const gridDimensions = this.gridDimensionsValidAndDefined()
49
76
  ? this.calculateGridDimensionsFromBoundingBox()
@@ -53,10 +80,23 @@ export class Computations {
53
80
  this._horizontalScale = this.createHorizontalScale(originLocation, gridDimensions, containerDiameter);
54
81
  // this scale is used for positioning the dies on the canvas
55
82
  this._verticalScale = this.createVerticalScale(originLocation, gridDimensions, containerDiameter);
83
+ this._horizontalCoefficient = this._horizontalScale(1) - this._horizontalScale(0);
84
+ this._verticalCoefficient = this._verticalScale(1) - this._verticalScale(0);
85
+ this._horizontalConstant = this._horizontalScale(0);
86
+ this._verticalConstant = this._verticalScale(0);
56
87
  this._dieDimensions = {
57
88
  width: Math.abs(this._horizontalScale(0) - this._horizontalScale(1)),
58
89
  height: Math.abs(this._verticalScale(0) - this._verticalScale(1))
59
90
  };
91
+ this.colorAndTextUpdate();
92
+ }
93
+ colorAndTextUpdate() {
94
+ if (this._dieDimensions === undefined) {
95
+ this.inputDataUpdate();
96
+ return;
97
+ }
98
+ this._labelsFontSize = this.calculateLabelsFontSize(this._dieDimensions, this.wafermap.maxCharacters);
99
+ this._colorScale = this.calculateColorScale();
60
100
  }
61
101
  gridDimensionsValidAndDefined() {
62
102
  return (!this.wafermap.validity.invalidGridDimensions
@@ -151,5 +191,44 @@ export class Computations {
151
191
  left: baseMargin.left + addedMargin.left
152
192
  };
153
193
  }
194
+ calculateColorScale() {
195
+ if (this.wafermap.colorScaleMode === WaferMapColorScaleMode.linear) {
196
+ const values = this.wafermap.colorScale.values.map(item => +item);
197
+ const d3ColorScale = scaleLinear()
198
+ .domain(values)
199
+ .range(this.wafermap.colorScale.colors);
200
+ let min = values[0];
201
+ let max = values[0];
202
+ values.forEach(value => {
203
+ if (value < min) {
204
+ min = value;
205
+ }
206
+ if (value > max) {
207
+ max = value;
208
+ }
209
+ });
210
+ // the linear color scale will not be infinite but will be limited by the color scale resolution
211
+ const valueSamples = ticks(min, max, values.length * this.colorScaleResolution);
212
+ return valueSamples.map(value => {
213
+ return {
214
+ color: d3ColorScale(value),
215
+ value
216
+ };
217
+ });
218
+ }
219
+ // ordinal color categories have to be sorted by value
220
+ return this.wafermap.colorScale.colors
221
+ .map((color, index) => {
222
+ return {
223
+ color,
224
+ value: +this.wafermap.colorScale.values[index]
225
+ };
226
+ })
227
+ .sort((a, b) => a.value - b.value);
228
+ }
229
+ calculateLabelsFontSize(dieDimensions, maxCharacters) {
230
+ return Math.min(dieDimensions.height, (dieDimensions.width / (Math.max(2, maxCharacters) * 0.5))
231
+ * this.fontSizeFactor);
232
+ }
154
233
  }
155
234
  //# sourceMappingURL=computations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computations.js","sourceRoot":"","sources":["../../../../src/wafer-map/experimental/computations.ts"],"names":[],"mappings":"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","sourcesContent":["import { scaleLinear, ScaleLinear } from 'd3-scale';\nimport { ticks } from 'd3-array';\nimport type { WaferMap } from '..';\nimport { WaferMapColorScaleMode, WaferMapOriginLocation } from '../types';\nimport type { ColorScale, Dimensions, Margin } from '../workers/types';\n\ninterface GridDimensions {\n origin: {\n x: number,\n y: number\n };\n rows: number;\n cols: number;\n}\n\n/**\n * Computations calculates and stores different measures which are used in the Wafermap\n */\nexport class Computations {\n public get horizontalScale(): ScaleLinear<number, number> {\n return this._horizontalScale;\n }\n\n public get verticalScale(): ScaleLinear<number, number> {\n return this._verticalScale;\n }\n\n public get containerDimensions(): Dimensions {\n return this._containerDimensions;\n }\n\n public get dieDimensions(): Dimensions {\n return this._dieDimensions;\n }\n\n public get margin(): Margin {\n return this._margin;\n }\n\n public get verticalCoefficient(): number {\n return this._verticalCoefficient;\n }\n\n public get horizontalCoefficient(): number {\n return this._horizontalCoefficient;\n }\n\n public get horizontalConstant(): number {\n return this._horizontalConstant;\n }\n\n public get verticalConstant(): number {\n return this._verticalConstant;\n }\n\n public get labelsFontSize(): number {\n return this._labelsFontSize;\n }\n\n public get colorScale(): ColorScale {\n return this._colorScale;\n }\n\n private _horizontalScale!: ScaleLinear<number, number>;\n private _verticalScale!: ScaleLinear<number, number>;\n private _containerDimensions!: Dimensions;\n private _dieDimensions!: Dimensions;\n private _margin!: Margin;\n private _verticalCoefficient!: number;\n private _horizontalCoefficient!: number;\n private _horizontalConstant!: number;\n private _verticalConstant!: number;\n private _labelsFontSize!: number;\n private _colorScale!: ColorScale;\n\n private readonly baseMarginPercentage = 0.04;\n private readonly fontSizeFactor = 0.8;\n private readonly colorScaleResolution = 10;\n\n public constructor(private readonly wafermap: WaferMap) {}\n\n public componentResizeUpdate(): void {\n const canvasDimensions = {\n width: this.wafermap.canvasWidth,\n height: this.wafermap.canvasHeight\n };\n const canvasDiameter = Math.min(\n canvasDimensions.width,\n canvasDimensions.height\n );\n const canvasMargin = {\n top: (canvasDimensions.height - canvasDiameter) / 2,\n right: (canvasDimensions.width - canvasDiameter) / 2,\n bottom: (canvasDimensions.height - canvasDiameter) / 2,\n left: (canvasDimensions.width - canvasDiameter) / 2\n };\n const baseMargin = {\n top: canvasDiameter * this.baseMarginPercentage,\n right: canvasDiameter * this.baseMarginPercentage,\n bottom: canvasDiameter * this.baseMarginPercentage,\n left: canvasDiameter * this.baseMarginPercentage\n };\n this._margin = this.calculateMarginAddition(baseMargin, canvasMargin);\n this._containerDimensions = this.calculateContainerDimensions(\n canvasDimensions,\n this.margin\n );\n this.inputDataUpdate();\n }\n\n public inputDataUpdate(): void {\n if (this._containerDimensions === undefined) {\n this.componentResizeUpdate();\n return;\n }\n const containerDiameter = Math.min(\n this._containerDimensions.width,\n this._containerDimensions.height\n );\n const gridDimensions = this.gridDimensionsValidAndDefined()\n ? this.calculateGridDimensionsFromBoundingBox()\n : this.calculateGridDimensionsFromDies();\n // this scale is used for positioning the dies on the canvas\n const originLocation = this.wafermap.originLocation;\n this._horizontalScale = this.createHorizontalScale(\n originLocation,\n gridDimensions,\n containerDiameter\n );\n // this scale is used for positioning the dies on the canvas\n this._verticalScale = this.createVerticalScale(\n originLocation,\n gridDimensions,\n containerDiameter\n );\n this._horizontalCoefficient = this._horizontalScale(1) - this._horizontalScale(0);\n this._verticalCoefficient = this._verticalScale(1) - this._verticalScale(0);\n this._horizontalConstant = this._horizontalScale(0);\n this._verticalConstant = this._verticalScale(0);\n\n this._dieDimensions = {\n width: Math.abs(\n this._horizontalScale(0) - this._horizontalScale(1)\n ),\n height: Math.abs(this._verticalScale(0) - this._verticalScale(1))\n };\n this.colorAndTextUpdate();\n }\n\n public colorAndTextUpdate(): void {\n if (this._dieDimensions === undefined) {\n this.inputDataUpdate();\n return;\n }\n this._labelsFontSize = this.calculateLabelsFontSize(\n this._dieDimensions,\n this.wafermap.maxCharacters\n );\n this._colorScale = this.calculateColorScale();\n }\n\n private gridDimensionsValidAndDefined(): boolean {\n return (\n !this.wafermap.validity.invalidGridDimensions\n && typeof this.wafermap.gridMinX === 'number'\n && typeof this.wafermap.gridMinY === 'number'\n && typeof this.wafermap.gridMaxX === 'number'\n && typeof this.wafermap.gridMinX === 'number'\n );\n }\n\n private calculateGridDimensionsFromBoundingBox(): GridDimensions {\n const gridDimensions = { origin: { x: 0, y: 0 }, rows: 0, cols: 0 };\n if (\n typeof this.wafermap.gridMaxY === 'number'\n && typeof this.wafermap.gridMinY === 'number'\n && typeof this.wafermap.gridMaxX === 'number'\n && typeof this.wafermap.gridMinX === 'number'\n ) {\n gridDimensions.origin.x = this.wafermap.gridMinX;\n gridDimensions.origin.y = this.wafermap.gridMinY;\n gridDimensions.rows = this.wafermap.gridMaxY - this.wafermap.gridMinY + 1;\n gridDimensions.cols = this.wafermap.gridMaxX - this.wafermap.gridMinX + 1;\n }\n return gridDimensions;\n }\n\n private calculateGridDimensionsFromDies(): GridDimensions {\n if (this.wafermap.diesTable === undefined) {\n return { origin: { x: 0, y: 0 }, rows: 0, cols: 0 };\n }\n\n const colIndex = this.wafermap.diesTable\n .getChild('colIndex')!\n .toArray();\n const rowIndex = this.wafermap.diesTable\n .getChild('rowIndex')!\n .toArray();\n\n const minPoint = { x: colIndex[0]!, y: rowIndex[0]! };\n const maxPoint = { x: colIndex[0]!, y: rowIndex[0]! };\n\n // will replace iterating with arquero after fixing issues: https://github.com/uwdata/arquero/pull/346\n for (let i = 0; i < colIndex.length; i++) {\n if (colIndex[i]! < minPoint.x) {\n minPoint.x = colIndex[i]!;\n }\n if (colIndex[i]! > maxPoint.x) {\n maxPoint.x = colIndex[i]!;\n }\n if (rowIndex[i]! < minPoint.y) {\n minPoint.y = rowIndex[i]!;\n }\n if (rowIndex[i]! > maxPoint.y) {\n maxPoint.y = rowIndex[i]!;\n }\n }\n\n return {\n origin: minPoint,\n rows: maxPoint.y - minPoint.y + 1,\n cols: maxPoint.x - minPoint.x + 1\n };\n }\n\n private calculateContainerDimensions(\n canvasDimensions: Dimensions,\n margin: Margin\n ): Dimensions {\n return {\n width: canvasDimensions.width - margin.left - margin.right,\n height: canvasDimensions.height - margin.top - margin.bottom\n };\n }\n\n private createHorizontalScale(\n originLocation: WaferMapOriginLocation,\n grid: GridDimensions,\n containerWidth: number\n ): ScaleLinear<number, number> {\n const scale = scaleLinear<number, number>();\n if (\n originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.topLeft\n ) {\n return scale\n .domain([grid.origin.x, grid.origin.x + grid.cols])\n .range([0, containerWidth]);\n }\n return scale\n .domain([grid.origin.x - 1, grid.origin.x + grid.cols - 1])\n .range([containerWidth, 0]);\n }\n\n private createVerticalScale(\n originLocation: WaferMapOriginLocation,\n grid: GridDimensions,\n containerHeight: number\n ): ScaleLinear<number, number> {\n const scale = scaleLinear<number, number>();\n // html canvas has top-left origin https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes#the_grid\n // we need to flip the vertical scale\n if (\n originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.bottomRight\n ) {\n return scale\n .domain([grid.origin.y - 1, grid.origin.y + grid.rows - 1])\n .range([containerHeight, 0]);\n }\n return scale\n .domain([grid.origin.y, grid.origin.y + grid.rows])\n .range([0, containerHeight]);\n }\n\n private calculateMarginAddition(\n baseMargin: Margin,\n addedMargin: Margin\n ): Margin {\n return {\n top: baseMargin.top + addedMargin.top,\n right: baseMargin.right + addedMargin.right,\n bottom: baseMargin.bottom + addedMargin.bottom,\n left: baseMargin.left + addedMargin.left\n };\n }\n\n private calculateColorScale(): ColorScale {\n if (this.wafermap.colorScaleMode === WaferMapColorScaleMode.linear) {\n const values = this.wafermap.colorScale.values.map(item => +item);\n const d3ColorScale = scaleLinear<string, string>()\n .domain(values)\n .range(this.wafermap.colorScale.colors);\n let min = values[0]!;\n let max = values[0]!;\n values.forEach(value => {\n if (value < min) {\n min = value;\n }\n if (value > max) {\n max = value;\n }\n });\n // the linear color scale will not be infinite but will be limited by the color scale resolution\n const valueSamples = ticks(\n min,\n max,\n values.length * this.colorScaleResolution\n );\n return valueSamples.map(value => {\n return {\n color: d3ColorScale(value),\n value\n };\n });\n }\n // ordinal color categories have to be sorted by value\n return this.wafermap.colorScale.colors\n .map((color, index) => {\n return {\n color,\n value: +this.wafermap.colorScale.values[index]!\n };\n })\n .sort((a, b) => a.value - b.value);\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"]}
@@ -1,4 +1,4 @@
1
- import type { WaferMap } from '../..';
1
+ import type { WaferMap } from '..';
2
2
  /**
3
3
  * HoverHandler deals with user interactions and events like hovering
4
4
  */
@@ -1,4 +1,4 @@
1
- import { WaferMapOriginLocation } from '../../types';
1
+ import { WaferMapOriginLocation } from '../types';
2
2
  /**
3
3
  * HoverHandler deals with user interactions and events like hovering
4
4
  */
@@ -72,10 +72,8 @@ export class HoverHandler {
72
72
  ? Math.ceil
73
73
  : Math.floor;
74
74
  // go to x and y scale to get the x,y values of the die.
75
- const x = xRoundFunction(this.wafermap.experimentalDataManager.horizontalScale.invert(mousePosition.x
76
- - this.wafermap.experimentalDataManager.margin.left));
77
- const y = yRoundFunction(this.wafermap.experimentalDataManager.verticalScale.invert(mousePosition.y
78
- - this.wafermap.experimentalDataManager.margin.top));
75
+ const x = xRoundFunction(this.wafermap.computations.horizontalScale.invert(mousePosition.x - this.wafermap.computations.margin.left));
76
+ const y = yRoundFunction(this.wafermap.computations.verticalScale.invert(mousePosition.y - this.wafermap.computations.margin.top));
79
77
  return { x, y };
80
78
  }
81
79
  return undefined;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover-handler.js","sourceRoot":"","sources":["../../../../src/wafer-map/experimental/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;QAkBrC,gBAAW,GAAG,CAAC,KAAiB,EAAQ,EAAE;YACvD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,EAAE;gBACvC,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;YACH,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,IAAI,cAAc,KAAK,SAAS,EAAE;gBAC9B,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAC;gBACnC,OAAO;aACV;YACD,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;IA7DuD,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;IA+CO,uBAAuB,CAC3B,aAA+B;QAE/B,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,EAAE;YACtC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;YACpD,MAAM,cAAc,GAAG,cAAc,KAAK,sBAAsB,CAAC,UAAU;mBACpE,cAAc,KAAK,sBAAsB,CAAC,OAAO;gBACpD,CAAC,CAAC,IAAI,CAAC,KAAK;gBACZ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAChB,MAAM,cAAc,GAAG,cAAc,KAAK,sBAAsB,CAAC,UAAU;mBACpE,cAAc,KAAK,sBAAsB,CAAC,WAAW;gBACxD,CAAC,CAAC,IAAI,CAAC,IAAI;gBACX,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YACjB,wDAAwD;YACxD,MAAM,CAAC,GAAG,cAAc,CACpB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,CAC7C,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAC3D,CACJ,CAAC;YACF,MAAM,CAAC,GAAG,cAAc,CACpB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAC3C,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAC1D,CACJ,CAAC;YACF,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;SACnB;QACD,OAAO,SAAS,CAAC;IACrB,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 private readonly onMouseMove = (event: MouseEvent): void => {\n if (!this.wafermap.isExperimentalUpdate()) {\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 const dieCoordinates = this.calculateDieCoordinates({\n x: invertedPoint[0],\n y: invertedPoint[1]\n });\n if (dieCoordinates === undefined) {\n this.wafermap.hoverDie = undefined;\n return;\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 | undefined {\n if (this.wafermap.isExperimentalUpdate()) {\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.ceil\n : Math.floor;\n // go to x and y scale to get the x,y values of the die.\n const x = xRoundFunction(\n this.wafermap.computations.horizontalScale.invert(\n mousePosition.x - this.wafermap.computations.margin.left\n )\n );\n const y = yRoundFunction(\n this.wafermap.computations.verticalScale.invert(\n mousePosition.y - this.wafermap.computations.margin.top\n )\n );\n return { x, y };\n }\n return undefined;\n }\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import type { ZoomTransform } from 'd3-zoom';
2
+ import type { WaferMap } from '..';
3
+ import type { Dimensions, RenderConfig } from '../workers/types';
4
+ /**
5
+ * Responsible for drawing the dies inside the wafer map, adding dieText and scaling the canvas
6
+ */
7
+ export declare class WorkerRenderer {
8
+ private readonly wafermap;
9
+ private matrixRenderer;
10
+ constructor(wafermap: WaferMap);
11
+ setupWafer(snapshot: {
12
+ canvasDimensions: Dimensions;
13
+ renderConfig: RenderConfig;
14
+ columnIndices: Int32Array;
15
+ rowIndices: Int32Array;
16
+ }): Promise<void>;
17
+ drawWafer(snapshot: {
18
+ canvasDimensions: Dimensions;
19
+ dieDimensions: Dimensions;
20
+ transform: ZoomTransform;
21
+ }): Promise<void>;
22
+ renderHover(): void;
23
+ private calculateHoverTransform;
24
+ }
@@ -0,0 +1,75 @@
1
+ import { transfer } from 'comlink';
2
+ import { HoverDieOpacity } from '../types';
3
+ import { createMatrixRenderer } from '../modules/create-matrix-renderer';
4
+ /**
5
+ * Responsible for drawing the dies inside the wafer map, adding dieText and scaling the canvas
6
+ */
7
+ export class WorkerRenderer {
8
+ constructor(wafermap) {
9
+ this.wafermap = wafermap;
10
+ }
11
+ async setupWafer(snapshot) {
12
+ if (this.matrixRenderer === undefined) {
13
+ const { matrixRenderer } = await createMatrixRenderer();
14
+ this.matrixRenderer = matrixRenderer;
15
+ const offscreenCanvas = this.wafermap.workerCanvas.transferControlToOffscreen();
16
+ await this.matrixRenderer.setCanvas(transfer(offscreenCanvas, [offscreenCanvas]));
17
+ }
18
+ await this.matrixRenderer.setCanvasDimensions(snapshot.canvasDimensions);
19
+ await this.matrixRenderer.setRenderConfig(snapshot.renderConfig);
20
+ await this.matrixRenderer.setColumnIndices(snapshot.columnIndices);
21
+ await this.matrixRenderer.setRowIndices(snapshot.rowIndices);
22
+ }
23
+ async drawWafer(snapshot) {
24
+ const topLeftCanvasCorner = snapshot.transform.invert([0, 0]);
25
+ const bottomRightCanvasCorner = snapshot.transform.invert([
26
+ snapshot.canvasDimensions.width,
27
+ snapshot.canvasDimensions.height
28
+ ]);
29
+ await this.matrixRenderer.setTransformConfig({
30
+ transform: snapshot.transform,
31
+ topLeftCanvasCorner: {
32
+ x: topLeftCanvasCorner[0] - snapshot.dieDimensions.width,
33
+ y: topLeftCanvasCorner[1] - snapshot.dieDimensions.height
34
+ },
35
+ bottomRightCanvasCorner: {
36
+ x: bottomRightCanvasCorner[0],
37
+ y: bottomRightCanvasCorner[1]
38
+ }
39
+ });
40
+ await this.matrixRenderer.drawWafer();
41
+ }
42
+ renderHover() {
43
+ if (this.wafermap.computations.dieDimensions === undefined
44
+ || this.wafermap.transform === undefined) {
45
+ return;
46
+ }
47
+ this.wafermap.hoverWidth = this.wafermap.computations.dieDimensions.width
48
+ * this.wafermap.transform.k;
49
+ this.wafermap.hoverHeight = this.wafermap.computations.dieDimensions.height
50
+ * this.wafermap.transform.k;
51
+ this.wafermap.hoverOpacity = this.wafermap.hoverDie === undefined
52
+ ? HoverDieOpacity.hide
53
+ : HoverDieOpacity.show;
54
+ this.wafermap.hoverTransform = this.calculateHoverTransform();
55
+ }
56
+ calculateHoverTransform() {
57
+ if (this.wafermap.hoverDie !== undefined) {
58
+ const scaledX = this.wafermap.computations.horizontalScale(this.wafermap.hoverDie.x);
59
+ if (scaledX === undefined) {
60
+ return '';
61
+ }
62
+ const scaledY = this.wafermap.computations.verticalScale(this.wafermap.hoverDie.y);
63
+ if (scaledY === undefined) {
64
+ return '';
65
+ }
66
+ const transformedPoint = this.wafermap.transform.apply([
67
+ scaledX + this.wafermap.computations.margin.left,
68
+ scaledY + this.wafermap.computations.margin.top
69
+ ]);
70
+ return `translate(${transformedPoint[0]}, ${transformedPoint[1]})`;
71
+ }
72
+ return '';
73
+ }
74
+ }
75
+ //# sourceMappingURL=worker-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-renderer.js","sourceRoot":"","sources":["../../../../src/wafer-map/experimental/worker-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Remote, transfer } from 'comlink';\nimport type { ZoomTransform } from 'd3-zoom';\nimport type { WaferMap } from '..';\nimport { HoverDieOpacity } from '../types';\nimport { createMatrixRenderer } from '../modules/create-matrix-renderer';\nimport type { MatrixRenderer } from '../../../build/generate-workers/dist/esm/source/matrix-renderer';\nimport type { Dimensions, RenderConfig } from '../workers/types';\n\n/**\n * Responsible for drawing the dies inside the wafer map, adding dieText and scaling the canvas\n */\nexport class WorkerRenderer {\n private matrixRenderer!: Remote<MatrixRenderer>;\n\n public constructor(private readonly wafermap: WaferMap) {}\n\n public async setupWafer(snapshot: {\n canvasDimensions: Dimensions,\n renderConfig: RenderConfig,\n columnIndices: Int32Array,\n rowIndices: Int32Array\n }): Promise<void> {\n if (this.matrixRenderer === undefined) {\n const { matrixRenderer } = await createMatrixRenderer();\n this.matrixRenderer = matrixRenderer;\n const offscreenCanvas = this.wafermap.workerCanvas.transferControlToOffscreen();\n await this.matrixRenderer.setCanvas(\n transfer(offscreenCanvas, [offscreenCanvas])\n );\n }\n await this.matrixRenderer.setCanvasDimensions(\n snapshot.canvasDimensions\n );\n await this.matrixRenderer.setRenderConfig(snapshot.renderConfig);\n await this.matrixRenderer.setColumnIndices(snapshot.columnIndices);\n await this.matrixRenderer.setRowIndices(snapshot.rowIndices);\n }\n\n public async drawWafer(snapshot: {\n canvasDimensions: Dimensions,\n dieDimensions: Dimensions,\n transform: ZoomTransform\n }): Promise<void> {\n const topLeftCanvasCorner = snapshot.transform.invert([0, 0]);\n const bottomRightCanvasCorner = snapshot.transform.invert([\n snapshot.canvasDimensions.width,\n snapshot.canvasDimensions.height\n ]);\n await this.matrixRenderer.setTransformConfig({\n transform: snapshot.transform,\n topLeftCanvasCorner: {\n x: topLeftCanvasCorner[0] - snapshot.dieDimensions.width,\n y: topLeftCanvasCorner[1] - snapshot.dieDimensions.height\n },\n bottomRightCanvasCorner: {\n x: bottomRightCanvasCorner[0],\n y: bottomRightCanvasCorner[1]\n }\n });\n await this.matrixRenderer.drawWafer();\n }\n\n public renderHover(): void {\n if (\n this.wafermap.computations.dieDimensions === undefined\n || this.wafermap.transform === undefined\n ) {\n return;\n }\n this.wafermap.hoverWidth = this.wafermap.computations.dieDimensions.width\n * this.wafermap.transform.k;\n this.wafermap.hoverHeight = this.wafermap.computations.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.computations.horizontalScale(\n this.wafermap.hoverDie.x\n );\n if (scaledX === undefined) {\n return '';\n }\n const scaledY = this.wafermap.computations.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.computations.margin.left,\n scaledY + this.wafermap.computations.margin.top\n ]);\n return `translate(${transformedPoint[0]}, ${transformedPoint[1]})`;\n }\n return '';\n }\n}\n"]}