@aurodesignsystem-dev/auro-formkit 0.0.0-pr1522.1 → 0.0.0-pr1522.3

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 (50) hide show
  1. package/components/checkbox/demo/customize.min.js +15 -2
  2. package/components/checkbox/demo/getting-started.min.js +15 -2
  3. package/components/checkbox/demo/index.min.js +15 -2
  4. package/components/checkbox/dist/index.js +15 -2
  5. package/components/checkbox/dist/registered.js +15 -2
  6. package/components/combobox/demo/customize.min.js +105 -10
  7. package/components/combobox/demo/getting-started.min.js +105 -10
  8. package/components/combobox/demo/index.min.js +105 -10
  9. package/components/combobox/dist/index.js +105 -10
  10. package/components/combobox/dist/registered.js +105 -10
  11. package/components/counter/demo/customize.min.js +33 -3
  12. package/components/counter/demo/index.min.js +33 -3
  13. package/components/counter/dist/index.js +33 -3
  14. package/components/counter/dist/registered.js +33 -3
  15. package/components/datepicker/demo/customize.min.js +257 -16
  16. package/components/datepicker/demo/index.min.js +257 -16
  17. package/components/datepicker/dist/auro-calendar-cell.d.ts +17 -0
  18. package/components/datepicker/dist/auro-calendar.d.ts +43 -3
  19. package/components/datepicker/dist/index.js +257 -16
  20. package/components/datepicker/dist/registered.js +257 -16
  21. package/components/dropdown/demo/customize.min.js +18 -1
  22. package/components/dropdown/demo/getting-started.min.js +18 -1
  23. package/components/dropdown/demo/index.min.js +18 -1
  24. package/components/dropdown/dist/index.js +18 -1
  25. package/components/dropdown/dist/registered.js +18 -1
  26. package/components/form/demo/customize.min.js +530 -43
  27. package/components/form/demo/getting-started.min.js +530 -43
  28. package/components/form/demo/index.min.js +530 -43
  29. package/components/form/demo/registerDemoDeps.min.js +530 -43
  30. package/components/input/demo/api.md +58 -57
  31. package/components/input/demo/customize.min.js +72 -7
  32. package/components/input/demo/getting-started.min.js +72 -7
  33. package/components/input/demo/index.min.js +72 -7
  34. package/components/input/dist/base-input.d.ts +9 -3
  35. package/components/input/dist/index.js +72 -7
  36. package/components/input/dist/registered.js +72 -7
  37. package/components/input/dist/utilities.d.ts +9 -0
  38. package/components/radio/demo/customize.min.js +15 -2
  39. package/components/radio/demo/getting-started.min.js +15 -2
  40. package/components/radio/demo/index.min.js +15 -2
  41. package/components/radio/dist/index.js +15 -2
  42. package/components/radio/dist/registered.js +15 -2
  43. package/components/select/demo/customize.md +6 -4
  44. package/components/select/demo/customize.min.js +33 -3
  45. package/components/select/demo/getting-started.min.js +33 -3
  46. package/components/select/demo/index.min.js +33 -3
  47. package/components/select/dist/index.js +33 -3
  48. package/components/select/dist/registered.js +33 -3
  49. package/custom-elements.json +111 -9
  50. package/package.json +1 -1
@@ -559,8 +559,21 @@ 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) {
565
+ const isPartialDateFormat = elem.util && !elem.util.isFullDateFormat(elem.type, elem.format);
566
+
567
+ if (isPartialDateFormat) {
568
+ if (!elem.util.isValidPartialDate(elem.value, elem.format)) {
569
+ elem.validity = 'patternMismatch';
570
+ elem.errorMessage = elem.setCustomValidityPatternMismatch || elem.setCustomValidity || 'Invalid Date Format Entered';
571
+ }
572
+ // Partial date format — validate directly and skip max/min checks since valueObject is undefined.
573
+ return;
574
+ }
575
+
576
+ // Full date format with no valueObject means the value is not a valid calendar date.
564
577
  elem.validity = 'patternMismatch';
565
578
  elem.errorMessage = elem.setCustomValidityPatternMismatch || elem.setCustomValidity || 'Invalid Date Format Entered';
566
579
  return;
@@ -10413,10 +10426,11 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
10413
10426
  const dateFormat = format || this.overrideFormat || pattern || 'mm/dd/yyyy';
10414
10427
 
10415
10428
  if (dateFormat === 'dd' || dateFormat === 'yy' || dateFormat === 'yyyy') {
10416
- const maxValue = dateFormat === 'dd' ? 31 : (dateFormat === 'yy' ? 99 : 9999);
10429
+ const fromValue = dateFormat === 'yyyy' ? 1900 : (dateFormat === 'yy' ? 0 : 1);
10430
+ const maxValue = dateFormat === 'dd' ? 31 : (dateFormat === 'yy' ? 99 : 2100);
10417
10431
  return {
10418
10432
  mask: IMask$1.MaskedRange,
10419
- from: 1,
10433
+ from: fromValue,
10420
10434
  to: maxValue,
10421
10435
  lazy: true,
10422
10436
  placeholderChar: '',
@@ -10424,7 +10438,8 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
10424
10438
  return value.toString().padStart(dateFormat.length, '0');
10425
10439
  },
10426
10440
  parse(str) {
10427
- return parseInt(str) || null;
10441
+ const num = parseInt(str, 10);
10442
+ return isNaN(num) ? null : num;
10428
10443
  }
10429
10444
  };
10430
10445
  }
@@ -10488,6 +10503,49 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
10488
10503
  return type === 'date' && normalizedFormat.includes('yy') && normalizedFormat.includes('mm') && normalizedFormat.includes('dd');
10489
10504
  }
10490
10505
 
10506
+ /**
10507
+ * Validates a value against a partial date format (one that lacks yy/mm/dd all three).
10508
+ * Day- and year-only formats (dd/yy/yyyy) are checked as integer ranges; other partial formats use
10509
+ * a date-fns parse + round-trip to confirm both validity and exact formatting.
10510
+ * @param {string} value - The user-facing display value.
10511
+ * @param {string} format - The partial date format string (e.g. "mm/yyyy", "yyyy", "dd").
10512
+ * @returns {boolean}
10513
+ */
10514
+ isValidPartialDate(value, format) {
10515
+ if (!value || !format) {
10516
+ return false;
10517
+ }
10518
+ const normalizedFormat = format.toLowerCase();
10519
+
10520
+ if (normalizedFormat === 'dd') {
10521
+ const num = Number(value);
10522
+ return (/^\d{2}$/u).test(value) && num >= 1 && num <= 31;
10523
+ }
10524
+ if (normalizedFormat === 'yy') {
10525
+ const num = Number(value);
10526
+ return (/^\d{2}$/u).test(value) && num >= 0 && num <= 99;
10527
+ }
10528
+ if (normalizedFormat === 'yyyy') {
10529
+ const num = Number(value);
10530
+ return (/^\d{4}$/u).test(value) && num >= 1900 && num <= 2100;
10531
+ }
10532
+
10533
+ const dateFnsMask = this.toDateFnsMask(normalizedFormat);
10534
+ // Use the 1st of the current month as the reference so that formats
10535
+ // omitting a day (e.g. MM/yyyy) never roll over on days 29–31.
10536
+ const referenceDate = new Date();
10537
+ referenceDate.setDate(1);
10538
+ const parsed = parse$1(value, dateFnsMask, referenceDate);
10539
+ if (!isValid$1(parsed) || format$1(parsed, dateFnsMask) !== value) {
10540
+ return false;
10541
+ }
10542
+ if (normalizedFormat.includes('yyyy')) {
10543
+ const year = parsed.getFullYear();
10544
+ return year >= 1900 && year <= 2100;
10545
+ }
10546
+ return true;
10547
+ }
10548
+
10491
10549
  /**
10492
10550
  * Converts a display string to its model value.
10493
10551
  * For full date formats, converts the display string to an ISO date string.
@@ -12442,6 +12500,41 @@ class AuroCalendarCell extends i$1 {
12442
12500
  btn.classList.remove('inRange', 'lastHoveredDate', 'rangeDepartDate');
12443
12501
  }
12444
12502
 
12503
+ /**
12504
+ * Re-applies the committed-range classes (inRange / rangeDepartDate /
12505
+ * rangeReturnDate) imperatively from the cell's current `day`,
12506
+ * `dateFrom`, and `dateTo`. Used after month navigation flushes:
12507
+ * classMap in `renderCellButton` tracks its own previous state, so a
12508
+ * preceding imperative `classList.remove` (from
12509
+ * `clearRangePreviewClasses`) leaves classMap thinking the class is
12510
+ * still applied. On re-render with the same class-value, classMap emits
12511
+ * no delta and the class stays missing in the DOM. Re-toggling
12512
+ * imperatively resyncs the DOM with the committed range.
12513
+ *
12514
+ * Delegates to the same `isInRange` / `isDepartDate` / `isReturnDate`
12515
+ * helpers `renderCellButton` uses, so the two code paths cannot drift
12516
+ * (including whatever timestamp normalization those helpers apply).
12517
+ * @returns {void}
12518
+ */
12519
+ applyCommittedRangeClasses() {
12520
+ if (!this.day) return;
12521
+ // Fall back to a shadowRoot query when `_cachedButton` hasn't
12522
+ // populated yet — this method's whole job is recovering from stale
12523
+ // DOM after a month re-render, so no-oping on a cache miss defeats
12524
+ // the fix (mirrors the fallback in `clearActive()`).
12525
+ const btn = this._cachedButton || this.shadowRoot?.querySelector('button.day');
12526
+ if (!btn) return;
12527
+
12528
+ const hasRange = this.datepicker?.hasAttribute('range');
12529
+ const inRange = hasRange && this.dateTo && this.isInRange(this.day, this.dateFrom, this.dateTo);
12530
+ const isDepart = hasRange && this.isDepartDate(this.day, this.dateFrom) && this.dateTo;
12531
+ const isReturn = hasRange && this.isReturnDate(this.day, this.dateFrom, this.dateTo);
12532
+
12533
+ btn.classList.toggle('inRange', Boolean(inRange));
12534
+ btn.classList.toggle('rangeDepartDate', Boolean(isDepart));
12535
+ btn.classList.toggle('rangeReturnDate', Boolean(isReturn));
12536
+ }
12537
+
12445
12538
  renderCellButton() {
12446
12539
  const outOfRange = this.isOutOfRange(this.day, this.min, this.max);
12447
12540
  const blackout = this.isBlackout();
@@ -13592,7 +13685,7 @@ class AuroBibtemplate extends i$1 {
13592
13685
  }
13593
13686
  }
13594
13687
 
13595
- var formkitVersion$2 = '202607011843';
13688
+ var formkitVersion$2 = '202607012103';
13596
13689
 
13597
13690
  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}
13598
13691
  `,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}}
@@ -13937,6 +14030,11 @@ class AuroCalendar extends RangeDatepicker {
13937
14030
  if (!opts.skipActiveUpdate) {
13938
14031
  this.updateActiveCellForVisibleMonth();
13939
14032
  }
14033
+ // clearRangePreview above strips classMap-managed range classes from
14034
+ // the DOM; classMap's private state still thinks they're applied, so
14035
+ // it won't re-add them on the post-nav re-render. Re-apply imperatively
14036
+ // after both months and their cell button caches have settled.
14037
+ this.scheduleCommittedRangeClassRefresh();
13940
14038
  this.announceMonthChange();
13941
14039
  }
13942
14040
 
@@ -13955,6 +14053,11 @@ class AuroCalendar extends RangeDatepicker {
13955
14053
  if (!opts.skipActiveUpdate) {
13956
14054
  this.updateActiveCellForVisibleMonth();
13957
14055
  }
14056
+ // clearRangePreview above strips classMap-managed range classes from
14057
+ // the DOM; classMap's private state still thinks they're applied, so
14058
+ // it won't re-add them on the post-nav re-render. Re-apply imperatively
14059
+ // after both months and their cell button caches have settled.
14060
+ this.scheduleCommittedRangeClassRefresh();
13958
14061
  this.announceMonthChange();
13959
14062
  }
13960
14063
 
@@ -15033,9 +15136,14 @@ class AuroCalendar extends RangeDatepicker {
15033
15136
  * @private
15034
15137
  * @param {Object} [options] - Optional settings.
15035
15138
  * @param {boolean} [options.force=false] - When true, clears classes even
15036
- * when both dateFrom and dateTo are set. Used by month nav handlers
15037
- * since the subsequent re-render re-applies classMap-managed classes,
15038
- * while `lastHoveredDate` (not in classMap) would otherwise persist.
15139
+ * when both dateFrom and dateTo are set. Used by month nav handlers to
15140
+ * strip the imperative-only `lastHoveredDate` before the re-render.
15141
+ * The other two classes (`inRange`, `rangeDepartDate`) are classMap-
15142
+ * managed and get stripped as a side effect here; because classMap
15143
+ * remembers what it last emitted and does not diff against the actual
15144
+ * DOM, the following month re-render will NOT re-add them on its own.
15145
+ * Nav handlers must schedule `refreshCommittedRangeClasses` (via
15146
+ * `scheduleCommittedRangeClassRefresh`) to resync them.
15039
15147
  * @returns {void}
15040
15148
  */
15041
15149
  clearRangePreview(options) {
@@ -15050,6 +15158,57 @@ class AuroCalendar extends RangeDatepicker {
15050
15158
  });
15051
15159
  }
15052
15160
 
15161
+ /**
15162
+ * Re-applies the committed-range classes across every focusable cell
15163
+ * after a month navigation. classMap in the cell tracks its own
15164
+ * previous state: once `clearRangePreview({ force: true })` strips
15165
+ * `inRange`/`rangeDepartDate` imperatively before the re-render,
15166
+ * classMap's next diff sees the same class-value it emitted before and
15167
+ * produces no delta, leaving the DOM without the classes even though a
15168
+ * full range is committed. Re-applying imperatively resyncs the two
15169
+ * months' cells with `dateFrom`/`dateTo`.
15170
+ *
15171
+ * Iterates `getAllFocusableCells()` — out-of-range cells (blocked by
15172
+ * `min`/`max`) can never carry range classes anyway, so skipping them
15173
+ * is correct and cheaper than a whole-grid walk.
15174
+ *
15175
+ * The cell's `applyCommittedRangeClasses` reuses the same
15176
+ * `isInRange`/`isDepartDate`/`isReturnDate` helpers `renderCellButton`
15177
+ * uses, so we don't parse dateFrom/dateTo here — the helpers already
15178
+ * normalize their inputs (midnight-truncation, string→int) internally.
15179
+ * @private
15180
+ * @returns {void}
15181
+ */
15182
+ refreshCommittedRangeClasses() {
15183
+ if (this.noRange || !this.dateFrom || !this.dateTo) {
15184
+ return;
15185
+ }
15186
+
15187
+ const allCells = this.getAllFocusableCells();
15188
+ allCells.forEach((cell) => {
15189
+ cell.applyCommittedRangeClasses();
15190
+ });
15191
+ }
15192
+
15193
+ /**
15194
+ * Schedules `refreshCommittedRangeClasses` to run after the month
15195
+ * re-render has flushed and the cells' button caches have refreshed.
15196
+ * Both `handlePrevMonth` and `handleNextMonth` need this exact call
15197
+ * shape; keeping it in one place prevents them from drifting apart.
15198
+ *
15199
+ * Bails synchronously when a full committed range isn't set — otherwise
15200
+ * every prev/next click in single-date mode (or before the user picks
15201
+ * both dates in range mode) pays for an unused double-rAF hop.
15202
+ * @private
15203
+ * @returns {void}
15204
+ */
15205
+ scheduleCommittedRangeClassRefresh() {
15206
+ if (this.noRange || !this.dateFrom || !this.dateTo) {
15207
+ return;
15208
+ }
15209
+ this._afterMonthRender(() => this.refreshCommittedRangeClasses());
15210
+ }
15211
+
15053
15212
  /**
15054
15213
  * Overrides the base class handler to prevent setting `this.hoveredDate`
15055
15214
  * as a reactive property. Instead, handles the range preview imperatively.
@@ -19368,7 +19527,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$1 {
19368
19527
  }
19369
19528
  };
19370
19529
 
19371
- var formkitVersion$1 = '202607011843';
19530
+ var formkitVersion$1 = '202607012103';
19372
19531
 
19373
19532
  let AuroElement$2 = class AuroElement extends i$1 {
19374
19533
  static get properties() {
@@ -20120,6 +20279,23 @@ class AuroDropdown extends AuroElement$2 {
20120
20279
  if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown") {
20121
20280
  this.trigger.focus();
20122
20281
  }
20282
+
20283
+
20284
+ if (!this.isPopoverVisible) {
20285
+ // wait til the bib gets fully closed and rendered
20286
+ setTimeout(() => {
20287
+ // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
20288
+ // Restore focus to trigger when focus is still inside the bib (:focus-within) or fell to body.
20289
+ if (this.isPopoverVisible ||
20290
+ // eslint-disable-next-line no-extra-parens
20291
+ (!this.bibContent?.matches(':focus-within') &&
20292
+ document.activeElement !== document.body)) {
20293
+ return;
20294
+ }
20295
+ // Restore focus to the trigger.
20296
+ this.trigger.focus();
20297
+ });
20298
+ }
20123
20299
  }
20124
20300
 
20125
20301
  firstUpdated() {
@@ -25052,8 +25228,21 @@ class AuroFormValidation {
25052
25228
  return;
25053
25229
  }
25054
25230
 
25055
- // Validate that the date passed was the correct format and is a valid date
25231
+ // Validate that the date passed was the correct format and is a valid date.
25232
+ // For partial date formats, valueObject is never populated; validate them directly.
25056
25233
  if (elem.value && !elem.valueObject) {
25234
+ const isPartialDateFormat = elem.util && !elem.util.isFullDateFormat(elem.type, elem.format);
25235
+
25236
+ if (isPartialDateFormat) {
25237
+ if (!elem.util.isValidPartialDate(elem.value, elem.format)) {
25238
+ elem.validity = 'patternMismatch';
25239
+ elem.errorMessage = elem.setCustomValidityPatternMismatch || elem.setCustomValidity || 'Invalid Date Format Entered';
25240
+ }
25241
+ // Partial date format — validate directly and skip max/min checks since valueObject is undefined.
25242
+ return;
25243
+ }
25244
+
25245
+ // Full date format with no valueObject means the value is not a valid calendar date.
25057
25246
  elem.validity = 'patternMismatch';
25058
25247
  elem.errorMessage = elem.setCustomValidityPatternMismatch || elem.setCustomValidity || 'Invalid Date Format Entered';
25059
25248
  return;
@@ -30983,10 +31172,11 @@ class AuroInputUtilities {
30983
31172
  const dateFormat = format$1 || this.overrideFormat || pattern || 'mm/dd/yyyy';
30984
31173
 
30985
31174
  if (dateFormat === 'dd' || dateFormat === 'yy' || dateFormat === 'yyyy') {
30986
- const maxValue = dateFormat === 'dd' ? 31 : (dateFormat === 'yy' ? 99 : 9999);
31175
+ const fromValue = dateFormat === 'yyyy' ? 1900 : (dateFormat === 'yy' ? 0 : 1);
31176
+ const maxValue = dateFormat === 'dd' ? 31 : (dateFormat === 'yy' ? 99 : 2100);
30987
31177
  return {
30988
31178
  mask: IMask.MaskedRange,
30989
- from: 1,
31179
+ from: fromValue,
30990
31180
  to: maxValue,
30991
31181
  lazy: true,
30992
31182
  placeholderChar: '',
@@ -30994,7 +31184,8 @@ class AuroInputUtilities {
30994
31184
  return value.toString().padStart(dateFormat.length, '0');
30995
31185
  },
30996
31186
  parse(str) {
30997
- return parseInt(str) || null;
31187
+ const num = parseInt(str, 10);
31188
+ return isNaN(num) ? null : num;
30998
31189
  }
30999
31190
  };
31000
31191
  }
@@ -31058,6 +31249,49 @@ class AuroInputUtilities {
31058
31249
  return type === 'date' && normalizedFormat.includes('yy') && normalizedFormat.includes('mm') && normalizedFormat.includes('dd');
31059
31250
  }
31060
31251
 
31252
+ /**
31253
+ * Validates a value against a partial date format (one that lacks yy/mm/dd all three).
31254
+ * Day- and year-only formats (dd/yy/yyyy) are checked as integer ranges; other partial formats use
31255
+ * a date-fns parse + round-trip to confirm both validity and exact formatting.
31256
+ * @param {string} value - The user-facing display value.
31257
+ * @param {string} format - The partial date format string (e.g. "mm/yyyy", "yyyy", "dd").
31258
+ * @returns {boolean}
31259
+ */
31260
+ isValidPartialDate(value, format$1) {
31261
+ if (!value || !format$1) {
31262
+ return false;
31263
+ }
31264
+ const normalizedFormat = format$1.toLowerCase();
31265
+
31266
+ if (normalizedFormat === 'dd') {
31267
+ const num = Number(value);
31268
+ return (/^\d{2}$/u).test(value) && num >= 1 && num <= 31;
31269
+ }
31270
+ if (normalizedFormat === 'yy') {
31271
+ const num = Number(value);
31272
+ return (/^\d{2}$/u).test(value) && num >= 0 && num <= 99;
31273
+ }
31274
+ if (normalizedFormat === 'yyyy') {
31275
+ const num = Number(value);
31276
+ return (/^\d{4}$/u).test(value) && num >= 1900 && num <= 2100;
31277
+ }
31278
+
31279
+ const dateFnsMask = this.toDateFnsMask(normalizedFormat);
31280
+ // Use the 1st of the current month as the reference so that formats
31281
+ // omitting a day (e.g. MM/yyyy) never roll over on days 29–31.
31282
+ const referenceDate = new Date();
31283
+ referenceDate.setDate(1);
31284
+ const parsed = parse(value, dateFnsMask, referenceDate);
31285
+ if (!isValid(parsed) || format(parsed, dateFnsMask) !== value) {
31286
+ return false;
31287
+ }
31288
+ if (normalizedFormat.includes('yyyy')) {
31289
+ const year = parsed.getFullYear();
31290
+ return year >= 1900 && year <= 2100;
31291
+ }
31292
+ return true;
31293
+ }
31294
+
31061
31295
  /**
31062
31296
  * Converts a display string to its model value.
31063
31297
  * For full date formats, converts the display string to an ISO date string.
@@ -31677,6 +31911,13 @@ class BaseInput extends AuroElement$1 {
31677
31911
  type: String
31678
31912
  },
31679
31913
 
31914
+ /**
31915
+ * Custom help text message to display when validity = `patternMismatch`.
31916
+ */
31917
+ setCustomValidityPatternMismatch: {
31918
+ type: String
31919
+ },
31920
+
31680
31921
  /**
31681
31922
  * Custom help text message to display when validity = `rangeOverflow`.
31682
31923
  */
@@ -31747,7 +31988,7 @@ class BaseInput extends AuroElement$1 {
31747
31988
 
31748
31989
  /**
31749
31990
  * Populates the `type` attribute on the input.
31750
- * @type {'text' | 'password' | 'email' | 'credit-card' | 'tel' | 'number'}
31991
+ * @type {'text' | 'password' | 'email' | 'credit-card' | 'tel' | 'number' | 'date'}
31751
31992
  * @default 'text'
31752
31993
  */
31753
31994
  type: {
@@ -31772,7 +32013,7 @@ class BaseInput extends AuroElement$1 {
31772
32013
 
31773
32014
  /**
31774
32015
  * Populates the `value` attribute on the input. Can also be read to retrieve the current value of the input.
31775
- * The format for this property should be ISO for `date` type inputs.
32016
+ * For `date` type inputs using a full date format (year/month/day), the `value` should be ISO (YYYY-MM-DD). Partial date formats use the display format.
31776
32017
  */
31777
32018
  value: {
31778
32019
  type: String
@@ -32895,7 +33136,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$1 {
32895
33136
  }
32896
33137
  };
32897
33138
 
32898
- var formkitVersion = '202607011843';
33139
+ var formkitVersion = '202607012103';
32899
33140
 
32900
33141
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
32901
33142
  // See LICENSE in the project root for license information.
@@ -282,6 +282,23 @@ export class AuroCalendarCell extends LitElement {
282
282
  * @returns {void}
283
283
  */
284
284
  clearRangePreviewClasses(): void;
285
+ /**
286
+ * Re-applies the committed-range classes (inRange / rangeDepartDate /
287
+ * rangeReturnDate) imperatively from the cell's current `day`,
288
+ * `dateFrom`, and `dateTo`. Used after month navigation flushes:
289
+ * classMap in `renderCellButton` tracks its own previous state, so a
290
+ * preceding imperative `classList.remove` (from
291
+ * `clearRangePreviewClasses`) leaves classMap thinking the class is
292
+ * still applied. On re-render with the same class-value, classMap emits
293
+ * no delta and the class stays missing in the DOM. Re-toggling
294
+ * imperatively resyncs the DOM with the committed range.
295
+ *
296
+ * Delegates to the same `isInRange` / `isDepartDate` / `isReturnDate`
297
+ * helpers `renderCellButton` uses, so the two code paths cannot drift
298
+ * (including whatever timestamp normalization those helpers apply).
299
+ * @returns {void}
300
+ */
301
+ applyCommittedRangeClasses(): void;
285
302
  renderCellButton(): import("lit-html").TemplateResult;
286
303
  render(): import("lit-html").TemplateResult;
287
304
  }
@@ -456,12 +456,52 @@ export class AuroCalendar extends RangeDatepicker {
456
456
  * @private
457
457
  * @param {Object} [options] - Optional settings.
458
458
  * @param {boolean} [options.force=false] - When true, clears classes even
459
- * when both dateFrom and dateTo are set. Used by month nav handlers
460
- * since the subsequent re-render re-applies classMap-managed classes,
461
- * while `lastHoveredDate` (not in classMap) would otherwise persist.
459
+ * when both dateFrom and dateTo are set. Used by month nav handlers to
460
+ * strip the imperative-only `lastHoveredDate` before the re-render.
461
+ * The other two classes (`inRange`, `rangeDepartDate`) are classMap-
462
+ * managed and get stripped as a side effect here; because classMap
463
+ * remembers what it last emitted and does not diff against the actual
464
+ * DOM, the following month re-render will NOT re-add them on its own.
465
+ * Nav handlers must schedule `refreshCommittedRangeClasses` (via
466
+ * `scheduleCommittedRangeClassRefresh`) to resync them.
462
467
  * @returns {void}
463
468
  */
464
469
  private clearRangePreview;
470
+ /**
471
+ * Re-applies the committed-range classes across every focusable cell
472
+ * after a month navigation. classMap in the cell tracks its own
473
+ * previous state: once `clearRangePreview({ force: true })` strips
474
+ * `inRange`/`rangeDepartDate` imperatively before the re-render,
475
+ * classMap's next diff sees the same class-value it emitted before and
476
+ * produces no delta, leaving the DOM without the classes even though a
477
+ * full range is committed. Re-applying imperatively resyncs the two
478
+ * months' cells with `dateFrom`/`dateTo`.
479
+ *
480
+ * Iterates `getAllFocusableCells()` — out-of-range cells (blocked by
481
+ * `min`/`max`) can never carry range classes anyway, so skipping them
482
+ * is correct and cheaper than a whole-grid walk.
483
+ *
484
+ * The cell's `applyCommittedRangeClasses` reuses the same
485
+ * `isInRange`/`isDepartDate`/`isReturnDate` helpers `renderCellButton`
486
+ * uses, so we don't parse dateFrom/dateTo here — the helpers already
487
+ * normalize their inputs (midnight-truncation, string→int) internally.
488
+ * @private
489
+ * @returns {void}
490
+ */
491
+ private refreshCommittedRangeClasses;
492
+ /**
493
+ * Schedules `refreshCommittedRangeClasses` to run after the month
494
+ * re-render has flushed and the cells' button caches have refreshed.
495
+ * Both `handlePrevMonth` and `handleNextMonth` need this exact call
496
+ * shape; keeping it in one place prevents them from drifting apart.
497
+ *
498
+ * Bails synchronously when a full committed range isn't set — otherwise
499
+ * every prev/next click in single-date mode (or before the user picks
500
+ * both dates in range mode) pays for an unused double-rAF hop.
501
+ * @private
502
+ * @returns {void}
503
+ */
504
+ private scheduleCommittedRangeClassRefresh;
465
505
  /**
466
506
  * Overrides the base class handler to prevent setting `this.hoveredDate`
467
507
  * as a reactive property. Instead, handles the range preview imperatively.