@vonage/vivid 3.40.0 → 3.42.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 (161) hide show
  1. package/accordion/index.js +2 -2
  2. package/accordion-item/index.js +2 -2
  3. package/alert/index.js +6 -5
  4. package/audio-player/index.js +33 -0
  5. package/avatar/index.js +2 -2
  6. package/badge/index.js +2 -2
  7. package/banner/index.js +8 -5
  8. package/breadcrumb/index.js +1 -1
  9. package/breadcrumb-item/index.js +3 -3
  10. package/button/index.js +4 -4
  11. package/calendar/index.js +1 -1
  12. package/calendar-event/index.js +1 -1
  13. package/card/index.js +4 -3
  14. package/checkbox/index.js +3 -3
  15. package/combobox/index.js +8 -8
  16. package/custom-elements.json +438 -41
  17. package/data-grid/index.js +2 -2
  18. package/date-picker/index.js +9 -9
  19. package/date-range-picker/index.js +8 -8
  20. package/dialog/index.js +6 -6
  21. package/divider/index.js +1 -1
  22. package/elevation/index.js +1 -1
  23. package/empty-state/index.js +2 -2
  24. package/fab/index.js +3 -3
  25. package/file-picker/index.js +5 -5
  26. package/focus/index.js +1 -1
  27. package/header/index.js +2 -2
  28. package/icon/index.js +1 -1
  29. package/index.js +57 -56
  30. package/layout/index.js +1 -1
  31. package/lib/alert/alert.d.ts +3 -1
  32. package/lib/alert/locale.d.ts +3 -0
  33. package/lib/audio-player/audio-player.d.ts +17 -0
  34. package/lib/audio-player/audio-player.template.d.ts +4 -0
  35. package/lib/audio-player/definition.d.ts +4 -0
  36. package/lib/audio-player/locale.d.ts +5 -0
  37. package/lib/banner/banner.d.ts +3 -1
  38. package/lib/banner/locale.d.ts +3 -0
  39. package/lib/card/card.d.ts +3 -0
  40. package/lib/card/card.template.d.ts +1 -1
  41. package/lib/card/definition.d.ts +1 -0
  42. package/lib/checkbox/checkbox.d.ts +1 -0
  43. package/lib/components.d.ts +1 -0
  44. package/lib/enums.d.ts +2 -1
  45. package/lib/selectable-box/selectable-box.d.ts +2 -2
  46. package/lib/split-button/locale.d.ts +3 -0
  47. package/lib/split-button/split-button.d.ts +4 -2
  48. package/listbox/index.js +4 -4
  49. package/locales/en-GB.js +14 -0
  50. package/locales/en-US.js +14 -0
  51. package/locales/ja-JP.js +14 -0
  52. package/locales/zh-CN.js +14 -0
  53. package/menu/index.js +8 -8
  54. package/menu-item/index.js +3 -3
  55. package/nav/index.js +1 -1
  56. package/nav-disclosure/index.js +3 -3
  57. package/nav-item/index.js +3 -3
  58. package/note/index.js +2 -2
  59. package/number-field/index.js +6 -6
  60. package/option/index.js +3 -3
  61. package/package.json +1 -1
  62. package/pagination/index.js +5 -5
  63. package/popup/index.js +6 -6
  64. package/progress/index.js +1 -1
  65. package/progress-ring/index.js +1 -1
  66. package/radio/index.js +2 -2
  67. package/radio-group/index.js +2 -2
  68. package/select/index.js +8 -8
  69. package/selectable-box/index.js +5 -5
  70. package/shared/definition.js +3 -3
  71. package/shared/definition10.js +90 -159
  72. package/shared/definition11.js +151 -29
  73. package/shared/definition12.js +37 -766
  74. package/shared/definition13.js +747 -106
  75. package/shared/definition14.js +121 -198
  76. package/shared/definition15.js +167 -664
  77. package/shared/definition16.js +576 -1137
  78. package/shared/definition17.js +1278 -143
  79. package/shared/definition18.js +68 -306
  80. package/shared/definition19.js +359 -217
  81. package/shared/definition2.js +1 -1
  82. package/shared/definition20.js +259 -67
  83. package/shared/definition21.js +66 -58
  84. package/shared/definition22.js +43 -84
  85. package/shared/definition23.js +76 -2353
  86. package/shared/definition24.js +2362 -45
  87. package/shared/definition25.js +63 -27
  88. package/shared/definition26.js +24 -51
  89. package/shared/definition27.js +36 -822
  90. package/shared/definition28.js +837 -49
  91. package/shared/definition29.js +52 -89
  92. package/shared/definition3.js +1 -1
  93. package/shared/definition30.js +88 -24
  94. package/shared/definition31.js +25 -12
  95. package/shared/definition32.js +12 -52
  96. package/shared/definition33.js +28 -502
  97. package/shared/definition34.js +442 -197
  98. package/shared/definition35.js +260 -186
  99. package/shared/definition36.js +186 -75
  100. package/shared/definition37.js +70 -54
  101. package/shared/definition38.js +65 -421
  102. package/shared/definition39.js +437 -38
  103. package/shared/definition4.js +43 -16
  104. package/shared/definition40.js +32 -680
  105. package/shared/definition41.js +654 -105
  106. package/shared/definition42.js +117 -78
  107. package/shared/definition43.js +74 -567
  108. package/shared/definition44.js +567 -98
  109. package/shared/definition45.js +110 -135
  110. package/shared/definition46.js +153 -17
  111. package/shared/definition47.js +16 -79
  112. package/shared/definition48.js +53 -475
  113. package/shared/definition49.js +502 -25
  114. package/shared/definition5.js +160 -44
  115. package/shared/definition50.js +22 -121
  116. package/shared/definition51.js +113 -271
  117. package/shared/definition52.js +249 -243
  118. package/shared/definition53.js +270 -109
  119. package/shared/definition54.js +84 -74
  120. package/shared/definition55.js +114 -69
  121. package/shared/definition56.js +81 -292
  122. package/shared/definition57.js +302 -13
  123. package/shared/definition58.js +11 -41
  124. package/shared/definition59.js +20 -154
  125. package/shared/definition6.js +43 -33
  126. package/shared/definition60.js +181 -0
  127. package/shared/definition7.js +39 -106
  128. package/shared/definition8.js +122 -38
  129. package/shared/definition9.js +56 -89
  130. package/shared/enums.js +1 -0
  131. package/shared/icon.js +2 -2
  132. package/shared/index.js +1 -1
  133. package/shared/index2.js +1 -1
  134. package/shared/listbox.js +1 -1
  135. package/shared/localization/Locale.d.ts +8 -0
  136. package/shared/patterns/form-elements/form-elements.d.ts +6 -6
  137. package/shared/presentationDate.js +10 -8
  138. package/shared/text-field.js +1 -1
  139. package/side-drawer/index.js +1 -1
  140. package/slider/index.js +3 -3
  141. package/split-button/index.js +6 -3
  142. package/style.css +329 -242
  143. package/styles/core/all.css +31 -25
  144. package/styles/core/theme.css +1 -1
  145. package/styles/core/typography.css +31 -25
  146. package/styles/tokens/theme-dark.css +4 -4
  147. package/styles/tokens/theme-light.css +4 -4
  148. package/styles/tokens/vivid-2-compat.css +1 -1
  149. package/switch/index.js +3 -3
  150. package/tab/index.js +3 -3
  151. package/tab-panel/index.js +1 -1
  152. package/tabs/index.js +5 -5
  153. package/tag/index.js +3 -3
  154. package/tag-group/index.js +1 -1
  155. package/text-area/index.js +3 -3
  156. package/text-field/index.js +3 -3
  157. package/toggletip/index.js +7 -7
  158. package/tooltip/index.js +7 -7
  159. package/tree-item/index.js +3 -3
  160. package/tree-view/index.js +1 -1
  161. package/vivid.api.json +270 -1
@@ -1,7 +1,387 @@
1
- import { a as attr, F as FoundationElement, h as html, r as registerFactory } from './index.js';
1
+ import { F as FoundationElement, _ as __decorate, a as attr, o as observable, h as html, r as registerFactory } from './index.js';
2
+ import { a as tabRegistries } from './definition48.js';
3
+ import { a as tabPanelRegistries } from './definition47.js';
4
+ import { S as StartEnd } from './start-end.js';
5
+ import { a as applyMixins } from './apply-mixins.js';
6
+ import { h as keyArrowRight, i as keyArrowLeft, f as keyArrowDown, e as keyArrowUp, d as keyEnd, g as keyHome } from './key-codes.js';
7
+ import { u as uniqueId } from './strings.js';
8
+ import { l as limit } from './numbers.js';
9
+ import { r as ref } from './ref.js';
10
+ import { s as slotted } from './slotted.js';
11
+ import { w as when } from './when.js';
2
12
  import { c as classNames } from './class-names.js';
3
13
 
4
- const styles = ".base {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}";
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
+ let Tabs$1 = class Tabs 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.isHiddenElement = (el) => {
69
+ return el.hasAttribute("hidden");
70
+ };
71
+ this.isFocusableElement = (el) => {
72
+ return !this.isDisabledElement(el) && !this.isHiddenElement(el);
73
+ };
74
+ this.setTabs = () => {
75
+ const gridHorizontalProperty = "gridColumn";
76
+ const gridVerticalProperty = "gridRow";
77
+ const gridProperty = this.isHorizontal()
78
+ ? gridHorizontalProperty
79
+ : gridVerticalProperty;
80
+ this.activeTabIndex = this.getActiveIndex();
81
+ this.showActiveIndicator = false;
82
+ this.tabs.forEach((tab, index) => {
83
+ if (tab.slot === "tab") {
84
+ const isActiveTab = this.activeTabIndex === index && this.isFocusableElement(tab);
85
+ if (this.activeindicator && this.isFocusableElement(tab)) {
86
+ this.showActiveIndicator = true;
87
+ }
88
+ const tabId = this.tabIds[index];
89
+ const tabpanelId = this.tabpanelIds[index];
90
+ tab.setAttribute("id", tabId);
91
+ tab.setAttribute("aria-selected", isActiveTab ? "true" : "false");
92
+ tab.setAttribute("aria-controls", tabpanelId);
93
+ tab.addEventListener("click", this.handleTabClick);
94
+ tab.addEventListener("keydown", this.handleTabKeyDown);
95
+ tab.setAttribute("tabindex", isActiveTab ? "0" : "-1");
96
+ if (isActiveTab) {
97
+ this.activetab = tab;
98
+ this.activeid = tabId;
99
+ }
100
+ }
101
+ // If the original property isn't emptied out,
102
+ // the next set will morph into a grid-area style setting that is not what we want
103
+ tab.style[gridHorizontalProperty] = "";
104
+ tab.style[gridVerticalProperty] = "";
105
+ tab.style[gridProperty] = `${index + 1}`;
106
+ !this.isHorizontal()
107
+ ? tab.classList.add("vertical")
108
+ : tab.classList.remove("vertical");
109
+ });
110
+ };
111
+ this.setTabPanels = () => {
112
+ this.tabpanels.forEach((tabpanel, index) => {
113
+ const tabId = this.tabIds[index];
114
+ const tabpanelId = this.tabpanelIds[index];
115
+ tabpanel.setAttribute("id", tabpanelId);
116
+ tabpanel.setAttribute("aria-labelledby", tabId);
117
+ this.activeTabIndex !== index
118
+ ? tabpanel.setAttribute("hidden", "")
119
+ : tabpanel.removeAttribute("hidden");
120
+ });
121
+ };
122
+ this.handleTabClick = (event) => {
123
+ const selectedTab = event.currentTarget;
124
+ if (selectedTab.nodeType === 1 && this.isFocusableElement(selectedTab)) {
125
+ this.prevActiveTabIndex = this.activeTabIndex;
126
+ this.activeTabIndex = this.tabs.indexOf(selectedTab);
127
+ this.setComponent();
128
+ }
129
+ };
130
+ this.handleTabKeyDown = (event) => {
131
+ if (this.isHorizontal()) {
132
+ switch (event.key) {
133
+ case keyArrowLeft:
134
+ event.preventDefault();
135
+ this.adjustBackward(event);
136
+ break;
137
+ case keyArrowRight:
138
+ event.preventDefault();
139
+ this.adjustForward(event);
140
+ break;
141
+ }
142
+ }
143
+ else {
144
+ switch (event.key) {
145
+ case keyArrowUp:
146
+ event.preventDefault();
147
+ this.adjustBackward(event);
148
+ break;
149
+ case keyArrowDown:
150
+ event.preventDefault();
151
+ this.adjustForward(event);
152
+ break;
153
+ }
154
+ }
155
+ switch (event.key) {
156
+ case keyHome:
157
+ event.preventDefault();
158
+ this.adjust(-this.activeTabIndex);
159
+ break;
160
+ case keyEnd:
161
+ event.preventDefault();
162
+ this.adjust(this.tabs.length - this.activeTabIndex - 1);
163
+ break;
164
+ }
165
+ };
166
+ this.adjustForward = (e) => {
167
+ const group = this.tabs;
168
+ let index = 0;
169
+ index = this.activetab ? group.indexOf(this.activetab) + 1 : 1;
170
+ if (index === group.length) {
171
+ index = 0;
172
+ }
173
+ while (index < group.length && group.length > 1) {
174
+ if (this.isFocusableElement(group[index])) {
175
+ this.moveToTabByIndex(group, index);
176
+ break;
177
+ }
178
+ else if (this.activetab && index === group.indexOf(this.activetab)) {
179
+ break;
180
+ }
181
+ else if (index + 1 >= group.length) {
182
+ index = 0;
183
+ }
184
+ else {
185
+ index += 1;
186
+ }
187
+ }
188
+ };
189
+ this.adjustBackward = (e) => {
190
+ const group = this.tabs;
191
+ let index = 0;
192
+ index = this.activetab ? group.indexOf(this.activetab) - 1 : 0;
193
+ index = index < 0 ? group.length - 1 : index;
194
+ while (index >= 0 && group.length > 1) {
195
+ if (this.isFocusableElement(group[index])) {
196
+ this.moveToTabByIndex(group, index);
197
+ break;
198
+ }
199
+ else if (index - 1 < 0) {
200
+ index = group.length - 1;
201
+ }
202
+ else {
203
+ index -= 1;
204
+ }
205
+ }
206
+ };
207
+ this.moveToTabByIndex = (group, index) => {
208
+ const tab = group[index];
209
+ this.activetab = tab;
210
+ this.prevActiveTabIndex = this.activeTabIndex;
211
+ this.activeTabIndex = index;
212
+ tab.focus();
213
+ this.setComponent();
214
+ };
215
+ }
216
+ /**
217
+ * @internal
218
+ */
219
+ orientationChanged() {
220
+ if (this.$fastController.isConnected) {
221
+ this.setTabs();
222
+ this.setTabPanels();
223
+ this.handleActiveIndicatorPosition();
224
+ }
225
+ }
226
+ /**
227
+ * @internal
228
+ */
229
+ activeidChanged(oldValue, newValue) {
230
+ if (this.$fastController.isConnected &&
231
+ this.tabs.length <= this.tabpanels.length) {
232
+ this.prevActiveTabIndex = this.tabs.findIndex((item) => item.id === oldValue);
233
+ this.setTabs();
234
+ this.setTabPanels();
235
+ this.handleActiveIndicatorPosition();
236
+ }
237
+ }
238
+ /**
239
+ * @internal
240
+ */
241
+ tabsChanged() {
242
+ if (this.$fastController.isConnected &&
243
+ this.tabs.length <= this.tabpanels.length) {
244
+ this.tabIds = this.getTabIds();
245
+ this.tabpanelIds = this.getTabPanelIds();
246
+ this.setTabs();
247
+ this.setTabPanels();
248
+ this.handleActiveIndicatorPosition();
249
+ }
250
+ }
251
+ /**
252
+ * @internal
253
+ */
254
+ tabpanelsChanged() {
255
+ if (this.$fastController.isConnected &&
256
+ this.tabpanels.length <= this.tabs.length) {
257
+ this.tabIds = this.getTabIds();
258
+ this.tabpanelIds = this.getTabPanelIds();
259
+ this.setTabs();
260
+ this.setTabPanels();
261
+ this.handleActiveIndicatorPosition();
262
+ }
263
+ }
264
+ getActiveIndex() {
265
+ const id = this.activeid;
266
+ if (id !== undefined) {
267
+ return this.tabIds.indexOf(this.activeid) === -1
268
+ ? 0
269
+ : this.tabIds.indexOf(this.activeid);
270
+ }
271
+ else {
272
+ return 0;
273
+ }
274
+ }
275
+ getTabIds() {
276
+ return this.tabs.map((tab) => {
277
+ var _a;
278
+ return (_a = tab.getAttribute("id")) !== null && _a !== void 0 ? _a : `tab-${uniqueId()}`;
279
+ });
280
+ }
281
+ getTabPanelIds() {
282
+ return this.tabpanels.map((tabPanel) => {
283
+ var _a;
284
+ return (_a = tabPanel.getAttribute("id")) !== null && _a !== void 0 ? _a : `panel-${uniqueId()}`;
285
+ });
286
+ }
287
+ setComponent() {
288
+ if (this.activeTabIndex !== this.prevActiveTabIndex) {
289
+ this.activeid = this.tabIds[this.activeTabIndex];
290
+ this.focusTab();
291
+ this.change();
292
+ }
293
+ }
294
+ isHorizontal() {
295
+ return this.orientation === TabsOrientation.horizontal;
296
+ }
297
+ handleActiveIndicatorPosition() {
298
+ // Ignore if we click twice on the same tab
299
+ if (this.showActiveIndicator &&
300
+ this.activeindicator &&
301
+ this.activeTabIndex !== this.prevActiveTabIndex) {
302
+ if (this.ticking) {
303
+ this.ticking = false;
304
+ }
305
+ else {
306
+ this.ticking = true;
307
+ this.animateActiveIndicator();
308
+ }
309
+ }
310
+ }
311
+ animateActiveIndicator() {
312
+ this.ticking = true;
313
+ const gridProperty = this.isHorizontal() ? "gridColumn" : "gridRow";
314
+ const translateProperty = this.isHorizontal()
315
+ ? "translateX"
316
+ : "translateY";
317
+ const offsetProperty = this.isHorizontal() ? "offsetLeft" : "offsetTop";
318
+ const prev = this.activeIndicatorRef[offsetProperty];
319
+ this.activeIndicatorRef.style[gridProperty] = `${this.activeTabIndex + 1}`;
320
+ const next = this.activeIndicatorRef[offsetProperty];
321
+ this.activeIndicatorRef.style[gridProperty] = `${this.prevActiveTabIndex + 1}`;
322
+ const dif = next - prev;
323
+ this.activeIndicatorRef.style.transform = `${translateProperty}(${dif}px)`;
324
+ this.activeIndicatorRef.classList.add("activeIndicatorTransition");
325
+ this.activeIndicatorRef.addEventListener("transitionend", () => {
326
+ this.ticking = false;
327
+ this.activeIndicatorRef.style[gridProperty] = `${this.activeTabIndex + 1}`;
328
+ this.activeIndicatorRef.style.transform = `${translateProperty}(0px)`;
329
+ this.activeIndicatorRef.classList.remove("activeIndicatorTransition");
330
+ });
331
+ }
332
+ /**
333
+ * The adjust method for FASTTabs
334
+ * @public
335
+ * @remarks
336
+ * This method allows the active index to be adjusted by numerical increments
337
+ */
338
+ adjust(adjustment) {
339
+ const focusableTabs = this.tabs.filter(t => this.isFocusableElement(t));
340
+ const currentActiveTabIndex = focusableTabs.indexOf(this.activetab);
341
+ const nextTabIndex = limit(0, focusableTabs.length - 1, currentActiveTabIndex + adjustment);
342
+ // the index of the next focusable tab within the context of all available tabs
343
+ const nextIndex = this.tabs.indexOf(focusableTabs[nextTabIndex]);
344
+ if (nextIndex > -1) {
345
+ this.moveToTabByIndex(this.tabs, nextIndex);
346
+ }
347
+ }
348
+ focusTab() {
349
+ this.tabs[this.activeTabIndex].focus();
350
+ }
351
+ /**
352
+ * @internal
353
+ */
354
+ connectedCallback() {
355
+ super.connectedCallback();
356
+ this.tabIds = this.getTabIds();
357
+ this.tabpanelIds = this.getTabPanelIds();
358
+ this.activeTabIndex = this.getActiveIndex();
359
+ }
360
+ };
361
+ __decorate([
362
+ attr
363
+ ], Tabs$1.prototype, "orientation", void 0);
364
+ __decorate([
365
+ attr
366
+ ], Tabs$1.prototype, "activeid", void 0);
367
+ __decorate([
368
+ observable
369
+ ], Tabs$1.prototype, "tabs", void 0);
370
+ __decorate([
371
+ observable
372
+ ], Tabs$1.prototype, "tabpanels", void 0);
373
+ __decorate([
374
+ attr({ mode: "boolean" })
375
+ ], Tabs$1.prototype, "activeindicator", void 0);
376
+ __decorate([
377
+ observable
378
+ ], Tabs$1.prototype, "activeIndicatorRef", void 0);
379
+ __decorate([
380
+ observable
381
+ ], Tabs$1.prototype, "showActiveIndicator", void 0);
382
+ applyMixins(Tabs$1, StartEnd);
383
+
384
+ const styles = "/**\n * Do not edit directly\n * Generated on Thu, 30 Nov 2023 11:42:28 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 border-radius: 2px;\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: 8px;\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}";
5
385
 
6
386
  var __defProp = Object.defineProperty;
7
387
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -14,35 +394,132 @@ var __decorateClass = (decorators, target, key, kind) => {
14
394
  __defProp(target, key, result);
15
395
  return result;
16
396
  };
17
- class TagGroup extends FoundationElement {
18
- constructor() {
19
- super(...arguments);
20
- this.ariaLabel = null;
397
+ const ACTIVE_TAB_WIDTH = "--_tabs-active-tab-inline-size";
398
+ class Tabs extends Tabs$1 {
399
+ connotationChanged() {
400
+ this.#updateTabsConnotation();
401
+ }
402
+ orientationChanged() {
403
+ super.orientationChanged();
404
+ this.patchIndicatorStyleTransition();
405
+ if (!this.activeIndicatorRef)
406
+ return;
407
+ if (this.orientation === TabsOrientation.vertical) {
408
+ this.activeIndicatorRef.style.removeProperty(ACTIVE_TAB_WIDTH);
409
+ }
410
+ this.#patchActiveID();
411
+ }
412
+ activeidChanged(oldValue, newValue) {
413
+ super.activeidChanged(oldValue, newValue);
414
+ this.patchIndicatorStyleTransition();
415
+ this.#patchActiveID();
416
+ }
417
+ tabsChanged() {
418
+ super.tabsChanged();
419
+ this.patchIndicatorStyleTransition();
420
+ this.#patchActiveID();
421
+ }
422
+ tabpanelsChanged() {
423
+ super.tabpanelsChanged();
424
+ this.patchIndicatorStyleTransition();
425
+ this.#patchActiveID();
426
+ }
427
+ patchIndicatorStyleTransition() {
428
+ if (!this.activetab || !this.activeIndicatorRef)
429
+ return;
430
+ if (this.orientation === TabsOrientation.vertical || !this.showActiveIndicator)
431
+ return;
432
+ const width = this.activetab.getBoundingClientRect().width;
433
+ this.activeIndicatorRef.style.setProperty(ACTIVE_TAB_WIDTH, `${width}px`);
434
+ }
435
+ #updateTabsConnotation() {
436
+ if (this.tabs) {
437
+ this.tabs.forEach((tab) => {
438
+ if (tab.getAttribute("aria-selected") === "true") {
439
+ tab.setAttribute("connotation", this.connotation);
440
+ } else {
441
+ tab.removeAttribute("connotation");
442
+ }
443
+ });
444
+ }
445
+ }
446
+ get #tabListWrapper() {
447
+ return this.shadowRoot.querySelector(".tablist-wrapper");
448
+ }
449
+ #scrollToIndex(index) {
450
+ const tab = this.tabs[index];
451
+ if (!tab)
452
+ return;
453
+ let left = 0;
454
+ let top = 0;
455
+ if (this.orientation === TabsOrientation.vertical) {
456
+ if (index === this.tabs.length - 1) {
457
+ top = this.#tabListWrapper.scrollHeight;
458
+ }
459
+ if (index > 0 && index < this.tabs.length - 1) {
460
+ top = tab.offsetTop - this.#tabListWrapper.offsetHeight / 2 + tab.offsetHeight / 2;
461
+ }
462
+ } else {
463
+ if (index === this.tabs.length - 1) {
464
+ left = this.#tabListWrapper.scrollWidth;
465
+ }
466
+ if (index > 0 && index < this.tabs.length - 1) {
467
+ left = tab.offsetLeft - this.#tabListWrapper.offsetWidth / 2 + tab.offsetWidth / 2;
468
+ }
469
+ }
470
+ this.#tabListWrapper.scrollTo({ top, left, behavior: "smooth" });
471
+ }
472
+ // adapted FAST fix https://github.com/microsoft/fast/pull/6606
473
+ #patchActiveID() {
474
+ if (!this.activetab)
475
+ return;
476
+ const idx = this.tabs.indexOf(this.activetab);
477
+ this.activeid = this["tabIds"][idx];
478
+ this.#updateTabsConnotation();
479
+ this.#scrollToIndex(idx);
21
480
  }
22
481
  }
23
482
  __decorateClass([
24
- attr({ attribute: "aria-label" })
25
- ], TagGroup.prototype, "ariaLabel", 2);
483
+ observable
484
+ ], Tabs.prototype, "tablist", 2);
485
+ __decorateClass([
486
+ attr
487
+ ], Tabs.prototype, "connotation", 2);
26
488
 
27
- const getClasses = (_) => classNames(
28
- "base"
489
+ const getClasses = ({
490
+ connotation,
491
+ orientation
492
+ }) => classNames(
493
+ "base",
494
+ [`connotation-${connotation}`, Boolean(connotation)],
495
+ [`orientation-${orientation}`, Boolean(orientation)]
29
496
  );
30
- const TagGroupTemplate = () => {
497
+ function TabsTemplate() {
31
498
  return html`
32
- <div class="${getClasses}" role="listbox" aria-orientation="horizontal" aria-label="${(x) => x.ariaLabel}">
33
- <slot></slot>
34
- </div>
499
+ <template>
500
+ <div class="${getClasses}">
501
+ <div class="tablist-wrapper">
502
+ <div class="tablist" role="tablist" ${ref("tablist")}>
503
+ <slot name="tab" ${slotted("tabs")}></slot>
504
+ ${when((x) => x.showActiveIndicator, html`
505
+ <div ${ref("activeIndicatorRef")} class="active-indicator"></div>
506
+ `)}
507
+ </div>
508
+ </div>
509
+ <div class="tabpanel">
510
+ <slot name="tabpanel" ${slotted("tabpanels")}></slot>
511
+ </div>
512
+ </div>
513
+ </template>
35
514
  `;
36
- };
515
+ }
37
516
 
38
- const tagGroupDefinition = TagGroup.compose(
39
- {
40
- baseName: "tag-group",
41
- template: TagGroupTemplate,
42
- styles
43
- }
44
- );
45
- const tagGroupRegistries = [tagGroupDefinition()];
46
- const registerTagGroup = registerFactory(tagGroupRegistries);
517
+ const tabsDefinition = Tabs.compose({
518
+ baseName: "tabs",
519
+ template: TabsTemplate,
520
+ styles
521
+ });
522
+ const tabsRegistries = [tabsDefinition(), ...tabRegistries, ...tabPanelRegistries];
523
+ const registerTabs = registerFactory(tabsRegistries);
47
524
 
48
- export { tagGroupRegistries as a, registerTagGroup as r, tagGroupDefinition as t };
525
+ export { tabsRegistries as a, registerTabs as r, tabsDefinition as t };