@aurodesignsystem-dev/auro-formkit 0.0.0-pr1503.4 → 0.0.0-pr1503.5

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 (190) hide show
  1. package/components/bibtemplate/dist/index.js +1 -1
  2. package/components/bibtemplate/dist/registered.js +1 -1
  3. package/components/checkbox/demo/accessibility.md +1 -1
  4. package/components/checkbox/demo/customize.html +1 -2
  5. package/components/checkbox/demo/customize.min.js +23 -8
  6. package/components/checkbox/demo/getting-started.min.js +23 -8
  7. package/components/checkbox/demo/index.min.js +23 -8
  8. package/components/checkbox/dist/index.js +23 -8
  9. package/components/checkbox/dist/registered.js +23 -8
  10. package/components/combobox/README.md +1 -1
  11. package/components/combobox/demo/accessibility.md +1 -1
  12. package/components/combobox/demo/api.md +2 -2
  13. package/components/combobox/demo/customize.html +1 -2
  14. package/components/combobox/demo/customize.md +166 -142
  15. package/components/combobox/demo/customize.min.js +2515 -2316
  16. package/components/combobox/demo/getting-started.min.js +2515 -2312
  17. package/components/combobox/demo/index.md +2 -1
  18. package/components/combobox/demo/index.min.js +2515 -2312
  19. package/components/combobox/demo/keyboard-behavior.md +3 -146
  20. package/components/combobox/demo/readme.md +1 -1
  21. package/components/combobox/demo/why-combobox.md +2 -2
  22. package/components/combobox/dist/auro-combobox.d.ts +49 -15
  23. package/components/combobox/dist/index.js +1462 -753
  24. package/components/combobox/dist/registered.js +1462 -753
  25. package/components/counter/demo/customize.min.js +188 -244
  26. package/components/counter/demo/index.min.js +188 -244
  27. package/components/counter/dist/auro-counter.d.ts +0 -8
  28. package/components/counter/dist/index.js +188 -244
  29. package/components/counter/dist/registered.js +188 -244
  30. package/components/datepicker/demo/accessibility.md +20 -10
  31. package/components/datepicker/demo/api.md +65 -62
  32. package/components/datepicker/demo/customize.md +180 -40
  33. package/components/datepicker/demo/customize.min.js +1690 -777
  34. package/components/datepicker/demo/getting-started.md +118 -2
  35. package/components/datepicker/demo/index.min.js +1690 -759
  36. package/components/datepicker/demo/keyboard-behavior.md +3 -3
  37. package/components/datepicker/demo/voiceover.md +4 -4
  38. package/components/datepicker/demo/why-datepicker.md +2 -2
  39. package/components/datepicker/dist/{src/auro-calendar-cell.d.ts → auro-calendar-cell.d.ts} +48 -3
  40. package/components/datepicker/dist/{src/auro-calendar.d.ts → auro-calendar.d.ts} +188 -10
  41. package/components/datepicker/dist/{src/auro-datepicker.d.ts → auro-datepicker.d.ts} +89 -6
  42. package/components/datepicker/dist/blackoutUtils.d.ts +43 -0
  43. package/components/datepicker/dist/index.js +1690 -759
  44. package/components/datepicker/dist/registered.js +1690 -759
  45. package/components/dropdown/demo/customize.html +3 -0
  46. package/components/dropdown/demo/customize.min.js +142 -208
  47. package/components/dropdown/demo/getting-started.min.js +131 -207
  48. package/components/dropdown/demo/index.min.js +131 -207
  49. package/components/dropdown/dist/auro-dropdown.d.ts +17 -1
  50. package/components/dropdown/dist/index.js +131 -207
  51. package/components/dropdown/dist/registered.js +131 -207
  52. package/components/form/demo/api.md +3 -3
  53. package/components/form/demo/customize.html +6 -6
  54. package/components/form/demo/customize.md +535 -135
  55. package/components/form/demo/customize.min.js +6307 -4378
  56. package/components/form/demo/getting-started.md +344 -96
  57. package/components/form/demo/getting-started.min.js +6255 -4378
  58. package/components/form/demo/index.min.js +6206 -4378
  59. package/components/form/demo/registerDemoDeps.min.js +5827 -4333
  60. package/components/form/dist/auro-form.d.ts +128 -10
  61. package/components/form/dist/index.js +377 -43
  62. package/components/form/dist/registered.js +377 -43
  63. package/components/input/demo/accessibility.md +1 -1
  64. package/components/input/demo/api.md +58 -57
  65. package/components/input/demo/customize.html +1 -2
  66. package/components/input/demo/customize.md +62 -61
  67. package/components/input/demo/customize.min.js +396 -275
  68. package/components/input/demo/getting-started.min.js +396 -275
  69. package/components/input/demo/index.min.js +396 -275
  70. package/components/input/dist/auro-input.d.ts +1 -1
  71. package/components/input/dist/base-input.d.ts +60 -81
  72. package/components/input/dist/index.js +409 -276
  73. package/components/input/dist/registered.js +396 -275
  74. package/components/input/dist/utilities.d.ts +10 -1
  75. package/components/menu/demo/accessibility.md +9 -4
  76. package/components/menu/demo/api.md +48 -45
  77. package/components/menu/demo/css-only.md +26 -19
  78. package/components/menu/demo/customize.md +307 -75
  79. package/components/menu/demo/design.md +1 -1
  80. package/components/menu/demo/getting-started.md +144 -7
  81. package/components/menu/demo/index.min.js +961 -1341
  82. package/components/menu/demo/keyboard-behavior.md +83 -4
  83. package/components/menu/demo/voiceover.md +21 -14
  84. package/components/menu/demo/why-menu.md +8 -9
  85. package/components/menu/dist/auro-menu-utils.d.ts +19 -0
  86. package/components/menu/dist/auro-menu.d.ts +97 -116
  87. package/components/menu/dist/auro-menuoption.d.ts +39 -133
  88. package/components/menu/dist/index.js +823 -1309
  89. package/components/menu/dist/registered.js +835 -1309
  90. package/components/radio/demo/accessibility.md +1 -1
  91. package/components/radio/demo/customize.min.js +23 -8
  92. package/components/radio/demo/getting-started.min.js +23 -8
  93. package/components/radio/demo/index.min.js +23 -8
  94. package/components/radio/dist/index.js +23 -8
  95. package/components/radio/dist/registered.js +23 -8
  96. package/components/select/demo/accessibility.md +6 -1
  97. package/components/select/demo/api.md +3 -2
  98. package/components/select/demo/customize.html +1 -2
  99. package/components/select/demo/customize.md +210 -5
  100. package/components/select/demo/customize.min.js +1613 -1854
  101. package/components/select/demo/design.md +10 -10
  102. package/components/select/demo/getting-started.md +1 -1
  103. package/components/select/demo/getting-started.min.js +1617 -1903
  104. package/components/select/demo/index.md +2 -2
  105. package/components/select/demo/index.min.js +1613 -1854
  106. package/components/select/demo/keyboard-behavior.md +81 -54
  107. package/components/select/demo/voiceover.md +28 -15
  108. package/components/select/dist/auro-select.d.ts +70 -12
  109. package/components/select/dist/index.js +580 -315
  110. package/components/select/dist/registered.js +580 -315
  111. package/components/select/dist/selectUtils.d.ts +24 -0
  112. package/custom-elements.json +8071 -7919
  113. package/package.json +7 -3
  114. package/components/checkbox/demo/customize.js +0 -22
  115. package/components/checkbox/demo/demo-support.js +0 -1
  116. package/components/checkbox/demo/getting-started.js +0 -22
  117. package/components/checkbox/demo/index.js +0 -8
  118. package/components/checkbox/demo/styles.scss +0 -1
  119. package/components/combobox/demo/customize.js +0 -24
  120. package/components/combobox/demo/demo-support.js +0 -1
  121. package/components/combobox/demo/getting-started.js +0 -21
  122. package/components/combobox/demo/index.js +0 -23
  123. package/components/combobox/demo/styles.scss +0 -1
  124. package/components/counter/demo/customize.js +0 -21
  125. package/components/counter/demo/demo-support.js +0 -1
  126. package/components/counter/demo/index.js +0 -21
  127. package/components/counter/demo/styles.scss +0 -1
  128. package/components/datepicker/demo/customize.js +0 -19
  129. package/components/datepicker/demo/demo-support.js +0 -1
  130. package/components/datepicker/demo/index.js +0 -23
  131. package/components/datepicker/demo/styles.scss +0 -1
  132. package/components/dropdown/demo/customize.js +0 -9
  133. package/components/dropdown/demo/demo-support.js +0 -1
  134. package/components/dropdown/demo/getting-started.js +0 -9
  135. package/components/dropdown/demo/index.js +0 -16
  136. package/components/dropdown/demo/styles.scss +0 -1
  137. package/components/form/demo/customize.js +0 -9
  138. package/components/form/demo/demo-support.js +0 -1
  139. package/components/form/demo/getting-started.js +0 -9
  140. package/components/form/demo/index.js +0 -5
  141. package/components/form/demo/registerDemoDeps.js +0 -23
  142. package/components/form/demo/styles.scss +0 -1
  143. package/components/input/demo/customize.js +0 -25
  144. package/components/input/demo/demo-support.js +0 -1
  145. package/components/input/demo/getting-started.js +0 -8
  146. package/components/input/demo/index.js +0 -8
  147. package/components/input/demo/styles.css +0 -974
  148. package/components/input/demo/styles.scss +0 -1
  149. package/components/menu/demo/demo-support.js +0 -1
  150. package/components/menu/demo/index.js +0 -25
  151. package/components/menu/demo/styles.scss +0 -1
  152. package/components/menu/dist/auro-menu.context.d.ts +0 -238
  153. package/components/radio/demo/customize.js +0 -22
  154. package/components/radio/demo/demo-support.js +0 -1
  155. package/components/radio/demo/getting-started.js +0 -24
  156. package/components/radio/demo/index.js +0 -8
  157. package/components/radio/demo/styles.scss +0 -1
  158. package/components/select/demo/customize.js +0 -11
  159. package/components/select/demo/demo-support.js +0 -1
  160. package/components/select/demo/getting-started.js +0 -26
  161. package/components/select/demo/index.js +0 -11
  162. package/components/select/demo/styles.scss +0 -1
  163. /package/components/counter/dist/styles/{counter-wrapper-color-css.d.ts → counter-group-color-css.d.ts} +0 -0
  164. /package/components/datepicker/dist/{src/auro-calendar-month.d.ts → auro-calendar-month.d.ts} +0 -0
  165. /package/components/datepicker/dist/{src/buttonVersion.d.ts → buttonVersion.d.ts} +0 -0
  166. /package/components/datepicker/dist/{src/datepickerKeyboardStrategy.d.ts → datepickerKeyboardStrategy.d.ts} +0 -0
  167. /package/components/datepicker/dist/{src/iconVersion.d.ts → iconVersion.d.ts} +0 -0
  168. /package/components/datepicker/dist/{src/index.d.ts → index.d.ts} +0 -0
  169. /package/components/datepicker/dist/{src/popoverVersion.d.ts → popoverVersion.d.ts} +0 -0
  170. /package/components/datepicker/dist/{src/styles → styles}/classic/color-css.d.ts +0 -0
  171. /package/components/datepicker/dist/{src/styles → styles}/classic/style-css.d.ts +0 -0
  172. /package/components/datepicker/dist/{src/styles → styles}/color-calendar-css.d.ts +0 -0
  173. /package/components/datepicker/dist/{src/styles → styles}/color-cell-css.d.ts +0 -0
  174. /package/components/datepicker/dist/{src/styles → styles}/color-css.d.ts +0 -0
  175. /package/components/datepicker/dist/{src/styles → styles}/color-month-css.d.ts +0 -0
  176. /package/components/datepicker/dist/{src/styles → styles}/shapeSize-css.d.ts +0 -0
  177. /package/components/datepicker/dist/{src/styles → styles}/snowflake/color-css.d.ts +0 -0
  178. /package/components/datepicker/dist/{src/styles → styles}/snowflake/style-css.d.ts +0 -0
  179. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-cell-css.d.ts +0 -0
  180. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-css.d.ts +0 -0
  181. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-month-css.d.ts +0 -0
  182. /package/components/datepicker/dist/{src/styles → styles}/style-css.d.ts +0 -0
  183. /package/components/datepicker/dist/{src/styles → styles}/tokens-css.d.ts +0 -0
  184. /package/components/datepicker/dist/{src/utilities.d.ts → utilities.d.ts} +0 -0
  185. /package/components/datepicker/dist/{src/utilitiesCalendar.d.ts → utilitiesCalendar.d.ts} +0 -0
  186. /package/components/datepicker/dist/{src/utilitiesCalendarRender.d.ts → utilitiesCalendarRender.d.ts} +0 -0
  187. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/day.d.ts +0 -0
  188. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker-calendar.d.ts +0 -0
  189. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker-cell.d.ts +0 -0
  190. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker.d.ts +0 -0
@@ -31,19 +31,22 @@
31
31
  <auro-header level="2" id="keyEvents">Key Events</auro-header>
32
32
  <!-- AURO-GENERATED-CONTENT:START (FILE:src=./../docs/partials/keyboard-behavior/keyEvents.md) -->
33
33
  <!-- The below content is automatically added from ./../docs/partials/keyboard-behavior/keyEvents.md -->
34
+ <div class="note">
35
+ <p><strong>Note:</strong> The "Focused element" column below indicates the initial <code>event.target</code> — the element that has DOM focus when the key is pressed. The select's keyboard strategy listener is attached once to the <code>&lt;auro-select&gt;</code> host; it receives events via composed bubbling regardless of display mode. When the bib is displayed as a fullscreen dialog (see <code>fullscreenBreakpoint</code>), focus moves to the dialog's close button rather than remaining on the trigger, but keydown events still bubble across the shadow-root boundary up to the host listener, and <code>aria-activedescendant</code> continues to track the active option. An "active option" is one that is not <code>disabled</code>, <code>hidden</code>, or <code>static</code> — these are always skipped during navigation and type-ahead matching.</p>
36
+ </div>
34
37
  <table>
35
38
  <thead>
36
39
  <tr>
37
40
  <th>Key</th>
38
41
  <th>Modifier</th>
39
42
  <th>Current State</th>
40
- <th>Focus Element</th>
43
+ <th>Focused element</th>
41
44
  <th>Behavior</th>
42
45
  </tr>
43
46
  </thead>
44
47
  <tbody>
45
48
  <tr>
46
- <td rowspan="8">ArrowDown</td>
49
+ <td rowspan="6">ArrowDown</td>
47
50
  <td rowspan="2">-</td>
48
51
  <td>Collapsed</td>
49
52
  <td>Trigger element</td>
@@ -57,24 +60,6 @@
57
60
  </td>
58
61
  </tr>
59
62
  <tr>
60
- <td rowspan="2">Meta (Command / Windows key)</td>
61
- <td>Collapsed</td>
62
- <td>Trigger element</td>
63
- <td>
64
- Opens the bib.
65
- <div class="note">
66
- <strong>Note:</strong> On Windows, <code>Meta</code> + arrow key combinations are reserved by the operating system for window management. Windows users should use <code>Control</code> or <code>Alt</code> instead.
67
- </div>
68
- </td>
69
- </tr>
70
- <tr>
71
- <td>Expanded</td>
72
- <td>Trigger element</td>
73
- <td>
74
- Advances the <code>focused</code> option to the last enabled option in the list.
75
- </td>
76
- </tr>
77
- <tr>
78
63
  <td rowspan="2">Alt (Option)</td>
79
64
  <td>Collapsed</td>
80
65
  <td>Trigger element</td>
@@ -94,7 +79,7 @@
94
79
  <td>
95
80
  Opens the bib.
96
81
  <div class="note">
97
- <strong>Note:</strong> On macOS, <code>Control</code> + arrow key combinations are reserved by the operating system for Mission Control and Application Windows. macOS users should use <code>Meta</code> or <code>Alt</code> instead.
82
+ <strong>Note:</strong> On macOS, <code>Control</code> + arrow key combinations are reserved by the operating system for Mission Control and Application Windows. macOS users should use <code>Alt</code> instead.
98
83
  </div>
99
84
  </td>
100
85
  </tr>
@@ -106,7 +91,7 @@
106
91
  </td>
107
92
  </tr>
108
93
  <tr>
109
- <td rowspan="8">ArrowUp</td>
94
+ <td rowspan="6">ArrowUp</td>
110
95
  <td rowspan="2">-</td>
111
96
  <td>Collapsed</td>
112
97
  <td>Trigger element</td>
@@ -120,13 +105,26 @@
120
105
  </td>
121
106
  </tr>
122
107
  <tr>
123
- <td rowspan="2">Meta (Command / Windows key)</td>
108
+ <td rowspan="2">Alt (Option)</td>
109
+ <td>Collapsed</td>
110
+ <td>Trigger element</td>
111
+ <td>Opens the bib.</td>
112
+ </tr>
113
+ <tr>
114
+ <td>Expanded</td>
115
+ <td>Trigger element</td>
116
+ <td>
117
+ Advances the <code>focused</code> option to the first enabled option in the list.
118
+ </td>
119
+ </tr>
120
+ <tr>
121
+ <td rowspan="2">Control</td>
124
122
  <td>Collapsed</td>
125
123
  <td>Trigger element</td>
126
124
  <td>
127
125
  Opens the bib.
128
126
  <div class="note">
129
- <strong>Note:</strong> On Windows, <code>Meta</code> + arrow key combinations are reserved by the operating system for window management. Windows users should use <code>Control</code> or <code>Alt</code> instead.
127
+ <strong>Note:</strong> On macOS, <code>Control</code> + arrow key combinations are reserved by the operating system for Mission Control and Application Windows. macOS users should use <code>Alt</code> instead.
130
128
  </div>
131
129
  </td>
132
130
  </tr>
@@ -138,68 +136,75 @@
138
136
  </td>
139
137
  </tr>
140
138
  <tr>
141
- <td rowspan="2">Alt (Option)</td>
139
+ <td rowspan="2">End</td>
140
+ <td rowspan="2">-</td>
142
141
  <td>Collapsed</td>
143
142
  <td>Trigger element</td>
144
- <td>Opens the bib.</td>
143
+ <td>
144
+ Opens the bib and advances the <code>focused</code> option to the last enabled option in the list.
145
+ </td>
145
146
  </tr>
146
147
  <tr>
147
148
  <td>Expanded</td>
148
149
  <td>Trigger element</td>
149
150
  <td>
150
- Advances the <code>focused</code> option to the first enabled option in the list.
151
+ Advances the <code>focused</code> option to the last enabled option in the list.
151
152
  </td>
152
153
  </tr>
153
154
  <tr>
154
- <td rowspan="2">Control</td>
155
+ <td rowspan="3">Enter</td>
156
+ <td rowspan="3">-</td>
155
157
  <td>Collapsed</td>
156
158
  <td>Trigger element</td>
157
- <td>
158
- Opens the bib.
159
- <div class="note">
160
- <strong>Note:</strong> On macOS, <code>Control</code> + arrow key combinations are reserved by the operating system for Mission Control and Application Windows. macOS users should use <code>Meta</code> or <code>Alt</code> instead.
161
- </div>
162
- </td>
159
+ <td>Opens the bib. Bubbling is stopped so that a parent form does not treat Enter as a submit.</td>
163
160
  </tr>
164
161
  <tr>
165
- <td>Expanded</td>
162
+ <td>Expanded, without <code>multiSelect</code></td>
166
163
  <td>Trigger element</td>
167
164
  <td>
168
- Advances the <code>focused</code> option to the first enabled option in the list.
165
+ The current <code>active</code> option is selected, and the bib closes.
169
166
  </td>
170
167
  </tr>
171
168
  <tr>
172
- <td>End</td>
173
- <td>-</td>
174
- <td>Expanded</td>
169
+ <td>Expanded, with <code>multiSelect</code></td>
175
170
  <td>Trigger element</td>
176
171
  <td>
177
- Advances the <code>focused</code> option to the last enabled option in the list.
172
+ The current <code>active</code> option is toggled; the bib stays open so additional options can be selected.
178
173
  </td>
179
174
  </tr>
180
175
  <tr>
181
- <td rowspan="2">Enter</td>
182
- <td rowspan="2">-</td>
176
+ <td rowspan="3">Escape</td>
177
+ <td rowspan="3">-</td>
178
+ <td>Collapsed</td>
179
+ <td>Trigger element</td>
183
180
  <td>
184
- Expanded, without <code>multiSelect</code>
181
+ Clears the type-ahead buffer. No other change; the event is allowed to bubble so an ancestor dialog or drawer may still handle it.
185
182
  </td>
183
+ </tr>
184
+ <tr>
185
+ <td>Expanded</td>
186
186
  <td>Trigger element</td>
187
187
  <td>
188
- The current <code>focused</code> option is selected, closes the bib.
188
+ Clears the type-ahead buffer and closes the bib. Bubbling is stopped so that an ancestor dialog, drawer, or popup does not also close.
189
189
  </td>
190
190
  </tr>
191
191
  <tr>
192
+ <td>Expanded, fullscreen bib</td>
193
+ <td>Close button</td>
192
194
  <td>
193
- Expanded, with <code>multiSelect</code>
195
+ The Escape keydown bubbles from the close button to the select's keyboard strategy, which clears the type-ahead buffer and calls <code>dropdown.hide()</code> — the same handler as the popover case. The native <code>&lt;dialog&gt;</code> <code>cancel</code> → <code>auro-bib-cancel</code> path is a fallback that closes the bib if the strategy did not run. Focus is restored to the trigger on close.
194
196
  </td>
197
+ </tr>
198
+ <tr>
199
+ <td rowspan="2">Home</td>
200
+ <td rowspan="2">-</td>
201
+ <td>Collapsed</td>
195
202
  <td>Trigger element</td>
196
203
  <td>
197
- The current <code>focused</code> option is toggled, does not close the bib.
204
+ Opens the bib and advances the <code>focused</code> option to the first enabled option in the list.
198
205
  </td>
199
206
  </tr>
200
207
  <tr>
201
- <td>Home</td>
202
- <td>-</td>
203
208
  <td>Expanded</td>
204
209
  <td>Trigger element</td>
205
210
  <td>
@@ -212,9 +217,9 @@
212
217
  <td>Expanded</td>
213
218
  <td>Trigger element</td>
214
219
  <td>
215
- The current <code>focused</code> option is selected.
220
+ The bib closes. If there is an <code>active</code> option, it is selected first in single-select, or toggled in <code>multiSelect</code>. If no option is active, focus simply moves on without a selection change.
216
221
  <div class="note">
217
- <strong>Note:</strong> the page will also navigate to the next focusable element in the tabindex sequence.
222
+ <strong>Note:</strong> <code>Tab</code> does not <code>preventDefault</code>, so the browser continues to move focus to the next element in the tabindex sequence after the selection is applied.
218
223
  </div>
219
224
  </td>
220
225
  </tr>
@@ -223,10 +228,32 @@
223
228
  <td>Expanded</td>
224
229
  <td>Trigger element</td>
225
230
  <td>
226
- The current <code>focused</code> option is selected.
227
- <div class="note">
228
- <strong>Note:</strong> the page will also navigate to the previous focusable element in the tabindex sequence.
229
- </div>
231
+ Same behavior as <code>Tab</code>: the bib closes and any <code>active</code> option is selected (single-select) or toggled (<code>multiSelect</code>). The strategy does not read <code>shiftKey</code>; only the browser's own focus traversal reverses direction, moving focus to the previous element in the tabindex sequence.
232
+ </td>
233
+ </tr>
234
+ <tr>
235
+ <td rowspan="2">Space</td>
236
+ <td rowspan="2">-</td>
237
+ <td>Collapsed or Expanded, type-ahead buffer active</td>
238
+ <td>Trigger element</td>
239
+ <td>
240
+ Extends the type-ahead buffer with a space character. The <code>active</code> option advances if the buffer matches an active option; the bib state is unchanged. See the <a href="customize.html#typeAhead">Type-Ahead</a> section on the Customize page.
241
+ </td>
242
+ </tr>
243
+ <tr>
244
+ <td>Collapsed or Expanded, type-ahead buffer empty</td>
245
+ <td>Trigger element</td>
246
+ <td>
247
+ Toggles the bib — opens it when collapsed and closes it when expanded. No selection change occurs.
248
+ </td>
249
+ </tr>
250
+ <tr>
251
+ <td>Any printable character (other than Space)</td>
252
+ <td>-</td>
253
+ <td>Collapsed or Expanded</td>
254
+ <td>Trigger element</td>
255
+ <td>
256
+ Extends the type-ahead buffer. When the buffer matches an enabled option's displayed text, the <code>focused</code> option advances to that option and the bib opens if it was collapsed. A keystroke that does not match any option leaves the bib state unchanged. Repeated keystrokes within <code>typeaheadTimeoutMs</code> (default 500&nbsp;ms) extend the buffer; pressing the same character repeatedly cycles through matching options. Keys chorded with <code>Ctrl</code>, <code>Meta</code>, or <code>Alt</code> are ignored so browser and OS shortcuts do not leak into the buffer. See the <a href="customize.html#typeAhead">Type-Ahead</a> section on the Customize page.
230
257
  </td>
231
258
  </tr>
232
259
  </tbody>
@@ -27,7 +27,7 @@
27
27
  </tr>
28
28
  <tr>
29
29
  <td>Invalid</td>
30
- <td><em>"invalid data"</em></td>
30
+ <td>The trigger itself does not carry <code>aria-invalid</code>; the invalid state is announced through the alert-role Help Text (see <a href="#voiceOverStateInvalid">Invalid</a> below), not as a state hint on focus.</td>
31
31
  </tr>
32
32
  <tr>
33
33
  <td>Disabled</td>
@@ -95,7 +95,7 @@
95
95
  <p>Key characteristics across both platforms:</p>
96
96
  <ul>
97
97
  <li>The <code>label</code> is always read first.</li>
98
- <li>The component <strong>role</strong> is announced as <em>"pop-up button"</em> (macOS) or <em>"button"</em> (iOS).</li>
98
+ <li>The trigger <strong>role</strong> is announced as <em>"combo box"</em> in both single-select and multi-select modes. The role does not change between large and small viewports — the fullscreen dialog on mobile wraps the same trigger, it does not remap the trigger's role to <em>"pop-up button"</em>, <em>"button"</em>, or <em>"list box"</em>. In multi-select mode, <code>aria-multiselectable="true"</code> is applied to the internal <code>&lt;auro-menu&gt;</code> (the listbox), not to the trigger.</li>
99
99
  <li><code>disabled</code> options are announced as <em>"dimmed"</em> and cannot be selected.</li>
100
100
  </ul>
101
101
  <auro-header level="2" id="voiceOverStates">Impact of State</auro-header>
@@ -116,7 +116,7 @@
116
116
  <li><strong>Focus</strong></li>
117
117
  <li><strong>Open | Expand</strong></li>
118
118
  <li><strong>Navigate Options:</strong> Moves through options; announces each option name plus <em>"selected"</em> or nothing.</li>
119
- <li><strong>Selecting an option:</strong> Double-tap toggles the focused option's selection — announces <em>"selected"</em> or <em>"unselected"</em>.</li>
119
+ <li><strong>Selecting an option:</strong> Double-tap toggles the focused option's selection — announces <em>"selected"</em> or <em>"not selected"</em>.</li>
120
120
  <li><strong>Close | Collapse:</strong> Collapses the list, announces the expanded state change.</li>
121
121
  </ol>
122
122
  <auro-header level="4" id="voiceOverStateMultiSelectSmallVP">Small Viewport Multi-select</auro-header>
@@ -125,7 +125,7 @@
125
125
  <li><strong>Focus</strong></li>
126
126
  <li><strong>Open | Expand</strong></li>
127
127
  <li><strong>Navigate Options:</strong> Moves through options; announces each option name plus <em>"selected"</em> or nothing.</li>
128
- <li><strong>Selecting an option:</strong> Double-tap toggles the focused option's selection — announces <em>"selected"</em> or <em>"unselected"</em>.</li>
128
+ <li><strong>Selecting an option:</strong> Double-tap toggles the focused option's selection — announces <em>"selected"</em> or <em>"not selected"</em>.</li>
129
129
  <li><strong>Close | Collapse:</strong> Collapses the list, announces the expanded state change.</li>
130
130
  </ol>
131
131
  <p>Key differences from single-select:</p>
@@ -139,9 +139,9 @@
139
139
  </thead>
140
140
  <tbody>
141
141
  <tr>
142
- <td>Role</td>
143
- <td>pop-up button</td>
144
- <td>list box</td>
142
+ <td>Trigger role</td>
143
+ <td>combo box</td>
144
+ <td>combo box (with <code>aria-multiselectable="true"</code> on the internal listbox)</td>
145
145
  </tr>
146
146
  <tr>
147
147
  <td>Interaction model</td>
@@ -153,31 +153,44 @@
153
153
  <td>
154
154
  <p>Current selected value</p>
155
155
  <div class="note">
156
- <strong>On focus:</strong> Announces "[component label], [current value or 'no selection'], pop-up button"
156
+ <strong>On focus:</strong> Announces "[component label], [current value or 'no selection'], combo box"
157
157
  </div>
158
158
  </td>
159
159
  <td>
160
160
  <p>Each option's selected state individually</p>
161
161
  <div class="note">
162
- <strong>On focus:</strong> Announces "[component label], [[{option label, 'selected'}, {option label, 'selected'}] or 'no selection'], list box"
162
+ <strong>On focus:</strong> Announces "[component label], [[{option label, 'selected'}, {option label, 'selected'}] or 'no selection'], combo box"
163
163
  </div>
164
164
  <div class="note">
165
- <strong>On selection change:</strong> Announces "[option label], ['selected' | 'unselected']"
165
+ <strong>On selection change:</strong> Announces "[option label], ['selected' | 'not selected']"
166
166
  </div>
167
167
  </td>
168
168
  </tr>
169
169
  <tr>
170
170
  <td>Space key</td>
171
171
  <td>Opens/closes picker</td>
172
- <td>Toggles selection</td>
172
+ <td>Opens/closes picker — <strong>Enter</strong> toggles the active option's selection. Space does not toggle selection in multi-select.</td>
173
173
  </tr>
174
174
  </tbody>
175
175
  </table>
176
176
  <div class="note"><strong>Important caveat:</strong> Multi-select is notoriously difficult for all users, including screen reader users — WCAG and usability research generally recommend avoiding <code>&lt;auro-select multiSelect&gt;</code> in favor of checkboxes or other patterns that make multi-selection more discoverable.</div>
177
177
  <auro-header level="3" id="voiceOverStateInvalid">Invalid</auro-header>
178
- <p>When an <code>&lt;auro-select&gt;</code> is invalid the following occurs:</p>
178
+ <p>When an <code>&lt;auro-select&gt;</code> becomes invalid the following occurs:</p>
179
179
  <ul>
180
- <li><code>Focus</code> VoiceOver announces <em>"invalid data"</em> (macOS) or <em>"invalid entry"</em> (iOS) after the element's label.</li>
181
- <li>The Help Text will render the error message and it will be included in the VoiceOver focus announcement.</li>
180
+ <li>The Help Text region renders the error message with <code>role="alert"</code> and <code>aria-live="assertive"</code>, so VoiceOver announces the error message immediately when the state transitions to invalid — the announcement does not wait for the next focus.</li>
181
+ <li>On subsequent focus of the trigger, the help text's error content is read as part of the description, following the label / value / role announcement.</li>
182
182
  </ul>
183
- <p>Example: when focusing on an invalid <code>&lt;auro-select&gt;</code> the VoiceOver announces something like <em>"Country, invalid data, combo box, Please select a country"</em>.</p>
183
+ <div class="note"><strong>Note:</strong> the trigger itself does not set <code>aria-invalid</code>, so VoiceOver does not include the words <em>"invalid data"</em> (macOS) or <em>"invalid entry"</em> (iOS) as part of the trigger's own announcement. The invalid state is conveyed entirely through the alert-role help text.</div>
184
+ <p>Example: when the select becomes invalid, VoiceOver announces the error message (e.g., <em>"Please select a country"</em>) via the assertive alert. On the next focus of the trigger, VoiceOver announces something like <em>"Country, no selection, combo box, Please select a country"</em>.</p>
185
+ <auro-header level="2" id="voiceOverImplementation">How the Announcements Are Wired</auro-header>
186
+ <p>The following implementation details are relevant when debugging or verifying VoiceOver behavior in <code>&lt;auro-select&gt;</code>:</p>
187
+ <auro-header level="3" id="voiceOverImplActiveDescendant">Active option (aria-activedescendant)</auro-header>
188
+ <p>Focus remains on the trigger while the bib is open; the currently active option is exposed via <code>aria-activedescendant</code>. Because the trigger and the option live in different shadow roots, the code sets <code>trigger.ariaActiveDescendantElement</code> (the IDL/property form) rather than the string attribute alone — this is what allows VoiceOver to announce the active option's label and state across the shadow boundary.</p>
189
+ <auro-header level="3" id="voiceOverImplSetSize">Position in list (aria-setsize / aria-posinset)</auro-header>
190
+ <p>Each option is stamped with <code>aria-setsize</code> (total count of navigable options) and <code>aria-posinset</code> (its 1-based position). Stamping runs on initial menu configuration and again whenever <code>auroMenu-optionsChange</code> fires (options added, removed, or otherwise re-initialized), so VoiceOver's <em>"N of M"</em> announcement stays accurate across dynamic option lists. A pure <code>value</code> change does not re-stamp on its own — it only updates selection state — unless it triggers a menu re-initialization in an empty/deferred-match path.</p>
191
+ <auro-header level="3" id="voiceOverImplLiveRegion">Live region routing</auro-header>
192
+ <p>Selection-change announcements (single-select confirmation and multi-select toggle wording) are written into an <code>aria-live="polite"</code> span that lives in the host component's shadow root by default. In fullscreen mode the trigger becomes <code>inert</code> and everything outside the <code>&lt;dialog&gt;</code> is hidden from assistive tech — so the live region is routed into the bib's shadow root instead, ensuring the announcement is reachable while the dialog is open.</p>
193
+ <auro-header level="3" id="voiceOverImplDebounce">Announcement timing</auro-header>
194
+ <p>Selection announcements are delayed briefly (~300ms) so the option's <em>"selected"</em> / <em>"not selected"</em> announcement is not overridden by the <em>"collapsed"</em> announcement that follows when the bib closes.</p>
195
+ <auro-header level="3" id="voiceOverImplFullscreen">Fullscreen focus and inert</auro-header>
196
+ <p>When the fullscreen dialog opens, focus moves to the dialog's <strong>Close</strong> button and the trigger is marked <code>inert</code> so screen readers cannot reach it — the user is effectively inside the dialog until it closes, at which point focus returns to the trigger and <code>inert</code> is removed.</p>
@@ -180,13 +180,6 @@ export class AuroSelect extends AuroElement {
180
180
  type: BooleanConstructor;
181
181
  reflect: boolean;
182
182
  };
183
- /**
184
- * @private
185
- */
186
- options: {
187
- type: ArrayConstructor;
188
- state: boolean;
189
- };
190
183
  /**
191
184
  * Specifies the current selected menuOption. Default type is `HTMLElement`, changing to `Array<HTMLElement>` when `multiSelect` is true.
192
185
  * @type {HTMLElement|Array<HTMLElement>}
@@ -256,6 +249,15 @@ export class AuroSelect extends AuroElement {
256
249
  reflect: boolean;
257
250
  attribute: boolean;
258
251
  };
252
+ /**
253
+ * Milliseconds of keyboard inactivity before the type-ahead buffer resets.
254
+ * Increase for users who type slowly.
255
+ * @default 500
256
+ */
257
+ typeaheadTimeoutMs: {
258
+ type: NumberConstructor;
259
+ reflect: boolean;
260
+ };
259
261
  /**
260
262
  * Specifies the `validityState` this element is in.
261
263
  */
@@ -264,7 +266,7 @@ export class AuroSelect extends AuroElement {
264
266
  reflect: boolean;
265
267
  };
266
268
  /**
267
- * Value selected for the component.
269
+ * Value selected for the component. When set programmatically or as a preset attribute, the value must match a selectable option. If it matches an option marked `disabled` or `static`, the selection is rejected: `value` is cleared to `undefined` while `optionSelected` is cleared to `undefined` in single-select or `[]` in multiSelect. `hidden` options remain selectable by value.
268
270
  */
269
271
  value: {
270
272
  type: StringConstructor;
@@ -325,6 +327,14 @@ export class AuroSelect extends AuroElement {
325
327
  * @private
326
328
  */
327
329
  private hasDisplayValueContent;
330
+ /**
331
+ * @private
332
+ */
333
+ private typeaheadBuffer;
334
+ /**
335
+ * @private
336
+ */
337
+ private _typeaheadTimeout;
328
338
  /**
329
339
  * @private
330
340
  * @returns {void} Internal defaults.
@@ -335,6 +345,7 @@ export class AuroSelect extends AuroElement {
335
345
  fullscreenBreakpoint: string | undefined;
336
346
  onDark: boolean | undefined;
337
347
  isPopoverVisible: any;
348
+ typeaheadTimeoutMs: number | undefined;
338
349
  shape: string | undefined;
339
350
  size: string | undefined;
340
351
  /**
@@ -371,6 +382,26 @@ export class AuroSelect extends AuroElement {
371
382
  dropdown: any;
372
383
  optionActive: any;
373
384
  bibtemplate: any;
385
+ /**
386
+ * Reads the current label slot text and pushes it to the dropdown bib
387
+ * (for dialog naming) and the menu (for listbox aria-label). Safe to call
388
+ * before either child has been wired up — each branch self-guards.
389
+ * @private
390
+ */
391
+ private _syncLabelText;
392
+ /**
393
+ * Keeps the dialog/menu accessible names in sync when consumers mutate the
394
+ * label slot at runtime (e.g., i18n locale swap). `slotchange` alone is
395
+ * insufficient — it doesn't fire when textContent of an already-assigned
396
+ * slotted node changes, which is the common case. We scope the observer to
397
+ * the label node itself (not the whole host subtree) so option-content
398
+ * mutations don't trigger label re-syncs, and re-target on `slotchange`
399
+ * when consumers add or replace the label element.
400
+ * @private
401
+ */
402
+ private _observeLabelChanges;
403
+ _labelObserver: MutationObserver | null | undefined;
404
+ _retargetLabelObserver: (() => void) | null | undefined;
374
405
  /**
375
406
  * Updates the displayed value in an Auro dropdown component based on optionSelected.
376
407
  * @private
@@ -400,6 +431,12 @@ export class AuroSelect extends AuroElement {
400
431
  private _getAnnouncementRoot;
401
432
  /**
402
433
  * Binds all behavior needed to the menu after rendering.
434
+ *
435
+ * The `<auro-menu>` reference is captured once and not re-targeted on
436
+ * `slotchange`. Runtime option mutations are covered via
437
+ * `auroMenu-optionsChange`, so swap options inside the menu freely; do not
438
+ * swap the `<auro-menu>` element itself under a live select — remount the
439
+ * parent `<auro-select>` instead.
403
440
  * @private
404
441
  * @returns {void}
405
442
  */
@@ -407,7 +444,6 @@ export class AuroSelect extends AuroElement {
407
444
  menu: Element | null | undefined;
408
445
  defaultMenuSize: string | null | undefined;
409
446
  defaultMenuShape: string | null | undefined;
410
- options: any;
411
447
  optionSelected: any;
412
448
  /**
413
449
  * Binds all behavior needed to the component after rendering.
@@ -421,15 +457,33 @@ export class AuroSelect extends AuroElement {
421
457
  * @param {number} index - Index of the option to make active.
422
458
  */
423
459
  updateActiveOption(index: number): void;
460
+ /**
461
+ * Returns the lowercase, trimmed text content of a menu option.
462
+ * @private
463
+ * @param {HTMLElement} option - The menu option element.
464
+ * @returns {string}
465
+ */
466
+ private _getOptionDisplayText;
467
+ /**
468
+ * Empties the type-ahead buffer and cancels any pending reset timeout.
469
+ * Called when focus leaves the component, when Escape closes the bib, and on disconnect
470
+ * so a stale buffer never bridges into a fresh interaction.
471
+ * @private
472
+ */
473
+ private _clearTypeaheadBuffer;
424
474
  /**
425
475
  * Updates the active option in the menu based on keyboard input.
476
+ *
477
+ * Implements the WAI-ARIA APG Listbox type-ahead pattern: accumulates printable
478
+ * keystrokes into a buffer that resets after `typeaheadTimeoutMs` of inactivity.
479
+ * A multi-character buffer matches the first option whose displayed text starts
480
+ * with the buffer; repeating a single character cycles through options that start
481
+ * with that character.
426
482
  * @private
427
483
  * @param {string} _key - The key pressed by the user.
428
484
  * @returns {void}
429
485
  */
430
486
  private updateActiveOptionBasedOnKey;
431
- sameLetterTimes: any;
432
- lastLetter: string | undefined;
433
487
  /**
434
488
  * Manages the visibility of the dropdown based on loading state changes.
435
489
  *
@@ -475,7 +529,11 @@ export class AuroSelect extends AuroElement {
475
529
  */
476
530
  private clearSelection;
477
531
  firstUpdated(): void;
478
- setMenuValue(value: any): void;
532
+ /**
533
+ * Sets the selected value by matching it against the menu options. Options marked `disabled` or `static` are not selectable: if the value matches one, the selection is rejected and `value` is cleared to `undefined` while `optionSelected` is cleared to `undefined` in single-select or `[]` in multiSelect. `hidden` options remain selectable.
534
+ * @param {string} value - The value to match against the menu options.
535
+ */
536
+ setMenuValue(value: string): void;
479
537
  /**
480
538
  * Scrolls the currently active option into view.
481
539
  * Respects user's motion preferences for accessibility.