@vonage/vivid 4.5.0 → 4.7.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 (173) hide show
  1. package/custom-elements.json +947 -79
  2. package/elevation/index.cjs +1 -1
  3. package/elevation/index.js +1 -1
  4. package/index.cjs +62 -56
  5. package/index.js +20 -19
  6. package/lib/components.d.ts +1 -0
  7. package/lib/dialog/dialog.d.ts +0 -1
  8. package/lib/menu/menu.d.ts +2 -1
  9. package/lib/number-field/number-field.d.ts +3 -1
  10. package/lib/searchable-select/definition.d.ts +4 -0
  11. package/lib/searchable-select/locale.d.ts +9 -0
  12. package/lib/searchable-select/option-tag.d.ts +14 -0
  13. package/lib/searchable-select/option-tag.template.d.ts +4 -0
  14. package/lib/searchable-select/searchable-select.d.ts +29 -0
  15. package/lib/searchable-select/searchable-select.form-associated.d.ts +10 -0
  16. package/lib/searchable-select/searchable-select.template.d.ts +4 -0
  17. package/lib/select/select.d.ts +3 -1
  18. package/lib/tab/locale.d.ts +3 -0
  19. package/lib/tab/tab.d.ts +5 -1
  20. package/lib/tag/definition.d.ts +1 -0
  21. package/lib/text-field/text-field.d.ts +3 -1
  22. package/locales/de-DE.cjs +24 -0
  23. package/locales/de-DE.js +24 -0
  24. package/locales/en-GB.cjs +24 -0
  25. package/locales/en-GB.js +24 -0
  26. package/locales/en-US.cjs +24 -0
  27. package/locales/en-US.js +24 -0
  28. package/locales/ja-JP.cjs +24 -0
  29. package/locales/ja-JP.js +24 -0
  30. package/locales/zh-CN.cjs +24 -0
  31. package/locales/zh-CN.js +24 -0
  32. package/package.json +1 -1
  33. package/popup/index.cjs +1 -1
  34. package/popup/index.js +1 -1
  35. package/searchable-select/index.cjs +5 -0
  36. package/searchable-select/index.js +3 -0
  37. package/select/index.cjs +1 -1
  38. package/select/index.js +1 -1
  39. package/selectable-box/index.cjs +1 -1
  40. package/selectable-box/index.js +1 -1
  41. package/shared/definition11.cjs +1 -1
  42. package/shared/definition11.js +1 -1
  43. package/shared/definition14.cjs +1 -1
  44. package/shared/definition14.js +1 -1
  45. package/shared/definition16.cjs +1 -1
  46. package/shared/definition16.js +1 -1
  47. package/shared/definition18.cjs +2 -2
  48. package/shared/definition18.js +2 -2
  49. package/shared/definition19.cjs +2 -2
  50. package/shared/definition19.js +2 -2
  51. package/shared/definition20.cjs +14 -34
  52. package/shared/definition20.js +14 -34
  53. package/shared/definition21.cjs +2 -19
  54. package/shared/definition21.js +2 -19
  55. package/shared/definition26.cjs +1 -1
  56. package/shared/definition26.js +1 -1
  57. package/shared/definition29.cjs +4 -0
  58. package/shared/definition29.js +4 -0
  59. package/shared/definition30.cjs +2 -1
  60. package/shared/definition30.js +2 -1
  61. package/shared/definition35.cjs +12 -7
  62. package/shared/definition35.js +12 -7
  63. package/shared/definition36.cjs +50 -207
  64. package/shared/definition36.js +51 -207
  65. package/shared/definition4.cjs +1 -1
  66. package/shared/definition4.js +1 -1
  67. package/shared/definition42.cjs +1 -1
  68. package/shared/definition42.js +1 -1
  69. package/shared/definition43.cjs +1018 -647
  70. package/shared/definition43.js +1014 -644
  71. package/shared/definition44.cjs +723 -112
  72. package/shared/definition44.js +722 -111
  73. package/shared/definition45.cjs +121 -80
  74. package/shared/definition45.js +119 -78
  75. package/shared/definition46.cjs +81 -614
  76. package/shared/definition46.js +80 -612
  77. package/shared/definition47.cjs +608 -114
  78. package/shared/definition47.js +606 -113
  79. package/shared/definition48.cjs +116 -134
  80. package/shared/definition48.js +115 -133
  81. package/shared/definition49.cjs +149 -19
  82. package/shared/definition49.js +148 -18
  83. package/shared/definition5.cjs +1 -1
  84. package/shared/definition5.js +1 -1
  85. package/shared/definition50.cjs +21 -82
  86. package/shared/definition50.js +20 -81
  87. package/shared/definition51.cjs +77 -539
  88. package/shared/definition51.js +76 -538
  89. package/shared/definition52.cjs +568 -28
  90. package/shared/definition52.js +567 -27
  91. package/shared/definition53.cjs +28 -123
  92. package/shared/definition53.js +26 -122
  93. package/shared/definition54.cjs +115 -295
  94. package/shared/definition54.js +114 -294
  95. package/shared/definition55.cjs +251 -311
  96. package/shared/definition55.js +251 -311
  97. package/shared/definition56.cjs +299 -780
  98. package/shared/definition56.js +298 -779
  99. package/shared/definition57.cjs +800 -102
  100. package/shared/definition57.js +799 -101
  101. package/shared/definition58.cjs +92 -63
  102. package/shared/definition58.js +91 -62
  103. package/shared/definition59.cjs +117 -75
  104. package/shared/definition59.js +116 -74
  105. package/shared/definition60.cjs +70 -285
  106. package/shared/definition60.js +71 -286
  107. package/shared/definition61.cjs +274 -66146
  108. package/shared/definition61.js +273 -66145
  109. package/shared/definition62.cjs +66160 -27
  110. package/shared/definition62.js +66158 -25
  111. package/shared/definition63.cjs +24 -1952
  112. package/shared/definition63.js +23 -1950
  113. package/shared/definition64.cjs +1976 -0
  114. package/shared/definition64.js +1971 -0
  115. package/shared/listbox-option.cjs +204 -0
  116. package/shared/listbox-option.js +201 -0
  117. package/shared/listbox.cjs +3 -3
  118. package/shared/listbox.js +1 -1
  119. package/shared/localization/Locale.d.ts +4 -0
  120. package/shared/presentationDate.cjs +2 -2
  121. package/shared/presentationDate.js +2 -2
  122. package/shared/scrollIntoView.cjs +51 -0
  123. package/shared/scrollIntoView.js +49 -0
  124. package/shared/slider.template.cjs +1 -1
  125. package/shared/slider.template.js +1 -1
  126. package/shared/text-field.cjs +1 -1
  127. package/shared/text-field.js +1 -1
  128. package/shared/utils/scrollIntoView.d.ts +1 -0
  129. package/side-drawer/index.cjs +1 -1
  130. package/side-drawer/index.js +1 -1
  131. package/slider/index.cjs +1 -1
  132. package/slider/index.js +1 -1
  133. package/split-button/index.cjs +1 -1
  134. package/split-button/index.js +1 -1
  135. package/styles/core/all.css +1 -1
  136. package/styles/core/theme.css +1 -1
  137. package/styles/core/typography.css +1 -1
  138. package/styles/tokens/theme-dark.css +4 -4
  139. package/styles/tokens/theme-light.css +4 -4
  140. package/styles/tokens/vivid-2-compat.css +1 -1
  141. package/switch/index.cjs +1 -1
  142. package/switch/index.js +1 -1
  143. package/tab/index.cjs +1 -1
  144. package/tab/index.js +1 -1
  145. package/tab-panel/index.cjs +1 -1
  146. package/tab-panel/index.js +1 -1
  147. package/tabs/index.cjs +1 -1
  148. package/tabs/index.js +1 -1
  149. package/tag/index.cjs +1 -1
  150. package/tag/index.js +1 -1
  151. package/tag-group/index.cjs +1 -1
  152. package/tag-group/index.js +1 -1
  153. package/text-area/index.cjs +1 -1
  154. package/text-area/index.js +1 -1
  155. package/text-field/index.cjs +1 -1
  156. package/text-field/index.js +1 -1
  157. package/time-picker/index.cjs +1 -1
  158. package/time-picker/index.js +1 -1
  159. package/toggletip/index.cjs +1 -1
  160. package/toggletip/index.js +1 -1
  161. package/tooltip/index.cjs +1 -1
  162. package/tooltip/index.js +1 -1
  163. package/tree-item/index.cjs +1 -1
  164. package/tree-item/index.js +1 -1
  165. package/tree-view/index.cjs +1 -1
  166. package/tree-view/index.js +1 -1
  167. package/video-player/index.cjs +1 -1
  168. package/video-player/index.js +1 -1
  169. package/vivid.api.json +295 -0
  170. package/api-extractor.json +0 -25
  171. package/shared/dialog-polyfill.esm.cjs +0 -862
  172. package/shared/dialog-polyfill.esm.js +0 -858
  173. package/tsdoc-metadata.json +0 -11
@@ -1,90 +1,132 @@
1
- import { a as attr, h as html, r as registerFactory } from './index.js';
2
- import { a as iconRegistries } from './definition27.js';
3
- import { A as AffixIcon, a as affixIconTemplateFactory, I as IconWrapper } from './affix.js';
4
- import { T as TreeItem$1 } from './tree-item.js';
5
- import { a as applyMixins } from './apply-mixins.js';
6
- import { I as Icon } from './icon.js';
7
- import { e as elements, s as slotted } from './slotted.js';
8
- import { c as children } from './children.js';
9
- import { w as when } from './when.js';
1
+ import { F as FoundationElement, a as attr, h as html, r as registerFactory } from './index.js';
2
+ import { P as Popup, p as popupRegistries } from './definition64.js';
3
+ import { b as anchored, a as anchorSlotTemplateFactory } from './anchored.js';
4
+ import { h as handleEscapeKeyAndStopPropogation } from './index2.js';
10
5
  import { c as classNames } from './class-names.js';
11
- import { r as ref } from './ref.js';
12
6
 
13
- 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)}";
7
+ const styles = ":host{display:var(--_popup-display, inline)}:host([slotted-anchor]){--_popup-display: contents}.control{pointer-events:none}.tooltip{width:var(--tooltip-inline-size, auto);max-inline-size:var(--tooltip-max-inline-size, 30ch)}.tooltip-text{padding:8px 12px;color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base-bold)}";
14
8
 
15
9
  var __defProp = Object.defineProperty;
10
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
11
+ var __typeError = (msg) => {
12
+ throw TypeError(msg);
13
+ };
16
14
  var __decorateClass = (decorators, target, key, kind) => {
17
- var result = void 0 ;
15
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
18
16
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
19
17
  if (decorator = decorators[i])
20
- result = (decorator(target, key, result) ) || result;
21
- if (result) __defProp(target, key, result);
18
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
19
+ if (kind && result) __defProp(target, key, result);
22
20
  return result;
23
21
  };
24
- class TreeItem extends TreeItem$1 {
25
- }
22
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
23
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
24
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
25
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
26
+ var _Tooltip_instances, setupAnchor_fn, cleanupAnchor_fn, _show, _hide, updateListeners_fn, _closeOnEscape;
27
+ let Tooltip = class extends FoundationElement {
28
+ constructor() {
29
+ super(...arguments);
30
+ __privateAdd(this, _Tooltip_instances);
31
+ this.open = false;
32
+ __privateAdd(this, _show, () => {
33
+ this.open = true;
34
+ });
35
+ __privateAdd(this, _hide, () => {
36
+ this.open = false;
37
+ });
38
+ __privateAdd(this, _closeOnEscape, (e) => {
39
+ if (e.key === "Escape") __privateGet(this, _hide).call(this);
40
+ });
41
+ }
42
+ connectedCallback() {
43
+ super.connectedCallback();
44
+ __privateMethod(this, _Tooltip_instances, updateListeners_fn).call(this);
45
+ }
46
+ disconnectedCallback() {
47
+ super.disconnectedCallback();
48
+ __privateMethod(this, _Tooltip_instances, updateListeners_fn).call(this);
49
+ }
50
+ /**
51
+ * @internal
52
+ */
53
+ _anchorElChanged(oldValue, newValue) {
54
+ if (oldValue) __privateMethod(this, _Tooltip_instances, cleanupAnchor_fn).call(this, oldValue);
55
+ if (newValue) __privateMethod(this, _Tooltip_instances, setupAnchor_fn).call(this, newValue);
56
+ }
57
+ /**
58
+ * @internal
59
+ */
60
+ openChanged(oldValue) {
61
+ if (oldValue === void 0) return;
62
+ __privateMethod(this, _Tooltip_instances, updateListeners_fn).call(this);
63
+ }
64
+ };
65
+ _Tooltip_instances = new WeakSet();
66
+ setupAnchor_fn = function(a) {
67
+ a.addEventListener("mouseover", __privateGet(this, _show));
68
+ a.addEventListener("mouseout", __privateGet(this, _hide));
69
+ a.addEventListener("focusin", __privateGet(this, _show));
70
+ a.addEventListener("focusout", __privateGet(this, _hide));
71
+ };
72
+ cleanupAnchor_fn = function(a) {
73
+ a.removeEventListener("mouseover", __privateGet(this, _show));
74
+ a.removeEventListener("mouseout", __privateGet(this, _hide));
75
+ a.removeEventListener("focusin", __privateGet(this, _show));
76
+ a.removeEventListener("focusout", __privateGet(this, _hide));
77
+ };
78
+ _show = new WeakMap();
79
+ _hide = new WeakMap();
80
+ updateListeners_fn = function() {
81
+ document.removeEventListener("keydown", __privateGet(this, _closeOnEscape));
82
+ if (this.open && this.isConnected) {
83
+ document.addEventListener("keydown", __privateGet(this, _closeOnEscape));
84
+ }
85
+ };
86
+ _closeOnEscape = new WeakMap();
26
87
  __decorateClass([
27
88
  attr
28
- ], TreeItem.prototype, "text");
29
- applyMixins(TreeItem, AffixIcon);
89
+ ], Tooltip.prototype, "text", 2);
90
+ __decorateClass([
91
+ attr({ mode: "fromView" })
92
+ ], Tooltip.prototype, "placement", 2);
93
+ __decorateClass([
94
+ attr({ mode: "boolean" })
95
+ ], Tooltip.prototype, "open", 2);
96
+ Tooltip = __decorateClass([
97
+ anchored
98
+ ], Tooltip);
30
99
 
31
- const getClasses = ({ disabled, selected }) => classNames(
32
- "control",
33
- ["disabled", disabled],
34
- ["selected", Boolean(selected)]
35
- );
36
- const expandCollapseButton = (context) => {
37
- const iconTag = context.tagFor(Icon);
100
+ const getClasses = ({ open }) => classNames("control", ["open", Boolean(open)]);
101
+ const TooltipTemplate = (context) => {
102
+ const popupTag = context.tagFor(Popup);
103
+ const anchorSlotTemplate = anchorSlotTemplateFactory();
38
104
  return html`
39
- <div aria-hidden="true"
40
- class="expandCollapseButton"
41
- @click="${(x, c) => x.handleExpandCollapseButtonClick(c.event)}"
42
- ${ref("expandCollapseButton")}
43
- >
44
- <${iconTag} class="expandCollapseIcon" name="${(x) => x.expanded ? "chevron-down-line" : "chevron-right-line"}"></${iconTag}>
45
- </div>`;
46
- };
47
- const TreeItemTemplate = (context) => {
48
- const affixIconTemplate = affixIconTemplateFactory(context);
49
- return html` <template
50
- role="treeitem"
51
- slot="${(x) => x.isNestedItem() ? "item" : void 0}"
52
- tabindex="-1"
53
- aria-expanded="${(x) => x.childItems && x.childItems.length > 0 ? x.expanded : void 0}"
54
- aria-selected="${(x) => x.selected}"
55
- aria-disabled="${(x) => x.disabled}"
56
- @focusin="${(x, c) => x.handleFocus(c.event)}"
57
- @focusout="${(x, c) => x.handleBlur(c.event)}"
58
- ${children({
59
- property: "childItems",
60
- filter: elements(context.tagFor(TreeItem))
61
- })}
62
- >
63
- <div class="${getClasses}">
64
- ${when(
65
- (x) => x.childItems && x.childItems.length > 0,
66
- expandCollapseButton(context)
67
- )}
68
- ${(x) => affixIconTemplate(x.icon, IconWrapper.Slot)}
69
- ${(x) => x.text}
70
- </div>
71
- ${when(
72
- (x) => x.childItems && x.childItems.length > 0 && x.expanded,
73
- html` <div role="group" class="items">
74
- <slot name="item" ${slotted("items")}></slot>
75
- </div>`
76
- )}
77
- </template>`;
105
+ ${anchorSlotTemplate}
106
+ <${popupTag} class="${getClasses}" arrow alternate
107
+ :placement=${(x) => x.placement}
108
+ :anchor="${(x) => x._anchorEl}"
109
+ :open="${(x) => x.open}"
110
+ @keydown="${(x, c) => {
111
+ if (x.open && handleEscapeKeyAndStopPropogation(c.event)) {
112
+ x.open = false;
113
+ }
114
+ }}"
115
+ exportparts="vvd-theme-alternate">
116
+ <div class="tooltip" role="tooltip">
117
+ <header part="vvd-theme-alternate" class="tooltip-header">
118
+ <div class="tooltip-text">${(x) => x.text}</div>
119
+ </header>
120
+ </div>
121
+ </${popupTag}>`;
78
122
  };
79
123
 
80
- const treeItemDefinition = TreeItem.compose(
81
- {
82
- baseName: "tree-item",
83
- template: TreeItemTemplate,
84
- styles
85
- }
86
- );
87
- const treeItemRegistries = [treeItemDefinition(), ...iconRegistries];
88
- const registerTreeItem = registerFactory(treeItemRegistries);
124
+ const tooltipDefinition = Tooltip.compose({
125
+ baseName: "tooltip",
126
+ template: TooltipTemplate,
127
+ styles
128
+ });
129
+ const tooltipRegistries = [tooltipDefinition(), ...popupRegistries];
130
+ const registerTooltip = registerFactory(tooltipRegistries);
89
131
 
90
- export { treeItemRegistries as a, registerTreeItem as r, treeItemDefinition as t };
132
+ export { tooltipRegistries as a, registerTooltip as r, tooltipDefinition as t };
@@ -1,309 +1,94 @@
1
1
  'use strict';
2
2
 
3
3
  const index = require('./index.cjs');
4
+ const definition = require('./definition27.cjs');
5
+ const affix = require('./affix.cjs');
4
6
  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');
7
+ const applyMixins = require('./apply-mixins.cjs');
8
+ const icon = require('./icon.cjs');
8
9
  const slotted = require('./slotted.cjs');
10
+ const children = require('./children.cjs');
11
+ const when = require('./when.cjs');
9
12
  const classNames = require('./class-names.cjs');
13
+ const ref = require('./ref.cjs');
10
14
 
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
- }
264
- };
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}";
15
+ 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)}";
276
16
 
277
- class TreeView extends TreeView$1 {
17
+ var __defProp = Object.defineProperty;
18
+ var __decorateClass = (decorators, target, key, kind) => {
19
+ var result = void 0 ;
20
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
21
+ if (decorator = decorators[i])
22
+ result = (decorator(target, key, result) ) || result;
23
+ if (result) __defProp(target, key, result);
24
+ return result;
25
+ };
26
+ class TreeItem extends treeItem.TreeItem {
278
27
  }
28
+ __decorateClass([
29
+ index.attr
30
+ ], TreeItem.prototype, "text");
31
+ applyMixins.applyMixins(TreeItem, affix.AffixIcon);
279
32
 
280
- const getClasses = (_) => classNames.classNames("control");
281
- const TreeViewTemplate = () => {
33
+ const getClasses = ({ disabled, selected }) => classNames.classNames(
34
+ "control",
35
+ ["disabled", disabled],
36
+ ["selected", Boolean(selected)]
37
+ );
38
+ const expandCollapseButton = (context) => {
39
+ const iconTag = context.tagFor(icon.Icon);
40
+ return index.html`
41
+ <div aria-hidden="true"
42
+ class="expandCollapseButton"
43
+ @click="${(x, c) => x.handleExpandCollapseButtonClick(c.event)}"
44
+ ${ref.ref("expandCollapseButton")}
45
+ >
46
+ <${iconTag} class="expandCollapseIcon" name="${(x) => x.expanded ? "chevron-down-line" : "chevron-right-line"}"></${iconTag}>
47
+ </div>`;
48
+ };
49
+ const TreeItemTemplate = (context) => {
50
+ const affixIconTemplate = affix.affixIconTemplateFactory(context);
282
51
  return index.html` <template
283
- role="tree"
284
- ${ref.ref("treeView")}
285
- @keydown="${(x, c) => x.handleKeyDown(c.event)}"
52
+ role="treeitem"
53
+ slot="${(x) => x.isNestedItem() ? "item" : void 0}"
54
+ tabindex="-1"
55
+ aria-expanded="${(x) => x.childItems && x.childItems.length > 0 ? x.expanded : void 0}"
56
+ aria-selected="${(x) => x.selected}"
57
+ aria-disabled="${(x) => x.disabled}"
286
58
  @focusin="${(x, c) => x.handleFocus(c.event)}"
287
59
  @focusout="${(x, c) => x.handleBlur(c.event)}"
288
- @click="${(x, c) => x.handleClick(c.event)}"
289
- @selected-change="${(x, c) => x.handleSelectedChange(c.event)}"
60
+ ${children.children({
61
+ property: "childItems",
62
+ filter: slotted.elements(context.tagFor(TreeItem))
63
+ })}
290
64
  >
291
65
  <div class="${getClasses}">
292
- <slot ${slotted.slotted("slottedTreeItems")}></slot>
66
+ ${when.when(
67
+ (x) => x.childItems && x.childItems.length > 0,
68
+ expandCollapseButton(context)
69
+ )}
70
+ ${(x) => affixIconTemplate(x.icon, affix.IconWrapper.Slot)}
71
+ ${(x) => x.text}
293
72
  </div>
73
+ ${when.when(
74
+ (x) => x.childItems && x.childItems.length > 0 && x.expanded,
75
+ index.html` <div role="group" class="items">
76
+ <slot name="item" ${slotted.slotted("items")}></slot>
77
+ </div>`
78
+ )}
294
79
  </template>`;
295
80
  };
296
81
 
297
- const treeViewDefinition = TreeView.compose(
82
+ const treeItemDefinition = TreeItem.compose(
298
83
  {
299
- baseName: "tree-view",
300
- template: TreeViewTemplate,
84
+ baseName: "tree-item",
85
+ template: TreeItemTemplate,
301
86
  styles
302
87
  }
303
88
  );
304
- const treeViewRegistries = [treeViewDefinition()];
305
- const registerTreeView = index.registerFactory(treeViewRegistries);
89
+ const treeItemRegistries = [treeItemDefinition(), ...definition.iconRegistries];
90
+ const registerTreeItem = index.registerFactory(treeItemRegistries);
306
91
 
307
- exports.registerTreeView = registerTreeView;
308
- exports.treeViewDefinition = treeViewDefinition;
309
- exports.treeViewRegistries = treeViewRegistries;
92
+ exports.registerTreeItem = registerTreeItem;
93
+ exports.treeItemDefinition = treeItemDefinition;
94
+ exports.treeItemRegistries = treeItemRegistries;