@aurodesignsystem-dev/auro-formkit 0.0.0-pr1505.0 → 0.0.0-pr1506.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 (55) 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 +120 -139
  7. package/components/combobox/demo/getting-started.min.js +120 -139
  8. package/components/combobox/demo/index.min.js +120 -139
  9. package/components/combobox/dist/auro-combobox.d.ts +9 -0
  10. package/components/combobox/dist/index.js +120 -139
  11. package/components/combobox/dist/registered.js +120 -139
  12. package/components/counter/demo/customize.min.js +2 -2
  13. package/components/counter/demo/index.min.js +2 -2
  14. package/components/counter/dist/index.js +2 -2
  15. package/components/counter/dist/registered.js +2 -2
  16. package/components/datepicker/demo/api.md +0 -2
  17. package/components/datepicker/demo/customize.md +33 -195
  18. package/components/datepicker/demo/customize.min.js +37 -43
  19. package/components/datepicker/demo/index.min.js +36 -35
  20. package/components/datepicker/dist/index.js +36 -35
  21. package/components/datepicker/dist/registered.js +36 -35
  22. package/components/datepicker/dist/src/auro-datepicker.d.ts +0 -2
  23. package/components/dropdown/demo/customize.min.js +1 -1
  24. package/components/dropdown/demo/getting-started.min.js +1 -1
  25. package/components/dropdown/demo/index.min.js +1 -1
  26. package/components/dropdown/dist/index.js +1 -1
  27. package/components/dropdown/dist/registered.js +1 -1
  28. package/components/form/demo/customize.min.js +325 -230
  29. package/components/form/demo/getting-started.min.js +325 -230
  30. package/components/form/demo/index.min.js +325 -230
  31. package/components/form/demo/registerDemoDeps.min.js +325 -230
  32. package/components/input/demo/customize.md +55 -56
  33. package/components/input/demo/customize.min.js +32 -26
  34. package/components/input/demo/getting-started.min.js +32 -26
  35. package/components/input/demo/index.md +2 -2
  36. package/components/input/demo/index.min.js +32 -26
  37. package/components/input/dist/index.js +32 -26
  38. package/components/input/dist/registered.js +32 -26
  39. package/components/radio/demo/customize.min.js +1 -1
  40. package/components/radio/demo/getting-started.min.js +1 -1
  41. package/components/radio/demo/index.min.js +1 -1
  42. package/components/radio/dist/index.js +1 -1
  43. package/components/radio/dist/registered.js +1 -1
  44. package/components/select/demo/api.md +1 -0
  45. package/components/select/demo/customize.md +71 -0
  46. package/components/select/demo/customize.min.js +133 -26
  47. package/components/select/demo/getting-started.min.js +133 -26
  48. package/components/select/demo/index.min.js +133 -26
  49. package/components/select/demo/keyboard-behavior.md +18 -0
  50. package/components/select/dist/auro-select.d.ts +38 -2
  51. package/components/select/dist/index.js +133 -26
  52. package/components/select/dist/registered.js +133 -26
  53. package/components/select/dist/selectUtils.d.ts +12 -0
  54. package/custom-elements.json +114 -10
  55. package/package.json +1 -1
@@ -10460,6 +10460,7 @@ let AuroInputUtilities$3 = class AuroInputUtilities {
10460
10460
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
10461
10461
 
10462
10462
  if (!(valueObject instanceof Date) || Number.isNaN(valueObject.getTime()) || !maskOptions || typeof maskOptions.format !== 'function') {
10463
+ console.debug('Invalid date object or mask options for formatting', { valueObject, maskOptions }); // eslint-disable-line no-console
10463
10464
  return undefined;
10464
10465
  }
10465
10466
 
@@ -11270,10 +11271,6 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11270
11271
  this.wrapperElement.addEventListener('click', this.handleClick);
11271
11272
  }
11272
11273
 
11273
- // add attribute for query selectors when auro-input is registered under a custom name
11274
- if (this.tagName.toLowerCase() !== 'auro-input' && !this.hasAttribute('auro-input')) {
11275
- this.setAttribute('auro-input', '');
11276
- }
11277
11274
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
11278
11275
 
11279
11276
  // use validity message override if declared when initializing the component
@@ -11444,14 +11441,14 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11444
11441
 
11445
11442
  if (formattedValue !== this.inputElement.value) {
11446
11443
  this.skipNextProgrammaticInputEvent = true;
11447
- if (this.maskInstance && this.type === 'credit-card') {
11444
+ if (this.maskInstance && this.type !== 'date') {
11448
11445
  // Route through the mask so its _value and el.value stay in lock-step
11449
11446
  // (set value calls updateControl which writes el.value = displayValue).
11450
11447
  // Writing el.value directly leaves the mask thinking displayValue is
11451
- // stale; _saveSelection on the next focus/click then warns. Scoped to
11452
- // credit-card so date's own formattedValue (raw ISO when calendar-invalid)
11453
- // isn't re-masked through the mm/dd/yyyy mask, which would truncate it
11454
- // and flip validity from patternMismatch to tooShort.
11448
+ // stale; _saveSelection on the next focus/click then warns. Date is
11449
+ // excluded because its formattedValue can be raw ISO when the calendar
11450
+ // is invalid, and re-masking through mm/dd/yyyy would truncate it and
11451
+ // flip validity from patternMismatch to tooShort.
11455
11452
  this.maskInstance.value = formattedValue || '';
11456
11453
  } else if (formattedValue) {
11457
11454
  this.inputElement.value = formattedValue;
@@ -11562,31 +11559,33 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11562
11559
  * @returns {void}
11563
11560
  */
11564
11561
  configureAutoFormatting() {
11565
- // Re-entrancy guard. The patched-setter's synthetic input event (suppressed
11566
- // by _configuringMask above) could otherwise trigger handleInput
11567
- // processCreditCard configureAutoFormatting before the outer call's
11568
- // set value has finished its alignCursor pass.
11562
+ // _configuringMask gates two things: external re-entry into this method
11563
+ // while setup is mid-flight (from property changes that call back here),
11564
+ // and the accept/complete listeners below — both need to ignore the mask
11565
+ // events fired by our own value-restore step.
11569
11566
  if (this._configuringMask) return;
11570
11567
  this._configuringMask = true;
11571
11568
  try {
11569
+ // Destroy any prior mask so IMask can attach fresh under the new format.
11572
11570
  if (this.maskInstance) {
11573
11571
  this.maskInstance.destroy();
11574
11572
  }
11575
11573
 
11576
- // Pass new format to util
11577
11574
  this.util.updateFormat(this.format);
11578
11575
 
11579
11576
  const maskOptions = this.util.getMaskOptions(this.type, this.format);
11580
11577
 
11581
11578
  if (this.inputElement && maskOptions.mask) {
11582
-
11583
- // Stash and clear any existing value before IMask init.
11584
- // IMask's constructor processes the current input value which requires
11585
- // selection state clearing first avoids that scenario entirely.
11586
- // When the format changes (e.g. locale switch) and we have a valid ISO
11587
- // model value, compute the display string for the NEW format instead of
11588
- // re-using the old display string, which may be invalid in the new mask.
11579
+ // Capture the current display so it can be re-applied after IMask
11580
+ // attaches. The restore at the bottom goes through maskInstance.value
11581
+ // (not inputElement.value directly) so the mask's internal state and
11582
+ // the input's displayed text stay in lock-step.
11589
11583
  let existingValue = this.inputElement.value;
11584
+
11585
+ // Format-change case (e.g. locale switch): existingValue is the OLD
11586
+ // mask's display string and may not parse under the new mask. When
11587
+ // we have a valid date model, rebuild the display from valueObject
11588
+ // (the canonical source) using the new mask's format function.
11590
11589
  if (
11591
11590
  this.util.isFullDateFormat(this.type, this.format) &&
11592
11591
  this.value &&
@@ -11598,15 +11597,18 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11598
11597
  existingValue = maskOptions.format(this.valueObject);
11599
11598
  }
11600
11599
 
11600
+ // Clear before IMask attaches so the constructor seeds an empty
11601
+ // internal value. Otherwise IMask reads the stale unmasked string
11602
+ // and emits a spurious 'accept' before the restore below runs.
11601
11603
  this.skipNextProgrammaticInputEvent = true;
11602
11604
  this.inputElement.value = '';
11603
11605
 
11604
11606
  this.maskInstance = IMask$3(this.inputElement, maskOptions);
11605
11607
 
11608
+ // Mask fires 'accept' on every value change, including the restore
11609
+ // step below. Skip events fired during configureAutoFormatting so
11610
+ // we don't overwrite a value the parent just pushed.
11606
11611
  this.maskInstance.on('accept', () => {
11607
- // Suppress propagation during configureAutoFormatting's own value-restoration
11608
- // (line below) — the mask emits 'accept' on every value-set, including ours,
11609
- // and we don't want to overwrite a value the parent just pushed.
11610
11612
  if (this._configuringMask) return;
11611
11613
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
11612
11614
  if (this.type === "date") {
@@ -11614,6 +11616,8 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11614
11616
  }
11615
11617
  });
11616
11618
 
11619
+ // Mask fires 'complete' on the restore step below for any value that
11620
+ // happens to be a complete match. Same setup-suppression as 'accept'.
11617
11621
  this.maskInstance.on('complete', () => {
11618
11622
  if (this._configuringMask) return;
11619
11623
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
@@ -11622,7 +11626,9 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11622
11626
  }
11623
11627
  });
11624
11628
 
11625
- // Restore the stashed value through IMask so it's properly masked
11629
+ // Write existingValue through the mask (not the input directly) so
11630
+ // the mask reformats it under the new rules and keeps its internal
11631
+ // _value aligned with the input's displayed text.
11626
11632
  if (existingValue) {
11627
11633
  this.maskInstance.value = existingValue;
11628
11634
  }
@@ -12328,7 +12334,7 @@ let AuroHelpText$8 = class AuroHelpText extends i$2 {
12328
12334
  }
12329
12335
  };
12330
12336
 
12331
- var formkitVersion$8 = '202606171946';
12337
+ var formkitVersion$8 = '202606190840';
12332
12338
 
12333
12339
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
12334
12340
  // See LICENSE in the project root for license information.
@@ -23567,6 +23573,7 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
23567
23573
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
23568
23574
 
23569
23575
  if (!(valueObject instanceof Date) || Number.isNaN(valueObject.getTime()) || !maskOptions || typeof maskOptions.format !== 'function') {
23576
+ console.debug('Invalid date object or mask options for formatting', { valueObject, maskOptions }); // eslint-disable-line no-console
23570
23577
  return undefined;
23571
23578
  }
23572
23579
 
@@ -26447,7 +26454,7 @@ let AuroBibtemplate$3 = class AuroBibtemplate extends i$2 {
26447
26454
  }
26448
26455
  };
26449
26456
 
26450
- var formkitVersion$2$1 = '202606171946';
26457
+ var formkitVersion$2$1 = '202606190840';
26451
26458
 
26452
26459
  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}
26453
26460
  `,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}}
@@ -31958,7 +31965,7 @@ let AuroHelpText$2$1 = class AuroHelpText extends i$2 {
31958
31965
  }
31959
31966
  };
31960
31967
 
31961
- var formkitVersion$1$3 = '202606171946';
31968
+ var formkitVersion$1$3 = '202606190840';
31962
31969
 
31963
31970
  let AuroElement$2$2 = class AuroElement extends i$2 {
31964
31971
  static get properties() {
@@ -43672,6 +43679,7 @@ let AuroInputUtilities$2 = class AuroInputUtilities {
43672
43679
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
43673
43680
 
43674
43681
  if (!(valueObject instanceof Date) || Number.isNaN(valueObject.getTime()) || !maskOptions || typeof maskOptions.format !== 'function') {
43682
+ console.debug('Invalid date object or mask options for formatting', { valueObject, maskOptions }); // eslint-disable-line no-console
43675
43683
  return undefined;
43676
43684
  }
43677
43685
 
@@ -44482,10 +44490,6 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44482
44490
  this.wrapperElement.addEventListener('click', this.handleClick);
44483
44491
  }
44484
44492
 
44485
- // add attribute for query selectors when auro-input is registered under a custom name
44486
- if (this.tagName.toLowerCase() !== 'auro-input' && !this.hasAttribute('auro-input')) {
44487
- this.setAttribute('auro-input', '');
44488
- }
44489
44493
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
44490
44494
 
44491
44495
  // use validity message override if declared when initializing the component
@@ -44656,14 +44660,14 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44656
44660
 
44657
44661
  if (formattedValue !== this.inputElement.value) {
44658
44662
  this.skipNextProgrammaticInputEvent = true;
44659
- if (this.maskInstance && this.type === 'credit-card') {
44663
+ if (this.maskInstance && this.type !== 'date') {
44660
44664
  // Route through the mask so its _value and el.value stay in lock-step
44661
44665
  // (set value calls updateControl which writes el.value = displayValue).
44662
44666
  // Writing el.value directly leaves the mask thinking displayValue is
44663
- // stale; _saveSelection on the next focus/click then warns. Scoped to
44664
- // credit-card so date's own formattedValue (raw ISO when calendar-invalid)
44665
- // isn't re-masked through the mm/dd/yyyy mask, which would truncate it
44666
- // and flip validity from patternMismatch to tooShort.
44667
+ // stale; _saveSelection on the next focus/click then warns. Date is
44668
+ // excluded because its formattedValue can be raw ISO when the calendar
44669
+ // is invalid, and re-masking through mm/dd/yyyy would truncate it and
44670
+ // flip validity from patternMismatch to tooShort.
44667
44671
  this.maskInstance.value = formattedValue || '';
44668
44672
  } else if (formattedValue) {
44669
44673
  this.inputElement.value = formattedValue;
@@ -44774,31 +44778,33 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44774
44778
  * @returns {void}
44775
44779
  */
44776
44780
  configureAutoFormatting() {
44777
- // Re-entrancy guard. The patched-setter's synthetic input event (suppressed
44778
- // by _configuringMask above) could otherwise trigger handleInput
44779
- // processCreditCard configureAutoFormatting before the outer call's
44780
- // set value has finished its alignCursor pass.
44781
+ // _configuringMask gates two things: external re-entry into this method
44782
+ // while setup is mid-flight (from property changes that call back here),
44783
+ // and the accept/complete listeners below — both need to ignore the mask
44784
+ // events fired by our own value-restore step.
44781
44785
  if (this._configuringMask) return;
44782
44786
  this._configuringMask = true;
44783
44787
  try {
44788
+ // Destroy any prior mask so IMask can attach fresh under the new format.
44784
44789
  if (this.maskInstance) {
44785
44790
  this.maskInstance.destroy();
44786
44791
  }
44787
44792
 
44788
- // Pass new format to util
44789
44793
  this.util.updateFormat(this.format);
44790
44794
 
44791
44795
  const maskOptions = this.util.getMaskOptions(this.type, this.format);
44792
44796
 
44793
44797
  if (this.inputElement && maskOptions.mask) {
44794
-
44795
- // Stash and clear any existing value before IMask init.
44796
- // IMask's constructor processes the current input value which requires
44797
- // selection state clearing first avoids that scenario entirely.
44798
- // When the format changes (e.g. locale switch) and we have a valid ISO
44799
- // model value, compute the display string for the NEW format instead of
44800
- // re-using the old display string, which may be invalid in the new mask.
44798
+ // Capture the current display so it can be re-applied after IMask
44799
+ // attaches. The restore at the bottom goes through maskInstance.value
44800
+ // (not inputElement.value directly) so the mask's internal state and
44801
+ // the input's displayed text stay in lock-step.
44801
44802
  let existingValue = this.inputElement.value;
44803
+
44804
+ // Format-change case (e.g. locale switch): existingValue is the OLD
44805
+ // mask's display string and may not parse under the new mask. When
44806
+ // we have a valid date model, rebuild the display from valueObject
44807
+ // (the canonical source) using the new mask's format function.
44802
44808
  if (
44803
44809
  this.util.isFullDateFormat(this.type, this.format) &&
44804
44810
  this.value &&
@@ -44810,15 +44816,18 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44810
44816
  existingValue = maskOptions.format(this.valueObject);
44811
44817
  }
44812
44818
 
44819
+ // Clear before IMask attaches so the constructor seeds an empty
44820
+ // internal value. Otherwise IMask reads the stale unmasked string
44821
+ // and emits a spurious 'accept' before the restore below runs.
44813
44822
  this.skipNextProgrammaticInputEvent = true;
44814
44823
  this.inputElement.value = '';
44815
44824
 
44816
44825
  this.maskInstance = IMask$2(this.inputElement, maskOptions);
44817
44826
 
44827
+ // Mask fires 'accept' on every value change, including the restore
44828
+ // step below. Skip events fired during configureAutoFormatting so
44829
+ // we don't overwrite a value the parent just pushed.
44818
44830
  this.maskInstance.on('accept', () => {
44819
- // Suppress propagation during configureAutoFormatting's own value-restoration
44820
- // (line below) — the mask emits 'accept' on every value-set, including ours,
44821
- // and we don't want to overwrite a value the parent just pushed.
44822
44831
  if (this._configuringMask) return;
44823
44832
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
44824
44833
  if (this.type === "date") {
@@ -44826,6 +44835,8 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44826
44835
  }
44827
44836
  });
44828
44837
 
44838
+ // Mask fires 'complete' on the restore step below for any value that
44839
+ // happens to be a complete match. Same setup-suppression as 'accept'.
44829
44840
  this.maskInstance.on('complete', () => {
44830
44841
  if (this._configuringMask) return;
44831
44842
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
@@ -44834,7 +44845,9 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44834
44845
  }
44835
44846
  });
44836
44847
 
44837
- // Restore the stashed value through IMask so it's properly masked
44848
+ // Write existingValue through the mask (not the input directly) so
44849
+ // the mask reformats it under the new rules and keeps its internal
44850
+ // _value aligned with the input's displayed text.
44838
44851
  if (existingValue) {
44839
44852
  this.maskInstance.value = existingValue;
44840
44853
  }
@@ -45540,7 +45553,7 @@ let AuroHelpText$1$3 = class AuroHelpText extends i$2 {
45540
45553
  }
45541
45554
  };
45542
45555
 
45543
- var formkitVersion$7 = '202606171946';
45556
+ var formkitVersion$7 = '202606190840';
45544
45557
 
45545
45558
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
45546
45559
  // See LICENSE in the project root for license information.
@@ -46960,8 +46973,6 @@ const datepickerKeyboardStrategy = {
46960
46973
  * @slot label - Defines the label content for the entire datepicker when `layout="snowflake"`.
46961
46974
  * @slot toLabel - Defines the label content for the second input when the `range` attribute is used.
46962
46975
  * @slot fromLabel - Defines the label content for the first input.
46963
- * @slot optionalFromLabel - Overrides the "(optional)" text rendered next to the first input's label when the datepicker is not `required`.
46964
- * @slot optionalToLabel - Overrides the "(optional)" text rendered next to the second input's label when `range` is set and the datepicker is not `required`.
46965
46976
  * @slot date_YYYY_MM_DD - Defines the content to display in the auro-calendar-cell for the specified date. The content text is colored using the success state token when the `highlight` attribute is applied to the slot.
46966
46977
  * @slot popover_YYYY_MM_DD - Defines the content to display in the auro-calendar-cell popover for the specified date.
46967
46978
  * @csspart dropdown - Use for customizing the style of the dropdown.
@@ -48557,9 +48568,7 @@ class AuroDatePicker extends AuroElement$5 {
48557
48568
  // update the calendar
48558
48569
  if (this.valueEndObject) {
48559
48570
  this.calendar.dateTo = this.convertToWcValidTime(this.valueEndObject);
48560
- if (!(this.wasCellClick && this.range)) {
48561
- this.calendarRenderUtil.updateCentralDate(this, this.valueEndObject);
48562
- }
48571
+ this.calendarRenderUtil.updateCentralDate(this, this.valueEndObject);
48563
48572
  } else {
48564
48573
  if (this.inputList[1].value !== this.valueEnd) {
48565
48574
  this.inputList[1].value = this.valueEnd || '';
@@ -48954,7 +48963,6 @@ class AuroDatePicker extends AuroElement$5 {
48954
48963
  }
48955
48964
  <span slot="ariaLabel.clear">${this.runtimeUtils.getSlotText(this, 'ariaLabel.input.clear') || i18n$2(this.lang, 'clearInput')}</span>
48956
48965
  <span slot="label"><slot name="fromLabel"></slot></span>
48957
- <span slot="optionalLabel"><slot name="optionalFromLabel"> (optional)</slot></span>
48958
48966
  </${this.inputTag}>
48959
48967
  </div>
48960
48968
 
@@ -48999,7 +49007,6 @@ class AuroDatePicker extends AuroElement$5 {
48999
49007
  }
49000
49008
  <span slot="ariaLabel.clear">${this.runtimeUtils.getSlotText(this, 'ariaLabel.input.clear') || this.runtimeUtils.getSlotText(this, 'ariaLabel.input.clear') || i18n$2(this.lang, 'clearInput')}</span>
49001
49009
  <span slot="label"><slot name="toLabel"></slot></span>
49002
- <span slot="optionalLabel"><slot name="optionalToLabel"> (optional)</slot></span>
49003
49010
  </${this.inputTag}>
49004
49011
  </div>
49005
49012
  ` : undefined}
@@ -50243,7 +50250,7 @@ let AuroHelpText$1$2 = class AuroHelpText extends i$2 {
50243
50250
  }
50244
50251
  };
50245
50252
 
50246
- var formkitVersion$1$2 = '202606171946';
50253
+ var formkitVersion$1$2 = '202606190840';
50247
50254
 
50248
50255
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
50249
50256
  // See LICENSE in the project root for license information.
@@ -54571,7 +54578,7 @@ let AuroHelpText$6 = class AuroHelpText extends i$2 {
54571
54578
  }
54572
54579
  };
54573
54580
 
54574
- var formkitVersion$6 = '202606171946';
54581
+ var formkitVersion$6 = '202606190840';
54575
54582
 
54576
54583
  let AuroElement$1$2 = class AuroElement extends i$2 {
54577
54584
  static get properties() {
@@ -58503,7 +58510,7 @@ let AuroHelpText$5 = class AuroHelpText extends i$2 {
58503
58510
  }
58504
58511
  };
58505
58512
 
58506
- var formkitVersion$5 = '202606171946';
58513
+ var formkitVersion$5 = '202606190840';
58507
58514
 
58508
58515
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
58509
58516
  // See LICENSE in the project root for license information.
@@ -60253,7 +60260,7 @@ let AuroHelpText$4 = class AuroHelpText extends i$2 {
60253
60260
  }
60254
60261
  };
60255
60262
 
60256
- var formkitVersion$4 = '202606171946';
60263
+ var formkitVersion$4 = '202606190840';
60257
60264
 
60258
60265
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
60259
60266
  // See LICENSE in the project root for license information.
@@ -61429,6 +61436,8 @@ function navigateArrow$1(component, direction, options = {}) {
61429
61436
  }
61430
61437
  }
61431
61438
 
61439
+ /* eslint-disable no-underscore-dangle */
61440
+
61432
61441
  /**
61433
61442
  * Returns the clear button element from the active input's shadow
61434
61443
  * DOM, if available.
@@ -61464,11 +61473,9 @@ function isClearBtnFocused(ctx, clearBtn = getClearBtn(ctx)) {
61464
61473
  * @param {Object} menu - The menu component.
61465
61474
  */
61466
61475
  function reconcileMenuIndex(menu) {
61467
- // eslint-disable-next-line no-underscore-dangle
61468
61476
  if (menu._index < 0 && menu.optionActive && menu.items) {
61469
61477
  const idx = menu.items.indexOf(menu.optionActive);
61470
61478
  if (idx >= 0) {
61471
- // eslint-disable-next-line no-underscore-dangle
61472
61479
  menu._index = idx;
61473
61480
  }
61474
61481
  }
@@ -65468,7 +65475,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$2 {
65468
65475
  }
65469
65476
  };
65470
65477
 
65471
- var formkitVersion$2 = '202606171946';
65478
+ var formkitVersion$2 = '202606190840';
65472
65479
 
65473
65480
  let AuroElement$2$1 = class AuroElement extends i$2 {
65474
65481
  static get properties() {
@@ -77182,6 +77189,7 @@ class AuroInputUtilities {
77182
77189
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
77183
77190
 
77184
77191
  if (!(valueObject instanceof Date) || Number.isNaN(valueObject.getTime()) || !maskOptions || typeof maskOptions.format !== 'function') {
77192
+ console.debug('Invalid date object or mask options for formatting', { valueObject, maskOptions }); // eslint-disable-line no-console
77185
77193
  return undefined;
77186
77194
  }
77187
77195
 
@@ -77992,10 +78000,6 @@ class BaseInput extends AuroElement$1$1 {
77992
78000
  this.wrapperElement.addEventListener('click', this.handleClick);
77993
78001
  }
77994
78002
 
77995
- // add attribute for query selectors when auro-input is registered under a custom name
77996
- if (this.tagName.toLowerCase() !== 'auro-input' && !this.hasAttribute('auro-input')) {
77997
- this.setAttribute('auro-input', '');
77998
- }
77999
78003
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
78000
78004
 
78001
78005
  // use validity message override if declared when initializing the component
@@ -78166,14 +78170,14 @@ class BaseInput extends AuroElement$1$1 {
78166
78170
 
78167
78171
  if (formattedValue !== this.inputElement.value) {
78168
78172
  this.skipNextProgrammaticInputEvent = true;
78169
- if (this.maskInstance && this.type === 'credit-card') {
78173
+ if (this.maskInstance && this.type !== 'date') {
78170
78174
  // Route through the mask so its _value and el.value stay in lock-step
78171
78175
  // (set value calls updateControl which writes el.value = displayValue).
78172
78176
  // Writing el.value directly leaves the mask thinking displayValue is
78173
- // stale; _saveSelection on the next focus/click then warns. Scoped to
78174
- // credit-card so date's own formattedValue (raw ISO when calendar-invalid)
78175
- // isn't re-masked through the mm/dd/yyyy mask, which would truncate it
78176
- // and flip validity from patternMismatch to tooShort.
78177
+ // stale; _saveSelection on the next focus/click then warns. Date is
78178
+ // excluded because its formattedValue can be raw ISO when the calendar
78179
+ // is invalid, and re-masking through mm/dd/yyyy would truncate it and
78180
+ // flip validity from patternMismatch to tooShort.
78177
78181
  this.maskInstance.value = formattedValue || '';
78178
78182
  } else if (formattedValue) {
78179
78183
  this.inputElement.value = formattedValue;
@@ -78284,31 +78288,33 @@ class BaseInput extends AuroElement$1$1 {
78284
78288
  * @returns {void}
78285
78289
  */
78286
78290
  configureAutoFormatting() {
78287
- // Re-entrancy guard. The patched-setter's synthetic input event (suppressed
78288
- // by _configuringMask above) could otherwise trigger handleInput
78289
- // processCreditCard configureAutoFormatting before the outer call's
78290
- // set value has finished its alignCursor pass.
78291
+ // _configuringMask gates two things: external re-entry into this method
78292
+ // while setup is mid-flight (from property changes that call back here),
78293
+ // and the accept/complete listeners below — both need to ignore the mask
78294
+ // events fired by our own value-restore step.
78291
78295
  if (this._configuringMask) return;
78292
78296
  this._configuringMask = true;
78293
78297
  try {
78298
+ // Destroy any prior mask so IMask can attach fresh under the new format.
78294
78299
  if (this.maskInstance) {
78295
78300
  this.maskInstance.destroy();
78296
78301
  }
78297
78302
 
78298
- // Pass new format to util
78299
78303
  this.util.updateFormat(this.format);
78300
78304
 
78301
78305
  const maskOptions = this.util.getMaskOptions(this.type, this.format);
78302
78306
 
78303
78307
  if (this.inputElement && maskOptions.mask) {
78304
-
78305
- // Stash and clear any existing value before IMask init.
78306
- // IMask's constructor processes the current input value which requires
78307
- // selection state clearing first avoids that scenario entirely.
78308
- // When the format changes (e.g. locale switch) and we have a valid ISO
78309
- // model value, compute the display string for the NEW format instead of
78310
- // re-using the old display string, which may be invalid in the new mask.
78308
+ // Capture the current display so it can be re-applied after IMask
78309
+ // attaches. The restore at the bottom goes through maskInstance.value
78310
+ // (not inputElement.value directly) so the mask's internal state and
78311
+ // the input's displayed text stay in lock-step.
78311
78312
  let existingValue = this.inputElement.value;
78313
+
78314
+ // Format-change case (e.g. locale switch): existingValue is the OLD
78315
+ // mask's display string and may not parse under the new mask. When
78316
+ // we have a valid date model, rebuild the display from valueObject
78317
+ // (the canonical source) using the new mask's format function.
78312
78318
  if (
78313
78319
  this.util.isFullDateFormat(this.type, this.format) &&
78314
78320
  this.value &&
@@ -78320,15 +78326,18 @@ class BaseInput extends AuroElement$1$1 {
78320
78326
  existingValue = maskOptions.format(this.valueObject);
78321
78327
  }
78322
78328
 
78329
+ // Clear before IMask attaches so the constructor seeds an empty
78330
+ // internal value. Otherwise IMask reads the stale unmasked string
78331
+ // and emits a spurious 'accept' before the restore below runs.
78323
78332
  this.skipNextProgrammaticInputEvent = true;
78324
78333
  this.inputElement.value = '';
78325
78334
 
78326
78335
  this.maskInstance = IMask(this.inputElement, maskOptions);
78327
78336
 
78337
+ // Mask fires 'accept' on every value change, including the restore
78338
+ // step below. Skip events fired during configureAutoFormatting so
78339
+ // we don't overwrite a value the parent just pushed.
78328
78340
  this.maskInstance.on('accept', () => {
78329
- // Suppress propagation during configureAutoFormatting's own value-restoration
78330
- // (line below) — the mask emits 'accept' on every value-set, including ours,
78331
- // and we don't want to overwrite a value the parent just pushed.
78332
78341
  if (this._configuringMask) return;
78333
78342
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
78334
78343
  if (this.type === "date") {
@@ -78336,6 +78345,8 @@ class BaseInput extends AuroElement$1$1 {
78336
78345
  }
78337
78346
  });
78338
78347
 
78348
+ // Mask fires 'complete' on the restore step below for any value that
78349
+ // happens to be a complete match. Same setup-suppression as 'accept'.
78339
78350
  this.maskInstance.on('complete', () => {
78340
78351
  if (this._configuringMask) return;
78341
78352
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
@@ -78344,7 +78355,9 @@ class BaseInput extends AuroElement$1$1 {
78344
78355
  }
78345
78356
  });
78346
78357
 
78347
- // Restore the stashed value through IMask so it's properly masked
78358
+ // Write existingValue through the mask (not the input directly) so
78359
+ // the mask reformats it under the new rules and keeps its internal
78360
+ // _value aligned with the input's displayed text.
78348
78361
  if (existingValue) {
78349
78362
  this.maskInstance.value = existingValue;
78350
78363
  }
@@ -79050,7 +79063,7 @@ let AuroHelpText$1$1 = class AuroHelpText extends i$2 {
79050
79063
  }
79051
79064
  };
79052
79065
 
79053
- var formkitVersion$1$1 = '202606171946';
79066
+ var formkitVersion$1$1 = '202606190840';
79054
79067
 
79055
79068
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
79056
79069
  // See LICENSE in the project root for license information.
@@ -80171,7 +80184,7 @@ let AuroBibtemplate$1 = class AuroBibtemplate extends i$2 {
80171
80184
  }
80172
80185
  };
80173
80186
 
80174
- var formkitVersion$3 = '202606171946';
80187
+ var formkitVersion$3 = '202606190840';
80175
80188
 
80176
80189
  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}`;
80177
80190
 
@@ -81158,7 +81171,7 @@ class AuroCombobox extends AuroElement$3 {
81158
81171
  if (this.menu) {
81159
81172
  this.menu.matchWord = normalizeFilterValue(this.input.value);
81160
81173
  }
81161
- const label = getOptionLabel(this.menu.optionSelected) || this.menu.currentLabel;
81174
+ const label = getOptionLabel(this.menu.optionSelected);
81162
81175
  this.updateTriggerTextDisplay(label || this.value);
81163
81176
  }
81164
81177
 
@@ -81172,40 +81185,9 @@ class AuroCombobox extends AuroElement$3 {
81172
81185
  // in suggestion mode, do not override input value if no selection has been made and the input currently has focus
81173
81186
  const isInputFocusedWithNoSelection = !this.menu.value && (this.input.matches(':focus-within') || (this.inputInBib && this.inputInBib.matches(':focus-within')));
81174
81187
 
81175
- if (!this.persistInput && !(this.behavior === 'suggestion' && isInputFocusedWithNoSelection)) {
81176
- const nextValue = label || this.value;
81177
- // Only set the flag when there's an actual write to suppress —
81178
- // syncValuesAndStates re-enters here during typing when both inputs
81179
- // already match, and a no-op flag flip would make the bib branch's
81180
- // bail eat legitimate user-input events.
81181
- const triggerNeedsSync = this.input.value !== nextValue;
81182
- const bibNeedsSync = Boolean(this.inputInBib && this.inputInBib !== this.input && this.inputInBib.value !== nextValue);
81183
- if (triggerNeedsSync || bibNeedsSync) {
81184
- this._syncingDisplayValue = true;
81185
- if (triggerNeedsSync) {
81186
- this.input.value = nextValue;
81187
- }
81188
- if (bibNeedsSync) {
81189
- this.inputInBib.value = nextValue;
81190
- }
81191
- const pending = [];
81192
- if (triggerNeedsSync) {
81193
- pending.push(this.input.updateComplete);
81194
- }
81195
- if (bibNeedsSync) {
81196
- pending.push(this.inputInBib.updateComplete);
81197
- }
81198
- Promise.all(pending).then(() => {
81199
- // imask reasserts otherwise, and handleBlur reverts to its stale value.
81200
- if (triggerNeedsSync && this.input.maskInstance && typeof this.input.maskInstance.updateValue === 'function') {
81201
- this.input.maskInstance.updateValue();
81202
- }
81203
- if (bibNeedsSync && this.inputInBib && this.inputInBib.maskInstance && typeof this.inputInBib.maskInstance.updateValue === 'function') {
81204
- this.inputInBib.maskInstance.updateValue();
81205
- }
81206
- this._syncingDisplayValue = false;
81207
- });
81208
- }
81188
+ const suppressed = this.persistInput || (this.behavior === 'suggestion' && isInputFocusedWithNoSelection);
81189
+ if (!suppressed) {
81190
+ this.syncInputValuesAcrossTriggerAndBib(label || this.value);
81209
81191
  }
81210
81192
 
81211
81193
  // update the displayValue in the trigger if displayValue slot content is present
@@ -81233,6 +81215,52 @@ class AuroCombobox extends AuroElement$3 {
81233
81215
  this.requestUpdate();
81234
81216
  }
81235
81217
 
81218
+ /**
81219
+ * Writes nextValue to the trigger input and the bib input when their current
81220
+ * value differs, then re-asserts imask after Lit's update flushes.
81221
+ * @param {string} nextValue - The value to write to both inputs.
81222
+ * @returns {Promise<void> | null} Promise that resolves after the inputs flush,
81223
+ * or null when no sync was needed (so callers can skip post-flush work).
81224
+ * @private
81225
+ */
81226
+ syncInputValuesAcrossTriggerAndBib(nextValue) {
81227
+ // Only set the flag when there's an actual write to suppress —
81228
+ // syncValuesAndStates re-enters here during typing when both inputs
81229
+ // already match, and a no-op flag flip would make the bib branch's
81230
+ // bail eat legitimate user-input events.
81231
+ const triggerNeedsSync = this.input.value !== nextValue;
81232
+ const bibNeedsSync = Boolean(this.inputInBib && this.inputInBib !== this.input && this.inputInBib.value !== nextValue);
81233
+ if (!triggerNeedsSync && !bibNeedsSync) {
81234
+ return null;
81235
+ }
81236
+
81237
+ this._syncingDisplayValue = true;
81238
+ if (triggerNeedsSync) {
81239
+ this.input.value = nextValue;
81240
+ }
81241
+ if (bibNeedsSync) {
81242
+ this.inputInBib.value = nextValue;
81243
+ }
81244
+
81245
+ const pending = [];
81246
+ if (triggerNeedsSync) {
81247
+ pending.push(this.input.updateComplete);
81248
+ }
81249
+ if (bibNeedsSync) {
81250
+ pending.push(this.inputInBib.updateComplete);
81251
+ }
81252
+ return Promise.all(pending).then(() => {
81253
+ // imask reasserts otherwise, and handleBlur reverts to its stale value.
81254
+ if (triggerNeedsSync && this.input.maskInstance && typeof this.input.maskInstance.updateValue === 'function') {
81255
+ this.input.maskInstance.updateValue();
81256
+ }
81257
+ if (bibNeedsSync && this.inputInBib && this.inputInBib.maskInstance && typeof this.inputInBib.maskInstance.updateValue === 'function') {
81258
+ this.inputInBib.maskInstance.updateValue();
81259
+ }
81260
+ this._syncingDisplayValue = false;
81261
+ });
81262
+ }
81263
+
81236
81264
  /**
81237
81265
  * Processes hidden state of all menu options and determines if there are any available options not hidden.
81238
81266
  * @private
@@ -81260,9 +81288,9 @@ class AuroCombobox extends AuroElement$3 {
81260
81288
  this.syncValuesAndStates();
81261
81289
  }
81262
81290
 
81263
- // Re-activate when optionActive is no longer visible, or when _index has
81264
- // been reset (e.g. by clearSelection in an async update) so that
81265
- // makeSelection() can find the correct option.
81291
+ // Re-activate when optionActive is not in the current scrollable viewport,
81292
+ // or when _index has been reset (e.g. by clearSelection in an async update)
81293
+ // so that makeSelection() can find the correct option.
81266
81294
  if (!this.availableOptions.includes(this.menu.optionActive) || this.menu._index < 0) {
81267
81295
  this.activateFirstEnabledAvailableOption();
81268
81296
  }
@@ -81396,28 +81424,25 @@ class AuroCombobox extends AuroElement$3 {
81396
81424
 
81397
81425
  guardTouchPassthrough$1(this.menu);
81398
81426
 
81399
- // The dialog's showModal() steals focus from the trigger.
81400
- // A single rAF is enough for the dialog DOM to be painted and
81401
- // focusable, then doubleRaf finalizes the transition.
81427
+ // showModal() takes focus away from the trigger. Early focus once
81428
+ // the dialog has painted; the shared doubleRaf below is the fallback
81429
+ // for when the dialog needs an extra frame and also clears the
81430
+ // validation guard.
81402
81431
  requestAnimationFrame(() => {
81403
81432
  this.setInputFocus();
81404
81433
  });
81405
-
81406
- doubleRaf$1(() => {
81407
- this.setInputFocus();
81408
- this._inFullscreenTransition = false;
81409
- });
81410
- } else {
81411
- // Desktop popover-open: restore the trigger caret to end-of-text.
81412
- // Clicking the trigger lands on auro-input's floating <label for="…">
81413
- // overlay; Chrome resets the native input's selection to [0, 0] on
81414
- // label-focus before any JS runs. setInputFocus()'s non-fullscreen
81415
- // branch parks the caret at end. doubleRaf lets the dropdown layout
81416
- // settle first, matching the fullscreen branch timing.
81417
- doubleRaf$1(() => {
81418
- this.setInputFocus();
81419
- });
81420
81434
  }
81435
+ // else (desktop popover-open): Chrome resets the trigger caret to
81436
+ // [0, 0] when its floating <label for="…"> overlay receives focus.
81437
+ // The shared doubleRaf below parks the caret back at end-of-text
81438
+ // after the dropdown layout settles.
81439
+
81440
+ doubleRaf$1(() => {
81441
+ this.setInputFocus();
81442
+ if (this._inFullscreenTransition) {
81443
+ this._inFullscreenTransition = false;
81444
+ }
81445
+ });
81421
81446
  }
81422
81447
  });
81423
81448
 
@@ -81524,9 +81549,9 @@ class AuroCombobox extends AuroElement$3 {
81524
81549
  } else {
81525
81550
  // Safety net for the strategy-change setTimeout: a viewport-crossing
81526
81551
  // fullscreen→floating switch can close the dialog and leave focus on
81527
- // body. Every other Branch 2 callsite already has focus on the input
81528
- // via the focusin → this.focus() redirect (L1448-1452), so this is a
81529
- // no-op in the common case.
81552
+ // body. Every other call into this branch already has focus on the
81553
+ // input via the combobox-level focusin → this.focus() redirect, so
81554
+ // this is a no-op in the common case.
81530
81555
  if (!this.input.componentHasFocus) {
81531
81556
  this.input.focus();
81532
81557
  }
@@ -81645,7 +81670,7 @@ class AuroCombobox extends AuroElement$3 {
81645
81670
  if (this.menu.optionSelected) {
81646
81671
  const selected = this.menu.optionSelected;
81647
81672
 
81648
- if (!this.optionSelected || this.optionSelected !== selected) {
81673
+ if (this.optionSelected !== selected) {
81649
81674
  this.optionSelected = selected;
81650
81675
  }
81651
81676
 
@@ -81658,7 +81683,7 @@ class AuroCombobox extends AuroElement$3 {
81658
81683
  }
81659
81684
 
81660
81685
  // Update display
81661
- this.updateTriggerTextDisplay(getOptionLabel(this.optionSelected) || this.menu.value);
81686
+ this.updateTriggerTextDisplay(getOptionLabel(this.optionSelected));
81662
81687
 
81663
81688
  // Update match word for filtering
81664
81689
  const trimmedInput = normalizeFilterValue(this.input.value);
@@ -82040,15 +82065,7 @@ class AuroCombobox extends AuroElement$3 {
82040
82065
  this.menu.value = undefined;
82041
82066
  this.validation.reset(this);
82042
82067
  this.touched = false;
82043
- // Force validity back to the cleared state. validation.reset() calls
82044
- // validate() at the end, and (post-credit-card-fix) the trigger input's
82045
- // residual validity may still be copied into the combobox by the
82046
- // auroInputElements loop. Explicitly clear here so reset() actually
82047
- // leaves the component in a "no validity" state.
82048
82068
  this.validity = undefined;
82049
- this.errorMessage = '';
82050
- this.input.validity = undefined;
82051
- this.input.errorMessage = '';
82052
82069
  }
82053
82070
 
82054
82071
  /**
@@ -82101,52 +82118,23 @@ class AuroCombobox extends AuroElement$3 {
82101
82118
  this.input.value = this.value;
82102
82119
  }
82103
82120
 
82104
- // Sync menu.value only when an option actually matches; otherwise clear it.
82121
+ // Sync menu.value only when an option actually matches, or when filter
82122
+ // mode needs setMenuValue to dispatch auroMenu-selectValueFailure (the
82123
+ // listener at line 1206 clears combobox.value, mirroring select's
82124
+ // pattern). Otherwise sync the input display for freeform values.
82105
82125
  if (this.menu.options && this.menu.options.length > 0) {
82106
- if (this.menu.options.some((opt) => opt.value === this.value)) {
82107
- this.setMenuValue(this.value);
82108
- } else if (this.behavior === 'filter') {
82109
- // In filter mode, freeform values aren't allowed. Push the unmatched
82110
- // value through setMenuValue so menu dispatches auroMenu-selectValueFailure
82111
- // and the listener at line 1206 clears combobox.value (mirrors select's
82112
- // pattern). Bypassing setMenuValue here would skip the failure cascade.
82126
+ if (this.menu.options.some((opt) => opt.value === this.value) || this.behavior === 'filter') {
82113
82127
  this.setMenuValue(this.value);
82114
82128
  } else {
82115
82129
  if (this.menu.value) {
82116
82130
  this.menu.value = undefined;
82117
82131
  }
82118
- // Sync the display for programmatic freeform value changes (e.g. the
82119
- // swap-values pattern). Guard with _syncingDisplayValue so that the
82120
- // re-entrant input event from base-input.notifyValueChanged() is
82121
- // ignored by handleInputValueChange. Skip the sync when input already
82122
- // matches to avoid spurious events during the normal typing path.
82123
- const nextValue = this.value || '';
82124
- const triggerNeedsSync = this.input.value !== nextValue;
82125
- const bibNeedsSync = Boolean(this.inputInBib && this.inputInBib !== this.input && this.inputInBib.value !== nextValue);
82126
- if (triggerNeedsSync || bibNeedsSync) {
82127
- this._syncingDisplayValue = true;
82128
- if (triggerNeedsSync) {
82129
- this.input.value = nextValue;
82130
- }
82131
- if (bibNeedsSync) {
82132
- this.inputInBib.value = nextValue;
82133
- }
82134
- const pending = [];
82135
- if (triggerNeedsSync) {
82136
- pending.push(this.input.updateComplete);
82137
- }
82138
- if (bibNeedsSync) {
82139
- pending.push(this.inputInBib.updateComplete);
82140
- }
82141
- Promise.all(pending).then(() => {
82142
- if (triggerNeedsSync && this.input.maskInstance && typeof this.input.maskInstance.updateValue === 'function') {
82143
- this.input.maskInstance.updateValue();
82144
- }
82145
- if (bibNeedsSync && this.inputInBib && this.inputInBib.maskInstance && typeof this.inputInBib.maskInstance.updateValue === 'function') {
82146
- this.inputInBib.maskInstance.updateValue();
82147
- }
82148
- this._syncingDisplayValue = false;
82149
- // handleInputValueChange bailed on the flag — refresh the filter.
82132
+ // Suggestion-mode freeform value: sync the trigger + bib to show it,
82133
+ // then refresh the filter once the inputs flush (handleInputValueChange
82134
+ // bailed on _syncingDisplayValue).
82135
+ const syncPromise = this.syncInputValuesAcrossTriggerAndBib(this.value || '');
82136
+ if (syncPromise) {
82137
+ syncPromise.then(() => {
82150
82138
  this._programmaticFilterRefresh = true;
82151
82139
  this.handleMenuOptions();
82152
82140
  setTimeout(() => {
@@ -84935,6 +84923,21 @@ function getEnabledOptions(menu) {
84935
84923
  return (menu?.options || []).filter((option) => !option.disabled);
84936
84924
  }
84937
84925
 
84926
+ /**
84927
+ * Returns the active (selectable + visible) options for type-ahead navigation.
84928
+ *
84929
+ * Uses auro-menuoption's `isActive` getter, which excludes disabled, hidden,
84930
+ * and static options (e.g. `static nomatch` placeholders) so the type-ahead
84931
+ * cursor never lands on a non-actionable item. Same empty-safe handling as
84932
+ * `getEnabledOptions`.
84933
+ *
84934
+ * @param {HTMLElement | null | undefined} menu - The auro-menu element.
84935
+ * @returns {Array<HTMLElement>} Active options, empty array when none.
84936
+ */
84937
+ function getActiveOptions(menu) {
84938
+ return (menu?.options || []).filter((option) => option.isActive);
84939
+ }
84940
+
84938
84941
  /* eslint-disable new-cap */
84939
84942
 
84940
84943
  const selectKeyboardStrategy = {
@@ -84967,6 +84970,14 @@ const selectKeyboardStrategy = {
84967
84970
  },
84968
84971
 
84969
84972
  Escape(component, evt, ctx) {
84973
+ // Always clear the type-ahead buffer — Escape is a universal cancel.
84974
+ // Safe to call when the buffer is empty.
84975
+ // eslint-disable-next-line no-underscore-dangle
84976
+ if (typeof component._clearTypeaheadBuffer === 'function') {
84977
+ // eslint-disable-next-line no-underscore-dangle
84978
+ component._clearTypeaheadBuffer();
84979
+ }
84980
+
84970
84981
  if (!ctx.isExpanded) {
84971
84982
  return;
84972
84983
  }
@@ -85026,16 +85037,25 @@ const selectKeyboardStrategy = {
85026
85037
  },
85027
85038
 
85028
85039
  default(component, evt, ctx) {
85029
- component.updateActiveOptionBasedOnKey(evt.key);
85040
+ // Space resolves to either typeahead-buffer extension or bib toggle
85041
+ // depending on whether a type-ahead buffer is active. Mirrors native
85042
+ // <select> and the WAI-ARIA APG Listbox guidance: mid-typeahead space
85043
+ // is a search character (e.g. "San Francisco"); otherwise it toggles.
85030
85044
  if (evt.key === ' ') {
85031
85045
  evt.preventDefault();
85032
85046
  evt.stopPropagation();
85047
+ if (component.typeaheadBuffer && component.typeaheadBuffer.length > 0) {
85048
+ component.updateActiveOptionBasedOnKey(evt.key);
85049
+ return;
85050
+ }
85033
85051
  if (ctx.isExpanded) {
85034
85052
  component.dropdown.hide();
85035
- return;
85053
+ } else {
85054
+ component.dropdown.show();
85036
85055
  }
85037
- component.dropdown.show();
85056
+ return;
85038
85057
  }
85058
+ component.updateActiveOptionBasedOnKey(evt.key);
85039
85059
  },
85040
85060
  };
85041
85061
 
@@ -88947,7 +88967,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
88947
88967
  }
88948
88968
  };
88949
88969
 
88950
- var formkitVersion$1 = '202606171946';
88970
+ var formkitVersion$1 = '202606190840';
88951
88971
 
88952
88972
  class AuroElement extends i$2 {
88953
88973
  static get properties() {
@@ -90960,7 +90980,7 @@ class AuroHelpText extends i$2 {
90960
90980
  }
90961
90981
  }
90962
90982
 
90963
- var formkitVersion = '202606171946';
90983
+ var formkitVersion = '202606190840';
90964
90984
 
90965
90985
  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}`;
90966
90986
 
@@ -91065,6 +91085,16 @@ class AuroSelect extends AuroElement$1 {
91065
91085
  * @private
91066
91086
  */
91067
91087
  this.hasDisplayValueContent = false;
91088
+
91089
+ /**
91090
+ * @private
91091
+ */
91092
+ this.typeaheadBuffer = '';
91093
+
91094
+ /**
91095
+ * @private
91096
+ */
91097
+ this._typeaheadTimeout = null;
91068
91098
  }
91069
91099
 
91070
91100
  /**
@@ -91077,6 +91107,7 @@ class AuroSelect extends AuroElement$1 {
91077
91107
  this.fullscreenBreakpoint = 'sm';
91078
91108
  this.onDark = false;
91079
91109
  this.isPopoverVisible = false;
91110
+ this.typeaheadTimeoutMs = 500;
91080
91111
 
91081
91112
  // Layout Config
91082
91113
  this.layout = 'classic';
@@ -91380,6 +91411,16 @@ class AuroSelect extends AuroElement$1 {
91380
91411
  attribute: false
91381
91412
  },
91382
91413
 
91414
+ /**
91415
+ * Milliseconds of keyboard inactivity before the type-ahead buffer resets.
91416
+ * Increase for users who type slowly.
91417
+ * @default 500
91418
+ */
91419
+ typeaheadTimeoutMs: {
91420
+ type: Number,
91421
+ reflect: true
91422
+ },
91423
+
91383
91424
  /**
91384
91425
  * Specifies the `validityState` this element is in.
91385
91426
  */
@@ -91819,6 +91860,7 @@ class AuroSelect extends AuroElement$1 {
91819
91860
  this.addEventListener('blur', () => {
91820
91861
  this.validate();
91821
91862
  this.hasFocus = false;
91863
+ this._clearTypeaheadBuffer();
91822
91864
  });
91823
91865
  }
91824
91866
 
@@ -91832,41 +91874,89 @@ class AuroSelect extends AuroElement$1 {
91832
91874
  }
91833
91875
  }
91834
91876
 
91877
+ /**
91878
+ * Returns the lowercase, trimmed text content of a menu option.
91879
+ * @private
91880
+ * @param {HTMLElement} option - The menu option element.
91881
+ * @returns {string}
91882
+ */
91883
+ _getOptionDisplayText(option) {
91884
+ return (option.textContent || '').trim().toLowerCase();
91885
+ }
91886
+
91887
+ /**
91888
+ * Empties the type-ahead buffer and cancels any pending reset timeout.
91889
+ * Called when focus leaves the component, when Escape closes the bib, and on disconnect
91890
+ * so a stale buffer never bridges into a fresh interaction.
91891
+ * @private
91892
+ */
91893
+ _clearTypeaheadBuffer() {
91894
+ if (this._typeaheadTimeout) {
91895
+ clearTimeout(this._typeaheadTimeout);
91896
+ this._typeaheadTimeout = null;
91897
+ }
91898
+ this.typeaheadBuffer = '';
91899
+ }
91900
+
91835
91901
  /**
91836
91902
  * Updates the active option in the menu based on keyboard input.
91903
+ *
91904
+ * Implements the WAI-ARIA APG Listbox type-ahead pattern: accumulates printable
91905
+ * keystrokes into a buffer that resets after `typeaheadTimeoutMs` of inactivity.
91906
+ * A multi-character buffer matches the first option whose displayed text starts
91907
+ * with the buffer; repeating a single character cycles through options that start
91908
+ * with that character.
91837
91909
  * @private
91838
91910
  * @param {string} _key - The key pressed by the user.
91839
91911
  * @returns {void}
91840
91912
  */
91841
91913
  updateActiveOptionBasedOnKey(_key) {
91914
+ // Ignore non-printable keys (Shift, ArrowDown, Tab, etc.)
91915
+ if (typeof _key !== 'string' || _key.length !== 1) {
91916
+ return;
91917
+ }
91842
91918
 
91843
- // Get a lowercase version of the key pressed
91844
- const key = _key.toLowerCase();
91845
-
91846
- // Calculate how many times the same letter has been pressed
91847
- this.sameLetterTimes = key === this.lastLetter ? this.sameLetterTimes + 1 : 0;
91919
+ // No selectable options to match against clear any stale buffer/timer so
91920
+ // Space stays a bib toggle and the next keystroke after fresh options load
91921
+ // starts cleanly. `getActiveOptions` excludes disabled, hidden, and static
91922
+ // options (e.g. `static nomatch` placeholders). Checked BEFORE mutating
91923
+ // the buffer.
91924
+ const options = getActiveOptions(this.menu);
91925
+ if (!options.length) {
91926
+ this._clearTypeaheadBuffer();
91927
+ return;
91928
+ }
91848
91929
 
91849
- // Set last letter for tracking
91850
- this.lastLetter = key;
91930
+ const key = _key.toLowerCase();
91851
91931
 
91852
- // Get all the options that start with the last letter pressed
91853
- const letterOptions = this.menu.options.filter((option) => {
91854
- const optionText = option.value || '';
91855
- return optionText.toLowerCase().startsWith(this.lastLetter);
91856
- });
91932
+ // Reset the buffer after a period of inactivity
91933
+ if (this._typeaheadTimeout) {
91934
+ clearTimeout(this._typeaheadTimeout);
91935
+ }
91936
+ this._typeaheadTimeout = setTimeout(() => {
91937
+ this._clearTypeaheadBuffer();
91938
+ }, this.typeaheadTimeoutMs);
91857
91939
 
91858
- // If we have options that match the letter pressed
91859
- if (letterOptions.length) {
91940
+ this.typeaheadBuffer += key;
91860
91941
 
91861
- // Show the dropdown if it is not already visible
91862
- this.dropdown.show();
91942
+ const isRepeatedChar = this.typeaheadBuffer.length > 1 && new Set(this.typeaheadBuffer).size === 1;
91863
91943
 
91864
- // Get the index we're after based on how many times the letter has been pressed and the length of the letterOptions array
91865
- const index = this.sameLetterTimes < letterOptions.length ? this.sameLetterTimes : this.sameLetterTimes % letterOptions.length;
91944
+ let match = null;
91945
+ if (isRepeatedChar) {
91946
+ const matches = options.filter((option) => this._getOptionDisplayText(option).startsWith(key));
91947
+ if (matches.length) {
91948
+ const cycleIndex = (this.typeaheadBuffer.length - 1) % matches.length;
91949
+ match = matches[cycleIndex];
91950
+ }
91951
+ } else {
91952
+ match = options.find((option) => this._getOptionDisplayText(option).startsWith(this.typeaheadBuffer));
91953
+ }
91866
91954
 
91867
- // Select the new option in the menu
91868
- const newOption = letterOptions[index];
91869
- this.menu.updateActiveOption(newOption);
91955
+ if (match) {
91956
+ if (!this.dropdown.isPopoverVisible) {
91957
+ this.dropdown.show();
91958
+ }
91959
+ this.menu.updateActiveOption(match);
91870
91960
  }
91871
91961
  }
91872
91962
 
@@ -91980,6 +92070,11 @@ class AuroSelect extends AuroElement$1 {
91980
92070
  }
91981
92071
  }
91982
92072
 
92073
+ disconnectedCallback() {
92074
+ super.disconnectedCallback();
92075
+ this._clearTypeaheadBuffer();
92076
+ }
92077
+
91983
92078
  // lifecycle runs only after the element's DOM has been updated the first time
91984
92079
  firstUpdated() {
91985
92080
  // Add the tag name as an attribute if it is different than the component name