@aurodesignsystem-dev/auro-formkit 0.0.0-pr1576.4 → 0.0.0-pr1576.6

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 (47) 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 +69 -29
  7. package/components/combobox/demo/getting-started.min.js +69 -29
  8. package/components/combobox/demo/index.min.js +69 -29
  9. package/components/combobox/dist/index.js +56 -29
  10. package/components/combobox/dist/registered.js +56 -29
  11. package/components/counter/demo/customize.min.js +2 -2
  12. package/components/counter/demo/index.min.js +2 -2
  13. package/components/counter/dist/index.js +2 -2
  14. package/components/counter/dist/registered.js +2 -2
  15. package/components/datepicker/demo/customize.min.js +3 -3
  16. package/components/datepicker/demo/index.min.js +3 -3
  17. package/components/datepicker/dist/index.js +3 -3
  18. package/components/datepicker/dist/registered.js +3 -3
  19. package/components/dropdown/demo/customize.min.js +1 -1
  20. package/components/dropdown/demo/getting-started.min.js +1 -1
  21. package/components/dropdown/demo/index.min.js +1 -1
  22. package/components/dropdown/dist/index.js +1 -1
  23. package/components/dropdown/dist/registered.js +1 -1
  24. package/components/form/demo/customize.min.js +79 -39
  25. package/components/form/demo/getting-started.min.js +79 -39
  26. package/components/form/demo/index.min.js +79 -39
  27. package/components/form/demo/registerDemoDeps.min.js +79 -39
  28. package/components/input/demo/customize.min.js +1 -1
  29. package/components/input/demo/getting-started.min.js +1 -1
  30. package/components/input/demo/index.min.js +1 -1
  31. package/components/input/dist/index.js +1 -1
  32. package/components/input/dist/registered.js +1 -1
  33. package/components/menu/demo/index.min.js +13 -0
  34. package/components/menu/dist/index.js +13 -0
  35. package/components/menu/dist/registered.js +13 -0
  36. package/components/radio/demo/customize.min.js +1 -1
  37. package/components/radio/demo/getting-started.min.js +1 -1
  38. package/components/radio/demo/index.min.js +1 -1
  39. package/components/radio/dist/index.js +1 -1
  40. package/components/radio/dist/registered.js +1 -1
  41. package/components/select/demo/customize.min.js +15 -2
  42. package/components/select/demo/getting-started.min.js +15 -2
  43. package/components/select/demo/index.min.js +15 -2
  44. package/components/select/dist/index.js +2 -2
  45. package/components/select/dist/registered.js +2 -2
  46. package/custom-elements.json +1525 -1525
  47. package/package.json +1 -1
@@ -1275,7 +1275,7 @@ class AuroHelpText extends i$2 {
1275
1275
  }
1276
1276
  }
1277
1277
 
1278
- var formkitVersion = '202608041507';
1278
+ var formkitVersion = '202608041716';
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 = '202608041507';
1278
+ var formkitVersion = '202608041716';
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 = '202608041507';
1278
+ var formkitVersion = '202608041716';
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 = '202608041507';
1231
+ var formkitVersion = '202608041716';
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 = '202608041507';
1231
+ var formkitVersion = '202608041716';
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.
@@ -4977,7 +4977,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$3 {
4977
4977
  }
4978
4978
  };
4979
4979
 
4980
- var formkitVersion$2 = '202608041507';
4980
+ var formkitVersion$2 = '202608041716';
4981
4981
 
4982
4982
  let AuroElement$2 = class AuroElement extends i$3 {
4983
4983
  static get properties() {
@@ -18666,7 +18666,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
18666
18666
  }
18667
18667
  };
18668
18668
 
18669
- var formkitVersion$1 = '202608041507';
18669
+ var formkitVersion$1 = '202608041716';
18670
18670
 
18671
18671
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
18672
18672
  // See LICENSE in the project root for license information.
@@ -19822,7 +19822,7 @@ class AuroBibtemplate extends i$3 {
19822
19822
  }
19823
19823
  }
19824
19824
 
19825
- var formkitVersion = '202608041507';
19825
+ var formkitVersion = '202608041716';
19826
19826
 
19827
19827
  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}`;
19828
19828
 
@@ -21628,7 +21628,17 @@ class AuroCombobox extends AuroElement {
21628
21628
  return;
21629
21629
  }
21630
21630
 
21631
- this.value = this.input.value;
21631
+ // Skip this write during a display-value sync: that path sets the input to
21632
+ // the selected option's LABEL, which is not its machine value. When an
21633
+ // option's label differs from its value (and especially when several
21634
+ // options share a value but render distinct labels — AB#1602086), writing
21635
+ // the label back into this.value clobbers the machine value the selection
21636
+ // listener just set (this.value = optionSelected.value), collapsing the
21637
+ // selection. _syncingBibValue still tracks (that mirrors user-typed text
21638
+ // from the fullscreen bib, where value should follow the input).
21639
+ if (!this._syncingDisplayValue) {
21640
+ this.value = this.input.value;
21641
+ }
21632
21642
 
21633
21643
  // Ignore re-entrant input events caused by programmatic value sets.
21634
21644
  if (this._syncingBibValue || this._syncingDisplayValue) {
@@ -21892,33 +21902,50 @@ class AuroCombobox extends AuroElement {
21892
21902
  }
21893
21903
 
21894
21904
  if (this.input.value !== this.value) {
21895
- // Clear menu.value AND menu.optionSelected together. Clearing only
21896
- // menu.value leaves the previously-selected option element pinned
21897
- // as menu.optionSelected; a later auroMenu-selectedOption event
21898
- // would then write its stale .value back into combobox.value
21899
- // (e.g. Tab-after-Backspace re-selecting the prior option).
21900
- if (this.menu.value || this.menu.optionSelected) {
21901
- this.menu.clearSelection();
21902
- }
21905
+ // A fresh user selection leaves the input showing the option's LABEL
21906
+ // while this.value holds its machine value, so input.value !== this.value
21907
+ // is expected whenever label ≠ value. In that case the menu's current
21908
+ // selection is authoritative and when several options share a value it
21909
+ // is the ONLY thing that records WHICH same-value option the user picked
21910
+ // (the menu tracks it by element identity via `_selectedKey`). Clearing
21911
+ // it here drops that key; the ensuing value-only re-resolution then
21912
+ // collapses the selection onto the first same-value option (AB#1602086).
21913
+ // So only treat the divergence as a stale menu when the selected option
21914
+ // does NOT match the new value.
21915
+ const menuSelectionMatchesValue =
21916
+ this.menu.optionSelected &&
21917
+ !Array.isArray(this.menu.optionSelected) &&
21918
+ this.menu.optionSelected.value === this.value;
21919
+
21920
+ if (!menuSelectionMatchesValue) {
21921
+ // Clear menu.value AND menu.optionSelected together. Clearing only
21922
+ // menu.value leaves the previously-selected option element pinned
21923
+ // as menu.optionSelected; a later auroMenu-selectedOption event
21924
+ // would then write its stale .value back into combobox.value
21925
+ // (e.g. Tab-after-Backspace re-selecting the prior option).
21926
+ if (this.menu.value || this.menu.optionSelected) {
21927
+ this.menu.clearSelection();
21928
+ }
21903
21929
 
21904
- if (!this.persistInput) {
21905
- this.syncInputValuesAcrossTriggerAndBib(this.value || '');
21906
- }
21930
+ if (!this.persistInput) {
21931
+ this.syncInputValuesAcrossTriggerAndBib(this.value || '');
21932
+ }
21907
21933
 
21908
- // Programmatic value with no matching option: updateFilter will close
21909
- // the bib silently (see line 648 — no noMatchOption + 0 results
21910
- // hides). Announce so screen-reader users hear the request was
21911
- // dropped. Gated on `input.value !== this.value` so this never fires
21912
- // for user typing — that path always reconciles input.value to
21913
- // this.value before updated() runs.
21914
- if (
21915
- this.value &&
21916
- this.menu &&
21917
- this.menu.options &&
21918
- this.menu.options.length > 0 &&
21919
- !this.menu.options.some((opt) => opt.value === this.value)
21920
- ) {
21921
- announceToScreenReader(this._getAnnouncementRoot(), `No matching option for ${this.value}`);
21934
+ // Programmatic value with no matching option: updateFilter will close
21935
+ // the bib silently (see line 648 — no noMatchOption + 0 results
21936
+ // hides). Announce so screen-reader users hear the request was
21937
+ // dropped. Gated on `input.value !== this.value` so this never fires
21938
+ // for user typing — that path always reconciles input.value to
21939
+ // this.value before updated() runs.
21940
+ if (
21941
+ this.value &&
21942
+ this.menu &&
21943
+ this.menu.options &&
21944
+ this.menu.options.length > 0 &&
21945
+ !this.menu.options.some((opt) => opt.value === this.value)
21946
+ ) {
21947
+ announceToScreenReader(this._getAnnouncementRoot(), `No matching option for ${this.value}`);
21948
+ }
21922
21949
  }
21923
21950
  }
21924
21951
 
@@ -23347,6 +23374,19 @@ class AuroMenu extends AuroElement {
23347
23374
  this.initItems();
23348
23375
  }
23349
23376
 
23377
+ // Recover `_index` from the highlighted option when it has been reset to -1.
23378
+ // In multi-select, deselecting the last remaining option collapses the value
23379
+ // to undefined, and the updated() reconciliation resets `_index = -1` even
23380
+ // though `optionActive` still points at the highlighted option. Without this,
23381
+ // reading `items[-1]` returns undefined and the re-select no-ops until the
23382
+ // highlight is moved away and back. Mirrors auro-combobox's reconcileMenuIndex.
23383
+ if (this._index < 0 && this.optionActive && this.items) {
23384
+ const activeIndex = this.items.indexOf(this.optionActive);
23385
+ if (activeIndex >= 0) {
23386
+ this._index = activeIndex;
23387
+ }
23388
+ }
23389
+
23350
23390
  // Get currently selected menu option based on index
23351
23391
  const option = this.items ? this.items[this._index] : undefined;
23352
23392
 
@@ -4977,7 +4977,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$3 {
4977
4977
  }
4978
4978
  };
4979
4979
 
4980
- var formkitVersion$2 = '202608041507';
4980
+ var formkitVersion$2 = '202608041716';
4981
4981
 
4982
4982
  let AuroElement$2 = class AuroElement extends i$3 {
4983
4983
  static get properties() {
@@ -18666,7 +18666,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
18666
18666
  }
18667
18667
  };
18668
18668
 
18669
- var formkitVersion$1 = '202608041507';
18669
+ var formkitVersion$1 = '202608041716';
18670
18670
 
18671
18671
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
18672
18672
  // See LICENSE in the project root for license information.
@@ -19822,7 +19822,7 @@ class AuroBibtemplate extends i$3 {
19822
19822
  }
19823
19823
  }
19824
19824
 
19825
- var formkitVersion = '202608041507';
19825
+ var formkitVersion = '202608041716';
19826
19826
 
19827
19827
  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}`;
19828
19828
 
@@ -21628,7 +21628,17 @@ class AuroCombobox extends AuroElement {
21628
21628
  return;
21629
21629
  }
21630
21630
 
21631
- this.value = this.input.value;
21631
+ // Skip this write during a display-value sync: that path sets the input to
21632
+ // the selected option's LABEL, which is not its machine value. When an
21633
+ // option's label differs from its value (and especially when several
21634
+ // options share a value but render distinct labels — AB#1602086), writing
21635
+ // the label back into this.value clobbers the machine value the selection
21636
+ // listener just set (this.value = optionSelected.value), collapsing the
21637
+ // selection. _syncingBibValue still tracks (that mirrors user-typed text
21638
+ // from the fullscreen bib, where value should follow the input).
21639
+ if (!this._syncingDisplayValue) {
21640
+ this.value = this.input.value;
21641
+ }
21632
21642
 
21633
21643
  // Ignore re-entrant input events caused by programmatic value sets.
21634
21644
  if (this._syncingBibValue || this._syncingDisplayValue) {
@@ -21892,33 +21902,50 @@ class AuroCombobox extends AuroElement {
21892
21902
  }
21893
21903
 
21894
21904
  if (this.input.value !== this.value) {
21895
- // Clear menu.value AND menu.optionSelected together. Clearing only
21896
- // menu.value leaves the previously-selected option element pinned
21897
- // as menu.optionSelected; a later auroMenu-selectedOption event
21898
- // would then write its stale .value back into combobox.value
21899
- // (e.g. Tab-after-Backspace re-selecting the prior option).
21900
- if (this.menu.value || this.menu.optionSelected) {
21901
- this.menu.clearSelection();
21902
- }
21905
+ // A fresh user selection leaves the input showing the option's LABEL
21906
+ // while this.value holds its machine value, so input.value !== this.value
21907
+ // is expected whenever label ≠ value. In that case the menu's current
21908
+ // selection is authoritative and when several options share a value it
21909
+ // is the ONLY thing that records WHICH same-value option the user picked
21910
+ // (the menu tracks it by element identity via `_selectedKey`). Clearing
21911
+ // it here drops that key; the ensuing value-only re-resolution then
21912
+ // collapses the selection onto the first same-value option (AB#1602086).
21913
+ // So only treat the divergence as a stale menu when the selected option
21914
+ // does NOT match the new value.
21915
+ const menuSelectionMatchesValue =
21916
+ this.menu.optionSelected &&
21917
+ !Array.isArray(this.menu.optionSelected) &&
21918
+ this.menu.optionSelected.value === this.value;
21919
+
21920
+ if (!menuSelectionMatchesValue) {
21921
+ // Clear menu.value AND menu.optionSelected together. Clearing only
21922
+ // menu.value leaves the previously-selected option element pinned
21923
+ // as menu.optionSelected; a later auroMenu-selectedOption event
21924
+ // would then write its stale .value back into combobox.value
21925
+ // (e.g. Tab-after-Backspace re-selecting the prior option).
21926
+ if (this.menu.value || this.menu.optionSelected) {
21927
+ this.menu.clearSelection();
21928
+ }
21903
21929
 
21904
- if (!this.persistInput) {
21905
- this.syncInputValuesAcrossTriggerAndBib(this.value || '');
21906
- }
21930
+ if (!this.persistInput) {
21931
+ this.syncInputValuesAcrossTriggerAndBib(this.value || '');
21932
+ }
21907
21933
 
21908
- // Programmatic value with no matching option: updateFilter will close
21909
- // the bib silently (see line 648 — no noMatchOption + 0 results
21910
- // hides). Announce so screen-reader users hear the request was
21911
- // dropped. Gated on `input.value !== this.value` so this never fires
21912
- // for user typing — that path always reconciles input.value to
21913
- // this.value before updated() runs.
21914
- if (
21915
- this.value &&
21916
- this.menu &&
21917
- this.menu.options &&
21918
- this.menu.options.length > 0 &&
21919
- !this.menu.options.some((opt) => opt.value === this.value)
21920
- ) {
21921
- announceToScreenReader(this._getAnnouncementRoot(), `No matching option for ${this.value}`);
21934
+ // Programmatic value with no matching option: updateFilter will close
21935
+ // the bib silently (see line 648 — no noMatchOption + 0 results
21936
+ // hides). Announce so screen-reader users hear the request was
21937
+ // dropped. Gated on `input.value !== this.value` so this never fires
21938
+ // for user typing — that path always reconciles input.value to
21939
+ // this.value before updated() runs.
21940
+ if (
21941
+ this.value &&
21942
+ this.menu &&
21943
+ this.menu.options &&
21944
+ this.menu.options.length > 0 &&
21945
+ !this.menu.options.some((opt) => opt.value === this.value)
21946
+ ) {
21947
+ announceToScreenReader(this._getAnnouncementRoot(), `No matching option for ${this.value}`);
21948
+ }
21922
21949
  }
21923
21950
  }
21924
21951
 
@@ -23347,6 +23374,19 @@ class AuroMenu extends AuroElement {
23347
23374
  this.initItems();
23348
23375
  }
23349
23376
 
23377
+ // Recover `_index` from the highlighted option when it has been reset to -1.
23378
+ // In multi-select, deselecting the last remaining option collapses the value
23379
+ // to undefined, and the updated() reconciliation resets `_index = -1` even
23380
+ // though `optionActive` still points at the highlighted option. Without this,
23381
+ // reading `items[-1]` returns undefined and the re-select no-ops until the
23382
+ // highlight is moved away and back. Mirrors auro-combobox's reconcileMenuIndex.
23383
+ if (this._index < 0 && this.optionActive && this.items) {
23384
+ const activeIndex = this.items.indexOf(this.optionActive);
23385
+ if (activeIndex >= 0) {
23386
+ this._index = activeIndex;
23387
+ }
23388
+ }
23389
+
23350
23390
  // Get currently selected menu option based on index
23351
23391
  const option = this.items ? this.items[this._index] : undefined;
23352
23392
 
@@ -4992,7 +4992,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$3 {
4992
4992
  }
4993
4993
  };
4994
4994
 
4995
- var formkitVersion$2 = '202608041507';
4995
+ var formkitVersion$2 = '202608041716';
4996
4996
 
4997
4997
  let AuroElement$2 = class AuroElement extends i$3 {
4998
4998
  static get properties() {
@@ -18681,7 +18681,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
18681
18681
  }
18682
18682
  };
18683
18683
 
18684
- var formkitVersion$1 = '202608041507';
18684
+ var formkitVersion$1 = '202608041716';
18685
18685
 
18686
18686
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
18687
18687
  // See LICENSE in the project root for license information.
@@ -19837,7 +19837,7 @@ class AuroBibtemplate extends i$3 {
19837
19837
  }
19838
19838
  }
19839
19839
 
19840
- var formkitVersion = '202608041507';
19840
+ var formkitVersion = '202608041716';
19841
19841
 
19842
19842
  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}`;
19843
19843
 
@@ -21643,7 +21643,17 @@ class AuroCombobox extends AuroElement {
21643
21643
  return;
21644
21644
  }
21645
21645
 
21646
- this.value = this.input.value;
21646
+ // Skip this write during a display-value sync: that path sets the input to
21647
+ // the selected option's LABEL, which is not its machine value. When an
21648
+ // option's label differs from its value (and especially when several
21649
+ // options share a value but render distinct labels — AB#1602086), writing
21650
+ // the label back into this.value clobbers the machine value the selection
21651
+ // listener just set (this.value = optionSelected.value), collapsing the
21652
+ // selection. _syncingBibValue still tracks (that mirrors user-typed text
21653
+ // from the fullscreen bib, where value should follow the input).
21654
+ if (!this._syncingDisplayValue) {
21655
+ this.value = this.input.value;
21656
+ }
21647
21657
 
21648
21658
  // Ignore re-entrant input events caused by programmatic value sets.
21649
21659
  if (this._syncingBibValue || this._syncingDisplayValue) {
@@ -21907,33 +21917,50 @@ class AuroCombobox extends AuroElement {
21907
21917
  }
21908
21918
 
21909
21919
  if (this.input.value !== this.value) {
21910
- // Clear menu.value AND menu.optionSelected together. Clearing only
21911
- // menu.value leaves the previously-selected option element pinned
21912
- // as menu.optionSelected; a later auroMenu-selectedOption event
21913
- // would then write its stale .value back into combobox.value
21914
- // (e.g. Tab-after-Backspace re-selecting the prior option).
21915
- if (this.menu.value || this.menu.optionSelected) {
21916
- this.menu.clearSelection();
21917
- }
21920
+ // A fresh user selection leaves the input showing the option's LABEL
21921
+ // while this.value holds its machine value, so input.value !== this.value
21922
+ // is expected whenever label ≠ value. In that case the menu's current
21923
+ // selection is authoritative and when several options share a value it
21924
+ // is the ONLY thing that records WHICH same-value option the user picked
21925
+ // (the menu tracks it by element identity via `_selectedKey`). Clearing
21926
+ // it here drops that key; the ensuing value-only re-resolution then
21927
+ // collapses the selection onto the first same-value option (AB#1602086).
21928
+ // So only treat the divergence as a stale menu when the selected option
21929
+ // does NOT match the new value.
21930
+ const menuSelectionMatchesValue =
21931
+ this.menu.optionSelected &&
21932
+ !Array.isArray(this.menu.optionSelected) &&
21933
+ this.menu.optionSelected.value === this.value;
21934
+
21935
+ if (!menuSelectionMatchesValue) {
21936
+ // Clear menu.value AND menu.optionSelected together. Clearing only
21937
+ // menu.value leaves the previously-selected option element pinned
21938
+ // as menu.optionSelected; a later auroMenu-selectedOption event
21939
+ // would then write its stale .value back into combobox.value
21940
+ // (e.g. Tab-after-Backspace re-selecting the prior option).
21941
+ if (this.menu.value || this.menu.optionSelected) {
21942
+ this.menu.clearSelection();
21943
+ }
21918
21944
 
21919
- if (!this.persistInput) {
21920
- this.syncInputValuesAcrossTriggerAndBib(this.value || '');
21921
- }
21945
+ if (!this.persistInput) {
21946
+ this.syncInputValuesAcrossTriggerAndBib(this.value || '');
21947
+ }
21922
21948
 
21923
- // Programmatic value with no matching option: updateFilter will close
21924
- // the bib silently (see line 648 — no noMatchOption + 0 results
21925
- // hides). Announce so screen-reader users hear the request was
21926
- // dropped. Gated on `input.value !== this.value` so this never fires
21927
- // for user typing — that path always reconciles input.value to
21928
- // this.value before updated() runs.
21929
- if (
21930
- this.value &&
21931
- this.menu &&
21932
- this.menu.options &&
21933
- this.menu.options.length > 0 &&
21934
- !this.menu.options.some((opt) => opt.value === this.value)
21935
- ) {
21936
- announceToScreenReader(this._getAnnouncementRoot(), `No matching option for ${this.value}`);
21949
+ // Programmatic value with no matching option: updateFilter will close
21950
+ // the bib silently (see line 648 — no noMatchOption + 0 results
21951
+ // hides). Announce so screen-reader users hear the request was
21952
+ // dropped. Gated on `input.value !== this.value` so this never fires
21953
+ // for user typing — that path always reconciles input.value to
21954
+ // this.value before updated() runs.
21955
+ if (
21956
+ this.value &&
21957
+ this.menu &&
21958
+ this.menu.options &&
21959
+ this.menu.options.length > 0 &&
21960
+ !this.menu.options.some((opt) => opt.value === this.value)
21961
+ ) {
21962
+ announceToScreenReader(this._getAnnouncementRoot(), `No matching option for ${this.value}`);
21963
+ }
21937
21964
  }
21938
21965
  }
21939
21966
 
@@ -23362,6 +23389,19 @@ class AuroMenu extends AuroElement {
23362
23389
  this.initItems();
23363
23390
  }
23364
23391
 
23392
+ // Recover `_index` from the highlighted option when it has been reset to -1.
23393
+ // In multi-select, deselecting the last remaining option collapses the value
23394
+ // to undefined, and the updated() reconciliation resets `_index = -1` even
23395
+ // though `optionActive` still points at the highlighted option. Without this,
23396
+ // reading `items[-1]` returns undefined and the re-select no-ops until the
23397
+ // highlight is moved away and back. Mirrors auro-combobox's reconcileMenuIndex.
23398
+ if (this._index < 0 && this.optionActive && this.items) {
23399
+ const activeIndex = this.items.indexOf(this.optionActive);
23400
+ if (activeIndex >= 0) {
23401
+ this._index = activeIndex;
23402
+ }
23403
+ }
23404
+
23365
23405
  // Get currently selected menu option based on index
23366
23406
  const option = this.items ? this.items[this._index] : undefined;
23367
23407
 
@@ -4910,7 +4910,7 @@ let AuroHelpText$2 = class AuroHelpText extends LitElement {
4910
4910
  }
4911
4911
  };
4912
4912
 
4913
- var formkitVersion$2 = '202608041507';
4913
+ var formkitVersion$2 = '202608041716';
4914
4914
 
4915
4915
  let AuroElement$2 = class AuroElement extends LitElement {
4916
4916
  static get properties() {
@@ -18592,7 +18592,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
18592
18592
  }
18593
18593
  };
18594
18594
 
18595
- var formkitVersion$1 = '202608041507';
18595
+ var formkitVersion$1 = '202608041716';
18596
18596
 
18597
18597
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
18598
18598
  // See LICENSE in the project root for license information.
@@ -19748,7 +19748,7 @@ class AuroBibtemplate extends LitElement {
19748
19748
  }
19749
19749
  }
19750
19750
 
19751
- var formkitVersion = '202608041507';
19751
+ var formkitVersion = '202608041716';
19752
19752
 
19753
19753
  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}`;
19754
19754
 
@@ -21554,7 +21554,17 @@ class AuroCombobox extends AuroElement {
21554
21554
  return;
21555
21555
  }
21556
21556
 
21557
- this.value = this.input.value;
21557
+ // Skip this write during a display-value sync: that path sets the input to
21558
+ // the selected option's LABEL, which is not its machine value. When an
21559
+ // option's label differs from its value (and especially when several
21560
+ // options share a value but render distinct labels — AB#1602086), writing
21561
+ // the label back into this.value clobbers the machine value the selection
21562
+ // listener just set (this.value = optionSelected.value), collapsing the
21563
+ // selection. _syncingBibValue still tracks (that mirrors user-typed text
21564
+ // from the fullscreen bib, where value should follow the input).
21565
+ if (!this._syncingDisplayValue) {
21566
+ this.value = this.input.value;
21567
+ }
21558
21568
 
21559
21569
  // Ignore re-entrant input events caused by programmatic value sets.
21560
21570
  if (this._syncingBibValue || this._syncingDisplayValue) {
@@ -21818,33 +21828,50 @@ class AuroCombobox extends AuroElement {
21818
21828
  }
21819
21829
 
21820
21830
  if (this.input.value !== this.value) {
21821
- // Clear menu.value AND menu.optionSelected together. Clearing only
21822
- // menu.value leaves the previously-selected option element pinned
21823
- // as menu.optionSelected; a later auroMenu-selectedOption event
21824
- // would then write its stale .value back into combobox.value
21825
- // (e.g. Tab-after-Backspace re-selecting the prior option).
21826
- if (this.menu.value || this.menu.optionSelected) {
21827
- this.menu.clearSelection();
21828
- }
21831
+ // A fresh user selection leaves the input showing the option's LABEL
21832
+ // while this.value holds its machine value, so input.value !== this.value
21833
+ // is expected whenever label ≠ value. In that case the menu's current
21834
+ // selection is authoritative and when several options share a value it
21835
+ // is the ONLY thing that records WHICH same-value option the user picked
21836
+ // (the menu tracks it by element identity via `_selectedKey`). Clearing
21837
+ // it here drops that key; the ensuing value-only re-resolution then
21838
+ // collapses the selection onto the first same-value option (AB#1602086).
21839
+ // So only treat the divergence as a stale menu when the selected option
21840
+ // does NOT match the new value.
21841
+ const menuSelectionMatchesValue =
21842
+ this.menu.optionSelected &&
21843
+ !Array.isArray(this.menu.optionSelected) &&
21844
+ this.menu.optionSelected.value === this.value;
21845
+
21846
+ if (!menuSelectionMatchesValue) {
21847
+ // Clear menu.value AND menu.optionSelected together. Clearing only
21848
+ // menu.value leaves the previously-selected option element pinned
21849
+ // as menu.optionSelected; a later auroMenu-selectedOption event
21850
+ // would then write its stale .value back into combobox.value
21851
+ // (e.g. Tab-after-Backspace re-selecting the prior option).
21852
+ if (this.menu.value || this.menu.optionSelected) {
21853
+ this.menu.clearSelection();
21854
+ }
21829
21855
 
21830
- if (!this.persistInput) {
21831
- this.syncInputValuesAcrossTriggerAndBib(this.value || '');
21832
- }
21856
+ if (!this.persistInput) {
21857
+ this.syncInputValuesAcrossTriggerAndBib(this.value || '');
21858
+ }
21833
21859
 
21834
- // Programmatic value with no matching option: updateFilter will close
21835
- // the bib silently (see line 648 — no noMatchOption + 0 results
21836
- // hides). Announce so screen-reader users hear the request was
21837
- // dropped. Gated on `input.value !== this.value` so this never fires
21838
- // for user typing — that path always reconciles input.value to
21839
- // this.value before updated() runs.
21840
- if (
21841
- this.value &&
21842
- this.menu &&
21843
- this.menu.options &&
21844
- this.menu.options.length > 0 &&
21845
- !this.menu.options.some((opt) => opt.value === this.value)
21846
- ) {
21847
- announceToScreenReader(this._getAnnouncementRoot(), `No matching option for ${this.value}`);
21860
+ // Programmatic value with no matching option: updateFilter will close
21861
+ // the bib silently (see line 648 — no noMatchOption + 0 results
21862
+ // hides). Announce so screen-reader users hear the request was
21863
+ // dropped. Gated on `input.value !== this.value` so this never fires
21864
+ // for user typing — that path always reconciles input.value to
21865
+ // this.value before updated() runs.
21866
+ if (
21867
+ this.value &&
21868
+ this.menu &&
21869
+ this.menu.options &&
21870
+ this.menu.options.length > 0 &&
21871
+ !this.menu.options.some((opt) => opt.value === this.value)
21872
+ ) {
21873
+ announceToScreenReader(this._getAnnouncementRoot(), `No matching option for ${this.value}`);
21874
+ }
21848
21875
  }
21849
21876
  }
21850
21877