@aurodesignsystem-dev/auro-formkit 0.0.0-pr1532.1 → 0.0.0-pr1533.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/components/checkbox/demo/customize.min.js +1 -1
  2. package/components/checkbox/demo/getting-started.min.js +1 -1
  3. package/components/checkbox/demo/index.min.js +1 -1
  4. package/components/checkbox/dist/index.js +1 -1
  5. package/components/checkbox/dist/registered.js +1 -1
  6. package/components/combobox/demo/customize.min.js +118 -50
  7. package/components/combobox/demo/getting-started.min.js +118 -50
  8. package/components/combobox/demo/index.min.js +118 -50
  9. package/components/combobox/dist/auro-combobox.d.ts +10 -0
  10. package/components/combobox/dist/index.js +118 -50
  11. package/components/combobox/dist/registered.js +118 -50
  12. package/components/counter/demo/customize.min.js +2 -2
  13. package/components/counter/demo/index.min.js +2 -2
  14. package/components/counter/dist/index.js +2 -2
  15. package/components/counter/dist/registered.js +2 -2
  16. package/components/datepicker/demo/accessibility.md +17 -8
  17. package/components/datepicker/demo/api.md +1 -1
  18. package/components/datepicker/demo/customize.min.js +229 -72
  19. package/components/datepicker/demo/index.min.js +229 -72
  20. package/components/datepicker/demo/keyboard-behavior.md +3 -3
  21. package/components/datepicker/demo/voiceover.md +4 -4
  22. package/components/datepicker/demo/why-datepicker.md +2 -2
  23. package/components/datepicker/dist/auro-calendar-cell.d.ts +11 -0
  24. package/components/datepicker/dist/auro-calendar.d.ts +26 -2
  25. package/components/datepicker/dist/auro-datepicker.d.ts +9 -1
  26. package/components/datepicker/dist/index.js +229 -72
  27. package/components/datepicker/dist/registered.js +229 -72
  28. package/components/dropdown/demo/customize.min.js +1 -1
  29. package/components/dropdown/demo/getting-started.min.js +1 -1
  30. package/components/dropdown/demo/index.min.js +1 -1
  31. package/components/dropdown/dist/index.js +1 -1
  32. package/components/dropdown/dist/registered.js +1 -1
  33. package/components/form/demo/customize.min.js +408 -172
  34. package/components/form/demo/getting-started.min.js +408 -172
  35. package/components/form/demo/index.min.js +408 -172
  36. package/components/form/demo/registerDemoDeps.min.js +408 -172
  37. package/components/input/demo/customize.min.js +56 -45
  38. package/components/input/demo/getting-started.min.js +56 -45
  39. package/components/input/demo/index.min.js +56 -45
  40. package/components/input/dist/base-input.d.ts +20 -4
  41. package/components/input/dist/index.js +56 -45
  42. package/components/input/dist/registered.js +56 -45
  43. package/components/radio/demo/customize.min.js +1 -1
  44. package/components/radio/demo/getting-started.min.js +1 -1
  45. package/components/radio/demo/index.min.js +1 -1
  46. package/components/radio/dist/index.js +1 -1
  47. package/components/radio/dist/registered.js +1 -1
  48. package/components/select/demo/customize.min.js +2 -2
  49. package/components/select/demo/getting-started.min.js +2 -2
  50. package/components/select/demo/index.min.js +2 -2
  51. package/components/select/dist/index.js +2 -2
  52. package/components/select/dist/registered.js +2 -2
  53. package/custom-elements.json +4349 -4251
  54. package/package.json +1 -1
@@ -11638,23 +11638,28 @@ var popoverVersion = '6.0.1';
11638
11638
  * @returns {number|null} Local-midnight Unix timestamp (seconds), or null.
11639
11639
  */
11640
11640
  function parseIsoToTimestamp(isoStr) {
11641
+ // Strict YYYY-MM-DD matcher with named groups. Rejects trailing garbage
11642
+ // ("2024x-01-01"), short segments ("2024-1-1"), and any non-digit
11643
+ // characters. `parseInt` alone accepted both because it stops at the
11644
+ // first non-digit and doesn't require a minimum length.
11645
+ const ISO_DATE_RE = /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/u;
11646
+ const MAX_MONTH = 12;
11647
+ const MAX_DAY = 31;
11648
+
11641
11649
  if (typeof isoStr !== 'string') {
11642
11650
  return null;
11643
11651
  }
11644
- const parts = isoStr.split('-');
11645
- if (parts.length !== 3) {
11646
- return null;
11647
- }
11648
- const year = parseInt(parts[0], 10);
11649
- const month = parseInt(parts[1], 10);
11650
- const day = parseInt(parts[2], 10);
11651
- if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) {
11652
+ const match = ISO_DATE_RE.exec(isoStr);
11653
+ if (!match) {
11652
11654
  return null;
11653
11655
  }
11656
+ const year = Number(match.groups.year);
11657
+ const month = Number(match.groups.month);
11658
+ const day = Number(match.groups.day);
11654
11659
  // Reject overflow values like "2024-13-40" — JS `new Date(year, month, day)`
11655
11660
  // silently normalizes those to a different calendar day, which would
11656
11661
  // disable the wrong date if we let the result through.
11657
- if (month < 1 || month > 12 || day < 1 || day > 31) {
11662
+ if (month < 1 || month > MAX_MONTH || day < 1 || day > MAX_DAY) {
11658
11663
  return null;
11659
11664
  }
11660
11665
  const date = new Date(year, month - 1, day);
@@ -12232,13 +12237,36 @@ class AuroCalendarCell extends LitElement {
12232
12237
  }
12233
12238
 
12234
12239
  firstUpdated() {
12240
+ this._initFromAncestors();
12241
+ }
12242
+
12243
+ /**
12244
+ * Wires the cell to its ancestor calendar-month and calendar (and, via
12245
+ * the calendar, to the datepicker). Extracted from firstUpdated() so the
12246
+ * retry loop can re-attempt without recursively invoking a Lit lifecycle
12247
+ * method (which is outside the framework's contract).
12248
+ * @private
12249
+ * @returns {void}
12250
+ */
12251
+ _initFromAncestors() {
12235
12252
  const calendarMonth = this.runtimeUtils.closestElement('auro-formkit-calendar-month', this);
12236
12253
  const calendar = this.runtimeUtils.closestElement('auro-formkit-calendar', calendarMonth);
12237
12254
 
12238
12255
  if (!calendar) {
12239
- setTimeout(() => this.firstUpdated(), 0);
12256
+ // Retry on the next event-loop turn to give the ancestor chain a chance
12257
+ // to attach — but cap attempts so a permanently detached cell doesn't
12258
+ // spin forever. 10 turns is far more than any observed race needs.
12259
+ this._firstUpdatedRetries = (this._firstUpdatedRetries || 0) + 1;
12260
+ if (this._firstUpdatedRetries > 10) {
12261
+ return;
12262
+ }
12263
+ this._firstUpdatedRetryTimer = setTimeout(() => {
12264
+ this._firstUpdatedRetryTimer = null;
12265
+ this._initFromAncestors();
12266
+ }, 0);
12240
12267
  return;
12241
12268
  }
12269
+ this._firstUpdatedRetries = 0;
12242
12270
  this.calendar = calendar;
12243
12271
  this.datepicker = calendar.datepicker;
12244
12272
  this._slotContentHandler = () => {
@@ -12266,6 +12294,10 @@ class AuroCalendarCell extends LitElement {
12266
12294
  if (this.datepicker && this._slotContentHandler) {
12267
12295
  this.datepicker.removeEventListener('auroDatePicker-newSlotContent', this._slotContentHandler);
12268
12296
  }
12297
+ if (this._firstUpdatedRetryTimer) {
12298
+ clearTimeout(this._firstUpdatedRetryTimer);
12299
+ this._firstUpdatedRetryTimer = null;
12300
+ }
12269
12301
  }
12270
12302
 
12271
12303
  /**
@@ -13637,7 +13669,7 @@ class AuroBibtemplate extends LitElement {
13637
13669
  }
13638
13670
  }
13639
13671
 
13640
- var formkitVersion$2 = '202607022050';
13672
+ var formkitVersion$2 = '202607061903';
13641
13673
 
13642
13674
  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=literal`${unsafeStatic(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$1 = 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=css`: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}
13643
13675
  `,u$4=css`.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}}
@@ -13776,7 +13808,10 @@ class AuroCalendar extends RangeDatepicker {
13776
13808
  * Support will be removed in a future major release.
13777
13809
  * @private
13778
13810
  */
13779
- this.disabledDays = [];
13811
+ // Initialize the backing field directly so the constructor's default
13812
+ // empty array doesn't trigger the deprecation warning. Assignments from
13813
+ // consumers still route through the setter below.
13814
+ this._disabledDays = [];
13780
13815
 
13781
13816
  /**
13782
13817
  * @private
@@ -13809,6 +13844,44 @@ class AuroCalendar extends RangeDatepicker {
13809
13844
  this._calendarInstanceId = Date.now().toString(36);
13810
13845
  }
13811
13846
 
13847
+ /**
13848
+ * @deprecated See constructor JSDoc — migrate to
13849
+ * `auro-datepicker.blackoutDates`. The getter/setter pair exists so the
13850
+ * one-time deprecation warning fires as soon as a consumer assigns a
13851
+ * non-empty array (empty assignments are ignored — an empty array is
13852
+ * indistinguishable from the constructor default and would produce a
13853
+ * spurious warning), rather than only when `_getBlackoutSet()` happens
13854
+ * to rebuild.
13855
+ * @returns {Array} The current legacy `disabledDays` array.
13856
+ */
13857
+ get disabledDays() {
13858
+ return this._disabledDays;
13859
+ }
13860
+
13861
+ /**
13862
+ * @param {Array} value - The legacy `disabledDays` array to set.
13863
+ */
13864
+ set disabledDays(value) {
13865
+ const oldValue = this._disabledDays;
13866
+ // Coerce non-arrays to `[]`. Consumers occasionally pass `null`
13867
+ // (Lit's Array attribute converter returns null for a missing/empty
13868
+ // attribute) or misuse the API; downstream code in
13869
+ // `auro-calendar-cell.isEnabled` calls `.findIndex()` on this value
13870
+ // without an Array.isArray guard, so a truthy non-array would throw
13871
+ // at render.
13872
+ const coerced = Array.isArray(value) ? value : [];
13873
+ if (coerced.length > 0) {
13874
+ this._warnDisabledDaysDeprecated();
13875
+ }
13876
+ this._disabledDays = coerced;
13877
+ // `disabledDays` is a Lit `@property({ type: Array })` on the
13878
+ // RangeDatepicker base class; Lit's generated setter (which we've
13879
+ // overridden here to insert the warning) is what normally invalidates
13880
+ // the reactive cycle. Re-invoke requestUpdate manually so consumer
13881
+ // assignments still re-render the calendar.
13882
+ this.requestUpdate('disabledDays', oldValue);
13883
+ }
13884
+
13812
13885
  static get styles() {
13813
13886
  return [
13814
13887
  styleCss$7,
@@ -14354,8 +14427,19 @@ class AuroCalendar extends RangeDatepicker {
14354
14427
  /**
14355
14428
  * Returns a memoized Set of blackout timestamps (seconds) drawn from both
14356
14429
  * the legacy `disabledDays` array and the datepicker's ISO `blackoutDates`.
14357
- * The cache invalidates when either source array's reference changes, which
14358
- * matches Lit's own reactive identity semantics for array properties.
14430
+ *
14431
+ * The cache invalidates on **reference identity** only when the
14432
+ * consumer reassigns the array (`el.blackoutDates = [...]`), matching
14433
+ * Lit's own reactivity semantics for array properties. In-place mutations
14434
+ * on the existing array (`push`, `splice`, index assignment) will NOT
14435
+ * invalidate the cache and the new entries will be silently ignored.
14436
+ * Consumers must reassign to update — see the JSDoc on
14437
+ * `auro-datepicker.blackoutDates` for the recommended pattern.
14438
+ *
14439
+ * A shallow-equality tier was considered but rejected: it would run
14440
+ * O(N) work on every cell render (this method is called per-cell via
14441
+ * `isBlackout()`) and still wouldn't catch same-length value swaps,
14442
+ * offering a false sense of safety.
14359
14443
  * @private
14360
14444
  * @returns {Set<Number>}
14361
14445
  */
@@ -14536,7 +14620,24 @@ class AuroCalendar extends RangeDatepicker {
14536
14620
  // rendered month(s) first so a single-month calendar does not pick a date
14537
14621
  // that has no DOM cell. Determine the visible range based on centralDate and
14538
14622
  // the number of rendered months.
14539
- const renderedMonths = Math.max(this.numCalendars, 1);
14623
+ //
14624
+ // numCalendars is assigned inside renderAllCalendars(), which runs during
14625
+ // render() — so by the time the visible-change handler in updated()
14626
+ // calls computeActiveDate() in the same cycle, numCalendars is normally
14627
+ // set. Guard against the pre-first-render path anyway (e.g. any future
14628
+ // caller that reaches computeActiveDate before render() has run):
14629
+ // Math.max(undefined, 1) is NaN, which would silently skip the
14630
+ // visible-month scan below. Fall back to maximumRenderableMonths'
14631
+ // desktop default (1 for non-range, 2 for range) so the scan window is
14632
+ // correctly sized whenever numCalendars is not yet populated.
14633
+ let renderedMonths = null;
14634
+
14635
+ if (Number.isFinite(this.numCalendars) && this.numCalendars > 0) {
14636
+ renderedMonths = this.numCalendars;
14637
+ } else {
14638
+ renderedMonths = this.noRange ? 1 : 2;
14639
+ }
14640
+
14540
14641
  const visibleAnchor = this.centralDateObject ?? new Date(now * 1000);
14541
14642
  const visMonthStart = new Date(visibleAnchor.getFullYear(), visibleAnchor.getMonth(), 1);
14542
14643
  visMonthStart.setHours(0, 0, 0, 0);
@@ -14806,6 +14907,8 @@ class AuroCalendar extends RangeDatepicker {
14806
14907
  let targetIndex = -1;
14807
14908
  if (direction === 'next') {
14808
14909
  targetIndex = currentIndex + 1;
14910
+ } else if (direction === 'prev') {
14911
+ targetIndex = currentIndex - 1;
14809
14912
  }
14810
14913
 
14811
14914
  if (targetIndex >= 0 && targetIndex < allCells.length) {
@@ -15410,6 +15513,10 @@ class AuroCalendar extends RangeDatepicker {
15410
15513
  * originally tried aria-live="polite" here, but VoiceOver treats
15411
15514
  * polite as "wait until idle" — which never happens during active
15412
15515
  * keyboard navigation — so the announcements were silently dropped.
15516
+ *
15517
+ * This is a documented deviation from WCAG 2.1 SC 4.1.3, which
15518
+ * prefers `polite` for status messages. See the "Documented
15519
+ * Deviation" section in components/datepicker/docs/pages/accessibility.md.
15413
15520
  * @private
15414
15521
  * @param {String} dateStr - The localized date string to announce.
15415
15522
  * @returns {void}
@@ -19455,7 +19562,7 @@ let AuroHelpText$2 = class AuroHelpText extends LitElement {
19455
19562
  }
19456
19563
  };
19457
19564
 
19458
- var formkitVersion$1 = '202607022050';
19565
+ var formkitVersion$1 = '202607061903';
19459
19566
 
19460
19567
  let AuroElement$2 = class AuroElement extends LitElement {
19461
19568
  static get properties() {
@@ -31463,14 +31570,16 @@ class BaseInput extends AuroElement$1 {
31463
31570
  this.label = 'Input label is undefined';
31464
31571
  this.layout = 'classic';
31465
31572
  this.locale = 'en-US';
31573
+ this._format = undefined;
31574
+
31575
+ /** @private */
31576
+ this._userSetFormat = false;
31466
31577
  this.max = undefined;
31467
31578
  this.maxLength = undefined;
31468
31579
  this.min = undefined;
31469
31580
  this.minLength = undefined;
31470
31581
  this.noValidate = false;
31471
31582
  this.onDark = false;
31472
- // Raw values returned from the input mask before model normalization.
31473
- this._rawMaskValue = undefined;
31474
31583
  this.required = false;
31475
31584
  this.setCustomValidityForType = undefined;
31476
31585
  // Credit Card is intentionally excluded — its mask manages the cursor
@@ -31628,7 +31737,8 @@ class BaseInput extends AuroElement$1 {
31628
31737
  */
31629
31738
  format: {
31630
31739
  type: String,
31631
- reflect: true
31740
+ reflect: true,
31741
+ noAccessor: true
31632
31742
  },
31633
31743
 
31634
31744
  /**
@@ -31966,6 +32076,34 @@ class BaseInput extends AuroElement$1 {
31966
32076
  return this.max && dateFormatter.isValidDate(this.max) ? dateFormatter.stringToDateInstance(this.max) : undefined;
31967
32077
  }
31968
32078
 
32079
+ get format() {
32080
+ return this._format;
32081
+ }
32082
+
32083
+ /**
32084
+ * Overrides LitElement's generated accessor so we can track whether the
32085
+ * consumer explicitly set `format`. Locale-derived updates use
32086
+ * `_setFormatFromLocale` instead, which skips this flag.
32087
+ */
32088
+ set format(value) {
32089
+ const oldValue = this._format;
32090
+ this._format = value ? value.toLowerCase() : value;
32091
+ this._userSetFormat = Boolean(value);
32092
+ this.requestUpdate('format', oldValue);
32093
+ }
32094
+
32095
+ /**
32096
+ * Sets format without marking it as user-set. Used by locale auto-derive
32097
+ * so that a subsequent locale change can still update the format.
32098
+ * @private
32099
+ * @param {string} value
32100
+ */
32101
+ _setFormatFromLocale(value) {
32102
+ const oldValue = this._format;
32103
+ this._format = value ? value.toLowerCase() : value;
32104
+ this.requestUpdate('format', oldValue);
32105
+ }
32106
+
31969
32107
  connectedCallback() {
31970
32108
  super.connectedCallback();
31971
32109
 
@@ -32013,15 +32151,6 @@ class BaseInput extends AuroElement$1 {
32013
32151
 
32014
32152
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
32015
32153
 
32016
- // Normalize the format token to lowercase so case-mixed values supplied
32017
- // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
32018
- // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
32019
- // format silently misses the map and leaves `setCustomValidityForType`
32020
- // unset.
32021
- if (this.format) {
32022
- this.format = this.format.toLowerCase();
32023
- }
32024
-
32025
32154
  // use validity message override if declared when initializing the component
32026
32155
  if (this.hasAttribute('setCustomValidity')) {
32027
32156
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -32128,12 +32257,10 @@ class BaseInput extends AuroElement$1 {
32128
32257
  updated(changedProperties) {
32129
32258
  super.updated(changedProperties);
32130
32259
 
32131
- // When locale changes without an explicit format override, derive format from the new locale.
32132
- // Only runs if the current format is still the previous locale's default (not user-overridden).
32260
+ // When locale changes, auto-derive format unless the consumer explicitly set one.
32133
32261
  if (changedProperties.has('locale') && !changedProperties.has('format') && this.type === 'date') {
32134
- const previousLocaleFormat = getDateFormatFromLocale(changedProperties.get('locale'));
32135
- if (!this.format || this.format.toLowerCase() === previousLocaleFormat) {
32136
- this.format = getDateFormatFromLocale(this.locale);
32262
+ if (!this._userSetFormat) {
32263
+ this._setFormatFromLocale(getDateFormatFromLocale(this.locale));
32137
32264
  }
32138
32265
  }
32139
32266
 
@@ -32304,9 +32431,6 @@ class BaseInput extends AuroElement$1 {
32304
32431
  this.maskInstance.on('accept', () => {
32305
32432
  if (this._configuringMask) return;
32306
32433
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
32307
- if (this.type === "date") {
32308
- this._rawMaskValue = this.maskInstance.value;
32309
- }
32310
32434
  });
32311
32435
 
32312
32436
  // Mask fires 'complete' on the restore step below for any value that
@@ -32314,9 +32438,6 @@ class BaseInput extends AuroElement$1 {
32314
32438
  this.maskInstance.on('complete', () => {
32315
32439
  if (this._configuringMask) return;
32316
32440
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
32317
- if (this.type === "date") {
32318
- this._rawMaskValue = this.maskInstance.value;
32319
- }
32320
32441
  });
32321
32442
 
32322
32443
  // Write existingValue through the mask (not the input directly) so
@@ -32337,14 +32458,17 @@ class BaseInput extends AuroElement$1 {
32337
32458
  * @returns {void}
32338
32459
  */
32339
32460
  notifyValueChanged() {
32340
- let inputEvent = null;
32341
-
32342
- inputEvent = new Event('input', {
32461
+ // This echoes Lit's reactive value update (and handleClickClear's
32462
+ // programmatic clear) — it is NOT a fresh user-input event. Mark it
32463
+ // `isProgrammatic` so consumers (e.g. auro-combobox) can distinguish
32464
+ // it from genuine user typing and skip clobbering their own
32465
+ // programmatic state during init-time renders.
32466
+ const inputEvent = new Event('input', {
32343
32467
  bubbles: true,
32344
32468
  composed: true,
32345
32469
  });
32470
+ inputEvent.isProgrammatic = true;
32346
32471
 
32347
- // Dispatched event to alert outside shadow DOM context of event firing.
32348
32472
  this.dispatchEvent(inputEvent);
32349
32473
  }
32350
32474
 
@@ -32553,8 +32677,7 @@ class BaseInput extends AuroElement$1 {
32553
32677
 
32554
32678
  // Set default date format if type=date and no format is defined
32555
32679
  if (this.type === "date" && !this.format) {
32556
- // Use locale to determine default date format
32557
- this.format = this.util.getDateMaskFromLocale().toLowerCase();
32680
+ this._setFormatFromLocale(this.util.getDateMaskFromLocale().toLowerCase());
32558
32681
  this.util.updateFormat(this.format);
32559
32682
  }
32560
32683
  }
@@ -32583,7 +32706,7 @@ class BaseInput extends AuroElement$1 {
32583
32706
  const creditCard = this.matchInputValueToCreditCard();
32584
32707
  const previousFormat = this.format;
32585
32708
 
32586
- this.format = creditCard.maskFormat;
32709
+ this._setFormatFromLocale(creditCard.maskFormat);
32587
32710
 
32588
32711
  this.maxLength = creditCard.formatLength;
32589
32712
  this.minLength = creditCard.formatMinLength;
@@ -33057,7 +33180,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
33057
33180
  }
33058
33181
  };
33059
33182
 
33060
- var formkitVersion = '202607022050';
33183
+ var formkitVersion = '202607061903';
33061
33184
 
33062
33185
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
33063
33186
  // See LICENSE in the project root for license information.
@@ -33343,20 +33466,15 @@ class AuroInput extends BaseInput {
33343
33466
  * @returns {void}
33344
33467
  */
33345
33468
  checkDisplayValueSlotChange() {
33346
- let nodes = this.shadowRoot.querySelector('slot[name="displayValue"]').assignedNodes();
33469
+ // flatten:true resolves through auro-combobox's forwarding slot
33470
+ // (<slot name="displayValue" slot="displayValue">) so a clone appended
33471
+ // directly to auro-input's light DOM alongside the forwarder still
33472
+ // counts as content. The prior nodes[0].tagName === 'SLOT' recursion
33473
+ // discarded any siblings past the forwarder.
33474
+ const slot = this.shadowRoot.querySelector('slot[name="displayValue"]');
33475
+ const nodes = slot.assignedNodes({ flatten: true });
33347
33476
 
33348
- // Handle when DisplayValue is multi-level slot content (e.g. combobox passing displayValue to input)
33349
- if (nodes && nodes[0] && nodes[0].tagName === 'SLOT') {
33350
- nodes = nodes[0].assignedNodes();
33351
- }
33352
-
33353
- let hasContent = false;
33354
-
33355
- if (nodes.length > 0) {
33356
- hasContent = true;
33357
- }
33358
-
33359
- this.hasDisplayValueContent = hasContent;
33477
+ this.hasDisplayValueContent = nodes.length > 0;
33360
33478
  }
33361
33479
 
33362
33480
  firstUpdated() {
@@ -34434,6 +34552,15 @@ const datepickerKeyboardStrategy = {
34434
34552
  evt.stopPropagation();
34435
34553
  evt.preventDefault();
34436
34554
 
34555
+ // Signal to the visibility-change handler in auro-datepicker.js that
34556
+ // focus should be restored to the trigger regardless of hasFocus.
34557
+ // hidePopover() (desktop non-modal path) does not auto-restore focus,
34558
+ // and hiding the grid's popover ancestor drops focus to <body>. That
34559
+ // synchronously fires focusout on the datepicker host — clearing
34560
+ // hasFocus — before updated() runs, which would otherwise skip the
34561
+ // input refocus. Native <dialog>.close() (modal path) restores focus
34562
+ // itself, but the flag is harmless there.
34563
+ component._restoreFocusOnClose = true;
34437
34564
  component.hideBib();
34438
34565
  },
34439
34566
 
@@ -34707,6 +34834,14 @@ class AuroDatePicker extends AuroElement {
34707
34834
 
34708
34835
  /**
34709
34836
  * Array of dates that cannot be selected. Dates should be in ISO format (YYYY-MM-DD).
34837
+ *
34838
+ * **Immutable update required.** The datepicker treats this array as
34839
+ * immutable and memoizes a lookup Set keyed on the array's reference
34840
+ * identity — matching Lit's own reactivity semantics for array
34841
+ * properties. In-place mutations (`blackoutDates.push(...)`,
34842
+ * `blackoutDates[i] = ...`, `blackoutDates.splice(...)`) will not
34843
+ * invalidate the cache and the new entries will be silently ignored.
34844
+ * To update, reassign the property: `el.blackoutDates = [...el.blackoutDates, '2024-12-25']`.
34710
34845
  */
34711
34846
  blackoutDates: {
34712
34847
  type: Array,
@@ -35592,12 +35727,13 @@ class AuroDatePicker extends AuroElement {
35592
35727
  this.calendar.activeCellDate = null;
35593
35728
 
35594
35729
  // Show the month containing the selected date (or today) instead of
35595
- // whichever month the user last navigated to.
35730
+ // whichever month the user last navigated to. Route through
35731
+ // updateCentralDate so centralDate stays first-of-month.
35596
35732
  // Respect consumer-provided centralDate/calendarStartDate if no value is set.
35597
35733
  if (this.valueObject) {
35598
- this.centralDate = this.value;
35734
+ this.calendarRenderUtil.updateCentralDate(this, this.value);
35599
35735
  } else if (!this.centralDate && !this.calendarStartDate && !this.minDate) {
35600
- this.centralDate = dateFormatter$1.toISOFormatString(new Date());
35736
+ this.calendarRenderUtil.updateCentralDate(this, new Date());
35601
35737
  }
35602
35738
  }
35603
35739
 
@@ -35655,8 +35791,15 @@ class AuroDatePicker extends AuroElement {
35655
35791
  // Always clear the inert flag. Only restore focus to the input when the datepicker
35656
35792
  // still has focus (e.g. Escape, date selected) — not when the user tabbed away,
35657
35793
  // which would pull them back and require extra Tab presses to escape.
35794
+ //
35795
+ // `_restoreFocusOnClose` is set by the Escape handler in
35796
+ // datepickerKeyboardStrategy.js to force restore even when hasFocus
35797
+ // has already been cleared — hidePopover() (desktop non-modal path)
35798
+ // can drop focus to <body> before this update fires.
35658
35799
  this.dropdown.trigger.inert = false;
35659
- if (this.hasFocus) {
35800
+ const shouldRestoreFocus = this.hasFocus || this._restoreFocusOnClose;
35801
+ this._restoreFocusOnClose = false;
35802
+ if (shouldRestoreFocus) {
35660
35803
  requestAnimationFrame(() => {
35661
35804
  if (!this.dropdown.isPopoverVisible) {
35662
35805
  this.inputList[0].focus();
@@ -36102,6 +36245,18 @@ class AuroDatePicker extends AuroElement {
36102
36245
  this.calendar.requestUpdate();
36103
36246
  this.dispatchEvent(new CustomEvent('auroDatePicker-newSlotContent'));
36104
36247
  }
36248
+
36249
+ // Range invariant: if a value change (from click or programmatic) has
36250
+ // moved start past end, clear valueEnd here so both properties land in
36251
+ // the SAME reactive cycle. Doing it in updated() would schedule a
36252
+ // second cycle after cellClickActive/wasCellClick has already been
36253
+ // consumed by the value branch, leaving the valueEnd branch to run
36254
+ // with a stale handshake and racing with any intervening programmatic
36255
+ // value assignments.
36256
+ if ((changedProperties.has('value') || changedProperties.has('valueEnd')) &&
36257
+ this.valueObject && this.valueEndObject && this.valueObject > this.valueEndObject) {
36258
+ this.valueEnd = undefined;
36259
+ }
36105
36260
  }
36106
36261
 
36107
36262
  updated(changedProperties) {
@@ -36169,8 +36324,12 @@ class AuroDatePicker extends AuroElement {
36169
36324
 
36170
36325
  if (this.value && this.value.length === this.inputList[0].lengthForType && !(this.wasCellClick && this.range)) {
36171
36326
  // Skip centralDate update when user clicked a cell in range mode
36172
- // to prevent the displayed months from shifting
36173
- this.centralDate = this.value;
36327
+ // to prevent the displayed months from shifting. Route through
36328
+ // updateCentralDate so centralDate stays first-of-month — direct
36329
+ // assignment of the raw value briefly holds a mid-month string
36330
+ // and violates the invariant that observers (e.g. calendar sync)
36331
+ // rely on.
36332
+ this.calendarRenderUtil.updateCentralDate(this, this.value);
36174
36333
  }
36175
36334
 
36176
36335
  this.setHasValue();
@@ -36228,8 +36387,10 @@ class AuroDatePicker extends AuroElement {
36228
36387
 
36229
36388
  if (this.valueEnd && this.valueEnd.length === this.inputList[1].lengthForType && !this.wasCellClick) {
36230
36389
  // Skip centralDate update when user clicked a cell in range mode
36231
- // to prevent the displayed months from shifting
36232
- this.centralDate = this.valueEnd;
36390
+ // to prevent the displayed months from shifting. Route through
36391
+ // updateCentralDate to preserve the first-of-month invariant
36392
+ // (see matching comment in the value branch above).
36393
+ this.calendarRenderUtil.updateCentralDate(this, this.valueEnd);
36233
36394
  }
36234
36395
 
36235
36396
  this.validate();
@@ -36253,10 +36414,6 @@ class AuroDatePicker extends AuroElement {
36253
36414
  this.validation.validate(lastInput, true);
36254
36415
  }
36255
36416
 
36256
- if (this.valueObject && this.valueEndObject && this.valueObject > this.valueEndObject) {
36257
- this.valueEnd = undefined;
36258
- }
36259
-
36260
36417
  // This resets the datepicker when the minDate is set to a new value that is
36261
36418
  // a later date than the current value date
36262
36419
  if (changedProperties.has('minDate') && this.minDate) {
@@ -3942,7 +3942,7 @@ class AuroHelpText extends i {
3942
3942
  }
3943
3943
  }
3944
3944
 
3945
- var formkitVersion = '202607022050';
3945
+ var formkitVersion = '202607061903';
3946
3946
 
3947
3947
  class AuroElement extends i {
3948
3948
  static get properties() {
@@ -3942,7 +3942,7 @@ class AuroHelpText extends i {
3942
3942
  }
3943
3943
  }
3944
3944
 
3945
- var formkitVersion = '202607022050';
3945
+ var formkitVersion = '202607061903';
3946
3946
 
3947
3947
  class AuroElement extends i {
3948
3948
  static get properties() {
@@ -3969,7 +3969,7 @@ class AuroHelpText extends i {
3969
3969
  }
3970
3970
  }
3971
3971
 
3972
- var formkitVersion = '202607022050';
3972
+ var formkitVersion = '202607061903';
3973
3973
 
3974
3974
  class AuroElement extends i {
3975
3975
  static get properties() {
@@ -3874,7 +3874,7 @@ class AuroHelpText extends LitElement {
3874
3874
  }
3875
3875
  }
3876
3876
 
3877
- var formkitVersion = '202607022050';
3877
+ var formkitVersion = '202607061903';
3878
3878
 
3879
3879
  class AuroElement extends LitElement {
3880
3880
  static get properties() {
@@ -3874,7 +3874,7 @@ class AuroHelpText extends LitElement {
3874
3874
  }
3875
3875
  }
3876
3876
 
3877
- var formkitVersion = '202607022050';
3877
+ var formkitVersion = '202607061903';
3878
3878
 
3879
3879
  class AuroElement extends LitElement {
3880
3880
  static get properties() {