@aurodesignsystem-dev/auro-formkit 0.0.0-pr1408.16 → 0.0.0-pr1408.18

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 (48) 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/dist/index.js +1 -1
  4. package/components/checkbox/dist/registered.js +1 -1
  5. package/components/combobox/demo/api.min.js +187 -141
  6. package/components/combobox/demo/index.min.js +187 -141
  7. package/components/combobox/demo/keyboardBehavior.md +9 -36
  8. package/components/combobox/dist/auro-combobox.d.ts +17 -0
  9. package/components/combobox/dist/comboboxKeyboardStrategy.d.ts +6 -3
  10. package/components/combobox/dist/index.js +187 -141
  11. package/components/combobox/dist/registered.js +187 -141
  12. package/components/counter/demo/api.min.js +2 -2
  13. package/components/counter/demo/index.min.js +2 -2
  14. package/components/counter/dist/index.js +2 -2
  15. package/components/counter/dist/registered.js +2 -2
  16. package/components/datepicker/demo/api.md +1 -1
  17. package/components/datepicker/demo/api.min.js +77 -157
  18. package/components/datepicker/demo/index.min.js +77 -157
  19. package/components/datepicker/demo/keyboardBehavior.md +1 -6
  20. package/components/datepicker/dist/auro-datepicker.d.ts +8 -7
  21. package/components/datepicker/dist/datepickerKeyboardStrategy.d.ts +1 -4
  22. package/components/datepicker/dist/index.js +77 -157
  23. package/components/datepicker/dist/registered.js +77 -157
  24. package/components/dropdown/demo/api.min.js +1 -1
  25. package/components/dropdown/demo/index.min.js +1 -1
  26. package/components/dropdown/dist/index.js +1 -1
  27. package/components/dropdown/dist/registered.js +1 -1
  28. package/components/form/demo/api.min.js +382 -390
  29. package/components/form/demo/index.min.js +382 -390
  30. package/components/input/demo/api.min.js +106 -77
  31. package/components/input/demo/index.min.js +106 -77
  32. package/components/input/dist/auro-input.d.ts +11 -0
  33. package/components/input/dist/base-input.d.ts +1 -0
  34. package/components/input/dist/index.js +36 -18
  35. package/components/input/dist/registered.js +36 -18
  36. package/components/menu/demo/keyboardBehavior.md +0 -0
  37. package/components/radio/demo/api.min.js +1 -1
  38. package/components/radio/demo/index.min.js +1 -1
  39. package/components/radio/demo/keyboardBehavior.md +0 -0
  40. package/components/radio/dist/index.js +1 -1
  41. package/components/radio/dist/registered.js +1 -1
  42. package/components/select/demo/api.min.js +13 -4
  43. package/components/select/demo/index.min.js +13 -4
  44. package/components/select/dist/index.js +13 -4
  45. package/components/select/dist/registered.js +13 -4
  46. package/custom-elements.json +1449 -1401
  47. package/package.json +3 -3
  48. /package/components/datepicker/demo/{keyboardBehavior.html → keyboard-behavior.html} +0 -0
@@ -1088,7 +1088,13 @@ function guardTouchPassthrough(element) {
1088
1088
  }
1089
1089
 
1090
1090
  /**
1091
- * Restores the dropdown trigger after a fullscreen dialog closes.
1091
+ * Restores the dropdown trigger after a fullscreen dialog closes
1092
+ * when focus doesn't leave the component (e.g. using Esc or Enter keys).
1093
+ * When leaving the component (e.g., tabbing out of the combobox after closing
1094
+ * the fullscreen dialog), focus restoration is handled by the browser's native
1095
+ * dialog focus restoration behavior, so this function only restores focus
1096
+ * when focus remains inside the component after the dialog closes.
1097
+
1092
1098
  *
1093
1099
  * Removes the `inert` attribute from the trigger so it is accessible again,
1094
1100
  * and restores focus to the given target after one animation frame. The rAF
@@ -1104,8 +1110,11 @@ function guardTouchPassthrough(element) {
1104
1110
  function restoreTriggerAfterClose(dropdown, focusTarget) {
1105
1111
  dropdown.trigger.inert = false;
1106
1112
 
1113
+ // Wait a frame so that dialog.close() has completed and the browser's
1114
+ // native focus restoration has run before we attempt to focus the
1115
+ // trigger / input programmatically.
1107
1116
  requestAnimationFrame(() => {
1108
- if (!dropdown.isPopoverVisible) {
1117
+ if (!dropdown.isPopoverVisible && dropdown.trigger.contains(document.activeElement)) {
1109
1118
  focusTarget.focus();
1110
1119
  }
1111
1120
  });
@@ -1206,102 +1215,33 @@ function isClearBtnFocused(ctx, clearBtn = getClearBtn(ctx)) {
1206
1215
  if (!clearBtn) {
1207
1216
  return false;
1208
1217
  }
1209
- return Boolean(clearBtn.shadowRoot && clearBtn.shadowRoot.activeElement !== null);
1218
+ const isFocused = Boolean(clearBtn.shadowRoot && clearBtn.shadowRoot.activeElement !== null);
1219
+ return isFocused;
1210
1220
  }
1211
1221
 
1212
1222
  const comboboxKeyboardStrategy = {
1213
- async Enter(component, evt, ctx) {
1214
- // If the clear button has focus, let the browser activate it normally.
1215
- // stopPropagation prevents parent containers (e.g., forms) from treating
1216
- // Enter as a submit, but we must NOT call preventDefault — that would
1217
- // block the browser's built-in "Enter activates focused button" behavior.
1223
+ ArrowDown(component, evt, ctx) {
1224
+ // If the clear button has focus, let the browser handle ArrowDown normally.
1218
1225
  if (isClearBtnFocused(ctx)) {
1219
- evt.stopPropagation();
1220
1226
  return;
1221
1227
  }
1222
1228
 
1223
- if (ctx.isExpanded && component.optionActive) {
1224
- component.menu.makeSelection();
1225
- await component.updateComplete;
1226
- evt.preventDefault();
1227
- evt.stopPropagation();
1228
- component.setClearBtnFocus();
1229
- } else {
1230
- // Prevent the keypress from bubbling to parent containers (e.g., forms)
1231
- // which could interpret Enter as a submit or trigger other unintended behavior.
1232
- // This is safe because showBib() opens the dialog programmatically,
1233
- // not via event propagation.
1234
- evt.preventDefault();
1235
- evt.stopPropagation();
1236
- component.showBib();
1237
- }
1238
- },
1239
-
1240
- Tab(component, evt, ctx) {
1241
- if (!ctx.isExpanded) {
1242
- return;
1243
- }
1244
-
1245
- // Shift+Tab moves the highlight to the first non-disabled option
1246
- // without making a selection or closing the bib.
1247
- if (evt.shiftKey) {
1229
+ // option display and navigation are prevented if there are no available options
1230
+ if (component.availableOptions.length > 0) {
1248
1231
  evt.preventDefault();
1249
- const firstActive = component.menu.menuService.menuOptions.find((option) => option.isActive);
1250
- if (firstActive) {
1251
- component.menu.updateActiveOption(firstActive);
1252
- }
1253
- return;
1254
- }
1255
1232
 
1256
- if (ctx.isModal) {
1257
- if (!ctx.activeInput) {
1258
- return;
1259
- }
1260
- const clearBtn = getClearBtn(ctx);
1261
- const clearBtnHasFocus = isClearBtnFocused(ctx, clearBtn);
1262
-
1263
- // Tab from input: if clear button exists and doesn't have focus, focus it
1264
- if (clearBtn && !clearBtnHasFocus && ctx.activeInput.value) {
1265
- // Force clear button container visible to work around Safari not
1266
- // propagating :focus-within through shadow DOM boundaries, which
1267
- // causes .wrapper:not(:focus-within) to hide .notification.clear.
1268
- const clearContainer = clearBtn.closest('.clear');
1269
- if (clearContainer) {
1270
- clearContainer.style.display = 'flex';
1271
- clearBtn.addEventListener('focusout', () => {
1272
- // Delay cleanup so :focus-within settles when focus moves
1273
- // to a sibling (e.g., Shift+Tab back to the input).
1274
- requestAnimationFrame(() => {
1275
- clearContainer.style.display = '';
1276
- });
1277
- }, { once: true });
1278
- }
1233
+ // navigate if bib is open otherwise open it
1234
+ if (component.dropdown.isPopoverVisible) {
1279
1235
 
1280
- // Focus the native button inside auro-button so the browser
1281
- // treats it as a real focusable element inside the dialog.
1282
- const nativeBtn = clearBtn.shadowRoot && clearBtn.shadowRoot.querySelector('button');
1283
- if (nativeBtn) {
1284
- nativeBtn.focus();
1236
+ if (evt.altKey || evt.metaKey) {
1237
+ component.activateLastEnabledAvailableOption();
1285
1238
  } else {
1286
- clearBtn.focus();
1239
+ navigateArrow(component, 'down');
1287
1240
  }
1288
- return;
1289
- }
1290
-
1291
- // Tab from clear button (or no clear button / no value) →
1292
- // select the highlighted option if any, then close
1293
- if (component.optionActive) {
1294
- component.menu.makeSelection();
1241
+ } else {
1242
+ component.showBib();
1295
1243
  }
1296
- component.hideBib();
1297
- return;
1298
- }
1299
-
1300
- // Non-fullscreen: select + close
1301
- if (component.menu.optionActive && component.menu.optionActive.value) {
1302
- component.menu.value = component.menu.optionActive.value;
1303
1244
  }
1304
- component.hideBib();
1305
1245
  },
1306
1246
 
1307
1247
  ArrowUp(component, evt, ctx) {
@@ -1310,31 +1250,85 @@ const comboboxKeyboardStrategy = {
1310
1250
  return;
1311
1251
  }
1312
1252
 
1253
+ // option display and navigation are prevented if there are no available options
1313
1254
  if (component.availableOptions.length > 0) {
1314
- component.showBib();
1255
+ evt.preventDefault();
1256
+
1257
+ // navigate if bib is open otherwise open it
1258
+ if (component.dropdown.isPopoverVisible) {
1259
+ if (evt.altKey || evt.metaKey) {
1260
+ component.activateFirstEnabledAvailableOption();
1261
+ } else {
1262
+ navigateArrow(component, 'up');
1263
+ }
1264
+ } else {
1265
+ component.showBib();
1266
+ }
1315
1267
  }
1316
- // Read live visibility — ctx.isExpanded was computed before showBib() above,
1317
- // so it wouldn't reflect the state change.
1318
- if (component.dropdown.isPopoverVisible) {
1268
+ },
1269
+
1270
+ End(component, evt, ctx) {
1271
+ if (ctx.isExpanded) {
1319
1272
  evt.preventDefault();
1320
- navigateArrow(component, 'up');
1273
+ evt.stopPropagation();
1274
+ component.activateLastEnabledAvailableOption();
1321
1275
  }
1322
1276
  },
1323
1277
 
1324
- ArrowDown(component, evt, ctx) {
1325
- // If the clear button has focus, let the browser handle ArrowDown normally.
1278
+ Enter(component, evt, ctx) {
1326
1279
  if (isClearBtnFocused(ctx)) {
1327
- return;
1328
- }
1280
+ // If the clear button has focus, let the browser activate it normally.
1281
+ // stopPropagation prevents parent containers (e.g., forms) from treating
1282
+ // Enter as a submit, but we must NOT call preventDefault — that would
1283
+ // block the browser's built-in "Enter activates focused button" behavior.
1284
+ evt.stopPropagation();
1285
+ } else if (ctx.isExpanded && component.menu.optionActive) {
1286
+ component.menu.makeSelection();
1329
1287
 
1330
- if (component.availableOptions.length > 0) {
1288
+ if (ctx.isModal) {
1289
+ component.setTriggerInputFocus();
1290
+ }
1291
+
1292
+ evt.preventDefault();
1293
+ evt.stopPropagation();
1294
+ } else {
1295
+ // Prevent the keypress from bubbling to parent containers (e.g., forms)
1296
+ // which could interpret Enter as a submit or trigger other unintended behavior.
1297
+ // This is safe because showBib() opens the dialog programmatically,
1298
+ // not via event propagation.
1299
+ evt.preventDefault();
1300
+ evt.stopPropagation();
1331
1301
  component.showBib();
1332
1302
  }
1333
- // Read live visibility — ctx.isExpanded was computed before showBib() above,
1334
- // so it wouldn't reflect the state change.
1335
- if (component.dropdown.isPopoverVisible) {
1303
+ },
1304
+
1305
+ Escape(component, _evt, ctx) {
1306
+ if (ctx.isExpanded && ctx.isModal) {
1307
+ component.setTriggerInputFocus();
1308
+ }
1309
+ },
1310
+
1311
+ Home(component, evt, ctx) {
1312
+ if (ctx.isExpanded) {
1336
1313
  evt.preventDefault();
1337
- navigateArrow(component, 'down');
1314
+ evt.stopPropagation();
1315
+ component.activateFirstEnabledAvailableOption();
1316
+ }
1317
+ },
1318
+
1319
+ Tab(component, evt, ctx) {
1320
+ if (ctx.isExpanded && !isClearBtnFocused(ctx)) {
1321
+ // ClearBtn will not bubble up tab key events when it's focused, so need to manage it here when focused
1322
+ component.menu.makeSelection();
1323
+ component.hideBib();
1324
+
1325
+ // In fullscreen modal mode, closing the dialog does not
1326
+ // automatically restores focus to the input. In the tab case,
1327
+ // Explicitly move focus to the trigger's clear button so the
1328
+ // user can continues tabbing through the page normally.
1329
+ if (ctx.isModal && !evt.shiftKey) {
1330
+ component.setClearBtnFocus();
1331
+ }
1338
1332
  }
1339
1333
  },
1340
1334
  };
@@ -4916,7 +4910,7 @@ let AuroHelpText$2 = class AuroHelpText extends LitElement {
4916
4910
  }
4917
4911
  };
4918
4912
 
4919
- var formkitVersion$2 = '202604022013';
4913
+ var formkitVersion$2 = '202604032311';
4920
4914
 
4921
4915
  let AuroElement$2 = class AuroElement extends LitElement {
4922
4916
  static get properties() {
@@ -11650,6 +11644,16 @@ class BaseInput extends AuroElement$1 {
11650
11644
  this.wrapperElement = this.shadowRoot.querySelector('.wrapper');
11651
11645
  this.inputElement = this.renderRoot.querySelector('input');
11652
11646
  this.labelElement = this.shadowRoot.querySelector('label');
11647
+ this.clearBtn = this.clearButtonRef.value;
11648
+
11649
+ // This must get moved into inputKeyboardStrategy when implemented
11650
+ this.clearBtn.addEventListener('keydown', (evt) => {
11651
+ evt.stopPropagation();
11652
+ });
11653
+
11654
+ this.clearBtn.addEventListener('click', (evt) => {
11655
+ evt.stopPropagation();
11656
+ });
11653
11657
 
11654
11658
  this.patchInputEvent(this.inputElement);
11655
11659
 
@@ -12673,7 +12677,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
12673
12677
  }
12674
12678
  };
12675
12679
 
12676
- var formkitVersion$1 = '202604022013';
12680
+ var formkitVersion$1 = '202604032311';
12677
12681
 
12678
12682
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
12679
12683
  // See LICENSE in the project root for license information.
@@ -12730,6 +12734,11 @@ class AuroInput extends BaseInput {
12730
12734
  * @private
12731
12735
  */
12732
12736
  this.iconTag = versioning.generateTag('auro-formkit-input-icon', iconVersion$1, _$1);
12737
+
12738
+ /**
12739
+ * @private
12740
+ */
12741
+ this.clearButtonRef = createRef();
12733
12742
  }
12734
12743
 
12735
12744
  static get styles() {
@@ -12747,6 +12756,19 @@ class AuroInput extends BaseInput {
12747
12756
  ];
12748
12757
  }
12749
12758
 
12759
+ /**
12760
+ * Returns classmap configuration for the clear button visibility.
12761
+ * The button is hidden when the input has no value, is read-only, or is disabled.
12762
+ * @private
12763
+ * @returns {Record<string, boolean>} - Classmap object controlling clear button display state.
12764
+ */
12765
+ get clearBtnClassMap() {
12766
+ return {
12767
+ 'util_displayHidden': !this.hasValue || this.readyOnly || this.disabled
12768
+ };
12769
+ }
12770
+
12771
+
12750
12772
  /**
12751
12773
  * Determines if the HTML input element should be visually hidden.
12752
12774
  * Returns true when display value content exists without focus and has a value,
@@ -13066,10 +13088,11 @@ class AuroInput extends BaseInput {
13066
13088
  <${this.buttonTag}
13067
13089
  @click="${this.handleClickClear}"
13068
13090
  appearance="${this.onDark ? 'inverse' : this.appearance}"
13069
- class="notificationBtn clearBtn"
13091
+ class="notificationBtn clearBtn ${classMap(this.clearBtnClassMap)}"
13070
13092
  shape="circle"
13071
13093
  size="sm"
13072
- variant="ghost">
13094
+ variant="ghost"
13095
+ ${ref(this.clearButtonRef)}>
13073
13096
  <span><slot name="ariaLabel.clear">Clear Input</slot></span>
13074
13097
  <${this.iconTag}
13075
13098
  aria-hidden="true"
@@ -13214,11 +13237,7 @@ class AuroInput extends BaseInput {
13214
13237
  <div part="accent-right" class="accents right">
13215
13238
  ${this.renderValidationErrorIconHtml()}
13216
13239
  ${this.hasValue && this.type === 'password' ? this.renderHtmlNotificationPassword() : undefined}
13217
- ${this.hasValue ? html`
13218
- ${!this.disabled && !this.readonly ? html`
13219
- ${this.renderHtmlActionClear()}
13220
- ` : undefined}
13221
- ` : undefined}
13240
+ ${this.renderHtmlActionClear()}
13222
13241
  </div>
13223
13242
  </div>
13224
13243
  <div class="helpTextWrapper leftIndent rightIndent" part="inputHelpText">
@@ -13250,11 +13269,7 @@ class AuroInput extends BaseInput {
13250
13269
  ${this.layout.includes('right') || this.layout === "emphasized" ? html`
13251
13270
  ${this.renderValidationErrorIconHtml()}
13252
13271
  ` : undefined}
13253
- ${this.hasValue ? html`
13254
- ${!this.disabled && !this.readonly ? html`
13255
- ${this.renderHtmlActionClear()}
13256
- ` : undefined}
13257
- ` : undefined}
13272
+ ${this.renderHtmlActionClear()}
13258
13273
  </div>
13259
13274
  </div>
13260
13275
  <div class="${classMap(this.helpTextClasses)}" part="inputHelpText">
@@ -13282,11 +13297,7 @@ class AuroInput extends BaseInput {
13282
13297
  </div>
13283
13298
  <div class="accents right">
13284
13299
  ${this.renderValidationErrorIconHtml()}
13285
- ${this.hasValue ? html`
13286
- ${!this.disabled && !this.readonly ? html`
13287
- ${this.renderHtmlActionClear()}
13288
- ` : undefined}
13289
- ` : undefined}
13300
+ ${this.renderHtmlActionClear()}
13290
13301
  </div>
13291
13302
  </div>
13292
13303
  <div class="helpTextWrapper leftIndent rightIndent" part="inputHelpText">
@@ -13712,7 +13723,7 @@ class AuroBibtemplate extends LitElement {
13712
13723
  }
13713
13724
  }
13714
13725
 
13715
- var formkitVersion = '202604022013';
13726
+ var formkitVersion = '202604032311';
13716
13727
 
13717
13728
  var styleCss$1 = css`.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}`;
13718
13729
 
@@ -14191,6 +14202,7 @@ class AuroCombobox extends AuroElement {
14191
14202
 
14192
14203
  /**
14193
14204
  * Array of available options to display in the dropdown.
14205
+ * This array contains all non-hidden options (e.g., hidden by filtering on input value).
14194
14206
  * @private
14195
14207
  */
14196
14208
  availableOptions: {
@@ -14568,12 +14580,40 @@ class AuroCombobox extends AuroElement {
14568
14580
  AuroLibraryRuntimeUtils$4.prototype.registerComponent(name, AuroCombobox);
14569
14581
  }
14570
14582
 
14583
+ /**
14584
+ * Mark the first available (non-hidden), enabled option as `active`.
14585
+ * @private
14586
+ * @returns {void}
14587
+ */
14588
+ activateFirstEnabledAvailableOption() {
14589
+ const firstEnabledOptionIndex = this.availableOptions.findIndex((opt) => !opt.disabled);
14590
+ this.updateActiveOption(firstEnabledOptionIndex);
14591
+ }
14592
+
14593
+ /**
14594
+ * Mark the last available (non-hidden), enabled option as `active`.
14595
+ * @private
14596
+ * @returns {void}
14597
+ */
14598
+ activateLastEnabledAvailableOption() {
14599
+ let lastEnabledOptionIndex = -1;
14600
+
14601
+ // Work backwards through the available options array to find the last enabled option
14602
+ for (let index = this.availableOptions.length - 1; index >= 0; index -= 1) {
14603
+ if (!this.availableOptions[index].disabled) {
14604
+ lastEnabledOptionIndex = index;
14605
+ break;
14606
+ }
14607
+ }
14608
+
14609
+ this.updateActiveOption(lastEnabledOptionIndex);
14610
+ }
14611
+
14571
14612
  /**
14572
14613
  * Updates the filter for the available options based on the input value.
14573
14614
  * @private
14574
14615
  */
14575
14616
  updateFilter() {
14576
-
14577
14617
  // Reset available options if noFilter is set to false after being true.
14578
14618
  if (this.noFilter) {
14579
14619
  this.availableOptions = [...this.options];
@@ -14692,6 +14732,10 @@ class AuroCombobox extends AuroElement {
14692
14732
  if (this.value && this.input.value && !this.menu.value) {
14693
14733
  this.syncValuesAndStates();
14694
14734
  }
14735
+
14736
+ if (!this.availableOptions.includes(this.menu.optionActive)) {
14737
+ this.activateFirstEnabledAvailableOption();
14738
+ }
14695
14739
  }
14696
14740
 
14697
14741
  /**
@@ -14765,9 +14809,6 @@ class AuroCombobox extends AuroElement {
14765
14809
  if (this.dropdownOpen) {
14766
14810
  const expandedDelay = 150;
14767
14811
  this._expandedTimeout = setTimeout(() => {
14768
- if (!this.value) {
14769
- this.updateActiveOption(0);
14770
- }
14771
14812
  this.triggerExpandedState = true;
14772
14813
  }, expandedDelay);
14773
14814
  } else {
@@ -14777,22 +14818,16 @@ class AuroCombobox extends AuroElement {
14777
14818
  // Clear aria-activedescendant when dropdown closes
14778
14819
  if (!this.dropdownOpen && this.input) {
14779
14820
  this.input.setActiveDescendant(null);
14780
- this.optionActive = null;
14781
-
14782
- // Remove the highlighted state from all menu options so re-opening
14783
- // the dropdown doesn't show a stale highlight.
14784
- if (this.options) {
14785
- this.options.forEach((opt) => {
14786
- opt.active = false;
14787
- opt.classList.remove('active');
14788
- });
14789
- }
14790
14821
 
14791
14822
  // Restore pointer events on the menu in case they were disabled
14792
14823
  // during fullscreen open to prevent touch pass-through.
14793
14824
  this.menu.style.pointerEvents = '';
14794
14825
 
14795
- restoreTriggerAfterClose(this.dropdown, this.input);
14826
+ // When closing a fullscreen bib, restore focus to the trigger so that
14827
+ // keyboard navigation continues from the correct place in the page
14828
+ if (this.dropdown.isBibFullscreen) {
14829
+ restoreTriggerAfterClose(this.dropdown, this.input);
14830
+ }
14796
14831
  }
14797
14832
 
14798
14833
  if (this.dropdownOpen) {
@@ -14827,13 +14862,6 @@ class AuroCombobox extends AuroElement {
14827
14862
  this.setInputFocus();
14828
14863
  this._inFullscreenTransition = false;
14829
14864
  });
14830
- } else {
14831
- // wait a frame in case the bib gets hidden immediately after showing because there is no value
14832
- setTimeout(() => {
14833
- if (this.componentHasFocus) {
14834
- this.setInputFocus();
14835
- }
14836
- }, 0);
14837
14865
  }
14838
14866
  }
14839
14867
  });
@@ -14883,7 +14911,25 @@ class AuroCombobox extends AuroElement {
14883
14911
  setClearBtnFocus() {
14884
14912
  const clearBtn = this.input.shadowRoot.querySelector('.clearBtn');
14885
14913
  if (clearBtn) {
14886
- clearBtn.focus();
14914
+ // Wait for the element to fully render across
14915
+ // multiple Lit update cycles before moving focus
14916
+ doubleRaf(() => {
14917
+ clearBtn.focus();
14918
+ });
14919
+ }
14920
+ }
14921
+
14922
+ /**
14923
+ * @private
14924
+ */
14925
+ setTriggerInputFocus() {
14926
+ const input = this.input.shadowRoot.querySelector('input');
14927
+ if (input) {
14928
+ // Wait for the element to fully render across
14929
+ // multiple Lit update cycles before moving focus
14930
+ doubleRaf(() => {
14931
+ input.focus();
14932
+ });
14887
14933
  }
14888
14934
  }
14889
14935
 
@@ -1521,7 +1521,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
1521
1521
  }
1522
1522
  };
1523
1523
 
1524
- var formkitVersion$1 = '202604022013';
1524
+ var formkitVersion$1 = '202604032311';
1525
1525
 
1526
1526
  // Copyright (c) 2026 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
1527
1527
  // See LICENSE in the project root for license information.
@@ -5580,7 +5580,7 @@ class AuroHelpText extends i$2 {
5580
5580
  }
5581
5581
  }
5582
5582
 
5583
- var formkitVersion = '202604022013';
5583
+ var formkitVersion = '202604032311';
5584
5584
 
5585
5585
  let AuroElement$1 = class AuroElement extends i$2 {
5586
5586
  static get properties() {
@@ -1521,7 +1521,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
1521
1521
  }
1522
1522
  };
1523
1523
 
1524
- var formkitVersion$1 = '202604022013';
1524
+ var formkitVersion$1 = '202604032311';
1525
1525
 
1526
1526
  // Copyright (c) 2026 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
1527
1527
  // See LICENSE in the project root for license information.
@@ -5580,7 +5580,7 @@ class AuroHelpText extends i$2 {
5580
5580
  }
5581
5581
  }
5582
5582
 
5583
- var formkitVersion = '202604022013';
5583
+ var formkitVersion = '202604032311';
5584
5584
 
5585
5585
  let AuroElement$1 = class AuroElement extends i$2 {
5586
5586
  static get properties() {
@@ -1471,7 +1471,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
1471
1471
  }
1472
1472
  };
1473
1473
 
1474
- var formkitVersion$1 = '202604022013';
1474
+ var formkitVersion$1 = '202604032311';
1475
1475
 
1476
1476
  // Copyright (c) 2026 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
1477
1477
  // See LICENSE in the project root for license information.
@@ -5512,7 +5512,7 @@ class AuroHelpText extends LitElement {
5512
5512
  }
5513
5513
  }
5514
5514
 
5515
- var formkitVersion = '202604022013';
5515
+ var formkitVersion = '202604032311';
5516
5516
 
5517
5517
  let AuroElement$1 = class AuroElement extends LitElement {
5518
5518
  static get properties() {
@@ -1471,7 +1471,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
1471
1471
  }
1472
1472
  };
1473
1473
 
1474
- var formkitVersion$1 = '202604022013';
1474
+ var formkitVersion$1 = '202604032311';
1475
1475
 
1476
1476
  // Copyright (c) 2026 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
1477
1477
  // See LICENSE in the project root for license information.
@@ -5512,7 +5512,7 @@ class AuroHelpText extends LitElement {
5512
5512
  }
5513
5513
  }
5514
5514
 
5515
- var formkitVersion = '202604022013';
5515
+ var formkitVersion = '202604032311';
5516
5516
 
5517
5517
  let AuroElement$1 = class AuroElement extends LitElement {
5518
5518
  static get properties() {
@@ -32,7 +32,7 @@ The `auro-datepicker` component provides users with a way to select a date or da
32
32
  | [offset](#offset) | `offset` | | `number` | "0" | Gap between the trigger element and bib. |
33
33
  | [onDark](#onDark) | `onDark` | | `boolean` | false | DEPRECATED - use `appearance="inverse"` instead. |
34
34
  | [placeholder](#placeholder) | `placeholder` | | `string` | | Placeholder text to display in the input(s) when no value is set. |
35
- | [placeholderEndDate](#placeholderEndDate) | `placeholderEndDate` | | `string` | | Optional placeholder text to display in the second input when using date range.<br />By default, datepicker will use `placeholder` for both inputs if placeholder is<br />specified, but placeholderendDate is not. |
35
+ | [placeholderEndDate](#placeholderEndDate) | `placeholderEndDate` | | `string` | | Optional placeholder text to display in the second input when using date range.<br />By default, datepicker will use `placeholder` for both inputs if placeholder is<br />specified, but placeholderEndDate is not. |
36
36
  | [placement](#placement) | `placement` | | `'top' \| 'right' \| 'bottom' \| 'left' \| 'bottom-start' \| 'top-start' \| 'top-end' \| 'right-start' \| 'right-end' \| 'bottom-end' \| 'left-start' \| 'left-end'` | "'bottom-start'" | Position where the bib should appear relative to the trigger. |
37
37
  | [range](#range) | `range` | | `boolean` | false | If set, turns on date range functionality in auro-calendar. |
38
38
  | [referenceDates](#referenceDates) | `referenceDates` | | `array` | | Dates that the user should have for reference as part of their decision making when selecting a date.<br />This should be a JSON string array of dates in the format of `MM-DD-YYYY`. |