@vonage/vivid 4.16.2 → 4.17.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 (292) hide show
  1. package/custom-elements.json +3426 -506
  2. package/elevation/index.cjs +1 -1
  3. package/elevation/index.js +1 -1
  4. package/index.cjs +147 -39
  5. package/index.js +64 -59
  6. package/lib/accordion/definition.d.ts +2 -0
  7. package/lib/accordion-item/definition.d.ts +2 -0
  8. package/lib/action-group/definition.d.ts +2 -0
  9. package/lib/alert/definition.d.ts +2 -0
  10. package/lib/audio-player/definition.d.ts +2 -0
  11. package/lib/avatar/definition.d.ts +2 -0
  12. package/lib/badge/definition.d.ts +2 -0
  13. package/lib/banner/definition.d.ts +2 -0
  14. package/lib/breadcrumb/definition.d.ts +2 -0
  15. package/lib/breadcrumb-item/definition.d.ts +2 -0
  16. package/lib/button/definition.d.ts +2 -0
  17. package/lib/calendar/calendar.d.ts +2 -0
  18. package/lib/calendar/definition.d.ts +2 -0
  19. package/lib/calendar-event/definition.d.ts +2 -0
  20. package/lib/card/definition.d.ts +2 -0
  21. package/lib/checkbox/definition.d.ts +2 -0
  22. package/lib/combobox/definition.d.ts +2 -0
  23. package/lib/components.d.ts +1 -0
  24. package/lib/data-grid/definition.d.ts +4 -0
  25. package/lib/date-picker/definition.d.ts +2 -0
  26. package/lib/date-range-picker/definition.d.ts +2 -0
  27. package/lib/dial-pad/definition.d.ts +2 -0
  28. package/lib/dialog/definition.d.ts +2 -0
  29. package/lib/divider/definition.d.ts +2 -0
  30. package/lib/empty-state/definition.d.ts +2 -0
  31. package/lib/enums.d.ts +6 -0
  32. package/lib/fab/definition.d.ts +2 -0
  33. package/lib/file-picker/definition.d.ts +2 -0
  34. package/lib/header/definition.d.ts +2 -0
  35. package/lib/icon/definition.d.ts +2 -0
  36. package/lib/layout/definition.d.ts +2 -0
  37. package/lib/menu/definition.d.ts +2 -0
  38. package/lib/menu/menu.d.ts +454 -4
  39. package/lib/menu-item/definition.d.ts +2 -0
  40. package/lib/nav/definition.d.ts +2 -0
  41. package/lib/nav-disclosure/definition.d.ts +2 -0
  42. package/lib/nav-item/definition.d.ts +2 -0
  43. package/lib/note/definition.d.ts +2 -0
  44. package/lib/number-field/definition.d.ts +2 -0
  45. package/lib/option/definition.d.ts +2 -0
  46. package/lib/pagination/definition.d.ts +2 -0
  47. package/lib/popup/definition.d.ts +0 -1
  48. package/lib/popup/popup.d.ts +25 -0
  49. package/lib/progress/definition.d.ts +2 -0
  50. package/lib/progress-ring/definition.d.ts +2 -0
  51. package/lib/radio/definition.d.ts +2 -0
  52. package/lib/radio-group/definition.d.ts +2 -0
  53. package/lib/range-slider/definition.d.ts +2 -0
  54. package/lib/rich-text-editor/definition.d.ts +2 -0
  55. package/lib/rich-text-editor/facades/prose-mirror-vivid.schema.d.ts +2 -0
  56. package/lib/rich-text-editor/facades/vivid-prose-mirror.facade.d.ts +7 -0
  57. package/lib/rich-text-editor/rich-text-editor.d.ts +13 -0
  58. package/lib/rich-text-editor/rich-text-editor.template.d.ts +4 -0
  59. package/lib/searchable-select/definition.d.ts +2 -0
  60. package/lib/select/definition.d.ts +2 -0
  61. package/lib/selectable-box/definition.d.ts +2 -0
  62. package/lib/side-drawer/definition.d.ts +2 -0
  63. package/lib/slider/definition.d.ts +2 -0
  64. package/lib/split-button/definition.d.ts +2 -0
  65. package/lib/switch/definition.d.ts +2 -0
  66. package/lib/tab/definition.d.ts +2 -0
  67. package/lib/tab-panel/definition.d.ts +2 -0
  68. package/lib/tabs/definition.d.ts +2 -0
  69. package/lib/tag/definition.d.ts +2 -0
  70. package/lib/tag-group/definition.d.ts +2 -0
  71. package/lib/text-area/definition.d.ts +2 -0
  72. package/lib/text-field/definition.d.ts +2 -0
  73. package/lib/time-picker/definition.d.ts +2 -0
  74. package/lib/time-picker/inline-time-picker/columns.d.ts +13 -0
  75. package/lib/time-picker/inline-time-picker/definition.d.ts +1 -0
  76. package/lib/time-picker/inline-time-picker/inline-time-picker.d.ts +15 -0
  77. package/lib/time-picker/inline-time-picker/inline-time-picker.template.d.ts +5 -0
  78. package/lib/time-picker/time-picker.template.d.ts +1 -2
  79. package/lib/toggletip/definition.d.ts +2 -0
  80. package/lib/toggletip/toggletip.d.ts +454 -4
  81. package/lib/tooltip/definition.d.ts +2 -0
  82. package/lib/tooltip/tooltip.d.ts +454 -4
  83. package/lib/tree-item/definition.d.ts +2 -0
  84. package/lib/tree-view/definition.d.ts +2 -0
  85. package/lib/video-player/definition.d.ts +2 -0
  86. package/menu/index.js +1 -1
  87. package/package.json +7 -2
  88. package/popup/index.cjs +1 -1
  89. package/popup/index.js +1 -1
  90. package/rich-text-editor/index.cjs +5 -0
  91. package/rich-text-editor/index.js +3 -0
  92. package/searchable-select/index.cjs +1 -1
  93. package/searchable-select/index.js +1 -1
  94. package/select/index.cjs +1 -1
  95. package/select/index.js +1 -1
  96. package/selectable-box/index.cjs +1 -1
  97. package/selectable-box/index.js +1 -1
  98. package/shared/affix.cjs +1 -3
  99. package/shared/affix.js +2 -4
  100. package/shared/anchored.cjs +12 -9
  101. package/shared/anchored.js +13 -10
  102. package/shared/definition.js +1 -1
  103. package/shared/definition10.cjs +1 -0
  104. package/shared/definition10.js +2 -2
  105. package/shared/definition11.cjs +1 -1
  106. package/shared/definition11.js +2 -2
  107. package/shared/definition12.cjs +1 -1
  108. package/shared/definition12.js +2 -2
  109. package/shared/definition13.cjs +15 -2
  110. package/shared/definition13.js +16 -4
  111. package/shared/definition14.cjs +3 -2
  112. package/shared/definition14.js +4 -4
  113. package/shared/definition15.cjs +1 -1
  114. package/shared/definition15.js +2 -2
  115. package/shared/definition16.cjs +18 -18
  116. package/shared/definition16.js +6 -6
  117. package/shared/definition17.cjs +3 -0
  118. package/shared/definition17.js +2 -2
  119. package/shared/definition18.cjs +7 -7
  120. package/shared/definition18.js +4 -4
  121. package/shared/definition19.cjs +15 -15
  122. package/shared/definition19.js +4 -4
  123. package/shared/definition2.cjs +1 -0
  124. package/shared/definition2.js +2 -2
  125. package/shared/definition20.cjs +5 -4
  126. package/shared/definition20.js +6 -6
  127. package/shared/definition21.cjs +3 -2
  128. package/shared/definition21.js +4 -4
  129. package/shared/definition22.js +1 -1
  130. package/shared/definition23.cjs +2 -1
  131. package/shared/definition23.js +3 -3
  132. package/shared/definition24.cjs +2 -1
  133. package/shared/definition24.js +3 -3
  134. package/shared/definition25.cjs +14 -14
  135. package/shared/definition25.js +3 -3
  136. package/shared/definition26.cjs +2 -1
  137. package/shared/definition26.js +3 -3
  138. package/shared/definition27.cjs +1 -1
  139. package/shared/definition27.js +2 -2
  140. package/shared/definition28.cjs +1 -0
  141. package/shared/definition28.js +2 -2
  142. package/shared/definition29.cjs +53 -61
  143. package/shared/definition29.js +54 -63
  144. package/shared/definition3.cjs +1 -0
  145. package/shared/definition3.js +2 -2
  146. package/shared/definition30.cjs +1 -0
  147. package/shared/definition30.js +2 -2
  148. package/shared/definition31.cjs +1 -0
  149. package/shared/definition31.js +2 -2
  150. package/shared/definition32.cjs +1 -0
  151. package/shared/definition32.js +2 -2
  152. package/shared/definition33.cjs +2 -1
  153. package/shared/definition33.js +3 -3
  154. package/shared/definition34.cjs +25 -25
  155. package/shared/definition34.js +5 -5
  156. package/shared/definition35.cjs +1 -1
  157. package/shared/definition35.js +2 -2
  158. package/shared/definition36.cjs +2 -1
  159. package/shared/definition36.js +3 -3
  160. package/shared/definition37.cjs +1 -1
  161. package/shared/definition37.js +2 -2
  162. package/shared/definition38.cjs +2 -1
  163. package/shared/definition38.js +3 -3
  164. package/shared/definition39.cjs +1 -0
  165. package/shared/definition39.js +2 -2
  166. package/shared/definition4.cjs +3 -2
  167. package/shared/definition4.js +4 -4
  168. package/shared/definition40.cjs +1 -1
  169. package/shared/definition40.js +2 -2
  170. package/shared/definition41.cjs +30 -30
  171. package/shared/definition41.js +5 -5
  172. package/shared/definition42.cjs +12538 -1052
  173. package/shared/definition42.js +12538 -1053
  174. package/shared/definition43.cjs +927 -701
  175. package/shared/definition43.js +929 -702
  176. package/shared/definition44.cjs +874 -104
  177. package/shared/definition44.js +874 -104
  178. package/shared/definition45.cjs +114 -90
  179. package/shared/definition45.js +113 -90
  180. package/shared/definition46.cjs +88 -464
  181. package/shared/definition46.js +87 -463
  182. package/shared/definition47.cjs +463 -109
  183. package/shared/definition47.js +462 -109
  184. package/shared/definition48.cjs +108 -106
  185. package/shared/definition48.js +107 -106
  186. package/shared/definition49.cjs +139 -13
  187. package/shared/definition49.js +138 -13
  188. package/shared/definition5.cjs +3 -2
  189. package/shared/definition5.js +5 -5
  190. package/shared/definition50.cjs +16 -114
  191. package/shared/definition50.js +15 -114
  192. package/shared/definition51.cjs +79 -485
  193. package/shared/definition51.js +78 -485
  194. package/shared/definition52.cjs +503 -23
  195. package/shared/definition52.js +502 -23
  196. package/shared/definition53.cjs +25 -123
  197. package/shared/definition53.js +24 -123
  198. package/shared/definition54.cjs +96 -254
  199. package/shared/definition54.js +96 -255
  200. package/shared/definition55.cjs +261 -59
  201. package/shared/definition55.js +262 -60
  202. package/shared/definition56.cjs +72 -861
  203. package/shared/definition56.js +72 -861
  204. package/shared/definition57.cjs +880 -107
  205. package/shared/definition57.js +880 -107
  206. package/shared/definition58.cjs +104 -88
  207. package/shared/definition58.js +104 -89
  208. package/shared/definition59.cjs +80 -165
  209. package/shared/definition59.js +79 -163
  210. package/shared/definition6.cjs +2 -1
  211. package/shared/definition6.js +3 -3
  212. package/shared/definition60.cjs +142 -228
  213. package/shared/definition60.js +141 -229
  214. package/shared/definition61.cjs +233 -70146
  215. package/shared/definition61.js +232 -70146
  216. package/shared/definition62.cjs +69381 -28
  217. package/shared/definition62.js +69380 -27
  218. package/shared/definition63.cjs +28 -2163
  219. package/shared/definition63.js +27 -2161
  220. package/shared/definition64.cjs +2195 -0
  221. package/shared/definition64.js +2190 -0
  222. package/shared/definition7.cjs +2 -1
  223. package/shared/definition7.js +3 -3
  224. package/shared/definition8.cjs +2 -1
  225. package/shared/definition8.js +3 -3
  226. package/shared/definition9.cjs +1 -1
  227. package/shared/definition9.js +2 -2
  228. package/shared/enums.cjs +8 -0
  229. package/shared/enums.js +8 -1
  230. package/shared/form-associated.js +1 -1
  231. package/shared/form-elements.cjs +7 -7
  232. package/shared/form-elements.js +8 -8
  233. package/shared/foundation/vivid-element/vivid-element.d.ts +1 -0
  234. package/shared/patterns/anchored.d.ts +891 -10
  235. package/shared/patterns/trapped-focus.d.ts +2 -0
  236. package/shared/presentationDate.cjs +5 -7
  237. package/shared/presentationDate.js +5 -7
  238. package/shared/slider.template.cjs +4 -4
  239. package/shared/slider.template.js +4 -4
  240. package/shared/text-anchor.template.cjs +2 -2
  241. package/shared/text-anchor.template.js +2 -2
  242. package/shared/text-field.cjs +555 -2
  243. package/shared/text-field.js +554 -2
  244. package/shared/text-field2.cjs +2 -572
  245. package/shared/text-field2.js +2 -571
  246. package/shared/trapped-focus.cjs +7 -1
  247. package/shared/trapped-focus.js +7 -1
  248. package/shared/utils/mixins.d.ts +3 -0
  249. package/shared/vivid-element.cjs +3 -0
  250. package/shared/vivid-element.js +4 -1
  251. package/side-drawer/index.cjs +1 -1
  252. package/side-drawer/index.js +1 -1
  253. package/slider/index.cjs +1 -1
  254. package/slider/index.js +1 -1
  255. package/split-button/index.cjs +1 -1
  256. package/split-button/index.js +1 -1
  257. package/styles/core/all.css +1 -1
  258. package/styles/core/theme.css +1 -1
  259. package/styles/core/typography.css +1 -1
  260. package/styles/tokens/theme-dark.css +4 -4
  261. package/styles/tokens/theme-light.css +4 -4
  262. package/styles/tokens/vivid-2-compat.css +1 -1
  263. package/switch/index.cjs +1 -1
  264. package/switch/index.js +1 -1
  265. package/tab/index.cjs +1 -1
  266. package/tab/index.js +1 -1
  267. package/tab-panel/index.cjs +1 -1
  268. package/tab-panel/index.js +1 -1
  269. package/tabs/index.cjs +1 -1
  270. package/tabs/index.js +1 -1
  271. package/tag/index.cjs +1 -1
  272. package/tag/index.js +1 -1
  273. package/tag-group/index.cjs +1 -1
  274. package/tag-group/index.js +1 -1
  275. package/text-anchor/index.js +1 -1
  276. package/text-area/index.cjs +1 -1
  277. package/text-area/index.js +1 -1
  278. package/text-field/index.cjs +1 -1
  279. package/text-field/index.js +1 -1
  280. package/time-picker/index.cjs +1 -1
  281. package/time-picker/index.js +1 -1
  282. package/toggletip/index.cjs +1 -1
  283. package/toggletip/index.js +1 -1
  284. package/tooltip/index.cjs +1 -1
  285. package/tooltip/index.js +1 -1
  286. package/tree-item/index.cjs +1 -1
  287. package/tree-item/index.js +1 -1
  288. package/tree-view/index.cjs +1 -1
  289. package/tree-view/index.js +1 -1
  290. package/video-player/index.cjs +1 -1
  291. package/video-player/index.js +1 -1
  292. package/vivid.api.json +22795 -1
@@ -1,14 +1,17 @@
1
1
  'use strict';
2
2
 
3
+ const definition = require('./definition27.cjs');
3
4
  const vividElement = require('./vivid-element.cjs');
4
- const definition = require('./definition59.cjs');
5
- const keyCodes = require('./key-codes.cjs');
5
+ const applyMixins = require('./apply-mixins.cjs');
6
+ const affix = require('./affix.cjs');
6
7
  const dom = require('./dom.cjs');
7
- const ref = require('./ref.cjs');
8
8
  const slotted = require('./slotted.cjs');
9
+ const children = require('./children.cjs');
9
10
  const classNames = require('./class-names.cjs');
11
+ const when = require('./when.cjs');
12
+ const ref = require('./ref.cjs');
10
13
 
11
- const styles = ".control{position:relative;display:flex;flex-direction:column;gap:4px}";
14
+ const styles = ":host(:focus-visible){outline:none}:host([disabled]){cursor:not-allowed}.control{--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.control:where(.disabled,:disabled){--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.control:where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-faint);--_appearance-color-outline: transparent}.control:where(.active,:active):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.control:where(.selected):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-primary-text);--_appearance-color-fill: var(--_connotation-color-primary);--_appearance-color-outline: transparent}.control:where(.selected):where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-primary-text);--_appearance-color-fill: var(--_connotation-color-primary-increment);--_appearance-color-outline: transparent}.control{--_connotation-color-primary: var(--vvd-tree-item-accent-primary, var(--vvd-color-canvas-text));--_connotation-color-primary-text: var(--vvd-tree-item-accent-primary-text, var(--vvd-color-canvas));--_connotation-color-primary-increment: var(--vvd-tree-item-accent-primary-increment, var(--vvd-color-neutral-800));--_connotation-color-faint: var(--vvd-tree-item-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-soft: var(--vvd-tree-item-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-firm: var(--vvd-tree-item-accent-firm, var(--vvd-color-canvas-text))}.control{position:relative;display:inline-flex;box-sizing:border-box;align-items:center;border-radius:8px;background-color:var(--_appearance-color-fill);box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);color:var(--_appearance-color-text);font:var(--vvd-typography-base);gap:12px;hyphens:auto;inline-size:100%;min-block-size:calc(1px*(40 + 4*clamp(-1,var(--vvd-size-density, 0),2)));padding-inline:16px;text-decoration:none;vertical-align:middle;word-break:break-word}@supports (user-select: none){.control{user-select:none}}.control:not(.disabled){cursor:pointer}.control.disabled{pointer-events:none}:host(:focus-visible) .control{box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px))}:host(:focus-visible) .control:not(.selected){--focus-stroke-gap-color: transparent}.control .text{font:var(--vvd-typography-base)}.expandCollapseButton{display:flex;align-items:center;border-radius:8px;font-size:20px}.expandCollapseButton .expandCollapseIcon{margin:4px}.expandCollapseButton:hover{background-color:var(--vvd-color-neutral-100)}.selected .expandCollapseButton:hover{background-color:var(--vvd-color-neutral-700)}.items{display:flex;flex-direction:column;gap:4px;margin-block-start:4px;padding-inline-start:48px}slot[name=icon]{font-size:20px;line-height:1}.control:not(.disabled,.selected) slot[name=icon]{color:var(--vvd-color-neutral-600)}";
12
15
 
13
16
  var __defProp = Object.defineProperty;
14
17
  var __decorateClass = (decorators, target, key, kind) => {
@@ -19,278 +22,189 @@ var __decorateClass = (decorators, target, key, kind) => {
19
22
  if (result) __defProp(target, key, result);
20
23
  return result;
21
24
  };
22
- function getDisplayedNodes(rootNode, selector) {
23
- if (dom.isHTMLElement(rootNode)) {
24
- const nodes = Array.from(
25
- rootNode.querySelectorAll(selector)
26
- );
27
- const visibleNodes = nodes.filter((node) => {
28
- if (node.parentElement instanceof definition.TreeItem) {
29
- if (node.parentElement.getAttribute("aria-expanded") === "true")
30
- return true;
31
- } else {
32
- return true;
33
- }
34
- return false;
35
- });
36
- return visibleNodes;
37
- }
38
- return [];
25
+ function isTreeItemElement(el) {
26
+ return dom.isHTMLElement(el) && el.getAttribute("role") === "treeitem";
39
27
  }
40
- class TreeView extends vividElement.VividElement {
28
+ class TreeItem extends vividElement.VividElement {
41
29
  constructor() {
42
30
  super(...arguments);
31
+ this.expanded = false;
32
+ this.selected = false;
33
+ this.disabled = false;
34
+ this.focusable = false;
43
35
  /**
44
- * The tree item that is designated to be in the tab queue.
36
+ * Whether the tree is nested
45
37
  *
46
- * @internal
38
+ * @public
47
39
  */
48
- this.currentFocused = null;
49
- /**
50
- * Handle focus events
51
- *
52
- * @internal
53
- */
54
- this.handleFocus = (e) => {
55
- if (this.slottedTreeItems.length > 0) {
56
- if (e.target === this) {
57
- if (this.currentFocused !== null) {
58
- definition.TreeItem.focusItem(this.currentFocused);
59
- }
60
- return;
61
- }
62
- if (this.contains(e.target)) {
63
- this.setAttribute("tabindex", "-1");
64
- this.currentFocused = e.target;
65
- }
66
- }
40
+ this.isNestedItem = () => {
41
+ return isTreeItemElement(this.parentElement);
67
42
  };
68
43
  /**
69
- * Handle blur events
44
+ * Handle expand button click
70
45
  *
71
46
  * @internal
72
47
  */
73
- this.handleBlur = (e) => {
74
- if (e.target instanceof HTMLElement && (e.relatedTarget === null || !this.contains(e.relatedTarget))) {
75
- this.setAttribute("tabindex", "0");
48
+ this.handleExpandCollapseButtonClick = (e) => {
49
+ if (!this.disabled && !e.defaultPrevented) {
50
+ this.expanded = !this.expanded;
76
51
  }
77
52
  };
78
53
  /**
79
- * KeyDown handler
54
+ * Handle focus events
80
55
  *
81
- * @internal
56
+ * @internal
82
57
  */
83
- this.handleKeyDown = (e) => {
84
- if (this.slottedTreeItems.length < 1) {
85
- return true;
86
- }
87
- if (!e.defaultPrevented) {
88
- const treeItems = this.getVisibleNodes();
89
- switch (e.key) {
90
- case keyCodes.keyHome:
91
- if (treeItems.length) {
92
- definition.TreeItem.focusItem(treeItems[0]);
93
- }
94
- return;
95
- case keyCodes.keyEnd:
96
- if (treeItems.length) {
97
- definition.TreeItem.focusItem(treeItems[treeItems.length - 1]);
98
- }
99
- return;
100
- case keyCodes.keyArrowLeft:
101
- if (e.target && this.isFocusableElement(e.target)) {
102
- const item = e.target;
103
- if (item instanceof definition.TreeItem && item.childItemLength() > 0 && item.expanded) {
104
- item.expanded = false;
105
- } else if (item instanceof definition.TreeItem && item.parentElement instanceof definition.TreeItem) {
106
- definition.TreeItem.focusItem(item.parentElement);
107
- }
108
- }
109
- return false;
110
- case keyCodes.keyArrowRight:
111
- if (e.target && this.isFocusableElement(e.target)) {
112
- const item = e.target;
113
- if (item instanceof definition.TreeItem && item.childItemLength() > 0 && !item.expanded) {
114
- item.expanded = true;
115
- } else if (item instanceof definition.TreeItem && item.childItemLength() > 0) {
116
- this.focusNextNode(1, e.target);
117
- }
118
- }
119
- return;
120
- case keyCodes.keyArrowDown:
121
- if (e.target && this.isFocusableElement(e.target)) {
122
- this.focusNextNode(1, e.target);
123
- }
124
- return;
125
- case keyCodes.keyArrowUp:
126
- if (e.target && this.isFocusableElement(e.target)) {
127
- this.focusNextNode(-1, e.target);
128
- }
129
- return;
130
- case keyCodes.keyEnter:
131
- this.handleClick(e);
132
- return;
133
- }
134
- }
135
- return true;
58
+ this.handleFocus = (_e) => {
59
+ this.setAttribute("tabindex", "0");
136
60
  };
137
61
  /**
138
- * Handles the selected-changed events bubbling up
139
- * from child tree items
62
+ * Handle blur events
140
63
  *
141
- * @internal
142
- */
143
- this.handleSelectedChange = (e) => {
144
- if (!e.defaultPrevented) {
145
- if (!(e.target instanceof Element) || !definition.isTreeItemElement(e.target)) {
146
- return true;
147
- }
148
- const item = e.target;
149
- if (item.selected) {
150
- if (this.currentSelected && this.currentSelected !== item) {
151
- this.currentSelected.selected = false;
152
- }
153
- this.currentSelected = item;
154
- } else if (!item.selected && this.currentSelected === item) {
155
- this.currentSelected = null;
156
- }
157
- return;
158
- }
159
- };
160
- /**
161
- * Updates the tree view when slottedTreeItems changes
162
- */
163
- this.setItems = () => {
164
- const selectedItem = this.treeView.querySelector(
165
- "[aria-selected='true']"
166
- );
167
- this.currentSelected = selectedItem;
168
- if (this.currentFocused === null || !this.contains(this.currentFocused)) {
169
- this.currentFocused = this.getValidFocusableItem();
170
- }
171
- this.nested = this.checkForNestedItems();
172
- const treeItems = this.getVisibleNodes();
173
- treeItems.forEach((node) => {
174
- if (definition.isTreeItemElement(node)) {
175
- node.nested = this.nested;
176
- }
177
- });
178
- };
179
- /**
180
- * check if the item is focusable
64
+ * @internal
181
65
  */
182
- this.isFocusableElement = (el) => {
183
- return definition.isTreeItemElement(el);
184
- };
185
- this.isSelectedElement = (el) => {
186
- return el.selected;
66
+ this.handleBlur = (_e) => {
67
+ this.setAttribute("tabindex", "-1");
187
68
  };
188
69
  }
189
- slottedTreeItemsChanged() {
70
+ expandedChanged() {
190
71
  if (this.$fastController.isConnected) {
191
- this.setItems();
72
+ this.$emit("expanded-change", this);
192
73
  }
193
74
  }
194
- connectedCallback() {
195
- super.connectedCallback();
196
- this.setAttribute("tabindex", "0");
197
- vividElement.DOM.queueUpdate(() => {
198
- this.setItems();
199
- });
200
- }
201
- /**
202
- * Handles click events bubbling up
203
- *
204
- * @internal
205
- */
206
- handleClick(e) {
207
- if (!e.defaultPrevented) {
208
- if (!(e.target instanceof Element) || !definition.isTreeItemElement(e.target)) {
209
- return true;
210
- }
211
- const item = e.target;
212
- if (!item.disabled) {
213
- item.selected = !item.selected;
214
- }
215
- return;
75
+ selectedChanged() {
76
+ if (this.$fastController.isConnected) {
77
+ this.$emit("selected-change", this);
216
78
  }
217
79
  }
218
- /**
219
- * Move focus to a tree item based on its offset from the provided item
220
- */
221
- focusNextNode(delta, item) {
222
- const visibleNodes = this.getVisibleNodes();
223
- if (visibleNodes) {
224
- const focusItem = visibleNodes[visibleNodes.indexOf(item) + delta];
225
- if (dom.isHTMLElement(focusItem)) {
226
- definition.TreeItem.focusItem(focusItem);
227
- }
80
+ itemsChanged() {
81
+ if (this.$fastController.isConnected) {
82
+ this.items.forEach((node) => {
83
+ if (isTreeItemElement(node)) {
84
+ node.nested = true;
85
+ }
86
+ });
228
87
  }
229
88
  }
230
89
  /**
231
- * checks if there are any nested tree items
90
+ * Places document focus on a tree item
91
+ *
92
+ * @public
93
+ * @param el - the element to focus
232
94
  */
233
- getValidFocusableItem() {
234
- const treeItems = this.getVisibleNodes();
235
- let focusIndex = treeItems.findIndex(this.isSelectedElement);
236
- if (focusIndex === -1) {
237
- focusIndex = treeItems.findIndex(this.isFocusableElement);
238
- }
239
- if (focusIndex !== -1) {
240
- return treeItems[focusIndex];
241
- }
242
- return null;
95
+ static focusItem(el) {
96
+ el.focusable = true;
97
+ el.focus();
243
98
  }
244
99
  /**
245
- * checks if there are any nested tree items
100
+ * Gets number of children
101
+ *
102
+ * @internal
246
103
  */
247
- checkForNestedItems() {
248
- return this.slottedTreeItems.some((node) => {
249
- return definition.isTreeItemElement(node) && node.querySelector("[role='treeitem']");
250
- });
251
- }
252
- getVisibleNodes() {
253
- return getDisplayedNodes(this, "[role='treeitem']");
104
+ childItemLength() {
105
+ const treeChildren = this.childItems.filter(
106
+ (item) => {
107
+ return isTreeItemElement(item);
108
+ }
109
+ );
110
+ return treeChildren.length;
254
111
  }
255
112
  }
113
+ __decorateClass([
114
+ vividElement.attr
115
+ ], TreeItem.prototype, "text");
116
+ __decorateClass([
117
+ vividElement.attr({ mode: "boolean" })
118
+ ], TreeItem.prototype, "expanded");
119
+ __decorateClass([
120
+ vividElement.attr({
121
+ mode: "boolean"
122
+ })
123
+ ], TreeItem.prototype, "selected");
124
+ __decorateClass([
125
+ vividElement.attr({ mode: "boolean" })
126
+ ], TreeItem.prototype, "disabled");
127
+ __decorateClass([
128
+ vividElement.observable
129
+ ], TreeItem.prototype, "focusable");
256
130
  // @ts-expect-error Type is incorrectly non-optional
257
131
  __decorateClass([
258
- vividElement.attr({ attribute: "render-collapsed-nodes" })
259
- ], TreeView.prototype, "renderCollapsedNodes");
132
+ vividElement.observable
133
+ ], TreeItem.prototype, "childItems");
134
+ __decorateClass([
135
+ vividElement.observable
136
+ ], TreeItem.prototype, "items");
260
137
  // @ts-expect-error Type is incorrectly non-optional
261
138
  __decorateClass([
262
139
  vividElement.observable
263
- ], TreeView.prototype, "currentSelected");
140
+ ], TreeItem.prototype, "nested");
264
141
  // @ts-expect-error Type is incorrectly non-optional
265
142
  __decorateClass([
266
143
  vividElement.observable
267
- ], TreeView.prototype, "slottedTreeItems");
144
+ ], TreeItem.prototype, "renderCollapsedChildren");
145
+ applyMixins.applyMixins(TreeItem, affix.AffixIcon);
268
146
 
269
- const getClasses = (_) => classNames.classNames("control");
270
- const TreeViewTemplate = vividElement.html` <template
271
- role="tree"
272
- ${ref.ref("treeView")}
273
- @keydown="${(x, c) => x.handleKeyDown(c.event)}"
274
- @focusin="${(x, c) => x.handleFocus(c.event)}"
275
- @focusout="${(x, c) => x.handleBlur(c.event)}"
276
- @click="${(x, c) => x.handleClick(c.event)}"
277
- @selected-change="${(x, c) => x.handleSelectedChange(c.event)}"
278
- >
279
- <div class="${getClasses}">
280
- <slot ${slotted.slotted("slottedTreeItems")}></slot>
281
- </div>
282
- </template>`;
147
+ const getClasses = ({ disabled, selected }) => classNames.classNames(
148
+ "control",
149
+ ["disabled", disabled],
150
+ ["selected", Boolean(selected)]
151
+ );
152
+ const expandCollapseButton = (context) => {
153
+ const iconTag = context.tagFor(definition.Icon);
154
+ return vividElement.html`
155
+ <div aria-hidden="true"
156
+ class="expandCollapseButton"
157
+ @click="${(x, c) => x.handleExpandCollapseButtonClick(c.event)}"
158
+ ${ref.ref("expandCollapseButton")}
159
+ >
160
+ <${iconTag} class="expandCollapseIcon" name="${(x) => x.expanded ? "chevron-down-line" : "chevron-right-line"}"></${iconTag}>
161
+ </div>`;
162
+ };
163
+ const TreeItemTemplate = (context) => {
164
+ const affixIconTemplate = affix.affixIconTemplateFactory(context);
165
+ return vividElement.html` <template
166
+ role="treeitem"
167
+ slot="${(x) => x.isNestedItem() ? "item" : void 0}"
168
+ tabindex="-1"
169
+ aria-expanded="${(x) => x.childItems && x.childItems.length > 0 ? x.expanded : void 0}"
170
+ aria-selected="${(x) => x.selected}"
171
+ aria-disabled="${(x) => x.disabled}"
172
+ @focusin="${(x, c) => x.handleFocus(c.event)}"
173
+ @focusout="${(x, c) => x.handleBlur(c.event)}"
174
+ ${children.children({
175
+ property: "childItems",
176
+ filter: slotted.elements(context.tagFor(TreeItem))
177
+ })}
178
+ >
179
+ <div class="${getClasses}">
180
+ ${when.when(
181
+ (x) => x.childItems && x.childItems.length > 0,
182
+ expandCollapseButton(context)
183
+ )}
184
+ ${(x) => affixIconTemplate(x.icon, affix.IconWrapper.Slot)}
185
+ ${(x) => x.text}
186
+ </div>
187
+ ${when.when(
188
+ (x) => x.childItems && x.childItems.length > 0 && x.expanded,
189
+ vividElement.html` <div role="group" class="items">
190
+ <slot name="item" ${slotted.slotted("items")}></slot>
191
+ </div>`
192
+ )}
193
+ </template>`;
194
+ };
283
195
 
284
- const treeViewDefinition = vividElement.defineVividComponent(
285
- "tree-view",
286
- TreeView,
287
- TreeViewTemplate,
288
- [definition.treeItemDefinition],
196
+ const treeItemDefinition = vividElement.defineVividComponent(
197
+ "tree-item",
198
+ TreeItem,
199
+ TreeItemTemplate,
200
+ [definition.iconDefinition],
289
201
  {
290
202
  styles
291
203
  }
292
204
  );
293
- const registerTreeView = vividElement.createRegisterFunction(treeViewDefinition);
205
+ const registerTreeItem = vividElement.createRegisterFunction(treeItemDefinition);
294
206
 
295
- exports.registerTreeView = registerTreeView;
296
- exports.treeViewDefinition = treeViewDefinition;
207
+ exports.TreeItem = TreeItem;
208
+ exports.isTreeItemElement = isTreeItemElement;
209
+ exports.registerTreeItem = registerTreeItem;
210
+ exports.treeItemDefinition = treeItemDefinition;