@aurodesignsystem-dev/auro-formkit 0.0.0-pr1554.2 → 0.0.0-pr1554.20

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 (45) hide show
  1. package/components/checkbox/demo/customize.min.js +1 -1
  2. package/components/checkbox/demo/getting-started.min.js +1 -1
  3. package/components/checkbox/demo/index.min.js +1 -1
  4. package/components/checkbox/dist/index.js +1 -1
  5. package/components/checkbox/dist/registered.js +1 -1
  6. package/components/combobox/demo/customize.min.js +54 -13
  7. package/components/combobox/demo/getting-started.min.js +54 -13
  8. package/components/combobox/demo/index.min.js +54 -13
  9. package/components/combobox/dist/index.js +54 -13
  10. package/components/combobox/dist/registered.js +54 -13
  11. package/components/counter/demo/customize.min.js +31 -9
  12. package/components/counter/demo/index.min.js +31 -9
  13. package/components/counter/dist/index.js +31 -9
  14. package/components/counter/dist/registered.js +31 -9
  15. package/components/datepicker/demo/customize.min.js +50 -11
  16. package/components/datepicker/demo/index.min.js +50 -11
  17. package/components/datepicker/dist/index.js +50 -11
  18. package/components/datepicker/dist/registered.js +50 -11
  19. package/components/dropdown/demo/customize.min.js +30 -8
  20. package/components/dropdown/demo/getting-started.min.js +30 -8
  21. package/components/dropdown/demo/index.min.js +30 -8
  22. package/components/dropdown/dist/auro-dropdown.d.ts +8 -0
  23. package/components/dropdown/dist/index.js +30 -8
  24. package/components/dropdown/dist/registered.js +30 -8
  25. package/components/form/demo/customize.min.js +187 -46
  26. package/components/form/demo/getting-started.min.js +187 -46
  27. package/components/form/demo/index.min.js +187 -46
  28. package/components/form/demo/registerDemoDeps.min.js +187 -46
  29. package/components/input/demo/customize.min.js +19 -2
  30. package/components/input/demo/getting-started.min.js +19 -2
  31. package/components/input/demo/index.min.js +19 -2
  32. package/components/input/dist/index.js +19 -2
  33. package/components/input/dist/registered.js +19 -2
  34. package/components/radio/demo/customize.min.js +1 -1
  35. package/components/radio/demo/getting-started.min.js +1 -1
  36. package/components/radio/demo/index.min.js +1 -1
  37. package/components/radio/dist/index.js +1 -1
  38. package/components/radio/dist/registered.js +1 -1
  39. package/components/select/demo/customize.min.js +31 -9
  40. package/components/select/demo/getting-started.min.js +31 -9
  41. package/components/select/demo/index.min.js +31 -9
  42. package/components/select/dist/index.js +31 -9
  43. package/components/select/dist/registered.js +31 -9
  44. package/custom-elements.json +10 -0
  45. package/package.json +1 -1
@@ -1275,7 +1275,7 @@ class AuroHelpText extends i$2 {
1275
1275
  }
1276
1276
  }
1277
1277
 
1278
- var formkitVersion = '202607160501';
1278
+ var formkitVersion = '202607160830';
1279
1279
 
1280
1280
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1281
1281
  // See LICENSE in the project root for license information.
@@ -1275,7 +1275,7 @@ class AuroHelpText extends i$2 {
1275
1275
  }
1276
1276
  }
1277
1277
 
1278
- var formkitVersion = '202607160501';
1278
+ var formkitVersion = '202607160830';
1279
1279
 
1280
1280
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1281
1281
  // See LICENSE in the project root for license information.
@@ -1275,7 +1275,7 @@ class AuroHelpText extends i$2 {
1275
1275
  }
1276
1276
  }
1277
1277
 
1278
- var formkitVersion = '202607160501';
1278
+ var formkitVersion = '202607160830';
1279
1279
 
1280
1280
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1281
1281
  // See LICENSE in the project root for license information.
@@ -1228,7 +1228,7 @@ class AuroHelpText extends LitElement {
1228
1228
  }
1229
1229
  }
1230
1230
 
1231
- var formkitVersion = '202607160501';
1231
+ var formkitVersion = '202607160830';
1232
1232
 
1233
1233
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1234
1234
  // See LICENSE in the project root for license information.
@@ -1228,7 +1228,7 @@ class AuroHelpText extends LitElement {
1228
1228
  }
1229
1229
  }
1230
1230
 
1231
- var formkitVersion = '202607160501';
1231
+ var formkitVersion = '202607160830';
1232
1232
 
1233
1233
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1234
1234
  // See LICENSE in the project root for license information.
@@ -4971,7 +4971,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$3 {
4971
4971
  }
4972
4972
  };
4973
4973
 
4974
- var formkitVersion$2 = '202607160501';
4974
+ var formkitVersion$2 = '202607160830';
4975
4975
 
4976
4976
  let AuroElement$2 = class AuroElement extends i$3 {
4977
4977
  static get properties() {
@@ -5111,6 +5111,15 @@ class AuroDropdown extends AuroElement$2 {
5111
5111
  this.matchWidth = false;
5112
5112
  this.noHideOnThisFocusLoss = false;
5113
5113
 
5114
+ /**
5115
+ * When true, the dropdown skips its generic focus restoration on close.
5116
+ * Intended for internal consumer coordination (e.g. auro-combobox), not as a
5117
+ * declarative attribute.
5118
+ * Separate from noHideOnThisFocusLoss (which controls auto-close behavior).
5119
+ * @private
5120
+ */
5121
+ this.noFocusRestoreOnClose = false;
5122
+
5114
5123
  this.errorMessage = undefined; // TODO - check with Doug if there is still more to do here
5115
5124
 
5116
5125
  // Layout Config
@@ -5285,10 +5294,23 @@ class AuroDropdown extends AuroElement$2 {
5285
5294
  const slot = this.trigger.querySelector('slot[name="trigger"]');
5286
5295
  if (slot) {
5287
5296
  const assigned = slot.assignedElements();
5288
- const focusable = assigned.find((el) => !el.hasAttribute('disabled'));
5289
- if (focusable) {
5290
- focusable.focus();
5291
- return;
5297
+ for (const el of assigned) {
5298
+ if (el.hasAttribute('disabled')) {
5299
+ continue;
5300
+ }
5301
+ // Try finding a focusable descendant first (handles non-focusable
5302
+ // wrappers like <div> containing a <button>). If none found, try
5303
+ // focusing the element directly (works for custom elements like
5304
+ // auro-input that have delegatesFocus or a custom focus() method).
5305
+ const descendants = getFocusableElements(el);
5306
+ if (descendants.length > 0) {
5307
+ descendants[0].focus();
5308
+ return;
5309
+ }
5310
+ el.focus();
5311
+ if (document.activeElement === el) {
5312
+ return;
5313
+ }
5292
5314
  }
5293
5315
  }
5294
5316
  // Fallback: try DOM children (non-slotted content)
@@ -5748,7 +5770,7 @@ class AuroDropdown extends AuroElement$2 {
5748
5770
  }
5749
5771
 
5750
5772
  const eventType = event.detail.eventType || "unknown";
5751
- if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown") {
5773
+ if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown" && !this.noFocusRestoreOnClose) {
5752
5774
  this.focusTrigger();
5753
5775
  }
5754
5776
 
@@ -5756,9 +5778,9 @@ class AuroDropdown extends AuroElement$2 {
5756
5778
  // On Tab-driven close (eventType "focusloss"), let focus advance naturally
5757
5779
  // — restoring to the trigger would trap the user on this dropdown, forcing
5758
5780
  // an extra Tab to move on. Escape and outside-click still restore.
5759
- // When noHideOnThisFocusLoss is true, the consumer (e.g. combobox) manages
5781
+ // When noFocusRestoreOnClose is true, the consumer (e.g. combobox) manages
5760
5782
  // its own focus restoration — skip the generic trigger focus to avoid races.
5761
- if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noHideOnThisFocusLoss) {
5783
+ if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noFocusRestoreOnClose) {
5762
5784
  // wait til the bib gets fully closed and rendered
5763
5785
  setTimeout(() => {
5764
5786
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
@@ -18631,7 +18653,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
18631
18653
  }
18632
18654
  };
18633
18655
 
18634
- var formkitVersion$1 = '202607160501';
18656
+ var formkitVersion$1 = '202607160830';
18635
18657
 
18636
18658
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
18637
18659
  // See LICENSE in the project root for license information.
@@ -18919,6 +18941,18 @@ class AuroInput extends BaseInput {
18919
18941
  checkDisplayValueSlotChange() {
18920
18942
  const slot = this.shadowRoot?.querySelector('slot[name="displayValue"]');
18921
18943
  if (!slot) {
18944
+ // Shadow slot not yet rendered — fall back to checking light-DOM
18945
+ // children so hasDisplayValueContent isn't stuck false when called
18946
+ // before firstUpdated (e.g. from auro-combobox during mount).
18947
+ // Check for any element (including custom elements like <auro-icon>
18948
+ // that render via shadow DOM with no text content).
18949
+ const lightDomNodes = Array.from(this.querySelectorAll('[slot="displayValue"]:not(slot)'));
18950
+ this.hasDisplayValueContent = lightDomNodes.some((node) => (
18951
+ node.textContent.trim().length > 0 ||
18952
+ node.children.length > 0 ||
18953
+ node.shadowRoot !== null
18954
+ ));
18955
+ this.requestUpdate();
18922
18956
  return;
18923
18957
  }
18924
18958
  const nodes = slot.assignedNodes({ flatten: true });
@@ -18929,15 +18963,20 @@ class AuroInput extends BaseInput {
18929
18963
  // displayValue wrapper to render (with hasContent class) but show
18930
18964
  // nothing, blocking the combobox's synthetic displayValue from
18931
18965
  // being visible on preset/deeplink load.
18966
+ // Custom elements (e.g. <auro-icon>) that render via shadow DOM are
18967
+ // treated as content even when they have no text or light-DOM children.
18932
18968
  this.hasDisplayValueContent = nodes.some((node) => {
18933
18969
  if (node.nodeType === Node.TEXT_NODE) {
18934
18970
  return node.textContent.trim().length > 0;
18935
18971
  }
18936
18972
  if (node.nodeType === Node.ELEMENT_NODE) {
18937
- return node.textContent.trim().length > 0 || node.children.length > 0;
18973
+ return node.textContent.trim().length > 0 ||
18974
+ node.children.length > 0 ||
18975
+ node.shadowRoot !== null;
18938
18976
  }
18939
18977
  return false;
18940
18978
  });
18979
+ this.requestUpdate();
18941
18980
  }
18942
18981
 
18943
18982
  firstUpdated() {
@@ -19764,7 +19803,7 @@ class AuroBibtemplate extends i$3 {
19764
19803
  }
19765
19804
  }
19766
19805
 
19767
- var formkitVersion = '202607160501';
19806
+ var formkitVersion = '202607160830';
19768
19807
 
19769
19808
  var styleCss$3 = i$6`.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}`;
19770
19809
 
@@ -20809,7 +20848,6 @@ class AuroCombobox extends AuroElement {
20809
20848
  // hidden when input.value is set in the same tick as the append.
20810
20849
  if (typeof this.input.checkDisplayValueSlotChange === 'function') {
20811
20850
  this.input.checkDisplayValueSlotChange();
20812
- this.input.requestUpdate();
20813
20851
  }
20814
20852
  } else if (this.value) {
20815
20853
  // No optionSelected yet (e.g. setMenuValue was called but the menu's
@@ -20830,7 +20868,6 @@ class AuroCombobox extends AuroElement {
20830
20868
  this.input.appendChild(syntheticDV);
20831
20869
  if (typeof this.input.checkDisplayValueSlotChange === 'function') {
20832
20870
  this.input.checkDisplayValueSlotChange();
20833
- this.input.requestUpdate();
20834
20871
  }
20835
20872
  }
20836
20873
 
@@ -21003,6 +21040,10 @@ class AuroCombobox extends AuroElement {
21003
21040
  // from combobox's light DOM and won't be detected by dropdown's contains() check.
21004
21041
  this.dropdown.noHideOnThisFocusLoss = true;
21005
21042
 
21043
+ // Suppress the dropdown's generic focus restoration on close — the combobox
21044
+ // manages its own focus via setClearBtnFocus / setInputFocus / keyboard strategy.
21045
+ this.dropdown.noFocusRestoreOnClose = true;
21046
+
21006
21047
  // Listen for the ID to be added to the dropdown so we can capture it and use it for accessibility.
21007
21048
  this.dropdown.addEventListener('auroDropdown-idAdded', (event) => {
21008
21049
  this.dropdownId = event.detail.id;
@@ -4971,7 +4971,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$3 {
4971
4971
  }
4972
4972
  };
4973
4973
 
4974
- var formkitVersion$2 = '202607160501';
4974
+ var formkitVersion$2 = '202607160830';
4975
4975
 
4976
4976
  let AuroElement$2 = class AuroElement extends i$3 {
4977
4977
  static get properties() {
@@ -5111,6 +5111,15 @@ class AuroDropdown extends AuroElement$2 {
5111
5111
  this.matchWidth = false;
5112
5112
  this.noHideOnThisFocusLoss = false;
5113
5113
 
5114
+ /**
5115
+ * When true, the dropdown skips its generic focus restoration on close.
5116
+ * Intended for internal consumer coordination (e.g. auro-combobox), not as a
5117
+ * declarative attribute.
5118
+ * Separate from noHideOnThisFocusLoss (which controls auto-close behavior).
5119
+ * @private
5120
+ */
5121
+ this.noFocusRestoreOnClose = false;
5122
+
5114
5123
  this.errorMessage = undefined; // TODO - check with Doug if there is still more to do here
5115
5124
 
5116
5125
  // Layout Config
@@ -5285,10 +5294,23 @@ class AuroDropdown extends AuroElement$2 {
5285
5294
  const slot = this.trigger.querySelector('slot[name="trigger"]');
5286
5295
  if (slot) {
5287
5296
  const assigned = slot.assignedElements();
5288
- const focusable = assigned.find((el) => !el.hasAttribute('disabled'));
5289
- if (focusable) {
5290
- focusable.focus();
5291
- return;
5297
+ for (const el of assigned) {
5298
+ if (el.hasAttribute('disabled')) {
5299
+ continue;
5300
+ }
5301
+ // Try finding a focusable descendant first (handles non-focusable
5302
+ // wrappers like <div> containing a <button>). If none found, try
5303
+ // focusing the element directly (works for custom elements like
5304
+ // auro-input that have delegatesFocus or a custom focus() method).
5305
+ const descendants = getFocusableElements(el);
5306
+ if (descendants.length > 0) {
5307
+ descendants[0].focus();
5308
+ return;
5309
+ }
5310
+ el.focus();
5311
+ if (document.activeElement === el) {
5312
+ return;
5313
+ }
5292
5314
  }
5293
5315
  }
5294
5316
  // Fallback: try DOM children (non-slotted content)
@@ -5748,7 +5770,7 @@ class AuroDropdown extends AuroElement$2 {
5748
5770
  }
5749
5771
 
5750
5772
  const eventType = event.detail.eventType || "unknown";
5751
- if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown") {
5773
+ if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown" && !this.noFocusRestoreOnClose) {
5752
5774
  this.focusTrigger();
5753
5775
  }
5754
5776
 
@@ -5756,9 +5778,9 @@ class AuroDropdown extends AuroElement$2 {
5756
5778
  // On Tab-driven close (eventType "focusloss"), let focus advance naturally
5757
5779
  // — restoring to the trigger would trap the user on this dropdown, forcing
5758
5780
  // an extra Tab to move on. Escape and outside-click still restore.
5759
- // When noHideOnThisFocusLoss is true, the consumer (e.g. combobox) manages
5781
+ // When noFocusRestoreOnClose is true, the consumer (e.g. combobox) manages
5760
5782
  // its own focus restoration — skip the generic trigger focus to avoid races.
5761
- if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noHideOnThisFocusLoss) {
5783
+ if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noFocusRestoreOnClose) {
5762
5784
  // wait til the bib gets fully closed and rendered
5763
5785
  setTimeout(() => {
5764
5786
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
@@ -18631,7 +18653,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
18631
18653
  }
18632
18654
  };
18633
18655
 
18634
- var formkitVersion$1 = '202607160501';
18656
+ var formkitVersion$1 = '202607160830';
18635
18657
 
18636
18658
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
18637
18659
  // See LICENSE in the project root for license information.
@@ -18919,6 +18941,18 @@ class AuroInput extends BaseInput {
18919
18941
  checkDisplayValueSlotChange() {
18920
18942
  const slot = this.shadowRoot?.querySelector('slot[name="displayValue"]');
18921
18943
  if (!slot) {
18944
+ // Shadow slot not yet rendered — fall back to checking light-DOM
18945
+ // children so hasDisplayValueContent isn't stuck false when called
18946
+ // before firstUpdated (e.g. from auro-combobox during mount).
18947
+ // Check for any element (including custom elements like <auro-icon>
18948
+ // that render via shadow DOM with no text content).
18949
+ const lightDomNodes = Array.from(this.querySelectorAll('[slot="displayValue"]:not(slot)'));
18950
+ this.hasDisplayValueContent = lightDomNodes.some((node) => (
18951
+ node.textContent.trim().length > 0 ||
18952
+ node.children.length > 0 ||
18953
+ node.shadowRoot !== null
18954
+ ));
18955
+ this.requestUpdate();
18922
18956
  return;
18923
18957
  }
18924
18958
  const nodes = slot.assignedNodes({ flatten: true });
@@ -18929,15 +18963,20 @@ class AuroInput extends BaseInput {
18929
18963
  // displayValue wrapper to render (with hasContent class) but show
18930
18964
  // nothing, blocking the combobox's synthetic displayValue from
18931
18965
  // being visible on preset/deeplink load.
18966
+ // Custom elements (e.g. <auro-icon>) that render via shadow DOM are
18967
+ // treated as content even when they have no text or light-DOM children.
18932
18968
  this.hasDisplayValueContent = nodes.some((node) => {
18933
18969
  if (node.nodeType === Node.TEXT_NODE) {
18934
18970
  return node.textContent.trim().length > 0;
18935
18971
  }
18936
18972
  if (node.nodeType === Node.ELEMENT_NODE) {
18937
- return node.textContent.trim().length > 0 || node.children.length > 0;
18973
+ return node.textContent.trim().length > 0 ||
18974
+ node.children.length > 0 ||
18975
+ node.shadowRoot !== null;
18938
18976
  }
18939
18977
  return false;
18940
18978
  });
18979
+ this.requestUpdate();
18941
18980
  }
18942
18981
 
18943
18982
  firstUpdated() {
@@ -19764,7 +19803,7 @@ class AuroBibtemplate extends i$3 {
19764
19803
  }
19765
19804
  }
19766
19805
 
19767
- var formkitVersion = '202607160501';
19806
+ var formkitVersion = '202607160830';
19768
19807
 
19769
19808
  var styleCss$3 = i$6`.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}`;
19770
19809
 
@@ -20809,7 +20848,6 @@ class AuroCombobox extends AuroElement {
20809
20848
  // hidden when input.value is set in the same tick as the append.
20810
20849
  if (typeof this.input.checkDisplayValueSlotChange === 'function') {
20811
20850
  this.input.checkDisplayValueSlotChange();
20812
- this.input.requestUpdate();
20813
20851
  }
20814
20852
  } else if (this.value) {
20815
20853
  // No optionSelected yet (e.g. setMenuValue was called but the menu's
@@ -20830,7 +20868,6 @@ class AuroCombobox extends AuroElement {
20830
20868
  this.input.appendChild(syntheticDV);
20831
20869
  if (typeof this.input.checkDisplayValueSlotChange === 'function') {
20832
20870
  this.input.checkDisplayValueSlotChange();
20833
- this.input.requestUpdate();
20834
20871
  }
20835
20872
  }
20836
20873
 
@@ -21003,6 +21040,10 @@ class AuroCombobox extends AuroElement {
21003
21040
  // from combobox's light DOM and won't be detected by dropdown's contains() check.
21004
21041
  this.dropdown.noHideOnThisFocusLoss = true;
21005
21042
 
21043
+ // Suppress the dropdown's generic focus restoration on close — the combobox
21044
+ // manages its own focus via setClearBtnFocus / setInputFocus / keyboard strategy.
21045
+ this.dropdown.noFocusRestoreOnClose = true;
21046
+
21006
21047
  // Listen for the ID to be added to the dropdown so we can capture it and use it for accessibility.
21007
21048
  this.dropdown.addEventListener('auroDropdown-idAdded', (event) => {
21008
21049
  this.dropdownId = event.detail.id;
@@ -4986,7 +4986,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$3 {
4986
4986
  }
4987
4987
  };
4988
4988
 
4989
- var formkitVersion$2 = '202607160501';
4989
+ var formkitVersion$2 = '202607160830';
4990
4990
 
4991
4991
  let AuroElement$2 = class AuroElement extends i$3 {
4992
4992
  static get properties() {
@@ -5126,6 +5126,15 @@ class AuroDropdown extends AuroElement$2 {
5126
5126
  this.matchWidth = false;
5127
5127
  this.noHideOnThisFocusLoss = false;
5128
5128
 
5129
+ /**
5130
+ * When true, the dropdown skips its generic focus restoration on close.
5131
+ * Intended for internal consumer coordination (e.g. auro-combobox), not as a
5132
+ * declarative attribute.
5133
+ * Separate from noHideOnThisFocusLoss (which controls auto-close behavior).
5134
+ * @private
5135
+ */
5136
+ this.noFocusRestoreOnClose = false;
5137
+
5129
5138
  this.errorMessage = undefined; // TODO - check with Doug if there is still more to do here
5130
5139
 
5131
5140
  // Layout Config
@@ -5300,10 +5309,23 @@ class AuroDropdown extends AuroElement$2 {
5300
5309
  const slot = this.trigger.querySelector('slot[name="trigger"]');
5301
5310
  if (slot) {
5302
5311
  const assigned = slot.assignedElements();
5303
- const focusable = assigned.find((el) => !el.hasAttribute('disabled'));
5304
- if (focusable) {
5305
- focusable.focus();
5306
- return;
5312
+ for (const el of assigned) {
5313
+ if (el.hasAttribute('disabled')) {
5314
+ continue;
5315
+ }
5316
+ // Try finding a focusable descendant first (handles non-focusable
5317
+ // wrappers like <div> containing a <button>). If none found, try
5318
+ // focusing the element directly (works for custom elements like
5319
+ // auro-input that have delegatesFocus or a custom focus() method).
5320
+ const descendants = getFocusableElements(el);
5321
+ if (descendants.length > 0) {
5322
+ descendants[0].focus();
5323
+ return;
5324
+ }
5325
+ el.focus();
5326
+ if (document.activeElement === el) {
5327
+ return;
5328
+ }
5307
5329
  }
5308
5330
  }
5309
5331
  // Fallback: try DOM children (non-slotted content)
@@ -5763,7 +5785,7 @@ class AuroDropdown extends AuroElement$2 {
5763
5785
  }
5764
5786
 
5765
5787
  const eventType = event.detail.eventType || "unknown";
5766
- if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown") {
5788
+ if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown" && !this.noFocusRestoreOnClose) {
5767
5789
  this.focusTrigger();
5768
5790
  }
5769
5791
 
@@ -5771,9 +5793,9 @@ class AuroDropdown extends AuroElement$2 {
5771
5793
  // On Tab-driven close (eventType "focusloss"), let focus advance naturally
5772
5794
  // — restoring to the trigger would trap the user on this dropdown, forcing
5773
5795
  // an extra Tab to move on. Escape and outside-click still restore.
5774
- // When noHideOnThisFocusLoss is true, the consumer (e.g. combobox) manages
5796
+ // When noFocusRestoreOnClose is true, the consumer (e.g. combobox) manages
5775
5797
  // its own focus restoration — skip the generic trigger focus to avoid races.
5776
- if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noHideOnThisFocusLoss) {
5798
+ if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noFocusRestoreOnClose) {
5777
5799
  // wait til the bib gets fully closed and rendered
5778
5800
  setTimeout(() => {
5779
5801
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
@@ -18646,7 +18668,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
18646
18668
  }
18647
18669
  };
18648
18670
 
18649
- var formkitVersion$1 = '202607160501';
18671
+ var formkitVersion$1 = '202607160830';
18650
18672
 
18651
18673
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
18652
18674
  // See LICENSE in the project root for license information.
@@ -18934,6 +18956,18 @@ class AuroInput extends BaseInput {
18934
18956
  checkDisplayValueSlotChange() {
18935
18957
  const slot = this.shadowRoot?.querySelector('slot[name="displayValue"]');
18936
18958
  if (!slot) {
18959
+ // Shadow slot not yet rendered — fall back to checking light-DOM
18960
+ // children so hasDisplayValueContent isn't stuck false when called
18961
+ // before firstUpdated (e.g. from auro-combobox during mount).
18962
+ // Check for any element (including custom elements like <auro-icon>
18963
+ // that render via shadow DOM with no text content).
18964
+ const lightDomNodes = Array.from(this.querySelectorAll('[slot="displayValue"]:not(slot)'));
18965
+ this.hasDisplayValueContent = lightDomNodes.some((node) => (
18966
+ node.textContent.trim().length > 0 ||
18967
+ node.children.length > 0 ||
18968
+ node.shadowRoot !== null
18969
+ ));
18970
+ this.requestUpdate();
18937
18971
  return;
18938
18972
  }
18939
18973
  const nodes = slot.assignedNodes({ flatten: true });
@@ -18944,15 +18978,20 @@ class AuroInput extends BaseInput {
18944
18978
  // displayValue wrapper to render (with hasContent class) but show
18945
18979
  // nothing, blocking the combobox's synthetic displayValue from
18946
18980
  // being visible on preset/deeplink load.
18981
+ // Custom elements (e.g. <auro-icon>) that render via shadow DOM are
18982
+ // treated as content even when they have no text or light-DOM children.
18947
18983
  this.hasDisplayValueContent = nodes.some((node) => {
18948
18984
  if (node.nodeType === Node.TEXT_NODE) {
18949
18985
  return node.textContent.trim().length > 0;
18950
18986
  }
18951
18987
  if (node.nodeType === Node.ELEMENT_NODE) {
18952
- return node.textContent.trim().length > 0 || node.children.length > 0;
18988
+ return node.textContent.trim().length > 0 ||
18989
+ node.children.length > 0 ||
18990
+ node.shadowRoot !== null;
18953
18991
  }
18954
18992
  return false;
18955
18993
  });
18994
+ this.requestUpdate();
18956
18995
  }
18957
18996
 
18958
18997
  firstUpdated() {
@@ -19779,7 +19818,7 @@ class AuroBibtemplate extends i$3 {
19779
19818
  }
19780
19819
  }
19781
19820
 
19782
- var formkitVersion = '202607160501';
19821
+ var formkitVersion = '202607160830';
19783
19822
 
19784
19823
  var styleCss$3 = i$6`.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}`;
19785
19824
 
@@ -20824,7 +20863,6 @@ class AuroCombobox extends AuroElement {
20824
20863
  // hidden when input.value is set in the same tick as the append.
20825
20864
  if (typeof this.input.checkDisplayValueSlotChange === 'function') {
20826
20865
  this.input.checkDisplayValueSlotChange();
20827
- this.input.requestUpdate();
20828
20866
  }
20829
20867
  } else if (this.value) {
20830
20868
  // No optionSelected yet (e.g. setMenuValue was called but the menu's
@@ -20845,7 +20883,6 @@ class AuroCombobox extends AuroElement {
20845
20883
  this.input.appendChild(syntheticDV);
20846
20884
  if (typeof this.input.checkDisplayValueSlotChange === 'function') {
20847
20885
  this.input.checkDisplayValueSlotChange();
20848
- this.input.requestUpdate();
20849
20886
  }
20850
20887
  }
20851
20888
 
@@ -21018,6 +21055,10 @@ class AuroCombobox extends AuroElement {
21018
21055
  // from combobox's light DOM and won't be detected by dropdown's contains() check.
21019
21056
  this.dropdown.noHideOnThisFocusLoss = true;
21020
21057
 
21058
+ // Suppress the dropdown's generic focus restoration on close — the combobox
21059
+ // manages its own focus via setClearBtnFocus / setInputFocus / keyboard strategy.
21060
+ this.dropdown.noFocusRestoreOnClose = true;
21061
+
21021
21062
  // Listen for the ID to be added to the dropdown so we can capture it and use it for accessibility.
21022
21063
  this.dropdown.addEventListener('auroDropdown-idAdded', (event) => {
21023
21064
  this.dropdownId = event.detail.id;