@aurodesignsystem-dev/auro-formkit 0.0.0-pr1511.0 → 0.0.0-pr1512.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 (49) hide show
  1. package/components/checkbox/demo/customize.min.js +1 -1
  2. package/components/checkbox/demo/getting-started.min.js +1 -1
  3. package/components/checkbox/demo/index.min.js +1 -1
  4. package/components/checkbox/dist/index.js +1 -1
  5. package/components/checkbox/dist/registered.js +1 -1
  6. package/components/combobox/demo/customize.min.js +119 -97
  7. package/components/combobox/demo/getting-started.min.js +119 -97
  8. package/components/combobox/demo/index.min.js +119 -97
  9. package/components/combobox/dist/index.js +118 -96
  10. package/components/combobox/dist/registered.js +118 -96
  11. package/components/counter/demo/customize.min.js +2 -3
  12. package/components/counter/demo/index.min.js +2 -3
  13. package/components/counter/dist/index.js +2 -3
  14. package/components/counter/dist/registered.js +2 -3
  15. package/components/datepicker/demo/customize.min.js +139 -98
  16. package/components/datepicker/demo/index.min.js +139 -98
  17. package/components/datepicker/dist/index.js +139 -98
  18. package/components/datepicker/dist/registered.js +139 -98
  19. package/components/dropdown/demo/customize.min.js +1 -2
  20. package/components/dropdown/demo/getting-started.min.js +1 -2
  21. package/components/dropdown/demo/index.min.js +1 -2
  22. package/components/dropdown/dist/index.js +1 -2
  23. package/components/dropdown/dist/registered.js +1 -2
  24. package/components/form/demo/customize.min.js +434 -426
  25. package/components/form/demo/getting-started.min.js +434 -426
  26. package/components/form/demo/index.min.js +434 -426
  27. package/components/form/demo/registerDemoDeps.min.js +434 -426
  28. package/components/input/demo/api.md +5 -5
  29. package/components/input/demo/customize.md +8 -8
  30. package/components/input/demo/customize.min.js +116 -93
  31. package/components/input/demo/getting-started.min.js +116 -93
  32. package/components/input/demo/index.min.js +116 -93
  33. package/components/input/dist/base-input.d.ts +33 -44
  34. package/components/input/dist/index.js +129 -94
  35. package/components/input/dist/registered.js +116 -93
  36. package/components/radio/demo/customize.min.js +1 -1
  37. package/components/radio/demo/getting-started.min.js +1 -1
  38. package/components/radio/demo/index.min.js +1 -1
  39. package/components/radio/dist/index.js +1 -1
  40. package/components/radio/dist/registered.js +1 -1
  41. package/components/select/demo/customize.min.js +55 -132
  42. package/components/select/demo/getting-started.min.js +55 -132
  43. package/components/select/demo/index.min.js +55 -132
  44. package/components/select/demo/keyboard-behavior.md +4 -18
  45. package/components/select/dist/auro-select.d.ts +8 -20
  46. package/components/select/dist/index.js +55 -132
  47. package/components/select/dist/registered.js +55 -132
  48. package/custom-elements.json +1942 -1728
  49. package/package.json +1 -1
@@ -10456,6 +10456,13 @@ let AuroInputUtilities$3 = class AuroInputUtilities {
10456
10456
  * @returns {string | undefined}
10457
10457
  */
10458
10458
  toFormattedValue(valueObject, format) {
10459
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
10460
+ // `format` argument has to fail gracefully rather than throw on
10461
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
10462
+ // as "no format → no display value".
10463
+ if (!format) {
10464
+ return undefined;
10465
+ }
10459
10466
  const normalizedFormat = format.toLowerCase();
10460
10467
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
10461
10468
 
@@ -10606,79 +10613,18 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
10606
10613
  constructor() {
10607
10614
  super();
10608
10615
 
10609
- this.appearance = "default";
10610
- this.disabled = false;
10611
- this.layout = 'classic';
10612
- this.locale = 'en-US';
10613
- this.max = undefined;
10614
- this._maxObject = undefined;
10615
- this.maxLength = undefined;
10616
- this.min = undefined;
10617
- this._minObject = undefined;
10618
- this.minLength = undefined;
10619
- this.required = false;
10620
- this.onDark = false;
10621
- this.setCustomValidityForType = undefined;
10622
- this.size = 'lg';
10623
- this.shape = 'classic';
10624
- this.value = undefined;
10625
- this._valueObject = undefined;
10626
-
10627
- this._initializePrivateDefaults();
10628
- }
10629
-
10630
- /**
10631
- * Internal Defaults.
10632
- * @private
10633
- * @returns {void}
10634
- */
10635
- _initializePrivateDefaults() {
10616
+ // Single-source initialization. Alphabetized so duplicate or stale
10617
+ // defaults are immediately obvious on a diff. Every field is assigned
10618
+ // exactly once here (previously the constructor + the old
10619
+ // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
10620
+ // fields and double-allocated `util` and `validation`, discarding the
10621
+ // first instance). `validation` is now allocated exactly once; `util`
10622
+ // is seeded here with an en-US default and then rebuilt in
10623
+ // `connectedCallback` once the consumer-resolved locale is available,
10624
+ // so a parent (datepicker/combobox) calling `validate()` synchronously
10625
+ // during its own update cycle sees a populated util instance.
10636
10626
  this.activeLabel = false;
10637
- this.appearance = "default";
10638
- this.icon = false;
10639
- this.disabled = false;
10640
- this.dvInputOnly = false;
10641
- this.hideLabelVisually = false;
10642
- this.max = undefined;
10643
- this.maxLength = undefined;
10644
- this.min = undefined;
10645
- this.minLength = undefined;
10646
- this.noValidate = false;
10647
- this.onDark = false;
10648
- this.required = false;
10649
- this.setCustomValidityForType = undefined;
10650
-
10651
- // Used for storing raw values returned from input mask.
10652
- this._rawMaskValue = undefined;
10653
-
10654
- /**
10655
- * @private
10656
- */
10657
- this.layout = 'classic';
10658
-
10659
- /**
10660
- * @private
10661
- */
10662
- this.shape = 'classic';
10663
-
10664
- /**
10665
- * @private
10666
- */
10667
- this.size = 'lg';
10668
-
10669
- this.touched = false;
10670
- this.util = new AuroInputUtilities$3({
10671
- locale: "en-US",
10672
- format: this.format
10673
- });
10674
- this.validation = new AuroFormValidation$7();
10675
- this.inputIconName = undefined;
10676
- this.showPassword = false;
10677
- this.validationCCLength = undefined;
10678
- this.hasValue = false;
10679
- this.label = 'Input label is undefined';
10680
-
10681
-
10627
+ /** @private */
10682
10628
  this.allowedInputTypes = [
10683
10629
  "text",
10684
10630
  "number",
@@ -10687,7 +10633,8 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
10687
10633
  "credit-card",
10688
10634
  "tel"
10689
10635
  ];
10690
- this.icon = false;
10636
+ this.appearance = "default";
10637
+ /** @private */
10691
10638
  this.dateFormatMap = {
10692
10639
  'mm/dd/yyyy': 'dateMMDDYYYY',
10693
10640
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -10704,27 +10651,57 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
10704
10651
  'dd/mm': 'dateDDMM',
10705
10652
  'mm/dd': 'dateMMDD'
10706
10653
  };
10654
+ this.disabled = false;
10655
+ /** @private */
10707
10656
  this.domHandler = new DomHandler$3();
10708
10657
  this.dvInputOnly = false;
10709
10658
  this.hasValue = false;
10659
+ this.hideLabelVisually = false;
10660
+ this.icon = false;
10661
+ /** @private */
10710
10662
  this.inputIconName = undefined;
10663
+ /** @private */
10711
10664
  this.label = 'Input label is undefined';
10665
+ this.layout = 'classic';
10666
+ this.locale = 'en-US';
10667
+ this.max = undefined;
10668
+ this._maxObject = undefined;
10669
+ this.maxLength = undefined;
10670
+ this.min = undefined;
10671
+ this._minObject = undefined;
10672
+ this.minLength = undefined;
10712
10673
  this.noValidate = false;
10713
- this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
10674
+ this.onDark = false;
10675
+ // Raw values returned from the input mask before model normalization.
10676
+ this._rawMaskValue = undefined;
10677
+ this.required = false;
10678
+ this.setCustomValidityForType = undefined;
10679
+ // Credit Card is intentionally excluded — its mask manages the cursor
10680
+ // itself, and listing it here caused cursor placement issues in Safari.
10681
+ /** @private */
10714
10682
  this.setSelectionInputTypes = [
10715
10683
  "text",
10716
10684
  "password",
10717
10685
  "email"
10718
- ]; // Credit Card is not included as this caused cursor placement issues in Safari.
10686
+ ];
10687
+ this.shape = 'classic';
10688
+ /** @private */
10719
10689
  this.showPassword = false;
10690
+ this.size = 'lg';
10720
10691
  this.touched = false;
10692
+ /** @private */
10721
10693
  this.uniqueId = new UniqueId$2().create();
10694
+ /** @private */
10722
10695
  this.util = new AuroInputUtilities$3({
10723
10696
  locale: this.locale,
10724
10697
  format: this.format
10725
10698
  });
10699
+ /** @private */
10726
10700
  this.validation = new AuroFormValidation$7();
10701
+ /** @private */
10727
10702
  this.validationCCLength = undefined;
10703
+ this.value = undefined;
10704
+ this._valueObject = undefined;
10728
10705
  }
10729
10706
 
10730
10707
  // function to define props used within the scope of this component
@@ -11272,6 +11249,15 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11272
11249
 
11273
11250
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
11274
11251
 
11252
+ // Normalize the format token to lowercase so case-mixed values supplied
11253
+ // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
11254
+ // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
11255
+ // format silently misses the map and leaves `setCustomValidityForType`
11256
+ // unset.
11257
+ if (this.format) {
11258
+ this.format = this.format.toLowerCase();
11259
+ }
11260
+
11275
11261
  // use validity message override if declared when initializing the component
11276
11262
  if (this.hasAttribute('setCustomValidity')) {
11277
11263
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -11705,6 +11691,38 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11705
11691
  this.touched = true;
11706
11692
  this.validation.validate(this);
11707
11693
  }
11694
+
11695
+ // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
11696
+ // update that can re-render the input and reset the native cursor; we
11697
+ // capture the caret position before that update commits and restore it
11698
+ // via `setSelectionRange` once the update has flushed. Gated on
11699
+ // `setSelectionInputTypes` so credit-card (and other masked types whose
11700
+ // formatter manages the cursor itself) doesn't get a competing write.
11701
+ // Capture the caret position INSIDE the gate — reading `selectionStart`
11702
+ // on input types that don't support text selection (number, email in
11703
+ // some browsers) throws InvalidStateError, which would crash all input
11704
+ // handling. Wrap the read in try/catch belt-and-suspenders even though
11705
+ // the gated types currently support it, since the list is a public
11706
+ // property a consumer could mutate.
11707
+ if (this.setSelectionInputTypes.includes(this.type)) {
11708
+ let selectionStart;
11709
+ try {
11710
+ selectionStart = this.inputElement.selectionStart;
11711
+ } catch (error) { // eslint-disable-line no-unused-vars
11712
+ return;
11713
+ }
11714
+ if (typeof selectionStart !== 'number') {
11715
+ return;
11716
+ }
11717
+ this.updateComplete.then(() => {
11718
+ try {
11719
+ this.inputElement.setSelectionRange(selectionStart, selectionStart);
11720
+ } catch (error) { // eslint-disable-line no-unused-vars
11721
+ // Some input types (number/email in certain UAs) throw on
11722
+ // setSelectionRange; swallow and let the native cursor stand.
11723
+ }
11724
+ });
11725
+ }
11708
11726
  }
11709
11727
 
11710
11728
  /**
@@ -12331,7 +12349,7 @@ let AuroHelpText$8 = class AuroHelpText extends i$2 {
12331
12349
  }
12332
12350
  };
12333
12351
 
12334
- var formkitVersion$8 = '202606252142';
12352
+ var formkitVersion$8 = '202606252337';
12335
12353
 
12336
12354
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
12337
12355
  // See LICENSE in the project root for license information.
@@ -12834,6 +12852,7 @@ let AuroInput$2 = class AuroInput extends BaseInput$2 {
12834
12852
  <${this.buttonTag}
12835
12853
  @click="${this.handleClickShowPassword}"
12836
12854
  appearance="${this.onDark ? 'inverse' : this.appearance}"
12855
+ aria-pressed="${this.showPassword ? 'true' : 'false'}"
12837
12856
  class="notificationBtn passwordBtn"
12838
12857
  shape="circle"
12839
12858
  size="sm"
@@ -12907,25 +12926,29 @@ let AuroInput$2 = class AuroInput extends BaseInput$2 {
12907
12926
  * @returns {html} - Returns HTML for the help text and error message.
12908
12927
  */
12909
12928
  renderHtmlHelpText() {
12929
+ // Single `<p>` with stable identity across validity transitions —
12930
+ // previously two distinct templates (valid vs invalid) caused Lit to
12931
+ // replace the node entirely on a flip, and VoiceOver wouldn't
12932
+ // re-announce because the live-region element it was watching had been
12933
+ // removed and a new one inserted. Keeping one node means the `role`,
12934
+ // `aria-live`, and text content all change in-place, which AT does
12935
+ // observe and announce.
12936
+ const isError = this.validity && this.validity !== 'valid';
12910
12937
  return u$d`
12911
- ${!this.validity || this.validity === undefined || this.validity === 'valid'
12912
- ? u$d`
12913
- <${this.helpTextTag}
12914
- appearance="${this.onDark ? 'inverse' : this.appearance}">
12915
- <p id="${this.uniqueId}" part="helpText">
12916
- <slot name="helpText">${this.getHelpText()}</slot>
12917
- </p>
12918
- </${this.helpTextTag}>
12919
- `
12920
- : u$d`
12921
- <${this.helpTextTag} error
12922
- appearance="${this.onDark ? 'inverse' : this.appearance}">
12923
- <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
12924
- ${this.errorMessage}
12925
- </p>
12926
- </${this.helpTextTag}>
12927
- `
12928
- }
12938
+ <${this.helpTextTag}
12939
+ appearance="${this.onDark ? 'inverse' : this.appearance}"
12940
+ ?error=${isError}>
12941
+ <p
12942
+ id="${this.uniqueId}"
12943
+ part="helpText"
12944
+ role="${o$4(isError ? 'alert' : undefined)}"
12945
+ aria-live="${o$4(isError ? 'assertive' : undefined)}">
12946
+ ${isError
12947
+ ? this.errorMessage
12948
+ : u$d`<slot name="helpText">${this.getHelpText()}</slot>`
12949
+ }
12950
+ </p>
12951
+ </${this.helpTextTag}>
12929
12952
  `;
12930
12953
  }
12931
12954
 
@@ -23566,6 +23589,13 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
23566
23589
  * @returns {string | undefined}
23567
23590
  */
23568
23591
  toFormattedValue(valueObject, format) {
23592
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
23593
+ // `format` argument has to fail gracefully rather than throw on
23594
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
23595
+ // as "no format → no display value".
23596
+ if (!format) {
23597
+ return undefined;
23598
+ }
23569
23599
  const normalizedFormat = format.toLowerCase();
23570
23600
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
23571
23601
 
@@ -26450,7 +26480,7 @@ let AuroBibtemplate$3 = class AuroBibtemplate extends i$2 {
26450
26480
  }
26451
26481
  };
26452
26482
 
26453
- var formkitVersion$2$1 = '202606252142';
26483
+ var formkitVersion$2$1 = '202606252337';
26454
26484
 
26455
26485
  let l$1$2 = class l{generateElementName(t,e){let o=t;return o+="-",o+=e.replace(/[.]/g,"_"),o}generateTag(o,s,a){const r=this.generateElementName(o,s),i=i$5`${s$5(r)}`;return customElements.get(r)||customElements.define(r,class extends a{}),i}};let d$1$2 = class d{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}getSlotText(t,e){const o=t.shadowRoot?.querySelector(`slot[name="${e}"]`),s=(o?.assignedNodes({flatten:true})||[]).map(t=>t.textContent?.trim()).join(" ").trim();return s||null}};let h$1$2 = class h{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}};var c$1$3=i$4`:host{color:var(--ds-auro-loader-color)}:host>span{background-color:var(--ds-auro-loader-background-color);border-color:var(--ds-auro-loader-border-color)}:host([onlight]),:host([appearance=brand]){--ds-auro-loader-color: var(--ds-basic-color-brand-primary, #01426a)}:host([ondark]),:host([appearance=inverse]){--ds-auro-loader-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host([orbit])>span{--ds-auro-loader-background-color: transparent}:host([orbit])>span:nth-child(1){--ds-auro-loader-border-color: currentcolor;opacity:.25}:host([orbit])>span:nth-child(2){--ds-auro-loader-border-color: currentcolor;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}
26456
26486
  `,u$4$2=i$4`.body-default{font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default,.body-lg{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-lg{font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-sm{font-size:var(--wcss-body-sm-font-size, .875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm,.body-xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-xs{font-size:var(--wcss-body-xs-font-size, .75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-2xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:var(--wcss-body-2xs-font-size, .625rem);font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0);line-height:var(--wcss-body-2xs-line-height, .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, 450);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, 450);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, .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, .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, .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, .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, .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, .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(.875rem, 1.1666666667vw, .875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, .1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}:focus:not(:focus-visible){outline:3px solid transparent}:host,:host>span{position:relative}:host{width:2rem;height:2rem;display:inline-block;font-size:0}:host>span{position:absolute;display:inline-block;float:none;top:0;left:0;width:2rem;height:2rem;border-radius:100%;border-style:solid;border-width:0;box-sizing:border-box}:host([xs]),:host([xs])>span{width:1.2rem;height:1.2rem}:host([sm]),:host([sm])>span{width:3rem;height:3rem}:host([md]),:host([md])>span{width:5rem;height:5rem}:host([lg]),:host([lg])>span{width:8rem;height:8rem}:host{--margin: .375rem;--margin-xs: .2rem;--margin-sm: .5rem;--margin-md: .75rem;--margin-lg: 1rem}:host([pulse]),:host([pulse])>span{position:relative}:host([pulse]){width:calc(3rem + var(--margin) * 6);height:calc(1rem + var(--margin) * 2)}:host([pulse])>span{width:1rem;height:1rem;margin:var(--margin);animation:pulse 1.5s ease infinite}:host([pulse][xs]){width:calc(1.95rem + var(--margin-xs) * 6);height:calc(.65rem + var(--margin-xs) * 2)}:host([pulse][xs])>span{margin:var(--margin-xs);width:.65rem;height:.65rem}:host([pulse][sm]){width:calc(6rem + var(--margin-sm) * 6);height:calc(2rem + var(--margin-sm) * 2)}:host([pulse][sm])>span{margin:var(--margin-sm);width:2rem;height:2rem}:host([pulse][md]){width:calc(9rem + var(--margin-md) * 6);height:calc(3rem + var(--margin-md) * 2)}:host([pulse][md])>span{margin:var(--margin-md);width:3rem;height:3rem}:host([pulse][lg]){width:calc(15rem + var(--margin-lg) * 6);height:calc(5rem + var(--margin-lg) * 2)}:host([pulse][lg])>span{margin:var(--margin-lg);width:5rem;height:5rem}:host([pulse])>span:nth-child(1){animation-delay:-.4s}:host([pulse])>span:nth-child(2){animation-delay:-.2s}:host([pulse])>span:nth-child(3){animation-delay:0ms}@keyframes pulse{0%,to{opacity:.1;transform:scale(.9)}50%{opacity:1;transform:scale(1.1)}}:host([orbit]),:host([orbit])>span{opacity:1}:host([orbit])>span{border-width:5px}:host([orbit])>span:nth-child(2){animation:orbit 2s linear infinite}:host([orbit][sm])>span{border-width:8px}:host([orbit][md])>span{border-width:13px}:host([orbit][lg])>span{border-width:21px}@keyframes orbit{0%{transform:rotate(0)}to{transform:rotate(360deg)}}:host([ringworm])>svg{animation:rotate 2s linear infinite;height:100%;width:100%;stroke:currentcolor;stroke-width:8}:host([ringworm]) .path{stroke-dashoffset:0;animation:ringworm 1.5s ease-in-out infinite;stroke-linecap:round}@keyframes rotate{to{transform:rotate(360deg)}}@keyframes ringworm{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}:host([laser]){position:static;width:100%;display:block;height:0;overflow:hidden;font-size:unset}:host([laser])>span{position:fixed;width:100%;height:.25rem;border-radius:0;z-index:100}:host([laser])>span:nth-child(1){border-color:currentcolor;opacity:.25}:host([laser])>span:nth-child(2){border-color:currentcolor;animation:laser 2s linear infinite;opacity:1;width:50%}:host([laser][sm])>span:nth-child(2){width:20%}:host([laser][md])>span:nth-child(2){width:30%}:host([laser][lg])>span:nth-child(2){width:50%;animation-duration:1.5s}:host([laser][xl])>span:nth-child(2){width:80%;animation-duration:1.5s}@keyframes laser{0%{left:-100%}to{left:110%}}:host>.no-animation{display:none}@media (prefers-reduced-motion: reduce){:host{display:flex;align-items:center;justify-content:center}:host>span{opacity:1}:host>.loader{display:none}:host>svg{display:none}:host>.no-animation{display:block}}
@@ -31961,7 +31991,7 @@ let AuroHelpText$2$1 = class AuroHelpText extends i$2 {
31961
31991
  }
31962
31992
  };
31963
31993
 
31964
- var formkitVersion$1$3 = '202606252142';
31994
+ var formkitVersion$1$3 = '202606252337';
31965
31995
 
31966
31996
  let AuroElement$2$2 = class AuroElement extends i$2 {
31967
31997
  static get properties() {
@@ -33233,7 +33263,6 @@ let AuroDropdown$3 = class AuroDropdown extends AuroElement$2$2 {
33233
33263
  role="${o$4(this.triggerContentFocusable ? undefined : this.a11yRole)}"
33234
33264
  aria-expanded="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
33235
33265
  aria-controls="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
33236
- aria-haspopup="${o$4(this.a11yRole === 'combobox' ? 'listbox' : undefined)}"
33237
33266
  aria-labelledby="${o$4(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
33238
33267
  aria-disabled="${o$4(this.disabled ? 'true' : undefined)}"
33239
33268
  @focusin="${this.handleFocusin}"
@@ -43680,6 +43709,13 @@ let AuroInputUtilities$2 = class AuroInputUtilities {
43680
43709
  * @returns {string | undefined}
43681
43710
  */
43682
43711
  toFormattedValue(valueObject, format) {
43712
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
43713
+ // `format` argument has to fail gracefully rather than throw on
43714
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
43715
+ // as "no format → no display value".
43716
+ if (!format) {
43717
+ return undefined;
43718
+ }
43683
43719
  const normalizedFormat = format.toLowerCase();
43684
43720
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
43685
43721
 
@@ -43830,79 +43866,18 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
43830
43866
  constructor() {
43831
43867
  super();
43832
43868
 
43833
- this.appearance = "default";
43834
- this.disabled = false;
43835
- this.layout = 'classic';
43836
- this.locale = 'en-US';
43837
- this.max = undefined;
43838
- this._maxObject = undefined;
43839
- this.maxLength = undefined;
43840
- this.min = undefined;
43841
- this._minObject = undefined;
43842
- this.minLength = undefined;
43843
- this.required = false;
43844
- this.onDark = false;
43845
- this.setCustomValidityForType = undefined;
43846
- this.size = 'lg';
43847
- this.shape = 'classic';
43848
- this.value = undefined;
43849
- this._valueObject = undefined;
43850
-
43851
- this._initializePrivateDefaults();
43852
- }
43853
-
43854
- /**
43855
- * Internal Defaults.
43856
- * @private
43857
- * @returns {void}
43858
- */
43859
- _initializePrivateDefaults() {
43869
+ // Single-source initialization. Alphabetized so duplicate or stale
43870
+ // defaults are immediately obvious on a diff. Every field is assigned
43871
+ // exactly once here (previously the constructor + the old
43872
+ // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
43873
+ // fields and double-allocated `util` and `validation`, discarding the
43874
+ // first instance). `validation` is now allocated exactly once; `util`
43875
+ // is seeded here with an en-US default and then rebuilt in
43876
+ // `connectedCallback` once the consumer-resolved locale is available,
43877
+ // so a parent (datepicker/combobox) calling `validate()` synchronously
43878
+ // during its own update cycle sees a populated util instance.
43860
43879
  this.activeLabel = false;
43861
- this.appearance = "default";
43862
- this.icon = false;
43863
- this.disabled = false;
43864
- this.dvInputOnly = false;
43865
- this.hideLabelVisually = false;
43866
- this.max = undefined;
43867
- this.maxLength = undefined;
43868
- this.min = undefined;
43869
- this.minLength = undefined;
43870
- this.noValidate = false;
43871
- this.onDark = false;
43872
- this.required = false;
43873
- this.setCustomValidityForType = undefined;
43874
-
43875
- // Used for storing raw values returned from input mask.
43876
- this._rawMaskValue = undefined;
43877
-
43878
- /**
43879
- * @private
43880
- */
43881
- this.layout = 'classic';
43882
-
43883
- /**
43884
- * @private
43885
- */
43886
- this.shape = 'classic';
43887
-
43888
- /**
43889
- * @private
43890
- */
43891
- this.size = 'lg';
43892
-
43893
- this.touched = false;
43894
- this.util = new AuroInputUtilities$2({
43895
- locale: "en-US",
43896
- format: this.format
43897
- });
43898
- this.validation = new AuroFormValidation$6();
43899
- this.inputIconName = undefined;
43900
- this.showPassword = false;
43901
- this.validationCCLength = undefined;
43902
- this.hasValue = false;
43903
- this.label = 'Input label is undefined';
43904
-
43905
-
43880
+ /** @private */
43906
43881
  this.allowedInputTypes = [
43907
43882
  "text",
43908
43883
  "number",
@@ -43911,7 +43886,8 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
43911
43886
  "credit-card",
43912
43887
  "tel"
43913
43888
  ];
43914
- this.icon = false;
43889
+ this.appearance = "default";
43890
+ /** @private */
43915
43891
  this.dateFormatMap = {
43916
43892
  'mm/dd/yyyy': 'dateMMDDYYYY',
43917
43893
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -43928,27 +43904,57 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
43928
43904
  'dd/mm': 'dateDDMM',
43929
43905
  'mm/dd': 'dateMMDD'
43930
43906
  };
43907
+ this.disabled = false;
43908
+ /** @private */
43931
43909
  this.domHandler = new DomHandler$2();
43932
43910
  this.dvInputOnly = false;
43933
43911
  this.hasValue = false;
43912
+ this.hideLabelVisually = false;
43913
+ this.icon = false;
43914
+ /** @private */
43934
43915
  this.inputIconName = undefined;
43916
+ /** @private */
43935
43917
  this.label = 'Input label is undefined';
43918
+ this.layout = 'classic';
43919
+ this.locale = 'en-US';
43920
+ this.max = undefined;
43921
+ this._maxObject = undefined;
43922
+ this.maxLength = undefined;
43923
+ this.min = undefined;
43924
+ this._minObject = undefined;
43925
+ this.minLength = undefined;
43936
43926
  this.noValidate = false;
43937
- this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
43927
+ this.onDark = false;
43928
+ // Raw values returned from the input mask before model normalization.
43929
+ this._rawMaskValue = undefined;
43930
+ this.required = false;
43931
+ this.setCustomValidityForType = undefined;
43932
+ // Credit Card is intentionally excluded — its mask manages the cursor
43933
+ // itself, and listing it here caused cursor placement issues in Safari.
43934
+ /** @private */
43938
43935
  this.setSelectionInputTypes = [
43939
43936
  "text",
43940
43937
  "password",
43941
43938
  "email"
43942
- ]; // Credit Card is not included as this caused cursor placement issues in Safari.
43939
+ ];
43940
+ this.shape = 'classic';
43941
+ /** @private */
43943
43942
  this.showPassword = false;
43943
+ this.size = 'lg';
43944
43944
  this.touched = false;
43945
+ /** @private */
43945
43946
  this.uniqueId = new UniqueId$1().create();
43947
+ /** @private */
43946
43948
  this.util = new AuroInputUtilities$2({
43947
43949
  locale: this.locale,
43948
43950
  format: this.format
43949
43951
  });
43952
+ /** @private */
43950
43953
  this.validation = new AuroFormValidation$6();
43954
+ /** @private */
43951
43955
  this.validationCCLength = undefined;
43956
+ this.value = undefined;
43957
+ this._valueObject = undefined;
43952
43958
  }
43953
43959
 
43954
43960
  // function to define props used within the scope of this component
@@ -44496,6 +44502,15 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44496
44502
 
44497
44503
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
44498
44504
 
44505
+ // Normalize the format token to lowercase so case-mixed values supplied
44506
+ // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
44507
+ // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
44508
+ // format silently misses the map and leaves `setCustomValidityForType`
44509
+ // unset.
44510
+ if (this.format) {
44511
+ this.format = this.format.toLowerCase();
44512
+ }
44513
+
44499
44514
  // use validity message override if declared when initializing the component
44500
44515
  if (this.hasAttribute('setCustomValidity')) {
44501
44516
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -44929,6 +44944,38 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44929
44944
  this.touched = true;
44930
44945
  this.validation.validate(this);
44931
44946
  }
44947
+
44948
+ // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
44949
+ // update that can re-render the input and reset the native cursor; we
44950
+ // capture the caret position before that update commits and restore it
44951
+ // via `setSelectionRange` once the update has flushed. Gated on
44952
+ // `setSelectionInputTypes` so credit-card (and other masked types whose
44953
+ // formatter manages the cursor itself) doesn't get a competing write.
44954
+ // Capture the caret position INSIDE the gate — reading `selectionStart`
44955
+ // on input types that don't support text selection (number, email in
44956
+ // some browsers) throws InvalidStateError, which would crash all input
44957
+ // handling. Wrap the read in try/catch belt-and-suspenders even though
44958
+ // the gated types currently support it, since the list is a public
44959
+ // property a consumer could mutate.
44960
+ if (this.setSelectionInputTypes.includes(this.type)) {
44961
+ let selectionStart;
44962
+ try {
44963
+ selectionStart = this.inputElement.selectionStart;
44964
+ } catch (error) { // eslint-disable-line no-unused-vars
44965
+ return;
44966
+ }
44967
+ if (typeof selectionStart !== 'number') {
44968
+ return;
44969
+ }
44970
+ this.updateComplete.then(() => {
44971
+ try {
44972
+ this.inputElement.setSelectionRange(selectionStart, selectionStart);
44973
+ } catch (error) { // eslint-disable-line no-unused-vars
44974
+ // Some input types (number/email in certain UAs) throw on
44975
+ // setSelectionRange; swallow and let the native cursor stand.
44976
+ }
44977
+ });
44978
+ }
44932
44979
  }
44933
44980
 
44934
44981
  /**
@@ -45555,7 +45602,7 @@ let AuroHelpText$1$3 = class AuroHelpText extends i$2 {
45555
45602
  }
45556
45603
  };
45557
45604
 
45558
- var formkitVersion$7 = '202606252142';
45605
+ var formkitVersion$7 = '202606252337';
45559
45606
 
45560
45607
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
45561
45608
  // See LICENSE in the project root for license information.
@@ -46058,6 +46105,7 @@ let AuroInput$1 = class AuroInput extends BaseInput$1 {
46058
46105
  <${this.buttonTag}
46059
46106
  @click="${this.handleClickShowPassword}"
46060
46107
  appearance="${this.onDark ? 'inverse' : this.appearance}"
46108
+ aria-pressed="${this.showPassword ? 'true' : 'false'}"
46061
46109
  class="notificationBtn passwordBtn"
46062
46110
  shape="circle"
46063
46111
  size="sm"
@@ -46131,25 +46179,29 @@ let AuroInput$1 = class AuroInput extends BaseInput$1 {
46131
46179
  * @returns {html} - Returns HTML for the help text and error message.
46132
46180
  */
46133
46181
  renderHtmlHelpText() {
46182
+ // Single `<p>` with stable identity across validity transitions —
46183
+ // previously two distinct templates (valid vs invalid) caused Lit to
46184
+ // replace the node entirely on a flip, and VoiceOver wouldn't
46185
+ // re-announce because the live-region element it was watching had been
46186
+ // removed and a new one inserted. Keeping one node means the `role`,
46187
+ // `aria-live`, and text content all change in-place, which AT does
46188
+ // observe and announce.
46189
+ const isError = this.validity && this.validity !== 'valid';
46134
46190
  return u$d`
46135
- ${!this.validity || this.validity === undefined || this.validity === 'valid'
46136
- ? u$d`
46137
- <${this.helpTextTag}
46138
- appearance="${this.onDark ? 'inverse' : this.appearance}">
46139
- <p id="${this.uniqueId}" part="helpText">
46140
- <slot name="helpText">${this.getHelpText()}</slot>
46141
- </p>
46142
- </${this.helpTextTag}>
46143
- `
46144
- : u$d`
46145
- <${this.helpTextTag} error
46146
- appearance="${this.onDark ? 'inverse' : this.appearance}">
46147
- <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
46148
- ${this.errorMessage}
46149
- </p>
46150
- </${this.helpTextTag}>
46151
- `
46152
- }
46191
+ <${this.helpTextTag}
46192
+ appearance="${this.onDark ? 'inverse' : this.appearance}"
46193
+ ?error=${isError}>
46194
+ <p
46195
+ id="${this.uniqueId}"
46196
+ part="helpText"
46197
+ role="${o$4(isError ? 'alert' : undefined)}"
46198
+ aria-live="${o$4(isError ? 'assertive' : undefined)}">
46199
+ ${isError
46200
+ ? this.errorMessage
46201
+ : u$d`<slot name="helpText">${this.getHelpText()}</slot>`
46202
+ }
46203
+ </p>
46204
+ </${this.helpTextTag}>
46153
46205
  `;
46154
46206
  }
46155
46207
 
@@ -46296,6 +46348,15 @@ function formatISODate(isoStr, format) {
46296
46348
  try {
46297
46349
  const date = dateFormatter$2.stringToDateInstance(isoStr);
46298
46350
 
46351
+ // `stringToDateInstance` returns an `Invalid Date` for malformed strings
46352
+ // and `null` for non-string input — it does NOT throw. Without this
46353
+ // guard, `getFullYear()`/`getMonth()`/`getDate()` on an Invalid Date
46354
+ // yield `NaN`, and `String(NaN).padStart(4, '0')` produces literals
46355
+ // like "0NaN/0NaN/0NaN" instead of `undefined`.
46356
+ if (!(date instanceof Date) || Number.isNaN(date.getTime())) {
46357
+ return undefined;
46358
+ }
46359
+
46299
46360
  const year = String(date.getFullYear()).padStart(4, '0');
46300
46361
  const month = String(date.getMonth() + 1).padStart(2, '0');
46301
46362
  const day = String(date.getDate()).padStart(2, '0');
@@ -46306,7 +46367,10 @@ function formatISODate(isoStr, format) {
46306
46367
  replace(/mm/iu, month).
46307
46368
  replace(/dd/iu, day);
46308
46369
  } catch (err) {
46309
- // If the input string is not a valid date, return undefined
46370
+ // Defensive: the Date-returning path is guarded above, but `parseDate`
46371
+ // (inside `stringToDateInstance`) could throw on pathological input
46372
+ // future-library-versions might introduce. Treat any thrown error as
46373
+ // "not a valid date" and return undefined.
46310
46374
  return undefined;
46311
46375
  }
46312
46376
  }
@@ -50258,7 +50322,7 @@ let AuroHelpText$1$2 = class AuroHelpText extends i$2 {
50258
50322
  }
50259
50323
  };
50260
50324
 
50261
- var formkitVersion$1$2 = '202606252142';
50325
+ var formkitVersion$1$2 = '202606252337';
50262
50326
 
50263
50327
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
50264
50328
  // See LICENSE in the project root for license information.
@@ -54586,7 +54650,7 @@ let AuroHelpText$6 = class AuroHelpText extends i$2 {
54586
54650
  }
54587
54651
  };
54588
54652
 
54589
- var formkitVersion$6 = '202606252142';
54653
+ var formkitVersion$6 = '202606252337';
54590
54654
 
54591
54655
  let AuroElement$1$2 = class AuroElement extends i$2 {
54592
54656
  static get properties() {
@@ -55858,7 +55922,6 @@ let AuroDropdown$2 = class AuroDropdown extends AuroElement$1$2 {
55858
55922
  role="${o$4(this.triggerContentFocusable ? undefined : this.a11yRole)}"
55859
55923
  aria-expanded="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
55860
55924
  aria-controls="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
55861
- aria-haspopup="${o$4(this.a11yRole === 'combobox' ? 'listbox' : undefined)}"
55862
55925
  aria-labelledby="${o$4(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
55863
55926
  aria-disabled="${o$4(this.disabled ? 'true' : undefined)}"
55864
55927
  @focusin="${this.handleFocusin}"
@@ -58527,7 +58590,7 @@ let AuroHelpText$5 = class AuroHelpText extends i$2 {
58527
58590
  }
58528
58591
  };
58529
58592
 
58530
- var formkitVersion$5 = '202606252142';
58593
+ var formkitVersion$5 = '202606252337';
58531
58594
 
58532
58595
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
58533
58596
  // See LICENSE in the project root for license information.
@@ -60277,7 +60340,7 @@ let AuroHelpText$4 = class AuroHelpText extends i$2 {
60277
60340
  }
60278
60341
  };
60279
60342
 
60280
- var formkitVersion$4 = '202606252142';
60343
+ var formkitVersion$4 = '202606252337';
60281
60344
 
60282
60345
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
60283
60346
  // See LICENSE in the project root for license information.
@@ -65492,7 +65555,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$2 {
65492
65555
  }
65493
65556
  };
65494
65557
 
65495
- var formkitVersion$2 = '202606252142';
65558
+ var formkitVersion$2 = '202606252337';
65496
65559
 
65497
65560
  let AuroElement$2$1 = class AuroElement extends i$2 {
65498
65561
  static get properties() {
@@ -66764,7 +66827,6 @@ let AuroDropdown$1 = class AuroDropdown extends AuroElement$2$1 {
66764
66827
  role="${o$4(this.triggerContentFocusable ? undefined : this.a11yRole)}"
66765
66828
  aria-expanded="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
66766
66829
  aria-controls="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
66767
- aria-haspopup="${o$4(this.a11yRole === 'combobox' ? 'listbox' : undefined)}"
66768
66830
  aria-labelledby="${o$4(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
66769
66831
  aria-disabled="${o$4(this.disabled ? 'true' : undefined)}"
66770
66832
  @focusin="${this.handleFocusin}"
@@ -77211,6 +77273,13 @@ class AuroInputUtilities {
77211
77273
  * @returns {string | undefined}
77212
77274
  */
77213
77275
  toFormattedValue(valueObject, format) {
77276
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
77277
+ // `format` argument has to fail gracefully rather than throw on
77278
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
77279
+ // as "no format → no display value".
77280
+ if (!format) {
77281
+ return undefined;
77282
+ }
77214
77283
  const normalizedFormat = format.toLowerCase();
77215
77284
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
77216
77285
 
@@ -77361,79 +77430,18 @@ class BaseInput extends AuroElement$1$1 {
77361
77430
  constructor() {
77362
77431
  super();
77363
77432
 
77364
- this.appearance = "default";
77365
- this.disabled = false;
77366
- this.layout = 'classic';
77367
- this.locale = 'en-US';
77368
- this.max = undefined;
77369
- this._maxObject = undefined;
77370
- this.maxLength = undefined;
77371
- this.min = undefined;
77372
- this._minObject = undefined;
77373
- this.minLength = undefined;
77374
- this.required = false;
77375
- this.onDark = false;
77376
- this.setCustomValidityForType = undefined;
77377
- this.size = 'lg';
77378
- this.shape = 'classic';
77379
- this.value = undefined;
77380
- this._valueObject = undefined;
77381
-
77382
- this._initializePrivateDefaults();
77383
- }
77384
-
77385
- /**
77386
- * Internal Defaults.
77387
- * @private
77388
- * @returns {void}
77389
- */
77390
- _initializePrivateDefaults() {
77433
+ // Single-source initialization. Alphabetized so duplicate or stale
77434
+ // defaults are immediately obvious on a diff. Every field is assigned
77435
+ // exactly once here (previously the constructor + the old
77436
+ // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
77437
+ // fields and double-allocated `util` and `validation`, discarding the
77438
+ // first instance). `validation` is now allocated exactly once; `util`
77439
+ // is seeded here with an en-US default and then rebuilt in
77440
+ // `connectedCallback` once the consumer-resolved locale is available,
77441
+ // so a parent (datepicker/combobox) calling `validate()` synchronously
77442
+ // during its own update cycle sees a populated util instance.
77391
77443
  this.activeLabel = false;
77392
- this.appearance = "default";
77393
- this.icon = false;
77394
- this.disabled = false;
77395
- this.dvInputOnly = false;
77396
- this.hideLabelVisually = false;
77397
- this.max = undefined;
77398
- this.maxLength = undefined;
77399
- this.min = undefined;
77400
- this.minLength = undefined;
77401
- this.noValidate = false;
77402
- this.onDark = false;
77403
- this.required = false;
77404
- this.setCustomValidityForType = undefined;
77405
-
77406
- // Used for storing raw values returned from input mask.
77407
- this._rawMaskValue = undefined;
77408
-
77409
- /**
77410
- * @private
77411
- */
77412
- this.layout = 'classic';
77413
-
77414
- /**
77415
- * @private
77416
- */
77417
- this.shape = 'classic';
77418
-
77419
- /**
77420
- * @private
77421
- */
77422
- this.size = 'lg';
77423
-
77424
- this.touched = false;
77425
- this.util = new AuroInputUtilities({
77426
- locale: "en-US",
77427
- format: this.format
77428
- });
77429
- this.validation = new AuroFormValidation$2();
77430
- this.inputIconName = undefined;
77431
- this.showPassword = false;
77432
- this.validationCCLength = undefined;
77433
- this.hasValue = false;
77434
- this.label = 'Input label is undefined';
77435
-
77436
-
77444
+ /** @private */
77437
77445
  this.allowedInputTypes = [
77438
77446
  "text",
77439
77447
  "number",
@@ -77442,7 +77450,8 @@ class BaseInput extends AuroElement$1$1 {
77442
77450
  "credit-card",
77443
77451
  "tel"
77444
77452
  ];
77445
- this.icon = false;
77453
+ this.appearance = "default";
77454
+ /** @private */
77446
77455
  this.dateFormatMap = {
77447
77456
  'mm/dd/yyyy': 'dateMMDDYYYY',
77448
77457
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -77459,27 +77468,57 @@ class BaseInput extends AuroElement$1$1 {
77459
77468
  'dd/mm': 'dateDDMM',
77460
77469
  'mm/dd': 'dateMMDD'
77461
77470
  };
77471
+ this.disabled = false;
77472
+ /** @private */
77462
77473
  this.domHandler = new DomHandler();
77463
77474
  this.dvInputOnly = false;
77464
77475
  this.hasValue = false;
77476
+ this.hideLabelVisually = false;
77477
+ this.icon = false;
77478
+ /** @private */
77465
77479
  this.inputIconName = undefined;
77480
+ /** @private */
77466
77481
  this.label = 'Input label is undefined';
77482
+ this.layout = 'classic';
77483
+ this.locale = 'en-US';
77484
+ this.max = undefined;
77485
+ this._maxObject = undefined;
77486
+ this.maxLength = undefined;
77487
+ this.min = undefined;
77488
+ this._minObject = undefined;
77489
+ this.minLength = undefined;
77467
77490
  this.noValidate = false;
77468
- this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
77491
+ this.onDark = false;
77492
+ // Raw values returned from the input mask before model normalization.
77493
+ this._rawMaskValue = undefined;
77494
+ this.required = false;
77495
+ this.setCustomValidityForType = undefined;
77496
+ // Credit Card is intentionally excluded — its mask manages the cursor
77497
+ // itself, and listing it here caused cursor placement issues in Safari.
77498
+ /** @private */
77469
77499
  this.setSelectionInputTypes = [
77470
77500
  "text",
77471
77501
  "password",
77472
77502
  "email"
77473
- ]; // Credit Card is not included as this caused cursor placement issues in Safari.
77503
+ ];
77504
+ this.shape = 'classic';
77505
+ /** @private */
77474
77506
  this.showPassword = false;
77507
+ this.size = 'lg';
77475
77508
  this.touched = false;
77509
+ /** @private */
77476
77510
  this.uniqueId = new UniqueId().create();
77511
+ /** @private */
77477
77512
  this.util = new AuroInputUtilities({
77478
77513
  locale: this.locale,
77479
77514
  format: this.format
77480
77515
  });
77516
+ /** @private */
77481
77517
  this.validation = new AuroFormValidation$2();
77518
+ /** @private */
77482
77519
  this.validationCCLength = undefined;
77520
+ this.value = undefined;
77521
+ this._valueObject = undefined;
77483
77522
  }
77484
77523
 
77485
77524
  // function to define props used within the scope of this component
@@ -78027,6 +78066,15 @@ class BaseInput extends AuroElement$1$1 {
78027
78066
 
78028
78067
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
78029
78068
 
78069
+ // Normalize the format token to lowercase so case-mixed values supplied
78070
+ // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
78071
+ // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
78072
+ // format silently misses the map and leaves `setCustomValidityForType`
78073
+ // unset.
78074
+ if (this.format) {
78075
+ this.format = this.format.toLowerCase();
78076
+ }
78077
+
78030
78078
  // use validity message override if declared when initializing the component
78031
78079
  if (this.hasAttribute('setCustomValidity')) {
78032
78080
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -78460,6 +78508,38 @@ class BaseInput extends AuroElement$1$1 {
78460
78508
  this.touched = true;
78461
78509
  this.validation.validate(this);
78462
78510
  }
78511
+
78512
+ // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
78513
+ // update that can re-render the input and reset the native cursor; we
78514
+ // capture the caret position before that update commits and restore it
78515
+ // via `setSelectionRange` once the update has flushed. Gated on
78516
+ // `setSelectionInputTypes` so credit-card (and other masked types whose
78517
+ // formatter manages the cursor itself) doesn't get a competing write.
78518
+ // Capture the caret position INSIDE the gate — reading `selectionStart`
78519
+ // on input types that don't support text selection (number, email in
78520
+ // some browsers) throws InvalidStateError, which would crash all input
78521
+ // handling. Wrap the read in try/catch belt-and-suspenders even though
78522
+ // the gated types currently support it, since the list is a public
78523
+ // property a consumer could mutate.
78524
+ if (this.setSelectionInputTypes.includes(this.type)) {
78525
+ let selectionStart;
78526
+ try {
78527
+ selectionStart = this.inputElement.selectionStart;
78528
+ } catch (error) { // eslint-disable-line no-unused-vars
78529
+ return;
78530
+ }
78531
+ if (typeof selectionStart !== 'number') {
78532
+ return;
78533
+ }
78534
+ this.updateComplete.then(() => {
78535
+ try {
78536
+ this.inputElement.setSelectionRange(selectionStart, selectionStart);
78537
+ } catch (error) { // eslint-disable-line no-unused-vars
78538
+ // Some input types (number/email in certain UAs) throw on
78539
+ // setSelectionRange; swallow and let the native cursor stand.
78540
+ }
78541
+ });
78542
+ }
78463
78543
  }
78464
78544
 
78465
78545
  /**
@@ -79086,7 +79166,7 @@ let AuroHelpText$1$1 = class AuroHelpText extends i$2 {
79086
79166
  }
79087
79167
  };
79088
79168
 
79089
- var formkitVersion$1$1 = '202606252142';
79169
+ var formkitVersion$1$1 = '202606252337';
79090
79170
 
79091
79171
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
79092
79172
  // See LICENSE in the project root for license information.
@@ -79589,6 +79669,7 @@ class AuroInput extends BaseInput {
79589
79669
  <${this.buttonTag}
79590
79670
  @click="${this.handleClickShowPassword}"
79591
79671
  appearance="${this.onDark ? 'inverse' : this.appearance}"
79672
+ aria-pressed="${this.showPassword ? 'true' : 'false'}"
79592
79673
  class="notificationBtn passwordBtn"
79593
79674
  shape="circle"
79594
79675
  size="sm"
@@ -79662,25 +79743,29 @@ class AuroInput extends BaseInput {
79662
79743
  * @returns {html} - Returns HTML for the help text and error message.
79663
79744
  */
79664
79745
  renderHtmlHelpText() {
79746
+ // Single `<p>` with stable identity across validity transitions —
79747
+ // previously two distinct templates (valid vs invalid) caused Lit to
79748
+ // replace the node entirely on a flip, and VoiceOver wouldn't
79749
+ // re-announce because the live-region element it was watching had been
79750
+ // removed and a new one inserted. Keeping one node means the `role`,
79751
+ // `aria-live`, and text content all change in-place, which AT does
79752
+ // observe and announce.
79753
+ const isError = this.validity && this.validity !== 'valid';
79665
79754
  return u$d`
79666
- ${!this.validity || this.validity === undefined || this.validity === 'valid'
79667
- ? u$d`
79668
- <${this.helpTextTag}
79669
- appearance="${this.onDark ? 'inverse' : this.appearance}">
79670
- <p id="${this.uniqueId}" part="helpText">
79671
- <slot name="helpText">${this.getHelpText()}</slot>
79672
- </p>
79673
- </${this.helpTextTag}>
79674
- `
79675
- : u$d`
79676
- <${this.helpTextTag} error
79677
- appearance="${this.onDark ? 'inverse' : this.appearance}">
79678
- <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
79679
- ${this.errorMessage}
79680
- </p>
79681
- </${this.helpTextTag}>
79682
- `
79683
- }
79755
+ <${this.helpTextTag}
79756
+ appearance="${this.onDark ? 'inverse' : this.appearance}"
79757
+ ?error=${isError}>
79758
+ <p
79759
+ id="${this.uniqueId}"
79760
+ part="helpText"
79761
+ role="${o$4(isError ? 'alert' : undefined)}"
79762
+ aria-live="${o$4(isError ? 'assertive' : undefined)}">
79763
+ ${isError
79764
+ ? this.errorMessage
79765
+ : u$d`<slot name="helpText">${this.getHelpText()}</slot>`
79766
+ }
79767
+ </p>
79768
+ </${this.helpTextTag}>
79684
79769
  `;
79685
79770
  }
79686
79771
 
@@ -80207,7 +80292,7 @@ let AuroBibtemplate$1 = class AuroBibtemplate extends i$2 {
80207
80292
  }
80208
80293
  };
80209
80294
 
80210
- var formkitVersion$3 = '202606252142';
80295
+ var formkitVersion$3 = '202606252337';
80211
80296
 
80212
80297
  var styleCss$1$3 = i$4`.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock{display:block}.util_displayFlex{display:flex}.util_displayHidden{display:none}.util_displayHiddenVisually{position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}:host{display:block;text-align:left}:host [auro-dropdown]{--ds-auro-dropdown-trigger-background-color: transparent}:host #inputInBib::part(wrapper){box-shadow:none}:host #inputInBib::part(accent-left){display:none}:host([layout*=classic]) [auro-input]{width:100%}:host([layout*=classic]) [auro-input]::part(helpText){display:none}:host([layout*=classic]) #slotHolder{display:none}`;
80213
80298
 
@@ -85020,24 +85105,19 @@ const selectKeyboardStrategy = {
85020
85105
  },
85021
85106
 
85022
85107
  End(component, evt, ctx) {
85108
+ if (!ctx.isExpanded) {
85109
+ return;
85110
+ }
85023
85111
  evt.preventDefault();
85024
85112
  evt.stopPropagation();
85025
85113
  // `pop()` is safe here: getEnabledOptions returns a fresh filtered array.
85026
85114
  const lastOption = getEnabledOptions(component.menu).pop();
85027
- if (!lastOption) {
85028
- return;
85029
- }
85030
- if (!ctx.isExpanded) {
85031
- component.dropdown.show();
85115
+ if (lastOption) {
85116
+ component.menu.updateActiveOption(lastOption);
85032
85117
  }
85033
- component.menu.updateActiveOption(lastOption);
85034
85118
  },
85035
85119
 
85036
85120
  Enter(component, evt, ctx) {
85037
- // Prevent the keypress from bubbling to parent containers (e.g., forms)
85038
- // which could interpret Enter as a submit. Matches APG select-only combobox
85039
- // and native <select> behavior: Enter opens the listbox when closed, selects
85040
- // the active option when open — it does not submit a parent form.
85041
85121
  evt.preventDefault();
85042
85122
  evt.stopPropagation();
85043
85123
  if (!ctx.isExpanded) {
@@ -85048,16 +85128,15 @@ const selectKeyboardStrategy = {
85048
85128
  },
85049
85129
 
85050
85130
  Home(component, evt, ctx) {
85131
+ if (!ctx.isExpanded) {
85132
+ return;
85133
+ }
85051
85134
  evt.preventDefault();
85052
85135
  evt.stopPropagation();
85053
85136
  const [firstOption] = getEnabledOptions(component.menu);
85054
- if (!firstOption) {
85055
- return;
85056
- }
85057
- if (!ctx.isExpanded) {
85058
- component.dropdown.show();
85137
+ if (firstOption) {
85138
+ component.menu.updateActiveOption(firstOption);
85059
85139
  }
85060
- component.menu.updateActiveOption(firstOption);
85061
85140
  },
85062
85141
 
85063
85142
  Tab(component, evt, ctx) {
@@ -89004,7 +89083,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
89004
89083
  }
89005
89084
  };
89006
89085
 
89007
- var formkitVersion$1 = '202606252142';
89086
+ var formkitVersion$1 = '202606252337';
89008
89087
 
89009
89088
  class AuroElement extends i$2 {
89010
89089
  static get properties() {
@@ -90276,7 +90355,6 @@ class AuroDropdown extends AuroElement {
90276
90355
  role="${o$4(this.triggerContentFocusable ? undefined : this.a11yRole)}"
90277
90356
  aria-expanded="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
90278
90357
  aria-controls="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
90279
- aria-haspopup="${o$4(this.a11yRole === 'combobox' ? 'listbox' : undefined)}"
90280
90358
  aria-labelledby="${o$4(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
90281
90359
  aria-disabled="${o$4(this.disabled ? 'true' : undefined)}"
90282
90360
  @focusin="${this.handleFocusin}"
@@ -91026,7 +91104,7 @@ class AuroHelpText extends i$2 {
91026
91104
  }
91027
91105
  }
91028
91106
 
91029
- var formkitVersion = '202606252142';
91107
+ var formkitVersion = '202606252337';
91030
91108
 
91031
91109
  var styleCss = i$4`.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}`;
91032
91110
 
@@ -91358,6 +91436,14 @@ class AuroSelect extends AuroElement$1 {
91358
91436
  reflect: true
91359
91437
  },
91360
91438
 
91439
+ /**
91440
+ * @private
91441
+ */
91442
+ options: {
91443
+ type: Array,
91444
+ state: true
91445
+ },
91446
+
91361
91447
  /**
91362
91448
  * Specifies the current selected menuOption. Default type is `HTMLElement`, changing to `Array<HTMLElement>` when `multiSelect` is true.
91363
91449
  * @type {HTMLElement|Array<HTMLElement>}
@@ -91645,68 +91731,16 @@ class AuroSelect extends AuroElement$1 {
91645
91731
  this.dropdown.dropdownWidth = this.customBibWidth;
91646
91732
  }
91647
91733
 
91648
- this._syncLabelText();
91734
+ // Pass label text to the dropdown bib for accessible dialog naming
91735
+ const labelElement = this.querySelector('span[slot="label"]');
91736
+ if (labelElement) {
91737
+ this.dropdown.bibDialogLabel = labelElement.textContent.trim() || undefined;
91738
+ }
91649
91739
 
91650
91740
  // Exposes the CSS parts from the dropdown for styling
91651
91741
  this.dropdown.exposeCssParts();
91652
91742
  }
91653
91743
 
91654
- /**
91655
- * Reads the current label slot text and pushes it to the dropdown bib
91656
- * (for dialog naming) and the menu (for listbox aria-label). Safe to call
91657
- * before either child has been wired up — each branch self-guards.
91658
- * @private
91659
- */
91660
- _syncLabelText() {
91661
- const labelElement = this.querySelector('[slot="label"]');
91662
- const text = labelElement ? labelElement.textContent.trim() : '';
91663
- if (this.dropdown) {
91664
- this.dropdown.bibDialogLabel = text || undefined;
91665
- }
91666
- if (this.menu) {
91667
- if (text) {
91668
- this.menu.setAttribute('aria-label', text);
91669
- } else {
91670
- this.menu.removeAttribute('aria-label');
91671
- }
91672
- }
91673
- }
91674
-
91675
- /**
91676
- * Keeps the dialog/menu accessible names in sync when consumers mutate the
91677
- * label slot at runtime (e.g., i18n locale swap). `slotchange` alone is
91678
- * insufficient — it doesn't fire when textContent of an already-assigned
91679
- * slotted node changes, which is the common case. We scope the observer to
91680
- * the label node itself (not the whole host subtree) so option-content
91681
- * mutations don't trigger label re-syncs, and re-target on `slotchange`
91682
- * when consumers add or replace the label element.
91683
- * @private
91684
- */
91685
- _observeLabelChanges() {
91686
- if (this._labelObserver) return;
91687
- this._labelObserver = new MutationObserver(() => this._syncLabelText());
91688
-
91689
- const retarget = () => {
91690
- this._labelObserver.disconnect();
91691
- const labelElement = this.querySelector('[slot="label"]');
91692
- if (labelElement) {
91693
- this._labelObserver.observe(labelElement, {
91694
- childList: true,
91695
- subtree: true,
91696
- characterData: true
91697
- });
91698
- }
91699
- this._syncLabelText();
91700
- };
91701
-
91702
- retarget();
91703
-
91704
- this._retargetLabelObserver = retarget;
91705
- this.shadowRoot.querySelectorAll('slot[name="label"]').forEach((slot) => {
91706
- slot.addEventListener('slotchange', retarget);
91707
- });
91708
- }
91709
-
91710
91744
  /**
91711
91745
  * This will register this element with the browser.
91712
91746
  * @param {string} [name="auro-select"] - The name of element that you want to register to.
@@ -91857,7 +91891,11 @@ class AuroSelect extends AuroElement$1 {
91857
91891
  this.updateMenuShapeSize();
91858
91892
  this.setMenuValue(this.value);
91859
91893
 
91860
- this._syncLabelText();
91894
+ // Set accessible name on the menu for screen readers based on the label slot content
91895
+ const labelElement = this.querySelector('[slot="label"]');
91896
+ if (labelElement) {
91897
+ this.menu.setAttribute('aria-label', labelElement.textContent.trim());
91898
+ }
91861
91899
 
91862
91900
  if (this.multiSelect) {
91863
91901
  this.menu.multiSelect = this.multiSelect;
@@ -91869,21 +91907,8 @@ class AuroSelect extends AuroElement$1 {
91869
91907
  if (typeof this.menu.initItems === 'function') {
91870
91908
  this.menu.initItems();
91871
91909
  }
91910
+ this.options = this.menu.options;
91872
91911
  this.updateOptionPositions();
91873
- // renderNativeSelect reads this.menu.options, which the parent doesn't
91874
- // observe — request an update so the hidden native <option> list reflects
91875
- // the menu's options after initItems populates them.
91876
- this.requestUpdate();
91877
-
91878
- // Keep aria-setsize/aria-posinset (and the native <option> list) in sync
91879
- // when the menu re-initializes its items — e.g., slotchange, async/lazy
91880
- // loads, value-triggered re-init. Without this, stale set-size is
91881
- // announced and the native select goes stale after dynamic mutations.
91882
- this.menu.addEventListener('auroMenu-optionsChange', () => {
91883
- this.updateOptionPositions();
91884
- this.requestUpdate();
91885
- });
91886
-
91887
91912
  this.menu.addEventListener("auroMenu-loadingChange", (event) => this.handleMenuLoadingChange(event));
91888
91913
 
91889
91914
  this.menu.addEventListener("auroMenu-selectValueFailure", () => {
@@ -91902,22 +91927,11 @@ class AuroSelect extends AuroElement$1 {
91902
91927
  this.dropdown.setActiveDescendant(this.optionActive);
91903
91928
  }
91904
91929
 
91905
- // Announce the active option for screen readers. Skip when the activated
91906
- // option is already selected: Enter triggers an auroMenu-selectedOption
91907
- // re-announce, and aria-selected on the active descendant otherwise
91908
- // conveys state without an explicit utterance.
91909
- if (this.optionActive && !this.optionActive.hasAttribute('selected')) {
91930
+ // Announce the active option for screen readers
91931
+ if (this.optionActive) {
91910
91932
  const optionText = this.optionActive.textContent.trim();
91911
- const message = `${optionText}, not selected`;
91912
- if (this.dropdown.isPopoverVisible) {
91913
- announceToScreenReader(this._getAnnouncementRoot(), message);
91914
- } else {
91915
- // Typeahead-on-closed fires this event before `show()` flips
91916
- // isPopoverVisible. Defer so the announcement targets the bib's
91917
- // live region once the fullscreen <dialog> opens — otherwise it
91918
- // lands in the host root, which is inert under the active modal.
91919
- queueMicrotask(() => announceToScreenReader(this._getAnnouncementRoot(), message));
91920
- }
91933
+ const selectedState = this.optionActive.hasAttribute('selected') ? ', selected' : ', not selected';
91934
+ announceToScreenReader(this._getAnnouncementRoot(), `${optionText}${selectedState}`);
91921
91935
  }
91922
91936
 
91923
91937
  if (this.dropdown.isPopoverVisible) {
@@ -92049,32 +92063,24 @@ class AuroSelect extends AuroElement$1 {
92049
92063
 
92050
92064
  this.typeaheadBuffer += key;
92051
92065
 
92052
- // Prefer the literal buffer as a prefix per WAI-ARIA APG ("focus moves to the
92053
- // next item with a name that starts with the string of characters typed").
92054
- // Only fall back to single-char cycling when the repeated buffer has no
92055
- // longer prefix match — e.g. "aa" cycles through ["Apple", "Apricot"] only
92056
- // because no option starts with "aa".
92057
- let match = options.find((option) => this._getOptionDisplayText(option).startsWith(this.typeaheadBuffer));
92066
+ const isRepeatedChar = this.typeaheadBuffer.length > 1 && new Set(this.typeaheadBuffer).size === 1;
92058
92067
 
92059
- const isRepeatedChar = !match && this.typeaheadBuffer.length > 1 && new Set(this.typeaheadBuffer).size === 1;
92068
+ let match = null;
92060
92069
  if (isRepeatedChar) {
92061
92070
  const matches = options.filter((option) => this._getOptionDisplayText(option).startsWith(key));
92062
92071
  if (matches.length) {
92063
92072
  const cycleIndex = (this.typeaheadBuffer.length - 1) % matches.length;
92064
92073
  match = matches[cycleIndex];
92065
92074
  }
92075
+ } else {
92076
+ match = options.find((option) => this._getOptionDisplayText(option).startsWith(this.typeaheadBuffer));
92066
92077
  }
92067
92078
 
92068
- // Intentional: no-match leaves the bib closed (deviates from APG / some native <select>).
92069
92079
  if (match) {
92070
- // Pre-stash the match so the auroDropdown-toggled handler's `!optionActive`
92071
- // guard short-circuits and skips the firstActive/selected fallback —
92072
- // otherwise show() synchronously fires the handler, which writes
92073
- // aria-activedescendant once before we overwrite it.
92074
- this.menu.updateActiveOption(match);
92075
92080
  if (!this.dropdown.isPopoverVisible) {
92076
92081
  this.dropdown.show();
92077
92082
  }
92083
+ this.menu.updateActiveOption(match);
92078
92084
  }
92079
92085
  }
92080
92086
 
@@ -92191,16 +92197,6 @@ class AuroSelect extends AuroElement$1 {
92191
92197
  disconnectedCallback() {
92192
92198
  super.disconnectedCallback();
92193
92199
  this._clearTypeaheadBuffer();
92194
- if (this._labelObserver) {
92195
- this._labelObserver.disconnect();
92196
- this._labelObserver = null;
92197
- }
92198
- if (this._retargetLabelObserver && this.shadowRoot) {
92199
- this.shadowRoot.querySelectorAll('slot[name="label"]').forEach((slot) => {
92200
- slot.removeEventListener('slotchange', this._retargetLabelObserver);
92201
- });
92202
- this._retargetLabelObserver = null;
92203
- }
92204
92200
  }
92205
92201
 
92206
92202
  // lifecycle runs only after the element's DOM has been updated the first time
@@ -92211,7 +92207,6 @@ class AuroSelect extends AuroElement$1 {
92211
92207
  this.configureDropdown();
92212
92208
  this.configureMenu();
92213
92209
  this.configureSelect();
92214
- this._observeLabelChanges();
92215
92210
  }
92216
92211
 
92217
92212
  setMenuValue(value) {
@@ -92348,8 +92343,21 @@ class AuroSelect extends AuroElement$1 {
92348
92343
  if (!selectedOption) return;
92349
92344
  const selectedValue = selectedOption.value;
92350
92345
 
92351
- if (this.value !== selectedValue) {
92352
- this.value = selectedValue;
92346
+ if (this.multiSelect) {
92347
+ const currentArray = this.menu.value || [];
92348
+
92349
+ if (!currentArray.includes(selectedValue)) {
92350
+ this.value = JSON.stringify([
92351
+ ...currentArray,
92352
+ selectedValue
92353
+ ]);
92354
+ }
92355
+ } else {
92356
+ const currentValue = this.value;
92357
+
92358
+ if (currentValue !== selectedValue) {
92359
+ this.value = selectedValue;
92360
+ }
92353
92361
  }
92354
92362
  }
92355
92363