@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
@@ -11680,23 +11680,28 @@ var popoverVersion = '6.0.1';
11680
11680
  * @returns {number|null} Local-midnight Unix timestamp (seconds), or null.
11681
11681
  */
11682
11682
  function parseIsoToTimestamp(isoStr) {
11683
+ // Strict YYYY-MM-DD matcher with named groups. Rejects trailing garbage
11684
+ // ("2024x-01-01"), short segments ("2024-1-1"), and any non-digit
11685
+ // characters. `parseInt` alone accepted both because it stops at the
11686
+ // first non-digit and doesn't require a minimum length.
11687
+ const ISO_DATE_RE = /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/u;
11688
+ const MAX_MONTH = 12;
11689
+ const MAX_DAY = 31;
11690
+
11683
11691
  if (typeof isoStr !== 'string') {
11684
11692
  return null;
11685
11693
  }
11686
- const parts = isoStr.split('-');
11687
- if (parts.length !== 3) {
11688
- return null;
11689
- }
11690
- const year = parseInt(parts[0], 10);
11691
- const month = parseInt(parts[1], 10);
11692
- const day = parseInt(parts[2], 10);
11693
- if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) {
11694
+ const match = ISO_DATE_RE.exec(isoStr);
11695
+ if (!match) {
11694
11696
  return null;
11695
11697
  }
11698
+ const year = Number(match.groups.year);
11699
+ const month = Number(match.groups.month);
11700
+ const day = Number(match.groups.day);
11696
11701
  // Reject overflow values like "2024-13-40" — JS `new Date(year, month, day)`
11697
11702
  // silently normalizes those to a different calendar day, which would
11698
11703
  // disable the wrong date if we let the result through.
11699
- if (month < 1 || month > 12 || day < 1 || day > 31) {
11704
+ if (month < 1 || month > MAX_MONTH || day < 1 || day > MAX_DAY) {
11700
11705
  return null;
11701
11706
  }
11702
11707
  const date = new Date(year, month - 1, day);
@@ -12274,13 +12279,36 @@ class AuroCalendarCell extends i$1 {
12274
12279
  }
12275
12280
 
12276
12281
  firstUpdated() {
12282
+ this._initFromAncestors();
12283
+ }
12284
+
12285
+ /**
12286
+ * Wires the cell to its ancestor calendar-month and calendar (and, via
12287
+ * the calendar, to the datepicker). Extracted from firstUpdated() so the
12288
+ * retry loop can re-attempt without recursively invoking a Lit lifecycle
12289
+ * method (which is outside the framework's contract).
12290
+ * @private
12291
+ * @returns {void}
12292
+ */
12293
+ _initFromAncestors() {
12277
12294
  const calendarMonth = this.runtimeUtils.closestElement('auro-formkit-calendar-month', this);
12278
12295
  const calendar = this.runtimeUtils.closestElement('auro-formkit-calendar', calendarMonth);
12279
12296
 
12280
12297
  if (!calendar) {
12281
- setTimeout(() => this.firstUpdated(), 0);
12298
+ // Retry on the next event-loop turn to give the ancestor chain a chance
12299
+ // to attach — but cap attempts so a permanently detached cell doesn't
12300
+ // spin forever. 10 turns is far more than any observed race needs.
12301
+ this._firstUpdatedRetries = (this._firstUpdatedRetries || 0) + 1;
12302
+ if (this._firstUpdatedRetries > 10) {
12303
+ return;
12304
+ }
12305
+ this._firstUpdatedRetryTimer = setTimeout(() => {
12306
+ this._firstUpdatedRetryTimer = null;
12307
+ this._initFromAncestors();
12308
+ }, 0);
12282
12309
  return;
12283
12310
  }
12311
+ this._firstUpdatedRetries = 0;
12284
12312
  this.calendar = calendar;
12285
12313
  this.datepicker = calendar.datepicker;
12286
12314
  this._slotContentHandler = () => {
@@ -12308,6 +12336,10 @@ class AuroCalendarCell extends i$1 {
12308
12336
  if (this.datepicker && this._slotContentHandler) {
12309
12337
  this.datepicker.removeEventListener('auroDatePicker-newSlotContent', this._slotContentHandler);
12310
12338
  }
12339
+ if (this._firstUpdatedRetryTimer) {
12340
+ clearTimeout(this._firstUpdatedRetryTimer);
12341
+ this._firstUpdatedRetryTimer = null;
12342
+ }
12311
12343
  }
12312
12344
 
12313
12345
  /**
@@ -13685,7 +13717,7 @@ class AuroBibtemplate extends i$1 {
13685
13717
  }
13686
13718
  }
13687
13719
 
13688
- var formkitVersion$2 = '202607022050';
13720
+ var formkitVersion$2 = '202607061903';
13689
13721
 
13690
13722
  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}
13691
13723
  `,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}}
@@ -13824,7 +13856,10 @@ class AuroCalendar extends RangeDatepicker {
13824
13856
  * Support will be removed in a future major release.
13825
13857
  * @private
13826
13858
  */
13827
- this.disabledDays = [];
13859
+ // Initialize the backing field directly so the constructor's default
13860
+ // empty array doesn't trigger the deprecation warning. Assignments from
13861
+ // consumers still route through the setter below.
13862
+ this._disabledDays = [];
13828
13863
 
13829
13864
  /**
13830
13865
  * @private
@@ -13857,6 +13892,44 @@ class AuroCalendar extends RangeDatepicker {
13857
13892
  this._calendarInstanceId = Date.now().toString(36);
13858
13893
  }
13859
13894
 
13895
+ /**
13896
+ * @deprecated See constructor JSDoc — migrate to
13897
+ * `auro-datepicker.blackoutDates`. The getter/setter pair exists so the
13898
+ * one-time deprecation warning fires as soon as a consumer assigns a
13899
+ * non-empty array (empty assignments are ignored — an empty array is
13900
+ * indistinguishable from the constructor default and would produce a
13901
+ * spurious warning), rather than only when `_getBlackoutSet()` happens
13902
+ * to rebuild.
13903
+ * @returns {Array} The current legacy `disabledDays` array.
13904
+ */
13905
+ get disabledDays() {
13906
+ return this._disabledDays;
13907
+ }
13908
+
13909
+ /**
13910
+ * @param {Array} value - The legacy `disabledDays` array to set.
13911
+ */
13912
+ set disabledDays(value) {
13913
+ const oldValue = this._disabledDays;
13914
+ // Coerce non-arrays to `[]`. Consumers occasionally pass `null`
13915
+ // (Lit's Array attribute converter returns null for a missing/empty
13916
+ // attribute) or misuse the API; downstream code in
13917
+ // `auro-calendar-cell.isEnabled` calls `.findIndex()` on this value
13918
+ // without an Array.isArray guard, so a truthy non-array would throw
13919
+ // at render.
13920
+ const coerced = Array.isArray(value) ? value : [];
13921
+ if (coerced.length > 0) {
13922
+ this._warnDisabledDaysDeprecated();
13923
+ }
13924
+ this._disabledDays = coerced;
13925
+ // `disabledDays` is a Lit `@property({ type: Array })` on the
13926
+ // RangeDatepicker base class; Lit's generated setter (which we've
13927
+ // overridden here to insert the warning) is what normally invalidates
13928
+ // the reactive cycle. Re-invoke requestUpdate manually so consumer
13929
+ // assignments still re-render the calendar.
13930
+ this.requestUpdate('disabledDays', oldValue);
13931
+ }
13932
+
13860
13933
  static get styles() {
13861
13934
  return [
13862
13935
  styleCss$7,
@@ -14402,8 +14475,19 @@ class AuroCalendar extends RangeDatepicker {
14402
14475
  /**
14403
14476
  * Returns a memoized Set of blackout timestamps (seconds) drawn from both
14404
14477
  * the legacy `disabledDays` array and the datepicker's ISO `blackoutDates`.
14405
- * The cache invalidates when either source array's reference changes, which
14406
- * matches Lit's own reactive identity semantics for array properties.
14478
+ *
14479
+ * The cache invalidates on **reference identity** only when the
14480
+ * consumer reassigns the array (`el.blackoutDates = [...]`), matching
14481
+ * Lit's own reactivity semantics for array properties. In-place mutations
14482
+ * on the existing array (`push`, `splice`, index assignment) will NOT
14483
+ * invalidate the cache and the new entries will be silently ignored.
14484
+ * Consumers must reassign to update — see the JSDoc on
14485
+ * `auro-datepicker.blackoutDates` for the recommended pattern.
14486
+ *
14487
+ * A shallow-equality tier was considered but rejected: it would run
14488
+ * O(N) work on every cell render (this method is called per-cell via
14489
+ * `isBlackout()`) and still wouldn't catch same-length value swaps,
14490
+ * offering a false sense of safety.
14407
14491
  * @private
14408
14492
  * @returns {Set<Number>}
14409
14493
  */
@@ -14584,7 +14668,24 @@ class AuroCalendar extends RangeDatepicker {
14584
14668
  // rendered month(s) first so a single-month calendar does not pick a date
14585
14669
  // that has no DOM cell. Determine the visible range based on centralDate and
14586
14670
  // the number of rendered months.
14587
- const renderedMonths = Math.max(this.numCalendars, 1);
14671
+ //
14672
+ // numCalendars is assigned inside renderAllCalendars(), which runs during
14673
+ // render() — so by the time the visible-change handler in updated()
14674
+ // calls computeActiveDate() in the same cycle, numCalendars is normally
14675
+ // set. Guard against the pre-first-render path anyway (e.g. any future
14676
+ // caller that reaches computeActiveDate before render() has run):
14677
+ // Math.max(undefined, 1) is NaN, which would silently skip the
14678
+ // visible-month scan below. Fall back to maximumRenderableMonths'
14679
+ // desktop default (1 for non-range, 2 for range) so the scan window is
14680
+ // correctly sized whenever numCalendars is not yet populated.
14681
+ let renderedMonths = null;
14682
+
14683
+ if (Number.isFinite(this.numCalendars) && this.numCalendars > 0) {
14684
+ renderedMonths = this.numCalendars;
14685
+ } else {
14686
+ renderedMonths = this.noRange ? 1 : 2;
14687
+ }
14688
+
14588
14689
  const visibleAnchor = this.centralDateObject ?? new Date(now * 1000);
14589
14690
  const visMonthStart = new Date(visibleAnchor.getFullYear(), visibleAnchor.getMonth(), 1);
14590
14691
  visMonthStart.setHours(0, 0, 0, 0);
@@ -14854,6 +14955,8 @@ class AuroCalendar extends RangeDatepicker {
14854
14955
  let targetIndex = -1;
14855
14956
  if (direction === 'next') {
14856
14957
  targetIndex = currentIndex + 1;
14958
+ } else if (direction === 'prev') {
14959
+ targetIndex = currentIndex - 1;
14857
14960
  }
14858
14961
 
14859
14962
  if (targetIndex >= 0 && targetIndex < allCells.length) {
@@ -15458,6 +15561,10 @@ class AuroCalendar extends RangeDatepicker {
15458
15561
  * originally tried aria-live="polite" here, but VoiceOver treats
15459
15562
  * polite as "wait until idle" — which never happens during active
15460
15563
  * keyboard navigation — so the announcements were silently dropped.
15564
+ *
15565
+ * This is a documented deviation from WCAG 2.1 SC 4.1.3, which
15566
+ * prefers `polite` for status messages. See the "Documented
15567
+ * Deviation" section in components/datepicker/docs/pages/accessibility.md.
15461
15568
  * @private
15462
15569
  * @param {String} dateStr - The localized date string to announce.
15463
15570
  * @returns {void}
@@ -19527,7 +19634,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$1 {
19527
19634
  }
19528
19635
  };
19529
19636
 
19530
- var formkitVersion$1 = '202607022050';
19637
+ var formkitVersion$1 = '202607061903';
19531
19638
 
19532
19639
  let AuroElement$2 = class AuroElement extends i$1 {
19533
19640
  static get properties() {
@@ -31542,14 +31649,16 @@ class BaseInput extends AuroElement$1 {
31542
31649
  this.label = 'Input label is undefined';
31543
31650
  this.layout = 'classic';
31544
31651
  this.locale = 'en-US';
31652
+ this._format = undefined;
31653
+
31654
+ /** @private */
31655
+ this._userSetFormat = false;
31545
31656
  this.max = undefined;
31546
31657
  this.maxLength = undefined;
31547
31658
  this.min = undefined;
31548
31659
  this.minLength = undefined;
31549
31660
  this.noValidate = false;
31550
31661
  this.onDark = false;
31551
- // Raw values returned from the input mask before model normalization.
31552
- this._rawMaskValue = undefined;
31553
31662
  this.required = false;
31554
31663
  this.setCustomValidityForType = undefined;
31555
31664
  // Credit Card is intentionally excluded — its mask manages the cursor
@@ -31707,7 +31816,8 @@ class BaseInput extends AuroElement$1 {
31707
31816
  */
31708
31817
  format: {
31709
31818
  type: String,
31710
- reflect: true
31819
+ reflect: true,
31820
+ noAccessor: true
31711
31821
  },
31712
31822
 
31713
31823
  /**
@@ -32045,6 +32155,34 @@ class BaseInput extends AuroElement$1 {
32045
32155
  return this.max && dateFormatter.isValidDate(this.max) ? dateFormatter.stringToDateInstance(this.max) : undefined;
32046
32156
  }
32047
32157
 
32158
+ get format() {
32159
+ return this._format;
32160
+ }
32161
+
32162
+ /**
32163
+ * Overrides LitElement's generated accessor so we can track whether the
32164
+ * consumer explicitly set `format`. Locale-derived updates use
32165
+ * `_setFormatFromLocale` instead, which skips this flag.
32166
+ */
32167
+ set format(value) {
32168
+ const oldValue = this._format;
32169
+ this._format = value ? value.toLowerCase() : value;
32170
+ this._userSetFormat = Boolean(value);
32171
+ this.requestUpdate('format', oldValue);
32172
+ }
32173
+
32174
+ /**
32175
+ * Sets format without marking it as user-set. Used by locale auto-derive
32176
+ * so that a subsequent locale change can still update the format.
32177
+ * @private
32178
+ * @param {string} value
32179
+ */
32180
+ _setFormatFromLocale(value) {
32181
+ const oldValue = this._format;
32182
+ this._format = value ? value.toLowerCase() : value;
32183
+ this.requestUpdate('format', oldValue);
32184
+ }
32185
+
32048
32186
  connectedCallback() {
32049
32187
  super.connectedCallback();
32050
32188
 
@@ -32092,15 +32230,6 @@ class BaseInput extends AuroElement$1 {
32092
32230
 
32093
32231
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
32094
32232
 
32095
- // Normalize the format token to lowercase so case-mixed values supplied
32096
- // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
32097
- // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
32098
- // format silently misses the map and leaves `setCustomValidityForType`
32099
- // unset.
32100
- if (this.format) {
32101
- this.format = this.format.toLowerCase();
32102
- }
32103
-
32104
32233
  // use validity message override if declared when initializing the component
32105
32234
  if (this.hasAttribute('setCustomValidity')) {
32106
32235
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -32207,12 +32336,10 @@ class BaseInput extends AuroElement$1 {
32207
32336
  updated(changedProperties) {
32208
32337
  super.updated(changedProperties);
32209
32338
 
32210
- // When locale changes without an explicit format override, derive format from the new locale.
32211
- // Only runs if the current format is still the previous locale's default (not user-overridden).
32339
+ // When locale changes, auto-derive format unless the consumer explicitly set one.
32212
32340
  if (changedProperties.has('locale') && !changedProperties.has('format') && this.type === 'date') {
32213
- const previousLocaleFormat = getDateFormatFromLocale(changedProperties.get('locale'));
32214
- if (!this.format || this.format.toLowerCase() === previousLocaleFormat) {
32215
- this.format = getDateFormatFromLocale(this.locale);
32341
+ if (!this._userSetFormat) {
32342
+ this._setFormatFromLocale(getDateFormatFromLocale(this.locale));
32216
32343
  }
32217
32344
  }
32218
32345
 
@@ -32383,9 +32510,6 @@ class BaseInput extends AuroElement$1 {
32383
32510
  this.maskInstance.on('accept', () => {
32384
32511
  if (this._configuringMask) return;
32385
32512
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
32386
- if (this.type === "date") {
32387
- this._rawMaskValue = this.maskInstance.value;
32388
- }
32389
32513
  });
32390
32514
 
32391
32515
  // Mask fires 'complete' on the restore step below for any value that
@@ -32393,9 +32517,6 @@ class BaseInput extends AuroElement$1 {
32393
32517
  this.maskInstance.on('complete', () => {
32394
32518
  if (this._configuringMask) return;
32395
32519
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
32396
- if (this.type === "date") {
32397
- this._rawMaskValue = this.maskInstance.value;
32398
- }
32399
32520
  });
32400
32521
 
32401
32522
  // Write existingValue through the mask (not the input directly) so
@@ -32416,14 +32537,17 @@ class BaseInput extends AuroElement$1 {
32416
32537
  * @returns {void}
32417
32538
  */
32418
32539
  notifyValueChanged() {
32419
- let inputEvent = null;
32420
-
32421
- inputEvent = new Event('input', {
32540
+ // This echoes Lit's reactive value update (and handleClickClear's
32541
+ // programmatic clear) — it is NOT a fresh user-input event. Mark it
32542
+ // `isProgrammatic` so consumers (e.g. auro-combobox) can distinguish
32543
+ // it from genuine user typing and skip clobbering their own
32544
+ // programmatic state during init-time renders.
32545
+ const inputEvent = new Event('input', {
32422
32546
  bubbles: true,
32423
32547
  composed: true,
32424
32548
  });
32549
+ inputEvent.isProgrammatic = true;
32425
32550
 
32426
- // Dispatched event to alert outside shadow DOM context of event firing.
32427
32551
  this.dispatchEvent(inputEvent);
32428
32552
  }
32429
32553
 
@@ -32632,8 +32756,7 @@ class BaseInput extends AuroElement$1 {
32632
32756
 
32633
32757
  // Set default date format if type=date and no format is defined
32634
32758
  if (this.type === "date" && !this.format) {
32635
- // Use locale to determine default date format
32636
- this.format = this.util.getDateMaskFromLocale().toLowerCase();
32759
+ this._setFormatFromLocale(this.util.getDateMaskFromLocale().toLowerCase());
32637
32760
  this.util.updateFormat(this.format);
32638
32761
  }
32639
32762
  }
@@ -32662,7 +32785,7 @@ class BaseInput extends AuroElement$1 {
32662
32785
  const creditCard = this.matchInputValueToCreditCard();
32663
32786
  const previousFormat = this.format;
32664
32787
 
32665
- this.format = creditCard.maskFormat;
32788
+ this._setFormatFromLocale(creditCard.maskFormat);
32666
32789
 
32667
32790
  this.maxLength = creditCard.formatLength;
32668
32791
  this.minLength = creditCard.formatMinLength;
@@ -33136,7 +33259,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$1 {
33136
33259
  }
33137
33260
  };
33138
33261
 
33139
- var formkitVersion = '202607022050';
33262
+ var formkitVersion = '202607061903';
33140
33263
 
33141
33264
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
33142
33265
  // See LICENSE in the project root for license information.
@@ -33422,20 +33545,15 @@ class AuroInput extends BaseInput {
33422
33545
  * @returns {void}
33423
33546
  */
33424
33547
  checkDisplayValueSlotChange() {
33425
- let nodes = this.shadowRoot.querySelector('slot[name="displayValue"]').assignedNodes();
33548
+ // flatten:true resolves through auro-combobox's forwarding slot
33549
+ // (<slot name="displayValue" slot="displayValue">) so a clone appended
33550
+ // directly to auro-input's light DOM alongside the forwarder still
33551
+ // counts as content. The prior nodes[0].tagName === 'SLOT' recursion
33552
+ // discarded any siblings past the forwarder.
33553
+ const slot = this.shadowRoot.querySelector('slot[name="displayValue"]');
33554
+ const nodes = slot.assignedNodes({ flatten: true });
33426
33555
 
33427
- // Handle when DisplayValue is multi-level slot content (e.g. combobox passing displayValue to input)
33428
- if (nodes && nodes[0] && nodes[0].tagName === 'SLOT') {
33429
- nodes = nodes[0].assignedNodes();
33430
- }
33431
-
33432
- let hasContent = false;
33433
-
33434
- if (nodes.length > 0) {
33435
- hasContent = true;
33436
- }
33437
-
33438
- this.hasDisplayValueContent = hasContent;
33556
+ this.hasDisplayValueContent = nodes.length > 0;
33439
33557
  }
33440
33558
 
33441
33559
  firstUpdated() {
@@ -34513,6 +34631,15 @@ const datepickerKeyboardStrategy = {
34513
34631
  evt.stopPropagation();
34514
34632
  evt.preventDefault();
34515
34633
 
34634
+ // Signal to the visibility-change handler in auro-datepicker.js that
34635
+ // focus should be restored to the trigger regardless of hasFocus.
34636
+ // hidePopover() (desktop non-modal path) does not auto-restore focus,
34637
+ // and hiding the grid's popover ancestor drops focus to <body>. That
34638
+ // synchronously fires focusout on the datepicker host — clearing
34639
+ // hasFocus — before updated() runs, which would otherwise skip the
34640
+ // input refocus. Native <dialog>.close() (modal path) restores focus
34641
+ // itself, but the flag is harmless there.
34642
+ component._restoreFocusOnClose = true;
34516
34643
  component.hideBib();
34517
34644
  },
34518
34645
 
@@ -34786,6 +34913,14 @@ class AuroDatePicker extends AuroElement {
34786
34913
 
34787
34914
  /**
34788
34915
  * Array of dates that cannot be selected. Dates should be in ISO format (YYYY-MM-DD).
34916
+ *
34917
+ * **Immutable update required.** The datepicker treats this array as
34918
+ * immutable and memoizes a lookup Set keyed on the array's reference
34919
+ * identity — matching Lit's own reactivity semantics for array
34920
+ * properties. In-place mutations (`blackoutDates.push(...)`,
34921
+ * `blackoutDates[i] = ...`, `blackoutDates.splice(...)`) will not
34922
+ * invalidate the cache and the new entries will be silently ignored.
34923
+ * To update, reassign the property: `el.blackoutDates = [...el.blackoutDates, '2024-12-25']`.
34789
34924
  */
34790
34925
  blackoutDates: {
34791
34926
  type: Array,
@@ -35671,12 +35806,13 @@ class AuroDatePicker extends AuroElement {
35671
35806
  this.calendar.activeCellDate = null;
35672
35807
 
35673
35808
  // Show the month containing the selected date (or today) instead of
35674
- // whichever month the user last navigated to.
35809
+ // whichever month the user last navigated to. Route through
35810
+ // updateCentralDate so centralDate stays first-of-month.
35675
35811
  // Respect consumer-provided centralDate/calendarStartDate if no value is set.
35676
35812
  if (this.valueObject) {
35677
- this.centralDate = this.value;
35813
+ this.calendarRenderUtil.updateCentralDate(this, this.value);
35678
35814
  } else if (!this.centralDate && !this.calendarStartDate && !this.minDate) {
35679
- this.centralDate = dateFormatter$1.toISOFormatString(new Date());
35815
+ this.calendarRenderUtil.updateCentralDate(this, new Date());
35680
35816
  }
35681
35817
  }
35682
35818
 
@@ -35734,8 +35870,15 @@ class AuroDatePicker extends AuroElement {
35734
35870
  // Always clear the inert flag. Only restore focus to the input when the datepicker
35735
35871
  // still has focus (e.g. Escape, date selected) — not when the user tabbed away,
35736
35872
  // which would pull them back and require extra Tab presses to escape.
35873
+ //
35874
+ // `_restoreFocusOnClose` is set by the Escape handler in
35875
+ // datepickerKeyboardStrategy.js to force restore even when hasFocus
35876
+ // has already been cleared — hidePopover() (desktop non-modal path)
35877
+ // can drop focus to <body> before this update fires.
35737
35878
  this.dropdown.trigger.inert = false;
35738
- if (this.hasFocus) {
35879
+ const shouldRestoreFocus = this.hasFocus || this._restoreFocusOnClose;
35880
+ this._restoreFocusOnClose = false;
35881
+ if (shouldRestoreFocus) {
35739
35882
  requestAnimationFrame(() => {
35740
35883
  if (!this.dropdown.isPopoverVisible) {
35741
35884
  this.inputList[0].focus();
@@ -36181,6 +36324,18 @@ class AuroDatePicker extends AuroElement {
36181
36324
  this.calendar.requestUpdate();
36182
36325
  this.dispatchEvent(new CustomEvent('auroDatePicker-newSlotContent'));
36183
36326
  }
36327
+
36328
+ // Range invariant: if a value change (from click or programmatic) has
36329
+ // moved start past end, clear valueEnd here so both properties land in
36330
+ // the SAME reactive cycle. Doing it in updated() would schedule a
36331
+ // second cycle after cellClickActive/wasCellClick has already been
36332
+ // consumed by the value branch, leaving the valueEnd branch to run
36333
+ // with a stale handshake and racing with any intervening programmatic
36334
+ // value assignments.
36335
+ if ((changedProperties.has('value') || changedProperties.has('valueEnd')) &&
36336
+ this.valueObject && this.valueEndObject && this.valueObject > this.valueEndObject) {
36337
+ this.valueEnd = undefined;
36338
+ }
36184
36339
  }
36185
36340
 
36186
36341
  updated(changedProperties) {
@@ -36248,8 +36403,12 @@ class AuroDatePicker extends AuroElement {
36248
36403
 
36249
36404
  if (this.value && this.value.length === this.inputList[0].lengthForType && !(this.wasCellClick && this.range)) {
36250
36405
  // Skip centralDate update when user clicked a cell in range mode
36251
- // to prevent the displayed months from shifting
36252
- this.centralDate = this.value;
36406
+ // to prevent the displayed months from shifting. Route through
36407
+ // updateCentralDate so centralDate stays first-of-month — direct
36408
+ // assignment of the raw value briefly holds a mid-month string
36409
+ // and violates the invariant that observers (e.g. calendar sync)
36410
+ // rely on.
36411
+ this.calendarRenderUtil.updateCentralDate(this, this.value);
36253
36412
  }
36254
36413
 
36255
36414
  this.setHasValue();
@@ -36307,8 +36466,10 @@ class AuroDatePicker extends AuroElement {
36307
36466
 
36308
36467
  if (this.valueEnd && this.valueEnd.length === this.inputList[1].lengthForType && !this.wasCellClick) {
36309
36468
  // Skip centralDate update when user clicked a cell in range mode
36310
- // to prevent the displayed months from shifting
36311
- this.centralDate = this.valueEnd;
36469
+ // to prevent the displayed months from shifting. Route through
36470
+ // updateCentralDate to preserve the first-of-month invariant
36471
+ // (see matching comment in the value branch above).
36472
+ this.calendarRenderUtil.updateCentralDate(this, this.valueEnd);
36312
36473
  }
36313
36474
 
36314
36475
  this.validate();
@@ -36332,10 +36493,6 @@ class AuroDatePicker extends AuroElement {
36332
36493
  this.validation.validate(lastInput, true);
36333
36494
  }
36334
36495
 
36335
- if (this.valueObject && this.valueEndObject && this.valueObject > this.valueEndObject) {
36336
- this.valueEnd = undefined;
36337
- }
36338
-
36339
36496
  // This resets the datepicker when the minDate is set to a new value that is
36340
36497
  // a later date than the current value date
36341
36498
  if (changedProperties.has('minDate') && this.minDate) {