@aurodesignsystem-dev/auro-formkit 0.0.0-pr1507.0 → 0.0.0-pr1508.1

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 (148) hide show
  1. package/components/bibtemplate/dist/index.js +1 -1
  2. package/components/bibtemplate/dist/registered.js +1 -1
  3. package/components/checkbox/demo/customize.html +1 -2
  4. package/components/checkbox/demo/customize.min.js +8 -6
  5. package/components/checkbox/demo/getting-started.min.js +8 -6
  6. package/components/checkbox/demo/index.min.js +8 -6
  7. package/components/checkbox/dist/index.js +8 -6
  8. package/components/checkbox/dist/registered.js +8 -6
  9. package/components/combobox/demo/customize.html +1 -2
  10. package/components/combobox/demo/customize.md +105 -137
  11. package/components/combobox/demo/customize.min.js +506 -568
  12. package/components/combobox/demo/getting-started.min.js +506 -564
  13. package/components/combobox/demo/index.min.js +506 -564
  14. package/components/combobox/demo/keyboard-behavior.md +2 -142
  15. package/components/combobox/demo/why-combobox.md +1 -1
  16. package/components/combobox/dist/auro-combobox.d.ts +30 -14
  17. package/components/combobox/dist/index.js +505 -563
  18. package/components/combobox/dist/registered.js +505 -563
  19. package/components/counter/demo/customize.min.js +26 -8
  20. package/components/counter/demo/index.min.js +26 -8
  21. package/components/counter/dist/index.js +26 -8
  22. package/components/counter/dist/registered.js +26 -8
  23. package/components/datepicker/demo/accessibility.md +2 -1
  24. package/components/datepicker/demo/api.md +65 -62
  25. package/components/datepicker/demo/customize.md +150 -39
  26. package/components/datepicker/demo/customize.min.js +988 -500
  27. package/components/datepicker/demo/index.min.js +988 -482
  28. package/components/datepicker/dist/{src/auro-calendar-cell.d.ts → auro-calendar-cell.d.ts} +20 -3
  29. package/components/datepicker/dist/{src/auro-calendar.d.ts → auro-calendar.d.ts} +121 -7
  30. package/components/datepicker/dist/{src/auro-datepicker.d.ts → auro-datepicker.d.ts} +80 -5
  31. package/components/datepicker/dist/blackoutUtils.d.ts +43 -0
  32. package/components/datepicker/dist/index.js +988 -482
  33. package/components/datepicker/dist/registered.js +988 -482
  34. package/components/dropdown/demo/customize.min.js +10 -1
  35. package/components/dropdown/demo/getting-started.min.js +10 -1
  36. package/components/dropdown/demo/index.min.js +10 -1
  37. package/components/dropdown/dist/auro-dropdown.d.ts +1 -0
  38. package/components/dropdown/dist/index.js +10 -1
  39. package/components/dropdown/dist/registered.js +10 -1
  40. package/components/form/demo/customize.html +6 -6
  41. package/components/form/demo/customize.md +203 -51
  42. package/components/form/demo/customize.min.js +2357 -1419
  43. package/components/form/demo/getting-started.min.js +2285 -1419
  44. package/components/form/demo/index.min.js +2285 -1419
  45. package/components/form/demo/registerDemoDeps.min.js +1922 -1382
  46. package/components/form/dist/auro-form.d.ts +122 -4
  47. package/components/form/dist/index.js +363 -37
  48. package/components/form/dist/registered.js +363 -37
  49. package/components/input/demo/api.md +5 -5
  50. package/components/input/demo/customize.html +1 -2
  51. package/components/input/demo/customize.md +62 -61
  52. package/components/input/demo/customize.min.js +177 -241
  53. package/components/input/demo/getting-started.min.js +177 -241
  54. package/components/input/demo/index.min.js +177 -241
  55. package/components/input/dist/base-input.d.ts +34 -93
  56. package/components/input/dist/index.js +190 -242
  57. package/components/input/dist/registered.js +177 -241
  58. package/components/radio/demo/customize.min.js +8 -6
  59. package/components/radio/demo/getting-started.min.js +8 -6
  60. package/components/radio/demo/index.min.js +8 -6
  61. package/components/radio/dist/index.js +8 -6
  62. package/components/radio/dist/registered.js +8 -6
  63. package/components/select/demo/customize.html +1 -2
  64. package/components/select/demo/customize.md +86 -0
  65. package/components/select/demo/customize.min.js +202 -68
  66. package/components/select/demo/getting-started.min.js +204 -115
  67. package/components/select/demo/index.min.js +202 -68
  68. package/components/select/demo/keyboard-behavior.md +18 -4
  69. package/components/select/dist/auro-select.d.ts +20 -8
  70. package/components/select/dist/index.js +202 -68
  71. package/components/select/dist/registered.js +202 -68
  72. package/custom-elements.json +1035 -604
  73. package/package.json +6 -2
  74. package/components/checkbox/demo/customize.js +0 -22
  75. package/components/checkbox/demo/demo-support.js +0 -1
  76. package/components/checkbox/demo/getting-started.js +0 -22
  77. package/components/checkbox/demo/index.js +0 -8
  78. package/components/checkbox/demo/styles.scss +0 -1
  79. package/components/combobox/demo/customize.js +0 -24
  80. package/components/combobox/demo/demo-support.js +0 -1
  81. package/components/combobox/demo/getting-started.js +0 -21
  82. package/components/combobox/demo/index.js +0 -23
  83. package/components/combobox/demo/styles.scss +0 -1
  84. package/components/counter/demo/customize.js +0 -21
  85. package/components/counter/demo/demo-support.js +0 -1
  86. package/components/counter/demo/index.js +0 -21
  87. package/components/counter/demo/styles.scss +0 -1
  88. package/components/datepicker/demo/customize.js +0 -19
  89. package/components/datepicker/demo/demo-support.js +0 -1
  90. package/components/datepicker/demo/index.js +0 -23
  91. package/components/datepicker/demo/styles.scss +0 -1
  92. package/components/dropdown/demo/customize.js +0 -9
  93. package/components/dropdown/demo/demo-support.js +0 -1
  94. package/components/dropdown/demo/getting-started.js +0 -9
  95. package/components/dropdown/demo/index.js +0 -16
  96. package/components/dropdown/demo/styles.scss +0 -1
  97. package/components/form/demo/customize.js +0 -9
  98. package/components/form/demo/demo-support.js +0 -1
  99. package/components/form/demo/getting-started.js +0 -9
  100. package/components/form/demo/index.js +0 -5
  101. package/components/form/demo/registerDemoDeps.js +0 -23
  102. package/components/form/demo/styles.scss +0 -1
  103. package/components/input/demo/customize.js +0 -25
  104. package/components/input/demo/demo-support.js +0 -1
  105. package/components/input/demo/getting-started.js +0 -8
  106. package/components/input/demo/index.js +0 -8
  107. package/components/input/demo/styles.css +0 -974
  108. package/components/input/demo/styles.scss +0 -1
  109. package/components/menu/demo/demo-support.js +0 -1
  110. package/components/menu/demo/index.js +0 -25
  111. package/components/menu/demo/styles.scss +0 -1
  112. package/components/radio/demo/customize.js +0 -22
  113. package/components/radio/demo/demo-support.js +0 -1
  114. package/components/radio/demo/getting-started.js +0 -24
  115. package/components/radio/demo/index.js +0 -8
  116. package/components/radio/demo/styles.scss +0 -1
  117. package/components/select/demo/customize.js +0 -11
  118. package/components/select/demo/demo-support.js +0 -1
  119. package/components/select/demo/getting-started.js +0 -26
  120. package/components/select/demo/index.js +0 -11
  121. package/components/select/demo/styles.scss +0 -1
  122. /package/components/datepicker/dist/{src/auro-calendar-month.d.ts → auro-calendar-month.d.ts} +0 -0
  123. /package/components/datepicker/dist/{src/buttonVersion.d.ts → buttonVersion.d.ts} +0 -0
  124. /package/components/datepicker/dist/{src/datepickerKeyboardStrategy.d.ts → datepickerKeyboardStrategy.d.ts} +0 -0
  125. /package/components/datepicker/dist/{src/iconVersion.d.ts → iconVersion.d.ts} +0 -0
  126. /package/components/datepicker/dist/{src/index.d.ts → index.d.ts} +0 -0
  127. /package/components/datepicker/dist/{src/popoverVersion.d.ts → popoverVersion.d.ts} +0 -0
  128. /package/components/datepicker/dist/{src/styles → styles}/classic/color-css.d.ts +0 -0
  129. /package/components/datepicker/dist/{src/styles → styles}/classic/style-css.d.ts +0 -0
  130. /package/components/datepicker/dist/{src/styles → styles}/color-calendar-css.d.ts +0 -0
  131. /package/components/datepicker/dist/{src/styles → styles}/color-cell-css.d.ts +0 -0
  132. /package/components/datepicker/dist/{src/styles → styles}/color-css.d.ts +0 -0
  133. /package/components/datepicker/dist/{src/styles → styles}/color-month-css.d.ts +0 -0
  134. /package/components/datepicker/dist/{src/styles → styles}/shapeSize-css.d.ts +0 -0
  135. /package/components/datepicker/dist/{src/styles → styles}/snowflake/color-css.d.ts +0 -0
  136. /package/components/datepicker/dist/{src/styles → styles}/snowflake/style-css.d.ts +0 -0
  137. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-cell-css.d.ts +0 -0
  138. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-css.d.ts +0 -0
  139. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-month-css.d.ts +0 -0
  140. /package/components/datepicker/dist/{src/styles → styles}/style-css.d.ts +0 -0
  141. /package/components/datepicker/dist/{src/styles → styles}/tokens-css.d.ts +0 -0
  142. /package/components/datepicker/dist/{src/utilities.d.ts → utilities.d.ts} +0 -0
  143. /package/components/datepicker/dist/{src/utilitiesCalendar.d.ts → utilitiesCalendar.d.ts} +0 -0
  144. /package/components/datepicker/dist/{src/utilitiesCalendarRender.d.ts → utilitiesCalendarRender.d.ts} +0 -0
  145. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/day.d.ts +0 -0
  146. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker-calendar.d.ts +0 -0
  147. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker-cell.d.ts +0 -0
  148. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker.d.ts +0 -0
@@ -553,15 +553,17 @@ class AuroFormValidation {
553
553
  );
554
554
  }
555
555
 
556
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
557
- if (this.auroInputElements?.length === 2) {
558
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
556
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
557
+
558
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
559
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
560
+ // field (datepicker is the intended consumer — start/end are independently required).
561
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
562
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
559
563
  hasValue = false;
560
564
  }
561
565
  }
562
566
 
563
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
564
-
565
567
  if (isCombobox) {
566
568
 
567
569
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -959,19 +961,28 @@ const selectKeyboardStrategy = {
959
961
  },
960
962
 
961
963
  End(component, evt, ctx) {
962
- if (!ctx.isExpanded) {
963
- return;
964
- }
965
964
  evt.preventDefault();
966
965
  evt.stopPropagation();
967
966
  // `pop()` is safe here: getEnabledOptions returns a fresh filtered array.
968
967
  const lastOption = getEnabledOptions(component.menu).pop();
969
- if (lastOption) {
970
- component.menu.updateActiveOption(lastOption);
968
+ if (!lastOption) {
969
+ return;
970
+ }
971
+ // Pre-stash before show() so the auroDropdown-toggled handler's
972
+ // `!optionActive` guard short-circuits the firstActive/selected fallback —
973
+ // otherwise show() synchronously fires the handler and writes
974
+ // aria-activedescendant once before we overwrite it.
975
+ component.menu.updateActiveOption(lastOption);
976
+ if (!ctx.isExpanded) {
977
+ component.dropdown.show();
971
978
  }
972
979
  },
973
980
 
974
981
  Enter(component, evt, ctx) {
982
+ // Prevent the keypress from bubbling to parent containers (e.g., forms)
983
+ // which could interpret Enter as a submit. Matches APG select-only combobox
984
+ // and native <select> behavior: Enter opens the listbox when closed, selects
985
+ // the active option when open — it does not submit a parent form.
975
986
  evt.preventDefault();
976
987
  evt.stopPropagation();
977
988
  if (!ctx.isExpanded) {
@@ -982,14 +993,16 @@ const selectKeyboardStrategy = {
982
993
  },
983
994
 
984
995
  Home(component, evt, ctx) {
985
- if (!ctx.isExpanded) {
986
- return;
987
- }
988
996
  evt.preventDefault();
989
997
  evt.stopPropagation();
990
998
  const [firstOption] = getEnabledOptions(component.menu);
991
- if (firstOption) {
992
- component.menu.updateActiveOption(firstOption);
999
+ if (!firstOption) {
1000
+ return;
1001
+ }
1002
+ // See End() for why this must run before show().
1003
+ component.menu.updateActiveOption(firstOption);
1004
+ if (!ctx.isExpanded) {
1005
+ component.dropdown.show();
993
1006
  }
994
1007
  },
995
1008
 
@@ -4961,7 +4974,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
4961
4974
  }
4962
4975
  };
4963
4976
 
4964
- var formkitVersion$1 = '202606192121';
4977
+ var formkitVersion$1 = '202607010100';
4965
4978
 
4966
4979
  class AuroElement extends i$2 {
4967
4980
  static get properties() {
@@ -5912,6 +5925,14 @@ class AuroDropdown extends AuroElement {
5912
5925
  };
5913
5926
  this.addEventListener('keydown', this._bibTabHandler);
5914
5927
 
5928
+ // Suppress AuroFloatingUI's auto-hide-on-focus-loss while the
5929
+ // desktopModal trap owns focus management. Without this, the very
5930
+ // first focus move into the bib (from the RAF below) triggers
5931
+ // handleFocusLoss → hideBib, tearing down the trap before the
5932
+ // user can press Tab.
5933
+ this._priorNoHideOnFocusLoss = this.noHideOnThisFocusLoss;
5934
+ this.noHideOnThisFocusLoss = true;
5935
+
5915
5936
  // Move initial focus into the bib content, matching FocusTrap behavior
5916
5937
  requestAnimationFrame(() => {
5917
5938
  const focusables = getFocusableElements(this.bibContent);
@@ -6225,6 +6246,7 @@ class AuroDropdown extends AuroElement {
6225
6246
  role="${o(this.triggerContentFocusable ? undefined : this.a11yRole)}"
6226
6247
  aria-expanded="${o(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
6227
6248
  aria-controls="${o(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
6249
+ aria-haspopup="${o(this.a11yRole === 'combobox' && !this.triggerContentFocusable ? 'listbox' : undefined)}"
6228
6250
  aria-labelledby="${o(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
6229
6251
  aria-disabled="${o(this.disabled ? 'true' : undefined)}"
6230
6252
  @focusin="${this.handleFocusin}"
@@ -6351,7 +6373,7 @@ class AuroDropdown extends AuroElement {
6351
6373
 
6352
6374
  var colorCss$3 = i$5`#headerContainer{box-shadow:var(--ds-auro-dropdownbib-header-boxshadow-color)}#footerContainer{background-color:var(--ds-auro-dropdownbib-footer-container-color)}`;
6353
6375
 
6354
- var styleCss$4 = i$5`#bibTemplate{display:flex;overflow:hidden;height:100%;max-height:100%;flex-direction:column}#headerContainer{display:flex;flex-direction:column;padding:var(--ds-size-200, 1rem);padding-top:var(--ds-size-400, 2rem);padding-bottom:0}#headerContainer .titleRow{display:flex;flex-direction:row;justify-content:space-between;gap:var(--ds-size-100, 0.5rem)}#headerContainer .header{max-width:calc(100vw - var(--ds-size-900, 4.5rem));padding-top:var(--ds-size-200, 1rem)}#headerContainer .subheader{width:100%}#closeButton [auro-icon]{--ds-auro-icon-size: var(--ds-size-500, 2.5rem)}#bodyContainer{position:relative;overflow:auto;flex:1 1 100%}:host([isfullscreen]) #bibTemplate{max-height:100dvh}:host([isfullscreen]) #bodyContainer{margin-top:var(--ds-size-100, 0.5rem)}#footerContainer{position:absolute;right:0;bottom:0;left:0;padding:var(--ds-size-200, 1rem)}`;
6376
+ var styleCss$4 = i$5`#bibTemplate{display:flex;overflow:hidden;height:100%;max-height:100%;flex-direction:column}#headerContainer{display:flex;flex-direction:column;padding:var(--ds-size-200, 1rem);padding-top:var(--ds-size-400, 2rem);padding-bottom:0}#headerContainer .titleRow{display:flex;flex-direction:row;justify-content:space-between;gap:var(--ds-size-100, 0.5rem)}#headerContainer .header{max-width:calc(100vw - var(--ds-size-900, 4.5rem));padding-top:var(--ds-size-200, 1rem)}#headerContainer .subheader{width:100%}#closeButton [auro-icon]{--ds-auro-icon-size: var(--ds-size-500, 2.5rem)}#bodyContainer{position:relative;overflow:auto;flex:1}:host([isfullscreen]) #bibTemplate{max-height:100dvh}:host([isfullscreen]) #bodyContainer{margin-top:var(--ds-size-100, 0.5rem)}#footerContainer{padding:var(--ds-size-200, 1rem)}`;
6355
6377
 
6356
6378
  var tokenCss = i$5`:host{--ds-auro-dropdownbib-header-boxshadow-color: var(--ds-elevation-200, 0px 0px 10px rgba(0, 0, 0, 0.15));--ds-auro-dropdownbib-footer-container-color: var(--ds-basic-color-surface-default, #ffffff)}`;
6357
6379
 
@@ -6974,7 +6996,7 @@ class AuroHelpText extends i$2 {
6974
6996
  }
6975
6997
  }
6976
6998
 
6977
- var formkitVersion = '202606192121';
6999
+ var formkitVersion = '202607010100';
6978
7000
 
6979
7001
  var styleCss$2 = i$5`.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}.body-default{font-size:var(--wcss-body-default-font-size, 1rem);font-weight:var(--wcss-body-default-weight, );line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default,.body-default-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-default-emphasized{font-size:var(--wcss-body-default-emphasized-font-size, 1rem);font-weight:var(--wcss-body-default-emphasized-weight, );line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.body-lg{font-size:var(--wcss-body-lg-font-size, 1.125rem);font-weight:var(--wcss-body-lg-weight, );line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg,.body-lg-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-lg-emphasized{font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);font-weight:var(--wcss-body-lg-emphasized-weight, );line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{font-size:var(--wcss-body-sm-font-size, 0.875rem);font-weight:var(--wcss-body-sm-weight, );line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm,.body-sm-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-sm-emphasized{font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);font-weight:var(--wcss-body-sm-emphasized-weight, );line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.body-xs{font-size:var(--wcss-body-xs-font-size, 0.75rem);font-weight:var(--wcss-body-xs-weight, );line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs,.body-xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-xs-emphasized{font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);font-weight:var(--wcss-body-xs-emphasized-weight, );line-height:var(--wcss-body-xs-emphasized-line-height, 1rem)}.body-2xs{font-size:var(--wcss-body-2xs-font-size, 0.625rem);font-weight:var(--wcss-body-2xs-weight, );line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs,.body-2xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-2xs-emphasized{font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);font-weight:var(--wcss-body-2xs-emphasized-weight, );line-height:var(--wcss-body-2xs-emphasized-line-height, 0.875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));font-weight:var(--wcss-display-2xl-weight, 300);letter-spacing:var(--wcss-display-2xl-letter-spacing, 0);line-height:var(--wcss-display-2xl-line-height, 1.3)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));font-weight:var(--wcss-display-xl-weight, 300);letter-spacing:var(--wcss-display-xl-letter-spacing, 0);line-height:var(--wcss-display-xl-line-height, 1.3)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));font-weight:var(--wcss-display-lg-weight, 300);letter-spacing:var(--wcss-display-lg-letter-spacing, 0);line-height:var(--wcss-display-lg-line-height, 1.3)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));font-weight:var(--wcss-display-md-weight, 300);letter-spacing:var(--wcss-display-md-letter-spacing, 0);line-height:var(--wcss-display-md-line-height, 1.3)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));font-weight:var(--wcss-display-sm-weight, 300);letter-spacing:var(--wcss-display-sm-letter-spacing, 0);line-height:var(--wcss-display-sm-line-height, 1.3)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));font-weight:var(--wcss-display-xs-weight, 300);letter-spacing:var(--wcss-display-xs-letter-spacing, 0);line-height:var(--wcss-display-xs-line-height, 1.3)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));font-weight:var(--wcss-heading-xl-weight, 300);letter-spacing:var(--wcss-heading-xl-letter-spacing, 0);line-height:var(--wcss-heading-xl-line-height, 1.3)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));font-weight:var(--wcss-heading-lg-weight, 300);letter-spacing:var(--wcss-heading-lg-letter-spacing, 0);line-height:var(--wcss-heading-lg-line-height, 1.3)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));font-weight:var(--wcss-heading-md-weight, 300);letter-spacing:var(--wcss-heading-md-letter-spacing, 0);line-height:var(--wcss-heading-md-line-height, 1.3)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));font-weight:var(--wcss-heading-sm-weight, 300);letter-spacing:var(--wcss-heading-sm-letter-spacing, 0);line-height:var(--wcss-heading-sm-line-height, 1.3)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));font-weight:var(--wcss-heading-xs-weight, 300);letter-spacing:var(--wcss-heading-xs-letter-spacing, 0);line-height:var(--wcss-heading-xs-line-height, 1.3)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));font-weight:var(--wcss-heading-2xs-weight, 300);letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0);line-height:var(--wcss-heading-2xs-line-height, 1.3)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));font-weight:var(--wcss-accent-2xl-weight, 450);letter-spacing:var(--wcss-accent-2xl-letter-spacing, 0.05em);line-height:var(--wcss-accent-2xl-line-height, 1)}.accent-2xl,.accent-xl{text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));font-weight:var(--wcss-accent-xl-weight, 450);letter-spacing:var(--wcss-accent-xl-letter-spacing, 0.05em);line-height:var(--wcss-accent-xl-line-height, 1.3)}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));font-weight:var(--wcss-accent-lg-weight, 450);letter-spacing:var(--wcss-accent-lg-letter-spacing, 0.05em);line-height:var(--wcss-accent-lg-line-height, 1.3)}.accent-lg,.accent-md{text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));font-weight:var(--wcss-accent-md-weight, 500);letter-spacing:var(--wcss-accent-md-letter-spacing, 0.05em);line-height:var(--wcss-accent-md-line-height, 1.3)}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));font-weight:var(--wcss-accent-sm-weight, 500);letter-spacing:var(--wcss-accent-sm-letter-spacing, 0.05em);line-height:var(--wcss-accent-sm-line-height, 1.3)}.accent-sm,.accent-xs{text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));font-weight:var(--wcss-accent-xs-weight, 500);letter-spacing:var(--wcss-accent-xs-letter-spacing, 0.1em);line-height:var(--wcss-accent-xs-line-height, 1.3)}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xs-font-size, clamp(0.875rem, 1.1666666667vw, 0.875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}[auro-dropdown]{--ds-auro-dropdown-trigger-border-color: var(--ds-auro-select-border-color);--ds-auro-dropdown-trigger-background-color: var(--ds-auro-select-background-color);--ds-auro-dropdown-trigger-container-color: var(--ds-auro-select-background-color);--ds-auro-dropdown-trigger-outline-color: var(--ds-auro-select-outline-color)}:host{display:inline-block;text-align:left;vertical-align:top}:host([layout*=emphasized]) [auro-dropdown],:host([layout*=snowflake]) [auro-dropdown]{--ds-auro-select-border-color: transparent}:host([layout*=emphasized]) .mainContent,:host([layout*=snowflake]) .mainContent{text-align:center}.mainContent{position:relative;display:flex;overflow:hidden;flex:1;flex-direction:column;align-items:center;justify-content:center}.valueContainer [slot=displayValue]{display:none}.accents{display:flex;flex-direction:row;align-items:center;justify-content:center}::slotted([slot=typeIcon]){margin-right:var(--ds-size-100, 0.5rem)}.displayValue{display:block}.displayValue:not(.force){display:none}.displayValue:not(.force).hasContent:is(.withValue):not(.hasFocus){display:block}.triggerContent{display:flex;width:100%;align-items:center;justify-content:center}:host([layout*=emphasized]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem) 0 var(--ds-size-300, 1.5rem)}:host([layout*=snowflake]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem) 0 var(--ds-size-200, 1rem)}:host([layout*=snowflake]) label{padding-block:var(--ds-size-25, 0.125rem)}:host([layout*=classic]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem)}:host([layout*=classic]) .mainContent{align-items:start}:host([layout*=classic]) label{overflow:hidden;cursor:text;text-overflow:ellipsis;white-space:nowrap}:host([layout*=classic]) .value{height:auto}label{color:var(--ds-auro-select-label-text-color)}:host(:is([validity]:not([validity=valid]))) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-basic-color-status-error, #e31f26);--ds-auro-select-outline-color: var(--ds-basic-color-status-error, #e31f26);--ds-auro-dropdown-helptext-text-color: var(--ds-basic-color-texticon-default, #2a2a2a)}:host([ondark]:is([validity]:not([validity=valid]))) [auro-dropdown],:host([appearance=inverse]:is([validity]:not([validity=valid]))) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-advanced-color-state-error-inverse, #f9a4a8);--ds-auro-select-outline-color: var(--ds-advanced-color-state-error-inverse, #f9a4a8);--ds-auro-dropdown-helptext-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}#slotHolder{display:none}:host([fluid]){width:100%}:host([disabled]){pointer-events:none;user-select:none}:host([disabled]:not([ondark])) [auro-dropdown],:host([disabled]:not([appearance=inverse])) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-basic-color-border-subtle, #dddddd)}:host(:not([layout*=classic])[disabled][ondark]) [auro-dropdown],:host(:not([layout*=classic])[disabled][appearance=inverse]) [auro-dropdown]{--ds-auro-select-border-color: transparent}`;
6980
7002
 
@@ -7306,14 +7328,6 @@ class AuroSelect extends AuroElement$1 {
7306
7328
  reflect: true
7307
7329
  },
7308
7330
 
7309
- /**
7310
- * @private
7311
- */
7312
- options: {
7313
- type: Array,
7314
- state: true
7315
- },
7316
-
7317
7331
  /**
7318
7332
  * Specifies the current selected menuOption. Default type is `HTMLElement`, changing to `Array<HTMLElement>` when `multiSelect` is true.
7319
7333
  * @type {HTMLElement|Array<HTMLElement>}
@@ -7601,16 +7615,68 @@ class AuroSelect extends AuroElement$1 {
7601
7615
  this.dropdown.dropdownWidth = this.customBibWidth;
7602
7616
  }
7603
7617
 
7604
- // Pass label text to the dropdown bib for accessible dialog naming
7605
- const labelElement = this.querySelector('span[slot="label"]');
7606
- if (labelElement) {
7607
- this.dropdown.bibDialogLabel = labelElement.textContent.trim() || undefined;
7608
- }
7618
+ this._syncLabelText();
7609
7619
 
7610
7620
  // Exposes the CSS parts from the dropdown for styling
7611
7621
  this.dropdown.exposeCssParts();
7612
7622
  }
7613
7623
 
7624
+ /**
7625
+ * Reads the current label slot text and pushes it to the dropdown bib
7626
+ * (for dialog naming) and the menu (for listbox aria-label). Safe to call
7627
+ * before either child has been wired up — each branch self-guards.
7628
+ * @private
7629
+ */
7630
+ _syncLabelText() {
7631
+ const labelElement = this.querySelector('[slot="label"]');
7632
+ const text = labelElement ? labelElement.textContent.trim() : '';
7633
+ if (this.dropdown) {
7634
+ this.dropdown.bibDialogLabel = text || undefined;
7635
+ }
7636
+ if (this.menu) {
7637
+ if (text) {
7638
+ this.menu.setAttribute('aria-label', text);
7639
+ } else {
7640
+ this.menu.removeAttribute('aria-label');
7641
+ }
7642
+ }
7643
+ }
7644
+
7645
+ /**
7646
+ * Keeps the dialog/menu accessible names in sync when consumers mutate the
7647
+ * label slot at runtime (e.g., i18n locale swap). `slotchange` alone is
7648
+ * insufficient — it doesn't fire when textContent of an already-assigned
7649
+ * slotted node changes, which is the common case. We scope the observer to
7650
+ * the label node itself (not the whole host subtree) so option-content
7651
+ * mutations don't trigger label re-syncs, and re-target on `slotchange`
7652
+ * when consumers add or replace the label element.
7653
+ * @private
7654
+ */
7655
+ _observeLabelChanges() {
7656
+ if (this._labelObserver) return;
7657
+ this._labelObserver = new MutationObserver(() => this._syncLabelText());
7658
+
7659
+ const retarget = () => {
7660
+ this._labelObserver.disconnect();
7661
+ const labelElement = this.querySelector('[slot="label"]');
7662
+ if (labelElement) {
7663
+ this._labelObserver.observe(labelElement, {
7664
+ childList: true,
7665
+ subtree: true,
7666
+ characterData: true
7667
+ });
7668
+ }
7669
+ this._syncLabelText();
7670
+ };
7671
+
7672
+ retarget();
7673
+
7674
+ this._retargetLabelObserver = retarget;
7675
+ this.shadowRoot.querySelectorAll('slot[name="label"]').forEach((slot) => {
7676
+ slot.addEventListener('slotchange', retarget);
7677
+ });
7678
+ }
7679
+
7614
7680
  /**
7615
7681
  * This will register this element with the browser.
7616
7682
  * @param {string} [name="auro-select"] - The name of element that you want to register to.
@@ -7761,11 +7827,7 @@ class AuroSelect extends AuroElement$1 {
7761
7827
  this.updateMenuShapeSize();
7762
7828
  this.setMenuValue(this.value);
7763
7829
 
7764
- // Set accessible name on the menu for screen readers based on the label slot content
7765
- const labelElement = this.querySelector('[slot="label"]');
7766
- if (labelElement) {
7767
- this.menu.setAttribute('aria-label', labelElement.textContent.trim());
7768
- }
7830
+ this._syncLabelText();
7769
7831
 
7770
7832
  if (this.multiSelect) {
7771
7833
  this.menu.multiSelect = this.multiSelect;
@@ -7777,8 +7839,21 @@ class AuroSelect extends AuroElement$1 {
7777
7839
  if (typeof this.menu.initItems === 'function') {
7778
7840
  this.menu.initItems();
7779
7841
  }
7780
- this.options = this.menu.options;
7781
7842
  this.updateOptionPositions();
7843
+ // renderNativeSelect reads this.menu.options, which the parent doesn't
7844
+ // observe — request an update so the hidden native <option> list reflects
7845
+ // the menu's options after initItems populates them.
7846
+ this.requestUpdate();
7847
+
7848
+ // Keep aria-setsize/aria-posinset (and the native <option> list) in sync
7849
+ // when the menu re-initializes its items — e.g., slotchange, async/lazy
7850
+ // loads, value-triggered re-init. Without this, stale set-size is
7851
+ // announced and the native select goes stale after dynamic mutations.
7852
+ this.menu.addEventListener('auroMenu-optionsChange', () => {
7853
+ this.updateOptionPositions();
7854
+ this.requestUpdate();
7855
+ });
7856
+
7782
7857
  this.menu.addEventListener("auroMenu-loadingChange", (event) => this.handleMenuLoadingChange(event));
7783
7858
 
7784
7859
  this.menu.addEventListener("auroMenu-selectValueFailure", () => {
@@ -7797,11 +7872,26 @@ class AuroSelect extends AuroElement$1 {
7797
7872
  this.dropdown.setActiveDescendant(this.optionActive);
7798
7873
  }
7799
7874
 
7800
- // Announce the active option for screen readers
7801
- if (this.optionActive) {
7875
+ // Live-region announce only for [not selected] options. For activations
7876
+ // on an already-selected option — auto-activation on bib open, arrow
7877
+ // navigation back to the selection, or click in multiSelect — rely on
7878
+ // aria-activedescendant + aria-selected="true" to convey state per the
7879
+ // WAI-ARIA listbox pattern. This is intentional, not limited to the
7880
+ // initial activation on open: it also prevents a duplicate "X, selected"
7881
+ // when Enter on the active+selected option re-fires
7882
+ // auroMenu-selectedOption (see 03b289e39).
7883
+ if (this.optionActive && !this.optionActive.hasAttribute('selected')) {
7802
7884
  const optionText = this.optionActive.textContent.trim();
7803
- const selectedState = this.optionActive.hasAttribute('selected') ? ', selected' : ', not selected';
7804
- announceToScreenReader(this._getAnnouncementRoot(), `${optionText}${selectedState}`);
7885
+ const message = `${optionText}, not selected`;
7886
+ if (this.dropdown.isPopoverVisible) {
7887
+ announceToScreenReader(this._getAnnouncementRoot(), message);
7888
+ } else {
7889
+ // Typeahead-on-closed fires this event before `show()` flips
7890
+ // isPopoverVisible. Defer so the announcement targets the bib's
7891
+ // live region once the fullscreen <dialog> opens — otherwise it
7892
+ // lands in the host root, which is inert under the active modal.
7893
+ queueMicrotask(() => announceToScreenReader(this._getAnnouncementRoot(), message));
7894
+ }
7805
7895
  }
7806
7896
 
7807
7897
  if (this.dropdown.isPopoverVisible) {
@@ -7810,6 +7900,7 @@ class AuroSelect extends AuroElement$1 {
7810
7900
  });
7811
7901
 
7812
7902
  this.menu.addEventListener('auroMenu-selectedOption', () => {
7903
+ const previousSelected = this.optionSelected;
7813
7904
 
7814
7905
  // Update the displayed value
7815
7906
  this.updateDisplayedValue();
@@ -7829,13 +7920,32 @@ class AuroSelect extends AuroElement$1 {
7829
7920
  this.dropdown.trigger.focus();
7830
7921
  }
7831
7922
 
7832
- // Announce the selection after the dropdown closes so it isn't
7833
- // overridden by VoiceOver's "collapsed" announcement from aria-expanded.
7834
- const selectedValue = this.menu.currentLabel;
7835
- const announcementDelay = 300;
7836
- setTimeout(() => {
7837
- announceToScreenReader(this._getAnnouncementRoot(), `${selectedValue}, selected`);
7838
- }, announcementDelay);
7923
+ // Describe the actual change. In multiSelect, currentLabel is the
7924
+ // concatenated remaining list — announcing "{list}, selected" after a
7925
+ // deselect would falsely claim every remaining label was just added.
7926
+ // Diff previous vs next to recover the toggled option.
7927
+ let announcement = '';
7928
+ if (this.multiSelect) {
7929
+ const prev = Array.isArray(previousSelected) ? previousSelected : [];
7930
+ const removed = prev.find((opt) => !nextSelected.includes(opt));
7931
+ const added = nextSelected.find((opt) => !prev.includes(opt));
7932
+ if (removed) {
7933
+ announcement = `${removed.textContent.trim()}, not selected`;
7934
+ } else if (added) {
7935
+ announcement = `${added.textContent.trim()}, selected`;
7936
+ }
7937
+ } else {
7938
+ announcement = `${this.menu.currentLabel}, selected`;
7939
+ }
7940
+
7941
+ // Delay so the utterance isn't overridden by VoiceOver's "collapsed"
7942
+ // announcement from aria-expanded when the dropdown closes.
7943
+ if (announcement) {
7944
+ const announcementDelay = 300;
7945
+ setTimeout(() => {
7946
+ announceToScreenReader(this._getAnnouncementRoot(), announcement);
7947
+ }, announcementDelay);
7948
+ }
7839
7949
  });
7840
7950
  }
7841
7951
 
@@ -7933,24 +8043,32 @@ class AuroSelect extends AuroElement$1 {
7933
8043
 
7934
8044
  this.typeaheadBuffer += key;
7935
8045
 
7936
- const isRepeatedChar = this.typeaheadBuffer.length > 1 && new Set(this.typeaheadBuffer).size === 1;
8046
+ // Prefer the literal buffer as a prefix per WAI-ARIA APG ("focus moves to the
8047
+ // next item with a name that starts with the string of characters typed").
8048
+ // Only fall back to single-char cycling when the repeated buffer has no
8049
+ // longer prefix match — e.g. "aa" cycles through ["Apple", "Apricot"] only
8050
+ // because no option starts with "aa".
8051
+ let match = options.find((option) => this._getOptionDisplayText(option).startsWith(this.typeaheadBuffer));
7937
8052
 
7938
- let match = null;
8053
+ const isRepeatedChar = !match && this.typeaheadBuffer.length > 1 && new Set(this.typeaheadBuffer).size === 1;
7939
8054
  if (isRepeatedChar) {
7940
8055
  const matches = options.filter((option) => this._getOptionDisplayText(option).startsWith(key));
7941
8056
  if (matches.length) {
7942
8057
  const cycleIndex = (this.typeaheadBuffer.length - 1) % matches.length;
7943
8058
  match = matches[cycleIndex];
7944
8059
  }
7945
- } else {
7946
- match = options.find((option) => this._getOptionDisplayText(option).startsWith(this.typeaheadBuffer));
7947
8060
  }
7948
8061
 
8062
+ // Intentional: no-match leaves the bib closed (deviates from APG / some native <select>).
7949
8063
  if (match) {
8064
+ // Pre-stash the match so the auroDropdown-toggled handler's `!optionActive`
8065
+ // guard short-circuits and skips the firstActive/selected fallback —
8066
+ // otherwise show() synchronously fires the handler, which writes
8067
+ // aria-activedescendant once before we overwrite it.
8068
+ this.menu.updateActiveOption(match);
7950
8069
  if (!this.dropdown.isPopoverVisible) {
7951
8070
  this.dropdown.show();
7952
8071
  }
7953
- this.menu.updateActiveOption(match);
7954
8072
  }
7955
8073
  }
7956
8074
 
@@ -8067,6 +8185,28 @@ class AuroSelect extends AuroElement$1 {
8067
8185
  disconnectedCallback() {
8068
8186
  super.disconnectedCallback();
8069
8187
  this._clearTypeaheadBuffer();
8188
+ if (this._labelObserver) {
8189
+ this._labelObserver.disconnect();
8190
+ this._labelObserver = null;
8191
+ }
8192
+ if (this._retargetLabelObserver && this.shadowRoot) {
8193
+ this.shadowRoot.querySelectorAll('slot[name="label"]').forEach((slot) => {
8194
+ slot.removeEventListener('slotchange', this._retargetLabelObserver);
8195
+ });
8196
+ this._retargetLabelObserver = null;
8197
+ }
8198
+ }
8199
+
8200
+ connectedCallback() {
8201
+ super.connectedCallback();
8202
+ // Regression guard: firstUpdated() fires once per instance, so the label
8203
+ // observer setup it triggers does NOT re-run on reconnect. After a
8204
+ // disconnect+reconnect (reparent, SPA route swap), runtime label mutations
8205
+ // would silently stop syncing menu aria-label / dropdown.bibDialogLabel
8206
+ // unless we re-wire the observer here.
8207
+ if (this.hasUpdated) {
8208
+ this._observeLabelChanges();
8209
+ }
8070
8210
  }
8071
8211
 
8072
8212
  // lifecycle runs only after the element's DOM has been updated the first time
@@ -8077,6 +8217,7 @@ class AuroSelect extends AuroElement$1 {
8077
8217
  this.configureDropdown();
8078
8218
  this.configureMenu();
8079
8219
  this.configureSelect();
8220
+ this._observeLabelChanges();
8080
8221
  }
8081
8222
 
8082
8223
  setMenuValue(value) {
@@ -8209,25 +8350,18 @@ class AuroSelect extends AuroElement$1 {
8209
8350
  * @private
8210
8351
  */
8211
8352
  _handleNativeSelectChange(event) {
8353
+ // Hidden native <select> has no `multiple` attribute, so any change it fires
8354
+ // is a single raw value — applying it in multiSelect mode would collapse the
8355
+ // JSON-array `value` shape. Bfcache/autofill can reach this on a name-bearing
8356
+ // form control even with aria-hidden/tabindex=-1.
8357
+ if (this.multiSelect) return;
8358
+
8212
8359
  const selectedOption = event.target.options[event.target.selectedIndex];
8213
8360
  if (!selectedOption) return;
8214
8361
  const selectedValue = selectedOption.value;
8215
8362
 
8216
- if (this.multiSelect) {
8217
- const currentArray = this.menu.value || [];
8218
-
8219
- if (!currentArray.includes(selectedValue)) {
8220
- this.value = JSON.stringify([
8221
- ...currentArray,
8222
- selectedValue
8223
- ]);
8224
- }
8225
- } else {
8226
- const currentValue = this.value;
8227
-
8228
- if (currentValue !== selectedValue) {
8229
- this.value = selectedValue;
8230
- }
8363
+ if (this.value !== selectedValue) {
8364
+ this.value = selectedValue;
8231
8365
  }
8232
8366
  }
8233
8367
 
@@ -169,8 +169,15 @@
169
169
  </td>
170
170
  </tr>
171
171
  <tr>
172
- <td>End</td>
173
- <td>-</td>
172
+ <td rowspan="2">End</td>
173
+ <td rowspan="2">-</td>
174
+ <td>Collapsed</td>
175
+ <td>Trigger element</td>
176
+ <td>
177
+ Opens the bib and advances the <code>focused</code> option to the last enabled option in the list.
178
+ </td>
179
+ </tr>
180
+ <tr>
174
181
  <td>Expanded</td>
175
182
  <td>Trigger element</td>
176
183
  <td>
@@ -198,8 +205,15 @@
198
205
  </td>
199
206
  </tr>
200
207
  <tr>
201
- <td>Home</td>
202
- <td>-</td>
208
+ <td rowspan="2">Home</td>
209
+ <td rowspan="2">-</td>
210
+ <td>Collapsed</td>
211
+ <td>Trigger element</td>
212
+ <td>
213
+ Opens the bib and advances the <code>focused</code> option to the first enabled option in the list.
214
+ </td>
215
+ </tr>
216
+ <tr>
203
217
  <td>Expanded</td>
204
218
  <td>Trigger element</td>
205
219
  <td>
@@ -180,13 +180,6 @@ export class AuroSelect extends AuroElement {
180
180
  type: BooleanConstructor;
181
181
  reflect: boolean;
182
182
  };
183
- /**
184
- * @private
185
- */
186
- options: {
187
- type: ArrayConstructor;
188
- state: boolean;
189
- };
190
183
  /**
191
184
  * Specifies the current selected menuOption. Default type is `HTMLElement`, changing to `Array<HTMLElement>` when `multiSelect` is true.
192
185
  * @type {HTMLElement|Array<HTMLElement>}
@@ -389,6 +382,26 @@ export class AuroSelect extends AuroElement {
389
382
  dropdown: any;
390
383
  optionActive: any;
391
384
  bibtemplate: any;
385
+ /**
386
+ * Reads the current label slot text and pushes it to the dropdown bib
387
+ * (for dialog naming) and the menu (for listbox aria-label). Safe to call
388
+ * before either child has been wired up — each branch self-guards.
389
+ * @private
390
+ */
391
+ private _syncLabelText;
392
+ /**
393
+ * Keeps the dialog/menu accessible names in sync when consumers mutate the
394
+ * label slot at runtime (e.g., i18n locale swap). `slotchange` alone is
395
+ * insufficient — it doesn't fire when textContent of an already-assigned
396
+ * slotted node changes, which is the common case. We scope the observer to
397
+ * the label node itself (not the whole host subtree) so option-content
398
+ * mutations don't trigger label re-syncs, and re-target on `slotchange`
399
+ * when consumers add or replace the label element.
400
+ * @private
401
+ */
402
+ private _observeLabelChanges;
403
+ _labelObserver: MutationObserver | null | undefined;
404
+ _retargetLabelObserver: (() => void) | null | undefined;
392
405
  /**
393
406
  * Updates the displayed value in an Auro dropdown component based on optionSelected.
394
407
  * @private
@@ -425,7 +438,6 @@ export class AuroSelect extends AuroElement {
425
438
  menu: Element | null | undefined;
426
439
  defaultMenuSize: string | null | undefined;
427
440
  defaultMenuShape: string | null | undefined;
428
- options: any;
429
441
  optionSelected: any;
430
442
  /**
431
443
  * Binds all behavior needed to the component after rendering.