@aurodesignsystem-dev/auro-formkit 0.0.0-pr1509.0 → 0.0.0-pr1510.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 (50) 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 +4 -19
  7. package/components/combobox/demo/getting-started.min.js +4 -19
  8. package/components/combobox/demo/index.min.js +4 -19
  9. package/components/combobox/dist/index.js +4 -19
  10. package/components/combobox/dist/registered.js +4 -19
  11. package/components/counter/demo/customize.min.js +2 -2
  12. package/components/counter/demo/index.min.js +2 -2
  13. package/components/counter/dist/index.js +2 -2
  14. package/components/counter/dist/registered.js +2 -2
  15. package/components/datepicker/demo/accessibility.md +2 -1
  16. package/components/datepicker/demo/api.md +63 -62
  17. package/components/datepicker/demo/customize.md +12 -1
  18. package/components/datepicker/demo/customize.min.js +456 -183
  19. package/components/datepicker/demo/index.min.js +456 -183
  20. package/components/datepicker/dist/index.js +456 -183
  21. package/components/datepicker/dist/registered.js +456 -183
  22. package/components/datepicker/dist/src/auro-calendar-cell.d.ts +14 -3
  23. package/components/datepicker/dist/src/auro-calendar.d.ts +87 -5
  24. package/components/datepicker/dist/src/auro-datepicker.d.ts +73 -3
  25. package/components/dropdown/demo/customize.min.js +1 -1
  26. package/components/dropdown/demo/getting-started.min.js +1 -1
  27. package/components/dropdown/demo/index.min.js +1 -1
  28. package/components/dropdown/dist/index.js +1 -1
  29. package/components/dropdown/dist/registered.js +1 -1
  30. package/components/form/demo/customize.min.js +474 -231
  31. package/components/form/demo/getting-started.min.js +474 -231
  32. package/components/form/demo/index.min.js +474 -231
  33. package/components/form/demo/registerDemoDeps.min.js +474 -231
  34. package/components/input/demo/customize.min.js +2 -17
  35. package/components/input/demo/getting-started.min.js +2 -17
  36. package/components/input/demo/index.min.js +2 -17
  37. package/components/input/dist/index.js +2 -17
  38. package/components/input/dist/registered.js +2 -17
  39. package/components/radio/demo/customize.min.js +1 -1
  40. package/components/radio/demo/getting-started.min.js +1 -1
  41. package/components/radio/demo/index.min.js +1 -1
  42. package/components/radio/dist/index.js +1 -1
  43. package/components/radio/dist/registered.js +1 -1
  44. package/components/select/demo/customize.min.js +2 -2
  45. package/components/select/demo/getting-started.min.js +2 -2
  46. package/components/select/demo/index.min.js +2 -2
  47. package/components/select/dist/index.js +2 -2
  48. package/components/select/dist/registered.js +2 -2
  49. package/custom-elements.json +1868 -1696
  50. package/package.json +2 -1
@@ -1356,7 +1356,7 @@ function normalizeDates$1(context, ...dates) {
1356
1356
  * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))
1357
1357
  * //=> Tue Sep 02 2014 00:00:00
1358
1358
  */
1359
- function startOfDay$2(date, options) {
1359
+ function startOfDay$1(date, options) {
1360
1360
  const _date = toDate$1(date, options?.in);
1361
1361
  _date.setHours(0, 0, 0, 0);
1362
1362
  return _date;
@@ -1404,8 +1404,8 @@ function differenceInCalendarDays$1(laterDate, earlierDate, options) {
1404
1404
  earlierDate,
1405
1405
  );
1406
1406
 
1407
- const laterStartOfDay = startOfDay$2(laterDate_);
1408
- const earlierStartOfDay = startOfDay$2(earlierDate_);
1407
+ const laterStartOfDay = startOfDay$1(laterDate_);
1408
+ const earlierStartOfDay = startOfDay$1(earlierDate_);
1409
1409
 
1410
1410
  const laterTimestamp =
1411
1411
  +laterStartOfDay - getTimezoneOffsetInMilliseconds$1(laterStartOfDay);
@@ -10862,8 +10862,8 @@ class RangeDatepickerCell extends LitElement {
10862
10862
  const parsedDateFrom = parseInt(dateFrom, 10);
10863
10863
  const parsedDateTo = parseInt(dateTo, 10);
10864
10864
  if (day) {
10865
- if (getTime(startOfDay$2(parsedDateTo * 1000)) / 1000 === day.date ||
10866
- getTime(startOfDay$2(parsedDateFrom * 1000)) / 1000 === day.date) {
10865
+ if (getTime(startOfDay$1(parsedDateTo * 1000)) / 1000 === day.date ||
10866
+ getTime(startOfDay$1(parsedDateFrom * 1000)) / 1000 === day.date) {
10867
10867
  this.selected = true;
10868
10868
  }
10869
10869
  if (((hoveredDate === day.date || day.date < hoveredDate) &&
@@ -11051,7 +11051,7 @@ class RangeDatepickerCalendar extends LitElement {
11051
11051
  this.dayNamesOfTheWeek = [];
11052
11052
  this.daysOfMonth = [];
11053
11053
  this._locale = null;
11054
- this.currentDate = parseInt(format$1(startOfDay$2(Date.now()), 't'), 10);
11054
+ this.currentDate = parseInt(format$1(startOfDay$1(Date.now()), 't'), 10);
11055
11055
  this.localeChanged();
11056
11056
  this.yearAndMonthChanged(this.year, this.month);
11057
11057
  }
@@ -11525,7 +11525,7 @@ __decorate([property({ type: Array })], RangeDatepickerCalendar.prototype, "dayN
11525
11525
  __decorate([property({ type: Array })], RangeDatepickerCalendar.prototype, "daysOfMonth", void 0);
11526
11526
  AuroLibraryRuntimeUtils$5.prototype.registerComponent('wc-range-datepicker-calendar', RangeDatepickerCalendar);
11527
11527
 
11528
- var styleCss$5 = css`.body-default{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-default-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default-emphasized{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-default-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-emphasized-font-size, 1rem);line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.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-lg-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg-emphasized{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-lg-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{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-sm-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-font-size, 0.875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm-emphasized{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-sm-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.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-xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-font-size, 0.75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs-emphasized{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-xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);line-height:var(--wcss-body-xs-emphasized-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-weight:var(--wcss-body-2xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-font-size, 0.625rem);line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs-emphasized{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-2xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);line-height:var(--wcss-body-2xs-emphasized-line-height, 0.875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-2xl-weight, 300);line-height:var(--wcss-display-2xl-line-height, 1.3);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));letter-spacing:var(--wcss-display-2xl-letter-spacing, 0)}.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-weight:var(--wcss-display-xl-weight, 300);line-height:var(--wcss-display-xl-line-height, 1.3);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));letter-spacing:var(--wcss-display-xl-letter-spacing, 0)}.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-weight:var(--wcss-display-lg-weight, 300);line-height:var(--wcss-display-lg-line-height, 1.3);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));letter-spacing:var(--wcss-display-lg-letter-spacing, 0)}.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-weight:var(--wcss-display-md-weight, 300);line-height:var(--wcss-display-md-line-height, 1.3);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));letter-spacing:var(--wcss-display-md-letter-spacing, 0)}.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-weight:var(--wcss-display-sm-weight, 300);line-height:var(--wcss-display-sm-line-height, 1.3);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));letter-spacing:var(--wcss-display-sm-letter-spacing, 0)}.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-weight:var(--wcss-display-xs-weight, 300);line-height:var(--wcss-display-xs-line-height, 1.3);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));letter-spacing:var(--wcss-display-xs-letter-spacing, 0)}.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-weight:var(--wcss-heading-xl-weight, 300);line-height:var(--wcss-heading-xl-line-height, 1.3);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));letter-spacing:var(--wcss-heading-xl-letter-spacing, 0)}.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-weight:var(--wcss-heading-lg-weight, 300);line-height:var(--wcss-heading-lg-line-height, 1.3);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));letter-spacing:var(--wcss-heading-lg-letter-spacing, 0)}.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-weight:var(--wcss-heading-md-weight, 300);line-height:var(--wcss-heading-md-line-height, 1.3);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));letter-spacing:var(--wcss-heading-md-letter-spacing, 0)}.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-weight:var(--wcss-heading-sm-weight, 300);line-height:var(--wcss-heading-sm-line-height, 1.3);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));letter-spacing:var(--wcss-heading-sm-letter-spacing, 0)}.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-weight:var(--wcss-heading-xs-weight, 300);line-height:var(--wcss-heading-xs-line-height, 1.3);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));letter-spacing:var(--wcss-heading-xs-letter-spacing, 0)}.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-weight:var(--wcss-heading-2xs-weight, 300);line-height:var(--wcss-heading-2xs-line-height, 1.3);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0)}.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-weight:var(--wcss-accent-2xl-weight, 450);line-height:var(--wcss-accent-2xl-line-height, 1);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));letter-spacing:var(--wcss-accent-2xl-letter-spacing, 0.05em);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-weight:var(--wcss-accent-xl-weight, 450);line-height:var(--wcss-accent-xl-line-height, 1.3);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));letter-spacing:var(--wcss-accent-xl-letter-spacing, 0.05em);text-transform:uppercase}.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-weight:var(--wcss-accent-lg-weight, 450);line-height:var(--wcss-accent-lg-line-height, 1.3);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));letter-spacing:var(--wcss-accent-lg-letter-spacing, 0.05em);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-weight:var(--wcss-accent-md-weight, 500);line-height:var(--wcss-accent-md-line-height, 1.3);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));letter-spacing:var(--wcss-accent-md-letter-spacing, 0.05em);text-transform:uppercase}.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-weight:var(--wcss-accent-sm-weight, 500);line-height:var(--wcss-accent-sm-line-height, 1.3);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));letter-spacing:var(--wcss-accent-sm-letter-spacing, 0.05em);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-weight:var(--wcss-accent-xs-weight, 500);line-height:var(--wcss-accent-xs-line-height, 1.3);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));letter-spacing:var(--wcss-accent-xs-letter-spacing, 0.1em);text-transform:uppercase}.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-weight:var(--wcss-accent-2xs-weight, 450);line-height:var(--wcss-accent-2xs-line-height, 1.3);font-size:var(--wcss-accent-2xs-font-size, clamp(0.875rem, 1.1666666667vw, 0.875rem));letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);text-transform:uppercase}@media screen and (max-width: 576px){:host{display:flex;justify-content:center}}.day{position:relative;width:48px;height:56px;padding:0;border-width:2px;border-style:solid;border-radius:10px;cursor:pointer;user-select:none}.day:focus-visible{outline:none;background-color:unset}.day.activeCell{outline-width:2px;outline-style:solid;outline-offset:-4px}.day.disabled{cursor:default !important;pointer-events:none}.day.blackout{cursor:pointer}.day.reference:after{position:absolute;top:-2px;left:-2px;display:block;width:calc(100% + 2px);height:calc(100% + 2px);box-sizing:content-box;border-radius:10px;border-style:solid;border-width:1px;content:""}.day.inRange::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:""}.day.rangeDepartDate::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:"";border-radius:10px 0 0 10px;overflow:hidden}.day.rangeReturnDate::before,.day.lastHoveredDate::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:"";border-radius:0 10px 10px 0;overflow:hidden}.day.firstDayOfMonth::before{border-radius:10px 0 0 10px;overflow:hidden}.day.lastDayOfMonth::before{border-radius:0 10px 10px 0;overflow:hidden}.buttonWrapper{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.dateSlot{display:block}::slotted([slot^=date_]){width:100%;white-space:nowrap}::slotted(auro-icon){max-height:24px;max-width:24px}:host([renderForDateSlot]) .buttonWrapper{position:relative;width:100%;height:100%}:host([renderForDateSlot]) .currentDayMarker{position:relative}`;
11528
+ var styleCss$5 = css`.body-default{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-default-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default-emphasized{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-default-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-emphasized-font-size, 1rem);line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.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-lg-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg-emphasized{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-lg-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{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-sm-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-font-size, 0.875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm-emphasized{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-sm-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.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-xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-font-size, 0.75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs-emphasized{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-xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);line-height:var(--wcss-body-xs-emphasized-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-weight:var(--wcss-body-2xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-font-size, 0.625rem);line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs-emphasized{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-2xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);line-height:var(--wcss-body-2xs-emphasized-line-height, 0.875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-2xl-weight, 300);line-height:var(--wcss-display-2xl-line-height, 1.3);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));letter-spacing:var(--wcss-display-2xl-letter-spacing, 0)}.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-weight:var(--wcss-display-xl-weight, 300);line-height:var(--wcss-display-xl-line-height, 1.3);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));letter-spacing:var(--wcss-display-xl-letter-spacing, 0)}.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-weight:var(--wcss-display-lg-weight, 300);line-height:var(--wcss-display-lg-line-height, 1.3);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));letter-spacing:var(--wcss-display-lg-letter-spacing, 0)}.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-weight:var(--wcss-display-md-weight, 300);line-height:var(--wcss-display-md-line-height, 1.3);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));letter-spacing:var(--wcss-display-md-letter-spacing, 0)}.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-weight:var(--wcss-display-sm-weight, 300);line-height:var(--wcss-display-sm-line-height, 1.3);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));letter-spacing:var(--wcss-display-sm-letter-spacing, 0)}.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-weight:var(--wcss-display-xs-weight, 300);line-height:var(--wcss-display-xs-line-height, 1.3);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));letter-spacing:var(--wcss-display-xs-letter-spacing, 0)}.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-weight:var(--wcss-heading-xl-weight, 300);line-height:var(--wcss-heading-xl-line-height, 1.3);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));letter-spacing:var(--wcss-heading-xl-letter-spacing, 0)}.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-weight:var(--wcss-heading-lg-weight, 300);line-height:var(--wcss-heading-lg-line-height, 1.3);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));letter-spacing:var(--wcss-heading-lg-letter-spacing, 0)}.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-weight:var(--wcss-heading-md-weight, 300);line-height:var(--wcss-heading-md-line-height, 1.3);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));letter-spacing:var(--wcss-heading-md-letter-spacing, 0)}.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-weight:var(--wcss-heading-sm-weight, 300);line-height:var(--wcss-heading-sm-line-height, 1.3);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));letter-spacing:var(--wcss-heading-sm-letter-spacing, 0)}.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-weight:var(--wcss-heading-xs-weight, 300);line-height:var(--wcss-heading-xs-line-height, 1.3);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));letter-spacing:var(--wcss-heading-xs-letter-spacing, 0)}.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-weight:var(--wcss-heading-2xs-weight, 300);line-height:var(--wcss-heading-2xs-line-height, 1.3);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0)}.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-weight:var(--wcss-accent-2xl-weight, 450);line-height:var(--wcss-accent-2xl-line-height, 1);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));letter-spacing:var(--wcss-accent-2xl-letter-spacing, 0.05em);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-weight:var(--wcss-accent-xl-weight, 450);line-height:var(--wcss-accent-xl-line-height, 1.3);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));letter-spacing:var(--wcss-accent-xl-letter-spacing, 0.05em);text-transform:uppercase}.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-weight:var(--wcss-accent-lg-weight, 450);line-height:var(--wcss-accent-lg-line-height, 1.3);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));letter-spacing:var(--wcss-accent-lg-letter-spacing, 0.05em);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-weight:var(--wcss-accent-md-weight, 500);line-height:var(--wcss-accent-md-line-height, 1.3);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));letter-spacing:var(--wcss-accent-md-letter-spacing, 0.05em);text-transform:uppercase}.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-weight:var(--wcss-accent-sm-weight, 500);line-height:var(--wcss-accent-sm-line-height, 1.3);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));letter-spacing:var(--wcss-accent-sm-letter-spacing, 0.05em);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-weight:var(--wcss-accent-xs-weight, 500);line-height:var(--wcss-accent-xs-line-height, 1.3);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));letter-spacing:var(--wcss-accent-xs-letter-spacing, 0.1em);text-transform:uppercase}.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-weight:var(--wcss-accent-2xs-weight, 450);line-height:var(--wcss-accent-2xs-line-height, 1.3);font-size:var(--wcss-accent-2xs-font-size, clamp(0.875rem, 1.1666666667vw, 0.875rem));letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);text-transform:uppercase}@media screen and (max-width: 576px){:host{display:flex;justify-content:center}}.day{position:relative;width:48px;height:56px;padding:0;border-width:2px;border-style:solid;border-radius:10px;cursor:pointer;user-select:none}.day:focus-visible{outline:none;background-color:unset}.day.activeCell{outline-width:2px;outline-style:solid;outline-offset:-4px}.day.disabled{cursor:default !important;pointer-events:none}.day.blackout{cursor:pointer}.day.reference:after{position:absolute;top:-2px;left:-2px;display:block;width:calc(100% + 2px);height:calc(100% + 2px);box-sizing:content-box;border-radius:10px;border-style:solid;border-width:1px;content:""}.day.inRange::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:""}.day.rangeDepartDate::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:"";border-radius:10px 0 0 10px;overflow:hidden}.day.rangeReturnDate::before,.day.lastHoveredDate::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:"";border-radius:0 10px 10px 0;overflow:hidden}.day.rangeDepartDate.lastHoveredDate::before{border-radius:10px}.day.firstDayOfMonth::before{border-radius:10px 0 0 10px;overflow:hidden}.day.lastDayOfMonth::before{border-radius:0 10px 10px 0;overflow:hidden}.buttonWrapper{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.dateSlot{display:block}::slotted([slot^=date_]){width:100%;white-space:nowrap}::slotted(auro-icon){max-height:24px;max-width:24px}:host([renderForDateSlot]) .buttonWrapper{position:relative;width:100%;height:100%}:host([renderForDateSlot]) .currentDayMarker{position:relative}`;
11529
11529
 
11530
11530
  var colorCss$5 = css`:host ::slotted([slot^=date_]){color:var(--ds-auro-calendar-cell-price-text-color)}:host ::slotted([slot^=date_][highlight]){--ds-auro-calendar-cell-price-text-color: var(--ds-basic-color-status-success, #447a1f)}:host .day{border-color:var(--ds-auro-calendar-cell-border-color);background-color:var(--ds-auro-calendar-cell-container-color);color:var(--ds-auro-calendar-cell-text-color)}:host .day.activeCell:not(.selected){--ds-auro-calendar-cell-container-color: var(--ds-auro-calendar-cell-in-range-color);border-color:var(--ds-advanced-color-state-selected);outline-color:var(--ds-auro-calendar-cell-container-color)}:host .day.selected{--ds-auro-calendar-cell-container-color: var(--ds-advanced-color-state-selected, #01426a);--ds-auro-calendar-cell-text-color: var(--ds-basic-color-texticon-inverse, #ffffff);--ds-auro-calendar-cell-price-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host .day.selected ::slotted([slot^=date_][highlight]){--ds-auro-calendar-cell-price-text-color: var(--ds-basic-color-status-success-subtle, #d6eac7)}:host .day.selected:hover{--ds-auro-calendar-cell-container-color: var(--ds-advanced-color-state-selected-hover, #00274a);--ds-auro-calendar-cell-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host .day.reference:after{border-color:var(--ds-basic-color-border-default, #959595);box-shadow:inset 0 0 0 2px var(--ds-basic-color-surface-default, #ffffff)}:host .day.reference:hover::after{box-shadow:inset 0 0 0 2px var(--ds-advanced-color-shared-background-muted, #f7f7f7)}:host .day:hover{--ds-auro-calendar-cell-container-color: var(--ds-advanced-color-state-background-hover, #f2f2f2);--ds-auro-calendar-cell-text-color: var(--ds-basic-color-texticon-default, #2a2a2a)}:host .day.disabled{--ds-auro-calendar-cell-container-color: transparent;--ds-auro-calendar-cell-text-color: var(--ds-basic-color-texticon-disabled, #d0d0d0);--ds-auro-calendar-cell-price-text-color: var(--ds-basic-color-texticon-disabled, #d0d0d0)}:host .day.blackout{--ds-auro-calendar-cell-container-color: transparent;--ds-auro-calendar-cell-text-color: var(--ds-basic-color-texticon-disabled, #d0d0d0);--ds-auro-calendar-cell-price-text-color: var(--ds-basic-color-texticon-disabled, #d0d0d0)}:host .day.inRange:before,:host .day.rangeDepartDate:before,:host .day.rangeReturnDate:before,:host .day.lastHoveredDate:before{background-color:var(--ds-auro-calendar-cell-in-range-color)}:host .day.sameDateTrip:before{--ds-auro-calendar-cell-in-range-color: transparent}`;
11531
11531
 
@@ -11552,12 +11552,6 @@ var popoverVersion = '6.0.1';
11552
11552
 
11553
11553
  /* eslint-disable curly, max-lines, no-underscore-dangle, no-magic-numbers, no-underscore-dangle, max-params, no-extra-parens, arrow-parens, max-lines, line-comment-position, no-inline-comments, lit/binding-positions, lit/no-invalid-html */
11554
11554
 
11555
- const startOfDay$1 = (ms) => {
11556
- const date = new Date(ms);
11557
- date.setHours(0, 0, 0, 0);
11558
- return date.getTime();
11559
- };
11560
-
11561
11555
  class AuroCalendarCell extends LitElement {
11562
11556
  constructor() {
11563
11557
  super();
@@ -11604,6 +11598,14 @@ class AuroCalendarCell extends LitElement {
11604
11598
  type: Boolean,
11605
11599
  reflect: true
11606
11600
  },
11601
+ /**
11602
+ * @deprecated Propagated from the legacy `auro-calendar.disabledDays`
11603
+ * Unix-timestamp array. The cell honors it for backward compatibility
11604
+ * (see the divergence-check fallback inside `isBlackout`), but
11605
+ * consumers should migrate to `auro-datepicker.blackoutDates`
11606
+ * (YYYY-MM-DD ISO strings). The calendar emits a one-time
11607
+ * deprecation warning the first time a non-empty value is observed.
11608
+ */
11607
11609
  disabledDays: { type: Array },
11608
11610
  isCurrentDate: { type: Boolean },
11609
11611
  locale: { type: String },
@@ -11649,8 +11651,8 @@ class AuroCalendarCell extends LitElement {
11649
11651
  const parsedDateTo = parseInt(dateTo, 10);
11650
11652
 
11651
11653
  if (day) {
11652
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
11653
- const returnTimestamp = startOfDay$1(parsedDateTo * 1000) / 1000;
11654
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
11655
+ const returnTimestamp = new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000;
11654
11656
 
11655
11657
  if (day.date === departTimestamp || day.date === returnTimestamp) {
11656
11658
  this.selected = true;
@@ -11734,22 +11736,42 @@ class AuroCalendarCell extends LitElement {
11734
11736
  return false;
11735
11737
  }
11736
11738
 
11737
- // Check against disabledDays timestamps (legacy path)
11739
+ // Delegate to the calendar's memoized blackout Set for O(1) lookup
11740
+ // (instead of rescanning disabledDays + blackoutDates per render). The
11741
+ // Set is rebuilt only when either source array reference changes — see
11742
+ // auro-calendar.js#_getBlackoutSet.
11743
+ if (this.calendar && typeof this.calendar._getBlackoutSet === 'function') {
11744
+ if (this.calendar._getBlackoutSet().has(this.day.date)) {
11745
+ return true;
11746
+ }
11747
+ // If the cell's local disabledDays diverged from the calendar's (a
11748
+ // consumer or test mutated cell.disabledDays directly), the Set does
11749
+ // not reflect that addition — fall through to the per-cell scan only
11750
+ // when the reference no longer matches. Production data flow keeps
11751
+ // these identical, so this branch stays cold.
11752
+ if (this.disabledDays && this.disabledDays !== this.calendar.disabledDays && this.disabledDays.length > 0) {
11753
+ if (this.disabledDays.findIndex((dd) => parseInt(dd, 10) === this.day.date) !== -1) {
11754
+ return true;
11755
+ }
11756
+ }
11757
+ return false;
11758
+ }
11759
+
11760
+ // Pre-firstUpdated fallback — the cell may render once before the
11761
+ // ancestor calendar is wired up. Uses the legacy O(N) scan so the
11762
+ // result stays correct, just slower for the very first render.
11738
11763
  if (Array.isArray(this.disabledDays) && this.disabledDays.length > 0 &&
11739
11764
  (this.disabledDays.findIndex(dd => parseInt(dd, 10) === this.day.date) !== -1)) {
11740
11765
  return true;
11741
11766
  }
11742
11767
 
11743
- // Check against blackoutDates (ISO format YYYY-MM-DD) on the datepicker
11744
11768
  const blackoutDates = this.datepicker?.blackoutDates;
11745
-
11746
11769
  if (Array.isArray(blackoutDates) && blackoutDates.length > 0) {
11747
11770
  const date = new Date(this.day.date * 1000);
11748
11771
  const yyyy = date.getFullYear();
11749
11772
  const mm = String(date.getMonth() + 1).padStart(2, '0');
11750
11773
  const dd = String(date.getDate()).padStart(2, '0');
11751
- const cellDate = `${yyyy}-${mm}-${dd}`;
11752
- if (blackoutDates.includes(cellDate)) {
11774
+ if (blackoutDates.includes(`${yyyy}-${mm}-${dd}`)) {
11753
11775
  return true;
11754
11776
  }
11755
11777
  }
@@ -11860,12 +11882,12 @@ class AuroCalendarCell extends LitElement {
11860
11882
  const parsedDateFrom = Number.parseInt(this.dateFrom, 10);
11861
11883
  if (!Number.isFinite(parsedDateFrom)) return null;
11862
11884
 
11863
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
11885
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
11864
11886
  const dayDate = this.day.date;
11865
11887
 
11866
11888
  const parsedDateTo = Number.parseInt(this.dateTo, 10);
11867
11889
  const hasDateTo = Number.isFinite(parsedDateTo);
11868
- const returnTimestamp = hasDateTo ? startOfDay$1(parsedDateTo * 1000) / 1000 : null;
11890
+ const returnTimestamp = hasDateTo ? new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000 : null;
11869
11891
 
11870
11892
  if (dayDate === departTimestamp) return this.datepicker.rangeLabelStart || 'range start';
11871
11893
 
@@ -11875,7 +11897,9 @@ class AuroCalendarCell extends LitElement {
11875
11897
 
11876
11898
  if (hasDateTo && dayDate > departTimestamp && dayDate < returnTimestamp) return this.datepicker.rangeLabelInRange || 'in range';
11877
11899
 
11878
- // After start date, no end date yet, or after end date
11900
+ if (!hasDateTo && dayDate > departTimestamp) return this.datepicker.rangeLabelEndPreview || 'previewing range end';
11901
+
11902
+ // After end date when both dateFrom and dateTo are set.
11879
11903
  return this.datepicker.rangeLabelAfterRange || 'after range';
11880
11904
  }
11881
11905
 
@@ -11888,7 +11912,7 @@ class AuroCalendarCell extends LitElement {
11888
11912
  */
11889
11913
  isDepartDate(day, dateFrom) {
11890
11914
  const parsedDateFrom = parseInt(dateFrom, 10);
11891
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
11915
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
11892
11916
 
11893
11917
  return this.selected && day.date === departTimestamp;
11894
11918
  }
@@ -11903,7 +11927,7 @@ class AuroCalendarCell extends LitElement {
11903
11927
  */
11904
11928
  isReturnDate(day, dateFrom, dateTo) {
11905
11929
  const parsedDateTo = parseInt(dateTo, 10);
11906
- const returnTimestamp = startOfDay$1(parsedDateTo * 1000) / 1000;
11930
+ const returnTimestamp = new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000;
11907
11931
 
11908
11932
  return this.selected && day.date === returnTimestamp && dateFrom;
11909
11933
  }
@@ -12067,6 +12091,7 @@ class AuroCalendarCell extends LitElement {
12067
12091
  setTimeout(() => this.firstUpdated(), 0);
12068
12092
  return;
12069
12093
  }
12094
+ this.calendar = calendar;
12070
12095
  this.datepicker = calendar.datepicker;
12071
12096
  this._slotContentHandler = () => {
12072
12097
  this.handleSlotContent();
@@ -12124,12 +12149,13 @@ class AuroCalendarCell extends LitElement {
12124
12149
  this._cachedButton = this.shadowRoot.querySelector('button.day');
12125
12150
  });
12126
12151
 
12127
- // Update host-level aria attributes for ariaActiveDescendantElement.
12152
+ // Keep the host's gridcell aria attributes in sync with the day data.
12128
12153
  this.updateHostAria();
12129
12154
  }
12130
12155
 
12131
12156
  // Update host aria when selection changes (aria-selected, range labels)
12132
- if (properties.has('dateFrom') || properties.has('dateTo') || properties.has('selected')) {
12157
+ // or when isCurrentDate flips (aria-current).
12158
+ if (properties.has('dateFrom') || properties.has('dateTo') || properties.has('selected') || properties.has('isCurrentDate')) {
12133
12159
  this.updateHostAria();
12134
12160
  }
12135
12161
 
@@ -12140,8 +12166,8 @@ class AuroCalendarCell extends LitElement {
12140
12166
  }
12141
12167
 
12142
12168
  /**
12143
- * Updates ARIA attributes on the host element so that
12144
- * ariaActiveDescendantElement can expose cell info to the SR.
12169
+ * Sets host-level ARIA so each cell exposes its date, selection state,
12170
+ * and blackout status to assistive tech browsing the month grid.
12145
12171
  * @private
12146
12172
  * @returns {void}
12147
12173
  */
@@ -12152,14 +12178,20 @@ class AuroCalendarCell extends LitElement {
12152
12178
  if (outOfRange) {
12153
12179
  this.removeAttribute('role');
12154
12180
  this.removeAttribute('aria-label');
12181
+ this.removeAttribute('aria-current');
12155
12182
  return;
12156
12183
  }
12157
12184
 
12158
- // The host acts as the gridcell for ariaActiveDescendantElement.
12159
12185
  this.setAttribute('role', 'gridcell');
12160
12186
  this.setAttribute('aria-label', this.getAriaLabel());
12161
12187
  this.setAttribute('aria-selected', this.selected ? 'true' : 'false');
12162
12188
 
12189
+ if (this.isCurrentDate) {
12190
+ this.setAttribute('aria-current', 'date');
12191
+ } else {
12192
+ this.removeAttribute('aria-current');
12193
+ }
12194
+
12163
12195
  if (this.isBlackout()) {
12164
12196
  this.setAttribute('aria-disabled', 'true');
12165
12197
  } else {
@@ -12174,7 +12206,7 @@ class AuroCalendarCell extends LitElement {
12174
12206
  * @returns {void}
12175
12207
  */
12176
12208
  focusButton() {
12177
- const button = this._cachedButton || this.shadowRoot.querySelector('button:not([aria-hidden])');
12209
+ const button = this._cachedButton || this.shadowRoot.querySelector('button:not([disabled])');
12178
12210
  if (button) {
12179
12211
  button.focus({ focusVisible: true });
12180
12212
  }
@@ -12182,7 +12214,9 @@ class AuroCalendarCell extends LitElement {
12182
12214
 
12183
12215
  /**
12184
12216
  * Imperatively marks this cell as active without triggering a Lit re-render.
12185
- * Note: buttons stay tabindex="-1" because the grid uses aria-activedescendant.
12217
+ * Buttons stay tabindex="-1" because DOM focus stays on the grid wrapper
12218
+ * arrow keys move the active cell imperatively and the live region carries
12219
+ * the SR announcement.
12186
12220
  * @returns {void}
12187
12221
  */
12188
12222
  setActive() {
@@ -12224,10 +12258,13 @@ class AuroCalendarCell extends LitElement {
12224
12258
  if (!btn || !this.day) return;
12225
12259
 
12226
12260
  const dayDate = this.day.date;
12227
- const departTimestamp = startOfDay$1(dateFrom * 1000) / 1000;
12261
+ const departTimestamp = new Date(dateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
12228
12262
  const isInRange = dayDate > departTimestamp && dayDate < hoveredDate;
12229
- const isLastHovered = dayDate === hoveredDate && hoveredDate > departTimestamp;
12230
- const isDepartWithPreview = dayDate === departTimestamp && hoveredDate > departTimestamp;
12263
+ // `>=` so hovering the depart cell itself (a same-day round-trip
12264
+ // preview) still surfaces a visual cue: the depart cell receives both
12265
+ // rangeDepartDate and lastHoveredDate.
12266
+ const isLastHovered = dayDate === hoveredDate && hoveredDate >= departTimestamp;
12267
+ const isDepartWithPreview = dayDate === departTimestamp && hoveredDate >= departTimestamp;
12231
12268
 
12232
12269
  btn.classList.toggle('inRange', isInRange);
12233
12270
  btn.classList.toggle('lastHoveredDate', isLastHovered);
@@ -12285,7 +12322,6 @@ class AuroCalendarCell extends LitElement {
12285
12322
  @focus="${outOfRange ? undefined : this.handleFocus}"
12286
12323
  class="${classMap(buttonClasses)}"
12287
12324
  ?disabled="${outOfRange}"
12288
- aria-hidden="${outOfRange ? 'true' : nothing}"
12289
12325
  tabindex="-1">
12290
12326
  <div class="buttonWrapper" aria-hidden="true">
12291
12327
  <div class="currentDayMarker">${this.day?.title || nothing}</div>
@@ -13391,7 +13427,7 @@ class AuroBibtemplate extends LitElement {
13391
13427
  }
13392
13428
  }
13393
13429
 
13394
- var formkitVersion$2 = '202606232113';
13430
+ var formkitVersion$2 = '202606251933';
13395
13431
 
13396
13432
  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}
13397
13433
  `,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}}
@@ -13514,7 +13550,11 @@ class AuroCalendar extends RangeDatepicker {
13514
13550
  this.calendarRangeMonths = null;
13515
13551
 
13516
13552
  /**
13517
- * Legacy array of disabled-date timestamps.
13553
+ * @deprecated Use `auro-datepicker.blackoutDates` (an array of
13554
+ * `YYYY-MM-DD` ISO strings) instead. This legacy array of Unix
13555
+ * timestamps is still honored for backward compatibility but emits a
13556
+ * one-time `console.debug` the first time a non-empty value is observed.
13557
+ * Support will be removed in a future major release.
13518
13558
  * @private
13519
13559
  */
13520
13560
  this.disabledDays = [];
@@ -13771,17 +13811,44 @@ class AuroCalendar extends RangeDatepicker {
13771
13811
  * @returns {void}
13772
13812
  */
13773
13813
  updateActiveCellForVisibleMonth() {
13774
- // Use double-rAF to ensure child month/cell components have fully
13775
- // rendered and cached their button references before we set tabindex.
13776
- requestAnimationFrame(() => {
13777
- requestAnimationFrame(() => {
13778
- const newDate = this.computeActiveDate({ skipDateFrom: true });
13814
+ this._afterMonthRender(() => {
13815
+ const newDate = this.computeActiveDate({ skipDateFrom: true });
13779
13816
 
13780
- if (newDate !== null && newDate !== undefined) {
13781
- this.activeCellDate = newDate;
13782
- this.setActiveCell(this.activeCellDate);
13783
- }
13784
- });
13817
+ if (newDate !== null && newDate !== undefined) {
13818
+ this.activeCellDate = newDate;
13819
+ this.setActiveCell(this.activeCellDate);
13820
+ }
13821
+ });
13822
+ }
13823
+
13824
+ /**
13825
+ * Schedules `callback` two animation frames out, giving the child
13826
+ * `auro-formkit-calendar-month` and `auro-formkit-calendar-cell` elements
13827
+ * a full render-and-paint cycle to settle before the callback reads or
13828
+ * mutates DOM.
13829
+ *
13830
+ * Why two frames, not one:
13831
+ * 1. Lit batches property updates and renders in a microtask, so frame N
13832
+ * schedules the render but the new DOM may not be painted yet.
13833
+ * 2. Cells re-cache `_cachedButton` inside their own `updateComplete.then`,
13834
+ * which also lands a tick later. Reading buttons from frame N+1
13835
+ * (after both renders + cache refresh have flushed) reliably hits the
13836
+ * new month's cells.
13837
+ *
13838
+ * Used by every code path that calls `handleNextMonth`/`handlePrevMonth`
13839
+ * and then needs to inspect the freshly-rendered cells (cross-month
13840
+ * keyboard nav, boundary events, `updateActiveCellForVisibleMonth`).
13841
+ * Do NOT collapse to a single rAF — it intermittently lands before
13842
+ * `_cachedButton` is refreshed, which silently breaks focus restoration
13843
+ * and `setActiveCell` lookups.
13844
+ * @private
13845
+ * @param {() => void} callback - Runs once after the month re-render and
13846
+ * the cells' button caches have refreshed.
13847
+ * @returns {void}
13848
+ */
13849
+ _afterMonthRender(callback) {
13850
+ requestAnimationFrame(() => {
13851
+ requestAnimationFrame(callback);
13785
13852
  });
13786
13853
  }
13787
13854
 
@@ -13899,6 +13966,47 @@ class AuroCalendar extends RangeDatepicker {
13899
13966
  return Array.from(this.shadowRoot.querySelectorAll('auro-formkit-calendar-month'));
13900
13967
  }
13901
13968
 
13969
+ /**
13970
+ * Picks the focusable cell whose date is closest to targetTs. Used as a
13971
+ * fallback after a month-boundary nav when the exact target date isn't
13972
+ * focusable — typically because the month re-render lagged or the date
13973
+ * was filtered out by isOutOfRange. When two cells are equidistant, the
13974
+ * navigation direction breaks the tie so the user moves the way they
13975
+ * pressed (forward → later cell, backward → earlier cell).
13976
+ * @private
13977
+ * @param {Array} cells - Focusable cells from getAllFocusableCells.
13978
+ * @param {Number} targetTs - Desired Unix timestamp (seconds).
13979
+ * @param {'next'|'prev'} direction - Navigation direction.
13980
+ * @returns {Object|null} The nearest cell, or null when cells is empty.
13981
+ */
13982
+ pickNearestCell(cells, targetTs, direction) {
13983
+ if (!cells.length) {
13984
+ return null;
13985
+ }
13986
+ const forward = direction === 'next';
13987
+ let best = null;
13988
+ let bestDelta = Infinity;
13989
+ cells.forEach((cell) => {
13990
+ if (!cell.day) {
13991
+ return;
13992
+ }
13993
+ const distance = Math.abs(cell.day.date - targetTs);
13994
+ if (distance < bestDelta) {
13995
+ best = cell;
13996
+ bestDelta = distance;
13997
+ return;
13998
+ }
13999
+ if (distance === bestDelta && best) {
14000
+ if (forward && cell.day.date > best.day.date) {
14001
+ best = cell;
14002
+ } else if (!forward && cell.day.date < best.day.date) {
14003
+ best = cell;
14004
+ }
14005
+ }
14006
+ });
14007
+ return best;
14008
+ }
14009
+
13902
14010
  /**
13903
14011
  * Gets all focusable cells across all rendered months.
13904
14012
  * @private
@@ -13915,9 +14023,9 @@ class AuroCalendar extends RangeDatepicker {
13915
14023
 
13916
14024
  /**
13917
14025
  * Sets the active cell across all months. Only one cell has tabindex="0" at a time.
13918
- * Uses imperative DOM manipulation — no Lit re-render triggered.
13919
- * Also updates ariaActiveDescendantElement on the grid wrapper so
13920
- * screen readers announce the active cell without moving DOM focus.
14026
+ * Uses imperative DOM manipulation — no Lit re-render triggered. DOM focus
14027
+ * stays on the grid wrapper; the live region (see getOrCreateLiveRegion)
14028
+ * is what announces the active cell to assistive tech.
13921
14029
  * @param {Number} date - Unix timestamp of the cell to activate.
13922
14030
  * @returns {void}
13923
14031
  */
@@ -13998,6 +14106,72 @@ class AuroCalendar extends RangeDatepicker {
13998
14106
  this.clearRangePreview();
13999
14107
  }
14000
14108
 
14109
+ /**
14110
+ * Returns a memoized Set of blackout timestamps (seconds) drawn from both
14111
+ * the legacy `disabledDays` array and the datepicker's ISO `blackoutDates`.
14112
+ * The cache invalidates when either source array's reference changes, which
14113
+ * matches Lit's own reactive identity semantics for array properties.
14114
+ * @private
14115
+ * @returns {Set<Number>}
14116
+ */
14117
+ _getBlackoutSet() {
14118
+ const disabledDays = this.disabledDays || [];
14119
+ const blackoutDates = this.datepicker?.blackoutDates;
14120
+ if (this._blackoutSet
14121
+ && this._cachedBlackoutDisabledDays === disabledDays
14122
+ && this._cachedBlackoutDates === blackoutDates) {
14123
+ return this._blackoutSet;
14124
+ }
14125
+
14126
+ if (disabledDays.length > 0) {
14127
+ this._warnDisabledDaysDeprecated();
14128
+ }
14129
+
14130
+ const set = new Set(disabledDays.map((day) => parseInt(day, 10)));
14131
+
14132
+ // Parse YYYY-MM-DD as local date to avoid UTC shift issues.
14133
+ if (Array.isArray(blackoutDates)) {
14134
+ for (const isoStr of blackoutDates) {
14135
+ const parts = isoStr.split('-');
14136
+ const ts = Math.floor(new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10)).getTime() / 1000);
14137
+ if (Number.isFinite(ts)) {
14138
+ set.add(ts);
14139
+ }
14140
+ }
14141
+ }
14142
+
14143
+ this._blackoutSet = set;
14144
+ this._cachedBlackoutDisabledDays = disabledDays;
14145
+ this._cachedBlackoutDates = blackoutDates;
14146
+ return set;
14147
+ }
14148
+
14149
+ /**
14150
+ * Per-class flag that gates the `disabledDays` deprecation warning so it
14151
+ * fires exactly once per page no matter how many calendars or rebuild
14152
+ * cycles encounter the legacy array.
14153
+ * @private
14154
+ */
14155
+ static _warnedDisabledDaysDeprecation = false;
14156
+
14157
+ /**
14158
+ * One-time `console.debug` directing consumers from the legacy
14159
+ * `disabledDays` Unix-timestamp API to the ISO `blackoutDates` API. Fires
14160
+ * the first time `_getBlackoutSet` rebuilds from a non-empty
14161
+ * `disabledDays`; subsequent calls (on this or any other AuroCalendar
14162
+ * instance on the page) are silent.
14163
+ * @private
14164
+ * @returns {void}
14165
+ */
14166
+ _warnDisabledDaysDeprecated() {
14167
+ if (AuroCalendar._warnedDisabledDaysDeprecation) {
14168
+ return;
14169
+ }
14170
+ AuroCalendar._warnedDisabledDaysDeprecation = true;
14171
+ // eslint-disable-next-line no-console
14172
+ console.debug('[auro-datepicker] The `disabledDays` property (Unix timestamps) is deprecated. Migrate to the `blackoutDates` property on auro-datepicker (an array of `YYYY-MM-DD` ISO strings). `disabledDays` will be removed in a future major release.');
14173
+ }
14174
+
14001
14175
  /**
14002
14176
  * Computes the initial active date from data properties alone — no DOM required.
14003
14177
  * Priority:
@@ -14042,21 +14216,10 @@ class AuroCalendar extends RangeDatepicker {
14042
14216
  const minTs = Number.isFinite(rawMin) ? rawMin : -Infinity;
14043
14217
  const maxTs = Number.isFinite(rawMax) ? rawMax : Infinity;
14044
14218
 
14045
- // Build a Set of blackout timestamps for O(1) lookup.
14046
- const blackoutSet = new Set(this.disabledDays.map((day) => parseInt(day, 10)));
14047
-
14048
- // Also include ISO-format blackoutDates from the datepicker if available.
14049
- // Parse YYYY-MM-DD as local date to avoid UTC shift issues.
14050
- const isoBlackouts = this.datepicker?.blackoutDates;
14051
- if (Array.isArray(isoBlackouts)) {
14052
- for (const isoStr of isoBlackouts) {
14053
- const parts = isoStr.split('-');
14054
- const ts = Math.floor(new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10)).getTime() / 1000);
14055
- if (Number.isFinite(ts)) {
14056
- blackoutSet.add(ts);
14057
- }
14058
- }
14059
- }
14219
+ // Build a Set of blackout timestamps for O(1) lookup. Memoized by the
14220
+ // identity of the source arrays so rapid month nav doesn't rebuild the
14221
+ // Set (and re-parse every ISO string) on every keypress.
14222
+ const blackoutSet = this._getBlackoutSet();
14060
14223
 
14061
14224
  /**
14062
14225
  * A date (unix timestamp in seconds, midnight-aligned) is "enabled" when
@@ -14252,8 +14415,8 @@ class AuroCalendar extends RangeDatepicker {
14252
14415
 
14253
14416
  /**
14254
14417
  * Handles arrow key navigation on the calendar grid wrapper.
14255
- * Focus stays on the grid wrapper; only ariaActiveDescendantElement
14256
- * and the visual active-cell indicator change.
14418
+ * Focus stays on the grid wrapper; only the visual active-cell indicator
14419
+ * changes. The live region announces the new active cell.
14257
14420
  * @private
14258
14421
  * @param {KeyboardEvent} event - The keyboard event.
14259
14422
  * @returns {void}
@@ -14318,21 +14481,21 @@ class AuroCalendar extends RangeDatepicker {
14318
14481
  } else {
14319
14482
  this.handlePrevMonth({ skipActiveUpdate: true });
14320
14483
  }
14321
- requestAnimationFrame(() => {
14322
- requestAnimationFrame(() => {
14323
- const cells = this.getAllFocusableCells();
14324
- const target = cells.find((cell) => cell.day && cell.day.date === targetTs);
14325
- if (target) {
14326
- this.setActiveCell(target.day.date);
14327
- this.handleCellFocused({ detail: { date: target.day.date } });
14328
- } else if (cells.length > 0) {
14329
- const fallback = navDir === 'next' ? cells[cells.length - 1] : cells[0];
14484
+ this._afterMonthRender(() => {
14485
+ const cells = this.getAllFocusableCells();
14486
+ const target = cells.find((cell) => cell.day && cell.day.date === targetTs);
14487
+ if (target) {
14488
+ this.setActiveCell(target.day.date);
14489
+ this.handleCellFocused({ detail: { date: target.day.date } });
14490
+ } else {
14491
+ const fallback = this.pickNearestCell(cells, targetTs, navDir);
14492
+ if (fallback) {
14330
14493
  this.setActiveCell(fallback.day.date);
14331
14494
  this.handleCellFocused({ detail: { date: fallback.day.date } });
14332
14495
  }
14333
- // Re-focus grid wrapper after month change re-render
14334
- this.focusActiveCell();
14335
- });
14496
+ }
14497
+ // Re-focus grid wrapper after month change re-render
14498
+ this.focusActiveCell();
14336
14499
  });
14337
14500
  }
14338
14501
  }
@@ -14358,26 +14521,20 @@ class AuroCalendar extends RangeDatepicker {
14358
14521
  } else {
14359
14522
  this.handlePrevMonth({ skipActiveUpdate: true });
14360
14523
  }
14361
- requestAnimationFrame(() => {
14362
- requestAnimationFrame(() => {
14363
- const cells = this.getAllFocusableCells();
14364
- const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
14365
- if (target) {
14366
- this.setActiveCell(target.day.date);
14367
- this.handleCellFocused({ detail: { date: target.day.date } });
14368
- } else if (cells.length > 0) {
14369
- let nearest = null;
14370
-
14371
- if (navDirection === 'next') {
14372
- [nearest] = cells;
14373
- } else {
14374
- nearest = cells[cells.length - 1];
14375
- }
14524
+ this._afterMonthRender(() => {
14525
+ const cells = this.getAllFocusableCells();
14526
+ const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
14527
+ if (target) {
14528
+ this.setActiveCell(target.day.date);
14529
+ this.handleCellFocused({ detail: { date: target.day.date } });
14530
+ } else {
14531
+ const nearest = this.pickNearestCell(cells, targetDate, navDirection);
14532
+ if (nearest) {
14376
14533
  this.setActiveCell(nearest.day.date);
14377
14534
  this.handleCellFocused({ detail: { date: nearest.day.date } });
14378
14535
  }
14379
- this.focusActiveCell();
14380
- });
14536
+ }
14537
+ this.focusActiveCell();
14381
14538
  });
14382
14539
  }
14383
14540
  }
@@ -14427,19 +14584,17 @@ class AuroCalendar extends RangeDatepicker {
14427
14584
  }
14428
14585
 
14429
14586
  this.handleNextMonth({ skipActiveUpdate: true });
14430
- requestAnimationFrame(() => {
14431
- requestAnimationFrame(() => {
14432
- const cells = this.getAllFocusableCells();
14433
- const target = cells.find((cell) => cell.day && cell.day.date === nextTs);
14434
- if (target) {
14435
- this.setActiveCell(target.day.date);
14436
- this.focusActiveCell();
14437
- } else if (cells.length > 0) {
14438
- // Fallback: first cell of the last rendered month
14439
- this.setActiveCell(cells[cells.length - 1].day.date);
14440
- this.focusActiveCell();
14441
- }
14442
- });
14587
+ this._afterMonthRender(() => {
14588
+ const cells = this.getAllFocusableCells();
14589
+ const target = cells.find((cell) => cell.day && cell.day.date === nextTs);
14590
+ if (target) {
14591
+ this.setActiveCell(target.day.date);
14592
+ this.focusActiveCell();
14593
+ } else if (cells.length > 0) {
14594
+ // Fallback: first cell of the last rendered month
14595
+ this.setActiveCell(cells[cells.length - 1].day.date);
14596
+ this.focusActiveCell();
14597
+ }
14443
14598
  });
14444
14599
  } else if (direction === 'prev' && this.showPrevMonthBtn) {
14445
14600
  // Navigate to previous month and focus the computed previous date.
@@ -14453,19 +14608,17 @@ class AuroCalendar extends RangeDatepicker {
14453
14608
  }
14454
14609
 
14455
14610
  this.handlePrevMonth({ skipActiveUpdate: true });
14456
- requestAnimationFrame(() => {
14457
- requestAnimationFrame(() => {
14458
- const cells = this.getAllFocusableCells();
14459
- const target = cells.find((cell) => cell.day && cell.day.date === prevTs);
14460
- if (target) {
14461
- this.setActiveCell(target.day.date);
14462
- this.focusActiveCell();
14463
- } else if (cells.length > 0) {
14464
- // Fallback: last cell of the first rendered month
14465
- this.setActiveCell(cells[0].day.date);
14466
- this.focusActiveCell();
14467
- }
14468
- });
14611
+ this._afterMonthRender(() => {
14612
+ const cells = this.getAllFocusableCells();
14613
+ const target = cells.find((cell) => cell.day && cell.day.date === prevTs);
14614
+ if (target) {
14615
+ this.setActiveCell(target.day.date);
14616
+ this.focusActiveCell();
14617
+ } else if (cells.length > 0) {
14618
+ // Fallback: last cell of the first rendered month
14619
+ this.setActiveCell(cells[0].day.date);
14620
+ this.focusActiveCell();
14621
+ }
14469
14622
  });
14470
14623
  }
14471
14624
  } else if (key === 'ArrowDown' || key === 'ArrowUp') {
@@ -14493,20 +14646,18 @@ class AuroCalendar extends RangeDatepicker {
14493
14646
  } else {
14494
14647
  this.handlePrevMonth({ skipActiveUpdate: true });
14495
14648
  }
14496
- requestAnimationFrame(() => {
14497
- requestAnimationFrame(() => {
14498
- const cells = this.getAllFocusableCells();
14499
- const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
14500
- if (target) {
14501
- this.setActiveCell(target.day.date);
14502
- this.focusActiveCell();
14503
- } else if (cells.length > 0) {
14504
- // Clamp to nearest focusable cell
14505
- const nearest = navDirection === 'next' ? cells[0] : cells[cells.length - 1];
14506
- this.setActiveCell(nearest.day.date);
14507
- this.focusActiveCell();
14508
- }
14509
- });
14649
+ this._afterMonthRender(() => {
14650
+ const cells = this.getAllFocusableCells();
14651
+ const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
14652
+ if (target) {
14653
+ this.setActiveCell(target.day.date);
14654
+ this.focusActiveCell();
14655
+ } else if (cells.length > 0) {
14656
+ // Clamp to nearest focusable cell
14657
+ const nearest = navDirection === 'next' ? cells[0] : cells[cells.length - 1];
14658
+ this.setActiveCell(nearest.day.date);
14659
+ this.focusActiveCell();
14660
+ }
14510
14661
  });
14511
14662
  }
14512
14663
  }
@@ -14545,8 +14696,9 @@ class AuroCalendar extends RangeDatepicker {
14545
14696
  return;
14546
14697
  }
14547
14698
 
14548
- // With aria-activedescendant, the button no longer receives native focus,
14549
- // so we use the debounced live region for the full context announcement.
14699
+ // DOM focus stays on the grid wrapper while arrow keys move the active
14700
+ // cell, so cell buttons never receive native focus. The debounced live
14701
+ // region carries the full-context announcement instead.
14550
14702
  const announcement = this.buildFocusAnnouncement(date);
14551
14703
  this.announceFocusDebounced(announcement);
14552
14704
 
@@ -14616,10 +14768,10 @@ class AuroCalendar extends RangeDatepicker {
14616
14768
  return null;
14617
14769
  }
14618
14770
 
14619
- const departTs = startOfDay$2(parsedFrom * 1000) / 1000;
14771
+ const departTs = new Date(parsedFrom * 1000).setHours(0, 0, 0, 0) / 1000;
14620
14772
  const parsedTo = Number.parseInt(this.dateTo, 10);
14621
14773
  const hasTo = Number.isFinite(parsedTo);
14622
- const returnTs = hasTo ? startOfDay$2(parsedTo * 1000) / 1000 : null;
14774
+ const returnTs = hasTo ? new Date(parsedTo * 1000).setHours(0, 0, 0, 0) / 1000 : null;
14623
14775
 
14624
14776
  if (date === departTs) {
14625
14777
  return this.datepicker.rangeLabelStart || 'range start';
@@ -14633,6 +14785,9 @@ class AuroCalendar extends RangeDatepicker {
14633
14785
  if (hasTo && date > departTs && date < returnTs) {
14634
14786
  return this.datepicker.rangeLabelInRange || 'in range';
14635
14787
  }
14788
+ if (!hasTo && date > departTs) {
14789
+ return this.datepicker.rangeLabelEndPreview || 'previewing range end';
14790
+ }
14636
14791
  return this.datepicker.rangeLabelAfterRange || 'after range';
14637
14792
  }
14638
14793
 
@@ -14829,9 +14984,34 @@ class AuroCalendar extends RangeDatepicker {
14829
14984
  // the last one.
14830
14985
  if (this._announceRafId) {
14831
14986
  cancelAnimationFrame(this._announceRafId);
14987
+ this._announceRafId = null;
14832
14988
  }
14989
+ this._deliverAnnouncement(dateStr, 0);
14990
+ }
14991
+
14992
+ /**
14993
+ * Writes `dateStr` to the live region. If the dropdown's dialog hasn't
14994
+ * mounted yet (so getOrCreateLiveRegion can't attach), retries on the
14995
+ * next animation frame up to MAX_LIVE_REGION_RETRIES instead of silently
14996
+ * dropping the announcement. The retry uses the same `_announceRafId`
14997
+ * the double-rAF below uses, so a newer announceSelection call (or
14998
+ * disconnectedCallback) cancels any in-flight retry.
14999
+ * @private
15000
+ * @param {String} dateStr - The localized date string to announce.
15001
+ * @param {Number} attempts - Number of prior retry attempts.
15002
+ * @returns {void}
15003
+ */
15004
+ _deliverAnnouncement(dateStr, attempts) {
14833
15005
  const liveRegion = this.getOrCreateLiveRegion();
14834
15006
  if (!liveRegion) {
15007
+ const MAX_LIVE_REGION_RETRIES = 10;
15008
+ if (attempts < MAX_LIVE_REGION_RETRIES) {
15009
+ this._announceRafId = requestAnimationFrame(() => {
15010
+ this._deliverAnnouncement(dateStr, attempts + 1);
15011
+ });
15012
+ } else {
15013
+ this._announceRafId = null;
15014
+ }
14835
15015
  return;
14836
15016
  }
14837
15017
 
@@ -15017,7 +15197,7 @@ class AuroCalendar extends RangeDatepicker {
15017
15197
  </button>
15018
15198
  ` : undefined}
15019
15199
  </div>
15020
- <div id="calendarGrid" class="calendars" role="group" tabindex="0" aria-label="${this.datepicker?.calendarGridLabel}" @keydown="${this.handleGridKeyDown}" @focusin="${this.handleGridFocusIn}" @focusout="${this.handleGridFocusOut}" @calendar-month-mouseleave="${this.clearRangePreview}">
15200
+ <div id="calendarGrid" class="calendars" role="group" aria-roledescription="calendar" tabindex="0" aria-label="${this.datepicker?.calendarGridLabel}" @keydown="${this.handleGridKeyDown}" @focusin="${this.handleGridFocusIn}" @focusout="${this.handleGridFocusOut}" @calendar-month-mouseleave="${this.clearRangePreview}">
15021
15201
  ${this.renderAllCalendars()}
15022
15202
  </div>
15023
15203
  </div>
@@ -18902,7 +19082,7 @@ let AuroHelpText$2 = class AuroHelpText extends LitElement {
18902
19082
  }
18903
19083
  };
18904
19084
 
18905
- var formkitVersion$1 = '202606232113';
19085
+ var formkitVersion$1 = '202606251933';
18906
19086
 
18907
19087
  let AuroElement$2 = class AuroElement extends LitElement {
18908
19088
  static get properties() {
@@ -31434,15 +31614,6 @@ class BaseInput extends AuroElement$1 {
31434
31614
  this.wrapperElement.addEventListener('click', this.handleClick);
31435
31615
  }
31436
31616
 
31437
- // add attribute for query selectors when auro-input is registered under a custom name
31438
- // COVERAGE: the body of this branch is unreachable in WTR — connectedCallback
31439
- // performs the same `setAttribute('auro-input', '')` earlier (see L665-667),
31440
- // so by the time firstUpdated runs the attribute is already present and the
31441
- // `!hasAttribute('auro-input')` guard is false. Retained as a defensive
31442
- // safety net in case connectedCallback is ever short-circuited.
31443
- if (this.tagName.toLowerCase() !== 'auro-input' && !this.hasAttribute('auro-input')) {
31444
- this.setAttribute('auro-input', '');
31445
- }
31446
31617
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
31447
31618
 
31448
31619
  // use validity message override if declared when initializing the component
@@ -32013,13 +32184,7 @@ class BaseInput extends AuroElement$1 {
32013
32184
  */
32014
32185
  get placeholderStr() {
32015
32186
  if (!this.placeholder && this.type === 'date') {
32016
- // COVERAGE: the `'MM/DD/YYYY'` literal fallback is unreachable in WTR.
32017
- // connectedCallback (L682) calls configureDataForType, which at L1266-1268
32018
- // assigns `this.format = this.util.getDateMaskFromLocale().toLowerCase()`
32019
- // when type=date and format is unset. That runs before the first render
32020
- // reads this getter, so the ternary's truthy arm always wins. Retained
32021
- // as a defensive fallback for direct getter calls before connection.
32022
- return this.format ? this.format.toUpperCase() : 'MM/DD/YYYY';
32187
+ return this.format.toUpperCase();
32023
32188
  }
32024
32189
  return this.placeholder || "";
32025
32190
  }
@@ -32510,7 +32675,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
32510
32675
  }
32511
32676
  };
32512
32677
 
32513
- var formkitVersion = '202606232113';
32678
+ var formkitVersion = '202606251933';
32514
32679
 
32515
32680
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
32516
32681
  // See LICENSE in the project root for license information.
@@ -33987,6 +34152,7 @@ class AuroDatePicker extends AuroElement {
33987
34152
  this.rangeLabelBeforeRange = 'before range';
33988
34153
  this.rangeLabelInRange = 'in range';
33989
34154
  this.rangeLabelAfterRange = 'after range';
34155
+ this.rangeLabelEndPreview = 'previewing range end';
33990
34156
  this.blackoutDates = [];
33991
34157
  this.blackoutLabel = 'unavailable';
33992
34158
  this.navLabelPrevMonth = 'Previous month';
@@ -34086,6 +34252,22 @@ class AuroDatePicker extends AuroElement {
34086
34252
  */
34087
34253
  this.handleClick = this.handleClick.bind(this);
34088
34254
 
34255
+ /**
34256
+ * Single AbortController shared by every listener registered in the
34257
+ * configure* methods. Lets disconnectedCallback tear all of them down
34258
+ * with one abort() call.
34259
+ *
34260
+ * The genuine leak risk is the listeners attached to children that can
34261
+ * outlive the host if they get reparented — `this.dropdown`,
34262
+ * `this.calendar`, and the inputs inside the dropdown's slot.
34263
+ * Listeners attached to `this` (e.g. focusin/focusout on the host)
34264
+ * form a self-contained reference graph that the GC can collect with
34265
+ * the host anyway, but they share the same signal so the cleanup
34266
+ * pattern stays uniform across all configure* sites.
34267
+ * @private
34268
+ */
34269
+ this._listenerAbortController = new AbortController();
34270
+
34089
34271
  /**
34090
34272
  * @private
34091
34273
  */
@@ -34134,6 +34316,7 @@ class AuroDatePicker extends AuroElement {
34134
34316
 
34135
34317
  /**
34136
34318
  * Label announced for blackout (disabled but in-range) date cells.
34319
+ * @default 'unavailable'
34137
34320
  */
34138
34321
  blackoutLabel: {
34139
34322
  type: String,
@@ -34150,6 +34333,7 @@ class AuroDatePicker extends AuroElement {
34150
34333
 
34151
34334
  /**
34152
34335
  * Accessible label for the calendar grid containing the days of the month.
34336
+ * @default 'Calendar days of the month'
34153
34337
  */
34154
34338
  calendarGridLabel: {
34155
34339
  type: String,
@@ -34312,6 +34496,7 @@ class AuroDatePicker extends AuroElement {
34312
34496
 
34313
34497
  /**
34314
34498
  * Accessible label for the next month navigation button.
34499
+ * @default 'Next month'
34315
34500
  */
34316
34501
  navLabelNextMonth: {
34317
34502
  type: String,
@@ -34320,6 +34505,7 @@ class AuroDatePicker extends AuroElement {
34320
34505
 
34321
34506
  /**
34322
34507
  * Accessible label for the previous month navigation button.
34508
+ * @default 'Previous month'
34323
34509
  */
34324
34510
  navLabelPrevMonth: {
34325
34511
  type: String,
@@ -34398,6 +34584,7 @@ class AuroDatePicker extends AuroElement {
34398
34584
 
34399
34585
  /**
34400
34586
  * Label announced for cells after the range (or after start when no end is selected).
34587
+ * @default 'after range'
34401
34588
  */
34402
34589
  rangeLabelAfterRange: {
34403
34590
  type: String,
@@ -34406,6 +34593,7 @@ class AuroDatePicker extends AuroElement {
34406
34593
 
34407
34594
  /**
34408
34595
  * Label announced for cells before the range start.
34596
+ * @default 'before range'
34409
34597
  */
34410
34598
  rangeLabelBeforeRange: {
34411
34599
  type: String,
@@ -34414,14 +34602,27 @@ class AuroDatePicker extends AuroElement {
34414
34602
 
34415
34603
  /**
34416
34604
  * Label announced for the range end date cell.
34605
+ * @default 'range end'
34417
34606
  */
34418
34607
  rangeLabelEnd: {
34419
34608
  type: String,
34420
34609
  reflect: true
34421
34610
  },
34422
34611
 
34612
+ /**
34613
+ * Label announced for the focused cell while previewing a range end
34614
+ * (dateFrom set, dateTo not yet selected). Tells AT users that
34615
+ * pressing Enter would commit this cell as the range end.
34616
+ * @default 'previewing range end'
34617
+ */
34618
+ rangeLabelEndPreview: {
34619
+ type: String,
34620
+ reflect: true
34621
+ },
34622
+
34423
34623
  /**
34424
34624
  * Label announced for cells within the selected range.
34625
+ * @default 'in range'
34425
34626
  */
34426
34627
  rangeLabelInRange: {
34427
34628
  type: String,
@@ -34430,6 +34631,7 @@ class AuroDatePicker extends AuroElement {
34430
34631
 
34431
34632
  /**
34432
34633
  * Label announced for the range start date cell.
34634
+ * @default 'range start'
34433
34635
  */
34434
34636
  rangeLabelStart: {
34435
34637
  type: String,
@@ -34794,10 +34996,26 @@ class AuroDatePicker extends AuroElement {
34794
34996
  // ─── Vendor calendar time conversions ─────────────────────────────────────
34795
34997
 
34796
34998
  /**
34797
- * Converts a Unix timestamp (seconds) from the vendor calendar to an ISO date string.
34999
+ * Converts a Unix timestamp (seconds) from the vendored range-datepicker
35000
+ * (`src/vendor/wc-range-datepicker/day.js`) to an ISO date string.
35001
+ *
35002
+ * Timezone contract:
35003
+ * - INPUT: `time` is assumed to be the seconds-since-epoch of **local
35004
+ * midnight** for the intended calendar day. The vendor's Day constructor
35005
+ * builds it via `date-fns format(date, 't')` from a locally-constructed
35006
+ * Date, so this assumption currently holds end-to-end.
35007
+ * - OUTPUT: `dateFormatter.toISOFormatString` reads the Date's local
35008
+ * getFullYear/getMonth/getDate components, so the returned YYYY-MM-DD
35009
+ * string matches the local calendar day.
35010
+ *
35011
+ * If the vendor ever switches to emitting UTC-midnight timestamps, this
35012
+ * conversion will silently shift the returned date by one day in zones
35013
+ * west of UTC. Any vendor swap should re-verify this contract; the TZ
35014
+ * regression suite (`npm run test:hst`, UTC-10) will catch the symptom.
35015
+ *
34798
35016
  * @private
34799
- * @param {number} time - Unix timestamp in seconds.
34800
- * @returns {string} ISO date string (yyyy-mm-dd).
35017
+ * @param {number} time - Unix timestamp (seconds), local midnight of the day.
35018
+ * @returns {string} ISO date string (yyyy-mm-dd) reflecting the local calendar day.
34801
35019
  */
34802
35020
  convertWcTimeToDate(time) {
34803
35021
  return dateFormatter$1.toISOFormatString(new Date(time * 1000));
@@ -34899,8 +35117,8 @@ class AuroDatePicker extends AuroElement {
34899
35117
  }
34900
35118
  }
34901
35119
 
34902
- // Focus the calendar grid wrapper (aria-activedescendant handles
34903
- // the SR announcement for the active cell).
35120
+ // Focus the calendar grid wrapper. The live region (announced just
35121
+ // below) handles the SR announcement for the active cell.
34904
35122
  if (activeCell) {
34905
35123
  this.calendar.focusActiveCell();
34906
35124
 
@@ -34950,11 +35168,13 @@ class AuroDatePicker extends AuroElement {
34950
35168
  this.dropdown.bibDialogLabel = labelElement.textContent.trim() || undefined;
34951
35169
  }
34952
35170
 
35171
+ const { signal } = this._listenerAbortController;
35172
+
34953
35173
  this.dropdown.addEventListener('auroDropdown-triggerClick', () => {
34954
35174
  if (!this.isPopoverVisible) {
34955
35175
  this.dropdown.show();
34956
35176
  }
34957
- });
35177
+ }, { signal });
34958
35178
 
34959
35179
  this.dropdown.addEventListener('auroDropdown-toggled', () => {
34960
35180
  this.notifyDatepickerToggled();
@@ -34972,7 +35192,7 @@ class AuroDatePicker extends AuroElement {
34972
35192
  if (this.valueObject) {
34973
35193
  this.centralDate = this.value;
34974
35194
  } else if (!this.centralDate && !this.calendarStartDate && !this.minDate) {
34975
- this.centralDate = new Date();
35195
+ this.centralDate = dateFormatter$1.toISOFormatString(new Date());
34976
35196
  }
34977
35197
  }
34978
35198
 
@@ -35052,7 +35272,7 @@ class AuroDatePicker extends AuroElement {
35052
35272
  this.forceScrollOnNextMobileCalendarRender = false;
35053
35273
  }, 0);
35054
35274
  }
35055
- });
35275
+ }, { signal });
35056
35276
 
35057
35277
  // Handle responsive strategy changes while the dropdown is open
35058
35278
  // (e.g. resizing from desktop → mobile or vice versa).
@@ -35099,7 +35319,7 @@ class AuroDatePicker extends AuroElement {
35099
35319
  });
35100
35320
  });
35101
35321
  }
35102
- });
35322
+ }, { signal });
35103
35323
  }
35104
35324
 
35105
35325
  /**
@@ -35112,6 +35332,8 @@ class AuroDatePicker extends AuroElement {
35112
35332
 
35113
35333
  this.inputList = [...this.dropdown.querySelectorAll(this.inputTag._$litStatic$)];
35114
35334
 
35335
+ const { signal } = this._listenerAbortController;
35336
+
35115
35337
  this.inputList.forEach((input, index) => {
35116
35338
  input.addEventListener('input', (event) => {
35117
35339
  event.stopPropagation();
@@ -35123,7 +35345,7 @@ class AuroDatePicker extends AuroElement {
35123
35345
  }
35124
35346
 
35125
35347
  this.notifyValueChanged();
35126
- });
35348
+ }, { signal });
35127
35349
 
35128
35350
  input.addEventListener('auroFormElement-validated', (evt) => {
35129
35351
  // not to bubble up input's validated event.
@@ -35139,7 +35361,7 @@ class AuroDatePicker extends AuroElement {
35139
35361
  this.validity = evt.detail.validity;
35140
35362
  this.errorMessage = evt.detail.message;
35141
35363
  }
35142
- });
35364
+ }, { signal });
35143
35365
  });
35144
35366
  }
35145
35367
 
@@ -35153,6 +35375,8 @@ class AuroDatePicker extends AuroElement {
35153
35375
  this.calendar.datepicker = this;
35154
35376
  this.calendar.dropdown = this.dropdown;
35155
35377
 
35378
+ const { signal } = this._listenerAbortController;
35379
+
35156
35380
  this.calendar.addEventListener('auroCalendar-dateSelected', () => {
35157
35381
  if (this.inputList[0].value !== this.calendar.dateFrom && this.calendar.dateFrom !== undefined) {
35158
35382
  this.inputList[0].value = this.convertWcTimeToDate(this.calendar.dateFrom);
@@ -35161,11 +35385,11 @@ class AuroDatePicker extends AuroElement {
35161
35385
  if (this.inputList[1] && this.calendar.dateTo && this.inputList[1].value !== this.calendar.dateTo) {
35162
35386
  this.inputList[1].value = this.convertWcTimeToDate(this.calendar.dateTo);
35163
35387
  }
35164
- });
35388
+ }, { signal });
35165
35389
 
35166
35390
  this.calendar.addEventListener('auroCalendar-dismissRequest', () => {
35167
35391
  this.dropdown.hide();
35168
- });
35392
+ }, { signal });
35169
35393
 
35170
35394
  this.calendar.addEventListener('auroCalendar-centralDateChanged', (event) => {
35171
35395
  const match = this.centralDateObject && this.util.datesMatch(event.detail.date, this.centralDateObject);
@@ -35175,7 +35399,7 @@ class AuroDatePicker extends AuroElement {
35175
35399
  }
35176
35400
 
35177
35401
  this.notifyMonthChanged(event);
35178
- });
35402
+ }, { signal });
35179
35403
  }
35180
35404
 
35181
35405
  /**
@@ -35184,10 +35408,17 @@ class AuroDatePicker extends AuroElement {
35184
35408
  * @returns {void}
35185
35409
  */
35186
35410
  configureDatepicker() {
35411
+ // These listeners are on `this` (the host), so they would GC with the
35412
+ // host even without the abort signal — see the leak rationale on
35413
+ // `_listenerAbortController`. The signal is still passed for uniform
35414
+ // cleanup semantics with the child-element listeners in the other
35415
+ // configure* methods.
35416
+ const { signal } = this._listenerAbortController;
35417
+
35187
35418
  this.addEventListener('focusin', () => {
35188
35419
  this.touched = true;
35189
35420
  this.hasFocus = true;
35190
- });
35421
+ }, { signal });
35191
35422
 
35192
35423
  this.addEventListener('focusout', () => {
35193
35424
  this.hasFocus = false;
@@ -35199,7 +35430,7 @@ class AuroDatePicker extends AuroElement {
35199
35430
  if (!this.matches(':focus-within')) {
35200
35431
  this.validate();
35201
35432
  }
35202
- });
35433
+ }, { signal });
35203
35434
 
35204
35435
  if (this.valueObject) {
35205
35436
  this.calendar.dateFrom = this.convertToWcValidTime(this.valueObject);
@@ -35397,6 +35628,36 @@ class AuroDatePicker extends AuroElement {
35397
35628
  return this.validity !== undefined && this.validity !== 'valid';
35398
35629
  }
35399
35630
 
35631
+ /**
35632
+ * Per-class dedup set used by `_warnInvalidLocale`. Static so the dedup
35633
+ * spans every datepicker instance on the page; lives on the class (not
35634
+ * at module scope) so it stays an encapsulated implementation detail of
35635
+ * this component and does not interfere with WCA's class-JSDoc
35636
+ * attachment.
35637
+ * @private
35638
+ */
35639
+ static _warnedInvalidLocales = new Set();
35640
+
35641
+ /**
35642
+ * Logs a one-time `console.debug` when an unsupported locale falls back to
35643
+ * en-US. Deduped by the offending tag so noisy re-renders that resurface
35644
+ * the same bad value stay quiet, but each new bad value still signals so
35645
+ * consumers can spot the typo or missing tag.
35646
+ * @private
35647
+ * @param {string|undefined} badLocale - The locale value that failed.
35648
+ * @returns {void}
35649
+ */
35650
+ _warnInvalidLocale(badLocale) {
35651
+ const key = String(badLocale ?? '');
35652
+ const seen = AuroDatePicker._warnedInvalidLocales;
35653
+ if (seen.has(key)) {
35654
+ return;
35655
+ }
35656
+ seen.add(key);
35657
+ // eslint-disable-next-line no-console
35658
+ console.debug(`[auro-datepicker] Locale "${key}" is not supported by Intl.DateTimeFormat. Falling back to "en-US". Pass a BCP 47 tag such as "en-US", "fr-FR", or "ja-JP".`);
35659
+ }
35660
+
35400
35661
  /**
35401
35662
  * Lifecycle method to check if the locale is valid.
35402
35663
  * @ignore
@@ -35407,10 +35668,15 @@ class AuroDatePicker extends AuroElement {
35407
35668
  if (changedProperties.has('locale')) {
35408
35669
  try {
35409
35670
  const supported = Intl.DateTimeFormat.supportedLocalesOf([this.locale], { localeMatcher: 'lookup' });
35410
- this._validLocale = supported.length > 0 ? this.locale : 'en-US';
35671
+ if (supported.length > 0) {
35672
+ this._validLocale = this.locale;
35673
+ } else {
35674
+ this._validLocale = 'en-US';
35675
+ this._warnInvalidLocale(this.locale);
35676
+ }
35411
35677
  } catch {
35412
- console.debug(`[AuroDatePicker] The locale "${this.locale}" is not valid. Falling back to "en-US".`); // eslint-disable-line no-console
35413
35678
  this._validLocale = 'en-US';
35679
+ this._warnInvalidLocale(this.locale);
35414
35680
  }
35415
35681
 
35416
35682
  const previousLocaleFormat = getDateFormatFromLocale$1(changedProperties.get('locale'));
@@ -35492,8 +35758,6 @@ class AuroDatePicker extends AuroElement {
35492
35758
  // Skip centralDate update when user clicked a cell in range mode
35493
35759
  // to prevent the displayed months from shifting
35494
35760
  this.centralDate = this.value;
35495
- //TODO: TEST THIS CHANGE
35496
- // this.calendarRenderUtil.updateCentralDate(this, this.value);
35497
35761
  }
35498
35762
 
35499
35763
  this.setHasValue();
@@ -35553,8 +35817,6 @@ class AuroDatePicker extends AuroElement {
35553
35817
  // Skip centralDate update when user clicked a cell in range mode
35554
35818
  // to prevent the displayed months from shifting
35555
35819
  this.centralDate = this.valueEnd;
35556
- // TODO: TEST THIS CHANGE
35557
- // this.calendarRenderUtil.updateCentralDate(this, this.formattedValueEnd);
35558
35820
  }
35559
35821
 
35560
35822
  this.validate();
@@ -35696,7 +35958,7 @@ class AuroDatePicker extends AuroElement {
35696
35958
  * @returns {void}
35697
35959
  */
35698
35960
  configureClickHandler() {
35699
- this.addEventListener('click', this.handleClick);
35961
+ this.addEventListener('click', this.handleClick, { signal: this._listenerAbortController.signal });
35700
35962
  }
35701
35963
 
35702
35964
  firstUpdated() {
@@ -35718,6 +35980,17 @@ class AuroDatePicker extends AuroElement {
35718
35980
  this.locale = this.domHandler.getLocale(this);
35719
35981
  }
35720
35982
 
35983
+ disconnectedCallback() {
35984
+ super.disconnectedCallback();
35985
+ // Defer so that re-parenting (auro-drawer slotting it into a dialog,
35986
+ // for example) does not abort listeners we still need after reconnect.
35987
+ queueMicrotask(() => {
35988
+ if (!this.isConnected) {
35989
+ this._listenerAbortController.abort();
35990
+ }
35991
+ });
35992
+ }
35993
+
35721
35994
  // layout render methods
35722
35995
  // ------------------------------------
35723
35996