@vonage/vivid 3.31.0 → 3.32.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 (132) hide show
  1. package/alert/index.js +2 -1
  2. package/checkbox/index.js +2 -1
  3. package/combobox/index.js +2 -1
  4. package/custom-elements.json +748 -11
  5. package/date-picker/index.js +35 -0
  6. package/dialog/index.js +1 -1
  7. package/divider/index.js +1 -1
  8. package/empty-state/index.js +1 -1
  9. package/fab/index.js +1 -1
  10. package/file-picker/index.js +3 -2
  11. package/header/index.js +1 -1
  12. package/index.d.ts +1 -0
  13. package/index.js +48 -46
  14. package/layout/index.js +1 -1
  15. package/lib/button/button.d.ts +2 -0
  16. package/lib/components.d.ts +20 -19
  17. package/lib/date-picker/calendar/calendarGrid.d.ts +17 -0
  18. package/lib/date-picker/calendar/dateStr.d.ts +6 -0
  19. package/lib/date-picker/calendar/month.d.ts +11 -0
  20. package/lib/date-picker/calendar/monthPickerGrid.d.ts +10 -0
  21. package/lib/date-picker/calendar/presentationDate.d.ts +4 -0
  22. package/lib/date-picker/date-picker.d.ts +16 -0
  23. package/lib/date-picker/date-picker.template.d.ts +4 -0
  24. package/lib/date-picker/definition.d.ts +3 -0
  25. package/lib/date-picker/index.d.ts +1 -0
  26. package/lib/date-picker/locale.d.ts +21 -0
  27. package/lib/select/select.d.ts +4 -2
  28. package/listbox/index.js +3 -2
  29. package/locales/en-GB.d.ts +3 -0
  30. package/locales/en-GB.js +25 -0
  31. package/locales/en-US.d.ts +3 -0
  32. package/locales/en-US.js +25 -0
  33. package/locales/ja-JP.d.ts +3 -0
  34. package/locales/ja-JP.js +25 -0
  35. package/locales/zh-CN.d.ts +3 -0
  36. package/locales/zh-CN.js +25 -0
  37. package/menu/index.js +2 -2
  38. package/menu-item/index.js +1 -1
  39. package/nav/index.js +1 -1
  40. package/nav-disclosure/index.js +1 -1
  41. package/nav-item/index.js +1 -1
  42. package/note/index.js +3 -2
  43. package/number-field/index.js +4 -3
  44. package/option/index.js +2 -1
  45. package/package.json +2 -1
  46. package/pagination/index.js +1 -1
  47. package/progress/index.js +1 -1
  48. package/radio/index.js +1 -1
  49. package/radio-group/index.js +1 -1
  50. package/select/index.js +3 -2
  51. package/shared/definition.js +1 -1
  52. package/shared/definition10.js +1 -1
  53. package/shared/definition11.js +1 -1
  54. package/shared/definition12.js +1 -1
  55. package/shared/definition14.js +1 -1
  56. package/shared/definition15.js +1 -1
  57. package/shared/definition16.js +1 -1
  58. package/shared/definition17.js +1 -1
  59. package/shared/definition18.js +2 -2
  60. package/shared/definition19.js +2 -2
  61. package/shared/definition2.js +1 -1
  62. package/shared/definition21.js +3 -3
  63. package/shared/definition22.js +2 -2
  64. package/shared/definition23.js +5750 -189
  65. package/shared/definition24.js +116 -68
  66. package/shared/definition25.js +68 -38
  67. package/shared/definition26.js +222 -74
  68. package/shared/definition27.js +33 -2282
  69. package/shared/definition28.js +76 -47
  70. package/shared/definition29.js +2287 -38
  71. package/shared/definition30.js +39 -417
  72. package/shared/definition31.js +38 -364
  73. package/shared/definition32.js +427 -12
  74. package/shared/definition33.js +350 -59
  75. package/shared/definition34.js +12 -26
  76. package/shared/definition35.js +67 -31
  77. package/shared/definition36.js +20 -431
  78. package/shared/definition37.js +34 -194
  79. package/shared/definition38.js +427 -45
  80. package/shared/definition39.js +195 -33
  81. package/shared/definition4.js +1 -1
  82. package/shared/definition40.js +53 -425
  83. package/shared/definition41.js +29 -645
  84. package/shared/definition42.js +420 -73
  85. package/shared/definition43.js +549 -444
  86. package/shared/definition44.js +68 -90
  87. package/shared/definition45.js +501 -79
  88. package/shared/definition46.js +84 -45
  89. package/shared/definition47.js +131 -17
  90. package/shared/definition48.js +44 -471
  91. package/shared/definition49.js +21 -108
  92. package/shared/definition5.js +1 -1
  93. package/shared/definition50.js +487 -15
  94. package/shared/definition51.js +92 -255
  95. package/shared/definition52.js +16 -115
  96. package/shared/definition53.js +264 -115
  97. package/shared/definition54.js +91 -82
  98. package/shared/definition55.js +111 -65
  99. package/shared/definition56.js +64 -291
  100. package/shared/definition57.js +303 -0
  101. package/shared/definition6.js +2 -2
  102. package/shared/definition7.js +10 -3
  103. package/shared/definition9.js +1 -1
  104. package/shared/{form-elements.js → index2.js} +14 -2
  105. package/shared/localization/Locale.d.ts +4 -0
  106. package/shared/localization/index.d.ts +7 -0
  107. package/shared/patterns/form-elements/form-elements.d.ts +4 -4
  108. package/shared/patterns/index.d.ts +1 -0
  109. package/shared/patterns/localized.d.ts +4 -0
  110. package/shared/text-field.js +1 -1
  111. package/side-drawer/index.js +1 -1
  112. package/slider/index.js +1 -1
  113. package/split-button/index.js +1 -1
  114. package/styles/core/all.css +25 -3
  115. package/styles/core/theme.css +1 -1
  116. package/styles/core/typography.css +25 -3
  117. package/styles/tokens/theme-dark.css +4 -4
  118. package/styles/tokens/theme-light.css +4 -4
  119. package/styles/tokens/vivid-2-compat.css +2 -2
  120. package/switch/index.js +3 -2
  121. package/tab/index.js +1 -1
  122. package/tab-panel/index.js +1 -1
  123. package/tabs/index.js +3 -3
  124. package/tag/index.js +1 -1
  125. package/tag-group/index.js +1 -1
  126. package/text-area/index.js +3 -2
  127. package/text-field/index.js +3 -2
  128. package/toggletip/index.js +1 -1
  129. package/tooltip/index.js +1 -1
  130. package/tree-item/index.js +1 -1
  131. package/tree-view/index.js +1 -1
  132. package/vivid.api.json +137 -0
@@ -1,25 +1,497 @@
1
- import { 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, d as __classPrivateFieldGet, b as __metadata, h as html, r as registerFactory } from './index.js';
2
+ import { t as tabRegistries } from './definition48.js';
3
+ import { t as tabPanelRegistries } from './definition49.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, 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';
11
+ import { w as when } from './when.js';
2
12
  import { c as classNames } from './class-names.js';
3
13
 
4
- var css_248z = ".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
+ 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 Tue, 22 Aug 2023 13:37:39 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}";
5
376
 
6
- class TagGroup extends FoundationElement {}
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 {
380
+ constructor() {
381
+ super(...arguments);
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');
425
+ }
426
+ });
427
+ }
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;
438
+ }
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;
441
+ }
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;
448
+ }
449
+ }
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);
7
464
 
8
- const getClasses = _ => classNames('base');
9
- const TagGroupTemplate = () => {
465
+ const getClasses = ({
466
+ connotation,
467
+ orientation
468
+ }) => classNames('base', [`connotation-${connotation}`, Boolean(connotation)], [`orientation-${orientation}`, Boolean(orientation)]);
469
+ function TabsTemplate() {
10
470
  return html`
11
- <div class="${getClasses}" role="listbox" aria-orientation="horizontal">
12
- <slot></slot>
13
- </div>
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>
14
486
  `;
15
- };
487
+ }
16
488
 
17
- const tagGroupDefinition = TagGroup.compose({
18
- baseName: 'tag-group',
19
- template: TagGroupTemplate,
489
+ const tabsDefinition = Tabs.compose({
490
+ baseName: 'tabs',
491
+ template: TabsTemplate,
20
492
  styles: css_248z
21
493
  });
22
- const tagGroupRegistries = [tagGroupDefinition()];
23
- const registerTagGroup = registerFactory(tagGroupRegistries);
494
+ const tabsRegistries = [tabsDefinition(), ...tabRegistries, ...tabPanelRegistries];
495
+ const registerTabs = registerFactory(tabsRegistries);
24
496
 
25
- export { tagGroupRegistries as a, registerTagGroup as r, tagGroupDefinition as t };
497
+ export { tabsRegistries as a, registerTabs as r, tabsDefinition as t };