@vonage/vivid 3.29.0 → 3.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/custom-elements.json +367 -1
  2. package/index.js +13 -12
  3. package/lib/components.d.ts +1 -0
  4. package/lib/icon/icon.d.ts +1 -1
  5. package/lib/split-button/definition.d.ts +2 -0
  6. package/lib/split-button/index.d.ts +1 -0
  7. package/lib/split-button/split-button.d.ts +25 -0
  8. package/lib/split-button/split-button.template.d.ts +4 -0
  9. package/listbox/index.js +1 -1
  10. package/package.json +1 -1
  11. package/shared/definition.js +1 -1
  12. package/shared/definition10.js +1 -1
  13. package/shared/definition11.js +1 -1
  14. package/shared/definition12.js +1 -1
  15. package/shared/definition14.js +1 -1
  16. package/shared/definition15.js +1 -1
  17. package/shared/definition16.js +1 -1
  18. package/shared/definition17.js +1 -1
  19. package/shared/definition18.js +1 -1
  20. package/shared/definition19.js +1 -1
  21. package/shared/definition2.js +1 -1
  22. package/shared/definition21.js +1 -1
  23. package/shared/definition22.js +2 -2
  24. package/shared/definition23.js +1 -1
  25. package/shared/definition24.js +1 -1
  26. package/shared/definition25.js +1 -1
  27. package/shared/definition26.js +1 -1
  28. package/shared/definition27.js +1 -1
  29. package/shared/definition28.js +1 -1
  30. package/shared/definition30.js +1 -1
  31. package/shared/definition31.js +1 -1
  32. package/shared/definition33.js +1 -1
  33. package/shared/definition34.js +1 -1
  34. package/shared/definition35.js +1 -1
  35. package/shared/definition36.js +1 -1
  36. package/shared/definition37.js +1 -1
  37. package/shared/definition38.js +1 -1
  38. package/shared/definition39.js +1 -1
  39. package/shared/definition4.js +1 -1
  40. package/shared/definition40.js +1 -1
  41. package/shared/definition41.js +1 -1
  42. package/shared/definition42.js +1 -1
  43. package/shared/definition44.js +91 -126
  44. package/shared/definition45.js +123 -49
  45. package/shared/definition46.js +56 -16
  46. package/shared/definition47.js +16 -483
  47. package/shared/definition48.js +476 -96
  48. package/shared/definition49.js +108 -16
  49. package/shared/definition5.js +1 -1
  50. package/shared/definition50.js +15 -270
  51. package/shared/definition51.js +245 -89
  52. package/shared/definition52.js +113 -120
  53. package/shared/definition53.js +91 -82
  54. package/shared/definition54.js +111 -65
  55. package/shared/definition55.js +64 -291
  56. package/shared/definition56.js +303 -0
  57. package/shared/definition6.js +1 -1
  58. package/shared/definition7.js +1 -1
  59. package/shared/definition9.js +1 -1
  60. package/shared/form-elements.js +1 -1
  61. package/shared/icon.js +1 -1
  62. package/shared/patterns/form-elements/form-elements.d.ts +4 -4
  63. package/shared/text-field.js +1 -1
  64. package/split-button/index.js +15 -0
  65. package/styles/core/all.css +1 -1
  66. package/styles/core/theme.css +1 -1
  67. package/styles/core/typography.css +1 -1
  68. package/styles/tokens/theme-dark.css +4 -4
  69. package/styles/tokens/theme-light.css +4 -4
  70. package/switch/index.js +1 -1
  71. package/tab/index.js +1 -1
  72. package/tab-panel/index.js +1 -1
  73. package/tabs/index.js +3 -3
  74. package/tag/index.js +1 -1
  75. package/tag-group/index.js +1 -1
  76. package/text-area/index.js +1 -1
  77. package/text-field/index.js +1 -1
  78. package/toggletip/index.js +1 -1
  79. package/tooltip/index.js +1 -1
  80. package/tree-item/index.js +1 -1
  81. package/tree-view/index.js +1 -1
  82. package/vivid.api.json +287 -0
@@ -1,117 +1,497 @@
1
- import { F as FoundationElement, d as __classPrivateFieldGet, _ as __decorate, a as attr, b as __metadata, h as html, r as registerFactory } from './index.js';
2
- import { i as iconRegistries } from './definition3.js';
3
- import { f as focusRegistries } from './definition4.js';
4
- import { b as AffixIcon, a as affixIconTemplateFactory } from './affix.js';
1
+ import { F as FoundationElement, _ as __decorate, a as attr, o as observable, d as __classPrivateFieldGet, b as __metadata, h as html, r as registerFactory } from './index.js';
2
+ import { t as tabRegistries } from './definition46.js';
3
+ import { t as tabPanelRegistries } from './definition47.js';
4
+ import { S as StartEnd } from './start-end.js';
5
5
  import { a as applyMixins } from './apply-mixins.js';
6
- import { f as focusTemplateFactory } from './focus2.js';
7
- import { I as Icon } from './icon.js';
6
+ import { h as keyArrowRight, i as keyArrowLeft, b as keyArrowDown, c as keyArrowUp, k as keyEnd, a as keyHome } from './key-codes.js';
7
+ import { u as uniqueId } from './strings.js';
8
+ import { w as wrapInBounds } from './numbers.js';
9
+ import { r as ref } from './ref.js';
10
+ import { s as slotted } from './slotted.js';
8
11
  import { w as when } from './when.js';
9
12
  import { c as classNames } from './class-names.js';
10
13
 
11
- var _Tag_select;
12
- class Tag extends FoundationElement {
14
+ /**
15
+ * The orientation of the {@link @microsoft/fast-foundation#(Tabs:class)} component
16
+ * @public
17
+ */
18
+ const TabsOrientation = {
19
+ vertical: "vertical",
20
+ horizontal: "horizontal",
21
+ };
22
+ /**
23
+ * A Tabs Custom HTML Element.
24
+ * Implements the {@link https://www.w3.org/TR/wai-aria-1.1/#tablist | ARIA tablist }.
25
+ *
26
+ * @slot start - Content which can be provided before the tablist element
27
+ * @slot end - Content which can be provided after the tablist element
28
+ * @slot tab - The slot for tabs
29
+ * @slot tabpanel - The slot for tabpanels
30
+ * @csspart tablist - The element wrapping for the tabs
31
+ * @csspart tab - The tab slot
32
+ * @csspart activeIndicator - The visual indicator
33
+ * @csspart tabpanel - The tabpanel slot
34
+ * @fires change - Fires a custom 'change' event when a tab is clicked or during keyboard navigation
35
+ *
36
+ * @public
37
+ */
38
+ class Tabs$1 extends FoundationElement {
39
+ constructor() {
40
+ super(...arguments);
41
+ /**
42
+ * The orientation
43
+ * @public
44
+ * @remarks
45
+ * HTML Attribute: orientation
46
+ */
47
+ this.orientation = TabsOrientation.horizontal;
48
+ /**
49
+ * Whether or not to show the active indicator
50
+ * @public
51
+ * @remarks
52
+ * HTML Attribute: activeindicator
53
+ */
54
+ this.activeindicator = true;
55
+ /**
56
+ * @internal
57
+ */
58
+ this.showActiveIndicator = true;
59
+ this.prevActiveTabIndex = 0;
60
+ this.activeTabIndex = 0;
61
+ this.ticking = false;
62
+ this.change = () => {
63
+ this.$emit("change", this.activetab);
64
+ };
65
+ this.isDisabledElement = (el) => {
66
+ return el.getAttribute("aria-disabled") === "true";
67
+ };
68
+ this.isFocusableElement = (el) => {
69
+ return !this.isDisabledElement(el);
70
+ };
71
+ this.setTabs = () => {
72
+ const gridHorizontalProperty = "gridColumn";
73
+ const gridVerticalProperty = "gridRow";
74
+ const gridProperty = this.isHorizontal()
75
+ ? gridHorizontalProperty
76
+ : gridVerticalProperty;
77
+ this.activeTabIndex = this.getActiveIndex();
78
+ this.showActiveIndicator = false;
79
+ this.tabs.forEach((tab, index) => {
80
+ if (tab.slot === "tab") {
81
+ const isActiveTab = this.activeTabIndex === index && this.isFocusableElement(tab);
82
+ if (this.activeindicator && this.isFocusableElement(tab)) {
83
+ this.showActiveIndicator = true;
84
+ }
85
+ const tabId = this.tabIds[index];
86
+ const tabpanelId = this.tabpanelIds[index];
87
+ tab.setAttribute("id", tabId);
88
+ tab.setAttribute("aria-selected", isActiveTab ? "true" : "false");
89
+ tab.setAttribute("aria-controls", tabpanelId);
90
+ tab.addEventListener("click", this.handleTabClick);
91
+ tab.addEventListener("keydown", this.handleTabKeyDown);
92
+ tab.setAttribute("tabindex", isActiveTab ? "0" : "-1");
93
+ if (isActiveTab) {
94
+ this.activetab = tab;
95
+ }
96
+ }
97
+ // If the original property isn't emptied out,
98
+ // the next set will morph into a grid-area style setting that is not what we want
99
+ tab.style[gridHorizontalProperty] = "";
100
+ tab.style[gridVerticalProperty] = "";
101
+ tab.style[gridProperty] = `${index + 1}`;
102
+ !this.isHorizontal()
103
+ ? tab.classList.add("vertical")
104
+ : tab.classList.remove("vertical");
105
+ });
106
+ };
107
+ this.setTabPanels = () => {
108
+ this.tabpanels.forEach((tabpanel, index) => {
109
+ const tabId = this.tabIds[index];
110
+ const tabpanelId = this.tabpanelIds[index];
111
+ tabpanel.setAttribute("id", tabpanelId);
112
+ tabpanel.setAttribute("aria-labelledby", tabId);
113
+ this.activeTabIndex !== index
114
+ ? tabpanel.setAttribute("hidden", "")
115
+ : tabpanel.removeAttribute("hidden");
116
+ });
117
+ };
118
+ this.handleTabClick = (event) => {
119
+ const selectedTab = event.currentTarget;
120
+ if (selectedTab.nodeType === 1 && this.isFocusableElement(selectedTab)) {
121
+ this.prevActiveTabIndex = this.activeTabIndex;
122
+ this.activeTabIndex = this.tabs.indexOf(selectedTab);
123
+ this.setComponent();
124
+ }
125
+ };
126
+ this.handleTabKeyDown = (event) => {
127
+ if (this.isHorizontal()) {
128
+ switch (event.key) {
129
+ case keyArrowLeft:
130
+ event.preventDefault();
131
+ this.adjustBackward(event);
132
+ break;
133
+ case keyArrowRight:
134
+ event.preventDefault();
135
+ this.adjustForward(event);
136
+ break;
137
+ }
138
+ }
139
+ else {
140
+ switch (event.key) {
141
+ case keyArrowUp:
142
+ event.preventDefault();
143
+ this.adjustBackward(event);
144
+ break;
145
+ case keyArrowDown:
146
+ event.preventDefault();
147
+ this.adjustForward(event);
148
+ break;
149
+ }
150
+ }
151
+ switch (event.key) {
152
+ case keyHome:
153
+ event.preventDefault();
154
+ this.adjust(-this.activeTabIndex);
155
+ break;
156
+ case keyEnd:
157
+ event.preventDefault();
158
+ this.adjust(this.tabs.length - this.activeTabIndex - 1);
159
+ break;
160
+ }
161
+ };
162
+ this.adjustForward = (e) => {
163
+ const group = this.tabs;
164
+ let index = 0;
165
+ index = this.activetab ? group.indexOf(this.activetab) + 1 : 1;
166
+ if (index === group.length) {
167
+ index = 0;
168
+ }
169
+ while (index < group.length && group.length > 1) {
170
+ if (this.isFocusableElement(group[index])) {
171
+ this.moveToTabByIndex(group, index);
172
+ break;
173
+ }
174
+ else if (this.activetab && index === group.indexOf(this.activetab)) {
175
+ break;
176
+ }
177
+ else if (index + 1 >= group.length) {
178
+ index = 0;
179
+ }
180
+ else {
181
+ index += 1;
182
+ }
183
+ }
184
+ };
185
+ this.adjustBackward = (e) => {
186
+ const group = this.tabs;
187
+ let index = 0;
188
+ index = this.activetab ? group.indexOf(this.activetab) - 1 : 0;
189
+ index = index < 0 ? group.length - 1 : index;
190
+ while (index >= 0 && group.length > 1) {
191
+ if (this.isFocusableElement(group[index])) {
192
+ this.moveToTabByIndex(group, index);
193
+ break;
194
+ }
195
+ else if (index - 1 < 0) {
196
+ index = group.length - 1;
197
+ }
198
+ else {
199
+ index -= 1;
200
+ }
201
+ }
202
+ };
203
+ this.moveToTabByIndex = (group, index) => {
204
+ const tab = group[index];
205
+ this.activetab = tab;
206
+ this.prevActiveTabIndex = this.activeTabIndex;
207
+ this.activeTabIndex = index;
208
+ tab.focus();
209
+ this.setComponent();
210
+ };
211
+ }
212
+ /**
213
+ * @internal
214
+ */
215
+ orientationChanged() {
216
+ if (this.$fastController.isConnected) {
217
+ this.setTabs();
218
+ this.setTabPanels();
219
+ this.handleActiveIndicatorPosition();
220
+ }
221
+ }
222
+ /**
223
+ * @internal
224
+ */
225
+ activeidChanged(oldValue, newValue) {
226
+ if (this.$fastController.isConnected &&
227
+ this.tabs.length <= this.tabpanels.length) {
228
+ this.prevActiveTabIndex = this.tabs.findIndex((item) => item.id === oldValue);
229
+ this.setTabs();
230
+ this.setTabPanels();
231
+ this.handleActiveIndicatorPosition();
232
+ }
233
+ }
234
+ /**
235
+ * @internal
236
+ */
237
+ tabsChanged() {
238
+ if (this.$fastController.isConnected &&
239
+ this.tabs.length <= this.tabpanels.length) {
240
+ this.tabIds = this.getTabIds();
241
+ this.tabpanelIds = this.getTabPanelIds();
242
+ this.setTabs();
243
+ this.setTabPanels();
244
+ this.handleActiveIndicatorPosition();
245
+ }
246
+ }
247
+ /**
248
+ * @internal
249
+ */
250
+ tabpanelsChanged() {
251
+ if (this.$fastController.isConnected &&
252
+ this.tabpanels.length <= this.tabs.length) {
253
+ this.tabIds = this.getTabIds();
254
+ this.tabpanelIds = this.getTabPanelIds();
255
+ this.setTabs();
256
+ this.setTabPanels();
257
+ this.handleActiveIndicatorPosition();
258
+ }
259
+ }
260
+ getActiveIndex() {
261
+ const id = this.activeid;
262
+ if (id !== undefined) {
263
+ return this.tabIds.indexOf(this.activeid) === -1
264
+ ? 0
265
+ : this.tabIds.indexOf(this.activeid);
266
+ }
267
+ else {
268
+ return 0;
269
+ }
270
+ }
271
+ getTabIds() {
272
+ return this.tabs.map((tab) => {
273
+ var _a;
274
+ return (_a = tab.getAttribute("id")) !== null && _a !== void 0 ? _a : `tab-${uniqueId()}`;
275
+ });
276
+ }
277
+ getTabPanelIds() {
278
+ return this.tabpanels.map((tabPanel) => {
279
+ var _a;
280
+ return (_a = tabPanel.getAttribute("id")) !== null && _a !== void 0 ? _a : `panel-${uniqueId()}`;
281
+ });
282
+ }
283
+ setComponent() {
284
+ if (this.activeTabIndex !== this.prevActiveTabIndex) {
285
+ this.activeid = this.tabIds[this.activeTabIndex];
286
+ this.focusTab();
287
+ this.change();
288
+ }
289
+ }
290
+ isHorizontal() {
291
+ return this.orientation === TabsOrientation.horizontal;
292
+ }
293
+ handleActiveIndicatorPosition() {
294
+ // Ignore if we click twice on the same tab
295
+ if (this.showActiveIndicator &&
296
+ this.activeindicator &&
297
+ this.activeTabIndex !== this.prevActiveTabIndex) {
298
+ if (this.ticking) {
299
+ this.ticking = false;
300
+ }
301
+ else {
302
+ this.ticking = true;
303
+ this.animateActiveIndicator();
304
+ }
305
+ }
306
+ }
307
+ animateActiveIndicator() {
308
+ this.ticking = true;
309
+ const gridProperty = this.isHorizontal() ? "gridColumn" : "gridRow";
310
+ const translateProperty = this.isHorizontal()
311
+ ? "translateX"
312
+ : "translateY";
313
+ const offsetProperty = this.isHorizontal() ? "offsetLeft" : "offsetTop";
314
+ const prev = this.activeIndicatorRef[offsetProperty];
315
+ this.activeIndicatorRef.style[gridProperty] = `${this.activeTabIndex + 1}`;
316
+ const next = this.activeIndicatorRef[offsetProperty];
317
+ this.activeIndicatorRef.style[gridProperty] = `${this.prevActiveTabIndex + 1}`;
318
+ const dif = next - prev;
319
+ this.activeIndicatorRef.style.transform = `${translateProperty}(${dif}px)`;
320
+ this.activeIndicatorRef.classList.add("activeIndicatorTransition");
321
+ this.activeIndicatorRef.addEventListener("transitionend", () => {
322
+ this.ticking = false;
323
+ this.activeIndicatorRef.style[gridProperty] = `${this.activeTabIndex + 1}`;
324
+ this.activeIndicatorRef.style.transform = `${translateProperty}(0px)`;
325
+ this.activeIndicatorRef.classList.remove("activeIndicatorTransition");
326
+ });
327
+ }
328
+ /**
329
+ * The adjust method for FASTTabs
330
+ * @public
331
+ * @remarks
332
+ * This method allows the active index to be adjusted by numerical increments
333
+ */
334
+ adjust(adjustment) {
335
+ this.prevActiveTabIndex = this.activeTabIndex;
336
+ this.activeTabIndex = wrapInBounds(0, this.tabs.length - 1, this.activeTabIndex + adjustment);
337
+ this.setComponent();
338
+ }
339
+ focusTab() {
340
+ this.tabs[this.activeTabIndex].focus();
341
+ }
342
+ /**
343
+ * @internal
344
+ */
345
+ connectedCallback() {
346
+ super.connectedCallback();
347
+ this.tabIds = this.getTabIds();
348
+ this.tabpanelIds = this.getTabPanelIds();
349
+ this.activeTabIndex = this.getActiveIndex();
350
+ }
351
+ }
352
+ __decorate([
353
+ attr
354
+ ], Tabs$1.prototype, "orientation", void 0);
355
+ __decorate([
356
+ attr
357
+ ], Tabs$1.prototype, "activeid", void 0);
358
+ __decorate([
359
+ observable
360
+ ], Tabs$1.prototype, "tabs", void 0);
361
+ __decorate([
362
+ observable
363
+ ], Tabs$1.prototype, "tabpanels", void 0);
364
+ __decorate([
365
+ attr({ mode: "boolean" })
366
+ ], Tabs$1.prototype, "activeindicator", void 0);
367
+ __decorate([
368
+ observable
369
+ ], Tabs$1.prototype, "activeIndicatorRef", void 0);
370
+ __decorate([
371
+ observable
372
+ ], Tabs$1.prototype, "showActiveIndicator", void 0);
373
+ applyMixins(Tabs$1, StartEnd);
374
+
375
+ var css_248z = "/**\n * Do not edit directly\n * Generated on Mon, 14 Aug 2023 13:17:40 GMT\n */\n.base {\n display: grid;\n box-sizing: border-box;\n}\n.base {\n --_appearance-color-text: var(--_connotation-color-primary);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: transparent;\n}\n.base.connotation-cta {\n /* @cssprop [--vvd-tabs-cta-primary=var(--vvd-color-cta-500)] */\n --_connotation-color-primary: var(--vvd-tabs-cta-primary, var(--vvd-color-cta-500));\n}\n.base:not(.connotation-cta) {\n /* @cssprop [--vvd-tabs-accent-primary=var(--vvd-color-canvas-text)] */\n --_connotation-color-primary: var(--vvd-tabs-accent-primary, var(--vvd-color-canvas-text));\n}\n.base.orientation-vertical {\n overflow: hidden;\n block-size: inherit;\n grid-template-columns: auto 1fr;\n grid-template-rows: 1fr;\n}\n.base:not(.orientation-vertical) {\n grid-template-columns: 1fr;\n grid-template-rows: auto 1fr;\n}\n\n.tablist {\n --_tabs-tablist-gutter: 8px;\n --_tabs-active-indicator-stroke-width: 2px;\n position: relative;\n display: grid;\n box-sizing: border-box;\n color: var(--_appearance-color-text);\n}\n.base.orientation-vertical .tablist {\n padding: var(--_tabs-tablist-gutter);\n grid-row: 1/2;\n grid-template-columns: auto 1fr;\n grid-template-rows: auto;\n inline-size: 100%;\n place-self: flex-start end;\n row-gap: var(--_tabs-tablist-gutter);\n}\n.base:not(.orientation-vertical) .tablist {\n justify-content: flex-start;\n column-gap: var(--_tabs-tablist-gutter);\n grid-auto-flow: column;\n grid-template-columns: auto;\n grid-template-rows: auto auto;\n inline-size: 100%;\n padding-inline: var(--_tabs-tablist-gutter);\n}\n.base:not(.orientation-vertical) .tablist-wrapper {\n align-self: end;\n border-bottom: 1px solid var(--vvd-color-neutral-300);\n inline-size: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n}\n.base.orientation-vertical .tablist-wrapper {\n block-size: 100%;\n box-shadow: 1px 0 0 0 var(--vvd-color-neutral-300);\n overflow-x: hidden;\n overflow-y: auto;\n}\n.tablist-wrapper::-webkit-scrollbar {\n display: none;\n}\n\n.tabpanel {\n min-inline-size: 0;\n}\n.base.orientation-vertical .tabpanel {\n block-size: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.active-indicator {\n background: currentColor;\n margin-inline-start: calc(var(--_tabs-tablist-gutter) * -1);\n}\n.base.orientation-vertical .active-indicator {\n align-self: center;\n block-size: 80%;\n grid-area: 1/1/auto/auto;\n inline-size: var(--_tabs-active-indicator-stroke-width);\n}\n.base:not(.orientation-vertical) .active-indicator {\n position: absolute;\n z-index: 1;\n block-size: var(--_tabs-active-indicator-stroke-width);\n grid-column: 1/auto;\n inline-size: calc(var(--_tabs-active-tab-inline-size) - 32px);\n inset-block-end: 0;\n inset-inline-start: 0;\n justify-self: center;\n padding-inline: var(--_tabs-tablist-gutter);\n}\n\n.activeIndicatorTransition {\n transition: transform 0.2s ease-out 0s, inline-size 0.2s ease-out 0s;\n}\n\n.base:not(.orientation-vertical) .active-indicator:not(.activeIndicatorTransition) {\n opacity: 0;\n}";
376
+
377
+ var _Tabs_instances, _Tabs_updateTabsConnotation, _Tabs_tabListWrapper_get, _Tabs_scrollToIndex, _Tabs_patchActiveID;
378
+ const ACTIVE_TAB_WIDTH = '--_tabs-active-tab-inline-size';
379
+ class Tabs extends Tabs$1 {
13
380
  constructor() {
14
381
  super(...arguments);
15
- this.removable = false;
16
- this.disabled = false;
17
- this.selectable = false;
18
- this.selected = false;
19
- _Tag_select.set(this, () => {
20
- if (!this.selectable || this.disabled) {
21
- return;
382
+ _Tabs_instances.add(this);
383
+ }
384
+ connotationChanged() {
385
+ __classPrivateFieldGet(this, _Tabs_instances, "m", _Tabs_updateTabsConnotation).call(this);
386
+ }
387
+ orientationChanged() {
388
+ super.orientationChanged();
389
+ this.patchIndicatorStyleTransition();
390
+ if (!this.activeIndicatorRef) return;
391
+ if (this.orientation === TabsOrientation.vertical) {
392
+ this.activeIndicatorRef.style.removeProperty(ACTIVE_TAB_WIDTH);
393
+ }
394
+ __classPrivateFieldGet(this, _Tabs_instances, "m", _Tabs_patchActiveID).call(this);
395
+ }
396
+ activeidChanged(oldValue, newValue) {
397
+ super.activeidChanged(oldValue, newValue);
398
+ this.patchIndicatorStyleTransition();
399
+ __classPrivateFieldGet(this, _Tabs_instances, "m", _Tabs_patchActiveID).call(this);
400
+ }
401
+ tabsChanged() {
402
+ super.tabsChanged();
403
+ this.patchIndicatorStyleTransition();
404
+ __classPrivateFieldGet(this, _Tabs_instances, "m", _Tabs_patchActiveID).call(this);
405
+ }
406
+ tabpanelsChanged() {
407
+ super.tabpanelsChanged();
408
+ this.patchIndicatorStyleTransition();
409
+ __classPrivateFieldGet(this, _Tabs_instances, "m", _Tabs_patchActiveID).call(this);
410
+ }
411
+ patchIndicatorStyleTransition() {
412
+ if (!this.activetab || !this.activeIndicatorRef) return;
413
+ if (this.orientation === TabsOrientation.vertical || !this.showActiveIndicator) return;
414
+ const width = this.activetab.getBoundingClientRect().width;
415
+ this.activeIndicatorRef.style.setProperty(ACTIVE_TAB_WIDTH, `${width}px`);
416
+ }
417
+ }
418
+ _Tabs_instances = new WeakSet(), _Tabs_updateTabsConnotation = function _Tabs_updateTabsConnotation() {
419
+ if (this.tabs) {
420
+ this.tabs.forEach(tab => {
421
+ if (tab.getAttribute('aria-selected') === 'true') {
422
+ tab.setAttribute('connotation', this.connotation);
423
+ } else {
424
+ tab.removeAttribute('connotation');
22
425
  }
23
- this.selected = !this.selected;
24
- this.$emit('selected-change');
25
426
  });
26
427
  }
27
- remove() {
28
- if (!this.removable || this.selectable) {
29
- return;
428
+ }, _Tabs_tabListWrapper_get = function _Tabs_tabListWrapper_get() {
429
+ return this.shadowRoot.querySelector('.tablist-wrapper');
430
+ }, _Tabs_scrollToIndex = function _Tabs_scrollToIndex(index) {
431
+ const tab = this.tabs[index];
432
+ if (!tab) return;
433
+ let left = 0;
434
+ let top = 0;
435
+ if (this.orientation === TabsOrientation.vertical) {
436
+ if (index === this.tabs.length - 1) {
437
+ top = __classPrivateFieldGet(this, _Tabs_instances, "a", _Tabs_tabListWrapper_get).scrollHeight;
30
438
  }
31
- this.$emit('removed');
32
- this.parentElement && this.parentElement.removeChild(this);
33
- }
34
- handleKeydown(e) {
35
- if (e.key === 'Enter') {
36
- __classPrivateFieldGet(this, _Tag_select, "f").call(this);
439
+ if (index > 0 && index < this.tabs.length - 1) {
440
+ top = tab.offsetTop - __classPrivateFieldGet(this, _Tabs_instances, "a", _Tabs_tabListWrapper_get).offsetHeight / 2 + tab.offsetHeight / 2;
37
441
  }
38
- if (e.key === 'Delete' || e.key === 'Backspace') {
39
- this.remove();
442
+ } else {
443
+ if (index === this.tabs.length - 1) {
444
+ left = __classPrivateFieldGet(this, _Tabs_instances, "a", _Tabs_tabListWrapper_get).scrollWidth;
445
+ }
446
+ if (index > 0 && index < this.tabs.length - 1) {
447
+ left = tab.offsetLeft - __classPrivateFieldGet(this, _Tabs_instances, "a", _Tabs_tabListWrapper_get).offsetWidth / 2 + tab.offsetWidth / 2;
40
448
  }
41
- return true;
42
- }
43
- handleClick() {
44
- __classPrivateFieldGet(this, _Tag_select, "f").call(this);
45
449
  }
46
- }
47
- _Tag_select = new WeakMap();
48
- __decorate([attr, __metadata("design:type", String)], Tag.prototype, "connotation", void 0);
49
- __decorate([attr, __metadata("design:type", String)], Tag.prototype, "shape", void 0);
50
- __decorate([attr, __metadata("design:type", String)], Tag.prototype, "appearance", void 0);
51
- __decorate([attr, __metadata("design:type", String)], Tag.prototype, "label", void 0);
52
- __decorate([attr({
53
- mode: 'boolean'
54
- }), __metadata("design:type", Object)], Tag.prototype, "removable", void 0);
55
- __decorate([attr({
56
- mode: 'boolean'
57
- }), __metadata("design:type", Object)], Tag.prototype, "disabled", void 0);
58
- __decorate([attr({
59
- mode: 'boolean'
60
- }), __metadata("design:type", Object)], Tag.prototype, "selectable", void 0);
61
- __decorate([attr({
62
- mode: 'boolean'
63
- }), __metadata("design:type", Object)], Tag.prototype, "selected", void 0);
64
- applyMixins(Tag, AffixIcon);
65
-
66
- var css_248z = "/**\n * Do not edit directly\n * Generated on Wed, 09 Aug 2023 13:23:44 GMT\n */\n.base {\n --tag-block-size: calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2) - 16));\n position: relative;\n display: inline-flex;\n box-sizing: border-box;\n align-items: center;\n background-color: var(--_appearance-color-fill);\n block-size: var(--tag-block-size);\n box-shadow: inset 0 0 0 1px var(--_appearance-color-outline);\n color: var(--_appearance-color-text);\n column-gap: 8px;\n font: var(--vvd-typography-base-bold);\n max-inline-size: 100%;\n padding-inline: 8px;\n vertical-align: middle;\n /* Shape */\n}\n.base.connotation-cta {\n /* @cssprop [--vvd-tag-cta-contrast=var(--vvd-color-cta-800)] */\n --_connotation-color-contrast: var(--vvd-tag-cta-contrast, var(--vvd-color-cta-800));\n /* @cssprop [--vvd-tag-cta-soft=var(--vvd-color-cta-100)] */\n --_connotation-color-soft: var(--vvd-tag-cta-soft, var(--vvd-color-cta-100));\n /* @cssprop [--vvd-tag-cta-pale=var(--vvd-color-cta-300)] */\n --_connotation-color-pale: var(--vvd-tag-cta-pale, var(--vvd-color-cta-300));\n /* @cssprop [--vvd-tag-cta-fierce=var(--vvd-color-cta-700)] */\n --_connotation-color-fierce: var(--vvd-tag-cta-fierce, var(--vvd-color-cta-700));\n /* @cssprop [--vvd-tag-cta-firm=var(--vvd-color-cta-600)] */\n --_connotation-color-firm: var(--vvd-tag-cta-firm, var(--vvd-color-cta-600));\n /* @cssprop [--vvd-tag-cta-faint=var(--vvd-color-cta-50)] */\n --_connotation-color-faint: var(--vvd-tag-cta-faint, var(--vvd-color-cta-50));\n /* @cssprop [--vvd-tag-cta-dim=var(--vvd-color-cta-200)] */\n --_connotation-color-dim: var(--vvd-tag-cta-dim, var(--vvd-color-cta-200));\n}\n.base:not(.connotation-cta) {\n /* @cssprop [--vvd-tag-accent-contrast=var(--vvd-color-neutral-800)] */\n --_connotation-color-contrast: var(--vvd-tag-accent-contrast, var(--vvd-color-neutral-800));\n /* @cssprop [--vvd-tag-accent-soft=var(--vvd-color-neutral-100)] */\n --_connotation-color-soft: var(--vvd-tag-accent-soft, var(--vvd-color-neutral-100));\n /* @cssprop [--vvd-tag-accent-pale=var(--vvd-color-neutral-300)] */\n --_connotation-color-pale: var(--vvd-tag-accent-pale, var(--vvd-color-neutral-300));\n /* @cssprop [--vvd-tag-accent-fierce=var(--vvd-color-neutral-700)] */\n --_connotation-color-fierce: var(--vvd-tag-accent-fierce, var(--vvd-color-neutral-700));\n /* @cssprop [--vvd-tag-accent-firm=var(--vvd-color-canvas-text)] */\n --_connotation-color-firm: var(--vvd-tag-accent-firm, var(--vvd-color-canvas-text));\n /* @cssprop [--vvd-tag-accent-faint=var(--vvd-color-neutral-50)] */\n --_connotation-color-faint: var(--vvd-tag-accent-faint, var(--vvd-color-neutral-50));\n /* @cssprop [--vvd-tag-accent-dim=var(--vvd-color-neutral-200)] */\n --_connotation-color-dim: var(--vvd-tag-accent-dim, var(--vvd-color-neutral-200));\n}\n.base {\n --_appearance-color-text: var(--_connotation-color-contrast);\n --_appearance-color-fill: var(--_connotation-color-soft);\n --_appearance-color-outline: transparent;\n}\n.base.appearance-duotone {\n --_appearance-color-text: var(--_connotation-color-fierce);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: var(--_connotation-color-pale);\n}\n.base:where(:hover, .hover):where(:not(:disabled, .disabled, .readonly)) {\n --_appearance-color-text: var(--_connotation-color-contrast);\n --_appearance-color-fill: var(--_connotation-color-faint);\n --_appearance-color-outline: transparent;\n}\n.base:where(:hover, .hover):where(:not(:disabled, .disabled, .readonly)).appearance-duotone {\n --_appearance-color-text: var(--_connotation-color-fierce);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: var(--_connotation-color-firm);\n}\n.base:where(:active, .active):where(:not(:disabled, .disabled)) {\n --_appearance-color-text: var(--_connotation-color-contrast);\n --_appearance-color-fill: var(--_connotation-color-dim);\n --_appearance-color-outline: transparent;\n}\n.base:where(:active, .active):where(:not(:disabled, .disabled)).appearance-duotone {\n --_appearance-color-text: var(--_connotation-color-fierce);\n --_appearance-color-fill: var(--_connotation-color-faint);\n --_appearance-color-outline: var(--_connotation-color-pale);\n}\n.base:where(:disabled, .disabled) {\n --_appearance-color-text: var(--vvd-color-neutral-300);\n --_appearance-color-fill: var(--vvd-color-neutral-100);\n --_appearance-color-outline: transparent;\n}\n.base:where(:disabled, .disabled).appearance-duotone {\n --_appearance-color-text: var(--vvd-color-neutral-300);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: var(--vvd-color-neutral-100);\n}\n.base:where(.selected, [aria-current]):where(:not(:disabled, .disabled, :hover, .hover)) {\n --_appearance-color-text: var(--_connotation-color-contrast);\n --_appearance-color-fill: var(--_connotation-color-pale);\n --_appearance-color-outline: transparent;\n}\n.base:where(.selected, [aria-current]):where(:not(:disabled, .disabled, :hover, .hover)).appearance-duotone {\n --_appearance-color-text: var(--_connotation-color-fierce);\n --_appearance-color-fill: var(--_connotation-color-faint);\n --_appearance-color-outline: var(--_connotation-color-pale);\n}\n.base:not(.shape-pill) {\n border-radius: 4px;\n}\n.base.shape-pill {\n border-radius: 14px;\n}\n@supports selector(:focus-visible) {\n .base:focus {\n outline: none;\n }\n}\n@supports (user-select: none) {\n .base {\n user-select: none;\n }\n}\n.base:not(.disabled) {\n cursor: pointer;\n}\n.base.disabled {\n cursor: not-allowed;\n pointer-events: none;\n}\n.base.removable {\n cursor: auto;\n}\n\n.label {\n overflow: hidden;\n max-inline-size: 100%;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.icon {\n font-size: calc(var(--tag-block-size) / 1.5);\n line-height: 1;\n}\n.icon > * {\n vertical-align: middle;\n}\n\n.dismiss-button {\n display: flex;\n align-items: center;\n background-color: var(--_appearance-color-fill);\n border-radius: inherit;\n cursor: pointer;\n}\n\n.base:not(:focus-visible) .focus-indicator {\n display: none;\n}";
450
+ __classPrivateFieldGet(this, _Tabs_instances, "a", _Tabs_tabListWrapper_get).scrollTo({
451
+ top,
452
+ left,
453
+ behavior: 'smooth'
454
+ });
455
+ }, _Tabs_patchActiveID = function _Tabs_patchActiveID() {
456
+ if (!this.activetab) return;
457
+ const idx = this.tabs.indexOf(this.activetab);
458
+ this.activeid = this['tabIds'][idx];
459
+ __classPrivateFieldGet(this, _Tabs_instances, "m", _Tabs_updateTabsConnotation).call(this);
460
+ __classPrivateFieldGet(this, _Tabs_instances, "m", _Tabs_scrollToIndex).call(this, idx);
461
+ };
462
+ __decorate([observable, __metadata("design:type", HTMLElement)], Tabs.prototype, "tablist", void 0);
463
+ __decorate([attr, __metadata("design:type", String)], Tabs.prototype, "connotation", void 0);
67
464
 
68
465
  const getClasses = ({
69
466
  connotation,
70
- appearance,
71
- shape,
72
- disabled,
73
- selectable,
74
- removable,
75
- selected
76
- }) => classNames('base', ['disabled', disabled], ['selectable', selectable], ['active', selectable && selected], ['removable', removable && !selectable], [`connotation-${connotation}`, Boolean(connotation)], [`appearance-${appearance}`, Boolean(appearance)], [`shape-${shape}`, Boolean(shape)]);
77
- function renderDismissButton(iconTag) {
467
+ orientation
468
+ }) => classNames('base', [`connotation-${connotation}`, Boolean(connotation)], [`orientation-${orientation}`, Boolean(orientation)]);
469
+ function TabsTemplate() {
78
470
  return html`
79
- <span
80
- aria-hidden="true"
81
- class="dismiss-button"
82
- @click="${x => x.remove()}">
83
- <${iconTag} name="close-line"></${iconTag}>
84
- </span>`;
471
+ <template role="tablist">
472
+ <div class="${getClasses}">
473
+ <div class="tablist-wrapper">
474
+ <div class="tablist" ${ref('tablist')}>
475
+ <slot name="tab" ${slotted('tabs')}></slot>
476
+ ${when(x => x.showActiveIndicator, html`
477
+ <div ${ref('activeIndicatorRef')} class="active-indicator"></div>
478
+ `)}
479
+ </div>
480
+ </div>
481
+ <div class="tabpanel">
482
+ <slot name="tabpanel" ${slotted('tabpanels')}></slot>
483
+ </div>
484
+ </div>
485
+ </template>
486
+ `;
85
487
  }
86
- const tagTemplate = context => {
87
- const affixIconTemplate = affixIconTemplateFactory(context);
88
- const iconTag = context.tagFor(Icon);
89
- const focusTemplate = focusTemplateFactory(context);
90
- return html`
91
- <span class="${getClasses}"
92
- role="option"
93
- aria-disabled="${x => x.disabled}"
94
- aria-selected="${x => x.selectable}"
95
- tabindex="${x => x.disabled ? null : 0}"
96
- @keydown="${(x, c) => x.handleKeydown(c.event)}"
97
- @click="${x => x.handleClick()}">
98
- ${x => affixIconTemplate(x.icon)}
99
- ${when(x => x.label, x => html`<span class="label">${x.label}</span>`)}
100
- ${when(x => x.removable && !x.selectable, renderDismissButton(iconTag))}
101
- ${when(x => x.selectable && x.selected, html`<${iconTag} class="selectable-icon" name="check-circle-solid"></${iconTag}>`)}
102
- ${() => focusTemplate}
103
- </span>`;
104
- };
105
488
 
106
- const tagDefinition = Tag.compose({
107
- baseName: 'tag',
108
- template: tagTemplate,
109
- styles: css_248z,
110
- shadowOptions: {
111
- delegatesFocus: true
112
- }
489
+ const tabsDefinition = Tabs.compose({
490
+ baseName: 'tabs',
491
+ template: TabsTemplate,
492
+ styles: css_248z
113
493
  });
114
- const tagRegistries = [tagDefinition(), ...iconRegistries, ...focusRegistries];
115
- const registerTag = registerFactory(tagRegistries);
494
+ const tabsRegistries = [tabsDefinition(), ...tabRegistries, ...tabPanelRegistries];
495
+ const registerTabs = registerFactory(tabsRegistries);
116
496
 
117
- export { registerTag as r, tagDefinition as t };
497
+ export { tabsRegistries as a, registerTabs as r, tabsDefinition as t };