@ni/nimble-components 32.4.1 → 32.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/all-components-bundle.js +1083 -937
  2. package/dist/all-components-bundle.js.map +1 -1
  3. package/dist/all-components-bundle.min.js +3721 -3697
  4. package/dist/all-components-bundle.min.js.map +1 -1
  5. package/dist/esm/anchor-tab/styles.js +1 -0
  6. package/dist/esm/anchor-tab/styles.js.map +1 -1
  7. package/dist/esm/anchor-tabs/index.d.ts +28 -1
  8. package/dist/esm/anchor-tabs/index.js +56 -3
  9. package/dist/esm/anchor-tabs/index.js.map +1 -1
  10. package/dist/esm/anchor-tabs/testing/anchor-tabs.pageobject.d.ts +9 -0
  11. package/dist/esm/anchor-tabs/testing/anchor-tabs.pageobject.js +12 -0
  12. package/dist/esm/anchor-tabs/testing/anchor-tabs.pageobject.js.map +1 -0
  13. package/dist/esm/label-provider/core/index.d.ts +6 -0
  14. package/dist/esm/label-provider/core/index.js +10 -2
  15. package/dist/esm/label-provider/core/index.js.map +1 -1
  16. package/dist/esm/label-provider/core/label-token-defaults.js +3 -1
  17. package/dist/esm/label-provider/core/label-token-defaults.js.map +1 -1
  18. package/dist/esm/label-provider/core/label-tokens.d.ts +2 -0
  19. package/dist/esm/label-provider/core/label-tokens.js +8 -0
  20. package/dist/esm/label-provider/core/label-tokens.js.map +1 -1
  21. package/dist/esm/patterns/tabs/styles.js +39 -0
  22. package/dist/esm/patterns/tabs/styles.js.map +1 -0
  23. package/dist/esm/patterns/tabs/template.d.ts +4 -0
  24. package/dist/esm/patterns/tabs/template.js +56 -0
  25. package/dist/esm/patterns/tabs/template.js.map +1 -0
  26. package/dist/esm/patterns/tabs/testing/tabs-base.pageobject.d.ts +21 -0
  27. package/dist/esm/patterns/tabs/testing/tabs-base.pageobject.js +92 -0
  28. package/dist/esm/patterns/tabs/testing/tabs-base.pageobject.js.map +1 -0
  29. package/dist/esm/patterns/tabs/types.d.ts +9 -0
  30. package/dist/esm/patterns/tabs/types.js +2 -0
  31. package/dist/esm/patterns/tabs/types.js.map +1 -0
  32. package/dist/esm/tab/styles.js +1 -0
  33. package/dist/esm/tab/styles.js.map +1 -1
  34. package/dist/esm/tabs/index.d.ts +39 -1
  35. package/dist/esm/tabs/index.js +65 -1
  36. package/dist/esm/tabs/index.js.map +1 -1
  37. package/dist/esm/tabs/styles.js +2 -22
  38. package/dist/esm/tabs/styles.js.map +1 -1
  39. package/dist/esm/tabs/testing/tabs.pageobject.d.ts +9 -0
  40. package/dist/esm/tabs/testing/tabs.pageobject.js +13 -0
  41. package/dist/esm/tabs/testing/tabs.pageobject.js.map +1 -0
  42. package/dist/esm/utilities/testing/component.d.ts +4 -0
  43. package/dist/esm/utilities/testing/component.js +8 -0
  44. package/dist/esm/utilities/testing/component.js.map +1 -1
  45. package/package.json +1 -1
  46. package/dist/esm/anchor-tabs/styles.js +0 -23
  47. package/dist/esm/anchor-tabs/styles.js.map +0 -1
  48. package/dist/esm/anchor-tabs/template.d.ts +0 -4
  49. package/dist/esm/anchor-tabs/template.js +0 -10
  50. package/dist/esm/anchor-tabs/template.js.map +0 -1
  51. /package/dist/esm/{anchor-tabs → patterns/tabs}/styles.d.ts +0 -0
@@ -0,0 +1,92 @@
1
+ import { waitForUpdatesAsync } from '../../../testing/async-helpers';
2
+ import { waitTimeout } from '../../../utilities/testing/component';
3
+ /**
4
+ * Page object for the `nimble-tabs` and `nimble-anchor-tabs` components to provide
5
+ * consistent ways of querying and interacting with the component during tests.
6
+ */
7
+ export class TabsBasePageObject {
8
+ constructor(tabsElement, tabElementName, tabPanelElementName) {
9
+ this.tabsElement = tabsElement;
10
+ this.tabElementName = tabElementName;
11
+ this.tabPanelElementName = tabPanelElementName;
12
+ }
13
+ async clickTab(index) {
14
+ if (index >= this.tabsElement.tabs.length) {
15
+ throw new Error(`Tab with index ${index} not found`);
16
+ }
17
+ this.tabsElement.tabs[index].click();
18
+ await waitForUpdatesAsync();
19
+ }
20
+ async pressKeyOnTab(index, key) {
21
+ if (index >= this.tabsElement.tabs.length) {
22
+ throw new Error(`Tab with index ${index} not found`);
23
+ }
24
+ const tab = this.tabsElement.tabs[index];
25
+ tab.dispatchEvent(new KeyboardEvent('keydown', { key }));
26
+ await waitForUpdatesAsync();
27
+ }
28
+ async setTabsWidth(width) {
29
+ this.tabsElement.style.width = `${width}px`;
30
+ await waitForUpdatesAsync();
31
+ await waitForUpdatesAsync(); // wait for the resize observer to fire
32
+ }
33
+ async clickScrollLeftButton() {
34
+ const leftButton = this.tabsElement.shadowRoot.querySelector('.scroll-button.left');
35
+ if (!leftButton) {
36
+ throw new Error('Scroll left button not found');
37
+ }
38
+ leftButton.click();
39
+ await waitForUpdatesAsync();
40
+ await waitTimeout(50); // let animation run
41
+ }
42
+ async clickScrollRightButton() {
43
+ const rightButton = this.tabsElement.shadowRoot.querySelector('.scroll-button.right');
44
+ if (!rightButton) {
45
+ throw new Error('Scroll right button not found');
46
+ }
47
+ rightButton.click();
48
+ await waitForUpdatesAsync();
49
+ await waitTimeout(50); // let animation run
50
+ }
51
+ areScrollButtonsVisible() {
52
+ return (this.tabsElement.shadowRoot.querySelectorAll('.scroll-button')
53
+ .length > 0);
54
+ }
55
+ async addTab(label) {
56
+ const tab = document.createElement(this.tabElementName);
57
+ tab.textContent = label;
58
+ const lastTab = this.tabsElement.querySelector(`${this.tabElementName}:last-of-type`);
59
+ lastTab.insertAdjacentElement('afterend', tab);
60
+ if (this.tabPanelElementName) {
61
+ const tabPanel = document.createElement(this.tabPanelElementName);
62
+ const lastTabPanel = this.tabsElement.querySelector(`${this.tabPanelElementName}:last-of-type`);
63
+ lastTabPanel.insertAdjacentElement('afterend', tabPanel);
64
+ }
65
+ await waitForUpdatesAsync();
66
+ }
67
+ async removeTab(index) {
68
+ if (index >= this.tabsElement.tabs.length) {
69
+ throw new Error(`Tab with index ${index} not found`);
70
+ }
71
+ const tabToRemove = this.tabsElement.tabs[index];
72
+ tabToRemove?.remove();
73
+ if (this.tabPanelElementName) {
74
+ const tabPanelToRemove = this.tabsElement.querySelectorAll(this.tabPanelElementName)[index];
75
+ tabPanelToRemove?.remove();
76
+ }
77
+ await waitForUpdatesAsync();
78
+ }
79
+ async updateTabLabel(index, label) {
80
+ if (index >= this.tabsElement.tabs.length) {
81
+ throw new Error(`Tab with index ${index} not found`);
82
+ }
83
+ const tab = this.tabsElement.tabs[index];
84
+ tab.textContent = label;
85
+ await waitForUpdatesAsync();
86
+ }
87
+ getTabsViewScrollOffset() {
88
+ return this.tabsElement.shadowRoot.querySelector('.tablist')
89
+ .scrollLeft;
90
+ }
91
+ }
92
+ //# sourceMappingURL=tabs-base.pageobject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs-base.pageobject.js","sourceRoot":"","sources":["../../../../../src/patterns/tabs/testing/tabs-base.pageobject.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Button } from '../../../button';\nimport { waitForUpdatesAsync } from '../../../testing/async-helpers';\nimport { waitTimeout } from '../../../utilities/testing/component';\nimport type { TabsOwner } from '../types';\n\n/**\n * Page object for the `nimble-tabs` and `nimble-anchor-tabs` components to provide\n * consistent ways of querying and interacting with the component during tests.\n */\nexport abstract class TabsBasePageObject<T extends TabsOwner> {\n public constructor(\n protected readonly tabsElement: T,\n protected readonly tabElementName: string,\n protected readonly tabPanelElementName?: string\n ) {}\n\n public async clickTab(index: number): Promise<void> {\n if (index >= this.tabsElement.tabs.length) {\n throw new Error(`Tab with index ${index} not found`);\n }\n this.tabsElement.tabs[index]!.click();\n await waitForUpdatesAsync();\n }\n\n public async pressKeyOnTab(index: number, key: string): Promise<void> {\n if (index >= this.tabsElement.tabs.length) {\n throw new Error(`Tab with index ${index} not found`);\n }\n const tab = this.tabsElement.tabs[index]!;\n tab.dispatchEvent(new KeyboardEvent('keydown', { key }));\n await waitForUpdatesAsync();\n }\n\n public async setTabsWidth(width: number): Promise<void> {\n this.tabsElement.style.width = `${width}px`;\n await waitForUpdatesAsync();\n await waitForUpdatesAsync(); // wait for the resize observer to fire\n }\n\n public async clickScrollLeftButton(): Promise<void> {\n const leftButton = this.tabsElement.shadowRoot!.querySelector<Button>(\n '.scroll-button.left'\n );\n if (!leftButton) {\n throw new Error('Scroll left button not found');\n }\n leftButton.click();\n await waitForUpdatesAsync();\n await waitTimeout(50); // let animation run\n }\n\n public async clickScrollRightButton(): Promise<void> {\n const rightButton = this.tabsElement.shadowRoot!.querySelector<Button>(\n '.scroll-button.right'\n );\n if (!rightButton) {\n throw new Error('Scroll right button not found');\n }\n rightButton.click();\n await waitForUpdatesAsync();\n await waitTimeout(50); // let animation run\n }\n\n public areScrollButtonsVisible(): boolean {\n return (\n this.tabsElement.shadowRoot!.querySelectorAll('.scroll-button')\n .length > 0\n );\n }\n\n public async addTab(label: string): Promise<void> {\n const tab = document.createElement(this.tabElementName);\n tab.textContent = label;\n const lastTab = this.tabsElement.querySelector(\n `${this.tabElementName}:last-of-type`\n )!;\n lastTab.insertAdjacentElement('afterend', tab);\n if (this.tabPanelElementName) {\n const tabPanel = document.createElement(this.tabPanelElementName);\n const lastTabPanel = this.tabsElement.querySelector(\n `${this.tabPanelElementName}:last-of-type`\n )!;\n lastTabPanel.insertAdjacentElement('afterend', tabPanel);\n }\n await waitForUpdatesAsync();\n }\n\n public async removeTab(index: number): Promise<void> {\n if (index >= this.tabsElement.tabs.length) {\n throw new Error(`Tab with index ${index} not found`);\n }\n const tabToRemove = this.tabsElement.tabs[index];\n tabToRemove?.remove();\n if (this.tabPanelElementName) {\n const tabPanelToRemove = this.tabsElement.querySelectorAll(\n this.tabPanelElementName\n )[index];\n tabPanelToRemove?.remove();\n }\n await waitForUpdatesAsync();\n }\n\n public async updateTabLabel(index: number, label: string): Promise<void> {\n if (index >= this.tabsElement.tabs.length) {\n throw new Error(`Tab with index ${index} not found`);\n }\n const tab = this.tabsElement.tabs[index]!;\n tab.textContent = label;\n await waitForUpdatesAsync();\n }\n\n public getTabsViewScrollOffset(): number {\n return this.tabsElement.shadowRoot!.querySelector('.tablist')!\n .scrollLeft;\n }\n}\n"]}
@@ -0,0 +1,9 @@
1
+ export interface TabsOwner extends HTMLElement {
2
+ tabs: HTMLElement[];
3
+ tablist: HTMLElement;
4
+ leftScrollButton?: HTMLElement;
5
+ showScrollButtons: boolean;
6
+ tabSlotName: string;
7
+ onScrollLeftClick(): void;
8
+ onScrollRightClick(): void;
9
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/patterns/tabs/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface TabsOwner extends HTMLElement {\n tabs: HTMLElement[];\n tablist: HTMLElement;\n leftScrollButton?: HTMLElement;\n showScrollButtons: boolean;\n tabSlotName: string;\n onScrollLeftClick(): void;\n onScrollRightClick(): void;\n}\n"]}
@@ -13,6 +13,7 @@ export const styles = css `
13
13
  align-items: center;
14
14
  justify-content: center;
15
15
  cursor: pointer;
16
+ text-wrap: nowrap;
16
17
  --ni-private-active-indicator-width: 2px;
17
18
  --ni-private-focus-indicator-width: 1px;
18
19
  --ni-private-indicator-lines-gap: 1px;
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/tab/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EACH,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,UAAU,EACV,eAAe,EAClB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;MACnB,OAAO,CAAC,aAAa,CAAC;;;;gBAIZ,eAAe;kBACb,aAAa;iBACd,aAAa;;;;;;;;;;;4BAWF,cAAc;;;;4BAId,sBAAsB;;;YAGtC,YAAY;;;;;;;;;;iBAUP,qBAAqB;;;;;;mBAMnB,aAAa,IAAI,eAAe;mBAChC,aAAa,MAAM,WAAW;;;;;;;;;;;;yBAYxB,gBAAgB;;4BAEb,UAAU;;;;;;;;;YAS1B,YAAY;;;;;;;;;;yBAUC,gBAAgB;;4BAEb,UAAU;;;;;;;;;YAS1B,YAAY;;;;;;;;;;;oCAWY,gBAAgB;;CAEnD,CAAC","sourcesContent":["import { css } from '@microsoft/fast-element';\nimport { display } from '../utilities/style/display';\nimport {\n borderHoverColor,\n borderWidth,\n bodyFontColor,\n bodyDisabledFontColor,\n controlHeight,\n fillHoverColor,\n fillHoverSelectedColor,\n mediumPadding,\n standardPadding,\n smallDelay,\n buttonLabelFont\n} from '../theme-provider/design-tokens';\nimport { focusVisible } from '../utilities/style/focus';\n\nexport const styles = css`\n ${display('inline-flex')}\n\n :host {\n position: relative;\n font: ${buttonLabelFont};\n height: ${controlHeight};\n color: ${bodyFontColor};\n align-items: center;\n justify-content: center;\n cursor: pointer;\n --ni-private-active-indicator-width: 2px;\n --ni-private-focus-indicator-width: 1px;\n --ni-private-indicator-lines-gap: 1px;\n --ni-private-focus-indicator-inset-width: 3px;\n }\n\n :host(:hover) {\n background-color: ${fillHoverColor};\n }\n\n :host(:hover[aria-selected='true']) {\n background-color: ${fillHoverSelectedColor};\n }\n\n :host(${focusVisible}) {\n outline: none;\n }\n\n :host(:active) {\n background: none;\n }\n\n :host([disabled]) {\n cursor: default;\n color: ${bodyDisabledFontColor};\n background: none;\n }\n\n slot:not([name]) {\n display: block;\n padding: ${mediumPadding} ${standardPadding}\n calc(${mediumPadding} - ${borderWidth});\n }\n\n :host::before {\n content: '';\n position: absolute;\n bottom: calc(\n var(--ni-private-active-indicator-width) +\n var(--ni-private-indicator-lines-gap)\n );\n width: 0px;\n height: 0px;\n border-bottom: ${borderHoverColor}\n var(--ni-private-focus-indicator-width) solid;\n transition: width ${smallDelay} ease-in;\n }\n\n @media (prefers-reduced-motion) {\n :host::before {\n transition-duration: 0s;\n }\n }\n\n :host(${focusVisible})::before {\n width: calc(100% - 2 * var(--ni-private-focus-indicator-inset-width));\n }\n\n :host::after {\n content: '';\n position: absolute;\n bottom: 0px;\n width: 0px;\n height: 0px;\n border-bottom: ${borderHoverColor}\n var(--ni-private-active-indicator-width) solid;\n transition: width ${smallDelay} ease-in;\n }\n\n @media (prefers-reduced-motion) {\n :host::after {\n transition-duration: 0s;\n }\n }\n\n :host(${focusVisible})::after {\n width: 100%;\n border-bottom-width: var(--ni-private-focus-indicator-width);\n }\n\n :host([aria-selected='true'])::after {\n width: 100%;\n border-bottom-width: var(--ni-private-active-indicator-width);\n }\n\n :host([aria-selected='true'][disabled])::after {\n border-bottom-color: rgba(${borderHoverColor}, 0.3);\n }\n`;\n"]}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/tab/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EACH,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,UAAU,EACV,eAAe,EAClB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;MACnB,OAAO,CAAC,aAAa,CAAC;;;;gBAIZ,eAAe;kBACb,aAAa;iBACd,aAAa;;;;;;;;;;;;4BAYF,cAAc;;;;4BAId,sBAAsB;;;YAGtC,YAAY;;;;;;;;;;iBAUP,qBAAqB;;;;;;mBAMnB,aAAa,IAAI,eAAe;mBAChC,aAAa,MAAM,WAAW;;;;;;;;;;;;yBAYxB,gBAAgB;;4BAEb,UAAU;;;;;;;;;YAS1B,YAAY;;;;;;;;;;yBAUC,gBAAgB;;4BAEb,UAAU;;;;;;;;;YAS1B,YAAY;;;;;;;;;;;oCAWY,gBAAgB;;CAEnD,CAAC","sourcesContent":["import { css } from '@microsoft/fast-element';\nimport { display } from '../utilities/style/display';\nimport {\n borderHoverColor,\n borderWidth,\n bodyFontColor,\n bodyDisabledFontColor,\n controlHeight,\n fillHoverColor,\n fillHoverSelectedColor,\n mediumPadding,\n standardPadding,\n smallDelay,\n buttonLabelFont\n} from '../theme-provider/design-tokens';\nimport { focusVisible } from '../utilities/style/focus';\n\nexport const styles = css`\n ${display('inline-flex')}\n\n :host {\n position: relative;\n font: ${buttonLabelFont};\n height: ${controlHeight};\n color: ${bodyFontColor};\n align-items: center;\n justify-content: center;\n cursor: pointer;\n text-wrap: nowrap;\n --ni-private-active-indicator-width: 2px;\n --ni-private-focus-indicator-width: 1px;\n --ni-private-indicator-lines-gap: 1px;\n --ni-private-focus-indicator-inset-width: 3px;\n }\n\n :host(:hover) {\n background-color: ${fillHoverColor};\n }\n\n :host(:hover[aria-selected='true']) {\n background-color: ${fillHoverSelectedColor};\n }\n\n :host(${focusVisible}) {\n outline: none;\n }\n\n :host(:active) {\n background: none;\n }\n\n :host([disabled]) {\n cursor: default;\n color: ${bodyDisabledFontColor};\n background: none;\n }\n\n slot:not([name]) {\n display: block;\n padding: ${mediumPadding} ${standardPadding}\n calc(${mediumPadding} - ${borderWidth});\n }\n\n :host::before {\n content: '';\n position: absolute;\n bottom: calc(\n var(--ni-private-active-indicator-width) +\n var(--ni-private-indicator-lines-gap)\n );\n width: 0px;\n height: 0px;\n border-bottom: ${borderHoverColor}\n var(--ni-private-focus-indicator-width) solid;\n transition: width ${smallDelay} ease-in;\n }\n\n @media (prefers-reduced-motion) {\n :host::before {\n transition-duration: 0s;\n }\n }\n\n :host(${focusVisible})::before {\n width: calc(100% - 2 * var(--ni-private-focus-indicator-inset-width));\n }\n\n :host::after {\n content: '';\n position: absolute;\n bottom: 0px;\n width: 0px;\n height: 0px;\n border-bottom: ${borderHoverColor}\n var(--ni-private-active-indicator-width) solid;\n transition: width ${smallDelay} ease-in;\n }\n\n @media (prefers-reduced-motion) {\n :host::after {\n transition-duration: 0s;\n }\n }\n\n :host(${focusVisible})::after {\n width: 100%;\n border-bottom-width: var(--ni-private-focus-indicator-width);\n }\n\n :host([aria-selected='true'])::after {\n width: 100%;\n border-bottom-width: var(--ni-private-active-indicator-width);\n }\n\n :host([aria-selected='true'][disabled])::after {\n border-bottom-color: rgba(${borderHoverColor}, 0.3);\n }\n`;\n"]}
@@ -1,4 +1,5 @@
1
1
  import { Tabs as FoundationTabs } from '@microsoft/fast-foundation';
2
+ import type { TabsOwner } from '../patterns/tabs/types';
2
3
  declare global {
3
4
  interface HTMLElementTagNameMap {
4
5
  'nimble-tabs': Tabs;
@@ -7,7 +8,44 @@ declare global {
7
8
  /**
8
9
  * A nimble-styled tabs control
9
10
  */
10
- export declare class Tabs extends FoundationTabs {
11
+ export declare class Tabs extends FoundationTabs implements TabsOwner {
12
+ /**
13
+ * @internal
14
+ */
15
+ showScrollButtons: boolean;
16
+ /**
17
+ * @internal
18
+ */
19
+ readonly tablist: HTMLElement;
20
+ /**
21
+ * @internal
22
+ */
23
+ readonly leftScrollButton?: HTMLElement;
24
+ /**
25
+ * @internal
26
+ */
27
+ readonly tabSlotName = "tab";
28
+ private readonly tabListResizeObserver;
11
29
  constructor();
30
+ /**
31
+ * @internal
32
+ */
33
+ connectedCallback(): void;
34
+ /**
35
+ * @internal
36
+ */
37
+ disconnectedCallback(): void;
38
+ /**
39
+ * @internal
40
+ */
41
+ activeidChanged(oldValue: string, newValue: string): void;
42
+ /**
43
+ * @internal
44
+ */
45
+ onScrollLeftClick(): void;
46
+ /**
47
+ * @internal
48
+ */
49
+ onScrollRightClick(): void;
12
50
  }
13
51
  export declare const tabsTag = "nimble-tabs";
@@ -1,15 +1,79 @@
1
- import { DesignSystem, Tabs as FoundationTabs, tabsTemplate as template } from '@microsoft/fast-foundation';
1
+ import { __decorate } from "tslib";
2
+ import { observable } from '@microsoft/fast-element';
3
+ import { DesignSystem, Tabs as FoundationTabs } from '@microsoft/fast-foundation';
2
4
  import { styles } from './styles';
5
+ import { template } from '../patterns/tabs/template';
3
6
  /**
4
7
  * A nimble-styled tabs control
5
8
  */
6
9
  export class Tabs extends FoundationTabs {
7
10
  constructor() {
8
11
  super();
12
+ /**
13
+ * @internal
14
+ */
15
+ this.showScrollButtons = false;
16
+ /**
17
+ * @internal
18
+ */
19
+ this.tabSlotName = 'tab';
9
20
  // We disable the built-in active indicator so that we can implement our own
10
21
  this.activeindicator = false;
22
+ this.tabListResizeObserver = new ResizeObserver(entries => {
23
+ let tabListVisibleWidth = entries[0]?.contentRect.width;
24
+ if (tabListVisibleWidth !== undefined) {
25
+ const buttonWidth = this.leftScrollButton?.clientWidth ?? 0;
26
+ tabListVisibleWidth = Math.ceil(tabListVisibleWidth);
27
+ if (this.showScrollButtons) {
28
+ tabListVisibleWidth += buttonWidth * 2;
29
+ }
30
+ this.showScrollButtons = tabListVisibleWidth < this.tablist.scrollWidth;
31
+ }
32
+ });
33
+ }
34
+ /**
35
+ * @internal
36
+ */
37
+ connectedCallback() {
38
+ super.connectedCallback();
39
+ this.tabListResizeObserver.observe(this.tablist);
40
+ }
41
+ /**
42
+ * @internal
43
+ */
44
+ disconnectedCallback() {
45
+ super.disconnectedCallback();
46
+ this.tabListResizeObserver.disconnect();
47
+ }
48
+ /**
49
+ * @internal
50
+ */
51
+ activeidChanged(oldValue, newValue) {
52
+ super.activeidChanged(oldValue, newValue);
53
+ this.activetab?.scrollIntoView({ block: 'nearest', inline: 'nearest' });
54
+ }
55
+ /**
56
+ * @internal
57
+ */
58
+ onScrollLeftClick() {
59
+ this.tablist.scrollBy({
60
+ left: -this.tablist.clientWidth,
61
+ behavior: 'smooth'
62
+ });
63
+ }
64
+ /**
65
+ * @internal
66
+ */
67
+ onScrollRightClick() {
68
+ this.tablist.scrollBy({
69
+ left: this.tablist.clientWidth,
70
+ behavior: 'smooth'
71
+ });
11
72
  }
12
73
  }
74
+ __decorate([
75
+ observable
76
+ ], Tabs.prototype, "showScrollButtons", void 0);
13
77
  const nimbleTabs = Tabs.compose({
14
78
  baseName: 'tabs',
15
79
  baseClass: FoundationTabs,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tabs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,YAAY,EACZ,IAAI,IAAI,cAAc,EAEtB,YAAY,IAAI,QAAQ,EAC3B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAQlC;;GAEG;AACH,MAAM,OAAO,IAAK,SAAQ,cAAc;IACpC;QACI,KAAK,EAAE,CAAC;QACR,4EAA4E;QAC5E,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IACjC,CAAC;CACJ;AAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAc;IACzC,QAAQ,EAAE,MAAM;IAChB,SAAS,EAAE,cAAc;IACzB,QAAQ;IACR,MAAM;CACT,CAAC,CAAC;AAEH,YAAY,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC","sourcesContent":["import {\n DesignSystem,\n Tabs as FoundationTabs,\n TabsOptions,\n tabsTemplate as template\n} from '@microsoft/fast-foundation';\nimport { styles } from './styles';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nimble-tabs': Tabs;\n }\n}\n\n/**\n * A nimble-styled tabs control\n */\nexport class Tabs extends FoundationTabs {\n public constructor() {\n super();\n // We disable the built-in active indicator so that we can implement our own\n this.activeindicator = false;\n }\n}\n\nconst nimbleTabs = Tabs.compose<TabsOptions>({\n baseName: 'tabs',\n baseClass: FoundationTabs,\n template,\n styles\n});\n\nDesignSystem.getOrCreate().withPrefix('nimble').register(nimbleTabs());\nexport const tabsTag = 'nimble-tabs';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tabs/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EACH,YAAY,EACZ,IAAI,IAAI,cAAc,EAEzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AASrD;;GAEG;AACH,MAAM,OAAO,IAAK,SAAQ,cAAc;IAwBpC;QACI,KAAK,EAAE,CAAC;QAxBZ;;WAEG;QAEI,sBAAiB,GAAG,KAAK,CAAC;QAYjC;;WAEG;QACa,gBAAW,GAAG,KAAK,CAAC;QAMhC,4EAA4E;QAC5E,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,qBAAqB,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE;YACtD,IAAI,mBAAmB,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC;YACxD,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;gBACpC,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,WAAW,IAAI,CAAC,CAAC;gBAC5D,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;gBACrD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACzB,mBAAmB,IAAI,WAAW,GAAG,CAAC,CAAC;gBAC3C,CAAC;gBACD,IAAI,CAAC,iBAAiB,GAAG,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;YAC5E,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACa,iBAAiB;QAC7B,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACa,oBAAoB;QAChC,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7B,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,CAAC;IAC5C,CAAC;IAED;;OAEG;IACa,eAAe,CAAC,QAAgB,EAAE,QAAgB;QAC9D,KAAK,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED;;OAEG;IACI,iBAAiB;QACpB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YAClB,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW;YAC/B,QAAQ,EAAE,QAAQ;SACrB,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,kBAAkB;QACrB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YAClB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW;YAC9B,QAAQ,EAAE,QAAQ;SACrB,CAAC,CAAC;IACP,CAAC;CACJ;AA/EU;IADN,UAAU;+CACsB;AAiFrC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAc;IACzC,QAAQ,EAAE,MAAM;IAChB,SAAS,EAAE,cAAc;IACzB,QAAQ;IACR,MAAM;CACT,CAAC,CAAC;AAEH,YAAY,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC","sourcesContent":["import { observable } from '@microsoft/fast-element';\nimport {\n DesignSystem,\n Tabs as FoundationTabs,\n TabsOptions\n} from '@microsoft/fast-foundation';\nimport { styles } from './styles';\nimport { template } from '../patterns/tabs/template';\nimport type { TabsOwner } from '../patterns/tabs/types';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nimble-tabs': Tabs;\n }\n}\n\n/**\n * A nimble-styled tabs control\n */\nexport class Tabs extends FoundationTabs implements TabsOwner {\n /**\n * @internal\n */\n @observable\n public showScrollButtons = false;\n\n /**\n * @internal\n */\n public readonly tablist!: HTMLElement;\n\n /**\n * @internal\n */\n public readonly leftScrollButton?: HTMLElement;\n\n /**\n * @internal\n */\n public readonly tabSlotName = 'tab';\n\n private readonly tabListResizeObserver: ResizeObserver;\n\n public constructor() {\n super();\n // We disable the built-in active indicator so that we can implement our own\n this.activeindicator = false;\n this.tabListResizeObserver = new ResizeObserver(entries => {\n let tabListVisibleWidth = entries[0]?.contentRect.width;\n if (tabListVisibleWidth !== undefined) {\n const buttonWidth = this.leftScrollButton?.clientWidth ?? 0;\n tabListVisibleWidth = Math.ceil(tabListVisibleWidth);\n if (this.showScrollButtons) {\n tabListVisibleWidth += buttonWidth * 2;\n }\n this.showScrollButtons = tabListVisibleWidth < this.tablist.scrollWidth;\n }\n });\n }\n\n /**\n * @internal\n */\n public override connectedCallback(): void {\n super.connectedCallback();\n this.tabListResizeObserver.observe(this.tablist);\n }\n\n /**\n * @internal\n */\n public override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.tabListResizeObserver.disconnect();\n }\n\n /**\n * @internal\n */\n public override activeidChanged(oldValue: string, newValue: string): void {\n super.activeidChanged(oldValue, newValue);\n this.activetab?.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n }\n\n /**\n * @internal\n */\n public onScrollLeftClick(): void {\n this.tablist.scrollBy({\n left: -this.tablist.clientWidth,\n behavior: 'smooth'\n });\n }\n\n /**\n * @internal\n */\n public onScrollRightClick(): void {\n this.tablist.scrollBy({\n left: this.tablist.clientWidth,\n behavior: 'smooth'\n });\n }\n}\n\nconst nimbleTabs = Tabs.compose<TabsOptions>({\n baseName: 'tabs',\n baseClass: FoundationTabs,\n template,\n styles\n});\n\nDesignSystem.getOrCreate().withPrefix('nimble').register(nimbleTabs());\nexport const tabsTag = 'nimble-tabs';\n"]}
@@ -1,29 +1,9 @@
1
1
  import { css } from '@microsoft/fast-element';
2
- import { display } from '../utilities/style/display';
2
+ import { styles as tabsStyles } from '../patterns/tabs/styles';
3
3
  export const styles = css `
4
- ${display('grid')}
5
-
6
- :host {
7
- grid-template-columns: auto 1fr;
8
- grid-template-rows: auto 1fr;
9
- }
10
-
11
- [part='start'] {
12
- display: none;
13
- }
14
-
15
- .tablist {
16
- display: grid;
17
- grid-template-rows: auto auto;
18
- grid-template-columns: auto;
19
- width: max-content;
20
- align-self: end;
21
- }
4
+ ${tabsStyles}
22
5
 
23
6
  .tabpanel {
24
- grid-row: 2;
25
- grid-column-start: 1;
26
- grid-column-end: 4;
27
7
  overflow: auto;
28
8
  }
29
9
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/tabs/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAErD,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;MACnB,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;CAyBpB,CAAC","sourcesContent":["import { css } from '@microsoft/fast-element';\nimport { display } from '../utilities/style/display';\n\nexport const styles = css`\n ${display('grid')}\n\n :host {\n grid-template-columns: auto 1fr;\n grid-template-rows: auto 1fr;\n }\n\n [part='start'] {\n display: none;\n }\n\n .tablist {\n display: grid;\n grid-template-rows: auto auto;\n grid-template-columns: auto;\n width: max-content;\n align-self: end;\n }\n\n .tabpanel {\n grid-row: 2;\n grid-column-start: 1;\n grid-column-end: 4;\n overflow: auto;\n }\n`;\n"]}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/tabs/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;MACnB,UAAU;;;;;CAKf,CAAC","sourcesContent":["import { css } from '@microsoft/fast-element';\nimport { styles as tabsStyles } from '../patterns/tabs/styles';\n\nexport const styles = css`\n ${tabsStyles}\n\n .tabpanel {\n overflow: auto;\n }\n`;\n"]}
@@ -0,0 +1,9 @@
1
+ import type { Tabs } from '..';
2
+ import { TabsBasePageObject } from '../../patterns/tabs/testing/tabs-base.pageobject';
3
+ /**
4
+ * Page object for the `nimble-tabs` component to provide consistent ways
5
+ * of querying and interacting with the component during tests.
6
+ */
7
+ export declare class TabsPageObject extends TabsBasePageObject<Tabs> {
8
+ constructor(tabsElement: Tabs);
9
+ }
@@ -0,0 +1,13 @@
1
+ import { TabsBasePageObject } from '../../patterns/tabs/testing/tabs-base.pageobject';
2
+ import { tabTag } from '../../tab';
3
+ import { tabPanelTag } from '../../tab-panel';
4
+ /**
5
+ * Page object for the `nimble-tabs` component to provide consistent ways
6
+ * of querying and interacting with the component during tests.
7
+ */
8
+ export class TabsPageObject extends TabsBasePageObject {
9
+ constructor(tabsElement) {
10
+ super(tabsElement, tabTag, tabPanelTag);
11
+ }
12
+ }
13
+ //# sourceMappingURL=tabs.pageobject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.pageobject.js","sourceRoot":"","sources":["../../../../src/tabs/testing/tabs.pageobject.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kDAAkD,CAAC;AACtF,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,kBAAwB;IACxD,YAAmB,WAAiB;QAChC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC5C,CAAC;CACJ","sourcesContent":["import type { Tabs } from '..';\nimport { TabsBasePageObject } from '../../patterns/tabs/testing/tabs-base.pageobject';\nimport { tabTag } from '../../tab';\nimport { tabPanelTag } from '../../tab-panel';\n\n/**\n * Page object for the `nimble-tabs` component to provide consistent ways\n * of querying and interacting with the component during tests.\n */\nexport class TabsPageObject extends TabsBasePageObject<Tabs> {\n public constructor(tabsElement: Tabs) {\n super(tabsElement, tabTag, tabPanelTag);\n }\n}\n"]}
@@ -9,3 +9,7 @@ export declare function waitForEvent<T extends Event>(element: HTMLElement, even
9
9
  * Waits for a requested animation frame to occur.
10
10
  */
11
11
  export declare function waitAnimationFrame(): Promise<void>;
12
+ /**
13
+ * Timeout for use in async tets.
14
+ */
15
+ export declare function waitTimeout(ms?: number): Promise<void>;
@@ -49,4 +49,12 @@ export async function waitAnimationFrame() {
49
49
  requestAnimationFrame(() => resolve());
50
50
  });
51
51
  }
52
+ /**
53
+ * Timeout for use in async tets.
54
+ */
55
+ export async function waitTimeout(ms = 0) {
56
+ await new Promise(resolve => {
57
+ window.setTimeout(() => resolve(undefined), ms);
58
+ });
59
+ }
52
60
  //# sourceMappingURL=component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sourceRoot":"","sources":["../../../../src/utilities/testing/component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAoB;IACnD,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,MAAM,mBAAmB,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAClC,MAAmB,EACnB,GAAW,EACX,IAAwB;IAExB,OAAO,CACH,MAAM,iBAAiB,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CACpE,CAAC,CAAC,CAAE,CAAC;AACV,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACnC,MAAmB,EACnB,WAAqB,EACrB,IAA0B;IAE1B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CACX,+DAA+D,CAClE,CAAC;IACN,CAAC;IACD,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,SAAS,EAAE;YACvC,GAAG;YACH,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,IAAI;YACb,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,mBAAmB,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAC9B,OAAoB,EACpB,SAAiB,EACjB,QAA2B;IAE3B,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;QAC9B,MAAM,OAAO,GAAG,CAAC,CAAC,GAAM,EAAQ,EAAE;YAC9B,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,EAAE,CAAC;QACd,CAAC,CAAkB,CAAC;QACpB,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE;YACzC,IAAI,EAAE,IAAI;SACb,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACpC,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;QAC9B,qBAAqB,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import { waitForUpdatesAsync } from '../../testing/async-helpers';\n\nexport async function clickElement(element: HTMLElement): Promise<void> {\n element.click();\n await waitForUpdatesAsync();\n}\n\nexport async function sendKeyDownEvent(\n target: HTMLElement,\n key: string,\n init?: KeyboardEventInit\n): Promise<KeyboardEvent> {\n return (\n await sendKeyDownEvents(target, [key], init ? [init] : undefined)\n )[0]!;\n}\n\nexport async function sendKeyDownEvents(\n target: HTMLElement,\n keySequence: string[],\n init?: KeyboardEventInit[]\n): Promise<KeyboardEvent[]> {\n if (keySequence.length === 0) {\n throw new Error('The key sequence must have at least one key.');\n }\n if (init && init.length !== keySequence.length) {\n throw new Error(\n 'The length of the key sequence and the init array must match.'\n );\n }\n const events: KeyboardEvent[] = [];\n for (const [index, key] of keySequence.entries()) {\n const event = new KeyboardEvent('keydown', {\n key,\n cancelable: true,\n bubbles: true,\n ...init?.[index]\n });\n target.dispatchEvent(event);\n events.push(event);\n }\n await waitForUpdatesAsync();\n return events;\n}\n\n/** A helper function to abstract turning waiting for an event to fire into a promise.\n * The returned promise should be resolved prior to completing a test.\n */\nexport async function waitForEvent<T extends Event>(\n element: HTMLElement,\n eventName: string,\n callback?: (evt: T) => void\n): Promise<void> {\n await new Promise<void>(resolve => {\n const handler = ((evt: T): void => {\n callback?.(evt);\n resolve();\n }) as EventListener;\n element.addEventListener(eventName, handler, {\n once: true\n });\n });\n}\n\n/**\n * Waits for a requested animation frame to occur.\n */\nexport async function waitAnimationFrame(): Promise<void> {\n await new Promise<void>(resolve => {\n requestAnimationFrame(() => resolve());\n });\n}\n"]}
1
+ {"version":3,"file":"component.js","sourceRoot":"","sources":["../../../../src/utilities/testing/component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAoB;IACnD,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,MAAM,mBAAmB,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAClC,MAAmB,EACnB,GAAW,EACX,IAAwB;IAExB,OAAO,CACH,MAAM,iBAAiB,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CACpE,CAAC,CAAC,CAAE,CAAC;AACV,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACnC,MAAmB,EACnB,WAAqB,EACrB,IAA0B;IAE1B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CACX,+DAA+D,CAClE,CAAC;IACN,CAAC;IACD,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,SAAS,EAAE;YACvC,GAAG;YACH,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,IAAI;YACb,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,mBAAmB,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAC9B,OAAoB,EACpB,SAAiB,EACjB,QAA2B;IAE3B,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;QAC9B,MAAM,OAAO,GAAG,CAAC,CAAC,GAAM,EAAQ,EAAE;YAC9B,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,EAAE,CAAC;QACd,CAAC,CAAkB,CAAC;QACpB,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE;YACzC,IAAI,EAAE,IAAI;SACb,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACpC,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;QAC9B,qBAAqB,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAE,GAAG,CAAC;IACpC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QACxB,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import { waitForUpdatesAsync } from '../../testing/async-helpers';\n\nexport async function clickElement(element: HTMLElement): Promise<void> {\n element.click();\n await waitForUpdatesAsync();\n}\n\nexport async function sendKeyDownEvent(\n target: HTMLElement,\n key: string,\n init?: KeyboardEventInit\n): Promise<KeyboardEvent> {\n return (\n await sendKeyDownEvents(target, [key], init ? [init] : undefined)\n )[0]!;\n}\n\nexport async function sendKeyDownEvents(\n target: HTMLElement,\n keySequence: string[],\n init?: KeyboardEventInit[]\n): Promise<KeyboardEvent[]> {\n if (keySequence.length === 0) {\n throw new Error('The key sequence must have at least one key.');\n }\n if (init && init.length !== keySequence.length) {\n throw new Error(\n 'The length of the key sequence and the init array must match.'\n );\n }\n const events: KeyboardEvent[] = [];\n for (const [index, key] of keySequence.entries()) {\n const event = new KeyboardEvent('keydown', {\n key,\n cancelable: true,\n bubbles: true,\n ...init?.[index]\n });\n target.dispatchEvent(event);\n events.push(event);\n }\n await waitForUpdatesAsync();\n return events;\n}\n\n/** A helper function to abstract turning waiting for an event to fire into a promise.\n * The returned promise should be resolved prior to completing a test.\n */\nexport async function waitForEvent<T extends Event>(\n element: HTMLElement,\n eventName: string,\n callback?: (evt: T) => void\n): Promise<void> {\n await new Promise<void>(resolve => {\n const handler = ((evt: T): void => {\n callback?.(evt);\n resolve();\n }) as EventListener;\n element.addEventListener(eventName, handler, {\n once: true\n });\n });\n}\n\n/**\n * Waits for a requested animation frame to occur.\n */\nexport async function waitAnimationFrame(): Promise<void> {\n await new Promise<void>(resolve => {\n requestAnimationFrame(() => resolve());\n });\n}\n\n/**\n * Timeout for use in async tets.\n */\nexport async function waitTimeout(ms = 0): Promise<void> {\n await new Promise(resolve => {\n window.setTimeout(() => resolve(undefined), ms);\n });\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ni/nimble-components",
3
- "version": "32.4.1",
3
+ "version": "32.5.1",
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",
@@ -1,23 +0,0 @@
1
- import { css } from '@microsoft/fast-element';
2
- import { display } from '../utilities/style/display';
3
- export const styles = css `
4
- ${display('grid')}
5
-
6
- :host {
7
- grid-template-columns: auto 1fr;
8
- grid-template-rows: auto 1fr;
9
- }
10
-
11
- [part='start'] {
12
- display: none;
13
- }
14
-
15
- .tablist {
16
- display: grid;
17
- grid-template-rows: auto auto;
18
- grid-template-columns: auto;
19
- width: max-content;
20
- align-self: end;
21
- }
22
- `;
23
- //# sourceMappingURL=styles.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/anchor-tabs/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAErD,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;MACnB,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;CAkBpB,CAAC","sourcesContent":["import { css } from '@microsoft/fast-element';\nimport { display } from '../utilities/style/display';\n\nexport const styles = css`\n ${display('grid')}\n\n :host {\n grid-template-columns: auto 1fr;\n grid-template-rows: auto 1fr;\n }\n\n [part='start'] {\n display: none;\n }\n\n .tablist {\n display: grid;\n grid-template-rows: auto auto;\n grid-template-columns: auto;\n width: max-content;\n align-self: end;\n }\n`;\n"]}
@@ -1,4 +0,0 @@
1
- import { ViewTemplate } from '@microsoft/fast-element';
2
- import { FoundationElementTemplate } from '@microsoft/fast-foundation';
3
- import type { AnchorTabs, TabsOptions } from '.';
4
- export declare const template: FoundationElementTemplate<ViewTemplate<AnchorTabs>, TabsOptions>;
@@ -1,10 +0,0 @@
1
- import { html, ref, slotted } from '@microsoft/fast-element';
2
- import { endSlotTemplate, startSlotTemplate } from '@microsoft/fast-foundation';
3
- export const template = (context, definition) => html `
4
- ${startSlotTemplate(context, definition)}
5
- <div ${ref('tablist')} class="tablist" part="tablist" role="tablist">
6
- <slot name="anchortab" ${slotted('tabs')}></slot>
7
- </div>
8
- ${endSlotTemplate(context, definition)}
9
- `;
10
- //# sourceMappingURL=template.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/anchor-tabs/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAgB,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EACH,eAAe,EAEf,iBAAiB,EACpB,MAAM,4BAA4B,CAAC;AAGpC,MAAM,CAAC,MAAM,QAAQ,GAGjB,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,IAAI,CAAY;MACvC,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC;WACjC,GAAG,CAAC,SAAS,CAAC;iCACQ,OAAO,CAAC,MAAM,CAAC;;MAE1C,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC;CACzC,CAAC","sourcesContent":["import { html, ref, slotted, ViewTemplate } from '@microsoft/fast-element';\nimport {\n endSlotTemplate,\n FoundationElementTemplate,\n startSlotTemplate\n} from '@microsoft/fast-foundation';\nimport type { AnchorTabs, TabsOptions } from '.';\n\nexport const template: FoundationElementTemplate<\nViewTemplate<AnchorTabs>,\nTabsOptions\n> = (context, definition) => html<AnchorTabs>`\n ${startSlotTemplate(context, definition)}\n <div ${ref('tablist')} class=\"tablist\" part=\"tablist\" role=\"tablist\">\n <slot name=\"anchortab\" ${slotted('tabs')}></slot>\n </div>\n ${endSlotTemplate(context, definition)}\n`;\n"]}