@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
@@ -10460,7 +10460,6 @@ let AuroInputUtilities$3 = class AuroInputUtilities {
10460
10460
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
10461
10461
 
10462
10462
  if (!(valueObject instanceof Date) || Number.isNaN(valueObject.getTime()) || !maskOptions || typeof maskOptions.format !== 'function') {
10463
- console.debug('Invalid date object or mask options for formatting', { valueObject, maskOptions }); // eslint-disable-line no-console
10464
10463
  return undefined;
10465
10464
  }
10466
10465
 
@@ -10612,8 +10611,10 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
10612
10611
  this.layout = 'classic';
10613
10612
  this.locale = 'en-US';
10614
10613
  this.max = undefined;
10614
+ this._maxObject = undefined;
10615
10615
  this.maxLength = undefined;
10616
10616
  this.min = undefined;
10617
+ this._minObject = undefined;
10617
10618
  this.minLength = undefined;
10618
10619
  this.required = false;
10619
10620
  this.onDark = false;
@@ -10621,6 +10622,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
10621
10622
  this.size = 'lg';
10622
10623
  this.shape = 'classic';
10623
10624
  this.value = undefined;
10625
+ this._valueObject = undefined;
10624
10626
 
10625
10627
  this._initializePrivateDefaults();
10626
10628
  }
@@ -11160,7 +11162,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11160
11162
  * @returns {Date|undefined}
11161
11163
  */
11162
11164
  get valueObject() {
11163
- return this.value && dateFormatter$3.isValidDate(this.value) ? dateFormatter$3.stringToDateInstance(this.value) : undefined;
11165
+ return this._valueObject || this._computeDateObjectFallback(this.value);
11164
11166
  }
11165
11167
 
11166
11168
  /**
@@ -11168,7 +11170,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11168
11170
  * @returns {Date|undefined}
11169
11171
  */
11170
11172
  get minObject() {
11171
- return this.min && dateFormatter$3.isValidDate(this.min) ? dateFormatter$3.stringToDateInstance(this.min) : undefined;
11173
+ return this._minObject || this._computeDateObjectFallback(this.min);
11172
11174
  }
11173
11175
 
11174
11176
  /**
@@ -11176,7 +11178,50 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11176
11178
  * @returns {Date|undefined}
11177
11179
  */
11178
11180
  get maxObject() {
11179
- return this.max && dateFormatter$3.isValidDate(this.max) ? dateFormatter$3.stringToDateInstance(this.max) : undefined;
11181
+ return this._maxObject || this._computeDateObjectFallback(this.max);
11182
+ }
11183
+
11184
+ /**
11185
+ * Parses a date string into a Date object when the corresponding `_*Object`
11186
+ * field hasn't been synced yet by `updated()`. Returns undefined when the
11187
+ * input type/format isn't a full date or the string is not a valid date.
11188
+ *
11189
+ * Why this exists: a parent (datepicker) can call `inputN.validate()` from
11190
+ * inside its own `updated()` before this input's `updated()` has run
11191
+ * `syncDateValues()` — so `_valueObject`/`_maxObject` are still `undefined`
11192
+ * and range checks would otherwise silently no-op (flipping the result to
11193
+ * `valid` or `patternMismatch`).
11194
+ * @private
11195
+ * @param {string|undefined} dateStr - ISO date string from `value`/`min`/`max`.
11196
+ * @returns {Date|undefined}
11197
+ */
11198
+ _computeDateObjectFallback(dateStr) {
11199
+ if (!dateStr || !this.util || !this.util.isFullDateFormat(this.type, this.format)) {
11200
+ return undefined;
11201
+ }
11202
+ if (!dateFormatter$3.isValidDate(dateStr)) {
11203
+ return undefined;
11204
+ }
11205
+ return dateFormatter$3.stringToDateInstance(dateStr);
11206
+ }
11207
+
11208
+ /**
11209
+ * Internal setter for readonly date object properties.
11210
+ * @private
11211
+ * @param {'valueObject'|'minObject'|'maxObject'} propertyName - Public object property name.
11212
+ * @param {Date|undefined} propertyValue - Value to assign.
11213
+ * @returns {void}
11214
+ */
11215
+ setDateObjectProperty(propertyName, propertyValue) {
11216
+ const internalPropertyName = `_${propertyName}`;
11217
+ const previousValue = this[internalPropertyName];
11218
+
11219
+ if (previousValue === propertyValue) {
11220
+ return;
11221
+ }
11222
+
11223
+ this[internalPropertyName] = propertyValue;
11224
+ this.requestUpdate(propertyName, previousValue);
11180
11225
  }
11181
11226
 
11182
11227
  connectedCallback() {
@@ -11205,6 +11250,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11205
11250
  format: this.format
11206
11251
  });
11207
11252
  this.configureDataForType();
11253
+ this.syncDateValues();
11208
11254
  }
11209
11255
 
11210
11256
  disconnectedCallback() {
@@ -11224,6 +11270,15 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11224
11270
  this.wrapperElement.addEventListener('click', this.handleClick);
11225
11271
  }
11226
11272
 
11273
+ // add attribute for query selectors when auro-input is registered under a custom name
11274
+ // COVERAGE: the body of this branch is unreachable in WTR — connectedCallback
11275
+ // performs the same `setAttribute('auro-input', '')` earlier (see L665-667),
11276
+ // so by the time firstUpdated runs the attribute is already present and the
11277
+ // `!hasAttribute('auro-input')` guard is false. Retained as a defensive
11278
+ // safety net in case connectedCallback is ever short-circuited.
11279
+ if (this.tagName.toLowerCase() !== 'auro-input' && !this.hasAttribute('auro-input')) {
11280
+ this.setAttribute('auro-input', '');
11281
+ }
11227
11282
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
11228
11283
 
11229
11284
  // use validity message override if declared when initializing the component
@@ -11234,6 +11289,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11234
11289
  this.setCustomHelpTextMessage();
11235
11290
  this.configureAutoFormatting();
11236
11291
  this.configureDataForType();
11292
+ this.syncDateValues();
11237
11293
  }
11238
11294
 
11239
11295
  /**
@@ -11309,6 +11365,13 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11309
11365
 
11310
11366
  if (typeToI18n.includes(this.type)) {
11311
11367
  this.setCustomValidityForType = i18n$3(this.lang, this.type);
11368
+ // COVERAGE: this `else if` branch is unreachable in WTR. connectedCallback
11369
+ // (L682) calls configureDataForType, which at L1266-1268 assigns
11370
+ // `this.format = this.util.getDateMaskFromLocale().toLowerCase()` for any
11371
+ // type=date input whose `format` attribute is unset. That runs before
11372
+ // firstUpdated invokes setCustomHelpTextMessage, so `!this.format` is
11373
+ // always false here. Retained as a defensive fallback; the whole function
11374
+ // is @deprecated per AB#1557296 and slated for removal.
11312
11375
  } else if (!this.format && this.type === 'date') {
11313
11376
  this.setCustomValidityForType = i18n$3(this.lang, 'dateMMDDYYYY');
11314
11377
  } else if (this.dateFormatMap[this.format]) {
@@ -11370,6 +11433,8 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11370
11433
  this.configureDataForType();
11371
11434
  }
11372
11435
 
11436
+ this.syncDateValues(changedProperties);
11437
+
11373
11438
  if (changedProperties.has('value')) {
11374
11439
  if (this.value && this.value.length > 0) {
11375
11440
  this.hasValue = true;
@@ -11391,14 +11456,14 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11391
11456
 
11392
11457
  if (formattedValue !== this.inputElement.value) {
11393
11458
  this.skipNextProgrammaticInputEvent = true;
11394
- if (this.maskInstance && this.type !== 'date') {
11459
+ if (this.maskInstance && this.type === 'credit-card') {
11395
11460
  // Route through the mask so its _value and el.value stay in lock-step
11396
11461
  // (set value calls updateControl which writes el.value = displayValue).
11397
11462
  // Writing el.value directly leaves the mask thinking displayValue is
11398
- // stale; _saveSelection on the next focus/click then warns. Date is
11399
- // excluded because its formattedValue can be raw ISO when the calendar
11400
- // is invalid, and re-masking through mm/dd/yyyy would truncate it and
11401
- // flip validity from patternMismatch to tooShort.
11463
+ // stale; _saveSelection on the next focus/click then warns. Scoped to
11464
+ // credit-card so date's own formattedValue (raw ISO when calendar-invalid)
11465
+ // isn't re-masked through the mm/dd/yyyy mask, which would truncate it
11466
+ // and flip validity from patternMismatch to tooShort.
11402
11467
  this.maskInstance.value = formattedValue || '';
11403
11468
  } else if (formattedValue) {
11404
11469
  this.inputElement.value = formattedValue;
@@ -11440,65 +11505,120 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11440
11505
  }));
11441
11506
  }
11442
11507
 
11508
+
11509
+ /**
11510
+ * Synchronizes the ISO string values and Date object representations for date-related properties.
11511
+ * This keeps the model and display values aligned when either side changes.
11512
+ *
11513
+ * When a full date format is in use, this method updates `value`, `min`, and `max` from their corresponding
11514
+ * Date objects or vice versa, based on which properties have changed. It only runs when the current configuration
11515
+ * represents a full year/month/day date format.
11516
+ *
11517
+ * @param {Map<string, unknown>|undefined} [changedProperties=undefined] - Optional map of changed properties used to limit which values are synchronized.
11518
+ * @returns {void}
11519
+ * @private
11520
+ */
11521
+ syncDateValues(changedProperties = undefined) {
11522
+ if (!this.util.isFullDateFormat(this.type, this.format)) {
11523
+ return;
11524
+ }
11525
+
11526
+ this.syncSingleDateValue(changedProperties, 'valueObject', 'value');
11527
+ this.syncSingleDateValue(changedProperties, 'minObject', 'min');
11528
+ this.syncSingleDateValue(changedProperties, 'maxObject', 'max');
11529
+ }
11530
+
11531
+ /**
11532
+ * Synchronizes one date object/string property pair.
11533
+ * @private
11534
+ * @param {Map<string, unknown>|undefined} changedProperties - Map of changed properties from Lit.
11535
+ * @param {string} objectProperty - Date object property name.
11536
+ * @param {string} valueProperty - ISO string property name.
11537
+ * @returns {void}
11538
+ */
11539
+ syncSingleDateValue(changedProperties, objectProperty, valueProperty) {
11540
+ const objectPropertyChanged = !changedProperties || changedProperties.has(objectProperty);
11541
+
11542
+ // objectProperty wins over valueProperty when both changed
11543
+ if (objectPropertyChanged && this[objectProperty]) {
11544
+ this[valueProperty] = dateFormatter$3.toISOFormatString(this[objectProperty]);
11545
+ return;
11546
+ }
11547
+
11548
+ const valuePropertyChanged = !changedProperties || changedProperties.has(valueProperty);
11549
+ if (!valuePropertyChanged) {
11550
+ return;
11551
+ }
11552
+
11553
+ // 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)
11554
+ if (
11555
+ changedProperties &&
11556
+ valueProperty === 'value' &&
11557
+ changedProperties.get('value') === undefined &&
11558
+ this[objectProperty] instanceof Date &&
11559
+ this[valueProperty] === dateFormatter$3.toISOFormatString(this[objectProperty])
11560
+ ) {
11561
+ return;
11562
+ }
11563
+
11564
+ if (dateFormatter$3.isValidDate(this[valueProperty])) {
11565
+ this.setDateObjectProperty(objectProperty, dateFormatter$3.stringToDateInstance(this[valueProperty]));
11566
+ } else {
11567
+ this.setDateObjectProperty(objectProperty, undefined);
11568
+ }
11569
+ }
11570
+
11443
11571
  /**
11444
11572
  * Sets up IMasks and logic based on auto-formatting requirements.
11445
11573
  * @private
11446
11574
  * @returns {void}
11447
11575
  */
11448
11576
  configureAutoFormatting() {
11449
- // _configuringMask gates two things: external re-entry into this method
11450
- // while setup is mid-flight (from property changes that call back here),
11451
- // and the accept/complete listeners below both need to ignore the mask
11452
- // events fired by our own value-restore step.
11577
+ // Re-entrancy guard. The patched-setter's synthetic input event (suppressed
11578
+ // by _configuringMask above) could otherwise trigger handleInput
11579
+ // processCreditCard configureAutoFormatting before the outer call's
11580
+ // set value has finished its alignCursor pass.
11453
11581
  if (this._configuringMask) return;
11454
11582
  this._configuringMask = true;
11455
11583
  try {
11456
- // Destroy any prior mask so IMask can attach fresh under the new format.
11457
- // Null the reference too — if the new maskOptions.mask is falsy (e.g.
11458
- // type switched from credit-card to text) the IMask() reassignment
11459
- // below is skipped, and downstream writes at line ~823 would otherwise
11460
- // route through the destroyed instance.
11461
11584
  if (this.maskInstance) {
11462
11585
  this.maskInstance.destroy();
11463
- this.maskInstance = null;
11464
11586
  }
11465
11587
 
11588
+ // Pass new format to util
11466
11589
  this.util.updateFormat(this.format);
11467
11590
 
11468
11591
  const maskOptions = this.util.getMaskOptions(this.type, this.format);
11469
11592
 
11470
11593
  if (this.inputElement && maskOptions.mask) {
11471
- // Capture the current display so it can be re-applied after IMask
11472
- // attaches. The restore at the bottom goes through maskInstance.value
11473
- // (not inputElement.value directly) so the mask's internal state and
11474
- // the input's displayed text stay in lock-step.
11475
- let existingValue = this.inputElement.value;
11476
11594
 
11477
- // Format-change case (e.g. locale switch): existingValue is the OLD
11478
- // mask's display string and may not parse under the new mask. When
11479
- // we have a valid date model, rebuild the display from valueObject
11480
- // (the canonical source) using the new mask's format function.
11595
+ // Stash and clear any existing value before IMask init.
11596
+ // IMask's constructor processes the current input value which requires
11597
+ // selection state clearing first avoids that scenario entirely.
11598
+ // When the format changes (e.g. locale switch) and we have a valid ISO
11599
+ // model value, compute the display string for the NEW format instead of
11600
+ // re-using the old display string, which may be invalid in the new mask.
11601
+ let existingValue = this.inputElement.value;
11481
11602
  if (
11482
11603
  this.util.isFullDateFormat(this.type, this.format) &&
11483
11604
  this.value &&
11484
- this.valueObject &&
11605
+ dateFormatter$3.isValidDate(this.value) &&
11606
+ this.valueObject instanceof Date &&
11607
+ !Number.isNaN(this.valueObject.getTime()) &&
11485
11608
  typeof maskOptions.format === 'function'
11486
11609
  ) {
11487
11610
  existingValue = maskOptions.format(this.valueObject);
11488
11611
  }
11489
11612
 
11490
- // Clear before IMask attaches so the constructor seeds an empty
11491
- // internal value. Otherwise IMask reads the stale unmasked string
11492
- // and emits a spurious 'accept' before the restore below runs.
11493
11613
  this.skipNextProgrammaticInputEvent = true;
11494
11614
  this.inputElement.value = '';
11495
11615
 
11496
11616
  this.maskInstance = IMask$3(this.inputElement, maskOptions);
11497
11617
 
11498
- // Mask fires 'accept' on every value change, including the restore
11499
- // step below. Skip events fired during configureAutoFormatting so
11500
- // we don't overwrite a value the parent just pushed.
11501
11618
  this.maskInstance.on('accept', () => {
11619
+ // Suppress propagation during configureAutoFormatting's own value-restoration
11620
+ // (line below) — the mask emits 'accept' on every value-set, including ours,
11621
+ // and we don't want to overwrite a value the parent just pushed.
11502
11622
  if (this._configuringMask) return;
11503
11623
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
11504
11624
  if (this.type === "date") {
@@ -11506,8 +11626,6 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11506
11626
  }
11507
11627
  });
11508
11628
 
11509
- // Mask fires 'complete' on the restore step below for any value that
11510
- // happens to be a complete match. Same setup-suppression as 'accept'.
11511
11629
  this.maskInstance.on('complete', () => {
11512
11630
  if (this._configuringMask) return;
11513
11631
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
@@ -11516,9 +11634,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11516
11634
  }
11517
11635
  });
11518
11636
 
11519
- // Write existingValue through the mask (not the input directly) so
11520
- // the mask reformats it under the new rules and keeps its internal
11521
- // _value aligned with the input's displayed text.
11637
+ // Restore the stashed value through IMask so it's properly masked
11522
11638
  if (existingValue) {
11523
11639
  this.maskInstance.value = existingValue;
11524
11640
  }
@@ -11686,6 +11802,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11686
11802
  */
11687
11803
  reset() {
11688
11804
  this.value = undefined;
11805
+ this.setDateObjectProperty('valueObject', undefined);
11689
11806
  this.validation.reset(this);
11690
11807
  }
11691
11808
 
@@ -11694,6 +11811,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11694
11811
  */
11695
11812
  clear() {
11696
11813
  this.value = undefined;
11814
+ this.setDateObjectProperty('valueObject', undefined);
11697
11815
  }
11698
11816
 
11699
11817
  /**
@@ -11731,6 +11849,12 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11731
11849
  */
11732
11850
  get placeholderStr() {
11733
11851
  if (!this.placeholder && this.type === 'date') {
11852
+ // COVERAGE: the `'MM/DD/YYYY'` literal fallback is unreachable in WTR.
11853
+ // connectedCallback (L682) calls configureDataForType, which at L1266-1268
11854
+ // assigns `this.format = this.util.getDateMaskFromLocale().toLowerCase()`
11855
+ // when type=date and format is unset. That runs before the first render
11856
+ // reads this getter, so the ternary's truthy arm always wins. Retained
11857
+ // as a defensive fallback for direct getter calls before connection.
11734
11858
  return this.format ? this.format.toUpperCase() : 'MM/DD/YYYY';
11735
11859
  }
11736
11860
  return this.placeholder || "";
@@ -12222,7 +12346,7 @@ let AuroHelpText$8 = class AuroHelpText extends i$2 {
12222
12346
  }
12223
12347
  };
12224
12348
 
12225
- var formkitVersion$8 = '202606231948';
12349
+ var formkitVersion$8 = '202606232113';
12226
12350
 
12227
12351
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
12228
12352
  // See LICENSE in the project root for license information.
@@ -23461,7 +23585,6 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
23461
23585
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
23462
23586
 
23463
23587
  if (!(valueObject instanceof Date) || Number.isNaN(valueObject.getTime()) || !maskOptions || typeof maskOptions.format !== 'function') {
23464
- console.debug('Invalid date object or mask options for formatting', { valueObject, maskOptions }); // eslint-disable-line no-console
23465
23588
  return undefined;
23466
23589
  }
23467
23590
 
@@ -26342,7 +26465,7 @@ let AuroBibtemplate$3 = class AuroBibtemplate extends i$2 {
26342
26465
  }
26343
26466
  };
26344
26467
 
26345
- var formkitVersion$2$1 = '202606231948';
26468
+ var formkitVersion$2$1 = '202606232113';
26346
26469
 
26347
26470
  let l$1$2 = class l{generateElementName(t,e){let o=t;return o+="-",o+=e.replace(/[.]/g,"_"),o}generateTag(o,s,a){const r=this.generateElementName(o,s),i=i$5`${s$5(r)}`;return customElements.get(r)||customElements.define(r,class extends a{}),i}};let d$1$2 = class d{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}getSlotText(t,e){const o=t.shadowRoot?.querySelector(`slot[name="${e}"]`),s=(o?.assignedNodes({flatten:true})||[]).map(t=>t.textContent?.trim()).join(" ").trim();return s||null}};let h$1$2 = class h{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}};var c$1$3=i$4`:host{color:var(--ds-auro-loader-color)}:host>span{background-color:var(--ds-auro-loader-background-color);border-color:var(--ds-auro-loader-border-color)}:host([onlight]),:host([appearance=brand]){--ds-auro-loader-color: var(--ds-basic-color-brand-primary, #01426a)}:host([ondark]),:host([appearance=inverse]){--ds-auro-loader-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host([orbit])>span{--ds-auro-loader-background-color: transparent}:host([orbit])>span:nth-child(1){--ds-auro-loader-border-color: currentcolor;opacity:.25}:host([orbit])>span:nth-child(2){--ds-auro-loader-border-color: currentcolor;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}
26348
26471
  `,u$4$2=i$4`.body-default{font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default,.body-lg{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-lg{font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-sm{font-size:var(--wcss-body-sm-font-size, .875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm,.body-xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-xs{font-size:var(--wcss-body-xs-font-size, .75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-2xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:var(--wcss-body-2xs-font-size, .625rem);font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0);line-height:var(--wcss-body-2xs-line-height, .875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));font-weight:var(--wcss-display-2xl-weight, 300);letter-spacing:var(--wcss-display-2xl-letter-spacing, 0);line-height:var(--wcss-display-2xl-line-height, 1.3)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));font-weight:var(--wcss-display-xl-weight, 300);letter-spacing:var(--wcss-display-xl-letter-spacing, 0);line-height:var(--wcss-display-xl-line-height, 1.3)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));font-weight:var(--wcss-display-lg-weight, 300);letter-spacing:var(--wcss-display-lg-letter-spacing, 0);line-height:var(--wcss-display-lg-line-height, 1.3)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));font-weight:var(--wcss-display-md-weight, 300);letter-spacing:var(--wcss-display-md-letter-spacing, 0);line-height:var(--wcss-display-md-line-height, 1.3)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));font-weight:var(--wcss-display-sm-weight, 300);letter-spacing:var(--wcss-display-sm-letter-spacing, 0);line-height:var(--wcss-display-sm-line-height, 1.3)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));font-weight:var(--wcss-display-xs-weight, 300);letter-spacing:var(--wcss-display-xs-letter-spacing, 0);line-height:var(--wcss-display-xs-line-height, 1.3)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));font-weight:var(--wcss-heading-xl-weight, 300);letter-spacing:var(--wcss-heading-xl-letter-spacing, 0);line-height:var(--wcss-heading-xl-line-height, 1.3)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));font-weight:var(--wcss-heading-lg-weight, 300);letter-spacing:var(--wcss-heading-lg-letter-spacing, 0);line-height:var(--wcss-heading-lg-line-height, 1.3)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));font-weight:var(--wcss-heading-md-weight, 300);letter-spacing:var(--wcss-heading-md-letter-spacing, 0);line-height:var(--wcss-heading-md-line-height, 1.3)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));font-weight:var(--wcss-heading-sm-weight, 300);letter-spacing:var(--wcss-heading-sm-letter-spacing, 0);line-height:var(--wcss-heading-sm-line-height, 1.3)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));font-weight:var(--wcss-heading-xs-weight, 450);letter-spacing:var(--wcss-heading-xs-letter-spacing, 0);line-height:var(--wcss-heading-xs-line-height, 1.3)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));font-weight:var(--wcss-heading-2xs-weight, 450);letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0);line-height:var(--wcss-heading-2xs-line-height, 1.3)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));font-weight:var(--wcss-accent-2xl-weight, 450);letter-spacing:var(--wcss-accent-2xl-letter-spacing, .05em);line-height:var(--wcss-accent-2xl-line-height, 1)}.accent-2xl,.accent-xl{text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));font-weight:var(--wcss-accent-xl-weight, 450);letter-spacing:var(--wcss-accent-xl-letter-spacing, .05em);line-height:var(--wcss-accent-xl-line-height, 1.3)}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));font-weight:var(--wcss-accent-lg-weight, 450);letter-spacing:var(--wcss-accent-lg-letter-spacing, .05em);line-height:var(--wcss-accent-lg-line-height, 1.3)}.accent-lg,.accent-md{text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));font-weight:var(--wcss-accent-md-weight, 500);letter-spacing:var(--wcss-accent-md-letter-spacing, .05em);line-height:var(--wcss-accent-md-line-height, 1.3)}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));font-weight:var(--wcss-accent-sm-weight, 500);letter-spacing:var(--wcss-accent-sm-letter-spacing, .05em);line-height:var(--wcss-accent-sm-line-height, 1.3)}.accent-sm,.accent-xs{text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));font-weight:var(--wcss-accent-xs-weight, 500);letter-spacing:var(--wcss-accent-xs-letter-spacing, .1em);line-height:var(--wcss-accent-xs-line-height, 1.3)}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xs-font-size, clamp(.875rem, 1.1666666667vw, .875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, .1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}:focus:not(:focus-visible){outline:3px solid transparent}:host,:host>span{position:relative}:host{width:2rem;height:2rem;display:inline-block;font-size:0}:host>span{position:absolute;display:inline-block;float:none;top:0;left:0;width:2rem;height:2rem;border-radius:100%;border-style:solid;border-width:0;box-sizing:border-box}:host([xs]),:host([xs])>span{width:1.2rem;height:1.2rem}:host([sm]),:host([sm])>span{width:3rem;height:3rem}:host([md]),:host([md])>span{width:5rem;height:5rem}:host([lg]),:host([lg])>span{width:8rem;height:8rem}:host{--margin: .375rem;--margin-xs: .2rem;--margin-sm: .5rem;--margin-md: .75rem;--margin-lg: 1rem}:host([pulse]),:host([pulse])>span{position:relative}:host([pulse]){width:calc(3rem + var(--margin) * 6);height:calc(1rem + var(--margin) * 2)}:host([pulse])>span{width:1rem;height:1rem;margin:var(--margin);animation:pulse 1.5s ease infinite}:host([pulse][xs]){width:calc(1.95rem + var(--margin-xs) * 6);height:calc(.65rem + var(--margin-xs) * 2)}:host([pulse][xs])>span{margin:var(--margin-xs);width:.65rem;height:.65rem}:host([pulse][sm]){width:calc(6rem + var(--margin-sm) * 6);height:calc(2rem + var(--margin-sm) * 2)}:host([pulse][sm])>span{margin:var(--margin-sm);width:2rem;height:2rem}:host([pulse][md]){width:calc(9rem + var(--margin-md) * 6);height:calc(3rem + var(--margin-md) * 2)}:host([pulse][md])>span{margin:var(--margin-md);width:3rem;height:3rem}:host([pulse][lg]){width:calc(15rem + var(--margin-lg) * 6);height:calc(5rem + var(--margin-lg) * 2)}:host([pulse][lg])>span{margin:var(--margin-lg);width:5rem;height:5rem}:host([pulse])>span:nth-child(1){animation-delay:-.4s}:host([pulse])>span:nth-child(2){animation-delay:-.2s}:host([pulse])>span:nth-child(3){animation-delay:0ms}@keyframes pulse{0%,to{opacity:.1;transform:scale(.9)}50%{opacity:1;transform:scale(1.1)}}:host([orbit]),:host([orbit])>span{opacity:1}:host([orbit])>span{border-width:5px}:host([orbit])>span:nth-child(2){animation:orbit 2s linear infinite}:host([orbit][sm])>span{border-width:8px}:host([orbit][md])>span{border-width:13px}:host([orbit][lg])>span{border-width:21px}@keyframes orbit{0%{transform:rotate(0)}to{transform:rotate(360deg)}}:host([ringworm])>svg{animation:rotate 2s linear infinite;height:100%;width:100%;stroke:currentcolor;stroke-width:8}:host([ringworm]) .path{stroke-dashoffset:0;animation:ringworm 1.5s ease-in-out infinite;stroke-linecap:round}@keyframes rotate{to{transform:rotate(360deg)}}@keyframes ringworm{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}:host([laser]){position:static;width:100%;display:block;height:0;overflow:hidden;font-size:unset}:host([laser])>span{position:fixed;width:100%;height:.25rem;border-radius:0;z-index:100}:host([laser])>span:nth-child(1){border-color:currentcolor;opacity:.25}:host([laser])>span:nth-child(2){border-color:currentcolor;animation:laser 2s linear infinite;opacity:1;width:50%}:host([laser][sm])>span:nth-child(2){width:20%}:host([laser][md])>span:nth-child(2){width:30%}:host([laser][lg])>span:nth-child(2){width:50%;animation-duration:1.5s}:host([laser][xl])>span:nth-child(2){width:80%;animation-duration:1.5s}@keyframes laser{0%{left:-100%}to{left:110%}}:host>.no-animation{display:none}@media (prefers-reduced-motion: reduce){:host{display:flex;align-items:center;justify-content:center}:host>span{opacity:1}:host>.loader{display:none}:host>svg{display:none}:host>.no-animation{display:block}}
@@ -31853,7 +31976,7 @@ let AuroHelpText$2$1 = class AuroHelpText extends i$2 {
31853
31976
  }
31854
31977
  };
31855
31978
 
31856
- var formkitVersion$1$3 = '202606231948';
31979
+ var formkitVersion$1$3 = '202606232113';
31857
31980
 
31858
31981
  let AuroElement$2$2 = class AuroElement extends i$2 {
31859
31982
  static get properties() {
@@ -43575,7 +43698,6 @@ let AuroInputUtilities$2 = class AuroInputUtilities {
43575
43698
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
43576
43699
 
43577
43700
  if (!(valueObject instanceof Date) || Number.isNaN(valueObject.getTime()) || !maskOptions || typeof maskOptions.format !== 'function') {
43578
- console.debug('Invalid date object or mask options for formatting', { valueObject, maskOptions }); // eslint-disable-line no-console
43579
43701
  return undefined;
43580
43702
  }
43581
43703
 
@@ -43727,8 +43849,10 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
43727
43849
  this.layout = 'classic';
43728
43850
  this.locale = 'en-US';
43729
43851
  this.max = undefined;
43852
+ this._maxObject = undefined;
43730
43853
  this.maxLength = undefined;
43731
43854
  this.min = undefined;
43855
+ this._minObject = undefined;
43732
43856
  this.minLength = undefined;
43733
43857
  this.required = false;
43734
43858
  this.onDark = false;
@@ -43736,6 +43860,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
43736
43860
  this.size = 'lg';
43737
43861
  this.shape = 'classic';
43738
43862
  this.value = undefined;
43863
+ this._valueObject = undefined;
43739
43864
 
43740
43865
  this._initializePrivateDefaults();
43741
43866
  }
@@ -44275,7 +44400,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44275
44400
  * @returns {Date|undefined}
44276
44401
  */
44277
44402
  get valueObject() {
44278
- return this.value && dateFormatter$2.isValidDate(this.value) ? dateFormatter$2.stringToDateInstance(this.value) : undefined;
44403
+ return this._valueObject || this._computeDateObjectFallback(this.value);
44279
44404
  }
44280
44405
 
44281
44406
  /**
@@ -44283,7 +44408,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44283
44408
  * @returns {Date|undefined}
44284
44409
  */
44285
44410
  get minObject() {
44286
- return this.min && dateFormatter$2.isValidDate(this.min) ? dateFormatter$2.stringToDateInstance(this.min) : undefined;
44411
+ return this._minObject || this._computeDateObjectFallback(this.min);
44287
44412
  }
44288
44413
 
44289
44414
  /**
@@ -44291,7 +44416,50 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44291
44416
  * @returns {Date|undefined}
44292
44417
  */
44293
44418
  get maxObject() {
44294
- return this.max && dateFormatter$2.isValidDate(this.max) ? dateFormatter$2.stringToDateInstance(this.max) : undefined;
44419
+ return this._maxObject || this._computeDateObjectFallback(this.max);
44420
+ }
44421
+
44422
+ /**
44423
+ * Parses a date string into a Date object when the corresponding `_*Object`
44424
+ * field hasn't been synced yet by `updated()`. Returns undefined when the
44425
+ * input type/format isn't a full date or the string is not a valid date.
44426
+ *
44427
+ * Why this exists: a parent (datepicker) can call `inputN.validate()` from
44428
+ * inside its own `updated()` before this input's `updated()` has run
44429
+ * `syncDateValues()` — so `_valueObject`/`_maxObject` are still `undefined`
44430
+ * and range checks would otherwise silently no-op (flipping the result to
44431
+ * `valid` or `patternMismatch`).
44432
+ * @private
44433
+ * @param {string|undefined} dateStr - ISO date string from `value`/`min`/`max`.
44434
+ * @returns {Date|undefined}
44435
+ */
44436
+ _computeDateObjectFallback(dateStr) {
44437
+ if (!dateStr || !this.util || !this.util.isFullDateFormat(this.type, this.format)) {
44438
+ return undefined;
44439
+ }
44440
+ if (!dateFormatter$2.isValidDate(dateStr)) {
44441
+ return undefined;
44442
+ }
44443
+ return dateFormatter$2.stringToDateInstance(dateStr);
44444
+ }
44445
+
44446
+ /**
44447
+ * Internal setter for readonly date object properties.
44448
+ * @private
44449
+ * @param {'valueObject'|'minObject'|'maxObject'} propertyName - Public object property name.
44450
+ * @param {Date|undefined} propertyValue - Value to assign.
44451
+ * @returns {void}
44452
+ */
44453
+ setDateObjectProperty(propertyName, propertyValue) {
44454
+ const internalPropertyName = `_${propertyName}`;
44455
+ const previousValue = this[internalPropertyName];
44456
+
44457
+ if (previousValue === propertyValue) {
44458
+ return;
44459
+ }
44460
+
44461
+ this[internalPropertyName] = propertyValue;
44462
+ this.requestUpdate(propertyName, previousValue);
44295
44463
  }
44296
44464
 
44297
44465
  connectedCallback() {
@@ -44320,6 +44488,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44320
44488
  format: this.format
44321
44489
  });
44322
44490
  this.configureDataForType();
44491
+ this.syncDateValues();
44323
44492
  }
44324
44493
 
44325
44494
  disconnectedCallback() {
@@ -44339,6 +44508,15 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44339
44508
  this.wrapperElement.addEventListener('click', this.handleClick);
44340
44509
  }
44341
44510
 
44511
+ // add attribute for query selectors when auro-input is registered under a custom name
44512
+ // COVERAGE: the body of this branch is unreachable in WTR — connectedCallback
44513
+ // performs the same `setAttribute('auro-input', '')` earlier (see L665-667),
44514
+ // so by the time firstUpdated runs the attribute is already present and the
44515
+ // `!hasAttribute('auro-input')` guard is false. Retained as a defensive
44516
+ // safety net in case connectedCallback is ever short-circuited.
44517
+ if (this.tagName.toLowerCase() !== 'auro-input' && !this.hasAttribute('auro-input')) {
44518
+ this.setAttribute('auro-input', '');
44519
+ }
44342
44520
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
44343
44521
 
44344
44522
  // use validity message override if declared when initializing the component
@@ -44349,6 +44527,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44349
44527
  this.setCustomHelpTextMessage();
44350
44528
  this.configureAutoFormatting();
44351
44529
  this.configureDataForType();
44530
+ this.syncDateValues();
44352
44531
  }
44353
44532
 
44354
44533
  /**
@@ -44424,6 +44603,13 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44424
44603
 
44425
44604
  if (typeToI18n.includes(this.type)) {
44426
44605
  this.setCustomValidityForType = i18n$1(this.lang, this.type);
44606
+ // COVERAGE: this `else if` branch is unreachable in WTR. connectedCallback
44607
+ // (L682) calls configureDataForType, which at L1266-1268 assigns
44608
+ // `this.format = this.util.getDateMaskFromLocale().toLowerCase()` for any
44609
+ // type=date input whose `format` attribute is unset. That runs before
44610
+ // firstUpdated invokes setCustomHelpTextMessage, so `!this.format` is
44611
+ // always false here. Retained as a defensive fallback; the whole function
44612
+ // is @deprecated per AB#1557296 and slated for removal.
44427
44613
  } else if (!this.format && this.type === 'date') {
44428
44614
  this.setCustomValidityForType = i18n$1(this.lang, 'dateMMDDYYYY');
44429
44615
  } else if (this.dateFormatMap[this.format]) {
@@ -44485,6 +44671,8 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44485
44671
  this.configureDataForType();
44486
44672
  }
44487
44673
 
44674
+ this.syncDateValues(changedProperties);
44675
+
44488
44676
  if (changedProperties.has('value')) {
44489
44677
  if (this.value && this.value.length > 0) {
44490
44678
  this.hasValue = true;
@@ -44506,14 +44694,14 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44506
44694
 
44507
44695
  if (formattedValue !== this.inputElement.value) {
44508
44696
  this.skipNextProgrammaticInputEvent = true;
44509
- if (this.maskInstance && this.type !== 'date') {
44697
+ if (this.maskInstance && this.type === 'credit-card') {
44510
44698
  // Route through the mask so its _value and el.value stay in lock-step
44511
44699
  // (set value calls updateControl which writes el.value = displayValue).
44512
44700
  // Writing el.value directly leaves the mask thinking displayValue is
44513
- // stale; _saveSelection on the next focus/click then warns. Date is
44514
- // excluded because its formattedValue can be raw ISO when the calendar
44515
- // is invalid, and re-masking through mm/dd/yyyy would truncate it and
44516
- // flip validity from patternMismatch to tooShort.
44701
+ // stale; _saveSelection on the next focus/click then warns. Scoped to
44702
+ // credit-card so date's own formattedValue (raw ISO when calendar-invalid)
44703
+ // isn't re-masked through the mm/dd/yyyy mask, which would truncate it
44704
+ // and flip validity from patternMismatch to tooShort.
44517
44705
  this.maskInstance.value = formattedValue || '';
44518
44706
  } else if (formattedValue) {
44519
44707
  this.inputElement.value = formattedValue;
@@ -44555,65 +44743,120 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44555
44743
  }));
44556
44744
  }
44557
44745
 
44746
+
44747
+ /**
44748
+ * Synchronizes the ISO string values and Date object representations for date-related properties.
44749
+ * This keeps the model and display values aligned when either side changes.
44750
+ *
44751
+ * When a full date format is in use, this method updates `value`, `min`, and `max` from their corresponding
44752
+ * Date objects or vice versa, based on which properties have changed. It only runs when the current configuration
44753
+ * represents a full year/month/day date format.
44754
+ *
44755
+ * @param {Map<string, unknown>|undefined} [changedProperties=undefined] - Optional map of changed properties used to limit which values are synchronized.
44756
+ * @returns {void}
44757
+ * @private
44758
+ */
44759
+ syncDateValues(changedProperties = undefined) {
44760
+ if (!this.util.isFullDateFormat(this.type, this.format)) {
44761
+ return;
44762
+ }
44763
+
44764
+ this.syncSingleDateValue(changedProperties, 'valueObject', 'value');
44765
+ this.syncSingleDateValue(changedProperties, 'minObject', 'min');
44766
+ this.syncSingleDateValue(changedProperties, 'maxObject', 'max');
44767
+ }
44768
+
44769
+ /**
44770
+ * Synchronizes one date object/string property pair.
44771
+ * @private
44772
+ * @param {Map<string, unknown>|undefined} changedProperties - Map of changed properties from Lit.
44773
+ * @param {string} objectProperty - Date object property name.
44774
+ * @param {string} valueProperty - ISO string property name.
44775
+ * @returns {void}
44776
+ */
44777
+ syncSingleDateValue(changedProperties, objectProperty, valueProperty) {
44778
+ const objectPropertyChanged = !changedProperties || changedProperties.has(objectProperty);
44779
+
44780
+ // objectProperty wins over valueProperty when both changed
44781
+ if (objectPropertyChanged && this[objectProperty]) {
44782
+ this[valueProperty] = dateFormatter$2.toISOFormatString(this[objectProperty]);
44783
+ return;
44784
+ }
44785
+
44786
+ const valuePropertyChanged = !changedProperties || changedProperties.has(valueProperty);
44787
+ if (!valuePropertyChanged) {
44788
+ return;
44789
+ }
44790
+
44791
+ // 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)
44792
+ if (
44793
+ changedProperties &&
44794
+ valueProperty === 'value' &&
44795
+ changedProperties.get('value') === undefined &&
44796
+ this[objectProperty] instanceof Date &&
44797
+ this[valueProperty] === dateFormatter$2.toISOFormatString(this[objectProperty])
44798
+ ) {
44799
+ return;
44800
+ }
44801
+
44802
+ if (dateFormatter$2.isValidDate(this[valueProperty])) {
44803
+ this.setDateObjectProperty(objectProperty, dateFormatter$2.stringToDateInstance(this[valueProperty]));
44804
+ } else {
44805
+ this.setDateObjectProperty(objectProperty, undefined);
44806
+ }
44807
+ }
44808
+
44558
44809
  /**
44559
44810
  * Sets up IMasks and logic based on auto-formatting requirements.
44560
44811
  * @private
44561
44812
  * @returns {void}
44562
44813
  */
44563
44814
  configureAutoFormatting() {
44564
- // _configuringMask gates two things: external re-entry into this method
44565
- // while setup is mid-flight (from property changes that call back here),
44566
- // and the accept/complete listeners below both need to ignore the mask
44567
- // events fired by our own value-restore step.
44815
+ // Re-entrancy guard. The patched-setter's synthetic input event (suppressed
44816
+ // by _configuringMask above) could otherwise trigger handleInput
44817
+ // processCreditCard configureAutoFormatting before the outer call's
44818
+ // set value has finished its alignCursor pass.
44568
44819
  if (this._configuringMask) return;
44569
44820
  this._configuringMask = true;
44570
44821
  try {
44571
- // Destroy any prior mask so IMask can attach fresh under the new format.
44572
- // Null the reference too — if the new maskOptions.mask is falsy (e.g.
44573
- // type switched from credit-card to text) the IMask() reassignment
44574
- // below is skipped, and downstream writes at line ~823 would otherwise
44575
- // route through the destroyed instance.
44576
44822
  if (this.maskInstance) {
44577
44823
  this.maskInstance.destroy();
44578
- this.maskInstance = null;
44579
44824
  }
44580
44825
 
44826
+ // Pass new format to util
44581
44827
  this.util.updateFormat(this.format);
44582
44828
 
44583
44829
  const maskOptions = this.util.getMaskOptions(this.type, this.format);
44584
44830
 
44585
44831
  if (this.inputElement && maskOptions.mask) {
44586
- // Capture the current display so it can be re-applied after IMask
44587
- // attaches. The restore at the bottom goes through maskInstance.value
44588
- // (not inputElement.value directly) so the mask's internal state and
44589
- // the input's displayed text stay in lock-step.
44590
- let existingValue = this.inputElement.value;
44591
44832
 
44592
- // Format-change case (e.g. locale switch): existingValue is the OLD
44593
- // mask's display string and may not parse under the new mask. When
44594
- // we have a valid date model, rebuild the display from valueObject
44595
- // (the canonical source) using the new mask's format function.
44833
+ // Stash and clear any existing value before IMask init.
44834
+ // IMask's constructor processes the current input value which requires
44835
+ // selection state clearing first avoids that scenario entirely.
44836
+ // When the format changes (e.g. locale switch) and we have a valid ISO
44837
+ // model value, compute the display string for the NEW format instead of
44838
+ // re-using the old display string, which may be invalid in the new mask.
44839
+ let existingValue = this.inputElement.value;
44596
44840
  if (
44597
44841
  this.util.isFullDateFormat(this.type, this.format) &&
44598
44842
  this.value &&
44599
- this.valueObject &&
44843
+ dateFormatter$2.isValidDate(this.value) &&
44844
+ this.valueObject instanceof Date &&
44845
+ !Number.isNaN(this.valueObject.getTime()) &&
44600
44846
  typeof maskOptions.format === 'function'
44601
44847
  ) {
44602
44848
  existingValue = maskOptions.format(this.valueObject);
44603
44849
  }
44604
44850
 
44605
- // Clear before IMask attaches so the constructor seeds an empty
44606
- // internal value. Otherwise IMask reads the stale unmasked string
44607
- // and emits a spurious 'accept' before the restore below runs.
44608
44851
  this.skipNextProgrammaticInputEvent = true;
44609
44852
  this.inputElement.value = '';
44610
44853
 
44611
44854
  this.maskInstance = IMask$2(this.inputElement, maskOptions);
44612
44855
 
44613
- // Mask fires 'accept' on every value change, including the restore
44614
- // step below. Skip events fired during configureAutoFormatting so
44615
- // we don't overwrite a value the parent just pushed.
44616
44856
  this.maskInstance.on('accept', () => {
44857
+ // Suppress propagation during configureAutoFormatting's own value-restoration
44858
+ // (line below) — the mask emits 'accept' on every value-set, including ours,
44859
+ // and we don't want to overwrite a value the parent just pushed.
44617
44860
  if (this._configuringMask) return;
44618
44861
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
44619
44862
  if (this.type === "date") {
@@ -44621,8 +44864,6 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44621
44864
  }
44622
44865
  });
44623
44866
 
44624
- // Mask fires 'complete' on the restore step below for any value that
44625
- // happens to be a complete match. Same setup-suppression as 'accept'.
44626
44867
  this.maskInstance.on('complete', () => {
44627
44868
  if (this._configuringMask) return;
44628
44869
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
@@ -44631,9 +44872,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44631
44872
  }
44632
44873
  });
44633
44874
 
44634
- // Write existingValue through the mask (not the input directly) so
44635
- // the mask reformats it under the new rules and keeps its internal
44636
- // _value aligned with the input's displayed text.
44875
+ // Restore the stashed value through IMask so it's properly masked
44637
44876
  if (existingValue) {
44638
44877
  this.maskInstance.value = existingValue;
44639
44878
  }
@@ -44801,6 +45040,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44801
45040
  */
44802
45041
  reset() {
44803
45042
  this.value = undefined;
45043
+ this.setDateObjectProperty('valueObject', undefined);
44804
45044
  this.validation.reset(this);
44805
45045
  }
44806
45046
 
@@ -44809,6 +45049,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44809
45049
  */
44810
45050
  clear() {
44811
45051
  this.value = undefined;
45052
+ this.setDateObjectProperty('valueObject', undefined);
44812
45053
  }
44813
45054
 
44814
45055
  /**
@@ -44846,6 +45087,12 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44846
45087
  */
44847
45088
  get placeholderStr() {
44848
45089
  if (!this.placeholder && this.type === 'date') {
45090
+ // COVERAGE: the `'MM/DD/YYYY'` literal fallback is unreachable in WTR.
45091
+ // connectedCallback (L682) calls configureDataForType, which at L1266-1268
45092
+ // assigns `this.format = this.util.getDateMaskFromLocale().toLowerCase()`
45093
+ // when type=date and format is unset. That runs before the first render
45094
+ // reads this getter, so the ternary's truthy arm always wins. Retained
45095
+ // as a defensive fallback for direct getter calls before connection.
44849
45096
  return this.format ? this.format.toUpperCase() : 'MM/DD/YYYY';
44850
45097
  }
44851
45098
  return this.placeholder || "";
@@ -45337,7 +45584,7 @@ let AuroHelpText$1$3 = class AuroHelpText extends i$2 {
45337
45584
  }
45338
45585
  };
45339
45586
 
45340
- var formkitVersion$7 = '202606231948';
45587
+ var formkitVersion$7 = '202606232113';
45341
45588
 
45342
45589
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
45343
45590
  // See LICENSE in the project root for license information.
@@ -50040,7 +50287,7 @@ let AuroHelpText$1$2 = class AuroHelpText extends i$2 {
50040
50287
  }
50041
50288
  };
50042
50289
 
50043
- var formkitVersion$1$2 = '202606231948';
50290
+ var formkitVersion$1$2 = '202606232113';
50044
50291
 
50045
50292
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
50046
50293
  // See LICENSE in the project root for license information.
@@ -54368,7 +54615,7 @@ let AuroHelpText$6 = class AuroHelpText extends i$2 {
54368
54615
  }
54369
54616
  };
54370
54617
 
54371
- var formkitVersion$6 = '202606231948';
54618
+ var formkitVersion$6 = '202606232113';
54372
54619
 
54373
54620
  let AuroElement$1$2 = class AuroElement extends i$2 {
54374
54621
  static get properties() {
@@ -58308,7 +58555,7 @@ let AuroHelpText$5 = class AuroHelpText extends i$2 {
58308
58555
  }
58309
58556
  };
58310
58557
 
58311
- var formkitVersion$5 = '202606231948';
58558
+ var formkitVersion$5 = '202606232113';
58312
58559
 
58313
58560
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
58314
58561
  // See LICENSE in the project root for license information.
@@ -60058,7 +60305,7 @@ let AuroHelpText$4 = class AuroHelpText extends i$2 {
60058
60305
  }
60059
60306
  };
60060
60307
 
60061
- var formkitVersion$4 = '202606231948';
60308
+ var formkitVersion$4 = '202606232113';
60062
60309
 
60063
60310
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
60064
60311
  // See LICENSE in the project root for license information.
@@ -61234,8 +61481,6 @@ function navigateArrow$1(component, direction, options = {}) {
61234
61481
  }
61235
61482
  }
61236
61483
 
61237
- /* eslint-disable no-underscore-dangle */
61238
-
61239
61484
  /**
61240
61485
  * Returns the clear button element from the active input's shadow
61241
61486
  * DOM, if available.
@@ -61271,9 +61516,11 @@ function isClearBtnFocused(ctx, clearBtn = getClearBtn(ctx)) {
61271
61516
  * @param {Object} menu - The menu component.
61272
61517
  */
61273
61518
  function reconcileMenuIndex(menu) {
61519
+ // eslint-disable-next-line no-underscore-dangle
61274
61520
  if (menu._index < 0 && menu.optionActive && menu.items) {
61275
61521
  const idx = menu.items.indexOf(menu.optionActive);
61276
61522
  if (idx >= 0) {
61523
+ // eslint-disable-next-line no-underscore-dangle
61277
61524
  menu._index = idx;
61278
61525
  }
61279
61526
  }
@@ -65273,7 +65520,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$2 {
65273
65520
  }
65274
65521
  };
65275
65522
 
65276
- var formkitVersion$2 = '202606231948';
65523
+ var formkitVersion$2 = '202606232113';
65277
65524
 
65278
65525
  let AuroElement$2$1 = class AuroElement extends i$2 {
65279
65526
  static get properties() {
@@ -76995,7 +77242,6 @@ class AuroInputUtilities {
76995
77242
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
76996
77243
 
76997
77244
  if (!(valueObject instanceof Date) || Number.isNaN(valueObject.getTime()) || !maskOptions || typeof maskOptions.format !== 'function') {
76998
- console.debug('Invalid date object or mask options for formatting', { valueObject, maskOptions }); // eslint-disable-line no-console
76999
77245
  return undefined;
77000
77246
  }
77001
77247
 
@@ -77147,8 +77393,10 @@ class BaseInput extends AuroElement$1$1 {
77147
77393
  this.layout = 'classic';
77148
77394
  this.locale = 'en-US';
77149
77395
  this.max = undefined;
77396
+ this._maxObject = undefined;
77150
77397
  this.maxLength = undefined;
77151
77398
  this.min = undefined;
77399
+ this._minObject = undefined;
77152
77400
  this.minLength = undefined;
77153
77401
  this.required = false;
77154
77402
  this.onDark = false;
@@ -77156,6 +77404,7 @@ class BaseInput extends AuroElement$1$1 {
77156
77404
  this.size = 'lg';
77157
77405
  this.shape = 'classic';
77158
77406
  this.value = undefined;
77407
+ this._valueObject = undefined;
77159
77408
 
77160
77409
  this._initializePrivateDefaults();
77161
77410
  }
@@ -77695,7 +77944,7 @@ class BaseInput extends AuroElement$1$1 {
77695
77944
  * @returns {Date|undefined}
77696
77945
  */
77697
77946
  get valueObject() {
77698
- return this.value && dateFormatter.isValidDate(this.value) ? dateFormatter.stringToDateInstance(this.value) : undefined;
77947
+ return this._valueObject || this._computeDateObjectFallback(this.value);
77699
77948
  }
77700
77949
 
77701
77950
  /**
@@ -77703,7 +77952,7 @@ class BaseInput extends AuroElement$1$1 {
77703
77952
  * @returns {Date|undefined}
77704
77953
  */
77705
77954
  get minObject() {
77706
- return this.min && dateFormatter.isValidDate(this.min) ? dateFormatter.stringToDateInstance(this.min) : undefined;
77955
+ return this._minObject || this._computeDateObjectFallback(this.min);
77707
77956
  }
77708
77957
 
77709
77958
  /**
@@ -77711,7 +77960,50 @@ class BaseInput extends AuroElement$1$1 {
77711
77960
  * @returns {Date|undefined}
77712
77961
  */
77713
77962
  get maxObject() {
77714
- return this.max && dateFormatter.isValidDate(this.max) ? dateFormatter.stringToDateInstance(this.max) : undefined;
77963
+ return this._maxObject || this._computeDateObjectFallback(this.max);
77964
+ }
77965
+
77966
+ /**
77967
+ * Parses a date string into a Date object when the corresponding `_*Object`
77968
+ * field hasn't been synced yet by `updated()`. Returns undefined when the
77969
+ * input type/format isn't a full date or the string is not a valid date.
77970
+ *
77971
+ * Why this exists: a parent (datepicker) can call `inputN.validate()` from
77972
+ * inside its own `updated()` before this input's `updated()` has run
77973
+ * `syncDateValues()` — so `_valueObject`/`_maxObject` are still `undefined`
77974
+ * and range checks would otherwise silently no-op (flipping the result to
77975
+ * `valid` or `patternMismatch`).
77976
+ * @private
77977
+ * @param {string|undefined} dateStr - ISO date string from `value`/`min`/`max`.
77978
+ * @returns {Date|undefined}
77979
+ */
77980
+ _computeDateObjectFallback(dateStr) {
77981
+ if (!dateStr || !this.util || !this.util.isFullDateFormat(this.type, this.format)) {
77982
+ return undefined;
77983
+ }
77984
+ if (!dateFormatter.isValidDate(dateStr)) {
77985
+ return undefined;
77986
+ }
77987
+ return dateFormatter.stringToDateInstance(dateStr);
77988
+ }
77989
+
77990
+ /**
77991
+ * Internal setter for readonly date object properties.
77992
+ * @private
77993
+ * @param {'valueObject'|'minObject'|'maxObject'} propertyName - Public object property name.
77994
+ * @param {Date|undefined} propertyValue - Value to assign.
77995
+ * @returns {void}
77996
+ */
77997
+ setDateObjectProperty(propertyName, propertyValue) {
77998
+ const internalPropertyName = `_${propertyName}`;
77999
+ const previousValue = this[internalPropertyName];
78000
+
78001
+ if (previousValue === propertyValue) {
78002
+ return;
78003
+ }
78004
+
78005
+ this[internalPropertyName] = propertyValue;
78006
+ this.requestUpdate(propertyName, previousValue);
77715
78007
  }
77716
78008
 
77717
78009
  connectedCallback() {
@@ -77740,6 +78032,7 @@ class BaseInput extends AuroElement$1$1 {
77740
78032
  format: this.format
77741
78033
  });
77742
78034
  this.configureDataForType();
78035
+ this.syncDateValues();
77743
78036
  }
77744
78037
 
77745
78038
  disconnectedCallback() {
@@ -77759,6 +78052,15 @@ class BaseInput extends AuroElement$1$1 {
77759
78052
  this.wrapperElement.addEventListener('click', this.handleClick);
77760
78053
  }
77761
78054
 
78055
+ // add attribute for query selectors when auro-input is registered under a custom name
78056
+ // COVERAGE: the body of this branch is unreachable in WTR — connectedCallback
78057
+ // performs the same `setAttribute('auro-input', '')` earlier (see L665-667),
78058
+ // so by the time firstUpdated runs the attribute is already present and the
78059
+ // `!hasAttribute('auro-input')` guard is false. Retained as a defensive
78060
+ // safety net in case connectedCallback is ever short-circuited.
78061
+ if (this.tagName.toLowerCase() !== 'auro-input' && !this.hasAttribute('auro-input')) {
78062
+ this.setAttribute('auro-input', '');
78063
+ }
77762
78064
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
77763
78065
 
77764
78066
  // use validity message override if declared when initializing the component
@@ -77769,6 +78071,7 @@ class BaseInput extends AuroElement$1$1 {
77769
78071
  this.setCustomHelpTextMessage();
77770
78072
  this.configureAutoFormatting();
77771
78073
  this.configureDataForType();
78074
+ this.syncDateValues();
77772
78075
  }
77773
78076
 
77774
78077
  /**
@@ -77844,6 +78147,13 @@ class BaseInput extends AuroElement$1$1 {
77844
78147
 
77845
78148
  if (typeToI18n.includes(this.type)) {
77846
78149
  this.setCustomValidityForType = i18n(this.lang, this.type);
78150
+ // COVERAGE: this `else if` branch is unreachable in WTR. connectedCallback
78151
+ // (L682) calls configureDataForType, which at L1266-1268 assigns
78152
+ // `this.format = this.util.getDateMaskFromLocale().toLowerCase()` for any
78153
+ // type=date input whose `format` attribute is unset. That runs before
78154
+ // firstUpdated invokes setCustomHelpTextMessage, so `!this.format` is
78155
+ // always false here. Retained as a defensive fallback; the whole function
78156
+ // is @deprecated per AB#1557296 and slated for removal.
77847
78157
  } else if (!this.format && this.type === 'date') {
77848
78158
  this.setCustomValidityForType = i18n(this.lang, 'dateMMDDYYYY');
77849
78159
  } else if (this.dateFormatMap[this.format]) {
@@ -77905,6 +78215,8 @@ class BaseInput extends AuroElement$1$1 {
77905
78215
  this.configureDataForType();
77906
78216
  }
77907
78217
 
78218
+ this.syncDateValues(changedProperties);
78219
+
77908
78220
  if (changedProperties.has('value')) {
77909
78221
  if (this.value && this.value.length > 0) {
77910
78222
  this.hasValue = true;
@@ -77926,14 +78238,14 @@ class BaseInput extends AuroElement$1$1 {
77926
78238
 
77927
78239
  if (formattedValue !== this.inputElement.value) {
77928
78240
  this.skipNextProgrammaticInputEvent = true;
77929
- if (this.maskInstance && this.type !== 'date') {
78241
+ if (this.maskInstance && this.type === 'credit-card') {
77930
78242
  // Route through the mask so its _value and el.value stay in lock-step
77931
78243
  // (set value calls updateControl which writes el.value = displayValue).
77932
78244
  // Writing el.value directly leaves the mask thinking displayValue is
77933
- // stale; _saveSelection on the next focus/click then warns. Date is
77934
- // excluded because its formattedValue can be raw ISO when the calendar
77935
- // is invalid, and re-masking through mm/dd/yyyy would truncate it and
77936
- // flip validity from patternMismatch to tooShort.
78245
+ // stale; _saveSelection on the next focus/click then warns. Scoped to
78246
+ // credit-card so date's own formattedValue (raw ISO when calendar-invalid)
78247
+ // isn't re-masked through the mm/dd/yyyy mask, which would truncate it
78248
+ // and flip validity from patternMismatch to tooShort.
77937
78249
  this.maskInstance.value = formattedValue || '';
77938
78250
  } else if (formattedValue) {
77939
78251
  this.inputElement.value = formattedValue;
@@ -77975,65 +78287,120 @@ class BaseInput extends AuroElement$1$1 {
77975
78287
  }));
77976
78288
  }
77977
78289
 
78290
+
78291
+ /**
78292
+ * Synchronizes the ISO string values and Date object representations for date-related properties.
78293
+ * This keeps the model and display values aligned when either side changes.
78294
+ *
78295
+ * When a full date format is in use, this method updates `value`, `min`, and `max` from their corresponding
78296
+ * Date objects or vice versa, based on which properties have changed. It only runs when the current configuration
78297
+ * represents a full year/month/day date format.
78298
+ *
78299
+ * @param {Map<string, unknown>|undefined} [changedProperties=undefined] - Optional map of changed properties used to limit which values are synchronized.
78300
+ * @returns {void}
78301
+ * @private
78302
+ */
78303
+ syncDateValues(changedProperties = undefined) {
78304
+ if (!this.util.isFullDateFormat(this.type, this.format)) {
78305
+ return;
78306
+ }
78307
+
78308
+ this.syncSingleDateValue(changedProperties, 'valueObject', 'value');
78309
+ this.syncSingleDateValue(changedProperties, 'minObject', 'min');
78310
+ this.syncSingleDateValue(changedProperties, 'maxObject', 'max');
78311
+ }
78312
+
78313
+ /**
78314
+ * Synchronizes one date object/string property pair.
78315
+ * @private
78316
+ * @param {Map<string, unknown>|undefined} changedProperties - Map of changed properties from Lit.
78317
+ * @param {string} objectProperty - Date object property name.
78318
+ * @param {string} valueProperty - ISO string property name.
78319
+ * @returns {void}
78320
+ */
78321
+ syncSingleDateValue(changedProperties, objectProperty, valueProperty) {
78322
+ const objectPropertyChanged = !changedProperties || changedProperties.has(objectProperty);
78323
+
78324
+ // objectProperty wins over valueProperty when both changed
78325
+ if (objectPropertyChanged && this[objectProperty]) {
78326
+ this[valueProperty] = dateFormatter.toISOFormatString(this[objectProperty]);
78327
+ return;
78328
+ }
78329
+
78330
+ const valuePropertyChanged = !changedProperties || changedProperties.has(valueProperty);
78331
+ if (!valuePropertyChanged) {
78332
+ return;
78333
+ }
78334
+
78335
+ // 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)
78336
+ if (
78337
+ changedProperties &&
78338
+ valueProperty === 'value' &&
78339
+ changedProperties.get('value') === undefined &&
78340
+ this[objectProperty] instanceof Date &&
78341
+ this[valueProperty] === dateFormatter.toISOFormatString(this[objectProperty])
78342
+ ) {
78343
+ return;
78344
+ }
78345
+
78346
+ if (dateFormatter.isValidDate(this[valueProperty])) {
78347
+ this.setDateObjectProperty(objectProperty, dateFormatter.stringToDateInstance(this[valueProperty]));
78348
+ } else {
78349
+ this.setDateObjectProperty(objectProperty, undefined);
78350
+ }
78351
+ }
78352
+
77978
78353
  /**
77979
78354
  * Sets up IMasks and logic based on auto-formatting requirements.
77980
78355
  * @private
77981
78356
  * @returns {void}
77982
78357
  */
77983
78358
  configureAutoFormatting() {
77984
- // _configuringMask gates two things: external re-entry into this method
77985
- // while setup is mid-flight (from property changes that call back here),
77986
- // and the accept/complete listeners below both need to ignore the mask
77987
- // events fired by our own value-restore step.
78359
+ // Re-entrancy guard. The patched-setter's synthetic input event (suppressed
78360
+ // by _configuringMask above) could otherwise trigger handleInput
78361
+ // processCreditCard configureAutoFormatting before the outer call's
78362
+ // set value has finished its alignCursor pass.
77988
78363
  if (this._configuringMask) return;
77989
78364
  this._configuringMask = true;
77990
78365
  try {
77991
- // Destroy any prior mask so IMask can attach fresh under the new format.
77992
- // Null the reference too — if the new maskOptions.mask is falsy (e.g.
77993
- // type switched from credit-card to text) the IMask() reassignment
77994
- // below is skipped, and downstream writes at line ~823 would otherwise
77995
- // route through the destroyed instance.
77996
78366
  if (this.maskInstance) {
77997
78367
  this.maskInstance.destroy();
77998
- this.maskInstance = null;
77999
78368
  }
78000
78369
 
78370
+ // Pass new format to util
78001
78371
  this.util.updateFormat(this.format);
78002
78372
 
78003
78373
  const maskOptions = this.util.getMaskOptions(this.type, this.format);
78004
78374
 
78005
78375
  if (this.inputElement && maskOptions.mask) {
78006
- // Capture the current display so it can be re-applied after IMask
78007
- // attaches. The restore at the bottom goes through maskInstance.value
78008
- // (not inputElement.value directly) so the mask's internal state and
78009
- // the input's displayed text stay in lock-step.
78010
- let existingValue = this.inputElement.value;
78011
78376
 
78012
- // Format-change case (e.g. locale switch): existingValue is the OLD
78013
- // mask's display string and may not parse under the new mask. When
78014
- // we have a valid date model, rebuild the display from valueObject
78015
- // (the canonical source) using the new mask's format function.
78377
+ // Stash and clear any existing value before IMask init.
78378
+ // IMask's constructor processes the current input value which requires
78379
+ // selection state clearing first avoids that scenario entirely.
78380
+ // When the format changes (e.g. locale switch) and we have a valid ISO
78381
+ // model value, compute the display string for the NEW format instead of
78382
+ // re-using the old display string, which may be invalid in the new mask.
78383
+ let existingValue = this.inputElement.value;
78016
78384
  if (
78017
78385
  this.util.isFullDateFormat(this.type, this.format) &&
78018
78386
  this.value &&
78019
- this.valueObject &&
78387
+ dateFormatter.isValidDate(this.value) &&
78388
+ this.valueObject instanceof Date &&
78389
+ !Number.isNaN(this.valueObject.getTime()) &&
78020
78390
  typeof maskOptions.format === 'function'
78021
78391
  ) {
78022
78392
  existingValue = maskOptions.format(this.valueObject);
78023
78393
  }
78024
78394
 
78025
- // Clear before IMask attaches so the constructor seeds an empty
78026
- // internal value. Otherwise IMask reads the stale unmasked string
78027
- // and emits a spurious 'accept' before the restore below runs.
78028
78395
  this.skipNextProgrammaticInputEvent = true;
78029
78396
  this.inputElement.value = '';
78030
78397
 
78031
78398
  this.maskInstance = IMask(this.inputElement, maskOptions);
78032
78399
 
78033
- // Mask fires 'accept' on every value change, including the restore
78034
- // step below. Skip events fired during configureAutoFormatting so
78035
- // we don't overwrite a value the parent just pushed.
78036
78400
  this.maskInstance.on('accept', () => {
78401
+ // Suppress propagation during configureAutoFormatting's own value-restoration
78402
+ // (line below) — the mask emits 'accept' on every value-set, including ours,
78403
+ // and we don't want to overwrite a value the parent just pushed.
78037
78404
  if (this._configuringMask) return;
78038
78405
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
78039
78406
  if (this.type === "date") {
@@ -78041,8 +78408,6 @@ class BaseInput extends AuroElement$1$1 {
78041
78408
  }
78042
78409
  });
78043
78410
 
78044
- // Mask fires 'complete' on the restore step below for any value that
78045
- // happens to be a complete match. Same setup-suppression as 'accept'.
78046
78411
  this.maskInstance.on('complete', () => {
78047
78412
  if (this._configuringMask) return;
78048
78413
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
@@ -78051,9 +78416,7 @@ class BaseInput extends AuroElement$1$1 {
78051
78416
  }
78052
78417
  });
78053
78418
 
78054
- // Write existingValue through the mask (not the input directly) so
78055
- // the mask reformats it under the new rules and keeps its internal
78056
- // _value aligned with the input's displayed text.
78419
+ // Restore the stashed value through IMask so it's properly masked
78057
78420
  if (existingValue) {
78058
78421
  this.maskInstance.value = existingValue;
78059
78422
  }
@@ -78221,6 +78584,7 @@ class BaseInput extends AuroElement$1$1 {
78221
78584
  */
78222
78585
  reset() {
78223
78586
  this.value = undefined;
78587
+ this.setDateObjectProperty('valueObject', undefined);
78224
78588
  this.validation.reset(this);
78225
78589
  }
78226
78590
 
@@ -78229,6 +78593,7 @@ class BaseInput extends AuroElement$1$1 {
78229
78593
  */
78230
78594
  clear() {
78231
78595
  this.value = undefined;
78596
+ this.setDateObjectProperty('valueObject', undefined);
78232
78597
  }
78233
78598
 
78234
78599
  /**
@@ -78266,6 +78631,12 @@ class BaseInput extends AuroElement$1$1 {
78266
78631
  */
78267
78632
  get placeholderStr() {
78268
78633
  if (!this.placeholder && this.type === 'date') {
78634
+ // COVERAGE: the `'MM/DD/YYYY'` literal fallback is unreachable in WTR.
78635
+ // connectedCallback (L682) calls configureDataForType, which at L1266-1268
78636
+ // assigns `this.format = this.util.getDateMaskFromLocale().toLowerCase()`
78637
+ // when type=date and format is unset. That runs before the first render
78638
+ // reads this getter, so the ternary's truthy arm always wins. Retained
78639
+ // as a defensive fallback for direct getter calls before connection.
78269
78640
  return this.format ? this.format.toUpperCase() : 'MM/DD/YYYY';
78270
78641
  }
78271
78642
  return this.placeholder || "";
@@ -78757,7 +79128,7 @@ let AuroHelpText$1$1 = class AuroHelpText extends i$2 {
78757
79128
  }
78758
79129
  };
78759
79130
 
78760
- var formkitVersion$1$1 = '202606231948';
79131
+ var formkitVersion$1$1 = '202606232113';
78761
79132
 
78762
79133
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
78763
79134
  // See LICENSE in the project root for license information.
@@ -79878,7 +80249,7 @@ let AuroBibtemplate$1 = class AuroBibtemplate extends i$2 {
79878
80249
  }
79879
80250
  };
79880
80251
 
79881
- var formkitVersion$3 = '202606231948';
80252
+ var formkitVersion$3 = '202606232113';
79882
80253
 
79883
80254
  var styleCss$1$3 = i$4`.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock{display:block}.util_displayFlex{display:flex}.util_displayHidden{display:none}.util_displayHiddenVisually{position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}:host{display:block;text-align:left}:host [auro-dropdown]{--ds-auro-dropdown-trigger-background-color: transparent}:host #inputInBib::part(wrapper){box-shadow:none}:host #inputInBib::part(accent-left){display:none}:host([layout*=classic]) [auro-input]{width:100%}:host([layout*=classic]) [auro-input]::part(helpText){display:none}:host([layout*=classic]) #slotHolder{display:none}`;
79884
80255
 
@@ -80865,7 +81236,7 @@ class AuroCombobox extends AuroElement$3 {
80865
81236
  if (this.menu) {
80866
81237
  this.menu.matchWord = normalizeFilterValue(this.input.value);
80867
81238
  }
80868
- const label = getOptionLabel(this.menu.optionSelected);
81239
+ const label = getOptionLabel(this.menu.optionSelected) || this.menu.currentLabel;
80869
81240
  this.updateTriggerTextDisplay(label || this.value);
80870
81241
  }
80871
81242
 
@@ -80879,9 +81250,40 @@ class AuroCombobox extends AuroElement$3 {
80879
81250
  // in suggestion mode, do not override input value if no selection has been made and the input currently has focus
80880
81251
  const isInputFocusedWithNoSelection = !this.menu.value && (this.input.matches(':focus-within') || (this.inputInBib && this.inputInBib.matches(':focus-within')));
80881
81252
 
80882
- const suppressed = this.persistInput || (this.behavior === 'suggestion' && isInputFocusedWithNoSelection);
80883
- if (!suppressed) {
80884
- this.syncInputValuesAcrossTriggerAndBib(label || this.value);
81253
+ if (!this.persistInput && !(this.behavior === 'suggestion' && isInputFocusedWithNoSelection)) {
81254
+ const nextValue = label || this.value;
81255
+ // Only set the flag when there's an actual write to suppress —
81256
+ // syncValuesAndStates re-enters here during typing when both inputs
81257
+ // already match, and a no-op flag flip would make the bib branch's
81258
+ // bail eat legitimate user-input events.
81259
+ const triggerNeedsSync = this.input.value !== nextValue;
81260
+ const bibNeedsSync = Boolean(this.inputInBib && this.inputInBib !== this.input && this.inputInBib.value !== nextValue);
81261
+ if (triggerNeedsSync || bibNeedsSync) {
81262
+ this._syncingDisplayValue = true;
81263
+ if (triggerNeedsSync) {
81264
+ this.input.value = nextValue;
81265
+ }
81266
+ if (bibNeedsSync) {
81267
+ this.inputInBib.value = nextValue;
81268
+ }
81269
+ const pending = [];
81270
+ if (triggerNeedsSync) {
81271
+ pending.push(this.input.updateComplete);
81272
+ }
81273
+ if (bibNeedsSync) {
81274
+ pending.push(this.inputInBib.updateComplete);
81275
+ }
81276
+ Promise.all(pending).then(() => {
81277
+ // imask reasserts otherwise, and handleBlur reverts to its stale value.
81278
+ if (triggerNeedsSync && this.input.maskInstance && typeof this.input.maskInstance.updateValue === 'function') {
81279
+ this.input.maskInstance.updateValue();
81280
+ }
81281
+ if (bibNeedsSync && this.inputInBib && this.inputInBib.maskInstance && typeof this.inputInBib.maskInstance.updateValue === 'function') {
81282
+ this.inputInBib.maskInstance.updateValue();
81283
+ }
81284
+ this._syncingDisplayValue = false;
81285
+ });
81286
+ }
80885
81287
  }
80886
81288
 
80887
81289
  // update the displayValue in the trigger if displayValue slot content is present
@@ -80909,48 +81311,6 @@ class AuroCombobox extends AuroElement$3 {
80909
81311
  this.requestUpdate();
80910
81312
  }
80911
81313
 
80912
- /**
80913
- * Writes nextValue to the trigger input and the bib input when their current
80914
- * value differs, then re-asserts imask after Lit's update flushes.
80915
- * @param {string} nextValue - The value to write to both inputs.
80916
- * @returns {Promise<void> | null} Promise that resolves after the inputs flush,
80917
- * or null when no sync was needed (so callers can skip post-flush work).
80918
- * @private
80919
- */
80920
- syncInputValuesAcrossTriggerAndBib(nextValue) {
80921
- // Only set the flag when there's an actual write to suppress —
80922
- // syncValuesAndStates re-enters here during typing when both inputs
80923
- // already match, and a no-op flag flip would make the bib branch's
80924
- // bail eat legitimate user-input events.
80925
- const triggerNeedsSync = this.input.value !== nextValue;
80926
- const bibNeedsSync = this.inputInBib.value !== nextValue;
80927
- if (!triggerNeedsSync && !bibNeedsSync) {
80928
- return null;
80929
- }
80930
-
80931
- this._syncingDisplayValue = true;
80932
-
80933
- const pending = [];
80934
- if (triggerNeedsSync) {
80935
- this.input.value = nextValue;
80936
- pending.push(this.input.updateComplete);
80937
- }
80938
- if (bibNeedsSync) {
80939
- this.inputInBib.value = nextValue;
80940
- pending.push(this.inputInBib.updateComplete);
80941
- }
80942
- return Promise.all(pending).then(() => {
80943
- // imask reasserts otherwise, and handleBlur reverts to its stale value.
80944
- if (triggerNeedsSync && this.input.maskInstance && typeof this.input.maskInstance.updateValue === 'function') {
80945
- this.input.maskInstance.updateValue();
80946
- }
80947
- if (bibNeedsSync && this.inputInBib && this.inputInBib.maskInstance && typeof this.inputInBib.maskInstance.updateValue === 'function') {
80948
- this.inputInBib.maskInstance.updateValue();
80949
- }
80950
- this._syncingDisplayValue = false;
80951
- });
80952
- }
80953
-
80954
81314
  /**
80955
81315
  * Processes hidden state of all menu options and determines if there are any available options not hidden.
80956
81316
  * @private
@@ -80978,9 +81338,9 @@ class AuroCombobox extends AuroElement$3 {
80978
81338
  this.syncValuesAndStates();
80979
81339
  }
80980
81340
 
80981
- // Re-activate when optionActive is not in the current scrollable viewport,
80982
- // or when _index has been reset (e.g. by clearSelection in an async update)
80983
- // so that makeSelection() can find the correct option.
81341
+ // Re-activate when optionActive is no longer visible, or when _index has
81342
+ // been reset (e.g. by clearSelection in an async update) so that
81343
+ // makeSelection() can find the correct option.
80984
81344
  if (!this.availableOptions.includes(this.menu.optionActive) || this.menu._index < 0) {
80985
81345
  this.activateFirstEnabledAvailableOption();
80986
81346
  }
@@ -81114,25 +81474,28 @@ class AuroCombobox extends AuroElement$3 {
81114
81474
 
81115
81475
  guardTouchPassthrough$1(this.menu);
81116
81476
 
81117
- // showModal() takes focus away from the trigger. Early focus once
81118
- // the dialog has painted; the shared doubleRaf below is the fallback
81119
- // for when the dialog needs an extra frame and also clears the
81120
- // validation guard.
81477
+ // The dialog's showModal() steals focus from the trigger.
81478
+ // A single rAF is enough for the dialog DOM to be painted and
81479
+ // focusable, then doubleRaf finalizes the transition.
81121
81480
  requestAnimationFrame(() => {
81122
81481
  this.setInputFocus();
81123
81482
  });
81124
- }
81125
- // else (desktop popover-open): Chrome resets the trigger caret to
81126
- // [0, 0] when its floating <label for="…"> overlay receives focus.
81127
- // The shared doubleRaf below parks the caret back at end-of-text
81128
- // after the dropdown layout settles.
81129
-
81130
- doubleRaf$1(() => {
81131
- this.setInputFocus();
81132
- if (this._inFullscreenTransition) {
81483
+
81484
+ doubleRaf$1(() => {
81485
+ this.setInputFocus();
81133
81486
  this._inFullscreenTransition = false;
81134
- }
81135
- });
81487
+ });
81488
+ } else {
81489
+ // Desktop popover-open: restore the trigger caret to end-of-text.
81490
+ // Clicking the trigger lands on auro-input's floating <label for="…">
81491
+ // overlay; Chrome resets the native input's selection to [0, 0] on
81492
+ // label-focus before any JS runs. setInputFocus()'s non-fullscreen
81493
+ // branch parks the caret at end. doubleRaf lets the dropdown layout
81494
+ // settle first, matching the fullscreen branch timing.
81495
+ doubleRaf$1(() => {
81496
+ this.setInputFocus();
81497
+ });
81498
+ }
81136
81499
  }
81137
81500
  });
81138
81501
 
@@ -81343,7 +81706,7 @@ class AuroCombobox extends AuroElement$3 {
81343
81706
  if (this.menu.optionSelected) {
81344
81707
  const selected = this.menu.optionSelected;
81345
81708
 
81346
- if (this.optionSelected !== selected) {
81709
+ if (!this.optionSelected || this.optionSelected !== selected) {
81347
81710
  this.optionSelected = selected;
81348
81711
  }
81349
81712
 
@@ -81356,7 +81719,7 @@ class AuroCombobox extends AuroElement$3 {
81356
81719
  }
81357
81720
 
81358
81721
  // Update display
81359
- this.updateTriggerTextDisplay(getOptionLabel(this.optionSelected));
81722
+ this.updateTriggerTextDisplay(getOptionLabel(this.optionSelected) || this.menu.value);
81360
81723
 
81361
81724
  // Update match word for filtering
81362
81725
  const trimmedInput = normalizeFilterValue(this.input.value);
@@ -81372,22 +81735,13 @@ class AuroCombobox extends AuroElement$3 {
81372
81735
  this.hideBib();
81373
81736
  }
81374
81737
 
81375
- // Move focus to the clear button when the user makes a selection.
81376
- if (!isEcho && this.menu.value !== undefined) {
81377
- this.setClearBtnFocus();
81378
- }
81379
-
81380
81738
  // Announce the selection after the dropdown closes so it isn't
81381
81739
  // overridden by VoiceOver's "collapsed" announcement from aria-expanded.
81382
- // Skip when there's no selected value (e.g. menu.clearSelection() from
81383
- // the unmatched-value path), otherwise VoiceOver reads "undefined".
81384
81740
  const selectedValue = this.menu.value;
81385
- if (selectedValue) {
81386
- const announcementDelay = 300;
81387
- setTimeout(() => {
81388
- announceToScreenReader$1(this._getAnnouncementRoot(), `${selectedValue}, selected`);
81389
- }, announcementDelay);
81390
- }
81741
+ const announcementDelay = 300;
81742
+ setTimeout(() => {
81743
+ announceToScreenReader$1(this._getAnnouncementRoot(), `${selectedValue}, selected`);
81744
+ }, announcementDelay);
81391
81745
  }
81392
81746
 
81393
81747
  // Programmatic value syncs leave availableOptions stale because
@@ -81401,6 +81755,18 @@ class AuroCombobox extends AuroElement$3 {
81401
81755
  this._programmaticFilterRefresh = false;
81402
81756
  }, 0);
81403
81757
  }
81758
+
81759
+ // base-input skips auto-validate when focus is inside its own shadow,
81760
+ // which it is after setTriggerInputFocus — re-run so prior tooShort
81761
+ // clears. processCreditCard reasserts errorMessage on every render.
81762
+ if (!isEcho && this.menu.optionSelected && this.input.validate) {
81763
+ this.input.updateComplete.then(() => {
81764
+ this.input.validate(true);
81765
+ if (this.input.validity === 'valid') {
81766
+ this.input.errorMessage = '';
81767
+ }
81768
+ });
81769
+ }
81404
81770
  });
81405
81771
 
81406
81772
  this.menu.addEventListener('auroMenu-customEventFired', () => {
@@ -81735,7 +82101,15 @@ class AuroCombobox extends AuroElement$3 {
81735
82101
  this.menu.value = undefined;
81736
82102
  this.validation.reset(this);
81737
82103
  this.touched = false;
82104
+ // Force validity back to the cleared state. validation.reset() calls
82105
+ // validate() at the end, and (post-credit-card-fix) the trigger input's
82106
+ // residual validity may still be copied into the combobox by the
82107
+ // auroInputElements loop. Explicitly clear here so reset() actually
82108
+ // leaves the component in a "no validity" state.
81738
82109
  this.validity = undefined;
82110
+ this.errorMessage = '';
82111
+ this.input.validity = undefined;
82112
+ this.input.errorMessage = '';
81739
82113
  }
81740
82114
 
81741
82115
  /**
@@ -81788,27 +82162,52 @@ class AuroCombobox extends AuroElement$3 {
81788
82162
  this.input.value = this.value;
81789
82163
  }
81790
82164
 
81791
- // Sync menu.value only when an option actually matches, or when filter
81792
- // mode needs setMenuValue to dispatch auroMenu-selectValueFailure (the
81793
- // listener at line 1206 clears combobox.value, mirroring select's
81794
- // pattern). Otherwise sync the input display for freeform values.
82165
+ // Sync menu.value only when an option actually matches; otherwise clear it.
81795
82166
  if (this.menu.options && this.menu.options.length > 0) {
81796
- if (this.menu.options.some((opt) => opt.value === this.value) || this.behavior === 'filter') {
82167
+ if (this.menu.options.some((opt) => opt.value === this.value)) {
82168
+ this.setMenuValue(this.value);
82169
+ } else if (this.behavior === 'filter') {
82170
+ // In filter mode, freeform values aren't allowed. Push the unmatched
82171
+ // value through setMenuValue so menu dispatches auroMenu-selectValueFailure
82172
+ // and the listener at line 1206 clears combobox.value (mirrors select's
82173
+ // pattern). Bypassing setMenuValue here would skip the failure cascade.
81797
82174
  this.setMenuValue(this.value);
81798
82175
  } else {
81799
- // Clear menu.value AND menu.optionSelected together. Clearing only
81800
- // menu.value leaves the previously-selected option element pinned
81801
- // as menu.optionSelected; a later auroMenu-selectedOption event
81802
- // would then write its stale .value back into combobox.value.
81803
- if (this.menu.value || this.menu.optionSelected) {
81804
- this.menu.clearSelection();
82176
+ if (this.menu.value) {
82177
+ this.menu.value = undefined;
81805
82178
  }
81806
- // Suggestion-mode freeform value: sync the trigger + bib to show it,
81807
- // then refresh the filter once the inputs flush (handleInputValueChange
81808
- // bailed on _syncingDisplayValue).
81809
- const syncPromise = this.syncInputValuesAcrossTriggerAndBib(this.value || '');
81810
- if (syncPromise) {
81811
- syncPromise.then(() => {
82179
+ // Sync the display for programmatic freeform value changes (e.g. the
82180
+ // swap-values pattern). Guard with _syncingDisplayValue so that the
82181
+ // re-entrant input event from base-input.notifyValueChanged() is
82182
+ // ignored by handleInputValueChange. Skip the sync when input already
82183
+ // matches to avoid spurious events during the normal typing path.
82184
+ const nextValue = this.value || '';
82185
+ const triggerNeedsSync = this.input.value !== nextValue;
82186
+ const bibNeedsSync = Boolean(this.inputInBib && this.inputInBib !== this.input && this.inputInBib.value !== nextValue);
82187
+ if (triggerNeedsSync || bibNeedsSync) {
82188
+ this._syncingDisplayValue = true;
82189
+ if (triggerNeedsSync) {
82190
+ this.input.value = nextValue;
82191
+ }
82192
+ if (bibNeedsSync) {
82193
+ this.inputInBib.value = nextValue;
82194
+ }
82195
+ const pending = [];
82196
+ if (triggerNeedsSync) {
82197
+ pending.push(this.input.updateComplete);
82198
+ }
82199
+ if (bibNeedsSync) {
82200
+ pending.push(this.inputInBib.updateComplete);
82201
+ }
82202
+ Promise.all(pending).then(() => {
82203
+ if (triggerNeedsSync && this.input.maskInstance && typeof this.input.maskInstance.updateValue === 'function') {
82204
+ this.input.maskInstance.updateValue();
82205
+ }
82206
+ if (bibNeedsSync && this.inputInBib && this.inputInBib.maskInstance && typeof this.inputInBib.maskInstance.updateValue === 'function') {
82207
+ this.inputInBib.maskInstance.updateValue();
82208
+ }
82209
+ this._syncingDisplayValue = false;
82210
+ // handleInputValueChange bailed on the flag — refresh the filter.
81812
82211
  this._programmaticFilterRefresh = true;
81813
82212
  this.handleMenuOptions();
81814
82213
  setTimeout(() => {
@@ -88641,7 +89040,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
88641
89040
  }
88642
89041
  };
88643
89042
 
88644
- var formkitVersion$1 = '202606231948';
89043
+ var formkitVersion$1 = '202606232113';
88645
89044
 
88646
89045
  class AuroElement extends i$2 {
88647
89046
  static get properties() {
@@ -90662,7 +91061,7 @@ class AuroHelpText extends i$2 {
90662
91061
  }
90663
91062
  }
90664
91063
 
90665
- var formkitVersion = '202606231948';
91064
+ var formkitVersion = '202606232113';
90666
91065
 
90667
91066
  var styleCss = i$4`.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock{display:block}.util_displayFlex{display:flex}.util_displayHidden{display:none}.util_displayHiddenVisually{position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}.body-default{font-size:var(--wcss-body-default-font-size, 1rem);font-weight:var(--wcss-body-default-weight, );line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default,.body-default-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-default-emphasized{font-size:var(--wcss-body-default-emphasized-font-size, 1rem);font-weight:var(--wcss-body-default-emphasized-weight, );line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.body-lg{font-size:var(--wcss-body-lg-font-size, 1.125rem);font-weight:var(--wcss-body-lg-weight, );line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg,.body-lg-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-lg-emphasized{font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);font-weight:var(--wcss-body-lg-emphasized-weight, );line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{font-size:var(--wcss-body-sm-font-size, 0.875rem);font-weight:var(--wcss-body-sm-weight, );line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm,.body-sm-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-sm-emphasized{font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);font-weight:var(--wcss-body-sm-emphasized-weight, );line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.body-xs{font-size:var(--wcss-body-xs-font-size, 0.75rem);font-weight:var(--wcss-body-xs-weight, );line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs,.body-xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-xs-emphasized{font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);font-weight:var(--wcss-body-xs-emphasized-weight, );line-height:var(--wcss-body-xs-emphasized-line-height, 1rem)}.body-2xs{font-size:var(--wcss-body-2xs-font-size, 0.625rem);font-weight:var(--wcss-body-2xs-weight, );line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs,.body-2xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-2xs-emphasized{font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);font-weight:var(--wcss-body-2xs-emphasized-weight, );line-height:var(--wcss-body-2xs-emphasized-line-height, 0.875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));font-weight:var(--wcss-display-2xl-weight, 300);letter-spacing:var(--wcss-display-2xl-letter-spacing, 0);line-height:var(--wcss-display-2xl-line-height, 1.3)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));font-weight:var(--wcss-display-xl-weight, 300);letter-spacing:var(--wcss-display-xl-letter-spacing, 0);line-height:var(--wcss-display-xl-line-height, 1.3)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));font-weight:var(--wcss-display-lg-weight, 300);letter-spacing:var(--wcss-display-lg-letter-spacing, 0);line-height:var(--wcss-display-lg-line-height, 1.3)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));font-weight:var(--wcss-display-md-weight, 300);letter-spacing:var(--wcss-display-md-letter-spacing, 0);line-height:var(--wcss-display-md-line-height, 1.3)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));font-weight:var(--wcss-display-sm-weight, 300);letter-spacing:var(--wcss-display-sm-letter-spacing, 0);line-height:var(--wcss-display-sm-line-height, 1.3)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));font-weight:var(--wcss-display-xs-weight, 300);letter-spacing:var(--wcss-display-xs-letter-spacing, 0);line-height:var(--wcss-display-xs-line-height, 1.3)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));font-weight:var(--wcss-heading-xl-weight, 300);letter-spacing:var(--wcss-heading-xl-letter-spacing, 0);line-height:var(--wcss-heading-xl-line-height, 1.3)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));font-weight:var(--wcss-heading-lg-weight, 300);letter-spacing:var(--wcss-heading-lg-letter-spacing, 0);line-height:var(--wcss-heading-lg-line-height, 1.3)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));font-weight:var(--wcss-heading-md-weight, 300);letter-spacing:var(--wcss-heading-md-letter-spacing, 0);line-height:var(--wcss-heading-md-line-height, 1.3)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));font-weight:var(--wcss-heading-sm-weight, 300);letter-spacing:var(--wcss-heading-sm-letter-spacing, 0);line-height:var(--wcss-heading-sm-line-height, 1.3)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));font-weight:var(--wcss-heading-xs-weight, 300);letter-spacing:var(--wcss-heading-xs-letter-spacing, 0);line-height:var(--wcss-heading-xs-line-height, 1.3)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));font-weight:var(--wcss-heading-2xs-weight, 300);letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0);line-height:var(--wcss-heading-2xs-line-height, 1.3)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));font-weight:var(--wcss-accent-2xl-weight, 450);letter-spacing:var(--wcss-accent-2xl-letter-spacing, 0.05em);line-height:var(--wcss-accent-2xl-line-height, 1)}.accent-2xl,.accent-xl{text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));font-weight:var(--wcss-accent-xl-weight, 450);letter-spacing:var(--wcss-accent-xl-letter-spacing, 0.05em);line-height:var(--wcss-accent-xl-line-height, 1.3)}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));font-weight:var(--wcss-accent-lg-weight, 450);letter-spacing:var(--wcss-accent-lg-letter-spacing, 0.05em);line-height:var(--wcss-accent-lg-line-height, 1.3)}.accent-lg,.accent-md{text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));font-weight:var(--wcss-accent-md-weight, 500);letter-spacing:var(--wcss-accent-md-letter-spacing, 0.05em);line-height:var(--wcss-accent-md-line-height, 1.3)}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));font-weight:var(--wcss-accent-sm-weight, 500);letter-spacing:var(--wcss-accent-sm-letter-spacing, 0.05em);line-height:var(--wcss-accent-sm-line-height, 1.3)}.accent-sm,.accent-xs{text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));font-weight:var(--wcss-accent-xs-weight, 500);letter-spacing:var(--wcss-accent-xs-letter-spacing, 0.1em);line-height:var(--wcss-accent-xs-line-height, 1.3)}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xs-font-size, clamp(0.875rem, 1.1666666667vw, 0.875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}[auro-dropdown]{--ds-auro-dropdown-trigger-border-color: var(--ds-auro-select-border-color);--ds-auro-dropdown-trigger-background-color: var(--ds-auro-select-background-color);--ds-auro-dropdown-trigger-container-color: var(--ds-auro-select-background-color);--ds-auro-dropdown-trigger-outline-color: var(--ds-auro-select-outline-color)}:host{display:inline-block;text-align:left;vertical-align:top}:host([layout*=emphasized]) [auro-dropdown],:host([layout*=snowflake]) [auro-dropdown]{--ds-auro-select-border-color: transparent}:host([layout*=emphasized]) .mainContent,:host([layout*=snowflake]) .mainContent{text-align:center}.mainContent{position:relative;display:flex;overflow:hidden;flex:1;flex-direction:column;align-items:center;justify-content:center}.valueContainer [slot=displayValue]{display:none}.accents{display:flex;flex-direction:row;align-items:center;justify-content:center}::slotted([slot=typeIcon]){margin-right:var(--ds-size-100, 0.5rem)}.displayValue{display:block}.displayValue:not(.force){display:none}.displayValue:not(.force).hasContent:is(.withValue):not(.hasFocus){display:block}.triggerContent{display:flex;width:100%;align-items:center;justify-content:center}:host([layout*=emphasized]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem) 0 var(--ds-size-300, 1.5rem)}:host([layout*=snowflake]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem) 0 var(--ds-size-200, 1rem)}:host([layout*=snowflake]) label{padding-block:var(--ds-size-25, 0.125rem)}:host([layout*=classic]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem)}:host([layout*=classic]) .mainContent{align-items:start}:host([layout*=classic]) label{overflow:hidden;cursor:text;text-overflow:ellipsis;white-space:nowrap}:host([layout*=classic]) .value{height:auto}label{color:var(--ds-auro-select-label-text-color)}:host(:is([validity]:not([validity=valid]))) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-basic-color-status-error, #e31f26);--ds-auro-select-outline-color: var(--ds-basic-color-status-error, #e31f26);--ds-auro-dropdown-helptext-text-color: var(--ds-basic-color-texticon-default, #2a2a2a)}:host([ondark]:is([validity]:not([validity=valid]))) [auro-dropdown],:host([appearance=inverse]:is([validity]:not([validity=valid]))) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-advanced-color-state-error-inverse, #f9a4a8);--ds-auro-select-outline-color: var(--ds-advanced-color-state-error-inverse, #f9a4a8);--ds-auro-dropdown-helptext-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}#slotHolder{display:none}:host([fluid]){width:100%}:host([disabled]){pointer-events:none;user-select:none}:host([disabled]:not([ondark])) [auro-dropdown],:host([disabled]:not([appearance=inverse])) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-basic-color-border-subtle, #dddddd)}:host(:not([layout*=classic])[disabled][ondark]) [auro-dropdown],:host(:not([layout*=classic])[disabled][appearance=inverse]) [auro-dropdown]{--ds-auro-select-border-color: transparent}`;
90668
91067