@aurodesignsystem-dev/auro-formkit 0.0.0-pr1532.1 → 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 +4349 -4251
  54. package/package.json +1 -1
@@ -11769,14 +11769,16 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11769
11769
  this.label = 'Input label is undefined';
11770
11770
  this.layout = 'classic';
11771
11771
  this.locale = 'en-US';
11772
+ this._format = undefined;
11773
+
11774
+ /** @private */
11775
+ this._userSetFormat = false;
11772
11776
  this.max = undefined;
11773
11777
  this.maxLength = undefined;
11774
11778
  this.min = undefined;
11775
11779
  this.minLength = undefined;
11776
11780
  this.noValidate = false;
11777
11781
  this.onDark = false;
11778
- // Raw values returned from the input mask before model normalization.
11779
- this._rawMaskValue = undefined;
11780
11782
  this.required = false;
11781
11783
  this.setCustomValidityForType = undefined;
11782
11784
  // Credit Card is intentionally excluded — its mask manages the cursor
@@ -11934,7 +11936,8 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11934
11936
  */
11935
11937
  format: {
11936
11938
  type: String,
11937
- reflect: true
11939
+ reflect: true,
11940
+ noAccessor: true
11938
11941
  },
11939
11942
 
11940
11943
  /**
@@ -12272,6 +12275,34 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12272
12275
  return this.max && dateFormatter$3.isValidDate(this.max) ? dateFormatter$3.stringToDateInstance(this.max) : undefined;
12273
12276
  }
12274
12277
 
12278
+ get format() {
12279
+ return this._format;
12280
+ }
12281
+
12282
+ /**
12283
+ * Overrides LitElement's generated accessor so we can track whether the
12284
+ * consumer explicitly set `format`. Locale-derived updates use
12285
+ * `_setFormatFromLocale` instead, which skips this flag.
12286
+ */
12287
+ set format(value) {
12288
+ const oldValue = this._format;
12289
+ this._format = value ? value.toLowerCase() : value;
12290
+ this._userSetFormat = Boolean(value);
12291
+ this.requestUpdate('format', oldValue);
12292
+ }
12293
+
12294
+ /**
12295
+ * Sets format without marking it as user-set. Used by locale auto-derive
12296
+ * so that a subsequent locale change can still update the format.
12297
+ * @private
12298
+ * @param {string} value
12299
+ */
12300
+ _setFormatFromLocale(value) {
12301
+ const oldValue = this._format;
12302
+ this._format = value ? value.toLowerCase() : value;
12303
+ this.requestUpdate('format', oldValue);
12304
+ }
12305
+
12275
12306
  connectedCallback() {
12276
12307
  super.connectedCallback();
12277
12308
 
@@ -12319,15 +12350,6 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12319
12350
 
12320
12351
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
12321
12352
 
12322
- // Normalize the format token to lowercase so case-mixed values supplied
12323
- // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
12324
- // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
12325
- // format silently misses the map and leaves `setCustomValidityForType`
12326
- // unset.
12327
- if (this.format) {
12328
- this.format = this.format.toLowerCase();
12329
- }
12330
-
12331
12353
  // use validity message override if declared when initializing the component
12332
12354
  if (this.hasAttribute('setCustomValidity')) {
12333
12355
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -12434,12 +12456,10 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12434
12456
  updated(changedProperties) {
12435
12457
  super.updated(changedProperties);
12436
12458
 
12437
- // When locale changes without an explicit format override, derive format from the new locale.
12438
- // Only runs if the current format is still the previous locale's default (not user-overridden).
12459
+ // When locale changes, auto-derive format unless the consumer explicitly set one.
12439
12460
  if (changedProperties.has('locale') && !changedProperties.has('format') && this.type === 'date') {
12440
- const previousLocaleFormat = getDateFormatFromLocale$3(changedProperties.get('locale'));
12441
- if (!this.format || this.format.toLowerCase() === previousLocaleFormat) {
12442
- this.format = getDateFormatFromLocale$3(this.locale);
12461
+ if (!this._userSetFormat) {
12462
+ this._setFormatFromLocale(getDateFormatFromLocale$3(this.locale));
12443
12463
  }
12444
12464
  }
12445
12465
 
@@ -12610,9 +12630,6 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12610
12630
  this.maskInstance.on('accept', () => {
12611
12631
  if (this._configuringMask) return;
12612
12632
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
12613
- if (this.type === "date") {
12614
- this._rawMaskValue = this.maskInstance.value;
12615
- }
12616
12633
  });
12617
12634
 
12618
12635
  // Mask fires 'complete' on the restore step below for any value that
@@ -12620,9 +12637,6 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12620
12637
  this.maskInstance.on('complete', () => {
12621
12638
  if (this._configuringMask) return;
12622
12639
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
12623
- if (this.type === "date") {
12624
- this._rawMaskValue = this.maskInstance.value;
12625
- }
12626
12640
  });
12627
12641
 
12628
12642
  // Write existingValue through the mask (not the input directly) so
@@ -12643,14 +12657,17 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12643
12657
  * @returns {void}
12644
12658
  */
12645
12659
  notifyValueChanged() {
12646
- let inputEvent = null;
12647
-
12648
- inputEvent = new Event('input', {
12660
+ // This echoes Lit's reactive value update (and handleClickClear's
12661
+ // programmatic clear) — it is NOT a fresh user-input event. Mark it
12662
+ // `isProgrammatic` so consumers (e.g. auro-combobox) can distinguish
12663
+ // it from genuine user typing and skip clobbering their own
12664
+ // programmatic state during init-time renders.
12665
+ const inputEvent = new Event('input', {
12649
12666
  bubbles: true,
12650
12667
  composed: true,
12651
12668
  });
12669
+ inputEvent.isProgrammatic = true;
12652
12670
 
12653
- // Dispatched event to alert outside shadow DOM context of event firing.
12654
12671
  this.dispatchEvent(inputEvent);
12655
12672
  }
12656
12673
 
@@ -12859,8 +12876,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12859
12876
 
12860
12877
  // Set default date format if type=date and no format is defined
12861
12878
  if (this.type === "date" && !this.format) {
12862
- // Use locale to determine default date format
12863
- this.format = this.util.getDateMaskFromLocale().toLowerCase();
12879
+ this._setFormatFromLocale(this.util.getDateMaskFromLocale().toLowerCase());
12864
12880
  this.util.updateFormat(this.format);
12865
12881
  }
12866
12882
  }
@@ -12889,7 +12905,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12889
12905
  const creditCard = this.matchInputValueToCreditCard();
12890
12906
  const previousFormat = this.format;
12891
12907
 
12892
- this.format = creditCard.maskFormat;
12908
+ this._setFormatFromLocale(creditCard.maskFormat);
12893
12909
 
12894
12910
  this.maxLength = creditCard.formatLength;
12895
12911
  this.minLength = creditCard.formatMinLength;
@@ -13363,7 +13379,7 @@ let AuroHelpText$8 = class AuroHelpText extends i$3 {
13363
13379
  }
13364
13380
  };
13365
13381
 
13366
- var formkitVersion$8 = '202607022050';
13382
+ var formkitVersion$8 = '202607061903';
13367
13383
 
13368
13384
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
13369
13385
  // See LICENSE in the project root for license information.
@@ -13649,20 +13665,15 @@ let AuroInput$2 = class AuroInput extends BaseInput$2 {
13649
13665
  * @returns {void}
13650
13666
  */
13651
13667
  checkDisplayValueSlotChange() {
13652
- let nodes = this.shadowRoot.querySelector('slot[name="displayValue"]').assignedNodes();
13653
-
13654
- // Handle when DisplayValue is multi-level slot content (e.g. combobox passing displayValue to input)
13655
- if (nodes && nodes[0] && nodes[0].tagName === 'SLOT') {
13656
- nodes = nodes[0].assignedNodes();
13657
- }
13658
-
13659
- let hasContent = false;
13660
-
13661
- if (nodes.length > 0) {
13662
- hasContent = true;
13663
- }
13668
+ // flatten:true resolves through auro-combobox's forwarding slot
13669
+ // (<slot name="displayValue" slot="displayValue">) so a clone appended
13670
+ // directly to auro-input's light DOM alongside the forwarder still
13671
+ // counts as content. The prior nodes[0].tagName === 'SLOT' recursion
13672
+ // discarded any siblings past the forwarder.
13673
+ const slot = this.shadowRoot.querySelector('slot[name="displayValue"]');
13674
+ const nodes = slot.assignedNodes({ flatten: true });
13664
13675
 
13665
- this.hasDisplayValueContent = hasContent;
13676
+ this.hasDisplayValueContent = nodes.length > 0;
13666
13677
  }
13667
13678
 
13668
13679
  firstUpdated() {
@@ -25734,23 +25745,28 @@ var popoverVersion = '6.0.1';
25734
25745
  * @returns {number|null} Local-midnight Unix timestamp (seconds), or null.
25735
25746
  */
25736
25747
  function parseIsoToTimestamp(isoStr) {
25748
+ // Strict YYYY-MM-DD matcher with named groups. Rejects trailing garbage
25749
+ // ("2024x-01-01"), short segments ("2024-1-1"), and any non-digit
25750
+ // characters. `parseInt` alone accepted both because it stops at the
25751
+ // first non-digit and doesn't require a minimum length.
25752
+ const ISO_DATE_RE = /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/u;
25753
+ const MAX_MONTH = 12;
25754
+ const MAX_DAY = 31;
25755
+
25737
25756
  if (typeof isoStr !== 'string') {
25738
25757
  return null;
25739
25758
  }
25740
- const parts = isoStr.split('-');
25741
- if (parts.length !== 3) {
25742
- return null;
25743
- }
25744
- const year = parseInt(parts[0], 10);
25745
- const month = parseInt(parts[1], 10);
25746
- const day = parseInt(parts[2], 10);
25747
- if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) {
25759
+ const match = ISO_DATE_RE.exec(isoStr);
25760
+ if (!match) {
25748
25761
  return null;
25749
25762
  }
25763
+ const year = Number(match.groups.year);
25764
+ const month = Number(match.groups.month);
25765
+ const day = Number(match.groups.day);
25750
25766
  // Reject overflow values like "2024-13-40" — JS `new Date(year, month, day)`
25751
25767
  // silently normalizes those to a different calendar day, which would
25752
25768
  // disable the wrong date if we let the result through.
25753
- if (month < 1 || month > 12 || day < 1 || day > 31) {
25769
+ if (month < 1 || month > MAX_MONTH || day < 1 || day > MAX_DAY) {
25754
25770
  return null;
25755
25771
  }
25756
25772
  const date = new Date(year, month - 1, day);
@@ -26328,13 +26344,36 @@ class AuroCalendarCell extends i$3 {
26328
26344
  }
26329
26345
 
26330
26346
  firstUpdated() {
26347
+ this._initFromAncestors();
26348
+ }
26349
+
26350
+ /**
26351
+ * Wires the cell to its ancestor calendar-month and calendar (and, via
26352
+ * the calendar, to the datepicker). Extracted from firstUpdated() so the
26353
+ * retry loop can re-attempt without recursively invoking a Lit lifecycle
26354
+ * method (which is outside the framework's contract).
26355
+ * @private
26356
+ * @returns {void}
26357
+ */
26358
+ _initFromAncestors() {
26331
26359
  const calendarMonth = this.runtimeUtils.closestElement('auro-formkit-calendar-month', this);
26332
26360
  const calendar = this.runtimeUtils.closestElement('auro-formkit-calendar', calendarMonth);
26333
26361
 
26334
26362
  if (!calendar) {
26335
- setTimeout(() => this.firstUpdated(), 0);
26363
+ // Retry on the next event-loop turn to give the ancestor chain a chance
26364
+ // to attach — but cap attempts so a permanently detached cell doesn't
26365
+ // spin forever. 10 turns is far more than any observed race needs.
26366
+ this._firstUpdatedRetries = (this._firstUpdatedRetries || 0) + 1;
26367
+ if (this._firstUpdatedRetries > 10) {
26368
+ return;
26369
+ }
26370
+ this._firstUpdatedRetryTimer = setTimeout(() => {
26371
+ this._firstUpdatedRetryTimer = null;
26372
+ this._initFromAncestors();
26373
+ }, 0);
26336
26374
  return;
26337
26375
  }
26376
+ this._firstUpdatedRetries = 0;
26338
26377
  this.calendar = calendar;
26339
26378
  this.datepicker = calendar.datepicker;
26340
26379
  this._slotContentHandler = () => {
@@ -26362,6 +26401,10 @@ class AuroCalendarCell extends i$3 {
26362
26401
  if (this.datepicker && this._slotContentHandler) {
26363
26402
  this.datepicker.removeEventListener('auroDatePicker-newSlotContent', this._slotContentHandler);
26364
26403
  }
26404
+ if (this._firstUpdatedRetryTimer) {
26405
+ clearTimeout(this._firstUpdatedRetryTimer);
26406
+ this._firstUpdatedRetryTimer = null;
26407
+ }
26365
26408
  }
26366
26409
 
26367
26410
  /**
@@ -27733,7 +27776,7 @@ let AuroBibtemplate$3 = class AuroBibtemplate extends i$3 {
27733
27776
  }
27734
27777
  };
27735
27778
 
27736
- var formkitVersion$2$1 = '202607022050';
27779
+ var formkitVersion$2$1 = '202607061903';
27737
27780
 
27738
27781
  let l$1$2 = class l{generateElementName(t,e){let o=t;return o+="-",o+=e.replace(/[.]/g,"_"),o}generateTag(o,s,a){const r=this.generateElementName(o,s),i=i$2`${s$3(r)}`;return customElements.get(r)||customElements.define(r,class extends a{}),i}};let d$1$2 = class d{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}getSlotText(t,e){const o=t.shadowRoot?.querySelector(`slot[name="${e}"]`),s=(o?.assignedNodes({flatten:true})||[]).map(t=>t.textContent?.trim()).join(" ").trim();return s||null}};let h$1$2 = class h{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}};var c$1$3=i$6`:host{color:var(--ds-auro-loader-color)}:host>span{background-color:var(--ds-auro-loader-background-color);border-color:var(--ds-auro-loader-border-color)}:host([onlight]),:host([appearance=brand]){--ds-auro-loader-color: var(--ds-basic-color-brand-primary, #01426a)}:host([ondark]),:host([appearance=inverse]){--ds-auro-loader-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host([orbit])>span{--ds-auro-loader-background-color: transparent}:host([orbit])>span:nth-child(1){--ds-auro-loader-border-color: currentcolor;opacity:.25}:host([orbit])>span:nth-child(2){--ds-auro-loader-border-color: currentcolor;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}
27739
27782
  `,u$4$2=i$6`.body-default{font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default,.body-lg{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-lg{font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-sm{font-size:var(--wcss-body-sm-font-size, .875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm,.body-xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-xs{font-size:var(--wcss-body-xs-font-size, .75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-2xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:var(--wcss-body-2xs-font-size, .625rem);font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0);line-height:var(--wcss-body-2xs-line-height, .875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));font-weight:var(--wcss-display-2xl-weight, 300);letter-spacing:var(--wcss-display-2xl-letter-spacing, 0);line-height:var(--wcss-display-2xl-line-height, 1.3)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));font-weight:var(--wcss-display-xl-weight, 300);letter-spacing:var(--wcss-display-xl-letter-spacing, 0);line-height:var(--wcss-display-xl-line-height, 1.3)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));font-weight:var(--wcss-display-lg-weight, 300);letter-spacing:var(--wcss-display-lg-letter-spacing, 0);line-height:var(--wcss-display-lg-line-height, 1.3)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));font-weight:var(--wcss-display-md-weight, 300);letter-spacing:var(--wcss-display-md-letter-spacing, 0);line-height:var(--wcss-display-md-line-height, 1.3)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));font-weight:var(--wcss-display-sm-weight, 300);letter-spacing:var(--wcss-display-sm-letter-spacing, 0);line-height:var(--wcss-display-sm-line-height, 1.3)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));font-weight:var(--wcss-display-xs-weight, 300);letter-spacing:var(--wcss-display-xs-letter-spacing, 0);line-height:var(--wcss-display-xs-line-height, 1.3)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));font-weight:var(--wcss-heading-xl-weight, 300);letter-spacing:var(--wcss-heading-xl-letter-spacing, 0);line-height:var(--wcss-heading-xl-line-height, 1.3)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));font-weight:var(--wcss-heading-lg-weight, 300);letter-spacing:var(--wcss-heading-lg-letter-spacing, 0);line-height:var(--wcss-heading-lg-line-height, 1.3)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));font-weight:var(--wcss-heading-md-weight, 300);letter-spacing:var(--wcss-heading-md-letter-spacing, 0);line-height:var(--wcss-heading-md-line-height, 1.3)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));font-weight:var(--wcss-heading-sm-weight, 300);letter-spacing:var(--wcss-heading-sm-letter-spacing, 0);line-height:var(--wcss-heading-sm-line-height, 1.3)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));font-weight:var(--wcss-heading-xs-weight, 450);letter-spacing:var(--wcss-heading-xs-letter-spacing, 0);line-height:var(--wcss-heading-xs-line-height, 1.3)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));font-weight:var(--wcss-heading-2xs-weight, 450);letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0);line-height:var(--wcss-heading-2xs-line-height, 1.3)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));font-weight:var(--wcss-accent-2xl-weight, 450);letter-spacing:var(--wcss-accent-2xl-letter-spacing, .05em);line-height:var(--wcss-accent-2xl-line-height, 1)}.accent-2xl,.accent-xl{text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));font-weight:var(--wcss-accent-xl-weight, 450);letter-spacing:var(--wcss-accent-xl-letter-spacing, .05em);line-height:var(--wcss-accent-xl-line-height, 1.3)}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));font-weight:var(--wcss-accent-lg-weight, 450);letter-spacing:var(--wcss-accent-lg-letter-spacing, .05em);line-height:var(--wcss-accent-lg-line-height, 1.3)}.accent-lg,.accent-md{text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));font-weight:var(--wcss-accent-md-weight, 500);letter-spacing:var(--wcss-accent-md-letter-spacing, .05em);line-height:var(--wcss-accent-md-line-height, 1.3)}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));font-weight:var(--wcss-accent-sm-weight, 500);letter-spacing:var(--wcss-accent-sm-letter-spacing, .05em);line-height:var(--wcss-accent-sm-line-height, 1.3)}.accent-sm,.accent-xs{text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));font-weight:var(--wcss-accent-xs-weight, 500);letter-spacing:var(--wcss-accent-xs-letter-spacing, .1em);line-height:var(--wcss-accent-xs-line-height, 1.3)}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xs-font-size, clamp(.875rem, 1.1666666667vw, .875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, .1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}:focus:not(:focus-visible){outline:3px solid transparent}:host,:host>span{position:relative}:host{width:2rem;height:2rem;display:inline-block;font-size:0}:host>span{position:absolute;display:inline-block;float:none;top:0;left:0;width:2rem;height:2rem;border-radius:100%;border-style:solid;border-width:0;box-sizing:border-box}:host([xs]),:host([xs])>span{width:1.2rem;height:1.2rem}:host([sm]),:host([sm])>span{width:3rem;height:3rem}:host([md]),:host([md])>span{width:5rem;height:5rem}:host([lg]),:host([lg])>span{width:8rem;height:8rem}:host{--margin: .375rem;--margin-xs: .2rem;--margin-sm: .5rem;--margin-md: .75rem;--margin-lg: 1rem}:host([pulse]),:host([pulse])>span{position:relative}:host([pulse]){width:calc(3rem + var(--margin) * 6);height:calc(1rem + var(--margin) * 2)}:host([pulse])>span{width:1rem;height:1rem;margin:var(--margin);animation:pulse 1.5s ease infinite}:host([pulse][xs]){width:calc(1.95rem + var(--margin-xs) * 6);height:calc(.65rem + var(--margin-xs) * 2)}:host([pulse][xs])>span{margin:var(--margin-xs);width:.65rem;height:.65rem}:host([pulse][sm]){width:calc(6rem + var(--margin-sm) * 6);height:calc(2rem + var(--margin-sm) * 2)}:host([pulse][sm])>span{margin:var(--margin-sm);width:2rem;height:2rem}:host([pulse][md]){width:calc(9rem + var(--margin-md) * 6);height:calc(3rem + var(--margin-md) * 2)}:host([pulse][md])>span{margin:var(--margin-md);width:3rem;height:3rem}:host([pulse][lg]){width:calc(15rem + var(--margin-lg) * 6);height:calc(5rem + var(--margin-lg) * 2)}:host([pulse][lg])>span{margin:var(--margin-lg);width:5rem;height:5rem}:host([pulse])>span:nth-child(1){animation-delay:-.4s}:host([pulse])>span:nth-child(2){animation-delay:-.2s}:host([pulse])>span:nth-child(3){animation-delay:0ms}@keyframes pulse{0%,to{opacity:.1;transform:scale(.9)}50%{opacity:1;transform:scale(1.1)}}:host([orbit]),:host([orbit])>span{opacity:1}:host([orbit])>span{border-width:5px}:host([orbit])>span:nth-child(2){animation:orbit 2s linear infinite}:host([orbit][sm])>span{border-width:8px}:host([orbit][md])>span{border-width:13px}:host([orbit][lg])>span{border-width:21px}@keyframes orbit{0%{transform:rotate(0)}to{transform:rotate(360deg)}}:host([ringworm])>svg{animation:rotate 2s linear infinite;height:100%;width:100%;stroke:currentcolor;stroke-width:8}:host([ringworm]) .path{stroke-dashoffset:0;animation:ringworm 1.5s ease-in-out infinite;stroke-linecap:round}@keyframes rotate{to{transform:rotate(360deg)}}@keyframes ringworm{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}:host([laser]){position:static;width:100%;display:block;height:0;overflow:hidden;font-size:unset}:host([laser])>span{position:fixed;width:100%;height:.25rem;border-radius:0;z-index:100}:host([laser])>span:nth-child(1){border-color:currentcolor;opacity:.25}:host([laser])>span:nth-child(2){border-color:currentcolor;animation:laser 2s linear infinite;opacity:1;width:50%}:host([laser][sm])>span:nth-child(2){width:20%}:host([laser][md])>span:nth-child(2){width:30%}:host([laser][lg])>span:nth-child(2){width:50%;animation-duration:1.5s}:host([laser][xl])>span:nth-child(2){width:80%;animation-duration:1.5s}@keyframes laser{0%{left:-100%}to{left:110%}}:host>.no-animation{display:none}@media (prefers-reduced-motion: reduce){:host{display:flex;align-items:center;justify-content:center}:host>span{opacity:1}:host>.loader{display:none}:host>svg{display:none}:host>.no-animation{display:block}}
@@ -27872,7 +27915,10 @@ class AuroCalendar extends RangeDatepicker {
27872
27915
  * Support will be removed in a future major release.
27873
27916
  * @private
27874
27917
  */
27875
- this.disabledDays = [];
27918
+ // Initialize the backing field directly so the constructor's default
27919
+ // empty array doesn't trigger the deprecation warning. Assignments from
27920
+ // consumers still route through the setter below.
27921
+ this._disabledDays = [];
27876
27922
 
27877
27923
  /**
27878
27924
  * @private
@@ -27905,6 +27951,44 @@ class AuroCalendar extends RangeDatepicker {
27905
27951
  this._calendarInstanceId = Date.now().toString(36);
27906
27952
  }
27907
27953
 
27954
+ /**
27955
+ * @deprecated See constructor JSDoc — migrate to
27956
+ * `auro-datepicker.blackoutDates`. The getter/setter pair exists so the
27957
+ * one-time deprecation warning fires as soon as a consumer assigns a
27958
+ * non-empty array (empty assignments are ignored — an empty array is
27959
+ * indistinguishable from the constructor default and would produce a
27960
+ * spurious warning), rather than only when `_getBlackoutSet()` happens
27961
+ * to rebuild.
27962
+ * @returns {Array} The current legacy `disabledDays` array.
27963
+ */
27964
+ get disabledDays() {
27965
+ return this._disabledDays;
27966
+ }
27967
+
27968
+ /**
27969
+ * @param {Array} value - The legacy `disabledDays` array to set.
27970
+ */
27971
+ set disabledDays(value) {
27972
+ const oldValue = this._disabledDays;
27973
+ // Coerce non-arrays to `[]`. Consumers occasionally pass `null`
27974
+ // (Lit's Array attribute converter returns null for a missing/empty
27975
+ // attribute) or misuse the API; downstream code in
27976
+ // `auro-calendar-cell.isEnabled` calls `.findIndex()` on this value
27977
+ // without an Array.isArray guard, so a truthy non-array would throw
27978
+ // at render.
27979
+ const coerced = Array.isArray(value) ? value : [];
27980
+ if (coerced.length > 0) {
27981
+ this._warnDisabledDaysDeprecated();
27982
+ }
27983
+ this._disabledDays = coerced;
27984
+ // `disabledDays` is a Lit `@property({ type: Array })` on the
27985
+ // RangeDatepicker base class; Lit's generated setter (which we've
27986
+ // overridden here to insert the warning) is what normally invalidates
27987
+ // the reactive cycle. Re-invoke requestUpdate manually so consumer
27988
+ // assignments still re-render the calendar.
27989
+ this.requestUpdate('disabledDays', oldValue);
27990
+ }
27991
+
27908
27992
  static get styles() {
27909
27993
  return [
27910
27994
  styleCss$7$1,
@@ -28450,8 +28534,19 @@ class AuroCalendar extends RangeDatepicker {
28450
28534
  /**
28451
28535
  * Returns a memoized Set of blackout timestamps (seconds) drawn from both
28452
28536
  * the legacy `disabledDays` array and the datepicker's ISO `blackoutDates`.
28453
- * The cache invalidates when either source array's reference changes, which
28454
- * matches Lit's own reactive identity semantics for array properties.
28537
+ *
28538
+ * The cache invalidates on **reference identity** only when the
28539
+ * consumer reassigns the array (`el.blackoutDates = [...]`), matching
28540
+ * Lit's own reactivity semantics for array properties. In-place mutations
28541
+ * on the existing array (`push`, `splice`, index assignment) will NOT
28542
+ * invalidate the cache and the new entries will be silently ignored.
28543
+ * Consumers must reassign to update — see the JSDoc on
28544
+ * `auro-datepicker.blackoutDates` for the recommended pattern.
28545
+ *
28546
+ * A shallow-equality tier was considered but rejected: it would run
28547
+ * O(N) work on every cell render (this method is called per-cell via
28548
+ * `isBlackout()`) and still wouldn't catch same-length value swaps,
28549
+ * offering a false sense of safety.
28455
28550
  * @private
28456
28551
  * @returns {Set<Number>}
28457
28552
  */
@@ -28632,7 +28727,24 @@ class AuroCalendar extends RangeDatepicker {
28632
28727
  // rendered month(s) first so a single-month calendar does not pick a date
28633
28728
  // that has no DOM cell. Determine the visible range based on centralDate and
28634
28729
  // the number of rendered months.
28635
- const renderedMonths = Math.max(this.numCalendars, 1);
28730
+ //
28731
+ // numCalendars is assigned inside renderAllCalendars(), which runs during
28732
+ // render() — so by the time the visible-change handler in updated()
28733
+ // calls computeActiveDate() in the same cycle, numCalendars is normally
28734
+ // set. Guard against the pre-first-render path anyway (e.g. any future
28735
+ // caller that reaches computeActiveDate before render() has run):
28736
+ // Math.max(undefined, 1) is NaN, which would silently skip the
28737
+ // visible-month scan below. Fall back to maximumRenderableMonths'
28738
+ // desktop default (1 for non-range, 2 for range) so the scan window is
28739
+ // correctly sized whenever numCalendars is not yet populated.
28740
+ let renderedMonths = null;
28741
+
28742
+ if (Number.isFinite(this.numCalendars) && this.numCalendars > 0) {
28743
+ renderedMonths = this.numCalendars;
28744
+ } else {
28745
+ renderedMonths = this.noRange ? 1 : 2;
28746
+ }
28747
+
28636
28748
  const visibleAnchor = this.centralDateObject ?? new Date(now * 1000);
28637
28749
  const visMonthStart = new Date(visibleAnchor.getFullYear(), visibleAnchor.getMonth(), 1);
28638
28750
  visMonthStart.setHours(0, 0, 0, 0);
@@ -28902,6 +29014,8 @@ class AuroCalendar extends RangeDatepicker {
28902
29014
  let targetIndex = -1;
28903
29015
  if (direction === 'next') {
28904
29016
  targetIndex = currentIndex + 1;
29017
+ } else if (direction === 'prev') {
29018
+ targetIndex = currentIndex - 1;
28905
29019
  }
28906
29020
 
28907
29021
  if (targetIndex >= 0 && targetIndex < allCells.length) {
@@ -29506,6 +29620,10 @@ class AuroCalendar extends RangeDatepicker {
29506
29620
  * originally tried aria-live="polite" here, but VoiceOver treats
29507
29621
  * polite as "wait until idle" — which never happens during active
29508
29622
  * keyboard navigation — so the announcements were silently dropped.
29623
+ *
29624
+ * This is a documented deviation from WCAG 2.1 SC 4.1.3, which
29625
+ * prefers `polite` for status messages. See the "Documented
29626
+ * Deviation" section in components/datepicker/docs/pages/accessibility.md.
29509
29627
  * @private
29510
29628
  * @param {String} dateStr - The localized date string to announce.
29511
29629
  * @returns {void}
@@ -33551,7 +33669,7 @@ let AuroHelpText$2$1 = class AuroHelpText extends i$3 {
33551
33669
  }
33552
33670
  };
33553
33671
 
33554
- var formkitVersion$1$3 = '202607022050';
33672
+ var formkitVersion$1$3 = '202607061903';
33555
33673
 
33556
33674
  let AuroElement$2$2 = class AuroElement extends i$3 {
33557
33675
  static get properties() {
@@ -45559,14 +45677,16 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45559
45677
  this.label = 'Input label is undefined';
45560
45678
  this.layout = 'classic';
45561
45679
  this.locale = 'en-US';
45680
+ this._format = undefined;
45681
+
45682
+ /** @private */
45683
+ this._userSetFormat = false;
45562
45684
  this.max = undefined;
45563
45685
  this.maxLength = undefined;
45564
45686
  this.min = undefined;
45565
45687
  this.minLength = undefined;
45566
45688
  this.noValidate = false;
45567
45689
  this.onDark = false;
45568
- // Raw values returned from the input mask before model normalization.
45569
- this._rawMaskValue = undefined;
45570
45690
  this.required = false;
45571
45691
  this.setCustomValidityForType = undefined;
45572
45692
  // Credit Card is intentionally excluded — its mask manages the cursor
@@ -45724,7 +45844,8 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45724
45844
  */
45725
45845
  format: {
45726
45846
  type: String,
45727
- reflect: true
45847
+ reflect: true,
45848
+ noAccessor: true
45728
45849
  },
45729
45850
 
45730
45851
  /**
@@ -46062,6 +46183,34 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
46062
46183
  return this.max && dateFormatter$2.isValidDate(this.max) ? dateFormatter$2.stringToDateInstance(this.max) : undefined;
46063
46184
  }
46064
46185
 
46186
+ get format() {
46187
+ return this._format;
46188
+ }
46189
+
46190
+ /**
46191
+ * Overrides LitElement's generated accessor so we can track whether the
46192
+ * consumer explicitly set `format`. Locale-derived updates use
46193
+ * `_setFormatFromLocale` instead, which skips this flag.
46194
+ */
46195
+ set format(value) {
46196
+ const oldValue = this._format;
46197
+ this._format = value ? value.toLowerCase() : value;
46198
+ this._userSetFormat = Boolean(value);
46199
+ this.requestUpdate('format', oldValue);
46200
+ }
46201
+
46202
+ /**
46203
+ * Sets format without marking it as user-set. Used by locale auto-derive
46204
+ * so that a subsequent locale change can still update the format.
46205
+ * @private
46206
+ * @param {string} value
46207
+ */
46208
+ _setFormatFromLocale(value) {
46209
+ const oldValue = this._format;
46210
+ this._format = value ? value.toLowerCase() : value;
46211
+ this.requestUpdate('format', oldValue);
46212
+ }
46213
+
46065
46214
  connectedCallback() {
46066
46215
  super.connectedCallback();
46067
46216
 
@@ -46109,15 +46258,6 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
46109
46258
 
46110
46259
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
46111
46260
 
46112
- // Normalize the format token to lowercase so case-mixed values supplied
46113
- // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
46114
- // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
46115
- // format silently misses the map and leaves `setCustomValidityForType`
46116
- // unset.
46117
- if (this.format) {
46118
- this.format = this.format.toLowerCase();
46119
- }
46120
-
46121
46261
  // use validity message override if declared when initializing the component
46122
46262
  if (this.hasAttribute('setCustomValidity')) {
46123
46263
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -46224,12 +46364,10 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
46224
46364
  updated(changedProperties) {
46225
46365
  super.updated(changedProperties);
46226
46366
 
46227
- // When locale changes without an explicit format override, derive format from the new locale.
46228
- // Only runs if the current format is still the previous locale's default (not user-overridden).
46367
+ // When locale changes, auto-derive format unless the consumer explicitly set one.
46229
46368
  if (changedProperties.has('locale') && !changedProperties.has('format') && this.type === 'date') {
46230
- const previousLocaleFormat = getDateFormatFromLocale$2(changedProperties.get('locale'));
46231
- if (!this.format || this.format.toLowerCase() === previousLocaleFormat) {
46232
- this.format = getDateFormatFromLocale$2(this.locale);
46369
+ if (!this._userSetFormat) {
46370
+ this._setFormatFromLocale(getDateFormatFromLocale$2(this.locale));
46233
46371
  }
46234
46372
  }
46235
46373
 
@@ -46400,9 +46538,6 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
46400
46538
  this.maskInstance.on('accept', () => {
46401
46539
  if (this._configuringMask) return;
46402
46540
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
46403
- if (this.type === "date") {
46404
- this._rawMaskValue = this.maskInstance.value;
46405
- }
46406
46541
  });
46407
46542
 
46408
46543
  // Mask fires 'complete' on the restore step below for any value that
@@ -46410,9 +46545,6 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
46410
46545
  this.maskInstance.on('complete', () => {
46411
46546
  if (this._configuringMask) return;
46412
46547
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
46413
- if (this.type === "date") {
46414
- this._rawMaskValue = this.maskInstance.value;
46415
- }
46416
46548
  });
46417
46549
 
46418
46550
  // Write existingValue through the mask (not the input directly) so
@@ -46433,14 +46565,17 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
46433
46565
  * @returns {void}
46434
46566
  */
46435
46567
  notifyValueChanged() {
46436
- let inputEvent = null;
46437
-
46438
- inputEvent = new Event('input', {
46568
+ // This echoes Lit's reactive value update (and handleClickClear's
46569
+ // programmatic clear) — it is NOT a fresh user-input event. Mark it
46570
+ // `isProgrammatic` so consumers (e.g. auro-combobox) can distinguish
46571
+ // it from genuine user typing and skip clobbering their own
46572
+ // programmatic state during init-time renders.
46573
+ const inputEvent = new Event('input', {
46439
46574
  bubbles: true,
46440
46575
  composed: true,
46441
46576
  });
46577
+ inputEvent.isProgrammatic = true;
46442
46578
 
46443
- // Dispatched event to alert outside shadow DOM context of event firing.
46444
46579
  this.dispatchEvent(inputEvent);
46445
46580
  }
46446
46581
 
@@ -46649,8 +46784,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
46649
46784
 
46650
46785
  // Set default date format if type=date and no format is defined
46651
46786
  if (this.type === "date" && !this.format) {
46652
- // Use locale to determine default date format
46653
- this.format = this.util.getDateMaskFromLocale().toLowerCase();
46787
+ this._setFormatFromLocale(this.util.getDateMaskFromLocale().toLowerCase());
46654
46788
  this.util.updateFormat(this.format);
46655
46789
  }
46656
46790
  }
@@ -46679,7 +46813,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
46679
46813
  const creditCard = this.matchInputValueToCreditCard();
46680
46814
  const previousFormat = this.format;
46681
46815
 
46682
- this.format = creditCard.maskFormat;
46816
+ this._setFormatFromLocale(creditCard.maskFormat);
46683
46817
 
46684
46818
  this.maxLength = creditCard.formatLength;
46685
46819
  this.minLength = creditCard.formatMinLength;
@@ -47153,7 +47287,7 @@ let AuroHelpText$1$3 = class AuroHelpText extends i$3 {
47153
47287
  }
47154
47288
  };
47155
47289
 
47156
- var formkitVersion$7 = '202607022050';
47290
+ var formkitVersion$7 = '202607061903';
47157
47291
 
47158
47292
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
47159
47293
  // See LICENSE in the project root for license information.
@@ -47439,20 +47573,15 @@ let AuroInput$1 = class AuroInput extends BaseInput$1 {
47439
47573
  * @returns {void}
47440
47574
  */
47441
47575
  checkDisplayValueSlotChange() {
47442
- let nodes = this.shadowRoot.querySelector('slot[name="displayValue"]').assignedNodes();
47443
-
47444
- // Handle when DisplayValue is multi-level slot content (e.g. combobox passing displayValue to input)
47445
- if (nodes && nodes[0] && nodes[0].tagName === 'SLOT') {
47446
- nodes = nodes[0].assignedNodes();
47447
- }
47448
-
47449
- let hasContent = false;
47450
-
47451
- if (nodes.length > 0) {
47452
- hasContent = true;
47453
- }
47576
+ // flatten:true resolves through auro-combobox's forwarding slot
47577
+ // (<slot name="displayValue" slot="displayValue">) so a clone appended
47578
+ // directly to auro-input's light DOM alongside the forwarder still
47579
+ // counts as content. The prior nodes[0].tagName === 'SLOT' recursion
47580
+ // discarded any siblings past the forwarder.
47581
+ const slot = this.shadowRoot.querySelector('slot[name="displayValue"]');
47582
+ const nodes = slot.assignedNodes({ flatten: true });
47454
47583
 
47455
- this.hasDisplayValueContent = hasContent;
47584
+ this.hasDisplayValueContent = nodes.length > 0;
47456
47585
  }
47457
47586
 
47458
47587
  firstUpdated() {
@@ -48530,6 +48659,15 @@ const datepickerKeyboardStrategy = {
48530
48659
  evt.stopPropagation();
48531
48660
  evt.preventDefault();
48532
48661
 
48662
+ // Signal to the visibility-change handler in auro-datepicker.js that
48663
+ // focus should be restored to the trigger regardless of hasFocus.
48664
+ // hidePopover() (desktop non-modal path) does not auto-restore focus,
48665
+ // and hiding the grid's popover ancestor drops focus to <body>. That
48666
+ // synchronously fires focusout on the datepicker host — clearing
48667
+ // hasFocus — before updated() runs, which would otherwise skip the
48668
+ // input refocus. Native <dialog>.close() (modal path) restores focus
48669
+ // itself, but the flag is harmless there.
48670
+ component._restoreFocusOnClose = true;
48533
48671
  component.hideBib();
48534
48672
  },
48535
48673
 
@@ -48803,6 +48941,14 @@ class AuroDatePicker extends AuroElement$5 {
48803
48941
 
48804
48942
  /**
48805
48943
  * Array of dates that cannot be selected. Dates should be in ISO format (YYYY-MM-DD).
48944
+ *
48945
+ * **Immutable update required.** The datepicker treats this array as
48946
+ * immutable and memoizes a lookup Set keyed on the array's reference
48947
+ * identity — matching Lit's own reactivity semantics for array
48948
+ * properties. In-place mutations (`blackoutDates.push(...)`,
48949
+ * `blackoutDates[i] = ...`, `blackoutDates.splice(...)`) will not
48950
+ * invalidate the cache and the new entries will be silently ignored.
48951
+ * To update, reassign the property: `el.blackoutDates = [...el.blackoutDates, '2024-12-25']`.
48806
48952
  */
48807
48953
  blackoutDates: {
48808
48954
  type: Array,
@@ -49688,12 +49834,13 @@ class AuroDatePicker extends AuroElement$5 {
49688
49834
  this.calendar.activeCellDate = null;
49689
49835
 
49690
49836
  // Show the month containing the selected date (or today) instead of
49691
- // whichever month the user last navigated to.
49837
+ // whichever month the user last navigated to. Route through
49838
+ // updateCentralDate so centralDate stays first-of-month.
49692
49839
  // Respect consumer-provided centralDate/calendarStartDate if no value is set.
49693
49840
  if (this.valueObject) {
49694
- this.centralDate = this.value;
49841
+ this.calendarRenderUtil.updateCentralDate(this, this.value);
49695
49842
  } else if (!this.centralDate && !this.calendarStartDate && !this.minDate) {
49696
- this.centralDate = dateFormatter$1.toISOFormatString(new Date());
49843
+ this.calendarRenderUtil.updateCentralDate(this, new Date());
49697
49844
  }
49698
49845
  }
49699
49846
 
@@ -49751,8 +49898,15 @@ class AuroDatePicker extends AuroElement$5 {
49751
49898
  // Always clear the inert flag. Only restore focus to the input when the datepicker
49752
49899
  // still has focus (e.g. Escape, date selected) — not when the user tabbed away,
49753
49900
  // which would pull them back and require extra Tab presses to escape.
49901
+ //
49902
+ // `_restoreFocusOnClose` is set by the Escape handler in
49903
+ // datepickerKeyboardStrategy.js to force restore even when hasFocus
49904
+ // has already been cleared — hidePopover() (desktop non-modal path)
49905
+ // can drop focus to <body> before this update fires.
49754
49906
  this.dropdown.trigger.inert = false;
49755
- if (this.hasFocus) {
49907
+ const shouldRestoreFocus = this.hasFocus || this._restoreFocusOnClose;
49908
+ this._restoreFocusOnClose = false;
49909
+ if (shouldRestoreFocus) {
49756
49910
  requestAnimationFrame(() => {
49757
49911
  if (!this.dropdown.isPopoverVisible) {
49758
49912
  this.inputList[0].focus();
@@ -50198,6 +50352,18 @@ class AuroDatePicker extends AuroElement$5 {
50198
50352
  this.calendar.requestUpdate();
50199
50353
  this.dispatchEvent(new CustomEvent('auroDatePicker-newSlotContent'));
50200
50354
  }
50355
+
50356
+ // Range invariant: if a value change (from click or programmatic) has
50357
+ // moved start past end, clear valueEnd here so both properties land in
50358
+ // the SAME reactive cycle. Doing it in updated() would schedule a
50359
+ // second cycle after cellClickActive/wasCellClick has already been
50360
+ // consumed by the value branch, leaving the valueEnd branch to run
50361
+ // with a stale handshake and racing with any intervening programmatic
50362
+ // value assignments.
50363
+ if ((changedProperties.has('value') || changedProperties.has('valueEnd')) &&
50364
+ this.valueObject && this.valueEndObject && this.valueObject > this.valueEndObject) {
50365
+ this.valueEnd = undefined;
50366
+ }
50201
50367
  }
50202
50368
 
50203
50369
  updated(changedProperties) {
@@ -50265,8 +50431,12 @@ class AuroDatePicker extends AuroElement$5 {
50265
50431
 
50266
50432
  if (this.value && this.value.length === this.inputList[0].lengthForType && !(this.wasCellClick && this.range)) {
50267
50433
  // Skip centralDate update when user clicked a cell in range mode
50268
- // to prevent the displayed months from shifting
50269
- this.centralDate = this.value;
50434
+ // to prevent the displayed months from shifting. Route through
50435
+ // updateCentralDate so centralDate stays first-of-month — direct
50436
+ // assignment of the raw value briefly holds a mid-month string
50437
+ // and violates the invariant that observers (e.g. calendar sync)
50438
+ // rely on.
50439
+ this.calendarRenderUtil.updateCentralDate(this, this.value);
50270
50440
  }
50271
50441
 
50272
50442
  this.setHasValue();
@@ -50324,8 +50494,10 @@ class AuroDatePicker extends AuroElement$5 {
50324
50494
 
50325
50495
  if (this.valueEnd && this.valueEnd.length === this.inputList[1].lengthForType && !this.wasCellClick) {
50326
50496
  // Skip centralDate update when user clicked a cell in range mode
50327
- // to prevent the displayed months from shifting
50328
- this.centralDate = this.valueEnd;
50497
+ // to prevent the displayed months from shifting. Route through
50498
+ // updateCentralDate to preserve the first-of-month invariant
50499
+ // (see matching comment in the value branch above).
50500
+ this.calendarRenderUtil.updateCentralDate(this, this.valueEnd);
50329
50501
  }
50330
50502
 
50331
50503
  this.validate();
@@ -50349,10 +50521,6 @@ class AuroDatePicker extends AuroElement$5 {
50349
50521
  this.validation.validate(lastInput, true);
50350
50522
  }
50351
50523
 
50352
- if (this.valueObject && this.valueEndObject && this.valueObject > this.valueEndObject) {
50353
- this.valueEnd = undefined;
50354
- }
50355
-
50356
50524
  // This resets the datepicker when the minDate is set to a new value that is
50357
50525
  // a later date than the current value date
50358
50526
  if (changedProperties.has('minDate') && this.minDate) {
@@ -52035,7 +52203,7 @@ let AuroHelpText$1$2 = class AuroHelpText extends i$3 {
52035
52203
  }
52036
52204
  };
52037
52205
 
52038
- var formkitVersion$1$2 = '202607022050';
52206
+ var formkitVersion$1$2 = '202607061903';
52039
52207
 
52040
52208
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
52041
52209
  // See LICENSE in the project root for license information.
@@ -56363,7 +56531,7 @@ let AuroHelpText$6 = class AuroHelpText extends i$3 {
56363
56531
  }
56364
56532
  };
56365
56533
 
56366
- var formkitVersion$6 = '202607022050';
56534
+ var formkitVersion$6 = '202607061903';
56367
56535
 
56368
56536
  let AuroElement$1$2 = class AuroElement extends i$3 {
56369
56537
  static get properties() {
@@ -60343,7 +60511,7 @@ let AuroHelpText$5 = class AuroHelpText extends i$3 {
60343
60511
  }
60344
60512
  };
60345
60513
 
60346
- var formkitVersion$5 = '202607022050';
60514
+ var formkitVersion$5 = '202607061903';
60347
60515
 
60348
60516
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
60349
60517
  // See LICENSE in the project root for license information.
@@ -62108,7 +62276,7 @@ let AuroHelpText$4 = class AuroHelpText extends i$3 {
62108
62276
  }
62109
62277
  };
62110
62278
 
62111
- var formkitVersion$4 = '202607022050';
62279
+ var formkitVersion$4 = '202607061903';
62112
62280
 
62113
62281
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
62114
62282
  // See LICENSE in the project root for license information.
@@ -67329,7 +67497,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$3 {
67329
67497
  }
67330
67498
  };
67331
67499
 
67332
- var formkitVersion$2 = '202607022050';
67500
+ var formkitVersion$2 = '202607061903';
67333
67501
 
67334
67502
  let AuroElement$2$1 = class AuroElement extends i$3 {
67335
67503
  static get properties() {
@@ -79337,14 +79505,16 @@ class BaseInput extends AuroElement$1$1 {
79337
79505
  this.label = 'Input label is undefined';
79338
79506
  this.layout = 'classic';
79339
79507
  this.locale = 'en-US';
79508
+ this._format = undefined;
79509
+
79510
+ /** @private */
79511
+ this._userSetFormat = false;
79340
79512
  this.max = undefined;
79341
79513
  this.maxLength = undefined;
79342
79514
  this.min = undefined;
79343
79515
  this.minLength = undefined;
79344
79516
  this.noValidate = false;
79345
79517
  this.onDark = false;
79346
- // Raw values returned from the input mask before model normalization.
79347
- this._rawMaskValue = undefined;
79348
79518
  this.required = false;
79349
79519
  this.setCustomValidityForType = undefined;
79350
79520
  // Credit Card is intentionally excluded — its mask manages the cursor
@@ -79502,7 +79672,8 @@ class BaseInput extends AuroElement$1$1 {
79502
79672
  */
79503
79673
  format: {
79504
79674
  type: String,
79505
- reflect: true
79675
+ reflect: true,
79676
+ noAccessor: true
79506
79677
  },
79507
79678
 
79508
79679
  /**
@@ -79840,6 +80011,34 @@ class BaseInput extends AuroElement$1$1 {
79840
80011
  return this.max && dateFormatter.isValidDate(this.max) ? dateFormatter.stringToDateInstance(this.max) : undefined;
79841
80012
  }
79842
80013
 
80014
+ get format() {
80015
+ return this._format;
80016
+ }
80017
+
80018
+ /**
80019
+ * Overrides LitElement's generated accessor so we can track whether the
80020
+ * consumer explicitly set `format`. Locale-derived updates use
80021
+ * `_setFormatFromLocale` instead, which skips this flag.
80022
+ */
80023
+ set format(value) {
80024
+ const oldValue = this._format;
80025
+ this._format = value ? value.toLowerCase() : value;
80026
+ this._userSetFormat = Boolean(value);
80027
+ this.requestUpdate('format', oldValue);
80028
+ }
80029
+
80030
+ /**
80031
+ * Sets format without marking it as user-set. Used by locale auto-derive
80032
+ * so that a subsequent locale change can still update the format.
80033
+ * @private
80034
+ * @param {string} value
80035
+ */
80036
+ _setFormatFromLocale(value) {
80037
+ const oldValue = this._format;
80038
+ this._format = value ? value.toLowerCase() : value;
80039
+ this.requestUpdate('format', oldValue);
80040
+ }
80041
+
79843
80042
  connectedCallback() {
79844
80043
  super.connectedCallback();
79845
80044
 
@@ -79887,15 +80086,6 @@ class BaseInput extends AuroElement$1$1 {
79887
80086
 
79888
80087
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
79889
80088
 
79890
- // Normalize the format token to lowercase so case-mixed values supplied
79891
- // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
79892
- // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
79893
- // format silently misses the map and leaves `setCustomValidityForType`
79894
- // unset.
79895
- if (this.format) {
79896
- this.format = this.format.toLowerCase();
79897
- }
79898
-
79899
80089
  // use validity message override if declared when initializing the component
79900
80090
  if (this.hasAttribute('setCustomValidity')) {
79901
80091
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -80002,12 +80192,10 @@ class BaseInput extends AuroElement$1$1 {
80002
80192
  updated(changedProperties) {
80003
80193
  super.updated(changedProperties);
80004
80194
 
80005
- // When locale changes without an explicit format override, derive format from the new locale.
80006
- // Only runs if the current format is still the previous locale's default (not user-overridden).
80195
+ // When locale changes, auto-derive format unless the consumer explicitly set one.
80007
80196
  if (changedProperties.has('locale') && !changedProperties.has('format') && this.type === 'date') {
80008
- const previousLocaleFormat = getDateFormatFromLocale(changedProperties.get('locale'));
80009
- if (!this.format || this.format.toLowerCase() === previousLocaleFormat) {
80010
- this.format = getDateFormatFromLocale(this.locale);
80197
+ if (!this._userSetFormat) {
80198
+ this._setFormatFromLocale(getDateFormatFromLocale(this.locale));
80011
80199
  }
80012
80200
  }
80013
80201
 
@@ -80178,9 +80366,6 @@ class BaseInput extends AuroElement$1$1 {
80178
80366
  this.maskInstance.on('accept', () => {
80179
80367
  if (this._configuringMask) return;
80180
80368
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
80181
- if (this.type === "date") {
80182
- this._rawMaskValue = this.maskInstance.value;
80183
- }
80184
80369
  });
80185
80370
 
80186
80371
  // Mask fires 'complete' on the restore step below for any value that
@@ -80188,9 +80373,6 @@ class BaseInput extends AuroElement$1$1 {
80188
80373
  this.maskInstance.on('complete', () => {
80189
80374
  if (this._configuringMask) return;
80190
80375
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
80191
- if (this.type === "date") {
80192
- this._rawMaskValue = this.maskInstance.value;
80193
- }
80194
80376
  });
80195
80377
 
80196
80378
  // Write existingValue through the mask (not the input directly) so
@@ -80211,14 +80393,17 @@ class BaseInput extends AuroElement$1$1 {
80211
80393
  * @returns {void}
80212
80394
  */
80213
80395
  notifyValueChanged() {
80214
- let inputEvent = null;
80215
-
80216
- inputEvent = new Event('input', {
80396
+ // This echoes Lit's reactive value update (and handleClickClear's
80397
+ // programmatic clear) — it is NOT a fresh user-input event. Mark it
80398
+ // `isProgrammatic` so consumers (e.g. auro-combobox) can distinguish
80399
+ // it from genuine user typing and skip clobbering their own
80400
+ // programmatic state during init-time renders.
80401
+ const inputEvent = new Event('input', {
80217
80402
  bubbles: true,
80218
80403
  composed: true,
80219
80404
  });
80405
+ inputEvent.isProgrammatic = true;
80220
80406
 
80221
- // Dispatched event to alert outside shadow DOM context of event firing.
80222
80407
  this.dispatchEvent(inputEvent);
80223
80408
  }
80224
80409
 
@@ -80427,8 +80612,7 @@ class BaseInput extends AuroElement$1$1 {
80427
80612
 
80428
80613
  // Set default date format if type=date and no format is defined
80429
80614
  if (this.type === "date" && !this.format) {
80430
- // Use locale to determine default date format
80431
- this.format = this.util.getDateMaskFromLocale().toLowerCase();
80615
+ this._setFormatFromLocale(this.util.getDateMaskFromLocale().toLowerCase());
80432
80616
  this.util.updateFormat(this.format);
80433
80617
  }
80434
80618
  }
@@ -80457,7 +80641,7 @@ class BaseInput extends AuroElement$1$1 {
80457
80641
  const creditCard = this.matchInputValueToCreditCard();
80458
80642
  const previousFormat = this.format;
80459
80643
 
80460
- this.format = creditCard.maskFormat;
80644
+ this._setFormatFromLocale(creditCard.maskFormat);
80461
80645
 
80462
80646
  this.maxLength = creditCard.formatLength;
80463
80647
  this.minLength = creditCard.formatMinLength;
@@ -80931,7 +81115,7 @@ let AuroHelpText$1$1 = class AuroHelpText extends i$3 {
80931
81115
  }
80932
81116
  };
80933
81117
 
80934
- var formkitVersion$1$1 = '202607022050';
81118
+ var formkitVersion$1$1 = '202607061903';
80935
81119
 
80936
81120
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
80937
81121
  // See LICENSE in the project root for license information.
@@ -81217,20 +81401,15 @@ class AuroInput extends BaseInput {
81217
81401
  * @returns {void}
81218
81402
  */
81219
81403
  checkDisplayValueSlotChange() {
81220
- let nodes = this.shadowRoot.querySelector('slot[name="displayValue"]').assignedNodes();
81221
-
81222
- // Handle when DisplayValue is multi-level slot content (e.g. combobox passing displayValue to input)
81223
- if (nodes && nodes[0] && nodes[0].tagName === 'SLOT') {
81224
- nodes = nodes[0].assignedNodes();
81225
- }
81226
-
81227
- let hasContent = false;
81228
-
81229
- if (nodes.length > 0) {
81230
- hasContent = true;
81231
- }
81404
+ // flatten:true resolves through auro-combobox's forwarding slot
81405
+ // (<slot name="displayValue" slot="displayValue">) so a clone appended
81406
+ // directly to auro-input's light DOM alongside the forwarder still
81407
+ // counts as content. The prior nodes[0].tagName === 'SLOT' recursion
81408
+ // discarded any siblings past the forwarder.
81409
+ const slot = this.shadowRoot.querySelector('slot[name="displayValue"]');
81410
+ const nodes = slot.assignedNodes({ flatten: true });
81232
81411
 
81233
- this.hasDisplayValueContent = hasContent;
81412
+ this.hasDisplayValueContent = nodes.length > 0;
81234
81413
  }
81235
81414
 
81236
81415
  firstUpdated() {
@@ -82057,7 +82236,7 @@ let AuroBibtemplate$1 = class AuroBibtemplate extends i$3 {
82057
82236
  }
82058
82237
  };
82059
82238
 
82060
- var formkitVersion$3 = '202607022050';
82239
+ var formkitVersion$3 = '202607061903';
82061
82240
 
82062
82241
  var styleCss$1$3 = i$6`.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock{display:block}.util_displayFlex{display:flex}.util_displayHidden{display:none}.util_displayHiddenVisually{position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}:host{display:block;text-align:left}:host [auro-dropdown]{--ds-auro-dropdown-trigger-background-color: transparent}:host #inputInBib::part(wrapper){box-shadow:none}:host #inputInBib::part(accent-left){display:none}:host([layout*=classic]) [auro-input]{width:100%}:host([layout*=classic]) [auro-input]::part(helpText){display:none}:host([layout*=classic]) #slotHolder{display:none}`;
82063
82242
 
@@ -83156,9 +83335,19 @@ class AuroCombobox extends AuroElement$3 {
83156
83335
  /**
83157
83336
  * Processes hidden state of all menu options and determines if there are any available options not hidden.
83158
83337
  * @private
83338
+ * @param {object} [options={}] - Optional flag bag.
83339
+ * @param {boolean} [options.preferComboboxValue=false] - When true,
83340
+ * handleMenuOptions matches the selected option against `this.value`
83341
+ * first instead of `this.input.value`. Needed on mount and re-mount
83342
+ * because under `persistInput` the consumer's typedValue prop can drift
83343
+ * from the framework value (Svelte `{#key}` re-mount after a swap, or
83344
+ * SPA preselect after route change) and the old input-first match would
83345
+ * then pick the stale text. Only handleSlotChange passes this; typing
83346
+ * and clearing paths keep the input-first match so user clears aren't
83347
+ * undone.
83159
83348
  * @returns {void}
83160
83349
  */
83161
- handleMenuOptions() {
83350
+ handleMenuOptions({ preferComboboxValue = false } = {}) {
83162
83351
  this.generateOptionsArray();
83163
83352
  this.availableOptions = [];
83164
83353
  // Single source of truth for the menu's filter/highlight token per call.
@@ -83179,7 +83368,20 @@ class AuroCombobox extends AuroElement$3 {
83179
83368
  option.setAttribute('aria-posinset', index + 1);
83180
83369
  });
83181
83370
 
83182
- if (this.input.value && this.menu.options && this.menu.options.some((opt) => opt.value === this.input.value)) {
83371
+ // On mount/re-mount (via handleSlotChange), prefer the framework-set
83372
+ // `this.value` when it matches a menu option. Covers SPA preselect and
83373
+ // consumer swap patterns (e.g. Svelte `{#key}` re-mount) where
83374
+ // `this.value` is authoritative but `this.input.value` may be empty or
83375
+ // carry stale typed text from another field. Event-driven callers do
83376
+ // not pass the flag, otherwise user clears would be undone by
83377
+ // re-syncing to the previous combobox.value.
83378
+ if (preferComboboxValue &&
83379
+ this.value &&
83380
+ this.menu.options?.some((opt) => opt.value === this.value)) {
83381
+ this.setMenuValue(this.value);
83382
+ this.syncValuesAndStates();
83383
+ } else if (this.input.value &&
83384
+ this.menu.options?.some((opt) => opt.value === this.input.value)) {
83183
83385
  this.setMenuValue(this.input.value);
83184
83386
  this.syncValuesAndStates();
83185
83387
  }
@@ -83616,7 +83818,25 @@ class AuroCombobox extends AuroElement$3 {
83616
83818
  this.optionActive = evt.detail;
83617
83819
 
83618
83820
  if (this.input) {
83619
- this.input.setActiveDescendant(this.optionActive);
83821
+ // setActiveDescendant runs after Lit's update finishes because the
83822
+ // template's `.a11yActivedescendant` binding calls setAttribute on
83823
+ // the internal <input> in auro-input.updated(), which clears the
83824
+ // reflected ariaActiveDescendantElement property. Setting the ref
83825
+ // synchronously here would get overwritten by that attribute write.
83826
+ // Awaiting updateComplete lets the attribute write finish first,
83827
+ // then the ref sticks and screen readers can cross the shadow-DOM
83828
+ // boundary to the auro-menuoption in light DOM.
83829
+ //
83830
+ // The equality check covers the async gap: this.optionActive can
83831
+ // change before the callback runs (user arrowed elsewhere, or the
83832
+ // menu closed and cleared it to null), so we bail if the target
83833
+ // no longer matches to avoid reinstating a stale ref.
83834
+ const targetOption = this.optionActive;
83835
+ this.updateComplete.then(() => {
83836
+ if (this.input && this.optionActive === targetOption) {
83837
+ this.input.setActiveDescendant(targetOption);
83838
+ }
83839
+ });
83620
83840
  }
83621
83841
 
83622
83842
  // In fullscreen mode the menu sits inside a nested <dialog> shadow root,
@@ -83753,6 +83973,18 @@ class AuroCombobox extends AuroElement$3 {
83753
83973
  }
83754
83974
  }
83755
83975
 
83976
+ // SPA preselect guard: on init render, auro-input's notifyValueChanged
83977
+ // echoes an empty value through as an isProgrammatic input event before
83978
+ // the framework-set combobox.value has propagated down to the input.
83979
+ // Without this bail, the `this.value = this.input.value` below clobbers
83980
+ // the framework value with '' and clear() wipes optionSelected. Scoped
83981
+ // to the exact shape of that echo (isProgrammatic + non-empty combobox
83982
+ // value + empty input.value) so it doesn't affect the swap/typed paths
83983
+ // where value/input already track each other through the sync helpers.
83984
+ if (event && event.isProgrammatic && this.value && !this.input.value) {
83985
+ return;
83986
+ }
83987
+
83756
83988
  this.value = this.input.value;
83757
83989
 
83758
83990
  // Ignore re-entrant input events caused by programmatic value sets.
@@ -84185,7 +84417,11 @@ class AuroCombobox extends AuroElement$3 {
84185
84417
  }
84186
84418
  });
84187
84419
 
84188
- this.handleMenuOptions();
84420
+ // Slot change (mount/re-mount): pass `preferComboboxValue` so that a
84421
+ // framework-set `this.value` wins over any stale `input.value` when
84422
+ // matching against the newly-available options. Fixes the display
84423
+ // for SPA preselect and Svelte `{#key}` re-mount swap patterns.
84424
+ this.handleMenuOptions({ preferComboboxValue: true });
84189
84425
 
84190
84426
  break;
84191
84427
 
@@ -90901,7 +91137,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
90901
91137
  }
90902
91138
  };
90903
91139
 
90904
- var formkitVersion$1 = '202607022050';
91140
+ var formkitVersion$1 = '202607061903';
90905
91141
 
90906
91142
  class AuroElement extends i$3 {
90907
91143
  static get properties() {
@@ -92940,7 +93176,7 @@ class AuroHelpText extends i$3 {
92940
93176
  }
92941
93177
  }
92942
93178
 
92943
- var formkitVersion = '202607022050';
93179
+ var formkitVersion = '202607061903';
92944
93180
 
92945
93181
  var styleCss = i$6`.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock{display:block}.util_displayFlex{display:flex}.util_displayHidden{display:none}.util_displayHiddenVisually{position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}.body-default{font-size:var(--wcss-body-default-font-size, 1rem);font-weight:var(--wcss-body-default-weight, );line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default,.body-default-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-default-emphasized{font-size:var(--wcss-body-default-emphasized-font-size, 1rem);font-weight:var(--wcss-body-default-emphasized-weight, );line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.body-lg{font-size:var(--wcss-body-lg-font-size, 1.125rem);font-weight:var(--wcss-body-lg-weight, );line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg,.body-lg-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-lg-emphasized{font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);font-weight:var(--wcss-body-lg-emphasized-weight, );line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{font-size:var(--wcss-body-sm-font-size, 0.875rem);font-weight:var(--wcss-body-sm-weight, );line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm,.body-sm-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-sm-emphasized{font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);font-weight:var(--wcss-body-sm-emphasized-weight, );line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.body-xs{font-size:var(--wcss-body-xs-font-size, 0.75rem);font-weight:var(--wcss-body-xs-weight, );line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs,.body-xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-xs-emphasized{font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);font-weight:var(--wcss-body-xs-emphasized-weight, );line-height:var(--wcss-body-xs-emphasized-line-height, 1rem)}.body-2xs{font-size:var(--wcss-body-2xs-font-size, 0.625rem);font-weight:var(--wcss-body-2xs-weight, );line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs,.body-2xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-2xs-emphasized{font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);font-weight:var(--wcss-body-2xs-emphasized-weight, );line-height:var(--wcss-body-2xs-emphasized-line-height, 0.875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));font-weight:var(--wcss-display-2xl-weight, 300);letter-spacing:var(--wcss-display-2xl-letter-spacing, 0);line-height:var(--wcss-display-2xl-line-height, 1.3)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));font-weight:var(--wcss-display-xl-weight, 300);letter-spacing:var(--wcss-display-xl-letter-spacing, 0);line-height:var(--wcss-display-xl-line-height, 1.3)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));font-weight:var(--wcss-display-lg-weight, 300);letter-spacing:var(--wcss-display-lg-letter-spacing, 0);line-height:var(--wcss-display-lg-line-height, 1.3)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));font-weight:var(--wcss-display-md-weight, 300);letter-spacing:var(--wcss-display-md-letter-spacing, 0);line-height:var(--wcss-display-md-line-height, 1.3)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));font-weight:var(--wcss-display-sm-weight, 300);letter-spacing:var(--wcss-display-sm-letter-spacing, 0);line-height:var(--wcss-display-sm-line-height, 1.3)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));font-weight:var(--wcss-display-xs-weight, 300);letter-spacing:var(--wcss-display-xs-letter-spacing, 0);line-height:var(--wcss-display-xs-line-height, 1.3)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));font-weight:var(--wcss-heading-xl-weight, 300);letter-spacing:var(--wcss-heading-xl-letter-spacing, 0);line-height:var(--wcss-heading-xl-line-height, 1.3)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));font-weight:var(--wcss-heading-lg-weight, 300);letter-spacing:var(--wcss-heading-lg-letter-spacing, 0);line-height:var(--wcss-heading-lg-line-height, 1.3)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));font-weight:var(--wcss-heading-md-weight, 300);letter-spacing:var(--wcss-heading-md-letter-spacing, 0);line-height:var(--wcss-heading-md-line-height, 1.3)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));font-weight:var(--wcss-heading-sm-weight, 300);letter-spacing:var(--wcss-heading-sm-letter-spacing, 0);line-height:var(--wcss-heading-sm-line-height, 1.3)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));font-weight:var(--wcss-heading-xs-weight, 300);letter-spacing:var(--wcss-heading-xs-letter-spacing, 0);line-height:var(--wcss-heading-xs-line-height, 1.3)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));font-weight:var(--wcss-heading-2xs-weight, 300);letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0);line-height:var(--wcss-heading-2xs-line-height, 1.3)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));font-weight:var(--wcss-accent-2xl-weight, 450);letter-spacing:var(--wcss-accent-2xl-letter-spacing, 0.05em);line-height:var(--wcss-accent-2xl-line-height, 1)}.accent-2xl,.accent-xl{text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));font-weight:var(--wcss-accent-xl-weight, 450);letter-spacing:var(--wcss-accent-xl-letter-spacing, 0.05em);line-height:var(--wcss-accent-xl-line-height, 1.3)}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));font-weight:var(--wcss-accent-lg-weight, 450);letter-spacing:var(--wcss-accent-lg-letter-spacing, 0.05em);line-height:var(--wcss-accent-lg-line-height, 1.3)}.accent-lg,.accent-md{text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));font-weight:var(--wcss-accent-md-weight, 500);letter-spacing:var(--wcss-accent-md-letter-spacing, 0.05em);line-height:var(--wcss-accent-md-line-height, 1.3)}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));font-weight:var(--wcss-accent-sm-weight, 500);letter-spacing:var(--wcss-accent-sm-letter-spacing, 0.05em);line-height:var(--wcss-accent-sm-line-height, 1.3)}.accent-sm,.accent-xs{text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));font-weight:var(--wcss-accent-xs-weight, 500);letter-spacing:var(--wcss-accent-xs-letter-spacing, 0.1em);line-height:var(--wcss-accent-xs-line-height, 1.3)}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xs-font-size, clamp(0.875rem, 1.1666666667vw, 0.875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}[auro-dropdown]{--ds-auro-dropdown-trigger-border-color: var(--ds-auro-select-border-color);--ds-auro-dropdown-trigger-background-color: var(--ds-auro-select-background-color);--ds-auro-dropdown-trigger-container-color: var(--ds-auro-select-background-color);--ds-auro-dropdown-trigger-outline-color: var(--ds-auro-select-outline-color)}:host{display:inline-block;text-align:left;vertical-align:top}:host([layout*=emphasized]) [auro-dropdown],:host([layout*=snowflake]) [auro-dropdown]{--ds-auro-select-border-color: transparent}:host([layout*=emphasized]) .mainContent,:host([layout*=snowflake]) .mainContent{text-align:center}.mainContent{position:relative;display:flex;overflow:hidden;flex:1;flex-direction:column;align-items:center;justify-content:center}.valueContainer [slot=displayValue]{display:none}.accents{display:flex;flex-direction:row;align-items:center;justify-content:center}::slotted([slot=typeIcon]){margin-right:var(--ds-size-100, 0.5rem)}.displayValue{display:block}.displayValue:not(.force){display:none}.displayValue:not(.force).hasContent:is(.withValue):not(.hasFocus){display:block}.triggerContent{display:flex;width:100%;align-items:center;justify-content:center}:host([layout*=emphasized]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem) 0 var(--ds-size-300, 1.5rem)}:host([layout*=snowflake]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem) 0 var(--ds-size-200, 1rem)}:host([layout*=snowflake]) label{padding-block:var(--ds-size-25, 0.125rem)}:host([layout*=classic]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem)}:host([layout*=classic]) .mainContent{align-items:start}:host([layout*=classic]) label{overflow:hidden;cursor:text;text-overflow:ellipsis;white-space:nowrap}:host([layout*=classic]) .value{height:auto}label{color:var(--ds-auro-select-label-text-color)}:host(:is([validity]:not([validity=valid]))) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-basic-color-status-error, #e31f26);--ds-auro-select-outline-color: var(--ds-basic-color-status-error, #e31f26);--ds-auro-dropdown-helptext-text-color: var(--ds-basic-color-texticon-default, #2a2a2a)}:host([ondark]:is([validity]:not([validity=valid]))) [auro-dropdown],:host([appearance=inverse]:is([validity]:not([validity=valid]))) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-advanced-color-state-error-inverse, #f9a4a8);--ds-auro-select-outline-color: var(--ds-advanced-color-state-error-inverse, #f9a4a8);--ds-auro-dropdown-helptext-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}#slotHolder{display:none}:host([fluid]){width:100%}:host([disabled]){pointer-events:none;user-select:none}:host([disabled]:not([ondark])) [auro-dropdown],:host([disabled]:not([appearance=inverse])) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-basic-color-border-subtle, #dddddd)}:host(:not([layout*=classic])[disabled][ondark]) [auro-dropdown],:host(:not([layout*=classic])[disabled][appearance=inverse]) [auro-dropdown]{--ds-auro-select-border-color: transparent}`;
92946
93182