@aurodesignsystem-dev/auro-formkit 0.0.0-pr1532.0 → 0.0.0-pr1533.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 (54) 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 +118 -50
  7. package/components/combobox/demo/getting-started.min.js +118 -50
  8. package/components/combobox/demo/index.min.js +118 -50
  9. package/components/combobox/dist/auro-combobox.d.ts +10 -0
  10. package/components/combobox/dist/index.js +118 -50
  11. package/components/combobox/dist/registered.js +118 -50
  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/accessibility.md +17 -8
  17. package/components/datepicker/demo/api.md +1 -1
  18. package/components/datepicker/demo/customize.min.js +229 -72
  19. package/components/datepicker/demo/index.min.js +229 -72
  20. package/components/datepicker/demo/keyboard-behavior.md +3 -3
  21. package/components/datepicker/demo/voiceover.md +4 -4
  22. package/components/datepicker/demo/why-datepicker.md +2 -2
  23. package/components/datepicker/dist/auro-calendar-cell.d.ts +11 -0
  24. package/components/datepicker/dist/auro-calendar.d.ts +26 -2
  25. package/components/datepicker/dist/auro-datepicker.d.ts +9 -1
  26. package/components/datepicker/dist/index.js +229 -72
  27. package/components/datepicker/dist/registered.js +229 -72
  28. package/components/dropdown/demo/customize.min.js +1 -1
  29. package/components/dropdown/demo/getting-started.min.js +1 -1
  30. package/components/dropdown/demo/index.min.js +1 -1
  31. package/components/dropdown/dist/index.js +1 -1
  32. package/components/dropdown/dist/registered.js +1 -1
  33. package/components/form/demo/customize.min.js +408 -172
  34. package/components/form/demo/getting-started.min.js +408 -172
  35. package/components/form/demo/index.min.js +408 -172
  36. package/components/form/demo/registerDemoDeps.min.js +408 -172
  37. package/components/input/demo/customize.min.js +56 -45
  38. package/components/input/demo/getting-started.min.js +56 -45
  39. package/components/input/demo/index.min.js +56 -45
  40. package/components/input/dist/base-input.d.ts +20 -4
  41. package/components/input/dist/index.js +56 -45
  42. package/components/input/dist/registered.js +56 -45
  43. package/components/radio/demo/customize.min.js +1 -1
  44. package/components/radio/demo/getting-started.min.js +1 -1
  45. package/components/radio/demo/index.min.js +1 -1
  46. package/components/radio/dist/index.js +1 -1
  47. package/components/radio/dist/registered.js +1 -1
  48. package/components/select/demo/customize.min.js +2 -2
  49. package/components/select/demo/getting-started.min.js +2 -2
  50. package/components/select/demo/index.min.js +2 -2
  51. package/components/select/dist/index.js +2 -2
  52. package/components/select/dist/registered.js +2 -2
  53. package/custom-elements.json +1664 -1566
  54. package/package.json +1 -1
@@ -10728,14 +10728,16 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
10728
10728
  this.label = 'Input label is undefined';
10729
10729
  this.layout = 'classic';
10730
10730
  this.locale = 'en-US';
10731
+ this._format = undefined;
10732
+
10733
+ /** @private */
10734
+ this._userSetFormat = false;
10731
10735
  this.max = undefined;
10732
10736
  this.maxLength = undefined;
10733
10737
  this.min = undefined;
10734
10738
  this.minLength = undefined;
10735
10739
  this.noValidate = false;
10736
10740
  this.onDark = false;
10737
- // Raw values returned from the input mask before model normalization.
10738
- this._rawMaskValue = undefined;
10739
10741
  this.required = false;
10740
10742
  this.setCustomValidityForType = undefined;
10741
10743
  // Credit Card is intentionally excluded — its mask manages the cursor
@@ -10893,7 +10895,8 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
10893
10895
  */
10894
10896
  format: {
10895
10897
  type: String,
10896
- reflect: true
10898
+ reflect: true,
10899
+ noAccessor: true
10897
10900
  },
10898
10901
 
10899
10902
  /**
@@ -11231,6 +11234,34 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11231
11234
  return this.max && dateFormatter$3.isValidDate(this.max) ? dateFormatter$3.stringToDateInstance(this.max) : undefined;
11232
11235
  }
11233
11236
 
11237
+ get format() {
11238
+ return this._format;
11239
+ }
11240
+
11241
+ /**
11242
+ * Overrides LitElement's generated accessor so we can track whether the
11243
+ * consumer explicitly set `format`. Locale-derived updates use
11244
+ * `_setFormatFromLocale` instead, which skips this flag.
11245
+ */
11246
+ set format(value) {
11247
+ const oldValue = this._format;
11248
+ this._format = value ? value.toLowerCase() : value;
11249
+ this._userSetFormat = Boolean(value);
11250
+ this.requestUpdate('format', oldValue);
11251
+ }
11252
+
11253
+ /**
11254
+ * Sets format without marking it as user-set. Used by locale auto-derive
11255
+ * so that a subsequent locale change can still update the format.
11256
+ * @private
11257
+ * @param {string} value
11258
+ */
11259
+ _setFormatFromLocale(value) {
11260
+ const oldValue = this._format;
11261
+ this._format = value ? value.toLowerCase() : value;
11262
+ this.requestUpdate('format', oldValue);
11263
+ }
11264
+
11234
11265
  connectedCallback() {
11235
11266
  super.connectedCallback();
11236
11267
 
@@ -11278,15 +11309,6 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11278
11309
 
11279
11310
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
11280
11311
 
11281
- // Normalize the format token to lowercase so case-mixed values supplied
11282
- // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
11283
- // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
11284
- // format silently misses the map and leaves `setCustomValidityForType`
11285
- // unset.
11286
- if (this.format) {
11287
- this.format = this.format.toLowerCase();
11288
- }
11289
-
11290
11312
  // use validity message override if declared when initializing the component
11291
11313
  if (this.hasAttribute('setCustomValidity')) {
11292
11314
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -11393,12 +11415,10 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11393
11415
  updated(changedProperties) {
11394
11416
  super.updated(changedProperties);
11395
11417
 
11396
- // When locale changes without an explicit format override, derive format from the new locale.
11397
- // Only runs if the current format is still the previous locale's default (not user-overridden).
11418
+ // When locale changes, auto-derive format unless the consumer explicitly set one.
11398
11419
  if (changedProperties.has('locale') && !changedProperties.has('format') && this.type === 'date') {
11399
- const previousLocaleFormat = getDateFormatFromLocale$3(changedProperties.get('locale'));
11400
- if (!this.format || this.format.toLowerCase() === previousLocaleFormat) {
11401
- this.format = getDateFormatFromLocale$3(this.locale);
11420
+ if (!this._userSetFormat) {
11421
+ this._setFormatFromLocale(getDateFormatFromLocale$3(this.locale));
11402
11422
  }
11403
11423
  }
11404
11424
 
@@ -11569,9 +11589,6 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11569
11589
  this.maskInstance.on('accept', () => {
11570
11590
  if (this._configuringMask) return;
11571
11591
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
11572
- if (this.type === "date") {
11573
- this._rawMaskValue = this.maskInstance.value;
11574
- }
11575
11592
  });
11576
11593
 
11577
11594
  // Mask fires 'complete' on the restore step below for any value that
@@ -11579,9 +11596,6 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11579
11596
  this.maskInstance.on('complete', () => {
11580
11597
  if (this._configuringMask) return;
11581
11598
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
11582
- if (this.type === "date") {
11583
- this._rawMaskValue = this.maskInstance.value;
11584
- }
11585
11599
  });
11586
11600
 
11587
11601
  // Write existingValue through the mask (not the input directly) so
@@ -11602,14 +11616,17 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11602
11616
  * @returns {void}
11603
11617
  */
11604
11618
  notifyValueChanged() {
11605
- let inputEvent = null;
11606
-
11607
- inputEvent = new Event('input', {
11619
+ // This echoes Lit's reactive value update (and handleClickClear's
11620
+ // programmatic clear) — it is NOT a fresh user-input event. Mark it
11621
+ // `isProgrammatic` so consumers (e.g. auro-combobox) can distinguish
11622
+ // it from genuine user typing and skip clobbering their own
11623
+ // programmatic state during init-time renders.
11624
+ const inputEvent = new Event('input', {
11608
11625
  bubbles: true,
11609
11626
  composed: true,
11610
11627
  });
11628
+ inputEvent.isProgrammatic = true;
11611
11629
 
11612
- // Dispatched event to alert outside shadow DOM context of event firing.
11613
11630
  this.dispatchEvent(inputEvent);
11614
11631
  }
11615
11632
 
@@ -11818,8 +11835,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11818
11835
 
11819
11836
  // Set default date format if type=date and no format is defined
11820
11837
  if (this.type === "date" && !this.format) {
11821
- // Use locale to determine default date format
11822
- this.format = this.util.getDateMaskFromLocale().toLowerCase();
11838
+ this._setFormatFromLocale(this.util.getDateMaskFromLocale().toLowerCase());
11823
11839
  this.util.updateFormat(this.format);
11824
11840
  }
11825
11841
  }
@@ -11848,7 +11864,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11848
11864
  const creditCard = this.matchInputValueToCreditCard();
11849
11865
  const previousFormat = this.format;
11850
11866
 
11851
- this.format = creditCard.maskFormat;
11867
+ this._setFormatFromLocale(creditCard.maskFormat);
11852
11868
 
11853
11869
  this.maxLength = creditCard.formatLength;
11854
11870
  this.minLength = creditCard.formatMinLength;
@@ -12322,7 +12338,7 @@ let AuroHelpText$8 = class AuroHelpText extends i$2 {
12322
12338
  }
12323
12339
  };
12324
12340
 
12325
- var formkitVersion$8 = '202607022008';
12341
+ var formkitVersion$8 = '202607061903';
12326
12342
 
12327
12343
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
12328
12344
  // See LICENSE in the project root for license information.
@@ -12608,20 +12624,15 @@ let AuroInput$2 = class AuroInput extends BaseInput$2 {
12608
12624
  * @returns {void}
12609
12625
  */
12610
12626
  checkDisplayValueSlotChange() {
12611
- let nodes = this.shadowRoot.querySelector('slot[name="displayValue"]').assignedNodes();
12612
-
12613
- // Handle when DisplayValue is multi-level slot content (e.g. combobox passing displayValue to input)
12614
- if (nodes && nodes[0] && nodes[0].tagName === 'SLOT') {
12615
- nodes = nodes[0].assignedNodes();
12616
- }
12617
-
12618
- let hasContent = false;
12619
-
12620
- if (nodes.length > 0) {
12621
- hasContent = true;
12622
- }
12627
+ // flatten:true resolves through auro-combobox's forwarding slot
12628
+ // (<slot name="displayValue" slot="displayValue">) so a clone appended
12629
+ // directly to auro-input's light DOM alongside the forwarder still
12630
+ // counts as content. The prior nodes[0].tagName === 'SLOT' recursion
12631
+ // discarded any siblings past the forwarder.
12632
+ const slot = this.shadowRoot.querySelector('slot[name="displayValue"]');
12633
+ const nodes = slot.assignedNodes({ flatten: true });
12623
12634
 
12624
- this.hasDisplayValueContent = hasContent;
12635
+ this.hasDisplayValueContent = nodes.length > 0;
12625
12636
  }
12626
12637
 
12627
12638
  firstUpdated() {
@@ -24693,23 +24704,28 @@ var popoverVersion = '6.0.1';
24693
24704
  * @returns {number|null} Local-midnight Unix timestamp (seconds), or null.
24694
24705
  */
24695
24706
  function parseIsoToTimestamp(isoStr) {
24707
+ // Strict YYYY-MM-DD matcher with named groups. Rejects trailing garbage
24708
+ // ("2024x-01-01"), short segments ("2024-1-1"), and any non-digit
24709
+ // characters. `parseInt` alone accepted both because it stops at the
24710
+ // first non-digit and doesn't require a minimum length.
24711
+ const ISO_DATE_RE = /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/u;
24712
+ const MAX_MONTH = 12;
24713
+ const MAX_DAY = 31;
24714
+
24696
24715
  if (typeof isoStr !== 'string') {
24697
24716
  return null;
24698
24717
  }
24699
- const parts = isoStr.split('-');
24700
- if (parts.length !== 3) {
24701
- return null;
24702
- }
24703
- const year = parseInt(parts[0], 10);
24704
- const month = parseInt(parts[1], 10);
24705
- const day = parseInt(parts[2], 10);
24706
- if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) {
24718
+ const match = ISO_DATE_RE.exec(isoStr);
24719
+ if (!match) {
24707
24720
  return null;
24708
24721
  }
24722
+ const year = Number(match.groups.year);
24723
+ const month = Number(match.groups.month);
24724
+ const day = Number(match.groups.day);
24709
24725
  // Reject overflow values like "2024-13-40" — JS `new Date(year, month, day)`
24710
24726
  // silently normalizes those to a different calendar day, which would
24711
24727
  // disable the wrong date if we let the result through.
24712
- if (month < 1 || month > 12 || day < 1 || day > 31) {
24728
+ if (month < 1 || month > MAX_MONTH || day < 1 || day > MAX_DAY) {
24713
24729
  return null;
24714
24730
  }
24715
24731
  const date = new Date(year, month - 1, day);
@@ -25287,13 +25303,36 @@ class AuroCalendarCell extends i$2 {
25287
25303
  }
25288
25304
 
25289
25305
  firstUpdated() {
25306
+ this._initFromAncestors();
25307
+ }
25308
+
25309
+ /**
25310
+ * Wires the cell to its ancestor calendar-month and calendar (and, via
25311
+ * the calendar, to the datepicker). Extracted from firstUpdated() so the
25312
+ * retry loop can re-attempt without recursively invoking a Lit lifecycle
25313
+ * method (which is outside the framework's contract).
25314
+ * @private
25315
+ * @returns {void}
25316
+ */
25317
+ _initFromAncestors() {
25290
25318
  const calendarMonth = this.runtimeUtils.closestElement('auro-formkit-calendar-month', this);
25291
25319
  const calendar = this.runtimeUtils.closestElement('auro-formkit-calendar', calendarMonth);
25292
25320
 
25293
25321
  if (!calendar) {
25294
- setTimeout(() => this.firstUpdated(), 0);
25322
+ // Retry on the next event-loop turn to give the ancestor chain a chance
25323
+ // to attach — but cap attempts so a permanently detached cell doesn't
25324
+ // spin forever. 10 turns is far more than any observed race needs.
25325
+ this._firstUpdatedRetries = (this._firstUpdatedRetries || 0) + 1;
25326
+ if (this._firstUpdatedRetries > 10) {
25327
+ return;
25328
+ }
25329
+ this._firstUpdatedRetryTimer = setTimeout(() => {
25330
+ this._firstUpdatedRetryTimer = null;
25331
+ this._initFromAncestors();
25332
+ }, 0);
25295
25333
  return;
25296
25334
  }
25335
+ this._firstUpdatedRetries = 0;
25297
25336
  this.calendar = calendar;
25298
25337
  this.datepicker = calendar.datepicker;
25299
25338
  this._slotContentHandler = () => {
@@ -25321,6 +25360,10 @@ class AuroCalendarCell extends i$2 {
25321
25360
  if (this.datepicker && this._slotContentHandler) {
25322
25361
  this.datepicker.removeEventListener('auroDatePicker-newSlotContent', this._slotContentHandler);
25323
25362
  }
25363
+ if (this._firstUpdatedRetryTimer) {
25364
+ clearTimeout(this._firstUpdatedRetryTimer);
25365
+ this._firstUpdatedRetryTimer = null;
25366
+ }
25324
25367
  }
25325
25368
 
25326
25369
  /**
@@ -26692,7 +26735,7 @@ let AuroBibtemplate$3 = class AuroBibtemplate extends i$2 {
26692
26735
  }
26693
26736
  };
26694
26737
 
26695
- var formkitVersion$2$1 = '202607022008';
26738
+ var formkitVersion$2$1 = '202607061903';
26696
26739
 
26697
26740
  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}
26698
26741
  `,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}}
@@ -26831,7 +26874,10 @@ class AuroCalendar extends RangeDatepicker {
26831
26874
  * Support will be removed in a future major release.
26832
26875
  * @private
26833
26876
  */
26834
- this.disabledDays = [];
26877
+ // Initialize the backing field directly so the constructor's default
26878
+ // empty array doesn't trigger the deprecation warning. Assignments from
26879
+ // consumers still route through the setter below.
26880
+ this._disabledDays = [];
26835
26881
 
26836
26882
  /**
26837
26883
  * @private
@@ -26864,6 +26910,44 @@ class AuroCalendar extends RangeDatepicker {
26864
26910
  this._calendarInstanceId = Date.now().toString(36);
26865
26911
  }
26866
26912
 
26913
+ /**
26914
+ * @deprecated See constructor JSDoc — migrate to
26915
+ * `auro-datepicker.blackoutDates`. The getter/setter pair exists so the
26916
+ * one-time deprecation warning fires as soon as a consumer assigns a
26917
+ * non-empty array (empty assignments are ignored — an empty array is
26918
+ * indistinguishable from the constructor default and would produce a
26919
+ * spurious warning), rather than only when `_getBlackoutSet()` happens
26920
+ * to rebuild.
26921
+ * @returns {Array} The current legacy `disabledDays` array.
26922
+ */
26923
+ get disabledDays() {
26924
+ return this._disabledDays;
26925
+ }
26926
+
26927
+ /**
26928
+ * @param {Array} value - The legacy `disabledDays` array to set.
26929
+ */
26930
+ set disabledDays(value) {
26931
+ const oldValue = this._disabledDays;
26932
+ // Coerce non-arrays to `[]`. Consumers occasionally pass `null`
26933
+ // (Lit's Array attribute converter returns null for a missing/empty
26934
+ // attribute) or misuse the API; downstream code in
26935
+ // `auro-calendar-cell.isEnabled` calls `.findIndex()` on this value
26936
+ // without an Array.isArray guard, so a truthy non-array would throw
26937
+ // at render.
26938
+ const coerced = Array.isArray(value) ? value : [];
26939
+ if (coerced.length > 0) {
26940
+ this._warnDisabledDaysDeprecated();
26941
+ }
26942
+ this._disabledDays = coerced;
26943
+ // `disabledDays` is a Lit `@property({ type: Array })` on the
26944
+ // RangeDatepicker base class; Lit's generated setter (which we've
26945
+ // overridden here to insert the warning) is what normally invalidates
26946
+ // the reactive cycle. Re-invoke requestUpdate manually so consumer
26947
+ // assignments still re-render the calendar.
26948
+ this.requestUpdate('disabledDays', oldValue);
26949
+ }
26950
+
26867
26951
  static get styles() {
26868
26952
  return [
26869
26953
  styleCss$7$1,
@@ -27409,8 +27493,19 @@ class AuroCalendar extends RangeDatepicker {
27409
27493
  /**
27410
27494
  * Returns a memoized Set of blackout timestamps (seconds) drawn from both
27411
27495
  * the legacy `disabledDays` array and the datepicker's ISO `blackoutDates`.
27412
- * The cache invalidates when either source array's reference changes, which
27413
- * matches Lit's own reactive identity semantics for array properties.
27496
+ *
27497
+ * The cache invalidates on **reference identity** only when the
27498
+ * consumer reassigns the array (`el.blackoutDates = [...]`), matching
27499
+ * Lit's own reactivity semantics for array properties. In-place mutations
27500
+ * on the existing array (`push`, `splice`, index assignment) will NOT
27501
+ * invalidate the cache and the new entries will be silently ignored.
27502
+ * Consumers must reassign to update — see the JSDoc on
27503
+ * `auro-datepicker.blackoutDates` for the recommended pattern.
27504
+ *
27505
+ * A shallow-equality tier was considered but rejected: it would run
27506
+ * O(N) work on every cell render (this method is called per-cell via
27507
+ * `isBlackout()`) and still wouldn't catch same-length value swaps,
27508
+ * offering a false sense of safety.
27414
27509
  * @private
27415
27510
  * @returns {Set<Number>}
27416
27511
  */
@@ -27591,7 +27686,24 @@ class AuroCalendar extends RangeDatepicker {
27591
27686
  // rendered month(s) first so a single-month calendar does not pick a date
27592
27687
  // that has no DOM cell. Determine the visible range based on centralDate and
27593
27688
  // the number of rendered months.
27594
- const renderedMonths = Math.max(this.numCalendars, 1);
27689
+ //
27690
+ // numCalendars is assigned inside renderAllCalendars(), which runs during
27691
+ // render() — so by the time the visible-change handler in updated()
27692
+ // calls computeActiveDate() in the same cycle, numCalendars is normally
27693
+ // set. Guard against the pre-first-render path anyway (e.g. any future
27694
+ // caller that reaches computeActiveDate before render() has run):
27695
+ // Math.max(undefined, 1) is NaN, which would silently skip the
27696
+ // visible-month scan below. Fall back to maximumRenderableMonths'
27697
+ // desktop default (1 for non-range, 2 for range) so the scan window is
27698
+ // correctly sized whenever numCalendars is not yet populated.
27699
+ let renderedMonths = null;
27700
+
27701
+ if (Number.isFinite(this.numCalendars) && this.numCalendars > 0) {
27702
+ renderedMonths = this.numCalendars;
27703
+ } else {
27704
+ renderedMonths = this.noRange ? 1 : 2;
27705
+ }
27706
+
27595
27707
  const visibleAnchor = this.centralDateObject ?? new Date(now * 1000);
27596
27708
  const visMonthStart = new Date(visibleAnchor.getFullYear(), visibleAnchor.getMonth(), 1);
27597
27709
  visMonthStart.setHours(0, 0, 0, 0);
@@ -27861,6 +27973,8 @@ class AuroCalendar extends RangeDatepicker {
27861
27973
  let targetIndex = -1;
27862
27974
  if (direction === 'next') {
27863
27975
  targetIndex = currentIndex + 1;
27976
+ } else if (direction === 'prev') {
27977
+ targetIndex = currentIndex - 1;
27864
27978
  }
27865
27979
 
27866
27980
  if (targetIndex >= 0 && targetIndex < allCells.length) {
@@ -28465,6 +28579,10 @@ class AuroCalendar extends RangeDatepicker {
28465
28579
  * originally tried aria-live="polite" here, but VoiceOver treats
28466
28580
  * polite as "wait until idle" — which never happens during active
28467
28581
  * keyboard navigation — so the announcements were silently dropped.
28582
+ *
28583
+ * This is a documented deviation from WCAG 2.1 SC 4.1.3, which
28584
+ * prefers `polite` for status messages. See the "Documented
28585
+ * Deviation" section in components/datepicker/docs/pages/accessibility.md.
28468
28586
  * @private
28469
28587
  * @param {String} dateStr - The localized date string to announce.
28470
28588
  * @returns {void}
@@ -32510,7 +32628,7 @@ let AuroHelpText$2$1 = class AuroHelpText extends i$2 {
32510
32628
  }
32511
32629
  };
32512
32630
 
32513
- var formkitVersion$1$3 = '202607022008';
32631
+ var formkitVersion$1$3 = '202607061903';
32514
32632
 
32515
32633
  let AuroElement$2$2 = class AuroElement extends i$2 {
32516
32634
  static get properties() {
@@ -44518,14 +44636,16 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44518
44636
  this.label = 'Input label is undefined';
44519
44637
  this.layout = 'classic';
44520
44638
  this.locale = 'en-US';
44639
+ this._format = undefined;
44640
+
44641
+ /** @private */
44642
+ this._userSetFormat = false;
44521
44643
  this.max = undefined;
44522
44644
  this.maxLength = undefined;
44523
44645
  this.min = undefined;
44524
44646
  this.minLength = undefined;
44525
44647
  this.noValidate = false;
44526
44648
  this.onDark = false;
44527
- // Raw values returned from the input mask before model normalization.
44528
- this._rawMaskValue = undefined;
44529
44649
  this.required = false;
44530
44650
  this.setCustomValidityForType = undefined;
44531
44651
  // Credit Card is intentionally excluded — its mask manages the cursor
@@ -44683,7 +44803,8 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44683
44803
  */
44684
44804
  format: {
44685
44805
  type: String,
44686
- reflect: true
44806
+ reflect: true,
44807
+ noAccessor: true
44687
44808
  },
44688
44809
 
44689
44810
  /**
@@ -45021,6 +45142,34 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45021
45142
  return this.max && dateFormatter$2.isValidDate(this.max) ? dateFormatter$2.stringToDateInstance(this.max) : undefined;
45022
45143
  }
45023
45144
 
45145
+ get format() {
45146
+ return this._format;
45147
+ }
45148
+
45149
+ /**
45150
+ * Overrides LitElement's generated accessor so we can track whether the
45151
+ * consumer explicitly set `format`. Locale-derived updates use
45152
+ * `_setFormatFromLocale` instead, which skips this flag.
45153
+ */
45154
+ set format(value) {
45155
+ const oldValue = this._format;
45156
+ this._format = value ? value.toLowerCase() : value;
45157
+ this._userSetFormat = Boolean(value);
45158
+ this.requestUpdate('format', oldValue);
45159
+ }
45160
+
45161
+ /**
45162
+ * Sets format without marking it as user-set. Used by locale auto-derive
45163
+ * so that a subsequent locale change can still update the format.
45164
+ * @private
45165
+ * @param {string} value
45166
+ */
45167
+ _setFormatFromLocale(value) {
45168
+ const oldValue = this._format;
45169
+ this._format = value ? value.toLowerCase() : value;
45170
+ this.requestUpdate('format', oldValue);
45171
+ }
45172
+
45024
45173
  connectedCallback() {
45025
45174
  super.connectedCallback();
45026
45175
 
@@ -45068,15 +45217,6 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45068
45217
 
45069
45218
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
45070
45219
 
45071
- // Normalize the format token to lowercase so case-mixed values supplied
45072
- // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
45073
- // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
45074
- // format silently misses the map and leaves `setCustomValidityForType`
45075
- // unset.
45076
- if (this.format) {
45077
- this.format = this.format.toLowerCase();
45078
- }
45079
-
45080
45220
  // use validity message override if declared when initializing the component
45081
45221
  if (this.hasAttribute('setCustomValidity')) {
45082
45222
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -45183,12 +45323,10 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45183
45323
  updated(changedProperties) {
45184
45324
  super.updated(changedProperties);
45185
45325
 
45186
- // When locale changes without an explicit format override, derive format from the new locale.
45187
- // Only runs if the current format is still the previous locale's default (not user-overridden).
45326
+ // When locale changes, auto-derive format unless the consumer explicitly set one.
45188
45327
  if (changedProperties.has('locale') && !changedProperties.has('format') && this.type === 'date') {
45189
- const previousLocaleFormat = getDateFormatFromLocale$2(changedProperties.get('locale'));
45190
- if (!this.format || this.format.toLowerCase() === previousLocaleFormat) {
45191
- this.format = getDateFormatFromLocale$2(this.locale);
45328
+ if (!this._userSetFormat) {
45329
+ this._setFormatFromLocale(getDateFormatFromLocale$2(this.locale));
45192
45330
  }
45193
45331
  }
45194
45332
 
@@ -45359,9 +45497,6 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45359
45497
  this.maskInstance.on('accept', () => {
45360
45498
  if (this._configuringMask) return;
45361
45499
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
45362
- if (this.type === "date") {
45363
- this._rawMaskValue = this.maskInstance.value;
45364
- }
45365
45500
  });
45366
45501
 
45367
45502
  // Mask fires 'complete' on the restore step below for any value that
@@ -45369,9 +45504,6 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45369
45504
  this.maskInstance.on('complete', () => {
45370
45505
  if (this._configuringMask) return;
45371
45506
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
45372
- if (this.type === "date") {
45373
- this._rawMaskValue = this.maskInstance.value;
45374
- }
45375
45507
  });
45376
45508
 
45377
45509
  // Write existingValue through the mask (not the input directly) so
@@ -45392,14 +45524,17 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45392
45524
  * @returns {void}
45393
45525
  */
45394
45526
  notifyValueChanged() {
45395
- let inputEvent = null;
45396
-
45397
- inputEvent = new Event('input', {
45527
+ // This echoes Lit's reactive value update (and handleClickClear's
45528
+ // programmatic clear) — it is NOT a fresh user-input event. Mark it
45529
+ // `isProgrammatic` so consumers (e.g. auro-combobox) can distinguish
45530
+ // it from genuine user typing and skip clobbering their own
45531
+ // programmatic state during init-time renders.
45532
+ const inputEvent = new Event('input', {
45398
45533
  bubbles: true,
45399
45534
  composed: true,
45400
45535
  });
45536
+ inputEvent.isProgrammatic = true;
45401
45537
 
45402
- // Dispatched event to alert outside shadow DOM context of event firing.
45403
45538
  this.dispatchEvent(inputEvent);
45404
45539
  }
45405
45540
 
@@ -45608,8 +45743,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45608
45743
 
45609
45744
  // Set default date format if type=date and no format is defined
45610
45745
  if (this.type === "date" && !this.format) {
45611
- // Use locale to determine default date format
45612
- this.format = this.util.getDateMaskFromLocale().toLowerCase();
45746
+ this._setFormatFromLocale(this.util.getDateMaskFromLocale().toLowerCase());
45613
45747
  this.util.updateFormat(this.format);
45614
45748
  }
45615
45749
  }
@@ -45638,7 +45772,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45638
45772
  const creditCard = this.matchInputValueToCreditCard();
45639
45773
  const previousFormat = this.format;
45640
45774
 
45641
- this.format = creditCard.maskFormat;
45775
+ this._setFormatFromLocale(creditCard.maskFormat);
45642
45776
 
45643
45777
  this.maxLength = creditCard.formatLength;
45644
45778
  this.minLength = creditCard.formatMinLength;
@@ -46112,7 +46246,7 @@ let AuroHelpText$1$3 = class AuroHelpText extends i$2 {
46112
46246
  }
46113
46247
  };
46114
46248
 
46115
- var formkitVersion$7 = '202607022008';
46249
+ var formkitVersion$7 = '202607061903';
46116
46250
 
46117
46251
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
46118
46252
  // See LICENSE in the project root for license information.
@@ -46398,20 +46532,15 @@ let AuroInput$1 = class AuroInput extends BaseInput$1 {
46398
46532
  * @returns {void}
46399
46533
  */
46400
46534
  checkDisplayValueSlotChange() {
46401
- let nodes = this.shadowRoot.querySelector('slot[name="displayValue"]').assignedNodes();
46402
-
46403
- // Handle when DisplayValue is multi-level slot content (e.g. combobox passing displayValue to input)
46404
- if (nodes && nodes[0] && nodes[0].tagName === 'SLOT') {
46405
- nodes = nodes[0].assignedNodes();
46406
- }
46407
-
46408
- let hasContent = false;
46409
-
46410
- if (nodes.length > 0) {
46411
- hasContent = true;
46412
- }
46535
+ // flatten:true resolves through auro-combobox's forwarding slot
46536
+ // (<slot name="displayValue" slot="displayValue">) so a clone appended
46537
+ // directly to auro-input's light DOM alongside the forwarder still
46538
+ // counts as content. The prior nodes[0].tagName === 'SLOT' recursion
46539
+ // discarded any siblings past the forwarder.
46540
+ const slot = this.shadowRoot.querySelector('slot[name="displayValue"]');
46541
+ const nodes = slot.assignedNodes({ flatten: true });
46413
46542
 
46414
- this.hasDisplayValueContent = hasContent;
46543
+ this.hasDisplayValueContent = nodes.length > 0;
46415
46544
  }
46416
46545
 
46417
46546
  firstUpdated() {
@@ -47489,6 +47618,15 @@ const datepickerKeyboardStrategy = {
47489
47618
  evt.stopPropagation();
47490
47619
  evt.preventDefault();
47491
47620
 
47621
+ // Signal to the visibility-change handler in auro-datepicker.js that
47622
+ // focus should be restored to the trigger regardless of hasFocus.
47623
+ // hidePopover() (desktop non-modal path) does not auto-restore focus,
47624
+ // and hiding the grid's popover ancestor drops focus to <body>. That
47625
+ // synchronously fires focusout on the datepicker host — clearing
47626
+ // hasFocus — before updated() runs, which would otherwise skip the
47627
+ // input refocus. Native <dialog>.close() (modal path) restores focus
47628
+ // itself, but the flag is harmless there.
47629
+ component._restoreFocusOnClose = true;
47492
47630
  component.hideBib();
47493
47631
  },
47494
47632
 
@@ -47762,6 +47900,14 @@ class AuroDatePicker extends AuroElement$5 {
47762
47900
 
47763
47901
  /**
47764
47902
  * Array of dates that cannot be selected. Dates should be in ISO format (YYYY-MM-DD).
47903
+ *
47904
+ * **Immutable update required.** The datepicker treats this array as
47905
+ * immutable and memoizes a lookup Set keyed on the array's reference
47906
+ * identity — matching Lit's own reactivity semantics for array
47907
+ * properties. In-place mutations (`blackoutDates.push(...)`,
47908
+ * `blackoutDates[i] = ...`, `blackoutDates.splice(...)`) will not
47909
+ * invalidate the cache and the new entries will be silently ignored.
47910
+ * To update, reassign the property: `el.blackoutDates = [...el.blackoutDates, '2024-12-25']`.
47765
47911
  */
47766
47912
  blackoutDates: {
47767
47913
  type: Array,
@@ -48647,12 +48793,13 @@ class AuroDatePicker extends AuroElement$5 {
48647
48793
  this.calendar.activeCellDate = null;
48648
48794
 
48649
48795
  // Show the month containing the selected date (or today) instead of
48650
- // whichever month the user last navigated to.
48796
+ // whichever month the user last navigated to. Route through
48797
+ // updateCentralDate so centralDate stays first-of-month.
48651
48798
  // Respect consumer-provided centralDate/calendarStartDate if no value is set.
48652
48799
  if (this.valueObject) {
48653
- this.centralDate = this.value;
48800
+ this.calendarRenderUtil.updateCentralDate(this, this.value);
48654
48801
  } else if (!this.centralDate && !this.calendarStartDate && !this.minDate) {
48655
- this.centralDate = dateFormatter$1.toISOFormatString(new Date());
48802
+ this.calendarRenderUtil.updateCentralDate(this, new Date());
48656
48803
  }
48657
48804
  }
48658
48805
 
@@ -48710,8 +48857,15 @@ class AuroDatePicker extends AuroElement$5 {
48710
48857
  // Always clear the inert flag. Only restore focus to the input when the datepicker
48711
48858
  // still has focus (e.g. Escape, date selected) — not when the user tabbed away,
48712
48859
  // which would pull them back and require extra Tab presses to escape.
48860
+ //
48861
+ // `_restoreFocusOnClose` is set by the Escape handler in
48862
+ // datepickerKeyboardStrategy.js to force restore even when hasFocus
48863
+ // has already been cleared — hidePopover() (desktop non-modal path)
48864
+ // can drop focus to <body> before this update fires.
48713
48865
  this.dropdown.trigger.inert = false;
48714
- if (this.hasFocus) {
48866
+ const shouldRestoreFocus = this.hasFocus || this._restoreFocusOnClose;
48867
+ this._restoreFocusOnClose = false;
48868
+ if (shouldRestoreFocus) {
48715
48869
  requestAnimationFrame(() => {
48716
48870
  if (!this.dropdown.isPopoverVisible) {
48717
48871
  this.inputList[0].focus();
@@ -49157,6 +49311,18 @@ class AuroDatePicker extends AuroElement$5 {
49157
49311
  this.calendar.requestUpdate();
49158
49312
  this.dispatchEvent(new CustomEvent('auroDatePicker-newSlotContent'));
49159
49313
  }
49314
+
49315
+ // Range invariant: if a value change (from click or programmatic) has
49316
+ // moved start past end, clear valueEnd here so both properties land in
49317
+ // the SAME reactive cycle. Doing it in updated() would schedule a
49318
+ // second cycle after cellClickActive/wasCellClick has already been
49319
+ // consumed by the value branch, leaving the valueEnd branch to run
49320
+ // with a stale handshake and racing with any intervening programmatic
49321
+ // value assignments.
49322
+ if ((changedProperties.has('value') || changedProperties.has('valueEnd')) &&
49323
+ this.valueObject && this.valueEndObject && this.valueObject > this.valueEndObject) {
49324
+ this.valueEnd = undefined;
49325
+ }
49160
49326
  }
49161
49327
 
49162
49328
  updated(changedProperties) {
@@ -49224,8 +49390,12 @@ class AuroDatePicker extends AuroElement$5 {
49224
49390
 
49225
49391
  if (this.value && this.value.length === this.inputList[0].lengthForType && !(this.wasCellClick && this.range)) {
49226
49392
  // Skip centralDate update when user clicked a cell in range mode
49227
- // to prevent the displayed months from shifting
49228
- this.centralDate = this.value;
49393
+ // to prevent the displayed months from shifting. Route through
49394
+ // updateCentralDate so centralDate stays first-of-month — direct
49395
+ // assignment of the raw value briefly holds a mid-month string
49396
+ // and violates the invariant that observers (e.g. calendar sync)
49397
+ // rely on.
49398
+ this.calendarRenderUtil.updateCentralDate(this, this.value);
49229
49399
  }
49230
49400
 
49231
49401
  this.setHasValue();
@@ -49283,8 +49453,10 @@ class AuroDatePicker extends AuroElement$5 {
49283
49453
 
49284
49454
  if (this.valueEnd && this.valueEnd.length === this.inputList[1].lengthForType && !this.wasCellClick) {
49285
49455
  // Skip centralDate update when user clicked a cell in range mode
49286
- // to prevent the displayed months from shifting
49287
- this.centralDate = this.valueEnd;
49456
+ // to prevent the displayed months from shifting. Route through
49457
+ // updateCentralDate to preserve the first-of-month invariant
49458
+ // (see matching comment in the value branch above).
49459
+ this.calendarRenderUtil.updateCentralDate(this, this.valueEnd);
49288
49460
  }
49289
49461
 
49290
49462
  this.validate();
@@ -49308,10 +49480,6 @@ class AuroDatePicker extends AuroElement$5 {
49308
49480
  this.validation.validate(lastInput, true);
49309
49481
  }
49310
49482
 
49311
- if (this.valueObject && this.valueEndObject && this.valueObject > this.valueEndObject) {
49312
- this.valueEnd = undefined;
49313
- }
49314
-
49315
49483
  // This resets the datepicker when the minDate is set to a new value that is
49316
49484
  // a later date than the current value date
49317
49485
  if (changedProperties.has('minDate') && this.minDate) {
@@ -50994,7 +51162,7 @@ let AuroHelpText$1$2 = class AuroHelpText extends i$2 {
50994
51162
  }
50995
51163
  };
50996
51164
 
50997
- var formkitVersion$1$2 = '202607022008';
51165
+ var formkitVersion$1$2 = '202607061903';
50998
51166
 
50999
51167
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
51000
51168
  // See LICENSE in the project root for license information.
@@ -55322,7 +55490,7 @@ let AuroHelpText$6 = class AuroHelpText extends i$2 {
55322
55490
  }
55323
55491
  };
55324
55492
 
55325
- var formkitVersion$6 = '202607022008';
55493
+ var formkitVersion$6 = '202607061903';
55326
55494
 
55327
55495
  let AuroElement$1$2 = class AuroElement extends i$2 {
55328
55496
  static get properties() {
@@ -59302,7 +59470,7 @@ let AuroHelpText$5 = class AuroHelpText extends i$2 {
59302
59470
  }
59303
59471
  };
59304
59472
 
59305
- var formkitVersion$5 = '202607022008';
59473
+ var formkitVersion$5 = '202607061903';
59306
59474
 
59307
59475
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
59308
59476
  // See LICENSE in the project root for license information.
@@ -61067,7 +61235,7 @@ let AuroHelpText$4 = class AuroHelpText extends i$2 {
61067
61235
  }
61068
61236
  };
61069
61237
 
61070
- var formkitVersion$4 = '202607022008';
61238
+ var formkitVersion$4 = '202607061903';
61071
61239
 
61072
61240
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
61073
61241
  // See LICENSE in the project root for license information.
@@ -66288,7 +66456,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$2 {
66288
66456
  }
66289
66457
  };
66290
66458
 
66291
- var formkitVersion$2 = '202607022008';
66459
+ var formkitVersion$2 = '202607061903';
66292
66460
 
66293
66461
  let AuroElement$2$1 = class AuroElement extends i$2 {
66294
66462
  static get properties() {
@@ -78296,14 +78464,16 @@ class BaseInput extends AuroElement$1$1 {
78296
78464
  this.label = 'Input label is undefined';
78297
78465
  this.layout = 'classic';
78298
78466
  this.locale = 'en-US';
78467
+ this._format = undefined;
78468
+
78469
+ /** @private */
78470
+ this._userSetFormat = false;
78299
78471
  this.max = undefined;
78300
78472
  this.maxLength = undefined;
78301
78473
  this.min = undefined;
78302
78474
  this.minLength = undefined;
78303
78475
  this.noValidate = false;
78304
78476
  this.onDark = false;
78305
- // Raw values returned from the input mask before model normalization.
78306
- this._rawMaskValue = undefined;
78307
78477
  this.required = false;
78308
78478
  this.setCustomValidityForType = undefined;
78309
78479
  // Credit Card is intentionally excluded — its mask manages the cursor
@@ -78461,7 +78631,8 @@ class BaseInput extends AuroElement$1$1 {
78461
78631
  */
78462
78632
  format: {
78463
78633
  type: String,
78464
- reflect: true
78634
+ reflect: true,
78635
+ noAccessor: true
78465
78636
  },
78466
78637
 
78467
78638
  /**
@@ -78799,6 +78970,34 @@ class BaseInput extends AuroElement$1$1 {
78799
78970
  return this.max && dateFormatter.isValidDate(this.max) ? dateFormatter.stringToDateInstance(this.max) : undefined;
78800
78971
  }
78801
78972
 
78973
+ get format() {
78974
+ return this._format;
78975
+ }
78976
+
78977
+ /**
78978
+ * Overrides LitElement's generated accessor so we can track whether the
78979
+ * consumer explicitly set `format`. Locale-derived updates use
78980
+ * `_setFormatFromLocale` instead, which skips this flag.
78981
+ */
78982
+ set format(value) {
78983
+ const oldValue = this._format;
78984
+ this._format = value ? value.toLowerCase() : value;
78985
+ this._userSetFormat = Boolean(value);
78986
+ this.requestUpdate('format', oldValue);
78987
+ }
78988
+
78989
+ /**
78990
+ * Sets format without marking it as user-set. Used by locale auto-derive
78991
+ * so that a subsequent locale change can still update the format.
78992
+ * @private
78993
+ * @param {string} value
78994
+ */
78995
+ _setFormatFromLocale(value) {
78996
+ const oldValue = this._format;
78997
+ this._format = value ? value.toLowerCase() : value;
78998
+ this.requestUpdate('format', oldValue);
78999
+ }
79000
+
78802
79001
  connectedCallback() {
78803
79002
  super.connectedCallback();
78804
79003
 
@@ -78846,15 +79045,6 @@ class BaseInput extends AuroElement$1$1 {
78846
79045
 
78847
79046
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
78848
79047
 
78849
- // Normalize the format token to lowercase so case-mixed values supplied
78850
- // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
78851
- // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
78852
- // format silently misses the map and leaves `setCustomValidityForType`
78853
- // unset.
78854
- if (this.format) {
78855
- this.format = this.format.toLowerCase();
78856
- }
78857
-
78858
79048
  // use validity message override if declared when initializing the component
78859
79049
  if (this.hasAttribute('setCustomValidity')) {
78860
79050
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -78961,12 +79151,10 @@ class BaseInput extends AuroElement$1$1 {
78961
79151
  updated(changedProperties) {
78962
79152
  super.updated(changedProperties);
78963
79153
 
78964
- // When locale changes without an explicit format override, derive format from the new locale.
78965
- // Only runs if the current format is still the previous locale's default (not user-overridden).
79154
+ // When locale changes, auto-derive format unless the consumer explicitly set one.
78966
79155
  if (changedProperties.has('locale') && !changedProperties.has('format') && this.type === 'date') {
78967
- const previousLocaleFormat = getDateFormatFromLocale(changedProperties.get('locale'));
78968
- if (!this.format || this.format.toLowerCase() === previousLocaleFormat) {
78969
- this.format = getDateFormatFromLocale(this.locale);
79156
+ if (!this._userSetFormat) {
79157
+ this._setFormatFromLocale(getDateFormatFromLocale(this.locale));
78970
79158
  }
78971
79159
  }
78972
79160
 
@@ -79137,9 +79325,6 @@ class BaseInput extends AuroElement$1$1 {
79137
79325
  this.maskInstance.on('accept', () => {
79138
79326
  if (this._configuringMask) return;
79139
79327
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
79140
- if (this.type === "date") {
79141
- this._rawMaskValue = this.maskInstance.value;
79142
- }
79143
79328
  });
79144
79329
 
79145
79330
  // Mask fires 'complete' on the restore step below for any value that
@@ -79147,9 +79332,6 @@ class BaseInput extends AuroElement$1$1 {
79147
79332
  this.maskInstance.on('complete', () => {
79148
79333
  if (this._configuringMask) return;
79149
79334
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
79150
- if (this.type === "date") {
79151
- this._rawMaskValue = this.maskInstance.value;
79152
- }
79153
79335
  });
79154
79336
 
79155
79337
  // Write existingValue through the mask (not the input directly) so
@@ -79170,14 +79352,17 @@ class BaseInput extends AuroElement$1$1 {
79170
79352
  * @returns {void}
79171
79353
  */
79172
79354
  notifyValueChanged() {
79173
- let inputEvent = null;
79174
-
79175
- inputEvent = new Event('input', {
79355
+ // This echoes Lit's reactive value update (and handleClickClear's
79356
+ // programmatic clear) — it is NOT a fresh user-input event. Mark it
79357
+ // `isProgrammatic` so consumers (e.g. auro-combobox) can distinguish
79358
+ // it from genuine user typing and skip clobbering their own
79359
+ // programmatic state during init-time renders.
79360
+ const inputEvent = new Event('input', {
79176
79361
  bubbles: true,
79177
79362
  composed: true,
79178
79363
  });
79364
+ inputEvent.isProgrammatic = true;
79179
79365
 
79180
- // Dispatched event to alert outside shadow DOM context of event firing.
79181
79366
  this.dispatchEvent(inputEvent);
79182
79367
  }
79183
79368
 
@@ -79386,8 +79571,7 @@ class BaseInput extends AuroElement$1$1 {
79386
79571
 
79387
79572
  // Set default date format if type=date and no format is defined
79388
79573
  if (this.type === "date" && !this.format) {
79389
- // Use locale to determine default date format
79390
- this.format = this.util.getDateMaskFromLocale().toLowerCase();
79574
+ this._setFormatFromLocale(this.util.getDateMaskFromLocale().toLowerCase());
79391
79575
  this.util.updateFormat(this.format);
79392
79576
  }
79393
79577
  }
@@ -79416,7 +79600,7 @@ class BaseInput extends AuroElement$1$1 {
79416
79600
  const creditCard = this.matchInputValueToCreditCard();
79417
79601
  const previousFormat = this.format;
79418
79602
 
79419
- this.format = creditCard.maskFormat;
79603
+ this._setFormatFromLocale(creditCard.maskFormat);
79420
79604
 
79421
79605
  this.maxLength = creditCard.formatLength;
79422
79606
  this.minLength = creditCard.formatMinLength;
@@ -79890,7 +80074,7 @@ let AuroHelpText$1$1 = class AuroHelpText extends i$2 {
79890
80074
  }
79891
80075
  };
79892
80076
 
79893
- var formkitVersion$1$1 = '202607022008';
80077
+ var formkitVersion$1$1 = '202607061903';
79894
80078
 
79895
80079
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
79896
80080
  // See LICENSE in the project root for license information.
@@ -80176,20 +80360,15 @@ class AuroInput extends BaseInput {
80176
80360
  * @returns {void}
80177
80361
  */
80178
80362
  checkDisplayValueSlotChange() {
80179
- let nodes = this.shadowRoot.querySelector('slot[name="displayValue"]').assignedNodes();
80180
-
80181
- // Handle when DisplayValue is multi-level slot content (e.g. combobox passing displayValue to input)
80182
- if (nodes && nodes[0] && nodes[0].tagName === 'SLOT') {
80183
- nodes = nodes[0].assignedNodes();
80184
- }
80185
-
80186
- let hasContent = false;
80187
-
80188
- if (nodes.length > 0) {
80189
- hasContent = true;
80190
- }
80363
+ // flatten:true resolves through auro-combobox's forwarding slot
80364
+ // (<slot name="displayValue" slot="displayValue">) so a clone appended
80365
+ // directly to auro-input's light DOM alongside the forwarder still
80366
+ // counts as content. The prior nodes[0].tagName === 'SLOT' recursion
80367
+ // discarded any siblings past the forwarder.
80368
+ const slot = this.shadowRoot.querySelector('slot[name="displayValue"]');
80369
+ const nodes = slot.assignedNodes({ flatten: true });
80191
80370
 
80192
- this.hasDisplayValueContent = hasContent;
80371
+ this.hasDisplayValueContent = nodes.length > 0;
80193
80372
  }
80194
80373
 
80195
80374
  firstUpdated() {
@@ -81016,7 +81195,7 @@ let AuroBibtemplate$1 = class AuroBibtemplate extends i$2 {
81016
81195
  }
81017
81196
  };
81018
81197
 
81019
- var formkitVersion$3 = '202607022008';
81198
+ var formkitVersion$3 = '202607061903';
81020
81199
 
81021
81200
  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}`;
81022
81201
 
@@ -82115,9 +82294,19 @@ class AuroCombobox extends AuroElement$3 {
82115
82294
  /**
82116
82295
  * Processes hidden state of all menu options and determines if there are any available options not hidden.
82117
82296
  * @private
82297
+ * @param {object} [options={}] - Optional flag bag.
82298
+ * @param {boolean} [options.preferComboboxValue=false] - When true,
82299
+ * handleMenuOptions matches the selected option against `this.value`
82300
+ * first instead of `this.input.value`. Needed on mount and re-mount
82301
+ * because under `persistInput` the consumer's typedValue prop can drift
82302
+ * from the framework value (Svelte `{#key}` re-mount after a swap, or
82303
+ * SPA preselect after route change) and the old input-first match would
82304
+ * then pick the stale text. Only handleSlotChange passes this; typing
82305
+ * and clearing paths keep the input-first match so user clears aren't
82306
+ * undone.
82118
82307
  * @returns {void}
82119
82308
  */
82120
- handleMenuOptions() {
82309
+ handleMenuOptions({ preferComboboxValue = false } = {}) {
82121
82310
  this.generateOptionsArray();
82122
82311
  this.availableOptions = [];
82123
82312
  // Single source of truth for the menu's filter/highlight token per call.
@@ -82138,7 +82327,20 @@ class AuroCombobox extends AuroElement$3 {
82138
82327
  option.setAttribute('aria-posinset', index + 1);
82139
82328
  });
82140
82329
 
82141
- if (this.input.value && this.menu.options && this.menu.options.some((opt) => opt.value === this.input.value)) {
82330
+ // On mount/re-mount (via handleSlotChange), prefer the framework-set
82331
+ // `this.value` when it matches a menu option. Covers SPA preselect and
82332
+ // consumer swap patterns (e.g. Svelte `{#key}` re-mount) where
82333
+ // `this.value` is authoritative but `this.input.value` may be empty or
82334
+ // carry stale typed text from another field. Event-driven callers do
82335
+ // not pass the flag, otherwise user clears would be undone by
82336
+ // re-syncing to the previous combobox.value.
82337
+ if (preferComboboxValue &&
82338
+ this.value &&
82339
+ this.menu.options?.some((opt) => opt.value === this.value)) {
82340
+ this.setMenuValue(this.value);
82341
+ this.syncValuesAndStates();
82342
+ } else if (this.input.value &&
82343
+ this.menu.options?.some((opt) => opt.value === this.input.value)) {
82142
82344
  this.setMenuValue(this.input.value);
82143
82345
  this.syncValuesAndStates();
82144
82346
  }
@@ -82575,7 +82777,25 @@ class AuroCombobox extends AuroElement$3 {
82575
82777
  this.optionActive = evt.detail;
82576
82778
 
82577
82779
  if (this.input) {
82578
- this.input.setActiveDescendant(this.optionActive);
82780
+ // setActiveDescendant runs after Lit's update finishes because the
82781
+ // template's `.a11yActivedescendant` binding calls setAttribute on
82782
+ // the internal <input> in auro-input.updated(), which clears the
82783
+ // reflected ariaActiveDescendantElement property. Setting the ref
82784
+ // synchronously here would get overwritten by that attribute write.
82785
+ // Awaiting updateComplete lets the attribute write finish first,
82786
+ // then the ref sticks and screen readers can cross the shadow-DOM
82787
+ // boundary to the auro-menuoption in light DOM.
82788
+ //
82789
+ // The equality check covers the async gap: this.optionActive can
82790
+ // change before the callback runs (user arrowed elsewhere, or the
82791
+ // menu closed and cleared it to null), so we bail if the target
82792
+ // no longer matches to avoid reinstating a stale ref.
82793
+ const targetOption = this.optionActive;
82794
+ this.updateComplete.then(() => {
82795
+ if (this.input && this.optionActive === targetOption) {
82796
+ this.input.setActiveDescendant(targetOption);
82797
+ }
82798
+ });
82579
82799
  }
82580
82800
 
82581
82801
  // In fullscreen mode the menu sits inside a nested <dialog> shadow root,
@@ -82712,6 +82932,18 @@ class AuroCombobox extends AuroElement$3 {
82712
82932
  }
82713
82933
  }
82714
82934
 
82935
+ // SPA preselect guard: on init render, auro-input's notifyValueChanged
82936
+ // echoes an empty value through as an isProgrammatic input event before
82937
+ // the framework-set combobox.value has propagated down to the input.
82938
+ // Without this bail, the `this.value = this.input.value` below clobbers
82939
+ // the framework value with '' and clear() wipes optionSelected. Scoped
82940
+ // to the exact shape of that echo (isProgrammatic + non-empty combobox
82941
+ // value + empty input.value) so it doesn't affect the swap/typed paths
82942
+ // where value/input already track each other through the sync helpers.
82943
+ if (event && event.isProgrammatic && this.value && !this.input.value) {
82944
+ return;
82945
+ }
82946
+
82715
82947
  this.value = this.input.value;
82716
82948
 
82717
82949
  // Ignore re-entrant input events caused by programmatic value sets.
@@ -83144,7 +83376,11 @@ class AuroCombobox extends AuroElement$3 {
83144
83376
  }
83145
83377
  });
83146
83378
 
83147
- this.handleMenuOptions();
83379
+ // Slot change (mount/re-mount): pass `preferComboboxValue` so that a
83380
+ // framework-set `this.value` wins over any stale `input.value` when
83381
+ // matching against the newly-available options. Fixes the display
83382
+ // for SPA preselect and Svelte `{#key}` re-mount swap patterns.
83383
+ this.handleMenuOptions({ preferComboboxValue: true });
83148
83384
 
83149
83385
  break;
83150
83386
 
@@ -89860,7 +90096,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
89860
90096
  }
89861
90097
  };
89862
90098
 
89863
- var formkitVersion$1 = '202607022008';
90099
+ var formkitVersion$1 = '202607061903';
89864
90100
 
89865
90101
  class AuroElement extends i$2 {
89866
90102
  static get properties() {
@@ -91899,7 +92135,7 @@ class AuroHelpText extends i$2 {
91899
92135
  }
91900
92136
  }
91901
92137
 
91902
- var formkitVersion = '202607022008';
92138
+ var formkitVersion = '202607061903';
91903
92139
 
91904
92140
  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}`;
91905
92141