@digital-realty/ix-tabs 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -31,6 +31,21 @@ or
31
31
  <ix-secondary-tab>Tab 2</ix-secondary-tab>
32
32
  <ix-secondary-tab>Tab 3</ix-secondary-tab>
33
33
  </ix-tabs>
34
+
35
+ or
36
+
37
+ scrollButton property can be set on ix-tabs to enable
38
+ left and right scroll buttons for overflowing tab sets
39
+
40
+ active property can be set on individual tabs to set initial active state
41
+
42
+ <ix-tabs scrollButtons>
43
+ <ix-primary-tab>Tab 1</ix-primary-tab>
44
+ <ix-primary-tab active>Tab 2</ix-primary-tab>
45
+ <ix-primary-tab>Tab 3</ix-primary-tab>
46
+ <ix-primary-tab>Tab 4</ix-primary-tab>
47
+ </ix-tabs>
48
+
34
49
  ```
35
50
 
36
51
  ### In React
@@ -8,7 +8,9 @@ export class IxPrimaryTab extends LitElement {
8
8
  this.active = false;
9
9
  }
10
10
  render() {
11
- return html `<md-primary-tab ?active=${this.active}><slot></slot></md-primary-tab> `;
11
+ return html `<md-primary-tab ?active=${this.active}
12
+ ><slot></slot
13
+ ></md-primary-tab> `;
12
14
  }
13
15
  }
14
16
  IxPrimaryTab.styles = css `
@@ -1 +1 @@
1
- {"version":3,"file":"IxPrimaryTab.js","sourceRoot":"","sources":["../src/IxPrimaryTab.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,yBAAyB,CAAC;AAEjC,MAAM,OAAO,YAAa,SAAQ,UAAU;IAA5C;;QAa8C,WAAM,GAAG,KAAK,CAAC;IAK7D,CAAC;IAHC,MAAM;QACJ,OAAO,IAAI,CAAA,2BAA2B,IAAI,CAAC,MAAM,kCAAkC,CAAC;IACtF,CAAC;;AAhBM,mBAAM,GAAG,GAAG,CAAA;;;;;;;;;;GAUlB,CAAC;AAE0C;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;4CAAgB","sourcesContent":["import { html, css, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport './mdtabs/primary-tab.js';\n\nexport class IxPrimaryTab extends LitElement {\n static styles = css`\n :host {\n display: flex;\n }\n ::slotted(*) {\n flex: 1 1 0%;\n }\n md-primary-tab {\n flex: 1 1 0%;\n }\n `;\n\n @property({ type: Boolean, reflect: true }) active = false;\n\n render() {\n return html`<md-primary-tab ?active=${this.active}><slot></slot></md-primary-tab> `;\n }\n}\n"]}
1
+ {"version":3,"file":"IxPrimaryTab.js","sourceRoot":"","sources":["../src/IxPrimaryTab.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,yBAAyB,CAAC;AAEjC,MAAM,OAAO,YAAa,SAAQ,UAAU;IAA5C;;QAa8C,WAAM,GAAG,KAAK,CAAC;IAO7D,CAAC;IALC,MAAM;QACJ,OAAO,IAAI,CAAA,2BAA2B,IAAI,CAAC,MAAM;;wBAE7B,CAAC;IACvB,CAAC;;AAlBM,mBAAM,GAAG,GAAG,CAAA;;;;;;;;;;GAUlB,CAAC;AAE0C;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;4CAAgB","sourcesContent":["import { html, css, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport './mdtabs/primary-tab.js';\n\nexport class IxPrimaryTab extends LitElement {\n static styles = css`\n :host {\n display: flex;\n }\n ::slotted(*) {\n flex: 1 1 0%;\n }\n md-primary-tab {\n flex: 1 1 0%;\n }\n `;\n\n @property({ type: Boolean, reflect: true }) active = false;\n\n render() {\n return html`<md-primary-tab ?active=${this.active}\n ><slot></slot\n ></md-primary-tab> `;\n }\n}\n"]}
@@ -8,7 +8,9 @@ export class IxSecondaryTab extends LitElement {
8
8
  this.active = false;
9
9
  }
10
10
  render() {
11
- return html `<md-secondary-tab ?active=${this.active}><slot></slot></md-secondary-tab>`;
11
+ return html `<md-secondary-tab ?active=${this.active}
12
+ ><slot></slot
13
+ ></md-secondary-tab>`;
12
14
  }
13
15
  }
14
16
  IxSecondaryTab.styles = css `
@@ -1 +1 @@
1
- {"version":3,"file":"IxSecondaryTab.js","sourceRoot":"","sources":["../src/IxSecondaryTab.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,2BAA2B,CAAC;AAEnC,MAAM,OAAO,cAAe,SAAQ,UAAU;IAA9C;;QAa8C,WAAM,GAAG,KAAK,CAAC;IAK7D,CAAC;IAHC,MAAM;QACJ,OAAO,IAAI,CAAA,6BAA6B,IAAI,CAAC,MAAM,mCAAmC,CAAC;IACzF,CAAC;;AAhBM,qBAAM,GAAG,GAAG,CAAA;;;;;;;;;;GAUlB,CAAC;AAE0C;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;8CAAgB","sourcesContent":["import { html, css, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport './mdtabs/secondary-tab.js';\n\nexport class IxSecondaryTab extends LitElement {\n static styles = css`\n :host {\n display: flex;\n }\n ::slotted(*) {\n flex: 1 1 0%;\n }\n md-secondary-tab {\n flex: 1 1 0%;\n }\n `;\n\n @property({ type: Boolean, reflect: true }) active = false;\n\n render() {\n return html`<md-secondary-tab ?active=${this.active}><slot></slot></md-secondary-tab>`;\n }\n}\n"]}
1
+ {"version":3,"file":"IxSecondaryTab.js","sourceRoot":"","sources":["../src/IxSecondaryTab.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,2BAA2B,CAAC;AAEnC,MAAM,OAAO,cAAe,SAAQ,UAAU;IAA9C;;QAa8C,WAAM,GAAG,KAAK,CAAC;IAO7D,CAAC;IALC,MAAM;QACJ,OAAO,IAAI,CAAA,6BAA6B,IAAI,CAAC,MAAM;;yBAE9B,CAAC;IACxB,CAAC;;AAlBM,qBAAM,GAAG,GAAG,CAAA;;;;;;;;;;GAUlB,CAAC;AAE0C;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;8CAAgB","sourcesContent":["import { html, css, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport './mdtabs/secondary-tab.js';\n\nexport class IxSecondaryTab extends LitElement {\n static styles = css`\n :host {\n display: flex;\n }\n ::slotted(*) {\n flex: 1 1 0%;\n }\n md-secondary-tab {\n flex: 1 1 0%;\n }\n `;\n\n @property({ type: Boolean, reflect: true }) active = false;\n\n render() {\n return html`<md-secondary-tab ?active=${this.active}\n ><slot></slot\n ></md-secondary-tab>`;\n }\n}\n"]}
package/dist/IxTabs.d.ts CHANGED
@@ -1,9 +1,23 @@
1
1
  import { LitElement } from 'lit';
2
2
  import './mdtabs/tabs.js';
3
3
  import type { MdTabs } from './mdtabs/tabs.js';
4
+ import '@digital-realty/ix-icon-button/ix-icon-button.js';
4
5
  export declare class IxTabs extends LitElement {
6
+ static styles: import("lit").CSSResult;
5
7
  mdTabs: MdTabs;
8
+ activeTab: Element;
9
+ scrollButtons: boolean;
10
+ hideScrollBar: boolean;
11
+ private enableLeftScroll;
12
+ private enableRightScroll;
13
+ private tabContainer;
6
14
  get activeTabIndex(): number;
7
15
  set activeTabIndex(index: number);
16
+ private calculateScrollButtonsEnabled;
17
+ private debounceEvent;
18
+ private updateScrollButtonState;
19
+ slotChange(): Promise<void>;
20
+ disconnectedCallback(): void;
21
+ private scrollTabs;
8
22
  render(): import("lit").TemplateResult<1>;
9
23
  }
package/dist/IxTabs.js CHANGED
@@ -1,23 +1,127 @@
1
1
  import { __decorate } from "tslib";
2
- import { html, LitElement } from 'lit';
3
- import { query } from 'lit/decorators.js';
2
+ import { html, css, nothing, LitElement } from 'lit';
3
+ import { property, query } from 'lit/decorators.js';
4
4
  import './mdtabs/tabs.js';
5
+ import '@digital-realty/ix-icon-button/ix-icon-button.js';
5
6
  export class IxTabs extends LitElement {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.scrollButtons = false;
10
+ this.hideScrollBar = false;
11
+ this.enableLeftScroll = true;
12
+ this.enableRightScroll = true;
13
+ this.tabContainer = null;
14
+ this.updateScrollButtonState = () => {
15
+ clearTimeout(this.debounceEvent);
16
+ this.debounceEvent = setTimeout(this.calculateScrollButtonsEnabled.bind(this), 100);
17
+ };
18
+ }
6
19
  get activeTabIndex() {
7
20
  return this.mdTabs.activeTabIndex;
8
21
  }
9
22
  set activeTabIndex(index) {
10
23
  this.mdTabs.activeTabIndex = index;
11
24
  }
25
+ calculateScrollButtonsEnabled() {
26
+ if (this.tabContainer) {
27
+ const { clientWidth, scrollWidth, scrollLeft } = this.tabContainer;
28
+ this.enableLeftScroll = scrollLeft !== 0;
29
+ this.enableRightScroll = scrollLeft !== scrollWidth - clientWidth;
30
+ }
31
+ }
32
+ async slotChange() {
33
+ var _a, _b;
34
+ await 0;
35
+ (_a = this.querySelector('ix-primary-tab[active]')) === null || _a === void 0 ? void 0 : _a.scrollIntoView();
36
+ if (this.scrollButtons) {
37
+ this.tabContainer = (_b = this.mdTabs.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('.tabs');
38
+ if (this.tabContainer) {
39
+ if (this.hideScrollBar) {
40
+ this.tabContainer.style.paddingBottom = '2rem';
41
+ this.mdTabs.style.marginBottom = '-2rem';
42
+ }
43
+ this.calculateScrollButtonsEnabled();
44
+ window.addEventListener('resize', this.updateScrollButtonState);
45
+ this.tabContainer.addEventListener('scroll', this.updateScrollButtonState);
46
+ }
47
+ }
48
+ }
49
+ disconnectedCallback() {
50
+ var _a;
51
+ super.disconnectedCallback();
52
+ if (this.scrollButtons) {
53
+ window.removeEventListener('resize', this.updateScrollButtonState);
54
+ (_a = this.tabContainer) === null || _a === void 0 ? void 0 : _a.removeEventListener('scroll', this.updateScrollButtonState);
55
+ }
56
+ }
57
+ scrollTabs(direction = 'left', scrollAmount = 0.75) {
58
+ if (this.tabContainer) {
59
+ const { clientWidth, scrollLeft } = this.tabContainer;
60
+ const offset = direction === 'left'
61
+ ? clientWidth * -scrollAmount
62
+ : clientWidth * scrollAmount;
63
+ const scrollToPosition = scrollLeft + offset;
64
+ this.tabContainer.scrollTo({
65
+ top: 0,
66
+ left: scrollToPosition,
67
+ behavior: 'smooth',
68
+ });
69
+ }
70
+ }
12
71
  render() {
13
72
  return html `
73
+ ${this.scrollButtons
74
+ ? html `<ix-icon-button
75
+ appearance="filled"
76
+ icon="arrow_left"
77
+ @click=${() => this.scrollTabs('left')}
78
+ ?disabled=${!this.enableLeftScroll}
79
+ ></ix-icon-button>`
80
+ : nothing}
14
81
  <md-tabs>
15
- <slot></slot>
82
+ <slot @slotchange=${this.slotChange}></slot>
16
83
  </md-tabs>
84
+ ${this.scrollButtons
85
+ ? html `<ix-icon-button
86
+ appearance="filled"
87
+ icon="arrow_right"
88
+ @click=${() => this.scrollTabs('right')}
89
+ ?disabled=${!this.enableRightScroll}
90
+ ></ix-icon-button>`
91
+ : nothing}
17
92
  `;
18
93
  }
19
94
  }
95
+ IxTabs.styles = css `
96
+ :host {
97
+ display: flex;
98
+ align-items: center;
99
+ justify-content: center;
100
+ overflow: hidden;
101
+ }
102
+ md-tabs {
103
+ flex-grow: 1;
104
+ }
105
+ .scroll {
106
+ cursor: pointer;
107
+ }
108
+ `;
20
109
  __decorate([
21
- query('md-tabs')
110
+ query('md-Tabs')
22
111
  ], IxTabs.prototype, "mdTabs", void 0);
112
+ __decorate([
113
+ query('ix-primary-tab[active]')
114
+ ], IxTabs.prototype, "activeTab", void 0);
115
+ __decorate([
116
+ property({ type: Boolean })
117
+ ], IxTabs.prototype, "scrollButtons", void 0);
118
+ __decorate([
119
+ property({ type: Boolean })
120
+ ], IxTabs.prototype, "hideScrollBar", void 0);
121
+ __decorate([
122
+ property({ type: Boolean })
123
+ ], IxTabs.prototype, "enableLeftScroll", void 0);
124
+ __decorate([
125
+ property({ type: Boolean })
126
+ ], IxTabs.prototype, "enableRightScroll", void 0);
23
127
  //# sourceMappingURL=IxTabs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IxTabs.js","sourceRoot":"","sources":["../src/IxTabs.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,kBAAkB,CAAC;AAG1B,MAAM,OAAO,MAAO,SAAQ,UAAU;IAGpC,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;IACpC,CAAC;IAED,IAAI,cAAc,CAAC,KAAa;QAC9B,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,KAAK,CAAC;IACrC,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;;;KAIV,CAAC;IACJ,CAAC;CACF;AAjBmB;IAAjB,KAAK,CAAC,SAAS,CAAC;sCAAiB","sourcesContent":["import { html, LitElement } from 'lit';\nimport { query } from 'lit/decorators.js';\nimport './mdtabs/tabs.js';\nimport type { MdTabs } from './mdtabs/tabs.js';\n\nexport class IxTabs extends LitElement {\n @query('md-tabs') mdTabs!: MdTabs;\n\n get activeTabIndex() {\n return this.mdTabs.activeTabIndex;\n }\n\n set activeTabIndex(index: number) {\n this.mdTabs.activeTabIndex = index;\n }\n\n render() {\n return html`\n <md-tabs>\n <slot></slot>\n </md-tabs>\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"IxTabs.js","sourceRoot":"","sources":["../src/IxTabs.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, css, nothing, LitElement } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport './mdtabs/tabs.js';\nimport type { MdTabs } from './mdtabs/tabs.js';\nimport '@digital-realty/ix-icon-button/ix-icon-button.js';\n\ntype ScrollDirection = 'left' | 'right';\n\nexport class IxTabs extends LitElement {\n static styles = css`\n :host {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n }\n md-tabs {\n flex-grow: 1;\n }\n .scroll {\n cursor: pointer;\n }\n `;\n\n @query('md-Tabs') mdTabs!: MdTabs;\n\n @query('ix-primary-tab[active]') activeTab!: Element;\n\n @property({ type: Boolean }) scrollButtons = false;\n\n @property({ type: Boolean }) hideScrollBar = false;\n\n @property({ type: Boolean }) private enableLeftScroll = true;\n\n @property({ type: Boolean }) private enableRightScroll = true;\n\n private tabContainer: HTMLElement | null | undefined = null;\n\n get activeTabIndex() {\n return this.mdTabs.activeTabIndex;\n }\n\n set activeTabIndex(index: number) {\n this.mdTabs.activeTabIndex = index;\n }\n\n private calculateScrollButtonsEnabled() {\n if (this.tabContainer) {\n const { clientWidth, scrollWidth, scrollLeft } = this.tabContainer;\n this.enableLeftScroll = scrollLeft !== 0;\n this.enableRightScroll = scrollLeft !== scrollWidth - clientWidth;\n }\n }\n\n private debounceEvent: ReturnType<typeof setTimeout> | undefined;\n\n private updateScrollButtonState = () => {\n clearTimeout(this.debounceEvent);\n this.debounceEvent = setTimeout(\n this.calculateScrollButtonsEnabled.bind(this),\n 100\n );\n };\n\n async slotChange() {\n await 0;\n\n this.querySelector('ix-primary-tab[active]')?.scrollIntoView();\n\n if (this.scrollButtons) {\n this.tabContainer = this.mdTabs.shadowRoot?.querySelector('.tabs');\n if (this.tabContainer) {\n if (this.hideScrollBar) {\n this.tabContainer.style.paddingBottom = '2rem';\n this.mdTabs.style.marginBottom = '-2rem';\n }\n this.calculateScrollButtonsEnabled();\n window.addEventListener('resize', this.updateScrollButtonState);\n this.tabContainer.addEventListener(\n 'scroll',\n this.updateScrollButtonState\n );\n }\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n if (this.scrollButtons) {\n window.removeEventListener('resize', this.updateScrollButtonState);\n this.tabContainer?.removeEventListener(\n 'scroll',\n this.updateScrollButtonState\n );\n }\n }\n\n private scrollTabs(direction: ScrollDirection = 'left', scrollAmount = 0.75) {\n if (this.tabContainer) {\n const { clientWidth, scrollLeft } = this.tabContainer;\n const offset =\n direction === 'left'\n ? clientWidth * -scrollAmount\n : clientWidth * scrollAmount;\n const scrollToPosition = scrollLeft + offset;\n this.tabContainer.scrollTo({\n top: 0,\n left: scrollToPosition,\n behavior: 'smooth',\n });\n }\n }\n\n render() {\n return html`\n ${this.scrollButtons\n ? html`<ix-icon-button\n appearance=\"filled\"\n icon=\"arrow_left\"\n @click=${() => this.scrollTabs('left')}\n ?disabled=${!this.enableLeftScroll}\n ></ix-icon-button>`\n : nothing}\n <md-tabs>\n <slot @slotchange=${this.slotChange}></slot>\n </md-tabs>\n ${this.scrollButtons\n ? html`<ix-icon-button\n appearance=\"filled\"\n icon=\"arrow_right\"\n @click=${() => this.scrollTabs('right')}\n ?disabled=${!this.enableRightScroll}\n ></ix-icon-button>`\n : nothing}\n `;\n }\n}\n"]}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Webcomponent ix-tabs following open-wc recommendations",
4
4
  "license": "MIT",
5
5
  "author": "Digital Realty",
6
- "version": "0.0.4",
6
+ "version": "0.0.6",
7
7
  "type": "module",
8
8
  "main": "dist/index.js",
9
9
  "module": "dist/index.js",
@@ -30,6 +30,7 @@
30
30
  "test:watch": "tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wtr --watch\""
31
31
  },
32
32
  "dependencies": {
33
+ "@digital-realty/ix-icon-button": "^1.0.11",
33
34
  "@lit-labs/react": "^2.0.3",
34
35
  "@material/web": "^1.0.0",
35
36
  "lit": "^2.0.2",
@@ -99,5 +100,5 @@
99
100
  "README.md",
100
101
  "LICENSE"
101
102
  ],
102
- "gitHead": "3f03e0e887e1a3fdbeeba66e270abbb74ae7a95b"
103
+ "gitHead": "ffa2859da968f850be397ea99249bd8ace1cefcc"
103
104
  }