q2-tecton-elements 1.10.4 → 1.10.7

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 (196) hide show
  1. package/dist/cjs/{icons-921779df.js → icons-4595ee47.js} +61 -1
  2. package/dist/cjs/{index-f4153f5a.js → index-a55d3c34.js} +9 -0
  3. package/dist/cjs/loader.cjs.js +1 -1
  4. package/dist/cjs/q2-avatar.cjs.entry.js +1 -1
  5. package/dist/cjs/q2-btn_2.cjs.entry.js +10 -6
  6. package/dist/cjs/q2-calendar.cjs.entry.js +2902 -6078
  7. package/dist/cjs/q2-carousel-pane.cjs.entry.js +50 -7
  8. package/dist/cjs/q2-carousel.cjs.entry.js +2719 -6513
  9. package/dist/cjs/q2-checkbox-group.cjs.entry.js +2 -2
  10. package/dist/cjs/q2-checkbox.cjs.entry.js +10 -2
  11. package/dist/cjs/q2-dropdown-item.cjs.entry.js +2 -2
  12. package/dist/cjs/q2-dropdown.cjs.entry.js +8 -2
  13. package/dist/cjs/q2-editable-field.cjs.entry.js +26 -11
  14. package/dist/cjs/q2-icon.cjs.entry.js +2 -2
  15. package/dist/cjs/q2-input.cjs.entry.js +9 -7
  16. package/dist/cjs/q2-loading-element.cjs.entry.js +1 -1
  17. package/dist/cjs/q2-loc.cjs.entry.js +1 -1
  18. package/dist/cjs/q2-message.cjs.entry.js +11 -3
  19. package/dist/cjs/q2-optgroup.cjs.entry.js +2 -2
  20. package/dist/cjs/q2-option.cjs.entry.js +3 -34
  21. package/dist/cjs/q2-radio-group.cjs.entry.js +10 -2
  22. package/dist/cjs/q2-radio.cjs.entry.js +10 -2
  23. package/dist/cjs/q2-section.cjs.entry.js +9 -9
  24. package/dist/cjs/q2-select.cjs.entry.js +175 -130
  25. package/dist/cjs/q2-stepper-pane.cjs.entry.js +1 -1
  26. package/dist/cjs/q2-stepper.cjs.entry.js +10 -4
  27. package/dist/cjs/q2-tab-container.cjs.entry.js +9 -11
  28. package/dist/cjs/q2-tab-pane.cjs.entry.js +2 -2
  29. package/dist/cjs/q2-tecton-elements.cjs.js +1 -1
  30. package/dist/cjs/q2-textarea.cjs.entry.js +8 -4
  31. package/dist/cjs/tecton-tab-pane.cjs.entry.js +2 -2
  32. package/dist/collection/components/q2-avatar/index.js +1 -1
  33. package/dist/collection/components/q2-avatar/styles.css +63 -61
  34. package/dist/collection/components/q2-btn/index.js +8 -4
  35. package/dist/collection/components/q2-btn/styles.css +96 -96
  36. package/dist/collection/components/q2-calendar/helpers.js +77 -52
  37. package/dist/collection/components/q2-calendar/index.js +248 -196
  38. package/dist/collection/components/q2-calendar/styles.css +63 -84
  39. package/dist/collection/components/q2-calendar/validation.js +100 -166
  40. package/dist/collection/components/q2-carousel/index.js +204 -266
  41. package/dist/collection/components/q2-carousel/styles.css +152 -155
  42. package/dist/collection/components/q2-carousel-pane/index.js +67 -28
  43. package/dist/collection/components/q2-carousel-pane/styles.css +82 -16
  44. package/dist/collection/components/q2-checkbox/index.js +16 -2
  45. package/dist/collection/components/q2-checkbox/styles.css +152 -176
  46. package/dist/collection/components/q2-checkbox-group/index.js +1 -1
  47. package/dist/collection/components/q2-checkbox-group/styles.css +65 -81
  48. package/dist/collection/components/q2-dropdown/index.js +15 -2
  49. package/dist/collection/components/q2-dropdown/styles.css +49 -36
  50. package/dist/collection/components/q2-dropdown-item/index.js +1 -1
  51. package/dist/collection/components/q2-dropdown-item/styles.css +48 -62
  52. package/dist/collection/components/q2-editable-field/index.js +33 -12
  53. package/dist/collection/components/q2-editable-field/styles.css +49 -50
  54. package/dist/collection/components/q2-icon/icons.js +61 -1
  55. package/dist/collection/components/q2-icon/styles.css +29 -29
  56. package/dist/collection/components/q2-input/index.js +9 -7
  57. package/dist/collection/components/q2-input/styles.css +211 -292
  58. package/dist/collection/components/q2-loading/index.js +1 -1
  59. package/dist/collection/components/q2-loading/skeleton/q2-loading-element/index.js +1 -1
  60. package/dist/collection/components/q2-loading/skeleton/q2-loading-element/styles.css +5 -6
  61. package/dist/collection/components/q2-loading/styles.css +130 -136
  62. package/dist/collection/components/q2-loc/index.js +1 -1
  63. package/dist/collection/components/q2-loc/styles.css +30 -31
  64. package/dist/collection/components/q2-message/index.js +18 -3
  65. package/dist/collection/components/q2-message/styles.css +32 -29
  66. package/dist/collection/components/q2-optgroup/index.js +1 -1
  67. package/dist/collection/components/q2-optgroup/styles.css +42 -47
  68. package/dist/collection/components/q2-option/index.js +4 -42
  69. package/dist/collection/components/q2-option/styles.css +29 -29
  70. package/dist/collection/components/q2-radio/index.js +16 -2
  71. package/dist/collection/components/q2-radio/styles.css +29 -29
  72. package/dist/collection/components/q2-radio-group/index.js +16 -2
  73. package/dist/collection/components/q2-radio-group/styles.css +67 -72
  74. package/dist/collection/components/q2-section/index.js +16 -10
  75. package/dist/collection/components/q2-section/styles.css +77 -77
  76. package/dist/collection/components/q2-select/index.js +182 -131
  77. package/dist/collection/components/q2-select/styles.css +33 -34
  78. package/dist/collection/components/q2-stepper/index.js +15 -3
  79. package/dist/collection/components/q2-stepper/styles.css +32 -32
  80. package/dist/collection/components/q2-stepper-pane/styles.css +29 -29
  81. package/dist/collection/components/q2-tab-container/index.js +7 -9
  82. package/dist/collection/components/q2-tab-container/styles.css +29 -29
  83. package/dist/collection/components/q2-tab-pane/index.js +2 -2
  84. package/dist/collection/components/q2-tab-pane/styles.css +34 -36
  85. package/dist/collection/components/q2-textarea/index.js +8 -4
  86. package/dist/collection/components/q2-textarea/styles.css +180 -228
  87. package/dist/collection/components/tecton-tab-pane/index.js +2 -2
  88. package/dist/collection/components/tecton-tab-pane/styles.css +50 -50
  89. package/dist/collection/utils/index.js +7 -0
  90. package/dist/esm/{icons-a3817842.js → icons-3ee662ea.js} +61 -1
  91. package/dist/esm/{index-476b86cc.js → index-ec6660af.js} +8 -1
  92. package/dist/esm/loader.js +1 -1
  93. package/dist/esm/q2-avatar.entry.js +1 -1
  94. package/dist/esm/q2-btn_2.entry.js +10 -6
  95. package/dist/esm/q2-calendar.entry.js +2902 -6078
  96. package/dist/esm/q2-carousel-pane.entry.js +51 -8
  97. package/dist/esm/q2-carousel.entry.js +2720 -6514
  98. package/dist/esm/q2-checkbox-group.entry.js +2 -2
  99. package/dist/esm/q2-checkbox.entry.js +10 -2
  100. package/dist/esm/q2-dropdown-item.entry.js +2 -2
  101. package/dist/esm/q2-dropdown.entry.js +8 -2
  102. package/dist/esm/q2-editable-field.entry.js +26 -11
  103. package/dist/esm/q2-icon.entry.js +2 -2
  104. package/dist/esm/q2-input.entry.js +9 -7
  105. package/dist/esm/q2-loading-element.entry.js +1 -1
  106. package/dist/esm/q2-loc.entry.js +1 -1
  107. package/dist/esm/q2-message.entry.js +11 -3
  108. package/dist/esm/q2-optgroup.entry.js +2 -2
  109. package/dist/esm/q2-option.entry.js +4 -35
  110. package/dist/esm/q2-radio-group.entry.js +10 -2
  111. package/dist/esm/q2-radio.entry.js +10 -2
  112. package/dist/esm/q2-section.entry.js +9 -9
  113. package/dist/esm/q2-select.entry.js +175 -130
  114. package/dist/esm/q2-stepper-pane.entry.js +1 -1
  115. package/dist/esm/q2-stepper.entry.js +10 -4
  116. package/dist/esm/q2-tab-container.entry.js +7 -9
  117. package/dist/esm/q2-tab-pane.entry.js +2 -2
  118. package/dist/esm/q2-tecton-elements.js +1 -1
  119. package/dist/esm/q2-textarea.entry.js +8 -4
  120. package/dist/esm/tecton-tab-pane.entry.js +2 -2
  121. package/dist/q2-tecton-elements/{p-4830affe.entry.js → p-07a5d703.entry.js} +1 -1
  122. package/dist/q2-tecton-elements/{p-84c05db6.entry.js → p-32ad664c.entry.js} +1 -1
  123. package/dist/q2-tecton-elements/p-37aba2a4.js +1 -0
  124. package/dist/q2-tecton-elements/p-4ae9d1f3.entry.js +1 -0
  125. package/dist/q2-tecton-elements/{p-67d86e3c.js → p-4cd00f1a.js} +1 -1
  126. package/dist/q2-tecton-elements/p-52f53e07.entry.js +1 -0
  127. package/dist/q2-tecton-elements/p-5559f126.entry.js +1 -0
  128. package/dist/q2-tecton-elements/p-6702eb4d.entry.js +1 -0
  129. package/dist/q2-tecton-elements/p-750bcd33.entry.js +1 -0
  130. package/dist/q2-tecton-elements/p-78642b7b.entry.js +1 -0
  131. package/dist/q2-tecton-elements/p-7e6fc65d.entry.js +1 -0
  132. package/dist/q2-tecton-elements/p-7eb39c90.entry.js +1 -0
  133. package/dist/q2-tecton-elements/p-81df91a1.entry.js +1 -0
  134. package/dist/q2-tecton-elements/{p-01e00610.entry.js → p-843b1ee9.entry.js} +1 -1
  135. package/dist/q2-tecton-elements/p-8509b171.entry.js +1 -0
  136. package/dist/q2-tecton-elements/p-8ea2c4f7.entry.js +1 -0
  137. package/dist/q2-tecton-elements/{p-d1d040ef.entry.js → p-95a73559.entry.js} +1 -1
  138. package/dist/q2-tecton-elements/p-96c9eb75.entry.js +1 -0
  139. package/dist/q2-tecton-elements/p-9b50c3c3.entry.js +1 -0
  140. package/dist/q2-tecton-elements/{p-a9bdd814.entry.js → p-a6f8d09a.entry.js} +1 -1
  141. package/dist/q2-tecton-elements/p-ab977515.entry.js +1 -0
  142. package/dist/q2-tecton-elements/{p-9314863f.entry.js → p-bb2e110a.entry.js} +1 -1
  143. package/dist/q2-tecton-elements/p-bbacb804.entry.js +1 -0
  144. package/dist/q2-tecton-elements/p-c555f1de.entry.js +1 -0
  145. package/dist/q2-tecton-elements/p-c5e55b9f.entry.js +1 -0
  146. package/dist/q2-tecton-elements/{p-4229b057.entry.js → p-df182f61.entry.js} +1 -1
  147. package/dist/q2-tecton-elements/p-fa6eea5c.entry.js +1 -0
  148. package/dist/q2-tecton-elements/{p-61c0e5fd.entry.js → p-fbf7c5e6.entry.js} +1 -1
  149. package/dist/q2-tecton-elements/p-fc804ebd.entry.js +1 -0
  150. package/dist/q2-tecton-elements/q2-tecton-elements.esm.js +1 -1
  151. package/dist/test/helpers.js +4 -0
  152. package/dist/types/components/q2-btn/index.d.ts +1 -0
  153. package/dist/types/components/q2-calendar/helpers.d.ts +6 -6
  154. package/dist/types/components/q2-calendar/index.d.ts +16 -17
  155. package/dist/types/components/q2-calendar/types.d.ts +9 -26
  156. package/dist/types/components/q2-calendar/validation.d.ts +27 -12
  157. package/dist/types/components/q2-carousel/index.d.ts +15 -45
  158. package/dist/types/components/q2-carousel-pane/index.d.ts +5 -2
  159. package/dist/types/components/q2-checkbox/index.d.ts +2 -0
  160. package/dist/types/components/q2-dropdown/index.d.ts +1 -0
  161. package/dist/types/components/q2-editable-field/index.d.ts +5 -1
  162. package/dist/types/components/q2-input/index.d.ts +1 -1
  163. package/dist/types/components/q2-message/index.d.ts +2 -0
  164. package/dist/types/components/q2-option/index.d.ts +0 -4
  165. package/dist/types/components/q2-radio/index.d.ts +3 -0
  166. package/dist/types/components/q2-radio-group/index.d.ts +1 -0
  167. package/dist/types/components/q2-section/index.d.ts +1 -1
  168. package/dist/types/components/q2-select/index.d.ts +10 -7
  169. package/dist/types/components/q2-stepper/index.d.ts +2 -1
  170. package/dist/types/components/q2-tab-container/index.d.ts +1 -1
  171. package/dist/types/components/q2-textarea/index.d.ts +2 -1
  172. package/dist/types/components.d.ts +3 -2
  173. package/dist/types/util.d.ts +1 -0
  174. package/dist/types/utils/index.d.ts +2 -0
  175. package/dist/types/workspace/workspace/tecton-production_release_1.10.x/packages/q2-tecton-elements/.stencil/test/helpers.d.ts +2 -1
  176. package/package.json +4 -5
  177. package/dist/q2-tecton-elements/p-1fc4e6f6.entry.js +0 -1
  178. package/dist/q2-tecton-elements/p-25a5f691.js +0 -1
  179. package/dist/q2-tecton-elements/p-27353237.entry.js +0 -1
  180. package/dist/q2-tecton-elements/p-3e100450.entry.js +0 -1
  181. package/dist/q2-tecton-elements/p-428d15fd.entry.js +0 -1
  182. package/dist/q2-tecton-elements/p-48fc317d.entry.js +0 -1
  183. package/dist/q2-tecton-elements/p-5222b792.entry.js +0 -1
  184. package/dist/q2-tecton-elements/p-74c1a311.entry.js +0 -1
  185. package/dist/q2-tecton-elements/p-784af485.entry.js +0 -1
  186. package/dist/q2-tecton-elements/p-7c99a58b.entry.js +0 -1
  187. package/dist/q2-tecton-elements/p-7f74b629.entry.js +0 -1
  188. package/dist/q2-tecton-elements/p-831a461f.entry.js +0 -1
  189. package/dist/q2-tecton-elements/p-84c52d3b.entry.js +0 -9
  190. package/dist/q2-tecton-elements/p-997e4c7e.entry.js +0 -1
  191. package/dist/q2-tecton-elements/p-9cb0fc37.entry.js +0 -1
  192. package/dist/q2-tecton-elements/p-a224bc9c.entry.js +0 -1
  193. package/dist/q2-tecton-elements/p-d893fcf2.entry.js +0 -1
  194. package/dist/q2-tecton-elements/p-da7cca07.entry.js +0 -1
  195. package/dist/q2-tecton-elements/p-f17761da.entry.js +0 -1
  196. package/dist/q2-tecton-elements/p-f5e074f8.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, loc, setPopProperties } from 'src/utils';
2
+ import { createGuid, handleAriaLabel, isEventFromElement, loc, overrideFocus, setPopProperties } from 'src/utils';
3
3
  export class Q2Select {
4
4
  constructor() {
5
5
  this.selectedOptions = [];
@@ -82,6 +82,144 @@ export class Q2Select {
82
82
  }
83
83
  };
84
84
  ////// ACTIONS ////////
85
+ this.dropdownFocusoutHandler = (event) => {
86
+ const { relatedTarget } = event;
87
+ const isInDropdown = this.dropdownContainer.contains(relatedTarget);
88
+ const isInLightDom = !isInDropdown && this.hostElement.contains(relatedTarget);
89
+ if (isInDropdown || isInLightDom)
90
+ return;
91
+ if (!this.dropdownOpen)
92
+ return;
93
+ this.closeDropdown();
94
+ };
95
+ this.dropdownKeydownHandler = (event) => {
96
+ event.stopPropagation();
97
+ const { activeIndex, searchable, optionElements, multiSelectHeader } = this;
98
+ const { key, shiftKey } = event;
99
+ if (multiSelectHeader &&
100
+ multiSelectHeader.contains(event.target) &&
101
+ [' ', 'Enter'].includes(key))
102
+ return;
103
+ switch (key) {
104
+ case ' ':
105
+ case 'Enter':
106
+ event.preventDefault();
107
+ event.stopPropagation();
108
+ const newOption = this.hostElement.querySelector(`[option-id="${this.activeOptionId}"]`);
109
+ if (!newOption || newOption.disabled)
110
+ break;
111
+ this.selectOption(newOption.value, true);
112
+ break;
113
+ case 'ArrowUp':
114
+ event.preventDefault();
115
+ const isFirstOption = activeIndex === 0;
116
+ if (isFirstOption)
117
+ break;
118
+ if (activeIndex !== undefined) {
119
+ const nextIndex = this.getNextVisibleIndex(-1);
120
+ if (nextIndex === -1)
121
+ break;
122
+ this.adjustActiveOptionAndScroll(nextIndex - activeIndex);
123
+ }
124
+ else {
125
+ this.setDefaultActiveElement();
126
+ }
127
+ break;
128
+ case 'ArrowDown':
129
+ event.preventDefault();
130
+ const isLastOption = activeIndex === optionElements.length - 1;
131
+ if (isLastOption)
132
+ break;
133
+ if (activeIndex !== undefined) {
134
+ const nextIndex = this.getNextVisibleIndex(1);
135
+ if (nextIndex === -1)
136
+ break;
137
+ this.adjustActiveOptionAndScroll(nextIndex - activeIndex);
138
+ }
139
+ else {
140
+ this.setDefaultActiveElement();
141
+ }
142
+ break;
143
+ case 'Home':
144
+ event.preventDefault();
145
+ this.openDropdownWithActiveElement(0);
146
+ break;
147
+ case 'End':
148
+ event.preventDefault();
149
+ this.openDropdownWithActiveElement(optionElements.length - 1);
150
+ break;
151
+ case 'PageUp':
152
+ event.preventDefault();
153
+ this.openDropdownWithActiveElement(Math.max(activeIndex - 10, 0));
154
+ break;
155
+ case 'PageDown':
156
+ event.preventDefault();
157
+ this.openDropdownWithActiveElement(Math.min(activeIndex + 10, optionElements.length - 1));
158
+ break;
159
+ case 'Tab':
160
+ if (shiftKey)
161
+ break;
162
+ const myOption = this.hostElement.querySelector(`[option-id="${this.activeOptionId}"]`);
163
+ if (!myOption || myOption.disabled)
164
+ return;
165
+ this.selectOption(myOption.value);
166
+ break;
167
+ case 'Esc':
168
+ case 'Escape':
169
+ this.closeDropdown();
170
+ this.focusInput();
171
+ break;
172
+ default:
173
+ if (searchable)
174
+ break;
175
+ if (!key.match(/^[A-Za-z0-9]$/))
176
+ break;
177
+ // search in non-searchable select: alpha-numeric only
178
+ this.searchAndFocus(key);
179
+ break;
180
+ }
181
+ };
182
+ this.inputKeydownHandler = (event) => {
183
+ const { key } = event;
184
+ const { optionElements, dropdownOpen, searchable } = this;
185
+ switch (key) {
186
+ case 'ArrowDown':
187
+ event.preventDefault();
188
+ this.openDropdownWithActiveElement(this.getDefaultActiveIndex());
189
+ break;
190
+ case 'ArrowUp':
191
+ event.preventDefault();
192
+ this.openDropdownWithActiveElement(this.getLastEnabledIndex());
193
+ this.setFocusedOption();
194
+ break;
195
+ case 'Home':
196
+ event.preventDefault();
197
+ this.openDropdownWithActiveElement(0);
198
+ break;
199
+ case 'End':
200
+ event.preventDefault();
201
+ this.openDropdownWithActiveElement(optionElements.length - 1);
202
+ break;
203
+ case 'Escape':
204
+ case 'Esc':
205
+ if (dropdownOpen) {
206
+ this.closeDropdown();
207
+ }
208
+ else {
209
+ this.searchText = '';
210
+ }
211
+ break;
212
+ default:
213
+ if (searchable) {
214
+ this.openDropdownWithoutActiveElement();
215
+ break;
216
+ }
217
+ if (!key.match(/^[A-Za-z0-9]$/))
218
+ break;
219
+ // search in non-searchable select: alpha-numeric only
220
+ this.searchAndFocus(key);
221
+ }
222
+ };
85
223
  this.inputClickHandler = (event) => {
86
224
  event.stopPropagation();
87
225
  setPopProperties(this);
@@ -90,32 +228,11 @@ export class Q2Select {
90
228
  };
91
229
  this.inputInputHandler = (event) => {
92
230
  event.stopPropagation();
93
- if (!this.dropdownOpen) {
231
+ if (!this.dropdownOpen)
94
232
  this.openDropdownWithoutActiveElement();
95
- }
96
233
  this.searchText = event.detail.value;
97
234
  this.input.emit({ query: event.detail.value });
98
235
  };
99
- this.inputKeydownHandler = (event) => {
100
- if (event.key === 'Enter' && this.dropdownOpen) {
101
- event.preventDefault();
102
- const newOption = this.hostElement.querySelector(`[option-id="${this.activeOptionId}"]`);
103
- newOption && !newOption.disabled && this.selectOption(newOption.value);
104
- }
105
- if (['Escape', 'Esc'].includes(event.key)) {
106
- this.closeDropdown();
107
- this.focusInput();
108
- }
109
- if (event.key === 'Tab') {
110
- if (this.dropdownOpen && this.searchable && event.shiftKey) {
111
- event.preventDefault();
112
- this.focusInput();
113
- }
114
- else {
115
- this.dropdownOpen && !this.multiple && event.preventDefault();
116
- }
117
- }
118
- };
119
236
  this.inputFocusHandler = () => {
120
237
  this.inputFocused = true;
121
238
  };
@@ -125,16 +242,6 @@ export class Q2Select {
125
242
  this.inputChangeHandler = (event) => {
126
243
  event.stopPropagation();
127
244
  };
128
- this.showAllOptionTabKeyDown = (event) => {
129
- if (event.key === 'Tab' && !event.shiftKey && this.selectedOptionsCount === 0) {
130
- event.preventDefault();
131
- }
132
- };
133
- this.showSelectedOptionTabKeyDown = (event) => {
134
- if (event.key === 'Tab' && !event.shiftKey) {
135
- event.preventDefault();
136
- }
137
- };
138
245
  this.clickedElsewhere = (event) => {
139
246
  const target = event.target;
140
247
  if (target.localName === 'click-elsewhere') {
@@ -144,13 +251,15 @@ export class Q2Select {
144
251
  }
145
252
  }
146
253
  };
147
- this.showSelectedOptions = () => {
254
+ this.showSelectedOptions = (event) => {
255
+ event.stopImmediatePropagation();
148
256
  this.onlyShowingSelected = true;
149
257
  this.optionElements.forEach(optionElement => {
150
258
  optionElement._multiSelectHidden = !optionElement.selected;
151
259
  });
152
260
  };
153
- this.showAllOptions = () => {
261
+ this.showAllOptions = (event) => {
262
+ event.stopPropagation();
154
263
  this.onlyShowingSelected = false;
155
264
  this.optionElements.forEach(optionElement => {
156
265
  optionElement._multiSelectHidden = false;
@@ -177,12 +286,20 @@ export class Q2Select {
177
286
  else
178
287
  return 0;
179
288
  }
289
+ getLastEnabledIndex() {
290
+ const enabledIndexes = this.optionElements.reduce((acc, element, index) => {
291
+ if (!element.hidden && !element.disabled)
292
+ acc.push(index);
293
+ return acc;
294
+ }, []);
295
+ return enabledIndexes[enabledIndexes.length - 1];
296
+ }
180
297
  setActiveOption() {
181
- if (!this.dropdownOpen) {
298
+ if (!this.dropdownOpen)
182
299
  return;
183
- }
300
+ const activeIndex = this.activeIndex;
184
301
  this.optionElements.forEach((element, elementIndex) => {
185
- if (this.activeIndex === elementIndex) {
302
+ if (activeIndex === elementIndex) {
186
303
  element.active = true;
187
304
  this.activeOptionId = element.optionId;
188
305
  }
@@ -193,6 +310,8 @@ export class Q2Select {
193
310
  }
194
311
  setFocusedOption() {
195
312
  const option = this.optionElements[this.activeIndex];
313
+ if (!option)
314
+ return;
196
315
  option.dispatchEvent(new FocusEvent('focus'));
197
316
  option.focus();
198
317
  }
@@ -230,7 +349,7 @@ export class Q2Select {
230
349
  if (this.hasCustomDisplay && !this.searchText) {
231
350
  return '';
232
351
  }
233
- if (this.searchable && this.dropdownOpen) {
352
+ if (this.searchable && this.dropdownOpen && !this.value) {
234
353
  // when dropdown is open search selects show typing
235
354
  // when closed they display the same as non searchable select (what is selected)
236
355
  return this.searchText || '';
@@ -270,7 +389,7 @@ export class Q2Select {
270
389
  element.multiline = this.multilineOptions;
271
390
  });
272
391
  }
273
- selectOption(value) {
392
+ selectOption(value, focusInputOnClose = false) {
274
393
  if (this.multiple) {
275
394
  const isSelected = this.selectedOptions.includes(value);
276
395
  if (isSelected) {
@@ -285,7 +404,8 @@ export class Q2Select {
285
404
  else {
286
405
  this.change.emit({ value });
287
406
  this.closeDropdown();
288
- this.focusInput();
407
+ if (focusInputOnClose)
408
+ this.focusInput();
289
409
  }
290
410
  }
291
411
  scrollToActiveOption() {
@@ -303,9 +423,7 @@ export class Q2Select {
303
423
  this.dropdownOpen = true;
304
424
  this.setActiveOption();
305
425
  this.scheduledAfterRender.push(() => {
306
- if (!this.searchable) {
307
- this.setFocusedOption();
308
- }
426
+ this.setFocusedOption();
309
427
  this.scrollToActiveOption();
310
428
  this.resizeIframe();
311
429
  });
@@ -348,8 +466,8 @@ export class Q2Select {
348
466
  this.setFocusedOption();
349
467
  }
350
468
  focusInput() {
351
- const input = this.hostElement.shadowRoot.querySelector('q2-input');
352
- input && input.dispatchEvent(new FocusEvent('focus'));
469
+ var _a;
470
+ (_a = this.inputField) === null || _a === void 0 ? void 0 : _a.dispatchEvent(new FocusEvent('focus'));
353
471
  }
354
472
  getNextVisibleIndex(direction) {
355
473
  let index = this.activeIndex + direction;
@@ -371,6 +489,7 @@ export class Q2Select {
371
489
  observer.observe(this.hostElement, { childList: true, subtree: true });
372
490
  this.mutationObserver = observer;
373
491
  this.onMutationObserved();
492
+ overrideFocus(this.hostElement);
374
493
  }
375
494
  componentDidRender() {
376
495
  setTimeout(() => {
@@ -443,6 +562,11 @@ export class Q2Select {
443
562
  this.setStatusMessage(loc(statusMessageLocString, [count]));
444
563
  }
445
564
  }
565
+ delegateFocus(event) {
566
+ if (!isEventFromElement(event, this.hostElement))
567
+ return;
568
+ this.inputField.shadowRoot.querySelector('.input-field').focus();
569
+ }
446
570
  setStatusMessage(message) {
447
571
  clearTimeout(this.statusMessageTimer);
448
572
  this.statusMessage = '';
@@ -455,89 +579,10 @@ export class Q2Select {
455
579
  if (target.localName !== 'q2-option' || target.disabled) {
456
580
  return;
457
581
  }
458
- this.selectOption(target.value);
582
+ this.selectOption(target.value, true);
459
583
  }
460
584
  keydownHandler(event) {
461
- event.stopPropagation();
462
- const { dropdownOpen, activeIndex, searchable, multiple, optionElements } = this;
463
- const { key, shiftKey } = event;
464
- switch (key) {
465
- case 'Enter':
466
- if (!dropdownOpen)
467
- break;
468
- event.preventDefault();
469
- const newOption = this.hostElement.querySelector(`[option-id="${this.activeOptionId}"]`);
470
- if (newOption === null || newOption === void 0 ? void 0 : newOption.disabled)
471
- break;
472
- this.selectOption(newOption.value);
473
- break;
474
- case 'ArrowUp':
475
- event.preventDefault();
476
- if (!dropdownOpen) {
477
- this.openDropdownWithActiveElement(this.getDefaultActiveIndex());
478
- break;
479
- }
480
- if (activeIndex > 0) {
481
- const nextIndex = this.getNextVisibleIndex(-1);
482
- if (nextIndex > -1) {
483
- this.adjustActiveOptionAndScroll(nextIndex - activeIndex);
484
- }
485
- }
486
- else if (activeIndex !== 0) {
487
- this.setDefaultActiveElement();
488
- }
489
- break;
490
- case 'ArrowDown':
491
- event.preventDefault();
492
- if (!dropdownOpen) {
493
- this.openDropdownWithActiveElement(this.getDefaultActiveIndex());
494
- break;
495
- }
496
- if (activeIndex < optionElements.length - 1) {
497
- const nextIndex = this.getNextVisibleIndex(1);
498
- if (nextIndex > -1) {
499
- this.adjustActiveOptionAndScroll(nextIndex - this.activeIndex);
500
- }
501
- }
502
- else if (!activeIndex) {
503
- this.setDefaultActiveElement();
504
- }
505
- break;
506
- case 'Home':
507
- if (!dropdownOpen)
508
- break;
509
- event.preventDefault();
510
- this.adjustActiveOptionAndScroll(0);
511
- break;
512
- case 'End':
513
- if (!dropdownOpen)
514
- break;
515
- event.preventDefault();
516
- this.adjustActiveOptionAndScroll(optionElements.length - 1);
517
- break;
518
- case 'Escape':
519
- this.closeDropdown();
520
- this.focusInput();
521
- break;
522
- case 'Tab':
523
- if (!dropdownOpen)
524
- break;
525
- if ((searchable && shiftKey) || !multiple) {
526
- event.preventDefault();
527
- }
528
- if (searchable && shiftKey) {
529
- this.focusInput();
530
- }
531
- break;
532
- default:
533
- if (searchable)
534
- break;
535
- if (!key.match(/^[A-Za-z0-9]$/))
536
- break;
537
- // search in non-searchable select: alpha-numeric only
538
- this.searchAndFocus(key);
539
- break;
540
- }
585
+ this.inputKeydownHandler(event);
541
586
  }
542
587
  render() {
543
588
  return (h("click-elsewhere", { class: this.wrapperClasses, onChange: this.clickedElsewhere },
@@ -553,16 +598,16 @@ export class Q2Select {
553
598
  }
554
599
  optionsDropdown() {
555
600
  const dropDirection = this.privatePopDirection === 'up' ? 'dropup' : '';
556
- return (h("div", { class: `q2-select-dropdown q2-element-dropdown ${dropDirection}`, ref: el => (this.dropdownContainer = el) },
601
+ return (h("div", { class: `q2-select-dropdown q2-element-dropdown ${dropDirection}`, ref: el => (this.dropdownContainer = el), onKeyDown: this.dropdownKeydownHandler, onFocusout: this.dropdownFocusoutHandler },
557
602
  this.multiple ? this.visibilityToggle() : '',
558
603
  h("div", { class: "q2-select-options", id: "dropdown", role: "listbox" },
559
604
  h("slot", null))));
560
605
  }
561
606
  visibilityToggle() {
562
- return (h("div", { class: "multi-select-header" },
607
+ return (h("div", { class: "multi-select-header", ref: el => (this.multiSelectHeader = el) },
563
608
  loc('tecton.element.select.multiHeader.showing'),
564
- 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, onKeyDown: this.showAllOptionTabKeyDown, label: loc('tecton.element.select.multiHeader.allAriaLabel'), "hide-label": true }, loc('tecton.element.select.multiHeader.all')),
565
- 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, onKeyDown: this.showSelectedOptionTabKeyDown, label: loc('tecton.element.select.multiHeader.selectedAriaLabel', [
609
+ 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')),
610
+ 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', [
566
611
  this.selectedOptionsCount
567
612
  ]), "hide-label": true }, loc('tecton.element.select.multiHeader.selected', [this.selectedOptionsCount]))));
568
613
  }
@@ -885,6 +930,12 @@ export class Q2Select {
885
930
  "target": undefined,
886
931
  "capture": false,
887
932
  "passive": false
933
+ }, {
934
+ "name": "focus",
935
+ "method": "delegateFocus",
936
+ "target": undefined,
937
+ "capture": false,
938
+ "passive": false
888
939
  }, {
889
940
  "name": "click",
890
941
  "method": "clickHandler",
@@ -1,67 +1,67 @@
1
1
  * {
2
- box-sizing: border-box;
2
+ box-sizing: border-box;
3
3
  }
4
4
 
5
5
  *:active {
6
- outline: none;
6
+ outline: none;
7
7
  }
8
8
 
9
9
  *:focus {
10
- outline: none;
11
- box-shadow: var(--const-global-focus);
10
+ outline: none;
11
+ box-shadow: var(--const-global-focus);
12
12
  }
13
13
 
14
14
  :host {
15
- box-shadow: none !important;
15
+ box-shadow: none !important;
16
16
  }
17
17
 
18
18
  ::-moz-focus-inner {
19
- border: none;
19
+ border: none;
20
20
  }
21
21
 
22
22
  input,
23
23
  textarea,
24
24
  button {
25
- font-family: inherit;
26
- font-size: inherit;
25
+ font-family: inherit;
26
+ font-size: inherit;
27
27
  }
28
28
 
29
29
  :host(.sr),
30
30
  :host(.sr) button {
31
- border: 0;
32
- clip: rect(0 0 0 0);
33
- height: 1px;
34
- margin: -1px;
35
- overflow: hidden;
36
- padding: 0;
37
- position: absolute;
38
- width: 1px;
39
- white-space: nowrap;
31
+ border: 0;
32
+ clip: rect(0 0 0 0);
33
+ height: 1px;
34
+ margin: -1px;
35
+ overflow: hidden;
36
+ padding: 0;
37
+ position: absolute;
38
+ width: 1px;
39
+ white-space: nowrap;
40
40
  }
41
41
 
42
42
  .sr,
43
43
  .sr button {
44
- border: 0;
45
- clip: rect(0 0 0 0);
46
- height: 1px;
47
- margin: -1px;
48
- overflow: hidden;
49
- padding: 0;
50
- position: absolute;
51
- width: 1px;
52
- white-space: nowrap;
44
+ border: 0;
45
+ clip: rect(0 0 0 0);
46
+ height: 1px;
47
+ margin: -1px;
48
+ overflow: hidden;
49
+ padding: 0;
50
+ position: absolute;
51
+ width: 1px;
52
+ white-space: nowrap;
53
53
  }
54
54
 
55
55
  .hidden {
56
- display: none;
56
+ display: none;
57
57
  }
58
58
 
59
59
  :host([hidden]) {
60
- display: none;
60
+ display: none;
61
61
  }
62
62
 
63
63
  .invisible {
64
- visibility: hidden;
64
+ visibility: hidden;
65
65
  }
66
66
 
67
67
  .q2-element-dropdown {
@@ -79,10 +79,10 @@ button {
79
79
  opacity: 0;
80
80
  visibility: hidden;
81
81
  transition: opacity var(--app-tween-1);
82
- border-radius: var(--tct-dropdown-element-br, 0);
83
- --comp-scrollbar-size: var(--tct-scrollbar-size, var(--app-scale-1x, 5px));
84
- --comp-scrollbar-border-radius: var(--tct-scrollbar-border-radius, var(--app-border-radius-1, 3px));
85
- --comp-scrollbar-color: var(--tct-scrollbar-color, var(--t-a11y-gray-color, #747474));
82
+ border-radius: var(--tct-dropdown-border-radius, --t-dropdown-border-radius, 0);
83
+ --comp-scrollbar-size: var(--tct-scrollbar-size, var(--t-scrollbar-size, var(--app-scale-1x, 5px)));
84
+ --comp-scrollbar-border-radius: var(--tct-scrollbar-border-radius, var(--t-scrollbar-border-radius, var(--app-border-radius-1, 3px)));
85
+ --comp-scrollbar-color: var(--tct-scrollbar-color, var(--t-scrollbar-color, var(--t-a11y-gray-color, #747474)));
86
86
  scrollbar-width: thin;
87
87
  scrollbar-color: var(--comp-scrollbar-color) transparent;
88
88
  }
@@ -111,7 +111,6 @@ button {
111
111
  overflow: auto;
112
112
  opacity: 1;
113
113
  visibility: visible;
114
- margin-bottom: var(--app-scale-2);
115
114
  }
116
115
 
117
116
  :host([alignment=right]) .q2-element-dropdown {
@@ -1,5 +1,5 @@
1
1
  import { Component, Prop, h, Element, State, Watch, Listen, Event, Fragment } from '@stencil/core';
2
- import { loc, addSmoothScrollPolyfill } from 'src/utils';
2
+ import { loc, addSmoothScrollPolyfill, overrideFocus, isEventFromElement } from 'src/utils';
3
3
  addSmoothScrollPolyfill();
4
4
  export class Q2Stepper {
5
5
  constructor() {
@@ -81,6 +81,7 @@ export class Q2Stepper {
81
81
  componentDidLoad() {
82
82
  this.resizeObserver.observe(this.listElement);
83
83
  this.checkScrollState();
84
+ overrideFocus(this.hostElement);
84
85
  setTimeout(() => this.showStep(this.currentStep || 1), 0);
85
86
  }
86
87
  componentDidRender() {
@@ -103,6 +104,11 @@ export class Q2Stepper {
103
104
  this.currentStep = event.detail.selectedStep;
104
105
  }
105
106
  }
107
+ delegateFocus(event) {
108
+ if (!isEventFromElement(event, this.hostElement))
109
+ return;
110
+ this.focusStep(this.currentStep, true, true);
111
+ }
106
112
  ////////// GETTER METHODS ////////
107
113
  get allPanes() {
108
114
  return this.hostElement.querySelectorAll('q2-stepper-pane');
@@ -132,13 +138,13 @@ export class Q2Stepper {
132
138
  pane.isActive = stepNumber === index + 1;
133
139
  });
134
140
  }
135
- focusStep(stepNumber, scrollIntoView) {
141
+ focusStep(stepNumber, scrollIntoView, forceFocus) {
136
142
  var _a;
137
143
  const stepListItem = this.listElement.children[stepNumber - 1];
138
144
  const isActive = document.activeElement === this.hostElement;
139
145
  if (!stepListItem)
140
146
  return;
141
- if (isActive) {
147
+ if (isActive || forceFocus) {
142
148
  (_a = stepListItem.firstElementChild) === null || _a === void 0 ? void 0 : _a.focus();
143
149
  }
144
150
  if (scrollIntoView) {
@@ -279,5 +285,11 @@ export class Q2Stepper {
279
285
  "target": undefined,
280
286
  "capture": false,
281
287
  "passive": false
288
+ }, {
289
+ "name": "focus",
290
+ "method": "delegateFocus",
291
+ "target": undefined,
292
+ "capture": false,
293
+ "passive": false
282
294
  }]; }
283
295
  }