@universal-material/web 3.0.71 → 3.0.73
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/app-bar/top-app-bar.styles.js +2 -2
- package/app-bar/top-app-bar.styles.js.map +1 -1
- package/button/button.styles.js +2 -2
- package/button/button.styles.js.map +1 -1
- package/button/fab.styles.js +5 -5
- package/button/fab.styles.js.map +1 -1
- package/button/icon-button.styles.js +6 -6
- package/button/icon-button.styles.js.map +1 -1
- package/card/card.styles.d.ts.map +1 -1
- package/card/card.styles.js +4 -2
- package/card/card.styles.js.map +1 -1
- package/chip/chip.styles.js +1 -1
- package/chip/chip.styles.js.map +1 -1
- package/css/universal-material.css +3 -2
- package/css/universal-material.min.css +2 -2
- package/custom-elements.json +3759 -3165
- package/dialog/dialog.styles.js +1 -1
- package/dialog/dialog.styles.js.map +1 -1
- package/field/field-base.styles.js +2 -2
- package/field/field-base.styles.js.map +1 -1
- package/index.d.ts +4 -0
- package/index.d.ts.map +1 -1
- package/index.js +4 -0
- package/index.js.map +1 -1
- package/menu/menu.styles.js +1 -1
- package/menu/menu.styles.js.map +1 -1
- package/navigation/drawer.styles.js +2 -2
- package/navigation/drawer.styles.js.map +1 -1
- package/package.json +2 -2
- package/scss/_reboot.scss +2 -1
- package/select/option.styles.js +1 -1
- package/select/option.styles.js.map +1 -1
- package/shared/button-wrapper.d.ts.map +1 -1
- package/shared/button-wrapper.js.map +1 -1
- package/shared/button-wrapper.styles.js +1 -1
- package/shared/button-wrapper.styles.js.map +1 -1
- package/shared/menu-field/menu-field-navigation-controller.js +2 -2
- package/shared/menu-field/menu-field-navigation-controller.js.map +1 -1
- package/snackbar/snackbar.styles.js +1 -1
- package/snackbar/snackbar.styles.js.map +1 -1
- package/switch/switch.styles.js +2 -2
- package/switch/switch.styles.js.map +1 -1
- package/tab-bar/tab-bar.d.ts +28 -0
- package/tab-bar/tab-bar.d.ts.map +1 -0
- package/tab-bar/tab-bar.js +187 -0
- package/tab-bar/tab-bar.js.map +1 -0
- package/tab-bar/tab-bar.styles.d.ts +2 -0
- package/tab-bar/tab-bar.styles.d.ts.map +1 -0
- package/tab-bar/tab-bar.styles.js +72 -0
- package/tab-bar/tab-bar.styles.js.map +1 -0
- package/tab-bar/tab.d.ts +22 -0
- package/tab-bar/tab.d.ts.map +1 -0
- package/tab-bar/tab.js +91 -0
- package/tab-bar/tab.js.map +1 -0
- package/tab-bar/tab.styles.d.ts +2 -0
- package/tab-bar/tab.styles.d.ts.map +1 -0
- package/tab-bar/tab.styles.js +52 -0
- package/tab-bar/tab.styles.js.map +1 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { html, LitElement } from 'lit';
|
|
8
|
+
import { customElement, property, query, queryAssignedElements } from 'lit/decorators.js';
|
|
9
|
+
import { styles as baseStyles } from '../shared/base.styles.js';
|
|
10
|
+
import { styles } from './tab-bar.styles.js';
|
|
11
|
+
import { UmTab } from './tab.js';
|
|
12
|
+
let UmTabBar = class UmTabBar extends LitElement {
|
|
13
|
+
static { this.styles = [baseStyles, styles]; }
|
|
14
|
+
#tabs;
|
|
15
|
+
#activeTab;
|
|
16
|
+
#resizeObserver;
|
|
17
|
+
get activeTabIndex() {
|
|
18
|
+
if (!this.activeTab) {
|
|
19
|
+
return -1;
|
|
20
|
+
}
|
|
21
|
+
return this.#tabs.indexOf(this.activeTab);
|
|
22
|
+
}
|
|
23
|
+
set activeTabIndex(index) {
|
|
24
|
+
this.activeTab = this.#tabs[index];
|
|
25
|
+
}
|
|
26
|
+
get activeTab() {
|
|
27
|
+
return this.#activeTab;
|
|
28
|
+
}
|
|
29
|
+
set activeTab(activeTab) {
|
|
30
|
+
if (!this.#tabs.length) {
|
|
31
|
+
this.#activeTab = null;
|
|
32
|
+
this._updateTabIndicator();
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (!activeTab || this.#activeTab === activeTab || this.#tabs.indexOf(activeTab) < 0) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const previouslyActiveTab = this.#activeTab;
|
|
39
|
+
this.#activeTab = activeTab;
|
|
40
|
+
previouslyActiveTab?.requestUpdate();
|
|
41
|
+
activeTab.scrollIntoView({ block: 'nearest', behavior: 'smooth' });
|
|
42
|
+
activeTab.requestUpdate();
|
|
43
|
+
this._updateTabIndicator();
|
|
44
|
+
}
|
|
45
|
+
attributeChangedCallback(name, _, __) {
|
|
46
|
+
if (name === 'variant') {
|
|
47
|
+
this._updateTabIndicator();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
connectedCallback() {
|
|
51
|
+
super.connectedCallback();
|
|
52
|
+
this.updateComplete
|
|
53
|
+
.then(() => {
|
|
54
|
+
this._setScrollIndicatorsActive();
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
render() {
|
|
58
|
+
return html `
|
|
59
|
+
|
|
60
|
+
<div
|
|
61
|
+
class="scroll-indicator scroll-left active"
|
|
62
|
+
@click=${this.#scrollToLeft}>
|
|
63
|
+
<u-elevation></u-elevation>
|
|
64
|
+
<u-ripple></u-ripple>
|
|
65
|
+
<slot name="scroll-left">
|
|
66
|
+
<svg xmlns="http://www.w3.org/2000/svg" height="1em" viewBox="0 -960 960 960" width="1em" fill="currentColor">
|
|
67
|
+
<path d="M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z"/>
|
|
68
|
+
</svg>
|
|
69
|
+
</slot>
|
|
70
|
+
</div>
|
|
71
|
+
<div
|
|
72
|
+
class="container ${this.variant === 'secondary' ? 'secondary' : ''}"
|
|
73
|
+
@scrollend=${this.#handleContainerScrollEnd}>
|
|
74
|
+
<slot @slotchange=${this.#handleSlotChange}></slot>
|
|
75
|
+
<div class="tab-indicator"></div>
|
|
76
|
+
</div>
|
|
77
|
+
<div
|
|
78
|
+
class="scroll-indicator scroll-right active"
|
|
79
|
+
@click=${this.#scrollToRight}>
|
|
80
|
+
<u-elevation></u-elevation>
|
|
81
|
+
<u-ripple></u-ripple>
|
|
82
|
+
<slot name="scroll-right">
|
|
83
|
+
<svg xmlns="http://www.w3.org/2000/svg" height="1em" viewBox="0 -960 960 960" width="1em" fill="currentColor">
|
|
84
|
+
<path d="M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z"/>
|
|
85
|
+
</svg>
|
|
86
|
+
</slot>
|
|
87
|
+
</div>`;
|
|
88
|
+
}
|
|
89
|
+
constructor() {
|
|
90
|
+
super();
|
|
91
|
+
this.#tabs = [];
|
|
92
|
+
this.#activeTab = null;
|
|
93
|
+
this.#resizeObserver = new ResizeObserver(() => {
|
|
94
|
+
this._setScrollIndicatorsActive();
|
|
95
|
+
this._updateTabIndicator();
|
|
96
|
+
});
|
|
97
|
+
this.variant = 'primary';
|
|
98
|
+
this.#handleSlotChange = (e) => {
|
|
99
|
+
const slot = e.target;
|
|
100
|
+
this.#tabs = slot
|
|
101
|
+
.assignedElements({ flatten: true })
|
|
102
|
+
.filter(e => e instanceof UmTab);
|
|
103
|
+
for (const tab of this.#tabs) {
|
|
104
|
+
tab._bar = this;
|
|
105
|
+
}
|
|
106
|
+
if (this.activeTabIndex > -1) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
this.activeTab = this.#tabs[0];
|
|
110
|
+
};
|
|
111
|
+
this.#handleContainerScrollEnd = () => {
|
|
112
|
+
this._setScrollIndicatorsActive();
|
|
113
|
+
};
|
|
114
|
+
this.#scrollToLeft = () => {
|
|
115
|
+
this._container.scrollBy({ left: this._container.offsetWidth / -2, behavior: 'smooth' });
|
|
116
|
+
};
|
|
117
|
+
this.#scrollToRight = () => {
|
|
118
|
+
this._container.scrollBy({ left: this._container.offsetWidth / 2, behavior: 'smooth' });
|
|
119
|
+
};
|
|
120
|
+
this.#resizeObserver.observe(this);
|
|
121
|
+
}
|
|
122
|
+
#handleSlotChange;
|
|
123
|
+
#handleContainerScrollEnd;
|
|
124
|
+
_updateTabIndicator() {
|
|
125
|
+
if (!this._tabIndicator) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (!this.activeTab) {
|
|
129
|
+
this._tabIndicator.style.left = '0';
|
|
130
|
+
this._tabIndicator.style.width = '0';
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const styles = getComputedStyle(this.activeTab);
|
|
134
|
+
const padding = this.variant === 'primary'
|
|
135
|
+
? parseInt(styles.paddingInline, 10)
|
|
136
|
+
: 0;
|
|
137
|
+
this._tabIndicator.style.left = `${this.activeTab.offsetLeft + padding}px`;
|
|
138
|
+
this._tabIndicator.style.width = `${this.activeTab.offsetWidth - padding * 2}px`;
|
|
139
|
+
}
|
|
140
|
+
#scrollToLeft;
|
|
141
|
+
#scrollToRight;
|
|
142
|
+
_setScrollIndicatorsActive() {
|
|
143
|
+
const scrollSafeMargin = 1;
|
|
144
|
+
const scrollLength = this._container.scrollWidth - this._container.offsetWidth;
|
|
145
|
+
const isRtl = getComputedStyle(this._container).direction === 'rtl';
|
|
146
|
+
const scrollStart = isRtl
|
|
147
|
+
? this._container.scrollLeft + scrollLength
|
|
148
|
+
: this._container.scrollLeft;
|
|
149
|
+
if (scrollStart - scrollSafeMargin <= 0) {
|
|
150
|
+
this._container.scrollBy(-1, 0);
|
|
151
|
+
this._scrollLeft.classList.remove('active');
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
this._scrollLeft.classList.add('active');
|
|
155
|
+
}
|
|
156
|
+
if (scrollStart >= scrollLength - scrollSafeMargin) {
|
|
157
|
+
this._container.scrollBy(1, 0);
|
|
158
|
+
this._scrollRight.classList.remove('active');
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
this._scrollRight.classList.add('active');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
__decorate([
|
|
166
|
+
property({ reflect: true })
|
|
167
|
+
], UmTabBar.prototype, "variant", void 0);
|
|
168
|
+
__decorate([
|
|
169
|
+
query('.scroll-left')
|
|
170
|
+
], UmTabBar.prototype, "_scrollLeft", void 0);
|
|
171
|
+
__decorate([
|
|
172
|
+
query('.scroll-right')
|
|
173
|
+
], UmTabBar.prototype, "_scrollRight", void 0);
|
|
174
|
+
__decorate([
|
|
175
|
+
query('.container')
|
|
176
|
+
], UmTabBar.prototype, "_container", void 0);
|
|
177
|
+
__decorate([
|
|
178
|
+
query('.tab-indicator')
|
|
179
|
+
], UmTabBar.prototype, "_tabIndicator", void 0);
|
|
180
|
+
__decorate([
|
|
181
|
+
queryAssignedElements({ flatten: true })
|
|
182
|
+
], UmTabBar.prototype, "assignedElements", void 0);
|
|
183
|
+
UmTabBar = __decorate([
|
|
184
|
+
customElement('u-tab-bar')
|
|
185
|
+
], UmTabBar);
|
|
186
|
+
export { UmTabBar };
|
|
187
|
+
//# sourceMappingURL=tab-bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tab-bar.js","sourceRoot":"","sources":["../../src/tab-bar/tab-bar.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, TemplateResult } from 'lit';\nimport { customElement, property, query, queryAssignedElements } from 'lit/decorators.js';\n\nimport { styles as baseStyles } from '../shared/base.styles.js';\nimport { styles } from './tab-bar.styles.js';\n\nimport { UmTab } from './tab.js';\n\n@customElement('u-tab-bar')\nexport class UmTabBar extends LitElement {\n static override styles = [baseStyles, styles];\n\n #tabs: UmTab[] = [];\n #activeTab: UmTab | null = null;\n #resizeObserver: ResizeObserver = new ResizeObserver(() => {\n this._setScrollIndicatorsActive();\n this._updateTabIndicator();\n });\n\n @property({reflect: true}) variant: 'primary' | 'secondary' = 'primary';\n\n @query('.scroll-left') private _scrollLeft!: HTMLElement;\n @query('.scroll-right') private _scrollRight!: HTMLElement;\n @query('.container') private _container!: HTMLElement;\n @query('.tab-indicator') private _tabIndicator?: HTMLElement;\n\n @queryAssignedElements({flatten: true}) assignedElements!: HTMLElement[];\n\n get activeTabIndex(): number {\n if (!this.activeTab) {\n return -1;\n }\n\n return this.#tabs.indexOf(this.activeTab);\n }\n set activeTabIndex(index: number) {\n this.activeTab = this.#tabs[index];\n }\n\n get activeTab(): UmTab | null {\n return this.#activeTab;\n }\n set activeTab(activeTab: UmTab | null) {\n if (!this.#tabs.length) {\n this.#activeTab = null;\n this._updateTabIndicator();\n return;\n }\n\n if (!activeTab || this.#activeTab === activeTab || this.#tabs.indexOf(activeTab) < 0) {\n return;\n }\n\n const previouslyActiveTab = this.#activeTab;\n this.#activeTab = activeTab;\n\n previouslyActiveTab?.requestUpdate();\n\n activeTab.scrollIntoView({block: 'nearest', behavior: 'smooth'});\n activeTab.requestUpdate();\n this._updateTabIndicator();\n }\n\n override attributeChangedCallback(name: string, _: string | null, __: string | null) {\n if (name === 'variant') {\n this._updateTabIndicator();\n }\n }\n\n override connectedCallback() {\n super.connectedCallback();\n\n this.updateComplete\n .then(() => {\n this._setScrollIndicatorsActive();\n });\n }\n\n protected override render(): TemplateResult {\n return html`\n\n <div\n class=\"scroll-indicator scroll-left active\"\n @click=${this.#scrollToLeft}>\n <u-elevation></u-elevation>\n <u-ripple></u-ripple>\n <slot name=\"scroll-left\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" viewBox=\"0 -960 960 960\" width=\"1em\" fill=\"currentColor\">\n <path d=\"M560-240 320-480l240-240 56 56-184 184 184 184-56 56Z\"/>\n </svg>\n </slot>\n </div>\n <div\n class=\"container ${this.variant === 'secondary' ? 'secondary' : ''}\"\n @scrollend=${this.#handleContainerScrollEnd}>\n <slot @slotchange=${this.#handleSlotChange}></slot>\n <div class=\"tab-indicator\"></div>\n </div>\n <div\n class=\"scroll-indicator scroll-right active\"\n @click=${this.#scrollToRight}>\n <u-elevation></u-elevation>\n <u-ripple></u-ripple>\n <slot name=\"scroll-right\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" viewBox=\"0 -960 960 960\" width=\"1em\" fill=\"currentColor\">\n <path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\"/>\n </svg>\n </slot>\n </div>`;\n }\n\n constructor() {\n super();\n this.#resizeObserver.observe(this);\n }\n\n #handleSlotChange = (e: Event) => {\n\n const slot = <HTMLSlotElement>e.target;\n this.#tabs = <UmTab[]>slot\n .assignedElements({flatten: true})\n .filter(e => e instanceof UmTab);\n\n for (const tab of this.#tabs) {\n tab._bar = this;\n }\n\n if (this.activeTabIndex > -1) {\n return;\n }\n\n this.activeTab = this.#tabs[0];\n };\n\n #handleContainerScrollEnd = () => {\n this._setScrollIndicatorsActive();\n }\n\n _updateTabIndicator() {\n if (!this._tabIndicator) {\n return;\n }\n\n if (!this.activeTab) {\n this._tabIndicator.style.left = '0';\n this._tabIndicator.style.width = '0';\n return;\n }\n\n const styles = getComputedStyle(this.activeTab);\n const padding = this.variant === 'primary'\n ? parseInt(styles.paddingInline, 10)\n : 0;\n\n this._tabIndicator.style.left = `${this.activeTab.offsetLeft + padding}px`;\n this._tabIndicator.style.width = `${this.activeTab.offsetWidth - padding * 2}px`;\n }\n\n #scrollToLeft = () => {\n this._container.scrollBy({left: this._container.offsetWidth / -2, behavior: 'smooth'});\n };\n\n #scrollToRight = () => {\n this._container.scrollBy({left: this._container.offsetWidth / 2, behavior: 'smooth'});\n };\n\n _setScrollIndicatorsActive() {\n const scrollSafeMargin = 1;\n\n const scrollLength = this._container.scrollWidth - this._container.offsetWidth;\n\n const isRtl = getComputedStyle(this._container).direction === 'rtl';\n const scrollStart = isRtl\n ? this._container.scrollLeft + scrollLength\n : this._container.scrollLeft;\n\n if (scrollStart - scrollSafeMargin <= 0) {\n this._container.scrollBy(-1, 0);\n this._scrollLeft.classList.remove('active');\n } else {\n this._scrollLeft.classList.add('active');\n }\n\n if (scrollStart >= scrollLength - scrollSafeMargin) {\n this._container.scrollBy(1, 0);\n this._scrollRight.classList.remove('active');\n } else {\n this._scrollRight.classList.add('active');\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-tab-bar': UmTabBar;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tab-bar.styles.d.ts","sourceRoot":"","sources":["../../src/tab-bar/tab-bar.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,yBAqElB,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { css } from 'lit';
|
|
2
|
+
export const styles = css `
|
|
3
|
+
:host {
|
|
4
|
+
position: relative;
|
|
5
|
+
display: block;
|
|
6
|
+
--_active-color: var(--u-tab-active-color, var(--u-color-primary, rgb(103, 80, 164)));
|
|
7
|
+
--_active-label-color: var(--u-tab-active-label-color, var(--u-color-primary, rgb(103, 80, 164)));
|
|
8
|
+
overflow: hidden;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.container {
|
|
12
|
+
position: relative;
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: row;
|
|
15
|
+
width: 100%;
|
|
16
|
+
min-height: var(--u-tab-bar-min-height, 48px);
|
|
17
|
+
overflow: auto;
|
|
18
|
+
scroll-padding-inline: 128px;
|
|
19
|
+
scrollbar-width: none;
|
|
20
|
+
}
|
|
21
|
+
.container::-webkit-scrollbar {
|
|
22
|
+
display: none;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.scroll-indicator {
|
|
26
|
+
--u-elevation-level: 2;
|
|
27
|
+
cursor: pointer;
|
|
28
|
+
position: absolute;
|
|
29
|
+
display: none;
|
|
30
|
+
align-items: center;
|
|
31
|
+
justify-content: center;
|
|
32
|
+
top: 0;
|
|
33
|
+
width: var(--u-tab-bar-scroll-indicator-size, 32px);
|
|
34
|
+
background-color: var(--u-scroll-indicator-bg-color, var(--u-current-bg-color, var(--u-color-surface, rgb(254, 247, 255))));
|
|
35
|
+
font-size: 1.5rem;
|
|
36
|
+
height: 100%;
|
|
37
|
+
z-index: 1;
|
|
38
|
+
}
|
|
39
|
+
@media (hover: hover) {
|
|
40
|
+
:host(:hover) .scroll-indicator.active {
|
|
41
|
+
display: flex;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.scroll-left {
|
|
46
|
+
left: 0;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.scroll-right {
|
|
50
|
+
right: 0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.tab-indicator {
|
|
54
|
+
position: absolute;
|
|
55
|
+
background-color: var(--_active-color);
|
|
56
|
+
height: 3px;
|
|
57
|
+
bottom: 0;
|
|
58
|
+
transition: inset 200ms ease-out, width 200ms ease-out;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.container:not(.secondary) .tab-indicator {
|
|
62
|
+
border-radius: var(--u-tab-bar-primary-border-radius, 9999px 9999px 0 0);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.secondary {
|
|
66
|
+
--_active-label-color: var(--u-tab-secondary-active-label-color, var(--u-color-on-surface, rgb(29, 27, 32)));
|
|
67
|
+
--_tab-content-direction: row;
|
|
68
|
+
--_tab-content-gap: 8px;
|
|
69
|
+
--u-tab-with-icon-height: var(--u-tab-secondary-with-icon-height, 48px);
|
|
70
|
+
}
|
|
71
|
+
`;
|
|
72
|
+
//# sourceMappingURL=tab-bar.styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tab-bar.styles.js","sourceRoot":"","sources":["../../src/tab-bar/tab-bar.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqEzB,CAAC","sourcesContent":["import { css } from 'lit';\n\nexport const styles = css `\n :host {\n position: relative;\n display: block;\n --_active-color: var(--u-tab-active-color, var(--u-color-primary, rgb(103, 80, 164)));\n --_active-label-color: var(--u-tab-active-label-color, var(--u-color-primary, rgb(103, 80, 164)));\n overflow: hidden;\n }\n\n .container {\n position: relative;\n display: flex;\n flex-direction: row;\n width: 100%;\n min-height: var(--u-tab-bar-min-height, 48px);\n overflow: auto;\n scroll-padding-inline: 128px;\n scrollbar-width: none;\n }\n .container::-webkit-scrollbar {\n display: none;\n }\n\n .scroll-indicator {\n --u-elevation-level: 2;\n cursor: pointer;\n position: absolute;\n display: none;\n align-items: center;\n justify-content: center;\n top: 0;\n width: var(--u-tab-bar-scroll-indicator-size, 32px);\n background-color: var(--u-scroll-indicator-bg-color, var(--u-current-bg-color, var(--u-color-surface, rgb(254, 247, 255))));\n font-size: 1.5rem;\n height: 100%;\n z-index: 1;\n }\n @media (hover: hover) {\n :host(:hover) .scroll-indicator.active {\n display: flex;\n }\n }\n\n .scroll-left {\n left: 0;\n }\n\n .scroll-right {\n right: 0;\n }\n\n .tab-indicator {\n position: absolute;\n background-color: var(--_active-color);\n height: 3px;\n bottom: 0;\n transition: inset 200ms ease-out, width 200ms ease-out;\n }\n\n .container:not(.secondary) .tab-indicator {\n border-radius: var(--u-tab-bar-primary-border-radius, 9999px 9999px 0 0);\n }\n\n .secondary {\n --_active-label-color: var(--u-tab-secondary-active-label-color, var(--u-color-on-surface, rgb(29, 27, 32)));\n --_tab-content-direction: row;\n --_tab-content-gap: 8px;\n --u-tab-with-icon-height: var(--u-tab-secondary-with-icon-height, 48px);\n }\n`;\n"]}
|
package/tab-bar/tab.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { HTMLTemplateResult } from 'lit';
|
|
2
|
+
import { UmButtonWrapper } from '../shared/button-wrapper.js';
|
|
3
|
+
import { UmTabBar } from './tab-bar.js';
|
|
4
|
+
export declare class UmTab extends UmButtonWrapper {
|
|
5
|
+
#private;
|
|
6
|
+
static styles: import("lit").CSSResultGroup[];
|
|
7
|
+
_bar: UmTabBar | null;
|
|
8
|
+
get active(): boolean;
|
|
9
|
+
set active(active: boolean);
|
|
10
|
+
hasIcon: boolean;
|
|
11
|
+
constructor();
|
|
12
|
+
protected renderContent(): HTMLTemplateResult;
|
|
13
|
+
connectedCallback(): void;
|
|
14
|
+
disconnectedCallback(): void;
|
|
15
|
+
protected handleClick(_: UIEvent): void;
|
|
16
|
+
}
|
|
17
|
+
declare global {
|
|
18
|
+
interface HTMLElementTagNameMap {
|
|
19
|
+
'u-tab': UmTab;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=tab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tab.d.ts","sourceRoot":"","sources":["../../src/tab-bar/tab.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,kBAAkB,EAAE,MAAM,KAAK,CAAC;AAK/C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,qBACa,KAAM,SAAQ,eAAe;;IACxC,OAAgB,MAAM,iCAAoC;IAE1D,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAQ;IAQ7B,IACI,MAAM,IAAI,OAAO,CAEpB;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,EAYzB;IAE0B,OAAO,UAAS;;cAOxB,aAAa,IAAI,kBAAkB;IAc7C,iBAAiB;IAMjB,oBAAoB;cAiBV,WAAW,CAAC,CAAC,EAAE,OAAO;CAe1C;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,OAAO,EAAE,KAAK,CAAC;KAChB;CACF"}
|
package/tab-bar/tab.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { html } from 'lit';
|
|
8
|
+
import { customElement, property, state } from 'lit/decorators.js';
|
|
9
|
+
import { styles } from './tab.styles.js';
|
|
10
|
+
import { UmButtonWrapper } from '../shared/button-wrapper.js';
|
|
11
|
+
let UmTab = class UmTab extends UmButtonWrapper {
|
|
12
|
+
static { this.styles = [UmButtonWrapper.styles, styles]; }
|
|
13
|
+
#resizeObserver;
|
|
14
|
+
get active() {
|
|
15
|
+
return this._bar?.activeTab === this;
|
|
16
|
+
}
|
|
17
|
+
set active(active) {
|
|
18
|
+
if (!this._bar) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (active) {
|
|
22
|
+
this._bar.activeTab = this;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
this._bar.activeTabIndex = 0;
|
|
26
|
+
}
|
|
27
|
+
constructor() {
|
|
28
|
+
super();
|
|
29
|
+
this._bar = null;
|
|
30
|
+
this.#resizeObserver = new ResizeObserver(() => {
|
|
31
|
+
if (this.active) {
|
|
32
|
+
this._bar?._updateTabIndicator();
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
this.hasIcon = false;
|
|
36
|
+
this.#resizeObserver.observe(this);
|
|
37
|
+
}
|
|
38
|
+
renderContent() {
|
|
39
|
+
return html `
|
|
40
|
+
<div class="tab-content ${this.active ? 'active' : ''} ${this.hasIcon ? 'has-icon' : ''}">
|
|
41
|
+
<div class="icon">
|
|
42
|
+
<slot
|
|
43
|
+
name="icon"
|
|
44
|
+
@slotchange=${this.#iconSlotChange}></slot>
|
|
45
|
+
</div>
|
|
46
|
+
<div class="label">
|
|
47
|
+
<slot></slot>
|
|
48
|
+
</div>
|
|
49
|
+
</div>`;
|
|
50
|
+
}
|
|
51
|
+
connectedCallback() {
|
|
52
|
+
super.connectedCallback();
|
|
53
|
+
this._bar?._updateTabIndicator();
|
|
54
|
+
this._bar?._setScrollIndicatorsActive();
|
|
55
|
+
}
|
|
56
|
+
disconnectedCallback() {
|
|
57
|
+
super.disconnectedCallback();
|
|
58
|
+
if (!this._bar) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (this._bar.activeTab === this) {
|
|
62
|
+
this._bar.activeTabIndex = 0;
|
|
63
|
+
}
|
|
64
|
+
this._bar._updateTabIndicator();
|
|
65
|
+
this._bar._setScrollIndicatorsActive();
|
|
66
|
+
this._bar = null;
|
|
67
|
+
}
|
|
68
|
+
handleClick(_) {
|
|
69
|
+
super.handleClick(_);
|
|
70
|
+
if (!this._bar) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
this._bar.activeTab = this;
|
|
74
|
+
this._bar.dispatchEvent(new Event('change', { bubbles: true }));
|
|
75
|
+
}
|
|
76
|
+
#iconSlotChange(e) {
|
|
77
|
+
const slot = e.target;
|
|
78
|
+
this.hasIcon = !!slot.assignedElements({ flatten: true }).length;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
__decorate([
|
|
82
|
+
state()
|
|
83
|
+
], UmTab.prototype, "active", null);
|
|
84
|
+
__decorate([
|
|
85
|
+
property({ type: Boolean })
|
|
86
|
+
], UmTab.prototype, "hasIcon", void 0);
|
|
87
|
+
UmTab = __decorate([
|
|
88
|
+
customElement('u-tab')
|
|
89
|
+
], UmTab);
|
|
90
|
+
export { UmTab };
|
|
91
|
+
//# sourceMappingURL=tab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tab.js","sourceRoot":"","sources":["../../src/tab-bar/tab.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, HTMLTemplateResult } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { styles } from './tab.styles.js';\n\nimport { UmButtonWrapper } from '../shared/button-wrapper.js';\nimport { UmTabBar } from './tab-bar.js';\n\n@customElement('u-tab')\nexport class UmTab extends UmButtonWrapper {\n static override styles = [UmButtonWrapper.styles, styles];\n\n _bar: UmTabBar | null = null;\n\n #resizeObserver: ResizeObserver = new ResizeObserver(() => {\n if (this.active) {\n this._bar?._updateTabIndicator();\n }\n });\n\n @state()\n get active(): boolean {\n return this._bar?.activeTab === this;\n }\n set active(active: boolean) {\n\n if (!this._bar) {\n return;\n }\n\n if (active) {\n this._bar.activeTab = this;\n return;\n }\n\n this._bar.activeTabIndex = 0;\n }\n\n @property({type: Boolean}) hasIcon = false;\n\n constructor() {\n super();\n this.#resizeObserver.observe(this);\n }\n\n protected override renderContent(): HTMLTemplateResult {\n return html`\n <div class=\"tab-content ${this.active ? 'active' : ''} ${this.hasIcon ? 'has-icon' : ''}\">\n <div class=\"icon\">\n <slot\n name=\"icon\"\n @slotchange=${this.#iconSlotChange}></slot>\n </div>\n <div class=\"label\">\n <slot></slot>\n </div>\n </div>`;\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this._bar?._updateTabIndicator();\n this._bar?._setScrollIndicatorsActive();\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n\n if (!this._bar) {\n return;\n }\n\n if (this._bar.activeTab === this) {\n this._bar.activeTabIndex = 0;\n }\n\n this._bar._updateTabIndicator();\n this._bar._setScrollIndicatorsActive();\n\n this._bar = null;\n }\n\n protected override handleClick(_: UIEvent) {\n super.handleClick(_);\n\n if (!this._bar) {\n return;\n }\n\n this._bar.activeTab = this;\n this._bar.dispatchEvent(new Event('change', {bubbles: true}));\n }\n\n #iconSlotChange(e: Event) {\n const slot = <HTMLSlotElement>e.target;\n this.hasIcon = !!slot.assignedElements({flatten: true}).length;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-tab': UmTab;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tab.styles.d.ts","sourceRoot":"","sources":["../../src/tab-bar/tab.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,yBAiDlB,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { css } from 'lit';
|
|
2
|
+
export const styles = css `
|
|
3
|
+
:host {
|
|
4
|
+
--u-focus-ring-outline-offset: -4px;
|
|
5
|
+
--_tab-height: var(--u-tab-height, 48px);
|
|
6
|
+
display: block;
|
|
7
|
+
flex: 1;
|
|
8
|
+
padding-inline: var(--u-tab-padding, 16px);
|
|
9
|
+
max-width: var(--u-tab-max-width, 360px);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.tab-content {
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: var(--_tab-content-direction, column);
|
|
15
|
+
align-items: center;
|
|
16
|
+
justify-content: center;
|
|
17
|
+
height: var(--_tab-height);
|
|
18
|
+
gap: var(--_tab-content-gap, 0);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.has-icon {
|
|
22
|
+
--_tab-height: var(--u-tab-with-icon-height, 64px);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
:host(.force-focus-ring) .button,
|
|
26
|
+
.button:focus-visible {
|
|
27
|
+
border-radius: var(--u-spacing-small, 8px);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.label {
|
|
31
|
+
font-family: var(--u-font-family, var(--u-font-family, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"));
|
|
32
|
+
line-height: var(--u-tab-label-line-height, var(--u-title-s-line-height, 1.25rem));
|
|
33
|
+
font-size: var(--u-tab-label-font-size, var(--u-title-s-font-size, 0.875rem));
|
|
34
|
+
letter-spacing: var(--u-tab-label-letter-spacing, var(--u-title-s-letter-spacing, 0.0071428571rem));
|
|
35
|
+
font-weight: var(--u-tab-label-font-weight, var(--u-title-s-font-weight, var(--u-font-weight-medium, 500)));
|
|
36
|
+
color: var(--u-tab-label-text-color, var(--u-color-on-surface-variant, rgb(73, 69, 79)));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.icon {
|
|
40
|
+
display: flex;
|
|
41
|
+
align-items: center;
|
|
42
|
+
justify-content: center;
|
|
43
|
+
font-size: 1.5rem;
|
|
44
|
+
color: var(--u-tab-label-text-color, var(--u-color-on-surface-variant, rgb(73, 69, 79)));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.active .icon,
|
|
48
|
+
.active .label {
|
|
49
|
+
color: var(--_active-label-color);
|
|
50
|
+
}
|
|
51
|
+
`;
|
|
52
|
+
//# sourceMappingURL=tab.styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tab.styles.js","sourceRoot":"","sources":["../../src/tab-bar/tab.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDzB,CAAC","sourcesContent":["import { css } from 'lit';\n\nexport const styles = css `\n :host {\n --u-focus-ring-outline-offset: -4px;\n --_tab-height: var(--u-tab-height, 48px);\n display: block;\n flex: 1;\n padding-inline: var(--u-tab-padding, 16px);\n max-width: var(--u-tab-max-width, 360px);\n }\n\n .tab-content {\n display: flex;\n flex-direction: var(--_tab-content-direction, column);\n align-items: center;\n justify-content: center;\n height: var(--_tab-height);\n gap: var(--_tab-content-gap, 0);\n }\n\n .has-icon {\n --_tab-height: var(--u-tab-with-icon-height, 64px);\n }\n\n :host(.force-focus-ring) .button,\n .button:focus-visible {\n border-radius: var(--u-spacing-small, 8px);\n }\n\n .label {\n font-family: var(--u-font-family, var(--u-font-family, system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"));\n line-height: var(--u-tab-label-line-height, var(--u-title-s-line-height, 1.25rem));\n font-size: var(--u-tab-label-font-size, var(--u-title-s-font-size, 0.875rem));\n letter-spacing: var(--u-tab-label-letter-spacing, var(--u-title-s-letter-spacing, 0.0071428571rem));\n font-weight: var(--u-tab-label-font-weight, var(--u-title-s-font-weight, var(--u-font-weight-medium, 500)));\n color: var(--u-tab-label-text-color, var(--u-color-on-surface-variant, rgb(73, 69, 79)));\n }\n\n .icon {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.5rem;\n color: var(--u-tab-label-text-color, var(--u-color-on-surface-variant, rgb(73, 69, 79)));\n }\n\n .active .icon,\n .active .label {\n color: var(--_active-label-color);\n }\n`;\n"]}
|