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

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
@@ -4904,7 +4904,7 @@ let AuroHelpText$2 = class AuroHelpText extends LitElement {
4904
4904
  }
4905
4905
  };
4906
4906
 
4907
- var formkitVersion$2 = '202607160501';
4907
+ var formkitVersion$2 = '202607160836';
4908
4908
 
4909
4909
  let AuroElement$2 = class AuroElement extends LitElement {
4910
4910
  static get properties() {
@@ -5044,6 +5044,15 @@ class AuroDropdown extends AuroElement$2 {
5044
5044
  this.matchWidth = false;
5045
5045
  this.noHideOnThisFocusLoss = false;
5046
5046
 
5047
+ /**
5048
+ * When true, the dropdown skips its generic focus restoration on close.
5049
+ * Intended for internal consumer coordination (e.g. auro-combobox), not as a
5050
+ * declarative attribute.
5051
+ * Separate from noHideOnThisFocusLoss (which controls auto-close behavior).
5052
+ * @private
5053
+ */
5054
+ this.noFocusRestoreOnClose = false;
5055
+
5047
5056
  this.errorMessage = undefined; // TODO - check with Doug if there is still more to do here
5048
5057
 
5049
5058
  // Layout Config
@@ -5218,10 +5227,23 @@ class AuroDropdown extends AuroElement$2 {
5218
5227
  const slot = this.trigger.querySelector('slot[name="trigger"]');
5219
5228
  if (slot) {
5220
5229
  const assigned = slot.assignedElements();
5221
- const focusable = assigned.find((el) => !el.hasAttribute('disabled'));
5222
- if (focusable) {
5223
- focusable.focus();
5224
- return;
5230
+ for (const el of assigned) {
5231
+ if (el.hasAttribute('disabled')) {
5232
+ continue;
5233
+ }
5234
+ // Try finding a focusable descendant first (handles non-focusable
5235
+ // wrappers like <div> containing a <button>). If none found, try
5236
+ // focusing the element directly (works for custom elements like
5237
+ // auro-input that have delegatesFocus or a custom focus() method).
5238
+ const descendants = getFocusableElements(el);
5239
+ if (descendants.length > 0) {
5240
+ descendants[0].focus();
5241
+ return;
5242
+ }
5243
+ el.focus();
5244
+ if (document.activeElement === el) {
5245
+ return;
5246
+ }
5225
5247
  }
5226
5248
  }
5227
5249
  // Fallback: try DOM children (non-slotted content)
@@ -5681,7 +5703,7 @@ class AuroDropdown extends AuroElement$2 {
5681
5703
  }
5682
5704
 
5683
5705
  const eventType = event.detail.eventType || "unknown";
5684
- if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown") {
5706
+ if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown" && !this.noFocusRestoreOnClose) {
5685
5707
  this.focusTrigger();
5686
5708
  }
5687
5709
 
@@ -5689,9 +5711,9 @@ class AuroDropdown extends AuroElement$2 {
5689
5711
  // On Tab-driven close (eventType "focusloss"), let focus advance naturally
5690
5712
  // — restoring to the trigger would trap the user on this dropdown, forcing
5691
5713
  // an extra Tab to move on. Escape and outside-click still restore.
5692
- // When noHideOnThisFocusLoss is true, the consumer (e.g. combobox) manages
5714
+ // When noFocusRestoreOnClose is true, the consumer (e.g. combobox) manages
5693
5715
  // its own focus restoration — skip the generic trigger focus to avoid races.
5694
- if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noHideOnThisFocusLoss) {
5716
+ if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noFocusRestoreOnClose) {
5695
5717
  // wait til the bib gets fully closed and rendered
5696
5718
  setTimeout(() => {
5697
5719
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
@@ -18557,7 +18579,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
18557
18579
  }
18558
18580
  };
18559
18581
 
18560
- var formkitVersion$1 = '202607160501';
18582
+ var formkitVersion$1 = '202607160836';
18561
18583
 
18562
18584
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
18563
18585
  // See LICENSE in the project root for license information.
@@ -18845,6 +18867,18 @@ class AuroInput extends BaseInput {
18845
18867
  checkDisplayValueSlotChange() {
18846
18868
  const slot = this.shadowRoot?.querySelector('slot[name="displayValue"]');
18847
18869
  if (!slot) {
18870
+ // Shadow slot not yet rendered — fall back to checking light-DOM
18871
+ // children so hasDisplayValueContent isn't stuck false when called
18872
+ // before firstUpdated (e.g. from auro-combobox during mount).
18873
+ // Check for any element (including custom elements like <auro-icon>
18874
+ // that render via shadow DOM with no text content).
18875
+ const lightDomNodes = Array.from(this.querySelectorAll('[slot="displayValue"]:not(slot)'));
18876
+ this.hasDisplayValueContent = lightDomNodes.some((node) => (
18877
+ node.textContent.trim().length > 0 ||
18878
+ node.children.length > 0 ||
18879
+ node.shadowRoot !== null
18880
+ ));
18881
+ this.requestUpdate();
18848
18882
  return;
18849
18883
  }
18850
18884
  const nodes = slot.assignedNodes({ flatten: true });
@@ -18855,15 +18889,20 @@ class AuroInput extends BaseInput {
18855
18889
  // displayValue wrapper to render (with hasContent class) but show
18856
18890
  // nothing, blocking the combobox's synthetic displayValue from
18857
18891
  // being visible on preset/deeplink load.
18892
+ // Custom elements (e.g. <auro-icon>) that render via shadow DOM are
18893
+ // treated as content even when they have no text or light-DOM children.
18858
18894
  this.hasDisplayValueContent = nodes.some((node) => {
18859
18895
  if (node.nodeType === Node.TEXT_NODE) {
18860
18896
  return node.textContent.trim().length > 0;
18861
18897
  }
18862
18898
  if (node.nodeType === Node.ELEMENT_NODE) {
18863
- return node.textContent.trim().length > 0 || node.children.length > 0;
18899
+ return node.textContent.trim().length > 0 ||
18900
+ node.children.length > 0 ||
18901
+ node.shadowRoot !== null;
18864
18902
  }
18865
18903
  return false;
18866
18904
  });
18905
+ this.requestUpdate();
18867
18906
  }
18868
18907
 
18869
18908
  firstUpdated() {
@@ -19690,7 +19729,7 @@ class AuroBibtemplate extends LitElement {
19690
19729
  }
19691
19730
  }
19692
19731
 
19693
- var formkitVersion = '202607160501';
19732
+ var formkitVersion = '202607160836';
19694
19733
 
19695
19734
  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}`;
19696
19735
 
@@ -20735,7 +20774,6 @@ class AuroCombobox extends AuroElement {
20735
20774
  // hidden when input.value is set in the same tick as the append.
20736
20775
  if (typeof this.input.checkDisplayValueSlotChange === 'function') {
20737
20776
  this.input.checkDisplayValueSlotChange();
20738
- this.input.requestUpdate();
20739
20777
  }
20740
20778
  } else if (this.value) {
20741
20779
  // No optionSelected yet (e.g. setMenuValue was called but the menu's
@@ -20756,7 +20794,6 @@ class AuroCombobox extends AuroElement {
20756
20794
  this.input.appendChild(syntheticDV);
20757
20795
  if (typeof this.input.checkDisplayValueSlotChange === 'function') {
20758
20796
  this.input.checkDisplayValueSlotChange();
20759
- this.input.requestUpdate();
20760
20797
  }
20761
20798
  }
20762
20799
 
@@ -20929,6 +20966,10 @@ class AuroCombobox extends AuroElement {
20929
20966
  // from combobox's light DOM and won't be detected by dropdown's contains() check.
20930
20967
  this.dropdown.noHideOnThisFocusLoss = true;
20931
20968
 
20969
+ // Suppress the dropdown's generic focus restoration on close — the combobox
20970
+ // manages its own focus via setClearBtnFocus / setInputFocus / keyboard strategy.
20971
+ this.dropdown.noFocusRestoreOnClose = true;
20972
+
20932
20973
  // Listen for the ID to be added to the dropdown so we can capture it and use it for accessibility.
20933
20974
  this.dropdown.addEventListener('auroDropdown-idAdded', (event) => {
20934
20975
  this.dropdownId = event.detail.id;
@@ -4904,7 +4904,7 @@ let AuroHelpText$2 = class AuroHelpText extends LitElement {
4904
4904
  }
4905
4905
  };
4906
4906
 
4907
- var formkitVersion$2 = '202607160501';
4907
+ var formkitVersion$2 = '202607160836';
4908
4908
 
4909
4909
  let AuroElement$2 = class AuroElement extends LitElement {
4910
4910
  static get properties() {
@@ -5044,6 +5044,15 @@ class AuroDropdown extends AuroElement$2 {
5044
5044
  this.matchWidth = false;
5045
5045
  this.noHideOnThisFocusLoss = false;
5046
5046
 
5047
+ /**
5048
+ * When true, the dropdown skips its generic focus restoration on close.
5049
+ * Intended for internal consumer coordination (e.g. auro-combobox), not as a
5050
+ * declarative attribute.
5051
+ * Separate from noHideOnThisFocusLoss (which controls auto-close behavior).
5052
+ * @private
5053
+ */
5054
+ this.noFocusRestoreOnClose = false;
5055
+
5047
5056
  this.errorMessage = undefined; // TODO - check with Doug if there is still more to do here
5048
5057
 
5049
5058
  // Layout Config
@@ -5218,10 +5227,23 @@ class AuroDropdown extends AuroElement$2 {
5218
5227
  const slot = this.trigger.querySelector('slot[name="trigger"]');
5219
5228
  if (slot) {
5220
5229
  const assigned = slot.assignedElements();
5221
- const focusable = assigned.find((el) => !el.hasAttribute('disabled'));
5222
- if (focusable) {
5223
- focusable.focus();
5224
- return;
5230
+ for (const el of assigned) {
5231
+ if (el.hasAttribute('disabled')) {
5232
+ continue;
5233
+ }
5234
+ // Try finding a focusable descendant first (handles non-focusable
5235
+ // wrappers like <div> containing a <button>). If none found, try
5236
+ // focusing the element directly (works for custom elements like
5237
+ // auro-input that have delegatesFocus or a custom focus() method).
5238
+ const descendants = getFocusableElements(el);
5239
+ if (descendants.length > 0) {
5240
+ descendants[0].focus();
5241
+ return;
5242
+ }
5243
+ el.focus();
5244
+ if (document.activeElement === el) {
5245
+ return;
5246
+ }
5225
5247
  }
5226
5248
  }
5227
5249
  // Fallback: try DOM children (non-slotted content)
@@ -5681,7 +5703,7 @@ class AuroDropdown extends AuroElement$2 {
5681
5703
  }
5682
5704
 
5683
5705
  const eventType = event.detail.eventType || "unknown";
5684
- if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown") {
5706
+ if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown" && !this.noFocusRestoreOnClose) {
5685
5707
  this.focusTrigger();
5686
5708
  }
5687
5709
 
@@ -5689,9 +5711,9 @@ class AuroDropdown extends AuroElement$2 {
5689
5711
  // On Tab-driven close (eventType "focusloss"), let focus advance naturally
5690
5712
  // — restoring to the trigger would trap the user on this dropdown, forcing
5691
5713
  // an extra Tab to move on. Escape and outside-click still restore.
5692
- // When noHideOnThisFocusLoss is true, the consumer (e.g. combobox) manages
5714
+ // When noFocusRestoreOnClose is true, the consumer (e.g. combobox) manages
5693
5715
  // its own focus restoration — skip the generic trigger focus to avoid races.
5694
- if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noHideOnThisFocusLoss) {
5716
+ if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noFocusRestoreOnClose) {
5695
5717
  // wait til the bib gets fully closed and rendered
5696
5718
  setTimeout(() => {
5697
5719
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
@@ -18557,7 +18579,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
18557
18579
  }
18558
18580
  };
18559
18581
 
18560
- var formkitVersion$1 = '202607160501';
18582
+ var formkitVersion$1 = '202607160836';
18561
18583
 
18562
18584
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
18563
18585
  // See LICENSE in the project root for license information.
@@ -18845,6 +18867,18 @@ class AuroInput extends BaseInput {
18845
18867
  checkDisplayValueSlotChange() {
18846
18868
  const slot = this.shadowRoot?.querySelector('slot[name="displayValue"]');
18847
18869
  if (!slot) {
18870
+ // Shadow slot not yet rendered — fall back to checking light-DOM
18871
+ // children so hasDisplayValueContent isn't stuck false when called
18872
+ // before firstUpdated (e.g. from auro-combobox during mount).
18873
+ // Check for any element (including custom elements like <auro-icon>
18874
+ // that render via shadow DOM with no text content).
18875
+ const lightDomNodes = Array.from(this.querySelectorAll('[slot="displayValue"]:not(slot)'));
18876
+ this.hasDisplayValueContent = lightDomNodes.some((node) => (
18877
+ node.textContent.trim().length > 0 ||
18878
+ node.children.length > 0 ||
18879
+ node.shadowRoot !== null
18880
+ ));
18881
+ this.requestUpdate();
18848
18882
  return;
18849
18883
  }
18850
18884
  const nodes = slot.assignedNodes({ flatten: true });
@@ -18855,15 +18889,20 @@ class AuroInput extends BaseInput {
18855
18889
  // displayValue wrapper to render (with hasContent class) but show
18856
18890
  // nothing, blocking the combobox's synthetic displayValue from
18857
18891
  // being visible on preset/deeplink load.
18892
+ // Custom elements (e.g. <auro-icon>) that render via shadow DOM are
18893
+ // treated as content even when they have no text or light-DOM children.
18858
18894
  this.hasDisplayValueContent = nodes.some((node) => {
18859
18895
  if (node.nodeType === Node.TEXT_NODE) {
18860
18896
  return node.textContent.trim().length > 0;
18861
18897
  }
18862
18898
  if (node.nodeType === Node.ELEMENT_NODE) {
18863
- return node.textContent.trim().length > 0 || node.children.length > 0;
18899
+ return node.textContent.trim().length > 0 ||
18900
+ node.children.length > 0 ||
18901
+ node.shadowRoot !== null;
18864
18902
  }
18865
18903
  return false;
18866
18904
  });
18905
+ this.requestUpdate();
18867
18906
  }
18868
18907
 
18869
18908
  firstUpdated() {
@@ -19690,7 +19729,7 @@ class AuroBibtemplate extends LitElement {
19690
19729
  }
19691
19730
  }
19692
19731
 
19693
- var formkitVersion = '202607160501';
19732
+ var formkitVersion = '202607160836';
19694
19733
 
19695
19734
  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}`;
19696
19735
 
@@ -20735,7 +20774,6 @@ class AuroCombobox extends AuroElement {
20735
20774
  // hidden when input.value is set in the same tick as the append.
20736
20775
  if (typeof this.input.checkDisplayValueSlotChange === 'function') {
20737
20776
  this.input.checkDisplayValueSlotChange();
20738
- this.input.requestUpdate();
20739
20777
  }
20740
20778
  } else if (this.value) {
20741
20779
  // No optionSelected yet (e.g. setMenuValue was called but the menu's
@@ -20756,7 +20794,6 @@ class AuroCombobox extends AuroElement {
20756
20794
  this.input.appendChild(syntheticDV);
20757
20795
  if (typeof this.input.checkDisplayValueSlotChange === 'function') {
20758
20796
  this.input.checkDisplayValueSlotChange();
20759
- this.input.requestUpdate();
20760
20797
  }
20761
20798
  }
20762
20799
 
@@ -20929,6 +20966,10 @@ class AuroCombobox extends AuroElement {
20929
20966
  // from combobox's light DOM and won't be detected by dropdown's contains() check.
20930
20967
  this.dropdown.noHideOnThisFocusLoss = true;
20931
20968
 
20969
+ // Suppress the dropdown's generic focus restoration on close — the combobox
20970
+ // manages its own focus via setClearBtnFocus / setInputFocus / keyboard strategy.
20971
+ this.dropdown.noFocusRestoreOnClose = true;
20972
+
20932
20973
  // Listen for the ID to be added to the dropdown so we can capture it and use it for accessibility.
20933
20974
  this.dropdown.addEventListener('auroDropdown-idAdded', (event) => {
20934
20975
  this.dropdownId = event.detail.id;
@@ -1114,7 +1114,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
1114
1114
  }
1115
1115
  };
1116
1116
 
1117
- var formkitVersion$1 = '202607160501';
1117
+ var formkitVersion$1 = '202607160836';
1118
1118
 
1119
1119
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1120
1120
  // See LICENSE in the project root for license information.
@@ -5280,7 +5280,7 @@ class AuroHelpText extends i$2 {
5280
5280
  }
5281
5281
  }
5282
5282
 
5283
- var formkitVersion = '202607160501';
5283
+ var formkitVersion = '202607160836';
5284
5284
 
5285
5285
  let AuroElement$1 = class AuroElement extends i$2 {
5286
5286
  static get properties() {
@@ -5420,6 +5420,15 @@ class AuroDropdown extends AuroElement$1 {
5420
5420
  this.matchWidth = false;
5421
5421
  this.noHideOnThisFocusLoss = false;
5422
5422
 
5423
+ /**
5424
+ * When true, the dropdown skips its generic focus restoration on close.
5425
+ * Intended for internal consumer coordination (e.g. auro-combobox), not as a
5426
+ * declarative attribute.
5427
+ * Separate from noHideOnThisFocusLoss (which controls auto-close behavior).
5428
+ * @private
5429
+ */
5430
+ this.noFocusRestoreOnClose = false;
5431
+
5423
5432
  this.errorMessage = undefined; // TODO - check with Doug if there is still more to do here
5424
5433
 
5425
5434
  // Layout Config
@@ -5594,10 +5603,23 @@ class AuroDropdown extends AuroElement$1 {
5594
5603
  const slot = this.trigger.querySelector('slot[name="trigger"]');
5595
5604
  if (slot) {
5596
5605
  const assigned = slot.assignedElements();
5597
- const focusable = assigned.find((el) => !el.hasAttribute('disabled'));
5598
- if (focusable) {
5599
- focusable.focus();
5600
- return;
5606
+ for (const el of assigned) {
5607
+ if (el.hasAttribute('disabled')) {
5608
+ continue;
5609
+ }
5610
+ // Try finding a focusable descendant first (handles non-focusable
5611
+ // wrappers like <div> containing a <button>). If none found, try
5612
+ // focusing the element directly (works for custom elements like
5613
+ // auro-input that have delegatesFocus or a custom focus() method).
5614
+ const descendants = getFocusableElements(el);
5615
+ if (descendants.length > 0) {
5616
+ descendants[0].focus();
5617
+ return;
5618
+ }
5619
+ el.focus();
5620
+ if (document.activeElement === el) {
5621
+ return;
5622
+ }
5601
5623
  }
5602
5624
  }
5603
5625
  // Fallback: try DOM children (non-slotted content)
@@ -6057,7 +6079,7 @@ class AuroDropdown extends AuroElement$1 {
6057
6079
  }
6058
6080
 
6059
6081
  const eventType = event.detail.eventType || "unknown";
6060
- if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown") {
6082
+ if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown" && !this.noFocusRestoreOnClose) {
6061
6083
  this.focusTrigger();
6062
6084
  }
6063
6085
 
@@ -6065,9 +6087,9 @@ class AuroDropdown extends AuroElement$1 {
6065
6087
  // On Tab-driven close (eventType "focusloss"), let focus advance naturally
6066
6088
  // — restoring to the trigger would trap the user on this dropdown, forcing
6067
6089
  // an extra Tab to move on. Escape and outside-click still restore.
6068
- // When noHideOnThisFocusLoss is true, the consumer (e.g. combobox) manages
6090
+ // When noFocusRestoreOnClose is true, the consumer (e.g. combobox) manages
6069
6091
  // its own focus restoration — skip the generic trigger focus to avoid races.
6070
- if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noHideOnThisFocusLoss) {
6092
+ if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noFocusRestoreOnClose) {
6071
6093
  // wait til the bib gets fully closed and rendered
6072
6094
  setTimeout(() => {
6073
6095
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
@@ -1114,7 +1114,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
1114
1114
  }
1115
1115
  };
1116
1116
 
1117
- var formkitVersion$1 = '202607160501';
1117
+ var formkitVersion$1 = '202607160836';
1118
1118
 
1119
1119
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1120
1120
  // See LICENSE in the project root for license information.
@@ -5280,7 +5280,7 @@ class AuroHelpText extends i$2 {
5280
5280
  }
5281
5281
  }
5282
5282
 
5283
- var formkitVersion = '202607160501';
5283
+ var formkitVersion = '202607160836';
5284
5284
 
5285
5285
  let AuroElement$1 = class AuroElement extends i$2 {
5286
5286
  static get properties() {
@@ -5420,6 +5420,15 @@ class AuroDropdown extends AuroElement$1 {
5420
5420
  this.matchWidth = false;
5421
5421
  this.noHideOnThisFocusLoss = false;
5422
5422
 
5423
+ /**
5424
+ * When true, the dropdown skips its generic focus restoration on close.
5425
+ * Intended for internal consumer coordination (e.g. auro-combobox), not as a
5426
+ * declarative attribute.
5427
+ * Separate from noHideOnThisFocusLoss (which controls auto-close behavior).
5428
+ * @private
5429
+ */
5430
+ this.noFocusRestoreOnClose = false;
5431
+
5423
5432
  this.errorMessage = undefined; // TODO - check with Doug if there is still more to do here
5424
5433
 
5425
5434
  // Layout Config
@@ -5594,10 +5603,23 @@ class AuroDropdown extends AuroElement$1 {
5594
5603
  const slot = this.trigger.querySelector('slot[name="trigger"]');
5595
5604
  if (slot) {
5596
5605
  const assigned = slot.assignedElements();
5597
- const focusable = assigned.find((el) => !el.hasAttribute('disabled'));
5598
- if (focusable) {
5599
- focusable.focus();
5600
- return;
5606
+ for (const el of assigned) {
5607
+ if (el.hasAttribute('disabled')) {
5608
+ continue;
5609
+ }
5610
+ // Try finding a focusable descendant first (handles non-focusable
5611
+ // wrappers like <div> containing a <button>). If none found, try
5612
+ // focusing the element directly (works for custom elements like
5613
+ // auro-input that have delegatesFocus or a custom focus() method).
5614
+ const descendants = getFocusableElements(el);
5615
+ if (descendants.length > 0) {
5616
+ descendants[0].focus();
5617
+ return;
5618
+ }
5619
+ el.focus();
5620
+ if (document.activeElement === el) {
5621
+ return;
5622
+ }
5601
5623
  }
5602
5624
  }
5603
5625
  // Fallback: try DOM children (non-slotted content)
@@ -6057,7 +6079,7 @@ class AuroDropdown extends AuroElement$1 {
6057
6079
  }
6058
6080
 
6059
6081
  const eventType = event.detail.eventType || "unknown";
6060
- if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown") {
6082
+ if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown" && !this.noFocusRestoreOnClose) {
6061
6083
  this.focusTrigger();
6062
6084
  }
6063
6085
 
@@ -6065,9 +6087,9 @@ class AuroDropdown extends AuroElement$1 {
6065
6087
  // On Tab-driven close (eventType "focusloss"), let focus advance naturally
6066
6088
  // — restoring to the trigger would trap the user on this dropdown, forcing
6067
6089
  // an extra Tab to move on. Escape and outside-click still restore.
6068
- // When noHideOnThisFocusLoss is true, the consumer (e.g. combobox) manages
6090
+ // When noFocusRestoreOnClose is true, the consumer (e.g. combobox) manages
6069
6091
  // its own focus restoration — skip the generic trigger focus to avoid races.
6070
- if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noHideOnThisFocusLoss) {
6092
+ if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noFocusRestoreOnClose) {
6071
6093
  // wait til the bib gets fully closed and rendered
6072
6094
  setTimeout(() => {
6073
6095
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
@@ -1064,7 +1064,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
1064
1064
  }
1065
1065
  };
1066
1066
 
1067
- var formkitVersion$1 = '202607160501';
1067
+ var formkitVersion$1 = '202607160836';
1068
1068
 
1069
1069
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1070
1070
  // See LICENSE in the project root for license information.
@@ -5212,7 +5212,7 @@ class AuroHelpText extends LitElement {
5212
5212
  }
5213
5213
  }
5214
5214
 
5215
- var formkitVersion = '202607160501';
5215
+ var formkitVersion = '202607160836';
5216
5216
 
5217
5217
  let AuroElement$1 = class AuroElement extends LitElement {
5218
5218
  static get properties() {
@@ -5352,6 +5352,15 @@ class AuroDropdown extends AuroElement$1 {
5352
5352
  this.matchWidth = false;
5353
5353
  this.noHideOnThisFocusLoss = false;
5354
5354
 
5355
+ /**
5356
+ * When true, the dropdown skips its generic focus restoration on close.
5357
+ * Intended for internal consumer coordination (e.g. auro-combobox), not as a
5358
+ * declarative attribute.
5359
+ * Separate from noHideOnThisFocusLoss (which controls auto-close behavior).
5360
+ * @private
5361
+ */
5362
+ this.noFocusRestoreOnClose = false;
5363
+
5355
5364
  this.errorMessage = undefined; // TODO - check with Doug if there is still more to do here
5356
5365
 
5357
5366
  // Layout Config
@@ -5526,10 +5535,23 @@ class AuroDropdown extends AuroElement$1 {
5526
5535
  const slot = this.trigger.querySelector('slot[name="trigger"]');
5527
5536
  if (slot) {
5528
5537
  const assigned = slot.assignedElements();
5529
- const focusable = assigned.find((el) => !el.hasAttribute('disabled'));
5530
- if (focusable) {
5531
- focusable.focus();
5532
- return;
5538
+ for (const el of assigned) {
5539
+ if (el.hasAttribute('disabled')) {
5540
+ continue;
5541
+ }
5542
+ // Try finding a focusable descendant first (handles non-focusable
5543
+ // wrappers like <div> containing a <button>). If none found, try
5544
+ // focusing the element directly (works for custom elements like
5545
+ // auro-input that have delegatesFocus or a custom focus() method).
5546
+ const descendants = getFocusableElements(el);
5547
+ if (descendants.length > 0) {
5548
+ descendants[0].focus();
5549
+ return;
5550
+ }
5551
+ el.focus();
5552
+ if (document.activeElement === el) {
5553
+ return;
5554
+ }
5533
5555
  }
5534
5556
  }
5535
5557
  // Fallback: try DOM children (non-slotted content)
@@ -5989,7 +6011,7 @@ class AuroDropdown extends AuroElement$1 {
5989
6011
  }
5990
6012
 
5991
6013
  const eventType = event.detail.eventType || "unknown";
5992
- if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown") {
6014
+ if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown" && !this.noFocusRestoreOnClose) {
5993
6015
  this.focusTrigger();
5994
6016
  }
5995
6017
 
@@ -5997,9 +6019,9 @@ class AuroDropdown extends AuroElement$1 {
5997
6019
  // On Tab-driven close (eventType "focusloss"), let focus advance naturally
5998
6020
  // — restoring to the trigger would trap the user on this dropdown, forcing
5999
6021
  // an extra Tab to move on. Escape and outside-click still restore.
6000
- // When noHideOnThisFocusLoss is true, the consumer (e.g. combobox) manages
6022
+ // When noFocusRestoreOnClose is true, the consumer (e.g. combobox) manages
6001
6023
  // its own focus restoration — skip the generic trigger focus to avoid races.
6002
- if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noHideOnThisFocusLoss) {
6024
+ if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noFocusRestoreOnClose) {
6003
6025
  // wait til the bib gets fully closed and rendered
6004
6026
  setTimeout(() => {
6005
6027
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
@@ -1064,7 +1064,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
1064
1064
  }
1065
1065
  };
1066
1066
 
1067
- var formkitVersion$1 = '202607160501';
1067
+ var formkitVersion$1 = '202607160836';
1068
1068
 
1069
1069
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
1070
1070
  // See LICENSE in the project root for license information.
@@ -5212,7 +5212,7 @@ class AuroHelpText extends LitElement {
5212
5212
  }
5213
5213
  }
5214
5214
 
5215
- var formkitVersion = '202607160501';
5215
+ var formkitVersion = '202607160836';
5216
5216
 
5217
5217
  let AuroElement$1 = class AuroElement extends LitElement {
5218
5218
  static get properties() {
@@ -5352,6 +5352,15 @@ class AuroDropdown extends AuroElement$1 {
5352
5352
  this.matchWidth = false;
5353
5353
  this.noHideOnThisFocusLoss = false;
5354
5354
 
5355
+ /**
5356
+ * When true, the dropdown skips its generic focus restoration on close.
5357
+ * Intended for internal consumer coordination (e.g. auro-combobox), not as a
5358
+ * declarative attribute.
5359
+ * Separate from noHideOnThisFocusLoss (which controls auto-close behavior).
5360
+ * @private
5361
+ */
5362
+ this.noFocusRestoreOnClose = false;
5363
+
5355
5364
  this.errorMessage = undefined; // TODO - check with Doug if there is still more to do here
5356
5365
 
5357
5366
  // Layout Config
@@ -5526,10 +5535,23 @@ class AuroDropdown extends AuroElement$1 {
5526
5535
  const slot = this.trigger.querySelector('slot[name="trigger"]');
5527
5536
  if (slot) {
5528
5537
  const assigned = slot.assignedElements();
5529
- const focusable = assigned.find((el) => !el.hasAttribute('disabled'));
5530
- if (focusable) {
5531
- focusable.focus();
5532
- return;
5538
+ for (const el of assigned) {
5539
+ if (el.hasAttribute('disabled')) {
5540
+ continue;
5541
+ }
5542
+ // Try finding a focusable descendant first (handles non-focusable
5543
+ // wrappers like <div> containing a <button>). If none found, try
5544
+ // focusing the element directly (works for custom elements like
5545
+ // auro-input that have delegatesFocus or a custom focus() method).
5546
+ const descendants = getFocusableElements(el);
5547
+ if (descendants.length > 0) {
5548
+ descendants[0].focus();
5549
+ return;
5550
+ }
5551
+ el.focus();
5552
+ if (document.activeElement === el) {
5553
+ return;
5554
+ }
5533
5555
  }
5534
5556
  }
5535
5557
  // Fallback: try DOM children (non-slotted content)
@@ -5989,7 +6011,7 @@ class AuroDropdown extends AuroElement$1 {
5989
6011
  }
5990
6012
 
5991
6013
  const eventType = event.detail.eventType || "unknown";
5992
- if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown") {
6014
+ if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown" && !this.noFocusRestoreOnClose) {
5993
6015
  this.focusTrigger();
5994
6016
  }
5995
6017
 
@@ -5997,9 +6019,9 @@ class AuroDropdown extends AuroElement$1 {
5997
6019
  // On Tab-driven close (eventType "focusloss"), let focus advance naturally
5998
6020
  // — restoring to the trigger would trap the user on this dropdown, forcing
5999
6021
  // an extra Tab to move on. Escape and outside-click still restore.
6000
- // When noHideOnThisFocusLoss is true, the consumer (e.g. combobox) manages
6022
+ // When noFocusRestoreOnClose is true, the consumer (e.g. combobox) manages
6001
6023
  // its own focus restoration — skip the generic trigger focus to avoid races.
6002
- if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noHideOnThisFocusLoss) {
6024
+ if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noFocusRestoreOnClose) {
6003
6025
  // wait til the bib gets fully closed and rendered
6004
6026
  setTimeout(() => {
6005
6027
  // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).