@aurodesignsystem-dev/auro-formkit 0.0.0-pr1512.0 → 0.0.0-pr1513.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 (129) 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 +96 -119
  7. package/components/combobox/demo/getting-started.min.js +96 -119
  8. package/components/combobox/demo/index.min.js +96 -119
  9. package/components/combobox/dist/index.js +95 -118
  10. package/components/combobox/dist/registered.js +95 -118
  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 +716 -336
  19. package/components/datepicker/demo/index.min.js +716 -336
  20. package/components/datepicker/dist/{src/auro-calendar-cell.d.ts → auro-calendar-cell.d.ts} +14 -3
  21. package/components/datepicker/dist/{src/auro-calendar.d.ts → auro-calendar.d.ts} +91 -6
  22. package/components/datepicker/dist/{src/auro-datepicker.d.ts → auro-datepicker.d.ts} +78 -5
  23. package/components/datepicker/dist/blackoutUtils.d.ts +43 -0
  24. package/components/datepicker/dist/index.js +716 -336
  25. package/components/datepicker/dist/registered.js +716 -336
  26. package/components/dropdown/demo/customize.min.js +1 -1
  27. package/components/dropdown/demo/getting-started.min.js +1 -1
  28. package/components/dropdown/demo/index.min.js +1 -1
  29. package/components/dropdown/dist/index.js +1 -1
  30. package/components/dropdown/dist/registered.js +1 -1
  31. package/components/form/demo/customize.min.js +918 -584
  32. package/components/form/demo/getting-started.min.js +918 -584
  33. package/components/form/demo/index.min.js +918 -584
  34. package/components/form/demo/registerDemoDeps.min.js +918 -584
  35. package/components/input/demo/api.md +5 -5
  36. package/components/input/demo/customize.md +8 -8
  37. package/components/input/demo/customize.min.js +93 -116
  38. package/components/input/demo/getting-started.min.js +93 -116
  39. package/components/input/demo/index.min.js +93 -116
  40. package/components/input/dist/base-input.d.ts +44 -33
  41. package/components/input/dist/index.js +94 -129
  42. package/components/input/dist/registered.js +93 -116
  43. package/components/radio/demo/customize.min.js +1 -1
  44. package/components/radio/demo/getting-started.min.js +1 -1
  45. package/components/radio/demo/index.min.js +1 -1
  46. package/components/radio/dist/index.js +1 -1
  47. package/components/radio/dist/registered.js +1 -1
  48. package/components/select/demo/customize.min.js +2 -2
  49. package/components/select/demo/getting-started.min.js +2 -2
  50. package/components/select/demo/index.min.js +2 -2
  51. package/components/select/dist/index.js +2 -2
  52. package/components/select/dist/registered.js +2 -2
  53. package/custom-elements.json +1996 -1914
  54. package/package.json +6 -2
  55. package/components/checkbox/demo/customize.js +0 -22
  56. package/components/checkbox/demo/demo-support.js +0 -1
  57. package/components/checkbox/demo/getting-started.js +0 -22
  58. package/components/checkbox/demo/index.js +0 -8
  59. package/components/checkbox/demo/styles.scss +0 -1
  60. package/components/combobox/demo/customize.js +0 -24
  61. package/components/combobox/demo/demo-support.js +0 -1
  62. package/components/combobox/demo/getting-started.js +0 -21
  63. package/components/combobox/demo/index.js +0 -23
  64. package/components/combobox/demo/styles.scss +0 -1
  65. package/components/counter/demo/customize.js +0 -21
  66. package/components/counter/demo/demo-support.js +0 -1
  67. package/components/counter/demo/index.js +0 -21
  68. package/components/counter/demo/styles.scss +0 -1
  69. package/components/datepicker/demo/customize.js +0 -17
  70. package/components/datepicker/demo/demo-support.js +0 -1
  71. package/components/datepicker/demo/index.js +0 -23
  72. package/components/datepicker/demo/styles.scss +0 -1
  73. package/components/dropdown/demo/customize.js +0 -9
  74. package/components/dropdown/demo/demo-support.js +0 -1
  75. package/components/dropdown/demo/getting-started.js +0 -9
  76. package/components/dropdown/demo/index.js +0 -16
  77. package/components/dropdown/demo/styles.scss +0 -1
  78. package/components/form/demo/customize.js +0 -28
  79. package/components/form/demo/demo-support.js +0 -1
  80. package/components/form/demo/getting-started.js +0 -9
  81. package/components/form/demo/index.js +0 -5
  82. package/components/form/demo/registerDemoDeps.js +0 -23
  83. package/components/form/demo/styles.scss +0 -1
  84. package/components/input/demo/customize.js +0 -25
  85. package/components/input/demo/demo-support.js +0 -1
  86. package/components/input/demo/getting-started.js +0 -8
  87. package/components/input/demo/index.js +0 -8
  88. package/components/input/demo/styles.css +0 -974
  89. package/components/input/demo/styles.scss +0 -1
  90. package/components/menu/demo/demo-support.js +0 -1
  91. package/components/menu/demo/index.js +0 -25
  92. package/components/menu/demo/styles.scss +0 -1
  93. package/components/radio/demo/customize.js +0 -22
  94. package/components/radio/demo/demo-support.js +0 -1
  95. package/components/radio/demo/getting-started.js +0 -24
  96. package/components/radio/demo/index.js +0 -8
  97. package/components/radio/demo/styles.scss +0 -1
  98. package/components/select/demo/customize.js +0 -11
  99. package/components/select/demo/demo-support.js +0 -1
  100. package/components/select/demo/getting-started.js +0 -26
  101. package/components/select/demo/index.js +0 -11
  102. package/components/select/demo/styles.scss +0 -1
  103. /package/components/datepicker/dist/{src/auro-calendar-month.d.ts → auro-calendar-month.d.ts} +0 -0
  104. /package/components/datepicker/dist/{src/buttonVersion.d.ts → buttonVersion.d.ts} +0 -0
  105. /package/components/datepicker/dist/{src/datepickerKeyboardStrategy.d.ts → datepickerKeyboardStrategy.d.ts} +0 -0
  106. /package/components/datepicker/dist/{src/iconVersion.d.ts → iconVersion.d.ts} +0 -0
  107. /package/components/datepicker/dist/{src/index.d.ts → index.d.ts} +0 -0
  108. /package/components/datepicker/dist/{src/popoverVersion.d.ts → popoverVersion.d.ts} +0 -0
  109. /package/components/datepicker/dist/{src/styles → styles}/classic/color-css.d.ts +0 -0
  110. /package/components/datepicker/dist/{src/styles → styles}/classic/style-css.d.ts +0 -0
  111. /package/components/datepicker/dist/{src/styles → styles}/color-calendar-css.d.ts +0 -0
  112. /package/components/datepicker/dist/{src/styles → styles}/color-cell-css.d.ts +0 -0
  113. /package/components/datepicker/dist/{src/styles → styles}/color-css.d.ts +0 -0
  114. /package/components/datepicker/dist/{src/styles → styles}/color-month-css.d.ts +0 -0
  115. /package/components/datepicker/dist/{src/styles → styles}/shapeSize-css.d.ts +0 -0
  116. /package/components/datepicker/dist/{src/styles → styles}/snowflake/color-css.d.ts +0 -0
  117. /package/components/datepicker/dist/{src/styles → styles}/snowflake/style-css.d.ts +0 -0
  118. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-cell-css.d.ts +0 -0
  119. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-css.d.ts +0 -0
  120. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-month-css.d.ts +0 -0
  121. /package/components/datepicker/dist/{src/styles → styles}/style-css.d.ts +0 -0
  122. /package/components/datepicker/dist/{src/styles → styles}/tokens-css.d.ts +0 -0
  123. /package/components/datepicker/dist/{src/utilities.d.ts → utilities.d.ts} +0 -0
  124. /package/components/datepicker/dist/{src/utilitiesCalendar.d.ts → utilitiesCalendar.d.ts} +0 -0
  125. /package/components/datepicker/dist/{src/utilitiesCalendarRender.d.ts → utilitiesCalendarRender.d.ts} +0 -0
  126. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/day.d.ts +0 -0
  127. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker-calendar.d.ts +0 -0
  128. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker-cell.d.ts +0 -0
  129. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker.d.ts +0 -0
@@ -1373,7 +1373,7 @@ function normalizeDates$1(context, ...dates) {
1373
1373
  * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))
1374
1374
  * //=> Tue Sep 02 2014 00:00:00
1375
1375
  */
1376
- function startOfDay$2(date, options) {
1376
+ function startOfDay$1(date, options) {
1377
1377
  const _date = toDate$1(date, options?.in);
1378
1378
  _date.setHours(0, 0, 0, 0);
1379
1379
  return _date;
@@ -1421,8 +1421,8 @@ function differenceInCalendarDays$1(laterDate, earlierDate, options) {
1421
1421
  earlierDate,
1422
1422
  );
1423
1423
 
1424
- const laterStartOfDay = startOfDay$2(laterDate_);
1425
- const earlierStartOfDay = startOfDay$2(earlierDate_);
1424
+ const laterStartOfDay = startOfDay$1(laterDate_);
1425
+ const earlierStartOfDay = startOfDay$1(earlierDate_);
1426
1426
 
1427
1427
  const laterTimestamp =
1428
1428
  +laterStartOfDay - getTimezoneOffsetInMilliseconds$1(laterStartOfDay);
@@ -10524,13 +10524,6 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
10524
10524
  * @returns {string | undefined}
10525
10525
  */
10526
10526
  toFormattedValue(valueObject, format) {
10527
- // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
10528
- // `format` argument has to fail gracefully rather than throw on
10529
- // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
10530
- // as "no format → no display value".
10531
- if (!format) {
10532
- return undefined;
10533
- }
10534
10527
  const normalizedFormat = format.toLowerCase();
10535
10528
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
10536
10529
 
@@ -10911,8 +10904,8 @@ class RangeDatepickerCell extends i$1 {
10911
10904
  const parsedDateFrom = parseInt(dateFrom, 10);
10912
10905
  const parsedDateTo = parseInt(dateTo, 10);
10913
10906
  if (day) {
10914
- if (getTime(startOfDay$2(parsedDateTo * 1000)) / 1000 === day.date ||
10915
- getTime(startOfDay$2(parsedDateFrom * 1000)) / 1000 === day.date) {
10907
+ if (getTime(startOfDay$1(parsedDateTo * 1000)) / 1000 === day.date ||
10908
+ getTime(startOfDay$1(parsedDateFrom * 1000)) / 1000 === day.date) {
10916
10909
  this.selected = true;
10917
10910
  }
10918
10911
  if (((hoveredDate === day.date || day.date < hoveredDate) &&
@@ -11100,7 +11093,7 @@ class RangeDatepickerCalendar extends i$1 {
11100
11093
  this.dayNamesOfTheWeek = [];
11101
11094
  this.daysOfMonth = [];
11102
11095
  this._locale = null;
11103
- this.currentDate = parseInt(format$1(startOfDay$2(Date.now()), 't'), 10);
11096
+ this.currentDate = parseInt(format$1(startOfDay$1(Date.now()), 't'), 10);
11104
11097
  this.localeChanged();
11105
11098
  this.yearAndMonthChanged(this.year, this.month);
11106
11099
  }
@@ -11574,7 +11567,7 @@ __decorate([n$4({ type: Array })], RangeDatepickerCalendar.prototype, "dayNamesO
11574
11567
  __decorate([n$4({ type: Array })], RangeDatepickerCalendar.prototype, "daysOfMonth", void 0);
11575
11568
  AuroLibraryRuntimeUtils$5.prototype.registerComponent('wc-range-datepicker-calendar', RangeDatepickerCalendar);
11576
11569
 
11577
- var styleCss$5 = i$3`.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}`;
11570
+ var styleCss$5 = i$3`.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}`;
11578
11571
 
11579
11572
  var colorCss$5 = i$3`: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}`;
11580
11573
 
@@ -11599,13 +11592,103 @@ let s$2 = class s{registerComponent(e,t){customElements.get(e)||customElements.d
11599
11592
 
11600
11593
  var popoverVersion = '6.0.1';
11601
11594
 
11602
- /* 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 */
11595
+ /**
11596
+ * Single source of truth for parsing and matching blackout dates across the
11597
+ * datepicker. Both `auro-calendar` (memoized Set + `isDateBlackout`) and the
11598
+ * pre-`firstUpdated` fallback inside `auro-calendar-cell` route through these
11599
+ * helpers so the YYYY-MM-DD → seconds conversion and the merge-with-legacy
11600
+ * `disabledDays` rules are defined exactly once.
11601
+ */
11603
11602
 
11604
- const startOfDay$1 = (ms) => {
11605
- const date = new Date(ms);
11606
- date.setHours(0, 0, 0, 0);
11607
- return date.getTime();
11608
- };
11603
+ /**
11604
+ * Converts a `YYYY-MM-DD` ISO date string to a Unix timestamp (seconds)
11605
+ * representing local midnight on that calendar day. Returns `null` for
11606
+ * inputs that don't parse to a finite timestamp.
11607
+ *
11608
+ * Uses the `new Date(year, monthIndex, day)` constructor (NOT
11609
+ * `new Date(isoStr)`) so the result is local-midnight rather than UTC
11610
+ * midnight — required to keep the calendar grid aligned with the user's
11611
+ * local calendar day in negative-offset timezones.
11612
+ *
11613
+ * @param {string} isoStr - Date string in `YYYY-MM-DD` format.
11614
+ * @returns {number|null} Local-midnight Unix timestamp (seconds), or null.
11615
+ */
11616
+ function parseIsoToTimestamp(isoStr) {
11617
+ if (typeof isoStr !== 'string') {
11618
+ return null;
11619
+ }
11620
+ const parts = isoStr.split('-');
11621
+ if (parts.length !== 3) {
11622
+ return null;
11623
+ }
11624
+ const year = parseInt(parts[0], 10);
11625
+ const month = parseInt(parts[1], 10);
11626
+ const day = parseInt(parts[2], 10);
11627
+ if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) {
11628
+ return null;
11629
+ }
11630
+ // Reject overflow values like "2024-13-40" — JS `new Date(year, month, day)`
11631
+ // silently normalizes those to a different calendar day, which would
11632
+ // disable the wrong date if we let the result through.
11633
+ if (month < 1 || month > 12 || day < 1 || day > 31) {
11634
+ return null;
11635
+ }
11636
+ const date = new Date(year, month - 1, day);
11637
+ // Guard the residual case where JS still rolls a value (e.g. Feb 30 → Mar 2).
11638
+ // After construction, getFullYear/getMonth/getDate should match the inputs.
11639
+ if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) {
11640
+ return null;
11641
+ }
11642
+ const ts = Math.floor(date.getTime() / 1000);
11643
+ return Number.isFinite(ts) ? ts : null;
11644
+ }
11645
+
11646
+ /**
11647
+ * Builds a `Set<number>` of seconds-since-epoch timestamps covering both the
11648
+ * legacy `disabledDays` (already-numeric) array and the ISO `blackoutDates`
11649
+ * array. Use this for O(1) membership checks in hot paths.
11650
+ *
11651
+ * @param {Array<string|number>|undefined} disabledDays - Legacy timestamp array.
11652
+ * @param {Array<string>|undefined} blackoutDates - ISO `YYYY-MM-DD` array.
11653
+ * @returns {Set<number>}
11654
+ */
11655
+ function buildBlackoutSet(disabledDays, blackoutDates) {
11656
+ const set = new Set();
11657
+ if (Array.isArray(disabledDays)) {
11658
+ for (const day of disabledDays) {
11659
+ const ts = parseInt(day, 10);
11660
+ if (Number.isFinite(ts)) {
11661
+ set.add(ts);
11662
+ }
11663
+ }
11664
+ }
11665
+ if (Array.isArray(blackoutDates)) {
11666
+ for (const isoStr of blackoutDates) {
11667
+ const ts = parseIsoToTimestamp(isoStr);
11668
+ if (ts !== null) {
11669
+ set.add(ts);
11670
+ }
11671
+ }
11672
+ }
11673
+ return set;
11674
+ }
11675
+
11676
+ /**
11677
+ * One-shot membership test for a single timestamp against both blackout
11678
+ * sources. Allocates a Set on each call; only use this in cold paths
11679
+ * (e.g. the pre-`firstUpdated` cell fallback). Hot paths should hold the
11680
+ * Set returned from `buildBlackoutSet` and `.has(ts)` directly.
11681
+ *
11682
+ * @param {number} dateTs - Unix timestamp (seconds) to test.
11683
+ * @param {Array<string|number>|undefined} disabledDays - Legacy timestamp array.
11684
+ * @param {Array<string>|undefined} blackoutDates - ISO `YYYY-MM-DD` array.
11685
+ * @returns {boolean}
11686
+ */
11687
+ function isBlackoutTimestamp(dateTs, disabledDays, blackoutDates) {
11688
+ return buildBlackoutSet(disabledDays, blackoutDates).has(dateTs);
11689
+ }
11690
+
11691
+ /* 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 */
11609
11692
 
11610
11693
  class AuroCalendarCell extends i$1 {
11611
11694
  constructor() {
@@ -11653,6 +11736,14 @@ class AuroCalendarCell extends i$1 {
11653
11736
  type: Boolean,
11654
11737
  reflect: true
11655
11738
  },
11739
+ /**
11740
+ * @deprecated Propagated from the legacy `auro-calendar.disabledDays`
11741
+ * Unix-timestamp array. The cell honors it for backward compatibility
11742
+ * (see the divergence-check fallback inside `isBlackout`), but
11743
+ * consumers should migrate to `auro-datepicker.blackoutDates`
11744
+ * (YYYY-MM-DD ISO strings). The calendar emits a one-time
11745
+ * deprecation warning the first time a non-empty value is observed.
11746
+ */
11656
11747
  disabledDays: { type: Array },
11657
11748
  isCurrentDate: { type: Boolean },
11658
11749
  locale: { type: String },
@@ -11698,8 +11789,8 @@ class AuroCalendarCell extends i$1 {
11698
11789
  const parsedDateTo = parseInt(dateTo, 10);
11699
11790
 
11700
11791
  if (day) {
11701
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
11702
- const returnTimestamp = startOfDay$1(parsedDateTo * 1000) / 1000;
11792
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
11793
+ const returnTimestamp = new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000;
11703
11794
 
11704
11795
  if (day.date === departTimestamp || day.date === returnTimestamp) {
11705
11796
  this.selected = true;
@@ -11783,27 +11874,33 @@ class AuroCalendarCell extends i$1 {
11783
11874
  return false;
11784
11875
  }
11785
11876
 
11786
- // Check against disabledDays timestamps (legacy path)
11787
- if (Array.isArray(this.disabledDays) && this.disabledDays.length > 0 &&
11788
- (this.disabledDays.findIndex(dd => parseInt(dd, 10) === this.day.date) !== -1)) {
11789
- return true;
11790
- }
11791
-
11792
- // Check against blackoutDates (ISO format YYYY-MM-DD) on the datepicker
11793
- const blackoutDates = this.datepicker?.blackoutDates;
11794
-
11795
- if (Array.isArray(blackoutDates) && blackoutDates.length > 0) {
11796
- const date = new Date(this.day.date * 1000);
11797
- const yyyy = date.getFullYear();
11798
- const mm = String(date.getMonth() + 1).padStart(2, '0');
11799
- const dd = String(date.getDate()).padStart(2, '0');
11800
- const cellDate = `${yyyy}-${mm}-${dd}`;
11801
- if (blackoutDates.includes(cellDate)) {
11877
+ // Delegate to the calendar's memoized blackout Set for O(1) lookup
11878
+ // (instead of rescanning disabledDays + blackoutDates per render). The
11879
+ // Set is rebuilt only when either source array reference changes — see
11880
+ // auro-calendar.js#_getBlackoutSet.
11881
+ if (this.calendar && typeof this.calendar._getBlackoutSet === 'function') {
11882
+ if (this.calendar._getBlackoutSet().has(this.day.date)) {
11802
11883
  return true;
11803
11884
  }
11885
+ // If the cell's local disabledDays diverged from the calendar's (a
11886
+ // consumer or test mutated cell.disabledDays directly), the Set does
11887
+ // not reflect that addition — fall through to the per-cell scan only
11888
+ // when the reference no longer matches. Production data flow keeps
11889
+ // these identical, so this branch stays cold. Guarded with
11890
+ // Array.isArray to match `_getBlackoutSet`'s contract: non-array
11891
+ // values are treated as empty rather than crashing on `.findIndex`.
11892
+ if (Array.isArray(this.disabledDays) && this.disabledDays !== this.calendar.disabledDays && this.disabledDays.length > 0) {
11893
+ if (this.disabledDays.findIndex((dd) => parseInt(dd, 10) === this.day.date) !== -1) {
11894
+ return true;
11895
+ }
11896
+ }
11897
+ return false;
11804
11898
  }
11805
11899
 
11806
- return false;
11900
+ // Pre-firstUpdated fallback — the cell may render once before the
11901
+ // ancestor calendar is wired up. Routes through the shared
11902
+ // blackoutUtils helper so the parsing rules stay in one place.
11903
+ return isBlackoutTimestamp(this.day.date, this.disabledDays, this.datepicker?.blackoutDates);
11807
11904
  }
11808
11905
 
11809
11906
  /**
@@ -11909,12 +12006,12 @@ class AuroCalendarCell extends i$1 {
11909
12006
  const parsedDateFrom = Number.parseInt(this.dateFrom, 10);
11910
12007
  if (!Number.isFinite(parsedDateFrom)) return null;
11911
12008
 
11912
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
12009
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
11913
12010
  const dayDate = this.day.date;
11914
12011
 
11915
12012
  const parsedDateTo = Number.parseInt(this.dateTo, 10);
11916
12013
  const hasDateTo = Number.isFinite(parsedDateTo);
11917
- const returnTimestamp = hasDateTo ? startOfDay$1(parsedDateTo * 1000) / 1000 : null;
12014
+ const returnTimestamp = hasDateTo ? new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000 : null;
11918
12015
 
11919
12016
  if (dayDate === departTimestamp) return this.datepicker.rangeLabelStart || 'range start';
11920
12017
 
@@ -11924,7 +12021,9 @@ class AuroCalendarCell extends i$1 {
11924
12021
 
11925
12022
  if (hasDateTo && dayDate > departTimestamp && dayDate < returnTimestamp) return this.datepicker.rangeLabelInRange || 'in range';
11926
12023
 
11927
- // After start date, no end date yet, or after end date
12024
+ if (!hasDateTo && dayDate > departTimestamp) return this.datepicker.rangeLabelEndPreview || 'previewing range end';
12025
+
12026
+ // After end date when both dateFrom and dateTo are set.
11928
12027
  return this.datepicker.rangeLabelAfterRange || 'after range';
11929
12028
  }
11930
12029
 
@@ -11937,7 +12036,7 @@ class AuroCalendarCell extends i$1 {
11937
12036
  */
11938
12037
  isDepartDate(day, dateFrom) {
11939
12038
  const parsedDateFrom = parseInt(dateFrom, 10);
11940
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
12039
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
11941
12040
 
11942
12041
  return this.selected && day.date === departTimestamp;
11943
12042
  }
@@ -11952,7 +12051,7 @@ class AuroCalendarCell extends i$1 {
11952
12051
  */
11953
12052
  isReturnDate(day, dateFrom, dateTo) {
11954
12053
  const parsedDateTo = parseInt(dateTo, 10);
11955
- const returnTimestamp = startOfDay$1(parsedDateTo * 1000) / 1000;
12054
+ const returnTimestamp = new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000;
11956
12055
 
11957
12056
  return this.selected && day.date === returnTimestamp && dateFrom;
11958
12057
  }
@@ -12116,6 +12215,7 @@ class AuroCalendarCell extends i$1 {
12116
12215
  setTimeout(() => this.firstUpdated(), 0);
12117
12216
  return;
12118
12217
  }
12218
+ this.calendar = calendar;
12119
12219
  this.datepicker = calendar.datepicker;
12120
12220
  this._slotContentHandler = () => {
12121
12221
  this.handleSlotContent();
@@ -12173,12 +12273,13 @@ class AuroCalendarCell extends i$1 {
12173
12273
  this._cachedButton = this.shadowRoot.querySelector('button.day');
12174
12274
  });
12175
12275
 
12176
- // Update host-level aria attributes for ariaActiveDescendantElement.
12276
+ // Keep the host's gridcell aria attributes in sync with the day data.
12177
12277
  this.updateHostAria();
12178
12278
  }
12179
12279
 
12180
12280
  // Update host aria when selection changes (aria-selected, range labels)
12181
- if (properties.has('dateFrom') || properties.has('dateTo') || properties.has('selected')) {
12281
+ // or when isCurrentDate flips (aria-current).
12282
+ if (properties.has('dateFrom') || properties.has('dateTo') || properties.has('selected') || properties.has('isCurrentDate')) {
12182
12283
  this.updateHostAria();
12183
12284
  }
12184
12285
 
@@ -12189,8 +12290,8 @@ class AuroCalendarCell extends i$1 {
12189
12290
  }
12190
12291
 
12191
12292
  /**
12192
- * Updates ARIA attributes on the host element so that
12193
- * ariaActiveDescendantElement can expose cell info to the SR.
12293
+ * Sets host-level ARIA so each cell exposes its date, selection state,
12294
+ * and blackout status to assistive tech browsing the month grid.
12194
12295
  * @private
12195
12296
  * @returns {void}
12196
12297
  */
@@ -12199,16 +12300,27 @@ class AuroCalendarCell extends i$1 {
12199
12300
 
12200
12301
  const outOfRange = this.isOutOfRange(this.day, this.min, this.max);
12201
12302
  if (outOfRange) {
12303
+ // Strip every aria attribute the in-range branch may have set on a
12304
+ // previous render — if a cell flips from in-range to out-of-range
12305
+ // (calendar shifts months, minDate/maxDate change, etc.).
12202
12306
  this.removeAttribute('role');
12203
12307
  this.removeAttribute('aria-label');
12308
+ this.removeAttribute('aria-current');
12309
+ this.removeAttribute('aria-selected');
12310
+ this.removeAttribute('aria-disabled');
12204
12311
  return;
12205
12312
  }
12206
12313
 
12207
- // The host acts as the gridcell for ariaActiveDescendantElement.
12208
12314
  this.setAttribute('role', 'gridcell');
12209
12315
  this.setAttribute('aria-label', this.getAriaLabel());
12210
12316
  this.setAttribute('aria-selected', this.selected ? 'true' : 'false');
12211
12317
 
12318
+ if (this.isCurrentDate) {
12319
+ this.setAttribute('aria-current', 'date');
12320
+ } else {
12321
+ this.removeAttribute('aria-current');
12322
+ }
12323
+
12212
12324
  if (this.isBlackout()) {
12213
12325
  this.setAttribute('aria-disabled', 'true');
12214
12326
  } else {
@@ -12223,7 +12335,7 @@ class AuroCalendarCell extends i$1 {
12223
12335
  * @returns {void}
12224
12336
  */
12225
12337
  focusButton() {
12226
- const button = this._cachedButton || this.shadowRoot.querySelector('button:not([aria-hidden])');
12338
+ const button = this._cachedButton || this.shadowRoot.querySelector('button:not([disabled])');
12227
12339
  if (button) {
12228
12340
  button.focus({ focusVisible: true });
12229
12341
  }
@@ -12231,7 +12343,9 @@ class AuroCalendarCell extends i$1 {
12231
12343
 
12232
12344
  /**
12233
12345
  * Imperatively marks this cell as active without triggering a Lit re-render.
12234
- * Note: buttons stay tabindex="-1" because the grid uses aria-activedescendant.
12346
+ * Buttons stay tabindex="-1" because DOM focus stays on the grid wrapper
12347
+ * arrow keys move the active cell imperatively and the live region carries
12348
+ * the SR announcement.
12235
12349
  * @returns {void}
12236
12350
  */
12237
12351
  setActive() {
@@ -12273,10 +12387,13 @@ class AuroCalendarCell extends i$1 {
12273
12387
  if (!btn || !this.day) return;
12274
12388
 
12275
12389
  const dayDate = this.day.date;
12276
- const departTimestamp = startOfDay$1(dateFrom * 1000) / 1000;
12390
+ const departTimestamp = new Date(dateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
12277
12391
  const isInRange = dayDate > departTimestamp && dayDate < hoveredDate;
12278
- const isLastHovered = dayDate === hoveredDate && hoveredDate > departTimestamp;
12279
- const isDepartWithPreview = dayDate === departTimestamp && hoveredDate > departTimestamp;
12392
+ // `>=` so hovering the depart cell itself (a same-day round-trip
12393
+ // preview) still surfaces a visual cue: the depart cell receives both
12394
+ // rangeDepartDate and lastHoveredDate.
12395
+ const isLastHovered = dayDate === hoveredDate && hoveredDate >= departTimestamp;
12396
+ const isDepartWithPreview = dayDate === departTimestamp && hoveredDate >= departTimestamp;
12280
12397
 
12281
12398
  btn.classList.toggle('inRange', isInRange);
12282
12399
  btn.classList.toggle('lastHoveredDate', isLastHovered);
@@ -12334,7 +12451,6 @@ class AuroCalendarCell extends i$1 {
12334
12451
  @focus="${outOfRange ? undefined : this.handleFocus}"
12335
12452
  class="${e$4(buttonClasses)}"
12336
12453
  ?disabled="${outOfRange}"
12337
- aria-hidden="${outOfRange ? 'true' : A$4}"
12338
12454
  tabindex="-1">
12339
12455
  <div class="buttonWrapper" aria-hidden="true">
12340
12456
  <div class="currentDayMarker">${this.day?.title || A$4}</div>
@@ -13446,7 +13562,7 @@ class AuroBibtemplate extends i$1 {
13446
13562
  }
13447
13563
  }
13448
13564
 
13449
- var formkitVersion$2 = '202606252337';
13565
+ var formkitVersion$2 = '202606291440';
13450
13566
 
13451
13567
  let l$1 = class l{generateElementName(t,e){let o=t;return o+="-",o+=e.replace(/[.]/g,"_"),o}generateTag(o,s,a){const r=this.generateElementName(o,s),i=i$5`${s$5(r)}`;return customElements.get(r)||customElements.define(r,class extends a{}),i}};let d$1 = class d{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}getSlotText(t,e){const o=t.shadowRoot?.querySelector(`slot[name="${e}"]`),s=(o?.assignedNodes({flatten:true})||[]).map(t=>t.textContent?.trim()).join(" ").trim();return s||null}};let h$4 = class h{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}};var c$3=i$3`:host{color:var(--ds-auro-loader-color)}:host>span{background-color:var(--ds-auro-loader-background-color);border-color:var(--ds-auro-loader-border-color)}:host([onlight]),:host([appearance=brand]){--ds-auro-loader-color: var(--ds-basic-color-brand-primary, #01426a)}:host([ondark]),:host([appearance=inverse]){--ds-auro-loader-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host([orbit])>span{--ds-auro-loader-background-color: transparent}:host([orbit])>span:nth-child(1){--ds-auro-loader-border-color: currentcolor;opacity:.25}:host([orbit])>span:nth-child(2){--ds-auro-loader-border-color: currentcolor;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}
13452
13568
  `,u$6=i$3`.body-default{font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default,.body-lg{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-lg{font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-sm{font-size:var(--wcss-body-sm-font-size, .875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm,.body-xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-xs{font-size:var(--wcss-body-xs-font-size, .75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-2xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:var(--wcss-body-2xs-font-size, .625rem);font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0);line-height:var(--wcss-body-2xs-line-height, .875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));font-weight:var(--wcss-display-2xl-weight, 300);letter-spacing:var(--wcss-display-2xl-letter-spacing, 0);line-height:var(--wcss-display-2xl-line-height, 1.3)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));font-weight:var(--wcss-display-xl-weight, 300);letter-spacing:var(--wcss-display-xl-letter-spacing, 0);line-height:var(--wcss-display-xl-line-height, 1.3)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));font-weight:var(--wcss-display-lg-weight, 300);letter-spacing:var(--wcss-display-lg-letter-spacing, 0);line-height:var(--wcss-display-lg-line-height, 1.3)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));font-weight:var(--wcss-display-md-weight, 300);letter-spacing:var(--wcss-display-md-letter-spacing, 0);line-height:var(--wcss-display-md-line-height, 1.3)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));font-weight:var(--wcss-display-sm-weight, 300);letter-spacing:var(--wcss-display-sm-letter-spacing, 0);line-height:var(--wcss-display-sm-line-height, 1.3)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));font-weight:var(--wcss-display-xs-weight, 300);letter-spacing:var(--wcss-display-xs-letter-spacing, 0);line-height:var(--wcss-display-xs-line-height, 1.3)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));font-weight:var(--wcss-heading-xl-weight, 300);letter-spacing:var(--wcss-heading-xl-letter-spacing, 0);line-height:var(--wcss-heading-xl-line-height, 1.3)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));font-weight:var(--wcss-heading-lg-weight, 300);letter-spacing:var(--wcss-heading-lg-letter-spacing, 0);line-height:var(--wcss-heading-lg-line-height, 1.3)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));font-weight:var(--wcss-heading-md-weight, 300);letter-spacing:var(--wcss-heading-md-letter-spacing, 0);line-height:var(--wcss-heading-md-line-height, 1.3)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));font-weight:var(--wcss-heading-sm-weight, 300);letter-spacing:var(--wcss-heading-sm-letter-spacing, 0);line-height:var(--wcss-heading-sm-line-height, 1.3)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));font-weight:var(--wcss-heading-xs-weight, 450);letter-spacing:var(--wcss-heading-xs-letter-spacing, 0);line-height:var(--wcss-heading-xs-line-height, 1.3)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));font-weight:var(--wcss-heading-2xs-weight, 450);letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0);line-height:var(--wcss-heading-2xs-line-height, 1.3)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));font-weight:var(--wcss-accent-2xl-weight, 450);letter-spacing:var(--wcss-accent-2xl-letter-spacing, .05em);line-height:var(--wcss-accent-2xl-line-height, 1)}.accent-2xl,.accent-xl{text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));font-weight:var(--wcss-accent-xl-weight, 450);letter-spacing:var(--wcss-accent-xl-letter-spacing, .05em);line-height:var(--wcss-accent-xl-line-height, 1.3)}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));font-weight:var(--wcss-accent-lg-weight, 450);letter-spacing:var(--wcss-accent-lg-letter-spacing, .05em);line-height:var(--wcss-accent-lg-line-height, 1.3)}.accent-lg,.accent-md{text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));font-weight:var(--wcss-accent-md-weight, 500);letter-spacing:var(--wcss-accent-md-letter-spacing, .05em);line-height:var(--wcss-accent-md-line-height, 1.3)}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));font-weight:var(--wcss-accent-sm-weight, 500);letter-spacing:var(--wcss-accent-sm-letter-spacing, .05em);line-height:var(--wcss-accent-sm-line-height, 1.3)}.accent-sm,.accent-xs{text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));font-weight:var(--wcss-accent-xs-weight, 500);letter-spacing:var(--wcss-accent-xs-letter-spacing, .1em);line-height:var(--wcss-accent-xs-line-height, 1.3)}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xs-font-size, clamp(.875rem, 1.1666666667vw, .875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, .1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}:focus:not(:focus-visible){outline:3px solid transparent}:host,:host>span{position:relative}:host{width:2rem;height:2rem;display:inline-block;font-size:0}:host>span{position:absolute;display:inline-block;float:none;top:0;left:0;width:2rem;height:2rem;border-radius:100%;border-style:solid;border-width:0;box-sizing:border-box}:host([xs]),:host([xs])>span{width:1.2rem;height:1.2rem}:host([sm]),:host([sm])>span{width:3rem;height:3rem}:host([md]),:host([md])>span{width:5rem;height:5rem}:host([lg]),:host([lg])>span{width:8rem;height:8rem}:host{--margin: .375rem;--margin-xs: .2rem;--margin-sm: .5rem;--margin-md: .75rem;--margin-lg: 1rem}:host([pulse]),:host([pulse])>span{position:relative}:host([pulse]){width:calc(3rem + var(--margin) * 6);height:calc(1rem + var(--margin) * 2)}:host([pulse])>span{width:1rem;height:1rem;margin:var(--margin);animation:pulse 1.5s ease infinite}:host([pulse][xs]){width:calc(1.95rem + var(--margin-xs) * 6);height:calc(.65rem + var(--margin-xs) * 2)}:host([pulse][xs])>span{margin:var(--margin-xs);width:.65rem;height:.65rem}:host([pulse][sm]){width:calc(6rem + var(--margin-sm) * 6);height:calc(2rem + var(--margin-sm) * 2)}:host([pulse][sm])>span{margin:var(--margin-sm);width:2rem;height:2rem}:host([pulse][md]){width:calc(9rem + var(--margin-md) * 6);height:calc(3rem + var(--margin-md) * 2)}:host([pulse][md])>span{margin:var(--margin-md);width:3rem;height:3rem}:host([pulse][lg]){width:calc(15rem + var(--margin-lg) * 6);height:calc(5rem + var(--margin-lg) * 2)}:host([pulse][lg])>span{margin:var(--margin-lg);width:5rem;height:5rem}:host([pulse])>span:nth-child(1){animation-delay:-.4s}:host([pulse])>span:nth-child(2){animation-delay:-.2s}:host([pulse])>span:nth-child(3){animation-delay:0ms}@keyframes pulse{0%,to{opacity:.1;transform:scale(.9)}50%{opacity:1;transform:scale(1.1)}}:host([orbit]),:host([orbit])>span{opacity:1}:host([orbit])>span{border-width:5px}:host([orbit])>span:nth-child(2){animation:orbit 2s linear infinite}:host([orbit][sm])>span{border-width:8px}:host([orbit][md])>span{border-width:13px}:host([orbit][lg])>span{border-width:21px}@keyframes orbit{0%{transform:rotate(0)}to{transform:rotate(360deg)}}:host([ringworm])>svg{animation:rotate 2s linear infinite;height:100%;width:100%;stroke:currentcolor;stroke-width:8}:host([ringworm]) .path{stroke-dashoffset:0;animation:ringworm 1.5s ease-in-out infinite;stroke-linecap:round}@keyframes rotate{to{transform:rotate(360deg)}}@keyframes ringworm{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}:host([laser]){position:static;width:100%;display:block;height:0;overflow:hidden;font-size:unset}:host([laser])>span{position:fixed;width:100%;height:.25rem;border-radius:0;z-index:100}:host([laser])>span:nth-child(1){border-color:currentcolor;opacity:.25}:host([laser])>span:nth-child(2){border-color:currentcolor;animation:laser 2s linear infinite;opacity:1;width:50%}:host([laser][sm])>span:nth-child(2){width:20%}:host([laser][md])>span:nth-child(2){width:30%}:host([laser][lg])>span:nth-child(2){width:50%;animation-duration:1.5s}:host([laser][xl])>span:nth-child(2){width:80%;animation-duration:1.5s}@keyframes laser{0%{left:-100%}to{left:110%}}:host>.no-animation{display:none}@media (prefers-reduced-motion: reduce){:host{display:flex;align-items:center;justify-content:center}:host>span{opacity:1}:host>.loader{display:none}:host>svg{display:none}:host>.no-animation{display:block}}
@@ -13569,7 +13685,11 @@ class AuroCalendar extends RangeDatepicker {
13569
13685
  this.calendarRangeMonths = null;
13570
13686
 
13571
13687
  /**
13572
- * Legacy array of disabled-date timestamps.
13688
+ * @deprecated Use `auro-datepicker.blackoutDates` (an array of
13689
+ * `YYYY-MM-DD` ISO strings) instead. This legacy array of Unix
13690
+ * timestamps is still honored for backward compatibility but emits a
13691
+ * one-time `console.debug` the first time a non-empty value is observed.
13692
+ * Support will be removed in a future major release.
13573
13693
  * @private
13574
13694
  */
13575
13695
  this.disabledDays = [];
@@ -13826,17 +13946,44 @@ class AuroCalendar extends RangeDatepicker {
13826
13946
  * @returns {void}
13827
13947
  */
13828
13948
  updateActiveCellForVisibleMonth() {
13829
- // Use double-rAF to ensure child month/cell components have fully
13830
- // rendered and cached their button references before we set tabindex.
13831
- requestAnimationFrame(() => {
13832
- requestAnimationFrame(() => {
13833
- const newDate = this.computeActiveDate({ skipDateFrom: true });
13949
+ this._afterMonthRender(() => {
13950
+ const newDate = this.computeActiveDate({ skipDateFrom: true });
13834
13951
 
13835
- if (newDate !== null && newDate !== undefined) {
13836
- this.activeCellDate = newDate;
13837
- this.setActiveCell(this.activeCellDate);
13838
- }
13839
- });
13952
+ if (newDate !== null && newDate !== undefined) {
13953
+ this.activeCellDate = newDate;
13954
+ this.setActiveCell(this.activeCellDate);
13955
+ }
13956
+ });
13957
+ }
13958
+
13959
+ /**
13960
+ * Schedules `callback` two animation frames out, giving the child
13961
+ * `auro-formkit-calendar-month` and `auro-formkit-calendar-cell` elements
13962
+ * a full render-and-paint cycle to settle before the callback reads or
13963
+ * mutates DOM.
13964
+ *
13965
+ * Why two frames, not one:
13966
+ * 1. Lit batches property updates and renders in a microtask, so frame N
13967
+ * schedules the render but the new DOM may not be painted yet.
13968
+ * 2. Cells re-cache `_cachedButton` inside their own `updateComplete.then`,
13969
+ * which also lands a tick later. Reading buttons from frame N+1
13970
+ * (after both renders + cache refresh have flushed) reliably hits the
13971
+ * new month's cells.
13972
+ *
13973
+ * Used by every code path that calls `handleNextMonth`/`handlePrevMonth`
13974
+ * and then needs to inspect the freshly-rendered cells (cross-month
13975
+ * keyboard nav, boundary events, `updateActiveCellForVisibleMonth`).
13976
+ * Do NOT collapse to a single rAF — it intermittently lands before
13977
+ * `_cachedButton` is refreshed, which silently breaks focus restoration
13978
+ * and `setActiveCell` lookups.
13979
+ * @private
13980
+ * @param {() => void} callback - Runs once after the month re-render and
13981
+ * the cells' button caches have refreshed.
13982
+ * @returns {void}
13983
+ */
13984
+ _afterMonthRender(callback) {
13985
+ requestAnimationFrame(() => {
13986
+ requestAnimationFrame(callback);
13840
13987
  });
13841
13988
  }
13842
13989
 
@@ -13954,6 +14101,47 @@ class AuroCalendar extends RangeDatepicker {
13954
14101
  return Array.from(this.shadowRoot.querySelectorAll('auro-formkit-calendar-month'));
13955
14102
  }
13956
14103
 
14104
+ /**
14105
+ * Picks the focusable cell whose date is closest to targetTs. Used as a
14106
+ * fallback after a month-boundary nav when the exact target date isn't
14107
+ * focusable — typically because the month re-render lagged or the date
14108
+ * was filtered out by isOutOfRange. When two cells are equidistant, the
14109
+ * navigation direction breaks the tie so the user moves the way they
14110
+ * pressed (forward → later cell, backward → earlier cell).
14111
+ * @private
14112
+ * @param {Array} cells - Focusable cells from getAllFocusableCells.
14113
+ * @param {Number} targetTs - Desired Unix timestamp (seconds).
14114
+ * @param {'next'|'prev'} direction - Navigation direction.
14115
+ * @returns {Object|null} The nearest cell, or null when cells is empty.
14116
+ */
14117
+ pickNearestCell(cells, targetTs, direction) {
14118
+ if (!cells.length) {
14119
+ return null;
14120
+ }
14121
+ const forward = direction === 'next';
14122
+ let best = null;
14123
+ let bestDelta = Infinity;
14124
+ cells.forEach((cell) => {
14125
+ if (!cell.day) {
14126
+ return;
14127
+ }
14128
+ const distance = Math.abs(cell.day.date - targetTs);
14129
+ if (distance < bestDelta) {
14130
+ best = cell;
14131
+ bestDelta = distance;
14132
+ return;
14133
+ }
14134
+ if (distance === bestDelta && best) {
14135
+ if (forward && cell.day.date > best.day.date) {
14136
+ best = cell;
14137
+ } else if (!forward && cell.day.date < best.day.date) {
14138
+ best = cell;
14139
+ }
14140
+ }
14141
+ });
14142
+ return best;
14143
+ }
14144
+
13957
14145
  /**
13958
14146
  * Gets all focusable cells across all rendered months.
13959
14147
  * @private
@@ -13970,9 +14158,9 @@ class AuroCalendar extends RangeDatepicker {
13970
14158
 
13971
14159
  /**
13972
14160
  * Sets the active cell across all months. Only one cell has tabindex="0" at a time.
13973
- * Uses imperative DOM manipulation — no Lit re-render triggered.
13974
- * Also updates ariaActiveDescendantElement on the grid wrapper so
13975
- * screen readers announce the active cell without moving DOM focus.
14161
+ * Uses imperative DOM manipulation — no Lit re-render triggered. DOM focus
14162
+ * stays on the grid wrapper; the live region (see getOrCreateLiveRegion)
14163
+ * is what announces the active cell to assistive tech.
13976
14164
  * @param {Number} date - Unix timestamp of the cell to activate.
13977
14165
  * @returns {void}
13978
14166
  */
@@ -14021,10 +14209,23 @@ class AuroCalendar extends RangeDatepicker {
14021
14209
  /**
14022
14210
  * Shows the activeCell ring when the grid gains focus.
14023
14211
  * @private
14212
+ * @param {FocusEvent} [event] - The focusin event.
14024
14213
  * @returns {void}
14025
14214
  */
14026
- handleGridFocusIn() {
14215
+ handleGridFocusIn(event) {
14027
14216
  this._gridHasFocus = true;
14217
+
14218
+ // Only apply the activeCell ring when the grid wrapper itself receives focus
14219
+ // (Tab/programmatic). When focus moves into a cell button via mousedown,
14220
+ // event.target is the cell descendant — skip the ring here. The subsequent
14221
+ // click handler calls setActiveCell on the clicked cell, which applies the
14222
+ // ring there. Without this guard, mousedown briefly flashes the ring on the
14223
+ // previously-active cell (e.g. the 1st-of-month set by month navigation
14224
+ // when the grid was not focused).
14225
+ if (event && event.target !== event.currentTarget) {
14226
+ return;
14227
+ }
14228
+
14028
14229
  const activeCell = this.getAllFocusableCells().find((cell) => cell.active);
14029
14230
  if (activeCell) {
14030
14231
  const btn = activeCell._cachedButton || activeCell.shadowRoot.querySelector('button.day');
@@ -14053,6 +14254,65 @@ class AuroCalendar extends RangeDatepicker {
14053
14254
  this.clearRangePreview();
14054
14255
  }
14055
14256
 
14257
+ /**
14258
+ * Returns a memoized Set of blackout timestamps (seconds) drawn from both
14259
+ * the legacy `disabledDays` array and the datepicker's ISO `blackoutDates`.
14260
+ * The cache invalidates when either source array's reference changes, which
14261
+ * matches Lit's own reactive identity semantics for array properties.
14262
+ * @private
14263
+ * @returns {Set<Number>}
14264
+ */
14265
+ _getBlackoutSet() {
14266
+ // Normalize non-array values to a stable `null` sentinel rather than a
14267
+ // fresh `[]` per call — otherwise the reference-identity cache key
14268
+ // (`_cachedBlackoutDisabledDays === disabledDays`) never matches on
14269
+ // subsequent calls and the Set rebuilds every time. `buildBlackoutSet`
14270
+ // already treats null/non-array as "no legacy disabledDays" via its
14271
+ // own Array.isArray gate.
14272
+ const disabledDays = Array.isArray(this.disabledDays) ? this.disabledDays : null;
14273
+ const blackoutDates = this.datepicker?.blackoutDates;
14274
+ if (this._blackoutSet &&
14275
+ this._cachedBlackoutDisabledDays === disabledDays &&
14276
+ this._cachedBlackoutDates === blackoutDates) {
14277
+ return this._blackoutSet;
14278
+ }
14279
+
14280
+ if (disabledDays && disabledDays.length > 0) {
14281
+ this._warnDisabledDaysDeprecated();
14282
+ }
14283
+
14284
+ this._blackoutSet = buildBlackoutSet(disabledDays, blackoutDates);
14285
+ this._cachedBlackoutDisabledDays = disabledDays;
14286
+ this._cachedBlackoutDates = blackoutDates;
14287
+ return this._blackoutSet;
14288
+ }
14289
+
14290
+ /**
14291
+ * Per-class flag that gates the `disabledDays` deprecation warning so it
14292
+ * fires exactly once per page no matter how many calendars or rebuild
14293
+ * cycles encounter the legacy array.
14294
+ * @private
14295
+ */
14296
+ static _warnedDisabledDaysDeprecation = false;
14297
+
14298
+ /**
14299
+ * One-time `console.debug` directing consumers from the legacy
14300
+ * `disabledDays` Unix-timestamp API to the ISO `blackoutDates` API. Fires
14301
+ * the first time `_getBlackoutSet` rebuilds from a non-empty
14302
+ * `disabledDays`; subsequent calls (on this or any other AuroCalendar
14303
+ * instance on the page) are silent.
14304
+ * @private
14305
+ * @returns {void}
14306
+ */
14307
+ _warnDisabledDaysDeprecated() {
14308
+ if (AuroCalendar._warnedDisabledDaysDeprecation) {
14309
+ return;
14310
+ }
14311
+ AuroCalendar._warnedDisabledDaysDeprecation = true;
14312
+ // eslint-disable-next-line no-console
14313
+ 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.');
14314
+ }
14315
+
14056
14316
  /**
14057
14317
  * Computes the initial active date from data properties alone — no DOM required.
14058
14318
  * Priority:
@@ -14097,21 +14357,10 @@ class AuroCalendar extends RangeDatepicker {
14097
14357
  const minTs = Number.isFinite(rawMin) ? rawMin : -Infinity;
14098
14358
  const maxTs = Number.isFinite(rawMax) ? rawMax : Infinity;
14099
14359
 
14100
- // Build a Set of blackout timestamps for O(1) lookup.
14101
- const blackoutSet = new Set(this.disabledDays.map((day) => parseInt(day, 10)));
14102
-
14103
- // Also include ISO-format blackoutDates from the datepicker if available.
14104
- // Parse YYYY-MM-DD as local date to avoid UTC shift issues.
14105
- const isoBlackouts = this.datepicker?.blackoutDates;
14106
- if (Array.isArray(isoBlackouts)) {
14107
- for (const isoStr of isoBlackouts) {
14108
- const parts = isoStr.split('-');
14109
- const ts = Math.floor(new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10)).getTime() / 1000);
14110
- if (Number.isFinite(ts)) {
14111
- blackoutSet.add(ts);
14112
- }
14113
- }
14114
- }
14360
+ // Build a Set of blackout timestamps for O(1) lookup. Memoized by the
14361
+ // identity of the source arrays so rapid month nav doesn't rebuild the
14362
+ // Set (and re-parse every ISO string) on every keypress.
14363
+ const blackoutSet = this._getBlackoutSet();
14115
14364
 
14116
14365
  /**
14117
14366
  * A date (unix timestamp in seconds, midnight-aligned) is "enabled" when
@@ -14307,8 +14556,8 @@ class AuroCalendar extends RangeDatepicker {
14307
14556
 
14308
14557
  /**
14309
14558
  * Handles arrow key navigation on the calendar grid wrapper.
14310
- * Focus stays on the grid wrapper; only ariaActiveDescendantElement
14311
- * and the visual active-cell indicator change.
14559
+ * Focus stays on the grid wrapper; only the visual active-cell indicator
14560
+ * changes. The live region announces the new active cell.
14312
14561
  * @private
14313
14562
  * @param {KeyboardEvent} event - The keyboard event.
14314
14563
  * @returns {void}
@@ -14373,21 +14622,21 @@ class AuroCalendar extends RangeDatepicker {
14373
14622
  } else {
14374
14623
  this.handlePrevMonth({ skipActiveUpdate: true });
14375
14624
  }
14376
- requestAnimationFrame(() => {
14377
- requestAnimationFrame(() => {
14378
- const cells = this.getAllFocusableCells();
14379
- const target = cells.find((cell) => cell.day && cell.day.date === targetTs);
14380
- if (target) {
14381
- this.setActiveCell(target.day.date);
14382
- this.handleCellFocused({ detail: { date: target.day.date } });
14383
- } else if (cells.length > 0) {
14384
- const fallback = navDir === 'next' ? cells[cells.length - 1] : cells[0];
14625
+ this._afterMonthRender(() => {
14626
+ const cells = this.getAllFocusableCells();
14627
+ const target = cells.find((cell) => cell.day && cell.day.date === targetTs);
14628
+ if (target) {
14629
+ this.setActiveCell(target.day.date);
14630
+ this.handleCellFocused({ detail: { date: target.day.date } });
14631
+ } else {
14632
+ const fallback = this.pickNearestCell(cells, targetTs, navDir);
14633
+ if (fallback) {
14385
14634
  this.setActiveCell(fallback.day.date);
14386
14635
  this.handleCellFocused({ detail: { date: fallback.day.date } });
14387
14636
  }
14388
- // Re-focus grid wrapper after month change re-render
14389
- this.focusActiveCell();
14390
- });
14637
+ }
14638
+ // Re-focus grid wrapper after month change re-render
14639
+ this.focusActiveCell();
14391
14640
  });
14392
14641
  }
14393
14642
  }
@@ -14413,26 +14662,20 @@ class AuroCalendar extends RangeDatepicker {
14413
14662
  } else {
14414
14663
  this.handlePrevMonth({ skipActiveUpdate: true });
14415
14664
  }
14416
- requestAnimationFrame(() => {
14417
- requestAnimationFrame(() => {
14418
- const cells = this.getAllFocusableCells();
14419
- const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
14420
- if (target) {
14421
- this.setActiveCell(target.day.date);
14422
- this.handleCellFocused({ detail: { date: target.day.date } });
14423
- } else if (cells.length > 0) {
14424
- let nearest = null;
14425
-
14426
- if (navDirection === 'next') {
14427
- [nearest] = cells;
14428
- } else {
14429
- nearest = cells[cells.length - 1];
14430
- }
14665
+ this._afterMonthRender(() => {
14666
+ const cells = this.getAllFocusableCells();
14667
+ const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
14668
+ if (target) {
14669
+ this.setActiveCell(target.day.date);
14670
+ this.handleCellFocused({ detail: { date: target.day.date } });
14671
+ } else {
14672
+ const nearest = this.pickNearestCell(cells, targetDate, navDirection);
14673
+ if (nearest) {
14431
14674
  this.setActiveCell(nearest.day.date);
14432
14675
  this.handleCellFocused({ detail: { date: nearest.day.date } });
14433
14676
  }
14434
- this.focusActiveCell();
14435
- });
14677
+ }
14678
+ this.focusActiveCell();
14436
14679
  });
14437
14680
  }
14438
14681
  }
@@ -14482,19 +14725,22 @@ class AuroCalendar extends RangeDatepicker {
14482
14725
  }
14483
14726
 
14484
14727
  this.handleNextMonth({ skipActiveUpdate: true });
14485
- requestAnimationFrame(() => {
14486
- requestAnimationFrame(() => {
14487
- const cells = this.getAllFocusableCells();
14488
- const target = cells.find((cell) => cell.day && cell.day.date === nextTs);
14489
- if (target) {
14490
- this.setActiveCell(target.day.date);
14491
- this.focusActiveCell();
14492
- } else if (cells.length > 0) {
14493
- // Fallback: first cell of the last rendered month
14494
- this.setActiveCell(cells[cells.length - 1].day.date);
14728
+ this._afterMonthRender(() => {
14729
+ const cells = this.getAllFocusableCells();
14730
+ const target = cells.find((cell) => cell.day && cell.day.date === nextTs);
14731
+ if (target) {
14732
+ this.setActiveCell(target.day.date);
14733
+ this.focusActiveCell();
14734
+ } else {
14735
+ // Same nearest-by-date fallback handleGridKeyDown uses — direct
14736
+ // `cells[length - 1]` would land on the end of the new month,
14737
+ // far from the user's intended `nextTs`.
14738
+ const fallback = this.pickNearestCell(cells, nextTs, 'next');
14739
+ if (fallback) {
14740
+ this.setActiveCell(fallback.day.date);
14495
14741
  this.focusActiveCell();
14496
14742
  }
14497
- });
14743
+ }
14498
14744
  });
14499
14745
  } else if (direction === 'prev' && this.showPrevMonthBtn) {
14500
14746
  // Navigate to previous month and focus the computed previous date.
@@ -14508,19 +14754,22 @@ class AuroCalendar extends RangeDatepicker {
14508
14754
  }
14509
14755
 
14510
14756
  this.handlePrevMonth({ skipActiveUpdate: true });
14511
- requestAnimationFrame(() => {
14512
- requestAnimationFrame(() => {
14513
- const cells = this.getAllFocusableCells();
14514
- const target = cells.find((cell) => cell.day && cell.day.date === prevTs);
14515
- if (target) {
14516
- this.setActiveCell(target.day.date);
14517
- this.focusActiveCell();
14518
- } else if (cells.length > 0) {
14519
- // Fallback: last cell of the first rendered month
14520
- this.setActiveCell(cells[0].day.date);
14757
+ this._afterMonthRender(() => {
14758
+ const cells = this.getAllFocusableCells();
14759
+ const target = cells.find((cell) => cell.day && cell.day.date === prevTs);
14760
+ if (target) {
14761
+ this.setActiveCell(target.day.date);
14762
+ this.focusActiveCell();
14763
+ } else {
14764
+ // Same nearest-by-date fallback handleGridKeyDown uses — direct
14765
+ // `cells[0]` would land on the start of the previous month, far
14766
+ // from the user's intended `prevTs`.
14767
+ const fallback = this.pickNearestCell(cells, prevTs, 'prev');
14768
+ if (fallback) {
14769
+ this.setActiveCell(fallback.day.date);
14521
14770
  this.focusActiveCell();
14522
14771
  }
14523
- });
14772
+ }
14524
14773
  });
14525
14774
  }
14526
14775
  } else if (key === 'ArrowDown' || key === 'ArrowUp') {
@@ -14548,20 +14797,22 @@ class AuroCalendar extends RangeDatepicker {
14548
14797
  } else {
14549
14798
  this.handlePrevMonth({ skipActiveUpdate: true });
14550
14799
  }
14551
- requestAnimationFrame(() => {
14552
- requestAnimationFrame(() => {
14553
- const cells = this.getAllFocusableCells();
14554
- const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
14555
- if (target) {
14556
- this.setActiveCell(target.day.date);
14557
- this.focusActiveCell();
14558
- } else if (cells.length > 0) {
14559
- // Clamp to nearest focusable cell
14560
- const nearest = navDirection === 'next' ? cells[0] : cells[cells.length - 1];
14800
+ this._afterMonthRender(() => {
14801
+ const cells = this.getAllFocusableCells();
14802
+ const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
14803
+ if (target) {
14804
+ this.setActiveCell(target.day.date);
14805
+ this.focusActiveCell();
14806
+ } else {
14807
+ // Same nearest-by-date fallback handleGridKeyDown uses — the
14808
+ // old direction-based `cells[0]`/`cells[length-1]` clamp
14809
+ // could land 25+ days from the intended target.
14810
+ const nearest = this.pickNearestCell(cells, targetDate, navDirection);
14811
+ if (nearest) {
14561
14812
  this.setActiveCell(nearest.day.date);
14562
14813
  this.focusActiveCell();
14563
14814
  }
14564
- });
14815
+ }
14565
14816
  });
14566
14817
  }
14567
14818
  }
@@ -14600,8 +14851,9 @@ class AuroCalendar extends RangeDatepicker {
14600
14851
  return;
14601
14852
  }
14602
14853
 
14603
- // With aria-activedescendant, the button no longer receives native focus,
14604
- // so we use the debounced live region for the full context announcement.
14854
+ // DOM focus stays on the grid wrapper while arrow keys move the active
14855
+ // cell, so cell buttons never receive native focus. The debounced live
14856
+ // region carries the full-context announcement instead.
14605
14857
  const announcement = this.buildFocusAnnouncement(date);
14606
14858
  this.announceFocusDebounced(announcement);
14607
14859
 
@@ -14671,10 +14923,10 @@ class AuroCalendar extends RangeDatepicker {
14671
14923
  return null;
14672
14924
  }
14673
14925
 
14674
- const departTs = startOfDay$2(parsedFrom * 1000) / 1000;
14926
+ const departTs = new Date(parsedFrom * 1000).setHours(0, 0, 0, 0) / 1000;
14675
14927
  const parsedTo = Number.parseInt(this.dateTo, 10);
14676
14928
  const hasTo = Number.isFinite(parsedTo);
14677
- const returnTs = hasTo ? startOfDay$2(parsedTo * 1000) / 1000 : null;
14929
+ const returnTs = hasTo ? new Date(parsedTo * 1000).setHours(0, 0, 0, 0) / 1000 : null;
14678
14930
 
14679
14931
  if (date === departTs) {
14680
14932
  return this.datepicker.rangeLabelStart || 'range start';
@@ -14688,36 +14940,22 @@ class AuroCalendar extends RangeDatepicker {
14688
14940
  if (hasTo && date > departTs && date < returnTs) {
14689
14941
  return this.datepicker.rangeLabelInRange || 'in range';
14690
14942
  }
14943
+ if (!hasTo && date > departTs) {
14944
+ return this.datepicker.rangeLabelEndPreview || 'previewing range end';
14945
+ }
14691
14946
  return this.datepicker.rangeLabelAfterRange || 'after range';
14692
14947
  }
14693
14948
 
14694
14949
  /**
14695
- * Checks whether a given date is a blackout date.
14950
+ * Checks whether a given date is a blackout date. Delegates to the
14951
+ * memoized `_getBlackoutSet` so the YYYY-MM-DD parsing and the
14952
+ * legacy/ISO merge rules live in exactly one place (see `blackoutUtils.js`).
14696
14953
  * @private
14697
14954
  * @param {Number} dateTs - Unix timestamp (seconds).
14698
14955
  * @returns {Boolean} True if the date is blacked out.
14699
14956
  */
14700
14957
  isDateBlackout(dateTs) {
14701
- // Check legacy disabledDays.
14702
- if (Array.isArray(this.disabledDays) && this.disabledDays.length > 0) {
14703
- if (this.disabledDays.findIndex((day) => parseInt(day, 10) === dateTs) !== -1) {
14704
- return true;
14705
- }
14706
- }
14707
-
14708
- // Check ISO blackoutDates.
14709
- const blackoutDates = this.datepicker?.blackoutDates;
14710
- if (Array.isArray(blackoutDates) && blackoutDates.length > 0) {
14711
- const date = new Date(dateTs * 1000);
14712
- const yyyy = date.getFullYear();
14713
- const mm = String(date.getMonth() + 1).padStart(2, '0');
14714
- const dd = String(date.getDate()).padStart(2, '0');
14715
- if (blackoutDates.includes(`${yyyy}-${mm}-${dd}`)) {
14716
- return true;
14717
- }
14718
- }
14719
-
14720
- return false;
14958
+ return this._getBlackoutSet().has(dateTs);
14721
14959
  }
14722
14960
 
14723
14961
  /**
@@ -14884,9 +15122,34 @@ class AuroCalendar extends RangeDatepicker {
14884
15122
  // the last one.
14885
15123
  if (this._announceRafId) {
14886
15124
  cancelAnimationFrame(this._announceRafId);
15125
+ this._announceRafId = null;
14887
15126
  }
15127
+ this._deliverAnnouncement(dateStr, 0);
15128
+ }
15129
+
15130
+ /**
15131
+ * Writes `dateStr` to the live region. If the dropdown's dialog hasn't
15132
+ * mounted yet (so getOrCreateLiveRegion can't attach), retries on the
15133
+ * next animation frame up to MAX_LIVE_REGION_RETRIES instead of silently
15134
+ * dropping the announcement. The retry uses the same `_announceRafId`
15135
+ * the double-rAF below uses, so a newer announceSelection call (or
15136
+ * disconnectedCallback) cancels any in-flight retry.
15137
+ * @private
15138
+ * @param {String} dateStr - The localized date string to announce.
15139
+ * @param {Number} attempts - Number of prior retry attempts.
15140
+ * @returns {void}
15141
+ */
15142
+ _deliverAnnouncement(dateStr, attempts) {
14888
15143
  const liveRegion = this.getOrCreateLiveRegion();
14889
15144
  if (!liveRegion) {
15145
+ const MAX_LIVE_REGION_RETRIES = 10;
15146
+ if (attempts < MAX_LIVE_REGION_RETRIES) {
15147
+ this._announceRafId = requestAnimationFrame(() => {
15148
+ this._deliverAnnouncement(dateStr, attempts + 1);
15149
+ });
15150
+ } else {
15151
+ this._announceRafId = null;
15152
+ }
14890
15153
  return;
14891
15154
  }
14892
15155
 
@@ -15072,7 +15335,7 @@ class AuroCalendar extends RangeDatepicker {
15072
15335
  </button>
15073
15336
  ` : undefined}
15074
15337
  </div>
15075
- <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}">
15338
+ <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}">
15076
15339
  ${this.renderAllCalendars()}
15077
15340
  </div>
15078
15341
  </div>
@@ -18981,7 +19244,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$1 {
18981
19244
  }
18982
19245
  };
18983
19246
 
18984
- var formkitVersion$1 = '202606252337';
19247
+ var formkitVersion$1 = '202606291440';
18985
19248
 
18986
19249
  let AuroElement$2 = class AuroElement extends i$1 {
18987
19250
  static get properties() {
@@ -30706,13 +30969,6 @@ class AuroInputUtilities {
30706
30969
  * @returns {string | undefined}
30707
30970
  */
30708
30971
  toFormattedValue(valueObject, format) {
30709
- // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
30710
- // `format` argument has to fail gracefully rather than throw on
30711
- // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
30712
- // as "no format → no display value".
30713
- if (!format) {
30714
- return undefined;
30715
- }
30716
30972
  const normalizedFormat = format.toLowerCase();
30717
30973
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
30718
30974
 
@@ -30863,18 +31119,79 @@ class BaseInput extends AuroElement$1 {
30863
31119
  constructor() {
30864
31120
  super();
30865
31121
 
30866
- // Single-source initialization. Alphabetized so duplicate or stale
30867
- // defaults are immediately obvious on a diff. Every field is assigned
30868
- // exactly once here (previously the constructor + the old
30869
- // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
30870
- // fields and double-allocated `util` and `validation`, discarding the
30871
- // first instance). `validation` is now allocated exactly once; `util`
30872
- // is seeded here with an en-US default and then rebuilt in
30873
- // `connectedCallback` once the consumer-resolved locale is available,
30874
- // so a parent (datepicker/combobox) calling `validate()` synchronously
30875
- // during its own update cycle sees a populated util instance.
31122
+ this.appearance = "default";
31123
+ this.disabled = false;
31124
+ this.layout = 'classic';
31125
+ this.locale = 'en-US';
31126
+ this.max = undefined;
31127
+ this._maxObject = undefined;
31128
+ this.maxLength = undefined;
31129
+ this.min = undefined;
31130
+ this._minObject = undefined;
31131
+ this.minLength = undefined;
31132
+ this.required = false;
31133
+ this.onDark = false;
31134
+ this.setCustomValidityForType = undefined;
31135
+ this.size = 'lg';
31136
+ this.shape = 'classic';
31137
+ this.value = undefined;
31138
+ this._valueObject = undefined;
31139
+
31140
+ this._initializePrivateDefaults();
31141
+ }
31142
+
31143
+ /**
31144
+ * Internal Defaults.
31145
+ * @private
31146
+ * @returns {void}
31147
+ */
31148
+ _initializePrivateDefaults() {
30876
31149
  this.activeLabel = false;
30877
- /** @private */
31150
+ this.appearance = "default";
31151
+ this.icon = false;
31152
+ this.disabled = false;
31153
+ this.dvInputOnly = false;
31154
+ this.hideLabelVisually = false;
31155
+ this.max = undefined;
31156
+ this.maxLength = undefined;
31157
+ this.min = undefined;
31158
+ this.minLength = undefined;
31159
+ this.noValidate = false;
31160
+ this.onDark = false;
31161
+ this.required = false;
31162
+ this.setCustomValidityForType = undefined;
31163
+
31164
+ // Used for storing raw values returned from input mask.
31165
+ this._rawMaskValue = undefined;
31166
+
31167
+ /**
31168
+ * @private
31169
+ */
31170
+ this.layout = 'classic';
31171
+
31172
+ /**
31173
+ * @private
31174
+ */
31175
+ this.shape = 'classic';
31176
+
31177
+ /**
31178
+ * @private
31179
+ */
31180
+ this.size = 'lg';
31181
+
31182
+ this.touched = false;
31183
+ this.util = new AuroInputUtilities({
31184
+ locale: "en-US",
31185
+ format: this.format
31186
+ });
31187
+ this.validation = new AuroFormValidation();
31188
+ this.inputIconName = undefined;
31189
+ this.showPassword = false;
31190
+ this.validationCCLength = undefined;
31191
+ this.hasValue = false;
31192
+ this.label = 'Input label is undefined';
31193
+
31194
+
30878
31195
  this.allowedInputTypes = [
30879
31196
  "text",
30880
31197
  "number",
@@ -30883,8 +31200,7 @@ class BaseInput extends AuroElement$1 {
30883
31200
  "credit-card",
30884
31201
  "tel"
30885
31202
  ];
30886
- this.appearance = "default";
30887
- /** @private */
31203
+ this.icon = false;
30888
31204
  this.dateFormatMap = {
30889
31205
  'mm/dd/yyyy': 'dateMMDDYYYY',
30890
31206
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -30901,57 +31217,27 @@ class BaseInput extends AuroElement$1 {
30901
31217
  'dd/mm': 'dateDDMM',
30902
31218
  'mm/dd': 'dateMMDD'
30903
31219
  };
30904
- this.disabled = false;
30905
- /** @private */
30906
31220
  this.domHandler = new DomHandler();
30907
31221
  this.dvInputOnly = false;
30908
31222
  this.hasValue = false;
30909
- this.hideLabelVisually = false;
30910
- this.icon = false;
30911
- /** @private */
30912
31223
  this.inputIconName = undefined;
30913
- /** @private */
30914
31224
  this.label = 'Input label is undefined';
30915
- this.layout = 'classic';
30916
- this.locale = 'en-US';
30917
- this.max = undefined;
30918
- this._maxObject = undefined;
30919
- this.maxLength = undefined;
30920
- this.min = undefined;
30921
- this._minObject = undefined;
30922
- this.minLength = undefined;
30923
31225
  this.noValidate = false;
30924
- this.onDark = false;
30925
- // Raw values returned from the input mask before model normalization.
30926
- this._rawMaskValue = undefined;
30927
- this.required = false;
30928
- this.setCustomValidityForType = undefined;
30929
- // Credit Card is intentionally excluded — its mask manages the cursor
30930
- // itself, and listing it here caused cursor placement issues in Safari.
30931
- /** @private */
31226
+ this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
30932
31227
  this.setSelectionInputTypes = [
30933
31228
  "text",
30934
31229
  "password",
30935
31230
  "email"
30936
- ];
30937
- this.shape = 'classic';
30938
- /** @private */
31231
+ ]; // Credit Card is not included as this caused cursor placement issues in Safari.
30939
31232
  this.showPassword = false;
30940
- this.size = 'lg';
30941
31233
  this.touched = false;
30942
- /** @private */
30943
31234
  this.uniqueId = new UniqueId().create();
30944
- /** @private */
30945
31235
  this.util = new AuroInputUtilities({
30946
31236
  locale: this.locale,
30947
31237
  format: this.format
30948
31238
  });
30949
- /** @private */
30950
31239
  this.validation = new AuroFormValidation();
30951
- /** @private */
30952
31240
  this.validationCCLength = undefined;
30953
- this.value = undefined;
30954
- this._valueObject = undefined;
30955
31241
  }
30956
31242
 
30957
31243
  // function to define props used within the scope of this component
@@ -31499,15 +31785,6 @@ class BaseInput extends AuroElement$1 {
31499
31785
 
31500
31786
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
31501
31787
 
31502
- // Normalize the format token to lowercase so case-mixed values supplied
31503
- // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
31504
- // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
31505
- // format silently misses the map and leaves `setCustomValidityForType`
31506
- // unset.
31507
- if (this.format) {
31508
- this.format = this.format.toLowerCase();
31509
- }
31510
-
31511
31788
  // use validity message override if declared when initializing the component
31512
31789
  if (this.hasAttribute('setCustomValidity')) {
31513
31790
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -31941,38 +32218,6 @@ class BaseInput extends AuroElement$1 {
31941
32218
  this.touched = true;
31942
32219
  this.validation.validate(this);
31943
32220
  }
31944
-
31945
- // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
31946
- // update that can re-render the input and reset the native cursor; we
31947
- // capture the caret position before that update commits and restore it
31948
- // via `setSelectionRange` once the update has flushed. Gated on
31949
- // `setSelectionInputTypes` so credit-card (and other masked types whose
31950
- // formatter manages the cursor itself) doesn't get a competing write.
31951
- // Capture the caret position INSIDE the gate — reading `selectionStart`
31952
- // on input types that don't support text selection (number, email in
31953
- // some browsers) throws InvalidStateError, which would crash all input
31954
- // handling. Wrap the read in try/catch belt-and-suspenders even though
31955
- // the gated types currently support it, since the list is a public
31956
- // property a consumer could mutate.
31957
- if (this.setSelectionInputTypes.includes(this.type)) {
31958
- let selectionStart;
31959
- try {
31960
- selectionStart = this.inputElement.selectionStart;
31961
- } catch (error) { // eslint-disable-line no-unused-vars
31962
- return;
31963
- }
31964
- if (typeof selectionStart !== 'number') {
31965
- return;
31966
- }
31967
- this.updateComplete.then(() => {
31968
- try {
31969
- this.inputElement.setSelectionRange(selectionStart, selectionStart);
31970
- } catch (error) { // eslint-disable-line no-unused-vars
31971
- // Some input types (number/email in certain UAs) throw on
31972
- // setSelectionRange; swallow and let the native cursor stand.
31973
- }
31974
- });
31975
- }
31976
32221
  }
31977
32222
 
31978
32223
  /**
@@ -32599,7 +32844,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$1 {
32599
32844
  }
32600
32845
  };
32601
32846
 
32602
- var formkitVersion = '202606252337';
32847
+ var formkitVersion = '202606291440';
32603
32848
 
32604
32849
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
32605
32850
  // See LICENSE in the project root for license information.
@@ -33102,7 +33347,6 @@ class AuroInput extends BaseInput {
33102
33347
  <${this.buttonTag}
33103
33348
  @click="${this.handleClickShowPassword}"
33104
33349
  appearance="${this.onDark ? 'inverse' : this.appearance}"
33105
- aria-pressed="${this.showPassword ? 'true' : 'false'}"
33106
33350
  class="notificationBtn passwordBtn"
33107
33351
  shape="circle"
33108
33352
  size="sm"
@@ -33176,29 +33420,25 @@ class AuroInput extends BaseInput {
33176
33420
  * @returns {html} - Returns HTML for the help text and error message.
33177
33421
  */
33178
33422
  renderHtmlHelpText() {
33179
- // Single `<p>` with stable identity across validity transitions —
33180
- // previously two distinct templates (valid vs invalid) caused Lit to
33181
- // replace the node entirely on a flip, and VoiceOver wouldn't
33182
- // re-announce because the live-region element it was watching had been
33183
- // removed and a new one inserted. Keeping one node means the `role`,
33184
- // `aria-live`, and text content all change in-place, which AT does
33185
- // observe and announce.
33186
- const isError = this.validity && this.validity !== 'valid';
33187
33423
  return u$a`
33188
- <${this.helpTextTag}
33189
- appearance="${this.onDark ? 'inverse' : this.appearance}"
33190
- ?error=${isError}>
33191
- <p
33192
- id="${this.uniqueId}"
33193
- part="helpText"
33194
- role="${o$2(isError ? 'alert' : undefined)}"
33195
- aria-live="${o$2(isError ? 'assertive' : undefined)}">
33196
- ${isError
33197
- ? this.errorMessage
33198
- : u$a`<slot name="helpText">${this.getHelpText()}</slot>`
33199
- }
33200
- </p>
33201
- </${this.helpTextTag}>
33424
+ ${!this.validity || this.validity === undefined || this.validity === 'valid'
33425
+ ? u$a`
33426
+ <${this.helpTextTag}
33427
+ appearance="${this.onDark ? 'inverse' : this.appearance}">
33428
+ <p id="${this.uniqueId}" part="helpText">
33429
+ <slot name="helpText">${this.getHelpText()}</slot>
33430
+ </p>
33431
+ </${this.helpTextTag}>
33432
+ `
33433
+ : u$a`
33434
+ <${this.helpTextTag} error
33435
+ appearance="${this.onDark ? 'inverse' : this.appearance}">
33436
+ <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
33437
+ ${this.errorMessage}
33438
+ </p>
33439
+ </${this.helpTextTag}>
33440
+ `
33441
+ }
33202
33442
  `;
33203
33443
  }
33204
33444
 
@@ -33345,15 +33585,6 @@ function formatISODate(isoStr, format) {
33345
33585
  try {
33346
33586
  const date = dateFormatter.stringToDateInstance(isoStr);
33347
33587
 
33348
- // `stringToDateInstance` returns an `Invalid Date` for malformed strings
33349
- // and `null` for non-string input — it does NOT throw. Without this
33350
- // guard, `getFullYear()`/`getMonth()`/`getDate()` on an Invalid Date
33351
- // yield `NaN`, and `String(NaN).padStart(4, '0')` produces literals
33352
- // like "0NaN/0NaN/0NaN" instead of `undefined`.
33353
- if (!(date instanceof Date) || Number.isNaN(date.getTime())) {
33354
- return undefined;
33355
- }
33356
-
33357
33588
  const year = String(date.getFullYear()).padStart(4, '0');
33358
33589
  const month = String(date.getMonth() + 1).padStart(2, '0');
33359
33590
  const day = String(date.getDate()).padStart(2, '0');
@@ -33364,10 +33595,7 @@ function formatISODate(isoStr, format) {
33364
33595
  replace(/mm/iu, month).
33365
33596
  replace(/dd/iu, day);
33366
33597
  } catch (err) {
33367
- // Defensive: the Date-returning path is guarded above, but `parseDate`
33368
- // (inside `stringToDateInstance`) could throw on pathological input
33369
- // future-library-versions might introduce. Treat any thrown error as
33370
- // "not a valid date" and return undefined.
33598
+ // If the input string is not a valid date, return undefined
33371
33599
  return undefined;
33372
33600
  }
33373
33601
  }
@@ -34093,6 +34321,7 @@ class AuroDatePicker extends AuroElement {
34093
34321
  this.rangeLabelBeforeRange = 'before range';
34094
34322
  this.rangeLabelInRange = 'in range';
34095
34323
  this.rangeLabelAfterRange = 'after range';
34324
+ this.rangeLabelEndPreview = 'previewing range end';
34096
34325
  this.blackoutDates = [];
34097
34326
  this.blackoutLabel = 'unavailable';
34098
34327
  this.navLabelPrevMonth = 'Previous month';
@@ -34192,6 +34421,22 @@ class AuroDatePicker extends AuroElement {
34192
34421
  */
34193
34422
  this.handleClick = this.handleClick.bind(this);
34194
34423
 
34424
+ /**
34425
+ * Single AbortController shared by every listener registered in the
34426
+ * configure* methods. Lets disconnectedCallback tear all of them down
34427
+ * with one abort() call.
34428
+ *
34429
+ * The genuine leak risk is the listeners attached to children that can
34430
+ * outlive the host if they get reparented — `this.dropdown`,
34431
+ * `this.calendar`, and the inputs inside the dropdown's slot.
34432
+ * Listeners attached to `this` (e.g. focusin/focusout on the host)
34433
+ * form a self-contained reference graph that the GC can collect with
34434
+ * the host anyway, but they share the same signal so the cleanup
34435
+ * pattern stays uniform across all configure* sites.
34436
+ * @private
34437
+ */
34438
+ this._listenerAbortController = new AbortController();
34439
+
34195
34440
  /**
34196
34441
  * @private
34197
34442
  */
@@ -34240,6 +34485,7 @@ class AuroDatePicker extends AuroElement {
34240
34485
 
34241
34486
  /**
34242
34487
  * Label announced for blackout (disabled but in-range) date cells.
34488
+ * @default 'unavailable'
34243
34489
  */
34244
34490
  blackoutLabel: {
34245
34491
  type: String,
@@ -34256,6 +34502,7 @@ class AuroDatePicker extends AuroElement {
34256
34502
 
34257
34503
  /**
34258
34504
  * Accessible label for the calendar grid containing the days of the month.
34505
+ * @default 'Calendar days of the month'
34259
34506
  */
34260
34507
  calendarGridLabel: {
34261
34508
  type: String,
@@ -34418,6 +34665,7 @@ class AuroDatePicker extends AuroElement {
34418
34665
 
34419
34666
  /**
34420
34667
  * Accessible label for the next month navigation button.
34668
+ * @default 'Next month'
34421
34669
  */
34422
34670
  navLabelNextMonth: {
34423
34671
  type: String,
@@ -34426,6 +34674,7 @@ class AuroDatePicker extends AuroElement {
34426
34674
 
34427
34675
  /**
34428
34676
  * Accessible label for the previous month navigation button.
34677
+ * @default 'Previous month'
34429
34678
  */
34430
34679
  navLabelPrevMonth: {
34431
34680
  type: String,
@@ -34503,7 +34752,11 @@ class AuroDatePicker extends AuroElement {
34503
34752
  },
34504
34753
 
34505
34754
  /**
34506
- * Label announced for cells after the range (or after start when no end is selected).
34755
+ * Label announced for cells after a fully selected range (both
34756
+ * `dateFrom` and `dateTo` are set). While a range is still being
34757
+ * picked (`dateFrom` set, `dateTo` unset), focused cells past the
34758
+ * start use `rangeLabelEndPreview` instead.
34759
+ * @default 'after range'
34507
34760
  */
34508
34761
  rangeLabelAfterRange: {
34509
34762
  type: String,
@@ -34512,6 +34765,7 @@ class AuroDatePicker extends AuroElement {
34512
34765
 
34513
34766
  /**
34514
34767
  * Label announced for cells before the range start.
34768
+ * @default 'before range'
34515
34769
  */
34516
34770
  rangeLabelBeforeRange: {
34517
34771
  type: String,
@@ -34520,14 +34774,27 @@ class AuroDatePicker extends AuroElement {
34520
34774
 
34521
34775
  /**
34522
34776
  * Label announced for the range end date cell.
34777
+ * @default 'range end'
34523
34778
  */
34524
34779
  rangeLabelEnd: {
34525
34780
  type: String,
34526
34781
  reflect: true
34527
34782
  },
34528
34783
 
34784
+ /**
34785
+ * Label announced for the focused cell while previewing a range end
34786
+ * (dateFrom set, dateTo not yet selected). Tells AT users that
34787
+ * pressing Enter would commit this cell as the range end.
34788
+ * @default 'previewing range end'
34789
+ */
34790
+ rangeLabelEndPreview: {
34791
+ type: String,
34792
+ reflect: true
34793
+ },
34794
+
34529
34795
  /**
34530
34796
  * Label announced for cells within the selected range.
34797
+ * @default 'in range'
34531
34798
  */
34532
34799
  rangeLabelInRange: {
34533
34800
  type: String,
@@ -34536,6 +34803,7 @@ class AuroDatePicker extends AuroElement {
34536
34803
 
34537
34804
  /**
34538
34805
  * Label announced for the range start date cell.
34806
+ * @default 'range start'
34539
34807
  */
34540
34808
  rangeLabelStart: {
34541
34809
  type: String,
@@ -34543,7 +34811,7 @@ class AuroDatePicker extends AuroElement {
34543
34811
  },
34544
34812
 
34545
34813
  /**
34546
- * Dates that the user should have for reference as part of their decision making when selecting a date.
34814
+ * Dates that the user should have for reference as part of their decision-making when selecting a date.
34547
34815
  * This should be a JSON string array of ISO date strings (`YYYY-MM-DD`).
34548
34816
  */
34549
34817
  referenceDates: {
@@ -34900,10 +35168,26 @@ class AuroDatePicker extends AuroElement {
34900
35168
  // ─── Vendor calendar time conversions ─────────────────────────────────────
34901
35169
 
34902
35170
  /**
34903
- * Converts a Unix timestamp (seconds) from the vendor calendar to an ISO date string.
35171
+ * Converts a Unix timestamp (seconds) from the vendored range-datepicker
35172
+ * (`src/vendor/wc-range-datepicker/day.js`) to an ISO date string.
35173
+ *
35174
+ * Timezone contract:
35175
+ * - INPUT: `time` is assumed to be the seconds-since-epoch of **local
35176
+ * midnight** for the intended calendar day. The vendor's Day constructor
35177
+ * builds it via `date-fns format(date, 't')` from a locally-constructed
35178
+ * Date, so this assumption currently holds end-to-end.
35179
+ * - OUTPUT: `dateFormatter.toISOFormatString` reads the Date's local
35180
+ * getFullYear/getMonth/getDate components, so the returned YYYY-MM-DD
35181
+ * string matches the local calendar day.
35182
+ *
35183
+ * If the vendor ever switches to emitting UTC-midnight timestamps, this
35184
+ * conversion will silently shift the returned date by one day in zones
35185
+ * west of UTC. Any vendor swap should re-verify this contract; the TZ
35186
+ * regression suite (`npm run test:hst`, UTC-10) will catch the symptom.
35187
+ *
34904
35188
  * @private
34905
- * @param {number} time - Unix timestamp in seconds.
34906
- * @returns {string} ISO date string (yyyy-mm-dd).
35189
+ * @param {number} time - Unix timestamp (seconds), local midnight of the day.
35190
+ * @returns {string} ISO date string (yyyy-mm-dd) reflecting the local calendar day.
34907
35191
  */
34908
35192
  convertWcTimeToDate(time) {
34909
35193
  return dateFormatter$1.toISOFormatString(new Date(time * 1000));
@@ -35005,8 +35289,8 @@ class AuroDatePicker extends AuroElement {
35005
35289
  }
35006
35290
  }
35007
35291
 
35008
- // Focus the calendar grid wrapper (aria-activedescendant handles
35009
- // the SR announcement for the active cell).
35292
+ // Focus the calendar grid wrapper. The live region (announced just
35293
+ // below) handles the SR announcement for the active cell.
35010
35294
  if (activeCell) {
35011
35295
  this.calendar.focusActiveCell();
35012
35296
 
@@ -35056,11 +35340,13 @@ class AuroDatePicker extends AuroElement {
35056
35340
  this.dropdown.bibDialogLabel = labelElement.textContent.trim() || undefined;
35057
35341
  }
35058
35342
 
35343
+ const { signal } = this._listenerAbortController;
35344
+
35059
35345
  this.dropdown.addEventListener('auroDropdown-triggerClick', () => {
35060
35346
  if (!this.isPopoverVisible) {
35061
35347
  this.dropdown.show();
35062
35348
  }
35063
- });
35349
+ }, { signal });
35064
35350
 
35065
35351
  this.dropdown.addEventListener('auroDropdown-toggled', () => {
35066
35352
  this.notifyDatepickerToggled();
@@ -35078,7 +35364,7 @@ class AuroDatePicker extends AuroElement {
35078
35364
  if (this.valueObject) {
35079
35365
  this.centralDate = this.value;
35080
35366
  } else if (!this.centralDate && !this.calendarStartDate && !this.minDate) {
35081
- this.centralDate = new Date();
35367
+ this.centralDate = dateFormatter$1.toISOFormatString(new Date());
35082
35368
  }
35083
35369
  }
35084
35370
 
@@ -35158,7 +35444,7 @@ class AuroDatePicker extends AuroElement {
35158
35444
  this.forceScrollOnNextMobileCalendarRender = false;
35159
35445
  }, 0);
35160
35446
  }
35161
- });
35447
+ }, { signal });
35162
35448
 
35163
35449
  // Handle responsive strategy changes while the dropdown is open
35164
35450
  // (e.g. resizing from desktop → mobile or vice versa).
@@ -35205,7 +35491,7 @@ class AuroDatePicker extends AuroElement {
35205
35491
  });
35206
35492
  });
35207
35493
  }
35208
- });
35494
+ }, { signal });
35209
35495
  }
35210
35496
 
35211
35497
  /**
@@ -35218,6 +35504,8 @@ class AuroDatePicker extends AuroElement {
35218
35504
 
35219
35505
  this.inputList = [...this.dropdown.querySelectorAll(this.inputTag._$litStatic$)];
35220
35506
 
35507
+ const { signal } = this._listenerAbortController;
35508
+
35221
35509
  this.inputList.forEach((input, index) => {
35222
35510
  input.addEventListener('input', (event) => {
35223
35511
  event.stopPropagation();
@@ -35229,7 +35517,7 @@ class AuroDatePicker extends AuroElement {
35229
35517
  }
35230
35518
 
35231
35519
  this.notifyValueChanged();
35232
- });
35520
+ }, { signal });
35233
35521
 
35234
35522
  input.addEventListener('auroFormElement-validated', (evt) => {
35235
35523
  // not to bubble up input's validated event.
@@ -35245,7 +35533,7 @@ class AuroDatePicker extends AuroElement {
35245
35533
  this.validity = evt.detail.validity;
35246
35534
  this.errorMessage = evt.detail.message;
35247
35535
  }
35248
- });
35536
+ }, { signal });
35249
35537
  });
35250
35538
  }
35251
35539
 
@@ -35259,19 +35547,32 @@ class AuroDatePicker extends AuroElement {
35259
35547
  this.calendar.datepicker = this;
35260
35548
  this.calendar.dropdown = this.dropdown;
35261
35549
 
35550
+ const { signal } = this._listenerAbortController;
35551
+
35262
35552
  this.calendar.addEventListener('auroCalendar-dateSelected', () => {
35263
- if (this.inputList[0].value !== this.calendar.dateFrom && this.calendar.dateFrom !== undefined) {
35264
- this.inputList[0].value = this.convertWcTimeToDate(this.calendar.dateFrom);
35553
+ // Compare the input's ISO value against the *converted* calendar
35554
+ // timestamp (the vendor's `dateFrom`/`dateTo` are Unix-seconds
35555
+ // strings — comparing the input ISO directly against them would
35556
+ // never match, so the write would fire on every event and emit
35557
+ // redundant input/change activity).
35558
+ if (this.calendar.dateFrom !== undefined) {
35559
+ const fromIso = this.convertWcTimeToDate(this.calendar.dateFrom);
35560
+ if (this.inputList[0].value !== fromIso) {
35561
+ this.inputList[0].value = fromIso;
35562
+ }
35265
35563
  }
35266
35564
 
35267
- if (this.inputList[1] && this.calendar.dateTo && this.inputList[1].value !== this.calendar.dateTo) {
35268
- this.inputList[1].value = this.convertWcTimeToDate(this.calendar.dateTo);
35565
+ if (this.inputList[1] && this.calendar.dateTo) {
35566
+ const toIso = this.convertWcTimeToDate(this.calendar.dateTo);
35567
+ if (this.inputList[1].value !== toIso) {
35568
+ this.inputList[1].value = toIso;
35569
+ }
35269
35570
  }
35270
- });
35571
+ }, { signal });
35271
35572
 
35272
35573
  this.calendar.addEventListener('auroCalendar-dismissRequest', () => {
35273
35574
  this.dropdown.hide();
35274
- });
35575
+ }, { signal });
35275
35576
 
35276
35577
  this.calendar.addEventListener('auroCalendar-centralDateChanged', (event) => {
35277
35578
  const match = this.centralDateObject && this.util.datesMatch(event.detail.date, this.centralDateObject);
@@ -35281,7 +35582,7 @@ class AuroDatePicker extends AuroElement {
35281
35582
  }
35282
35583
 
35283
35584
  this.notifyMonthChanged(event);
35284
- });
35585
+ }, { signal });
35285
35586
  }
35286
35587
 
35287
35588
  /**
@@ -35290,10 +35591,17 @@ class AuroDatePicker extends AuroElement {
35290
35591
  * @returns {void}
35291
35592
  */
35292
35593
  configureDatepicker() {
35594
+ // These listeners are on `this` (the host), so they would GC with the
35595
+ // host even without the abort signal — see the leak rationale on
35596
+ // `_listenerAbortController`. The signal is still passed for uniform
35597
+ // cleanup semantics with the child-element listeners in the other
35598
+ // configure* methods.
35599
+ const { signal } = this._listenerAbortController;
35600
+
35293
35601
  this.addEventListener('focusin', () => {
35294
35602
  this.touched = true;
35295
35603
  this.hasFocus = true;
35296
- });
35604
+ }, { signal });
35297
35605
 
35298
35606
  this.addEventListener('focusout', () => {
35299
35607
  this.hasFocus = false;
@@ -35305,7 +35613,7 @@ class AuroDatePicker extends AuroElement {
35305
35613
  if (!this.matches(':focus-within')) {
35306
35614
  this.validate();
35307
35615
  }
35308
- });
35616
+ }, { signal });
35309
35617
 
35310
35618
  if (this.valueObject) {
35311
35619
  this.calendar.dateFrom = this.convertToWcValidTime(this.valueObject);
@@ -35503,6 +35811,41 @@ class AuroDatePicker extends AuroElement {
35503
35811
  return this.validity !== undefined && this.validity !== 'valid';
35504
35812
  }
35505
35813
 
35814
+ /**
35815
+ * Per-class dedup set used by `_warnInvalidLocale`. Static so the dedup
35816
+ * spans every datepicker instance on the page; lives on the class (not
35817
+ * at module scope) so it stays an encapsulated implementation detail of
35818
+ * this component and does not interfere with WCA's class-JSDoc
35819
+ * attachment.
35820
+ * @private
35821
+ */
35822
+ static _warnedInvalidLocales = new Set();
35823
+
35824
+ /**
35825
+ * Logs a one-time `console.debug` when an unsupported locale falls back to
35826
+ * en-US. Deduped by the offending tag so noisy re-renders that resurface
35827
+ * the same bad value stay quiet, but each new bad value still signals so
35828
+ * consumers can spot the typo or missing tag.
35829
+ * @private
35830
+ * @param {string|undefined} badLocale - The locale value that failed.
35831
+ * @returns {void}
35832
+ */
35833
+ _warnInvalidLocale(badLocale) {
35834
+ // Stringify without coalescing — `String(undefined)` / `String(null)`
35835
+ // surface the actual offending value in the log, instead of the
35836
+ // ambiguous `Locale ""` that `String(badLocale ?? '')` would produce.
35837
+ // Dedup still works correctly because each unique stringification
35838
+ // becomes its own Set entry.
35839
+ const key = String(badLocale);
35840
+ const seen = AuroDatePicker._warnedInvalidLocales;
35841
+ if (seen.has(key)) {
35842
+ return;
35843
+ }
35844
+ seen.add(key);
35845
+ // eslint-disable-next-line no-console
35846
+ 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".`);
35847
+ }
35848
+
35506
35849
  /**
35507
35850
  * Lifecycle method to check if the locale is valid.
35508
35851
  * @ignore
@@ -35513,10 +35856,15 @@ class AuroDatePicker extends AuroElement {
35513
35856
  if (changedProperties.has('locale')) {
35514
35857
  try {
35515
35858
  const supported = Intl.DateTimeFormat.supportedLocalesOf([this.locale], { localeMatcher: 'lookup' });
35516
- this._validLocale = supported.length > 0 ? this.locale : 'en-US';
35859
+ if (supported.length > 0) {
35860
+ this._validLocale = this.locale;
35861
+ } else {
35862
+ this._validLocale = 'en-US';
35863
+ this._warnInvalidLocale(this.locale);
35864
+ }
35517
35865
  } catch {
35518
- console.debug(`[AuroDatePicker] The locale "${this.locale}" is not valid. Falling back to "en-US".`); // eslint-disable-line no-console
35519
35866
  this._validLocale = 'en-US';
35867
+ this._warnInvalidLocale(this.locale);
35520
35868
  }
35521
35869
 
35522
35870
  const previousLocaleFormat = getDateFormatFromLocale$1(changedProperties.get('locale'));
@@ -35598,8 +35946,6 @@ class AuroDatePicker extends AuroElement {
35598
35946
  // Skip centralDate update when user clicked a cell in range mode
35599
35947
  // to prevent the displayed months from shifting
35600
35948
  this.centralDate = this.value;
35601
- //TODO: TEST THIS CHANGE
35602
- // this.calendarRenderUtil.updateCentralDate(this, this.value);
35603
35949
  }
35604
35950
 
35605
35951
  this.setHasValue();
@@ -35659,8 +36005,6 @@ class AuroDatePicker extends AuroElement {
35659
36005
  // Skip centralDate update when user clicked a cell in range mode
35660
36006
  // to prevent the displayed months from shifting
35661
36007
  this.centralDate = this.valueEnd;
35662
- // TODO: TEST THIS CHANGE
35663
- // this.calendarRenderUtil.updateCentralDate(this, this.formattedValueEnd);
35664
36008
  }
35665
36009
 
35666
36010
  this.validate();
@@ -35802,7 +36146,7 @@ class AuroDatePicker extends AuroElement {
35802
36146
  * @returns {void}
35803
36147
  */
35804
36148
  configureClickHandler() {
35805
- this.addEventListener('click', this.handleClick);
36149
+ this.addEventListener('click', this.handleClick, { signal: this._listenerAbortController.signal });
35806
36150
  }
35807
36151
 
35808
36152
  firstUpdated() {
@@ -35810,6 +36154,15 @@ class AuroDatePicker extends AuroElement {
35810
36154
  // Add the tag name as an attribute if it is different than the component name
35811
36155
  this.runtimeUtils.handleComponentTagRename(this, 'auro-datepicker');
35812
36156
 
36157
+ // If the element was disconnected before this first render finished,
36158
+ // disconnectedCallback's microtask already aborted the controller. The
36159
+ // connectedCallback reinit guard skips that case because `hasUpdated`
36160
+ // is still false. Mint a fresh controller here so configure* registers
36161
+ // listeners against a live signal.
36162
+ if (this._listenerAbortController.signal.aborted) {
36163
+ this._listenerAbortController = new AbortController();
36164
+ }
36165
+
35813
36166
  this.configureDropdown();
35814
36167
  this.configureInput();
35815
36168
  this.configureCalendar();
@@ -35821,9 +36174,36 @@ class AuroDatePicker extends AuroElement {
35821
36174
  connectedCallback() {
35822
36175
  super.connectedCallback();
35823
36176
 
36177
+ // True reconnect after `disconnectedCallback` aborted our controller:
36178
+ // the existing signal is dead, so listeners registered against it
36179
+ // would never fire. Create a fresh controller and re-run the
36180
+ // configure* wiring (each method is idempotent — it just re-caches
36181
+ // child refs and re-registers listeners against the new signal).
36182
+ // `hasUpdated` gates this so the *first* connect (which precedes
36183
+ // firstUpdated) still falls through to firstUpdated's initial wiring.
36184
+ if (this.hasUpdated && this._listenerAbortController.signal.aborted) {
36185
+ this._listenerAbortController = new AbortController();
36186
+ this.configureDropdown();
36187
+ this.configureInput();
36188
+ this.configureCalendar();
36189
+ this.configureDatepicker();
36190
+ this.configureClickHandler();
36191
+ }
36192
+
35824
36193
  this.locale = this.domHandler.getLocale(this);
35825
36194
  }
35826
36195
 
36196
+ disconnectedCallback() {
36197
+ super.disconnectedCallback();
36198
+ // Defer so that re-parenting (auro-drawer slotting it into a dialog,
36199
+ // for example) does not abort listeners we still need after reconnect.
36200
+ queueMicrotask(() => {
36201
+ if (!this.isConnected) {
36202
+ this._listenerAbortController.abort();
36203
+ }
36204
+ });
36205
+ }
36206
+
35827
36207
  // layout render methods
35828
36208
  // ------------------------------------
35829
36209