@vonage/vivid 5.3.0 → 5.4.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 (157) hide show
  1. package/accordion-item/definition.js +1 -1
  2. package/alert/definition.cjs +1 -1
  3. package/alert/definition.js +2 -2
  4. package/badge/definition.js +1 -1
  5. package/banner/definition.js +1 -1
  6. package/bundled/calendar-picker.template.cjs +7 -7
  7. package/bundled/calendar-picker.template.js +101 -101
  8. package/bundled/definition11.cjs +13 -13
  9. package/bundled/definition11.js +202 -50
  10. package/bundled/definition19.cjs +24 -25
  11. package/bundled/definition19.js +152 -164
  12. package/bundled/definition6.cjs +3 -3
  13. package/bundled/definition6.js +19 -19
  14. package/bundled/definition9.cjs +5 -5
  15. package/bundled/definition9.js +394 -392
  16. package/bundled/listbox.cjs +1 -1
  17. package/bundled/listbox.js +82 -102
  18. package/bundled/localized.cjs +1 -1
  19. package/bundled/localized.js +18 -14
  20. package/bundled/vivid-element.cjs +5 -1
  21. package/bundled/vivid-element.js +401 -358
  22. package/calendar/index.cjs +1 -1
  23. package/calendar/index.js +14 -14
  24. package/card/definition.cjs +1 -1
  25. package/card/definition.js +1 -1
  26. package/color-picker/definition.cjs +1 -1
  27. package/color-picker/definition.js +1 -1
  28. package/combobox/definition.cjs +7 -27
  29. package/combobox/definition.js +8 -28
  30. package/combobox/index.cjs +6 -6
  31. package/combobox/index.js +57 -71
  32. package/custom-elements.json +305 -2
  33. package/date-picker/definition.cjs +1 -1
  34. package/date-picker/definition.js +1 -1
  35. package/date-range-picker/definition.cjs +1 -1
  36. package/date-range-picker/definition.js +1 -1
  37. package/date-time-picker/definition.cjs +1 -1
  38. package/date-time-picker/definition.js +1 -1
  39. package/dialog/definition.cjs +2 -2
  40. package/dialog/definition.js +2 -2
  41. package/dialog/index.cjs +7 -7
  42. package/dialog/index.js +6 -6
  43. package/elevation/definition.cjs +1 -1
  44. package/elevation/definition.js +1 -1
  45. package/fab/definition.js +1 -1
  46. package/header/definition.cjs +1 -1
  47. package/header/definition.js +1 -1
  48. package/index.cjs +3 -4
  49. package/index.js +2 -3
  50. package/lib/accordion/accordion.d.ts +1 -1
  51. package/lib/accordion/definition.d.ts +1 -1
  52. package/lib/audio-player/audio-player.d.ts +1 -1
  53. package/lib/combobox/combobox.d.ts +1 -0
  54. package/lib/combobox/combobox.options.d.ts +1 -1
  55. package/lib/divider/divider.d.ts +1 -1
  56. package/lib/menu-item/menu-item-role.d.ts +1 -1
  57. package/lib/popup/popup.d.ts +1 -1
  58. package/lib/searchable-select/locale.d.ts +4 -0
  59. package/lib/searchable-select/searchable-select.d.ts +3 -0
  60. package/lib/select/select.d.ts +3 -1
  61. package/lib/slider/slider.d.ts +1 -1
  62. package/lib/tabs/tabs.d.ts +2 -2
  63. package/lib/text-area/text-area.d.ts +1 -1
  64. package/lib/text-field/text-field.d.ts +1 -1
  65. package/locales/de-DE.cjs +4 -0
  66. package/locales/de-DE.js +4 -0
  67. package/locales/en-GB.cjs +4 -0
  68. package/locales/en-GB.js +4 -0
  69. package/locales/en-US.cjs +4 -0
  70. package/locales/en-US.js +4 -0
  71. package/locales/ja-JP.cjs +4 -0
  72. package/locales/ja-JP.js +4 -0
  73. package/locales/zh-CN.cjs +4 -0
  74. package/locales/zh-CN.js +4 -0
  75. package/menu/definition.cjs +4 -4
  76. package/menu/definition.js +4 -4
  77. package/nav-disclosure/definition.js +1 -1
  78. package/nav-item/definition.js +1 -1
  79. package/note/definition.js +1 -1
  80. package/number-field/definition.js +1 -1
  81. package/option/definition.cjs +6 -77
  82. package/option/definition.js +3 -78
  83. package/package.json +31 -5
  84. package/popup/definition.cjs +2 -2
  85. package/popup/definition.js +2 -2
  86. package/range-slider/definition.cjs +1 -1
  87. package/range-slider/definition.js +1 -1
  88. package/rich-text-editor/definition.cjs +2 -3
  89. package/rich-text-editor/definition.js +1 -2
  90. package/rich-text-editor/index.cjs +27 -27
  91. package/rich-text-editor/index.js +1208 -1198
  92. package/searchable-select/definition.cjs +103 -11
  93. package/searchable-select/definition.js +103 -11
  94. package/searchable-select/index.cjs +81 -69
  95. package/searchable-select/index.js +359 -273
  96. package/select/definition.cjs +24 -41
  97. package/select/definition.js +24 -41
  98. package/selectable-box/definition.cjs +1 -1
  99. package/selectable-box/definition.js +1 -1
  100. package/selectable-box/index.cjs +1 -1
  101. package/selectable-box/index.js +1 -1
  102. package/shared/aria/aria-mixin.d.ts +1 -1
  103. package/shared/foundation/listbox/listbox.d.ts +4 -0
  104. package/simple-color-picker/definition.cjs +1 -1
  105. package/simple-color-picker/definition.js +1 -1
  106. package/slider/definition.cjs +1 -1
  107. package/slider/definition.js +1 -1
  108. package/split-button/definition.js +1 -1
  109. package/styles/core/all.css +1 -1
  110. package/styles/core/theme.css +1 -1
  111. package/styles/core/typography.css +1 -1
  112. package/styles/tokens/theme-dark.css +4 -4
  113. package/styles/tokens/theme-light.css +4 -4
  114. package/styles/tokens/vivid-2-compat.css +1 -1
  115. package/tab/definition.js +1 -1
  116. package/tag/definition.js +1 -1
  117. package/text-field/definition.js +1 -1
  118. package/time-picker/definition.cjs +1 -1
  119. package/time-picker/definition.js +1 -1
  120. package/toggletip/definition.cjs +1 -1
  121. package/toggletip/definition.js +1 -1
  122. package/tooltip/definition.cjs +1 -1
  123. package/tooltip/definition.js +1 -1
  124. package/tree-item/definition.cjs +1 -1
  125. package/tree-item/definition.js +1 -1
  126. package/tree-view/definition.cjs +1 -1
  127. package/tree-view/definition.js +1 -1
  128. package/unbundled/affix.js +1 -1
  129. package/unbundled/calendar-picker.template.cjs +1 -1
  130. package/unbundled/calendar-picker.template.js +1 -1
  131. package/unbundled/definition.js +1 -1
  132. package/unbundled/definition2.js +1 -1
  133. package/unbundled/definition3.cjs +222 -141
  134. package/unbundled/definition3.js +220 -139
  135. package/unbundled/definition4.cjs +145 -235
  136. package/unbundled/definition4.js +143 -233
  137. package/unbundled/definition5.cjs +269 -27
  138. package/unbundled/definition5.js +267 -26
  139. package/unbundled/definition6.cjs +56 -0
  140. package/unbundled/definition6.js +52 -0
  141. package/unbundled/listbox.cjs +41 -63
  142. package/unbundled/listbox.js +39 -61
  143. package/unbundled/picker-field.template.cjs +1 -1
  144. package/unbundled/picker-field.template.js +1 -1
  145. package/unbundled/slider.template.cjs +1 -1
  146. package/unbundled/slider.template.js +1 -1
  147. package/unbundled/vivid-element.cjs +1 -1
  148. package/unbundled/vivid-element.js +1 -1
  149. package/video-player/definition.cjs +56 -16
  150. package/video-player/definition.js +56 -16
  151. package/video-player/index.cjs +36 -36
  152. package/video-player/index.js +2461 -2445
  153. package/vivid.api.json +285 -38
  154. package/bundled/option.cjs +0 -1
  155. package/bundled/option.js +0 -158
  156. package/unbundled/option.cjs +0 -217
  157. package/unbundled/option.js +0 -214
@@ -1,203 +1,284 @@
1
1
  import { VwcIconElement as Icon, iconDefinition } from '../icon/definition.js';
2
2
  import { V as VividElement, d as defineVividComponent, c as createRegisterFunction } from './vivid-element.js';
3
+ import { attr, observable, volatile, when, html } from '@microsoft/fast-element';
3
4
  import { isHTMLElement, classNames } from '@microsoft/fast-web-utilities';
4
- import { attr, observable, children, when, elements, slotted, html, ref } from '@microsoft/fast-element';
5
- import { b as AffixIcon, a as affixIconTemplateFactory, I as IconWrapper } from './affix.js';
5
+ import { b as AffixIconWithTrailing, a as affixIconTemplateFactory, I as IconWrapper } from './affix.js';
6
6
  import { H as HostSemantics, a as applyHostSemantics } from './host-semantics.js';
7
7
 
8
- 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:disabled{--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.control.disabled{--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}@media (hover: hover){.control: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.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:active:where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.control.active:where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.control.selected:where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-primary-text);--_appearance-color-fill: var(--_connotation-color-primary);--_appearance-color-outline: transparent}@media (hover: hover){.control.selected: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.selected.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:0 0 0 4px color-mix(in srgb,var(--vvd-color-cta-500),transparent 85%),inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:1px solid var(--focus-stroke-color, var(--vvd-color-cta-500));outline-offset:calc(-1px - 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}@media (hover: hover){.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)}";
9
-
10
8
  var __defProp = Object.defineProperty;
9
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
11
10
  var __decorateClass = (decorators, target, key, kind) => {
12
- var result = void 0 ;
11
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
13
12
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
14
13
  if (decorator = decorators[i])
15
- result = (decorator(target, key, result) ) || result;
16
- if (result) __defProp(target, key, result);
14
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
15
+ if (kind && result) __defProp(target, key, result);
17
16
  return result;
18
17
  };
19
- function isTreeItemElement(el) {
20
- return isHTMLElement(el) && (el.getAttribute("role") === "treeitem" || el instanceof TreeItem);
18
+ function isListboxOption(el) {
19
+ return isHTMLElement(el) && (el.getAttribute("role") === "option" || el instanceof HTMLOptionElement || el instanceof ListboxOption);
21
20
  }
22
- class TreeItem extends HostSemantics(AffixIcon(VividElement)) {
23
- constructor() {
24
- super(...arguments);
25
- this.expanded = false;
26
- this.selected = false;
27
- this.disabled = false;
28
- this.focusable = false;
29
- /**
30
- * Whether the tree is nested
31
- *
32
- * @public
33
- */
34
- this.isNestedItem = () => {
35
- return isTreeItemElement(this.parentElement);
36
- };
21
+ class ListboxOption extends HostSemantics(
22
+ AffixIconWithTrailing(VividElement)
23
+ ) {
24
+ constructor(text, value, defaultSelected, selected) {
25
+ super();
26
+ this.defaultSelected = false;
37
27
  /**
38
- * Handle expand button click
39
- *
28
+ * Tracks whether the "selected" property has been changed.
40
29
  * @internal
41
30
  */
42
- this.handleExpandCollapseButtonClick = (e) => {
43
- if (!this.disabled && !e.defaultPrevented) {
44
- this.expanded = !this.expanded;
31
+ this.dirtySelected = false;
32
+ // eslint-disable-next-line @repo/repo/no-attribute-default-value
33
+ this.value = "";
34
+ this._highlighted = false;
35
+ this._displayCheckmark = false;
36
+ this._vvdSearchText = "";
37
+ this._isNotMatching = false;
38
+ if (text) {
39
+ this.text = text;
40
+ }
41
+ if (value) {
42
+ this.value = value;
43
+ }
44
+ if (defaultSelected) {
45
+ this.defaultSelected = defaultSelected;
46
+ }
47
+ if (selected) {
48
+ this.selected = selected;
49
+ }
50
+ this.proxy = new Option(
51
+ this.text,
52
+ this.value,
53
+ this.defaultSelected,
54
+ this.selected
55
+ );
56
+ this.proxy.disabled = this.disabled;
57
+ }
58
+ defaultSelectedChanged() {
59
+ if (!this.dirtySelected) {
60
+ this.selected = this.defaultSelected;
61
+ if (this.proxy instanceof HTMLOptionElement) {
62
+ this.proxy.selected = this.defaultSelected;
45
63
  }
46
- };
47
- /**
48
- * Handle focus events
49
- *
50
- * @internal
51
- */
52
- this.handleFocus = (_e) => {
53
- this.setAttribute("tabindex", "0");
54
- };
55
- /**
56
- * Handle blur events
57
- *
58
- * @internal
59
- */
60
- this.handleBlur = (_e) => {
61
- this.setAttribute("tabindex", "-1");
62
- };
64
+ }
65
+ if (this.proxy instanceof HTMLOptionElement) {
66
+ this.proxy.defaultSelected = this.defaultSelected;
67
+ }
63
68
  }
64
- expandedChanged() {
65
- if (this.$fastController.isConnected) {
66
- this.$emit("expanded-change", this);
69
+ disabledChanged() {
70
+ if (this.proxy instanceof HTMLOptionElement) {
71
+ this.proxy.disabled = this.disabled;
67
72
  }
68
73
  }
74
+ /**
75
+ * @deprecated Use `defaultSelected` instead.
76
+ */
77
+ get selectedAttribute() {
78
+ return this.defaultSelected;
79
+ }
80
+ set selectedAttribute(value) {
81
+ this.defaultSelected = value;
82
+ }
69
83
  selectedChanged() {
70
- if (this.$fastController.isConnected) {
71
- this.$emit("selected-change", this);
84
+ if (!this.dirtySelected) {
85
+ this.dirtySelected = true;
86
+ }
87
+ if (this.proxy instanceof HTMLOptionElement) {
88
+ this.proxy.selected = this.selected;
72
89
  }
73
90
  }
74
- itemsChanged() {
75
- if (this.$fastController.isConnected) {
76
- this.items.forEach((node) => {
77
- if (isTreeItemElement(node)) {
78
- node.nested = true;
79
- }
80
- });
91
+ valueChanged() {
92
+ if (typeof this.value !== "string") {
93
+ this.value = "";
94
+ return;
81
95
  }
96
+ if (this.proxy instanceof HTMLOptionElement) {
97
+ this.proxy.value = this.value;
98
+ }
99
+ }
100
+ get label() {
101
+ return this._label ?? this.text;
102
+ }
103
+ set label(value) {
104
+ this._label = value;
105
+ }
106
+ set text(value) {
107
+ this._text = value;
108
+ }
109
+ get text() {
110
+ return this._text ?? "";
82
111
  }
83
112
  /**
84
- * Places document focus on a tree item
85
- *
86
- * @public
87
- * @param el - the element to focus
113
+ * Provides an accessible name for use by parent components.
114
+ * Note: Does not implement full accessible name computation, e.g. slotted content is missed.
115
+ * @internal
88
116
  */
89
- static focusItem(el) {
90
- el.focusable = true;
91
- el.focus();
117
+ _getAccessibleName() {
118
+ return this.ariaLabel || `${this.text}${this.textSecondary ? ` ${this.textSecondary}` : ""}`;
119
+ }
120
+ get form() {
121
+ return null;
122
+ }
123
+ get _hasMatchedText() {
124
+ return Boolean(this.matchedText ?? this._vvdSearchText);
125
+ }
126
+ get _matchedRange() {
127
+ const matchedText = this.matchedText ?? this._vvdSearchText;
128
+ if (matchedText) {
129
+ const matchIndex = this.text.toLowerCase().indexOf(matchedText.toLowerCase());
130
+ return matchIndex === -1 ? { from: 0, to: 0 } : {
131
+ from: matchIndex,
132
+ to: matchIndex + matchedText.length
133
+ };
134
+ }
135
+ return { from: 0, to: 0 };
92
136
  }
93
137
  /**
94
- * Gets number of children
95
- *
96
138
  * @internal
97
139
  */
98
- childItemLength() {
99
- const treeChildren = this.childItems.filter(
100
- (item) => {
101
- return isTreeItemElement(item);
102
- }
103
- );
104
- return treeChildren.length;
140
+ connectedCallback() {
141
+ super.connectedCallback();
142
+ if (!this.dirtySelected) {
143
+ this.selected = this.defaultSelected;
144
+ this.dirtySelected = false;
145
+ }
105
146
  }
106
147
  }
107
148
  __decorateClass([
108
- attr
109
- ], TreeItem.prototype, "text");
149
+ attr({
150
+ converter: {
151
+ fromView: (value) => {
152
+ if (value === true || value === "true") {
153
+ return true;
154
+ }
155
+ if (value === false || value === "false") {
156
+ return false;
157
+ }
158
+ return void 0;
159
+ },
160
+ toView: (value) => value
161
+ }
162
+ })
163
+ ], ListboxOption.prototype, "checked", 2);
164
+ __decorateClass([
165
+ attr({ attribute: "selected", mode: "boolean" })
166
+ ], ListboxOption.prototype, "defaultSelected", 2);
167
+ // @ts-expect-error Type is incorrectly non-optional
110
168
  __decorateClass([
111
169
  attr({ mode: "boolean" })
112
- ], TreeItem.prototype, "expanded");
170
+ ], ListboxOption.prototype, "disabled", 2);
171
+ __decorateClass([
172
+ attr({ attribute: "current-selected", mode: "boolean" })
173
+ ], ListboxOption.prototype, "selected", 2);
174
+ __decorateClass([
175
+ attr({ attribute: "value" })
176
+ ], ListboxOption.prototype, "value", 2);
113
177
  __decorateClass([
114
178
  attr({
115
- mode: "boolean"
179
+ attribute: "label"
116
180
  })
117
- ], TreeItem.prototype, "selected");
181
+ ], ListboxOption.prototype, "_label", 2);
118
182
  __decorateClass([
119
- attr({ mode: "boolean" })
120
- ], TreeItem.prototype, "disabled");
183
+ attr({
184
+ attribute: "text"
185
+ })
186
+ ], ListboxOption.prototype, "_text", 2);
121
187
  __decorateClass([
122
- observable
123
- ], TreeItem.prototype, "focusable");
124
- // @ts-expect-error Type is incorrectly non-optional
188
+ attr({ attribute: "text-secondary" })
189
+ ], ListboxOption.prototype, "textSecondary", 2);
125
190
  __decorateClass([
126
191
  observable
127
- ], TreeItem.prototype, "childItems");
192
+ ], ListboxOption.prototype, "_highlighted", 2);
128
193
  __decorateClass([
129
194
  observable
130
- ], TreeItem.prototype, "items");
131
- // @ts-expect-error Type is incorrectly non-optional
195
+ ], ListboxOption.prototype, "_displayCheckmark", 2);
196
+ __decorateClass([
197
+ attr({ attribute: "matched-text" })
198
+ ], ListboxOption.prototype, "matchedText", 2);
132
199
  __decorateClass([
133
200
  observable
134
- ], TreeItem.prototype, "nested");
135
- // @ts-expect-error Type is incorrectly non-optional
201
+ ], ListboxOption.prototype, "_vvdSearchText", 2);
202
+ __decorateClass([
203
+ volatile
204
+ ], ListboxOption.prototype, "_hasMatchedText", 1);
136
205
  __decorateClass([
137
206
  observable
138
- ], TreeItem.prototype, "renderCollapsedChildren");
207
+ ], ListboxOption.prototype, "_isNotMatching", 2);
208
+ __decorateClass([
209
+ volatile
210
+ ], ListboxOption.prototype, "_matchedRange", 1);
211
+ __decorateClass([
212
+ attr({ attribute: "tag-connotation" })
213
+ ], ListboxOption.prototype, "tagConnotation", 2);
139
214
 
140
- const getClasses = ({ disabled, selected }) => classNames(
141
- "control",
142
- ["disabled", disabled],
143
- ["selected", Boolean(selected)]
215
+ const getClasses = (x) => classNames(
216
+ "base",
217
+ ["disabled", x.disabled],
218
+ ["selected", Boolean(x.selected)],
219
+ ["hover", Boolean(x._highlighted)],
220
+ ["active", Boolean(x.checked)],
221
+ ["icon", Boolean(x.icon)],
222
+ ["two-lines", Boolean(x.text?.length) && Boolean(x.textSecondary?.length)]
144
223
  );
145
- const expandCollapseButton = (context) => {
224
+ function text() {
225
+ return html`${when(
226
+ (x) => x.text || x.textSecondary,
227
+ html`<span class="text">
228
+ ${when(
229
+ (x) => x.text,
230
+ html`<span class="text-primary">
231
+ ${when(
232
+ (x) => x._hasMatchedText,
233
+ html`${(x) => x.text.slice(0, x._matchedRange.from)}<span class="match"
234
+ >${(x) => x.text.slice(x._matchedRange.from, x._matchedRange.to)}</span
235
+ >`
236
+ )}${(x) => x.text.slice(x._matchedRange.to)}
237
+ </span>`
238
+ )}
239
+ ${when(
240
+ (x) => x.textSecondary,
241
+ html`<span class="text-secondary">${(x) => x.textSecondary}</span>`
242
+ )}
243
+ </span>`
244
+ )}`;
245
+ }
246
+ const ListboxOptionTemplate = (context) => {
247
+ const affixIconTemplate = affixIconTemplateFactory(context);
146
248
  const iconTag = context.tagFor(Icon);
147
249
  return html`
148
- <div aria-hidden="true"
149
- class="expandCollapseButton"
150
- @click="${(x, c) => x.handleExpandCollapseButtonClick(c.event)}"
151
- ${ref("expandCollapseButton")}
152
- >
153
- <${iconTag} class="expandCollapseIcon" name="${(x) => x.expanded ? "chevron-down-line" : "chevron-right-line"}"></${iconTag}>
154
- </div>`;
155
- };
156
- const TreeItemTemplate = (context) => {
157
- const affixIconTemplate = affixIconTemplateFactory(context);
158
- const treeItemTagName = context.tagFor(TreeItem, true);
159
- return html` <template
160
- slot="${(x) => x.isNestedItem() ? "item" : void 0}"
161
- tabindex="-1"
162
- ${applyHostSemantics({
163
- role: "treeitem",
164
- ariaExpanded: (x) => x.childItems && x.childItems.length > 0 ? x.expanded : void 0,
250
+ <template
251
+ ${applyHostSemantics({
252
+ role: "option",
253
+ ariaChecked: (x) => x.checked,
165
254
  ariaSelected: (x) => x.selected,
166
255
  ariaDisabled: (x) => x.disabled
167
256
  })}
168
- @focusin="${(x, c) => x.handleFocus(c.event)}"
169
- @focusout="${(x, c) => x.handleBlur(c.event)}"
170
- ${children({
171
- property: "childItems",
172
- filter: elements(treeItemTagName)
173
- })}
174
- >
175
- <div class="${getClasses}">
176
- ${when(
177
- (x) => x.childItems && x.childItems.length > 0,
178
- expandCollapseButton(context)
257
+ style="${(x) => x._isNotMatching ? "display: none" : ""}"
258
+ >
259
+ <div class="${getClasses}">
260
+ ${(x) => affixIconTemplate(x.icon, IconWrapper.Slot)} ${text()}
261
+ <slot name="trailing-meta"></slot>
262
+ ${when(
263
+ (x) => x._displayCheckmark && x.selected,
264
+ html`<${iconTag} class="checkmark" name="check-line"></${iconTag}>`
179
265
  )}
180
- ${(x) => affixIconTemplate(x.icon, IconWrapper.Slot)}
181
- ${(x) => x.text}
182
- </div>
183
- ${when(
184
- (x) => x.childItems && x.childItems.length > 0 && x.expanded,
185
- html` <div role="group" class="items">
186
- <slot name="item" ${slotted("items")}></slot>
187
- </div>`
188
- )}
189
- </template>`;
266
+ </div>
267
+ </template>
268
+ `;
190
269
  };
191
270
 
192
- const treeItemDefinition = defineVividComponent(
193
- "tree-item",
194
- TreeItem,
195
- TreeItemTemplate,
271
+ const styles = ":host([disabled]){cursor:not-allowed}.base{--_connotation-color-primary: var(--vvd-option-accent-primary, var(--vvd-color-canvas-text));--_connotation-color-primary-text: var(--vvd-option-accent-primary-text, var(--vvd-color-canvas));--_connotation-color-primary-increment: var(--vvd-option-accent-primary-increment, var(--vvd-color-neutral-800));--_connotation-color-firm: var(--vvd-option-accent-firm, var(--vvd-color-canvas-text));--_connotation-color-faint: var(--vvd-option-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-soft: var(--vvd-option-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-pale: var(--vvd-option-accent-pale, var(--vvd-color-neutral-300));--_connotation-color-dim: var(--vvd-option-accent-dim, var(--vvd-color-neutral-200))}.base{--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}@media (hover: hover){.base:hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-faint);--_appearance-color-outline: transparent}}.base.hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-faint);--_appearance-color-outline: transparent}.base:disabled{--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.base.disabled{--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.base:active:where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.base.active:where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.base.selected:where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}@media (hover: hover){.base.selected:hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-dim);--_appearance-color-outline: transparent}}.base.selected.hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-dim);--_appearance-color-outline: transparent}.base{display: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(--_option-appearance-color-text, var(--_appearance-color-text));font:var(--vvd-typography-base);gap:var(--_option-gap);hyphens:auto;inline-size:100%;min-block-size:var(--_option-min-block-size);padding-inline:var(--_option-padding-inline);vertical-align:middle;word-break:break-word}.base{--_option-min-block-size: calc(1px*(40 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) ;--_option-padding-inline: calc(1px*(40 + 4*clamp(-1, var(--vvd-size-density, 0), 2))*.4) ;--_option-icon-size: calc(1px*(40 + 4*clamp(-1, var(--vvd-size-density, 0), 2))/2) }.base:not(.two-lines){--_option-gap: calc( calc(1px*(36 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) / 3);padding-block:calc(1px*(40 + 4*clamp(-1,var(--vvd-size-density, 0),2))/4)}.base.two-lines{gap:calc(1px*(40 + 4*clamp(-1,var(--vvd-size-density, 0),2))*.4);padding-block:calc(1px*(24 + 4*clamp(-1,var(--vvd-size-density, 0),2))/2)}@supports (user-select: none){.base{user-select:none}}.base:not(.disabled){cursor:pointer}.base.disabled{pointer-events:none}:host([scale=condensed]) .base{--_option-min-block-size: calc(1px*(32 + 4*clamp(-1, var(--vvd-size-density, 0), 2))) ;--_option-padding-inline: calc(1px*(24 + 4*clamp(-1, var(--vvd-size-density, 0), 2))/2) ;--_option-icon-size: calc(1px*(40 + 4*clamp(-1, var(--vvd-size-density, 0), 2))*.4) }:host([scale=condensed]) .base:not(.two-lines){--_option-gap: calc(1px*(40 + 4*clamp(-1, var(--vvd-size-density, 0), 2))/5) ;padding-block:calc(calc(1px*(36 + 4*clamp(-1,var(--vvd-size-density, 0),2))) / 6)}:host([scale=condensed]) .base.two-lines{gap:calc(calc(1px*(36 + 4*clamp(-1,var(--vvd-size-density, 0),2))) / 3);padding-block:calc(1px*(32 + 4*clamp(-1,var(--vvd-size-density, 0),2))/4)}.base.active{--focus-stroke-color: var(--vvd-color-cta-500);--focus-stroke-gap-color: transparent;box-shadow:0 0 0 4px color-mix(in srgb,var(--vvd-color-cta-500),transparent 85%),inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:1px solid var(--focus-stroke-color, var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset, 0px))}.base.hidden{display:none}.text{display:flex;flex-direction:column;font:var(--vvd-typography-base);gap:4px;margin-inline-end:auto}.text-primary,.text-secondary{display:block;font:var(--vvd-typography-base)}.text-primary{font:var(--vvd-typography-base)}.base:not(.disabled) .text-primary{color:var(--vvd-color-canvas-text)}.base.disabled .text-primary{color:var(--_appearance-color-text)}.base.two-lines .text-primary{font:var(--vvd-typography-base-bold)}.text-secondary{color:var(--vvd-color-neutral-800);font:var(--vvd-typography-base-condensed)}.base.two-lines .text-secondary{color:var(--vvd-color-neutral-600)}.base.disabled .text-secondary{color:var(--_appearance-color-text)}.base.selected:not(.disabled) .text-secondary{color:var(--vvd-color-neutral-800)}.match{color:var(--vvd-color-cta-600);font:var(--vvd-typography-base-bold)}slot[name=icon]{font-size:var(--_option-icon-size);line-height:1}.base:not(.disabled,.selected) slot[name=icon]{color:var(--vvd-color-neutral-600)}.checkmark{font-size:var(--_option-icon-size)}";
272
+
273
+ const listboxOptionDefinition = defineVividComponent(
274
+ "option",
275
+ ListboxOption,
276
+ ListboxOptionTemplate,
196
277
  [iconDefinition],
197
278
  {
198
279
  styles
199
280
  }
200
281
  );
201
- const registerTreeItem = createRegisterFunction(treeItemDefinition);
282
+ const registerOption = createRegisterFunction(listboxOptionDefinition);
202
283
 
203
- export { TreeItem as T, isTreeItemElement as i, registerTreeItem as r, treeItemDefinition as t };
284
+ export { ListboxOption as L, isListboxOption as i, listboxOptionDefinition as l, registerOption as r };