@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.
- package/components/bibtemplate/dist/index.js +1 -1
- package/components/bibtemplate/dist/registered.js +1 -1
- package/components/checkbox/demo/customize.html +1 -2
- package/components/checkbox/demo/customize.min.js +8 -6
- package/components/checkbox/demo/getting-started.min.js +8 -6
- package/components/checkbox/demo/index.min.js +8 -6
- package/components/checkbox/dist/index.js +8 -6
- package/components/checkbox/dist/registered.js +8 -6
- package/components/combobox/demo/customize.html +1 -2
- package/components/combobox/demo/customize.md +105 -137
- package/components/combobox/demo/customize.min.js +506 -568
- package/components/combobox/demo/getting-started.min.js +506 -564
- package/components/combobox/demo/index.min.js +506 -564
- package/components/combobox/demo/keyboard-behavior.md +2 -142
- package/components/combobox/demo/why-combobox.md +1 -1
- package/components/combobox/dist/auro-combobox.d.ts +30 -14
- package/components/combobox/dist/index.js +505 -563
- package/components/combobox/dist/registered.js +505 -563
- package/components/counter/demo/customize.min.js +26 -8
- package/components/counter/demo/index.min.js +26 -8
- package/components/counter/dist/index.js +26 -8
- package/components/counter/dist/registered.js +26 -8
- package/components/datepicker/demo/accessibility.md +2 -1
- package/components/datepicker/demo/api.md +65 -62
- package/components/datepicker/demo/customize.md +150 -39
- package/components/datepicker/demo/customize.min.js +988 -500
- package/components/datepicker/demo/index.min.js +988 -482
- package/components/datepicker/dist/{src/auro-calendar-cell.d.ts → auro-calendar-cell.d.ts} +20 -3
- package/components/datepicker/dist/{src/auro-calendar.d.ts → auro-calendar.d.ts} +121 -7
- package/components/datepicker/dist/{src/auro-datepicker.d.ts → auro-datepicker.d.ts} +80 -5
- package/components/datepicker/dist/blackoutUtils.d.ts +43 -0
- package/components/datepicker/dist/index.js +988 -482
- package/components/datepicker/dist/registered.js +988 -482
- package/components/dropdown/demo/customize.min.js +10 -1
- package/components/dropdown/demo/getting-started.min.js +10 -1
- package/components/dropdown/demo/index.min.js +10 -1
- package/components/dropdown/dist/auro-dropdown.d.ts +1 -0
- package/components/dropdown/dist/index.js +10 -1
- package/components/dropdown/dist/registered.js +10 -1
- package/components/form/demo/customize.html +6 -6
- package/components/form/demo/customize.md +203 -51
- package/components/form/demo/customize.min.js +2357 -1419
- package/components/form/demo/getting-started.min.js +2285 -1419
- package/components/form/demo/index.min.js +2285 -1419
- package/components/form/demo/registerDemoDeps.min.js +1922 -1382
- package/components/form/dist/auro-form.d.ts +122 -4
- package/components/form/dist/index.js +363 -37
- package/components/form/dist/registered.js +363 -37
- package/components/input/demo/api.md +5 -5
- package/components/input/demo/customize.html +1 -2
- package/components/input/demo/customize.md +62 -61
- package/components/input/demo/customize.min.js +177 -241
- package/components/input/demo/getting-started.min.js +177 -241
- package/components/input/demo/index.min.js +177 -241
- package/components/input/dist/base-input.d.ts +34 -93
- package/components/input/dist/index.js +190 -242
- package/components/input/dist/registered.js +177 -241
- package/components/radio/demo/customize.min.js +8 -6
- package/components/radio/demo/getting-started.min.js +8 -6
- package/components/radio/demo/index.min.js +8 -6
- package/components/radio/dist/index.js +8 -6
- package/components/radio/dist/registered.js +8 -6
- package/components/select/demo/customize.html +1 -2
- package/components/select/demo/customize.md +86 -0
- package/components/select/demo/customize.min.js +202 -68
- package/components/select/demo/getting-started.min.js +204 -115
- package/components/select/demo/index.min.js +202 -68
- package/components/select/demo/keyboard-behavior.md +18 -4
- package/components/select/dist/auro-select.d.ts +20 -8
- package/components/select/dist/index.js +202 -68
- package/components/select/dist/registered.js +202 -68
- package/custom-elements.json +1035 -604
- package/package.json +6 -2
- package/components/checkbox/demo/customize.js +0 -22
- package/components/checkbox/demo/demo-support.js +0 -1
- package/components/checkbox/demo/getting-started.js +0 -22
- package/components/checkbox/demo/index.js +0 -8
- package/components/checkbox/demo/styles.scss +0 -1
- package/components/combobox/demo/customize.js +0 -24
- package/components/combobox/demo/demo-support.js +0 -1
- package/components/combobox/demo/getting-started.js +0 -21
- package/components/combobox/demo/index.js +0 -23
- package/components/combobox/demo/styles.scss +0 -1
- package/components/counter/demo/customize.js +0 -21
- package/components/counter/demo/demo-support.js +0 -1
- package/components/counter/demo/index.js +0 -21
- package/components/counter/demo/styles.scss +0 -1
- package/components/datepicker/demo/customize.js +0 -19
- package/components/datepicker/demo/demo-support.js +0 -1
- package/components/datepicker/demo/index.js +0 -23
- package/components/datepicker/demo/styles.scss +0 -1
- package/components/dropdown/demo/customize.js +0 -9
- package/components/dropdown/demo/demo-support.js +0 -1
- package/components/dropdown/demo/getting-started.js +0 -9
- package/components/dropdown/demo/index.js +0 -16
- package/components/dropdown/demo/styles.scss +0 -1
- package/components/form/demo/customize.js +0 -9
- package/components/form/demo/demo-support.js +0 -1
- package/components/form/demo/getting-started.js +0 -9
- package/components/form/demo/index.js +0 -5
- package/components/form/demo/registerDemoDeps.js +0 -23
- package/components/form/demo/styles.scss +0 -1
- package/components/input/demo/customize.js +0 -25
- package/components/input/demo/demo-support.js +0 -1
- package/components/input/demo/getting-started.js +0 -8
- package/components/input/demo/index.js +0 -8
- package/components/input/demo/styles.css +0 -974
- package/components/input/demo/styles.scss +0 -1
- package/components/menu/demo/demo-support.js +0 -1
- package/components/menu/demo/index.js +0 -25
- package/components/menu/demo/styles.scss +0 -1
- package/components/radio/demo/customize.js +0 -22
- package/components/radio/demo/demo-support.js +0 -1
- package/components/radio/demo/getting-started.js +0 -24
- package/components/radio/demo/index.js +0 -8
- package/components/radio/demo/styles.scss +0 -1
- package/components/select/demo/customize.js +0 -11
- package/components/select/demo/demo-support.js +0 -1
- package/components/select/demo/getting-started.js +0 -26
- package/components/select/demo/index.js +0 -11
- package/components/select/demo/styles.scss +0 -1
- /package/components/datepicker/dist/{src/auro-calendar-month.d.ts → auro-calendar-month.d.ts} +0 -0
- /package/components/datepicker/dist/{src/buttonVersion.d.ts → buttonVersion.d.ts} +0 -0
- /package/components/datepicker/dist/{src/datepickerKeyboardStrategy.d.ts → datepickerKeyboardStrategy.d.ts} +0 -0
- /package/components/datepicker/dist/{src/iconVersion.d.ts → iconVersion.d.ts} +0 -0
- /package/components/datepicker/dist/{src/index.d.ts → index.d.ts} +0 -0
- /package/components/datepicker/dist/{src/popoverVersion.d.ts → popoverVersion.d.ts} +0 -0
- /package/components/datepicker/dist/{src/styles → styles}/classic/color-css.d.ts +0 -0
- /package/components/datepicker/dist/{src/styles → styles}/classic/style-css.d.ts +0 -0
- /package/components/datepicker/dist/{src/styles → styles}/color-calendar-css.d.ts +0 -0
- /package/components/datepicker/dist/{src/styles → styles}/color-cell-css.d.ts +0 -0
- /package/components/datepicker/dist/{src/styles → styles}/color-css.d.ts +0 -0
- /package/components/datepicker/dist/{src/styles → styles}/color-month-css.d.ts +0 -0
- /package/components/datepicker/dist/{src/styles → styles}/shapeSize-css.d.ts +0 -0
- /package/components/datepicker/dist/{src/styles → styles}/snowflake/color-css.d.ts +0 -0
- /package/components/datepicker/dist/{src/styles → styles}/snowflake/style-css.d.ts +0 -0
- /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-cell-css.d.ts +0 -0
- /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-css.d.ts +0 -0
- /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-month-css.d.ts +0 -0
- /package/components/datepicker/dist/{src/styles → styles}/style-css.d.ts +0 -0
- /package/components/datepicker/dist/{src/styles → styles}/tokens-css.d.ts +0 -0
- /package/components/datepicker/dist/{src/utilities.d.ts → utilities.d.ts} +0 -0
- /package/components/datepicker/dist/{src/utilitiesCalendar.d.ts → utilitiesCalendar.d.ts} +0 -0
- /package/components/datepicker/dist/{src/utilitiesCalendarRender.d.ts → utilitiesCalendarRender.d.ts} +0 -0
- /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/day.d.ts +0 -0
- /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker-calendar.d.ts +0 -0
- /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker-cell.d.ts +0 -0
- /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
|
-
|
|
557
|
-
|
|
558
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 = '
|
|
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
|
|
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 = '
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
7801
|
-
|
|
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
|
|
7804
|
-
|
|
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
|
-
//
|
|
7833
|
-
//
|
|
7834
|
-
|
|
7835
|
-
|
|
7836
|
-
|
|
7837
|
-
|
|
7838
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
8217
|
-
|
|
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.
|