@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
@@ -11497,6 +11497,13 @@ let AuroInputUtilities$3 = class AuroInputUtilities {
11497
11497
  * @returns {string | undefined}
11498
11498
  */
11499
11499
  toFormattedValue(valueObject, format) {
11500
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
11501
+ // `format` argument has to fail gracefully rather than throw on
11502
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
11503
+ // as "no format → no display value".
11504
+ if (!format) {
11505
+ return undefined;
11506
+ }
11500
11507
  const normalizedFormat = format.toLowerCase();
11501
11508
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
11502
11509
 
@@ -11647,79 +11654,18 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11647
11654
  constructor() {
11648
11655
  super();
11649
11656
 
11650
- this.appearance = "default";
11651
- this.disabled = false;
11652
- this.layout = 'classic';
11653
- this.locale = 'en-US';
11654
- this.max = undefined;
11655
- this._maxObject = undefined;
11656
- this.maxLength = undefined;
11657
- this.min = undefined;
11658
- this._minObject = undefined;
11659
- this.minLength = undefined;
11660
- this.required = false;
11661
- this.onDark = false;
11662
- this.setCustomValidityForType = undefined;
11663
- this.size = 'lg';
11664
- this.shape = 'classic';
11665
- this.value = undefined;
11666
- this._valueObject = undefined;
11667
-
11668
- this._initializePrivateDefaults();
11669
- }
11670
-
11671
- /**
11672
- * Internal Defaults.
11673
- * @private
11674
- * @returns {void}
11675
- */
11676
- _initializePrivateDefaults() {
11657
+ // Single-source initialization. Alphabetized so duplicate or stale
11658
+ // defaults are immediately obvious on a diff. Every field is assigned
11659
+ // exactly once here (previously the constructor + the old
11660
+ // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
11661
+ // fields and double-allocated `util` and `validation`, discarding the
11662
+ // first instance). `validation` is now allocated exactly once; `util`
11663
+ // is seeded here with an en-US default and then rebuilt in
11664
+ // `connectedCallback` once the consumer-resolved locale is available,
11665
+ // so a parent (datepicker/combobox) calling `validate()` synchronously
11666
+ // during its own update cycle sees a populated util instance.
11677
11667
  this.activeLabel = false;
11678
- this.appearance = "default";
11679
- this.icon = false;
11680
- this.disabled = false;
11681
- this.dvInputOnly = false;
11682
- this.hideLabelVisually = false;
11683
- this.max = undefined;
11684
- this.maxLength = undefined;
11685
- this.min = undefined;
11686
- this.minLength = undefined;
11687
- this.noValidate = false;
11688
- this.onDark = false;
11689
- this.required = false;
11690
- this.setCustomValidityForType = undefined;
11691
-
11692
- // Used for storing raw values returned from input mask.
11693
- this._rawMaskValue = undefined;
11694
-
11695
- /**
11696
- * @private
11697
- */
11698
- this.layout = 'classic';
11699
-
11700
- /**
11701
- * @private
11702
- */
11703
- this.shape = 'classic';
11704
-
11705
- /**
11706
- * @private
11707
- */
11708
- this.size = 'lg';
11709
-
11710
- this.touched = false;
11711
- this.util = new AuroInputUtilities$3({
11712
- locale: "en-US",
11713
- format: this.format
11714
- });
11715
- this.validation = new AuroFormValidation$7();
11716
- this.inputIconName = undefined;
11717
- this.showPassword = false;
11718
- this.validationCCLength = undefined;
11719
- this.hasValue = false;
11720
- this.label = 'Input label is undefined';
11721
-
11722
-
11668
+ /** @private */
11723
11669
  this.allowedInputTypes = [
11724
11670
  "text",
11725
11671
  "number",
@@ -11728,7 +11674,8 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11728
11674
  "credit-card",
11729
11675
  "tel"
11730
11676
  ];
11731
- this.icon = false;
11677
+ this.appearance = "default";
11678
+ /** @private */
11732
11679
  this.dateFormatMap = {
11733
11680
  'mm/dd/yyyy': 'dateMMDDYYYY',
11734
11681
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -11745,27 +11692,57 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11745
11692
  'dd/mm': 'dateDDMM',
11746
11693
  'mm/dd': 'dateMMDD'
11747
11694
  };
11695
+ this.disabled = false;
11696
+ /** @private */
11748
11697
  this.domHandler = new DomHandler$3();
11749
11698
  this.dvInputOnly = false;
11750
11699
  this.hasValue = false;
11700
+ this.hideLabelVisually = false;
11701
+ this.icon = false;
11702
+ /** @private */
11751
11703
  this.inputIconName = undefined;
11704
+ /** @private */
11752
11705
  this.label = 'Input label is undefined';
11706
+ this.layout = 'classic';
11707
+ this.locale = 'en-US';
11708
+ this.max = undefined;
11709
+ this._maxObject = undefined;
11710
+ this.maxLength = undefined;
11711
+ this.min = undefined;
11712
+ this._minObject = undefined;
11713
+ this.minLength = undefined;
11753
11714
  this.noValidate = false;
11754
- this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
11715
+ this.onDark = false;
11716
+ // Raw values returned from the input mask before model normalization.
11717
+ this._rawMaskValue = undefined;
11718
+ this.required = false;
11719
+ this.setCustomValidityForType = undefined;
11720
+ // Credit Card is intentionally excluded — its mask manages the cursor
11721
+ // itself, and listing it here caused cursor placement issues in Safari.
11722
+ /** @private */
11755
11723
  this.setSelectionInputTypes = [
11756
11724
  "text",
11757
11725
  "password",
11758
11726
  "email"
11759
- ]; // Credit Card is not included as this caused cursor placement issues in Safari.
11727
+ ];
11728
+ this.shape = 'classic';
11729
+ /** @private */
11760
11730
  this.showPassword = false;
11731
+ this.size = 'lg';
11761
11732
  this.touched = false;
11733
+ /** @private */
11762
11734
  this.uniqueId = new UniqueId$2().create();
11735
+ /** @private */
11763
11736
  this.util = new AuroInputUtilities$3({
11764
11737
  locale: this.locale,
11765
11738
  format: this.format
11766
11739
  });
11740
+ /** @private */
11767
11741
  this.validation = new AuroFormValidation$7();
11742
+ /** @private */
11768
11743
  this.validationCCLength = undefined;
11744
+ this.value = undefined;
11745
+ this._valueObject = undefined;
11769
11746
  }
11770
11747
 
11771
11748
  // function to define props used within the scope of this component
@@ -12313,6 +12290,15 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12313
12290
 
12314
12291
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
12315
12292
 
12293
+ // Normalize the format token to lowercase so case-mixed values supplied
12294
+ // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
12295
+ // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
12296
+ // format silently misses the map and leaves `setCustomValidityForType`
12297
+ // unset.
12298
+ if (this.format) {
12299
+ this.format = this.format.toLowerCase();
12300
+ }
12301
+
12316
12302
  // use validity message override if declared when initializing the component
12317
12303
  if (this.hasAttribute('setCustomValidity')) {
12318
12304
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -12746,6 +12732,38 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12746
12732
  this.touched = true;
12747
12733
  this.validation.validate(this);
12748
12734
  }
12735
+
12736
+ // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
12737
+ // update that can re-render the input and reset the native cursor; we
12738
+ // capture the caret position before that update commits and restore it
12739
+ // via `setSelectionRange` once the update has flushed. Gated on
12740
+ // `setSelectionInputTypes` so credit-card (and other masked types whose
12741
+ // formatter manages the cursor itself) doesn't get a competing write.
12742
+ // Capture the caret position INSIDE the gate — reading `selectionStart`
12743
+ // on input types that don't support text selection (number, email in
12744
+ // some browsers) throws InvalidStateError, which would crash all input
12745
+ // handling. Wrap the read in try/catch belt-and-suspenders even though
12746
+ // the gated types currently support it, since the list is a public
12747
+ // property a consumer could mutate.
12748
+ if (this.setSelectionInputTypes.includes(this.type)) {
12749
+ let selectionStart;
12750
+ try {
12751
+ selectionStart = this.inputElement.selectionStart;
12752
+ } catch (error) { // eslint-disable-line no-unused-vars
12753
+ return;
12754
+ }
12755
+ if (typeof selectionStart !== 'number') {
12756
+ return;
12757
+ }
12758
+ this.updateComplete.then(() => {
12759
+ try {
12760
+ this.inputElement.setSelectionRange(selectionStart, selectionStart);
12761
+ } catch (error) { // eslint-disable-line no-unused-vars
12762
+ // Some input types (number/email in certain UAs) throw on
12763
+ // setSelectionRange; swallow and let the native cursor stand.
12764
+ }
12765
+ });
12766
+ }
12749
12767
  }
12750
12768
 
12751
12769
  /**
@@ -13372,7 +13390,7 @@ let AuroHelpText$8 = class AuroHelpText extends i$3 {
13372
13390
  }
13373
13391
  };
13374
13392
 
13375
- var formkitVersion$8 = '202606252142';
13393
+ var formkitVersion$8 = '202606252337';
13376
13394
 
13377
13395
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
13378
13396
  // See LICENSE in the project root for license information.
@@ -13875,6 +13893,7 @@ let AuroInput$2 = class AuroInput extends BaseInput$2 {
13875
13893
  <${this.buttonTag}
13876
13894
  @click="${this.handleClickShowPassword}"
13877
13895
  appearance="${this.onDark ? 'inverse' : this.appearance}"
13896
+ aria-pressed="${this.showPassword ? 'true' : 'false'}"
13878
13897
  class="notificationBtn passwordBtn"
13879
13898
  shape="circle"
13880
13899
  size="sm"
@@ -13948,25 +13967,29 @@ let AuroInput$2 = class AuroInput extends BaseInput$2 {
13948
13967
  * @returns {html} - Returns HTML for the help text and error message.
13949
13968
  */
13950
13969
  renderHtmlHelpText() {
13970
+ // Single `<p>` with stable identity across validity transitions —
13971
+ // previously two distinct templates (valid vs invalid) caused Lit to
13972
+ // replace the node entirely on a flip, and VoiceOver wouldn't
13973
+ // re-announce because the live-region element it was watching had been
13974
+ // removed and a new one inserted. Keeping one node means the `role`,
13975
+ // `aria-live`, and text content all change in-place, which AT does
13976
+ // observe and announce.
13977
+ const isError = this.validity && this.validity !== 'valid';
13951
13978
  return u$c`
13952
- ${!this.validity || this.validity === undefined || this.validity === 'valid'
13953
- ? u$c`
13954
- <${this.helpTextTag}
13955
- appearance="${this.onDark ? 'inverse' : this.appearance}">
13956
- <p id="${this.uniqueId}" part="helpText">
13957
- <slot name="helpText">${this.getHelpText()}</slot>
13958
- </p>
13959
- </${this.helpTextTag}>
13960
- `
13961
- : u$c`
13962
- <${this.helpTextTag} error
13963
- appearance="${this.onDark ? 'inverse' : this.appearance}">
13964
- <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
13965
- ${this.errorMessage}
13966
- </p>
13967
- </${this.helpTextTag}>
13968
- `
13969
- }
13979
+ <${this.helpTextTag}
13980
+ appearance="${this.onDark ? 'inverse' : this.appearance}"
13981
+ ?error=${isError}>
13982
+ <p
13983
+ id="${this.uniqueId}"
13984
+ part="helpText"
13985
+ role="${o$4(isError ? 'alert' : undefined)}"
13986
+ aria-live="${o$4(isError ? 'assertive' : undefined)}">
13987
+ ${isError
13988
+ ? this.errorMessage
13989
+ : u$c`<slot name="helpText">${this.getHelpText()}</slot>`
13990
+ }
13991
+ </p>
13992
+ </${this.helpTextTag}>
13970
13993
  `;
13971
13994
  }
13972
13995
 
@@ -24607,6 +24630,13 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
24607
24630
  * @returns {string | undefined}
24608
24631
  */
24609
24632
  toFormattedValue(valueObject, format) {
24633
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
24634
+ // `format` argument has to fail gracefully rather than throw on
24635
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
24636
+ // as "no format → no display value".
24637
+ if (!format) {
24638
+ return undefined;
24639
+ }
24610
24640
  const normalizedFormat = format.toLowerCase();
24611
24641
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
24612
24642
 
@@ -27491,7 +27521,7 @@ let AuroBibtemplate$3 = class AuroBibtemplate extends i$3 {
27491
27521
  }
27492
27522
  };
27493
27523
 
27494
- var formkitVersion$2$1 = '202606252142';
27524
+ var formkitVersion$2$1 = '202606252337';
27495
27525
 
27496
27526
  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$2`${s$3(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$6`: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}
27497
27527
  `,u$4$2=i$6`.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}}
@@ -33002,7 +33032,7 @@ let AuroHelpText$2$1 = class AuroHelpText extends i$3 {
33002
33032
  }
33003
33033
  };
33004
33034
 
33005
- var formkitVersion$1$3 = '202606252142';
33035
+ var formkitVersion$1$3 = '202606252337';
33006
33036
 
33007
33037
  let AuroElement$2$2 = class AuroElement extends i$3 {
33008
33038
  static get properties() {
@@ -34274,7 +34304,6 @@ let AuroDropdown$3 = class AuroDropdown extends AuroElement$2$2 {
34274
34304
  role="${o$4(this.triggerContentFocusable ? undefined : this.a11yRole)}"
34275
34305
  aria-expanded="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
34276
34306
  aria-controls="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
34277
- aria-haspopup="${o$4(this.a11yRole === 'combobox' ? 'listbox' : undefined)}"
34278
34307
  aria-labelledby="${o$4(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
34279
34308
  aria-disabled="${o$4(this.disabled ? 'true' : undefined)}"
34280
34309
  @focusin="${this.handleFocusin}"
@@ -44721,6 +44750,13 @@ let AuroInputUtilities$2 = class AuroInputUtilities {
44721
44750
  * @returns {string | undefined}
44722
44751
  */
44723
44752
  toFormattedValue(valueObject, format) {
44753
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
44754
+ // `format` argument has to fail gracefully rather than throw on
44755
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
44756
+ // as "no format → no display value".
44757
+ if (!format) {
44758
+ return undefined;
44759
+ }
44724
44760
  const normalizedFormat = format.toLowerCase();
44725
44761
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
44726
44762
 
@@ -44871,79 +44907,18 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44871
44907
  constructor() {
44872
44908
  super();
44873
44909
 
44874
- this.appearance = "default";
44875
- this.disabled = false;
44876
- this.layout = 'classic';
44877
- this.locale = 'en-US';
44878
- this.max = undefined;
44879
- this._maxObject = undefined;
44880
- this.maxLength = undefined;
44881
- this.min = undefined;
44882
- this._minObject = undefined;
44883
- this.minLength = undefined;
44884
- this.required = false;
44885
- this.onDark = false;
44886
- this.setCustomValidityForType = undefined;
44887
- this.size = 'lg';
44888
- this.shape = 'classic';
44889
- this.value = undefined;
44890
- this._valueObject = undefined;
44891
-
44892
- this._initializePrivateDefaults();
44893
- }
44894
-
44895
- /**
44896
- * Internal Defaults.
44897
- * @private
44898
- * @returns {void}
44899
- */
44900
- _initializePrivateDefaults() {
44910
+ // Single-source initialization. Alphabetized so duplicate or stale
44911
+ // defaults are immediately obvious on a diff. Every field is assigned
44912
+ // exactly once here (previously the constructor + the old
44913
+ // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
44914
+ // fields and double-allocated `util` and `validation`, discarding the
44915
+ // first instance). `validation` is now allocated exactly once; `util`
44916
+ // is seeded here with an en-US default and then rebuilt in
44917
+ // `connectedCallback` once the consumer-resolved locale is available,
44918
+ // so a parent (datepicker/combobox) calling `validate()` synchronously
44919
+ // during its own update cycle sees a populated util instance.
44901
44920
  this.activeLabel = false;
44902
- this.appearance = "default";
44903
- this.icon = false;
44904
- this.disabled = false;
44905
- this.dvInputOnly = false;
44906
- this.hideLabelVisually = false;
44907
- this.max = undefined;
44908
- this.maxLength = undefined;
44909
- this.min = undefined;
44910
- this.minLength = undefined;
44911
- this.noValidate = false;
44912
- this.onDark = false;
44913
- this.required = false;
44914
- this.setCustomValidityForType = undefined;
44915
-
44916
- // Used for storing raw values returned from input mask.
44917
- this._rawMaskValue = undefined;
44918
-
44919
- /**
44920
- * @private
44921
- */
44922
- this.layout = 'classic';
44923
-
44924
- /**
44925
- * @private
44926
- */
44927
- this.shape = 'classic';
44928
-
44929
- /**
44930
- * @private
44931
- */
44932
- this.size = 'lg';
44933
-
44934
- this.touched = false;
44935
- this.util = new AuroInputUtilities$2({
44936
- locale: "en-US",
44937
- format: this.format
44938
- });
44939
- this.validation = new AuroFormValidation$6();
44940
- this.inputIconName = undefined;
44941
- this.showPassword = false;
44942
- this.validationCCLength = undefined;
44943
- this.hasValue = false;
44944
- this.label = 'Input label is undefined';
44945
-
44946
-
44921
+ /** @private */
44947
44922
  this.allowedInputTypes = [
44948
44923
  "text",
44949
44924
  "number",
@@ -44952,7 +44927,8 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44952
44927
  "credit-card",
44953
44928
  "tel"
44954
44929
  ];
44955
- this.icon = false;
44930
+ this.appearance = "default";
44931
+ /** @private */
44956
44932
  this.dateFormatMap = {
44957
44933
  'mm/dd/yyyy': 'dateMMDDYYYY',
44958
44934
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -44969,27 +44945,57 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44969
44945
  'dd/mm': 'dateDDMM',
44970
44946
  'mm/dd': 'dateMMDD'
44971
44947
  };
44948
+ this.disabled = false;
44949
+ /** @private */
44972
44950
  this.domHandler = new DomHandler$2();
44973
44951
  this.dvInputOnly = false;
44974
44952
  this.hasValue = false;
44953
+ this.hideLabelVisually = false;
44954
+ this.icon = false;
44955
+ /** @private */
44975
44956
  this.inputIconName = undefined;
44957
+ /** @private */
44976
44958
  this.label = 'Input label is undefined';
44959
+ this.layout = 'classic';
44960
+ this.locale = 'en-US';
44961
+ this.max = undefined;
44962
+ this._maxObject = undefined;
44963
+ this.maxLength = undefined;
44964
+ this.min = undefined;
44965
+ this._minObject = undefined;
44966
+ this.minLength = undefined;
44977
44967
  this.noValidate = false;
44978
- this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
44968
+ this.onDark = false;
44969
+ // Raw values returned from the input mask before model normalization.
44970
+ this._rawMaskValue = undefined;
44971
+ this.required = false;
44972
+ this.setCustomValidityForType = undefined;
44973
+ // Credit Card is intentionally excluded — its mask manages the cursor
44974
+ // itself, and listing it here caused cursor placement issues in Safari.
44975
+ /** @private */
44979
44976
  this.setSelectionInputTypes = [
44980
44977
  "text",
44981
44978
  "password",
44982
44979
  "email"
44983
- ]; // Credit Card is not included as this caused cursor placement issues in Safari.
44980
+ ];
44981
+ this.shape = 'classic';
44982
+ /** @private */
44984
44983
  this.showPassword = false;
44984
+ this.size = 'lg';
44985
44985
  this.touched = false;
44986
+ /** @private */
44986
44987
  this.uniqueId = new UniqueId$1().create();
44988
+ /** @private */
44987
44989
  this.util = new AuroInputUtilities$2({
44988
44990
  locale: this.locale,
44989
44991
  format: this.format
44990
44992
  });
44993
+ /** @private */
44991
44994
  this.validation = new AuroFormValidation$6();
44995
+ /** @private */
44992
44996
  this.validationCCLength = undefined;
44997
+ this.value = undefined;
44998
+ this._valueObject = undefined;
44993
44999
  }
44994
45000
 
44995
45001
  // function to define props used within the scope of this component
@@ -45537,6 +45543,15 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45537
45543
 
45538
45544
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
45539
45545
 
45546
+ // Normalize the format token to lowercase so case-mixed values supplied
45547
+ // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
45548
+ // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
45549
+ // format silently misses the map and leaves `setCustomValidityForType`
45550
+ // unset.
45551
+ if (this.format) {
45552
+ this.format = this.format.toLowerCase();
45553
+ }
45554
+
45540
45555
  // use validity message override if declared when initializing the component
45541
45556
  if (this.hasAttribute('setCustomValidity')) {
45542
45557
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -45970,6 +45985,38 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45970
45985
  this.touched = true;
45971
45986
  this.validation.validate(this);
45972
45987
  }
45988
+
45989
+ // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
45990
+ // update that can re-render the input and reset the native cursor; we
45991
+ // capture the caret position before that update commits and restore it
45992
+ // via `setSelectionRange` once the update has flushed. Gated on
45993
+ // `setSelectionInputTypes` so credit-card (and other masked types whose
45994
+ // formatter manages the cursor itself) doesn't get a competing write.
45995
+ // Capture the caret position INSIDE the gate — reading `selectionStart`
45996
+ // on input types that don't support text selection (number, email in
45997
+ // some browsers) throws InvalidStateError, which would crash all input
45998
+ // handling. Wrap the read in try/catch belt-and-suspenders even though
45999
+ // the gated types currently support it, since the list is a public
46000
+ // property a consumer could mutate.
46001
+ if (this.setSelectionInputTypes.includes(this.type)) {
46002
+ let selectionStart;
46003
+ try {
46004
+ selectionStart = this.inputElement.selectionStart;
46005
+ } catch (error) { // eslint-disable-line no-unused-vars
46006
+ return;
46007
+ }
46008
+ if (typeof selectionStart !== 'number') {
46009
+ return;
46010
+ }
46011
+ this.updateComplete.then(() => {
46012
+ try {
46013
+ this.inputElement.setSelectionRange(selectionStart, selectionStart);
46014
+ } catch (error) { // eslint-disable-line no-unused-vars
46015
+ // Some input types (number/email in certain UAs) throw on
46016
+ // setSelectionRange; swallow and let the native cursor stand.
46017
+ }
46018
+ });
46019
+ }
45973
46020
  }
45974
46021
 
45975
46022
  /**
@@ -46596,7 +46643,7 @@ let AuroHelpText$1$3 = class AuroHelpText extends i$3 {
46596
46643
  }
46597
46644
  };
46598
46645
 
46599
- var formkitVersion$7 = '202606252142';
46646
+ var formkitVersion$7 = '202606252337';
46600
46647
 
46601
46648
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
46602
46649
  // See LICENSE in the project root for license information.
@@ -47099,6 +47146,7 @@ let AuroInput$1 = class AuroInput extends BaseInput$1 {
47099
47146
  <${this.buttonTag}
47100
47147
  @click="${this.handleClickShowPassword}"
47101
47148
  appearance="${this.onDark ? 'inverse' : this.appearance}"
47149
+ aria-pressed="${this.showPassword ? 'true' : 'false'}"
47102
47150
  class="notificationBtn passwordBtn"
47103
47151
  shape="circle"
47104
47152
  size="sm"
@@ -47172,25 +47220,29 @@ let AuroInput$1 = class AuroInput extends BaseInput$1 {
47172
47220
  * @returns {html} - Returns HTML for the help text and error message.
47173
47221
  */
47174
47222
  renderHtmlHelpText() {
47223
+ // Single `<p>` with stable identity across validity transitions —
47224
+ // previously two distinct templates (valid vs invalid) caused Lit to
47225
+ // replace the node entirely on a flip, and VoiceOver wouldn't
47226
+ // re-announce because the live-region element it was watching had been
47227
+ // removed and a new one inserted. Keeping one node means the `role`,
47228
+ // `aria-live`, and text content all change in-place, which AT does
47229
+ // observe and announce.
47230
+ const isError = this.validity && this.validity !== 'valid';
47175
47231
  return u$c`
47176
- ${!this.validity || this.validity === undefined || this.validity === 'valid'
47177
- ? u$c`
47178
- <${this.helpTextTag}
47179
- appearance="${this.onDark ? 'inverse' : this.appearance}">
47180
- <p id="${this.uniqueId}" part="helpText">
47181
- <slot name="helpText">${this.getHelpText()}</slot>
47182
- </p>
47183
- </${this.helpTextTag}>
47184
- `
47185
- : u$c`
47186
- <${this.helpTextTag} error
47187
- appearance="${this.onDark ? 'inverse' : this.appearance}">
47188
- <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
47189
- ${this.errorMessage}
47190
- </p>
47191
- </${this.helpTextTag}>
47192
- `
47193
- }
47232
+ <${this.helpTextTag}
47233
+ appearance="${this.onDark ? 'inverse' : this.appearance}"
47234
+ ?error=${isError}>
47235
+ <p
47236
+ id="${this.uniqueId}"
47237
+ part="helpText"
47238
+ role="${o$4(isError ? 'alert' : undefined)}"
47239
+ aria-live="${o$4(isError ? 'assertive' : undefined)}">
47240
+ ${isError
47241
+ ? this.errorMessage
47242
+ : u$c`<slot name="helpText">${this.getHelpText()}</slot>`
47243
+ }
47244
+ </p>
47245
+ </${this.helpTextTag}>
47194
47246
  `;
47195
47247
  }
47196
47248
 
@@ -47337,6 +47389,15 @@ function formatISODate(isoStr, format) {
47337
47389
  try {
47338
47390
  const date = dateFormatter$2.stringToDateInstance(isoStr);
47339
47391
 
47392
+ // `stringToDateInstance` returns an `Invalid Date` for malformed strings
47393
+ // and `null` for non-string input — it does NOT throw. Without this
47394
+ // guard, `getFullYear()`/`getMonth()`/`getDate()` on an Invalid Date
47395
+ // yield `NaN`, and `String(NaN).padStart(4, '0')` produces literals
47396
+ // like "0NaN/0NaN/0NaN" instead of `undefined`.
47397
+ if (!(date instanceof Date) || Number.isNaN(date.getTime())) {
47398
+ return undefined;
47399
+ }
47400
+
47340
47401
  const year = String(date.getFullYear()).padStart(4, '0');
47341
47402
  const month = String(date.getMonth() + 1).padStart(2, '0');
47342
47403
  const day = String(date.getDate()).padStart(2, '0');
@@ -47347,7 +47408,10 @@ function formatISODate(isoStr, format) {
47347
47408
  replace(/mm/iu, month).
47348
47409
  replace(/dd/iu, day);
47349
47410
  } catch (err) {
47350
- // If the input string is not a valid date, return undefined
47411
+ // Defensive: the Date-returning path is guarded above, but `parseDate`
47412
+ // (inside `stringToDateInstance`) could throw on pathological input
47413
+ // future-library-versions might introduce. Treat any thrown error as
47414
+ // "not a valid date" and return undefined.
47351
47415
  return undefined;
47352
47416
  }
47353
47417
  }
@@ -51299,7 +51363,7 @@ let AuroHelpText$1$2 = class AuroHelpText extends i$3 {
51299
51363
  }
51300
51364
  };
51301
51365
 
51302
- var formkitVersion$1$2 = '202606252142';
51366
+ var formkitVersion$1$2 = '202606252337';
51303
51367
 
51304
51368
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
51305
51369
  // See LICENSE in the project root for license information.
@@ -55627,7 +55691,7 @@ let AuroHelpText$6 = class AuroHelpText extends i$3 {
55627
55691
  }
55628
55692
  };
55629
55693
 
55630
- var formkitVersion$6 = '202606252142';
55694
+ var formkitVersion$6 = '202606252337';
55631
55695
 
55632
55696
  let AuroElement$1$2 = class AuroElement extends i$3 {
55633
55697
  static get properties() {
@@ -56899,7 +56963,6 @@ let AuroDropdown$2 = class AuroDropdown extends AuroElement$1$2 {
56899
56963
  role="${o$4(this.triggerContentFocusable ? undefined : this.a11yRole)}"
56900
56964
  aria-expanded="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
56901
56965
  aria-controls="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
56902
- aria-haspopup="${o$4(this.a11yRole === 'combobox' ? 'listbox' : undefined)}"
56903
56966
  aria-labelledby="${o$4(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
56904
56967
  aria-disabled="${o$4(this.disabled ? 'true' : undefined)}"
56905
56968
  @focusin="${this.handleFocusin}"
@@ -59568,7 +59631,7 @@ let AuroHelpText$5 = class AuroHelpText extends i$3 {
59568
59631
  }
59569
59632
  };
59570
59633
 
59571
- var formkitVersion$5 = '202606252142';
59634
+ var formkitVersion$5 = '202606252337';
59572
59635
 
59573
59636
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
59574
59637
  // See LICENSE in the project root for license information.
@@ -61318,7 +61381,7 @@ let AuroHelpText$4 = class AuroHelpText extends i$3 {
61318
61381
  }
61319
61382
  };
61320
61383
 
61321
- var formkitVersion$4 = '202606252142';
61384
+ var formkitVersion$4 = '202606252337';
61322
61385
 
61323
61386
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
61324
61387
  // See LICENSE in the project root for license information.
@@ -66533,7 +66596,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$3 {
66533
66596
  }
66534
66597
  };
66535
66598
 
66536
- var formkitVersion$2 = '202606252142';
66599
+ var formkitVersion$2 = '202606252337';
66537
66600
 
66538
66601
  let AuroElement$2$1 = class AuroElement extends i$3 {
66539
66602
  static get properties() {
@@ -67805,7 +67868,6 @@ let AuroDropdown$1 = class AuroDropdown extends AuroElement$2$1 {
67805
67868
  role="${o$4(this.triggerContentFocusable ? undefined : this.a11yRole)}"
67806
67869
  aria-expanded="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
67807
67870
  aria-controls="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
67808
- aria-haspopup="${o$4(this.a11yRole === 'combobox' ? 'listbox' : undefined)}"
67809
67871
  aria-labelledby="${o$4(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
67810
67872
  aria-disabled="${o$4(this.disabled ? 'true' : undefined)}"
67811
67873
  @focusin="${this.handleFocusin}"
@@ -78252,6 +78314,13 @@ class AuroInputUtilities {
78252
78314
  * @returns {string | undefined}
78253
78315
  */
78254
78316
  toFormattedValue(valueObject, format) {
78317
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
78318
+ // `format` argument has to fail gracefully rather than throw on
78319
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
78320
+ // as "no format → no display value".
78321
+ if (!format) {
78322
+ return undefined;
78323
+ }
78255
78324
  const normalizedFormat = format.toLowerCase();
78256
78325
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
78257
78326
 
@@ -78402,79 +78471,18 @@ class BaseInput extends AuroElement$1$1 {
78402
78471
  constructor() {
78403
78472
  super();
78404
78473
 
78405
- this.appearance = "default";
78406
- this.disabled = false;
78407
- this.layout = 'classic';
78408
- this.locale = 'en-US';
78409
- this.max = undefined;
78410
- this._maxObject = undefined;
78411
- this.maxLength = undefined;
78412
- this.min = undefined;
78413
- this._minObject = undefined;
78414
- this.minLength = undefined;
78415
- this.required = false;
78416
- this.onDark = false;
78417
- this.setCustomValidityForType = undefined;
78418
- this.size = 'lg';
78419
- this.shape = 'classic';
78420
- this.value = undefined;
78421
- this._valueObject = undefined;
78422
-
78423
- this._initializePrivateDefaults();
78424
- }
78425
-
78426
- /**
78427
- * Internal Defaults.
78428
- * @private
78429
- * @returns {void}
78430
- */
78431
- _initializePrivateDefaults() {
78474
+ // Single-source initialization. Alphabetized so duplicate or stale
78475
+ // defaults are immediately obvious on a diff. Every field is assigned
78476
+ // exactly once here (previously the constructor + the old
78477
+ // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
78478
+ // fields and double-allocated `util` and `validation`, discarding the
78479
+ // first instance). `validation` is now allocated exactly once; `util`
78480
+ // is seeded here with an en-US default and then rebuilt in
78481
+ // `connectedCallback` once the consumer-resolved locale is available,
78482
+ // so a parent (datepicker/combobox) calling `validate()` synchronously
78483
+ // during its own update cycle sees a populated util instance.
78432
78484
  this.activeLabel = false;
78433
- this.appearance = "default";
78434
- this.icon = false;
78435
- this.disabled = false;
78436
- this.dvInputOnly = false;
78437
- this.hideLabelVisually = false;
78438
- this.max = undefined;
78439
- this.maxLength = undefined;
78440
- this.min = undefined;
78441
- this.minLength = undefined;
78442
- this.noValidate = false;
78443
- this.onDark = false;
78444
- this.required = false;
78445
- this.setCustomValidityForType = undefined;
78446
-
78447
- // Used for storing raw values returned from input mask.
78448
- this._rawMaskValue = undefined;
78449
-
78450
- /**
78451
- * @private
78452
- */
78453
- this.layout = 'classic';
78454
-
78455
- /**
78456
- * @private
78457
- */
78458
- this.shape = 'classic';
78459
-
78460
- /**
78461
- * @private
78462
- */
78463
- this.size = 'lg';
78464
-
78465
- this.touched = false;
78466
- this.util = new AuroInputUtilities({
78467
- locale: "en-US",
78468
- format: this.format
78469
- });
78470
- this.validation = new AuroFormValidation$2();
78471
- this.inputIconName = undefined;
78472
- this.showPassword = false;
78473
- this.validationCCLength = undefined;
78474
- this.hasValue = false;
78475
- this.label = 'Input label is undefined';
78476
-
78477
-
78485
+ /** @private */
78478
78486
  this.allowedInputTypes = [
78479
78487
  "text",
78480
78488
  "number",
@@ -78483,7 +78491,8 @@ class BaseInput extends AuroElement$1$1 {
78483
78491
  "credit-card",
78484
78492
  "tel"
78485
78493
  ];
78486
- this.icon = false;
78494
+ this.appearance = "default";
78495
+ /** @private */
78487
78496
  this.dateFormatMap = {
78488
78497
  'mm/dd/yyyy': 'dateMMDDYYYY',
78489
78498
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -78500,27 +78509,57 @@ class BaseInput extends AuroElement$1$1 {
78500
78509
  'dd/mm': 'dateDDMM',
78501
78510
  'mm/dd': 'dateMMDD'
78502
78511
  };
78512
+ this.disabled = false;
78513
+ /** @private */
78503
78514
  this.domHandler = new DomHandler();
78504
78515
  this.dvInputOnly = false;
78505
78516
  this.hasValue = false;
78517
+ this.hideLabelVisually = false;
78518
+ this.icon = false;
78519
+ /** @private */
78506
78520
  this.inputIconName = undefined;
78521
+ /** @private */
78507
78522
  this.label = 'Input label is undefined';
78523
+ this.layout = 'classic';
78524
+ this.locale = 'en-US';
78525
+ this.max = undefined;
78526
+ this._maxObject = undefined;
78527
+ this.maxLength = undefined;
78528
+ this.min = undefined;
78529
+ this._minObject = undefined;
78530
+ this.minLength = undefined;
78508
78531
  this.noValidate = false;
78509
- this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
78532
+ this.onDark = false;
78533
+ // Raw values returned from the input mask before model normalization.
78534
+ this._rawMaskValue = undefined;
78535
+ this.required = false;
78536
+ this.setCustomValidityForType = undefined;
78537
+ // Credit Card is intentionally excluded — its mask manages the cursor
78538
+ // itself, and listing it here caused cursor placement issues in Safari.
78539
+ /** @private */
78510
78540
  this.setSelectionInputTypes = [
78511
78541
  "text",
78512
78542
  "password",
78513
78543
  "email"
78514
- ]; // Credit Card is not included as this caused cursor placement issues in Safari.
78544
+ ];
78545
+ this.shape = 'classic';
78546
+ /** @private */
78515
78547
  this.showPassword = false;
78548
+ this.size = 'lg';
78516
78549
  this.touched = false;
78550
+ /** @private */
78517
78551
  this.uniqueId = new UniqueId().create();
78552
+ /** @private */
78518
78553
  this.util = new AuroInputUtilities({
78519
78554
  locale: this.locale,
78520
78555
  format: this.format
78521
78556
  });
78557
+ /** @private */
78522
78558
  this.validation = new AuroFormValidation$2();
78559
+ /** @private */
78523
78560
  this.validationCCLength = undefined;
78561
+ this.value = undefined;
78562
+ this._valueObject = undefined;
78524
78563
  }
78525
78564
 
78526
78565
  // function to define props used within the scope of this component
@@ -79068,6 +79107,15 @@ class BaseInput extends AuroElement$1$1 {
79068
79107
 
79069
79108
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
79070
79109
 
79110
+ // Normalize the format token to lowercase so case-mixed values supplied
79111
+ // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
79112
+ // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
79113
+ // format silently misses the map and leaves `setCustomValidityForType`
79114
+ // unset.
79115
+ if (this.format) {
79116
+ this.format = this.format.toLowerCase();
79117
+ }
79118
+
79071
79119
  // use validity message override if declared when initializing the component
79072
79120
  if (this.hasAttribute('setCustomValidity')) {
79073
79121
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -79501,6 +79549,38 @@ class BaseInput extends AuroElement$1$1 {
79501
79549
  this.touched = true;
79502
79550
  this.validation.validate(this);
79503
79551
  }
79552
+
79553
+ // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
79554
+ // update that can re-render the input and reset the native cursor; we
79555
+ // capture the caret position before that update commits and restore it
79556
+ // via `setSelectionRange` once the update has flushed. Gated on
79557
+ // `setSelectionInputTypes` so credit-card (and other masked types whose
79558
+ // formatter manages the cursor itself) doesn't get a competing write.
79559
+ // Capture the caret position INSIDE the gate — reading `selectionStart`
79560
+ // on input types that don't support text selection (number, email in
79561
+ // some browsers) throws InvalidStateError, which would crash all input
79562
+ // handling. Wrap the read in try/catch belt-and-suspenders even though
79563
+ // the gated types currently support it, since the list is a public
79564
+ // property a consumer could mutate.
79565
+ if (this.setSelectionInputTypes.includes(this.type)) {
79566
+ let selectionStart;
79567
+ try {
79568
+ selectionStart = this.inputElement.selectionStart;
79569
+ } catch (error) { // eslint-disable-line no-unused-vars
79570
+ return;
79571
+ }
79572
+ if (typeof selectionStart !== 'number') {
79573
+ return;
79574
+ }
79575
+ this.updateComplete.then(() => {
79576
+ try {
79577
+ this.inputElement.setSelectionRange(selectionStart, selectionStart);
79578
+ } catch (error) { // eslint-disable-line no-unused-vars
79579
+ // Some input types (number/email in certain UAs) throw on
79580
+ // setSelectionRange; swallow and let the native cursor stand.
79581
+ }
79582
+ });
79583
+ }
79504
79584
  }
79505
79585
 
79506
79586
  /**
@@ -80127,7 +80207,7 @@ let AuroHelpText$1$1 = class AuroHelpText extends i$3 {
80127
80207
  }
80128
80208
  };
80129
80209
 
80130
- var formkitVersion$1$1 = '202606252142';
80210
+ var formkitVersion$1$1 = '202606252337';
80131
80211
 
80132
80212
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
80133
80213
  // See LICENSE in the project root for license information.
@@ -80630,6 +80710,7 @@ class AuroInput extends BaseInput {
80630
80710
  <${this.buttonTag}
80631
80711
  @click="${this.handleClickShowPassword}"
80632
80712
  appearance="${this.onDark ? 'inverse' : this.appearance}"
80713
+ aria-pressed="${this.showPassword ? 'true' : 'false'}"
80633
80714
  class="notificationBtn passwordBtn"
80634
80715
  shape="circle"
80635
80716
  size="sm"
@@ -80703,25 +80784,29 @@ class AuroInput extends BaseInput {
80703
80784
  * @returns {html} - Returns HTML for the help text and error message.
80704
80785
  */
80705
80786
  renderHtmlHelpText() {
80787
+ // Single `<p>` with stable identity across validity transitions —
80788
+ // previously two distinct templates (valid vs invalid) caused Lit to
80789
+ // replace the node entirely on a flip, and VoiceOver wouldn't
80790
+ // re-announce because the live-region element it was watching had been
80791
+ // removed and a new one inserted. Keeping one node means the `role`,
80792
+ // `aria-live`, and text content all change in-place, which AT does
80793
+ // observe and announce.
80794
+ const isError = this.validity && this.validity !== 'valid';
80706
80795
  return u$c`
80707
- ${!this.validity || this.validity === undefined || this.validity === 'valid'
80708
- ? u$c`
80709
- <${this.helpTextTag}
80710
- appearance="${this.onDark ? 'inverse' : this.appearance}">
80711
- <p id="${this.uniqueId}" part="helpText">
80712
- <slot name="helpText">${this.getHelpText()}</slot>
80713
- </p>
80714
- </${this.helpTextTag}>
80715
- `
80716
- : u$c`
80717
- <${this.helpTextTag} error
80718
- appearance="${this.onDark ? 'inverse' : this.appearance}">
80719
- <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
80720
- ${this.errorMessage}
80721
- </p>
80722
- </${this.helpTextTag}>
80723
- `
80724
- }
80796
+ <${this.helpTextTag}
80797
+ appearance="${this.onDark ? 'inverse' : this.appearance}"
80798
+ ?error=${isError}>
80799
+ <p
80800
+ id="${this.uniqueId}"
80801
+ part="helpText"
80802
+ role="${o$4(isError ? 'alert' : undefined)}"
80803
+ aria-live="${o$4(isError ? 'assertive' : undefined)}">
80804
+ ${isError
80805
+ ? this.errorMessage
80806
+ : u$c`<slot name="helpText">${this.getHelpText()}</slot>`
80807
+ }
80808
+ </p>
80809
+ </${this.helpTextTag}>
80725
80810
  `;
80726
80811
  }
80727
80812
 
@@ -81248,7 +81333,7 @@ let AuroBibtemplate$1 = class AuroBibtemplate extends i$3 {
81248
81333
  }
81249
81334
  };
81250
81335
 
81251
- var formkitVersion$3 = '202606252142';
81336
+ var formkitVersion$3 = '202606252337';
81252
81337
 
81253
81338
  var styleCss$1$3 = i$6`.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock{display:block}.util_displayFlex{display:flex}.util_displayHidden{display:none}.util_displayHiddenVisually{position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}:host{display:block;text-align:left}:host [auro-dropdown]{--ds-auro-dropdown-trigger-background-color: transparent}:host #inputInBib::part(wrapper){box-shadow:none}:host #inputInBib::part(accent-left){display:none}:host([layout*=classic]) [auro-input]{width:100%}:host([layout*=classic]) [auro-input]::part(helpText){display:none}:host([layout*=classic]) #slotHolder{display:none}`;
81254
81339
 
@@ -86061,24 +86146,19 @@ const selectKeyboardStrategy = {
86061
86146
  },
86062
86147
 
86063
86148
  End(component, evt, ctx) {
86149
+ if (!ctx.isExpanded) {
86150
+ return;
86151
+ }
86064
86152
  evt.preventDefault();
86065
86153
  evt.stopPropagation();
86066
86154
  // `pop()` is safe here: getEnabledOptions returns a fresh filtered array.
86067
86155
  const lastOption = getEnabledOptions(component.menu).pop();
86068
- if (!lastOption) {
86069
- return;
86070
- }
86071
- if (!ctx.isExpanded) {
86072
- component.dropdown.show();
86156
+ if (lastOption) {
86157
+ component.menu.updateActiveOption(lastOption);
86073
86158
  }
86074
- component.menu.updateActiveOption(lastOption);
86075
86159
  },
86076
86160
 
86077
86161
  Enter(component, evt, ctx) {
86078
- // Prevent the keypress from bubbling to parent containers (e.g., forms)
86079
- // which could interpret Enter as a submit. Matches APG select-only combobox
86080
- // and native <select> behavior: Enter opens the listbox when closed, selects
86081
- // the active option when open — it does not submit a parent form.
86082
86162
  evt.preventDefault();
86083
86163
  evt.stopPropagation();
86084
86164
  if (!ctx.isExpanded) {
@@ -86089,16 +86169,15 @@ const selectKeyboardStrategy = {
86089
86169
  },
86090
86170
 
86091
86171
  Home(component, evt, ctx) {
86172
+ if (!ctx.isExpanded) {
86173
+ return;
86174
+ }
86092
86175
  evt.preventDefault();
86093
86176
  evt.stopPropagation();
86094
86177
  const [firstOption] = getEnabledOptions(component.menu);
86095
- if (!firstOption) {
86096
- return;
86178
+ if (firstOption) {
86179
+ component.menu.updateActiveOption(firstOption);
86097
86180
  }
86098
- if (!ctx.isExpanded) {
86099
- component.dropdown.show();
86100
- }
86101
- component.menu.updateActiveOption(firstOption);
86102
86181
  },
86103
86182
 
86104
86183
  Tab(component, evt, ctx) {
@@ -90045,7 +90124,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
90045
90124
  }
90046
90125
  };
90047
90126
 
90048
- var formkitVersion$1 = '202606252142';
90127
+ var formkitVersion$1 = '202606252337';
90049
90128
 
90050
90129
  class AuroElement extends i$3 {
90051
90130
  static get properties() {
@@ -91317,7 +91396,6 @@ class AuroDropdown extends AuroElement {
91317
91396
  role="${o$4(this.triggerContentFocusable ? undefined : this.a11yRole)}"
91318
91397
  aria-expanded="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
91319
91398
  aria-controls="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
91320
- aria-haspopup="${o$4(this.a11yRole === 'combobox' ? 'listbox' : undefined)}"
91321
91399
  aria-labelledby="${o$4(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
91322
91400
  aria-disabled="${o$4(this.disabled ? 'true' : undefined)}"
91323
91401
  @focusin="${this.handleFocusin}"
@@ -92067,7 +92145,7 @@ class AuroHelpText extends i$3 {
92067
92145
  }
92068
92146
  }
92069
92147
 
92070
- var formkitVersion = '202606252142';
92148
+ var formkitVersion = '202606252337';
92071
92149
 
92072
92150
  var styleCss = i$6`.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock{display:block}.util_displayFlex{display:flex}.util_displayHidden{display:none}.util_displayHiddenVisually{position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}.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}`;
92073
92151
 
@@ -92399,6 +92477,14 @@ class AuroSelect extends AuroElement$1 {
92399
92477
  reflect: true
92400
92478
  },
92401
92479
 
92480
+ /**
92481
+ * @private
92482
+ */
92483
+ options: {
92484
+ type: Array,
92485
+ state: true
92486
+ },
92487
+
92402
92488
  /**
92403
92489
  * Specifies the current selected menuOption. Default type is `HTMLElement`, changing to `Array<HTMLElement>` when `multiSelect` is true.
92404
92490
  * @type {HTMLElement|Array<HTMLElement>}
@@ -92686,68 +92772,16 @@ class AuroSelect extends AuroElement$1 {
92686
92772
  this.dropdown.dropdownWidth = this.customBibWidth;
92687
92773
  }
92688
92774
 
92689
- this._syncLabelText();
92775
+ // Pass label text to the dropdown bib for accessible dialog naming
92776
+ const labelElement = this.querySelector('span[slot="label"]');
92777
+ if (labelElement) {
92778
+ this.dropdown.bibDialogLabel = labelElement.textContent.trim() || undefined;
92779
+ }
92690
92780
 
92691
92781
  // Exposes the CSS parts from the dropdown for styling
92692
92782
  this.dropdown.exposeCssParts();
92693
92783
  }
92694
92784
 
92695
- /**
92696
- * Reads the current label slot text and pushes it to the dropdown bib
92697
- * (for dialog naming) and the menu (for listbox aria-label). Safe to call
92698
- * before either child has been wired up — each branch self-guards.
92699
- * @private
92700
- */
92701
- _syncLabelText() {
92702
- const labelElement = this.querySelector('[slot="label"]');
92703
- const text = labelElement ? labelElement.textContent.trim() : '';
92704
- if (this.dropdown) {
92705
- this.dropdown.bibDialogLabel = text || undefined;
92706
- }
92707
- if (this.menu) {
92708
- if (text) {
92709
- this.menu.setAttribute('aria-label', text);
92710
- } else {
92711
- this.menu.removeAttribute('aria-label');
92712
- }
92713
- }
92714
- }
92715
-
92716
- /**
92717
- * Keeps the dialog/menu accessible names in sync when consumers mutate the
92718
- * label slot at runtime (e.g., i18n locale swap). `slotchange` alone is
92719
- * insufficient — it doesn't fire when textContent of an already-assigned
92720
- * slotted node changes, which is the common case. We scope the observer to
92721
- * the label node itself (not the whole host subtree) so option-content
92722
- * mutations don't trigger label re-syncs, and re-target on `slotchange`
92723
- * when consumers add or replace the label element.
92724
- * @private
92725
- */
92726
- _observeLabelChanges() {
92727
- if (this._labelObserver) return;
92728
- this._labelObserver = new MutationObserver(() => this._syncLabelText());
92729
-
92730
- const retarget = () => {
92731
- this._labelObserver.disconnect();
92732
- const labelElement = this.querySelector('[slot="label"]');
92733
- if (labelElement) {
92734
- this._labelObserver.observe(labelElement, {
92735
- childList: true,
92736
- subtree: true,
92737
- characterData: true
92738
- });
92739
- }
92740
- this._syncLabelText();
92741
- };
92742
-
92743
- retarget();
92744
-
92745
- this._retargetLabelObserver = retarget;
92746
- this.shadowRoot.querySelectorAll('slot[name="label"]').forEach((slot) => {
92747
- slot.addEventListener('slotchange', retarget);
92748
- });
92749
- }
92750
-
92751
92785
  /**
92752
92786
  * This will register this element with the browser.
92753
92787
  * @param {string} [name="auro-select"] - The name of element that you want to register to.
@@ -92898,7 +92932,11 @@ class AuroSelect extends AuroElement$1 {
92898
92932
  this.updateMenuShapeSize();
92899
92933
  this.setMenuValue(this.value);
92900
92934
 
92901
- this._syncLabelText();
92935
+ // Set accessible name on the menu for screen readers based on the label slot content
92936
+ const labelElement = this.querySelector('[slot="label"]');
92937
+ if (labelElement) {
92938
+ this.menu.setAttribute('aria-label', labelElement.textContent.trim());
92939
+ }
92902
92940
 
92903
92941
  if (this.multiSelect) {
92904
92942
  this.menu.multiSelect = this.multiSelect;
@@ -92910,21 +92948,8 @@ class AuroSelect extends AuroElement$1 {
92910
92948
  if (typeof this.menu.initItems === 'function') {
92911
92949
  this.menu.initItems();
92912
92950
  }
92951
+ this.options = this.menu.options;
92913
92952
  this.updateOptionPositions();
92914
- // renderNativeSelect reads this.menu.options, which the parent doesn't
92915
- // observe — request an update so the hidden native <option> list reflects
92916
- // the menu's options after initItems populates them.
92917
- this.requestUpdate();
92918
-
92919
- // Keep aria-setsize/aria-posinset (and the native <option> list) in sync
92920
- // when the menu re-initializes its items — e.g., slotchange, async/lazy
92921
- // loads, value-triggered re-init. Without this, stale set-size is
92922
- // announced and the native select goes stale after dynamic mutations.
92923
- this.menu.addEventListener('auroMenu-optionsChange', () => {
92924
- this.updateOptionPositions();
92925
- this.requestUpdate();
92926
- });
92927
-
92928
92953
  this.menu.addEventListener("auroMenu-loadingChange", (event) => this.handleMenuLoadingChange(event));
92929
92954
 
92930
92955
  this.menu.addEventListener("auroMenu-selectValueFailure", () => {
@@ -92943,22 +92968,11 @@ class AuroSelect extends AuroElement$1 {
92943
92968
  this.dropdown.setActiveDescendant(this.optionActive);
92944
92969
  }
92945
92970
 
92946
- // Announce the active option for screen readers. Skip when the activated
92947
- // option is already selected: Enter triggers an auroMenu-selectedOption
92948
- // re-announce, and aria-selected on the active descendant otherwise
92949
- // conveys state without an explicit utterance.
92950
- if (this.optionActive && !this.optionActive.hasAttribute('selected')) {
92971
+ // Announce the active option for screen readers
92972
+ if (this.optionActive) {
92951
92973
  const optionText = this.optionActive.textContent.trim();
92952
- const message = `${optionText}, not selected`;
92953
- if (this.dropdown.isPopoverVisible) {
92954
- announceToScreenReader(this._getAnnouncementRoot(), message);
92955
- } else {
92956
- // Typeahead-on-closed fires this event before `show()` flips
92957
- // isPopoverVisible. Defer so the announcement targets the bib's
92958
- // live region once the fullscreen <dialog> opens — otherwise it
92959
- // lands in the host root, which is inert under the active modal.
92960
- queueMicrotask(() => announceToScreenReader(this._getAnnouncementRoot(), message));
92961
- }
92974
+ const selectedState = this.optionActive.hasAttribute('selected') ? ', selected' : ', not selected';
92975
+ announceToScreenReader(this._getAnnouncementRoot(), `${optionText}${selectedState}`);
92962
92976
  }
92963
92977
 
92964
92978
  if (this.dropdown.isPopoverVisible) {
@@ -93090,32 +93104,24 @@ class AuroSelect extends AuroElement$1 {
93090
93104
 
93091
93105
  this.typeaheadBuffer += key;
93092
93106
 
93093
- // Prefer the literal buffer as a prefix per WAI-ARIA APG ("focus moves to the
93094
- // next item with a name that starts with the string of characters typed").
93095
- // Only fall back to single-char cycling when the repeated buffer has no
93096
- // longer prefix match — e.g. "aa" cycles through ["Apple", "Apricot"] only
93097
- // because no option starts with "aa".
93098
- let match = options.find((option) => this._getOptionDisplayText(option).startsWith(this.typeaheadBuffer));
93107
+ const isRepeatedChar = this.typeaheadBuffer.length > 1 && new Set(this.typeaheadBuffer).size === 1;
93099
93108
 
93100
- const isRepeatedChar = !match && this.typeaheadBuffer.length > 1 && new Set(this.typeaheadBuffer).size === 1;
93109
+ let match = null;
93101
93110
  if (isRepeatedChar) {
93102
93111
  const matches = options.filter((option) => this._getOptionDisplayText(option).startsWith(key));
93103
93112
  if (matches.length) {
93104
93113
  const cycleIndex = (this.typeaheadBuffer.length - 1) % matches.length;
93105
93114
  match = matches[cycleIndex];
93106
93115
  }
93116
+ } else {
93117
+ match = options.find((option) => this._getOptionDisplayText(option).startsWith(this.typeaheadBuffer));
93107
93118
  }
93108
93119
 
93109
- // Intentional: no-match leaves the bib closed (deviates from APG / some native <select>).
93110
93120
  if (match) {
93111
- // Pre-stash the match so the auroDropdown-toggled handler's `!optionActive`
93112
- // guard short-circuits and skips the firstActive/selected fallback —
93113
- // otherwise show() synchronously fires the handler, which writes
93114
- // aria-activedescendant once before we overwrite it.
93115
- this.menu.updateActiveOption(match);
93116
93121
  if (!this.dropdown.isPopoverVisible) {
93117
93122
  this.dropdown.show();
93118
93123
  }
93124
+ this.menu.updateActiveOption(match);
93119
93125
  }
93120
93126
  }
93121
93127
 
@@ -93232,16 +93238,6 @@ class AuroSelect extends AuroElement$1 {
93232
93238
  disconnectedCallback() {
93233
93239
  super.disconnectedCallback();
93234
93240
  this._clearTypeaheadBuffer();
93235
- if (this._labelObserver) {
93236
- this._labelObserver.disconnect();
93237
- this._labelObserver = null;
93238
- }
93239
- if (this._retargetLabelObserver && this.shadowRoot) {
93240
- this.shadowRoot.querySelectorAll('slot[name="label"]').forEach((slot) => {
93241
- slot.removeEventListener('slotchange', this._retargetLabelObserver);
93242
- });
93243
- this._retargetLabelObserver = null;
93244
- }
93245
93241
  }
93246
93242
 
93247
93243
  // lifecycle runs only after the element's DOM has been updated the first time
@@ -93252,7 +93248,6 @@ class AuroSelect extends AuroElement$1 {
93252
93248
  this.configureDropdown();
93253
93249
  this.configureMenu();
93254
93250
  this.configureSelect();
93255
- this._observeLabelChanges();
93256
93251
  }
93257
93252
 
93258
93253
  setMenuValue(value) {
@@ -93389,8 +93384,21 @@ class AuroSelect extends AuroElement$1 {
93389
93384
  if (!selectedOption) return;
93390
93385
  const selectedValue = selectedOption.value;
93391
93386
 
93392
- if (this.value !== selectedValue) {
93393
- this.value = selectedValue;
93387
+ if (this.multiSelect) {
93388
+ const currentArray = this.menu.value || [];
93389
+
93390
+ if (!currentArray.includes(selectedValue)) {
93391
+ this.value = JSON.stringify([
93392
+ ...currentArray,
93393
+ selectedValue
93394
+ ]);
93395
+ }
93396
+ } else {
93397
+ const currentValue = this.value;
93398
+
93399
+ if (currentValue !== selectedValue) {
93400
+ this.value = selectedValue;
93401
+ }
93394
93402
  }
93395
93403
  }
93396
93404