@vonage/vivid 3.51.0 → 3.52.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 (261) hide show
  1. package/alert/index.cjs +1 -1
  2. package/alert/index.js +1 -1
  3. package/appearance-ui/index.cjs +19 -11
  4. package/appearance-ui/index.js +19 -11
  5. package/audio-player/index.cjs +2 -1
  6. package/audio-player/index.js +2 -1
  7. package/card/index.cjs +1 -1
  8. package/card/index.js +1 -1
  9. package/combobox/index.cjs +2 -5
  10. package/combobox/index.js +2 -5
  11. package/custom-elements.json +1357 -529
  12. package/date-picker/index.cjs +3 -6
  13. package/date-picker/index.js +3 -6
  14. package/date-range-picker/index.cjs +2 -5
  15. package/date-range-picker/index.js +2 -5
  16. package/dialog/index.cjs +1 -1
  17. package/dialog/index.js +1 -1
  18. package/elevation/index.cjs +1 -1
  19. package/elevation/index.js +1 -1
  20. package/file-picker/index.cjs +0 -2
  21. package/file-picker/index.js +0 -2
  22. package/header/index.cjs +1 -1
  23. package/header/index.js +1 -1
  24. package/index.cjs +60 -58
  25. package/index.js +22 -23
  26. package/lib/avatar/definition.d.ts +1 -1
  27. package/lib/button/button.d.ts +1 -0
  28. package/lib/button/definition.d.ts +1 -1
  29. package/lib/calendar-event/definition.d.ts +1 -1
  30. package/lib/components.d.ts +1 -0
  31. package/lib/layout/definition.d.ts +1 -1
  32. package/lib/menu-item/menu-item.d.ts +3 -0
  33. package/lib/range-slider/definition.d.ts +3 -0
  34. package/lib/range-slider/locale.d.ts +4 -0
  35. package/lib/range-slider/range-slider.d.ts +32 -0
  36. package/lib/range-slider/range-slider.form-associated.d.ts +10 -0
  37. package/lib/range-slider/range-slider.template.d.ts +4 -0
  38. package/lib/range-slider/utils/lerp.d.ts +2 -0
  39. package/lib/range-slider/utils/roundToStepValue.d.ts +1 -0
  40. package/lib/slider/slider.template.d.ts +1 -0
  41. package/lib/split-button/definition.d.ts +1 -1
  42. package/listbox/index.cjs +23 -22
  43. package/listbox/index.js +23 -22
  44. package/locales/en-GB.cjs +4 -0
  45. package/locales/en-GB.js +4 -0
  46. package/locales/en-US.cjs +4 -0
  47. package/locales/en-US.js +4 -0
  48. package/locales/ja-JP.cjs +5 -1
  49. package/locales/ja-JP.js +5 -1
  50. package/locales/zh-CN.cjs +4 -0
  51. package/locales/zh-CN.js +4 -0
  52. package/menu/index.cjs +3 -3
  53. package/menu/index.js +3 -3
  54. package/menu-item/index.cjs +2 -2
  55. package/menu-item/index.js +2 -2
  56. package/number-field/index.cjs +0 -2
  57. package/number-field/index.js +0 -2
  58. package/package.json +34 -34
  59. package/popup/index.cjs +2 -2
  60. package/popup/index.js +2 -2
  61. package/range-slider/index.cjs +22 -0
  62. package/range-slider/index.js +20 -0
  63. package/select/index.cjs +3 -3
  64. package/select/index.js +3 -3
  65. package/selectable-box/index.cjs +1 -1
  66. package/selectable-box/index.js +1 -1
  67. package/shared/Reflector.cjs +5 -1
  68. package/shared/Reflector.js +5 -1
  69. package/shared/affix.cjs +11 -4
  70. package/shared/affix.js +12 -4
  71. package/shared/anchored.cjs +8 -2
  72. package/shared/anchored.js +8 -2
  73. package/shared/definition.cjs +8 -3
  74. package/shared/definition.js +8 -3
  75. package/shared/definition10.cjs +5 -5
  76. package/shared/definition10.js +5 -5
  77. package/shared/definition11.cjs +75 -47
  78. package/shared/definition11.js +76 -48
  79. package/shared/definition12.cjs +12 -14
  80. package/shared/definition12.js +12 -14
  81. package/shared/definition13.cjs +118 -75
  82. package/shared/definition13.js +118 -75
  83. package/shared/definition14.cjs +33 -32
  84. package/shared/definition14.js +33 -32
  85. package/shared/definition15.cjs +20 -7
  86. package/shared/definition15.js +20 -7
  87. package/shared/definition16.cjs +37 -42
  88. package/shared/definition16.js +36 -41
  89. package/shared/definition17.cjs +125 -65
  90. package/shared/definition17.js +126 -66
  91. package/shared/definition18.cjs +30 -14
  92. package/shared/definition18.js +30 -14
  93. package/shared/definition19.cjs +116 -80
  94. package/shared/definition19.js +116 -80
  95. package/shared/definition2.cjs +10 -5
  96. package/shared/definition2.js +10 -5
  97. package/shared/definition20.cjs +16 -15
  98. package/shared/definition20.js +16 -15
  99. package/shared/definition21.cjs +6 -10
  100. package/shared/definition21.js +6 -10
  101. package/shared/definition22.cjs +14 -18
  102. package/shared/definition22.js +14 -18
  103. package/shared/definition23.cjs +34 -35
  104. package/shared/definition23.js +34 -35
  105. package/shared/definition24.cjs +116 -69
  106. package/shared/definition24.js +116 -69
  107. package/shared/definition25.cjs +2 -4
  108. package/shared/definition25.js +2 -4
  109. package/shared/definition26.cjs +9 -8
  110. package/shared/definition26.js +9 -8
  111. package/shared/definition27.cjs +7 -5
  112. package/shared/definition27.js +7 -5
  113. package/shared/definition28.cjs +209 -143
  114. package/shared/definition28.js +209 -143
  115. package/shared/definition29.cjs +10 -4
  116. package/shared/definition29.js +10 -4
  117. package/shared/definition3.cjs +7 -10
  118. package/shared/definition3.js +7 -10
  119. package/shared/definition30.cjs +7 -5
  120. package/shared/definition30.js +7 -5
  121. package/shared/definition31.cjs +2 -4
  122. package/shared/definition31.js +2 -4
  123. package/shared/definition32.cjs +1 -3
  124. package/shared/definition32.js +1 -3
  125. package/shared/definition33.cjs +7 -10
  126. package/shared/definition33.js +7 -10
  127. package/shared/definition34.cjs +76 -59
  128. package/shared/definition34.js +76 -59
  129. package/shared/definition35.cjs +19 -20
  130. package/shared/definition35.js +19 -20
  131. package/shared/definition36.cjs +30 -14
  132. package/shared/definition36.js +30 -14
  133. package/shared/definition37.cjs +33 -46
  134. package/shared/definition37.js +33 -46
  135. package/shared/definition38.cjs +31 -33
  136. package/shared/definition38.js +31 -33
  137. package/shared/definition39.cjs +13 -4
  138. package/shared/definition39.js +13 -4
  139. package/shared/definition4.cjs +23 -11
  140. package/shared/definition4.js +23 -11
  141. package/shared/definition40.cjs +19 -14
  142. package/shared/definition40.js +19 -14
  143. package/shared/definition41.cjs +534 -635
  144. package/shared/definition41.js +534 -635
  145. package/shared/definition42.cjs +674 -106
  146. package/shared/definition42.js +673 -105
  147. package/shared/definition43.cjs +122 -79
  148. package/shared/definition43.js +120 -77
  149. package/shared/definition44.cjs +72 -567
  150. package/shared/definition44.js +71 -565
  151. package/shared/definition45.cjs +520 -118
  152. package/shared/definition45.js +518 -117
  153. package/shared/definition46.cjs +117 -130
  154. package/shared/definition46.js +116 -129
  155. package/shared/definition47.cjs +152 -18
  156. package/shared/definition47.js +151 -17
  157. package/shared/definition48.cjs +20 -77
  158. package/shared/definition48.js +19 -76
  159. package/shared/definition49.cjs +52 -495
  160. package/shared/definition49.js +51 -494
  161. package/shared/definition5.cjs +20 -17
  162. package/shared/definition5.js +20 -17
  163. package/shared/definition50.cjs +525 -24
  164. package/shared/definition50.js +524 -23
  165. package/shared/definition51.cjs +28 -119
  166. package/shared/definition51.js +26 -118
  167. package/shared/definition52.cjs +113 -266
  168. package/shared/definition52.js +113 -265
  169. package/shared/definition53.cjs +285 -245
  170. package/shared/definition53.js +285 -245
  171. package/shared/definition54.cjs +285 -751
  172. package/shared/definition54.js +284 -750
  173. package/shared/definition55.cjs +828 -99
  174. package/shared/definition55.js +827 -98
  175. package/shared/definition56.cjs +126 -77
  176. package/shared/definition56.js +125 -76
  177. package/shared/definition57.cjs +125 -71
  178. package/shared/definition57.js +124 -70
  179. package/shared/definition58.cjs +73 -287
  180. package/shared/definition58.js +74 -288
  181. package/shared/definition59.cjs +298 -40
  182. package/shared/definition59.js +297 -39
  183. package/shared/definition6.cjs +3 -4
  184. package/shared/definition6.js +3 -4
  185. package/shared/definition60.cjs +24 -1784
  186. package/shared/definition60.js +23 -1783
  187. package/shared/definition61.cjs +1819 -11
  188. package/shared/definition61.js +1818 -11
  189. package/shared/definition7.cjs +6 -4
  190. package/shared/definition7.js +6 -4
  191. package/shared/definition8.cjs +25 -18
  192. package/shared/definition8.js +25 -18
  193. package/shared/definition9.cjs +6 -9
  194. package/shared/definition9.js +6 -9
  195. package/shared/icon.cjs +7 -2
  196. package/shared/icon.js +7 -2
  197. package/shared/index2.cjs +1 -1
  198. package/shared/index2.js +1 -1
  199. package/shared/key-codes2.cjs +8 -0
  200. package/shared/key-codes2.js +5 -1
  201. package/shared/localization/Locale.d.ts +2 -0
  202. package/shared/patterns/index.d.ts +0 -1
  203. package/shared/presentationDate.cjs +126 -78
  204. package/shared/presentationDate.js +126 -78
  205. package/shared/slider.template.cjs +71 -0
  206. package/shared/slider.template.js +67 -0
  207. package/shared/text-anchor.template.cjs +30 -35
  208. package/shared/text-anchor.template.js +30 -35
  209. package/shared/text-field.cjs +1 -1
  210. package/shared/text-field.js +1 -1
  211. package/side-drawer/index.cjs +1 -1
  212. package/side-drawer/index.js +1 -1
  213. package/slider/index.cjs +2 -1
  214. package/slider/index.js +2 -1
  215. package/split-button/index.cjs +1 -1
  216. package/split-button/index.js +1 -1
  217. package/styles/core/all.css +1 -1
  218. package/styles/core/theme.css +1 -1
  219. package/styles/core/typography.css +1 -1
  220. package/styles/fonts/spezia-variable.css +39 -13
  221. package/styles/tokens/theme-dark.css +4 -4
  222. package/styles/tokens/theme-light.css +4 -4
  223. package/styles/tokens/vivid-2-compat.css +4 -2
  224. package/switch/index.cjs +1 -1
  225. package/switch/index.js +1 -1
  226. package/tab/index.cjs +1 -1
  227. package/tab/index.js +1 -1
  228. package/tab-panel/index.cjs +1 -1
  229. package/tab-panel/index.js +1 -1
  230. package/tabs/index.cjs +3 -3
  231. package/tabs/index.js +3 -3
  232. package/tag/index.cjs +1 -1
  233. package/tag/index.js +1 -1
  234. package/tag-group/index.cjs +1 -1
  235. package/tag-group/index.js +1 -1
  236. package/text-area/index.cjs +1 -1
  237. package/text-area/index.js +1 -1
  238. package/text-field/index.cjs +1 -4
  239. package/text-field/index.js +1 -4
  240. package/time-picker/index.cjs +4 -7
  241. package/time-picker/index.js +4 -7
  242. package/toggletip/index.cjs +3 -3
  243. package/toggletip/index.js +3 -3
  244. package/tooltip/index.cjs +3 -3
  245. package/tooltip/index.js +3 -3
  246. package/tree-item/index.cjs +1 -1
  247. package/tree-item/index.js +1 -1
  248. package/tree-view/index.cjs +1 -1
  249. package/tree-view/index.js +1 -1
  250. package/vivid.api.json +117 -1
  251. package/focus/index.cjs +0 -7
  252. package/focus/index.js +0 -5
  253. package/lib/focus/definition.d.ts +0 -3
  254. package/lib/focus/focus.d.ts +0 -3
  255. package/lib/focus/focus.template.d.ts +0 -4
  256. package/lib/popup/popup.d.ts +0 -21
  257. package/shared/focus.cjs +0 -8
  258. package/shared/focus.js +0 -6
  259. package/shared/focus2.cjs +0 -11
  260. package/shared/focus2.js +0 -9
  261. package/shared/patterns/focus.d.ts +0 -3
@@ -1,6 +1,6 @@
1
1
  import { a as attr, F as FoundationElement, o as observable, h as html, r as registerFactory } from './index.js';
2
2
  import { B as Button, a as buttonRegistries } from './definition11.js';
3
- import { S as Slider, a as sliderRegistries } from './definition44.js';
3
+ import { S as Slider, a as sliderRegistries } from './definition45.js';
4
4
  import './affix.js';
5
5
  import './index2.js';
6
6
  import { L as Localized } from './localized.js';
@@ -139,9 +139,7 @@ __decorateClass([
139
139
  ], AudioPlayer.prototype, "duration", 2);
140
140
  applyMixins(AudioPlayer, Localized);
141
141
 
142
- const getClasses = ({ disabled, duration }) => classNames(
143
- ["disabled", Boolean(disabled) || !Boolean(duration)]
144
- );
142
+ const getClasses = ({ disabled, duration }) => classNames(["disabled", Boolean(disabled) || !Boolean(duration)]);
145
143
  function renderButton(context) {
146
144
  const buttonTag = context.tagFor(Button);
147
145
  return html`<${buttonTag} class="pause" @click="${(x) => x._togglePlay()}"
@@ -163,24 +161,25 @@ function renderSlider(context) {
163
161
  </${sliderTag}>`;
164
162
  }
165
163
  function renderTimestamp() {
166
- return html`
167
- <div class="time-stamp" ${ref("_timeStampEl")}>
164
+ return html` <div class="time-stamp" ${ref("_timeStampEl")}>
168
165
  <span class="current-time">0:00</span>
169
166
  <span>/</span>
170
167
  <span class="total-time">0:00</span>
171
168
  </div>`;
172
169
  }
173
170
  const AudioPlayerTemplate = (context) => {
174
- return html`
175
- <div class="base ${getClasses}">
176
- <div class="controls">
177
- ${renderButton(context)}
178
- ${when((x) => !x.notime, renderTimestamp())}
179
- ${renderSlider(context)}
180
- </div>
181
- <audio ${ref("_playerEl")} src="${(x) => x.src}"
182
- @timeupdate="${(x) => x._updateProgress()}" @loadedmetadata="${(x) => x._updateTotalTime()}"></audio>
183
- </div>`;
171
+ return html` <div class="base ${getClasses}">
172
+ <div class="controls">
173
+ ${renderButton(context)} ${when((x) => !x.notime, renderTimestamp())}
174
+ ${renderSlider(context)}
175
+ </div>
176
+ <audio
177
+ ${ref("_playerEl")}
178
+ src="${(x) => x.src}"
179
+ @timeupdate="${(x) => x._updateProgress()}"
180
+ @loadedmetadata="${(x) => x._updateTotalTime()}"
181
+ ></audio>
182
+ </div>`;
184
183
  };
185
184
 
186
185
  const audioPlayerDefinition = AudioPlayer.compose({
@@ -188,7 +187,11 @@ const audioPlayerDefinition = AudioPlayer.compose({
188
187
  template: AudioPlayerTemplate,
189
188
  styles
190
189
  });
191
- const audioPlayerRegistries = [audioPlayerDefinition(), ...buttonRegistries, ...sliderRegistries];
190
+ const audioPlayerRegistries = [
191
+ audioPlayerDefinition(),
192
+ ...buttonRegistries,
193
+ ...sliderRegistries
194
+ ];
192
195
  const registerAudioPlayer = registerFactory(audioPlayerRegistries);
193
196
 
194
197
  export { audioPlayerDefinition as a, audioPlayerRegistries as b, registerAudioPlayer as r };
@@ -1,9 +1,389 @@
1
1
  'use strict';
2
2
 
3
3
  const index = require('./index.cjs');
4
+ const definition = require('./definition49.cjs');
5
+ const definition$1 = require('./definition48.cjs');
6
+ const startEnd = require('./start-end.cjs');
7
+ const applyMixins = require('./apply-mixins.cjs');
8
+ const keyCodes = require('./key-codes.cjs');
9
+ const strings = require('./strings.cjs');
10
+ const numbers = require('./numbers.cjs');
11
+ const ref = require('./ref.cjs');
12
+ const slotted = require('./slotted.cjs');
13
+ const when = require('./when.cjs');
4
14
  const classNames = require('./class-names.cjs');
5
15
 
6
- const styles = ".base{display:flex;flex-wrap:wrap;gap:8px}\n";
16
+ /**
17
+ * The orientation of the {@link @microsoft/fast-foundation#(Tabs:class)} component
18
+ * @public
19
+ */
20
+ const TabsOrientation = {
21
+ vertical: "vertical",
22
+ horizontal: "horizontal",
23
+ };
24
+ /**
25
+ * A Tabs Custom HTML Element.
26
+ * Implements the {@link https://www.w3.org/TR/wai-aria-1.1/#tablist | ARIA tablist }.
27
+ *
28
+ * @slot start - Content which can be provided before the tablist element
29
+ * @slot end - Content which can be provided after the tablist element
30
+ * @slot tab - The slot for tabs
31
+ * @slot tabpanel - The slot for tabpanels
32
+ * @csspart tablist - The element wrapping for the tabs
33
+ * @csspart tab - The tab slot
34
+ * @csspart activeIndicator - The visual indicator
35
+ * @csspart tabpanel - The tabpanel slot
36
+ * @fires change - Fires a custom 'change' event when a tab is clicked or during keyboard navigation
37
+ *
38
+ * @public
39
+ */
40
+ let Tabs$1 = class Tabs extends index.FoundationElement {
41
+ constructor() {
42
+ super(...arguments);
43
+ /**
44
+ * The orientation
45
+ * @public
46
+ * @remarks
47
+ * HTML Attribute: orientation
48
+ */
49
+ this.orientation = TabsOrientation.horizontal;
50
+ /**
51
+ * Whether or not to show the active indicator
52
+ * @public
53
+ * @remarks
54
+ * HTML Attribute: activeindicator
55
+ */
56
+ this.activeindicator = true;
57
+ /**
58
+ * @internal
59
+ */
60
+ this.showActiveIndicator = true;
61
+ this.prevActiveTabIndex = 0;
62
+ this.activeTabIndex = 0;
63
+ this.ticking = false;
64
+ this.change = () => {
65
+ this.$emit("change", this.activetab);
66
+ };
67
+ this.isDisabledElement = (el) => {
68
+ return el.getAttribute("aria-disabled") === "true";
69
+ };
70
+ this.isHiddenElement = (el) => {
71
+ return el.hasAttribute("hidden");
72
+ };
73
+ this.isFocusableElement = (el) => {
74
+ return !this.isDisabledElement(el) && !this.isHiddenElement(el);
75
+ };
76
+ this.setTabs = () => {
77
+ const gridHorizontalProperty = "gridColumn";
78
+ const gridVerticalProperty = "gridRow";
79
+ const gridProperty = this.isHorizontal()
80
+ ? gridHorizontalProperty
81
+ : gridVerticalProperty;
82
+ this.activeTabIndex = this.getActiveIndex();
83
+ this.showActiveIndicator = false;
84
+ this.tabs.forEach((tab, index) => {
85
+ if (tab.slot === "tab") {
86
+ const isActiveTab = this.activeTabIndex === index && this.isFocusableElement(tab);
87
+ if (this.activeindicator && this.isFocusableElement(tab)) {
88
+ this.showActiveIndicator = true;
89
+ }
90
+ const tabId = this.tabIds[index];
91
+ const tabpanelId = this.tabpanelIds[index];
92
+ tab.setAttribute("id", tabId);
93
+ tab.setAttribute("aria-selected", isActiveTab ? "true" : "false");
94
+ tab.setAttribute("aria-controls", tabpanelId);
95
+ tab.addEventListener("click", this.handleTabClick);
96
+ tab.addEventListener("keydown", this.handleTabKeyDown);
97
+ tab.setAttribute("tabindex", isActiveTab ? "0" : "-1");
98
+ if (isActiveTab) {
99
+ this.activetab = tab;
100
+ this.activeid = tabId;
101
+ }
102
+ }
103
+ // If the original property isn't emptied out,
104
+ // the next set will morph into a grid-area style setting that is not what we want
105
+ tab.style[gridHorizontalProperty] = "";
106
+ tab.style[gridVerticalProperty] = "";
107
+ tab.style[gridProperty] = `${index + 1}`;
108
+ !this.isHorizontal()
109
+ ? tab.classList.add("vertical")
110
+ : tab.classList.remove("vertical");
111
+ });
112
+ };
113
+ this.setTabPanels = () => {
114
+ this.tabpanels.forEach((tabpanel, index) => {
115
+ const tabId = this.tabIds[index];
116
+ const tabpanelId = this.tabpanelIds[index];
117
+ tabpanel.setAttribute("id", tabpanelId);
118
+ tabpanel.setAttribute("aria-labelledby", tabId);
119
+ this.activeTabIndex !== index
120
+ ? tabpanel.setAttribute("hidden", "")
121
+ : tabpanel.removeAttribute("hidden");
122
+ });
123
+ };
124
+ this.handleTabClick = (event) => {
125
+ const selectedTab = event.currentTarget;
126
+ if (selectedTab.nodeType === 1 && this.isFocusableElement(selectedTab)) {
127
+ this.prevActiveTabIndex = this.activeTabIndex;
128
+ this.activeTabIndex = this.tabs.indexOf(selectedTab);
129
+ this.setComponent();
130
+ }
131
+ };
132
+ this.handleTabKeyDown = (event) => {
133
+ if (this.isHorizontal()) {
134
+ switch (event.key) {
135
+ case keyCodes.keyArrowLeft:
136
+ event.preventDefault();
137
+ this.adjustBackward(event);
138
+ break;
139
+ case keyCodes.keyArrowRight:
140
+ event.preventDefault();
141
+ this.adjustForward(event);
142
+ break;
143
+ }
144
+ }
145
+ else {
146
+ switch (event.key) {
147
+ case keyCodes.keyArrowUp:
148
+ event.preventDefault();
149
+ this.adjustBackward(event);
150
+ break;
151
+ case keyCodes.keyArrowDown:
152
+ event.preventDefault();
153
+ this.adjustForward(event);
154
+ break;
155
+ }
156
+ }
157
+ switch (event.key) {
158
+ case keyCodes.keyHome:
159
+ event.preventDefault();
160
+ this.adjust(-this.activeTabIndex);
161
+ break;
162
+ case keyCodes.keyEnd:
163
+ event.preventDefault();
164
+ this.adjust(this.tabs.length - this.activeTabIndex - 1);
165
+ break;
166
+ }
167
+ };
168
+ this.adjustForward = (e) => {
169
+ const group = this.tabs;
170
+ let index = 0;
171
+ index = this.activetab ? group.indexOf(this.activetab) + 1 : 1;
172
+ if (index === group.length) {
173
+ index = 0;
174
+ }
175
+ while (index < group.length && group.length > 1) {
176
+ if (this.isFocusableElement(group[index])) {
177
+ this.moveToTabByIndex(group, index);
178
+ break;
179
+ }
180
+ else if (this.activetab && index === group.indexOf(this.activetab)) {
181
+ break;
182
+ }
183
+ else if (index + 1 >= group.length) {
184
+ index = 0;
185
+ }
186
+ else {
187
+ index += 1;
188
+ }
189
+ }
190
+ };
191
+ this.adjustBackward = (e) => {
192
+ const group = this.tabs;
193
+ let index = 0;
194
+ index = this.activetab ? group.indexOf(this.activetab) - 1 : 0;
195
+ index = index < 0 ? group.length - 1 : index;
196
+ while (index >= 0 && group.length > 1) {
197
+ if (this.isFocusableElement(group[index])) {
198
+ this.moveToTabByIndex(group, index);
199
+ break;
200
+ }
201
+ else if (index - 1 < 0) {
202
+ index = group.length - 1;
203
+ }
204
+ else {
205
+ index -= 1;
206
+ }
207
+ }
208
+ };
209
+ this.moveToTabByIndex = (group, index) => {
210
+ const tab = group[index];
211
+ this.activetab = tab;
212
+ this.prevActiveTabIndex = this.activeTabIndex;
213
+ this.activeTabIndex = index;
214
+ tab.focus();
215
+ this.setComponent();
216
+ };
217
+ }
218
+ /**
219
+ * @internal
220
+ */
221
+ orientationChanged() {
222
+ if (this.$fastController.isConnected) {
223
+ this.setTabs();
224
+ this.setTabPanels();
225
+ this.handleActiveIndicatorPosition();
226
+ }
227
+ }
228
+ /**
229
+ * @internal
230
+ */
231
+ activeidChanged(oldValue, newValue) {
232
+ if (this.$fastController.isConnected &&
233
+ this.tabs.length <= this.tabpanels.length) {
234
+ this.prevActiveTabIndex = this.tabs.findIndex((item) => item.id === oldValue);
235
+ this.setTabs();
236
+ this.setTabPanels();
237
+ this.handleActiveIndicatorPosition();
238
+ }
239
+ }
240
+ /**
241
+ * @internal
242
+ */
243
+ tabsChanged() {
244
+ if (this.$fastController.isConnected &&
245
+ this.tabs.length <= this.tabpanels.length) {
246
+ this.tabIds = this.getTabIds();
247
+ this.tabpanelIds = this.getTabPanelIds();
248
+ this.setTabs();
249
+ this.setTabPanels();
250
+ this.handleActiveIndicatorPosition();
251
+ }
252
+ }
253
+ /**
254
+ * @internal
255
+ */
256
+ tabpanelsChanged() {
257
+ if (this.$fastController.isConnected &&
258
+ this.tabpanels.length <= this.tabs.length) {
259
+ this.tabIds = this.getTabIds();
260
+ this.tabpanelIds = this.getTabPanelIds();
261
+ this.setTabs();
262
+ this.setTabPanels();
263
+ this.handleActiveIndicatorPosition();
264
+ }
265
+ }
266
+ getActiveIndex() {
267
+ const id = this.activeid;
268
+ if (id !== undefined) {
269
+ return this.tabIds.indexOf(this.activeid) === -1
270
+ ? 0
271
+ : this.tabIds.indexOf(this.activeid);
272
+ }
273
+ else {
274
+ return 0;
275
+ }
276
+ }
277
+ getTabIds() {
278
+ return this.tabs.map((tab) => {
279
+ var _a;
280
+ return (_a = tab.getAttribute("id")) !== null && _a !== void 0 ? _a : `tab-${strings.uniqueId()}`;
281
+ });
282
+ }
283
+ getTabPanelIds() {
284
+ return this.tabpanels.map((tabPanel) => {
285
+ var _a;
286
+ return (_a = tabPanel.getAttribute("id")) !== null && _a !== void 0 ? _a : `panel-${strings.uniqueId()}`;
287
+ });
288
+ }
289
+ setComponent() {
290
+ if (this.activeTabIndex !== this.prevActiveTabIndex) {
291
+ this.activeid = this.tabIds[this.activeTabIndex];
292
+ this.focusTab();
293
+ this.change();
294
+ }
295
+ }
296
+ isHorizontal() {
297
+ return this.orientation === TabsOrientation.horizontal;
298
+ }
299
+ handleActiveIndicatorPosition() {
300
+ // Ignore if we click twice on the same tab
301
+ if (this.showActiveIndicator &&
302
+ this.activeindicator &&
303
+ this.activeTabIndex !== this.prevActiveTabIndex) {
304
+ if (this.ticking) {
305
+ this.ticking = false;
306
+ }
307
+ else {
308
+ this.ticking = true;
309
+ this.animateActiveIndicator();
310
+ }
311
+ }
312
+ }
313
+ animateActiveIndicator() {
314
+ this.ticking = true;
315
+ const gridProperty = this.isHorizontal() ? "gridColumn" : "gridRow";
316
+ const translateProperty = this.isHorizontal()
317
+ ? "translateX"
318
+ : "translateY";
319
+ const offsetProperty = this.isHorizontal() ? "offsetLeft" : "offsetTop";
320
+ const prev = this.activeIndicatorRef[offsetProperty];
321
+ this.activeIndicatorRef.style[gridProperty] = `${this.activeTabIndex + 1}`;
322
+ const next = this.activeIndicatorRef[offsetProperty];
323
+ this.activeIndicatorRef.style[gridProperty] = `${this.prevActiveTabIndex + 1}`;
324
+ const dif = next - prev;
325
+ this.activeIndicatorRef.style.transform = `${translateProperty}(${dif}px)`;
326
+ this.activeIndicatorRef.classList.add("activeIndicatorTransition");
327
+ this.activeIndicatorRef.addEventListener("transitionend", () => {
328
+ this.ticking = false;
329
+ this.activeIndicatorRef.style[gridProperty] = `${this.activeTabIndex + 1}`;
330
+ this.activeIndicatorRef.style.transform = `${translateProperty}(0px)`;
331
+ this.activeIndicatorRef.classList.remove("activeIndicatorTransition");
332
+ });
333
+ }
334
+ /**
335
+ * The adjust method for FASTTabs
336
+ * @public
337
+ * @remarks
338
+ * This method allows the active index to be adjusted by numerical increments
339
+ */
340
+ adjust(adjustment) {
341
+ const focusableTabs = this.tabs.filter(t => this.isFocusableElement(t));
342
+ const currentActiveTabIndex = focusableTabs.indexOf(this.activetab);
343
+ const nextTabIndex = numbers.limit(0, focusableTabs.length - 1, currentActiveTabIndex + adjustment);
344
+ // the index of the next focusable tab within the context of all available tabs
345
+ const nextIndex = this.tabs.indexOf(focusableTabs[nextTabIndex]);
346
+ if (nextIndex > -1) {
347
+ this.moveToTabByIndex(this.tabs, nextIndex);
348
+ }
349
+ }
350
+ focusTab() {
351
+ this.tabs[this.activeTabIndex].focus();
352
+ }
353
+ /**
354
+ * @internal
355
+ */
356
+ connectedCallback() {
357
+ super.connectedCallback();
358
+ this.tabIds = this.getTabIds();
359
+ this.tabpanelIds = this.getTabPanelIds();
360
+ this.activeTabIndex = this.getActiveIndex();
361
+ }
362
+ };
363
+ index.__decorate([
364
+ index.attr
365
+ ], Tabs$1.prototype, "orientation", void 0);
366
+ index.__decorate([
367
+ index.attr
368
+ ], Tabs$1.prototype, "activeid", void 0);
369
+ index.__decorate([
370
+ index.observable
371
+ ], Tabs$1.prototype, "tabs", void 0);
372
+ index.__decorate([
373
+ index.observable
374
+ ], Tabs$1.prototype, "tabpanels", void 0);
375
+ index.__decorate([
376
+ index.attr({ mode: "boolean" })
377
+ ], Tabs$1.prototype, "activeindicator", void 0);
378
+ index.__decorate([
379
+ index.observable
380
+ ], Tabs$1.prototype, "activeIndicatorRef", void 0);
381
+ index.__decorate([
382
+ index.observable
383
+ ], Tabs$1.prototype, "showActiveIndicator", void 0);
384
+ applyMixins.applyMixins(Tabs$1, startEnd.StartEnd);
385
+
386
+ const styles = ":host{display:block}.base{display:grid;box-sizing:border-box}.base{--_appearance-color-text: var(--_connotation-color-primary);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.base.connotation-cta{--_connotation-color-primary: var(--vvd-tabs-cta-primary, var(--vvd-color-cta-500))}.base:not(.connotation-cta){--_connotation-color-primary: var(--vvd-tabs-accent-primary, var(--vvd-color-canvas-text))}.base.orientation-vertical{overflow:hidden;block-size:inherit;grid-template-columns:auto 1fr;grid-template-rows:1fr}.base:not(.orientation-vertical){grid-template-columns:1fr;grid-template-rows:auto 1fr;max-block-size:100%}.tablist{--_tabs-tablist-gutter: 8px;--_tabs-active-indicator-stroke-width: 2px;position:relative;display:grid;box-sizing:border-box;color:var(--_appearance-color-text)}.base.orientation-vertical .tablist{padding:var(--_tabs-tablist-gutter);grid-row:1/2;grid-template-columns:auto 1fr;grid-template-rows:auto;inline-size:100%;place-self:flex-start end;row-gap:var(--_tabs-tablist-gutter)}.base:not(.orientation-vertical) .tablist{justify-content:flex-start;column-gap:var(--_tabs-tablist-gutter);grid-auto-flow:column;grid-template-columns:auto;grid-template-rows:auto auto;inline-size:100%;padding-inline:var(--_tabs-tablist-gutter)}.base:not(.orientation-vertical) .tablist-wrapper{overflow:auto hidden;align-self:end;border-bottom:1px solid var(--vvd-color-neutral-300);inline-size:100%}.base.orientation-vertical .tablist-wrapper{overflow:hidden auto;block-size:100%;box-shadow:1px 0 0 0 var(--vvd-color-neutral-300)}.tablist-wrapper::-webkit-scrollbar{display:none}.tabpanel{box-sizing:border-box;block-size:100%;min-block-size:0;min-inline-size:0}.base.scroll .tabpanel{overflow-y:auto}.base.gutters-small .tabpanel{padding:calc(1px*(40 + 4*clamp(-1,var(--vvd-size-density, 0),2)) - (1px*(24 + 4*clamp(-1,var(--vvd-size-density, 0),2))))}.active-indicator{background:currentColor;margin-inline-start:calc(var(--_tabs-tablist-gutter) * -1)}.base.orientation-vertical .active-indicator{align-self:center;border-radius:2px;block-size:80%;grid-area:1/1/auto/auto;inline-size:var(--_tabs-active-indicator-stroke-width)}.base:not(.orientation-vertical) .active-indicator{position:absolute;z-index:1;block-size:var(--_tabs-active-indicator-stroke-width);grid-column:1/auto;inline-size:calc(var(--_tabs-active-tab-inline-size) - 32px);inset-block-end:0;inset-inline-start:8px;justify-self:center;padding-inline:var(--_tabs-tablist-gutter)}.activeIndicatorTransition{transition:transform .2s ease-out 0s,inline-size .2s ease-out 0s}.base:not(.orientation-vertical) .active-indicator:not(.activeIndicatorTransition){opacity:0}\n";
7
387
 
8
388
  var __defProp = Object.defineProperty;
9
389
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -16,37 +396,158 @@ var __decorateClass = (decorators, target, key, kind) => {
16
396
  __defProp(target, key, result);
17
397
  return result;
18
398
  };
19
- class TagGroup extends index.FoundationElement {
399
+ const ACTIVE_TAB_WIDTH = "--_tabs-active-tab-inline-size";
400
+ class Tabs extends Tabs$1 {
20
401
  constructor() {
21
402
  super(...arguments);
22
- this.ariaLabel = null;
403
+ this.scrollablePanel = false;
404
+ }
405
+ connotationChanged() {
406
+ this.#updateTabsConnotation();
407
+ }
408
+ orientationChanged() {
409
+ super.orientationChanged();
410
+ this.patchIndicatorStyleTransition();
411
+ if (!this.activeIndicatorRef)
412
+ return;
413
+ if (this.orientation === TabsOrientation.vertical) {
414
+ this.activeIndicatorRef.style.removeProperty(ACTIVE_TAB_WIDTH);
415
+ }
416
+ this.#patchActiveID();
417
+ }
418
+ activeidChanged(oldValue, newValue) {
419
+ super.activeidChanged(oldValue, newValue);
420
+ this.patchIndicatorStyleTransition();
421
+ this.#patchActiveID();
422
+ }
423
+ tabsChanged() {
424
+ super.tabsChanged();
425
+ this.patchIndicatorStyleTransition();
426
+ this.#patchActiveID();
427
+ }
428
+ tabpanelsChanged() {
429
+ super.tabpanelsChanged();
430
+ this.patchIndicatorStyleTransition();
431
+ this.#patchActiveID();
432
+ }
433
+ patchIndicatorStyleTransition() {
434
+ if (!this.activetab || !this.activeIndicatorRef)
435
+ return;
436
+ if (this.orientation === TabsOrientation.vertical || !this.showActiveIndicator)
437
+ return;
438
+ const width = this.activetab.getBoundingClientRect().width;
439
+ this.activeIndicatorRef.style.setProperty(ACTIVE_TAB_WIDTH, `${width}px`);
440
+ }
441
+ #updateTabsConnotation() {
442
+ if (this.tabs) {
443
+ this.tabs.forEach((tab) => {
444
+ if (tab.getAttribute("aria-selected") === "true") {
445
+ tab.setAttribute("connotation", this.connotation);
446
+ } else {
447
+ tab.removeAttribute("connotation");
448
+ }
449
+ });
450
+ }
451
+ }
452
+ get #tabListWrapper() {
453
+ return this.shadowRoot.querySelector(".tablist-wrapper");
454
+ }
455
+ #scrollToIndex(index) {
456
+ const tab = this.tabs[index];
457
+ if (!tab)
458
+ return;
459
+ let left = 0;
460
+ let top = 0;
461
+ if (this.orientation === TabsOrientation.vertical) {
462
+ if (index === this.tabs.length - 1) {
463
+ top = this.#tabListWrapper.scrollHeight;
464
+ }
465
+ if (index > 0 && index < this.tabs.length - 1) {
466
+ top = tab.offsetTop - this.#tabListWrapper.offsetHeight / 2 + tab.offsetHeight / 2;
467
+ }
468
+ } else {
469
+ if (index === this.tabs.length - 1) {
470
+ left = this.#tabListWrapper.scrollWidth;
471
+ }
472
+ if (index > 0 && index < this.tabs.length - 1) {
473
+ left = tab.offsetLeft - this.#tabListWrapper.offsetWidth / 2 + tab.offsetWidth / 2;
474
+ }
475
+ }
476
+ this.#tabListWrapper.scrollTo({ top, left, behavior: "smooth" });
477
+ }
478
+ // adapted FAST fix https://github.com/microsoft/fast/pull/6606
479
+ #patchActiveID() {
480
+ if (!this.activetab)
481
+ return;
482
+ const idx = this.tabs.indexOf(this.activetab);
483
+ this.activeid = this["tabIds"][idx];
484
+ this.#updateTabsConnotation();
485
+ this.#scrollToIndex(idx);
23
486
  }
24
487
  }
25
488
  __decorateClass([
26
- index.attr({ attribute: "aria-label" })
27
- ], TagGroup.prototype, "ariaLabel", 2);
489
+ index.observable
490
+ ], Tabs.prototype, "tablist", 2);
491
+ __decorateClass([
492
+ index.attr
493
+ ], Tabs.prototype, "connotation", 2);
494
+ __decorateClass([
495
+ index.attr
496
+ ], Tabs.prototype, "gutters", 2);
497
+ __decorateClass([
498
+ index.attr({ mode: "boolean", attribute: "scrollable-panel" })
499
+ ], Tabs.prototype, "scrollablePanel", 2);
28
500
 
29
- const getClasses = (_) => classNames.classNames(
30
- "base"
501
+ const getClasses = ({
502
+ connotation,
503
+ orientation,
504
+ gutters,
505
+ scrollablePanel
506
+ }) => classNames.classNames(
507
+ "base",
508
+ [`connotation-${connotation}`, Boolean(connotation)],
509
+ [`orientation-${orientation}`, Boolean(orientation)],
510
+ [`gutters-${gutters}`, Boolean(gutters)],
511
+ ["scroll", Boolean(scrollablePanel)]
31
512
  );
32
- const TagGroupTemplate = () => {
513
+ function TabsTemplate() {
33
514
  return index.html`
34
- <div class="${getClasses}" role="listbox" aria-orientation="horizontal" aria-label="${(x) => x.ariaLabel}">
35
- <slot></slot>
36
- </div>
515
+ <template>
516
+ <div class="${getClasses}">
517
+ <div class="tablist-wrapper">
518
+ <div class="tablist" role="tablist" ${ref.ref("tablist")}>
519
+ <slot name="tab" ${slotted.slotted("tabs")}></slot>
520
+ ${when.when(
521
+ (x) => x.showActiveIndicator,
522
+ index.html`
523
+ <div
524
+ ${ref.ref("activeIndicatorRef")}
525
+ class="active-indicator"
526
+ ></div>
527
+ `
528
+ )}
529
+ </div>
530
+ </div>
531
+ <div class="tabpanel">
532
+ <slot name="tabpanel" ${slotted.slotted("tabpanels")}></slot>
533
+ </div>
534
+ </div>
535
+ </template>
37
536
  `;
38
- };
537
+ }
39
538
 
40
- const tagGroupDefinition = TagGroup.compose(
41
- {
42
- baseName: "tag-group",
43
- template: TagGroupTemplate,
44
- styles
45
- }
46
- );
47
- const tagGroupRegistries = [tagGroupDefinition()];
48
- const registerTagGroup = index.registerFactory(tagGroupRegistries);
539
+ const tabsDefinition = Tabs.compose({
540
+ baseName: "tabs",
541
+ template: TabsTemplate,
542
+ styles
543
+ });
544
+ const tabsRegistries = [
545
+ tabsDefinition(),
546
+ ...definition.tabRegistries,
547
+ ...definition$1.tabPanelRegistries
548
+ ];
549
+ const registerTabs = index.registerFactory(tabsRegistries);
49
550
 
50
- exports.registerTagGroup = registerTagGroup;
51
- exports.tagGroupDefinition = tagGroupDefinition;
52
- exports.tagGroupRegistries = tagGroupRegistries;
551
+ exports.registerTabs = registerTabs;
552
+ exports.tabsDefinition = tabsDefinition;
553
+ exports.tabsRegistries = tabsRegistries;