@vonage/vivid 3.1.0 → 3.1.2

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 (73) hide show
  1. package/README.md +2 -2
  2. package/custom-elements.json +0 -8
  3. package/data-grid/index.js +2 -2
  4. package/index.js +18 -16
  5. package/lib/components.d.ts +1 -0
  6. package/number-field/index.js +18 -448
  7. package/package.json +4 -4
  8. package/progress/index.js +1 -1
  9. package/progress-ring/index.js +1 -1
  10. package/radio/index.js +1 -1
  11. package/radio-group/index.js +2 -1
  12. package/select/index.js +1 -1
  13. package/shared/aria2.js +9 -0
  14. package/shared/definition.js +1 -1
  15. package/shared/definition11.js +1 -1
  16. package/shared/definition12.js +44 -35
  17. package/shared/definition13.js +1 -1
  18. package/shared/definition14.js +1 -1
  19. package/shared/definition16.js +1 -1
  20. package/shared/definition17.js +1 -1
  21. package/shared/definition18.js +589 -527
  22. package/shared/definition19.js +1 -1
  23. package/shared/definition2.js +1 -1
  24. package/shared/definition20.js +24 -28
  25. package/shared/definition21.js +1 -1
  26. package/shared/definition22.js +1 -1
  27. package/shared/definition23.js +1 -1
  28. package/shared/definition25.js +1 -1
  29. package/shared/definition27.js +1 -1
  30. package/shared/definition29.js +1 -1
  31. package/shared/definition30.js +1 -1
  32. package/shared/definition31.js +1 -1
  33. package/shared/definition32.js +432 -76
  34. package/shared/definition33.js +76 -59
  35. package/shared/definition34.js +67 -35
  36. package/shared/definition35.js +31 -421
  37. package/shared/definition36.js +357 -555
  38. package/shared/definition37.js +618 -70
  39. package/shared/definition38.js +70 -572
  40. package/shared/definition39.js +527 -81
  41. package/shared/definition4.js +1 -1
  42. package/shared/definition40.js +127 -47
  43. package/shared/definition41.js +51 -16
  44. package/shared/definition42.js +17 -425
  45. package/shared/definition43.js +367 -209
  46. package/shared/definition44.js +248 -85
  47. package/shared/definition45.js +110 -68
  48. package/shared/definition46.js +77 -0
  49. package/shared/definition5.js +1 -1
  50. package/shared/definition6.js +1 -1
  51. package/shared/definition7.js +1 -1
  52. package/shared/definition8.js +1 -1
  53. package/shared/definition9.js +1 -1
  54. package/shared/form-elements.js +1 -1
  55. package/shared/icon.js +18 -6
  56. package/shared/index.js +10 -19
  57. package/shared/patterns/form-elements/form-elements.d.ts +2 -2
  58. package/shared/text-field.js +1 -1
  59. package/side-drawer/index.js +1 -1
  60. package/slider/index.js +2 -1
  61. package/styles/core/all.css +1 -1
  62. package/styles/core/theme.css +1 -1
  63. package/styles/core/typography.css +1 -1
  64. package/styles/tokens/theme-dark.css +4 -4
  65. package/styles/tokens/theme-light.css +4 -4
  66. package/switch/index.js +1 -1
  67. package/tab/index.js +1 -1
  68. package/tab-panel/index.js +1 -1
  69. package/tabs/index.js +3 -3
  70. package/text-area/index.js +1 -1
  71. package/text-field/index.js +1 -1
  72. package/tooltip/index.js +1 -1
  73. package/vivid.api.json +164 -0
@@ -1,282 +1,440 @@
1
- import { F as FoundationElement, _ as __decorate, a as attr, n as nullableNumberConverter, o as observable, 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 './affix.js';
5
- import './focus.js';
6
- import { f as formElements, F as FormElementSuccessText, a as FormElementHelperText, b as FormElementCharCount, g as getFeedbackTemplate } from './form-elements.js';
7
- import { D as DelegatesARIATextbox } from './text-field2.js';
1
+ import { F as FoundationElement, _ as __decorate, a as attr, o as observable, b as __metadata, h as html, r as registerFactory } from './index.js';
2
+ import { t as tabRegistries } from './definition41.js';
3
+ import { t as tabPanelRegistries } from './definition42.js';
4
+ import { S as StartEnd } from './start-end.js';
8
5
  import { a as applyMixins } from './apply-mixins.js';
9
- import { F as FormAssociated } from './form-associated.js';
10
- import { f as focusTemplateFactory } from './focus2.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 { s as slotted } from './slotted.js';
11
10
  import { w as when } from './when.js';
12
11
  import { r as ref } from './ref.js';
13
12
  import { c as classNames } from './class-names.js';
14
13
 
15
- class _TextArea extends FoundationElement {
16
- }
17
- /**
18
- * A form-associated base class for the {@link @microsoft/fast-foundation#(TextArea:class)} component.
19
- *
20
- * @internal
21
- */
22
- class FormAssociatedTextArea extends FormAssociated(_TextArea) {
23
- constructor() {
24
- super(...arguments);
25
- this.proxy = document.createElement("textarea");
26
- }
27
- }
28
-
29
14
  /**
30
- * Resize mode for a TextArea
15
+ * The orientation of the {@link @microsoft/fast-foundation#(Tabs:class)} component
31
16
  * @public
32
17
  */
33
- const TextAreaResize = {
34
- /**
35
- * No resize.
36
- */
37
- none: "none",
38
- /**
39
- * Resize vertically and horizontally.
40
- */
41
- both: "both",
42
- /**
43
- * Resize horizontally.
44
- */
45
- horizontal: "horizontal",
46
- /**
47
- * Resize vertically.
48
- */
18
+ const TabsOrientation = {
49
19
  vertical: "vertical",
20
+ horizontal: "horizontal",
50
21
  };
51
-
52
22
  /**
53
- * A Text Area Custom HTML Element.
54
- * Based largely on the {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea | <textarea> element }.
23
+ * A Tabs Custom HTML Element.
24
+ * Implements the {@link https://www.w3.org/TR/wai-aria-1.1/#tablist | ARIA tablist }.
55
25
  *
56
- * @slot - The default slot for the label
57
- * @csspart label - The label
58
- * @csspart root - The element wrapping the control
59
- * @csspart control - The textarea element
60
- * @fires change - Emits a custom 'change' event when the textarea emits a change event
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
61
35
  *
62
36
  * @public
63
37
  */
64
- class TextArea$1 extends FormAssociatedTextArea {
38
+ class Tabs$1 extends FoundationElement {
65
39
  constructor() {
66
40
  super(...arguments);
67
41
  /**
68
- * The resize mode of the element.
42
+ * The orientation
69
43
  * @public
70
44
  * @remarks
71
- * HTML Attribute: resize
45
+ * HTML Attribute: orientation
72
46
  */
73
- this.resize = TextAreaResize.none;
47
+ this.orientation = TabsOrientation.horizontal;
74
48
  /**
75
- * Sizes the element horizontally by a number of character columns.
76
- *
49
+ * Whether or not to show the active indicator
77
50
  * @public
78
51
  * @remarks
79
- * HTML Attribute: cols
52
+ * HTML Attribute: activeindicator
80
53
  */
81
- this.cols = 20;
54
+ this.activeindicator = true;
82
55
  /**
83
56
  * @internal
84
57
  */
85
- this.handleTextInput = () => {
86
- this.value = this.control.value;
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);
87
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
+ }
88
221
  }
89
- readOnlyChanged() {
90
- if (this.proxy instanceof HTMLTextAreaElement) {
91
- this.proxy.readOnly = this.readOnly;
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();
92
232
  }
93
233
  }
94
- autofocusChanged() {
95
- if (this.proxy instanceof HTMLTextAreaElement) {
96
- this.proxy.autofocus = this.autofocus;
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();
97
245
  }
98
246
  }
99
- listChanged() {
100
- if (this.proxy instanceof HTMLTextAreaElement) {
101
- this.proxy.setAttribute("list", this.list);
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();
102
258
  }
103
259
  }
104
- maxlengthChanged() {
105
- if (this.proxy instanceof HTMLTextAreaElement) {
106
- this.proxy.maxLength = this.maxlength;
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);
107
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
+ });
108
276
  }
109
- minlengthChanged() {
110
- if (this.proxy instanceof HTMLTextAreaElement) {
111
- this.proxy.minLength = this.minlength;
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();
112
288
  }
113
289
  }
114
- spellcheckChanged() {
115
- if (this.proxy instanceof HTMLTextAreaElement) {
116
- this.proxy.spellcheck = this.spellcheck;
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
+ }
117
305
  }
118
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
+ }
119
328
  /**
120
- * Selects all the text in the text area
121
- *
329
+ * The adjust method for FASTTabs
122
330
  * @public
331
+ * @remarks
332
+ * This method allows the active index to be adjusted by numerical increments
123
333
  */
124
- select() {
125
- this.control.select();
126
- /**
127
- * The select event does not permeate the shadow DOM boundary.
128
- * This fn effectively proxies the select event,
129
- * emitting a `select` event whenever the internal
130
- * control emits a `select` event
131
- */
132
- this.$emit("select");
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();
133
341
  }
134
342
  /**
135
- * Change event handler for inner control.
136
- * @remarks
137
- * "Change" events are not `composable` so they will not
138
- * permeate the shadow DOM boundary. This fn effectively proxies
139
- * the change event, emitting a `change` event whenever the internal
140
- * control emits a `change` event
141
343
  * @internal
142
344
  */
143
- handleChange() {
144
- this.$emit("change");
145
- }
146
- /** {@inheritDoc (FormAssociated:interface).validate} */
147
- validate() {
148
- super.validate(this.control);
345
+ connectedCallback() {
346
+ super.connectedCallback();
347
+ this.tabIds = this.getTabIds();
348
+ this.tabpanelIds = this.getTabPanelIds();
349
+ this.activeTabIndex = this.getActiveIndex();
149
350
  }
150
351
  }
151
- __decorate([
152
- attr({ mode: "boolean" })
153
- ], TextArea$1.prototype, "readOnly", void 0);
154
- __decorate([
155
- attr
156
- ], TextArea$1.prototype, "resize", void 0);
157
- __decorate([
158
- attr({ mode: "boolean" })
159
- ], TextArea$1.prototype, "autofocus", void 0);
160
- __decorate([
161
- attr({ attribute: "form" })
162
- ], TextArea$1.prototype, "formId", void 0);
163
- __decorate([
164
- attr
165
- ], TextArea$1.prototype, "list", void 0);
166
- __decorate([
167
- attr({ converter: nullableNumberConverter })
168
- ], TextArea$1.prototype, "maxlength", void 0);
169
- __decorate([
170
- attr({ converter: nullableNumberConverter })
171
- ], TextArea$1.prototype, "minlength", void 0);
172
352
  __decorate([
173
353
  attr
174
- ], TextArea$1.prototype, "name", void 0);
354
+ ], Tabs$1.prototype, "orientation", void 0);
175
355
  __decorate([
176
356
  attr
177
- ], TextArea$1.prototype, "placeholder", void 0);
357
+ ], Tabs$1.prototype, "activeid", void 0);
178
358
  __decorate([
179
- attr({ converter: nullableNumberConverter, mode: "fromView" })
180
- ], TextArea$1.prototype, "cols", void 0);
359
+ observable
360
+ ], Tabs$1.prototype, "tabs", void 0);
181
361
  __decorate([
182
- attr({ converter: nullableNumberConverter, mode: "fromView" })
183
- ], TextArea$1.prototype, "rows", void 0);
362
+ observable
363
+ ], Tabs$1.prototype, "tabpanels", void 0);
184
364
  __decorate([
185
365
  attr({ mode: "boolean" })
186
- ], TextArea$1.prototype, "spellcheck", void 0);
366
+ ], Tabs$1.prototype, "activeindicator", void 0);
187
367
  __decorate([
188
368
  observable
189
- ], TextArea$1.prototype, "defaultSlottedNodes", void 0);
190
- applyMixins(TextArea$1, DelegatesARIATextbox);
369
+ ], Tabs$1.prototype, "activeIndicatorRef", void 0);
370
+ __decorate([
371
+ observable
372
+ ], Tabs$1.prototype, "showActiveIndicator", void 0);
373
+ applyMixins(Tabs$1, StartEnd);
191
374
 
192
- var css_248z = "/**\n * Do not edit directly\n * Generated on Fri, 03 Feb 2023 15:57:56 GMT\n */\n:host {\n display: inline-block;\n}\n\n.base {\n display: inline-grid;\n width: 100%;\n gap: 4px;\n grid-template-columns: 1fr max-content;\n}\n.base {\n --_appearance-color-text: var(--vvd-color-canvas-text);\n --_appearance-color-fill: var(--_connotation-color-backdrop);\n --_appearance-color-outline: var(--_connotation-color-intermediate);\n}\n.base.appearance-ghost {\n --_appearance-color-text: var(--_connotation-color-primary);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: transparent;\n}\n.base:where(:hover, .hover):where(:not(:disabled, .disabled, .readonly)) {\n --_appearance-color-text: var(--vvd-color-canvas-text);\n --_appearance-color-fill: var(--_connotation-color-backdrop);\n --_appearance-color-outline: var(--_connotation-color-firm);\n}\n.base:where(:hover, .hover):where(:not(:disabled, .disabled, .readonly)).appearance-ghost {\n --_appearance-color-text: var(--_connotation-color-primary);\n --_appearance-color-fill: var(--_connotation-color-faint);\n --_appearance-color-outline: transparent;\n}\n.base:where(:disabled, .disabled) {\n --_appearance-color-text: var(--vvd-color-neutral-400);\n --_appearance-color-fill: var(--vvd-color-neutral-200);\n --_appearance-color-outline: var(--vvd-color-neutral-400);\n}\n.base:where(:disabled, .disabled).appearance-ghost {\n --_appearance-color-text: var(--vvd-color-neutral-400);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: transparent;\n}\n.base:where(.readonly):where(:not(:disabled, .disabled)) {\n --_appearance-color-text: var(--vvd-color-canvas-text);\n --_appearance-color-fill: var(--vvd-color-neutral-100);\n --_appearance-color-outline: var(--vvd-color-neutral-400);\n}\n.base:where(.readonly):where(:not(:disabled, .disabled)).appearance-ghost {\n --_appearance-color-text: var(--vvd-color-neutral-400);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: transparent;\n}\n.base.connotation-success {\n --_connotation-color-primary: var(--vvd-color-success-500);\n --_connotation-color-backdrop: var(--vvd-color-success-50);\n --_connotation-color-intermediate: var(--vvd-color-success-500);\n --_connotation-color-firm: var(--vvd-color-success-600);\n --_connotation-color-faint: var(--vvd-color-success-50);\n --_connotation-color-soft: var(--vvd-color-success-100);\n}\n.base.connotation-alert {\n --_connotation-color-primary: var(--vvd-color-alert-500);\n --_connotation-color-backdrop: var(--vvd-color-alert-50);\n --_connotation-color-intermediate: var(--vvd-color-alert-500);\n --_connotation-color-firm: var(--vvd-color-alert-600);\n --_connotation-color-faint: var(--vvd-color-alert-50);\n --_connotation-color-soft: var(--vvd-color-alert-100);\n}\n.base:not(.connotation-success, .connotation-alert) {\n --_connotation-color-primary: var(--vvd-color-canvas-text);\n --_connotation-color-backdrop: var(--vvd-color-canvas);\n --_connotation-color-intermediate: var(--vvd-color-neutral-500);\n --_connotation-color-firm: var(--vvd-color-canvas-text);\n --_connotation-color-faint: var(--vvd-color-neutral-50);\n --_connotation-color-soft: var(--vvd-color-neutral-100);\n}\n@supports (user-select: none) {\n .base {\n user-select: none;\n }\n}\n.base:not(.disabled) {\n --_low-ink-color: var(--vvd-color-neutral-600);\n}\n.base.disabled {\n --_low-ink-color: var(--_appearance-color-text);\n pointer-events: none;\n}\n\n.label {\n color: var(--vvd-color-canvas-text);\n contain: inline-size;\n font: var(--vvd-typography-base);\n grid-column: 1/3;\n grid-row: 1;\n line-height: 20px;\n}\n\n.fieldset {\n position: relative;\n display: flex;\n align-items: center;\n border-radius: 6px;\n grid-column: 1/3;\n}\n\n.control {\n width: 100%;\n padding: 8px 16px;\n border: 0 none;\n background-color: var(--_appearance-color-fill);\n border-radius: inherit;\n box-shadow: inset 0 0 0 1px var(--_appearance-color-outline);\n color: var(--_appearance-color-text);\n font: var(--vvd-typography-base);\n min-block-size: calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2)));\n transition: box-shadow 0.2s, background-color 0.2s, color 0.2s;\n}\n.control:disabled {\n cursor: not-allowed;\n opacity: 1; /* 2. correct opacity on iOS */\n pointer-events: none;\n -webkit-text-fill-color: var(--_appearance-color-text); /* 1. sets text fill to current `color` for safari */\n}\n.control::placeholder, .control:disabled::placeholder {\n opacity: 1; /* 2. correct opacity on iOS */\n pointer-events: none;\n -webkit-text-fill-color: var(--_low-ink-color); /* 1. sets text fill to current `color` for safari */\n}\n@supports selector(:focus-visible) {\n .control:focus {\n outline: none;\n }\n}\n\n.focus-indicator {\n --focus-stroke-gap-color: transparent;\n pointer-events: none;\n}\n.fieldset:not(:focus-visible, :focus-within) > .focus-indicator {\n display: none;\n}";
375
+ var css_248z = "/**\n * Do not edit directly\n * Generated on Wed, 15 Feb 2023 11:31:49 GMT\n */\n.base {\n display: grid;\n box-sizing: border-box;\n}\n.base {\n --_connotation-color-primary: var(--vvd-color-canvas-text);\n --_connotation-color-primary-text: var(--vvd-color-canvas);\n --_connotation-color-primary-increment: var(--vvd-color-neutral-800);\n --_connotation-color-faint: var(--vvd-color-neutral-50);\n --_connotation-color-soft: var(--vvd-color-neutral-100);\n}\n.base.orientation-vertical {\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 padding: var(--_tabs-tablist-gutter);\n gap: var(--_tabs-tablist-gutter);\n}\n.base.orientation-vertical .tablist {\n box-shadow: 1px 0 0 0 var(--vvd-color-neutral-300);\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}\n.base:not(.orientation-vertical) .tablist {\n align-self: end;\n justify-content: flex-start;\n border-bottom: 1px solid var(--vvd-color-neutral-300);\n grid-auto-flow: column;\n grid-template-columns: auto;\n grid-template-rows: auto auto;\n inline-size: 100%;\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: 2/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: var(--_tabs-active-tab-inline-size);\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}";
193
376
 
194
- let TextArea = class TextArea extends TextArea$1 {};
195
- __decorate([attr, __metadata("design:type", String)], TextArea.prototype, "wrap", void 0);
196
- TextArea = __decorate([formElements], TextArea);
197
- applyMixins(TextArea, FormElementCharCount, FormElementHelperText, FormElementSuccessText);
377
+ const ACTIVE_TAB_WIDTH = '--_tabs-active-tab-inline-size';
378
+ class Tabs extends Tabs$1 {
379
+ orientationChanged() {
380
+ super.orientationChanged();
381
+ this.patchIndicatorStyleTransition();
382
+ if (!this.activeIndicatorRef) return;
383
+ if (this.orientation === TabsOrientation.vertical) {
384
+ this.activeIndicatorRef.style.removeProperty(ACTIVE_TAB_WIDTH);
385
+ }
386
+ }
387
+ activeidChanged(oldValue, newValue) {
388
+ super.activeidChanged(oldValue, newValue);
389
+ this.patchIndicatorStyleTransition();
390
+ }
391
+ tabsChanged() {
392
+ super.tabsChanged();
393
+ this.patchIndicatorStyleTransition();
394
+ }
395
+ tabpanelsChanged() {
396
+ super.tabpanelsChanged();
397
+ this.patchIndicatorStyleTransition();
398
+ }
399
+ patchIndicatorStyleTransition() {
400
+ if (!this.activetab || !this.activeIndicatorRef) return;
401
+ if (this.orientation === TabsOrientation.vertical || !this.showActiveIndicator) return;
402
+ const width = this.activetab.getBoundingClientRect().width;
403
+ this.activeIndicatorRef.style.setProperty(ACTIVE_TAB_WIDTH, `${width}px`);
404
+ }
405
+ }
406
+ __decorate([observable, __metadata("design:type", HTMLElement)], Tabs.prototype, "tablist", void 0);
198
407
 
199
408
  let _ = t => t,
200
409
  _t,
201
410
  _t2;
202
411
  const getClasses = ({
203
- value,
204
- errorValidationMessage,
205
- disabled,
206
- placeholder,
207
- readOnly,
208
- successText
209
- }) => classNames('base', ['readonly', readOnly], ['placeholder', Boolean(placeholder)], ['disabled', disabled], ['error connotation-alert', Boolean(errorValidationMessage)], ['has-value', Boolean(value)], ['success connotation-success', !!successText]);
210
- function renderLabel() {
412
+ orientation
413
+ }) => classNames('base', [`orientation-${orientation}`, Boolean(orientation)]);
414
+ function TabsTemplate() {
211
415
  return html(_t || (_t = _`
212
- <label for="control" class="label">
213
- ${0}
214
- </label>`), x => x.label);
215
- }
216
- const TextAreaTemplate = context => {
217
- const focusTemplate = focusTemplateFactory(context);
218
- return html(_t2 || (_t2 = _`
219
- <div class="${0}">
220
- ${0}
221
- <div class="fieldset">
222
- <textarea class="control"
223
- ?autofocus="${0}"
224
- placeholder="${0}"
225
- name="${0}"
226
- maxlength="${0}"
227
- rows="${0}"
228
- cols="${0}"
229
- wrap="${0}"
230
- ?readonly="${0}"
231
- ?disabled="${0}"
232
- ?required="${0}"
233
- ?spellcheck="${0}"
234
- :value="${0}"
235
- aria-atomic="${0}"
236
- aria-busy="${0}"
237
- aria-controls="${0}"
238
- aria-current="${0}"
239
- aria-describedby="${0}"
240
- aria-details="${0}"
241
- aria-disabled="${0}"
242
- aria-errormessage="${0}"
243
- aria-flowto="${0}"
244
- aria-haspopup="${0}"
245
- aria-hidden="${0}"
246
- aria-invalid="${0}"
247
- aria-keyshortcuts="${0}"
248
- aria-label="${0}"
249
- aria-labelledby="${0}"
250
- aria-live="${0}"
251
- aria-owns="${0}"
252
- aria-relevant="${0}"
253
- aria-roledescription="${0}"
254
- @input="${0}"
255
- @change="${0}"
416
+ <template role="tablist">
417
+ <div class="${0}">
418
+ <div class="tablist" ${0}>
419
+ <slot name="tab" ${0}></slot>
256
420
  ${0}
257
- >
258
- </textarea>
259
- ${0}
260
- </div>
261
- ${0}
262
- ${0}
263
- ${0}
264
- </div>
265
- `), getClasses, when(x => x.label, renderLabel()), x => x.autofocus, x => x.placeholder ? x.placeholder : null, x => x.name ? x.name : null, x => x.maxlength ? x.maxlength : null, x => x.rows ? x.rows : null, x => x.cols ? x.cols : null, x => x.wrap ? x.wrap : null, x => x.readOnly, x => x.disabled, x => x.required, x => x.spellcheck, x => x.value, x => x.ariaAtomic, x => x.ariaBusy, x => x.ariaControls, x => x.ariaCurrent, x => x.ariaDescribedby, x => x.ariaDetails, x => x.ariaDisabled, x => x.ariaErrormessage, x => x.ariaFlowto, x => x.ariaHaspopup, x => x.ariaHidden, x => x.ariaInvalid, x => x.ariaKeyshortcuts, x => x.ariaLabel, x => x.ariaLabelledby, x => x.ariaLive, x => x.ariaOwns, x => x.ariaRelevant, x => x.ariaRoledescription, x => x.handleTextInput(), x => x.handleChange(), ref('control'), () => focusTemplate, when(x => {
266
- var _a;
267
- return !x.successText && !x.errorValidationMessage && ((_a = x.helperText) === null || _a === void 0 ? void 0 : _a.length);
268
- }, getFeedbackTemplate('helper', context)), when(x => !x.successText && x.errorValidationMessage, getFeedbackTemplate('error', context)), when(x => x.successText, getFeedbackTemplate('success', context)));
269
- };
421
+ </div>
422
+ <div class="tabpanel">
423
+ <slot name="tabpanel" ${0}></slot>
424
+ </div>
425
+ </div>
426
+ </template>
427
+ `), getClasses, ref('tablist'), slotted('tabs'), when(x => x.showActiveIndicator, html(_t2 || (_t2 = _`
428
+ <div ${0} class="active-indicator"></div>
429
+ `), ref('activeIndicatorRef'))), slotted('tabpanels'));
430
+ }
270
431
 
271
- const textAreaDefinition = TextArea.compose({
272
- baseName: 'text-area',
273
- template: TextAreaTemplate,
274
- styles: css_248z,
275
- shadowOptions: {
276
- delegatesFocus: true
277
- }
432
+ const tabsDefinition = Tabs.compose({
433
+ baseName: 'tabs',
434
+ template: TabsTemplate,
435
+ styles: css_248z
278
436
  });
279
- const textAreaRegistries = [textAreaDefinition(), ...iconRegistries, ...focusRegistries];
280
- const registerTextArea = registerFactory(textAreaRegistries);
437
+ const tabsRegistries = [tabsDefinition(), ...tabRegistries, ...tabPanelRegistries];
438
+ const registerTabs = registerFactory(tabsRegistries);
281
439
 
282
- export { textAreaRegistries as a, registerTextArea as r, textAreaDefinition as t };
440
+ export { tabsRegistries as a, registerTabs as r, tabsDefinition as t };