@aurodesignsystem-dev/auro-formkit 0.0.0-pr1408.15 → 0.0.0-pr1408.17

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 (58) hide show
  1. package/components/checkbox/demo/api.min.js +1 -1
  2. package/components/checkbox/demo/index.min.js +1 -1
  3. package/components/checkbox/demo/keyboardBehavior.md +0 -0
  4. package/components/checkbox/dist/index.js +1 -1
  5. package/components/checkbox/dist/registered.js +1 -1
  6. package/components/combobox/demo/api.min.js +320 -282
  7. package/components/combobox/demo/index.min.js +320 -282
  8. package/components/combobox/demo/keyboardBehavior.md +9 -36
  9. package/components/combobox/dist/auro-combobox.d.ts +17 -0
  10. package/components/combobox/dist/comboboxKeyboardStrategy.d.ts +6 -3
  11. package/components/combobox/dist/index.js +286 -255
  12. package/components/combobox/dist/registered.js +286 -255
  13. package/components/counter/demo/api.md +1 -1
  14. package/components/counter/demo/api.min.js +202 -146
  15. package/components/counter/demo/index.min.js +202 -146
  16. package/components/counter/dist/auro-counter.d.ts +11 -8
  17. package/components/counter/dist/index.js +202 -146
  18. package/components/counter/dist/keyboardStrategy.d.ts +4 -0
  19. package/components/counter/dist/registered.js +202 -146
  20. package/components/datepicker/demo/api.min.js +148 -137
  21. package/components/datepicker/demo/index.min.js +148 -137
  22. package/components/datepicker/dist/index.js +143 -132
  23. package/components/datepicker/dist/registered.js +143 -132
  24. package/components/dropdown/demo/api.md +29 -29
  25. package/components/dropdown/demo/api.min.js +117 -121
  26. package/components/dropdown/demo/index.min.js +117 -121
  27. package/components/dropdown/dist/auro-dropdown.d.ts +3 -3
  28. package/components/dropdown/dist/auro-dropdownBib.d.ts +1 -40
  29. package/components/dropdown/dist/dropdownBibKeyboardStrategy.d.ts +7 -0
  30. package/components/dropdown/dist/index.js +101 -109
  31. package/components/dropdown/dist/registered.js +101 -109
  32. package/components/form/demo/api.min.js +958 -788
  33. package/components/form/demo/index.min.js +958 -788
  34. package/components/form/demo/keyboardBehavior.md +0 -0
  35. package/components/input/demo/api.min.js +102 -77
  36. package/components/input/demo/index.min.js +102 -77
  37. package/components/input/demo/keyboardBehavior.md +0 -0
  38. package/components/input/dist/auro-input.d.ts +11 -0
  39. package/components/input/dist/base-input.d.ts +1 -0
  40. package/components/input/dist/index.js +32 -18
  41. package/components/input/dist/registered.js +32 -18
  42. package/components/menu/demo/api.min.js +34 -27
  43. package/components/menu/demo/index.min.js +34 -27
  44. package/components/menu/dist/auro-menu.d.ts +0 -6
  45. package/components/menu/dist/index.js +34 -27
  46. package/components/menu/dist/registered.js +34 -27
  47. package/components/radio/demo/api.min.js +1 -1
  48. package/components/radio/demo/index.min.js +1 -1
  49. package/components/radio/dist/index.js +1 -1
  50. package/components/radio/dist/registered.js +1 -1
  51. package/components/select/demo/api.min.js +225 -166
  52. package/components/select/demo/index.min.js +225 -166
  53. package/components/select/demo/keyboardBehavior.md +3 -3
  54. package/components/select/dist/index.js +191 -139
  55. package/components/select/dist/registered.js +191 -139
  56. package/components/select/dist/selectKeyboardStrategy.d.ts +5 -2
  57. package/custom-elements.json +1547 -1466
  58. package/package.json +8 -6
@@ -1125,7 +1125,13 @@ function guardTouchPassthrough(element) {
1125
1125
  }
1126
1126
 
1127
1127
  /**
1128
- * Restores the dropdown trigger after a fullscreen dialog closes.
1128
+ * Restores the dropdown trigger after a fullscreen dialog closes
1129
+ * when focus doesn't leave the component (e.g. using Esc or Enter keys).
1130
+ * When leaving the component (e.g., tabbing out of the combobox after closing
1131
+ * the fullscreen dialog), focus restoration is handled by the browser's native
1132
+ * dialog focus restoration behavior, so this function only restores focus
1133
+ * when focus remains inside the component after the dialog closes.
1134
+
1129
1135
  *
1130
1136
  * Removes the `inert` attribute from the trigger so it is accessible again,
1131
1137
  * and restores focus to the given target after one animation frame. The rAF
@@ -1141,8 +1147,11 @@ function guardTouchPassthrough(element) {
1141
1147
  function restoreTriggerAfterClose(dropdown, focusTarget) {
1142
1148
  dropdown.trigger.inert = false;
1143
1149
 
1150
+ // Wait a frame so that dialog.close() has completed and the browser's
1151
+ // native focus restoration has run before we attempt to focus the
1152
+ // trigger / input programmatically.
1144
1153
  requestAnimationFrame(() => {
1145
- if (!dropdown.isPopoverVisible) {
1154
+ if (!dropdown.isPopoverVisible && dropdown.trigger.contains(document.activeElement)) {
1146
1155
  focusTarget.focus();
1147
1156
  }
1148
1157
  });
@@ -1165,7 +1174,7 @@ function restoreTriggerAfterClose(dropdown, focusTarget) {
1165
1174
  * @returns {{isExpanded: boolean, isModal: boolean, isPopover: boolean, activeInput: HTMLElement|null}}
1166
1175
  * isModal and isPopover reflect the display mode (fullscreen vs not) regardless of expanded state.
1167
1176
  */
1168
- function createDisplayContext(component, options = {}) {
1177
+ function createDisplayContext$1(component, options = {}) {
1169
1178
  const dd = options.dropdown || component.dropdown;
1170
1179
  // isPopoverVisible reflects as the `open` attribute.
1171
1180
  // It reports whether the bib is open in any mode (popover or modal).
@@ -1195,11 +1204,11 @@ function createDisplayContext(component, options = {}) {
1195
1204
  * @param {Object} strategy - Map of key names to handler functions.
1196
1205
  * @param {Object} [options] - Optional config passed to createDisplayContext.
1197
1206
  */
1198
- function applyKeyboardStrategy(component, strategy, options = {}) {
1207
+ function applyKeyboardStrategy$1(component, strategy, options = {}) {
1199
1208
  component.addEventListener('keydown', async (evt) => {
1200
1209
  const handler = strategy[evt.key] || strategy.default;
1201
1210
  if (typeof handler === 'function') {
1202
- const ctx = createDisplayContext(component, options);
1211
+ const ctx = createDisplayContext$1(component, options);
1203
1212
  await handler(component, evt, ctx);
1204
1213
  }
1205
1214
  });
@@ -1249,102 +1258,32 @@ function isClearBtnFocused(ctx, clearBtn = getClearBtn(ctx)) {
1249
1258
  if (!clearBtn) {
1250
1259
  return false;
1251
1260
  }
1252
- return Boolean(clearBtn.shadowRoot && clearBtn.shadowRoot.activeElement !== null);
1261
+ const isFocused = Boolean(clearBtn.shadowRoot && clearBtn.shadowRoot.activeElement !== null);
1262
+ return isFocused;
1253
1263
  }
1254
1264
 
1255
1265
  const comboboxKeyboardStrategy = {
1256
- async Enter(component, evt, ctx) {
1257
- // If the clear button has focus, let the browser activate it normally.
1258
- // stopPropagation prevents parent containers (e.g., forms) from treating
1259
- // Enter as a submit, but we must NOT call preventDefault — that would
1260
- // block the browser's built-in "Enter activates focused button" behavior.
1266
+ ArrowDown(component, evt, ctx) {
1267
+ // If the clear button has focus, let the browser handle ArrowDown normally.
1261
1268
  if (isClearBtnFocused(ctx)) {
1262
- evt.stopPropagation();
1263
1269
  return;
1264
1270
  }
1265
1271
 
1266
- if (ctx.isExpanded && component.optionActive) {
1267
- component.menu.makeSelection();
1268
- await component.updateComplete;
1269
- evt.preventDefault();
1270
- evt.stopPropagation();
1271
- component.setClearBtnFocus();
1272
- } else {
1273
- // Prevent the keypress from bubbling to parent containers (e.g., forms)
1274
- // which could interpret Enter as a submit or trigger other unintended behavior.
1275
- // This is safe because showBib() opens the dialog programmatically,
1276
- // not via event propagation.
1277
- evt.preventDefault();
1278
- evt.stopPropagation();
1279
- component.showBib();
1280
- }
1281
- },
1282
-
1283
- Tab(component, evt, ctx) {
1284
- if (!ctx.isExpanded) {
1285
- return;
1286
- }
1287
-
1288
- // Shift+Tab moves the highlight to the first non-disabled option
1289
- // without making a selection or closing the bib.
1290
- if (evt.shiftKey) {
1291
- evt.preventDefault();
1292
- const firstActive = component.menu.menuService.menuOptions.find((option) => option.isActive);
1293
- if (firstActive) {
1294
- component.menu.updateActiveOption(firstActive);
1295
- }
1296
- return;
1297
- }
1298
-
1299
- if (ctx.isModal) {
1300
- if (!ctx.activeInput) {
1301
- return;
1302
- }
1303
- const clearBtn = getClearBtn(ctx);
1304
- const clearBtnHasFocus = isClearBtnFocused(ctx, clearBtn);
1305
-
1306
- // Tab from input: if clear button exists and doesn't have focus, focus it
1307
- if (clearBtn && !clearBtnHasFocus && ctx.activeInput.value) {
1308
- // Force clear button container visible to work around Safari not
1309
- // propagating :focus-within through shadow DOM boundaries, which
1310
- // causes .wrapper:not(:focus-within) to hide .notification.clear.
1311
- const clearContainer = clearBtn.closest('.clear');
1312
- if (clearContainer) {
1313
- clearContainer.style.display = 'flex';
1314
- clearBtn.addEventListener('focusout', () => {
1315
- // Delay cleanup so :focus-within settles when focus moves
1316
- // to a sibling (e.g., Shift+Tab back to the input).
1317
- requestAnimationFrame(() => {
1318
- clearContainer.style.display = '';
1319
- });
1320
- }, { once: true });
1321
- }
1272
+ // option display and navigation are prevented if there are no available options
1273
+ if (component.availableOptions.length > 0) {
1274
+ // navigate if bib is open otherwise open it
1275
+ if (component.dropdown.isPopoverVisible) {
1276
+ evt.preventDefault();
1322
1277
 
1323
- // Focus the native button inside auro-button so the browser
1324
- // treats it as a real focusable element inside the dialog.
1325
- const nativeBtn = clearBtn.shadowRoot && clearBtn.shadowRoot.querySelector('button');
1326
- if (nativeBtn) {
1327
- nativeBtn.focus();
1278
+ if (evt.altKey || evt.metaKey) {
1279
+ component.activateLastEnabledAvailableOption();
1328
1280
  } else {
1329
- clearBtn.focus();
1281
+ navigateArrow(component, 'down');
1330
1282
  }
1331
- return;
1332
- }
1333
-
1334
- // Tab from clear button (or no clear button / no value) →
1335
- // select the highlighted option if any, then close
1336
- if (component.optionActive) {
1337
- component.menu.makeSelection();
1283
+ } else {
1284
+ component.showBib();
1338
1285
  }
1339
- component.hideBib();
1340
- return;
1341
- }
1342
-
1343
- // Non-fullscreen: select + close
1344
- if (component.menu.optionActive && component.menu.optionActive.value) {
1345
- component.menu.value = component.menu.optionActive.value;
1346
1286
  }
1347
- component.hideBib();
1348
1287
  },
1349
1288
 
1350
1289
  ArrowUp(component, evt, ctx) {
@@ -1353,31 +1292,85 @@ const comboboxKeyboardStrategy = {
1353
1292
  return;
1354
1293
  }
1355
1294
 
1295
+ // option display and navigation are prevented if there are no available options
1356
1296
  if (component.availableOptions.length > 0) {
1357
- component.showBib();
1297
+ // navigate if bib is open otherwise open it
1298
+ if (component.dropdown.isPopoverVisible) {
1299
+ evt.preventDefault();
1300
+
1301
+ if (evt.altKey || evt.metaKey) {
1302
+ component.activateFirstEnabledAvailableOption();
1303
+ } else {
1304
+ navigateArrow(component, 'up');
1305
+ }
1306
+ } else {
1307
+ component.showBib();
1308
+ }
1358
1309
  }
1359
- // Read live visibility — ctx.isExpanded was computed before showBib() above,
1360
- // so it wouldn't reflect the state change.
1361
- if (component.dropdown.isPopoverVisible) {
1310
+ },
1311
+
1312
+ End(component, evt, ctx) {
1313
+ if (ctx.isExpanded) {
1362
1314
  evt.preventDefault();
1363
- navigateArrow(component, 'up');
1315
+ evt.stopPropagation();
1316
+ component.activateLastEnabledAvailableOption();
1364
1317
  }
1365
1318
  },
1366
1319
 
1367
- ArrowDown(component, evt, ctx) {
1368
- // If the clear button has focus, let the browser handle ArrowDown normally.
1320
+ Enter(component, evt, ctx) {
1369
1321
  if (isClearBtnFocused(ctx)) {
1370
- return;
1371
- }
1322
+ // If the clear button has focus, let the browser activate it normally.
1323
+ // stopPropagation prevents parent containers (e.g., forms) from treating
1324
+ // Enter as a submit, but we must NOT call preventDefault — that would
1325
+ // block the browser's built-in "Enter activates focused button" behavior.
1326
+ evt.stopPropagation();
1327
+ } else if (ctx.isExpanded && component.menu.optionActive) {
1328
+ component.menu.makeSelection();
1372
1329
 
1373
- if (component.availableOptions.length > 0) {
1330
+ if (ctx.isModal) {
1331
+ component.setTriggerInputFocus();
1332
+ }
1333
+
1334
+ evt.preventDefault();
1335
+ evt.stopPropagation();
1336
+ } else {
1337
+ // Prevent the keypress from bubbling to parent containers (e.g., forms)
1338
+ // which could interpret Enter as a submit or trigger other unintended behavior.
1339
+ // This is safe because showBib() opens the dialog programmatically,
1340
+ // not via event propagation.
1341
+ evt.preventDefault();
1342
+ evt.stopPropagation();
1374
1343
  component.showBib();
1375
1344
  }
1376
- // Read live visibility — ctx.isExpanded was computed before showBib() above,
1377
- // so it wouldn't reflect the state change.
1378
- if (component.dropdown.isPopoverVisible) {
1345
+ },
1346
+
1347
+ Escape(component, _evt, ctx) {
1348
+ if (ctx.isExpanded && ctx.isModal) {
1349
+ component.setTriggerInputFocus();
1350
+ }
1351
+ },
1352
+
1353
+ Home(component, evt, ctx) {
1354
+ if (ctx.isExpanded) {
1379
1355
  evt.preventDefault();
1380
- navigateArrow(component, 'down');
1356
+ evt.stopPropagation();
1357
+ component.activateFirstEnabledAvailableOption();
1358
+ }
1359
+ },
1360
+
1361
+ Tab(component, evt, ctx) {
1362
+ if (ctx.isExpanded && !isClearBtnFocused(ctx)) {
1363
+ // ClearBtn will not bubble up tab key events when it's focused, so need to manage it here when focused
1364
+ component.menu.makeSelection();
1365
+ component.hideBib();
1366
+
1367
+ // In fullscreen modal mode, closing the dialog does not
1368
+ // automatically restores focus to the input. In the tab case,
1369
+ // Explicitly move focus to the trigger's clear button so the
1370
+ // user can continues tabbing through the page normally.
1371
+ if (ctx.isModal && !evt.shiftKey) {
1372
+ component.setClearBtnFocus();
1373
+ }
1381
1374
  }
1382
1375
  },
1383
1376
  };
@@ -3195,6 +3188,11 @@ class AuroFloatingUI {
3195
3188
  this.clickHandler = null;
3196
3189
  this.keyDownHandler = null;
3197
3190
 
3191
+ /**
3192
+ * @private
3193
+ */
3194
+ this.enableKeyboardHandling = true;
3195
+
3198
3196
  /**
3199
3197
  * @private
3200
3198
  */
@@ -3455,11 +3453,10 @@ class AuroFloatingUI {
3455
3453
  return;
3456
3454
  }
3457
3455
 
3458
- const { activeElement } = document;
3459
3456
  // if focus is still inside of trigger or bib, do not close
3460
3457
  if (
3461
- this.element.contains(activeElement) ||
3462
- this.element.bib?.contains(activeElement)
3458
+ this.element.matches(":focus") ||
3459
+ this.element.matches(":focus-within")
3463
3460
  ) {
3464
3461
  return;
3465
3462
  }
@@ -3530,7 +3527,9 @@ class AuroFloatingUI {
3530
3527
  document.addEventListener("focusin", this.focusHandler);
3531
3528
  }
3532
3529
 
3533
- document.addEventListener("keydown", this.keyDownHandler);
3530
+ if (this.enableKeyboardHandling) {
3531
+ document.addEventListener("keydown", this.keyDownHandler);
3532
+ }
3534
3533
 
3535
3534
  // send this task to the end of queue to prevent conflicting
3536
3535
  // it conflicts if showBib gets call from a button that's not this.element.trigger
@@ -3786,8 +3785,9 @@ class AuroFloatingUI {
3786
3785
  this.element.bib.setAttribute("id", `${this.id}-floater-bib`);
3787
3786
  }
3788
3787
 
3789
- configure(elem, eventPrefix) {
3788
+ configure(elem, eventPrefix, enableKeyboardHandling = true) {
3790
3789
  AuroFloatingUI.setupMousePressChecker();
3790
+ this.enableKeyboardHandling = enableKeyboardHandling;
3791
3791
 
3792
3792
  this.eventPrefix = eventPrefix;
3793
3793
  if (this.element !== elem) {
@@ -3820,7 +3820,9 @@ class AuroFloatingUI {
3820
3820
 
3821
3821
  this.handleEvent = this.handleEvent.bind(this);
3822
3822
  if (this.element.trigger) {
3823
- this.element.trigger.addEventListener("keydown", this.handleEvent);
3823
+ if (this.enableKeyboardHandling) {
3824
+ this.element.trigger.addEventListener("keydown", this.handleEvent);
3825
+ }
3824
3826
  this.element.trigger.addEventListener("click", this.handleEvent);
3825
3827
  this.element.trigger.addEventListener("mouseenter", this.handleEvent);
3826
3828
  this.element.trigger.addEventListener("mouseleave", this.handleEvent);
@@ -4298,12 +4300,83 @@ let p$4 = class p{registerComponent(t,a){customElements.get(t)||customElements.d
4298
4300
 
4299
4301
  var iconVersion$3 = '9.1.2';
4300
4302
 
4303
+ /**
4304
+ * Computes display state once per keydown event.
4305
+ * Centralizes null-safety checks and makes the shared/modal/popover branching explicit.
4306
+ *
4307
+ * @param {HTMLElement} component - The component with a dropdown reference.
4308
+ * @param {Object} [options] - Optional config.
4309
+ * @param {HTMLElement} [options.dropdown] - Explicit dropdown reference. Falls back to component.dropdown.
4310
+ * @param {Function} [options.inputResolver] - Called with (component, ctx) to resolve the active input element.
4311
+ * @returns {{isExpanded: boolean, isModal: boolean, isPopover: boolean, activeInput: HTMLElement|null}}
4312
+ * isModal and isPopover reflect the display mode (fullscreen vs not) regardless of expanded state.
4313
+ */
4314
+ function createDisplayContext(component, options = {}) {
4315
+ const dd = options.dropdown || component.dropdown;
4316
+ // isPopoverVisible reflects as the `open` attribute.
4317
+ // It reports whether the bib is open in any mode (popover or modal).
4318
+ const isExpanded = Boolean(dd && dd.isPopoverVisible);
4319
+ const isFullscreen = Boolean(dd && dd.isBibFullscreen);
4320
+
4321
+ const ctx = {
4322
+ isExpanded,
4323
+ isModal: isFullscreen,
4324
+ isPopover: !isFullscreen,
4325
+ activeInput: null,
4326
+ };
4327
+
4328
+ if (options.inputResolver) {
4329
+ const resolvedInput = options.inputResolver(component, ctx);
4330
+ // Guard against resolvers returning undefined or non-HTMLElement values.
4331
+ ctx.activeInput = resolvedInput instanceof HTMLElement ? resolvedInput : null;
4332
+ }
4333
+
4334
+ return ctx;
4335
+ }
4336
+
4337
+ /**
4338
+ * Wires up a keydown listener that dispatches to strategy[evt.key] or strategy.default.
4339
+ * Handles both sync and async handlers.
4340
+ * @param {HTMLElement} component - The component to attach the listener to.
4341
+ * @param {Object} strategy - Map of key names to handler functions.
4342
+ * @param {Object} [options] - Optional config passed to createDisplayContext.
4343
+ */
4344
+ function applyKeyboardStrategy(component, strategy, options = {}) {
4345
+ component.addEventListener('keydown', async (evt) => {
4346
+ const handler = strategy[evt.key] || strategy.default;
4347
+ if (typeof handler === 'function') {
4348
+ const ctx = createDisplayContext(component, options);
4349
+ await handler(component, evt, ctx);
4350
+ }
4351
+ });
4352
+ }
4353
+
4301
4354
  var styleCss$2$1 = i$7`:host{position:fixed;z-index:var(--depth-tooltip, 400);display:none;isolation:isolate}:host dialog{width:auto;max-width:none;height:auto;max-height:none;padding:0;border:none;margin:0;outline:none;transform:translateZ(0)}:host dialog::backdrop{background:transparent}:host(:not([isfullscreen])) dialog{position:relative;inset:unset}:host(:not([isfullscreen])) .container.shape-box{border-radius:unset}:host(:not([isfullscreen])) .container[class*=shape-pill],:host(:not([isfullscreen])) .container[class*=shape-snowflake]{border-radius:30px}:host(:not([isfullscreen])) .container[class*=shape-rounded]{border-radius:16px}:host(:not([matchWidth])) .container{min-width:fit-content}:host([isfullscreen]){position:fixed;top:0;left:0}:host([isfullscreen]) .container{width:100dvw;max-width:none;height:100dvh;max-height:none;border-radius:unset;margin-top:0;box-shadow:unset;overscroll-behavior:contain}:host([isfullscreen]) .container::backdrop{background:var(--ds-color-background-primary, #fff)}:host(:popover-open){position:fixed;overflow:visible;padding:0;border:none;margin:0;background:transparent;inset:unset;outline:none}:host([data-show]){display:flex}:host([common]:not([isfullscreen])) .container,:host([rounded]:not([isfullscreen])) .container{border-radius:var(--ds-border-radius, 0.375rem)}:host([common][isfullscreen]) .container,:host([rounded][isfullscreen]) .container{border-radius:unset;box-shadow:unset}.container{display:inline-block;overflow:auto;box-sizing:border-box;border-radius:var(--ds-border-radius, 0.375rem);margin:var(--ds-size-50, 0.25rem) 0}.util_displayHiddenVisually{position:absolute;overflow:hidden;width:1px;height:1px;padding:0;border:0;margin:-1px;clip-path:inset(50%);white-space:nowrap}`;
4302
4355
 
4303
4356
  var colorCss$2$1 = i$7`.container{background-color:var(--ds-auro-dropdownbib-container-color);box-shadow:var(--ds-auro-dropdownbib-boxshadow-color);color:var(--ds-auro-dropdownbib-text-color)}`;
4304
4357
 
4305
4358
  var tokensCss$1$2 = i$7`:host(:not([ondark])),:host(:not([appearance=inverse])){--ds-auro-dropdown-label-text-color: var(--ds-basic-color-texticon-muted, #676767);--ds-auro-dropdown-trigger-background-color: var(--ds-basic-color-surface-default, #ffffff);--ds-auro-dropdown-trigger-hover-background-color: var(--ds-basic-color-surface-default, #ffffff);--ds-auro-dropdown-trigger-container-color: var(--ds-basic-color-surface-default, #ffffff);--ds-auro-dropdown-trigger-border-color: var(--ds-basic-color-border-bold, #585e67);--ds-auro-dropdown-trigger-outline-color: transparent;--ds-auro-dropdown-trigger-text-color: var(--ds-basic-color-texticon-default, #2a2a2a);--ds-auro-dropdownbib-boxshadow-color: var(--ds-elevation-200, 0px 0px 10px rgba(0, 0, 0, 0.15));--ds-auro-dropdownbib-background-color: var(--ds-basic-color-surface-default, #ffffff);--ds-auro-dropdownbib-container-color: var(--ds-basic-color-surface-default, #ffffff);--ds-auro-dropdownbib-text-color: var(--ds-basic-color-texticon-default, #2a2a2a)}:host([ondark]),:host([appearance=inverse]){--ds-auro-dropdown-label-text-color: var(--ds-basic-color-texticon-inverse-muted, #ccd2db);--ds-auro-dropdown-trigger-background-color: var(--ds-advanced-color-shared-background-inverse, rgba(255, 255, 255, 0.15));--ds-auro-dropdown-trigger-hover-background-color: var(--ds-advanced-color-shared-background-inverse, rgba(255, 255, 255, 0.15));--ds-auro-dropdown-trigger-container-color: var(--ds-advanced-color-shared-background-inverse, rgba(255, 255, 255, 0.15));--ds-auro-dropdown-trigger-border-color: var(--ds-basic-color-border-inverse, #ffffff);--ds-auro-dropdown-trigger-outline-color: transparent;--ds-auro-dropdown-trigger-text-color: var(--ds-basic-color-texticon-inverse, #ffffff);--ds-auro-dropdownbib-boxshadow-color: var(--ds-elevation-200, 0px 0px 10px rgba(0, 0, 0, 0.15));--ds-auro-dropdownbib-background-color: var(--ds-advanced-color-shared-background-inverse, rgba(255, 255, 255, 0.15));--ds-auro-dropdownbib-container-color: var(--ds-advanced-color-shared-background-inverse, rgba(255, 255, 255, 0.15));--ds-auro-dropdownbib-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}`;
4306
4359
 
4360
+ /**
4361
+ * Creates a keyboard strategy for dialog-specific key handling.
4362
+ * All other keydown behavior is left to the browser's native bubbling path.
4363
+ * @param {HTMLElement} bib - The dropdown bib element.
4364
+ * @returns {Object} Keyboard handlers keyed by `event.key`.
4365
+ */
4366
+ // eslint-disable-next-line no-unused-vars
4367
+ function createDropdownBibKeyboardStrategy(bib) {
4368
+ return {
4369
+ // eslint-disable-next-line no-unused-vars
4370
+ Enter(_dialog, event) {
4371
+ // Floating UI handles Enter key to open the dropdown
4372
+ },
4373
+ // eslint-disable-next-line no-unused-vars
4374
+ Escape(_dialog, event) {
4375
+ // Floating UI handles Escape key to close the dropdown
4376
+ }
4377
+ };
4378
+ }
4379
+
4307
4380
  // Copyright (c) 2020 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
4308
4381
  // See LICENSE in the project root for license information.
4309
4382
  /* eslint-disable max-lines */
@@ -4428,11 +4501,7 @@ class AuroDropdownBib extends i$4 {
4428
4501
  },
4429
4502
 
4430
4503
  /**
4431
- * Set by auro-dropdown when a menu option is highlighted via
4432
- * aria-activedescendant. The dialog keyboard bridge checks this
4433
- * flag so that Enter selects the highlighted option instead of
4434
- * activating the focused interactive element (e.g. the trigger
4435
- * button, or the bibtemplate close button in fullscreen).
4504
+ * Tracks whether a menu option is currently highlighted.
4436
4505
  * @private
4437
4506
  */
4438
4507
  hasActiveDescendant: {
@@ -4506,7 +4575,7 @@ class AuroDropdownBib extends i$4 {
4506
4575
 
4507
4576
  const dialog = this.shadowRoot.querySelector('dialog');
4508
4577
  this._setupCancelHandler(dialog);
4509
- this._setupKeyboardBridge(dialog);
4578
+ applyKeyboardStrategy(dialog, createDropdownBibKeyboardStrategy());
4510
4579
 
4511
4580
  this.dispatchEvent(new CustomEvent('auro-dropdownbib-connected', {
4512
4581
  bubbles: true,
@@ -4533,92 +4602,6 @@ class AuroDropdownBib extends i$4 {
4533
4602
  });
4534
4603
  }
4535
4604
 
4536
- /**
4537
- * showModal() creates a closed focus scope — keyboard events inside
4538
- * the dialog's shadow DOM do NOT bubble out to the combobox/select
4539
- * keydown handlers in the parent shadow DOM. This handler bridges
4540
- * that gap by re-dispatching navigation keys so they cross the
4541
- * shadow boundary and reach the menu navigation logic in the parent
4542
- * component.
4543
- *
4544
- * The trade-off: intercepting these keys means native keyboard
4545
- * behaviors that would normally "just work" must be manually
4546
- * re-implemented here:
4547
- *
4548
- * - Enter on buttons: Custom elements (auro-button) don't get the
4549
- * native Enter→click that <button> provides, so we call .click()
4550
- * directly when Enter is pressed on a button-like element.
4551
- *
4552
- * - Tab: Intercepted and re-dispatched so parent components
4553
- * (select/combobox) can select the active option and close the
4554
- * dialog. The <dialog> provides containment and isolation
4555
- * (inert background, VoiceOver focus trapping, top layer), while
4556
- * the content inside is a role="listbox" navigated via
4557
- * aria-activedescendant (options are not focusable). Tab keyboard
4558
- * behavior follows listbox conventions (select + close) because
4559
- * the dialog's native Tab trap only cycles between the close
4560
- * button and browser chrome.
4561
- *
4562
- * - Escape: The native <dialog> fires a `cancel` event on ESC
4563
- * (handled by _setupCancelHandler), so the re-dispatched Escape
4564
- * is a secondary path for parent components that also listen for
4565
- * Escape keydown.
4566
- *
4567
- * @param {HTMLDialogElement} dialog - The dialog element to attach the keyboard bridge to.
4568
- * @private
4569
- */
4570
- _setupKeyboardBridge(dialog) {
4571
- const navKeys = new Set([
4572
- 'ArrowUp',
4573
- 'ArrowDown',
4574
- 'Enter',
4575
- 'Escape',
4576
- 'Tab'
4577
- ]);
4578
-
4579
- dialog.addEventListener('keydown', (event) => {
4580
- if (!navKeys.has(event.key)) {
4581
- return;
4582
- }
4583
-
4584
- // Custom elements (auro-button) don't get the native Enter→click
4585
- // behavior that <button> has. Find the button in the composed path
4586
- // and click it directly — but only when no menu option is
4587
- // highlighted. In fullscreen mode focus stays on the close button
4588
- // while arrow keys move the active-descendant highlight through
4589
- // the listbox. If the user presses Enter with an option
4590
- // highlighted, the intent is to select that option, not to click
4591
- // the close button. In that case we fall through and bridge the
4592
- // Enter key to the parent component's keyboard strategy.
4593
- if (event.key === 'Enter') {
4594
- if (!this.hasActiveDescendant) {
4595
- const buttonSelector = 'button, [role="button"], auro-button, [auro-button]';
4596
- const btn = event.composedPath().find((el) => el.matches && el.matches(buttonSelector));
4597
- if (btn) {
4598
- event.preventDefault();
4599
- event.stopPropagation();
4600
- btn.click();
4601
- return;
4602
- }
4603
- }
4604
- }
4605
-
4606
- event.preventDefault();
4607
- event.stopPropagation();
4608
- const newEvent = new KeyboardEvent('keydown', {
4609
- key: event.key,
4610
- code: event.code,
4611
- shiftKey: event.shiftKey,
4612
- altKey: event.altKey,
4613
- ctrlKey: event.ctrlKey,
4614
- metaKey: event.metaKey,
4615
- bubbles: true,
4616
- composed: true,
4617
- cancelable: true
4618
- });
4619
- this.dispatchEvent(newEvent);
4620
- });
4621
- }
4622
4605
 
4623
4606
  /**
4624
4607
  * Blocks touch-driven page scroll while a fullscreen modal dialog is open.
@@ -4993,7 +4976,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$4 {
4993
4976
  }
4994
4977
  };
4995
4978
 
4996
- var formkitVersion$2 = '202603310527';
4979
+ var formkitVersion$2 = '202604031704';
4997
4980
 
4998
4981
  let AuroElement$2 = class AuroElement extends i$4 {
4999
4982
  static get properties() {
@@ -5174,7 +5157,7 @@ class AuroDropdown extends AuroElement$2 {
5174
5157
  this.appearance = 'default';
5175
5158
  this.chevron = false;
5176
5159
  this.disabled = false;
5177
- this.disableFocusTrap = false;
5160
+ this.disableKeyboardHandling = false;
5178
5161
  this.error = false;
5179
5162
  this.tabIndex = 0;
5180
5163
  this.noToggle = false;
@@ -5272,9 +5255,8 @@ class AuroDropdown extends AuroElement$2 {
5272
5255
  // showModal() fires asynchronously via Lit's update cycle, which
5273
5256
  // falls outside the user activation window and causes iOS to
5274
5257
  // dismiss the keyboard.
5275
- if (this.isBibFullscreen && this.bibElement && this.bibElement.value) {
5276
- const useModal = !this.disableFocusTrap;
5277
- this.bibElement.value.open(useModal);
5258
+ if (this.bibElement && this.bibElement.value) {
5259
+ this.bibElement.value.open(this.isBibFullscreen);
5278
5260
  }
5279
5261
  }
5280
5262
 
@@ -5388,9 +5370,9 @@ class AuroDropdown extends AuroElement$2 {
5388
5370
  },
5389
5371
 
5390
5372
  /**
5391
- * If declared, the focus trap inside of bib will be turned off.
5373
+ * If declared, the dropdown will not handle keyboard events and will require the consumer to manage this behavior.
5392
5374
  */
5393
- disableFocusTrap: {
5375
+ disableKeyboardHandling: {
5394
5376
  type: Boolean,
5395
5377
  reflect: true
5396
5378
  },
@@ -5668,7 +5650,7 @@ class AuroDropdown extends AuroElement$2 {
5668
5650
  if (this.isPopoverVisible) {
5669
5651
  // Fullscreen: use showModal() for native accessibility (inert outside, focus trap)
5670
5652
  // Desktop: use show() for Floating UI positioning + FocusTrap for focus management
5671
- const useModal = this.isBibFullscreen && !this.disableFocusTrap;
5653
+ const useModal = this.isBibFullscreen;
5672
5654
  this.bibElement.value.open(useModal);
5673
5655
  } else {
5674
5656
  this.bibElement.value.close();
@@ -5678,7 +5660,7 @@ class AuroDropdown extends AuroElement$2 {
5678
5660
  // When fullscreen strategy changes while open, re-open dialog with correct mode
5679
5661
  // (e.g. resizing from desktop → mobile while dropdown is open)
5680
5662
  if (changedProperties.has('isBibFullscreen') && this.isPopoverVisible && this.bibElement.value) {
5681
- const useModal = this.isBibFullscreen && !this.disableFocusTrap;
5663
+ const useModal = this.isBibFullscreen;
5682
5664
  this.bibElement.value.close();
5683
5665
  this.bibElement.value.open(useModal);
5684
5666
  }
@@ -5700,7 +5682,7 @@ class AuroDropdown extends AuroElement$2 {
5700
5682
 
5701
5683
  firstUpdated() {
5702
5684
  // Configure the floater to, this will generate the ID for the bib
5703
- this.floater.configure(this, 'auroDropdown');
5685
+ this.floater.configure(this, 'auroDropdown', !this.disableKeyboardHandling);
5704
5686
 
5705
5687
  // Prevent `contain: layout` on the dropdown host. Layout containment
5706
5688
  // creates a containing block for position:fixed descendants (the bib),
@@ -5790,7 +5772,7 @@ class AuroDropdown extends AuroElement$2 {
5790
5772
  * @private
5791
5773
  */
5792
5774
  updateFocusTrap() {
5793
- if (this.isPopoverVisible && !this.disableFocusTrap) {
5775
+ if (this.isPopoverVisible) {
5794
5776
  if (!this.isBibFullscreen) {
5795
5777
  // Desktop: show() doesn't trap focus, so use FocusTrap
5796
5778
  this.focusTrap = new FocusTrap(this.bibContent);
@@ -6008,6 +5990,7 @@ class AuroDropdown extends AuroElement$2 {
6008
5990
  aria-expanded="${o(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
6009
5991
  aria-controls="${o(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
6010
5992
  aria-labelledby="${o(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
5993
+ aria-disabled="${o(this.disabled ? 'true' : undefined)}"
6011
5994
  @focusin="${this.handleFocusin}"
6012
5995
  @blur="${this.handleFocusOut}">
6013
5996
  <div class="triggerContentWrapper" id="triggerLabel">
@@ -11734,6 +11717,12 @@ class BaseInput extends AuroElement$1 {
11734
11717
  this.wrapperElement = this.shadowRoot.querySelector('.wrapper');
11735
11718
  this.inputElement = this.renderRoot.querySelector('input');
11736
11719
  this.labelElement = this.shadowRoot.querySelector('label');
11720
+ this.clearBtn = this.clearButtonRef.value;
11721
+
11722
+ // This must get moved into inputKeyboardStrategy when implemented
11723
+ this.clearBtn.addEventListener('keydown', (evt) => {
11724
+ evt.stopPropagation();
11725
+ });
11737
11726
 
11738
11727
  this.patchInputEvent(this.inputElement);
11739
11728
 
@@ -12757,7 +12746,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$4 {
12757
12746
  }
12758
12747
  };
12759
12748
 
12760
- var formkitVersion$1 = '202603310527';
12749
+ var formkitVersion$1 = '202604031704';
12761
12750
 
12762
12751
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
12763
12752
  // See LICENSE in the project root for license information.
@@ -12814,6 +12803,11 @@ class AuroInput extends BaseInput {
12814
12803
  * @private
12815
12804
  */
12816
12805
  this.iconTag = versioning.generateTag('auro-formkit-input-icon', iconVersion$2, _$2);
12806
+
12807
+ /**
12808
+ * @private
12809
+ */
12810
+ this.clearButtonRef = e$1();
12817
12811
  }
12818
12812
 
12819
12813
  static get styles() {
@@ -12831,6 +12825,19 @@ class AuroInput extends BaseInput {
12831
12825
  ];
12832
12826
  }
12833
12827
 
12828
+ /**
12829
+ * Returns classmap configuration for the clear button visibility.
12830
+ * The button is hidden when the input has no value, is read-only, or is disabled.
12831
+ * @private
12832
+ * @returns {Record<string, boolean>} - Classmap object controlling clear button display state.
12833
+ */
12834
+ get clearBtnClassMap() {
12835
+ return {
12836
+ 'util_displayHidden': !this.hasValue || this.readyOnly || this.disabled
12837
+ };
12838
+ }
12839
+
12840
+
12834
12841
  /**
12835
12842
  * Determines if the HTML input element should be visually hidden.
12836
12843
  * Returns true when display value content exists without focus and has a value,
@@ -13150,10 +13157,11 @@ class AuroInput extends BaseInput {
13150
13157
  <${this.buttonTag}
13151
13158
  @click="${this.handleClickClear}"
13152
13159
  appearance="${this.onDark ? 'inverse' : this.appearance}"
13153
- class="notificationBtn clearBtn"
13160
+ class="notificationBtn clearBtn ${e$3(this.clearBtnClassMap)}"
13154
13161
  shape="circle"
13155
13162
  size="sm"
13156
- variant="ghost">
13163
+ variant="ghost"
13164
+ ${n$2(this.clearButtonRef)}>
13157
13165
  <span><slot name="ariaLabel.clear">Clear Input</slot></span>
13158
13166
  <${this.iconTag}
13159
13167
  aria-hidden="true"
@@ -13298,11 +13306,7 @@ class AuroInput extends BaseInput {
13298
13306
  <div part="accent-right" class="accents right">
13299
13307
  ${this.renderValidationErrorIconHtml()}
13300
13308
  ${this.hasValue && this.type === 'password' ? this.renderHtmlNotificationPassword() : undefined}
13301
- ${this.hasValue ? u$7`
13302
- ${!this.disabled && !this.readonly ? u$7`
13303
- ${this.renderHtmlActionClear()}
13304
- ` : undefined}
13305
- ` : undefined}
13309
+ ${this.renderHtmlActionClear()}
13306
13310
  </div>
13307
13311
  </div>
13308
13312
  <div class="helpTextWrapper leftIndent rightIndent" part="inputHelpText">
@@ -13334,11 +13338,7 @@ class AuroInput extends BaseInput {
13334
13338
  ${this.layout.includes('right') || this.layout === "emphasized" ? u$7`
13335
13339
  ${this.renderValidationErrorIconHtml()}
13336
13340
  ` : undefined}
13337
- ${this.hasValue ? u$7`
13338
- ${!this.disabled && !this.readonly ? u$7`
13339
- ${this.renderHtmlActionClear()}
13340
- ` : undefined}
13341
- ` : undefined}
13341
+ ${this.renderHtmlActionClear()}
13342
13342
  </div>
13343
13343
  </div>
13344
13344
  <div class="${e$3(this.helpTextClasses)}" part="inputHelpText">
@@ -13366,11 +13366,7 @@ class AuroInput extends BaseInput {
13366
13366
  </div>
13367
13367
  <div class="accents right">
13368
13368
  ${this.renderValidationErrorIconHtml()}
13369
- ${this.hasValue ? u$7`
13370
- ${!this.disabled && !this.readonly ? u$7`
13371
- ${this.renderHtmlActionClear()}
13372
- ` : undefined}
13373
- ` : undefined}
13369
+ ${this.renderHtmlActionClear()}
13374
13370
  </div>
13375
13371
  </div>
13376
13372
  <div class="helpTextWrapper leftIndent rightIndent" part="inputHelpText">
@@ -13796,7 +13792,7 @@ class AuroBibtemplate extends i$4 {
13796
13792
  }
13797
13793
  }
13798
13794
 
13799
- var formkitVersion = '202603310527';
13795
+ var formkitVersion = '202604031704';
13800
13796
 
13801
13797
  var styleCss$3 = i$7`.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock{display:block}.util_displayFlex{display:flex}.util_displayHidden{display:none}.util_displayHiddenVisually{position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}:host{display:block;text-align:left}:host [auro-dropdown]{--ds-auro-dropdown-trigger-background-color: transparent}:host #inputInBib::part(wrapper){box-shadow:none}:host #inputInBib::part(accent-left){display:none}:host([layout*=classic]) [auro-input]{width:100%}:host([layout*=classic]) [auro-input]::part(helpText){display:none}:host([layout*=classic]) #slotHolder{display:none}`;
13802
13798
 
@@ -14275,6 +14271,7 @@ class AuroCombobox extends AuroElement {
14275
14271
 
14276
14272
  /**
14277
14273
  * Array of available options to display in the dropdown.
14274
+ * This array contains all non-hidden options (e.g., hidden by filtering on input value).
14278
14275
  * @private
14279
14276
  */
14280
14277
  availableOptions: {
@@ -14652,12 +14649,40 @@ class AuroCombobox extends AuroElement {
14652
14649
  AuroLibraryRuntimeUtils$4.prototype.registerComponent(name, AuroCombobox);
14653
14650
  }
14654
14651
 
14652
+ /**
14653
+ * Mark the first available (non-hidden), enabled option as `active`.
14654
+ * @private
14655
+ * @returns {void}
14656
+ */
14657
+ activateFirstEnabledAvailableOption() {
14658
+ const firstEnabledOptionIndex = this.availableOptions.findIndex((opt) => !opt.disabled);
14659
+ this.updateActiveOption(firstEnabledOptionIndex);
14660
+ }
14661
+
14662
+ /**
14663
+ * Mark the last available (non-hidden), enabled option as `active`.
14664
+ * @private
14665
+ * @returns {void}
14666
+ */
14667
+ activateLastEnabledAvailableOption() {
14668
+ let lastEnabledOptionIndex = -1;
14669
+
14670
+ // Work backwards through the available options array to find the last enabled option
14671
+ for (let index = this.availableOptions.length - 1; index >= 0; index -= 1) {
14672
+ if (!this.availableOptions[index].disabled) {
14673
+ lastEnabledOptionIndex = index;
14674
+ break;
14675
+ }
14676
+ }
14677
+
14678
+ this.updateActiveOption(lastEnabledOptionIndex);
14679
+ }
14680
+
14655
14681
  /**
14656
14682
  * Updates the filter for the available options based on the input value.
14657
14683
  * @private
14658
14684
  */
14659
14685
  updateFilter() {
14660
-
14661
14686
  // Reset available options if noFilter is set to false after being true.
14662
14687
  if (this.noFilter) {
14663
14688
  this.availableOptions = [...this.options];
@@ -14776,6 +14801,10 @@ class AuroCombobox extends AuroElement {
14776
14801
  if (this.value && this.input.value && !this.menu.value) {
14777
14802
  this.syncValuesAndStates();
14778
14803
  }
14804
+
14805
+ if (!this.availableOptions.includes(this.menu.optionActive)) {
14806
+ this.activateFirstEnabledAvailableOption();
14807
+ }
14779
14808
  }
14780
14809
 
14781
14810
  /**
@@ -14849,9 +14878,6 @@ class AuroCombobox extends AuroElement {
14849
14878
  if (this.dropdownOpen) {
14850
14879
  const expandedDelay = 150;
14851
14880
  this._expandedTimeout = setTimeout(() => {
14852
- if (!this.value) {
14853
- this.updateActiveOption(0);
14854
- }
14855
14881
  this.triggerExpandedState = true;
14856
14882
  }, expandedDelay);
14857
14883
  } else {
@@ -14861,22 +14887,16 @@ class AuroCombobox extends AuroElement {
14861
14887
  // Clear aria-activedescendant when dropdown closes
14862
14888
  if (!this.dropdownOpen && this.input) {
14863
14889
  this.input.setActiveDescendant(null);
14864
- this.optionActive = null;
14865
-
14866
- // Remove the highlighted state from all menu options so re-opening
14867
- // the dropdown doesn't show a stale highlight.
14868
- if (this.options) {
14869
- this.options.forEach((opt) => {
14870
- opt.active = false;
14871
- opt.classList.remove('active');
14872
- });
14873
- }
14874
14890
 
14875
14891
  // Restore pointer events on the menu in case they were disabled
14876
14892
  // during fullscreen open to prevent touch pass-through.
14877
14893
  this.menu.style.pointerEvents = '';
14878
14894
 
14879
- restoreTriggerAfterClose(this.dropdown, this.input);
14895
+ // When closing a fullscreen bib, restore focus to the trigger so that
14896
+ // keyboard navigation continues from the correct place in the page
14897
+ if (this.dropdown.isBibFullscreen) {
14898
+ restoreTriggerAfterClose(this.dropdown, this.input);
14899
+ }
14880
14900
  }
14881
14901
 
14882
14902
  if (this.dropdownOpen) {
@@ -14911,13 +14931,6 @@ class AuroCombobox extends AuroElement {
14911
14931
  this.setInputFocus();
14912
14932
  this._inFullscreenTransition = false;
14913
14933
  });
14914
- } else {
14915
- // wait a frame in case the bib gets hidden immediately after showing because there is no value
14916
- setTimeout(() => {
14917
- if (this.componentHasFocus) {
14918
- this.setInputFocus();
14919
- }
14920
- }, 0);
14921
14934
  }
14922
14935
  }
14923
14936
  });
@@ -14967,7 +14980,25 @@ class AuroCombobox extends AuroElement {
14967
14980
  setClearBtnFocus() {
14968
14981
  const clearBtn = this.input.shadowRoot.querySelector('.clearBtn');
14969
14982
  if (clearBtn) {
14970
- clearBtn.focus();
14983
+ // Wait for the element to fully render across
14984
+ // multiple Lit update cycles before moving focus
14985
+ doubleRaf(() => {
14986
+ clearBtn.focus();
14987
+ });
14988
+ }
14989
+ }
14990
+
14991
+ /**
14992
+ * @private
14993
+ */
14994
+ setTriggerInputFocus() {
14995
+ const input = this.input.shadowRoot.querySelector('input');
14996
+ if (input) {
14997
+ // Wait for the element to fully render across
14998
+ // multiple Lit update cycles before moving focus
14999
+ doubleRaf(() => {
15000
+ input.focus();
15001
+ });
14971
15002
  }
14972
15003
  }
14973
15004
 
@@ -15290,7 +15321,7 @@ class AuroCombobox extends AuroElement {
15290
15321
  * @returns {void}
15291
15322
  */
15292
15323
  configureCombobox() {
15293
- applyKeyboardStrategy(this, comboboxKeyboardStrategy, {
15324
+ applyKeyboardStrategy$1(this, comboboxKeyboardStrategy, {
15294
15325
  // In modal mode the input moves into the bib; route keyboard events to that element instead.
15295
15326
  inputResolver: (comp, ctx) => (ctx.isModal && comp.inputInBib ? comp.inputInBib : comp.input),
15296
15327
  });
@@ -16299,7 +16330,7 @@ class AuroMenuOption extends AuroElement {
16299
16330
  });
16300
16331
 
16301
16332
  return u$7`
16302
- <div class="${classes}">
16333
+ <div class="${classes}" aria-disabled="${this.disabled ? 'true' : 'false'}">
16303
16334
  ${this.selected && !this.noCheckmark
16304
16335
  ? this.generateIconHtml(checkmarkIcon.svg)
16305
16336
  : undefined}
@@ -17070,10 +17101,10 @@ class AuroMenu extends AuroElement {
17070
17101
 
17071
17102
  // Event Bindings
17072
17103
 
17073
- /**
17074
- * @private
17075
- */
17076
- this.handleKeyDown = this.handleKeyDown.bind(this);
17104
+ // /**
17105
+ // * @private
17106
+ // */
17107
+ // this.handleKeyDown = this.handleKeyDown.bind(this);
17077
17108
 
17078
17109
 
17079
17110
  /**
@@ -17422,7 +17453,7 @@ class AuroMenu extends AuroElement {
17422
17453
 
17423
17454
  this.provideContext();
17424
17455
 
17425
- this.addEventListener('keydown', this.handleKeyDown);
17456
+ // this.addEventListener('keydown', this.handleKeyDown);
17426
17457
  this.addEventListener('auroMenuOption-click', this.handleMouseSelect);
17427
17458
  this.addEventListener('auroMenuOption-mouseover', this.handleOptionHover);
17428
17459
  this.addEventListener('slotchange', this.handleSlotChange);
@@ -17430,7 +17461,7 @@ class AuroMenu extends AuroElement {
17430
17461
  }
17431
17462
 
17432
17463
  disconnectedCallback() {
17433
- this.removeEventListener('keydown', this.handleKeyDown);
17464
+ // this.removeEventListener('keydown', this.handleKeyDown);
17434
17465
  this.removeEventListener('auroMenuOption-click', this.handleMouseSelect);
17435
17466
  this.removeEventListener('auroMenuOption-mouseover', this.handleOptionHover);
17436
17467
  this.removeEventListener('slotchange', this.handleSlotChange);
@@ -17571,26 +17602,33 @@ class AuroMenu extends AuroElement {
17571
17602
 
17572
17603
  // Event Handlers
17573
17604
 
17574
- /**
17575
- * Handles keyboard navigation.
17576
- * @private
17577
- * @param {KeyboardEvent} event - Event object from the browser.
17578
- */
17579
- handleKeyDown(event) {
17580
- event.preventDefault();
17581
- switch (event.key) {
17582
- case "ArrowDown":
17583
- this.menuService.highlightNext();
17584
- break;
17585
- case "ArrowUp":
17586
- this.menuService.highlightPrevious();
17587
- break;
17588
- case "Tab":
17589
- case "Enter":
17590
- this.menuService.selectHighlightedOption();
17591
- break;
17592
- }
17593
- }
17605
+ // /**
17606
+ // * Handles keyboard navigation.
17607
+ // * @private
17608
+ // * @param {KeyboardEvent} event - Event object from the browser.
17609
+ // */
17610
+ // handleKeyDown(event) {
17611
+ // // Update to Chris keyboard handler
17612
+ // // We have a new "navigateArrow" function in that handler, maybe that replaces those keys here?
17613
+ // event.preventDefault();
17614
+ // switch (event.key) {
17615
+ // case "ArrowDown":
17616
+ // console.warn("ArrowDown key is pressed and heard from menu");
17617
+ // this.menuService.highlightNext();
17618
+ // break;
17619
+ // case "ArrowUp":
17620
+ // console.warn("ArrowUp key is pressed and heard from menu");
17621
+ // this.menuService.highlightPrevious();
17622
+ // break;
17623
+ // case "Tab":
17624
+ // case "Enter":
17625
+ // this.menuService.selectHighlightedOption();
17626
+ // // Does this need to get separated into two cases to handle the different expected behavior of tab vs enter?
17627
+ // break;
17628
+ // default:
17629
+ // break;
17630
+ // }
17631
+ // }
17594
17632
 
17595
17633
  /**
17596
17634
  * Navigates the menu options in the specified direction.