q2-tecton-elements 1.14.3 → 1.16.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 (216) hide show
  1. package/dist/cjs/{index-0fec9f3b.js → index-afc50fbb.js} +18 -0
  2. package/dist/cjs/loader.cjs.js +1 -1
  3. package/dist/cjs/q2-avatar.cjs.entry.js +7 -2
  4. package/dist/cjs/{q2-input.cjs.entry.js → q2-badge_2.cjs.entry.js} +77 -18
  5. package/dist/cjs/q2-btn_2.cjs.entry.js +7 -6
  6. package/dist/cjs/q2-calendar.cjs.entry.js +5 -6
  7. package/dist/cjs/q2-card.cjs.entry.js +15 -8
  8. package/dist/cjs/q2-carousel-pane.cjs.entry.js +2 -2
  9. package/dist/cjs/q2-carousel.cjs.entry.js +2 -2
  10. package/dist/cjs/q2-chart-donut.cjs.entry.js +8 -3
  11. package/dist/cjs/q2-checkbox-group.cjs.entry.js +2 -2
  12. package/dist/cjs/q2-checkbox.cjs.entry.js +12 -13
  13. package/dist/cjs/q2-dropdown-item.cjs.entry.js +2 -2
  14. package/dist/cjs/q2-dropdown.cjs.entry.js +2 -2
  15. package/dist/cjs/q2-editable-field.cjs.entry.js +4 -4
  16. package/dist/cjs/q2-icon.cjs.entry.js +2 -2
  17. package/dist/cjs/q2-loc.cjs.entry.js +2 -2
  18. package/dist/cjs/q2-message.cjs.entry.js +2 -2
  19. package/dist/cjs/q2-optgroup.cjs.entry.js +2 -2
  20. package/dist/cjs/q2-option-list.cjs.entry.js +6 -6
  21. package/dist/cjs/q2-option.cjs.entry.js +12 -1
  22. package/dist/cjs/q2-pagination.cjs.entry.js +2 -2
  23. package/dist/cjs/q2-pill.cjs.entry.js +10 -3
  24. package/dist/cjs/q2-radio-group.cjs.entry.js +2 -2
  25. package/dist/cjs/q2-radio.cjs.entry.js +3 -2
  26. package/dist/cjs/q2-section.cjs.entry.js +2 -2
  27. package/dist/cjs/q2-select.cjs.entry.js +300 -195
  28. package/dist/cjs/q2-stepper-pane.cjs.entry.js +2 -2
  29. package/dist/cjs/q2-stepper-vertical.cjs.entry.js +3 -2
  30. package/dist/cjs/q2-stepper.cjs.entry.js +21 -4
  31. package/dist/cjs/q2-tab-container.cjs.entry.js +16 -6
  32. package/dist/cjs/q2-tab-pane.cjs.entry.js +8 -1
  33. package/dist/cjs/q2-tag.cjs.entry.js +2 -2
  34. package/dist/cjs/q2-tecton-elements.cjs.js +1 -1
  35. package/dist/cjs/q2-textarea.cjs.entry.js +2 -2
  36. package/dist/cjs/q2-tooltip.cjs.entry.js +33 -0
  37. package/dist/cjs/tecton-tab-pane.cjs.entry.js +6 -1
  38. package/dist/collection/collection-manifest.json +1 -0
  39. package/dist/collection/components/q2-avatar/index.js +8 -2
  40. package/dist/collection/components/q2-avatar/styles.css +9 -1
  41. package/dist/collection/components/q2-badge/index.js +4 -9
  42. package/dist/collection/components/q2-badge/styles.css +21 -14
  43. package/dist/collection/components/q2-btn/index.js +7 -6
  44. package/dist/collection/components/q2-btn/styles.css +10 -12
  45. package/dist/collection/components/q2-calendar/helpers.js +1 -1
  46. package/dist/collection/components/q2-calendar/index.js +2 -3
  47. package/dist/collection/components/q2-calendar/styles.css +7 -7
  48. package/dist/collection/components/q2-card/index.js +33 -8
  49. package/dist/collection/components/q2-card/styles.css +33 -36
  50. package/dist/collection/components/q2-carousel/styles.css +1 -1
  51. package/dist/collection/components/q2-carousel-pane/styles.css +1 -1
  52. package/dist/collection/components/q2-chart-donut/index.js +6 -1
  53. package/dist/collection/components/q2-chart-donut/styles.css +8 -5
  54. package/dist/collection/components/q2-checkbox/index.js +10 -11
  55. package/dist/collection/components/q2-checkbox/styles.css +2 -2
  56. package/dist/collection/components/q2-checkbox-group/styles.css +3 -3
  57. package/dist/collection/components/q2-dropdown/styles.css +6 -6
  58. package/dist/collection/components/q2-dropdown-item/styles.css +3 -3
  59. package/dist/collection/components/q2-editable-field/index.js +19 -2
  60. package/dist/collection/components/q2-editable-field/styles.css +4 -4
  61. package/dist/collection/components/q2-icon/styles.css +1 -1
  62. package/dist/collection/components/q2-input/index.js +90 -23
  63. package/dist/collection/components/q2-input/styles.css +33 -26
  64. package/dist/collection/components/q2-loading/styles.css +4 -4
  65. package/dist/collection/components/q2-loc/styles.css +1 -1
  66. package/dist/collection/components/q2-message/styles.css +19 -17
  67. package/dist/collection/components/q2-optgroup/styles.css +7 -11
  68. package/dist/collection/components/q2-option/index.js +15 -3
  69. package/dist/collection/components/q2-option/styles.css +12 -5
  70. package/dist/collection/components/q2-option-list/index.js +22 -7
  71. package/dist/collection/components/q2-option-list/styles.css +5 -5
  72. package/dist/collection/components/q2-pagination/styles.css +1 -1
  73. package/dist/collection/components/q2-pill/index.js +26 -2
  74. package/dist/collection/components/q2-pill/styles.css +18 -17
  75. package/dist/collection/components/q2-radio/index.js +1 -0
  76. package/dist/collection/components/q2-radio/styles.css +2 -2
  77. package/dist/collection/components/q2-radio-group/styles.css +3 -3
  78. package/dist/collection/components/q2-section/styles.css +6 -6
  79. package/dist/collection/components/q2-select/index.js +316 -202
  80. package/dist/collection/components/q2-select/styles.css +24 -13
  81. package/dist/collection/components/q2-stepper/index.js +30 -6
  82. package/dist/collection/components/q2-stepper/styles.css +50 -12
  83. package/dist/collection/components/q2-stepper-pane/styles.css +1 -1
  84. package/dist/collection/components/q2-stepper-vertical/index.js +1 -0
  85. package/dist/collection/components/q2-stepper-vertical/styles.css +14 -14
  86. package/dist/collection/components/q2-tab-container/index.js +22 -4
  87. package/dist/collection/components/q2-tab-container/styles.css +23 -9
  88. package/dist/collection/components/q2-tab-pane/index.js +58 -1
  89. package/dist/collection/components/q2-tab-pane/styles.css +1 -1
  90. package/dist/collection/components/q2-tag/styles.css +4 -6
  91. package/dist/collection/components/q2-textarea/styles.css +2 -2
  92. package/dist/collection/components/q2-tooltip/index.js +120 -0
  93. package/dist/collection/components/q2-tooltip/styles.css +276 -0
  94. package/dist/collection/components/tecton-tab-pane/index.js +57 -1
  95. package/dist/collection/components/tecton-tab-pane/styles.css +1 -1
  96. package/dist/collection/utils/index.js +18 -2
  97. package/dist/esm/{index-14e81efa.js → index-2ca8c93c.js} +18 -2
  98. package/dist/esm/loader.js +1 -1
  99. package/dist/esm/q2-avatar.entry.js +7 -2
  100. package/dist/esm/{q2-input.entry.js → q2-badge_2.entry.js} +78 -20
  101. package/dist/esm/q2-btn_2.entry.js +7 -6
  102. package/dist/esm/q2-calendar.entry.js +5 -6
  103. package/dist/esm/q2-card.entry.js +15 -8
  104. package/dist/esm/q2-carousel-pane.entry.js +2 -2
  105. package/dist/esm/q2-carousel.entry.js +2 -2
  106. package/dist/esm/q2-chart-donut.entry.js +8 -3
  107. package/dist/esm/q2-checkbox-group.entry.js +2 -2
  108. package/dist/esm/q2-checkbox.entry.js +12 -13
  109. package/dist/esm/q2-dropdown-item.entry.js +2 -2
  110. package/dist/esm/q2-dropdown.entry.js +2 -2
  111. package/dist/esm/q2-editable-field.entry.js +4 -4
  112. package/dist/esm/q2-icon.entry.js +2 -2
  113. package/dist/esm/q2-loc.entry.js +2 -2
  114. package/dist/esm/q2-message.entry.js +2 -2
  115. package/dist/esm/q2-optgroup.entry.js +2 -2
  116. package/dist/esm/q2-option-list.entry.js +6 -6
  117. package/dist/esm/q2-option.entry.js +12 -1
  118. package/dist/esm/q2-pagination.entry.js +2 -2
  119. package/dist/esm/q2-pill.entry.js +10 -3
  120. package/dist/esm/q2-radio-group.entry.js +2 -2
  121. package/dist/esm/q2-radio.entry.js +3 -2
  122. package/dist/esm/q2-section.entry.js +2 -2
  123. package/dist/esm/q2-select.entry.js +300 -195
  124. package/dist/esm/q2-stepper-pane.entry.js +2 -2
  125. package/dist/esm/q2-stepper-vertical.entry.js +3 -2
  126. package/dist/esm/q2-stepper.entry.js +21 -4
  127. package/dist/esm/q2-tab-container.entry.js +16 -6
  128. package/dist/esm/q2-tab-pane.entry.js +9 -2
  129. package/dist/esm/q2-tag.entry.js +2 -2
  130. package/dist/esm/q2-tecton-elements.js +1 -1
  131. package/dist/esm/q2-textarea.entry.js +2 -2
  132. package/dist/esm/q2-tooltip.entry.js +29 -0
  133. package/dist/esm/tecton-tab-pane.entry.js +7 -2
  134. package/dist/q2-tecton-elements/p-0a8b8d14.entry.js +1 -0
  135. package/dist/q2-tecton-elements/p-0b5fbbe8.entry.js +1 -0
  136. package/dist/q2-tecton-elements/p-0d00030f.entry.js +1 -0
  137. package/dist/q2-tecton-elements/{p-85cff6ec.entry.js → p-0e9c7220.entry.js} +1 -1
  138. package/dist/q2-tecton-elements/p-1b0f826e.entry.js +1 -0
  139. package/dist/q2-tecton-elements/p-1c430c2a.entry.js +1 -0
  140. package/dist/q2-tecton-elements/p-2d2008fd.entry.js +1 -0
  141. package/dist/q2-tecton-elements/p-34f99830.entry.js +1 -0
  142. package/dist/q2-tecton-elements/{p-ead64414.entry.js → p-35bde69c.entry.js} +1 -1
  143. package/dist/q2-tecton-elements/{p-d46efe36.entry.js → p-376988ef.entry.js} +1 -1
  144. package/dist/q2-tecton-elements/p-41fcf343.js +1 -0
  145. package/dist/q2-tecton-elements/p-49612230.entry.js +1 -0
  146. package/dist/q2-tecton-elements/p-4b48fde6.entry.js +1 -0
  147. package/dist/q2-tecton-elements/p-4ec2cb69.entry.js +1 -0
  148. package/dist/q2-tecton-elements/{p-ea2a290e.entry.js → p-5270b0ff.entry.js} +1 -1
  149. package/dist/q2-tecton-elements/p-5e990654.entry.js +1 -0
  150. package/dist/q2-tecton-elements/p-60a7a11e.entry.js +1 -0
  151. package/dist/q2-tecton-elements/p-677faf2c.entry.js +1 -0
  152. package/dist/q2-tecton-elements/p-6e10db80.entry.js +1 -0
  153. package/dist/q2-tecton-elements/p-6f884c60.entry.js +1 -0
  154. package/dist/q2-tecton-elements/p-822d3d6c.entry.js +1 -0
  155. package/dist/q2-tecton-elements/p-8584c6bc.entry.js +1 -0
  156. package/dist/q2-tecton-elements/p-87766054.entry.js +1 -0
  157. package/dist/q2-tecton-elements/{p-fd5130c4.entry.js → p-879aa7ac.entry.js} +2 -2
  158. package/dist/q2-tecton-elements/p-92e9f290.entry.js +1 -0
  159. package/dist/q2-tecton-elements/{p-627df469.entry.js → p-b6c45ef6.entry.js} +1 -1
  160. package/dist/q2-tecton-elements/{p-cf9e8120.entry.js → p-b7dc4e93.entry.js} +1 -1
  161. package/dist/q2-tecton-elements/p-c59d601e.entry.js +1 -0
  162. package/dist/q2-tecton-elements/p-d040bf99.entry.js +1 -0
  163. package/dist/q2-tecton-elements/p-d79386c6.entry.js +1 -0
  164. package/dist/q2-tecton-elements/{p-fbfb3615.entry.js → p-dd3f64a7.entry.js} +1 -1
  165. package/dist/q2-tecton-elements/{p-58e42fc5.entry.js → p-dd792081.entry.js} +1 -1
  166. package/dist/q2-tecton-elements/p-ef2f68b2.entry.js +1 -0
  167. package/dist/q2-tecton-elements/{p-882eaf0f.entry.js → p-f617c54a.entry.js} +1 -1
  168. package/dist/q2-tecton-elements/p-f66adef0.entry.js +1 -0
  169. package/dist/q2-tecton-elements/q2-tecton-elements.esm.js +1 -1
  170. package/dist/types/components/q2-avatar/index.d.ts +2 -0
  171. package/dist/types/components/q2-badge/index.d.ts +0 -1
  172. package/dist/types/components/q2-card/index.d.ts +1 -0
  173. package/dist/types/components/q2-checkbox/index.d.ts +0 -1
  174. package/dist/types/components/q2-editable-field/index.d.ts +1 -0
  175. package/dist/types/components/q2-input/index.d.ts +6 -2
  176. package/dist/types/components/q2-option/index.d.ts +2 -0
  177. package/dist/types/components/q2-option-list/index.d.ts +4 -4
  178. package/dist/types/components/q2-pill/index.d.ts +2 -0
  179. package/dist/types/components/q2-select/index.d.ts +37 -24
  180. package/dist/types/components/q2-stepper/index.d.ts +1 -0
  181. package/dist/types/components/q2-tab-container/index.d.ts +4 -0
  182. package/dist/types/components/q2-tab-pane/index.d.ts +5 -1
  183. package/dist/types/components/q2-tooltip/index.d.ts +10 -0
  184. package/dist/types/components/tecton-tab-pane/index.d.ts +5 -1
  185. package/dist/types/components.d.ts +43 -0
  186. package/dist/types/utils/index.d.ts +3 -1
  187. package/dist/types/workspace/workspace/{tecton-production_release_1.14.x → Tecton_tecton-production_master}/packages/q2-tecton-elements/.stencil/test/elements/q2-tag-test.d.ts +0 -0
  188. package/dist/types/workspace/workspace/{tecton-production_release_1.14.x → Tecton_tecton-production_master}/packages/q2-tecton-elements/.stencil/test/helpers.d.ts +0 -0
  189. package/package.json +2 -2
  190. package/dist/cjs/q2-badge.cjs.entry.js +0 -43
  191. package/dist/esm/q2-badge.entry.js +0 -39
  192. package/dist/q2-tecton-elements/p-0675f9c8.entry.js +0 -1
  193. package/dist/q2-tecton-elements/p-09464226.entry.js +0 -1
  194. package/dist/q2-tecton-elements/p-0e13d5ba.entry.js +0 -1
  195. package/dist/q2-tecton-elements/p-1eed57aa.entry.js +0 -1
  196. package/dist/q2-tecton-elements/p-3796397e.entry.js +0 -1
  197. package/dist/q2-tecton-elements/p-37f1984c.entry.js +0 -1
  198. package/dist/q2-tecton-elements/p-3cfc0cb4.entry.js +0 -1
  199. package/dist/q2-tecton-elements/p-431bf43e.js +0 -1
  200. package/dist/q2-tecton-elements/p-65e2df25.entry.js +0 -1
  201. package/dist/q2-tecton-elements/p-663cb6e8.entry.js +0 -1
  202. package/dist/q2-tecton-elements/p-6727f6d0.entry.js +0 -1
  203. package/dist/q2-tecton-elements/p-6ced7858.entry.js +0 -1
  204. package/dist/q2-tecton-elements/p-706249e1.entry.js +0 -1
  205. package/dist/q2-tecton-elements/p-7249de38.entry.js +0 -1
  206. package/dist/q2-tecton-elements/p-7ddb159c.entry.js +0 -1
  207. package/dist/q2-tecton-elements/p-87f448ab.entry.js +0 -1
  208. package/dist/q2-tecton-elements/p-8f815678.entry.js +0 -1
  209. package/dist/q2-tecton-elements/p-92886dbe.entry.js +0 -1
  210. package/dist/q2-tecton-elements/p-94303312.entry.js +0 -1
  211. package/dist/q2-tecton-elements/p-9af46ffc.entry.js +0 -1
  212. package/dist/q2-tecton-elements/p-9d8a963b.entry.js +0 -1
  213. package/dist/q2-tecton-elements/p-b066cdd1.entry.js +0 -1
  214. package/dist/q2-tecton-elements/p-bd6c6239.entry.js +0 -1
  215. package/dist/q2-tecton-elements/p-c4eff511.entry.js +0 -1
  216. package/dist/q2-tecton-elements/p-e435159b.entry.js +0 -1
@@ -1,5 +1,5 @@
1
1
  import { Component, Prop, Element, h, Listen, State, Event, Watch, } from '@stencil/core';
2
- import { createGuid, handleAriaLabel, isEventFromElement, loc, overrideFocus, setPopProperties } from 'src/utils';
2
+ import { createGuid, handleAriaLabel, isEventFromElement, isRelatedTargetWithinHost, loc, overrideFocus, resizeIframe, setPopProperties, } from 'src/utils';
3
3
  export class Q2Select {
4
4
  constructor() {
5
5
  this.selectedOptions = [];
@@ -15,6 +15,7 @@ export class Q2Select {
15
15
  this.searchText = '';
16
16
  this.hasCustomDisplay = false;
17
17
  this.inputFocused = false;
18
+ this.prioritizeSearch = false;
18
19
  this.scheduledAfterRender = [];
19
20
  this.keyStore = {
20
21
  queue: [],
@@ -82,7 +83,7 @@ export class Q2Select {
82
83
  setFocus(matched);
83
84
  }
84
85
  };
85
- ////// ACTIONS ////////
86
+ /// Event handlers ///
86
87
  this.dropdownFocusoutHandler = (event) => {
87
88
  const { relatedTarget } = event;
88
89
  const isInDropdown = this.dropdownContainer.contains(relatedTarget);
@@ -105,11 +106,10 @@ export class Q2Select {
105
106
  case ' ':
106
107
  case 'Enter':
107
108
  event.preventDefault();
108
- event.stopPropagation();
109
109
  const newOption = this.hostElement.querySelector(`[option-id="${this.activeOptionId}"]`);
110
110
  if (!newOption || newOption.disabled)
111
111
  break;
112
- this.selectOption(newOption.value, true);
112
+ this.selectOption(newOption, true);
113
113
  break;
114
114
  case 'ArrowUp':
115
115
  event.preventDefault();
@@ -163,7 +163,9 @@ export class Q2Select {
163
163
  const myOption = this.hostElement.querySelector(`[option-id="${this.activeOptionId}"]`);
164
164
  if (!myOption || myOption.disabled)
165
165
  return;
166
- this.selectOption(myOption.value);
166
+ if (myOption.selected)
167
+ return;
168
+ this.selectOption(myOption);
167
169
  break;
168
170
  case 'Esc':
169
171
  case 'Escape':
@@ -180,10 +182,11 @@ export class Q2Select {
180
182
  break;
181
183
  }
182
184
  };
185
+ /* tslint:enable:cyclomatic-complexity */
183
186
  this.inputKeydownHandler = (event) => {
184
187
  event.stopPropagation();
185
- const { key } = event;
186
- const { optionElements, dropdownOpen, searchable } = this;
188
+ const { key, shiftKey } = event;
189
+ const { optionElements, searchable } = this;
187
190
  switch (key) {
188
191
  case 'ArrowDown':
189
192
  event.preventDefault();
@@ -204,14 +207,14 @@ export class Q2Select {
204
207
  break;
205
208
  case 'Escape':
206
209
  case 'Esc':
207
- if (dropdownOpen) {
208
- this.closeDropdown();
209
- }
210
- else {
211
- this.searchText = '';
212
- }
210
+ this.closeDropdown();
211
+ break;
212
+ case 'Tab':
213
+ this.closeDropdown();
213
214
  break;
214
215
  default:
216
+ if (shiftKey)
217
+ break;
215
218
  if (searchable) {
216
219
  this.openDropdownWithoutActiveElement();
217
220
  break;
@@ -235,10 +238,11 @@ export class Q2Select {
235
238
  const didChangeText = inputValue !== eventValue;
236
239
  const shouldClearValue = !!this.value && didChangeText;
237
240
  if (shouldClearValue) {
238
- this.selectOption('');
241
+ this.selectOption(null);
239
242
  }
240
243
  if (!this.dropdownOpen)
241
244
  this.openDropdownWithoutActiveElement();
245
+ this.prioritizeSearch = true;
242
246
  this.searchText = eventValue;
243
247
  this.input.emit({ query: eventValue });
244
248
  };
@@ -260,6 +264,11 @@ export class Q2Select {
260
264
  }
261
265
  }
262
266
  };
267
+ this.onCustomDisplayClick = (event) => {
268
+ event.stopPropagation();
269
+ this.focusInput();
270
+ this.toggleDropdown();
271
+ };
263
272
  this.showSelectedOptions = (event) => {
264
273
  event.stopImmediatePropagation();
265
274
  this.onlyShowingSelected = true;
@@ -274,17 +283,189 @@ export class Q2Select {
274
283
  optionElement._multiSelectHidden = false;
275
284
  });
276
285
  };
277
- this.onCustomDisplayClick = (event) => {
278
- event.stopPropagation();
279
- this.focusInput();
280
- this.toggleDropdown();
281
- };
282
286
  }
283
- resizeIframe() {
284
- return window.TectonElements && window.TectonElements.resizeIframe && window.TectonElements.resizeIframe();
287
+ /// Lifecycle Hooks ///
288
+ componentWillLoad() {
289
+ handleAriaLabel(this);
290
+ }
291
+ componentDidLoad() {
292
+ const observer = new MutationObserver(this.onMutationObserved);
293
+ observer.observe(this.hostElement, { childList: true, subtree: true });
294
+ this.mutationObserver = observer;
295
+ this.onMutationObserved();
296
+ overrideFocus(this.hostElement);
297
+ setTimeout(() => this.checkSelectedDisplay(), 0);
298
+ }
299
+ componentDidRender() {
300
+ setTimeout(() => {
301
+ this.scheduledAfterRender.forEach(fn => fn());
302
+ this.scheduledAfterRender = [];
303
+ }, 25);
304
+ }
305
+ disconnectedCallback() {
306
+ var _a;
307
+ (_a = this.mutationObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
308
+ this.mutationObserver = null;
309
+ }
310
+ /// Getters ///
311
+ get isComponentFocused() {
312
+ return document.activeElement === this.hostElement || !!this.hostElement.querySelector(':focus');
313
+ }
314
+ get isSearchMode() {
315
+ return (this.searchable && this.inputFocused) || this.searchText;
316
+ }
317
+ get badgeValue() {
318
+ if (!this.multiple)
319
+ return;
320
+ const optionsLength = this.selectedOptions.length;
321
+ if (this.dropdownOpen && this.searchable)
322
+ return optionsLength || null;
323
+ else
324
+ return optionsLength > 1 ? `+${optionsLength - 1}` : null;
325
+ }
326
+ get minPopHeight() {
327
+ const { minRows } = this;
328
+ const firstOption = this.hostElement.querySelector('q2-option:not([hidden])');
329
+ const minHeight = firstOption ? window.getComputedStyle(firstOption).minHeight : '44px';
330
+ return minRows * parseInt(minHeight);
331
+ }
332
+ get selectedDisplay() {
333
+ if (this.prioritizeSearch || this.searchText)
334
+ return this.searchText;
335
+ if (this.hasCustomDisplay)
336
+ return '';
337
+ return this.multiple ? this.calculateMultiSelectSelectedDisplay() : this.calculateSingleSelectSelectedDisplay();
338
+ }
339
+ get selectedDisplaySlot() {
340
+ return this.hostElement.querySelector('[slot="_selected-display"]');
341
+ }
342
+ get firstSelectedValue() {
343
+ var _a, _b;
344
+ if (this.multiple)
345
+ return (_b = (_a = this.selectedOptions) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : null;
346
+ return this.value;
347
+ }
348
+ get firstSelectedOptionElement() {
349
+ const { firstSelectedValue } = this;
350
+ return firstSelectedValue ? this.optionElements.find(({ value }) => value === firstSelectedValue) : null;
351
+ }
352
+ get optionElements() {
353
+ return Array.from(this.hostElement.querySelectorAll('q2-option'));
285
354
  }
355
+ get visibleOptionElements() {
356
+ return Array.from(this.hostElement.querySelectorAll('q2-option:not([_multiselecthidden])'));
357
+ }
358
+ get wrapperClasses() {
359
+ const { errors } = this;
360
+ const classes = ['q2-select-container'];
361
+ if (this.dropdownOpen)
362
+ classes.push('dropdown-open');
363
+ if (Array.isArray(errors) && errors.length > 0)
364
+ classes.push('has-error');
365
+ if (this.inputFocused)
366
+ classes.push('is-focused');
367
+ if (this.searchable)
368
+ classes.push('is-searchable');
369
+ return classes.join(' ');
370
+ }
371
+ /// Watchers ///
372
+ ariaLabelObserver() {
373
+ handleAriaLabel(this);
374
+ }
375
+ valueUpdated() {
376
+ if (this.multiple)
377
+ return;
378
+ this.updateSingleOptionAttrs();
379
+ }
380
+ selectedOptionsUpdated() {
381
+ if (!this.multiple)
382
+ return;
383
+ this.updateMultipleOptionAttrs();
384
+ }
385
+ multilineOptionsChanged(newValue, oldValue) {
386
+ if (newValue === oldValue)
387
+ return;
388
+ this.optionElements.forEach(element => (element.multiline = newValue));
389
+ }
390
+ dropdownOpenChanged(isOpen) {
391
+ this.scheduledAfterRender.push(() => {
392
+ const { multiple, multiSelectHeader, dropdownContainer } = this;
393
+ const height = (isOpen && multiple && (multiSelectHeader === null || multiSelectHeader === void 0 ? void 0 : multiSelectHeader.offsetHeight)) || 0;
394
+ if (height) {
395
+ dropdownContainer.style.setProperty('--comp-multi-select-header-height', `${height}px`);
396
+ }
397
+ else {
398
+ dropdownContainer.style.removeProperty('--comp-multi-select-header-height');
399
+ }
400
+ });
401
+ }
402
+ /// Listeners ///
403
+ keydownHandler(event) {
404
+ this.inputKeydownHandler(event);
405
+ }
406
+ onHostElementChange(event) {
407
+ if (this.readonly)
408
+ return;
409
+ if (event.target !== this.hostElement || this.hostElement.onchange)
410
+ return;
411
+ if (this.multiple) {
412
+ this.selectedOptions = event.detail.selectedOptions;
413
+ }
414
+ else {
415
+ this.value = event.detail.value;
416
+ }
417
+ }
418
+ onHostElementInput(event) {
419
+ if (!this.searchable || event.target !== this.hostElement || this.hostElement.oninput)
420
+ return;
421
+ const options = this.optionElements;
422
+ const query = this.searchText.trim().toLocaleLowerCase();
423
+ let matchedCount = 0;
424
+ options.forEach(option => {
425
+ var _a;
426
+ if (query === '') {
427
+ option.hidden = false;
428
+ return;
429
+ }
430
+ const title = ((_a = option.firstElementChild) === null || _a === void 0 ? void 0 : _a.tagName) === 'Q2-CARD'
431
+ ? option.firstElementChild.title
432
+ : null;
433
+ const { display = '', innerText = '' } = option;
434
+ const searchParams = [display, title, innerText];
435
+ const matched = searchParams.some(text => { var _a; return (_a = text === null || text === void 0 ? void 0 : text.toLocaleLowerCase().includes(query)) !== null && _a !== void 0 ? _a : false; });
436
+ option.hidden = !matched;
437
+ if (matched)
438
+ matchedCount++;
439
+ });
440
+ const statusMessageLocString = query
441
+ ? 'tecton.element.select.searchable.results'
442
+ : 'tecton.element.select.allOptions';
443
+ const count = query ? matchedCount : options.length;
444
+ this.setStatusMessage(loc(statusMessageLocString, [count]));
445
+ }
446
+ delegateFocus(event) {
447
+ const fromHost = isRelatedTargetWithinHost(event, this.hostElement);
448
+ const prioritizeSearch = (this.prioritizeSearch = fromHost && this.searchable);
449
+ if (prioritizeSearch) {
450
+ this.clearSelectedDisplay();
451
+ }
452
+ else if (isEventFromElement(event, this.hostElement)) {
453
+ this.inputField.shadowRoot.querySelector('.input-field').focus();
454
+ }
455
+ }
456
+ handleFocusout(event) {
457
+ this.prioritizeSearch = !isRelatedTargetWithinHost(event, this.hostElement) && this.searchable;
458
+ }
459
+ clickHandler(event) {
460
+ const selectedOption = event.target.closest('q2-option');
461
+ if (!selectedOption ||
462
+ (selectedOption.hasAttribute('disabled') && selectedOption.getAttribute('disabled') !== 'false'))
463
+ return;
464
+ this.selectOption(selectedOption, true);
465
+ }
466
+ /// Helpers ///
286
467
  getDefaultActiveIndex() {
287
- const firstSelected = this.optionElements.findIndex(element => element.selected);
468
+ const firstSelected = this.optionElements.findIndex(element => element.selected && !element.hidden);
288
469
  if (firstSelected > -1)
289
470
  return firstSelected;
290
471
  const firstEnabled = this.optionElements.findIndex(element => !element.hidden);
@@ -323,84 +504,67 @@ export class Q2Select {
323
504
  option.focus();
324
505
  }
325
506
  calculateMultiSelectSelectedDisplay() {
326
- if (this.selectedOptions.length === 1) {
327
- const selectedOption = this.optionElements.find(option => {
328
- return option.value === this.selectedOptions[0];
329
- });
330
- return ((selectedOption && selectedOption.display && loc(selectedOption.display)) ||
331
- (selectedOption && selectedOption.value) ||
332
- this.selectedOptions[0]);
333
- }
334
- else if (this.selectedOptions.length > 1) {
335
- return loc('tecton.element.select.multiDisplay', [this.selectedOptions.length]);
336
- }
337
- else {
507
+ var _a;
508
+ const { firstSelectedOptionElement, firstSelectedValue, multilineOptions } = this;
509
+ if (!firstSelectedValue)
338
510
  return '';
339
- }
340
- }
341
- calculateSingleSelectSelectedDisplay() {
342
- const selectedOption = this.optionElements.find(option => {
343
- return this.value === option.value;
344
- });
345
- return (selectedOption && selectedOption.display && loc(selectedOption.display)) || this.value || '';
346
- }
347
- get minPopHeight() {
348
- const { minRows } = this;
349
- const firstOption = this.hostElement.querySelector('q2-option:not([hidden])');
350
- const minHeight = firstOption ? window.getComputedStyle(firstOption).minHeight : '44px';
351
- return minRows * parseInt(minHeight);
352
- }
353
- get selectedDisplay() {
354
- if (this.hasCustomDisplay && !this.searchText) {
511
+ if (firstSelectedOptionElement === null || firstSelectedOptionElement === void 0 ? void 0 : firstSelectedOptionElement.display)
512
+ return loc(firstSelectedOptionElement.display);
513
+ if (multilineOptions && this.searchable)
514
+ return this.searchText;
515
+ if (multilineOptions)
355
516
  return '';
356
- }
357
- if (this.searchable && this.dropdownOpen && !this.value) {
358
- // when dropdown is open search selects show typing
359
- // when closed they display the same as non searchable select (what is selected)
360
- return this.searchText || '';
361
- }
362
- return this.multiple ? this.calculateMultiSelectSelectedDisplay() : this.calculateSingleSelectSelectedDisplay();
517
+ return (_a = firstSelectedOptionElement === null || firstSelectedOptionElement === void 0 ? void 0 : firstSelectedOptionElement.value) !== null && _a !== void 0 ? _a : firstSelectedValue;
363
518
  }
364
- get selectedOptionsCount() {
365
- return this.selectedOptions.length;
366
- }
367
- get optionElements() {
368
- return Array.from(this.hostElement.querySelectorAll('q2-option'));
369
- }
370
- get wrapperClasses() {
371
- const dropdownOpenClass = (this.dropdownOpen && ' dropdown-open') || '';
372
- const errorClass = Array.isArray(this.errors) && this.errors.length > 0 ? ' has-error' : '';
373
- const focusClass = this.inputFocused ? ' is-focused' : '';
374
- const searchableClass = this.searchable ? ' is-searchable' : '';
375
- return `q2-select-container${dropdownOpenClass}${errorClass}${focusClass}${searchableClass}`;
519
+ calculateSingleSelectSelectedDisplay() {
520
+ const { firstSelectedOptionElement } = this;
521
+ return ((firstSelectedOptionElement === null || firstSelectedOptionElement === void 0 ? void 0 : firstSelectedOptionElement.display) && loc(firstSelectedOptionElement.display)) || this.value || '';
376
522
  }
377
523
  updateSingleOptionAttrs() {
524
+ const { value, guid, multilineOptions } = this;
378
525
  this.optionElements.forEach((element, index) => {
379
- element.selected = this.value === element.value;
380
- element.optionId = `q2-select-${this.guid}-option-${index}`;
381
- element.multiline = this.multilineOptions;
526
+ element.selected = element.value === value;
527
+ element.optionId = `q2-select-${guid}-option-${index}`;
528
+ element.multiline = multilineOptions;
382
529
  });
383
530
  }
384
531
  updateMultipleOptionAttrs() {
385
532
  if (this.selectedOptions.length === 0) {
386
533
  this.onlyShowingSelected = false;
387
534
  }
535
+ const { selectedOptions, onlyShowingSelected, guid, multilineOptions } = this;
388
536
  this.optionElements.forEach((element, index) => {
389
- element.selected = this.selectedOptions.includes(element.value);
390
- element._multiSelectHidden = this.onlyShowingSelected ? !element.selected : false;
391
- element.optionId = `q2-select-${this.guid}-option-${index}`;
392
- element.multiline = this.multilineOptions;
537
+ element.selected = selectedOptions.includes(element.value);
538
+ element._multiSelectHidden = onlyShowingSelected ? !element.selected : false;
539
+ element.optionId = `q2-select-${guid}-option-${index}`;
540
+ element.multiline = multilineOptions;
393
541
  });
394
542
  }
395
- selectOption(value, focusInputOnClose = false) {
543
+ focusSelectedSibling(option) {
544
+ if (!this.onlyShowingSelected)
545
+ return;
546
+ const { visibleOptionElements } = this;
547
+ if (visibleOptionElements.length < 2)
548
+ return;
549
+ const optionIndex = visibleOptionElements.indexOf(option);
550
+ const visibleFocusIndex = optionIndex ? optionIndex - 1 : optionIndex + 1;
551
+ const optionToFocus = visibleOptionElements[visibleFocusIndex];
552
+ const focusIndex = this.optionElements.indexOf(optionToFocus);
553
+ this.activeIndex = focusIndex;
554
+ this.setFocusedOption();
555
+ }
556
+ selectOption(option, focusInputOnClose = false) {
557
+ var _a;
558
+ const value = (_a = option === null || option === void 0 ? void 0 : option.value) !== null && _a !== void 0 ? _a : '';
396
559
  if (this.multiple) {
397
560
  const isSelected = this.selectedOptions.includes(value);
398
561
  if (isSelected) {
562
+ this.focusSelectedSibling(option);
399
563
  this.change.emit({
400
564
  selectedOptions: this.selectedOptions.filter(selectedValue => selectedValue !== value),
401
565
  });
402
566
  }
403
- else {
567
+ else if (value) {
404
568
  this.change.emit({ selectedOptions: [...this.selectedOptions, value] });
405
569
  }
406
570
  }
@@ -421,7 +585,7 @@ export class Q2Select {
421
585
  this.activeIndex = undefined;
422
586
  this.setActiveOption();
423
587
  this.dropdownOpen = true;
424
- this.scheduledAfterRender.push(this.resizeIframe);
588
+ this.scheduledAfterRender.push(resizeIframe);
425
589
  }
426
590
  openDropdownWithActiveElement(activeIndex) {
427
591
  if (this.readonly)
@@ -432,7 +596,7 @@ export class Q2Select {
432
596
  this.scheduledAfterRender.push(() => {
433
597
  this.setFocusedOption();
434
598
  this.scrollToActiveOption();
435
- this.resizeIframe();
599
+ resizeIframe();
436
600
  });
437
601
  }
438
602
  closeDropdown() {
@@ -441,24 +605,16 @@ export class Q2Select {
441
605
  this.searchText = '';
442
606
  this.input.emit({ query: '' });
443
607
  }
444
- this.scheduledAfterRender.push(this.resizeIframe);
608
+ this.scheduledAfterRender.push(resizeIframe);
445
609
  }
446
610
  toggleDropdown() {
447
- if (this.disabled) {
611
+ if (this.disabled)
448
612
  return;
449
- }
450
- if (this.searchable) {
451
- if (!this.dropdownOpen) {
452
- this.openDropdownWithoutActiveElement();
453
- }
613
+ if (this.dropdownOpen && !this.searchText) {
614
+ this.closeDropdown();
454
615
  }
455
616
  else {
456
- if (this.dropdownOpen) {
457
- this.closeDropdown();
458
- }
459
- else {
460
- this.openDropdownWithoutActiveElement();
461
- }
617
+ this.openDropdownWithoutActiveElement();
462
618
  }
463
619
  }
464
620
  adjustActiveOptionAndScroll(numToAdd) {
@@ -478,8 +634,9 @@ export class Q2Select {
478
634
  }
479
635
  getNextVisibleIndex(direction) {
480
636
  let index = this.activeIndex + direction;
481
- while (index >= 0 && index <= this.optionElements.length - 1) {
482
- const { display, visibility } = window.getComputedStyle(this.optionElements[index]);
637
+ const { optionElements } = this;
638
+ while (index >= 0 && index <= optionElements.length - 1) {
639
+ const { display, visibility } = window.getComputedStyle(optionElements[index]);
483
640
  if (display !== 'none' && visibility !== 'hidden') {
484
641
  return index;
485
642
  }
@@ -487,94 +644,6 @@ export class Q2Select {
487
644
  }
488
645
  return -1;
489
646
  }
490
- ////////// LIFECYCLE HOOKS ////////
491
- componentWillLoad() {
492
- handleAriaLabel(this);
493
- }
494
- componentDidLoad() {
495
- const observer = new MutationObserver(this.onMutationObserved);
496
- observer.observe(this.hostElement, { childList: true, subtree: true });
497
- this.mutationObserver = observer;
498
- this.onMutationObserved();
499
- overrideFocus(this.hostElement);
500
- }
501
- componentDidRender() {
502
- setTimeout(() => {
503
- this.scheduledAfterRender.forEach(fn => fn());
504
- this.scheduledAfterRender = [];
505
- }, 25);
506
- }
507
- disconnectedCallback() {
508
- if (this.mutationObserver) {
509
- this.mutationObserver.disconnect();
510
- this.mutationObserver = null;
511
- }
512
- }
513
- ////////// OBSERVERS //////////
514
- ariaLabelObserver() {
515
- handleAriaLabel(this);
516
- }
517
- valueUpdated() {
518
- if (this.multiple) {
519
- return;
520
- }
521
- this.updateSingleOptionAttrs();
522
- }
523
- selectedOptionsUpdated() {
524
- if (!this.multiple) {
525
- return;
526
- }
527
- this.updateMultipleOptionAttrs();
528
- }
529
- multilineOptionsChanged(newValue, oldValue) {
530
- if (newValue === oldValue) {
531
- return;
532
- }
533
- this.optionElements.forEach(element => {
534
- element.multiline = this.multilineOptions;
535
- });
536
- }
537
- onHostElementChange(event) {
538
- if (this.readonly)
539
- return;
540
- if (event.target === this.hostElement && !this.hostElement.onchange) {
541
- if (this.multiple) {
542
- this.selectedOptions = event.detail.selectedOptions;
543
- }
544
- else {
545
- this.value = event.detail.value;
546
- }
547
- }
548
- }
549
- onHostElementInput(event) {
550
- if (this.searchable && event.target === this.hostElement && !this.hostElement.oninput) {
551
- const options = this.optionElements;
552
- const query = event.detail.query.trim().toLowerCase();
553
- let matchedCount = 0;
554
- options.forEach(option => {
555
- if (query === '') {
556
- option.style.display = '';
557
- }
558
- else {
559
- const { display = '', innerText = '' } = option;
560
- const matched = display.toLowerCase().includes(query) || innerText.toLowerCase().includes(query);
561
- option.hidden = !matched;
562
- if (matched)
563
- matchedCount++;
564
- }
565
- });
566
- const statusMessageLocString = query
567
- ? 'tecton.element.select.searchable.results'
568
- : 'tecton.element.select.allOptions';
569
- const count = query ? matchedCount : options.length;
570
- this.setStatusMessage(loc(statusMessageLocString, [count]));
571
- }
572
- }
573
- delegateFocus(event) {
574
- if (!isEventFromElement(event, this.hostElement))
575
- return;
576
- this.inputField.shadowRoot.querySelector('.input-field').focus();
577
- }
578
647
  setStatusMessage(message) {
579
648
  clearTimeout(this.statusMessageTimer);
580
649
  this.statusMessage = '';
@@ -582,25 +651,59 @@ export class Q2Select {
582
651
  this.statusMessage = message;
583
652
  }, 1000);
584
653
  }
585
- clickHandler(event) {
586
- const selected = event.target.closest('q2-option');
587
- if (!selected || (selected.hasAttribute('disabled') && selected.getAttribute('disabled') !== 'false')) {
588
- return;
654
+ clearSelectedDisplay() {
655
+ var _a;
656
+ (_a = this.selectedDisplaySlot) === null || _a === void 0 ? void 0 : _a.remove();
657
+ }
658
+ checkSelectedDisplay() {
659
+ let namedSlot = this.selectedDisplaySlot;
660
+ const { value, multiple, selectedOptions, multilineOptions, firstSelectedOptionElement, prioritizeSearch } = this;
661
+ const hasNoValue = !value && multiple && !selectedOptions.length;
662
+ if (prioritizeSearch || !multilineOptions || hasNoValue)
663
+ return this.clearSelectedDisplay();
664
+ if (!firstSelectedOptionElement || firstSelectedOptionElement.display)
665
+ return this.clearSelectedDisplay();
666
+ // Clone selected option and remove elements with hide-on-select attribute
667
+ const selectionClone = firstSelectedOptionElement.firstElementChild.cloneNode(true);
668
+ selectionClone.querySelectorAll('[hide-on-select]').forEach(element => element.remove());
669
+ if (namedSlot) {
670
+ const height = namedSlot.clientHeight === 0 ? 'auto' : `${namedSlot.clientHeight}px`;
671
+ namedSlot.style.setProperty('--comp-selected-display-height', height);
672
+ if (namedSlot.firstElementChild.outerHTML !== selectionClone.outerHTML) {
673
+ namedSlot.replaceChild(selectionClone, namedSlot.firstElementChild);
674
+ }
675
+ }
676
+ else {
677
+ namedSlot = document.createElement('div');
678
+ namedSlot.slot = '_selected-display';
679
+ namedSlot.appendChild(selectionClone);
680
+ this.hostElement.appendChild(namedSlot);
589
681
  }
590
- this.selectOption(selected.getAttribute('value'), true);
682
+ return namedSlot;
591
683
  }
592
- /* tslint:enable:cyclomatic-complexity */
593
- keydownHandler(event) {
594
- this.inputKeydownHandler(event);
684
+ checkSelectedDisplayHeight() {
685
+ const { selectedDisplaySlot } = this;
686
+ if (!selectedDisplaySlot)
687
+ return;
688
+ selectedDisplaySlot.style.setProperty('--comp-selected-display-height', '44px');
689
+ }
690
+ /// DOM ///
691
+ renderCustomDisplay() {
692
+ const hasSelectedDisplay = this.checkSelectedDisplay();
693
+ if (!hasSelectedDisplay)
694
+ return;
695
+ this.checkSelectedDisplayHeight();
696
+ return (h("slot", { name: "_selected-display", slot: "custom-display" }));
595
697
  }
596
698
  render() {
699
+ const showAsPseudo = !this.searchable;
597
700
  return (h("click-elsewhere", { class: this.wrapperClasses, onChange: this.clickedElsewhere },
598
701
  h("div", { "aria-live": "polite", "aria-atomic": "true", role: "status", class: "sr" }, this.statusMessage),
599
702
  h("q2-input", { ref: el => (this.inputField = el), class: "q2-select-input", label: (this.label && loc(this.label)) || '', value: this.selectedDisplay, errors: (Array.isArray(this.errors) &&
600
703
  this.errors.length > 0 &&
601
704
  this.errors.map(error => loc(error))) ||
602
705
  (this.invalid && ['tecton.element.select.invalid']) ||
603
- [], disabled: this.disabled, optional: this.optional, readonly: this.readonly, hideLabel: this.hideLabel, ariaExpanded: `${!!this.dropdownOpen}`, ariaOwns: "dropdown", ariaHaspopup: "listbox", role: this.searchable ? 'combobox' : null, pseudo: !this.searchable, "test-id": "toggleDropdown", "hide-messages": true, iconRight: "chevron-down", onClick: this.inputClickHandler, onInput: this.inputInputHandler, onKeyDown: this.inputKeydownHandler, onFocus: this.inputFocusHandler, onBlur: this.inputBlurHandler, onChange: this.inputChangeHandler }),
706
+ [], disabled: this.disabled, optional: this.optional, readonly: this.readonly, hideLabel: this.hideLabel, ariaExpanded: `${!!this.dropdownOpen}`, ariaOwns: "dropdown", ariaHaspopup: "listbox", role: this.searchable ? 'combobox' : null, pseudo: showAsPseudo, "test-id": "toggleDropdown", "hide-messages": true, iconRight: "chevron-down", onClick: this.inputClickHandler, onInput: this.inputInputHandler, onKeyDown: this.inputKeydownHandler, onFocus: this.inputFocusHandler, onBlur: this.inputBlurHandler, onChange: this.inputChangeHandler, badgeValue: this.badgeValue, badgeTheme: this.isComponentFocused ? 'primary' : undefined }, this.renderCustomDisplay()),
604
707
  h("div", { class: "custom-display-content", hidden: !this.hasCustomDisplay || !!this.searchText, onClick: this.onCustomDisplayClick },
605
708
  h("slot", { name: "q2-select-display" })),
606
709
  this.optionsDropdown()));
@@ -613,10 +716,11 @@ export class Q2Select {
613
716
  h("slot", null))));
614
717
  }
615
718
  visibilityToggle() {
719
+ const selectedOptionsCount = this.selectedOptions.length;
616
720
  return (h("div", { class: "multi-select-header", ref: el => (this.multiSelectHeader = el) },
617
721
  loc('tecton.element.select.multiHeader.showing'),
618
- h("q2-btn", { class: `option-toggle show-all-options${this.onlyShowingSelected ? '' : ' selected'}`, badge: true, "aria-selected": !this.onlyShowingSelected || undefined, "test-id": "allOptionsButton", onClick: this.showAllOptions, label: loc('tecton.element.select.multiHeader.allAriaLabel'), "hide-label": true }, loc('tecton.element.select.multiHeader.all')),
619
- h("q2-btn", { class: `option-toggle show-selected-options${this.onlyShowingSelected ? ' selected' : ''}`, "aria-selected": this.onlyShowingSelected || undefined, disabled: this.selectedOptions.length === 0, badge: true, "test-id": "selectedOptionsButton", onClick: this.showSelectedOptions, label: loc('tecton.element.select.multiHeader.selectedAriaLabel', [this.selectedOptionsCount]), "hide-label": true }, loc('tecton.element.select.multiHeader.selected', [this.selectedOptionsCount]))));
722
+ h("q2-btn", { class: `show-all-options${this.onlyShowingSelected ? '' : ' selected'}`, badge: true, "aria-selected": !this.onlyShowingSelected || undefined, "test-id": "allOptionsButton", onClick: this.showAllOptions, label: loc('tecton.element.select.multiHeader.allAriaLabel'), "hide-label": true }, loc('tecton.element.select.multiHeader.all')),
723
+ h("q2-btn", { class: `show-selected-options${this.onlyShowingSelected ? ' selected' : ''}`, "aria-selected": this.onlyShowingSelected || undefined, disabled: this.selectedOptions.length === 0, badge: true, "test-id": "selectedOptionsButton", onClick: this.showSelectedOptions, label: loc('tecton.element.select.multiHeader.selectedAriaLabel', [selectedOptionsCount]), "hide-label": true }, loc('tecton.element.select.multiHeader.selected', [selectedOptionsCount]))));
620
724
  }
621
725
  static get is() { return "q2-select"; }
622
726
  static get encapsulation() { return "shadow"; }
@@ -629,7 +733,7 @@ export class Q2Select {
629
733
  static get properties() { return {
630
734
  "label": {
631
735
  "type": "string",
632
- "mutable": false,
736
+ "mutable": true,
633
737
  "complexType": {
634
738
  "original": "string",
635
739
  "resolved": "string",
@@ -646,7 +750,7 @@ export class Q2Select {
646
750
  },
647
751
  "hideLabel": {
648
752
  "type": "boolean",
649
- "mutable": false,
753
+ "mutable": true,
650
754
  "complexType": {
651
755
  "original": "boolean",
652
756
  "resolved": "boolean",
@@ -680,7 +784,7 @@ export class Q2Select {
680
784
  },
681
785
  "ariaLabel": {
682
786
  "type": "string",
683
- "mutable": false,
787
+ "mutable": true,
684
788
  "complexType": {
685
789
  "original": "string",
686
790
  "resolved": "string",
@@ -896,7 +1000,8 @@ export class Q2Select {
896
1000
  "searchText": {},
897
1001
  "hasCustomDisplay": {},
898
1002
  "inputFocused": {},
899
- "statusMessage": {}
1003
+ "statusMessage": {},
1004
+ "prioritizeSearch": {}
900
1005
  }; }
901
1006
  static get events() { return [{
902
1007
  "method": "change",
@@ -942,8 +1047,17 @@ export class Q2Select {
942
1047
  }, {
943
1048
  "propName": "multilineOptions",
944
1049
  "methodName": "multilineOptionsChanged"
1050
+ }, {
1051
+ "propName": "dropdownOpen",
1052
+ "methodName": "dropdownOpenChanged"
945
1053
  }]; }
946
1054
  static get listeners() { return [{
1055
+ "name": "keydown",
1056
+ "method": "keydownHandler",
1057
+ "target": undefined,
1058
+ "capture": false,
1059
+ "passive": false
1060
+ }, {
947
1061
  "name": "change",
948
1062
  "method": "onHostElementChange",
949
1063
  "target": undefined,
@@ -962,14 +1076,14 @@ export class Q2Select {
962
1076
  "capture": false,
963
1077
  "passive": false
964
1078
  }, {
965
- "name": "click",
966
- "method": "clickHandler",
1079
+ "name": "focusout",
1080
+ "method": "handleFocusout",
967
1081
  "target": undefined,
968
1082
  "capture": false,
969
1083
  "passive": false
970
1084
  }, {
971
- "name": "keydown",
972
- "method": "keydownHandler",
1085
+ "name": "click",
1086
+ "method": "clickHandler",
973
1087
  "target": undefined,
974
1088
  "capture": false,
975
1089
  "passive": false