@aurodesignsystem-dev/auro-formkit 0.0.0-pr1516.0 → 0.0.0-pr1519.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/components/checkbox/demo/customize.min.js +18 -10
  2. package/components/checkbox/demo/getting-started.min.js +18 -10
  3. package/components/checkbox/demo/index.min.js +18 -10
  4. package/components/checkbox/dist/index.js +18 -10
  5. package/components/checkbox/dist/registered.js +18 -10
  6. package/components/combobox/README.md +1 -1
  7. package/components/combobox/demo/customize.md +2 -10
  8. package/components/combobox/demo/customize.min.js +454 -467
  9. package/components/combobox/demo/getting-started.min.js +454 -463
  10. package/components/combobox/demo/index.md +1 -1
  11. package/components/combobox/demo/index.min.js +454 -463
  12. package/components/combobox/demo/keyboard-behavior.md +2 -142
  13. package/components/combobox/demo/readme.md +1 -1
  14. package/components/combobox/demo/why-combobox.md +2 -2
  15. package/components/combobox/dist/auro-combobox.d.ts +30 -14
  16. package/components/combobox/dist/index.js +454 -463
  17. package/components/combobox/dist/registered.js +454 -463
  18. package/components/counter/demo/customize.min.js +32 -12
  19. package/components/counter/demo/index.min.js +32 -12
  20. package/components/counter/dist/index.js +32 -12
  21. package/components/counter/dist/registered.js +32 -12
  22. package/components/datepicker/demo/customize.min.js +183 -167
  23. package/components/datepicker/demo/index.min.js +183 -167
  24. package/components/datepicker/dist/index.js +183 -167
  25. package/components/datepicker/dist/registered.js +183 -167
  26. package/components/dropdown/demo/customize.min.js +14 -2
  27. package/components/dropdown/demo/getting-started.min.js +14 -2
  28. package/components/dropdown/demo/index.min.js +14 -2
  29. package/components/dropdown/dist/index.js +14 -2
  30. package/components/dropdown/dist/registered.js +14 -2
  31. package/components/form/demo/customize.min.js +851 -829
  32. package/components/form/demo/getting-started.min.js +851 -829
  33. package/components/form/demo/index.min.js +851 -829
  34. package/components/form/demo/registerDemoDeps.min.js +851 -829
  35. package/components/input/demo/api.md +58 -57
  36. package/components/input/demo/customize.min.js +114 -155
  37. package/components/input/demo/getting-started.min.js +114 -155
  38. package/components/input/demo/index.min.js +114 -155
  39. package/components/input/dist/base-input.d.ts +9 -51
  40. package/components/input/dist/index.js +114 -155
  41. package/components/input/dist/registered.js +114 -155
  42. package/components/input/dist/utilities.d.ts +9 -0
  43. package/components/radio/demo/customize.min.js +18 -10
  44. package/components/radio/demo/getting-started.min.js +18 -10
  45. package/components/radio/demo/index.min.js +18 -10
  46. package/components/radio/dist/index.js +18 -10
  47. package/components/radio/dist/registered.js +18 -10
  48. package/components/select/demo/customize.min.js +32 -12
  49. package/components/select/demo/getting-started.min.js +32 -12
  50. package/components/select/demo/index.min.js +32 -12
  51. package/components/select/dist/index.js +32 -12
  52. package/components/select/dist/registered.js +32 -12
  53. package/custom-elements.json +142 -278
  54. package/package.json +1 -1
@@ -559,11 +559,17 @@ let AuroFormValidation$1 = class AuroFormValidation {
559
559
  return;
560
560
  }
561
561
 
562
- // Validate that the date passed was the correct format and is a valid date
562
+ // Validate that the date passed was the correct format and is a valid date.
563
+ // For partial date formats, valueObject is never populated; validate them directly.
563
564
  if (elem.value && !elem.valueObject) {
564
- elem.validity = 'patternMismatch';
565
- elem.errorMessage = elem.setCustomValidityPatternMismatch || elem.setCustomValidity || 'Invalid Date Format Entered';
566
- return;
565
+ const isPartialDateFormat = elem.util && !elem.util.isFullDateFormat(elem.type, elem.format);
566
+ const isValidPartial = isPartialDateFormat && elem.util.isValidPartialDate(elem.value, elem.format);
567
+
568
+ if (!isValidPartial) {
569
+ elem.validity = 'patternMismatch';
570
+ elem.errorMessage = elem.setCustomValidityPatternMismatch || elem.setCustomValidity || 'Invalid Date Format Entered';
571
+ return;
572
+ }
567
573
  }
568
574
 
569
575
  // Perform the rest of the validation
@@ -657,15 +663,17 @@ let AuroFormValidation$1 = class AuroFormValidation {
657
663
  );
658
664
  }
659
665
 
660
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
661
- if (this.auroInputElements?.length === 2) {
662
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
666
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
667
+
668
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
669
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
670
+ // field (datepicker is the intended consumer — start/end are independently required).
671
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
672
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
663
673
  hasValue = false;
664
674
  }
665
675
  }
666
676
 
667
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
668
-
669
677
  if (isCombobox) {
670
678
 
671
679
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -10488,6 +10496,42 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
10488
10496
  return type === 'date' && normalizedFormat.includes('yy') && normalizedFormat.includes('mm') && normalizedFormat.includes('dd');
10489
10497
  }
10490
10498
 
10499
+ /**
10500
+ * Validates a value against a partial date format (one that lacks yy/mm/dd all three).
10501
+ * Single-component formats are checked as integer ranges; multi-component formats use
10502
+ * a date-fns parse + round-trip to confirm both validity and exact formatting.
10503
+ * @param {string} value - The user-facing display value.
10504
+ * @param {string} format - The partial date format string (e.g. "mm/yyyy", "yyyy", "dd").
10505
+ * @returns {boolean}
10506
+ */
10507
+ isValidPartialDate(value, format) {
10508
+ if (!value || !format) {
10509
+ return false;
10510
+ }
10511
+ const normalizedFormat = format.toLowerCase();
10512
+
10513
+ if (normalizedFormat === 'dd') {
10514
+ const num = Number(value);
10515
+ return (/^\d{2}$/u).test(value) && num >= 1 && num <= 31;
10516
+ }
10517
+ if (normalizedFormat === 'yy') {
10518
+ const num = Number(value);
10519
+ return (/^\d{2}$/u).test(value) && num >= 0 && num <= 99;
10520
+ }
10521
+ if (normalizedFormat === 'yyyy') {
10522
+ const num = Number(value);
10523
+ return (/^\d{4}$/u).test(value) && num >= 1 && num <= 9999;
10524
+ }
10525
+
10526
+ const dateFnsMask = this.toDateFnsMask(normalizedFormat);
10527
+ // Use the 1st of the current month as the reference so that formats
10528
+ // omitting a day (e.g. MM/yyyy) never roll over on days 29–31.
10529
+ const referenceDate = new Date();
10530
+ referenceDate.setDate(1);
10531
+ const parsed = parse$1(value, dateFnsMask, referenceDate);
10532
+ return isValid$1(parsed) && format$1(parsed, dateFnsMask) === value;
10533
+ }
10534
+
10491
10535
  /**
10492
10536
  * Converts a display string to its model value.
10493
10537
  * For full date formats, converts the display string to an ISO date string.
@@ -10535,6 +10579,7 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
10535
10579
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
10536
10580
 
10537
10581
  if (!(valueObject instanceof Date) || Number.isNaN(valueObject.getTime()) || !maskOptions || typeof maskOptions.format !== 'function') {
10582
+ console.debug('Invalid date object or mask options for formatting', { valueObject, maskOptions }); // eslint-disable-line no-console
10538
10583
  return undefined;
10539
10584
  }
10540
10585
 
@@ -13591,7 +13636,7 @@ class AuroBibtemplate extends i$1 {
13591
13636
  }
13592
13637
  }
13593
13638
 
13594
- var formkitVersion$2 = '202606292156';
13639
+ var formkitVersion$2 = '202607011722';
13595
13640
 
13596
13641
  let l$1 = 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 = 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$4 = 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$3=i$3`: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}
13597
13642
  `,u$6=i$3`.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}}
@@ -19367,7 +19412,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$1 {
19367
19412
  }
19368
19413
  };
19369
19414
 
19370
- var formkitVersion$1 = '202606292156';
19415
+ var formkitVersion$1 = '202607011722';
19371
19416
 
19372
19417
  let AuroElement$2 = class AuroElement extends i$1 {
19373
19418
  static get properties() {
@@ -20119,7 +20164,19 @@ class AuroDropdown extends AuroElement$2 {
20119
20164
  if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown") {
20120
20165
  this.trigger.focus();
20121
20166
  }
20122
- }
20167
+
20168
+
20169
+ if (!this.isPopoverVisible) {
20170
+ // wait til the bib gets fully closed and rendered
20171
+ setTimeout(() => {
20172
+ // check if it's still closed and the focus is still within the dropdown, but not in the bib. If so, move focus to the trigger.
20173
+ if (!this.isPopoverVisible || !this.bib.matches(':focus-within')) {
20174
+ return;
20175
+ }
20176
+ // Move focus out of bib into trigger.
20177
+ this.trigger.focus();
20178
+ });
20179
+ } }
20123
20180
 
20124
20181
  firstUpdated() {
20125
20182
  // Configure the floater to, this will generate the ID for the bib
@@ -25051,11 +25108,17 @@ class AuroFormValidation {
25051
25108
  return;
25052
25109
  }
25053
25110
 
25054
- // Validate that the date passed was the correct format and is a valid date
25111
+ // Validate that the date passed was the correct format and is a valid date.
25112
+ // For partial date formats, valueObject is never populated; validate them directly.
25055
25113
  if (elem.value && !elem.valueObject) {
25056
- elem.validity = 'patternMismatch';
25057
- elem.errorMessage = elem.setCustomValidityPatternMismatch || elem.setCustomValidity || 'Invalid Date Format Entered';
25058
- return;
25114
+ const isPartialDateFormat = elem.util && !elem.util.isFullDateFormat(elem.type, elem.format);
25115
+ const isValidPartial = isPartialDateFormat && elem.util.isValidPartialDate(elem.value, elem.format);
25116
+
25117
+ if (!isValidPartial) {
25118
+ elem.validity = 'patternMismatch';
25119
+ elem.errorMessage = elem.setCustomValidityPatternMismatch || elem.setCustomValidity || 'Invalid Date Format Entered';
25120
+ return;
25121
+ }
25059
25122
  }
25060
25123
 
25061
25124
  // Perform the rest of the validation
@@ -25149,15 +25212,17 @@ class AuroFormValidation {
25149
25212
  );
25150
25213
  }
25151
25214
 
25152
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
25153
- if (this.auroInputElements?.length === 2) {
25154
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
25215
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
25216
+
25217
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
25218
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
25219
+ // field (datepicker is the intended consumer — start/end are independently required).
25220
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
25221
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
25155
25222
  hasValue = false;
25156
25223
  }
25157
25224
  }
25158
25225
 
25159
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
25160
-
25161
25226
  if (isCombobox) {
25162
25227
 
25163
25228
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -31057,6 +31122,42 @@ class AuroInputUtilities {
31057
31122
  return type === 'date' && normalizedFormat.includes('yy') && normalizedFormat.includes('mm') && normalizedFormat.includes('dd');
31058
31123
  }
31059
31124
 
31125
+ /**
31126
+ * Validates a value against a partial date format (one that lacks yy/mm/dd all three).
31127
+ * Single-component formats are checked as integer ranges; multi-component formats use
31128
+ * a date-fns parse + round-trip to confirm both validity and exact formatting.
31129
+ * @param {string} value - The user-facing display value.
31130
+ * @param {string} format - The partial date format string (e.g. "mm/yyyy", "yyyy", "dd").
31131
+ * @returns {boolean}
31132
+ */
31133
+ isValidPartialDate(value, format$1) {
31134
+ if (!value || !format$1) {
31135
+ return false;
31136
+ }
31137
+ const normalizedFormat = format$1.toLowerCase();
31138
+
31139
+ if (normalizedFormat === 'dd') {
31140
+ const num = Number(value);
31141
+ return (/^\d{2}$/u).test(value) && num >= 1 && num <= 31;
31142
+ }
31143
+ if (normalizedFormat === 'yy') {
31144
+ const num = Number(value);
31145
+ return (/^\d{2}$/u).test(value) && num >= 0 && num <= 99;
31146
+ }
31147
+ if (normalizedFormat === 'yyyy') {
31148
+ const num = Number(value);
31149
+ return (/^\d{4}$/u).test(value) && num >= 1 && num <= 9999;
31150
+ }
31151
+
31152
+ const dateFnsMask = this.toDateFnsMask(normalizedFormat);
31153
+ // Use the 1st of the current month as the reference so that formats
31154
+ // omitting a day (e.g. MM/yyyy) never roll over on days 29–31.
31155
+ const referenceDate = new Date();
31156
+ referenceDate.setDate(1);
31157
+ const parsed = parse(value, dateFnsMask, referenceDate);
31158
+ return isValid(parsed) && format(parsed, dateFnsMask) === value;
31159
+ }
31160
+
31060
31161
  /**
31061
31162
  * Converts a display string to its model value.
31062
31163
  * For full date formats, converts the display string to an ISO date string.
@@ -31104,6 +31205,7 @@ class AuroInputUtilities {
31104
31205
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
31105
31206
 
31106
31207
  if (!(valueObject instanceof Date) || Number.isNaN(valueObject.getTime()) || !maskOptions || typeof maskOptions.format !== 'function') {
31208
+ console.debug('Invalid date object or mask options for formatting', { valueObject, maskOptions }); // eslint-disable-line no-console
31107
31209
  return undefined;
31108
31210
  }
31109
31211
 
@@ -31261,6 +31363,7 @@ class BaseInput extends AuroElement$1 {
31261
31363
  // so a parent (datepicker/combobox) calling `validate()` synchronously
31262
31364
  // during its own update cycle sees a populated util instance.
31263
31365
  this.activeLabel = false;
31366
+
31264
31367
  /** @private */
31265
31368
  this.allowedInputTypes = [
31266
31369
  "text",
@@ -31271,6 +31374,7 @@ class BaseInput extends AuroElement$1 {
31271
31374
  "tel"
31272
31375
  ];
31273
31376
  this.appearance = "default";
31377
+
31274
31378
  /** @private */
31275
31379
  this.dateFormatMap = {
31276
31380
  'mm/dd/yyyy': 'dateMMDDYYYY',
@@ -31289,23 +31393,24 @@ class BaseInput extends AuroElement$1 {
31289
31393
  'mm/dd': 'dateMMDD'
31290
31394
  };
31291
31395
  this.disabled = false;
31396
+
31292
31397
  /** @private */
31293
31398
  this.domHandler = new DomHandler();
31294
31399
  this.dvInputOnly = false;
31295
31400
  this.hasValue = false;
31296
31401
  this.hideLabelVisually = false;
31297
31402
  this.icon = false;
31403
+
31298
31404
  /** @private */
31299
31405
  this.inputIconName = undefined;
31406
+
31300
31407
  /** @private */
31301
31408
  this.label = 'Input label is undefined';
31302
31409
  this.layout = 'classic';
31303
31410
  this.locale = 'en-US';
31304
31411
  this.max = undefined;
31305
- this._maxObject = undefined;
31306
31412
  this.maxLength = undefined;
31307
31413
  this.min = undefined;
31308
- this._minObject = undefined;
31309
31414
  this.minLength = undefined;
31310
31415
  this.noValidate = false;
31311
31416
  this.onDark = false;
@@ -31322,23 +31427,27 @@ class BaseInput extends AuroElement$1 {
31322
31427
  "email"
31323
31428
  ];
31324
31429
  this.shape = 'classic';
31430
+
31325
31431
  /** @private */
31326
31432
  this.showPassword = false;
31327
31433
  this.size = 'lg';
31328
31434
  this.touched = false;
31435
+
31329
31436
  /** @private */
31330
31437
  this.uniqueId = new UniqueId().create();
31438
+
31331
31439
  /** @private */
31332
31440
  this.util = new AuroInputUtilities({
31333
31441
  locale: this.locale,
31334
31442
  format: this.format
31335
31443
  });
31444
+
31336
31445
  /** @private */
31337
31446
  this.validation = new AuroFormValidation();
31447
+
31338
31448
  /** @private */
31339
31449
  this.validationCCLength = undefined;
31340
31450
  this.value = undefined;
31341
- this._valueObject = undefined;
31342
31451
  }
31343
31452
 
31344
31453
  // function to define props used within the scope of this component
@@ -31668,6 +31777,13 @@ class BaseInput extends AuroElement$1 {
31668
31777
  type: String
31669
31778
  },
31670
31779
 
31780
+ /**
31781
+ * Custom help text message to display when validity = `patternMismatch`.
31782
+ */
31783
+ setCustomValidityPatternMismatch: {
31784
+ type: String
31785
+ },
31786
+
31671
31787
  /**
31672
31788
  * Custom help text message to display when validity = `rangeOverflow`.
31673
31789
  */
@@ -31738,7 +31854,7 @@ class BaseInput extends AuroElement$1 {
31738
31854
 
31739
31855
  /**
31740
31856
  * Populates the `type` attribute on the input.
31741
- * @type {'text' | 'password' | 'email' | 'credit-card' | 'tel' | 'number'}
31857
+ * @type {'text' | 'password' | 'email' | 'credit-card' | 'tel' | 'number' | 'date'}
31742
31858
  * @default 'text'
31743
31859
  */
31744
31860
  type: {
@@ -31776,7 +31892,7 @@ class BaseInput extends AuroElement$1 {
31776
31892
  * @returns {Date|undefined}
31777
31893
  */
31778
31894
  get valueObject() {
31779
- return this._valueObject || this._computeDateObjectFallback(this.value);
31895
+ return this.value && dateFormatter.isValidDate(this.value) ? dateFormatter.stringToDateInstance(this.value) : undefined;
31780
31896
  }
31781
31897
 
31782
31898
  /**
@@ -31784,7 +31900,7 @@ class BaseInput extends AuroElement$1 {
31784
31900
  * @returns {Date|undefined}
31785
31901
  */
31786
31902
  get minObject() {
31787
- return this._minObject || this._computeDateObjectFallback(this.min);
31903
+ return this.min && dateFormatter.isValidDate(this.min) ? dateFormatter.stringToDateInstance(this.min) : undefined;
31788
31904
  }
31789
31905
 
31790
31906
  /**
@@ -31792,50 +31908,7 @@ class BaseInput extends AuroElement$1 {
31792
31908
  * @returns {Date|undefined}
31793
31909
  */
31794
31910
  get maxObject() {
31795
- return this._maxObject || this._computeDateObjectFallback(this.max);
31796
- }
31797
-
31798
- /**
31799
- * Parses a date string into a Date object when the corresponding `_*Object`
31800
- * field hasn't been synced yet by `updated()`. Returns undefined when the
31801
- * input type/format isn't a full date or the string is not a valid date.
31802
- *
31803
- * Why this exists: a parent (datepicker) can call `inputN.validate()` from
31804
- * inside its own `updated()` before this input's `updated()` has run
31805
- * `syncDateValues()` — so `_valueObject`/`_maxObject` are still `undefined`
31806
- * and range checks would otherwise silently no-op (flipping the result to
31807
- * `valid` or `patternMismatch`).
31808
- * @private
31809
- * @param {string|undefined} dateStr - ISO date string from `value`/`min`/`max`.
31810
- * @returns {Date|undefined}
31811
- */
31812
- _computeDateObjectFallback(dateStr) {
31813
- if (!dateStr || !this.util || !this.util.isFullDateFormat(this.type, this.format)) {
31814
- return undefined;
31815
- }
31816
- if (!dateFormatter.isValidDate(dateStr)) {
31817
- return undefined;
31818
- }
31819
- return dateFormatter.stringToDateInstance(dateStr);
31820
- }
31821
-
31822
- /**
31823
- * Internal setter for readonly date object properties.
31824
- * @private
31825
- * @param {'valueObject'|'minObject'|'maxObject'} propertyName - Public object property name.
31826
- * @param {Date|undefined} propertyValue - Value to assign.
31827
- * @returns {void}
31828
- */
31829
- setDateObjectProperty(propertyName, propertyValue) {
31830
- const internalPropertyName = `_${propertyName}`;
31831
- const previousValue = this[internalPropertyName];
31832
-
31833
- if (previousValue === propertyValue) {
31834
- return;
31835
- }
31836
-
31837
- this[internalPropertyName] = propertyValue;
31838
- this.requestUpdate(propertyName, previousValue);
31911
+ return this.max && dateFormatter.isValidDate(this.max) ? dateFormatter.stringToDateInstance(this.max) : undefined;
31839
31912
  }
31840
31913
 
31841
31914
  connectedCallback() {
@@ -31864,7 +31937,6 @@ class BaseInput extends AuroElement$1 {
31864
31937
  format: this.format
31865
31938
  });
31866
31939
  this.configureDataForType();
31867
- this.syncDateValues();
31868
31940
  }
31869
31941
 
31870
31942
  disconnectedCallback() {
@@ -31903,7 +31975,6 @@ class BaseInput extends AuroElement$1 {
31903
31975
  this.setCustomHelpTextMessage();
31904
31976
  this.configureAutoFormatting();
31905
31977
  this.configureDataForType();
31906
- this.syncDateValues();
31907
31978
  }
31908
31979
 
31909
31980
  /**
@@ -32047,8 +32118,6 @@ class BaseInput extends AuroElement$1 {
32047
32118
  this.configureDataForType();
32048
32119
  }
32049
32120
 
32050
- this.syncDateValues(changedProperties);
32051
-
32052
32121
  if (changedProperties.has('value')) {
32053
32122
  if (this.value && this.value.length > 0) {
32054
32123
  this.hasValue = true;
@@ -32070,14 +32139,14 @@ class BaseInput extends AuroElement$1 {
32070
32139
 
32071
32140
  if (formattedValue !== this.inputElement.value) {
32072
32141
  this.skipNextProgrammaticInputEvent = true;
32073
- if (this.maskInstance && this.type === 'credit-card') {
32142
+ if (this.maskInstance && this.type !== 'date') {
32074
32143
  // Route through the mask so its _value and el.value stay in lock-step
32075
32144
  // (set value calls updateControl which writes el.value = displayValue).
32076
32145
  // Writing el.value directly leaves the mask thinking displayValue is
32077
- // stale; _saveSelection on the next focus/click then warns. Scoped to
32078
- // credit-card so date's own formattedValue (raw ISO when calendar-invalid)
32079
- // isn't re-masked through the mm/dd/yyyy mask, which would truncate it
32080
- // and flip validity from patternMismatch to tooShort.
32146
+ // stale; _saveSelection on the next focus/click then warns. Date is
32147
+ // excluded because its formattedValue can be raw ISO when the calendar
32148
+ // is invalid, and re-masking through mm/dd/yyyy would truncate it and
32149
+ // flip validity from patternMismatch to tooShort.
32081
32150
  this.maskInstance.value = formattedValue || '';
32082
32151
  } else if (formattedValue) {
32083
32152
  this.inputElement.value = formattedValue;
@@ -32119,120 +32188,65 @@ class BaseInput extends AuroElement$1 {
32119
32188
  }));
32120
32189
  }
32121
32190
 
32122
-
32123
- /**
32124
- * Synchronizes the ISO string values and Date object representations for date-related properties.
32125
- * This keeps the model and display values aligned when either side changes.
32126
- *
32127
- * When a full date format is in use, this method updates `value`, `min`, and `max` from their corresponding
32128
- * Date objects or vice versa, based on which properties have changed. It only runs when the current configuration
32129
- * represents a full year/month/day date format.
32130
- *
32131
- * @param {Map<string, unknown>|undefined} [changedProperties=undefined] - Optional map of changed properties used to limit which values are synchronized.
32132
- * @returns {void}
32133
- * @private
32134
- */
32135
- syncDateValues(changedProperties = undefined) {
32136
- if (!this.util.isFullDateFormat(this.type, this.format)) {
32137
- return;
32138
- }
32139
-
32140
- this.syncSingleDateValue(changedProperties, 'valueObject', 'value');
32141
- this.syncSingleDateValue(changedProperties, 'minObject', 'min');
32142
- this.syncSingleDateValue(changedProperties, 'maxObject', 'max');
32143
- }
32144
-
32145
- /**
32146
- * Synchronizes one date object/string property pair.
32147
- * @private
32148
- * @param {Map<string, unknown>|undefined} changedProperties - Map of changed properties from Lit.
32149
- * @param {string} objectProperty - Date object property name.
32150
- * @param {string} valueProperty - ISO string property name.
32151
- * @returns {void}
32152
- */
32153
- syncSingleDateValue(changedProperties, objectProperty, valueProperty) {
32154
- const objectPropertyChanged = !changedProperties || changedProperties.has(objectProperty);
32155
-
32156
- // objectProperty wins over valueProperty when both changed
32157
- if (objectPropertyChanged && this[objectProperty]) {
32158
- this[valueProperty] = dateFormatter.toISOFormatString(this[objectProperty]);
32159
- return;
32160
- }
32161
-
32162
- const valuePropertyChanged = !changedProperties || changedProperties.has(valueProperty);
32163
- if (!valuePropertyChanged) {
32164
- return;
32165
- }
32166
-
32167
- // 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)
32168
- if (
32169
- changedProperties &&
32170
- valueProperty === 'value' &&
32171
- changedProperties.get('value') === undefined &&
32172
- this[objectProperty] instanceof Date &&
32173
- this[valueProperty] === dateFormatter.toISOFormatString(this[objectProperty])
32174
- ) {
32175
- return;
32176
- }
32177
-
32178
- if (dateFormatter.isValidDate(this[valueProperty])) {
32179
- this.setDateObjectProperty(objectProperty, dateFormatter.stringToDateInstance(this[valueProperty]));
32180
- } else {
32181
- this.setDateObjectProperty(objectProperty, undefined);
32182
- }
32183
- }
32184
-
32185
32191
  /**
32186
32192
  * Sets up IMasks and logic based on auto-formatting requirements.
32187
32193
  * @private
32188
32194
  * @returns {void}
32189
32195
  */
32190
32196
  configureAutoFormatting() {
32191
- // Re-entrancy guard. The patched-setter's synthetic input event (suppressed
32192
- // by _configuringMask above) could otherwise trigger handleInput
32193
- // processCreditCard configureAutoFormatting before the outer call's
32194
- // set value has finished its alignCursor pass.
32197
+ // _configuringMask gates two things: external re-entry into this method
32198
+ // while setup is mid-flight (from property changes that call back here),
32199
+ // and the accept/complete listeners below — both need to ignore the mask
32200
+ // events fired by our own value-restore step.
32195
32201
  if (this._configuringMask) return;
32196
32202
  this._configuringMask = true;
32197
32203
  try {
32204
+ // Destroy any prior mask so IMask can attach fresh under the new format.
32205
+ // Null the reference too — if the new maskOptions.mask is falsy (e.g.
32206
+ // type switched from credit-card to text) the IMask() reassignment
32207
+ // below is skipped, and downstream writes at line ~823 would otherwise
32208
+ // route through the destroyed instance.
32198
32209
  if (this.maskInstance) {
32199
32210
  this.maskInstance.destroy();
32211
+ this.maskInstance = null;
32200
32212
  }
32201
32213
 
32202
- // Pass new format to util
32203
32214
  this.util.updateFormat(this.format);
32204
32215
 
32205
32216
  const maskOptions = this.util.getMaskOptions(this.type, this.format);
32206
32217
 
32207
32218
  if (this.inputElement && maskOptions.mask) {
32208
-
32209
- // Stash and clear any existing value before IMask init.
32210
- // IMask's constructor processes the current input value which requires
32211
- // selection state clearing first avoids that scenario entirely.
32212
- // When the format changes (e.g. locale switch) and we have a valid ISO
32213
- // model value, compute the display string for the NEW format instead of
32214
- // re-using the old display string, which may be invalid in the new mask.
32219
+ // Capture the current display so it can be re-applied after IMask
32220
+ // attaches. The restore at the bottom goes through maskInstance.value
32221
+ // (not inputElement.value directly) so the mask's internal state and
32222
+ // the input's displayed text stay in lock-step.
32215
32223
  let existingValue = this.inputElement.value;
32224
+
32225
+ // Format-change case (e.g. locale switch): existingValue is the OLD
32226
+ // mask's display string and may not parse under the new mask. When
32227
+ // we have a valid date model, rebuild the display from valueObject
32228
+ // (the canonical source) using the new mask's format function.
32216
32229
  if (
32217
32230
  this.util.isFullDateFormat(this.type, this.format) &&
32218
32231
  this.value &&
32219
- dateFormatter.isValidDate(this.value) &&
32220
- this.valueObject instanceof Date &&
32221
- !Number.isNaN(this.valueObject.getTime()) &&
32232
+ this.valueObject &&
32222
32233
  typeof maskOptions.format === 'function'
32223
32234
  ) {
32224
32235
  existingValue = maskOptions.format(this.valueObject);
32225
32236
  }
32226
32237
 
32238
+ // Clear before IMask attaches so the constructor seeds an empty
32239
+ // internal value. Otherwise IMask reads the stale unmasked string
32240
+ // and emits a spurious 'accept' before the restore below runs.
32227
32241
  this.skipNextProgrammaticInputEvent = true;
32228
32242
  this.inputElement.value = '';
32229
32243
 
32230
32244
  this.maskInstance = IMask(this.inputElement, maskOptions);
32231
32245
 
32246
+ // Mask fires 'accept' on every value change, including the restore
32247
+ // step below. Skip events fired during configureAutoFormatting so
32248
+ // we don't overwrite a value the parent just pushed.
32232
32249
  this.maskInstance.on('accept', () => {
32233
- // Suppress propagation during configureAutoFormatting's own value-restoration
32234
- // (line below) — the mask emits 'accept' on every value-set, including ours,
32235
- // and we don't want to overwrite a value the parent just pushed.
32236
32250
  if (this._configuringMask) return;
32237
32251
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
32238
32252
  if (this.type === "date") {
@@ -32240,6 +32254,8 @@ class BaseInput extends AuroElement$1 {
32240
32254
  }
32241
32255
  });
32242
32256
 
32257
+ // Mask fires 'complete' on the restore step below for any value that
32258
+ // happens to be a complete match. Same setup-suppression as 'accept'.
32243
32259
  this.maskInstance.on('complete', () => {
32244
32260
  if (this._configuringMask) return;
32245
32261
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
@@ -32248,7 +32264,9 @@ class BaseInput extends AuroElement$1 {
32248
32264
  }
32249
32265
  });
32250
32266
 
32251
- // Restore the stashed value through IMask so it's properly masked
32267
+ // Write existingValue through the mask (not the input directly) so
32268
+ // the mask reformats it under the new rules and keeps its internal
32269
+ // _value aligned with the input's displayed text.
32252
32270
  if (existingValue) {
32253
32271
  this.maskInstance.value = existingValue;
32254
32272
  }
@@ -32342,9 +32360,9 @@ class BaseInput extends AuroElement$1 {
32342
32360
  // the gated types currently support it, since the list is a public
32343
32361
  // property a consumer could mutate.
32344
32362
  if (this.setSelectionInputTypes.includes(this.type)) {
32345
- let selectionStart;
32363
+ let selectionStart = null;
32346
32364
  try {
32347
- selectionStart = this.inputElement.selectionStart;
32365
+ ({ selectionStart } = this.inputElement);
32348
32366
  } catch (error) { // eslint-disable-line no-unused-vars
32349
32367
  return;
32350
32368
  }
@@ -32448,7 +32466,6 @@ class BaseInput extends AuroElement$1 {
32448
32466
  */
32449
32467
  reset() {
32450
32468
  this.value = undefined;
32451
- this.setDateObjectProperty('valueObject', undefined);
32452
32469
  this.validation.reset(this);
32453
32470
  }
32454
32471
 
@@ -32457,7 +32474,6 @@ class BaseInput extends AuroElement$1 {
32457
32474
  */
32458
32475
  clear() {
32459
32476
  this.value = undefined;
32460
- this.setDateObjectProperty('valueObject', undefined);
32461
32477
  }
32462
32478
 
32463
32479
  /**
@@ -32986,7 +33002,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$1 {
32986
33002
  }
32987
33003
  };
32988
33004
 
32989
- var formkitVersion = '202606292156';
33005
+ var formkitVersion = '202607011722';
32990
33006
 
32991
33007
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
32992
33008
  // See LICENSE in the project root for license information.