@cas-smartdesign/tab-bar 4.0.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.
@@ -0,0 +1,64 @@
1
+ import { LitElement, PropertyValues } from "lit";
2
+ import "./tab";
3
+ import Tab from "./tab";
4
+ export { default as Tab } from "./tab";
5
+ declare global {
6
+ interface HTMLElementTagNameMap {
7
+ [TabBar.ID]: TabBar;
8
+ }
9
+ }
10
+ export interface ISelectionEvent {
11
+ selectedTab: {
12
+ index: number;
13
+ tabElement: Tab;
14
+ };
15
+ anchor: string;
16
+ }
17
+ export interface CustomEventMap extends HTMLElementEventMap {
18
+ selection: CustomEvent<ISelectionEvent>;
19
+ }
20
+ export default interface TabBar {
21
+ addEventListener<K extends keyof CustomEventMap>(event: K, listener: ((this: this, ev: CustomEventMap[K]) => unknown) | null, options?: AddEventListenerOptions | boolean): void;
22
+ addEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: AddEventListenerOptions | boolean): void;
23
+ removeEventListener<K extends keyof CustomEventMap>(type: K, listener: (this: this, ev: CustomEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
24
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
25
+ dispatchEvent<EventType extends CustomEventMap[keyof CustomEventMap]>(event: EventType): boolean;
26
+ }
27
+ export default class TabBar extends LitElement {
28
+ static readonly ID = "sd-tab-bar";
29
+ noBar: boolean;
30
+ noSlide: boolean;
31
+ vertical: boolean;
32
+ showCounter: boolean;
33
+ tabElements: Tab[];
34
+ private showLeftScrollButton;
35
+ private showRightScrollButton;
36
+ private _focusedIndex;
37
+ private _selectedIndex;
38
+ private resizeObserver;
39
+ private lastKnownWidth;
40
+ private _tabButtonContainer;
41
+ static shadowRootOptions: ShadowRootInit;
42
+ connectedCallback(): void;
43
+ disconnectedCallback(): void;
44
+ firstUpdated(changedProperties: PropertyValues): void;
45
+ static get styles(): import("lit").CSSResult[];
46
+ render(): import("lit").TemplateResult<1>;
47
+ set selectedIndex(newValue: number);
48
+ get selectedIndex(): number;
49
+ private updateSelectionState;
50
+ set focusedIndex(newValue: number);
51
+ get focusedIndex(): number;
52
+ private updateFocusedState;
53
+ private get slider();
54
+ private get tabButtonContainer();
55
+ private scrollToFocusedIfNeeded;
56
+ private handleSlotChange;
57
+ private handleTabFocus;
58
+ private handleTabSelection;
59
+ private handleKeyDown;
60
+ private updateScrollButtonVisibility;
61
+ private dispatchSelectionEvent;
62
+ private debounced;
63
+ private debounce;
64
+ }
@@ -0,0 +1,363 @@
1
+ import { LitElement as f, css as x, unsafeCSS as g, html as l } from "lit";
2
+ import { property as h } from "lit/decorators/property.js";
3
+ import { createPopper as y } from "@popperjs/core";
4
+ import m, { ListDataProvider as S, SelectionType as E } from "@cas-smartdesign/virtual-list";
5
+ const L = ":host{contain:content;outline:none}:host(:not([selected])) .text{opacity:.8}:host(:hover),:host(:focus),:host([anchors-shown]){background-color:var(--sd-tab-bar-hover-color, #e7f1fa);cursor:pointer}.root{position:relative;overflow:hidden;width:100%;height:100%;display:flex;align-items:center;justify-content:flex-start;padding:var(--sd-tab-bar-padding, 8px) calc(2 * var(--sd-tab-bar-padding, 8px));box-sizing:border-box}.counter{text-align:center;background-color:#d9d9d9;min-width:24px;height:24px;line-height:24px;margin-left:calc(-.5 * var(--sd-tab-bar-padding, 8px));margin-right:var(--sd-tab-bar-padding, 8px)}:host([selected]) .counter{color:var(--sd-tab-bar-selected-counter-color, white);background-color:var(--sd-tab-bar-selected-counter-background-color, #3b85d1)}.text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;flex-grow:1}.down-arrow{padding-left:calc(1.5 * var(--sd-tab-bar-padding, 8px));margin-right:calc(-1 * var(--sd-tab-bar-padding, 8px));outline:none;fill:var(--sd-tab-bar-color, #1467ba);flex:0 0 auto}.ripple{position:absolute;background:var(--sd-tab-bar-color, #1467ba);border-radius:50%;width:5px;height:5px;animation:rippleEffect .88s 1;opacity:0}@keyframes rippleEffect{0%{transform:scale(1);opacity:.4}to{transform:scale(100);opacity:0}}";
6
+ var C = Object.defineProperty, I = Object.getOwnPropertyDescriptor, p = (c, t, e, i) => {
7
+ for (var s = i > 1 ? void 0 : i ? I(t, e) : t, o = c.length - 1, n; o >= 0; o--)
8
+ (n = c[o]) && (s = (i ? n(t, e, s) : n(s)) || s);
9
+ return i && s && C(t, e, s), s;
10
+ };
11
+ const w = navigator.userAgent.indexOf("Trident") !== -1, b = class b extends f {
12
+ constructor() {
13
+ super(...arguments), this.minimumOverlayWidth = 150, this.handleKeyDown = (t) => {
14
+ this.hasAnchors ? (this.vertical ? ["Left", "ArrowLeft", "Right", "ArrowRight", "Enter"] : ["Down", "ArrowDown", "Up", "ArrowUp", "Enter"]).indexOf(t.key) === -1 ? (this.hideAnchors(), this.focus()) : (this.anchorsShown || (this.showAnchors(), window.requestAnimationFrame(() => {
15
+ this.list.focusIndex = 0, this.list.focus(), this.updateDropdownSizes();
16
+ })), t.preventDefault(), t.stopPropagation()) : t.key === "Enter" && (this.dispatchSelectionEvent(), t.preventDefault(), t.stopPropagation());
17
+ }, this.handleListSelection = (t) => {
18
+ this.hideAnchors(), t.stopPropagation(), this.dispatchSelectionEvent(this.anchors[t.detail.index]), this.focus();
19
+ }, this.handlePointerLeave = (t) => {
20
+ (w || this.list && !this.list.contains(t.target)) && window.addEventListener("pointermove", this.handlePointerMove);
21
+ }, this.handlePointerMove = (t) => {
22
+ !this.isPointerAbove(t, this) && !this.isPointerAbove(t, this.list) && (this.hideAnchors(), window.removeEventListener("pointermove", this.handlePointerMove));
23
+ };
24
+ }
25
+ get selected() {
26
+ return this.hasAttribute("selected");
27
+ }
28
+ set selected(t) {
29
+ if (t)
30
+ this.setAttribute("selected", "");
31
+ else if (this.removeAttribute("selected"), this.shadowRoot && this.showRipple) {
32
+ const e = this.shadowRoot.querySelector(".ripple");
33
+ e.style.display = "none", this.showRipple = !1;
34
+ }
35
+ }
36
+ firstUpdated(t) {
37
+ super.firstUpdated(t);
38
+ const e = window.CSS && window.CSS.supports;
39
+ this._cssMathMaxSupported = e && CSS.supports("max-width", "max(50vw)");
40
+ const i = this.ownerDocument;
41
+ i.adoptedStyleSheets && (this.shadowRoot.adoptedStyleSheets = [
42
+ ...this.shadowRoot.adoptedStyleSheets,
43
+ ...i.adoptedStyleSheets
44
+ ]), this.addEventListener("pointerdown", (s) => {
45
+ if (!this.noInk && !this.showRipple) {
46
+ this.showRipple = !0;
47
+ const o = this.getBoundingClientRect(), n = this.shadowRoot.querySelector(".ripple");
48
+ n.style.left = `${s.clientX - o.left}px`, n.style.top = `${s.clientY - o.top}px`, n.style.display = "", n.addEventListener(
49
+ "animationend",
50
+ () => {
51
+ n.style.display = "none", this.showRipple = !1;
52
+ },
53
+ { once: !0 }
54
+ );
55
+ }
56
+ }), this.addEventListener("click", (s) => {
57
+ s.composedPath().indexOf(this.list) === -1 && (this.dispatchSelectionEvent(), s.preventDefault(), s.stopPropagation());
58
+ }), this.addEventListener("keydown", this.handleKeyDown), this.hasAttribute("tabindex") || this.setAttribute("tabindex", "0");
59
+ }
60
+ disconnectedCallback() {
61
+ super.disconnectedCallback(), this.hideAnchors();
62
+ }
63
+ static get styles() {
64
+ return [
65
+ x`
66
+ ${g(L)}
67
+ `
68
+ ];
69
+ }
70
+ render() {
71
+ return l`
72
+ <div class="root" @pointerover=${this.showAnchors} @pointerdown=${this.showAnchors}>
73
+ ${this.showCounter ? l` <span class="counter">${this.index + 1}</span> ` : ""}
74
+ <div class="text">${this.text}</div>
75
+ <div class="ripple" style="display: none"></div>
76
+ ${this.hasAnchors ? l`
77
+ <svg class="down-arrow" tabindex="-1" viewBox="0 0 16 16" width="16" height="16">
78
+ <path d="M13 4v2l-5 5-5-5v-2l5 5z"></path>
79
+ </svg>
80
+ ` : ""}
81
+ </div>
82
+ `;
83
+ }
84
+ updateDropdownSizes() {
85
+ const e = ((window.innerHeight || document.documentElement.clientHeight) - this.offsetHeight) * 0.5;
86
+ Object.assign(this.list.style, {
87
+ maxHeight: `${e}px`,
88
+ minWidth: `${Math.max(this.offsetWidth, this.minimumOverlayWidth)}px`,
89
+ maxWidth: this._cssMathMaxSupported ? `max(50vw, ${this.offsetWidth}px)` : Math.max((window.innerWidth || document.documentElement.clientWidth) / 2, this.offsetWidth) + "px"
90
+ });
91
+ }
92
+ dispatchSelectionEvent(t) {
93
+ this.dispatchEvent(new CustomEvent("selection", { detail: { anchor: t } }));
94
+ }
95
+ isPointerAbove(t, e) {
96
+ const i = e.getBoundingClientRect();
97
+ return i.left <= t.clientX && i.right >= t.clientX && i.top <= t.clientY && i.bottom >= t.clientY;
98
+ }
99
+ showAnchors() {
100
+ !this.anchorsShown && this.hasAnchors && (this.root.addEventListener("pointerleave", this.handlePointerLeave), this.list || this.createList(), this.dataProvider.items = this.anchors.map((t, e) => ({
101
+ caption: t,
102
+ index: e
103
+ })), this.updateDropdownSizes(), this.ownerDocument.body.appendChild(this.list), this.popper || (this.popper = y(this, this.list, {
104
+ placement: this.vertical ? "right-start" : "bottom-start",
105
+ modifiers: [
106
+ {
107
+ name: "computeStyles",
108
+ options: {
109
+ gpuAcceleration: !w
110
+ }
111
+ },
112
+ {
113
+ name: "hide",
114
+ enabled: !1
115
+ },
116
+ {
117
+ name: "preventOverflow",
118
+ options: {
119
+ padding: 0
120
+ }
121
+ },
122
+ {
123
+ name: "adjustWidthIfNeeded",
124
+ enabled: !0,
125
+ phase: "read",
126
+ fn({ state: t }) {
127
+ t.elements.popper.increaseWidthOnNextRenderIfNeeded();
128
+ }
129
+ }
130
+ ]
131
+ })), window.requestAnimationFrame(() => {
132
+ this.popper && this.popper.update();
133
+ }), this.anchorsShown = !0);
134
+ }
135
+ createList() {
136
+ this.list = document.createElement(m.ID), this.dataProvider = new S(), this.dataProvider.finalSizeIsKnown = !0, this.dataProvider.connectList(this.list), this.list.classList.add("anchor-list"), this.list.tabIndex = 0, this.list.selectionType = E.TriggerOnly, this.list.addEventListener("selection", this.handleListSelection), this.list.addEventListener("keydown", (t) => {
137
+ t.key == "Escape" && (this.hideAnchors(), this.focus());
138
+ }), this.list.addEventListener("focusout", () => {
139
+ this.hideAnchors();
140
+ }), this.list.setAttribute("slot", "anchors"), this.list.itemHeight = 50, Object.assign(this.list.style, {
141
+ zIndex: "21000",
142
+ boxShadow: `rgba(0, 0, 0, 0.14) 0px 2px 2px 0px,
143
+ rgba(0, 0, 0, 0.12) 0px 1px 5px 0px,
144
+ rgba(0, 0, 0, 0.2) 0px 3px 1px -2px`,
145
+ background: "white",
146
+ overflowY: "auto"
147
+ });
148
+ }
149
+ hideAnchors() {
150
+ this.anchorsShown && (this.anchorsShown = !1, this.root.removeEventListener("pointerleave", this.handlePointerLeave), this.list && (this.list.focusIndex = -1, this.list.parentElement.removeChild(this.list))), this.popper && (this.popper.destroy(), this.popper = null);
151
+ }
152
+ get hasAnchors() {
153
+ return !!(this.anchors && this.anchors.length);
154
+ }
155
+ get root() {
156
+ return this.shadowRoot ? this.shadowRoot.querySelector(".root") : null;
157
+ }
158
+ };
159
+ b.ID = "sd-tab";
160
+ let r = b;
161
+ p([
162
+ h({ type: String })
163
+ ], r.prototype, "text", 2);
164
+ p([
165
+ h({ type: Array })
166
+ ], r.prototype, "anchors", 2);
167
+ p([
168
+ h()
169
+ ], r.prototype, "index", 2);
170
+ p([
171
+ h()
172
+ ], r.prototype, "showCounter", 2);
173
+ p([
174
+ h({ type: Boolean, reflect: !0, attribute: "anchors-shown" })
175
+ ], r.prototype, "anchorsShown", 2);
176
+ m.ensureDefined();
177
+ customElements.get(r.ID) || customElements.define(r.ID, r);
178
+ const B = ":host{display:block;outline:none;contain:content}:host([vertical]) .tab-button-container{flex-direction:column}:host([vertical]) .slider{top:0;width:2px}:host(:not([vertical])) .slider{bottom:0;height:2px}.root{display:flex;width:100%;overflow:hidden}.tab-button-container{display:flex;flex-wrap:nowrap;overflow:hidden;position:relative;flex:1 1 auto}@supports (scrollbar-width: none){:host(:not([vertical])) .tab-button-container{overflow-x:auto;scrollbar-width:none}:host(:not([vertical])) .tab-button-container::-webkit-scrollbar{display:none}}@supports selector(::-webkit-scrollbar){:host(:not([vertical])) .tab-button-container{overflow-x:auto;scrollbar-width:none}:host(:not([vertical])) .tab-button-container::-webkit-scrollbar{display:none}}:host([vertical]) .root{height:100%}:host([vertical]) .tab-button-container{overflow-y:auto;height:100%}:host([vertical]) ::slotted(*){flex-shrink:0;flex-grow:0}.slider{background-color:var(--sd-tab-bar-color, #1467ba);position:absolute;left:0}:host(:not([no-slide])) .slider,:host([no-slide=false]) .slider{transition-duration:var(--sd-tab-bar-slide-duration, .5s)}.scroll-button{cursor:pointer;padding:4px;position:relative;flex:0 0 auto;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 2px #00000024,0 1px 5px #0000001f,0 3px 1px -2px #0003}.scroll-button>svg{width:24px;height:24px;fill:var(--sd-tab-bar-color, #1467ba)}.ripple{position:absolute;left:0;top:0;background-position:center;transition:background-color .88s;opacity:.4;width:100%;height:100%;border-radius:50%}.ripple:active{background-color:var(--sd-tab-bar-color, #1467ba);background-size:100%;transition:background-color 0s}";
179
+ var A = Object.defineProperty, D = Object.getOwnPropertyDescriptor, d = (c, t, e, i) => {
180
+ for (var s = i > 1 ? void 0 : i ? D(t, e) : t, o = c.length - 1, n; o >= 0; o--)
181
+ (n = c[o]) && (s = (i ? n(t, e, s) : n(s)) || s);
182
+ return i && s && A(t, e, s), s;
183
+ };
184
+ const v = 40, u = class u extends f {
185
+ constructor() {
186
+ super(...arguments), this.handleSlotChange = () => {
187
+ this.tabElements = this.shadowRoot.querySelector("slot").assignedNodes().filter((e) => e instanceof r);
188
+ let t = 0;
189
+ this.tabElements.forEach((e) => {
190
+ e.vertical = this.vertical, e.showCounter = this.showCounter, e.index = t++, e.addEventListener("focus", this.handleTabFocus), e.addEventListener("selection", this.handleTabSelection);
191
+ }), this.updateScrollButtonVisibility(), this.selectedIndex == null && (this._focusedIndex = 0, this._selectedIndex = 0), this.updateSelectionState();
192
+ }, this.handleTabFocus = (t) => {
193
+ const e = t.target.index;
194
+ this.focusedIndex !== e && (this._focusedIndex = e, this.scrollToFocusedIfNeeded());
195
+ }, this.handleTabSelection = (t) => {
196
+ this.selectedIndex = t.target.index, this.dispatchSelectionEvent(t.detail.anchor);
197
+ }, this.handleKeyDown = (t) => {
198
+ switch (t.key) {
199
+ case "Up":
200
+ case "ArrowUp":
201
+ case "Left":
202
+ case "ArrowLeft":
203
+ t.preventDefault(), this.focusedIndex = Math.max(this.focusedIndex - 1, 0);
204
+ break;
205
+ case "Down":
206
+ case "ArrowDown":
207
+ case "Right":
208
+ case "ArrowRight":
209
+ t.preventDefault(), this.focusedIndex = Math.min(this.focusedIndex + 1, this.tabElements.length - 1);
210
+ break;
211
+ }
212
+ }, this.debounced = {};
213
+ }
214
+ connectedCallback() {
215
+ super.connectedCallback(), this.resizeObserver = new ResizeObserver(() => {
216
+ this.debounce("update-scroll-button-visibility", () => {
217
+ this.lastKnownWidth !== this.offsetWidth && (this.lastKnownWidth = this.offsetWidth, this.updateScrollButtonVisibility());
218
+ });
219
+ }), this.resizeObserver.observe(this);
220
+ }
221
+ disconnectedCallback() {
222
+ super.disconnectedCallback(), this.resizeObserver.disconnect();
223
+ }
224
+ firstUpdated(t) {
225
+ super.firstUpdated(t);
226
+ const e = this.ownerDocument;
227
+ e.adoptedStyleSheets && (this.shadowRoot.adoptedStyleSheets = [
228
+ ...this.shadowRoot.adoptedStyleSheets,
229
+ ...e.adoptedStyleSheets
230
+ ]), this.shadowRoot.querySelector("slot").addEventListener("slotchange", this.handleSlotChange), this.addEventListener("keydown", this.handleKeyDown), this.tabButtonContainer.addEventListener("wheel", (s) => {
231
+ if (this.tabButtonContainer.scrollWidth > this.tabButtonContainer.offsetWidth) {
232
+ const o = document.elementsFromPoint(s.x, s.y)[0];
233
+ this.tabButtonContainer.scrollLeft += s.deltaY;
234
+ const n = document.elementsFromPoint(s.x, s.y)[0];
235
+ o != n && (o instanceof r && o.hideAnchors(), n instanceof r && n.showAnchors()), s.preventDefault();
236
+ }
237
+ });
238
+ }
239
+ static get styles() {
240
+ return [
241
+ x`
242
+ ${g(B)}
243
+ `
244
+ ];
245
+ }
246
+ // prettier-ignore
247
+ render() {
248
+ return l`
249
+ <div class="root">
250
+ ${!this.vertical && this.showLeftScrollButton ? l`
251
+ <div class="scroll-button left" @pointerdown="${() => {
252
+ this.tabButtonContainer.scrollLeft -= v;
253
+ }}">
254
+ <div class="ripple"></div>
255
+ <svg><g><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"></path></g></svg>
256
+ </div>` : ""}
257
+ <div class="tab-button-container" @scroll="${this.updateScrollButtonVisibility}">
258
+ <slot></slot>
259
+ ${this.noBar ? "" : l` <div class="slider"></div>`}
260
+ </div>
261
+ ${!this.vertical && this.showRightScrollButton ? l`
262
+ <div class="scroll-button right" @pointerdown="${() => {
263
+ this.tabButtonContainer.scrollLeft += v;
264
+ }}">
265
+ <div class="ripple"></div>
266
+ <svg><g><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"></path></g></svg>
267
+ </div>` : ""}
268
+ </div>
269
+ `;
270
+ }
271
+ set selectedIndex(t) {
272
+ this._selectedIndex !== t && (this.focusedIndex = t, this._selectedIndex = t, this.updateSelectionState());
273
+ }
274
+ get selectedIndex() {
275
+ return this._selectedIndex;
276
+ }
277
+ updateSelectionState() {
278
+ this.tabElements && this.tabElements.forEach((t, e) => {
279
+ e === this._selectedIndex ? (t.selected = !0, this.slider && window.requestAnimationFrame(() => {
280
+ let i = t.offsetLeft, s = t.offsetTop;
281
+ t.offsetParent != this._tabButtonContainer && (i -= this._tabButtonContainer.offsetLeft, s -= this._tabButtonContainer.offsetTop);
282
+ const o = this.slider;
283
+ this.vertical ? (o.style.height = t.offsetHeight + "px", o.style.transform = `translateY(${s}px)`) : (o.style.width = t.offsetWidth + "px", o.style.transform = `translateX(${i}px)`);
284
+ })) : t.selected = !1;
285
+ });
286
+ }
287
+ set focusedIndex(t) {
288
+ this._focusedIndex !== t && (this._focusedIndex = t, this.updateFocusedState());
289
+ }
290
+ get focusedIndex() {
291
+ return this._focusedIndex;
292
+ }
293
+ updateFocusedState() {
294
+ this.tabElements && this.focusedIndex >= 0 && this.focusedIndex < this.tabElements.length && (this.scrollToFocusedIfNeeded(), this.tabElements[this.focusedIndex].focus());
295
+ }
296
+ get slider() {
297
+ return this.shadowRoot.querySelector(".slider");
298
+ }
299
+ get tabButtonContainer() {
300
+ return this._tabButtonContainer || (this._tabButtonContainer = this.shadowRoot.querySelector(".tab-button-container")), this._tabButtonContainer;
301
+ }
302
+ scrollToFocusedIfNeeded() {
303
+ if (this.tabElements && this.focusedIndex >= 0 && this.focusedIndex < this.tabElements.length) {
304
+ const t = this.tabElements[this.focusedIndex];
305
+ let e = t.offsetLeft;
306
+ t.offsetParent != this._tabButtonContainer && (e -= this._tabButtonContainer.offsetLeft);
307
+ const i = t.offsetWidth, s = e + i;
308
+ if (e > this.tabButtonContainer.scrollLeft && s < this.tabButtonContainer.scrollLeft + this.tabButtonContainer.offsetWidth)
309
+ return;
310
+ this.tabButtonContainer.scrollLeft < e ? this.tabButtonContainer.scrollLeft = s - this.tabButtonContainer.offsetWidth : this.tabButtonContainer.scrollLeft + this.tabButtonContainer.offsetWidth > s && (this.tabButtonContainer.scrollLeft = e);
311
+ }
312
+ }
313
+ updateScrollButtonVisibility() {
314
+ this.showLeftScrollButton = this.tabButtonContainer.scrollLeft !== 0, this.showRightScrollButton = this.tabButtonContainer.scrollLeft < this.tabButtonContainer.scrollWidth - this.tabButtonContainer.offsetWidth;
315
+ }
316
+ dispatchSelectionEvent(t) {
317
+ this.dispatchEvent(
318
+ new CustomEvent("selection", {
319
+ detail: {
320
+ selectedTab: {
321
+ index: this.selectedIndex,
322
+ tabElement: this.tabElements[this.selectedIndex]
323
+ },
324
+ anchor: t
325
+ }
326
+ })
327
+ );
328
+ }
329
+ debounce(t, e) {
330
+ this.debounced[t] || (this.debounced[t] = !0, requestAnimationFrame(() => {
331
+ delete this.debounced[t], e();
332
+ }));
333
+ }
334
+ };
335
+ u.ID = "sd-tab-bar", u.shadowRootOptions = {
336
+ ...f.shadowRootOptions,
337
+ delegatesFocus: !0
338
+ };
339
+ let a = u;
340
+ d([
341
+ h({ type: Boolean, reflect: !0, attribute: "no-bar" })
342
+ ], a.prototype, "noBar", 2);
343
+ d([
344
+ h({ type: Boolean, reflect: !0, attribute: "no-slide" })
345
+ ], a.prototype, "noSlide", 2);
346
+ d([
347
+ h({ type: Boolean, reflect: !0 })
348
+ ], a.prototype, "vertical", 2);
349
+ d([
350
+ h({ type: Boolean, reflect: !0, attribute: "show-counter" })
351
+ ], a.prototype, "showCounter", 2);
352
+ d([
353
+ h()
354
+ ], a.prototype, "showLeftScrollButton", 2);
355
+ d([
356
+ h()
357
+ ], a.prototype, "showRightScrollButton", 2);
358
+ customElements.get(a.ID) || customElements.define(a.ID, a);
359
+ export {
360
+ r as Tab,
361
+ a as default
362
+ };
363
+ //# sourceMappingURL=tab-bar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab-bar.mjs","sources":["../tab.ts","../tab-bar.ts"],"sourcesContent":["import { LitElement, html, unsafeCSS, PropertyValues, css } from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\nimport { createPopper, Instance as Popper } from \"@popperjs/core\";\nimport \"@cas-smartdesign/virtual-list\";\nimport VirtualList, { ListDataProvider, SelectionType } from \"@cas-smartdesign/virtual-list\";\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [Tab.ID]: Tab;\n }\n}\nimport style from \"./tab-style.scss?inline\";\n\nconst isIE11 = navigator.userAgent.indexOf(\"Trident\") !== -1;\n\nexport interface ISelectionEvent {\n anchor: string;\n}\n\nexport interface CustomEventMap extends HTMLElementEventMap {\n selection: CustomEvent<ISelectionEvent>;\n}\n\nexport default interface Tab {\n addEventListener<K extends keyof CustomEventMap>(\n event: K,\n listener: ((this: this, ev: CustomEventMap[K]) => unknown) | null,\n options?: AddEventListenerOptions | boolean,\n ): void;\n addEventListener(\n type: string,\n callback: EventListenerOrEventListenerObject | null,\n options?: AddEventListenerOptions | boolean,\n ): void;\n removeEventListener<K extends keyof CustomEventMap>(\n type: K,\n listener: (this: this, ev: CustomEventMap[K]) => unknown,\n options?: boolean | EventListenerOptions,\n ): void;\n removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ): void;\n dispatchEvent<EventType extends CustomEventMap[keyof CustomEventMap]>(event: EventType): boolean;\n}\n\nexport default class Tab extends LitElement {\n public static readonly ID = \"sd-tab\";\n\n @property({ type: String })\n public text: string;\n @property({ type: Array })\n public anchors: string[];\n @property()\n public index: number;\n @property()\n public showCounter: boolean;\n\n @property({ type: Boolean, reflect: true, attribute: \"anchors-shown\" })\n private anchorsShown: boolean;\n\n public noInk: boolean;\n public vertical: boolean;\n\n public minimumOverlayWidth = 150;\n\n private showRipple: boolean;\n private popper: Popper;\n private list: VirtualList;\n private dataProvider: ListDataProvider;\n private _cssMathMaxSupported: boolean;\n\n get selected(): boolean {\n return this.hasAttribute(\"selected\");\n }\n\n set selected(newValue: boolean) {\n if (newValue) {\n this.setAttribute(\"selected\", \"\");\n } else {\n this.removeAttribute(\"selected\");\n if (this.shadowRoot && this.showRipple) {\n const rippleElement = this.shadowRoot.querySelector(\".ripple\") as HTMLElement;\n rippleElement.style.display = \"none\";\n this.showRipple = false;\n }\n }\n }\n\n public firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n const supportsCSS = window.CSS && window.CSS.supports;\n this._cssMathMaxSupported = supportsCSS && CSS.supports(\"max-width\", \"max(50vw)\");\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n const ownerDocument = this.ownerDocument as any;\n if (ownerDocument.adoptedStyleSheets) {\n (this.shadowRoot as any).adoptedStyleSheets = [\n ...(this.shadowRoot as any).adoptedStyleSheets,\n ...ownerDocument.adoptedStyleSheets,\n ];\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n this.addEventListener(\"pointerdown\", (event: PointerEvent) => {\n if (!this.noInk && !this.showRipple) {\n this.showRipple = true;\n const rect: DOMRect = this.getBoundingClientRect();\n const rippleElement = this.shadowRoot.querySelector(\".ripple\") as HTMLElement;\n rippleElement.style.left = `${event.clientX - rect.left}px`;\n rippleElement.style.top = `${event.clientY - rect.top}px`;\n rippleElement.style.display = \"\";\n rippleElement.addEventListener(\n \"animationend\",\n () => {\n rippleElement.style.display = \"none\";\n this.showRipple = false;\n },\n { once: true },\n );\n }\n });\n this.addEventListener(\"click\", (event: MouseEvent) => {\n if (event.composedPath().indexOf(this.list) === -1) {\n this.dispatchSelectionEvent();\n event.preventDefault();\n event.stopPropagation();\n }\n });\n this.addEventListener(\"keydown\", this.handleKeyDown);\n if (!this.hasAttribute(\"tabindex\")) {\n this.setAttribute(\"tabindex\", \"0\");\n }\n }\n\n public disconnectedCallback(): void {\n super.disconnectedCallback();\n this.hideAnchors();\n }\n\n static get styles() {\n return [\n css`\n ${unsafeCSS(style)}\n `,\n ];\n }\n\n public render() {\n return html`\n <div class=\"root\" @pointerover=${this.showAnchors} @pointerdown=${this.showAnchors}>\n ${this.showCounter ? html` <span class=\"counter\">${this.index + 1}</span> ` : \"\"}\n <div class=\"text\">${this.text}</div>\n <div class=\"ripple\" style=\"display: none\"></div>\n ${this.hasAnchors\n ? html`\n <svg class=\"down-arrow\" tabindex=\"-1\" viewBox=\"0 0 16 16\" width=\"16\" height=\"16\">\n <path d=\"M13 4v2l-5 5-5-5v-2l5 5z\"></path>\n </svg>\n `\n : \"\"}\n </div>\n `;\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n if (this.hasAnchors) {\n const anchorTriggerKeys = this.vertical\n ? [\"Left\", \"ArrowLeft\", \"Right\", \"ArrowRight\", \"Enter\"]\n : [\"Down\", \"ArrowDown\", \"Up\", \"ArrowUp\", \"Enter\"];\n if (anchorTriggerKeys.indexOf(event.key) === -1) {\n this.hideAnchors();\n this.focus();\n } else {\n if (!this.anchorsShown) {\n this.showAnchors();\n window.requestAnimationFrame(() => {\n // IE would scroll down to bottom because the anchor list has not yet positioned there.\n this.list.focusIndex = 0;\n this.list.focus();\n\n this.updateDropdownSizes();\n });\n }\n event.preventDefault();\n event.stopPropagation();\n }\n } else if (event.key === \"Enter\") {\n this.dispatchSelectionEvent();\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n private updateDropdownSizes(): void {\n const viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n const overlayMaxHeight = (viewportHeight - this.offsetHeight) * 0.5;\n Object.assign(this.list.style, {\n maxHeight: `${overlayMaxHeight}px`,\n minWidth: `${Math.max(this.offsetWidth, this.minimumOverlayWidth)}px`,\n maxWidth: this._cssMathMaxSupported\n ? `max(50vw, ${this.offsetWidth}px)`\n : Math.max((window.innerWidth || document.documentElement.clientWidth) / 2, this.offsetWidth) + \"px\",\n });\n }\n\n private handleListSelection = (event: CustomEvent) => {\n this.hideAnchors();\n event.stopPropagation();\n this.dispatchSelectionEvent(this.anchors[event.detail.index]);\n this.focus();\n };\n\n private dispatchSelectionEvent(selectedAnchor?: string): void {\n this.dispatchEvent(new CustomEvent<ISelectionEvent>(\"selection\", { detail: { anchor: selectedAnchor } }));\n }\n\n private handlePointerLeave = (event: PointerEvent) => {\n if (isIE11 || (this.list && !this.list.contains(event.target as HTMLElement))) {\n window.addEventListener(\"pointermove\", this.handlePointerMove);\n }\n };\n\n private handlePointerMove = (event: PointerEvent) => {\n if (!this.isPointerAbove(event, this) && !this.isPointerAbove(event, this.list)) {\n this.hideAnchors();\n window.removeEventListener(\"pointermove\", this.handlePointerMove);\n }\n };\n\n private isPointerAbove(event: PointerEvent, element: HTMLElement): boolean {\n const rect = element.getBoundingClientRect();\n return (\n rect.left <= event.clientX &&\n rect.right >= event.clientX &&\n rect.top <= event.clientY &&\n rect.bottom >= event.clientY\n );\n }\n\n public showAnchors() {\n if (!this.anchorsShown && this.hasAnchors) {\n this.root.addEventListener(\"pointerleave\", this.handlePointerLeave);\n if (!this.list) {\n this.createList();\n }\n this.dataProvider.items = this.anchors.map((anchor, index) => {\n return {\n caption: anchor,\n index,\n };\n });\n\n this.updateDropdownSizes();\n this.ownerDocument.body.appendChild(this.list);\n if (!this.popper) {\n this.popper = createPopper(this, this.list, {\n placement: this.vertical ? \"right-start\" : \"bottom-start\",\n modifiers: [\n {\n name: \"computeStyles\",\n options: {\n gpuAcceleration: !isIE11,\n },\n },\n {\n name: \"hide\",\n enabled: false,\n },\n {\n name: \"preventOverflow\",\n options: {\n padding: 0,\n },\n },\n {\n name: \"adjustWidthIfNeeded\",\n enabled: true,\n phase: \"read\",\n fn({ state }) {\n const list = state.elements.popper as VirtualList;\n list.increaseWidthOnNextRenderIfNeeded();\n },\n },\n ],\n });\n }\n\n window.requestAnimationFrame(() => {\n if (this.popper) {\n this.popper.update();\n }\n });\n\n this.anchorsShown = true;\n }\n }\n\n private createList(): void {\n this.list = document.createElement(VirtualList.ID) as VirtualList;\n this.dataProvider = new ListDataProvider();\n this.dataProvider.finalSizeIsKnown = true;\n this.dataProvider.connectList(this.list);\n this.list.classList.add(\"anchor-list\");\n this.list.tabIndex = 0;\n this.list.selectionType = SelectionType.TriggerOnly;\n this.list.addEventListener(\"selection\", this.handleListSelection);\n this.list.addEventListener(\"keydown\", (e) => {\n if (e.key == \"Escape\") {\n this.hideAnchors();\n this.focus();\n }\n });\n this.list.addEventListener(\"focusout\", () => {\n this.hideAnchors();\n });\n this.list.setAttribute(\"slot\", \"anchors\");\n this.list.itemHeight = 50;\n Object.assign(this.list.style, {\n zIndex: \"21000\",\n boxShadow: `rgba(0, 0, 0, 0.14) 0px 2px 2px 0px,\n rgba(0, 0, 0, 0.12) 0px 1px 5px 0px,\n rgba(0, 0, 0, 0.2) 0px 3px 1px -2px`,\n background: \"white\",\n overflowY: \"auto\",\n });\n }\n\n hideAnchors(): void {\n if (this.anchorsShown) {\n this.anchorsShown = false;\n this.root.removeEventListener(\"pointerleave\", this.handlePointerLeave);\n if (this.list) {\n this.list.focusIndex = -1;\n this.list.parentElement.removeChild(this.list);\n }\n }\n if (this.popper) {\n this.popper.destroy();\n this.popper = null;\n }\n }\n\n private get hasAnchors(): boolean {\n return !!(this.anchors && this.anchors.length);\n }\n\n private get root(): HTMLElement {\n if (this.shadowRoot) {\n return this.shadowRoot.querySelector(\".root\");\n }\n return null;\n }\n}\n\nVirtualList.ensureDefined();\nif (!customElements.get(Tab.ID)) {\n customElements.define(Tab.ID, Tab);\n}\n","import { LitElement, html, PropertyValues, unsafeCSS, css } from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\nimport \"./tab\";\nimport Tab from \"./tab\";\nexport { default as Tab } from \"./tab\";\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [TabBar.ID]: TabBar;\n }\n}\nimport style from \"./tab-bar-style.scss?inline\";\n\nconst SCROLL_STEP = 40;\n\nexport interface ISelectionEvent {\n selectedTab: {\n index: number;\n tabElement: Tab;\n };\n anchor: string;\n}\n\nexport interface CustomEventMap extends HTMLElementEventMap {\n selection: CustomEvent<ISelectionEvent>;\n}\n\nexport default interface TabBar {\n addEventListener<K extends keyof CustomEventMap>(\n event: K,\n listener: ((this: this, ev: CustomEventMap[K]) => unknown) | null,\n options?: AddEventListenerOptions | boolean,\n ): void;\n addEventListener(\n type: string,\n callback: EventListenerOrEventListenerObject | null,\n options?: AddEventListenerOptions | boolean,\n ): void;\n removeEventListener<K extends keyof CustomEventMap>(\n type: K,\n listener: (this: this, ev: CustomEventMap[K]) => unknown,\n options?: boolean | EventListenerOptions,\n ): void;\n removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ): void;\n dispatchEvent<EventType extends CustomEventMap[keyof CustomEventMap]>(event: EventType): boolean;\n}\n\nexport default class TabBar extends LitElement {\n public static readonly ID = \"sd-tab-bar\";\n\n @property({ type: Boolean, reflect: true, attribute: \"no-bar\" })\n public noBar: boolean;\n @property({ type: Boolean, reflect: true, attribute: \"no-slide\" })\n public noSlide: boolean;\n @property({ type: Boolean, reflect: true })\n public vertical: boolean;\n @property({ type: Boolean, reflect: true, attribute: \"show-counter\" })\n public showCounter: boolean;\n\n public tabElements: Tab[];\n\n @property()\n private showLeftScrollButton: boolean;\n @property()\n private showRightScrollButton: boolean;\n\n private _focusedIndex: number;\n private _selectedIndex: number;\n private resizeObserver: ResizeObserver;\n private lastKnownWidth: number;\n private _tabButtonContainer: HTMLElement;\n\n static shadowRootOptions: ShadowRootInit = {\n ...LitElement.shadowRootOptions,\n delegatesFocus: true,\n };\n\n public connectedCallback() {\n super.connectedCallback();\n this.resizeObserver = new ResizeObserver(() => {\n this.debounce(\"update-scroll-button-visibility\", () => {\n if (this.lastKnownWidth !== this.offsetWidth) {\n this.lastKnownWidth = this.offsetWidth;\n this.updateScrollButtonVisibility();\n }\n });\n });\n this.resizeObserver.observe(this);\n }\n\n public disconnectedCallback() {\n super.disconnectedCallback();\n this.resizeObserver.disconnect();\n }\n\n public firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n const ownerDocument = this.ownerDocument as any;\n if (ownerDocument.adoptedStyleSheets) {\n (this.shadowRoot as any).adoptedStyleSheets = [\n ...(this.shadowRoot as any).adoptedStyleSheets,\n ...ownerDocument.adoptedStyleSheets,\n ];\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n const slot = this.shadowRoot.querySelector(\"slot\");\n slot.addEventListener(\"slotchange\", this.handleSlotChange);\n\n this.addEventListener(\"keydown\", this.handleKeyDown);\n\n this.tabButtonContainer.addEventListener(\"wheel\", (e) => {\n if (this.tabButtonContainer.scrollWidth > this.tabButtonContainer.offsetWidth) {\n const oldTab = document.elementsFromPoint(e.x, e.y)[0];\n\n this.tabButtonContainer.scrollLeft += e.deltaY;\n\n const newTab = document.elementsFromPoint(e.x, e.y)[0];\n\n if (oldTab != newTab) {\n if (oldTab instanceof Tab) {\n oldTab.hideAnchors();\n }\n if (newTab instanceof Tab) {\n newTab.showAnchors();\n }\n }\n\n e.preventDefault();\n }\n });\n }\n\n static get styles() {\n return [\n css`\n ${unsafeCSS(style)}\n `,\n ];\n }\n\n // prettier-ignore\n public render() {\n return html`\n <div class=\"root\">\n ${!this.vertical && this.showLeftScrollButton ? html`\n <div class=\"scroll-button left\" @pointerdown=\"${() => {\n this.tabButtonContainer.scrollLeft -= SCROLL_STEP;\n }}\">\n <div class=\"ripple\"></div>\n <svg><g><path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"></path></g></svg>\n </div>` : \"\"}\n <div class=\"tab-button-container\" @scroll=\"${this.updateScrollButtonVisibility}\">\n <slot></slot>\n ${this.noBar ? \"\" : html` <div class=\"slider\"></div>`}\n </div>\n ${!this.vertical && this.showRightScrollButton ? html`\n <div class=\"scroll-button right\" @pointerdown=\"${() => {\n this.tabButtonContainer.scrollLeft += SCROLL_STEP;\n }}\">\n <div class=\"ripple\"></div>\n <svg><g><path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"></path></g></svg>\n </div>` : \"\"}\n </div>\n `;\n }\n\n public set selectedIndex(newValue: number) {\n if (this._selectedIndex !== newValue) {\n this.focusedIndex = newValue;\n this._selectedIndex = newValue;\n this.updateSelectionState();\n }\n }\n\n public get selectedIndex(): number {\n return this._selectedIndex;\n }\n\n private updateSelectionState(): void {\n if (this.tabElements) {\n this.tabElements.forEach((node: HTMLElement, ind: number) => {\n if (ind === this._selectedIndex) {\n (node as Tab).selected = true;\n if (this.slider) {\n window.requestAnimationFrame(() => {\n let offsetLeft = node.offsetLeft;\n let offsetTop = node.offsetTop;\n\n if (node.offsetParent != this._tabButtonContainer) {\n offsetLeft -= this._tabButtonContainer.offsetLeft;\n offsetTop -= this._tabButtonContainer.offsetTop;\n }\n\n const slider = this.slider;\n if (this.vertical) {\n slider.style.height = node.offsetHeight + \"px\";\n slider.style.transform = `translateY(${offsetTop}px)`;\n } else {\n slider.style.width = node.offsetWidth + \"px\";\n slider.style.transform = `translateX(${offsetLeft}px)`;\n }\n });\n }\n } else {\n (node as Tab).selected = false;\n }\n });\n }\n }\n\n public set focusedIndex(newValue: number) {\n if (this._focusedIndex !== newValue) {\n this._focusedIndex = newValue;\n this.updateFocusedState();\n }\n }\n\n public get focusedIndex(): number {\n return this._focusedIndex;\n }\n\n private updateFocusedState() {\n if (this.tabElements && this.focusedIndex >= 0 && this.focusedIndex < this.tabElements.length) {\n this.scrollToFocusedIfNeeded();\n this.tabElements[this.focusedIndex].focus();\n }\n }\n\n private get slider(): HTMLElement {\n return this.shadowRoot.querySelector(\".slider\");\n }\n\n private get tabButtonContainer(): HTMLElement {\n if (!this._tabButtonContainer) {\n this._tabButtonContainer = this.shadowRoot.querySelector(\".tab-button-container\");\n }\n return this._tabButtonContainer;\n }\n\n private scrollToFocusedIfNeeded(): void {\n if (this.tabElements && this.focusedIndex >= 0 && this.focusedIndex < this.tabElements.length) {\n const selectedNode = this.tabElements[this.focusedIndex] as HTMLElement;\n let nodeLeft: number = selectedNode.offsetLeft;\n if (selectedNode.offsetParent != this._tabButtonContainer) {\n nodeLeft -= this._tabButtonContainer.offsetLeft;\n }\n const nodeWidth: number = selectedNode.offsetWidth;\n const nodeRight: number = nodeLeft + nodeWidth;\n if (\n nodeLeft > this.tabButtonContainer.scrollLeft &&\n nodeRight < this.tabButtonContainer.scrollLeft + this.tabButtonContainer.offsetWidth\n ) {\n return;\n }\n if (this.tabButtonContainer.scrollLeft < nodeLeft) {\n this.tabButtonContainer.scrollLeft = nodeRight - this.tabButtonContainer.offsetWidth;\n } else if (this.tabButtonContainer.scrollLeft + this.tabButtonContainer.offsetWidth > nodeRight) {\n this.tabButtonContainer.scrollLeft = nodeLeft;\n }\n }\n }\n\n private handleSlotChange = () => {\n this.tabElements = this.shadowRoot\n .querySelector(\"slot\")\n .assignedNodes()\n .filter((node) => node instanceof Tab) as Tab[];\n let index = 0;\n this.tabElements.forEach((tab) => {\n tab.vertical = this.vertical;\n tab.showCounter = this.showCounter;\n tab.index = index++;\n tab.addEventListener(\"focus\", this.handleTabFocus);\n tab.addEventListener(\"selection\", this.handleTabSelection);\n });\n this.updateScrollButtonVisibility();\n if (this.selectedIndex == null) {\n this._focusedIndex = 0;\n this._selectedIndex = 0;\n }\n this.updateSelectionState();\n };\n\n private handleTabFocus = (event: FocusEvent) => {\n const index = (event.target as Tab).index;\n if (this.focusedIndex !== index) {\n this._focusedIndex = index;\n this.scrollToFocusedIfNeeded();\n }\n };\n\n private handleTabSelection = (event: CustomEvent) => {\n this.selectedIndex = (event.target as Tab).index;\n this.dispatchSelectionEvent(event.detail.anchor);\n };\n\n private handleKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case \"Up\":\n case \"ArrowUp\":\n case \"Left\":\n case \"ArrowLeft\":\n event.preventDefault();\n this.focusedIndex = Math.max(this.focusedIndex - 1, 0);\n break;\n case \"Down\":\n case \"ArrowDown\":\n case \"Right\":\n case \"ArrowRight\":\n event.preventDefault();\n this.focusedIndex = Math.min(this.focusedIndex + 1, this.tabElements.length - 1);\n break;\n }\n };\n\n private updateScrollButtonVisibility(): void {\n this.showLeftScrollButton = this.tabButtonContainer.scrollLeft !== 0;\n this.showRightScrollButton =\n this.tabButtonContainer.scrollLeft <\n this.tabButtonContainer.scrollWidth - this.tabButtonContainer.offsetWidth;\n }\n\n private dispatchSelectionEvent(selectedAnchor?: string): void {\n this.dispatchEvent(\n new CustomEvent<ISelectionEvent>(\"selection\", {\n detail: {\n selectedTab: {\n index: this.selectedIndex,\n tabElement: this.tabElements[this.selectedIndex],\n },\n anchor: selectedAnchor,\n },\n }),\n );\n }\n\n private debounced = {};\n private debounce(id: string, actor: () => void) {\n if (this.debounced[id]) {\n return;\n }\n this.debounced[id] = true;\n requestAnimationFrame(() => {\n delete this.debounced[id];\n actor();\n });\n }\n}\n\nif (!customElements.get(TabBar.ID)) {\n customElements.define(TabBar.ID, TabBar);\n}\n"],"names":["isIE11","_Tab","LitElement","event","newValue","rippleElement","changedProperties","supportsCSS","ownerDocument","rect","css","unsafeCSS","style","html","overlayMaxHeight","selectedAnchor","element","anchor","index","createPopper","state","VirtualList","ListDataProvider","SelectionType","e","Tab","__decorateClass","property","SCROLL_STEP","_TabBar","node","tab","oldTab","newTab","ind","offsetLeft","offsetTop","slider","selectedNode","nodeLeft","nodeWidth","nodeRight","id","actor","TabBar"],"mappings":"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"}
package/dist/tab.d.ts ADDED
@@ -0,0 +1,54 @@
1
+ import { LitElement, PropertyValues } from "lit";
2
+ import "@cas-smartdesign/virtual-list";
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ [Tab.ID]: Tab;
6
+ }
7
+ }
8
+ export interface ISelectionEvent {
9
+ anchor: string;
10
+ }
11
+ export interface CustomEventMap extends HTMLElementEventMap {
12
+ selection: CustomEvent<ISelectionEvent>;
13
+ }
14
+ export default interface Tab {
15
+ addEventListener<K extends keyof CustomEventMap>(event: K, listener: ((this: this, ev: CustomEventMap[K]) => unknown) | null, options?: AddEventListenerOptions | boolean): void;
16
+ addEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: AddEventListenerOptions | boolean): void;
17
+ removeEventListener<K extends keyof CustomEventMap>(type: K, listener: (this: this, ev: CustomEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
18
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
19
+ dispatchEvent<EventType extends CustomEventMap[keyof CustomEventMap]>(event: EventType): boolean;
20
+ }
21
+ export default class Tab extends LitElement {
22
+ static readonly ID = "sd-tab";
23
+ text: string;
24
+ anchors: string[];
25
+ index: number;
26
+ showCounter: boolean;
27
+ private anchorsShown;
28
+ noInk: boolean;
29
+ vertical: boolean;
30
+ minimumOverlayWidth: number;
31
+ private showRipple;
32
+ private popper;
33
+ private list;
34
+ private dataProvider;
35
+ private _cssMathMaxSupported;
36
+ get selected(): boolean;
37
+ set selected(newValue: boolean);
38
+ firstUpdated(changedProperties: PropertyValues): void;
39
+ disconnectedCallback(): void;
40
+ static get styles(): import("lit").CSSResult[];
41
+ render(): import("lit").TemplateResult<1>;
42
+ private handleKeyDown;
43
+ private updateDropdownSizes;
44
+ private handleListSelection;
45
+ private dispatchSelectionEvent;
46
+ private handlePointerLeave;
47
+ private handlePointerMove;
48
+ private isPointerAbove;
49
+ showAnchors(): void;
50
+ private createList;
51
+ hideAnchors(): void;
52
+ private get hasAnchors();
53
+ private get root();
54
+ }