@aurodesignsystem-dev/auro-formkit 0.0.0-pr1510.2 → 0.0.0-pr1511.0

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 (128) hide show
  1. package/components/checkbox/demo/customize.js +22 -0
  2. package/components/checkbox/demo/customize.min.js +1 -1
  3. package/components/checkbox/demo/demo-support.js +1 -0
  4. package/components/checkbox/demo/getting-started.js +22 -0
  5. package/components/checkbox/demo/getting-started.min.js +1 -1
  6. package/components/checkbox/demo/index.js +8 -0
  7. package/components/checkbox/demo/index.min.js +1 -1
  8. package/components/checkbox/demo/styles.scss +1 -0
  9. package/components/checkbox/dist/index.js +1 -1
  10. package/components/checkbox/dist/registered.js +1 -1
  11. package/components/combobox/demo/customize.js +24 -0
  12. package/components/combobox/demo/customize.min.js +4 -3
  13. package/components/combobox/demo/demo-support.js +1 -0
  14. package/components/combobox/demo/getting-started.js +21 -0
  15. package/components/combobox/demo/getting-started.min.js +4 -3
  16. package/components/combobox/demo/index.js +23 -0
  17. package/components/combobox/demo/index.min.js +4 -3
  18. package/components/combobox/demo/styles.scss +1 -0
  19. package/components/combobox/dist/index.js +4 -3
  20. package/components/combobox/dist/registered.js +4 -3
  21. package/components/counter/demo/customize.js +21 -0
  22. package/components/counter/demo/customize.min.js +3 -2
  23. package/components/counter/demo/demo-support.js +1 -0
  24. package/components/counter/demo/index.js +21 -0
  25. package/components/counter/demo/index.min.js +3 -2
  26. package/components/counter/demo/styles.scss +1 -0
  27. package/components/counter/dist/index.js +3 -2
  28. package/components/counter/dist/registered.js +3 -2
  29. package/components/datepicker/demo/accessibility.md +1 -2
  30. package/components/datepicker/demo/api.md +62 -63
  31. package/components/datepicker/demo/customize.js +17 -0
  32. package/components/datepicker/demo/customize.md +1 -12
  33. package/components/datepicker/demo/customize.min.js +207 -601
  34. package/components/datepicker/demo/demo-support.js +1 -0
  35. package/components/datepicker/demo/index.js +23 -0
  36. package/components/datepicker/demo/index.min.js +207 -601
  37. package/components/datepicker/demo/styles.scss +1 -0
  38. package/components/datepicker/dist/index.js +207 -601
  39. package/components/datepicker/dist/registered.js +207 -601
  40. package/components/datepicker/dist/{auro-calendar-cell.d.ts → src/auro-calendar-cell.d.ts} +3 -14
  41. package/components/datepicker/dist/{auro-calendar.d.ts → src/auro-calendar.d.ts} +6 -90
  42. package/components/datepicker/dist/{auro-datepicker.d.ts → src/auro-datepicker.d.ts} +5 -78
  43. package/components/dropdown/demo/customize.js +9 -0
  44. package/components/dropdown/demo/customize.min.js +2 -1
  45. package/components/dropdown/demo/demo-support.js +1 -0
  46. package/components/dropdown/demo/getting-started.js +9 -0
  47. package/components/dropdown/demo/getting-started.min.js +2 -1
  48. package/components/dropdown/demo/index.js +16 -0
  49. package/components/dropdown/demo/index.min.js +2 -1
  50. package/components/dropdown/demo/styles.scss +1 -0
  51. package/components/dropdown/dist/index.js +2 -1
  52. package/components/dropdown/dist/registered.js +2 -1
  53. package/components/form/demo/customize.js +28 -0
  54. package/components/form/demo/customize.min.js +355 -670
  55. package/components/form/demo/demo-support.js +1 -0
  56. package/components/form/demo/getting-started.js +9 -0
  57. package/components/form/demo/getting-started.min.js +355 -670
  58. package/components/form/demo/index.js +5 -0
  59. package/components/form/demo/index.min.js +355 -670
  60. package/components/form/demo/registerDemoDeps.js +23 -0
  61. package/components/form/demo/registerDemoDeps.min.js +355 -670
  62. package/components/form/demo/styles.scss +1 -0
  63. package/components/input/demo/customize.js +25 -0
  64. package/components/input/demo/customize.min.js +1 -1
  65. package/components/input/demo/demo-support.js +1 -0
  66. package/components/input/demo/getting-started.js +8 -0
  67. package/components/input/demo/getting-started.min.js +1 -1
  68. package/components/input/demo/index.js +8 -0
  69. package/components/input/demo/index.min.js +1 -1
  70. package/components/input/demo/styles.css +974 -0
  71. package/components/input/demo/styles.scss +1 -0
  72. package/components/input/dist/index.js +1 -1
  73. package/components/input/dist/registered.js +1 -1
  74. package/components/menu/demo/demo-support.js +1 -0
  75. package/components/menu/demo/index.js +25 -0
  76. package/components/menu/demo/styles.scss +1 -0
  77. package/components/radio/demo/customize.js +22 -0
  78. package/components/radio/demo/customize.min.js +1 -1
  79. package/components/radio/demo/demo-support.js +1 -0
  80. package/components/radio/demo/getting-started.js +24 -0
  81. package/components/radio/demo/getting-started.min.js +1 -1
  82. package/components/radio/demo/index.js +8 -0
  83. package/components/radio/demo/index.min.js +1 -1
  84. package/components/radio/demo/styles.scss +1 -0
  85. package/components/radio/dist/index.js +1 -1
  86. package/components/radio/dist/registered.js +1 -1
  87. package/components/select/demo/customize.js +11 -0
  88. package/components/select/demo/customize.min.js +132 -55
  89. package/components/select/demo/demo-support.js +1 -0
  90. package/components/select/demo/getting-started.js +26 -0
  91. package/components/select/demo/getting-started.min.js +132 -55
  92. package/components/select/demo/index.js +11 -0
  93. package/components/select/demo/index.min.js +132 -55
  94. package/components/select/demo/keyboard-behavior.md +18 -4
  95. package/components/select/demo/styles.scss +1 -0
  96. package/components/select/dist/auro-select.d.ts +20 -8
  97. package/components/select/dist/index.js +132 -55
  98. package/components/select/dist/registered.js +132 -55
  99. package/custom-elements.json +25 -311
  100. package/package.json +2 -6
  101. package/components/datepicker/dist/blackoutUtils.d.ts +0 -43
  102. /package/components/datepicker/dist/{auro-calendar-month.d.ts → src/auro-calendar-month.d.ts} +0 -0
  103. /package/components/datepicker/dist/{buttonVersion.d.ts → src/buttonVersion.d.ts} +0 -0
  104. /package/components/datepicker/dist/{datepickerKeyboardStrategy.d.ts → src/datepickerKeyboardStrategy.d.ts} +0 -0
  105. /package/components/datepicker/dist/{iconVersion.d.ts → src/iconVersion.d.ts} +0 -0
  106. /package/components/datepicker/dist/{index.d.ts → src/index.d.ts} +0 -0
  107. /package/components/datepicker/dist/{popoverVersion.d.ts → src/popoverVersion.d.ts} +0 -0
  108. /package/components/datepicker/dist/{styles → src/styles}/classic/color-css.d.ts +0 -0
  109. /package/components/datepicker/dist/{styles → src/styles}/classic/style-css.d.ts +0 -0
  110. /package/components/datepicker/dist/{styles → src/styles}/color-calendar-css.d.ts +0 -0
  111. /package/components/datepicker/dist/{styles → src/styles}/color-cell-css.d.ts +0 -0
  112. /package/components/datepicker/dist/{styles → src/styles}/color-css.d.ts +0 -0
  113. /package/components/datepicker/dist/{styles → src/styles}/color-month-css.d.ts +0 -0
  114. /package/components/datepicker/dist/{styles → src/styles}/shapeSize-css.d.ts +0 -0
  115. /package/components/datepicker/dist/{styles → src/styles}/snowflake/color-css.d.ts +0 -0
  116. /package/components/datepicker/dist/{styles → src/styles}/snowflake/style-css.d.ts +0 -0
  117. /package/components/datepicker/dist/{styles → src/styles}/style-auro-calendar-cell-css.d.ts +0 -0
  118. /package/components/datepicker/dist/{styles → src/styles}/style-auro-calendar-css.d.ts +0 -0
  119. /package/components/datepicker/dist/{styles → src/styles}/style-auro-calendar-month-css.d.ts +0 -0
  120. /package/components/datepicker/dist/{styles → src/styles}/style-css.d.ts +0 -0
  121. /package/components/datepicker/dist/{styles → src/styles}/tokens-css.d.ts +0 -0
  122. /package/components/datepicker/dist/{utilities.d.ts → src/utilities.d.ts} +0 -0
  123. /package/components/datepicker/dist/{utilitiesCalendar.d.ts → src/utilitiesCalendar.d.ts} +0 -0
  124. /package/components/datepicker/dist/{utilitiesCalendarRender.d.ts → src/utilitiesCalendarRender.d.ts} +0 -0
  125. /package/components/datepicker/dist/{vendor → src/vendor}/wc-range-datepicker/day.d.ts +0 -0
  126. /package/components/datepicker/dist/{vendor → src/vendor}/wc-range-datepicker/range-datepicker-calendar.d.ts +0 -0
  127. /package/components/datepicker/dist/{vendor → src/vendor}/wc-range-datepicker/range-datepicker-cell.d.ts +0 -0
  128. /package/components/datepicker/dist/{vendor → src/vendor}/wc-range-datepicker/range-datepicker.d.ts +0 -0
@@ -990,19 +990,24 @@ const selectKeyboardStrategy = {
990
990
  },
991
991
 
992
992
  End(component, evt, ctx) {
993
- if (!ctx.isExpanded) {
994
- return;
995
- }
996
993
  evt.preventDefault();
997
994
  evt.stopPropagation();
998
995
  // `pop()` is safe here: getEnabledOptions returns a fresh filtered array.
999
996
  const lastOption = getEnabledOptions(component.menu).pop();
1000
- if (lastOption) {
1001
- component.menu.updateActiveOption(lastOption);
997
+ if (!lastOption) {
998
+ return;
1002
999
  }
1000
+ if (!ctx.isExpanded) {
1001
+ component.dropdown.show();
1002
+ }
1003
+ component.menu.updateActiveOption(lastOption);
1003
1004
  },
1004
1005
 
1005
1006
  Enter(component, evt, ctx) {
1007
+ // Prevent the keypress from bubbling to parent containers (e.g., forms)
1008
+ // which could interpret Enter as a submit. Matches APG select-only combobox
1009
+ // and native <select> behavior: Enter opens the listbox when closed, selects
1010
+ // the active option when open — it does not submit a parent form.
1006
1011
  evt.preventDefault();
1007
1012
  evt.stopPropagation();
1008
1013
  if (!ctx.isExpanded) {
@@ -1013,15 +1018,16 @@ const selectKeyboardStrategy = {
1013
1018
  },
1014
1019
 
1015
1020
  Home(component, evt, ctx) {
1016
- if (!ctx.isExpanded) {
1017
- return;
1018
- }
1019
1021
  evt.preventDefault();
1020
1022
  evt.stopPropagation();
1021
1023
  const [firstOption] = getEnabledOptions(component.menu);
1022
- if (firstOption) {
1023
- component.menu.updateActiveOption(firstOption);
1024
+ if (!firstOption) {
1025
+ return;
1026
+ }
1027
+ if (!ctx.isExpanded) {
1028
+ component.dropdown.show();
1024
1029
  }
1030
+ component.menu.updateActiveOption(firstOption);
1025
1031
  },
1026
1032
 
1027
1033
  Tab(component, evt, ctx) {
@@ -4992,7 +4998,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
4992
4998
  }
4993
4999
  };
4994
5000
 
4995
- var formkitVersion$1 = '202606252132';
5001
+ var formkitVersion$1 = '202606252142';
4996
5002
 
4997
5003
  class AuroElement extends i$2 {
4998
5004
  static get properties() {
@@ -6264,6 +6270,7 @@ class AuroDropdown extends AuroElement {
6264
6270
  role="${o(this.triggerContentFocusable ? undefined : this.a11yRole)}"
6265
6271
  aria-expanded="${o(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
6266
6272
  aria-controls="${o(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
6273
+ aria-haspopup="${o(this.a11yRole === 'combobox' ? 'listbox' : undefined)}"
6267
6274
  aria-labelledby="${o(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
6268
6275
  aria-disabled="${o(this.disabled ? 'true' : undefined)}"
6269
6276
  @focusin="${this.handleFocusin}"
@@ -7013,7 +7020,7 @@ class AuroHelpText extends i$2 {
7013
7020
  }
7014
7021
  }
7015
7022
 
7016
- var formkitVersion = '202606252132';
7023
+ var formkitVersion = '202606252142';
7017
7024
 
7018
7025
  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}`;
7019
7026
 
@@ -7345,14 +7352,6 @@ class AuroSelect extends AuroElement$1 {
7345
7352
  reflect: true
7346
7353
  },
7347
7354
 
7348
- /**
7349
- * @private
7350
- */
7351
- options: {
7352
- type: Array,
7353
- state: true
7354
- },
7355
-
7356
7355
  /**
7357
7356
  * Specifies the current selected menuOption. Default type is `HTMLElement`, changing to `Array<HTMLElement>` when `multiSelect` is true.
7358
7357
  * @type {HTMLElement|Array<HTMLElement>}
@@ -7640,16 +7639,68 @@ class AuroSelect extends AuroElement$1 {
7640
7639
  this.dropdown.dropdownWidth = this.customBibWidth;
7641
7640
  }
7642
7641
 
7643
- // Pass label text to the dropdown bib for accessible dialog naming
7644
- const labelElement = this.querySelector('span[slot="label"]');
7645
- if (labelElement) {
7646
- this.dropdown.bibDialogLabel = labelElement.textContent.trim() || undefined;
7647
- }
7642
+ this._syncLabelText();
7648
7643
 
7649
7644
  // Exposes the CSS parts from the dropdown for styling
7650
7645
  this.dropdown.exposeCssParts();
7651
7646
  }
7652
7647
 
7648
+ /**
7649
+ * Reads the current label slot text and pushes it to the dropdown bib
7650
+ * (for dialog naming) and the menu (for listbox aria-label). Safe to call
7651
+ * before either child has been wired up — each branch self-guards.
7652
+ * @private
7653
+ */
7654
+ _syncLabelText() {
7655
+ const labelElement = this.querySelector('[slot="label"]');
7656
+ const text = labelElement ? labelElement.textContent.trim() : '';
7657
+ if (this.dropdown) {
7658
+ this.dropdown.bibDialogLabel = text || undefined;
7659
+ }
7660
+ if (this.menu) {
7661
+ if (text) {
7662
+ this.menu.setAttribute('aria-label', text);
7663
+ } else {
7664
+ this.menu.removeAttribute('aria-label');
7665
+ }
7666
+ }
7667
+ }
7668
+
7669
+ /**
7670
+ * Keeps the dialog/menu accessible names in sync when consumers mutate the
7671
+ * label slot at runtime (e.g., i18n locale swap). `slotchange` alone is
7672
+ * insufficient — it doesn't fire when textContent of an already-assigned
7673
+ * slotted node changes, which is the common case. We scope the observer to
7674
+ * the label node itself (not the whole host subtree) so option-content
7675
+ * mutations don't trigger label re-syncs, and re-target on `slotchange`
7676
+ * when consumers add or replace the label element.
7677
+ * @private
7678
+ */
7679
+ _observeLabelChanges() {
7680
+ if (this._labelObserver) return;
7681
+ this._labelObserver = new MutationObserver(() => this._syncLabelText());
7682
+
7683
+ const retarget = () => {
7684
+ this._labelObserver.disconnect();
7685
+ const labelElement = this.querySelector('[slot="label"]');
7686
+ if (labelElement) {
7687
+ this._labelObserver.observe(labelElement, {
7688
+ childList: true,
7689
+ subtree: true,
7690
+ characterData: true
7691
+ });
7692
+ }
7693
+ this._syncLabelText();
7694
+ };
7695
+
7696
+ retarget();
7697
+
7698
+ this._retargetLabelObserver = retarget;
7699
+ this.shadowRoot.querySelectorAll('slot[name="label"]').forEach((slot) => {
7700
+ slot.addEventListener('slotchange', retarget);
7701
+ });
7702
+ }
7703
+
7653
7704
  /**
7654
7705
  * This will register this element with the browser.
7655
7706
  * @param {string} [name="auro-select"] - The name of element that you want to register to.
@@ -7800,11 +7851,7 @@ class AuroSelect extends AuroElement$1 {
7800
7851
  this.updateMenuShapeSize();
7801
7852
  this.setMenuValue(this.value);
7802
7853
 
7803
- // Set accessible name on the menu for screen readers based on the label slot content
7804
- const labelElement = this.querySelector('[slot="label"]');
7805
- if (labelElement) {
7806
- this.menu.setAttribute('aria-label', labelElement.textContent.trim());
7807
- }
7854
+ this._syncLabelText();
7808
7855
 
7809
7856
  if (this.multiSelect) {
7810
7857
  this.menu.multiSelect = this.multiSelect;
@@ -7816,8 +7863,21 @@ class AuroSelect extends AuroElement$1 {
7816
7863
  if (typeof this.menu.initItems === 'function') {
7817
7864
  this.menu.initItems();
7818
7865
  }
7819
- this.options = this.menu.options;
7820
7866
  this.updateOptionPositions();
7867
+ // renderNativeSelect reads this.menu.options, which the parent doesn't
7868
+ // observe — request an update so the hidden native <option> list reflects
7869
+ // the menu's options after initItems populates them.
7870
+ this.requestUpdate();
7871
+
7872
+ // Keep aria-setsize/aria-posinset (and the native <option> list) in sync
7873
+ // when the menu re-initializes its items — e.g., slotchange, async/lazy
7874
+ // loads, value-triggered re-init. Without this, stale set-size is
7875
+ // announced and the native select goes stale after dynamic mutations.
7876
+ this.menu.addEventListener('auroMenu-optionsChange', () => {
7877
+ this.updateOptionPositions();
7878
+ this.requestUpdate();
7879
+ });
7880
+
7821
7881
  this.menu.addEventListener("auroMenu-loadingChange", (event) => this.handleMenuLoadingChange(event));
7822
7882
 
7823
7883
  this.menu.addEventListener("auroMenu-selectValueFailure", () => {
@@ -7836,11 +7896,22 @@ class AuroSelect extends AuroElement$1 {
7836
7896
  this.dropdown.setActiveDescendant(this.optionActive);
7837
7897
  }
7838
7898
 
7839
- // Announce the active option for screen readers
7840
- if (this.optionActive) {
7899
+ // Announce the active option for screen readers. Skip when the activated
7900
+ // option is already selected: Enter triggers an auroMenu-selectedOption
7901
+ // re-announce, and aria-selected on the active descendant otherwise
7902
+ // conveys state without an explicit utterance.
7903
+ if (this.optionActive && !this.optionActive.hasAttribute('selected')) {
7841
7904
  const optionText = this.optionActive.textContent.trim();
7842
- const selectedState = this.optionActive.hasAttribute('selected') ? ', selected' : ', not selected';
7843
- announceToScreenReader(this._getAnnouncementRoot(), `${optionText}${selectedState}`);
7905
+ const message = `${optionText}, not selected`;
7906
+ if (this.dropdown.isPopoverVisible) {
7907
+ announceToScreenReader(this._getAnnouncementRoot(), message);
7908
+ } else {
7909
+ // Typeahead-on-closed fires this event before `show()` flips
7910
+ // isPopoverVisible. Defer so the announcement targets the bib's
7911
+ // live region once the fullscreen <dialog> opens — otherwise it
7912
+ // lands in the host root, which is inert under the active modal.
7913
+ queueMicrotask(() => announceToScreenReader(this._getAnnouncementRoot(), message));
7914
+ }
7844
7915
  }
7845
7916
 
7846
7917
  if (this.dropdown.isPopoverVisible) {
@@ -7972,24 +8043,32 @@ class AuroSelect extends AuroElement$1 {
7972
8043
 
7973
8044
  this.typeaheadBuffer += key;
7974
8045
 
7975
- 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));
7976
8052
 
7977
- let match = null;
8053
+ const isRepeatedChar = !match && this.typeaheadBuffer.length > 1 && new Set(this.typeaheadBuffer).size === 1;
7978
8054
  if (isRepeatedChar) {
7979
8055
  const matches = options.filter((option) => this._getOptionDisplayText(option).startsWith(key));
7980
8056
  if (matches.length) {
7981
8057
  const cycleIndex = (this.typeaheadBuffer.length - 1) % matches.length;
7982
8058
  match = matches[cycleIndex];
7983
8059
  }
7984
- } else {
7985
- match = options.find((option) => this._getOptionDisplayText(option).startsWith(this.typeaheadBuffer));
7986
8060
  }
7987
8061
 
8062
+ // Intentional: no-match leaves the bib closed (deviates from APG / some native <select>).
7988
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);
7989
8069
  if (!this.dropdown.isPopoverVisible) {
7990
8070
  this.dropdown.show();
7991
8071
  }
7992
- this.menu.updateActiveOption(match);
7993
8072
  }
7994
8073
  }
7995
8074
 
@@ -8106,6 +8185,16 @@ class AuroSelect extends AuroElement$1 {
8106
8185
  disconnectedCallback() {
8107
8186
  super.disconnectedCallback();
8108
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
+ }
8109
8198
  }
8110
8199
 
8111
8200
  // lifecycle runs only after the element's DOM has been updated the first time
@@ -8116,6 +8205,7 @@ class AuroSelect extends AuroElement$1 {
8116
8205
  this.configureDropdown();
8117
8206
  this.configureMenu();
8118
8207
  this.configureSelect();
8208
+ this._observeLabelChanges();
8119
8209
  }
8120
8210
 
8121
8211
  setMenuValue(value) {
@@ -8252,21 +8342,8 @@ class AuroSelect extends AuroElement$1 {
8252
8342
  if (!selectedOption) return;
8253
8343
  const selectedValue = selectedOption.value;
8254
8344
 
8255
- if (this.multiSelect) {
8256
- const currentArray = this.menu.value || [];
8257
-
8258
- if (!currentArray.includes(selectedValue)) {
8259
- this.value = JSON.stringify([
8260
- ...currentArray,
8261
- selectedValue
8262
- ]);
8263
- }
8264
- } else {
8265
- const currentValue = this.value;
8266
-
8267
- if (currentValue !== selectedValue) {
8268
- this.value = selectedValue;
8269
- }
8345
+ if (this.value !== selectedValue) {
8346
+ this.value = selectedValue;
8270
8347
  }
8271
8348
  }
8272
8349
 
@@ -0,0 +1,11 @@
1
+ /* eslint-disable jsdoc/require-jsdoc, no-magic-numbers, no-param-reassign */
2
+
3
+ import { AuroSelect } from '../src/auro-select.js';
4
+ import '../../menu/src/registered.js';
5
+
6
+ AuroSelect.register();
7
+ AuroSelect.register('custom-select');
8
+
9
+ export function initExamples(initCount) {
10
+ initCount = initCount || 0;
11
+ }