@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 +15 -0
- package/dist/IxPrimaryTab.js +3 -1
- package/dist/IxPrimaryTab.js.map +1 -1
- package/dist/IxSecondaryTab.js +3 -1
- package/dist/IxSecondaryTab.js.map +1 -1
- package/dist/IxTabs.d.ts +14 -0
- package/dist/IxTabs.js +108 -4
- package/dist/IxTabs.js.map +1 -1
- package/package.json +3 -2
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
|
package/dist/IxPrimaryTab.js
CHANGED
|
@@ -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}
|
|
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 `
|
package/dist/IxPrimaryTab.js.map
CHANGED
|
@@ -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;
|
|
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"]}
|
package/dist/IxSecondaryTab.js
CHANGED
|
@@ -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}
|
|
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;
|
|
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-
|
|
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
|
package/dist/IxTabs.js.map
CHANGED
|
@@ -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;
|
|
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.
|
|
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": "
|
|
103
|
+
"gitHead": "ffa2859da968f850be397ea99249bd8ace1cefcc"
|
|
103
104
|
}
|