@aurodesignsystem-dev/auro-formkit 0.0.0-pr1508.0 → 0.0.0-pr1509.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 (46) 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 +293 -141
  7. package/components/combobox/demo/getting-started.min.js +293 -141
  8. package/components/combobox/demo/index.min.js +293 -141
  9. package/components/combobox/dist/auro-combobox.d.ts +0 -9
  10. package/components/combobox/dist/index.js +293 -141
  11. package/components/combobox/dist/registered.js +293 -141
  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/customize.min.js +167 -44
  17. package/components/datepicker/demo/index.min.js +167 -44
  18. package/components/datepicker/dist/index.js +167 -44
  19. package/components/datepicker/dist/registered.js +167 -44
  20. package/components/dropdown/demo/customize.min.js +1 -1
  21. package/components/dropdown/demo/getting-started.min.js +1 -1
  22. package/components/dropdown/demo/index.min.js +1 -1
  23. package/components/dropdown/dist/index.js +1 -1
  24. package/components/dropdown/dist/registered.js +1 -1
  25. package/components/form/demo/customize.min.js +631 -232
  26. package/components/form/demo/getting-started.min.js +631 -232
  27. package/components/form/demo/index.min.js +631 -232
  28. package/components/form/demo/registerDemoDeps.min.js +631 -232
  29. package/components/input/demo/customize.min.js +165 -41
  30. package/components/input/demo/getting-started.min.js +165 -41
  31. package/components/input/demo/index.min.js +165 -41
  32. package/components/input/dist/base-input.d.ts +49 -1
  33. package/components/input/dist/index.js +165 -41
  34. package/components/input/dist/registered.js +165 -41
  35. package/components/radio/demo/customize.min.js +1 -1
  36. package/components/radio/demo/getting-started.min.js +1 -1
  37. package/components/radio/demo/index.min.js +1 -1
  38. package/components/radio/dist/index.js +1 -1
  39. package/components/radio/dist/registered.js +1 -1
  40. package/components/select/demo/customize.min.js +2 -2
  41. package/components/select/demo/getting-started.min.js +2 -2
  42. package/components/select/demo/index.min.js +2 -2
  43. package/components/select/dist/index.js +2 -2
  44. package/components/select/dist/registered.js +2 -2
  45. package/custom-elements.json +264 -20
  46. package/package.json +1 -1
@@ -11501,7 +11501,6 @@ let AuroInputUtilities$3 = class AuroInputUtilities {
11501
11501
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
11502
11502
 
11503
11503
  if (!(valueObject instanceof Date) || Number.isNaN(valueObject.getTime()) || !maskOptions || typeof maskOptions.format !== 'function') {
11504
- console.debug('Invalid date object or mask options for formatting', { valueObject, maskOptions }); // eslint-disable-line no-console
11505
11504
  return undefined;
11506
11505
  }
11507
11506
 
@@ -11653,8 +11652,10 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11653
11652
  this.layout = 'classic';
11654
11653
  this.locale = 'en-US';
11655
11654
  this.max = undefined;
11655
+ this._maxObject = undefined;
11656
11656
  this.maxLength = undefined;
11657
11657
  this.min = undefined;
11658
+ this._minObject = undefined;
11658
11659
  this.minLength = undefined;
11659
11660
  this.required = false;
11660
11661
  this.onDark = false;
@@ -11662,6 +11663,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11662
11663
  this.size = 'lg';
11663
11664
  this.shape = 'classic';
11664
11665
  this.value = undefined;
11666
+ this._valueObject = undefined;
11665
11667
 
11666
11668
  this._initializePrivateDefaults();
11667
11669
  }
@@ -12201,7 +12203,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12201
12203
  * @returns {Date|undefined}
12202
12204
  */
12203
12205
  get valueObject() {
12204
- return this.value && dateFormatter$3.isValidDate(this.value) ? dateFormatter$3.stringToDateInstance(this.value) : undefined;
12206
+ return this._valueObject || this._computeDateObjectFallback(this.value);
12205
12207
  }
12206
12208
 
12207
12209
  /**
@@ -12209,7 +12211,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12209
12211
  * @returns {Date|undefined}
12210
12212
  */
12211
12213
  get minObject() {
12212
- return this.min && dateFormatter$3.isValidDate(this.min) ? dateFormatter$3.stringToDateInstance(this.min) : undefined;
12214
+ return this._minObject || this._computeDateObjectFallback(this.min);
12213
12215
  }
12214
12216
 
12215
12217
  /**
@@ -12217,7 +12219,50 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12217
12219
  * @returns {Date|undefined}
12218
12220
  */
12219
12221
  get maxObject() {
12220
- return this.max && dateFormatter$3.isValidDate(this.max) ? dateFormatter$3.stringToDateInstance(this.max) : undefined;
12222
+ return this._maxObject || this._computeDateObjectFallback(this.max);
12223
+ }
12224
+
12225
+ /**
12226
+ * Parses a date string into a Date object when the corresponding `_*Object`
12227
+ * field hasn't been synced yet by `updated()`. Returns undefined when the
12228
+ * input type/format isn't a full date or the string is not a valid date.
12229
+ *
12230
+ * Why this exists: a parent (datepicker) can call `inputN.validate()` from
12231
+ * inside its own `updated()` before this input's `updated()` has run
12232
+ * `syncDateValues()` — so `_valueObject`/`_maxObject` are still `undefined`
12233
+ * and range checks would otherwise silently no-op (flipping the result to
12234
+ * `valid` or `patternMismatch`).
12235
+ * @private
12236
+ * @param {string|undefined} dateStr - ISO date string from `value`/`min`/`max`.
12237
+ * @returns {Date|undefined}
12238
+ */
12239
+ _computeDateObjectFallback(dateStr) {
12240
+ if (!dateStr || !this.util || !this.util.isFullDateFormat(this.type, this.format)) {
12241
+ return undefined;
12242
+ }
12243
+ if (!dateFormatter$3.isValidDate(dateStr)) {
12244
+ return undefined;
12245
+ }
12246
+ return dateFormatter$3.stringToDateInstance(dateStr);
12247
+ }
12248
+
12249
+ /**
12250
+ * Internal setter for readonly date object properties.
12251
+ * @private
12252
+ * @param {'valueObject'|'minObject'|'maxObject'} propertyName - Public object property name.
12253
+ * @param {Date|undefined} propertyValue - Value to assign.
12254
+ * @returns {void}
12255
+ */
12256
+ setDateObjectProperty(propertyName, propertyValue) {
12257
+ const internalPropertyName = `_${propertyName}`;
12258
+ const previousValue = this[internalPropertyName];
12259
+
12260
+ if (previousValue === propertyValue) {
12261
+ return;
12262
+ }
12263
+
12264
+ this[internalPropertyName] = propertyValue;
12265
+ this.requestUpdate(propertyName, previousValue);
12221
12266
  }
12222
12267
 
12223
12268
  connectedCallback() {
@@ -12246,6 +12291,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12246
12291
  format: this.format
12247
12292
  });
12248
12293
  this.configureDataForType();
12294
+ this.syncDateValues();
12249
12295
  }
12250
12296
 
12251
12297
  disconnectedCallback() {
@@ -12265,6 +12311,15 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12265
12311
  this.wrapperElement.addEventListener('click', this.handleClick);
12266
12312
  }
12267
12313
 
12314
+ // add attribute for query selectors when auro-input is registered under a custom name
12315
+ // COVERAGE: the body of this branch is unreachable in WTR — connectedCallback
12316
+ // performs the same `setAttribute('auro-input', '')` earlier (see L665-667),
12317
+ // so by the time firstUpdated runs the attribute is already present and the
12318
+ // `!hasAttribute('auro-input')` guard is false. Retained as a defensive
12319
+ // safety net in case connectedCallback is ever short-circuited.
12320
+ if (this.tagName.toLowerCase() !== 'auro-input' && !this.hasAttribute('auro-input')) {
12321
+ this.setAttribute('auro-input', '');
12322
+ }
12268
12323
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
12269
12324
 
12270
12325
  // use validity message override if declared when initializing the component
@@ -12275,6 +12330,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12275
12330
  this.setCustomHelpTextMessage();
12276
12331
  this.configureAutoFormatting();
12277
12332
  this.configureDataForType();
12333
+ this.syncDateValues();
12278
12334
  }
12279
12335
 
12280
12336
  /**
@@ -12350,6 +12406,13 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12350
12406
 
12351
12407
  if (typeToI18n.includes(this.type)) {
12352
12408
  this.setCustomValidityForType = i18n$3(this.lang, this.type);
12409
+ // COVERAGE: this `else if` branch is unreachable in WTR. connectedCallback
12410
+ // (L682) calls configureDataForType, which at L1266-1268 assigns
12411
+ // `this.format = this.util.getDateMaskFromLocale().toLowerCase()` for any
12412
+ // type=date input whose `format` attribute is unset. That runs before
12413
+ // firstUpdated invokes setCustomHelpTextMessage, so `!this.format` is
12414
+ // always false here. Retained as a defensive fallback; the whole function
12415
+ // is @deprecated per AB#1557296 and slated for removal.
12353
12416
  } else if (!this.format && this.type === 'date') {
12354
12417
  this.setCustomValidityForType = i18n$3(this.lang, 'dateMMDDYYYY');
12355
12418
  } else if (this.dateFormatMap[this.format]) {
@@ -12411,6 +12474,8 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12411
12474
  this.configureDataForType();
12412
12475
  }
12413
12476
 
12477
+ this.syncDateValues(changedProperties);
12478
+
12414
12479
  if (changedProperties.has('value')) {
12415
12480
  if (this.value && this.value.length > 0) {
12416
12481
  this.hasValue = true;
@@ -12432,14 +12497,14 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12432
12497
 
12433
12498
  if (formattedValue !== this.inputElement.value) {
12434
12499
  this.skipNextProgrammaticInputEvent = true;
12435
- if (this.maskInstance && this.type !== 'date') {
12500
+ if (this.maskInstance && this.type === 'credit-card') {
12436
12501
  // Route through the mask so its _value and el.value stay in lock-step
12437
12502
  // (set value calls updateControl which writes el.value = displayValue).
12438
12503
  // Writing el.value directly leaves the mask thinking displayValue is
12439
- // stale; _saveSelection on the next focus/click then warns. Date is
12440
- // excluded because its formattedValue can be raw ISO when the calendar
12441
- // is invalid, and re-masking through mm/dd/yyyy would truncate it and
12442
- // flip validity from patternMismatch to tooShort.
12504
+ // stale; _saveSelection on the next focus/click then warns. Scoped to
12505
+ // credit-card so date's own formattedValue (raw ISO when calendar-invalid)
12506
+ // isn't re-masked through the mm/dd/yyyy mask, which would truncate it
12507
+ // and flip validity from patternMismatch to tooShort.
12443
12508
  this.maskInstance.value = formattedValue || '';
12444
12509
  } else if (formattedValue) {
12445
12510
  this.inputElement.value = formattedValue;
@@ -12481,65 +12546,120 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12481
12546
  }));
12482
12547
  }
12483
12548
 
12549
+
12550
+ /**
12551
+ * Synchronizes the ISO string values and Date object representations for date-related properties.
12552
+ * This keeps the model and display values aligned when either side changes.
12553
+ *
12554
+ * When a full date format is in use, this method updates `value`, `min`, and `max` from their corresponding
12555
+ * Date objects or vice versa, based on which properties have changed. It only runs when the current configuration
12556
+ * represents a full year/month/day date format.
12557
+ *
12558
+ * @param {Map<string, unknown>|undefined} [changedProperties=undefined] - Optional map of changed properties used to limit which values are synchronized.
12559
+ * @returns {void}
12560
+ * @private
12561
+ */
12562
+ syncDateValues(changedProperties = undefined) {
12563
+ if (!this.util.isFullDateFormat(this.type, this.format)) {
12564
+ return;
12565
+ }
12566
+
12567
+ this.syncSingleDateValue(changedProperties, 'valueObject', 'value');
12568
+ this.syncSingleDateValue(changedProperties, 'minObject', 'min');
12569
+ this.syncSingleDateValue(changedProperties, 'maxObject', 'max');
12570
+ }
12571
+
12572
+ /**
12573
+ * Synchronizes one date object/string property pair.
12574
+ * @private
12575
+ * @param {Map<string, unknown>|undefined} changedProperties - Map of changed properties from Lit.
12576
+ * @param {string} objectProperty - Date object property name.
12577
+ * @param {string} valueProperty - ISO string property name.
12578
+ * @returns {void}
12579
+ */
12580
+ syncSingleDateValue(changedProperties, objectProperty, valueProperty) {
12581
+ const objectPropertyChanged = !changedProperties || changedProperties.has(objectProperty);
12582
+
12583
+ // objectProperty wins over valueProperty when both changed
12584
+ if (objectPropertyChanged && this[objectProperty]) {
12585
+ this[valueProperty] = dateFormatter$3.toISOFormatString(this[objectProperty]);
12586
+ return;
12587
+ }
12588
+
12589
+ const valuePropertyChanged = !changedProperties || changedProperties.has(valueProperty);
12590
+ if (!valuePropertyChanged) {
12591
+ return;
12592
+ }
12593
+
12594
+ // when value is newly set to the same ISO string that corresponds to the existing Date object, do not clear the Date object (avoid unnecessary updates)
12595
+ if (
12596
+ changedProperties &&
12597
+ valueProperty === 'value' &&
12598
+ changedProperties.get('value') === undefined &&
12599
+ this[objectProperty] instanceof Date &&
12600
+ this[valueProperty] === dateFormatter$3.toISOFormatString(this[objectProperty])
12601
+ ) {
12602
+ return;
12603
+ }
12604
+
12605
+ if (dateFormatter$3.isValidDate(this[valueProperty])) {
12606
+ this.setDateObjectProperty(objectProperty, dateFormatter$3.stringToDateInstance(this[valueProperty]));
12607
+ } else {
12608
+ this.setDateObjectProperty(objectProperty, undefined);
12609
+ }
12610
+ }
12611
+
12484
12612
  /**
12485
12613
  * Sets up IMasks and logic based on auto-formatting requirements.
12486
12614
  * @private
12487
12615
  * @returns {void}
12488
12616
  */
12489
12617
  configureAutoFormatting() {
12490
- // _configuringMask gates two things: external re-entry into this method
12491
- // while setup is mid-flight (from property changes that call back here),
12492
- // and the accept/complete listeners below both need to ignore the mask
12493
- // events fired by our own value-restore step.
12618
+ // Re-entrancy guard. The patched-setter's synthetic input event (suppressed
12619
+ // by _configuringMask above) could otherwise trigger handleInput
12620
+ // processCreditCard configureAutoFormatting before the outer call's
12621
+ // set value has finished its alignCursor pass.
12494
12622
  if (this._configuringMask) return;
12495
12623
  this._configuringMask = true;
12496
12624
  try {
12497
- // Destroy any prior mask so IMask can attach fresh under the new format.
12498
- // Null the reference too — if the new maskOptions.mask is falsy (e.g.
12499
- // type switched from credit-card to text) the IMask() reassignment
12500
- // below is skipped, and downstream writes at line ~823 would otherwise
12501
- // route through the destroyed instance.
12502
12625
  if (this.maskInstance) {
12503
12626
  this.maskInstance.destroy();
12504
- this.maskInstance = null;
12505
12627
  }
12506
12628
 
12629
+ // Pass new format to util
12507
12630
  this.util.updateFormat(this.format);
12508
12631
 
12509
12632
  const maskOptions = this.util.getMaskOptions(this.type, this.format);
12510
12633
 
12511
12634
  if (this.inputElement && maskOptions.mask) {
12512
- // Capture the current display so it can be re-applied after IMask
12513
- // attaches. The restore at the bottom goes through maskInstance.value
12514
- // (not inputElement.value directly) so the mask's internal state and
12515
- // the input's displayed text stay in lock-step.
12516
- let existingValue = this.inputElement.value;
12517
12635
 
12518
- // Format-change case (e.g. locale switch): existingValue is the OLD
12519
- // mask's display string and may not parse under the new mask. When
12520
- // we have a valid date model, rebuild the display from valueObject
12521
- // (the canonical source) using the new mask's format function.
12636
+ // Stash and clear any existing value before IMask init.
12637
+ // IMask's constructor processes the current input value which requires
12638
+ // selection state clearing first avoids that scenario entirely.
12639
+ // When the format changes (e.g. locale switch) and we have a valid ISO
12640
+ // model value, compute the display string for the NEW format instead of
12641
+ // re-using the old display string, which may be invalid in the new mask.
12642
+ let existingValue = this.inputElement.value;
12522
12643
  if (
12523
12644
  this.util.isFullDateFormat(this.type, this.format) &&
12524
12645
  this.value &&
12525
- this.valueObject &&
12646
+ dateFormatter$3.isValidDate(this.value) &&
12647
+ this.valueObject instanceof Date &&
12648
+ !Number.isNaN(this.valueObject.getTime()) &&
12526
12649
  typeof maskOptions.format === 'function'
12527
12650
  ) {
12528
12651
  existingValue = maskOptions.format(this.valueObject);
12529
12652
  }
12530
12653
 
12531
- // Clear before IMask attaches so the constructor seeds an empty
12532
- // internal value. Otherwise IMask reads the stale unmasked string
12533
- // and emits a spurious 'accept' before the restore below runs.
12534
12654
  this.skipNextProgrammaticInputEvent = true;
12535
12655
  this.inputElement.value = '';
12536
12656
 
12537
12657
  this.maskInstance = IMask$3(this.inputElement, maskOptions);
12538
12658
 
12539
- // Mask fires 'accept' on every value change, including the restore
12540
- // step below. Skip events fired during configureAutoFormatting so
12541
- // we don't overwrite a value the parent just pushed.
12542
12659
  this.maskInstance.on('accept', () => {
12660
+ // Suppress propagation during configureAutoFormatting's own value-restoration
12661
+ // (line below) — the mask emits 'accept' on every value-set, including ours,
12662
+ // and we don't want to overwrite a value the parent just pushed.
12543
12663
  if (this._configuringMask) return;
12544
12664
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
12545
12665
  if (this.type === "date") {
@@ -12547,8 +12667,6 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12547
12667
  }
12548
12668
  });
12549
12669
 
12550
- // Mask fires 'complete' on the restore step below for any value that
12551
- // happens to be a complete match. Same setup-suppression as 'accept'.
12552
12670
  this.maskInstance.on('complete', () => {
12553
12671
  if (this._configuringMask) return;
12554
12672
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
@@ -12557,9 +12675,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12557
12675
  }
12558
12676
  });
12559
12677
 
12560
- // Write existingValue through the mask (not the input directly) so
12561
- // the mask reformats it under the new rules and keeps its internal
12562
- // _value aligned with the input's displayed text.
12678
+ // Restore the stashed value through IMask so it's properly masked
12563
12679
  if (existingValue) {
12564
12680
  this.maskInstance.value = existingValue;
12565
12681
  }
@@ -12727,6 +12843,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12727
12843
  */
12728
12844
  reset() {
12729
12845
  this.value = undefined;
12846
+ this.setDateObjectProperty('valueObject', undefined);
12730
12847
  this.validation.reset(this);
12731
12848
  }
12732
12849
 
@@ -12735,6 +12852,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12735
12852
  */
12736
12853
  clear() {
12737
12854
  this.value = undefined;
12855
+ this.setDateObjectProperty('valueObject', undefined);
12738
12856
  }
12739
12857
 
12740
12858
  /**
@@ -12772,6 +12890,12 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12772
12890
  */
12773
12891
  get placeholderStr() {
12774
12892
  if (!this.placeholder && this.type === 'date') {
12893
+ // COVERAGE: the `'MM/DD/YYYY'` literal fallback is unreachable in WTR.
12894
+ // connectedCallback (L682) calls configureDataForType, which at L1266-1268
12895
+ // assigns `this.format = this.util.getDateMaskFromLocale().toLowerCase()`
12896
+ // when type=date and format is unset. That runs before the first render
12897
+ // reads this getter, so the ternary's truthy arm always wins. Retained
12898
+ // as a defensive fallback for direct getter calls before connection.
12775
12899
  return this.format ? this.format.toUpperCase() : 'MM/DD/YYYY';
12776
12900
  }
12777
12901
  return this.placeholder || "";
@@ -13263,7 +13387,7 @@ let AuroHelpText$8 = class AuroHelpText extends i$3 {
13263
13387
  }
13264
13388
  };
13265
13389
 
13266
- var formkitVersion$8 = '202606231948';
13390
+ var formkitVersion$8 = '202606232113';
13267
13391
 
13268
13392
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
13269
13393
  // See LICENSE in the project root for license information.
@@ -24502,7 +24626,6 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
24502
24626
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
24503
24627
 
24504
24628
  if (!(valueObject instanceof Date) || Number.isNaN(valueObject.getTime()) || !maskOptions || typeof maskOptions.format !== 'function') {
24505
- console.debug('Invalid date object or mask options for formatting', { valueObject, maskOptions }); // eslint-disable-line no-console
24506
24629
  return undefined;
24507
24630
  }
24508
24631
 
@@ -27383,7 +27506,7 @@ let AuroBibtemplate$3 = class AuroBibtemplate extends i$3 {
27383
27506
  }
27384
27507
  };
27385
27508
 
27386
- var formkitVersion$2$1 = '202606231948';
27509
+ var formkitVersion$2$1 = '202606232113';
27387
27510
 
27388
27511
  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}
27389
27512
  `,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}}
@@ -32894,7 +33017,7 @@ let AuroHelpText$2$1 = class AuroHelpText extends i$3 {
32894
33017
  }
32895
33018
  };
32896
33019
 
32897
- var formkitVersion$1$3 = '202606231948';
33020
+ var formkitVersion$1$3 = '202606232113';
32898
33021
 
32899
33022
  let AuroElement$2$2 = class AuroElement extends i$3 {
32900
33023
  static get properties() {
@@ -44616,7 +44739,6 @@ let AuroInputUtilities$2 = class AuroInputUtilities {
44616
44739
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
44617
44740
 
44618
44741
  if (!(valueObject instanceof Date) || Number.isNaN(valueObject.getTime()) || !maskOptions || typeof maskOptions.format !== 'function') {
44619
- console.debug('Invalid date object or mask options for formatting', { valueObject, maskOptions }); // eslint-disable-line no-console
44620
44742
  return undefined;
44621
44743
  }
44622
44744
 
@@ -44768,8 +44890,10 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44768
44890
  this.layout = 'classic';
44769
44891
  this.locale = 'en-US';
44770
44892
  this.max = undefined;
44893
+ this._maxObject = undefined;
44771
44894
  this.maxLength = undefined;
44772
44895
  this.min = undefined;
44896
+ this._minObject = undefined;
44773
44897
  this.minLength = undefined;
44774
44898
  this.required = false;
44775
44899
  this.onDark = false;
@@ -44777,6 +44901,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44777
44901
  this.size = 'lg';
44778
44902
  this.shape = 'classic';
44779
44903
  this.value = undefined;
44904
+ this._valueObject = undefined;
44780
44905
 
44781
44906
  this._initializePrivateDefaults();
44782
44907
  }
@@ -45316,7 +45441,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45316
45441
  * @returns {Date|undefined}
45317
45442
  */
45318
45443
  get valueObject() {
45319
- return this.value && dateFormatter$2.isValidDate(this.value) ? dateFormatter$2.stringToDateInstance(this.value) : undefined;
45444
+ return this._valueObject || this._computeDateObjectFallback(this.value);
45320
45445
  }
45321
45446
 
45322
45447
  /**
@@ -45324,7 +45449,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45324
45449
  * @returns {Date|undefined}
45325
45450
  */
45326
45451
  get minObject() {
45327
- return this.min && dateFormatter$2.isValidDate(this.min) ? dateFormatter$2.stringToDateInstance(this.min) : undefined;
45452
+ return this._minObject || this._computeDateObjectFallback(this.min);
45328
45453
  }
45329
45454
 
45330
45455
  /**
@@ -45332,7 +45457,50 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45332
45457
  * @returns {Date|undefined}
45333
45458
  */
45334
45459
  get maxObject() {
45335
- return this.max && dateFormatter$2.isValidDate(this.max) ? dateFormatter$2.stringToDateInstance(this.max) : undefined;
45460
+ return this._maxObject || this._computeDateObjectFallback(this.max);
45461
+ }
45462
+
45463
+ /**
45464
+ * Parses a date string into a Date object when the corresponding `_*Object`
45465
+ * field hasn't been synced yet by `updated()`. Returns undefined when the
45466
+ * input type/format isn't a full date or the string is not a valid date.
45467
+ *
45468
+ * Why this exists: a parent (datepicker) can call `inputN.validate()` from
45469
+ * inside its own `updated()` before this input's `updated()` has run
45470
+ * `syncDateValues()` — so `_valueObject`/`_maxObject` are still `undefined`
45471
+ * and range checks would otherwise silently no-op (flipping the result to
45472
+ * `valid` or `patternMismatch`).
45473
+ * @private
45474
+ * @param {string|undefined} dateStr - ISO date string from `value`/`min`/`max`.
45475
+ * @returns {Date|undefined}
45476
+ */
45477
+ _computeDateObjectFallback(dateStr) {
45478
+ if (!dateStr || !this.util || !this.util.isFullDateFormat(this.type, this.format)) {
45479
+ return undefined;
45480
+ }
45481
+ if (!dateFormatter$2.isValidDate(dateStr)) {
45482
+ return undefined;
45483
+ }
45484
+ return dateFormatter$2.stringToDateInstance(dateStr);
45485
+ }
45486
+
45487
+ /**
45488
+ * Internal setter for readonly date object properties.
45489
+ * @private
45490
+ * @param {'valueObject'|'minObject'|'maxObject'} propertyName - Public object property name.
45491
+ * @param {Date|undefined} propertyValue - Value to assign.
45492
+ * @returns {void}
45493
+ */
45494
+ setDateObjectProperty(propertyName, propertyValue) {
45495
+ const internalPropertyName = `_${propertyName}`;
45496
+ const previousValue = this[internalPropertyName];
45497
+
45498
+ if (previousValue === propertyValue) {
45499
+ return;
45500
+ }
45501
+
45502
+ this[internalPropertyName] = propertyValue;
45503
+ this.requestUpdate(propertyName, previousValue);
45336
45504
  }
45337
45505
 
45338
45506
  connectedCallback() {
@@ -45361,6 +45529,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45361
45529
  format: this.format
45362
45530
  });
45363
45531
  this.configureDataForType();
45532
+ this.syncDateValues();
45364
45533
  }
45365
45534
 
45366
45535
  disconnectedCallback() {
@@ -45380,6 +45549,15 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45380
45549
  this.wrapperElement.addEventListener('click', this.handleClick);
45381
45550
  }
45382
45551
 
45552
+ // add attribute for query selectors when auro-input is registered under a custom name
45553
+ // COVERAGE: the body of this branch is unreachable in WTR — connectedCallback
45554
+ // performs the same `setAttribute('auro-input', '')` earlier (see L665-667),
45555
+ // so by the time firstUpdated runs the attribute is already present and the
45556
+ // `!hasAttribute('auro-input')` guard is false. Retained as a defensive
45557
+ // safety net in case connectedCallback is ever short-circuited.
45558
+ if (this.tagName.toLowerCase() !== 'auro-input' && !this.hasAttribute('auro-input')) {
45559
+ this.setAttribute('auro-input', '');
45560
+ }
45383
45561
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
45384
45562
 
45385
45563
  // use validity message override if declared when initializing the component
@@ -45390,6 +45568,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45390
45568
  this.setCustomHelpTextMessage();
45391
45569
  this.configureAutoFormatting();
45392
45570
  this.configureDataForType();
45571
+ this.syncDateValues();
45393
45572
  }
45394
45573
 
45395
45574
  /**
@@ -45465,6 +45644,13 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45465
45644
 
45466
45645
  if (typeToI18n.includes(this.type)) {
45467
45646
  this.setCustomValidityForType = i18n$1(this.lang, this.type);
45647
+ // COVERAGE: this `else if` branch is unreachable in WTR. connectedCallback
45648
+ // (L682) calls configureDataForType, which at L1266-1268 assigns
45649
+ // `this.format = this.util.getDateMaskFromLocale().toLowerCase()` for any
45650
+ // type=date input whose `format` attribute is unset. That runs before
45651
+ // firstUpdated invokes setCustomHelpTextMessage, so `!this.format` is
45652
+ // always false here. Retained as a defensive fallback; the whole function
45653
+ // is @deprecated per AB#1557296 and slated for removal.
45468
45654
  } else if (!this.format && this.type === 'date') {
45469
45655
  this.setCustomValidityForType = i18n$1(this.lang, 'dateMMDDYYYY');
45470
45656
  } else if (this.dateFormatMap[this.format]) {
@@ -45526,6 +45712,8 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45526
45712
  this.configureDataForType();
45527
45713
  }
45528
45714
 
45715
+ this.syncDateValues(changedProperties);
45716
+
45529
45717
  if (changedProperties.has('value')) {
45530
45718
  if (this.value && this.value.length > 0) {
45531
45719
  this.hasValue = true;
@@ -45547,14 +45735,14 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45547
45735
 
45548
45736
  if (formattedValue !== this.inputElement.value) {
45549
45737
  this.skipNextProgrammaticInputEvent = true;
45550
- if (this.maskInstance && this.type !== 'date') {
45738
+ if (this.maskInstance && this.type === 'credit-card') {
45551
45739
  // Route through the mask so its _value and el.value stay in lock-step
45552
45740
  // (set value calls updateControl which writes el.value = displayValue).
45553
45741
  // Writing el.value directly leaves the mask thinking displayValue is
45554
- // stale; _saveSelection on the next focus/click then warns. Date is
45555
- // excluded because its formattedValue can be raw ISO when the calendar
45556
- // is invalid, and re-masking through mm/dd/yyyy would truncate it and
45557
- // flip validity from patternMismatch to tooShort.
45742
+ // stale; _saveSelection on the next focus/click then warns. Scoped to
45743
+ // credit-card so date's own formattedValue (raw ISO when calendar-invalid)
45744
+ // isn't re-masked through the mm/dd/yyyy mask, which would truncate it
45745
+ // and flip validity from patternMismatch to tooShort.
45558
45746
  this.maskInstance.value = formattedValue || '';
45559
45747
  } else if (formattedValue) {
45560
45748
  this.inputElement.value = formattedValue;
@@ -45596,65 +45784,120 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45596
45784
  }));
45597
45785
  }
45598
45786
 
45787
+
45788
+ /**
45789
+ * Synchronizes the ISO string values and Date object representations for date-related properties.
45790
+ * This keeps the model and display values aligned when either side changes.
45791
+ *
45792
+ * When a full date format is in use, this method updates `value`, `min`, and `max` from their corresponding
45793
+ * Date objects or vice versa, based on which properties have changed. It only runs when the current configuration
45794
+ * represents a full year/month/day date format.
45795
+ *
45796
+ * @param {Map<string, unknown>|undefined} [changedProperties=undefined] - Optional map of changed properties used to limit which values are synchronized.
45797
+ * @returns {void}
45798
+ * @private
45799
+ */
45800
+ syncDateValues(changedProperties = undefined) {
45801
+ if (!this.util.isFullDateFormat(this.type, this.format)) {
45802
+ return;
45803
+ }
45804
+
45805
+ this.syncSingleDateValue(changedProperties, 'valueObject', 'value');
45806
+ this.syncSingleDateValue(changedProperties, 'minObject', 'min');
45807
+ this.syncSingleDateValue(changedProperties, 'maxObject', 'max');
45808
+ }
45809
+
45810
+ /**
45811
+ * Synchronizes one date object/string property pair.
45812
+ * @private
45813
+ * @param {Map<string, unknown>|undefined} changedProperties - Map of changed properties from Lit.
45814
+ * @param {string} objectProperty - Date object property name.
45815
+ * @param {string} valueProperty - ISO string property name.
45816
+ * @returns {void}
45817
+ */
45818
+ syncSingleDateValue(changedProperties, objectProperty, valueProperty) {
45819
+ const objectPropertyChanged = !changedProperties || changedProperties.has(objectProperty);
45820
+
45821
+ // objectProperty wins over valueProperty when both changed
45822
+ if (objectPropertyChanged && this[objectProperty]) {
45823
+ this[valueProperty] = dateFormatter$2.toISOFormatString(this[objectProperty]);
45824
+ return;
45825
+ }
45826
+
45827
+ const valuePropertyChanged = !changedProperties || changedProperties.has(valueProperty);
45828
+ if (!valuePropertyChanged) {
45829
+ return;
45830
+ }
45831
+
45832
+ // when value is newly set to the same ISO string that corresponds to the existing Date object, do not clear the Date object (avoid unnecessary updates)
45833
+ if (
45834
+ changedProperties &&
45835
+ valueProperty === 'value' &&
45836
+ changedProperties.get('value') === undefined &&
45837
+ this[objectProperty] instanceof Date &&
45838
+ this[valueProperty] === dateFormatter$2.toISOFormatString(this[objectProperty])
45839
+ ) {
45840
+ return;
45841
+ }
45842
+
45843
+ if (dateFormatter$2.isValidDate(this[valueProperty])) {
45844
+ this.setDateObjectProperty(objectProperty, dateFormatter$2.stringToDateInstance(this[valueProperty]));
45845
+ } else {
45846
+ this.setDateObjectProperty(objectProperty, undefined);
45847
+ }
45848
+ }
45849
+
45599
45850
  /**
45600
45851
  * Sets up IMasks and logic based on auto-formatting requirements.
45601
45852
  * @private
45602
45853
  * @returns {void}
45603
45854
  */
45604
45855
  configureAutoFormatting() {
45605
- // _configuringMask gates two things: external re-entry into this method
45606
- // while setup is mid-flight (from property changes that call back here),
45607
- // and the accept/complete listeners below both need to ignore the mask
45608
- // events fired by our own value-restore step.
45856
+ // Re-entrancy guard. The patched-setter's synthetic input event (suppressed
45857
+ // by _configuringMask above) could otherwise trigger handleInput
45858
+ // processCreditCard configureAutoFormatting before the outer call's
45859
+ // set value has finished its alignCursor pass.
45609
45860
  if (this._configuringMask) return;
45610
45861
  this._configuringMask = true;
45611
45862
  try {
45612
- // Destroy any prior mask so IMask can attach fresh under the new format.
45613
- // Null the reference too — if the new maskOptions.mask is falsy (e.g.
45614
- // type switched from credit-card to text) the IMask() reassignment
45615
- // below is skipped, and downstream writes at line ~823 would otherwise
45616
- // route through the destroyed instance.
45617
45863
  if (this.maskInstance) {
45618
45864
  this.maskInstance.destroy();
45619
- this.maskInstance = null;
45620
45865
  }
45621
45866
 
45867
+ // Pass new format to util
45622
45868
  this.util.updateFormat(this.format);
45623
45869
 
45624
45870
  const maskOptions = this.util.getMaskOptions(this.type, this.format);
45625
45871
 
45626
45872
  if (this.inputElement && maskOptions.mask) {
45627
- // Capture the current display so it can be re-applied after IMask
45628
- // attaches. The restore at the bottom goes through maskInstance.value
45629
- // (not inputElement.value directly) so the mask's internal state and
45630
- // the input's displayed text stay in lock-step.
45631
- let existingValue = this.inputElement.value;
45632
45873
 
45633
- // Format-change case (e.g. locale switch): existingValue is the OLD
45634
- // mask's display string and may not parse under the new mask. When
45635
- // we have a valid date model, rebuild the display from valueObject
45636
- // (the canonical source) using the new mask's format function.
45874
+ // Stash and clear any existing value before IMask init.
45875
+ // IMask's constructor processes the current input value which requires
45876
+ // selection state clearing first avoids that scenario entirely.
45877
+ // When the format changes (e.g. locale switch) and we have a valid ISO
45878
+ // model value, compute the display string for the NEW format instead of
45879
+ // re-using the old display string, which may be invalid in the new mask.
45880
+ let existingValue = this.inputElement.value;
45637
45881
  if (
45638
45882
  this.util.isFullDateFormat(this.type, this.format) &&
45639
45883
  this.value &&
45640
- this.valueObject &&
45884
+ dateFormatter$2.isValidDate(this.value) &&
45885
+ this.valueObject instanceof Date &&
45886
+ !Number.isNaN(this.valueObject.getTime()) &&
45641
45887
  typeof maskOptions.format === 'function'
45642
45888
  ) {
45643
45889
  existingValue = maskOptions.format(this.valueObject);
45644
45890
  }
45645
45891
 
45646
- // Clear before IMask attaches so the constructor seeds an empty
45647
- // internal value. Otherwise IMask reads the stale unmasked string
45648
- // and emits a spurious 'accept' before the restore below runs.
45649
45892
  this.skipNextProgrammaticInputEvent = true;
45650
45893
  this.inputElement.value = '';
45651
45894
 
45652
45895
  this.maskInstance = IMask$2(this.inputElement, maskOptions);
45653
45896
 
45654
- // Mask fires 'accept' on every value change, including the restore
45655
- // step below. Skip events fired during configureAutoFormatting so
45656
- // we don't overwrite a value the parent just pushed.
45657
45897
  this.maskInstance.on('accept', () => {
45898
+ // Suppress propagation during configureAutoFormatting's own value-restoration
45899
+ // (line below) — the mask emits 'accept' on every value-set, including ours,
45900
+ // and we don't want to overwrite a value the parent just pushed.
45658
45901
  if (this._configuringMask) return;
45659
45902
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
45660
45903
  if (this.type === "date") {
@@ -45662,8 +45905,6 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45662
45905
  }
45663
45906
  });
45664
45907
 
45665
- // Mask fires 'complete' on the restore step below for any value that
45666
- // happens to be a complete match. Same setup-suppression as 'accept'.
45667
45908
  this.maskInstance.on('complete', () => {
45668
45909
  if (this._configuringMask) return;
45669
45910
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
@@ -45672,9 +45913,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45672
45913
  }
45673
45914
  });
45674
45915
 
45675
- // Write existingValue through the mask (not the input directly) so
45676
- // the mask reformats it under the new rules and keeps its internal
45677
- // _value aligned with the input's displayed text.
45916
+ // Restore the stashed value through IMask so it's properly masked
45678
45917
  if (existingValue) {
45679
45918
  this.maskInstance.value = existingValue;
45680
45919
  }
@@ -45842,6 +46081,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45842
46081
  */
45843
46082
  reset() {
45844
46083
  this.value = undefined;
46084
+ this.setDateObjectProperty('valueObject', undefined);
45845
46085
  this.validation.reset(this);
45846
46086
  }
45847
46087
 
@@ -45850,6 +46090,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45850
46090
  */
45851
46091
  clear() {
45852
46092
  this.value = undefined;
46093
+ this.setDateObjectProperty('valueObject', undefined);
45853
46094
  }
45854
46095
 
45855
46096
  /**
@@ -45887,6 +46128,12 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45887
46128
  */
45888
46129
  get placeholderStr() {
45889
46130
  if (!this.placeholder && this.type === 'date') {
46131
+ // COVERAGE: the `'MM/DD/YYYY'` literal fallback is unreachable in WTR.
46132
+ // connectedCallback (L682) calls configureDataForType, which at L1266-1268
46133
+ // assigns `this.format = this.util.getDateMaskFromLocale().toLowerCase()`
46134
+ // when type=date and format is unset. That runs before the first render
46135
+ // reads this getter, so the ternary's truthy arm always wins. Retained
46136
+ // as a defensive fallback for direct getter calls before connection.
45890
46137
  return this.format ? this.format.toUpperCase() : 'MM/DD/YYYY';
45891
46138
  }
45892
46139
  return this.placeholder || "";
@@ -46378,7 +46625,7 @@ let AuroHelpText$1$3 = class AuroHelpText extends i$3 {
46378
46625
  }
46379
46626
  };
46380
46627
 
46381
- var formkitVersion$7 = '202606231948';
46628
+ var formkitVersion$7 = '202606232113';
46382
46629
 
46383
46630
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
46384
46631
  // See LICENSE in the project root for license information.
@@ -51081,7 +51328,7 @@ let AuroHelpText$1$2 = class AuroHelpText extends i$3 {
51081
51328
  }
51082
51329
  };
51083
51330
 
51084
- var formkitVersion$1$2 = '202606231948';
51331
+ var formkitVersion$1$2 = '202606232113';
51085
51332
 
51086
51333
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
51087
51334
  // See LICENSE in the project root for license information.
@@ -55409,7 +55656,7 @@ let AuroHelpText$6 = class AuroHelpText extends i$3 {
55409
55656
  }
55410
55657
  };
55411
55658
 
55412
- var formkitVersion$6 = '202606231948';
55659
+ var formkitVersion$6 = '202606232113';
55413
55660
 
55414
55661
  let AuroElement$1$2 = class AuroElement extends i$3 {
55415
55662
  static get properties() {
@@ -59349,7 +59596,7 @@ let AuroHelpText$5 = class AuroHelpText extends i$3 {
59349
59596
  }
59350
59597
  };
59351
59598
 
59352
- var formkitVersion$5 = '202606231948';
59599
+ var formkitVersion$5 = '202606232113';
59353
59600
 
59354
59601
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
59355
59602
  // See LICENSE in the project root for license information.
@@ -61099,7 +61346,7 @@ let AuroHelpText$4 = class AuroHelpText extends i$3 {
61099
61346
  }
61100
61347
  };
61101
61348
 
61102
- var formkitVersion$4 = '202606231948';
61349
+ var formkitVersion$4 = '202606232113';
61103
61350
 
61104
61351
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
61105
61352
  // See LICENSE in the project root for license information.
@@ -62275,8 +62522,6 @@ function navigateArrow$1(component, direction, options = {}) {
62275
62522
  }
62276
62523
  }
62277
62524
 
62278
- /* eslint-disable no-underscore-dangle */
62279
-
62280
62525
  /**
62281
62526
  * Returns the clear button element from the active input's shadow
62282
62527
  * DOM, if available.
@@ -62312,9 +62557,11 @@ function isClearBtnFocused(ctx, clearBtn = getClearBtn(ctx)) {
62312
62557
  * @param {Object} menu - The menu component.
62313
62558
  */
62314
62559
  function reconcileMenuIndex(menu) {
62560
+ // eslint-disable-next-line no-underscore-dangle
62315
62561
  if (menu._index < 0 && menu.optionActive && menu.items) {
62316
62562
  const idx = menu.items.indexOf(menu.optionActive);
62317
62563
  if (idx >= 0) {
62564
+ // eslint-disable-next-line no-underscore-dangle
62318
62565
  menu._index = idx;
62319
62566
  }
62320
62567
  }
@@ -66314,7 +66561,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$3 {
66314
66561
  }
66315
66562
  };
66316
66563
 
66317
- var formkitVersion$2 = '202606231948';
66564
+ var formkitVersion$2 = '202606232113';
66318
66565
 
66319
66566
  let AuroElement$2$1 = class AuroElement extends i$3 {
66320
66567
  static get properties() {
@@ -78036,7 +78283,6 @@ class AuroInputUtilities {
78036
78283
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
78037
78284
 
78038
78285
  if (!(valueObject instanceof Date) || Number.isNaN(valueObject.getTime()) || !maskOptions || typeof maskOptions.format !== 'function') {
78039
- console.debug('Invalid date object or mask options for formatting', { valueObject, maskOptions }); // eslint-disable-line no-console
78040
78286
  return undefined;
78041
78287
  }
78042
78288
 
@@ -78188,8 +78434,10 @@ class BaseInput extends AuroElement$1$1 {
78188
78434
  this.layout = 'classic';
78189
78435
  this.locale = 'en-US';
78190
78436
  this.max = undefined;
78437
+ this._maxObject = undefined;
78191
78438
  this.maxLength = undefined;
78192
78439
  this.min = undefined;
78440
+ this._minObject = undefined;
78193
78441
  this.minLength = undefined;
78194
78442
  this.required = false;
78195
78443
  this.onDark = false;
@@ -78197,6 +78445,7 @@ class BaseInput extends AuroElement$1$1 {
78197
78445
  this.size = 'lg';
78198
78446
  this.shape = 'classic';
78199
78447
  this.value = undefined;
78448
+ this._valueObject = undefined;
78200
78449
 
78201
78450
  this._initializePrivateDefaults();
78202
78451
  }
@@ -78736,7 +78985,7 @@ class BaseInput extends AuroElement$1$1 {
78736
78985
  * @returns {Date|undefined}
78737
78986
  */
78738
78987
  get valueObject() {
78739
- return this.value && dateFormatter.isValidDate(this.value) ? dateFormatter.stringToDateInstance(this.value) : undefined;
78988
+ return this._valueObject || this._computeDateObjectFallback(this.value);
78740
78989
  }
78741
78990
 
78742
78991
  /**
@@ -78744,7 +78993,7 @@ class BaseInput extends AuroElement$1$1 {
78744
78993
  * @returns {Date|undefined}
78745
78994
  */
78746
78995
  get minObject() {
78747
- return this.min && dateFormatter.isValidDate(this.min) ? dateFormatter.stringToDateInstance(this.min) : undefined;
78996
+ return this._minObject || this._computeDateObjectFallback(this.min);
78748
78997
  }
78749
78998
 
78750
78999
  /**
@@ -78752,7 +79001,50 @@ class BaseInput extends AuroElement$1$1 {
78752
79001
  * @returns {Date|undefined}
78753
79002
  */
78754
79003
  get maxObject() {
78755
- return this.max && dateFormatter.isValidDate(this.max) ? dateFormatter.stringToDateInstance(this.max) : undefined;
79004
+ return this._maxObject || this._computeDateObjectFallback(this.max);
79005
+ }
79006
+
79007
+ /**
79008
+ * Parses a date string into a Date object when the corresponding `_*Object`
79009
+ * field hasn't been synced yet by `updated()`. Returns undefined when the
79010
+ * input type/format isn't a full date or the string is not a valid date.
79011
+ *
79012
+ * Why this exists: a parent (datepicker) can call `inputN.validate()` from
79013
+ * inside its own `updated()` before this input's `updated()` has run
79014
+ * `syncDateValues()` — so `_valueObject`/`_maxObject` are still `undefined`
79015
+ * and range checks would otherwise silently no-op (flipping the result to
79016
+ * `valid` or `patternMismatch`).
79017
+ * @private
79018
+ * @param {string|undefined} dateStr - ISO date string from `value`/`min`/`max`.
79019
+ * @returns {Date|undefined}
79020
+ */
79021
+ _computeDateObjectFallback(dateStr) {
79022
+ if (!dateStr || !this.util || !this.util.isFullDateFormat(this.type, this.format)) {
79023
+ return undefined;
79024
+ }
79025
+ if (!dateFormatter.isValidDate(dateStr)) {
79026
+ return undefined;
79027
+ }
79028
+ return dateFormatter.stringToDateInstance(dateStr);
79029
+ }
79030
+
79031
+ /**
79032
+ * Internal setter for readonly date object properties.
79033
+ * @private
79034
+ * @param {'valueObject'|'minObject'|'maxObject'} propertyName - Public object property name.
79035
+ * @param {Date|undefined} propertyValue - Value to assign.
79036
+ * @returns {void}
79037
+ */
79038
+ setDateObjectProperty(propertyName, propertyValue) {
79039
+ const internalPropertyName = `_${propertyName}`;
79040
+ const previousValue = this[internalPropertyName];
79041
+
79042
+ if (previousValue === propertyValue) {
79043
+ return;
79044
+ }
79045
+
79046
+ this[internalPropertyName] = propertyValue;
79047
+ this.requestUpdate(propertyName, previousValue);
78756
79048
  }
78757
79049
 
78758
79050
  connectedCallback() {
@@ -78781,6 +79073,7 @@ class BaseInput extends AuroElement$1$1 {
78781
79073
  format: this.format
78782
79074
  });
78783
79075
  this.configureDataForType();
79076
+ this.syncDateValues();
78784
79077
  }
78785
79078
 
78786
79079
  disconnectedCallback() {
@@ -78800,6 +79093,15 @@ class BaseInput extends AuroElement$1$1 {
78800
79093
  this.wrapperElement.addEventListener('click', this.handleClick);
78801
79094
  }
78802
79095
 
79096
+ // add attribute for query selectors when auro-input is registered under a custom name
79097
+ // COVERAGE: the body of this branch is unreachable in WTR — connectedCallback
79098
+ // performs the same `setAttribute('auro-input', '')` earlier (see L665-667),
79099
+ // so by the time firstUpdated runs the attribute is already present and the
79100
+ // `!hasAttribute('auro-input')` guard is false. Retained as a defensive
79101
+ // safety net in case connectedCallback is ever short-circuited.
79102
+ if (this.tagName.toLowerCase() !== 'auro-input' && !this.hasAttribute('auro-input')) {
79103
+ this.setAttribute('auro-input', '');
79104
+ }
78803
79105
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
78804
79106
 
78805
79107
  // use validity message override if declared when initializing the component
@@ -78810,6 +79112,7 @@ class BaseInput extends AuroElement$1$1 {
78810
79112
  this.setCustomHelpTextMessage();
78811
79113
  this.configureAutoFormatting();
78812
79114
  this.configureDataForType();
79115
+ this.syncDateValues();
78813
79116
  }
78814
79117
 
78815
79118
  /**
@@ -78885,6 +79188,13 @@ class BaseInput extends AuroElement$1$1 {
78885
79188
 
78886
79189
  if (typeToI18n.includes(this.type)) {
78887
79190
  this.setCustomValidityForType = i18n(this.lang, this.type);
79191
+ // COVERAGE: this `else if` branch is unreachable in WTR. connectedCallback
79192
+ // (L682) calls configureDataForType, which at L1266-1268 assigns
79193
+ // `this.format = this.util.getDateMaskFromLocale().toLowerCase()` for any
79194
+ // type=date input whose `format` attribute is unset. That runs before
79195
+ // firstUpdated invokes setCustomHelpTextMessage, so `!this.format` is
79196
+ // always false here. Retained as a defensive fallback; the whole function
79197
+ // is @deprecated per AB#1557296 and slated for removal.
78888
79198
  } else if (!this.format && this.type === 'date') {
78889
79199
  this.setCustomValidityForType = i18n(this.lang, 'dateMMDDYYYY');
78890
79200
  } else if (this.dateFormatMap[this.format]) {
@@ -78946,6 +79256,8 @@ class BaseInput extends AuroElement$1$1 {
78946
79256
  this.configureDataForType();
78947
79257
  }
78948
79258
 
79259
+ this.syncDateValues(changedProperties);
79260
+
78949
79261
  if (changedProperties.has('value')) {
78950
79262
  if (this.value && this.value.length > 0) {
78951
79263
  this.hasValue = true;
@@ -78967,14 +79279,14 @@ class BaseInput extends AuroElement$1$1 {
78967
79279
 
78968
79280
  if (formattedValue !== this.inputElement.value) {
78969
79281
  this.skipNextProgrammaticInputEvent = true;
78970
- if (this.maskInstance && this.type !== 'date') {
79282
+ if (this.maskInstance && this.type === 'credit-card') {
78971
79283
  // Route through the mask so its _value and el.value stay in lock-step
78972
79284
  // (set value calls updateControl which writes el.value = displayValue).
78973
79285
  // Writing el.value directly leaves the mask thinking displayValue is
78974
- // stale; _saveSelection on the next focus/click then warns. Date is
78975
- // excluded because its formattedValue can be raw ISO when the calendar
78976
- // is invalid, and re-masking through mm/dd/yyyy would truncate it and
78977
- // flip validity from patternMismatch to tooShort.
79286
+ // stale; _saveSelection on the next focus/click then warns. Scoped to
79287
+ // credit-card so date's own formattedValue (raw ISO when calendar-invalid)
79288
+ // isn't re-masked through the mm/dd/yyyy mask, which would truncate it
79289
+ // and flip validity from patternMismatch to tooShort.
78978
79290
  this.maskInstance.value = formattedValue || '';
78979
79291
  } else if (formattedValue) {
78980
79292
  this.inputElement.value = formattedValue;
@@ -79016,65 +79328,120 @@ class BaseInput extends AuroElement$1$1 {
79016
79328
  }));
79017
79329
  }
79018
79330
 
79331
+
79332
+ /**
79333
+ * Synchronizes the ISO string values and Date object representations for date-related properties.
79334
+ * This keeps the model and display values aligned when either side changes.
79335
+ *
79336
+ * When a full date format is in use, this method updates `value`, `min`, and `max` from their corresponding
79337
+ * Date objects or vice versa, based on which properties have changed. It only runs when the current configuration
79338
+ * represents a full year/month/day date format.
79339
+ *
79340
+ * @param {Map<string, unknown>|undefined} [changedProperties=undefined] - Optional map of changed properties used to limit which values are synchronized.
79341
+ * @returns {void}
79342
+ * @private
79343
+ */
79344
+ syncDateValues(changedProperties = undefined) {
79345
+ if (!this.util.isFullDateFormat(this.type, this.format)) {
79346
+ return;
79347
+ }
79348
+
79349
+ this.syncSingleDateValue(changedProperties, 'valueObject', 'value');
79350
+ this.syncSingleDateValue(changedProperties, 'minObject', 'min');
79351
+ this.syncSingleDateValue(changedProperties, 'maxObject', 'max');
79352
+ }
79353
+
79354
+ /**
79355
+ * Synchronizes one date object/string property pair.
79356
+ * @private
79357
+ * @param {Map<string, unknown>|undefined} changedProperties - Map of changed properties from Lit.
79358
+ * @param {string} objectProperty - Date object property name.
79359
+ * @param {string} valueProperty - ISO string property name.
79360
+ * @returns {void}
79361
+ */
79362
+ syncSingleDateValue(changedProperties, objectProperty, valueProperty) {
79363
+ const objectPropertyChanged = !changedProperties || changedProperties.has(objectProperty);
79364
+
79365
+ // objectProperty wins over valueProperty when both changed
79366
+ if (objectPropertyChanged && this[objectProperty]) {
79367
+ this[valueProperty] = dateFormatter.toISOFormatString(this[objectProperty]);
79368
+ return;
79369
+ }
79370
+
79371
+ const valuePropertyChanged = !changedProperties || changedProperties.has(valueProperty);
79372
+ if (!valuePropertyChanged) {
79373
+ return;
79374
+ }
79375
+
79376
+ // when value is newly set to the same ISO string that corresponds to the existing Date object, do not clear the Date object (avoid unnecessary updates)
79377
+ if (
79378
+ changedProperties &&
79379
+ valueProperty === 'value' &&
79380
+ changedProperties.get('value') === undefined &&
79381
+ this[objectProperty] instanceof Date &&
79382
+ this[valueProperty] === dateFormatter.toISOFormatString(this[objectProperty])
79383
+ ) {
79384
+ return;
79385
+ }
79386
+
79387
+ if (dateFormatter.isValidDate(this[valueProperty])) {
79388
+ this.setDateObjectProperty(objectProperty, dateFormatter.stringToDateInstance(this[valueProperty]));
79389
+ } else {
79390
+ this.setDateObjectProperty(objectProperty, undefined);
79391
+ }
79392
+ }
79393
+
79019
79394
  /**
79020
79395
  * Sets up IMasks and logic based on auto-formatting requirements.
79021
79396
  * @private
79022
79397
  * @returns {void}
79023
79398
  */
79024
79399
  configureAutoFormatting() {
79025
- // _configuringMask gates two things: external re-entry into this method
79026
- // while setup is mid-flight (from property changes that call back here),
79027
- // and the accept/complete listeners below both need to ignore the mask
79028
- // events fired by our own value-restore step.
79400
+ // Re-entrancy guard. The patched-setter's synthetic input event (suppressed
79401
+ // by _configuringMask above) could otherwise trigger handleInput
79402
+ // processCreditCard configureAutoFormatting before the outer call's
79403
+ // set value has finished its alignCursor pass.
79029
79404
  if (this._configuringMask) return;
79030
79405
  this._configuringMask = true;
79031
79406
  try {
79032
- // Destroy any prior mask so IMask can attach fresh under the new format.
79033
- // Null the reference too — if the new maskOptions.mask is falsy (e.g.
79034
- // type switched from credit-card to text) the IMask() reassignment
79035
- // below is skipped, and downstream writes at line ~823 would otherwise
79036
- // route through the destroyed instance.
79037
79407
  if (this.maskInstance) {
79038
79408
  this.maskInstance.destroy();
79039
- this.maskInstance = null;
79040
79409
  }
79041
79410
 
79411
+ // Pass new format to util
79042
79412
  this.util.updateFormat(this.format);
79043
79413
 
79044
79414
  const maskOptions = this.util.getMaskOptions(this.type, this.format);
79045
79415
 
79046
79416
  if (this.inputElement && maskOptions.mask) {
79047
- // Capture the current display so it can be re-applied after IMask
79048
- // attaches. The restore at the bottom goes through maskInstance.value
79049
- // (not inputElement.value directly) so the mask's internal state and
79050
- // the input's displayed text stay in lock-step.
79051
- let existingValue = this.inputElement.value;
79052
79417
 
79053
- // Format-change case (e.g. locale switch): existingValue is the OLD
79054
- // mask's display string and may not parse under the new mask. When
79055
- // we have a valid date model, rebuild the display from valueObject
79056
- // (the canonical source) using the new mask's format function.
79418
+ // Stash and clear any existing value before IMask init.
79419
+ // IMask's constructor processes the current input value which requires
79420
+ // selection state clearing first avoids that scenario entirely.
79421
+ // When the format changes (e.g. locale switch) and we have a valid ISO
79422
+ // model value, compute the display string for the NEW format instead of
79423
+ // re-using the old display string, which may be invalid in the new mask.
79424
+ let existingValue = this.inputElement.value;
79057
79425
  if (
79058
79426
  this.util.isFullDateFormat(this.type, this.format) &&
79059
79427
  this.value &&
79060
- this.valueObject &&
79428
+ dateFormatter.isValidDate(this.value) &&
79429
+ this.valueObject instanceof Date &&
79430
+ !Number.isNaN(this.valueObject.getTime()) &&
79061
79431
  typeof maskOptions.format === 'function'
79062
79432
  ) {
79063
79433
  existingValue = maskOptions.format(this.valueObject);
79064
79434
  }
79065
79435
 
79066
- // Clear before IMask attaches so the constructor seeds an empty
79067
- // internal value. Otherwise IMask reads the stale unmasked string
79068
- // and emits a spurious 'accept' before the restore below runs.
79069
79436
  this.skipNextProgrammaticInputEvent = true;
79070
79437
  this.inputElement.value = '';
79071
79438
 
79072
79439
  this.maskInstance = IMask(this.inputElement, maskOptions);
79073
79440
 
79074
- // Mask fires 'accept' on every value change, including the restore
79075
- // step below. Skip events fired during configureAutoFormatting so
79076
- // we don't overwrite a value the parent just pushed.
79077
79441
  this.maskInstance.on('accept', () => {
79442
+ // Suppress propagation during configureAutoFormatting's own value-restoration
79443
+ // (line below) — the mask emits 'accept' on every value-set, including ours,
79444
+ // and we don't want to overwrite a value the parent just pushed.
79078
79445
  if (this._configuringMask) return;
79079
79446
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
79080
79447
  if (this.type === "date") {
@@ -79082,8 +79449,6 @@ class BaseInput extends AuroElement$1$1 {
79082
79449
  }
79083
79450
  });
79084
79451
 
79085
- // Mask fires 'complete' on the restore step below for any value that
79086
- // happens to be a complete match. Same setup-suppression as 'accept'.
79087
79452
  this.maskInstance.on('complete', () => {
79088
79453
  if (this._configuringMask) return;
79089
79454
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
@@ -79092,9 +79457,7 @@ class BaseInput extends AuroElement$1$1 {
79092
79457
  }
79093
79458
  });
79094
79459
 
79095
- // Write existingValue through the mask (not the input directly) so
79096
- // the mask reformats it under the new rules and keeps its internal
79097
- // _value aligned with the input's displayed text.
79460
+ // Restore the stashed value through IMask so it's properly masked
79098
79461
  if (existingValue) {
79099
79462
  this.maskInstance.value = existingValue;
79100
79463
  }
@@ -79262,6 +79625,7 @@ class BaseInput extends AuroElement$1$1 {
79262
79625
  */
79263
79626
  reset() {
79264
79627
  this.value = undefined;
79628
+ this.setDateObjectProperty('valueObject', undefined);
79265
79629
  this.validation.reset(this);
79266
79630
  }
79267
79631
 
@@ -79270,6 +79634,7 @@ class BaseInput extends AuroElement$1$1 {
79270
79634
  */
79271
79635
  clear() {
79272
79636
  this.value = undefined;
79637
+ this.setDateObjectProperty('valueObject', undefined);
79273
79638
  }
79274
79639
 
79275
79640
  /**
@@ -79307,6 +79672,12 @@ class BaseInput extends AuroElement$1$1 {
79307
79672
  */
79308
79673
  get placeholderStr() {
79309
79674
  if (!this.placeholder && this.type === 'date') {
79675
+ // COVERAGE: the `'MM/DD/YYYY'` literal fallback is unreachable in WTR.
79676
+ // connectedCallback (L682) calls configureDataForType, which at L1266-1268
79677
+ // assigns `this.format = this.util.getDateMaskFromLocale().toLowerCase()`
79678
+ // when type=date and format is unset. That runs before the first render
79679
+ // reads this getter, so the ternary's truthy arm always wins. Retained
79680
+ // as a defensive fallback for direct getter calls before connection.
79310
79681
  return this.format ? this.format.toUpperCase() : 'MM/DD/YYYY';
79311
79682
  }
79312
79683
  return this.placeholder || "";
@@ -79798,7 +80169,7 @@ let AuroHelpText$1$1 = class AuroHelpText extends i$3 {
79798
80169
  }
79799
80170
  };
79800
80171
 
79801
- var formkitVersion$1$1 = '202606231948';
80172
+ var formkitVersion$1$1 = '202606232113';
79802
80173
 
79803
80174
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
79804
80175
  // See LICENSE in the project root for license information.
@@ -80919,7 +81290,7 @@ let AuroBibtemplate$1 = class AuroBibtemplate extends i$3 {
80919
81290
  }
80920
81291
  };
80921
81292
 
80922
- var formkitVersion$3 = '202606231948';
81293
+ var formkitVersion$3 = '202606232113';
80923
81294
 
80924
81295
  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}`;
80925
81296
 
@@ -81906,7 +82277,7 @@ class AuroCombobox extends AuroElement$3 {
81906
82277
  if (this.menu) {
81907
82278
  this.menu.matchWord = normalizeFilterValue(this.input.value);
81908
82279
  }
81909
- const label = getOptionLabel(this.menu.optionSelected);
82280
+ const label = getOptionLabel(this.menu.optionSelected) || this.menu.currentLabel;
81910
82281
  this.updateTriggerTextDisplay(label || this.value);
81911
82282
  }
81912
82283
 
@@ -81920,9 +82291,40 @@ class AuroCombobox extends AuroElement$3 {
81920
82291
  // in suggestion mode, do not override input value if no selection has been made and the input currently has focus
81921
82292
  const isInputFocusedWithNoSelection = !this.menu.value && (this.input.matches(':focus-within') || (this.inputInBib && this.inputInBib.matches(':focus-within')));
81922
82293
 
81923
- const suppressed = this.persistInput || (this.behavior === 'suggestion' && isInputFocusedWithNoSelection);
81924
- if (!suppressed) {
81925
- this.syncInputValuesAcrossTriggerAndBib(label || this.value);
82294
+ if (!this.persistInput && !(this.behavior === 'suggestion' && isInputFocusedWithNoSelection)) {
82295
+ const nextValue = label || this.value;
82296
+ // Only set the flag when there's an actual write to suppress —
82297
+ // syncValuesAndStates re-enters here during typing when both inputs
82298
+ // already match, and a no-op flag flip would make the bib branch's
82299
+ // bail eat legitimate user-input events.
82300
+ const triggerNeedsSync = this.input.value !== nextValue;
82301
+ const bibNeedsSync = Boolean(this.inputInBib && this.inputInBib !== this.input && this.inputInBib.value !== nextValue);
82302
+ if (triggerNeedsSync || bibNeedsSync) {
82303
+ this._syncingDisplayValue = true;
82304
+ if (triggerNeedsSync) {
82305
+ this.input.value = nextValue;
82306
+ }
82307
+ if (bibNeedsSync) {
82308
+ this.inputInBib.value = nextValue;
82309
+ }
82310
+ const pending = [];
82311
+ if (triggerNeedsSync) {
82312
+ pending.push(this.input.updateComplete);
82313
+ }
82314
+ if (bibNeedsSync) {
82315
+ pending.push(this.inputInBib.updateComplete);
82316
+ }
82317
+ Promise.all(pending).then(() => {
82318
+ // imask reasserts otherwise, and handleBlur reverts to its stale value.
82319
+ if (triggerNeedsSync && this.input.maskInstance && typeof this.input.maskInstance.updateValue === 'function') {
82320
+ this.input.maskInstance.updateValue();
82321
+ }
82322
+ if (bibNeedsSync && this.inputInBib && this.inputInBib.maskInstance && typeof this.inputInBib.maskInstance.updateValue === 'function') {
82323
+ this.inputInBib.maskInstance.updateValue();
82324
+ }
82325
+ this._syncingDisplayValue = false;
82326
+ });
82327
+ }
81926
82328
  }
81927
82329
 
81928
82330
  // update the displayValue in the trigger if displayValue slot content is present
@@ -81950,48 +82352,6 @@ class AuroCombobox extends AuroElement$3 {
81950
82352
  this.requestUpdate();
81951
82353
  }
81952
82354
 
81953
- /**
81954
- * Writes nextValue to the trigger input and the bib input when their current
81955
- * value differs, then re-asserts imask after Lit's update flushes.
81956
- * @param {string} nextValue - The value to write to both inputs.
81957
- * @returns {Promise<void> | null} Promise that resolves after the inputs flush,
81958
- * or null when no sync was needed (so callers can skip post-flush work).
81959
- * @private
81960
- */
81961
- syncInputValuesAcrossTriggerAndBib(nextValue) {
81962
- // Only set the flag when there's an actual write to suppress —
81963
- // syncValuesAndStates re-enters here during typing when both inputs
81964
- // already match, and a no-op flag flip would make the bib branch's
81965
- // bail eat legitimate user-input events.
81966
- const triggerNeedsSync = this.input.value !== nextValue;
81967
- const bibNeedsSync = this.inputInBib.value !== nextValue;
81968
- if (!triggerNeedsSync && !bibNeedsSync) {
81969
- return null;
81970
- }
81971
-
81972
- this._syncingDisplayValue = true;
81973
-
81974
- const pending = [];
81975
- if (triggerNeedsSync) {
81976
- this.input.value = nextValue;
81977
- pending.push(this.input.updateComplete);
81978
- }
81979
- if (bibNeedsSync) {
81980
- this.inputInBib.value = nextValue;
81981
- pending.push(this.inputInBib.updateComplete);
81982
- }
81983
- return Promise.all(pending).then(() => {
81984
- // imask reasserts otherwise, and handleBlur reverts to its stale value.
81985
- if (triggerNeedsSync && this.input.maskInstance && typeof this.input.maskInstance.updateValue === 'function') {
81986
- this.input.maskInstance.updateValue();
81987
- }
81988
- if (bibNeedsSync && this.inputInBib && this.inputInBib.maskInstance && typeof this.inputInBib.maskInstance.updateValue === 'function') {
81989
- this.inputInBib.maskInstance.updateValue();
81990
- }
81991
- this._syncingDisplayValue = false;
81992
- });
81993
- }
81994
-
81995
82355
  /**
81996
82356
  * Processes hidden state of all menu options and determines if there are any available options not hidden.
81997
82357
  * @private
@@ -82019,9 +82379,9 @@ class AuroCombobox extends AuroElement$3 {
82019
82379
  this.syncValuesAndStates();
82020
82380
  }
82021
82381
 
82022
- // Re-activate when optionActive is not in the current scrollable viewport,
82023
- // or when _index has been reset (e.g. by clearSelection in an async update)
82024
- // so that makeSelection() can find the correct option.
82382
+ // Re-activate when optionActive is no longer visible, or when _index has
82383
+ // been reset (e.g. by clearSelection in an async update) so that
82384
+ // makeSelection() can find the correct option.
82025
82385
  if (!this.availableOptions.includes(this.menu.optionActive) || this.menu._index < 0) {
82026
82386
  this.activateFirstEnabledAvailableOption();
82027
82387
  }
@@ -82155,25 +82515,28 @@ class AuroCombobox extends AuroElement$3 {
82155
82515
 
82156
82516
  guardTouchPassthrough$1(this.menu);
82157
82517
 
82158
- // showModal() takes focus away from the trigger. Early focus once
82159
- // the dialog has painted; the shared doubleRaf below is the fallback
82160
- // for when the dialog needs an extra frame and also clears the
82161
- // validation guard.
82518
+ // The dialog's showModal() steals focus from the trigger.
82519
+ // A single rAF is enough for the dialog DOM to be painted and
82520
+ // focusable, then doubleRaf finalizes the transition.
82162
82521
  requestAnimationFrame(() => {
82163
82522
  this.setInputFocus();
82164
82523
  });
82165
- }
82166
- // else (desktop popover-open): Chrome resets the trigger caret to
82167
- // [0, 0] when its floating <label for="…"> overlay receives focus.
82168
- // The shared doubleRaf below parks the caret back at end-of-text
82169
- // after the dropdown layout settles.
82170
-
82171
- doubleRaf$1(() => {
82172
- this.setInputFocus();
82173
- if (this._inFullscreenTransition) {
82524
+
82525
+ doubleRaf$1(() => {
82526
+ this.setInputFocus();
82174
82527
  this._inFullscreenTransition = false;
82175
- }
82176
- });
82528
+ });
82529
+ } else {
82530
+ // Desktop popover-open: restore the trigger caret to end-of-text.
82531
+ // Clicking the trigger lands on auro-input's floating <label for="…">
82532
+ // overlay; Chrome resets the native input's selection to [0, 0] on
82533
+ // label-focus before any JS runs. setInputFocus()'s non-fullscreen
82534
+ // branch parks the caret at end. doubleRaf lets the dropdown layout
82535
+ // settle first, matching the fullscreen branch timing.
82536
+ doubleRaf$1(() => {
82537
+ this.setInputFocus();
82538
+ });
82539
+ }
82177
82540
  }
82178
82541
  });
82179
82542
 
@@ -82384,7 +82747,7 @@ class AuroCombobox extends AuroElement$3 {
82384
82747
  if (this.menu.optionSelected) {
82385
82748
  const selected = this.menu.optionSelected;
82386
82749
 
82387
- if (this.optionSelected !== selected) {
82750
+ if (!this.optionSelected || this.optionSelected !== selected) {
82388
82751
  this.optionSelected = selected;
82389
82752
  }
82390
82753
 
@@ -82397,7 +82760,7 @@ class AuroCombobox extends AuroElement$3 {
82397
82760
  }
82398
82761
 
82399
82762
  // Update display
82400
- this.updateTriggerTextDisplay(getOptionLabel(this.optionSelected));
82763
+ this.updateTriggerTextDisplay(getOptionLabel(this.optionSelected) || this.menu.value);
82401
82764
 
82402
82765
  // Update match word for filtering
82403
82766
  const trimmedInput = normalizeFilterValue(this.input.value);
@@ -82413,22 +82776,13 @@ class AuroCombobox extends AuroElement$3 {
82413
82776
  this.hideBib();
82414
82777
  }
82415
82778
 
82416
- // Move focus to the clear button when the user makes a selection.
82417
- if (!isEcho && this.menu.value !== undefined) {
82418
- this.setClearBtnFocus();
82419
- }
82420
-
82421
82779
  // Announce the selection after the dropdown closes so it isn't
82422
82780
  // overridden by VoiceOver's "collapsed" announcement from aria-expanded.
82423
- // Skip when there's no selected value (e.g. menu.clearSelection() from
82424
- // the unmatched-value path), otherwise VoiceOver reads "undefined".
82425
82781
  const selectedValue = this.menu.value;
82426
- if (selectedValue) {
82427
- const announcementDelay = 300;
82428
- setTimeout(() => {
82429
- announceToScreenReader$1(this._getAnnouncementRoot(), `${selectedValue}, selected`);
82430
- }, announcementDelay);
82431
- }
82782
+ const announcementDelay = 300;
82783
+ setTimeout(() => {
82784
+ announceToScreenReader$1(this._getAnnouncementRoot(), `${selectedValue}, selected`);
82785
+ }, announcementDelay);
82432
82786
  }
82433
82787
 
82434
82788
  // Programmatic value syncs leave availableOptions stale because
@@ -82442,6 +82796,18 @@ class AuroCombobox extends AuroElement$3 {
82442
82796
  this._programmaticFilterRefresh = false;
82443
82797
  }, 0);
82444
82798
  }
82799
+
82800
+ // base-input skips auto-validate when focus is inside its own shadow,
82801
+ // which it is after setTriggerInputFocus — re-run so prior tooShort
82802
+ // clears. processCreditCard reasserts errorMessage on every render.
82803
+ if (!isEcho && this.menu.optionSelected && this.input.validate) {
82804
+ this.input.updateComplete.then(() => {
82805
+ this.input.validate(true);
82806
+ if (this.input.validity === 'valid') {
82807
+ this.input.errorMessage = '';
82808
+ }
82809
+ });
82810
+ }
82445
82811
  });
82446
82812
 
82447
82813
  this.menu.addEventListener('auroMenu-customEventFired', () => {
@@ -82776,7 +83142,15 @@ class AuroCombobox extends AuroElement$3 {
82776
83142
  this.menu.value = undefined;
82777
83143
  this.validation.reset(this);
82778
83144
  this.touched = false;
83145
+ // Force validity back to the cleared state. validation.reset() calls
83146
+ // validate() at the end, and (post-credit-card-fix) the trigger input's
83147
+ // residual validity may still be copied into the combobox by the
83148
+ // auroInputElements loop. Explicitly clear here so reset() actually
83149
+ // leaves the component in a "no validity" state.
82779
83150
  this.validity = undefined;
83151
+ this.errorMessage = '';
83152
+ this.input.validity = undefined;
83153
+ this.input.errorMessage = '';
82780
83154
  }
82781
83155
 
82782
83156
  /**
@@ -82829,27 +83203,52 @@ class AuroCombobox extends AuroElement$3 {
82829
83203
  this.input.value = this.value;
82830
83204
  }
82831
83205
 
82832
- // Sync menu.value only when an option actually matches, or when filter
82833
- // mode needs setMenuValue to dispatch auroMenu-selectValueFailure (the
82834
- // listener at line 1206 clears combobox.value, mirroring select's
82835
- // pattern). Otherwise sync the input display for freeform values.
83206
+ // Sync menu.value only when an option actually matches; otherwise clear it.
82836
83207
  if (this.menu.options && this.menu.options.length > 0) {
82837
- if (this.menu.options.some((opt) => opt.value === this.value) || this.behavior === 'filter') {
83208
+ if (this.menu.options.some((opt) => opt.value === this.value)) {
83209
+ this.setMenuValue(this.value);
83210
+ } else if (this.behavior === 'filter') {
83211
+ // In filter mode, freeform values aren't allowed. Push the unmatched
83212
+ // value through setMenuValue so menu dispatches auroMenu-selectValueFailure
83213
+ // and the listener at line 1206 clears combobox.value (mirrors select's
83214
+ // pattern). Bypassing setMenuValue here would skip the failure cascade.
82838
83215
  this.setMenuValue(this.value);
82839
83216
  } else {
82840
- // Clear menu.value AND menu.optionSelected together. Clearing only
82841
- // menu.value leaves the previously-selected option element pinned
82842
- // as menu.optionSelected; a later auroMenu-selectedOption event
82843
- // would then write its stale .value back into combobox.value.
82844
- if (this.menu.value || this.menu.optionSelected) {
82845
- this.menu.clearSelection();
83217
+ if (this.menu.value) {
83218
+ this.menu.value = undefined;
82846
83219
  }
82847
- // Suggestion-mode freeform value: sync the trigger + bib to show it,
82848
- // then refresh the filter once the inputs flush (handleInputValueChange
82849
- // bailed on _syncingDisplayValue).
82850
- const syncPromise = this.syncInputValuesAcrossTriggerAndBib(this.value || '');
82851
- if (syncPromise) {
82852
- syncPromise.then(() => {
83220
+ // Sync the display for programmatic freeform value changes (e.g. the
83221
+ // swap-values pattern). Guard with _syncingDisplayValue so that the
83222
+ // re-entrant input event from base-input.notifyValueChanged() is
83223
+ // ignored by handleInputValueChange. Skip the sync when input already
83224
+ // matches to avoid spurious events during the normal typing path.
83225
+ const nextValue = this.value || '';
83226
+ const triggerNeedsSync = this.input.value !== nextValue;
83227
+ const bibNeedsSync = Boolean(this.inputInBib && this.inputInBib !== this.input && this.inputInBib.value !== nextValue);
83228
+ if (triggerNeedsSync || bibNeedsSync) {
83229
+ this._syncingDisplayValue = true;
83230
+ if (triggerNeedsSync) {
83231
+ this.input.value = nextValue;
83232
+ }
83233
+ if (bibNeedsSync) {
83234
+ this.inputInBib.value = nextValue;
83235
+ }
83236
+ const pending = [];
83237
+ if (triggerNeedsSync) {
83238
+ pending.push(this.input.updateComplete);
83239
+ }
83240
+ if (bibNeedsSync) {
83241
+ pending.push(this.inputInBib.updateComplete);
83242
+ }
83243
+ Promise.all(pending).then(() => {
83244
+ if (triggerNeedsSync && this.input.maskInstance && typeof this.input.maskInstance.updateValue === 'function') {
83245
+ this.input.maskInstance.updateValue();
83246
+ }
83247
+ if (bibNeedsSync && this.inputInBib && this.inputInBib.maskInstance && typeof this.inputInBib.maskInstance.updateValue === 'function') {
83248
+ this.inputInBib.maskInstance.updateValue();
83249
+ }
83250
+ this._syncingDisplayValue = false;
83251
+ // handleInputValueChange bailed on the flag — refresh the filter.
82853
83252
  this._programmaticFilterRefresh = true;
82854
83253
  this.handleMenuOptions();
82855
83254
  setTimeout(() => {
@@ -89682,7 +90081,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
89682
90081
  }
89683
90082
  };
89684
90083
 
89685
- var formkitVersion$1 = '202606231948';
90084
+ var formkitVersion$1 = '202606232113';
89686
90085
 
89687
90086
  class AuroElement extends i$3 {
89688
90087
  static get properties() {
@@ -91703,7 +92102,7 @@ class AuroHelpText extends i$3 {
91703
92102
  }
91704
92103
  }
91705
92104
 
91706
- var formkitVersion = '202606231948';
92105
+ var formkitVersion = '202606232113';
91707
92106
 
91708
92107
  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}`;
91709
92108