@vonage/vivid 3.52.0 → 3.54.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 (299) hide show
  1. package/README.md +1 -1
  2. package/accordion/index.cjs +1 -1
  3. package/accordion/index.js +1 -1
  4. package/accordion-item/index.cjs +1 -1
  5. package/accordion-item/index.js +1 -1
  6. package/alert/index.cjs +3 -3
  7. package/alert/index.js +3 -3
  8. package/appearance-ui/index.cjs +1 -1
  9. package/appearance-ui/index.js +1 -1
  10. package/audio-player/index.cjs +3 -3
  11. package/audio-player/index.js +3 -3
  12. package/avatar/index.cjs +1 -1
  13. package/avatar/index.js +1 -1
  14. package/badge/index.cjs +1 -1
  15. package/badge/index.js +1 -1
  16. package/banner/index.cjs +2 -2
  17. package/banner/index.js +2 -2
  18. package/breadcrumb-item/index.cjs +1 -1
  19. package/breadcrumb-item/index.js +1 -1
  20. package/button/index.cjs +2 -2
  21. package/button/index.js +2 -2
  22. package/card/index.cjs +2 -2
  23. package/card/index.js +2 -2
  24. package/checkbox/index.cjs +3 -2
  25. package/checkbox/index.js +3 -2
  26. package/combobox/index.cjs +5 -5
  27. package/combobox/index.js +5 -5
  28. package/custom-elements.json +1162 -99
  29. package/data-grid/index.cjs +1 -1
  30. package/data-grid/index.js +1 -1
  31. package/date-picker/index.cjs +7 -6
  32. package/date-picker/index.js +7 -6
  33. package/date-range-picker/index.cjs +7 -6
  34. package/date-range-picker/index.js +7 -6
  35. package/dial-pad/index.cjs +33 -0
  36. package/dial-pad/index.js +31 -0
  37. package/dialog/index.cjs +4 -4
  38. package/dialog/index.js +4 -4
  39. package/divider/index.cjs +1 -1
  40. package/divider/index.js +1 -1
  41. package/elevation/index.cjs +1 -1
  42. package/elevation/index.js +1 -1
  43. package/empty-state/index.cjs +2 -2
  44. package/empty-state/index.js +2 -2
  45. package/fab/index.cjs +2 -2
  46. package/fab/index.js +2 -2
  47. package/file-picker/index.cjs +4 -3
  48. package/file-picker/index.js +4 -3
  49. package/header/index.cjs +2 -2
  50. package/header/index.js +2 -2
  51. package/icon/index.cjs +1 -1
  52. package/icon/index.js +1 -1
  53. package/index.cjs +132 -122
  54. package/index.js +46 -43
  55. package/layout/index.cjs +1 -1
  56. package/layout/index.js +1 -1
  57. package/lib/appearance-ui/appearance-ui.d.ts +1 -1
  58. package/lib/audio-player/audio-player.d.ts +4 -0
  59. package/lib/audio-player/locale.d.ts +2 -0
  60. package/lib/components.d.ts +2 -0
  61. package/lib/dial-pad/definition.d.ts +3 -0
  62. package/lib/dial-pad/dial-pad.d.ts +17 -0
  63. package/lib/dial-pad/dial-pad.template.d.ts +4 -0
  64. package/lib/dial-pad/locale.d.ts +18 -0
  65. package/lib/enums.d.ts +7 -0
  66. package/lib/menu/menu.d.ts +1 -0
  67. package/lib/nav-disclosure/nav-disclosure.d.ts +5 -0
  68. package/lib/text-anchor/definition.d.ts +1 -0
  69. package/lib/text-anchor/text-anchor.d.ts +5 -0
  70. package/lib/video-player/definition.d.ts +3 -0
  71. package/lib/video-player/locale.d.ts +1 -0
  72. package/lib/video-player/video-player.d.ts +17 -0
  73. package/lib/video-player/video-player.template.d.ts +4 -0
  74. package/lib/video-player/vivid-video-svg.d.ts +1 -0
  75. package/listbox/index.cjs +2 -2
  76. package/listbox/index.js +2 -2
  77. package/locales/en-GB.cjs +33 -1
  78. package/locales/en-GB.js +33 -1
  79. package/locales/en-US.cjs +201 -1
  80. package/locales/en-US.js +201 -1
  81. package/locales/ja-JP.cjs +200 -1
  82. package/locales/ja-JP.js +200 -1
  83. package/locales/zh-CN.cjs +202 -1
  84. package/locales/zh-CN.js +202 -1
  85. package/menu/index.cjs +6 -6
  86. package/menu/index.js +6 -6
  87. package/menu-item/index.cjs +2 -2
  88. package/menu-item/index.js +2 -2
  89. package/nav/index.cjs +1 -1
  90. package/nav/index.js +1 -1
  91. package/nav-disclosure/index.cjs +2 -2
  92. package/nav-disclosure/index.js +2 -2
  93. package/nav-item/index.cjs +2 -2
  94. package/nav-item/index.js +2 -2
  95. package/note/index.cjs +2 -2
  96. package/note/index.js +2 -2
  97. package/number-field/index.cjs +5 -4
  98. package/number-field/index.js +5 -4
  99. package/option/index.cjs +2 -2
  100. package/option/index.js +2 -2
  101. package/package.json +1 -1
  102. package/pagination/index.cjs +3 -3
  103. package/pagination/index.js +3 -3
  104. package/popup/index.cjs +4 -4
  105. package/popup/index.js +4 -4
  106. package/progress/index.cjs +1 -1
  107. package/progress/index.js +1 -1
  108. package/progress-ring/index.cjs +1 -1
  109. package/progress-ring/index.js +1 -1
  110. package/radio/index.cjs +1 -1
  111. package/radio/index.js +1 -1
  112. package/radio-group/index.cjs +1 -1
  113. package/radio-group/index.js +1 -1
  114. package/range-slider/index.cjs +2 -2
  115. package/range-slider/index.js +2 -2
  116. package/select/index.cjs +7 -6
  117. package/select/index.js +7 -6
  118. package/selectable-box/index.cjs +5 -4
  119. package/selectable-box/index.js +5 -4
  120. package/shared/applyMixinsWithObservables.cjs +15 -0
  121. package/shared/applyMixinsWithObservables.js +13 -0
  122. package/shared/definition.cjs +1 -1
  123. package/shared/definition.js +1 -1
  124. package/shared/definition11.cjs +3 -3
  125. package/shared/definition11.js +3 -3
  126. package/shared/definition14.cjs +2 -2
  127. package/shared/definition14.js +2 -2
  128. package/shared/definition15.cjs +8 -9
  129. package/shared/definition15.js +8 -9
  130. package/shared/definition16.cjs +3 -3
  131. package/shared/definition16.js +3 -3
  132. package/shared/definition17.cjs +2 -2
  133. package/shared/definition17.js +3 -3
  134. package/shared/definition18.cjs +3 -3
  135. package/shared/definition18.js +3 -3
  136. package/shared/definition19.cjs +3 -3
  137. package/shared/definition19.js +3 -3
  138. package/shared/definition20.cjs +196 -224
  139. package/shared/definition20.js +191 -219
  140. package/shared/definition21.cjs +264 -67
  141. package/shared/definition21.js +263 -65
  142. package/shared/definition22.cjs +66 -57
  143. package/shared/definition22.js +64 -56
  144. package/shared/definition23.cjs +42 -76
  145. package/shared/definition23.js +41 -75
  146. package/shared/definition24.cjs +70 -2402
  147. package/shared/definition24.js +69 -2401
  148. package/shared/definition25.cjs +2402 -46
  149. package/shared/definition25.js +2401 -45
  150. package/shared/definition26.cjs +63 -30
  151. package/shared/definition26.js +62 -29
  152. package/shared/definition27.cjs +28 -56
  153. package/shared/definition27.js +27 -55
  154. package/shared/definition28.cjs +35 -881
  155. package/shared/definition28.js +34 -879
  156. package/shared/definition29.cjs +922 -60
  157. package/shared/definition29.js +922 -61
  158. package/shared/definition30.cjs +68 -86
  159. package/shared/definition30.js +67 -85
  160. package/shared/definition31.cjs +98 -21
  161. package/shared/definition31.js +98 -21
  162. package/shared/definition32.cjs +24 -12
  163. package/shared/definition32.js +23 -11
  164. package/shared/definition33.cjs +11 -50
  165. package/shared/definition33.js +10 -49
  166. package/shared/definition34.cjs +26 -515
  167. package/shared/definition34.js +26 -515
  168. package/shared/definition35.cjs +448 -194
  169. package/shared/definition35.js +448 -192
  170. package/shared/definition36.cjs +256 -202
  171. package/shared/definition36.js +253 -201
  172. package/shared/definition37.cjs +204 -65
  173. package/shared/definition37.js +203 -63
  174. package/shared/definition38.cjs +63 -57
  175. package/shared/definition38.js +60 -55
  176. package/shared/definition39.cjs +65 -432
  177. package/shared/definition39.js +64 -431
  178. package/shared/definition4.cjs +2 -2
  179. package/shared/definition4.js +2 -2
  180. package/shared/definition40.cjs +441 -34
  181. package/shared/definition40.js +438 -31
  182. package/shared/definition41.cjs +34 -576
  183. package/shared/definition41.js +33 -575
  184. package/shared/definition42.cjs +531 -654
  185. package/shared/definition42.js +531 -654
  186. package/shared/definition43.cjs +690 -114
  187. package/shared/definition43.js +689 -113
  188. package/shared/definition44.cjs +124 -79
  189. package/shared/definition44.js +122 -77
  190. package/shared/definition45.cjs +78 -520
  191. package/shared/definition45.js +77 -518
  192. package/shared/definition46.cjs +520 -119
  193. package/shared/definition46.js +518 -118
  194. package/shared/definition47.cjs +118 -135
  195. package/shared/definition47.js +117 -134
  196. package/shared/definition48.cjs +151 -19
  197. package/shared/definition48.js +150 -18
  198. package/shared/definition49.cjs +21 -84
  199. package/shared/definition49.js +20 -83
  200. package/shared/definition5.cjs +100 -19
  201. package/shared/definition5.js +100 -19
  202. package/shared/definition50.cjs +52 -505
  203. package/shared/definition50.js +51 -504
  204. package/shared/definition51.cjs +526 -28
  205. package/shared/definition51.js +525 -27
  206. package/shared/definition52.cjs +28 -123
  207. package/shared/definition52.js +26 -122
  208. package/shared/definition53.cjs +110 -309
  209. package/shared/definition53.js +110 -308
  210. package/shared/definition54.cjs +255 -271
  211. package/shared/definition54.js +255 -271
  212. package/shared/definition55.cjs +315 -776
  213. package/shared/definition55.js +314 -775
  214. package/shared/definition56.cjs +818 -107
  215. package/shared/definition56.js +817 -106
  216. package/shared/definition57.cjs +85 -55
  217. package/shared/definition57.js +84 -54
  218. package/shared/definition58.cjs +125 -72
  219. package/shared/definition58.js +124 -71
  220. package/shared/definition59.cjs +72 -285
  221. package/shared/definition59.js +73 -286
  222. package/shared/definition6.cjs +1 -1
  223. package/shared/definition6.js +1 -1
  224. package/shared/definition60.cjs +298 -39
  225. package/shared/definition60.js +297 -38
  226. package/shared/definition61.cjs +66044 -1687
  227. package/shared/definition61.js +66043 -1686
  228. package/shared/definition62.cjs +50 -0
  229. package/shared/definition62.js +46 -0
  230. package/shared/definition63.cjs +1828 -0
  231. package/shared/definition63.js +1824 -0
  232. package/shared/definition7.cjs +2 -2
  233. package/shared/definition7.js +2 -2
  234. package/shared/definition8.cjs +2 -2
  235. package/shared/definition8.js +2 -2
  236. package/shared/definition9.cjs +1 -1
  237. package/shared/definition9.js +1 -1
  238. package/shared/enums.cjs +9 -0
  239. package/shared/enums.js +9 -1
  240. package/shared/icon.cjs +20 -2
  241. package/shared/icon.js +21 -3
  242. package/shared/index2.cjs +73 -37
  243. package/shared/index2.js +73 -37
  244. package/shared/key-codes2.js +1 -1
  245. package/shared/listbox.cjs +1 -1
  246. package/shared/listbox.js +1 -1
  247. package/shared/localization/Locale.d.ts +4 -0
  248. package/shared/patterns/form-elements/form-elements.d.ts +2 -3
  249. package/shared/presentationDate.cjs +16 -5
  250. package/shared/presentationDate.js +16 -5
  251. package/shared/text-anchor.cjs +6 -0
  252. package/shared/text-anchor.js +6 -0
  253. package/shared/text-anchor.template.cjs +6 -1
  254. package/shared/text-anchor.template.js +6 -1
  255. package/shared/text-field.cjs +1 -1
  256. package/shared/text-field.js +1 -1
  257. package/shared/utils/applyMixinsWithObservables.d.ts +1 -0
  258. package/shared/utils/numberConverter.d.ts +2 -0
  259. package/side-drawer/index.cjs +1 -1
  260. package/side-drawer/index.js +1 -1
  261. package/slider/index.cjs +1 -1
  262. package/slider/index.js +1 -1
  263. package/split-button/index.cjs +2 -2
  264. package/split-button/index.js +2 -2
  265. package/styles/core/all.css +1 -1
  266. package/styles/core/theme.css +1 -1
  267. package/styles/core/typography.css +1 -1
  268. package/styles/tokens/theme-dark.css +4 -4
  269. package/styles/tokens/theme-light.css +4 -4
  270. package/styles/tokens/vivid-2-compat.css +1 -1
  271. package/switch/index.cjs +2 -2
  272. package/switch/index.js +2 -2
  273. package/tab/index.cjs +2 -2
  274. package/tab/index.js +2 -2
  275. package/tab-panel/index.cjs +1 -1
  276. package/tab-panel/index.js +1 -1
  277. package/tabs/index.cjs +4 -4
  278. package/tabs/index.js +4 -4
  279. package/tag/index.cjs +2 -2
  280. package/tag/index.js +2 -2
  281. package/tag-group/index.cjs +1 -1
  282. package/tag-group/index.js +1 -1
  283. package/text-area/index.cjs +4 -3
  284. package/text-area/index.js +4 -3
  285. package/text-field/index.cjs +4 -3
  286. package/text-field/index.js +4 -3
  287. package/time-picker/index.cjs +8 -7
  288. package/time-picker/index.js +8 -7
  289. package/toggletip/index.cjs +5 -5
  290. package/toggletip/index.js +5 -5
  291. package/tooltip/index.cjs +5 -5
  292. package/tooltip/index.js +5 -5
  293. package/tree-item/index.cjs +2 -2
  294. package/tree-item/index.js +2 -2
  295. package/tree-view/index.cjs +1 -1
  296. package/tree-view/index.js +1 -1
  297. package/video-player/index.cjs +17 -0
  298. package/video-player/index.js +15 -0
  299. package/vivid.api.json +332 -0
@@ -1,50 +1,309 @@
1
1
  'use strict';
2
2
 
3
3
  const index = require('./index.cjs');
4
+ const treeItem = require('./tree-item.cjs');
5
+ const dom = require('./dom.cjs');
6
+ const keyCodes = require('./key-codes.cjs');
7
+ const ref = require('./ref.cjs');
8
+ const slotted = require('./slotted.cjs');
4
9
  const classNames = require('./class-names.cjs');
5
10
 
6
- var __defProp = Object.defineProperty;
7
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
8
- var __decorateClass = (decorators, target, key, kind) => {
9
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
10
- for (var i = decorators.length - 1, decorator; i >= 0; i--)
11
- if (decorator = decorators[i])
12
- result = (kind ? decorator(target, key, result) : decorator(result)) || result;
13
- if (kind && result)
14
- __defProp(target, key, result);
15
- return result;
11
+ /**
12
+ * A Tree view Custom HTML Element.
13
+ * Implements the {@link https://w3c.github.io/aria-practices/#TreeView | ARIA TreeView }.
14
+ *
15
+ * @slot - The default slot for tree items
16
+ *
17
+ * @public
18
+ */
19
+ let TreeView$1 = class TreeView extends index.FoundationElement {
20
+ constructor() {
21
+ super(...arguments);
22
+ /**
23
+ * The tree item that is designated to be in the tab queue.
24
+ *
25
+ * @internal
26
+ */
27
+ this.currentFocused = null;
28
+ /**
29
+ * Handle focus events
30
+ *
31
+ * @internal
32
+ */
33
+ this.handleFocus = (e) => {
34
+ if (this.slottedTreeItems.length < 1) {
35
+ // no child items, nothing to do
36
+ return;
37
+ }
38
+ if (e.target === this) {
39
+ if (this.currentFocused === null) {
40
+ this.currentFocused = this.getValidFocusableItem();
41
+ }
42
+ if (this.currentFocused !== null) {
43
+ treeItem.TreeItem.focusItem(this.currentFocused);
44
+ }
45
+ return;
46
+ }
47
+ if (this.contains(e.target)) {
48
+ this.setAttribute("tabindex", "-1");
49
+ this.currentFocused = e.target;
50
+ }
51
+ };
52
+ /**
53
+ * Handle blur events
54
+ *
55
+ * @internal
56
+ */
57
+ this.handleBlur = (e) => {
58
+ if (e.target instanceof HTMLElement &&
59
+ (e.relatedTarget === null || !this.contains(e.relatedTarget))) {
60
+ this.setAttribute("tabindex", "0");
61
+ }
62
+ };
63
+ /**
64
+ * KeyDown handler
65
+ *
66
+ * @internal
67
+ */
68
+ this.handleKeyDown = (e) => {
69
+ if (e.defaultPrevented) {
70
+ return;
71
+ }
72
+ if (this.slottedTreeItems.length < 1) {
73
+ return true;
74
+ }
75
+ const treeItems = this.getVisibleNodes();
76
+ switch (e.key) {
77
+ case keyCodes.keyHome:
78
+ if (treeItems.length) {
79
+ treeItem.TreeItem.focusItem(treeItems[0]);
80
+ }
81
+ return;
82
+ case keyCodes.keyEnd:
83
+ if (treeItems.length) {
84
+ treeItem.TreeItem.focusItem(treeItems[treeItems.length - 1]);
85
+ }
86
+ return;
87
+ case keyCodes.keyArrowLeft:
88
+ if (e.target && this.isFocusableElement(e.target)) {
89
+ const item = e.target;
90
+ if (item instanceof treeItem.TreeItem &&
91
+ item.childItemLength() > 0 &&
92
+ item.expanded) {
93
+ item.expanded = false;
94
+ }
95
+ else if (item instanceof treeItem.TreeItem &&
96
+ item.parentElement instanceof treeItem.TreeItem) {
97
+ treeItem.TreeItem.focusItem(item.parentElement);
98
+ }
99
+ }
100
+ return false;
101
+ case keyCodes.keyArrowRight:
102
+ if (e.target && this.isFocusableElement(e.target)) {
103
+ const item = e.target;
104
+ if (item instanceof treeItem.TreeItem &&
105
+ item.childItemLength() > 0 &&
106
+ !item.expanded) {
107
+ item.expanded = true;
108
+ }
109
+ else if (item instanceof treeItem.TreeItem && item.childItemLength() > 0) {
110
+ this.focusNextNode(1, e.target);
111
+ }
112
+ }
113
+ return;
114
+ case keyCodes.keyArrowDown:
115
+ if (e.target && this.isFocusableElement(e.target)) {
116
+ this.focusNextNode(1, e.target);
117
+ }
118
+ return;
119
+ case keyCodes.keyArrowUp:
120
+ if (e.target && this.isFocusableElement(e.target)) {
121
+ this.focusNextNode(-1, e.target);
122
+ }
123
+ return;
124
+ case keyCodes.keyEnter:
125
+ // In single-select trees where selection does not follow focus (see note below),
126
+ // the default action is typically to select the focused node.
127
+ this.handleClick(e);
128
+ return;
129
+ }
130
+ // don't prevent default if we took no action
131
+ return true;
132
+ };
133
+ /**
134
+ * Handles the selected-changed events bubbling up
135
+ * from child tree items
136
+ *
137
+ * @internal
138
+ */
139
+ this.handleSelectedChange = (e) => {
140
+ if (e.defaultPrevented) {
141
+ return;
142
+ }
143
+ if (!(e.target instanceof Element) || !treeItem.isTreeItemElement(e.target)) {
144
+ return true;
145
+ }
146
+ const item = e.target;
147
+ if (item.selected) {
148
+ if (this.currentSelected && this.currentSelected !== item) {
149
+ this.currentSelected.selected = false;
150
+ }
151
+ // new selected item
152
+ this.currentSelected = item;
153
+ }
154
+ else if (!item.selected && this.currentSelected === item) {
155
+ // selected item deselected
156
+ this.currentSelected = null;
157
+ }
158
+ return;
159
+ };
160
+ /**
161
+ * Updates the tree view when slottedTreeItems changes
162
+ */
163
+ this.setItems = () => {
164
+ // force single selection
165
+ // defaults to first one found
166
+ const selectedItem = this.treeView.querySelector("[aria-selected='true']");
167
+ this.currentSelected = selectedItem;
168
+ // invalidate the current focused item if it is no longer valid
169
+ if (this.currentFocused === null || !this.contains(this.currentFocused)) {
170
+ this.currentFocused = this.getValidFocusableItem();
171
+ }
172
+ // toggle properties on child elements
173
+ this.nested = this.checkForNestedItems();
174
+ const treeItems = this.getVisibleNodes();
175
+ treeItems.forEach(node => {
176
+ if (treeItem.isTreeItemElement(node)) {
177
+ node.nested = this.nested;
178
+ }
179
+ });
180
+ };
181
+ /**
182
+ * check if the item is focusable
183
+ */
184
+ this.isFocusableElement = (el) => {
185
+ return treeItem.isTreeItemElement(el);
186
+ };
187
+ this.isSelectedElement = (el) => {
188
+ return el.selected;
189
+ };
190
+ }
191
+ slottedTreeItemsChanged() {
192
+ if (this.$fastController.isConnected) {
193
+ // update for slotted children change
194
+ this.setItems();
195
+ }
196
+ }
197
+ connectedCallback() {
198
+ super.connectedCallback();
199
+ this.setAttribute("tabindex", "0");
200
+ index.DOM.queueUpdate(() => {
201
+ this.setItems();
202
+ });
203
+ }
204
+ /**
205
+ * Handles click events bubbling up
206
+ *
207
+ * @internal
208
+ */
209
+ handleClick(e) {
210
+ if (e.defaultPrevented) {
211
+ // handled, do nothing
212
+ return;
213
+ }
214
+ if (!(e.target instanceof Element) || !treeItem.isTreeItemElement(e.target)) {
215
+ // not a tree item, ignore
216
+ return true;
217
+ }
218
+ const item = e.target;
219
+ if (!item.disabled) {
220
+ item.selected = !item.selected;
221
+ }
222
+ return;
223
+ }
224
+ /**
225
+ * Move focus to a tree item based on its offset from the provided item
226
+ */
227
+ focusNextNode(delta, item) {
228
+ const visibleNodes = this.getVisibleNodes();
229
+ if (!visibleNodes) {
230
+ return;
231
+ }
232
+ const focusItem = visibleNodes[visibleNodes.indexOf(item) + delta];
233
+ if (dom.isHTMLElement(focusItem)) {
234
+ treeItem.TreeItem.focusItem(focusItem);
235
+ }
236
+ }
237
+ /**
238
+ * checks if there are any nested tree items
239
+ */
240
+ getValidFocusableItem() {
241
+ const treeItems = this.getVisibleNodes();
242
+ // default to selected element if there is one
243
+ let focusIndex = treeItems.findIndex(this.isSelectedElement);
244
+ if (focusIndex === -1) {
245
+ // otherwise first focusable tree item
246
+ focusIndex = treeItems.findIndex(this.isFocusableElement);
247
+ }
248
+ if (focusIndex !== -1) {
249
+ return treeItems[focusIndex];
250
+ }
251
+ return null;
252
+ }
253
+ /**
254
+ * checks if there are any nested tree items
255
+ */
256
+ checkForNestedItems() {
257
+ return this.slottedTreeItems.some((node) => {
258
+ return treeItem.isTreeItemElement(node) && node.querySelector("[role='treeitem']");
259
+ });
260
+ }
261
+ getVisibleNodes() {
262
+ return dom.getDisplayedNodes(this, "[role='treeitem']") || [];
263
+ }
16
264
  };
17
- class Elevation extends index.FoundationElement {
265
+ index.__decorate([
266
+ index.attr({ attribute: "render-collapsed-nodes" })
267
+ ], TreeView$1.prototype, "renderCollapsedNodes", void 0);
268
+ index.__decorate([
269
+ index.observable
270
+ ], TreeView$1.prototype, "currentSelected", void 0);
271
+ index.__decorate([
272
+ index.observable
273
+ ], TreeView$1.prototype, "slottedTreeItems", void 0);
274
+
275
+ const styles = ".control{position:relative;display:flex;flex-direction:column;gap:4px}\n";
276
+
277
+ class TreeView extends TreeView$1 {
18
278
  }
19
- __decorateClass([
20
- index.attr
21
- ], Elevation.prototype, "dp", 2);
22
- __decorateClass([
23
- index.attr({ attribute: "no-shadow", mode: "boolean" })
24
- ], Elevation.prototype, "noShadow", 2);
25
279
 
26
- const styles = ":host{display:contents}.control{display:contents}.control.dp-0{--_elevation-fill: var(--vvd-color-surface-0dp);--_elevation-shadow: var(--vvd-shadow-surface-0dp)}.control.dp-4{--_elevation-fill: var(--vvd-color-surface-4dp);--_elevation-shadow: var(--vvd-shadow-surface-4dp)}.control.dp-8{--_elevation-fill: var(--vvd-color-surface-8dp);--_elevation-shadow: var(--vvd-shadow-surface-8dp)}.control.dp-12{--_elevation-fill: var(--vvd-color-surface-12dp);--_elevation-shadow: var(--vvd-shadow-surface-12dp)}.control.dp-16{--_elevation-fill: var(--vvd-color-surface-16dp);--_elevation-shadow: var(--vvd-shadow-surface-16dp)}.control.dp-24{--_elevation-fill: var(--vvd-color-surface-24dp);--_elevation-shadow: var(--vvd-shadow-surface-24dp)}.control:not(.dp-0,.dp-4,.dp-8,.dp-12,.dp-16,.dp-24){--_elevation-fill: var(--vvd-color-surface-2dp);--_elevation-shadow: var(--vvd-shadow-surface-2dp)}.control ::slotted(*){position:relative;isolation:isolate}.control ::slotted(*):before{position:absolute;z-index:-1;border-radius:inherit;background:var(--_elevation-fill);block-size:100%;content:\"\";filter:var(--_elevation-shadow);inline-size:100%;inset-block-start:0;inset-inline-start:0;transition:background-color .15s linear,filter .15s linear}.control.no-shadow ::slotted(*):before{filter:none}\n";
280
+ const getClasses = (_) => classNames.classNames("control");
281
+ const TreeViewTemplate = () => {
282
+ return index.html` <template
283
+ role="tree"
284
+ ${ref.ref("treeView")}
285
+ @keydown="${(x, c) => x.handleKeyDown(c.event)}"
286
+ @focusin="${(x, c) => x.handleFocus(c.event)}"
287
+ @focusout="${(x, c) => x.handleBlur(c.event)}"
288
+ @click="${(x, c) => x.handleClick(c.event)}"
289
+ @selected-change="${(x, c) => x.handleSelectedChange(c.event)}"
290
+ >
291
+ <div class="${getClasses}">
292
+ <slot ${slotted.slotted("slottedTreeItems")}></slot>
293
+ </div>
294
+ </template>`;
295
+ };
27
296
 
28
- const getClasses = ({ dp, noShadow }) => classNames.classNames(
29
- "control",
30
- [`dp-${dp}`, Boolean(dp)],
31
- ["no-shadow", Boolean(noShadow)]
297
+ const treeViewDefinition = TreeView.compose(
298
+ {
299
+ baseName: "tree-view",
300
+ template: TreeViewTemplate,
301
+ styles
302
+ }
32
303
  );
33
- const elevationTemplate = () => index.html` <div
34
- class="${getClasses}"
35
- part="base"
36
- >
37
- <slot></slot>
38
- </div>`;
39
-
40
- const elevationDefinition = Elevation.compose({
41
- baseName: "elevation",
42
- template: elevationTemplate,
43
- styles
44
- });
45
- const elevationRegistries = [elevationDefinition()];
46
- const registerElevation = index.registerFactory(elevationRegistries);
304
+ const treeViewRegistries = [treeViewDefinition()];
305
+ const registerTreeView = index.registerFactory(treeViewRegistries);
47
306
 
48
- exports.Elevation = Elevation;
49
- exports.elevationRegistries = elevationRegistries;
50
- exports.registerElevation = registerElevation;
307
+ exports.registerTreeView = registerTreeView;
308
+ exports.treeViewDefinition = treeViewDefinition;
309
+ exports.treeViewRegistries = treeViewRegistries;
@@ -1,46 +1,305 @@
1
- import { a as attr, F as FoundationElement, h as html, r as registerFactory } from './index.js';
1
+ import { F as FoundationElement, D as DOM, _ as __decorate, a as attr, o as observable, h as html, r as registerFactory } from './index.js';
2
+ import { T as TreeItem$1, i as isTreeItemElement } from './tree-item.js';
3
+ import { i as isHTMLElement, g as getDisplayedNodes } from './dom.js';
4
+ import { k as keyEnter, e as keyArrowUp, f as keyArrowDown, h as keyArrowRight, i as keyArrowLeft, d as keyEnd, g as keyHome } from './key-codes.js';
5
+ import { r as ref } from './ref.js';
6
+ import { s as slotted } from './slotted.js';
2
7
  import { c as classNames } from './class-names.js';
3
8
 
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
- var __decorateClass = (decorators, target, key, kind) => {
7
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
8
- for (var i = decorators.length - 1, decorator; i >= 0; i--)
9
- if (decorator = decorators[i])
10
- result = (kind ? decorator(target, key, result) : decorator(result)) || result;
11
- if (kind && result)
12
- __defProp(target, key, result);
13
- return result;
9
+ /**
10
+ * A Tree view Custom HTML Element.
11
+ * Implements the {@link https://w3c.github.io/aria-practices/#TreeView | ARIA TreeView }.
12
+ *
13
+ * @slot - The default slot for tree items
14
+ *
15
+ * @public
16
+ */
17
+ let TreeView$1 = class TreeView extends FoundationElement {
18
+ constructor() {
19
+ super(...arguments);
20
+ /**
21
+ * The tree item that is designated to be in the tab queue.
22
+ *
23
+ * @internal
24
+ */
25
+ this.currentFocused = null;
26
+ /**
27
+ * Handle focus events
28
+ *
29
+ * @internal
30
+ */
31
+ this.handleFocus = (e) => {
32
+ if (this.slottedTreeItems.length < 1) {
33
+ // no child items, nothing to do
34
+ return;
35
+ }
36
+ if (e.target === this) {
37
+ if (this.currentFocused === null) {
38
+ this.currentFocused = this.getValidFocusableItem();
39
+ }
40
+ if (this.currentFocused !== null) {
41
+ TreeItem$1.focusItem(this.currentFocused);
42
+ }
43
+ return;
44
+ }
45
+ if (this.contains(e.target)) {
46
+ this.setAttribute("tabindex", "-1");
47
+ this.currentFocused = e.target;
48
+ }
49
+ };
50
+ /**
51
+ * Handle blur events
52
+ *
53
+ * @internal
54
+ */
55
+ this.handleBlur = (e) => {
56
+ if (e.target instanceof HTMLElement &&
57
+ (e.relatedTarget === null || !this.contains(e.relatedTarget))) {
58
+ this.setAttribute("tabindex", "0");
59
+ }
60
+ };
61
+ /**
62
+ * KeyDown handler
63
+ *
64
+ * @internal
65
+ */
66
+ this.handleKeyDown = (e) => {
67
+ if (e.defaultPrevented) {
68
+ return;
69
+ }
70
+ if (this.slottedTreeItems.length < 1) {
71
+ return true;
72
+ }
73
+ const treeItems = this.getVisibleNodes();
74
+ switch (e.key) {
75
+ case keyHome:
76
+ if (treeItems.length) {
77
+ TreeItem$1.focusItem(treeItems[0]);
78
+ }
79
+ return;
80
+ case keyEnd:
81
+ if (treeItems.length) {
82
+ TreeItem$1.focusItem(treeItems[treeItems.length - 1]);
83
+ }
84
+ return;
85
+ case keyArrowLeft:
86
+ if (e.target && this.isFocusableElement(e.target)) {
87
+ const item = e.target;
88
+ if (item instanceof TreeItem$1 &&
89
+ item.childItemLength() > 0 &&
90
+ item.expanded) {
91
+ item.expanded = false;
92
+ }
93
+ else if (item instanceof TreeItem$1 &&
94
+ item.parentElement instanceof TreeItem$1) {
95
+ TreeItem$1.focusItem(item.parentElement);
96
+ }
97
+ }
98
+ return false;
99
+ case keyArrowRight:
100
+ if (e.target && this.isFocusableElement(e.target)) {
101
+ const item = e.target;
102
+ if (item instanceof TreeItem$1 &&
103
+ item.childItemLength() > 0 &&
104
+ !item.expanded) {
105
+ item.expanded = true;
106
+ }
107
+ else if (item instanceof TreeItem$1 && item.childItemLength() > 0) {
108
+ this.focusNextNode(1, e.target);
109
+ }
110
+ }
111
+ return;
112
+ case keyArrowDown:
113
+ if (e.target && this.isFocusableElement(e.target)) {
114
+ this.focusNextNode(1, e.target);
115
+ }
116
+ return;
117
+ case keyArrowUp:
118
+ if (e.target && this.isFocusableElement(e.target)) {
119
+ this.focusNextNode(-1, e.target);
120
+ }
121
+ return;
122
+ case keyEnter:
123
+ // In single-select trees where selection does not follow focus (see note below),
124
+ // the default action is typically to select the focused node.
125
+ this.handleClick(e);
126
+ return;
127
+ }
128
+ // don't prevent default if we took no action
129
+ return true;
130
+ };
131
+ /**
132
+ * Handles the selected-changed events bubbling up
133
+ * from child tree items
134
+ *
135
+ * @internal
136
+ */
137
+ this.handleSelectedChange = (e) => {
138
+ if (e.defaultPrevented) {
139
+ return;
140
+ }
141
+ if (!(e.target instanceof Element) || !isTreeItemElement(e.target)) {
142
+ return true;
143
+ }
144
+ const item = e.target;
145
+ if (item.selected) {
146
+ if (this.currentSelected && this.currentSelected !== item) {
147
+ this.currentSelected.selected = false;
148
+ }
149
+ // new selected item
150
+ this.currentSelected = item;
151
+ }
152
+ else if (!item.selected && this.currentSelected === item) {
153
+ // selected item deselected
154
+ this.currentSelected = null;
155
+ }
156
+ return;
157
+ };
158
+ /**
159
+ * Updates the tree view when slottedTreeItems changes
160
+ */
161
+ this.setItems = () => {
162
+ // force single selection
163
+ // defaults to first one found
164
+ const selectedItem = this.treeView.querySelector("[aria-selected='true']");
165
+ this.currentSelected = selectedItem;
166
+ // invalidate the current focused item if it is no longer valid
167
+ if (this.currentFocused === null || !this.contains(this.currentFocused)) {
168
+ this.currentFocused = this.getValidFocusableItem();
169
+ }
170
+ // toggle properties on child elements
171
+ this.nested = this.checkForNestedItems();
172
+ const treeItems = this.getVisibleNodes();
173
+ treeItems.forEach(node => {
174
+ if (isTreeItemElement(node)) {
175
+ node.nested = this.nested;
176
+ }
177
+ });
178
+ };
179
+ /**
180
+ * check if the item is focusable
181
+ */
182
+ this.isFocusableElement = (el) => {
183
+ return isTreeItemElement(el);
184
+ };
185
+ this.isSelectedElement = (el) => {
186
+ return el.selected;
187
+ };
188
+ }
189
+ slottedTreeItemsChanged() {
190
+ if (this.$fastController.isConnected) {
191
+ // update for slotted children change
192
+ this.setItems();
193
+ }
194
+ }
195
+ connectedCallback() {
196
+ super.connectedCallback();
197
+ this.setAttribute("tabindex", "0");
198
+ DOM.queueUpdate(() => {
199
+ this.setItems();
200
+ });
201
+ }
202
+ /**
203
+ * Handles click events bubbling up
204
+ *
205
+ * @internal
206
+ */
207
+ handleClick(e) {
208
+ if (e.defaultPrevented) {
209
+ // handled, do nothing
210
+ return;
211
+ }
212
+ if (!(e.target instanceof Element) || !isTreeItemElement(e.target)) {
213
+ // not a tree item, ignore
214
+ return true;
215
+ }
216
+ const item = e.target;
217
+ if (!item.disabled) {
218
+ item.selected = !item.selected;
219
+ }
220
+ return;
221
+ }
222
+ /**
223
+ * Move focus to a tree item based on its offset from the provided item
224
+ */
225
+ focusNextNode(delta, item) {
226
+ const visibleNodes = this.getVisibleNodes();
227
+ if (!visibleNodes) {
228
+ return;
229
+ }
230
+ const focusItem = visibleNodes[visibleNodes.indexOf(item) + delta];
231
+ if (isHTMLElement(focusItem)) {
232
+ TreeItem$1.focusItem(focusItem);
233
+ }
234
+ }
235
+ /**
236
+ * checks if there are any nested tree items
237
+ */
238
+ getValidFocusableItem() {
239
+ const treeItems = this.getVisibleNodes();
240
+ // default to selected element if there is one
241
+ let focusIndex = treeItems.findIndex(this.isSelectedElement);
242
+ if (focusIndex === -1) {
243
+ // otherwise first focusable tree item
244
+ focusIndex = treeItems.findIndex(this.isFocusableElement);
245
+ }
246
+ if (focusIndex !== -1) {
247
+ return treeItems[focusIndex];
248
+ }
249
+ return null;
250
+ }
251
+ /**
252
+ * checks if there are any nested tree items
253
+ */
254
+ checkForNestedItems() {
255
+ return this.slottedTreeItems.some((node) => {
256
+ return isTreeItemElement(node) && node.querySelector("[role='treeitem']");
257
+ });
258
+ }
259
+ getVisibleNodes() {
260
+ return getDisplayedNodes(this, "[role='treeitem']") || [];
261
+ }
14
262
  };
15
- class Elevation extends FoundationElement {
263
+ __decorate([
264
+ attr({ attribute: "render-collapsed-nodes" })
265
+ ], TreeView$1.prototype, "renderCollapsedNodes", void 0);
266
+ __decorate([
267
+ observable
268
+ ], TreeView$1.prototype, "currentSelected", void 0);
269
+ __decorate([
270
+ observable
271
+ ], TreeView$1.prototype, "slottedTreeItems", void 0);
272
+
273
+ const styles = ".control{position:relative;display:flex;flex-direction:column;gap:4px}\n";
274
+
275
+ class TreeView extends TreeView$1 {
16
276
  }
17
- __decorateClass([
18
- attr
19
- ], Elevation.prototype, "dp", 2);
20
- __decorateClass([
21
- attr({ attribute: "no-shadow", mode: "boolean" })
22
- ], Elevation.prototype, "noShadow", 2);
23
277
 
24
- const styles = ":host{display:contents}.control{display:contents}.control.dp-0{--_elevation-fill: var(--vvd-color-surface-0dp);--_elevation-shadow: var(--vvd-shadow-surface-0dp)}.control.dp-4{--_elevation-fill: var(--vvd-color-surface-4dp);--_elevation-shadow: var(--vvd-shadow-surface-4dp)}.control.dp-8{--_elevation-fill: var(--vvd-color-surface-8dp);--_elevation-shadow: var(--vvd-shadow-surface-8dp)}.control.dp-12{--_elevation-fill: var(--vvd-color-surface-12dp);--_elevation-shadow: var(--vvd-shadow-surface-12dp)}.control.dp-16{--_elevation-fill: var(--vvd-color-surface-16dp);--_elevation-shadow: var(--vvd-shadow-surface-16dp)}.control.dp-24{--_elevation-fill: var(--vvd-color-surface-24dp);--_elevation-shadow: var(--vvd-shadow-surface-24dp)}.control:not(.dp-0,.dp-4,.dp-8,.dp-12,.dp-16,.dp-24){--_elevation-fill: var(--vvd-color-surface-2dp);--_elevation-shadow: var(--vvd-shadow-surface-2dp)}.control ::slotted(*){position:relative;isolation:isolate}.control ::slotted(*):before{position:absolute;z-index:-1;border-radius:inherit;background:var(--_elevation-fill);block-size:100%;content:\"\";filter:var(--_elevation-shadow);inline-size:100%;inset-block-start:0;inset-inline-start:0;transition:background-color .15s linear,filter .15s linear}.control.no-shadow ::slotted(*):before{filter:none}\n";
278
+ const getClasses = (_) => classNames("control");
279
+ const TreeViewTemplate = () => {
280
+ return html` <template
281
+ role="tree"
282
+ ${ref("treeView")}
283
+ @keydown="${(x, c) => x.handleKeyDown(c.event)}"
284
+ @focusin="${(x, c) => x.handleFocus(c.event)}"
285
+ @focusout="${(x, c) => x.handleBlur(c.event)}"
286
+ @click="${(x, c) => x.handleClick(c.event)}"
287
+ @selected-change="${(x, c) => x.handleSelectedChange(c.event)}"
288
+ >
289
+ <div class="${getClasses}">
290
+ <slot ${slotted("slottedTreeItems")}></slot>
291
+ </div>
292
+ </template>`;
293
+ };
25
294
 
26
- const getClasses = ({ dp, noShadow }) => classNames(
27
- "control",
28
- [`dp-${dp}`, Boolean(dp)],
29
- ["no-shadow", Boolean(noShadow)]
295
+ const treeViewDefinition = TreeView.compose(
296
+ {
297
+ baseName: "tree-view",
298
+ template: TreeViewTemplate,
299
+ styles
300
+ }
30
301
  );
31
- const elevationTemplate = () => html` <div
32
- class="${getClasses}"
33
- part="base"
34
- >
35
- <slot></slot>
36
- </div>`;
37
-
38
- const elevationDefinition = Elevation.compose({
39
- baseName: "elevation",
40
- template: elevationTemplate,
41
- styles
42
- });
43
- const elevationRegistries = [elevationDefinition()];
44
- const registerElevation = registerFactory(elevationRegistries);
302
+ const treeViewRegistries = [treeViewDefinition()];
303
+ const registerTreeView = registerFactory(treeViewRegistries);
45
304
 
46
- export { Elevation as E, elevationRegistries as e, registerElevation as r };
305
+ export { treeViewRegistries as a, registerTreeView as r, treeViewDefinition as t };