@aurodesignsystem-dev/auro-formkit 0.0.0-pr1503.3 → 0.0.0-pr1503.5

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 (190) hide show
  1. package/components/bibtemplate/dist/index.js +1 -1
  2. package/components/bibtemplate/dist/registered.js +1 -1
  3. package/components/checkbox/demo/accessibility.md +1 -1
  4. package/components/checkbox/demo/customize.html +1 -2
  5. package/components/checkbox/demo/customize.min.js +23 -8
  6. package/components/checkbox/demo/getting-started.min.js +23 -8
  7. package/components/checkbox/demo/index.min.js +23 -8
  8. package/components/checkbox/dist/index.js +23 -8
  9. package/components/checkbox/dist/registered.js +23 -8
  10. package/components/combobox/README.md +1 -1
  11. package/components/combobox/demo/accessibility.md +1 -1
  12. package/components/combobox/demo/api.md +2 -2
  13. package/components/combobox/demo/customize.html +1 -2
  14. package/components/combobox/demo/customize.md +166 -142
  15. package/components/combobox/demo/customize.min.js +2515 -2316
  16. package/components/combobox/demo/getting-started.min.js +2515 -2312
  17. package/components/combobox/demo/index.md +2 -1
  18. package/components/combobox/demo/index.min.js +2515 -2312
  19. package/components/combobox/demo/keyboard-behavior.md +3 -146
  20. package/components/combobox/demo/readme.md +1 -1
  21. package/components/combobox/demo/why-combobox.md +2 -2
  22. package/components/combobox/dist/auro-combobox.d.ts +49 -15
  23. package/components/combobox/dist/index.js +1462 -753
  24. package/components/combobox/dist/registered.js +1462 -753
  25. package/components/counter/demo/customize.min.js +188 -244
  26. package/components/counter/demo/index.min.js +188 -244
  27. package/components/counter/dist/auro-counter.d.ts +0 -8
  28. package/components/counter/dist/index.js +188 -244
  29. package/components/counter/dist/registered.js +188 -244
  30. package/components/datepicker/demo/accessibility.md +20 -10
  31. package/components/datepicker/demo/api.md +65 -62
  32. package/components/datepicker/demo/customize.md +180 -40
  33. package/components/datepicker/demo/customize.min.js +1690 -777
  34. package/components/datepicker/demo/getting-started.md +118 -2
  35. package/components/datepicker/demo/index.min.js +1690 -759
  36. package/components/datepicker/demo/keyboard-behavior.md +3 -3
  37. package/components/datepicker/demo/voiceover.md +4 -4
  38. package/components/datepicker/demo/why-datepicker.md +2 -2
  39. package/components/datepicker/dist/{src/auro-calendar-cell.d.ts → auro-calendar-cell.d.ts} +48 -3
  40. package/components/datepicker/dist/{src/auro-calendar.d.ts → auro-calendar.d.ts} +188 -10
  41. package/components/datepicker/dist/{src/auro-datepicker.d.ts → auro-datepicker.d.ts} +89 -6
  42. package/components/datepicker/dist/blackoutUtils.d.ts +43 -0
  43. package/components/datepicker/dist/index.js +1690 -759
  44. package/components/datepicker/dist/registered.js +1690 -759
  45. package/components/dropdown/demo/customize.html +3 -0
  46. package/components/dropdown/demo/customize.min.js +142 -208
  47. package/components/dropdown/demo/getting-started.min.js +131 -207
  48. package/components/dropdown/demo/index.min.js +131 -207
  49. package/components/dropdown/dist/auro-dropdown.d.ts +17 -1
  50. package/components/dropdown/dist/index.js +131 -207
  51. package/components/dropdown/dist/registered.js +131 -207
  52. package/components/form/demo/api.md +3 -3
  53. package/components/form/demo/customize.html +6 -6
  54. package/components/form/demo/customize.md +535 -135
  55. package/components/form/demo/customize.min.js +6307 -4378
  56. package/components/form/demo/getting-started.md +344 -96
  57. package/components/form/demo/getting-started.min.js +6255 -4378
  58. package/components/form/demo/index.min.js +6206 -4378
  59. package/components/form/demo/registerDemoDeps.min.js +5827 -4333
  60. package/components/form/dist/auro-form.d.ts +128 -10
  61. package/components/form/dist/index.js +377 -43
  62. package/components/form/dist/registered.js +377 -43
  63. package/components/input/demo/accessibility.md +1 -1
  64. package/components/input/demo/api.md +58 -57
  65. package/components/input/demo/customize.html +1 -2
  66. package/components/input/demo/customize.md +62 -61
  67. package/components/input/demo/customize.min.js +396 -275
  68. package/components/input/demo/getting-started.min.js +396 -275
  69. package/components/input/demo/index.min.js +396 -275
  70. package/components/input/dist/auro-input.d.ts +1 -1
  71. package/components/input/dist/base-input.d.ts +60 -81
  72. package/components/input/dist/index.js +409 -276
  73. package/components/input/dist/registered.js +396 -275
  74. package/components/input/dist/utilities.d.ts +10 -1
  75. package/components/menu/demo/accessibility.md +9 -4
  76. package/components/menu/demo/api.md +48 -45
  77. package/components/menu/demo/css-only.md +26 -19
  78. package/components/menu/demo/customize.md +307 -75
  79. package/components/menu/demo/design.md +1 -1
  80. package/components/menu/demo/getting-started.md +144 -7
  81. package/components/menu/demo/index.min.js +961 -1341
  82. package/components/menu/demo/keyboard-behavior.md +83 -4
  83. package/components/menu/demo/voiceover.md +21 -14
  84. package/components/menu/demo/why-menu.md +8 -9
  85. package/components/menu/dist/auro-menu-utils.d.ts +19 -0
  86. package/components/menu/dist/auro-menu.d.ts +97 -116
  87. package/components/menu/dist/auro-menuoption.d.ts +39 -133
  88. package/components/menu/dist/index.js +823 -1309
  89. package/components/menu/dist/registered.js +835 -1309
  90. package/components/radio/demo/accessibility.md +1 -1
  91. package/components/radio/demo/customize.min.js +23 -8
  92. package/components/radio/demo/getting-started.min.js +23 -8
  93. package/components/radio/demo/index.min.js +23 -8
  94. package/components/radio/dist/index.js +23 -8
  95. package/components/radio/dist/registered.js +23 -8
  96. package/components/select/demo/accessibility.md +6 -1
  97. package/components/select/demo/api.md +3 -2
  98. package/components/select/demo/customize.html +1 -2
  99. package/components/select/demo/customize.md +210 -5
  100. package/components/select/demo/customize.min.js +1613 -1854
  101. package/components/select/demo/design.md +10 -10
  102. package/components/select/demo/getting-started.md +1 -1
  103. package/components/select/demo/getting-started.min.js +1617 -1903
  104. package/components/select/demo/index.md +2 -2
  105. package/components/select/demo/index.min.js +1613 -1854
  106. package/components/select/demo/keyboard-behavior.md +81 -54
  107. package/components/select/demo/voiceover.md +28 -15
  108. package/components/select/dist/auro-select.d.ts +70 -12
  109. package/components/select/dist/index.js +580 -315
  110. package/components/select/dist/registered.js +580 -315
  111. package/components/select/dist/selectUtils.d.ts +24 -0
  112. package/custom-elements.json +8071 -7919
  113. package/package.json +7 -3
  114. package/components/checkbox/demo/customize.js +0 -22
  115. package/components/checkbox/demo/demo-support.js +0 -1
  116. package/components/checkbox/demo/getting-started.js +0 -22
  117. package/components/checkbox/demo/index.js +0 -8
  118. package/components/checkbox/demo/styles.scss +0 -1
  119. package/components/combobox/demo/customize.js +0 -24
  120. package/components/combobox/demo/demo-support.js +0 -1
  121. package/components/combobox/demo/getting-started.js +0 -21
  122. package/components/combobox/demo/index.js +0 -23
  123. package/components/combobox/demo/styles.scss +0 -1
  124. package/components/counter/demo/customize.js +0 -21
  125. package/components/counter/demo/demo-support.js +0 -1
  126. package/components/counter/demo/index.js +0 -21
  127. package/components/counter/demo/styles.scss +0 -1
  128. package/components/datepicker/demo/customize.js +0 -19
  129. package/components/datepicker/demo/demo-support.js +0 -1
  130. package/components/datepicker/demo/index.js +0 -23
  131. package/components/datepicker/demo/styles.scss +0 -1
  132. package/components/dropdown/demo/customize.js +0 -9
  133. package/components/dropdown/demo/demo-support.js +0 -1
  134. package/components/dropdown/demo/getting-started.js +0 -9
  135. package/components/dropdown/demo/index.js +0 -16
  136. package/components/dropdown/demo/styles.scss +0 -1
  137. package/components/form/demo/customize.js +0 -9
  138. package/components/form/demo/demo-support.js +0 -1
  139. package/components/form/demo/getting-started.js +0 -9
  140. package/components/form/demo/index.js +0 -5
  141. package/components/form/demo/registerDemoDeps.js +0 -23
  142. package/components/form/demo/styles.scss +0 -1
  143. package/components/input/demo/customize.js +0 -25
  144. package/components/input/demo/demo-support.js +0 -1
  145. package/components/input/demo/getting-started.js +0 -8
  146. package/components/input/demo/index.js +0 -8
  147. package/components/input/demo/styles.css +0 -974
  148. package/components/input/demo/styles.scss +0 -1
  149. package/components/menu/demo/demo-support.js +0 -1
  150. package/components/menu/demo/index.js +0 -25
  151. package/components/menu/demo/styles.scss +0 -1
  152. package/components/menu/dist/auro-menu.context.d.ts +0 -238
  153. package/components/radio/demo/customize.js +0 -22
  154. package/components/radio/demo/demo-support.js +0 -1
  155. package/components/radio/demo/getting-started.js +0 -24
  156. package/components/radio/demo/index.js +0 -8
  157. package/components/radio/demo/styles.scss +0 -1
  158. package/components/select/demo/customize.js +0 -11
  159. package/components/select/demo/demo-support.js +0 -1
  160. package/components/select/demo/getting-started.js +0 -26
  161. package/components/select/demo/index.js +0 -11
  162. package/components/select/demo/styles.scss +0 -1
  163. /package/components/counter/dist/styles/{counter-wrapper-color-css.d.ts → counter-group-color-css.d.ts} +0 -0
  164. /package/components/datepicker/dist/{src/auro-calendar-month.d.ts → auro-calendar-month.d.ts} +0 -0
  165. /package/components/datepicker/dist/{src/buttonVersion.d.ts → buttonVersion.d.ts} +0 -0
  166. /package/components/datepicker/dist/{src/datepickerKeyboardStrategy.d.ts → datepickerKeyboardStrategy.d.ts} +0 -0
  167. /package/components/datepicker/dist/{src/iconVersion.d.ts → iconVersion.d.ts} +0 -0
  168. /package/components/datepicker/dist/{src/index.d.ts → index.d.ts} +0 -0
  169. /package/components/datepicker/dist/{src/popoverVersion.d.ts → popoverVersion.d.ts} +0 -0
  170. /package/components/datepicker/dist/{src/styles → styles}/classic/color-css.d.ts +0 -0
  171. /package/components/datepicker/dist/{src/styles → styles}/classic/style-css.d.ts +0 -0
  172. /package/components/datepicker/dist/{src/styles → styles}/color-calendar-css.d.ts +0 -0
  173. /package/components/datepicker/dist/{src/styles → styles}/color-cell-css.d.ts +0 -0
  174. /package/components/datepicker/dist/{src/styles → styles}/color-css.d.ts +0 -0
  175. /package/components/datepicker/dist/{src/styles → styles}/color-month-css.d.ts +0 -0
  176. /package/components/datepicker/dist/{src/styles → styles}/shapeSize-css.d.ts +0 -0
  177. /package/components/datepicker/dist/{src/styles → styles}/snowflake/color-css.d.ts +0 -0
  178. /package/components/datepicker/dist/{src/styles → styles}/snowflake/style-css.d.ts +0 -0
  179. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-cell-css.d.ts +0 -0
  180. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-css.d.ts +0 -0
  181. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-month-css.d.ts +0 -0
  182. /package/components/datepicker/dist/{src/styles → styles}/style-css.d.ts +0 -0
  183. /package/components/datepicker/dist/{src/styles → styles}/tokens-css.d.ts +0 -0
  184. /package/components/datepicker/dist/{src/utilities.d.ts → utilities.d.ts} +0 -0
  185. /package/components/datepicker/dist/{src/utilitiesCalendar.d.ts → utilitiesCalendar.d.ts} +0 -0
  186. /package/components/datepicker/dist/{src/utilitiesCalendarRender.d.ts → utilitiesCalendarRender.d.ts} +0 -0
  187. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/day.d.ts +0 -0
  188. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker-calendar.d.ts +0 -0
  189. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker-cell.d.ts +0 -0
  190. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker.d.ts +0 -0
@@ -542,8 +542,21 @@ let AuroFormValidation$1 = class AuroFormValidation {
542
542
  return;
543
543
  }
544
544
 
545
- // Validate that the date passed was the correct format and is a valid date
545
+ // Validate that the date passed was the correct format and is a valid date.
546
+ // For partial date formats, valueObject is never populated; validate them directly.
546
547
  if (elem.value && !elem.valueObject) {
548
+ const isPartialDateFormat = elem.util && !elem.util.isFullDateFormat(elem.type, elem.format);
549
+
550
+ if (isPartialDateFormat) {
551
+ if (!elem.util.isValidPartialDate(elem.value, elem.format)) {
552
+ elem.validity = 'patternMismatch';
553
+ elem.errorMessage = elem.setCustomValidityPatternMismatch || elem.setCustomValidity || 'Invalid Date Format Entered';
554
+ }
555
+ // Partial date format — validate directly and skip max/min checks since valueObject is undefined.
556
+ return;
557
+ }
558
+
559
+ // Full date format with no valueObject means the value is not a valid calendar date.
547
560
  elem.validity = 'patternMismatch';
548
561
  elem.errorMessage = elem.setCustomValidityPatternMismatch || elem.setCustomValidity || 'Invalid Date Format Entered';
549
562
  return;
@@ -640,15 +653,17 @@ let AuroFormValidation$1 = class AuroFormValidation {
640
653
  );
641
654
  }
642
655
 
643
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
644
- if (this.auroInputElements?.length === 2) {
645
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
656
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
657
+
658
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
659
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
660
+ // field (datepicker is the intended consumer — start/end are independently required).
661
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
662
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
646
663
  hasValue = false;
647
664
  }
648
665
  }
649
666
 
650
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
651
-
652
667
  if (isCombobox) {
653
668
 
654
669
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -747,7 +762,7 @@ let AuroFormValidation$1 = class AuroFormValidation {
747
762
  } else if (this.runtimeUtils.elementMatch(elem, 'auro-input') && elem.errorMessage === '') {
748
763
  const input = elem.renderRoot.querySelector('input');
749
764
 
750
- if (input.validationMessage.length > 0) {
765
+ if (input && input.validationMessage.length > 0) {
751
766
  elem.errorMessage = input.validationMessage;
752
767
  }
753
768
  } else if (this.runtimeUtils.elementMatch(elem, 'auro-combobox') && elem.errorMessage === '') {
@@ -1356,7 +1371,7 @@ function normalizeDates$1(context, ...dates) {
1356
1371
  * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))
1357
1372
  * //=> Tue Sep 02 2014 00:00:00
1358
1373
  */
1359
- function startOfDay$2(date, options) {
1374
+ function startOfDay$1(date, options) {
1360
1375
  const _date = toDate$1(date, options?.in);
1361
1376
  _date.setHours(0, 0, 0, 0);
1362
1377
  return _date;
@@ -1404,8 +1419,8 @@ function differenceInCalendarDays$1(laterDate, earlierDate, options) {
1404
1419
  earlierDate,
1405
1420
  );
1406
1421
 
1407
- const laterStartOfDay = startOfDay$2(laterDate_);
1408
- const earlierStartOfDay = startOfDay$2(earlierDate_);
1422
+ const laterStartOfDay = startOfDay$1(laterDate_);
1423
+ const earlierStartOfDay = startOfDay$1(earlierDate_);
1409
1424
 
1410
1425
  const laterTimestamp =
1411
1426
  +laterStartOfDay - getTimezoneOffsetInMilliseconds$1(laterStartOfDay);
@@ -10252,8 +10267,6 @@ try {
10252
10267
  globalThis.IMask = IMask$1;
10253
10268
  } catch {}
10254
10269
 
10255
- /* eslint-disable max-lines */
10256
-
10257
10270
  let AuroInputUtilities$1 = class AuroInputUtilities {
10258
10271
 
10259
10272
  /**
@@ -10296,7 +10309,7 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
10296
10309
  /**
10297
10310
  * Converts an IMask-style date mask to a date-fns compatible format string.
10298
10311
  * @param {string} mask - IMask date mask (e.g. "MM/DD/YYYY").
10299
- * @returns {string} date-fns format string (e.g. "MM/dd/yyyy").
10312
+ * @returns {string} A date-fns format string (e.g. "MM/dd/yyyy").
10300
10313
  */
10301
10314
  toDateFnsMask(mask) {
10302
10315
  return mask
@@ -10396,10 +10409,11 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
10396
10409
  const dateFormat = format || this.overrideFormat || pattern || 'mm/dd/yyyy';
10397
10410
 
10398
10411
  if (dateFormat === 'dd' || dateFormat === 'yy' || dateFormat === 'yyyy') {
10399
- const maxValue = dateFormat === 'dd' ? 31 : (dateFormat === 'yy' ? 99 : 9999);
10412
+ const fromValue = dateFormat === 'yyyy' ? 1900 : (dateFormat === 'yy' ? 0 : 1);
10413
+ const maxValue = dateFormat === 'dd' ? 31 : (dateFormat === 'yy' ? 99 : 2100);
10400
10414
  return {
10401
10415
  mask: IMask$1.MaskedRange,
10402
- from: 1,
10416
+ from: fromValue,
10403
10417
  to: maxValue,
10404
10418
  lazy: true,
10405
10419
  placeholderChar: '',
@@ -10407,7 +10421,8 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
10407
10421
  return value.toString().padStart(dateFormat.length, '0');
10408
10422
  },
10409
10423
  parse(str) {
10410
- return parseInt(str) || null;
10424
+ const num = parseInt(str, 10);
10425
+ return isNaN(num) ? null : num;
10411
10426
  }
10412
10427
  };
10413
10428
  }
@@ -10471,6 +10486,49 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
10471
10486
  return type === 'date' && normalizedFormat.includes('yy') && normalizedFormat.includes('mm') && normalizedFormat.includes('dd');
10472
10487
  }
10473
10488
 
10489
+ /**
10490
+ * Validates a value against a partial date format (one that lacks yy/mm/dd all three).
10491
+ * Day- and year-only formats (dd/yy/yyyy) are checked as integer ranges; other partial formats use
10492
+ * a date-fns parse + round-trip to confirm both validity and exact formatting.
10493
+ * @param {string} value - The user-facing display value.
10494
+ * @param {string} format - The partial date format string (e.g. "mm/yyyy", "yyyy", "dd").
10495
+ * @returns {boolean}
10496
+ */
10497
+ isValidPartialDate(value, format) {
10498
+ if (!value || !format) {
10499
+ return false;
10500
+ }
10501
+ const normalizedFormat = format.toLowerCase();
10502
+
10503
+ if (normalizedFormat === 'dd') {
10504
+ const num = Number(value);
10505
+ return (/^\d{2}$/u).test(value) && num >= 1 && num <= 31;
10506
+ }
10507
+ if (normalizedFormat === 'yy') {
10508
+ const num = Number(value);
10509
+ return (/^\d{2}$/u).test(value) && num >= 0 && num <= 99;
10510
+ }
10511
+ if (normalizedFormat === 'yyyy') {
10512
+ const num = Number(value);
10513
+ return (/^\d{4}$/u).test(value) && num >= 1900 && num <= 2100;
10514
+ }
10515
+
10516
+ const dateFnsMask = this.toDateFnsMask(normalizedFormat);
10517
+ // Use the 1st of the current month as the reference so that formats
10518
+ // omitting a day (e.g. MM/yyyy) never roll over on days 29–31.
10519
+ const referenceDate = new Date();
10520
+ referenceDate.setDate(1);
10521
+ const parsed = parse$1(value, dateFnsMask, referenceDate);
10522
+ if (!isValid$1(parsed) || format$1(parsed, dateFnsMask) !== value) {
10523
+ return false;
10524
+ }
10525
+ if (normalizedFormat.includes('yyyy')) {
10526
+ const year = parsed.getFullYear();
10527
+ return year >= 1900 && year <= 2100;
10528
+ }
10529
+ return true;
10530
+ }
10531
+
10474
10532
  /**
10475
10533
  * Converts a display string to its model value.
10476
10534
  * For full date formats, converts the display string to an ISO date string.
@@ -10507,6 +10565,13 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
10507
10565
  * @returns {string | undefined}
10508
10566
  */
10509
10567
  toFormattedValue(valueObject, format) {
10568
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
10569
+ // `format` argument has to fail gracefully rather than throw on
10570
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
10571
+ // as "no format → no display value".
10572
+ if (!format) {
10573
+ return undefined;
10574
+ }
10510
10575
  const normalizedFormat = format.toLowerCase();
10511
10576
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
10512
10577
 
@@ -10767,11 +10832,11 @@ var snowflakeStyle = css`:host([layout*=snowflake]) [auro-input]{flex:1;text-ali
10767
10832
 
10768
10833
  var snowflakeColors = css`:host([layout=snowflake]) [auro-dropdown]:not(:is([error],.hasFocus)){--ds-auro-dropdown-trigger-border-color: transparent}`;
10769
10834
 
10770
- var styleCss$7 = css`.body-default{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-default-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-default-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-emphasized-font-size, 1rem);line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.body-lg{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-lg-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-lg-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-sm-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-font-size, 0.875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-sm-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.body-xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-font-size, 0.75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);line-height:var(--wcss-body-xs-emphasized-line-height, 1rem)}.body-2xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-2xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-font-size, 0.625rem);line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-2xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);line-height:var(--wcss-body-2xs-emphasized-line-height, 0.875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-2xl-weight, 300);line-height:var(--wcss-display-2xl-line-height, 1.3);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));letter-spacing:var(--wcss-display-2xl-letter-spacing, 0)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-xl-weight, 300);line-height:var(--wcss-display-xl-line-height, 1.3);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));letter-spacing:var(--wcss-display-xl-letter-spacing, 0)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-lg-weight, 300);line-height:var(--wcss-display-lg-line-height, 1.3);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));letter-spacing:var(--wcss-display-lg-letter-spacing, 0)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-md-weight, 300);line-height:var(--wcss-display-md-line-height, 1.3);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));letter-spacing:var(--wcss-display-md-letter-spacing, 0)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-sm-weight, 300);line-height:var(--wcss-display-sm-line-height, 1.3);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));letter-spacing:var(--wcss-display-sm-letter-spacing, 0)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-xs-weight, 300);line-height:var(--wcss-display-xs-line-height, 1.3);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));letter-spacing:var(--wcss-display-xs-letter-spacing, 0)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-xl-weight, 300);line-height:var(--wcss-heading-xl-line-height, 1.3);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));letter-spacing:var(--wcss-heading-xl-letter-spacing, 0)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-lg-weight, 300);line-height:var(--wcss-heading-lg-line-height, 1.3);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));letter-spacing:var(--wcss-heading-lg-letter-spacing, 0)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-md-weight, 300);line-height:var(--wcss-heading-md-line-height, 1.3);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));letter-spacing:var(--wcss-heading-md-letter-spacing, 0)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-sm-weight, 300);line-height:var(--wcss-heading-sm-line-height, 1.3);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));letter-spacing:var(--wcss-heading-sm-letter-spacing, 0)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-xs-weight, 300);line-height:var(--wcss-heading-xs-line-height, 1.3);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));letter-spacing:var(--wcss-heading-xs-letter-spacing, 0)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-2xs-weight, 300);line-height:var(--wcss-heading-2xs-line-height, 1.3);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-2xl-weight, 450);line-height:var(--wcss-accent-2xl-line-height, 1);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));letter-spacing:var(--wcss-accent-2xl-letter-spacing, 0.05em);text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-xl-weight, 450);line-height:var(--wcss-accent-xl-line-height, 1.3);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));letter-spacing:var(--wcss-accent-xl-letter-spacing, 0.05em);text-transform:uppercase}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-lg-weight, 450);line-height:var(--wcss-accent-lg-line-height, 1.3);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));letter-spacing:var(--wcss-accent-lg-letter-spacing, 0.05em);text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-md-weight, 500);line-height:var(--wcss-accent-md-line-height, 1.3);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));letter-spacing:var(--wcss-accent-md-letter-spacing, 0.05em);text-transform:uppercase}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-sm-weight, 500);line-height:var(--wcss-accent-sm-line-height, 1.3);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));letter-spacing:var(--wcss-accent-sm-letter-spacing, 0.05em);text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-xs-weight, 500);line-height:var(--wcss-accent-xs-line-height, 1.3);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));letter-spacing:var(--wcss-accent-xs-letter-spacing, 0.1em);text-transform:uppercase}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-2xs-weight, 450);line-height:var(--wcss-accent-2xs-line-height, 1.3);font-size:var(--wcss-accent-2xs-font-size, clamp(0.875rem, 1.1666666667vw, 0.875rem));letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);text-transform:uppercase}:host{--calendar-width: 336px;--mobile-footer-height: 150px;--mobile-header-height: 68px;--desktop-footer-height: 80px;height:100vh;height:100dvh}.calendars{display:flex;flex-direction:row}.calendars:focus{outline:none}.calendarNavButtons{position:absolute;z-index:1;top:var(--ds-size-200, 1rem);right:var(--ds-size-50, 0.25rem);left:var(--ds-size-50, 0.25rem)}.calendarNavBtn{display:flex;width:var(--ds-size-500, 2.5rem);height:var(--ds-size-500, 2.5rem);align-items:center;justify-content:center;border-width:1px;border-style:solid;border-radius:50%;cursor:pointer}.prevMonth,.nextMonth{position:absolute;top:0}.prevMonth{left:0}.nextMonth{right:0}.headerActions{padding:0 var(--ds-size-200, 1rem)}.mobileHeader{width:100%;height:var(--mobile-header-height);z-index:1;align-items:center;flex-direction:row}.headerDateFrom,.headerDateTo{display:flex;height:var(--mobile-header-height);flex:1;flex-direction:column;justify-content:center;padding:0 var(--ds-size-150, 0.75rem) 0 var(--ds-size-200, 1rem)}.mobileDateLabel{padding:var(--ds-size-25, 0.125rem) 0}.mobileFooter{display:none;width:100%;align-items:flex-end;flex-direction:column;justify-content:flex-end}.mobileFooterActions{position:relative;bottom:0;left:50%;display:none;width:calc(100% - var(--ds-size-200, 1rem)*2);align-items:flex-end;flex-direction:column;justify-content:flex-end;padding:var(--ds-size-150) calc(var(--ds-size-200, 1rem));transform:translateX(-50%)}.mobileFooterActions auro-button{width:100%}.calendarWrapper.hasFooter{padding-bottom:var(--desktop-footer-height)}:host([isfullscreen]){width:100%;max-height:100dvh;overflow:hidden}:host([isfullscreen]) .prevMonth,:host([isfullscreen]) .nextMonth{display:none}:host([isfullscreen]) .mobileHeader,:host([isfullscreen]) .mobileFooter,:host([isfullscreen]) .mobileFooterActions{display:flex}:host([isfullscreen]) .calendarWrapper{display:flex;flex-direction:column}:host([isfullscreen]) .calendars{display:flex;flex-direction:column;flex:1;align-items:center;width:100%;overscroll-behavior:contain}:host([isfullscreen]) .calendars:after{display:block;width:100%;height:var(--mobile-footer-height);content:""}.sr-only{position:absolute;overflow:hidden;clip:rect(0, 0, 0, 0);width:1px;height:1px;margin:-1px;padding:0;border:0;white-space:nowrap}`;
10835
+ var styleCss$7 = css`.body-default{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-default-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-default-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-emphasized-font-size, 1rem);line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.body-lg{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-lg-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-lg-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-sm-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-font-size, 0.875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-sm-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.body-xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-font-size, 0.75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);line-height:var(--wcss-body-xs-emphasized-line-height, 1rem)}.body-2xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-2xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-font-size, 0.625rem);line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-2xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);line-height:var(--wcss-body-2xs-emphasized-line-height, 0.875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-2xl-weight, 300);line-height:var(--wcss-display-2xl-line-height, 1.3);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));letter-spacing:var(--wcss-display-2xl-letter-spacing, 0)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-xl-weight, 300);line-height:var(--wcss-display-xl-line-height, 1.3);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));letter-spacing:var(--wcss-display-xl-letter-spacing, 0)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-lg-weight, 300);line-height:var(--wcss-display-lg-line-height, 1.3);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));letter-spacing:var(--wcss-display-lg-letter-spacing, 0)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-md-weight, 300);line-height:var(--wcss-display-md-line-height, 1.3);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));letter-spacing:var(--wcss-display-md-letter-spacing, 0)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-sm-weight, 300);line-height:var(--wcss-display-sm-line-height, 1.3);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));letter-spacing:var(--wcss-display-sm-letter-spacing, 0)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-xs-weight, 300);line-height:var(--wcss-display-xs-line-height, 1.3);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));letter-spacing:var(--wcss-display-xs-letter-spacing, 0)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-xl-weight, 300);line-height:var(--wcss-heading-xl-line-height, 1.3);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));letter-spacing:var(--wcss-heading-xl-letter-spacing, 0)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-lg-weight, 300);line-height:var(--wcss-heading-lg-line-height, 1.3);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));letter-spacing:var(--wcss-heading-lg-letter-spacing, 0)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-md-weight, 300);line-height:var(--wcss-heading-md-line-height, 1.3);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));letter-spacing:var(--wcss-heading-md-letter-spacing, 0)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-sm-weight, 300);line-height:var(--wcss-heading-sm-line-height, 1.3);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));letter-spacing:var(--wcss-heading-sm-letter-spacing, 0)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-xs-weight, 300);line-height:var(--wcss-heading-xs-line-height, 1.3);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));letter-spacing:var(--wcss-heading-xs-letter-spacing, 0)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-2xs-weight, 300);line-height:var(--wcss-heading-2xs-line-height, 1.3);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-2xl-weight, 450);line-height:var(--wcss-accent-2xl-line-height, 1);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));letter-spacing:var(--wcss-accent-2xl-letter-spacing, 0.05em);text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-xl-weight, 450);line-height:var(--wcss-accent-xl-line-height, 1.3);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));letter-spacing:var(--wcss-accent-xl-letter-spacing, 0.05em);text-transform:uppercase}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-lg-weight, 450);line-height:var(--wcss-accent-lg-line-height, 1.3);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));letter-spacing:var(--wcss-accent-lg-letter-spacing, 0.05em);text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-md-weight, 500);line-height:var(--wcss-accent-md-line-height, 1.3);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));letter-spacing:var(--wcss-accent-md-letter-spacing, 0.05em);text-transform:uppercase}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-sm-weight, 500);line-height:var(--wcss-accent-sm-line-height, 1.3);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));letter-spacing:var(--wcss-accent-sm-letter-spacing, 0.05em);text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-xs-weight, 500);line-height:var(--wcss-accent-xs-line-height, 1.3);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));letter-spacing:var(--wcss-accent-xs-letter-spacing, 0.1em);text-transform:uppercase}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-2xs-weight, 450);line-height:var(--wcss-accent-2xs-line-height, 1.3);font-size:var(--wcss-accent-2xs-font-size, clamp(0.875rem, 1.1666666667vw, 0.875rem));letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);text-transform:uppercase}:host{--calendar-width: 336px;--mobile-footer-height: 150px;--mobile-header-height: 68px;--desktop-footer-height: 80px;height:100vh;height:100dvh}.calendars{display:flex;flex-direction:row}.calendars:focus{outline:none}.calendarNavButtons{position:absolute;z-index:1;top:var(--ds-size-200, 1rem);right:var(--ds-size-50, 0.25rem);left:var(--ds-size-50, 0.25rem)}.calendarNavBtn{display:flex;width:var(--ds-size-500, 2.5rem);height:var(--ds-size-500, 2.5rem);align-items:center;justify-content:center;border-width:1px;border-style:solid;border-radius:50%;cursor:pointer}.prevMonth,.nextMonth{position:absolute;top:0}.prevMonth{left:0}.nextMonth{right:0}.headerActions{padding:0 var(--ds-size-200, 1rem)}.mobileHeader{width:100%;height:var(--mobile-header-height);z-index:1;align-items:center;flex-direction:row}.headerDateFrom,.headerDateTo{display:flex;height:var(--mobile-header-height);flex:1;flex-direction:column;justify-content:center;padding:0 var(--ds-size-150, 0.75rem) 0 0}.mobileDateLabel{padding:var(--ds-size-25, 0.125rem) 0}.mobileFooter{display:none;width:100%;align-items:flex-end;flex-direction:column;justify-content:flex-end}.mobileFooterActions{position:relative;bottom:0;left:50%;display:none;width:calc(100% - var(--ds-size-200, 1rem)*2);align-items:flex-end;flex-direction:column;justify-content:flex-end;padding:var(--ds-size-150) calc(var(--ds-size-200, 1rem));transform:translateX(-50%)}.mobileFooterActions auro-button{width:100%}:host([isfullscreen]){width:100%;max-height:100dvh;overflow:hidden}:host([isfullscreen]) .prevMonth,:host([isfullscreen]) .nextMonth{display:none}:host([isfullscreen]) .mobileHeader,:host([isfullscreen]) .mobileFooter,:host([isfullscreen]) .mobileFooterActions{display:flex}:host([isfullscreen]) .calendarWrapper{display:flex;flex-direction:column}:host([isfullscreen]) .calendars{display:flex;flex-direction:column;flex:1;align-items:center;width:100%;overscroll-behavior:contain}:host([isfullscreen]) .calendars:after{display:block;width:100%;height:var(--mobile-footer-height);content:""}.sr-only{position:absolute;overflow:hidden;clip:rect(0, 0, 0, 0);width:1px;height:1px;margin:-1px;padding:0;border:0;white-space:nowrap}`;
10771
10836
 
10772
- var colorCss$7 = css`.calendarNavBtn{border-color:var(--ds-auro-calendar-nav-btn-border-color);background-color:var(--ds-auro-calendar-nav-btn-container-color);color:var(--ds-auro-calendar-nav-btn-chevron-color)}.calendarNavBtn:hover{--ds-auro-calendar-nav-btn-container-color: var(--ds-advanced-color-state-background-hover, #f2f2f2);--ds-auro-calendar-nav-btn-border-color: var(--ds-basic-color-brand-primary, #01426a)}.calendarNavBtn:focus{--ds-auro-calendar-nav-btn-border-color: var(--ds-basic-color-brand-primary, #01426a)}.calendarNavBtn:active{--ds-auro-calendar-nav-btn-border-color: var(--ds-basic-color-brand-primary, #01426a);box-shadow:inset 0 0 0 1px var(--ds-auro-calendar-nav-btn-border-color)}.mobileHeader{background-color:var(--ds-auro-calendar-mobile-header-container-color)}.mobileDateLabel{color:var(--ds-auro-calendar-mobile-header-text-color)}:host(:not([noRange])) .headerDateTo:after{background-color:var(--ds-auro-calendar-mobile-header-divider-color)}::slotted([slot="bib.fullscreen.fromStr"]),::slotted([slot=mobileDateToStr]){color:var(--ds-auro-datepicker-placeholder-color)}@media screen and (max-width: 576px){.calendarNavBtn{--ds-auro-calendar-nav-btn-border-color: var(--ds-basic-color-brand-primary, #01426a)}}`;
10837
+ var colorCss$7 = css`.calendarNavBtn{border-color:var(--ds-auro-calendar-nav-btn-border-color);background-color:var(--ds-auro-calendar-nav-btn-container-color);color:var(--ds-auro-calendar-nav-btn-chevron-color)}.calendarNavBtn:hover{--ds-auro-calendar-nav-btn-container-color: var(--ds-advanced-color-state-background-hover, #f2f2f2);--ds-auro-calendar-nav-btn-border-color: var(--ds-basic-color-brand-primary, #01426a)}.calendarNavBtn:focus-visible{--ds-auro-calendar-nav-btn-border-color: var(--ds-basic-color-brand-primary, #01426a);outline:2px solid var(--ds-basic-color-brand-primary, #01426a);outline-offset:-2px}.calendarNavBtn:active{--ds-auro-calendar-nav-btn-border-color: var(--ds-basic-color-brand-primary, #01426a);outline:2px solid var(--ds-basic-color-brand-primary, #01426a);outline-offset:-2px;box-shadow:inset 0 0 0 1px var(--ds-auro-calendar-nav-btn-border-color)}.mobileHeader{background-color:var(--ds-auro-calendar-mobile-header-container-color)}.mobileDateLabel{color:var(--ds-auro-calendar-mobile-header-text-color)}:host(:not([noRange])) .headerDateTo:after{background-color:var(--ds-auro-calendar-mobile-header-divider-color)}::slotted([slot="bib.fullscreen.fromStr"]),::slotted([slot=mobileDateToStr]){color:var(--ds-auro-datepicker-placeholder-color)}@media screen and (max-width: 576px){.calendarNavBtn{--ds-auro-calendar-nav-btn-border-color: var(--ds-basic-color-brand-primary, #01426a)}}`;
10773
10838
 
10774
- var styleCss$6 = css`:focus:not(:focus-visible){outline:3px solid transparent}.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}:host{position:relative;display:block;width:calc(100% - var(--ds-size-200, 1rem) - var(--ds-size-200, 1rem));margin:0 var(--ds-size-200, 1rem)}@media screen and (min-width: 576px){:host{width:336px;padding:var(--ds-size-200, 1rem) var(--ds-size-200, 1rem) 0}}@media screen and (min-width: 576px){:host(:not(:last-of-type)):after{position:absolute;top:var(--ds-size-200, 1rem);right:calc(-1*var(--ds-size-200, 1rem));height:calc(100% - var(--ds-size-200, 1rem) - var(--ds-size-200, 1rem));display:block;width:1px;content:""}}.header{display:flex;height:var(--ds-size-500, 2.5rem);margin-bottom:var(--ds-size-150, 0.75rem);align-items:center;flex-direction:row;text-align:center}.headerTitle{display:flex;align-items:center;flex:1;flex-direction:row;justify-content:center}.headerTitle div:first-child{margin-right:var(--ds-size-100, 0.5rem)}.calendarNavBtn{position:relative;display:flex;width:var(--ds-size-500, 2.5rem);height:var(--ds-size-500, 2.5rem);align-items:center;justify-content:center;border-width:1px;border-style:solid;border-radius:50%;cursor:pointer}.table{width:100%;border-collapse:collapse}.thead{margin-bottom:var(--ds-size-100, 0.5rem)}.th{display:flex;flex:1;align-items:center;justify-content:center}.th abbr{text-decoration:none}.tbody{width:100%;transition:all 0ms;transform:translateX(0)}@media screen and (min-width: 576px){.tbody{height:336px}}.td{flex:1;margin:0;padding:0}.tr{display:flex;flex-direction:row;width:100%;border-radius:10px;overflow:hidden}.tr:not(:last-of-type){margin-bottom:var(--ds-size-100, 0.5rem)}`;
10839
+ var styleCss$6 = css`:focus:not(:focus-visible){outline:3px solid transparent}.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}:host{position:relative;display:block;width:336px;margin:0 var(--ds-size-200, 1rem)}@media screen and (min-width: 576px){:host{width:336px;padding:var(--ds-size-200, 1rem) var(--ds-size-200, 1rem) 0}}@media screen and (min-width: 576px){:host(:not(:last-of-type)):after{position:absolute;top:var(--ds-size-200, 1rem);right:calc(-1*var(--ds-size-200, 1rem));height:calc(100% - var(--ds-size-200, 1rem) - var(--ds-size-200, 1rem));display:block;width:1px;content:""}}.header{display:flex;height:var(--ds-size-500, 2.5rem);margin-bottom:var(--ds-size-150, 0.75rem);align-items:center;flex-direction:row;text-align:center}.headerTitle{display:flex;align-items:center;flex:1;flex-direction:row;justify-content:center}.headerTitle div:first-child{margin-right:var(--ds-size-100, 0.5rem)}.calendarNavBtn{position:relative;display:flex;width:var(--ds-size-500, 2.5rem);height:var(--ds-size-500, 2.5rem);align-items:center;justify-content:center;border-width:1px;border-style:solid;border-radius:50%;cursor:pointer}.table{width:100%;border-collapse:collapse}.thead{margin-bottom:var(--ds-size-100, 0.5rem)}.th{display:flex;flex:1;align-items:center;justify-content:center}.th abbr{text-decoration:none}.tbody{width:100%;transition:all 0ms;transform:translateX(0)}@media screen and (min-width: 576px){.tbody{height:376px}}.td{flex:1;margin:0;padding:0}.tr{display:flex;flex-direction:row;width:100%;border-radius:10px;overflow:hidden}.tr:not(:last-of-type){margin-bottom:var(--ds-size-100, 0.5rem)}`;
10775
10840
 
10776
10841
  var colorCss$6 = css`:focus:not(:focus-visible){outline:3px solid transparent}:host{background-color:var(--ds-auro-calendar-month-container-color)}@media screen and (min-width: 576px){:host(:not(:last-of-type)):after{background-color:var(--ds-auro-calendar-month-divider-color)}}.header{color:var(--ds-auro-calendar-month-header-color)}`;
10777
10842
 
@@ -10863,8 +10928,8 @@ class RangeDatepickerCell extends LitElement {
10863
10928
  const parsedDateFrom = parseInt(dateFrom, 10);
10864
10929
  const parsedDateTo = parseInt(dateTo, 10);
10865
10930
  if (day) {
10866
- if (getTime(startOfDay$2(parsedDateTo * 1000)) / 1000 === day.date ||
10867
- getTime(startOfDay$2(parsedDateFrom * 1000)) / 1000 === day.date) {
10931
+ if (getTime(startOfDay$1(parsedDateTo * 1000)) / 1000 === day.date ||
10932
+ getTime(startOfDay$1(parsedDateFrom * 1000)) / 1000 === day.date) {
10868
10933
  this.selected = true;
10869
10934
  }
10870
10935
  if (((hoveredDate === day.date || day.date < hoveredDate) &&
@@ -11052,7 +11117,7 @@ class RangeDatepickerCalendar extends LitElement {
11052
11117
  this.dayNamesOfTheWeek = [];
11053
11118
  this.daysOfMonth = [];
11054
11119
  this._locale = null;
11055
- this.currentDate = parseInt(format$1(startOfDay$2(Date.now()), 't'), 10);
11120
+ this.currentDate = parseInt(format$1(startOfDay$1(Date.now()), 't'), 10);
11056
11121
  this.localeChanged();
11057
11122
  this.yearAndMonthChanged(this.year, this.month);
11058
11123
  }
@@ -11526,7 +11591,7 @@ __decorate([property({ type: Array })], RangeDatepickerCalendar.prototype, "dayN
11526
11591
  __decorate([property({ type: Array })], RangeDatepickerCalendar.prototype, "daysOfMonth", void 0);
11527
11592
  AuroLibraryRuntimeUtils$5.prototype.registerComponent('wc-range-datepicker-calendar', RangeDatepickerCalendar);
11528
11593
 
11529
- var styleCss$5 = css`.body-default{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-default-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-default-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-emphasized-font-size, 1rem);line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.body-lg{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-lg-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-lg-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-sm-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-font-size, 0.875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-sm-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.body-xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-font-size, 0.75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);line-height:var(--wcss-body-xs-emphasized-line-height, 1rem)}.body-2xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-2xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-font-size, 0.625rem);line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-2xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);line-height:var(--wcss-body-2xs-emphasized-line-height, 0.875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-2xl-weight, 300);line-height:var(--wcss-display-2xl-line-height, 1.3);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));letter-spacing:var(--wcss-display-2xl-letter-spacing, 0)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-xl-weight, 300);line-height:var(--wcss-display-xl-line-height, 1.3);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));letter-spacing:var(--wcss-display-xl-letter-spacing, 0)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-lg-weight, 300);line-height:var(--wcss-display-lg-line-height, 1.3);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));letter-spacing:var(--wcss-display-lg-letter-spacing, 0)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-md-weight, 300);line-height:var(--wcss-display-md-line-height, 1.3);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));letter-spacing:var(--wcss-display-md-letter-spacing, 0)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-sm-weight, 300);line-height:var(--wcss-display-sm-line-height, 1.3);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));letter-spacing:var(--wcss-display-sm-letter-spacing, 0)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-xs-weight, 300);line-height:var(--wcss-display-xs-line-height, 1.3);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));letter-spacing:var(--wcss-display-xs-letter-spacing, 0)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-xl-weight, 300);line-height:var(--wcss-heading-xl-line-height, 1.3);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));letter-spacing:var(--wcss-heading-xl-letter-spacing, 0)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-lg-weight, 300);line-height:var(--wcss-heading-lg-line-height, 1.3);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));letter-spacing:var(--wcss-heading-lg-letter-spacing, 0)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-md-weight, 300);line-height:var(--wcss-heading-md-line-height, 1.3);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));letter-spacing:var(--wcss-heading-md-letter-spacing, 0)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-sm-weight, 300);line-height:var(--wcss-heading-sm-line-height, 1.3);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));letter-spacing:var(--wcss-heading-sm-letter-spacing, 0)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-xs-weight, 300);line-height:var(--wcss-heading-xs-line-height, 1.3);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));letter-spacing:var(--wcss-heading-xs-letter-spacing, 0)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-2xs-weight, 300);line-height:var(--wcss-heading-2xs-line-height, 1.3);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-2xl-weight, 450);line-height:var(--wcss-accent-2xl-line-height, 1);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));letter-spacing:var(--wcss-accent-2xl-letter-spacing, 0.05em);text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-xl-weight, 450);line-height:var(--wcss-accent-xl-line-height, 1.3);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));letter-spacing:var(--wcss-accent-xl-letter-spacing, 0.05em);text-transform:uppercase}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-lg-weight, 450);line-height:var(--wcss-accent-lg-line-height, 1.3);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));letter-spacing:var(--wcss-accent-lg-letter-spacing, 0.05em);text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-md-weight, 500);line-height:var(--wcss-accent-md-line-height, 1.3);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));letter-spacing:var(--wcss-accent-md-letter-spacing, 0.05em);text-transform:uppercase}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-sm-weight, 500);line-height:var(--wcss-accent-sm-line-height, 1.3);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));letter-spacing:var(--wcss-accent-sm-letter-spacing, 0.05em);text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-xs-weight, 500);line-height:var(--wcss-accent-xs-line-height, 1.3);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));letter-spacing:var(--wcss-accent-xs-letter-spacing, 0.1em);text-transform:uppercase}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-2xs-weight, 450);line-height:var(--wcss-accent-2xs-line-height, 1.3);font-size:var(--wcss-accent-2xs-font-size, clamp(0.875rem, 1.1666666667vw, 0.875rem));letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);text-transform:uppercase}@media screen and (max-width: 576px){:host{display:flex;justify-content:center}}.day{position:relative;width:48px;height:56px;padding:0;border-width:2px;border-style:solid;border-radius:10px;cursor:pointer;user-select:none}.day:focus-visible{outline:none;background-color:unset}.day.activeCell{outline-width:2px;outline-style:solid;outline-offset:-4px}.day.disabled{cursor:default !important;pointer-events:none}.day.blackout{cursor:pointer}.day.reference:after{position:absolute;top:-2px;left:-2px;display:block;width:calc(100% + 2px);height:calc(100% + 2px);box-sizing:content-box;border-radius:10px;border-style:solid;border-width:1px;content:""}.day.inRange::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:""}.day.rangeDepartDate::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:"";border-radius:10px 0 0 10px;overflow:hidden}.day.rangeReturnDate::before,.day.lastHoveredDate::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:"";border-radius:0 10px 10px 0;overflow:hidden}.day.firstDayOfMonth::before{border-radius:10px 0 0 10px;overflow:hidden}.day.lastDayOfMonth::before{border-radius:0 10px 10px 0;overflow:hidden}.buttonWrapper{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.dateSlot{display:block}::slotted([slot^=date_]){width:100%;white-space:nowrap}::slotted(auro-icon){max-height:24px;max-width:24px}:host([renderForDateSlot]) .buttonWrapper{position:relative;width:100%;height:100%}:host([renderForDateSlot]) .currentDayMarker{position:relative}`;
11594
+ var styleCss$5 = css`.body-default{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-default-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-default-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-emphasized-font-size, 1rem);line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.body-lg{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-lg-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-lg-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-sm-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-font-size, 0.875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-sm-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.body-xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-font-size, 0.75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);line-height:var(--wcss-body-xs-emphasized-line-height, 1rem)}.body-2xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-2xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-font-size, 0.625rem);line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-2xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);line-height:var(--wcss-body-2xs-emphasized-line-height, 0.875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-2xl-weight, 300);line-height:var(--wcss-display-2xl-line-height, 1.3);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));letter-spacing:var(--wcss-display-2xl-letter-spacing, 0)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-xl-weight, 300);line-height:var(--wcss-display-xl-line-height, 1.3);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));letter-spacing:var(--wcss-display-xl-letter-spacing, 0)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-lg-weight, 300);line-height:var(--wcss-display-lg-line-height, 1.3);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));letter-spacing:var(--wcss-display-lg-letter-spacing, 0)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-md-weight, 300);line-height:var(--wcss-display-md-line-height, 1.3);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));letter-spacing:var(--wcss-display-md-letter-spacing, 0)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-sm-weight, 300);line-height:var(--wcss-display-sm-line-height, 1.3);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));letter-spacing:var(--wcss-display-sm-letter-spacing, 0)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-xs-weight, 300);line-height:var(--wcss-display-xs-line-height, 1.3);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));letter-spacing:var(--wcss-display-xs-letter-spacing, 0)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-xl-weight, 300);line-height:var(--wcss-heading-xl-line-height, 1.3);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));letter-spacing:var(--wcss-heading-xl-letter-spacing, 0)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-lg-weight, 300);line-height:var(--wcss-heading-lg-line-height, 1.3);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));letter-spacing:var(--wcss-heading-lg-letter-spacing, 0)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-md-weight, 300);line-height:var(--wcss-heading-md-line-height, 1.3);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));letter-spacing:var(--wcss-heading-md-letter-spacing, 0)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-sm-weight, 300);line-height:var(--wcss-heading-sm-line-height, 1.3);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));letter-spacing:var(--wcss-heading-sm-letter-spacing, 0)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-xs-weight, 300);line-height:var(--wcss-heading-xs-line-height, 1.3);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));letter-spacing:var(--wcss-heading-xs-letter-spacing, 0)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-2xs-weight, 300);line-height:var(--wcss-heading-2xs-line-height, 1.3);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-2xl-weight, 450);line-height:var(--wcss-accent-2xl-line-height, 1);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));letter-spacing:var(--wcss-accent-2xl-letter-spacing, 0.05em);text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-xl-weight, 450);line-height:var(--wcss-accent-xl-line-height, 1.3);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));letter-spacing:var(--wcss-accent-xl-letter-spacing, 0.05em);text-transform:uppercase}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-lg-weight, 450);line-height:var(--wcss-accent-lg-line-height, 1.3);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));letter-spacing:var(--wcss-accent-lg-letter-spacing, 0.05em);text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-md-weight, 500);line-height:var(--wcss-accent-md-line-height, 1.3);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));letter-spacing:var(--wcss-accent-md-letter-spacing, 0.05em);text-transform:uppercase}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-sm-weight, 500);line-height:var(--wcss-accent-sm-line-height, 1.3);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));letter-spacing:var(--wcss-accent-sm-letter-spacing, 0.05em);text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-xs-weight, 500);line-height:var(--wcss-accent-xs-line-height, 1.3);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));letter-spacing:var(--wcss-accent-xs-letter-spacing, 0.1em);text-transform:uppercase}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-2xs-weight, 450);line-height:var(--wcss-accent-2xs-line-height, 1.3);font-size:var(--wcss-accent-2xs-font-size, clamp(0.875rem, 1.1666666667vw, 0.875rem));letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);text-transform:uppercase}@media screen and (max-width: 576px){:host{display:flex;justify-content:center}}.day{position:relative;width:48px;height:56px;padding:0;border-width:2px;border-style:solid;border-radius:10px;cursor:pointer;user-select:none}.day:focus-visible{outline:none;background-color:unset}.day.activeCell{outline-width:2px;outline-style:solid;outline-offset:-4px}.day.disabled{cursor:default !important;pointer-events:none}.day.blackout{cursor:pointer}.day.reference:after{position:absolute;top:-2px;left:-2px;display:block;width:calc(100% + 2px);height:calc(100% + 2px);box-sizing:content-box;border-radius:10px;border-style:solid;border-width:1px;content:""}.day.inRange::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:""}.day.rangeDepartDate::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:"";border-radius:10px 0 0 10px;overflow:hidden}.day.rangeReturnDate::before,.day.lastHoveredDate::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:"";border-radius:0 10px 10px 0;overflow:hidden}.day.rangeDepartDate.lastHoveredDate::before{border-radius:10px}.day.firstDayOfMonth::before{border-radius:10px 0 0 10px;overflow:hidden}.day.lastDayOfMonth::before{border-radius:0 10px 10px 0;overflow:hidden}.buttonWrapper{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.dateSlot{display:block}::slotted([slot^=date_]){width:100%;white-space:nowrap}::slotted(auro-icon){max-height:24px;max-width:24px}:host([renderForDateSlot]) .buttonWrapper{position:relative;width:100%;height:100%}:host([renderForDateSlot]) .currentDayMarker{position:relative}`;
11530
11595
 
11531
11596
  var colorCss$5 = css`:host ::slotted([slot^=date_]){color:var(--ds-auro-calendar-cell-price-text-color)}:host ::slotted([slot^=date_][highlight]){--ds-auro-calendar-cell-price-text-color: var(--ds-basic-color-status-success, #447a1f)}:host .day{border-color:var(--ds-auro-calendar-cell-border-color);background-color:var(--ds-auro-calendar-cell-container-color);color:var(--ds-auro-calendar-cell-text-color)}:host .day.activeCell:not(.selected){--ds-auro-calendar-cell-container-color: var(--ds-auro-calendar-cell-in-range-color);border-color:var(--ds-advanced-color-state-selected);outline-color:var(--ds-auro-calendar-cell-container-color)}:host .day.selected{--ds-auro-calendar-cell-container-color: var(--ds-advanced-color-state-selected, #01426a);--ds-auro-calendar-cell-text-color: var(--ds-basic-color-texticon-inverse, #ffffff);--ds-auro-calendar-cell-price-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host .day.selected ::slotted([slot^=date_][highlight]){--ds-auro-calendar-cell-price-text-color: var(--ds-basic-color-status-success-subtle, #d6eac7)}:host .day.selected:hover{--ds-auro-calendar-cell-container-color: var(--ds-advanced-color-state-selected-hover, #00274a);--ds-auro-calendar-cell-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host .day.reference:after{border-color:var(--ds-basic-color-border-default, #959595);box-shadow:inset 0 0 0 2px var(--ds-basic-color-surface-default, #ffffff)}:host .day.reference:hover::after{box-shadow:inset 0 0 0 2px var(--ds-advanced-color-shared-background-muted, #f7f7f7)}:host .day:hover{--ds-auro-calendar-cell-container-color: var(--ds-advanced-color-state-background-hover, #f2f2f2);--ds-auro-calendar-cell-text-color: var(--ds-basic-color-texticon-default, #2a2a2a)}:host .day.disabled{--ds-auro-calendar-cell-container-color: transparent;--ds-auro-calendar-cell-text-color: var(--ds-basic-color-texticon-disabled, #d0d0d0);--ds-auro-calendar-cell-price-text-color: var(--ds-basic-color-texticon-disabled, #d0d0d0)}:host .day.blackout{--ds-auro-calendar-cell-container-color: transparent;--ds-auro-calendar-cell-text-color: var(--ds-basic-color-texticon-disabled, #d0d0d0);--ds-auro-calendar-cell-price-text-color: var(--ds-basic-color-texticon-disabled, #d0d0d0)}:host .day.inRange:before,:host .day.rangeDepartDate:before,:host .day.rangeReturnDate:before,:host .day.lastHoveredDate:before{background-color:var(--ds-auro-calendar-cell-in-range-color)}:host .day.sameDateTrip:before{--ds-auro-calendar-cell-in-range-color: transparent}`;
11532
11597
 
@@ -11551,13 +11616,108 @@ class s{registerComponent(e,t){customElements.get(e)||customElements.define(e,cl
11551
11616
 
11552
11617
  var popoverVersion = '6.0.1';
11553
11618
 
11554
- /* 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 */
11619
+ /**
11620
+ * Single source of truth for parsing and matching blackout dates across the
11621
+ * datepicker. Both `auro-calendar` (memoized Set + `isDateBlackout`) and the
11622
+ * pre-`firstUpdated` fallback inside `auro-calendar-cell` route through these
11623
+ * helpers so the YYYY-MM-DD → seconds conversion and the merge-with-legacy
11624
+ * `disabledDays` rules are defined exactly once.
11625
+ */
11555
11626
 
11556
- const startOfDay$1 = (ms) => {
11557
- const date = new Date(ms);
11558
- date.setHours(0, 0, 0, 0);
11559
- return date.getTime();
11560
- };
11627
+ /**
11628
+ * Converts a `YYYY-MM-DD` ISO date string to a Unix timestamp (seconds)
11629
+ * representing local midnight on that calendar day. Returns `null` for
11630
+ * inputs that don't parse to a finite timestamp.
11631
+ *
11632
+ * Uses the `new Date(year, monthIndex, day)` constructor (NOT
11633
+ * `new Date(isoStr)`) so the result is local-midnight rather than UTC
11634
+ * midnight — required to keep the calendar grid aligned with the user's
11635
+ * local calendar day in negative-offset timezones.
11636
+ *
11637
+ * @param {string} isoStr - Date string in `YYYY-MM-DD` format.
11638
+ * @returns {number|null} Local-midnight Unix timestamp (seconds), or null.
11639
+ */
11640
+ function parseIsoToTimestamp(isoStr) {
11641
+ // Strict YYYY-MM-DD matcher with named groups. Rejects trailing garbage
11642
+ // ("2024x-01-01"), short segments ("2024-1-1"), and any non-digit
11643
+ // characters. `parseInt` alone accepted both because it stops at the
11644
+ // first non-digit and doesn't require a minimum length.
11645
+ const ISO_DATE_RE = /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/u;
11646
+ const MAX_MONTH = 12;
11647
+ const MAX_DAY = 31;
11648
+
11649
+ if (typeof isoStr !== 'string') {
11650
+ return null;
11651
+ }
11652
+ const match = ISO_DATE_RE.exec(isoStr);
11653
+ if (!match) {
11654
+ return null;
11655
+ }
11656
+ const year = Number(match.groups.year);
11657
+ const month = Number(match.groups.month);
11658
+ const day = Number(match.groups.day);
11659
+ // Reject overflow values like "2024-13-40" — JS `new Date(year, month, day)`
11660
+ // silently normalizes those to a different calendar day, which would
11661
+ // disable the wrong date if we let the result through.
11662
+ if (month < 1 || month > MAX_MONTH || day < 1 || day > MAX_DAY) {
11663
+ return null;
11664
+ }
11665
+ const date = new Date(year, month - 1, day);
11666
+ // Guard the residual case where JS still rolls a value (e.g. Feb 30 → Mar 2).
11667
+ // After construction, getFullYear/getMonth/getDate should match the inputs.
11668
+ if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) {
11669
+ return null;
11670
+ }
11671
+ const ts = Math.floor(date.getTime() / 1000);
11672
+ return Number.isFinite(ts) ? ts : null;
11673
+ }
11674
+
11675
+ /**
11676
+ * Builds a `Set<number>` of seconds-since-epoch timestamps covering both the
11677
+ * legacy `disabledDays` (already-numeric) array and the ISO `blackoutDates`
11678
+ * array. Use this for O(1) membership checks in hot paths.
11679
+ *
11680
+ * @param {Array<string|number>|undefined} disabledDays - Legacy timestamp array.
11681
+ * @param {Array<string>|undefined} blackoutDates - ISO `YYYY-MM-DD` array.
11682
+ * @returns {Set<number>}
11683
+ */
11684
+ function buildBlackoutSet(disabledDays, blackoutDates) {
11685
+ const set = new Set();
11686
+ if (Array.isArray(disabledDays)) {
11687
+ for (const day of disabledDays) {
11688
+ const ts = parseInt(day, 10);
11689
+ if (Number.isFinite(ts)) {
11690
+ set.add(ts);
11691
+ }
11692
+ }
11693
+ }
11694
+ if (Array.isArray(blackoutDates)) {
11695
+ for (const isoStr of blackoutDates) {
11696
+ const ts = parseIsoToTimestamp(isoStr);
11697
+ if (ts !== null) {
11698
+ set.add(ts);
11699
+ }
11700
+ }
11701
+ }
11702
+ return set;
11703
+ }
11704
+
11705
+ /**
11706
+ * One-shot membership test for a single timestamp against both blackout
11707
+ * sources. Allocates a Set on each call; only use this in cold paths
11708
+ * (e.g. the pre-`firstUpdated` cell fallback). Hot paths should hold the
11709
+ * Set returned from `buildBlackoutSet` and `.has(ts)` directly.
11710
+ *
11711
+ * @param {number} dateTs - Unix timestamp (seconds) to test.
11712
+ * @param {Array<string|number>|undefined} disabledDays - Legacy timestamp array.
11713
+ * @param {Array<string>|undefined} blackoutDates - ISO `YYYY-MM-DD` array.
11714
+ * @returns {boolean}
11715
+ */
11716
+ function isBlackoutTimestamp(dateTs, disabledDays, blackoutDates) {
11717
+ return buildBlackoutSet(disabledDays, blackoutDates).has(dateTs);
11718
+ }
11719
+
11720
+ /* 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 */
11561
11721
 
11562
11722
  class AuroCalendarCell extends LitElement {
11563
11723
  constructor() {
@@ -11605,6 +11765,14 @@ class AuroCalendarCell extends LitElement {
11605
11765
  type: Boolean,
11606
11766
  reflect: true
11607
11767
  },
11768
+ /**
11769
+ * @deprecated Propagated from the legacy `auro-calendar.disabledDays`
11770
+ * Unix-timestamp array. The cell honors it for backward compatibility
11771
+ * (see the divergence-check fallback inside `isBlackout`), but
11772
+ * consumers should migrate to `auro-datepicker.blackoutDates`
11773
+ * (YYYY-MM-DD ISO strings). The calendar emits a one-time
11774
+ * deprecation warning the first time a non-empty value is observed.
11775
+ */
11608
11776
  disabledDays: { type: Array },
11609
11777
  isCurrentDate: { type: Boolean },
11610
11778
  locale: { type: String },
@@ -11650,8 +11818,8 @@ class AuroCalendarCell extends LitElement {
11650
11818
  const parsedDateTo = parseInt(dateTo, 10);
11651
11819
 
11652
11820
  if (day) {
11653
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
11654
- const returnTimestamp = startOfDay$1(parsedDateTo * 1000) / 1000;
11821
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
11822
+ const returnTimestamp = new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000;
11655
11823
 
11656
11824
  if (day.date === departTimestamp || day.date === returnTimestamp) {
11657
11825
  this.selected = true;
@@ -11735,27 +11903,33 @@ class AuroCalendarCell extends LitElement {
11735
11903
  return false;
11736
11904
  }
11737
11905
 
11738
- // Check against disabledDays timestamps (legacy path)
11739
- if (Array.isArray(this.disabledDays) && this.disabledDays.length > 0 &&
11740
- (this.disabledDays.findIndex(dd => parseInt(dd, 10) === this.day.date) !== -1)) {
11741
- return true;
11742
- }
11743
-
11744
- // Check against blackoutDates (ISO format YYYY-MM-DD) on the datepicker
11745
- const blackoutDates = this.datepicker?.blackoutDates;
11746
-
11747
- if (Array.isArray(blackoutDates) && blackoutDates.length > 0) {
11748
- const date = new Date(this.day.date * 1000);
11749
- const yyyy = date.getFullYear();
11750
- const mm = String(date.getMonth() + 1).padStart(2, '0');
11751
- const dd = String(date.getDate()).padStart(2, '0');
11752
- const cellDate = `${yyyy}-${mm}-${dd}`;
11753
- if (blackoutDates.includes(cellDate)) {
11906
+ // Delegate to the calendar's memoized blackout Set for O(1) lookup
11907
+ // (instead of rescanning disabledDays + blackoutDates per render). The
11908
+ // Set is rebuilt only when either source array reference changes — see
11909
+ // auro-calendar.js#_getBlackoutSet.
11910
+ if (this.calendar && typeof this.calendar._getBlackoutSet === 'function') {
11911
+ if (this.calendar._getBlackoutSet().has(this.day.date)) {
11754
11912
  return true;
11755
11913
  }
11914
+ // If the cell's local disabledDays diverged from the calendar's (a
11915
+ // consumer or test mutated cell.disabledDays directly), the Set does
11916
+ // not reflect that addition — fall through to the per-cell scan only
11917
+ // when the reference no longer matches. Production data flow keeps
11918
+ // these identical, so this branch stays cold. Guarded with
11919
+ // Array.isArray to match `_getBlackoutSet`'s contract: non-array
11920
+ // values are treated as empty rather than crashing on `.findIndex`.
11921
+ if (Array.isArray(this.disabledDays) && this.disabledDays !== this.calendar.disabledDays && this.disabledDays.length > 0) {
11922
+ if (this.disabledDays.findIndex((dd) => parseInt(dd, 10) === this.day.date) !== -1) {
11923
+ return true;
11924
+ }
11925
+ }
11926
+ return false;
11756
11927
  }
11757
11928
 
11758
- return false;
11929
+ // Pre-firstUpdated fallback — the cell may render once before the
11930
+ // ancestor calendar is wired up. Routes through the shared
11931
+ // blackoutUtils helper so the parsing rules stay in one place.
11932
+ return isBlackoutTimestamp(this.day.date, this.disabledDays, this.datepicker?.blackoutDates);
11759
11933
  }
11760
11934
 
11761
11935
  /**
@@ -11861,12 +12035,12 @@ class AuroCalendarCell extends LitElement {
11861
12035
  const parsedDateFrom = Number.parseInt(this.dateFrom, 10);
11862
12036
  if (!Number.isFinite(parsedDateFrom)) return null;
11863
12037
 
11864
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
12038
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
11865
12039
  const dayDate = this.day.date;
11866
12040
 
11867
12041
  const parsedDateTo = Number.parseInt(this.dateTo, 10);
11868
12042
  const hasDateTo = Number.isFinite(parsedDateTo);
11869
- const returnTimestamp = hasDateTo ? startOfDay$1(parsedDateTo * 1000) / 1000 : null;
12043
+ const returnTimestamp = hasDateTo ? new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000 : null;
11870
12044
 
11871
12045
  if (dayDate === departTimestamp) return this.datepicker.rangeLabelStart || 'range start';
11872
12046
 
@@ -11876,7 +12050,9 @@ class AuroCalendarCell extends LitElement {
11876
12050
 
11877
12051
  if (hasDateTo && dayDate > departTimestamp && dayDate < returnTimestamp) return this.datepicker.rangeLabelInRange || 'in range';
11878
12052
 
11879
- // After start date, no end date yet, or after end date
12053
+ if (!hasDateTo && dayDate > departTimestamp) return this.datepicker.rangeLabelEndPreview || 'previewing range end';
12054
+
12055
+ // After end date when both dateFrom and dateTo are set.
11880
12056
  return this.datepicker.rangeLabelAfterRange || 'after range';
11881
12057
  }
11882
12058
 
@@ -11889,7 +12065,7 @@ class AuroCalendarCell extends LitElement {
11889
12065
  */
11890
12066
  isDepartDate(day, dateFrom) {
11891
12067
  const parsedDateFrom = parseInt(dateFrom, 10);
11892
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
12068
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
11893
12069
 
11894
12070
  return this.selected && day.date === departTimestamp;
11895
12071
  }
@@ -11904,7 +12080,7 @@ class AuroCalendarCell extends LitElement {
11904
12080
  */
11905
12081
  isReturnDate(day, dateFrom, dateTo) {
11906
12082
  const parsedDateTo = parseInt(dateTo, 10);
11907
- const returnTimestamp = startOfDay$1(parsedDateTo * 1000) / 1000;
12083
+ const returnTimestamp = new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000;
11908
12084
 
11909
12085
  return this.selected && day.date === returnTimestamp && dateFrom;
11910
12086
  }
@@ -12061,13 +12237,37 @@ class AuroCalendarCell extends LitElement {
12061
12237
  }
12062
12238
 
12063
12239
  firstUpdated() {
12240
+ this._initFromAncestors();
12241
+ }
12242
+
12243
+ /**
12244
+ * Wires the cell to its ancestor calendar-month and calendar (and, via
12245
+ * the calendar, to the datepicker). Extracted from firstUpdated() so the
12246
+ * retry loop can re-attempt without recursively invoking a Lit lifecycle
12247
+ * method (which is outside the framework's contract).
12248
+ * @private
12249
+ * @returns {void}
12250
+ */
12251
+ _initFromAncestors() {
12064
12252
  const calendarMonth = this.runtimeUtils.closestElement('auro-formkit-calendar-month', this);
12065
12253
  const calendar = this.runtimeUtils.closestElement('auro-formkit-calendar', calendarMonth);
12066
12254
 
12067
12255
  if (!calendar) {
12068
- setTimeout(() => this.firstUpdated(), 0);
12256
+ // Retry on the next event-loop turn to give the ancestor chain a chance
12257
+ // to attach — but cap attempts so a permanently detached cell doesn't
12258
+ // spin forever. 10 turns is far more than any observed race needs.
12259
+ this._firstUpdatedRetries = (this._firstUpdatedRetries || 0) + 1;
12260
+ if (this._firstUpdatedRetries > 10) {
12261
+ return;
12262
+ }
12263
+ this._firstUpdatedRetryTimer = setTimeout(() => {
12264
+ this._firstUpdatedRetryTimer = null;
12265
+ this._initFromAncestors();
12266
+ }, 0);
12069
12267
  return;
12070
12268
  }
12269
+ this._firstUpdatedRetries = 0;
12270
+ this.calendar = calendar;
12071
12271
  this.datepicker = calendar.datepicker;
12072
12272
  this._slotContentHandler = () => {
12073
12273
  this.handleSlotContent();
@@ -12094,6 +12294,10 @@ class AuroCalendarCell extends LitElement {
12094
12294
  if (this.datepicker && this._slotContentHandler) {
12095
12295
  this.datepicker.removeEventListener('auroDatePicker-newSlotContent', this._slotContentHandler);
12096
12296
  }
12297
+ if (this._firstUpdatedRetryTimer) {
12298
+ clearTimeout(this._firstUpdatedRetryTimer);
12299
+ this._firstUpdatedRetryTimer = null;
12300
+ }
12097
12301
  }
12098
12302
 
12099
12303
  /**
@@ -12125,15 +12329,28 @@ class AuroCalendarCell extends LitElement {
12125
12329
  this._cachedButton = this.shadowRoot.querySelector('button.day');
12126
12330
  });
12127
12331
 
12128
- // Update host-level aria attributes for ariaActiveDescendantElement.
12332
+ // Keep the host's gridcell aria attributes in sync with the day data.
12129
12333
  this.updateHostAria();
12130
12334
  }
12131
12335
 
12132
12336
  // Update host aria when selection changes (aria-selected, range labels)
12133
- if (properties.has('dateFrom') || properties.has('dateTo') || properties.has('selected')) {
12337
+ // or when isCurrentDate flips (aria-current).
12338
+ if (properties.has('dateFrom') || properties.has('dateTo') || properties.has('selected') || properties.has('isCurrentDate')) {
12134
12339
  this.updateHostAria();
12135
12340
  }
12136
12341
 
12342
+ // When the rendered range shifts (month nav, min/max change), a cell
12343
+ // host may be re-rendered for a new date that is now out-of-range —
12344
+ // but its imperatively-set `active` flag and `activeCell` ring class
12345
+ // from the previous date persist because setActiveCell only iterates
12346
+ // focusable (in-range) cells when clearing the prior active state.
12347
+ // Drop the active state here so the disabled cell isn't left visually
12348
+ // ringed.
12349
+ if ((properties.has('day') || properties.has('min') || properties.has('max')) &&
12350
+ this.active && this.isOutOfRange(this.day, this.min, this.max)) {
12351
+ this.clearActive();
12352
+ }
12353
+
12137
12354
  // Configure popover when it first becomes rendered
12138
12355
  if (properties.has('hasPopoverContent') && this.hasPopoverContent) {
12139
12356
  this.updateComplete.then(() => this.configurePopover());
@@ -12141,8 +12358,8 @@ class AuroCalendarCell extends LitElement {
12141
12358
  }
12142
12359
 
12143
12360
  /**
12144
- * Updates ARIA attributes on the host element so that
12145
- * ariaActiveDescendantElement can expose cell info to the SR.
12361
+ * Sets host-level ARIA so each cell exposes its date, selection state,
12362
+ * and blackout status to assistive tech browsing the month grid.
12146
12363
  * @private
12147
12364
  * @returns {void}
12148
12365
  */
@@ -12151,16 +12368,27 @@ class AuroCalendarCell extends LitElement {
12151
12368
 
12152
12369
  const outOfRange = this.isOutOfRange(this.day, this.min, this.max);
12153
12370
  if (outOfRange) {
12371
+ // Strip every aria attribute the in-range branch may have set on a
12372
+ // previous render — if a cell flips from in-range to out-of-range
12373
+ // (calendar shifts months, minDate/maxDate change, etc.).
12154
12374
  this.removeAttribute('role');
12155
12375
  this.removeAttribute('aria-label');
12376
+ this.removeAttribute('aria-current');
12377
+ this.removeAttribute('aria-selected');
12378
+ this.removeAttribute('aria-disabled');
12156
12379
  return;
12157
12380
  }
12158
12381
 
12159
- // The host acts as the gridcell for ariaActiveDescendantElement.
12160
12382
  this.setAttribute('role', 'gridcell');
12161
12383
  this.setAttribute('aria-label', this.getAriaLabel());
12162
12384
  this.setAttribute('aria-selected', this.selected ? 'true' : 'false');
12163
12385
 
12386
+ if (this.isCurrentDate) {
12387
+ this.setAttribute('aria-current', 'date');
12388
+ } else {
12389
+ this.removeAttribute('aria-current');
12390
+ }
12391
+
12164
12392
  if (this.isBlackout()) {
12165
12393
  this.setAttribute('aria-disabled', 'true');
12166
12394
  } else {
@@ -12175,7 +12403,7 @@ class AuroCalendarCell extends LitElement {
12175
12403
  * @returns {void}
12176
12404
  */
12177
12405
  focusButton() {
12178
- const button = this._cachedButton || this.shadowRoot.querySelector('button:not([aria-hidden])');
12406
+ const button = this._cachedButton || this.shadowRoot.querySelector('button:not([disabled])');
12179
12407
  if (button) {
12180
12408
  button.focus({ focusVisible: true });
12181
12409
  }
@@ -12183,10 +12411,22 @@ class AuroCalendarCell extends LitElement {
12183
12411
 
12184
12412
  /**
12185
12413
  * Imperatively marks this cell as active without triggering a Lit re-render.
12186
- * Note: buttons stay tabindex="-1" because the grid uses aria-activedescendant.
12414
+ * Buttons stay tabindex="-1" because DOM focus stays on the grid wrapper
12415
+ * arrow keys move the active cell imperatively and the live region carries
12416
+ * the SR announcement.
12417
+ *
12418
+ * Refuses to activate out-of-range cells: those are aria-hidden, have no
12419
+ * click/focus handlers, and are filtered out of `getFocusableCells`. The
12420
+ * active class showing on a disabled cell would be visually misleading,
12421
+ * so this guard is the single source of truth across every code path
12422
+ * that might call setActive (keyboard nav, focus restore, cell click).
12187
12423
  * @returns {void}
12188
12424
  */
12189
12425
  setActive() {
12426
+ if (this.isOutOfRange(this.day, this.min, this.max)) {
12427
+ return;
12428
+ }
12429
+
12190
12430
  this.active = true;
12191
12431
 
12192
12432
  // Show the popover when this cell becomes active via keyboard navigation.
@@ -12225,10 +12465,13 @@ class AuroCalendarCell extends LitElement {
12225
12465
  if (!btn || !this.day) return;
12226
12466
 
12227
12467
  const dayDate = this.day.date;
12228
- const departTimestamp = startOfDay$1(dateFrom * 1000) / 1000;
12468
+ const departTimestamp = new Date(dateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
12229
12469
  const isInRange = dayDate > departTimestamp && dayDate < hoveredDate;
12230
- const isLastHovered = dayDate === hoveredDate && hoveredDate > departTimestamp;
12231
- const isDepartWithPreview = dayDate === departTimestamp && hoveredDate > departTimestamp;
12470
+ // `>=` so hovering the depart cell itself (a same-day round-trip
12471
+ // preview) still surfaces a visual cue: the depart cell receives both
12472
+ // rangeDepartDate and lastHoveredDate.
12473
+ const isLastHovered = dayDate === hoveredDate && hoveredDate >= departTimestamp;
12474
+ const isDepartWithPreview = dayDate === departTimestamp && hoveredDate >= departTimestamp;
12232
12475
 
12233
12476
  btn.classList.toggle('inRange', isInRange);
12234
12477
  btn.classList.toggle('lastHoveredDate', isLastHovered);
@@ -12247,6 +12490,41 @@ class AuroCalendarCell extends LitElement {
12247
12490
  btn.classList.remove('inRange', 'lastHoveredDate', 'rangeDepartDate');
12248
12491
  }
12249
12492
 
12493
+ /**
12494
+ * Re-applies the committed-range classes (inRange / rangeDepartDate /
12495
+ * rangeReturnDate) imperatively from the cell's current `day`,
12496
+ * `dateFrom`, and `dateTo`. Used after month navigation flushes:
12497
+ * classMap in `renderCellButton` tracks its own previous state, so a
12498
+ * preceding imperative `classList.remove` (from
12499
+ * `clearRangePreviewClasses`) leaves classMap thinking the class is
12500
+ * still applied. On re-render with the same class-value, classMap emits
12501
+ * no delta and the class stays missing in the DOM. Re-toggling
12502
+ * imperatively resyncs the DOM with the committed range.
12503
+ *
12504
+ * Delegates to the same `isInRange` / `isDepartDate` / `isReturnDate`
12505
+ * helpers `renderCellButton` uses, so the two code paths cannot drift
12506
+ * (including whatever timestamp normalization those helpers apply).
12507
+ * @returns {void}
12508
+ */
12509
+ applyCommittedRangeClasses() {
12510
+ if (!this.day) return;
12511
+ // Fall back to a shadowRoot query when `_cachedButton` hasn't
12512
+ // populated yet — this method's whole job is recovering from stale
12513
+ // DOM after a month re-render, so no-oping on a cache miss defeats
12514
+ // the fix (mirrors the fallback in `clearActive()`).
12515
+ const btn = this._cachedButton || this.shadowRoot?.querySelector('button.day');
12516
+ if (!btn) return;
12517
+
12518
+ const hasRange = this.datepicker?.hasAttribute('range');
12519
+ const inRange = hasRange && this.dateTo && this.isInRange(this.day, this.dateFrom, this.dateTo);
12520
+ const isDepart = hasRange && this.isDepartDate(this.day, this.dateFrom) && this.dateTo;
12521
+ const isReturn = hasRange && this.isReturnDate(this.day, this.dateFrom, this.dateTo);
12522
+
12523
+ btn.classList.toggle('inRange', Boolean(inRange));
12524
+ btn.classList.toggle('rangeDepartDate', Boolean(isDepart));
12525
+ btn.classList.toggle('rangeReturnDate', Boolean(isReturn));
12526
+ }
12527
+
12250
12528
  renderCellButton() {
12251
12529
  const outOfRange = this.isOutOfRange(this.day, this.min, this.max);
12252
12530
  const blackout = this.isBlackout();
@@ -12286,7 +12564,6 @@ class AuroCalendarCell extends LitElement {
12286
12564
  @focus="${outOfRange ? undefined : this.handleFocus}"
12287
12565
  class="${classMap(buttonClasses)}"
12288
12566
  ?disabled="${outOfRange}"
12289
- aria-hidden="${outOfRange ? 'true' : nothing}"
12290
12567
  tabindex="-1">
12291
12568
  <div class="buttonWrapper" aria-hidden="true">
12292
12569
  <div class="currentDayMarker">${this.day?.title || nothing}</div>
@@ -12997,7 +13274,7 @@ class CalendarUtilities {
12997
13274
 
12998
13275
  var colorCss$4 = css`#headerContainer{box-shadow:var(--ds-auro-dropdownbib-header-boxshadow-color)}#footerContainer{background-color:var(--ds-auro-dropdownbib-footer-container-color)}`;
12999
13276
 
13000
- var styleCss$4 = css`#bibTemplate{display:flex;overflow:hidden;height:100%;max-height:100%;flex-direction:column}#headerContainer{display:flex;flex-direction:column;padding:var(--ds-size-200, 1rem);padding-top:var(--ds-size-400, 2rem);padding-bottom:0}#headerContainer .titleRow{display:flex;flex-direction:row;justify-content:space-between;gap:var(--ds-size-100, 0.5rem)}#headerContainer .header{max-width:calc(100vw - var(--ds-size-900, 4.5rem));padding-top:var(--ds-size-200, 1rem)}#headerContainer .subheader{width:100%}#closeButton [auro-icon]{--ds-auro-icon-size: var(--ds-size-500, 2.5rem)}#bodyContainer{position:relative;overflow:auto;flex:1 1 100%}:host([isfullscreen]) #bibTemplate{max-height:100dvh}:host([isfullscreen]) #bodyContainer{margin-top:var(--ds-size-100, 0.5rem)}#footerContainer{position:absolute;right:0;bottom:0;left:0;padding:var(--ds-size-200, 1rem)}`;
13277
+ var styleCss$4 = css`#bibTemplate{display:flex;overflow:hidden;height:100%;max-height:100%;flex-direction:column}#headerContainer{display:flex;flex-direction:column;padding:var(--ds-size-200, 1rem);padding-top:var(--ds-size-400, 2rem);padding-bottom:0}#headerContainer .titleRow{display:flex;flex-direction:row;justify-content:space-between;padding-bottom:var(--ds-size-200, 1rem);gap:var(--ds-size-100, 0.5rem)}#headerContainer .header{max-width:calc(100vw - var(--ds-size-900, 4.5rem))}#headerContainer .subheader{width:100%}#closeButton [auro-icon]{--ds-auro-icon-size: var(--ds-size-500, 2.5rem)}#bodyContainer{position:relative;overflow:auto;flex:1}:host([isfullscreen]) #bibTemplate{max-height:100dvh}:host([isfullscreen]) #bodyContainer{margin-top:var(--ds-size-100, 0.5rem)}#footerContainer{padding:var(--ds-size-200, 1rem)}`;
13001
13278
 
13002
13279
  var tokenCss = css`:host{--ds-auro-dropdownbib-header-boxshadow-color: var(--ds-elevation-200, 0px 0px 10px rgba(0, 0, 0, 0.15));--ds-auro-dropdownbib-footer-container-color: var(--ds-basic-color-surface-default, #ffffff)}`;
13003
13280
 
@@ -13392,7 +13669,7 @@ class AuroBibtemplate extends LitElement {
13392
13669
  }
13393
13670
  }
13394
13671
 
13395
- var formkitVersion$2 = '202606191810';
13672
+ var formkitVersion$2 = '202607221815';
13396
13673
 
13397
13674
  let l$1 = class l{generateElementName(t,e){let o=t;return o+="-",o+=e.replace(/[.]/g,"_"),o}generateTag(o,s,a){const r=this.generateElementName(o,s),i=literal`${unsafeStatic(r)}`;return customElements.get(r)||customElements.define(r,class extends a{}),i}};let d$1 = class d{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}getSlotText(t,e){const o=t.shadowRoot?.querySelector(`slot[name="${e}"]`),s=(o?.assignedNodes({flatten:true})||[]).map(t=>t.textContent?.trim()).join(" ").trim();return s||null}};let h$1 = class h{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}};var c$1=css`:host{color:var(--ds-auro-loader-color)}:host>span{background-color:var(--ds-auro-loader-background-color);border-color:var(--ds-auro-loader-border-color)}:host([onlight]),:host([appearance=brand]){--ds-auro-loader-color: var(--ds-basic-color-brand-primary, #01426a)}:host([ondark]),:host([appearance=inverse]){--ds-auro-loader-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host([orbit])>span{--ds-auro-loader-background-color: transparent}:host([orbit])>span:nth-child(1){--ds-auro-loader-border-color: currentcolor;opacity:.25}:host([orbit])>span:nth-child(2){--ds-auro-loader-border-color: currentcolor;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}
13398
13675
  `,u$4=css`.body-default{font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default,.body-lg{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-lg{font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-sm{font-size:var(--wcss-body-sm-font-size, .875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm,.body-xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-xs{font-size:var(--wcss-body-xs-font-size, .75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-2xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:var(--wcss-body-2xs-font-size, .625rem);font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0);line-height:var(--wcss-body-2xs-line-height, .875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));font-weight:var(--wcss-display-2xl-weight, 300);letter-spacing:var(--wcss-display-2xl-letter-spacing, 0);line-height:var(--wcss-display-2xl-line-height, 1.3)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));font-weight:var(--wcss-display-xl-weight, 300);letter-spacing:var(--wcss-display-xl-letter-spacing, 0);line-height:var(--wcss-display-xl-line-height, 1.3)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));font-weight:var(--wcss-display-lg-weight, 300);letter-spacing:var(--wcss-display-lg-letter-spacing, 0);line-height:var(--wcss-display-lg-line-height, 1.3)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));font-weight:var(--wcss-display-md-weight, 300);letter-spacing:var(--wcss-display-md-letter-spacing, 0);line-height:var(--wcss-display-md-line-height, 1.3)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));font-weight:var(--wcss-display-sm-weight, 300);letter-spacing:var(--wcss-display-sm-letter-spacing, 0);line-height:var(--wcss-display-sm-line-height, 1.3)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));font-weight:var(--wcss-display-xs-weight, 300);letter-spacing:var(--wcss-display-xs-letter-spacing, 0);line-height:var(--wcss-display-xs-line-height, 1.3)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));font-weight:var(--wcss-heading-xl-weight, 300);letter-spacing:var(--wcss-heading-xl-letter-spacing, 0);line-height:var(--wcss-heading-xl-line-height, 1.3)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));font-weight:var(--wcss-heading-lg-weight, 300);letter-spacing:var(--wcss-heading-lg-letter-spacing, 0);line-height:var(--wcss-heading-lg-line-height, 1.3)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));font-weight:var(--wcss-heading-md-weight, 300);letter-spacing:var(--wcss-heading-md-letter-spacing, 0);line-height:var(--wcss-heading-md-line-height, 1.3)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));font-weight:var(--wcss-heading-sm-weight, 300);letter-spacing:var(--wcss-heading-sm-letter-spacing, 0);line-height:var(--wcss-heading-sm-line-height, 1.3)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));font-weight:var(--wcss-heading-xs-weight, 450);letter-spacing:var(--wcss-heading-xs-letter-spacing, 0);line-height:var(--wcss-heading-xs-line-height, 1.3)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));font-weight:var(--wcss-heading-2xs-weight, 450);letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0);line-height:var(--wcss-heading-2xs-line-height, 1.3)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));font-weight:var(--wcss-accent-2xl-weight, 450);letter-spacing:var(--wcss-accent-2xl-letter-spacing, .05em);line-height:var(--wcss-accent-2xl-line-height, 1)}.accent-2xl,.accent-xl{text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));font-weight:var(--wcss-accent-xl-weight, 450);letter-spacing:var(--wcss-accent-xl-letter-spacing, .05em);line-height:var(--wcss-accent-xl-line-height, 1.3)}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));font-weight:var(--wcss-accent-lg-weight, 450);letter-spacing:var(--wcss-accent-lg-letter-spacing, .05em);line-height:var(--wcss-accent-lg-line-height, 1.3)}.accent-lg,.accent-md{text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));font-weight:var(--wcss-accent-md-weight, 500);letter-spacing:var(--wcss-accent-md-letter-spacing, .05em);line-height:var(--wcss-accent-md-line-height, 1.3)}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));font-weight:var(--wcss-accent-sm-weight, 500);letter-spacing:var(--wcss-accent-sm-letter-spacing, .05em);line-height:var(--wcss-accent-sm-line-height, 1.3)}.accent-sm,.accent-xs{text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));font-weight:var(--wcss-accent-xs-weight, 500);letter-spacing:var(--wcss-accent-xs-letter-spacing, .1em);line-height:var(--wcss-accent-xs-line-height, 1.3)}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xs-font-size, clamp(.875rem, 1.1666666667vw, .875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, .1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}:focus:not(:focus-visible){outline:3px solid transparent}:host,:host>span{position:relative}:host{width:2rem;height:2rem;display:inline-block;font-size:0}:host>span{position:absolute;display:inline-block;float:none;top:0;left:0;width:2rem;height:2rem;border-radius:100%;border-style:solid;border-width:0;box-sizing:border-box}:host([xs]),:host([xs])>span{width:1.2rem;height:1.2rem}:host([sm]),:host([sm])>span{width:3rem;height:3rem}:host([md]),:host([md])>span{width:5rem;height:5rem}:host([lg]),:host([lg])>span{width:8rem;height:8rem}:host{--margin: .375rem;--margin-xs: .2rem;--margin-sm: .5rem;--margin-md: .75rem;--margin-lg: 1rem}:host([pulse]),:host([pulse])>span{position:relative}:host([pulse]){width:calc(3rem + var(--margin) * 6);height:calc(1rem + var(--margin) * 2)}:host([pulse])>span{width:1rem;height:1rem;margin:var(--margin);animation:pulse 1.5s ease infinite}:host([pulse][xs]){width:calc(1.95rem + var(--margin-xs) * 6);height:calc(.65rem + var(--margin-xs) * 2)}:host([pulse][xs])>span{margin:var(--margin-xs);width:.65rem;height:.65rem}:host([pulse][sm]){width:calc(6rem + var(--margin-sm) * 6);height:calc(2rem + var(--margin-sm) * 2)}:host([pulse][sm])>span{margin:var(--margin-sm);width:2rem;height:2rem}:host([pulse][md]){width:calc(9rem + var(--margin-md) * 6);height:calc(3rem + var(--margin-md) * 2)}:host([pulse][md])>span{margin:var(--margin-md);width:3rem;height:3rem}:host([pulse][lg]){width:calc(15rem + var(--margin-lg) * 6);height:calc(5rem + var(--margin-lg) * 2)}:host([pulse][lg])>span{margin:var(--margin-lg);width:5rem;height:5rem}:host([pulse])>span:nth-child(1){animation-delay:-.4s}:host([pulse])>span:nth-child(2){animation-delay:-.2s}:host([pulse])>span:nth-child(3){animation-delay:0ms}@keyframes pulse{0%,to{opacity:.1;transform:scale(.9)}50%{opacity:1;transform:scale(1.1)}}:host([orbit]),:host([orbit])>span{opacity:1}:host([orbit])>span{border-width:5px}:host([orbit])>span:nth-child(2){animation:orbit 2s linear infinite}:host([orbit][sm])>span{border-width:8px}:host([orbit][md])>span{border-width:13px}:host([orbit][lg])>span{border-width:21px}@keyframes orbit{0%{transform:rotate(0)}to{transform:rotate(360deg)}}:host([ringworm])>svg{animation:rotate 2s linear infinite;height:100%;width:100%;stroke:currentcolor;stroke-width:8}:host([ringworm]) .path{stroke-dashoffset:0;animation:ringworm 1.5s ease-in-out infinite;stroke-linecap:round}@keyframes rotate{to{transform:rotate(360deg)}}@keyframes ringworm{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}:host([laser]){position:static;width:100%;display:block;height:0;overflow:hidden;font-size:unset}:host([laser])>span{position:fixed;width:100%;height:.25rem;border-radius:0;z-index:100}:host([laser])>span:nth-child(1){border-color:currentcolor;opacity:.25}:host([laser])>span:nth-child(2){border-color:currentcolor;animation:laser 2s linear infinite;opacity:1;width:50%}:host([laser][sm])>span:nth-child(2){width:20%}:host([laser][md])>span:nth-child(2){width:30%}:host([laser][lg])>span:nth-child(2){width:50%;animation-duration:1.5s}:host([laser][xl])>span:nth-child(2){width:80%;animation-duration:1.5s}@keyframes laser{0%{left:-100%}to{left:110%}}:host>.no-animation{display:none}@media (prefers-reduced-motion: reduce){:host{display:flex;align-items:center;justify-content:center}:host>span{opacity:1}:host>.loader{display:none}:host>svg{display:none}:host>.no-animation{display:block}}
@@ -13497,6 +13774,15 @@ class AuroCalendar extends RangeDatepicker {
13497
13774
  */
13498
13775
  this.activeCellDate = null;
13499
13776
 
13777
+ /**
13778
+ * Cached reference to the active cell host. Set by setActiveCell and
13779
+ * refreshed by scrollToActiveCell when its cache check misses (stale
13780
+ * or missing). Lets scrollToActiveCell skip a full cell scan on each
13781
+ * arrow key.
13782
+ * @private
13783
+ */
13784
+ this._activeCell = null;
13785
+
13500
13786
  /**
13501
13787
  * Whether the #calendarGrid wrapper currently has focus.
13502
13788
  * Used to determine whether the visualFocus ring should be shown.
@@ -13515,10 +13801,17 @@ class AuroCalendar extends RangeDatepicker {
13515
13801
  this.calendarRangeMonths = null;
13516
13802
 
13517
13803
  /**
13518
- * Legacy array of disabled-date timestamps.
13804
+ * @deprecated Use `auro-datepicker.blackoutDates` (an array of
13805
+ * `YYYY-MM-DD` ISO strings) instead. This legacy array of Unix
13806
+ * timestamps is still honored for backward compatibility but emits a
13807
+ * one-time `console.debug` the first time a non-empty value is observed.
13808
+ * Support will be removed in a future major release.
13519
13809
  * @private
13520
13810
  */
13521
- this.disabledDays = [];
13811
+ // Initialize the backing field directly so the constructor's default
13812
+ // empty array doesn't trigger the deprecation warning. Assignments from
13813
+ // consumers still route through the setter below.
13814
+ this._disabledDays = [];
13522
13815
 
13523
13816
  /**
13524
13817
  * @private
@@ -13551,6 +13844,44 @@ class AuroCalendar extends RangeDatepicker {
13551
13844
  this._calendarInstanceId = Date.now().toString(36);
13552
13845
  }
13553
13846
 
13847
+ /**
13848
+ * @deprecated See constructor JSDoc — migrate to
13849
+ * `auro-datepicker.blackoutDates`. The getter/setter pair exists so the
13850
+ * one-time deprecation warning fires as soon as a consumer assigns a
13851
+ * non-empty array (empty assignments are ignored — an empty array is
13852
+ * indistinguishable from the constructor default and would produce a
13853
+ * spurious warning), rather than only when `_getBlackoutSet()` happens
13854
+ * to rebuild.
13855
+ * @returns {Array} The current legacy `disabledDays` array.
13856
+ */
13857
+ get disabledDays() {
13858
+ return this._disabledDays;
13859
+ }
13860
+
13861
+ /**
13862
+ * @param {Array} value - The legacy `disabledDays` array to set.
13863
+ */
13864
+ set disabledDays(value) {
13865
+ const oldValue = this._disabledDays;
13866
+ // Coerce non-arrays to `[]`. Consumers occasionally pass `null`
13867
+ // (Lit's Array attribute converter returns null for a missing/empty
13868
+ // attribute) or misuse the API; downstream code in
13869
+ // `auro-calendar-cell.isEnabled` calls `.findIndex()` on this value
13870
+ // without an Array.isArray guard, so a truthy non-array would throw
13871
+ // at render.
13872
+ const coerced = Array.isArray(value) ? value : [];
13873
+ if (coerced.length > 0) {
13874
+ this._warnDisabledDaysDeprecated();
13875
+ }
13876
+ this._disabledDays = coerced;
13877
+ // `disabledDays` is a Lit `@property({ type: Array })` on the
13878
+ // RangeDatepicker base class; Lit's generated setter (which we've
13879
+ // overridden here to insert the warning) is what normally invalidates
13880
+ // the reactive cycle. Re-invoke requestUpdate manually so consumer
13881
+ // assignments still re-render the calendar.
13882
+ this.requestUpdate('disabledDays', oldValue);
13883
+ }
13884
+
13554
13885
  static get styles() {
13555
13886
  return [
13556
13887
  styleCss$7,
@@ -13724,6 +14055,11 @@ class AuroCalendar extends RangeDatepicker {
13724
14055
  if (!opts.skipActiveUpdate) {
13725
14056
  this.updateActiveCellForVisibleMonth();
13726
14057
  }
14058
+ // clearRangePreview above strips classMap-managed range classes from
14059
+ // the DOM; classMap's private state still thinks they're applied, so
14060
+ // it won't re-add them on the post-nav re-render. Re-apply imperatively
14061
+ // after both months and their cell button caches have settled.
14062
+ this.scheduleCommittedRangeClassRefresh();
13727
14063
  this.announceMonthChange();
13728
14064
  }
13729
14065
 
@@ -13742,6 +14078,11 @@ class AuroCalendar extends RangeDatepicker {
13742
14078
  if (!opts.skipActiveUpdate) {
13743
14079
  this.updateActiveCellForVisibleMonth();
13744
14080
  }
14081
+ // clearRangePreview above strips classMap-managed range classes from
14082
+ // the DOM; classMap's private state still thinks they're applied, so
14083
+ // it won't re-add them on the post-nav re-render. Re-apply imperatively
14084
+ // after both months and their cell button caches have settled.
14085
+ this.scheduleCommittedRangeClassRefresh();
13745
14086
  this.announceMonthChange();
13746
14087
  }
13747
14088
 
@@ -13772,17 +14113,44 @@ class AuroCalendar extends RangeDatepicker {
13772
14113
  * @returns {void}
13773
14114
  */
13774
14115
  updateActiveCellForVisibleMonth() {
13775
- // Use double-rAF to ensure child month/cell components have fully
13776
- // rendered and cached their button references before we set tabindex.
13777
- requestAnimationFrame(() => {
13778
- requestAnimationFrame(() => {
13779
- const newDate = this.computeActiveDate({ skipDateFrom: true });
14116
+ this._afterMonthRender(() => {
14117
+ const newDate = this.computeActiveDate({ skipDateFrom: true });
13780
14118
 
13781
- if (newDate !== null && newDate !== undefined) {
13782
- this.activeCellDate = newDate;
13783
- this.setActiveCell(this.activeCellDate);
13784
- }
13785
- });
14119
+ if (newDate !== null && newDate !== undefined) {
14120
+ this.activeCellDate = newDate;
14121
+ this.setActiveCell(this.activeCellDate);
14122
+ }
14123
+ });
14124
+ }
14125
+
14126
+ /**
14127
+ * Schedules `callback` two animation frames out, giving the child
14128
+ * `auro-formkit-calendar-month` and `auro-formkit-calendar-cell` elements
14129
+ * a full render-and-paint cycle to settle before the callback reads or
14130
+ * mutates DOM.
14131
+ *
14132
+ * Why two frames, not one:
14133
+ * 1. Lit batches property updates and renders in a microtask, so frame N
14134
+ * schedules the render but the new DOM may not be painted yet.
14135
+ * 2. Cells re-cache `_cachedButton` inside their own `updateComplete.then`,
14136
+ * which also lands a tick later. Reading buttons from frame N+1
14137
+ * (after both renders + cache refresh have flushed) reliably hits the
14138
+ * new month's cells.
14139
+ *
14140
+ * Used by every code path that calls `handleNextMonth`/`handlePrevMonth`
14141
+ * and then needs to inspect the freshly-rendered cells (cross-month
14142
+ * keyboard nav, boundary events, `updateActiveCellForVisibleMonth`).
14143
+ * Do NOT collapse to a single rAF — it intermittently lands before
14144
+ * `_cachedButton` is refreshed, which silently breaks focus restoration
14145
+ * and `setActiveCell` lookups.
14146
+ * @private
14147
+ * @param {() => void} callback - Runs once after the month re-render and
14148
+ * the cells' button caches have refreshed.
14149
+ * @returns {void}
14150
+ */
14151
+ _afterMonthRender(callback) {
14152
+ requestAnimationFrame(() => {
14153
+ requestAnimationFrame(callback);
13786
14154
  });
13787
14155
  }
13788
14156
 
@@ -13900,6 +14268,47 @@ class AuroCalendar extends RangeDatepicker {
13900
14268
  return Array.from(this.shadowRoot.querySelectorAll('auro-formkit-calendar-month'));
13901
14269
  }
13902
14270
 
14271
+ /**
14272
+ * Picks the focusable cell whose date is closest to targetTs. Used as a
14273
+ * fallback after a month-boundary nav when the exact target date isn't
14274
+ * focusable — typically because the month re-render lagged or the date
14275
+ * was filtered out by isOutOfRange. When two cells are equidistant, the
14276
+ * navigation direction breaks the tie so the user moves the way they
14277
+ * pressed (forward → later cell, backward → earlier cell).
14278
+ * @private
14279
+ * @param {Array} cells - Focusable cells from getAllFocusableCells.
14280
+ * @param {Number} targetTs - Desired Unix timestamp (seconds).
14281
+ * @param {'next'|'prev'} direction - Navigation direction.
14282
+ * @returns {Object|null} The nearest cell, or null when cells is empty.
14283
+ */
14284
+ pickNearestCell(cells, targetTs, direction) {
14285
+ if (!cells.length) {
14286
+ return null;
14287
+ }
14288
+ const forward = direction === 'next';
14289
+ let best = null;
14290
+ let bestDelta = Infinity;
14291
+ cells.forEach((cell) => {
14292
+ if (!cell.day) {
14293
+ return;
14294
+ }
14295
+ const distance = Math.abs(cell.day.date - targetTs);
14296
+ if (distance < bestDelta) {
14297
+ best = cell;
14298
+ bestDelta = distance;
14299
+ return;
14300
+ }
14301
+ if (distance === bestDelta && best) {
14302
+ if (forward && cell.day.date > best.day.date) {
14303
+ best = cell;
14304
+ } else if (!forward && cell.day.date < best.day.date) {
14305
+ best = cell;
14306
+ }
14307
+ }
14308
+ });
14309
+ return best;
14310
+ }
14311
+
13903
14312
  /**
13904
14313
  * Gets all focusable cells across all rendered months.
13905
14314
  * @private
@@ -13916,9 +14325,9 @@ class AuroCalendar extends RangeDatepicker {
13916
14325
 
13917
14326
  /**
13918
14327
  * Sets the active cell across all months. Only one cell has tabindex="0" at a time.
13919
- * Uses imperative DOM manipulation — no Lit re-render triggered.
13920
- * Also updates ariaActiveDescendantElement on the grid wrapper so
13921
- * screen readers announce the active cell without moving DOM focus.
14328
+ * Uses imperative DOM manipulation — no Lit re-render triggered. DOM focus
14329
+ * stays on the grid wrapper; the live region (see getOrCreateLiveRegion)
14330
+ * is what announces the active cell to assistive tech.
13922
14331
  * @param {Number} date - Unix timestamp of the cell to activate.
13923
14332
  * @returns {void}
13924
14333
  */
@@ -13936,6 +14345,9 @@ class AuroCalendar extends RangeDatepicker {
13936
14345
  });
13937
14346
 
13938
14347
  this.activeCellDate = date;
14348
+ // Cache so scrollToActiveCell can scroll without re-querying all cells
14349
+ // on every arrow keypress.
14350
+ this._activeCell = newActiveCell;
13939
14351
 
13940
14352
  // Apply activeCell ring only when the grid currently has focus.
13941
14353
  if (newActiveCell && this._gridHasFocus) {
@@ -13967,10 +14379,23 @@ class AuroCalendar extends RangeDatepicker {
13967
14379
  /**
13968
14380
  * Shows the activeCell ring when the grid gains focus.
13969
14381
  * @private
14382
+ * @param {FocusEvent} [event] - The focusin event.
13970
14383
  * @returns {void}
13971
14384
  */
13972
- handleGridFocusIn() {
14385
+ handleGridFocusIn(event) {
13973
14386
  this._gridHasFocus = true;
14387
+
14388
+ // Only apply the activeCell ring when the grid wrapper itself receives focus
14389
+ // (Tab/programmatic). When focus moves into a cell button via mousedown,
14390
+ // event.target is the cell descendant — skip the ring here. The subsequent
14391
+ // click handler calls setActiveCell on the clicked cell, which applies the
14392
+ // ring there. Without this guard, mousedown briefly flashes the ring on the
14393
+ // previously-active cell (e.g. the 1st-of-month set by month navigation
14394
+ // when the grid was not focused).
14395
+ if (event && event.target !== event.currentTarget) {
14396
+ return;
14397
+ }
14398
+
13974
14399
  const activeCell = this.getAllFocusableCells().find((cell) => cell.active);
13975
14400
  if (activeCell) {
13976
14401
  const btn = activeCell._cachedButton || activeCell.shadowRoot.querySelector('button.day');
@@ -13999,6 +14424,76 @@ class AuroCalendar extends RangeDatepicker {
13999
14424
  this.clearRangePreview();
14000
14425
  }
14001
14426
 
14427
+ /**
14428
+ * Returns a memoized Set of blackout timestamps (seconds) drawn from both
14429
+ * the legacy `disabledDays` array and the datepicker's ISO `blackoutDates`.
14430
+ *
14431
+ * The cache invalidates on **reference identity** — only when the
14432
+ * consumer reassigns the array (`el.blackoutDates = [...]`), matching
14433
+ * Lit's own reactivity semantics for array properties. In-place mutations
14434
+ * on the existing array (`push`, `splice`, index assignment) will NOT
14435
+ * invalidate the cache and the new entries will be silently ignored.
14436
+ * Consumers must reassign to update — see the JSDoc on
14437
+ * `auro-datepicker.blackoutDates` for the recommended pattern.
14438
+ *
14439
+ * A shallow-equality tier was considered but rejected: it would run
14440
+ * O(N) work on every cell render (this method is called per-cell via
14441
+ * `isBlackout()`) and still wouldn't catch same-length value swaps,
14442
+ * offering a false sense of safety.
14443
+ * @private
14444
+ * @returns {Set<Number>}
14445
+ */
14446
+ _getBlackoutSet() {
14447
+ // Normalize non-array values to a stable `null` sentinel rather than a
14448
+ // fresh `[]` per call — otherwise the reference-identity cache key
14449
+ // (`_cachedBlackoutDisabledDays === disabledDays`) never matches on
14450
+ // subsequent calls and the Set rebuilds every time. `buildBlackoutSet`
14451
+ // already treats null/non-array as "no legacy disabledDays" via its
14452
+ // own Array.isArray gate.
14453
+ const disabledDays = Array.isArray(this.disabledDays) ? this.disabledDays : null;
14454
+ const blackoutDates = this.datepicker?.blackoutDates;
14455
+ if (this._blackoutSet &&
14456
+ this._cachedBlackoutDisabledDays === disabledDays &&
14457
+ this._cachedBlackoutDates === blackoutDates) {
14458
+ return this._blackoutSet;
14459
+ }
14460
+
14461
+ if (disabledDays && disabledDays.length > 0) {
14462
+ this._warnDisabledDaysDeprecated();
14463
+ }
14464
+
14465
+ this._blackoutSet = buildBlackoutSet(disabledDays, blackoutDates);
14466
+ this._cachedBlackoutDisabledDays = disabledDays;
14467
+ this._cachedBlackoutDates = blackoutDates;
14468
+ return this._blackoutSet;
14469
+ }
14470
+
14471
+ /**
14472
+ * Per-class flag that gates the `disabledDays` deprecation warning so it
14473
+ * fires exactly once per page no matter how many calendars or rebuild
14474
+ * cycles encounter the legacy array.
14475
+ * @private
14476
+ */
14477
+ static _warnedDisabledDaysDeprecation = false;
14478
+
14479
+ /**
14480
+ * One-time `console.debug` directing consumers from the legacy
14481
+ * `disabledDays` Unix-timestamp API to the ISO `blackoutDates` API. Fires
14482
+ * the first time `_getBlackoutSet` rebuilds from a non-empty
14483
+ * `disabledDays`; subsequent calls (on this or any other AuroCalendar
14484
+ * instance on the page) are silent.
14485
+ * @private
14486
+ * @returns {void}
14487
+ */
14488
+ _warnDisabledDaysDeprecated() {
14489
+ if (AuroCalendar._warnedDisabledDaysDeprecation) {
14490
+ return;
14491
+ }
14492
+ AuroCalendar._warnedDisabledDaysDeprecation = true;
14493
+ // eslint-disable-next-line no-console
14494
+ 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.');
14495
+ }
14496
+
14002
14497
  /**
14003
14498
  * Computes the initial active date from data properties alone — no DOM required.
14004
14499
  * Priority:
@@ -14043,21 +14538,10 @@ class AuroCalendar extends RangeDatepicker {
14043
14538
  const minTs = Number.isFinite(rawMin) ? rawMin : -Infinity;
14044
14539
  const maxTs = Number.isFinite(rawMax) ? rawMax : Infinity;
14045
14540
 
14046
- // Build a Set of blackout timestamps for O(1) lookup.
14047
- const blackoutSet = new Set(this.disabledDays.map((day) => parseInt(day, 10)));
14048
-
14049
- // Also include ISO-format blackoutDates from the datepicker if available.
14050
- // Parse YYYY-MM-DD as local date to avoid UTC shift issues.
14051
- const isoBlackouts = this.datepicker?.blackoutDates;
14052
- if (Array.isArray(isoBlackouts)) {
14053
- for (const isoStr of isoBlackouts) {
14054
- const parts = isoStr.split('-');
14055
- const ts = Math.floor(new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10)).getTime() / 1000);
14056
- if (Number.isFinite(ts)) {
14057
- blackoutSet.add(ts);
14058
- }
14059
- }
14060
- }
14541
+ // Build a Set of blackout timestamps for O(1) lookup. Memoized by the
14542
+ // identity of the source arrays so rapid month nav doesn't rebuild the
14543
+ // Set (and re-parse every ISO string) on every keypress.
14544
+ const blackoutSet = this._getBlackoutSet();
14061
14545
 
14062
14546
  /**
14063
14547
  * A date (unix timestamp in seconds, midnight-aligned) is "enabled" when
@@ -14136,7 +14620,24 @@ class AuroCalendar extends RangeDatepicker {
14136
14620
  // rendered month(s) first so a single-month calendar does not pick a date
14137
14621
  // that has no DOM cell. Determine the visible range based on centralDate and
14138
14622
  // the number of rendered months.
14139
- const renderedMonths = Math.max(this.numCalendars, 1);
14623
+ //
14624
+ // numCalendars is assigned inside renderAllCalendars(), which runs during
14625
+ // render() — so by the time the visible-change handler in updated()
14626
+ // calls computeActiveDate() in the same cycle, numCalendars is normally
14627
+ // set. Guard against the pre-first-render path anyway (e.g. any future
14628
+ // caller that reaches computeActiveDate before render() has run):
14629
+ // Math.max(undefined, 1) is NaN, which would silently skip the
14630
+ // visible-month scan below. Fall back to maximumRenderableMonths'
14631
+ // desktop default (1 for non-range, 2 for range) so the scan window is
14632
+ // correctly sized whenever numCalendars is not yet populated.
14633
+ let renderedMonths = null;
14634
+
14635
+ if (Number.isFinite(this.numCalendars) && this.numCalendars > 0) {
14636
+ renderedMonths = this.numCalendars;
14637
+ } else {
14638
+ renderedMonths = this.noRange ? 1 : 2;
14639
+ }
14640
+
14140
14641
  const visibleAnchor = this.centralDateObject ?? new Date(now * 1000);
14141
14642
  const visMonthStart = new Date(visibleAnchor.getFullYear(), visibleAnchor.getMonth(), 1);
14142
14643
  visMonthStart.setHours(0, 0, 0, 0);
@@ -14253,8 +14754,8 @@ class AuroCalendar extends RangeDatepicker {
14253
14754
 
14254
14755
  /**
14255
14756
  * Handles arrow key navigation on the calendar grid wrapper.
14256
- * Focus stays on the grid wrapper; only ariaActiveDescendantElement
14257
- * and the visual active-cell indicator change.
14757
+ * Focus stays on the grid wrapper; only the visual active-cell indicator
14758
+ * changes. The live region announces the new active cell.
14258
14759
  * @private
14259
14760
  * @param {KeyboardEvent} event - The keyboard event.
14260
14761
  * @returns {void}
@@ -14319,21 +14820,24 @@ class AuroCalendar extends RangeDatepicker {
14319
14820
  } else {
14320
14821
  this.handlePrevMonth({ skipActiveUpdate: true });
14321
14822
  }
14322
- requestAnimationFrame(() => {
14323
- requestAnimationFrame(() => {
14324
- const cells = this.getAllFocusableCells();
14325
- const target = cells.find((cell) => cell.day && cell.day.date === targetTs);
14326
- if (target) {
14327
- this.setActiveCell(target.day.date);
14328
- this.handleCellFocused({ detail: { date: target.day.date } });
14329
- } else if (cells.length > 0) {
14330
- const fallback = navDir === 'next' ? cells[cells.length - 1] : cells[0];
14823
+ this._afterMonthRender(() => {
14824
+ const cells = this.getAllFocusableCells();
14825
+ const target = cells.find((cell) => cell.day && cell.day.date === targetTs);
14826
+ if (target) {
14827
+ this.setActiveCell(target.day.date);
14828
+ this.handleCellFocused({ detail: { date: target.day.date } });
14829
+ } else {
14830
+ const fallback = this.pickNearestCell(cells, targetTs, navDir);
14831
+ if (fallback) {
14331
14832
  this.setActiveCell(fallback.day.date);
14332
14833
  this.handleCellFocused({ detail: { date: fallback.day.date } });
14333
14834
  }
14334
- // Re-focus grid wrapper after month change re-render
14335
- this.focusActiveCell();
14336
- });
14835
+ }
14836
+ // Scroll AFTER the cross-month setActiveCell so the freshly
14837
+ // activated cell is what gets scrolled into view.
14838
+ this.scrollToActiveCell();
14839
+ // Re-focus grid wrapper after month change re-render
14840
+ this.focusActiveCell();
14337
14841
  });
14338
14842
  }
14339
14843
  }
@@ -14359,26 +14863,23 @@ class AuroCalendar extends RangeDatepicker {
14359
14863
  } else {
14360
14864
  this.handlePrevMonth({ skipActiveUpdate: true });
14361
14865
  }
14362
- requestAnimationFrame(() => {
14363
- requestAnimationFrame(() => {
14364
- const cells = this.getAllFocusableCells();
14365
- const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
14366
- if (target) {
14367
- this.setActiveCell(target.day.date);
14368
- this.handleCellFocused({ detail: { date: target.day.date } });
14369
- } else if (cells.length > 0) {
14370
- let nearest = null;
14371
-
14372
- if (navDirection === 'next') {
14373
- [nearest] = cells;
14374
- } else {
14375
- nearest = cells[cells.length - 1];
14376
- }
14866
+ this._afterMonthRender(() => {
14867
+ const cells = this.getAllFocusableCells();
14868
+ const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
14869
+ if (target) {
14870
+ this.setActiveCell(target.day.date);
14871
+ this.handleCellFocused({ detail: { date: target.day.date } });
14872
+ } else {
14873
+ const nearest = this.pickNearestCell(cells, targetDate, navDirection);
14874
+ if (nearest) {
14377
14875
  this.setActiveCell(nearest.day.date);
14378
14876
  this.handleCellFocused({ detail: { date: nearest.day.date } });
14379
14877
  }
14380
- this.focusActiveCell();
14381
- });
14878
+ }
14879
+ // Scroll AFTER the cross-month setActiveCell so the freshly
14880
+ // activated cell is what gets scrolled into view.
14881
+ this.scrollToActiveCell();
14882
+ this.focusActiveCell();
14382
14883
  });
14383
14884
  }
14384
14885
  }
@@ -14406,12 +14907,16 @@ class AuroCalendar extends RangeDatepicker {
14406
14907
  let targetIndex = -1;
14407
14908
  if (direction === 'next') {
14408
14909
  targetIndex = currentIndex + 1;
14910
+ } else if (direction === 'prev') {
14911
+ targetIndex = currentIndex - 1;
14409
14912
  }
14410
14913
 
14411
14914
  if (targetIndex >= 0 && targetIndex < allCells.length) {
14412
14915
  const targetCell = allCells[targetIndex];
14413
14916
  this.setActiveCell(targetCell.day.date);
14414
14917
  this.scrollToActiveCell();
14918
+ // Match the cross-month branches: keep DOM focus on the grid wrapper
14919
+ // so subsequent arrow keys continue to land on this handler.
14415
14920
  this.focusActiveCell();
14416
14921
  } else if (direction === 'next' && this.showNextMonthBtn) {
14417
14922
  // Navigate to next month and focus the computed next date.
@@ -14428,19 +14933,22 @@ class AuroCalendar extends RangeDatepicker {
14428
14933
  }
14429
14934
 
14430
14935
  this.handleNextMonth({ skipActiveUpdate: true });
14431
- requestAnimationFrame(() => {
14432
- requestAnimationFrame(() => {
14433
- const cells = this.getAllFocusableCells();
14434
- const target = cells.find((cell) => cell.day && cell.day.date === nextTs);
14435
- if (target) {
14436
- this.setActiveCell(target.day.date);
14437
- this.focusActiveCell();
14438
- } else if (cells.length > 0) {
14439
- // Fallback: first cell of the last rendered month
14440
- this.setActiveCell(cells[cells.length - 1].day.date);
14441
- this.focusActiveCell();
14936
+ this._afterMonthRender(() => {
14937
+ const cells = this.getAllFocusableCells();
14938
+ const target = cells.find((cell) => cell.day && cell.day.date === nextTs);
14939
+ if (target) {
14940
+ this.setActiveCell(target.day.date);
14941
+ } else {
14942
+ // Same nearest-by-date fallback handleGridKeyDown uses — direct
14943
+ // `cells[length - 1]` would land on the end of the new month,
14944
+ // far from the user's intended `nextTs`.
14945
+ const fallback = this.pickNearestCell(cells, nextTs, 'next');
14946
+ if (fallback) {
14947
+ this.setActiveCell(fallback.day.date);
14442
14948
  }
14443
- });
14949
+ }
14950
+ this.scrollToActiveCell();
14951
+ this.focusActiveCell();
14444
14952
  });
14445
14953
  } else if (direction === 'prev' && this.showPrevMonthBtn) {
14446
14954
  // Navigate to previous month and focus the computed previous date.
@@ -14454,19 +14962,22 @@ class AuroCalendar extends RangeDatepicker {
14454
14962
  }
14455
14963
 
14456
14964
  this.handlePrevMonth({ skipActiveUpdate: true });
14457
- requestAnimationFrame(() => {
14458
- requestAnimationFrame(() => {
14459
- const cells = this.getAllFocusableCells();
14460
- const target = cells.find((cell) => cell.day && cell.day.date === prevTs);
14461
- if (target) {
14462
- this.setActiveCell(target.day.date);
14463
- this.focusActiveCell();
14464
- } else if (cells.length > 0) {
14465
- // Fallback: last cell of the first rendered month
14466
- this.setActiveCell(cells[0].day.date);
14467
- this.focusActiveCell();
14965
+ this._afterMonthRender(() => {
14966
+ const cells = this.getAllFocusableCells();
14967
+ const target = cells.find((cell) => cell.day && cell.day.date === prevTs);
14968
+ if (target) {
14969
+ this.setActiveCell(target.day.date);
14970
+ } else {
14971
+ // Same nearest-by-date fallback handleGridKeyDown uses — direct
14972
+ // `cells[0]` would land on the start of the previous month, far
14973
+ // from the user's intended `prevTs`.
14974
+ const fallback = this.pickNearestCell(cells, prevTs, 'prev');
14975
+ if (fallback) {
14976
+ this.setActiveCell(fallback.day.date);
14468
14977
  }
14469
- });
14978
+ }
14979
+ this.scrollToActiveCell();
14980
+ this.focusActiveCell();
14470
14981
  });
14471
14982
  }
14472
14983
  } else if (key === 'ArrowDown' || key === 'ArrowUp') {
@@ -14494,20 +15005,22 @@ class AuroCalendar extends RangeDatepicker {
14494
15005
  } else {
14495
15006
  this.handlePrevMonth({ skipActiveUpdate: true });
14496
15007
  }
14497
- requestAnimationFrame(() => {
14498
- requestAnimationFrame(() => {
14499
- const cells = this.getAllFocusableCells();
14500
- const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
14501
- if (target) {
14502
- this.setActiveCell(target.day.date);
14503
- this.focusActiveCell();
14504
- } else if (cells.length > 0) {
14505
- // Clamp to nearest focusable cell
14506
- const nearest = navDirection === 'next' ? cells[0] : cells[cells.length - 1];
15008
+ this._afterMonthRender(() => {
15009
+ const cells = this.getAllFocusableCells();
15010
+ const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
15011
+ if (target) {
15012
+ this.setActiveCell(target.day.date);
15013
+ } else {
15014
+ // Same nearest-by-date fallback handleGridKeyDown uses — the
15015
+ // old direction-based `cells[0]`/`cells[length-1]` clamp
15016
+ // could land 25+ days from the intended target.
15017
+ const nearest = this.pickNearestCell(cells, targetDate, navDirection);
15018
+ if (nearest) {
14507
15019
  this.setActiveCell(nearest.day.date);
14508
- this.focusActiveCell();
14509
15020
  }
14510
- });
15021
+ }
15022
+ this.scrollToActiveCell();
15023
+ this.focusActiveCell();
14511
15024
  });
14512
15025
  }
14513
15026
  }
@@ -14546,8 +15059,9 @@ class AuroCalendar extends RangeDatepicker {
14546
15059
  return;
14547
15060
  }
14548
15061
 
14549
- // With aria-activedescendant, the button no longer receives native focus,
14550
- // so we use the debounced live region for the full context announcement.
15062
+ // DOM focus stays on the grid wrapper while arrow keys move the active
15063
+ // cell, so cell buttons never receive native focus. The debounced live
15064
+ // region carries the full-context announcement instead.
14551
15065
  const announcement = this.buildFocusAnnouncement(date);
14552
15066
  this.announceFocusDebounced(announcement);
14553
15067
 
@@ -14617,10 +15131,10 @@ class AuroCalendar extends RangeDatepicker {
14617
15131
  return null;
14618
15132
  }
14619
15133
 
14620
- const departTs = startOfDay$2(parsedFrom * 1000) / 1000;
15134
+ const departTs = new Date(parsedFrom * 1000).setHours(0, 0, 0, 0) / 1000;
14621
15135
  const parsedTo = Number.parseInt(this.dateTo, 10);
14622
15136
  const hasTo = Number.isFinite(parsedTo);
14623
- const returnTs = hasTo ? startOfDay$2(parsedTo * 1000) / 1000 : null;
15137
+ const returnTs = hasTo ? new Date(parsedTo * 1000).setHours(0, 0, 0, 0) / 1000 : null;
14624
15138
 
14625
15139
  if (date === departTs) {
14626
15140
  return this.datepicker.rangeLabelStart || 'range start';
@@ -14634,36 +15148,22 @@ class AuroCalendar extends RangeDatepicker {
14634
15148
  if (hasTo && date > departTs && date < returnTs) {
14635
15149
  return this.datepicker.rangeLabelInRange || 'in range';
14636
15150
  }
15151
+ if (!hasTo && date > departTs) {
15152
+ return this.datepicker.rangeLabelEndPreview || 'previewing range end';
15153
+ }
14637
15154
  return this.datepicker.rangeLabelAfterRange || 'after range';
14638
15155
  }
14639
15156
 
14640
15157
  /**
14641
- * Checks whether a given date is a blackout date.
15158
+ * Checks whether a given date is a blackout date. Delegates to the
15159
+ * memoized `_getBlackoutSet` so the YYYY-MM-DD parsing and the
15160
+ * legacy/ISO merge rules live in exactly one place (see `blackoutUtils.js`).
14642
15161
  * @private
14643
15162
  * @param {Number} dateTs - Unix timestamp (seconds).
14644
15163
  * @returns {Boolean} True if the date is blacked out.
14645
15164
  */
14646
15165
  isDateBlackout(dateTs) {
14647
- // Check legacy disabledDays.
14648
- if (Array.isArray(this.disabledDays) && this.disabledDays.length > 0) {
14649
- if (this.disabledDays.findIndex((day) => parseInt(day, 10) === dateTs) !== -1) {
14650
- return true;
14651
- }
14652
- }
14653
-
14654
- // Check ISO blackoutDates.
14655
- const blackoutDates = this.datepicker?.blackoutDates;
14656
- if (Array.isArray(blackoutDates) && blackoutDates.length > 0) {
14657
- const date = new Date(dateTs * 1000);
14658
- const yyyy = date.getFullYear();
14659
- const mm = String(date.getMonth() + 1).padStart(2, '0');
14660
- const dd = String(date.getDate()).padStart(2, '0');
14661
- if (blackoutDates.includes(`${yyyy}-${mm}-${dd}`)) {
14662
- return true;
14663
- }
14664
- }
14665
-
14666
- return false;
15166
+ return this._getBlackoutSet().has(dateTs);
14667
15167
  }
14668
15168
 
14669
15169
  /**
@@ -14691,9 +15191,14 @@ class AuroCalendar extends RangeDatepicker {
14691
15191
  * @private
14692
15192
  * @param {Object} [options] - Optional settings.
14693
15193
  * @param {boolean} [options.force=false] - When true, clears classes even
14694
- * when both dateFrom and dateTo are set. Used by month nav handlers
14695
- * since the subsequent re-render re-applies classMap-managed classes,
14696
- * while `lastHoveredDate` (not in classMap) would otherwise persist.
15194
+ * when both dateFrom and dateTo are set. Used by month nav handlers to
15195
+ * strip the imperative-only `lastHoveredDate` before the re-render.
15196
+ * The other two classes (`inRange`, `rangeDepartDate`) are classMap-
15197
+ * managed and get stripped as a side effect here; because classMap
15198
+ * remembers what it last emitted and does not diff against the actual
15199
+ * DOM, the following month re-render will NOT re-add them on its own.
15200
+ * Nav handlers must schedule `refreshCommittedRangeClasses` (via
15201
+ * `scheduleCommittedRangeClassRefresh`) to resync them.
14697
15202
  * @returns {void}
14698
15203
  */
14699
15204
  clearRangePreview(options) {
@@ -14708,6 +15213,57 @@ class AuroCalendar extends RangeDatepicker {
14708
15213
  });
14709
15214
  }
14710
15215
 
15216
+ /**
15217
+ * Re-applies the committed-range classes across every focusable cell
15218
+ * after a month navigation. classMap in the cell tracks its own
15219
+ * previous state: once `clearRangePreview({ force: true })` strips
15220
+ * `inRange`/`rangeDepartDate` imperatively before the re-render,
15221
+ * classMap's next diff sees the same class-value it emitted before and
15222
+ * produces no delta, leaving the DOM without the classes even though a
15223
+ * full range is committed. Re-applying imperatively resyncs the two
15224
+ * months' cells with `dateFrom`/`dateTo`.
15225
+ *
15226
+ * Iterates `getAllFocusableCells()` — out-of-range cells (blocked by
15227
+ * `min`/`max`) can never carry range classes anyway, so skipping them
15228
+ * is correct and cheaper than a whole-grid walk.
15229
+ *
15230
+ * The cell's `applyCommittedRangeClasses` reuses the same
15231
+ * `isInRange`/`isDepartDate`/`isReturnDate` helpers `renderCellButton`
15232
+ * uses, so we don't parse dateFrom/dateTo here — the helpers already
15233
+ * normalize their inputs (midnight-truncation, string→int) internally.
15234
+ * @private
15235
+ * @returns {void}
15236
+ */
15237
+ refreshCommittedRangeClasses() {
15238
+ if (this.noRange || !this.dateFrom || !this.dateTo) {
15239
+ return;
15240
+ }
15241
+
15242
+ const allCells = this.getAllFocusableCells();
15243
+ allCells.forEach((cell) => {
15244
+ cell.applyCommittedRangeClasses();
15245
+ });
15246
+ }
15247
+
15248
+ /**
15249
+ * Schedules `refreshCommittedRangeClasses` to run after the month
15250
+ * re-render has flushed and the cells' button caches have refreshed.
15251
+ * Both `handlePrevMonth` and `handleNextMonth` need this exact call
15252
+ * shape; keeping it in one place prevents them from drifting apart.
15253
+ *
15254
+ * Bails synchronously when a full committed range isn't set — otherwise
15255
+ * every prev/next click in single-date mode (or before the user picks
15256
+ * both dates in range mode) pays for an unused double-rAF hop.
15257
+ * @private
15258
+ * @returns {void}
15259
+ */
15260
+ scheduleCommittedRangeClassRefresh() {
15261
+ if (this.noRange || !this.dateFrom || !this.dateTo) {
15262
+ return;
15263
+ }
15264
+ this._afterMonthRender(() => this.refreshCommittedRangeClasses());
15265
+ }
15266
+
14711
15267
  /**
14712
15268
  * Overrides the base class handler to prevent setting `this.hoveredDate`
14713
15269
  * as a reactive property. Instead, handles the range preview imperatively.
@@ -14721,7 +15277,28 @@ class AuroCalendar extends RangeDatepicker {
14721
15277
  }
14722
15278
 
14723
15279
  /**
14724
- * Scrolls the calendar to ensure the month containing the active cell is visible.
15280
+ * Scrolls the calendar so the active cell is visible.
15281
+ *
15282
+ * Walks the flat tree (rendered, slot-aware) outward from the active
15283
+ * cell's button and calls `scrollBy` on every vertically-scrollable
15284
+ * ancestor by whatever delta still separates the cell from that
15285
+ * ancestor's viewport. Native `scrollIntoView` is not used because the
15286
+ * cell sits inside multiple nested scroll containers (the dropdown bib's
15287
+ * `<dialog>`, the bibtemplate's `#bodyContainer`) and the algorithm only
15288
+ * scrolls one of them on its own, leaving the cell short of the
15289
+ * viewport in mobile fullscreen.
15290
+ *
15291
+ * Uses `behavior: 'auto'` (the spec's universally-supported non-animated
15292
+ * value) so each `scrollBy` resolves synchronously and the next
15293
+ * iteration's `getBoundingClientRect` reads post-scroll positions
15294
+ * accurately. This also satisfies `prefers-reduced-motion` users — the
15295
+ * scroll containers do not set CSS `scroll-behavior: smooth`, so `auto`
15296
+ * is effectively instant.
15297
+ *
15298
+ * The active cell is looked up from the cache populated by
15299
+ * `setActiveCell`. On a cache miss (stale or absent) the cache is
15300
+ * refreshed from a single full scan so subsequent calls stay on the
15301
+ * fast path.
14725
15302
  * @private
14726
15303
  * @returns {void}
14727
15304
  */
@@ -14730,16 +15307,69 @@ class AuroCalendar extends RangeDatepicker {
14730
15307
  return;
14731
15308
  }
14732
15309
 
14733
- const date = new Date(this.activeCellDate * 1000);
14734
- const month = date.getMonth() + 1;
14735
- const year = date.getFullYear();
14736
- const selector = `#month-${month}-${year}`;
14737
- const monthElem = this.shadowRoot.querySelector(selector);
15310
+ // Prefer the cell cached by setActiveCell so arrow-key navigation does
15311
+ // not rebuild the full cell list on every keypress. Fall back to a
15312
+ // lookup when the cache is stale (e.g. detached after month re-render)
15313
+ // or absent (scrollToActiveCell called without a prior setActiveCell);
15314
+ // refresh the cache on the fallback path so a subsequent call reuses it.
15315
+ const activeDate = this.activeCellDate;
15316
+ const cached = this._activeCell;
15317
+ const cacheFresh = cached && cached.isConnected && cached.day && cached.day.date === activeDate;
15318
+ let activeCell = null;
15319
+ if (cacheFresh) {
15320
+ activeCell = cached;
15321
+ } else {
15322
+ activeCell = this.getAllFocusableCells().find((cell) => cell.day && cell.day.date === activeDate);
15323
+ this._activeCell = activeCell || null;
15324
+ }
15325
+ if (!activeCell) {
15326
+ return;
15327
+ }
15328
+
15329
+ // Scroll the button inside the cell — it has concrete dimensions,
15330
+ // which avoids quirks when the cell host has display: inline / contents
15331
+ // / flex-without-explicit-size.
15332
+ const target = activeCell._cachedButton ||
15333
+ activeCell.shadowRoot?.querySelector('button.day') ||
15334
+ activeCell;
15335
+
15336
+ // parentNode follows the authored DOM tree and steps over shadow roots
15337
+ // via slot projection. A slotted element's visual parent is its
15338
+ // assignedSlot's parent (inside the host's shadow tree), not the host
15339
+ // itself. Without this hop, the walk skips right past #bodyContainer
15340
+ // and <dialog> and finds no scrollable ancestor at all.
15341
+ const flatParent = (current) => {
15342
+ if (current.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
15343
+ return current.host || null;
15344
+ }
15345
+ if (current.assignedSlot) {
15346
+ return current.assignedSlot.parentNode;
15347
+ }
15348
+ return current.parentNode;
15349
+ };
14738
15350
 
14739
- if (monthElem) {
14740
- const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
14741
- monthElem.scrollIntoView({ block: 'nearest',
14742
- behavior: prefersReducedMotion ? 'instant' : 'smooth' });
15351
+ let node = flatParent(target);
15352
+ while (node && node !== document && node !== window) {
15353
+ if (node.nodeType === Node.ELEMENT_NODE) {
15354
+ const { overflowY } = window.getComputedStyle(node);
15355
+ if (overflowY === 'auto' || overflowY === 'scroll') {
15356
+ const targetRect = target.getBoundingClientRect();
15357
+ const scrollerRect = node.getBoundingClientRect();
15358
+ let delta = 0;
15359
+ if (targetRect.top < scrollerRect.top) {
15360
+ delta = targetRect.top - scrollerRect.top;
15361
+ } else if (targetRect.bottom > scrollerRect.bottom) {
15362
+ delta = targetRect.bottom - scrollerRect.bottom;
15363
+ }
15364
+ if (delta !== 0) {
15365
+ node.scrollBy({
15366
+ top: delta,
15367
+ behavior: 'auto'
15368
+ });
15369
+ }
15370
+ }
15371
+ }
15372
+ node = flatParent(node);
14743
15373
  }
14744
15374
  }
14745
15375
 
@@ -14830,9 +15460,34 @@ class AuroCalendar extends RangeDatepicker {
14830
15460
  // the last one.
14831
15461
  if (this._announceRafId) {
14832
15462
  cancelAnimationFrame(this._announceRafId);
15463
+ this._announceRafId = null;
14833
15464
  }
15465
+ this._deliverAnnouncement(dateStr, 0);
15466
+ }
15467
+
15468
+ /**
15469
+ * Writes `dateStr` to the live region. If the dropdown's dialog hasn't
15470
+ * mounted yet (so getOrCreateLiveRegion can't attach), retries on the
15471
+ * next animation frame up to MAX_LIVE_REGION_RETRIES instead of silently
15472
+ * dropping the announcement. The retry uses the same `_announceRafId`
15473
+ * the double-rAF below uses, so a newer announceSelection call (or
15474
+ * disconnectedCallback) cancels any in-flight retry.
15475
+ * @private
15476
+ * @param {String} dateStr - The localized date string to announce.
15477
+ * @param {Number} attempts - Number of prior retry attempts.
15478
+ * @returns {void}
15479
+ */
15480
+ _deliverAnnouncement(dateStr, attempts) {
14834
15481
  const liveRegion = this.getOrCreateLiveRegion();
14835
15482
  if (!liveRegion) {
15483
+ const MAX_LIVE_REGION_RETRIES = 10;
15484
+ if (attempts < MAX_LIVE_REGION_RETRIES) {
15485
+ this._announceRafId = requestAnimationFrame(() => {
15486
+ this._deliverAnnouncement(dateStr, attempts + 1);
15487
+ });
15488
+ } else {
15489
+ this._announceRafId = null;
15490
+ }
14836
15491
  return;
14837
15492
  }
14838
15493
 
@@ -14858,6 +15513,10 @@ class AuroCalendar extends RangeDatepicker {
14858
15513
  * originally tried aria-live="polite" here, but VoiceOver treats
14859
15514
  * polite as "wait until idle" — which never happens during active
14860
15515
  * keyboard navigation — so the announcements were silently dropped.
15516
+ *
15517
+ * This is a documented deviation from WCAG 2.1 SC 4.1.3, which
15518
+ * prefers `polite` for status messages. See the "Documented
15519
+ * Deviation" section in components/datepicker/docs/pages/accessibility.md.
14861
15520
  * @private
14862
15521
  * @param {String} dateStr - The localized date string to announce.
14863
15522
  * @returns {void}
@@ -15005,7 +15664,7 @@ class AuroCalendar extends RangeDatepicker {
15005
15664
  </div>
15006
15665
  </div>
15007
15666
 
15008
- <div class="calendarWrapper ${!this.isFullscreen && this.dropdown?.desktopModal ? 'hasFooter' : ''}">
15667
+ <div class="calendarWrapper">
15009
15668
  <div class="calendarNavButtons">
15010
15669
  ${this.showPrevMonthBtn ? html$1`
15011
15670
  <button tabIndex="0" class="calendarNavBtn prevMonth" aria-label="${this.datepicker?.navLabelPrevMonth || 'Previous month'}" @click="${this.handlePrevMonth}">
@@ -15018,7 +15677,7 @@ class AuroCalendar extends RangeDatepicker {
15018
15677
  </button>
15019
15678
  ` : undefined}
15020
15679
  </div>
15021
- <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}">
15680
+ <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}">
15022
15681
  ${this.renderAllCalendars()}
15023
15682
  </div>
15024
15683
  </div>
@@ -17287,12 +17946,40 @@ class AuroFloatingUI {
17287
17946
  return;
17288
17947
  }
17289
17948
 
17949
+ // Chrome-specific: during popover top-layer promotion after a click on a
17950
+ // slotted focusable, :focus-within can briefly evaluate false while the
17951
+ // active element is still structurally inside the trigger/bib. Fall back
17952
+ // to a shadow-piercing ancestry walk from the deep active element before
17953
+ // treating this as a real focus loss.
17954
+ try {
17955
+ let active = document.activeElement;
17956
+ while (active && active.shadowRoot && active.shadowRoot.activeElement) {
17957
+ active = active.shadowRoot.activeElement;
17958
+ }
17959
+ const targets = [element, element.trigger, element.bib].filter(Boolean);
17960
+ let node = active;
17961
+ while (node) {
17962
+ if (targets.includes(node)) {
17963
+ return;
17964
+ }
17965
+ node =
17966
+ node.parentElement ||
17967
+ (node.getRootNode && node.getRootNode().host) ||
17968
+ null;
17969
+ }
17970
+ } catch (e) {
17971
+ // Defensive: fall through to the existing close path if traversal fails.
17972
+ }
17973
+
17290
17974
  // if fullscreen bib is in fullscreen mode, do not close
17291
17975
  if (element.bib.hasAttribute("isfullscreen")) {
17292
17976
  return;
17293
17977
  }
17294
17978
 
17295
- this.hideBib("keydown");
17979
+ // eventType "focusloss" distinguishes a Tab/click-driven close from an
17980
+ // Escape keydown close. Consumers use this to decide whether to restore
17981
+ // focus to the trigger (Escape) or let it advance naturally (Tab).
17982
+ this.hideBib("focusloss");
17296
17983
  }
17297
17984
 
17298
17985
  setupHideHandlers() {
@@ -17962,199 +18649,6 @@ function getFocusableElements(container) {
17962
18649
  return tabIndexedUniqueElements;
17963
18650
  }
17964
18651
 
17965
- /**
17966
- * FocusTrap manages keyboard focus within a specified container element, ensuring that focus does not leave the container when tabbing.
17967
- * It is commonly used for modal dialogs or overlays to improve accessibility by trapping focus within interactive UI components.
17968
- */
17969
- class FocusTrap {
17970
- /**
17971
- * Creates a new FocusTrap instance for the given container element.
17972
- * Initializes event listeners and prepares the container for focus management.
17973
- *
17974
- * @param {HTMLElement} container The DOM element to trap focus within.
17975
- * @param {boolean} [controlTabOrder=false] If true enables manual control of the tab order by the FocusTrap.
17976
- * @throws {Error} If the provided container is not a valid HTMLElement.
17977
- */
17978
- constructor(container, controlTabOrder = false) {
17979
- if (!container || !(container instanceof HTMLElement)) {
17980
- throw new Error("FocusTrap requires a valid HTMLElement.");
17981
- }
17982
-
17983
- this.container = container;
17984
- this.tabDirection = "forward"; // or 'backward';
17985
- this.controlTabOrder = controlTabOrder;
17986
-
17987
- this._init();
17988
- }
17989
-
17990
- /**
17991
- * Initializes the focus trap by setting up event listeners and attributes on the container.
17992
- * Prepares the container for focus management, including support for shadow DOM and inert attributes.
17993
- *
17994
- * @private
17995
- */
17996
- _init() {
17997
- // Add inert attribute to prevent focusing programmatically as well (if supported)
17998
- if ("inert" in HTMLElement.prototype) {
17999
- this.container.inert = false; // Ensure the container isn't inert
18000
- this.container.setAttribute("data-focus-trap-container", true); // Mark for identification
18001
- }
18002
-
18003
- // Track tab direction
18004
- this.container.addEventListener("keydown", this._onKeydown);
18005
- }
18006
-
18007
- /**
18008
- * Gets an array of currently active (focused) elements in the document and shadow DOM.
18009
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
18010
- * @private
18011
- */
18012
- _getActiveElements() {
18013
- // Get the active element(s) in the document and shadow root
18014
- // This will include the active element in the shadow DOM if it exists
18015
- // Active element may be inside the shadow DOM depending on delegatesFocus, so we need to check both
18016
- let { activeElement } = document;
18017
- const actives = [activeElement];
18018
- while (activeElement?.shadowRoot?.activeElement) {
18019
- actives.push(activeElement.shadowRoot.activeElement);
18020
- activeElement = activeElement.shadowRoot.activeElement;
18021
- }
18022
- return actives;
18023
- }
18024
-
18025
- /**
18026
- * Gets the next focus index based on the current index and focusable elements.
18027
- * @param {number} currentIndex The current index of the focused element.
18028
- * @param {Array<HTMLElement>} focusables The array of focusable elements.
18029
- * @returns {number|null} The next focus index or null if not determined.
18030
- */
18031
- _getNextFocusIndex(currentIndex, focusables, actives) {
18032
- if (this.controlTabOrder) {
18033
- // Calculate the new index based on the current index and tab direction
18034
- let newFocusIndex =
18035
- currentIndex + (this.tabDirection === "forward" ? 1 : -1);
18036
-
18037
- // Wrap-around logic
18038
- if (newFocusIndex < 0) newFocusIndex = focusables.length - 1;
18039
- if (newFocusIndex >= focusables.length) newFocusIndex = 0;
18040
-
18041
- // Early return with the new index
18042
- return newFocusIndex;
18043
- }
18044
-
18045
- // Determine if we need to wrap
18046
- const atFirst =
18047
- actives.includes(focusables[0]) || actives.includes(this.container);
18048
- const atLast = actives.includes(focusables[focusables.length - 1]);
18049
-
18050
- // Only wrap if at the ends
18051
- if (this.tabDirection === "backward" && atFirst) {
18052
- return focusables.length - 1;
18053
- }
18054
-
18055
- if (this.tabDirection === "forward" && atLast) {
18056
- return 0;
18057
- }
18058
-
18059
- // No wrap, so don't change focus, return early
18060
- return null;
18061
- }
18062
-
18063
- /**
18064
- * Handles the Tab key press event to manage focus within the container.
18065
- * @param {KeyboardEvent} e The keyboard event triggered by the user.
18066
- * @returns {void}
18067
- */
18068
- _handleTabKey(e) {
18069
- // Update the focusable elements
18070
- const focusables = this._getFocusableElements();
18071
-
18072
- // If there are no focusable elements, exit
18073
- if (!focusables.length) return;
18074
-
18075
- // Set the tab direction based on the key pressed
18076
- this.tabDirection = e.shiftKey ? "backward" : "forward";
18077
-
18078
- // Get the active elements that are currently focused
18079
- const actives = this._getActiveElements();
18080
-
18081
- // If we're at either end of the focusable elements, wrap around to the other end
18082
- let focusIndex = focusables.findIndex((el) => actives.includes(el));
18083
-
18084
- // Fallback if we have no focused element
18085
- if (focusIndex === -1) focusIndex = 0;
18086
-
18087
- // Get the next focus index based on the current focus index, tab direction, and controlTabOrder setting
18088
- // Is null if no new focus index is determined
18089
- const newFocusIndex = this._getNextFocusIndex(
18090
- focusIndex,
18091
- focusables,
18092
- actives,
18093
- );
18094
-
18095
- // If we have a new focus index, set focus to that element
18096
- if (newFocusIndex !== null) {
18097
- e.preventDefault();
18098
- focusables[newFocusIndex].focus();
18099
- }
18100
- }
18101
-
18102
- /**
18103
- * Catches the keydown event
18104
- * @param {KeyboardEvent} e The keyboard event triggered by user interaction.
18105
- * @private
18106
- */
18107
- _onKeydown = (e) => {
18108
- // Handle tab
18109
- if (e.key === "Tab") this._handleTabKey(e);
18110
- };
18111
-
18112
- /**
18113
- * Retrieves all focusable elements within the container in DOM order, including those in shadow DOM and slots.
18114
- * Returns a unique, ordered array of elements that can receive focus.
18115
- *
18116
- * @returns {Array<HTMLElement>} An array of focusable elements within the container.
18117
- * @private
18118
- */
18119
- _getFocusableElements() {
18120
- // Use the imported utility function to get focusable elements
18121
- const elements = getFocusableElements(this.container);
18122
-
18123
- // Return the elements found
18124
- return elements;
18125
- }
18126
-
18127
- /**
18128
- * Moves focus to the first focusable element within the container.
18129
- * Useful for setting initial focus when activating the focus trap.
18130
- */
18131
- focusFirstElement() {
18132
- const focusables = this._getFocusableElements();
18133
- if (focusables.length) focusables[0].focus();
18134
- }
18135
-
18136
- /**
18137
- * Moves focus to the last focusable element within the container.
18138
- * Useful for setting focus when deactivating or cycling focus in reverse.
18139
- */
18140
- focusLastElement() {
18141
- const focusables = this._getFocusableElements();
18142
- if (focusables.length) focusables[focusables.length - 1].focus();
18143
- }
18144
-
18145
- /**
18146
- * Removes event listeners and attributes added by the focus trap.
18147
- * Call this method to clean up when the focus trap is no longer needed.
18148
- */
18149
- disconnect() {
18150
- if (this.container.hasAttribute("data-focus-trap-container")) {
18151
- this.container.removeAttribute("data-focus-trap-container");
18152
- }
18153
-
18154
- this.container.removeEventListener("keydown", this._onKeydown);
18155
- }
18156
- }
18157
-
18158
18652
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
18159
18653
  // See LICENSE in the project root for license information.
18160
18654
 
@@ -18655,7 +19149,7 @@ class AuroDropdownBib extends LitElement {
18655
19149
  classes[`shape-${this.shape}`] = true;
18656
19150
 
18657
19151
  return html$1`
18658
- <dialog class="${classMap(classes)}" part="bibContainer" role="${ifDefined(this.dialogRole)}" aria-labelledby="${ifDefined(this.dialogLabel ? 'dialogLabel' : undefined)}">
19152
+ <dialog tabindex="-1" class="${classMap(classes)}" part="bibContainer" role="${ifDefined(this.dialogRole)}" aria-labelledby="${ifDefined(this.dialogLabel ? 'dialogLabel' : undefined)}">
18659
19153
  ${this.dialogLabel ? html$1`<span id="dialogLabel" class="util_displayHiddenVisually">${this.dialogLabel}</span>` : ''}
18660
19154
  <slot></slot>
18661
19155
  <span id="srAnnouncement" class="util_displayHiddenVisually" aria-live="polite" role="status"></span>
@@ -18906,7 +19400,7 @@ let AuroHelpText$2 = class AuroHelpText extends LitElement {
18906
19400
  }
18907
19401
  };
18908
19402
 
18909
- var formkitVersion$1 = '202606191810';
19403
+ var formkitVersion$1 = '202607221815';
18910
19404
 
18911
19405
  let AuroElement$2 = class AuroElement extends LitElement {
18912
19406
  static get properties() {
@@ -19035,7 +19529,6 @@ class AuroDropdown extends AuroElement$2 {
19035
19529
  static get shadowRootOptions() {
19036
19530
  return {
19037
19531
  ...AuroElement$2.shadowRootOptions,
19038
- delegatesFocus: true,
19039
19532
  };
19040
19533
  }
19041
19534
 
@@ -19047,6 +19540,15 @@ class AuroDropdown extends AuroElement$2 {
19047
19540
  this.matchWidth = false;
19048
19541
  this.noHideOnThisFocusLoss = false;
19049
19542
 
19543
+ /**
19544
+ * When true, the dropdown skips its generic focus restoration on close.
19545
+ * Set by consumers (e.g. combobox) that manage their own focus routing
19546
+ * via setClearBtnFocus / setInputFocus / keyboard strategy.
19547
+ * Separate from noHideOnThisFocusLoss (which controls auto-close behavior).
19548
+ * @private
19549
+ */
19550
+ this.noFocusRestoreOnClose = false;
19551
+
19050
19552
  this.errorMessage = undefined; // TODO - check with Doug if there is still more to do here
19051
19553
 
19052
19554
  // Layout Config
@@ -19202,7 +19704,49 @@ class AuroDropdown extends AuroElement$2 {
19202
19704
  focusables[0].focus();
19203
19705
  }
19204
19706
  } else {
19707
+ this.focusTrigger();
19708
+ }
19709
+ }
19710
+
19711
+ /**
19712
+ * Focus the trigger content. When the trigger wrapper itself is focusable
19713
+ * (has tabindex), focus it directly. Otherwise, focus the first focusable
19714
+ * element slotted into the trigger slot (e.g. the auro-input).
19715
+ * @private
19716
+ */
19717
+ focusTrigger() {
19718
+ if (this.trigger.hasAttribute('tabindex')) {
19205
19719
  this.trigger.focus();
19720
+ } else {
19721
+ // Slotted content isn't a DOM child of the trigger div, so
19722
+ // getFocusableElements can't find it. Query assigned nodes directly.
19723
+ const slot = this.trigger.querySelector('slot[name="trigger"]');
19724
+ if (slot) {
19725
+ const assigned = slot.assignedElements();
19726
+ for (const el of assigned) {
19727
+ if (el.hasAttribute('disabled')) {
19728
+ continue; // eslint-disable-line no-continue
19729
+ }
19730
+ // Try finding a focusable descendant first (handles non-focusable
19731
+ // wrappers like <div> containing a <button>). If none found, try
19732
+ // focusing the element directly (works for custom elements like
19733
+ // auro-input that have delegatesFocus or a custom focus() method).
19734
+ const descendants = getFocusableElements(el);
19735
+ if (descendants.length > 0) {
19736
+ descendants[0].focus();
19737
+ return;
19738
+ }
19739
+ el.focus();
19740
+ if (document.activeElement === el) {
19741
+ return;
19742
+ }
19743
+ }
19744
+ }
19745
+ // Fallback: try DOM children (non-slotted content)
19746
+ const focusables = getFocusableElements(this.trigger);
19747
+ if (focusables.length > 0) {
19748
+ focusables[0].focus();
19749
+ }
19206
19750
  }
19207
19751
  }
19208
19752
 
@@ -19578,10 +20122,17 @@ class AuroDropdown extends AuroElement$2 {
19578
20122
  this.clearTriggerFocusEventBinding();
19579
20123
  }
19580
20124
 
20125
+ // eslint-disable-next-line complexity
19581
20126
  updated(changedProperties) {
19582
20127
  super.updated(changedProperties);
19583
20128
  this.floater.handleUpdate(changedProperties);
19584
20129
 
20130
+ // Close the dropdown if the disabled property is set to true
20131
+ if (changedProperties.has('disabled') && this.disabled && this.isPopoverVisible) {
20132
+ this.hide();
20133
+ this.isPopoverVisible = false;
20134
+ }
20135
+
19585
20136
  // Note: `disabled` is not a breakpoint (it is not a screen size),
19586
20137
  // so it looks like we never consume this - however, dropdownBib handles this in the setter as "undefined"
19587
20138
  if (changedProperties.has('fullscreenBreakpoint')) {
@@ -19655,8 +20206,30 @@ class AuroDropdown extends AuroElement$2 {
19655
20206
  }
19656
20207
 
19657
20208
  const eventType = event.detail.eventType || "unknown";
19658
- if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown") {
19659
- this.trigger.focus();
20209
+ if (!this.isPopoverVisible && this.hasFocus && eventType === "keydown" && !this.noFocusRestoreOnClose) {
20210
+ this.focusTrigger();
20211
+ }
20212
+
20213
+
20214
+ // On Tab-driven close (eventType "focusloss"), let focus advance naturally
20215
+ // — restoring to the trigger would trap the user on this dropdown, forcing
20216
+ // an extra Tab to move on. Escape and outside-click still restore.
20217
+ // When noFocusRestoreOnClose is true, the consumer (e.g. combobox) manages
20218
+ // its own focus restoration — skip the generic trigger focus to avoid races.
20219
+ if (!this.isPopoverVisible && eventType !== "focusloss" && !this.noFocusRestoreOnClose) {
20220
+ // wait til the bib gets fully closed and rendered
20221
+ setTimeout(() => {
20222
+ // Skip if the bib re-opened, or if focus moved intentionally outside the dropdown (not to body).
20223
+ // Restore focus to trigger when focus is still inside the bib (:focus-within) or fell to body.
20224
+ if (this.isPopoverVisible ||
20225
+ // eslint-disable-next-line no-extra-parens
20226
+ (!this.bibContent?.matches(':focus-within') &&
20227
+ document.activeElement !== document.body)) {
20228
+ return;
20229
+ }
20230
+ // Restore focus to the trigger.
20231
+ this.focusTrigger();
20232
+ });
19660
20233
  }
19661
20234
  }
19662
20235
 
@@ -19857,6 +20430,14 @@ class AuroDropdown extends AuroElement$2 {
19857
20430
  };
19858
20431
  this.addEventListener('keydown', this._bibTabHandler);
19859
20432
 
20433
+ // Suppress AuroFloatingUI's auto-hide-on-focus-loss while the
20434
+ // desktopModal trap owns focus management. Without this, the very
20435
+ // first focus move into the bib (from the RAF below) triggers
20436
+ // handleFocusLoss → hideBib, tearing down the trap before the
20437
+ // user can press Tab.
20438
+ this._priorNoHideOnFocusLoss = this.noHideOnThisFocusLoss;
20439
+ this.noHideOnThisFocusLoss = true;
20440
+
19860
20441
  // Move initial focus into the bib content, matching FocusTrap behavior
19861
20442
  requestAnimationFrame(() => {
19862
20443
  const focusables = getFocusableElements(this.bibContent);
@@ -19865,15 +20446,16 @@ class AuroDropdown extends AuroElement$2 {
19865
20446
  }
19866
20447
  });
19867
20448
  } else {
19868
- // Normal desktop: use FocusTrap on the bib element.
19869
- // Defer focusFirstElement to the next frame because the popover
19870
- // is positioned asynchronously by Floating UI — calling focus()
19871
- // synchronously here would target elements with zero dimensions
19872
- // and the focus call would be silently ignored.
19873
- this.focusTrap = new FocusTrap(this.bibContent);
20449
+ // Normal desktop (non-modal): move initial focus into the bib but
20450
+ // don't trap Tab. Tab should exit the bib and let the floater's
20451
+ // handleFocusLoss close it, matching native <select>/<details>
20452
+ // behavior. Deferred one frame because Floating UI positions the
20453
+ // popover asynchronously a synchronous focus() would target
20454
+ // zero-dimension elements and be silently ignored.
19874
20455
  requestAnimationFrame(() => {
19875
- if (this.focusTrap) {
19876
- this.focusTrap.focusFirstElement();
20456
+ const focusables = getFocusableElements(this.bibContent);
20457
+ if (focusables.length) {
20458
+ focusables[0].focus();
19877
20459
  }
19878
20460
  });
19879
20461
  }
@@ -20170,6 +20752,7 @@ class AuroDropdown extends AuroElement$2 {
20170
20752
  role="${ifDefined(this.triggerContentFocusable ? undefined : this.a11yRole)}"
20171
20753
  aria-expanded="${ifDefined(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
20172
20754
  aria-controls="${ifDefined(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
20755
+ aria-haspopup="${ifDefined(this.a11yRole === 'combobox' && !this.triggerContentFocusable ? 'listbox' : undefined)}"
20173
20756
  aria-labelledby="${ifDefined(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
20174
20757
  aria-disabled="${ifDefined(this.disabled ? 'true' : undefined)}"
20175
20758
  @focusin="${this.handleFocusin}"
@@ -20296,7 +20879,7 @@ class AuroDropdown extends AuroElement$2 {
20296
20879
 
20297
20880
  var shapeSizeCss = css`.shape-classic-xl,.shape-classic-lg,.shape-classic-md,.shape-classic-sm,.shape-classic-xs{min-height:56px;max-height:56px;border-style:solid;border-width:1px;border-radius:var(--ds-border-radius, 0.375rem)}.shape-classic-xl.simple,.shape-classic-lg.simple,.shape-classic-md.simple,.shape-classic-sm.simple,.shape-classic-xs.simple{border-width:0px;min-height:58px;max-height:58px;background-color:unset;box-shadow:none}.shape-classic-xl.thin,.shape-classic-lg.thin,.shape-classic-md.thin,.shape-classic-sm.thin,.shape-classic-xs.thin{border-width:1px;min-height:56px;max-height:56px;background-color:unset}.shape-classic-xl.parentBorder,.shape-classic-lg.parentBorder,.shape-classic-md.parentBorder,.shape-classic-sm.parentBorder,.shape-classic-xs.parentBorder{border:0;box-shadow:unset;min-height:54px;max-height:54px}.shape-snowflake-xl,.shape-snowflake-lg,.shape-snowflake-md,.shape-snowflake-sm,.shape-snowflake-xs{min-height:56px;max-height:56px;border-style:solid;border-width:2px;border-color:transparent;border-radius:30px}.shape-snowflake-xl.simple,.shape-snowflake-lg.simple,.shape-snowflake-md.simple,.shape-snowflake-sm.simple,.shape-snowflake-xs.simple{border-width:0px;min-height:60px;max-height:60px;background-color:unset;box-shadow:none}.shape-snowflake-xl.thin,.shape-snowflake-lg.thin,.shape-snowflake-md.thin,.shape-snowflake-sm.thin,.shape-snowflake-xs.thin{border-width:1px;min-height:58px;max-height:58px;background-color:unset}.shape-snowflake-xl.parentBorder,.shape-snowflake-lg.parentBorder,.shape-snowflake-md.parentBorder,.shape-snowflake-sm.parentBorder,.shape-snowflake-xs.parentBorder{border:0;box-shadow:unset;min-height:56px;max-height:56px}.shape-box-xl{min-height:68px;max-height:68px;border-style:solid;border-width:2px;border-color:transparent}.shape-box-xl.simple{border-width:0px;min-height:72px;max-height:72px;background-color:unset;box-shadow:none}.shape-box-xl.thin{border-width:1px;min-height:70px;max-height:70px;background-color:unset}.shape-box-xl.parentBorder{border:0;box-shadow:unset;min-height:68px;max-height:68px}.shape-box-lg{min-height:52px;max-height:52px;border-style:solid;border-width:2px;border-color:transparent}.shape-box-lg.simple{border-width:0px;min-height:56px;max-height:56px;background-color:unset;box-shadow:none}.shape-box-lg.thin{border-width:1px;min-height:54px;max-height:54px;background-color:unset}.shape-box-lg.parentBorder{border:0;box-shadow:unset;min-height:52px;max-height:52px}.shape-box-md{min-height:44px;max-height:44px;border-style:solid;border-width:2px;border-color:transparent}.shape-box-md.simple{border-width:0px;min-height:48px;max-height:48px;background-color:unset;box-shadow:none}.shape-box-md.thin{border-width:1px;min-height:46px;max-height:46px;background-color:unset}.shape-box-md.parentBorder{border:0;box-shadow:unset;min-height:44px;max-height:44px}.shape-box-sm{min-height:32px;max-height:32px;border-style:solid;border-width:2px;border-color:transparent}.shape-box-sm.simple{border-width:0px;min-height:36px;max-height:36px;background-color:unset;box-shadow:none}.shape-box-sm.thin{border-width:1px;min-height:34px;max-height:34px;background-color:unset}.shape-box-sm.parentBorder{border:0;box-shadow:unset;min-height:32px;max-height:32px}.shape-box-xs{min-height:20px;max-height:20px;border-style:solid;border-width:2px;border-color:transparent}.shape-box-xs.simple{border-width:0px;min-height:24px;max-height:24px;background-color:unset;box-shadow:none}.shape-box-xs.thin{border-width:1px;min-height:22px;max-height:22px;background-color:unset}.shape-box-xs.parentBorder{border:0;box-shadow:unset;min-height:20px;max-height:20px}.shape-rounded-lg{min-height:56px;max-height:56px;border-style:solid;border-width:2px;border-color:transparent;border-radius:6px}.shape-rounded-lg.simple{border-width:0px;min-height:56px;max-height:56px;background-color:unset;box-shadow:none}.shape-rounded-lg.thin{border-width:1px;min-height:54px;max-height:54px;background-color:unset}.shape-rounded-lg.parentBorder{border:0;box-shadow:unset;min-height:52px;max-height:52px}.shape-pill-xl{min-height:68px;max-height:68px;border-style:solid;border-width:2px;border-color:transparent;border-radius:36px}.shape-pill-xl.simple{border-width:0px;min-height:72px;max-height:72px;background-color:unset;box-shadow:none}.shape-pill-xl.thin{border-width:1px;min-height:70px;max-height:70px;background-color:unset}.shape-pill-xl.parentBorder{border:0;box-shadow:unset;min-height:68px;max-height:68px}.shape-pill-left-xl{min-height:68px;max-height:68px;border-style:solid;border-width:2px;border-color:transparent;border-radius:36px 0 0 36px}.shape-pill-left-xl.simple{border-width:0px;min-height:72px;max-height:72px;background-color:unset;box-shadow:none}.shape-pill-left-xl.thin{border-width:1px;min-height:70px;max-height:70px;background-color:unset}.shape-pill-left-xl.parentBorder{border:0;box-shadow:unset;min-height:68px;max-height:68px}.shape-pill-right-xl{min-height:68px;max-height:68px;border-style:solid;border-width:2px;border-color:transparent;border-radius:0 36px 36px 0}.shape-pill-right-xl.simple{border-width:0px;min-height:72px;max-height:72px;background-color:unset;box-shadow:none}.shape-pill-right-xl.thin{border-width:1px;min-height:70px;max-height:70px;background-color:unset}.shape-pill-right-xl.parentBorder{border:0;box-shadow:unset;min-height:68px;max-height:68px}.shape-pill-md{min-height:44px;max-height:44px;border-style:solid;border-width:2px;border-color:transparent;border-radius:36px}.shape-pill-md.simple{border-width:0px;min-height:48px;max-height:48px;background-color:unset;box-shadow:none}.shape-pill-md.thin{border-width:1px;min-height:46px;max-height:46px;background-color:unset}.shape-pill-md.parentBorder{border:0;box-shadow:unset;min-height:44px;max-height:44px}.shape-pill-left-md{min-height:44px;max-height:44px;border-style:solid;border-width:2px;border-color:transparent;border-radius:36px 0 0 36px}.shape-pill-left-md.simple{border-width:0px;min-height:48px;max-height:48px;background-color:unset;box-shadow:none}.shape-pill-left-md.thin{border-width:1px;min-height:46px;max-height:46px;background-color:unset}.shape-pill-left-md.parentBorder{border:0;box-shadow:unset;min-height:44px;max-height:44px}.shape-pill-right-md{min-height:44px;max-height:44px;border-style:solid;border-width:2px;border-color:transparent;border-radius:0 36px 36px 0}.shape-pill-right-md.simple{border-width:0px;min-height:48px;max-height:48px;background-color:unset;box-shadow:none}.shape-pill-right-md.thin{border-width:1px;min-height:46px;max-height:46px;background-color:unset}.shape-pill-right-md.parentBorder{border:0;box-shadow:unset;min-height:44px;max-height:44px}`;
20298
20881
 
20299
- var styleCss$1 = css`.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock{display:block}.util_displayFlex{display:flex}.util_displayHidden{display:none}.util_displayHiddenVisually{position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}.body-default{font-size:var(--wcss-body-default-font-size, 1rem);font-weight:var(--wcss-body-default-weight, );line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default,.body-default-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-default-emphasized{font-size:var(--wcss-body-default-emphasized-font-size, 1rem);font-weight:var(--wcss-body-default-emphasized-weight, );line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.body-lg{font-size:var(--wcss-body-lg-font-size, 1.125rem);font-weight:var(--wcss-body-lg-weight, );line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg,.body-lg-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-lg-emphasized{font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);font-weight:var(--wcss-body-lg-emphasized-weight, );line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{font-size:var(--wcss-body-sm-font-size, 0.875rem);font-weight:var(--wcss-body-sm-weight, );line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm,.body-sm-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-sm-emphasized{font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);font-weight:var(--wcss-body-sm-emphasized-weight, );line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.body-xs{font-size:var(--wcss-body-xs-font-size, 0.75rem);font-weight:var(--wcss-body-xs-weight, );line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs,.body-xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-xs-emphasized{font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);font-weight:var(--wcss-body-xs-emphasized-weight, );line-height:var(--wcss-body-xs-emphasized-line-height, 1rem)}.body-2xs{font-size:var(--wcss-body-2xs-font-size, 0.625rem);font-weight:var(--wcss-body-2xs-weight, );line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs,.body-2xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-2xs-emphasized{font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);font-weight:var(--wcss-body-2xs-emphasized-weight, );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-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, 300);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, 300);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, 0.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, 0.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, 0.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, 0.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, 0.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, 0.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(0.875rem, 1.1666666667vw, 0.875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}:host{display:block}.wrapper:has(:enabled){cursor:text}.wrapper:has(:enabled) label{cursor:text}.helpTextClasses{cursor:default}input{overflow:clip !important;width:100%;padding:0;border:0;background:unset;outline:none;overflow-clip-margin:0 !important;text-overflow:ellipsis}input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.displayValue{display:none}.displayValue.hasContent:is(.withValue):not(.hasFocus){display:flex;align-items:center}.accents:not(.util_displayHidden){display:flex;flex-direction:row;align-items:center;justify-content:center;gap:8px}.wrapper:not(:focus-within):not(:hover) .notificationBtn.passwordBtn,.wrapper:not(:focus-within):not(:hover) .notification.clear{display:none}.notification{display:flex;align-items:center;justify-content:center}`;
20882
+ var styleCss$1 = css`.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock{display:block}.util_displayFlex{display:flex}.util_displayHidden{display:none}.util_displayHiddenVisually{position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}.body-default{font-size:var(--wcss-body-default-font-size, 1rem);font-weight:var(--wcss-body-default-weight, );line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default,.body-default-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-default-emphasized{font-size:var(--wcss-body-default-emphasized-font-size, 1rem);font-weight:var(--wcss-body-default-emphasized-weight, );line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.body-lg{font-size:var(--wcss-body-lg-font-size, 1.125rem);font-weight:var(--wcss-body-lg-weight, );line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg,.body-lg-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-lg-emphasized{font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);font-weight:var(--wcss-body-lg-emphasized-weight, );line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{font-size:var(--wcss-body-sm-font-size, 0.875rem);font-weight:var(--wcss-body-sm-weight, );line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm,.body-sm-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-sm-emphasized{font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);font-weight:var(--wcss-body-sm-emphasized-weight, );line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.body-xs{font-size:var(--wcss-body-xs-font-size, 0.75rem);font-weight:var(--wcss-body-xs-weight, );line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs,.body-xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-xs-emphasized{font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);font-weight:var(--wcss-body-xs-emphasized-weight, );line-height:var(--wcss-body-xs-emphasized-line-height, 1rem)}.body-2xs{font-size:var(--wcss-body-2xs-font-size, 0.625rem);font-weight:var(--wcss-body-2xs-weight, );line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs,.body-2xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-2xs-emphasized{font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);font-weight:var(--wcss-body-2xs-emphasized-weight, );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-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, 300);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, 300);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, 0.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, 0.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, 0.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, 0.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, 0.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, 0.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(0.875rem, 1.1666666667vw, 0.875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}:host{display:block}.wrapper:has(:enabled){cursor:text}.wrapper:has(:enabled) label{cursor:text}.helpTextClasses{cursor:default}input{overflow:clip !important;width:100%;padding:0;border:0;background:unset;outline:none;overflow-clip-margin:0 !important;text-overflow:ellipsis}input[type=number]{appearance:textfield}input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.displayValue{display:none}.displayValue.hasContent:is(.withValue):not(.hasFocus){display:flex;align-items:center}.accents:not(.util_displayHidden){display:flex;flex-direction:row;align-items:center;justify-content:center;gap:8px}.wrapper:not(:focus-within):not(:hover) .notificationBtn.passwordBtn,.wrapper:not(:focus-within):not(:hover) .notification.clear{display:none}.notification{display:flex;align-items:center;justify-content:center}`;
20300
20883
 
20301
20884
  var styleDefaultCss = css`.layoutDefault .typeIcon,:host(:not([layout])) .typeIcon{display:flex;flex-direction:row;align-items:center}.layoutDefault .typeIcon [auro-icon],:host(:not([layout])) .typeIcon [auro-icon]{--ds-auro-icon-size: var(--ds-size-300, 1.5rem);height:var(--ds-size-300, 1.5rem);margin-right:var(--ds-size-100, 0.5rem)}.layoutDefault .notificationIcons,:host(:not([layout])) .notificationIcons{display:flex;flex-direction:row;padding-right:var(--ds-size-100, 0.5rem)}:host([class=layoutDefault][bordered]) .typeIcon,:host(:not([layout])[bordered]) .typeIcon{padding-left:var(--ds-size-100, 0.5rem)}:host([class=layoutDefault][bordered]) .notificationIcons,:host(:not([layout])[bordered]) .notificationIcons{align-items:center}:host([class=layoutDefault][bordered]) .notification:not(:first-of-type),:host(:not([layout])[bordered]) .notification:not(:first-of-type){margin-left:var(--ds-size-100, 0.5rem)}:host([class=layoutDefault][bordered]) .alertNotification,:host(:not([layout])[bordered]) .alertNotification{width:calc(var(--ds-size-300, 1.5rem) + var(--ds-size-25, 0.125rem));height:calc(var(--ds-size-300, 1.5rem) + var(--ds-size-25, 0.125rem))}:host([class=layoutDefault][bordered]) .passwordBtn,:host(:not([layout])[bordered]) .passwordBtn{width:calc(var(--ds-size-300, 1.5rem));height:calc(var(--ds-size-300, 1.5rem))}:host([class=layoutDefault][bordered]) .notificationBtn,:host(:not([layout])[bordered]) .notificationBtn{display:block;width:var(--ds-size-300, 1.5rem);height:var(--ds-size-300, 1.5rem);padding:0;border:0;background:unset;cursor:pointer}:host([class=layoutDefault][bordered]) .notificationBtn [auro-icon],:host(:not([layout])[bordered]) .notificationBtn [auro-icon]{display:block;height:var(--ds-size-300, 1.5rem);--ds-auro-icon-size: var(--ds-size-300, 1.5rem)}:host([class=layoutDefault][bordered]) .notificationBtn [auro-icon][hidden],:host(:not([layout])[bordered]) .notificationBtn [auro-icon][hidden]{display:none}:host([class=layoutDefault]:not([bordered])) .typeIcon,:host([class=layoutDefault]:not([bordered])) .notificationIcons,:host(:not([layout]):not([bordered])) .typeIcon,:host(:not([layout]):not([bordered])) .notificationIcons{align-items:flex-end;padding-bottom:var(--ds-size-50, 0.25rem)}:host([class=layoutDefault]:not([bordered])) .clearBtn,:host(:not([layout]):not([bordered])) .clearBtn{transition:all .3s cubic-bezier(0.215, 0.61, 0.355, 1);overflow:hidden;width:0;opacity:0}.layoutDefault .wrapper:hover .clearBtn,.layoutDefault .wrapper:focus-within .clearBtn,:host(:not([layout])) .wrapper:hover .clearBtn,:host(:not([layout])) .wrapper:focus-within .clearBtn{width:calc(var(--ds-size-200, 1rem) + var(--ds-size-25, 0.125rem));height:calc(var(--ds-size-200, 1rem) + var(--ds-size-25, 0.125rem));opacity:1}:host([class=layoutDefault]:focus-within[type=password]) .notificationIcons[hasValue] .alertNotification,:host(:not([layout]):focus-within[type=password]) .notificationIcons[hasValue] .alertNotification{overflow:hidden;width:0;height:0;padding:0;margin:0;visibility:hidden}.layoutDefault input,:host(:not([layout])) input{border:unset}.layoutDefault .wrapper,:host(:not([layout])) .wrapper{position:relative;overflow:hidden;border-style:solid}:host([class=layoutDefault]:not([bordered],[borderless])) .wrapper,:host(:not([layout]):not([bordered],[borderless])) .wrapper{border-width:1px 0}:host([class=layoutDefault][bordered]) .wrapper,:host(:not([layout])[bordered]) .wrapper{border-width:1px;border-radius:var(--ds-border-radius, 0.375rem)}:host([class=layoutDefault]:not([borderless])) .wrapper:focus-within:before,:host(:not([layout]):not([borderless])) .wrapper:focus-within:before{position:absolute;display:block;border-bottom-width:1px;border-bottom-style:solid;content:"";inset:0;pointer-events:none}:host([class=layoutDefault][validity]:not([validity=valid])) .wrapper:before,:host(:not([layout])[validity]:not([validity=valid])) .wrapper:before{border-bottom:0}:focus:not(:focus-visible){outline:3px solid transparent}.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock,:host{display:block}.util_displayFlex{display:flex}.util_displayHidden,:host([hidden]:not(:focus):not(:active)){display:none}.util_displayHiddenVisually,:host([hiddenVisually]:not(:focus):not(:active)){position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}:host{text-align:left}.layoutDefault :host,:host(:not([layout])) :host{position:relative;display:block}.layoutDefault .wrapper,:host(:not([layout])) .wrapper{display:flex;flex-direction:row}.layoutDefault .main,:host(:not([layout])) .main{display:flex;flex-direction:row;position:relative;flex:1}`;
20302
20885
 
@@ -24574,8 +25157,21 @@ class AuroFormValidation {
24574
25157
  return;
24575
25158
  }
24576
25159
 
24577
- // Validate that the date passed was the correct format and is a valid date
25160
+ // Validate that the date passed was the correct format and is a valid date.
25161
+ // For partial date formats, valueObject is never populated; validate them directly.
24578
25162
  if (elem.value && !elem.valueObject) {
25163
+ const isPartialDateFormat = elem.util && !elem.util.isFullDateFormat(elem.type, elem.format);
25164
+
25165
+ if (isPartialDateFormat) {
25166
+ if (!elem.util.isValidPartialDate(elem.value, elem.format)) {
25167
+ elem.validity = 'patternMismatch';
25168
+ elem.errorMessage = elem.setCustomValidityPatternMismatch || elem.setCustomValidity || 'Invalid Date Format Entered';
25169
+ }
25170
+ // Partial date format — validate directly and skip max/min checks since valueObject is undefined.
25171
+ return;
25172
+ }
25173
+
25174
+ // Full date format with no valueObject means the value is not a valid calendar date.
24579
25175
  elem.validity = 'patternMismatch';
24580
25176
  elem.errorMessage = elem.setCustomValidityPatternMismatch || elem.setCustomValidity || 'Invalid Date Format Entered';
24581
25177
  return;
@@ -24672,15 +25268,17 @@ class AuroFormValidation {
24672
25268
  );
24673
25269
  }
24674
25270
 
24675
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
24676
- if (this.auroInputElements?.length === 2) {
24677
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
25271
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
25272
+
25273
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
25274
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
25275
+ // field (datepicker is the intended consumer — start/end are independently required).
25276
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
25277
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
24678
25278
  hasValue = false;
24679
25279
  }
24680
25280
  }
24681
25281
 
24682
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
24683
-
24684
25282
  if (isCombobox) {
24685
25283
 
24686
25284
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -24779,7 +25377,7 @@ class AuroFormValidation {
24779
25377
  } else if (this.runtimeUtils.elementMatch(elem, 'auro-input') && elem.errorMessage === '') {
24780
25378
  const input = elem.renderRoot.querySelector('input');
24781
25379
 
24782
- if (input.validationMessage.length > 0) {
25380
+ if (input && input.validationMessage.length > 0) {
24783
25381
  elem.errorMessage = input.validationMessage;
24784
25382
  }
24785
25383
  } else if (this.runtimeUtils.elementMatch(elem, 'auro-combobox') && elem.errorMessage === '') {
@@ -30361,8 +30959,6 @@ function cleanEscapedString(input) {
30361
30959
  return input.match(escapedStringRegExp)[1].replace(doubleQuoteRegExp, "'");
30362
30960
  }
30363
30961
 
30364
- /* eslint-disable max-lines */
30365
-
30366
30962
  class AuroInputUtilities {
30367
30963
 
30368
30964
  /**
@@ -30405,7 +31001,7 @@ class AuroInputUtilities {
30405
31001
  /**
30406
31002
  * Converts an IMask-style date mask to a date-fns compatible format string.
30407
31003
  * @param {string} mask - IMask date mask (e.g. "MM/DD/YYYY").
30408
- * @returns {string} date-fns format string (e.g. "MM/dd/yyyy").
31004
+ * @returns {string} A date-fns format string (e.g. "MM/dd/yyyy").
30409
31005
  */
30410
31006
  toDateFnsMask(mask) {
30411
31007
  return mask
@@ -30505,10 +31101,11 @@ class AuroInputUtilities {
30505
31101
  const dateFormat = format$1 || this.overrideFormat || pattern || 'mm/dd/yyyy';
30506
31102
 
30507
31103
  if (dateFormat === 'dd' || dateFormat === 'yy' || dateFormat === 'yyyy') {
30508
- const maxValue = dateFormat === 'dd' ? 31 : (dateFormat === 'yy' ? 99 : 9999);
31104
+ const fromValue = dateFormat === 'yyyy' ? 1900 : (dateFormat === 'yy' ? 0 : 1);
31105
+ const maxValue = dateFormat === 'dd' ? 31 : (dateFormat === 'yy' ? 99 : 2100);
30509
31106
  return {
30510
31107
  mask: IMask.MaskedRange,
30511
- from: 1,
31108
+ from: fromValue,
30512
31109
  to: maxValue,
30513
31110
  lazy: true,
30514
31111
  placeholderChar: '',
@@ -30516,7 +31113,8 @@ class AuroInputUtilities {
30516
31113
  return value.toString().padStart(dateFormat.length, '0');
30517
31114
  },
30518
31115
  parse(str) {
30519
- return parseInt(str) || null;
31116
+ const num = parseInt(str, 10);
31117
+ return isNaN(num) ? null : num;
30520
31118
  }
30521
31119
  };
30522
31120
  }
@@ -30580,6 +31178,49 @@ class AuroInputUtilities {
30580
31178
  return type === 'date' && normalizedFormat.includes('yy') && normalizedFormat.includes('mm') && normalizedFormat.includes('dd');
30581
31179
  }
30582
31180
 
31181
+ /**
31182
+ * Validates a value against a partial date format (one that lacks yy/mm/dd all three).
31183
+ * Day- and year-only formats (dd/yy/yyyy) are checked as integer ranges; other partial formats use
31184
+ * a date-fns parse + round-trip to confirm both validity and exact formatting.
31185
+ * @param {string} value - The user-facing display value.
31186
+ * @param {string} format - The partial date format string (e.g. "mm/yyyy", "yyyy", "dd").
31187
+ * @returns {boolean}
31188
+ */
31189
+ isValidPartialDate(value, format$1) {
31190
+ if (!value || !format$1) {
31191
+ return false;
31192
+ }
31193
+ const normalizedFormat = format$1.toLowerCase();
31194
+
31195
+ if (normalizedFormat === 'dd') {
31196
+ const num = Number(value);
31197
+ return (/^\d{2}$/u).test(value) && num >= 1 && num <= 31;
31198
+ }
31199
+ if (normalizedFormat === 'yy') {
31200
+ const num = Number(value);
31201
+ return (/^\d{2}$/u).test(value) && num >= 0 && num <= 99;
31202
+ }
31203
+ if (normalizedFormat === 'yyyy') {
31204
+ const num = Number(value);
31205
+ return (/^\d{4}$/u).test(value) && num >= 1900 && num <= 2100;
31206
+ }
31207
+
31208
+ const dateFnsMask = this.toDateFnsMask(normalizedFormat);
31209
+ // Use the 1st of the current month as the reference so that formats
31210
+ // omitting a day (e.g. MM/yyyy) never roll over on days 29–31.
31211
+ const referenceDate = new Date();
31212
+ referenceDate.setDate(1);
31213
+ const parsed = parse(value, dateFnsMask, referenceDate);
31214
+ if (!isValid(parsed) || format(parsed, dateFnsMask) !== value) {
31215
+ return false;
31216
+ }
31217
+ if (normalizedFormat.includes('yyyy')) {
31218
+ const year = parsed.getFullYear();
31219
+ return year >= 1900 && year <= 2100;
31220
+ }
31221
+ return true;
31222
+ }
31223
+
30583
31224
  /**
30584
31225
  * Converts a display string to its model value.
30585
31226
  * For full date formats, converts the display string to an ISO date string.
@@ -30616,6 +31257,13 @@ class AuroInputUtilities {
30616
31257
  * @returns {string | undefined}
30617
31258
  */
30618
31259
  toFormattedValue(valueObject, format) {
31260
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
31261
+ // `format` argument has to fail gracefully rather than throw on
31262
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
31263
+ // as "no format → no display value".
31264
+ if (!format) {
31265
+ return undefined;
31266
+ }
30619
31267
  const normalizedFormat = format.toLowerCase();
30620
31268
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
30621
31269
 
@@ -30754,9 +31402,10 @@ class DomHandler {
30754
31402
  class BaseInput extends AuroElement$1 {
30755
31403
 
30756
31404
  // Delegate focus to the native <input> inside the shadow root so that
30757
- // showModal()'s dialog focusing steps reach the input element.
30758
- // This keeps the mobile virtual keyboard open when the fullscreen dialog
30759
- // opens, because the browser sees an input-to-input focus transfer.
31405
+ // clicking anywhere on the input wrapper focuses the native input, and
31406
+ // programmatic .focus() calls on elements in the shadow DOM work correctly.
31407
+ // The initial-load focus theft was caused by the static `autofocus`
31408
+ // attribute on the bib input (now conditional), not by delegatesFocus.
30760
31409
  static get shadowRootOptions() {
30761
31410
  return {
30762
31411
  ...AuroElement$1.shadowRootOptions,
@@ -30767,79 +31416,19 @@ class BaseInput extends AuroElement$1 {
30767
31416
  constructor() {
30768
31417
  super();
30769
31418
 
30770
- this.appearance = "default";
30771
- this.disabled = false;
30772
- this.layout = 'classic';
30773
- this.locale = 'en-US';
30774
- this.max = undefined;
30775
- this._maxObject = undefined;
30776
- this.maxLength = undefined;
30777
- this.min = undefined;
30778
- this._minObject = undefined;
30779
- this.minLength = undefined;
30780
- this.required = false;
30781
- this.onDark = false;
30782
- this.setCustomValidityForType = undefined;
30783
- this.size = 'lg';
30784
- this.shape = 'classic';
30785
- this.value = undefined;
30786
- this._valueObject = undefined;
30787
-
30788
- this._initializePrivateDefaults();
30789
- }
30790
-
30791
- /**
30792
- * Internal Defaults.
30793
- * @private
30794
- * @returns {void}
30795
- */
30796
- _initializePrivateDefaults() {
31419
+ // Single-source initialization. Alphabetized so duplicate or stale
31420
+ // defaults are immediately obvious on a diff. Every field is assigned
31421
+ // exactly once here (previously the constructor + the old
31422
+ // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
31423
+ // fields and double-allocated `util` and `validation`, discarding the
31424
+ // first instance). `validation` is now allocated exactly once; `util`
31425
+ // is seeded here with an en-US default and then rebuilt in
31426
+ // `connectedCallback` once the consumer-resolved locale is available,
31427
+ // so a parent (datepicker/combobox) calling `validate()` synchronously
31428
+ // during its own update cycle sees a populated util instance.
30797
31429
  this.activeLabel = false;
30798
- this.appearance = "default";
30799
- this.icon = false;
30800
- this.disabled = false;
30801
- this.dvInputOnly = false;
30802
- this.hideLabelVisually = false;
30803
- this.max = undefined;
30804
- this.maxLength = undefined;
30805
- this.min = undefined;
30806
- this.minLength = undefined;
30807
- this.noValidate = false;
30808
- this.onDark = false;
30809
- this.required = false;
30810
- this.setCustomValidityForType = undefined;
30811
-
30812
- // Used for storing raw values returned from input mask.
30813
- this._rawMaskValue = undefined;
30814
-
30815
- /**
30816
- * @private
30817
- */
30818
- this.layout = 'classic';
30819
-
30820
- /**
30821
- * @private
30822
- */
30823
- this.shape = 'classic';
30824
-
30825
- /**
30826
- * @private
30827
- */
30828
- this.size = 'lg';
30829
-
30830
- this.touched = false;
30831
- this.util = new AuroInputUtilities({
30832
- locale: "en-US",
30833
- format: this.format
30834
- });
30835
- this.validation = new AuroFormValidation();
30836
- this.inputIconName = undefined;
30837
- this.showPassword = false;
30838
- this.validationCCLength = undefined;
30839
- this.hasValue = false;
30840
- this.label = 'Input label is undefined';
30841
-
30842
31430
 
31431
+ /** @private */
30843
31432
  this.allowedInputTypes = [
30844
31433
  "text",
30845
31434
  "number",
@@ -30848,7 +31437,9 @@ class BaseInput extends AuroElement$1 {
30848
31437
  "credit-card",
30849
31438
  "tel"
30850
31439
  ];
30851
- this.icon = false;
31440
+ this.appearance = "default";
31441
+
31442
+ /** @private */
30852
31443
  this.dateFormatMap = {
30853
31444
  'mm/dd/yyyy': 'dateMMDDYYYY',
30854
31445
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -30865,27 +31456,64 @@ class BaseInput extends AuroElement$1 {
30865
31456
  'dd/mm': 'dateDDMM',
30866
31457
  'mm/dd': 'dateMMDD'
30867
31458
  };
31459
+ this.disabled = false;
31460
+
31461
+ /** @private */
30868
31462
  this.domHandler = new DomHandler();
30869
31463
  this.dvInputOnly = false;
30870
31464
  this.hasValue = false;
31465
+ this.hideLabelVisually = false;
31466
+ this.icon = false;
31467
+
31468
+ /** @private */
30871
31469
  this.inputIconName = undefined;
31470
+
31471
+ /** @private */
30872
31472
  this.label = 'Input label is undefined';
31473
+ this.layout = 'classic';
31474
+ this.locale = 'en-US';
31475
+ this._format = undefined;
31476
+
31477
+ /** @private */
31478
+ this._userSetFormat = false;
31479
+ this.max = undefined;
31480
+ this.maxLength = undefined;
31481
+ this.min = undefined;
31482
+ this.minLength = undefined;
30873
31483
  this.noValidate = false;
30874
- this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
31484
+ this.onDark = false;
31485
+ this.required = false;
31486
+ this.setCustomValidityForType = undefined;
31487
+ // Credit Card is intentionally excluded — its mask manages the cursor
31488
+ // itself, and listing it here caused cursor placement issues in Safari.
31489
+ /** @private */
30875
31490
  this.setSelectionInputTypes = [
30876
31491
  "text",
30877
31492
  "password",
30878
31493
  "email"
30879
- ]; // Credit Card is not included as this caused cursor placement issues in Safari.
31494
+ ];
31495
+ this.shape = 'classic';
31496
+
31497
+ /** @private */
30880
31498
  this.showPassword = false;
31499
+ this.size = 'lg';
30881
31500
  this.touched = false;
31501
+
31502
+ /** @private */
30882
31503
  this.uniqueId = new UniqueId().create();
31504
+
31505
+ /** @private */
30883
31506
  this.util = new AuroInputUtilities({
30884
31507
  locale: this.locale,
30885
31508
  format: this.format
30886
31509
  });
31510
+
31511
+ /** @private */
30887
31512
  this.validation = new AuroFormValidation();
31513
+
31514
+ /** @private */
30888
31515
  this.validationCCLength = undefined;
31516
+ this.value = undefined;
30889
31517
  }
30890
31518
 
30891
31519
  // function to define props used within the scope of this component
@@ -31011,7 +31639,8 @@ class BaseInput extends AuroElement$1 {
31011
31639
  */
31012
31640
  format: {
31013
31641
  type: String,
31014
- reflect: true
31642
+ reflect: true,
31643
+ noAccessor: true
31015
31644
  },
31016
31645
 
31017
31646
  /**
@@ -31215,6 +31844,13 @@ class BaseInput extends AuroElement$1 {
31215
31844
  type: String
31216
31845
  },
31217
31846
 
31847
+ /**
31848
+ * Custom help text message to display when validity = `patternMismatch`.
31849
+ */
31850
+ setCustomValidityPatternMismatch: {
31851
+ type: String
31852
+ },
31853
+
31218
31854
  /**
31219
31855
  * Custom help text message to display when validity = `rangeOverflow`.
31220
31856
  */
@@ -31285,7 +31921,7 @@ class BaseInput extends AuroElement$1 {
31285
31921
 
31286
31922
  /**
31287
31923
  * Populates the `type` attribute on the input.
31288
- * @type {'text' | 'password' | 'email' | 'credit-card' | 'tel' | 'number'}
31924
+ * @type {'text' | 'password' | 'email' | 'credit-card' | 'tel' | 'number' | 'date'}
31289
31925
  * @default 'text'
31290
31926
  */
31291
31927
  type: {
@@ -31310,7 +31946,7 @@ class BaseInput extends AuroElement$1 {
31310
31946
 
31311
31947
  /**
31312
31948
  * Populates the `value` attribute on the input. Can also be read to retrieve the current value of the input.
31313
- * The format for this property should be ISO for `date` type inputs.
31949
+ * For `date` type inputs using a full date format (year/month/day), the `value` should be ISO (YYYY-MM-DD). Partial date formats use the display format.
31314
31950
  */
31315
31951
  value: {
31316
31952
  type: String
@@ -31323,7 +31959,7 @@ class BaseInput extends AuroElement$1 {
31323
31959
  * @returns {Date|undefined}
31324
31960
  */
31325
31961
  get valueObject() {
31326
- return this._valueObject;
31962
+ return this.value && dateFormatter.isValidDate(this.value) ? dateFormatter.stringToDateInstance(this.value) : undefined;
31327
31963
  }
31328
31964
 
31329
31965
  /**
@@ -31331,7 +31967,7 @@ class BaseInput extends AuroElement$1 {
31331
31967
  * @returns {Date|undefined}
31332
31968
  */
31333
31969
  get minObject() {
31334
- return this._minObject;
31970
+ return this.min && dateFormatter.isValidDate(this.min) ? dateFormatter.stringToDateInstance(this.min) : undefined;
31335
31971
  }
31336
31972
 
31337
31973
  /**
@@ -31339,33 +31975,63 @@ class BaseInput extends AuroElement$1 {
31339
31975
  * @returns {Date|undefined}
31340
31976
  */
31341
31977
  get maxObject() {
31342
- return this._maxObject;
31978
+ return this.max && dateFormatter.isValidDate(this.max) ? dateFormatter.stringToDateInstance(this.max) : undefined;
31979
+ }
31980
+
31981
+ get format() {
31982
+ return this._format;
31343
31983
  }
31344
31984
 
31345
31985
  /**
31346
- * Internal setter for readonly date object properties.
31347
- * @private
31348
- * @param {'valueObject'|'minObject'|'maxObject'} propertyName - Public object property name.
31349
- * @param {Date|undefined} propertyValue - Value to assign.
31350
- * @returns {void}
31986
+ * Overrides LitElement's generated accessor so we can track whether the
31987
+ * consumer explicitly set `format`. Locale-derived updates use
31988
+ * `_setFormatFromLocale` instead, which skips this flag.
31351
31989
  */
31352
- setDateObjectProperty(propertyName, propertyValue) {
31353
- const internalPropertyName = `_${propertyName}`;
31354
- const previousValue = this[internalPropertyName];
31355
-
31356
- if (previousValue === propertyValue) {
31357
- return;
31358
- }
31990
+ set format(value) {
31991
+ const oldValue = this._format;
31992
+ this._format = value ? value.toLowerCase() : value;
31993
+ this._userSetFormat = Boolean(value);
31994
+ this.requestUpdate('format', oldValue);
31995
+ }
31359
31996
 
31360
- this[internalPropertyName] = propertyValue;
31361
- this.requestUpdate(propertyName, previousValue);
31997
+ /**
31998
+ * Sets format without marking it as user-set. Used by locale auto-derive
31999
+ * so that a subsequent locale change can still update the format.
32000
+ * @private
32001
+ * @param {string} value
32002
+ */
32003
+ _setFormatFromLocale(value) {
32004
+ const oldValue = this._format;
32005
+ this._format = value ? value.toLowerCase() : value;
32006
+ this.requestUpdate('format', oldValue);
31362
32007
  }
31363
32008
 
31364
32009
  connectedCallback() {
31365
32010
  super.connectedCallback();
31366
32011
 
32012
+ // Mark for query selectors when registered under a versioned tag (e.g. inside
32013
+ // a datepicker/combobox). Must run before parent components call validate() on
32014
+ // their inner inputs — the validation framework matches via tag-or-attribute,
32015
+ // and parents trigger validation during their own updated() cycle, which can
32016
+ // precede this input's firstUpdated().
32017
+ if (this.tagName.toLowerCase() !== 'auro-input' && !this.hasAttribute('auro-input')) {
32018
+ this.setAttribute('auro-input', '');
32019
+ }
32020
+
31367
32021
  this.locale = this.domHandler.getLocale(this);
31368
32022
  notifyOnLangChange(this);
32023
+
32024
+ // Pre-compute lengthForType and date-object fields so a parent (e.g. datepicker)
32025
+ // calling our validate() synchronously during its own updated() cycle sees
32026
+ // populated values. Without this, range validation silently no-ops because
32027
+ // `max.length === lengthForType` fails when lengthForType is still undefined.
32028
+ // Rebuild util here (constructor seeded with en-US default) so configureDataForType's
32029
+ // locale-derived format lookup uses the actual locale just resolved above.
32030
+ this.util = new AuroInputUtilities({
32031
+ locale: this.locale,
32032
+ format: this.format
32033
+ });
32034
+ this.configureDataForType();
31369
32035
  }
31370
32036
 
31371
32037
  disconnectedCallback() {
@@ -31385,10 +32051,6 @@ class BaseInput extends AuroElement$1 {
31385
32051
  this.wrapperElement.addEventListener('click', this.handleClick);
31386
32052
  }
31387
32053
 
31388
- // add attribute for query selectors when auro-input is registered under a custom name
31389
- if (this.tagName.toLowerCase() !== 'auro-input') {
31390
- this.setAttribute('auro-input', true);
31391
- }
31392
32054
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
31393
32055
 
31394
32056
  // use validity message override if declared when initializing the component
@@ -31399,7 +32061,6 @@ class BaseInput extends AuroElement$1 {
31399
32061
  this.setCustomHelpTextMessage();
31400
32062
  this.configureAutoFormatting();
31401
32063
  this.configureDataForType();
31402
- this.syncDateValues();
31403
32064
  }
31404
32065
 
31405
32066
  /**
@@ -31435,6 +32096,12 @@ class BaseInput extends AuroElement$1 {
31435
32096
  return;
31436
32097
  }
31437
32098
 
32099
+ // While configureAutoFormatting is running, imask's internal updateControl
32100
+ // writes el.value to align display with the masked value. A synthetic input
32101
+ // event from that write would re-enter handleInput → processCreditCard mid-setup
32102
+ // and clobber a Lit value that was just pushed by the parent combobox.
32103
+ if (component._configuringMask) return;
32104
+
31438
32105
  // If all guard clauses are passed, dispatch the event
31439
32106
  const inputEvent = new InputEvent('input', {
31440
32107
  bubbles: true,
@@ -31451,7 +32118,7 @@ class BaseInput extends AuroElement$1 {
31451
32118
 
31452
32119
  /**
31453
32120
  * @private
31454
- * @deprecated https://dev.azure.com/itsals/E_Retain_Content/_workitems/edit/1557296
32121
+ * @deprecated See https://dev.azure.com/itsals/E_Retain_Content/_workitems/edit/1557296.
31455
32122
  * @returns {void} Sets the default help text for the input.
31456
32123
  */
31457
32124
  setCustomHelpTextMessage() {
@@ -31469,6 +32136,13 @@ class BaseInput extends AuroElement$1 {
31469
32136
 
31470
32137
  if (typeToI18n.includes(this.type)) {
31471
32138
  this.setCustomValidityForType = i18n$1(this.lang, this.type);
32139
+ // COVERAGE: this `else if` branch is unreachable in WTR. connectedCallback
32140
+ // (L682) calls configureDataForType, which at L1266-1268 assigns
32141
+ // `this.format = this.util.getDateMaskFromLocale().toLowerCase()` for any
32142
+ // type=date input whose `format` attribute is unset. That runs before
32143
+ // firstUpdated invokes setCustomHelpTextMessage, so `!this.format` is
32144
+ // always false here. Retained as a defensive fallback; the whole function
32145
+ // is @deprecated per AB#1557296 and slated for removal.
31472
32146
  } else if (!this.format && this.type === 'date') {
31473
32147
  this.setCustomValidityForType = i18n$1(this.lang, 'dateMMDDYYYY');
31474
32148
  } else if (this.dateFormatMap[this.format]) {
@@ -31485,12 +32159,10 @@ class BaseInput extends AuroElement$1 {
31485
32159
  updated(changedProperties) {
31486
32160
  super.updated(changedProperties);
31487
32161
 
31488
- // When locale changes without an explicit format override, derive format from the new locale.
31489
- // Only runs if the current format is still the previous locale's default (not user-overridden).
32162
+ // When locale changes, auto-derive format unless the consumer explicitly set one.
31490
32163
  if (changedProperties.has('locale') && !changedProperties.has('format') && this.type === 'date') {
31491
- const previousLocaleFormat = getDateFormatFromLocale(changedProperties.get('locale'));
31492
- if (!this.format || this.format.toLowerCase() === previousLocaleFormat) {
31493
- this.format = getDateFormatFromLocale(this.locale);
32164
+ if (!this._userSetFormat) {
32165
+ this._setFormatFromLocale(getDateFormatFromLocale(this.locale));
31494
32166
  }
31495
32167
  }
31496
32168
 
@@ -31530,8 +32202,6 @@ class BaseInput extends AuroElement$1 {
31530
32202
  this.configureDataForType();
31531
32203
  }
31532
32204
 
31533
- this.syncDateValues(changedProperties);
31534
-
31535
32205
  if (changedProperties.has('value')) {
31536
32206
  if (this.value && this.value.length > 0) {
31537
32207
  this.hasValue = true;
@@ -31553,7 +32223,16 @@ class BaseInput extends AuroElement$1 {
31553
32223
 
31554
32224
  if (formattedValue !== this.inputElement.value) {
31555
32225
  this.skipNextProgrammaticInputEvent = true;
31556
- if (formattedValue) {
32226
+ if (this.maskInstance && this.type !== 'date') {
32227
+ // Route through the mask so its _value and el.value stay in lock-step
32228
+ // (set value calls updateControl which writes el.value = displayValue).
32229
+ // Writing el.value directly leaves the mask thinking displayValue is
32230
+ // stale; _saveSelection on the next focus/click then warns. Date is
32231
+ // excluded because its formattedValue can be raw ISO when the calendar
32232
+ // is invalid, and re-masking through mm/dd/yyyy would truncate it and
32233
+ // flip validity from patternMismatch to tooShort.
32234
+ this.maskInstance.value = formattedValue || '';
32235
+ } else if (formattedValue) {
31557
32236
  this.inputElement.value = formattedValue;
31558
32237
  } else {
31559
32238
  this.inputElement.value = '';
@@ -31593,127 +32272,85 @@ class BaseInput extends AuroElement$1 {
31593
32272
  }));
31594
32273
  }
31595
32274
 
31596
-
31597
- /**
31598
- * Synchronizes the ISO string values and Date object representations for date-related properties.
31599
- * This keeps the model and display values aligned when either side changes.
31600
- *
31601
- * When a full date format is in use, this method updates `value`, `min`, and `max` from their corresponding
31602
- * Date objects or vice versa, based on which properties have changed. It only runs when the current configuration
31603
- * represents a full year/month/day date format.
31604
- *
31605
- * @param {Map<string, unknown>|undefined} [changedProperties=undefined] - Optional map of changed properties used to limit which values are synchronized.
31606
- * @returns {void}
31607
- * @private
31608
- */
31609
- syncDateValues(changedProperties = undefined) {
31610
- if (!this.util.isFullDateFormat(this.type, this.format)) {
31611
- return;
31612
- }
31613
-
31614
- this.syncSingleDateValue(changedProperties, 'valueObject', 'value');
31615
- this.syncSingleDateValue(changedProperties, 'minObject', 'min');
31616
- this.syncSingleDateValue(changedProperties, 'maxObject', 'max');
31617
- }
31618
-
31619
- /**
31620
- * Synchronizes one date object/string property pair.
31621
- * @private
31622
- * @param {Map<string, unknown>|undefined} changedProperties - Map of changed properties from Lit.
31623
- * @param {string} objectProperty - Date object property name.
31624
- * @param {string} valueProperty - ISO string property name.
31625
- * @returns {void}
31626
- */
31627
- syncSingleDateValue(changedProperties, objectProperty, valueProperty) {
31628
- const objectPropertyChanged = !changedProperties || changedProperties.has(objectProperty);
31629
-
31630
- // objectProperty wins over valueProperty when both changed
31631
- if (objectPropertyChanged && this[objectProperty]) {
31632
- this[valueProperty] = dateFormatter.toISOFormatString(this[objectProperty]);
31633
- return;
31634
- }
31635
-
31636
- const valuePropertyChanged = !changedProperties || changedProperties.has(valueProperty);
31637
- if (!valuePropertyChanged) {
31638
- return;
31639
- }
31640
-
31641
- // when value is newly set to the same ISO string that corresponds to the existing Date object, do not clear the Date object (avoid unnecessary updates)
31642
- if (
31643
- changedProperties &&
31644
- valueProperty === 'value' &&
31645
- changedProperties.get('value') === undefined &&
31646
- this[objectProperty] instanceof Date &&
31647
- this[valueProperty] === dateFormatter.toISOFormatString(this[objectProperty])
31648
- ) {
31649
- return;
31650
- }
31651
-
31652
- if (dateFormatter.isValidDate(this[valueProperty])) {
31653
- this.setDateObjectProperty(objectProperty, dateFormatter.stringToDateInstance(this[valueProperty]));
31654
- } else {
31655
- this.setDateObjectProperty(objectProperty, undefined);
31656
- }
31657
- }
31658
-
31659
32275
  /**
31660
32276
  * Sets up IMasks and logic based on auto-formatting requirements.
31661
32277
  * @private
31662
32278
  * @returns {void}
31663
32279
  */
31664
32280
  configureAutoFormatting() {
31665
- if (this.maskInstance) {
31666
- this.maskInstance.destroy();
31667
- }
32281
+ // _configuringMask gates two things: external re-entry into this method
32282
+ // while setup is mid-flight (from property changes that call back here),
32283
+ // and the accept/complete listeners below — both need to ignore the mask
32284
+ // events fired by our own value-restore step.
32285
+ if (this._configuringMask) return;
32286
+ this._configuringMask = true;
32287
+ try {
32288
+ // Destroy any prior mask so IMask can attach fresh under the new format.
32289
+ // Null the reference too — if the new maskOptions.mask is falsy (e.g.
32290
+ // type switched from credit-card to text) the IMask() reassignment
32291
+ // below is skipped, and downstream writes at line ~823 would otherwise
32292
+ // route through the destroyed instance.
32293
+ if (this.maskInstance) {
32294
+ this.maskInstance.destroy();
32295
+ this.maskInstance = null;
32296
+ }
31668
32297
 
31669
- // Pass new format to util
31670
- this.util.updateFormat(this.format);
32298
+ this.util.updateFormat(this.format);
31671
32299
 
31672
- const maskOptions = this.util.getMaskOptions(this.type, this.format);
32300
+ const maskOptions = this.util.getMaskOptions(this.type, this.format);
31673
32301
 
31674
- if (this.inputElement && maskOptions.mask) {
32302
+ if (this.inputElement && maskOptions.mask) {
32303
+ // Capture the current display so it can be re-applied after IMask
32304
+ // attaches. The restore at the bottom goes through maskInstance.value
32305
+ // (not inputElement.value directly) so the mask's internal state and
32306
+ // the input's displayed text stay in lock-step.
32307
+ let existingValue = this.inputElement.value;
31675
32308
 
31676
- // Stash and clear any existing value before IMask init.
31677
- // IMask's constructor processes the current input value which requires
31678
- // selection state clearing first avoids that scenario entirely.
31679
- // When the format changes (e.g. locale switch) and we have a valid ISO
31680
- // model value, compute the display string for the NEW format instead of
31681
- // re-using the old display string, which may be invalid in the new mask.
31682
- let existingValue = this.inputElement.value;
31683
- if (
31684
- this.util.isFullDateFormat(this.type, this.format) &&
31685
- this.value &&
31686
- dateFormatter.isValidDate(this.value) &&
31687
- this.valueObject instanceof Date &&
31688
- !Number.isNaN(this.valueObject.getTime()) &&
31689
- typeof maskOptions.format === 'function'
31690
- ) {
31691
- existingValue = maskOptions.format(this.valueObject);
31692
- }
32309
+ // Format-change case (e.g. locale switch): existingValue is the OLD
32310
+ // mask's display string and may not parse under the new mask. When
32311
+ // we have a valid date model, rebuild the display from valueObject
32312
+ // (the canonical source) using the new mask's format function.
32313
+ if (
32314
+ this.util.isFullDateFormat(this.type, this.format) &&
32315
+ this.value &&
32316
+ this.valueObject &&
32317
+ typeof maskOptions.format === 'function'
32318
+ ) {
32319
+ existingValue = maskOptions.format(this.valueObject);
32320
+ }
32321
+
32322
+ // Clear before IMask attaches so the constructor seeds an empty
32323
+ // internal value. Otherwise IMask reads the stale unmasked string
32324
+ // and emits a spurious 'accept' before the restore below runs.
32325
+ this.skipNextProgrammaticInputEvent = true;
32326
+ this.inputElement.value = '';
31693
32327
 
31694
- this.skipNextProgrammaticInputEvent = true;
31695
- this.inputElement.value = '';
32328
+ this.maskInstance = IMask(this.inputElement, maskOptions);
31696
32329
 
31697
- this.maskInstance = IMask(this.inputElement, maskOptions);
32330
+ // Mask fires 'accept' on every value change, including the restore
32331
+ // step below. Skip events fired during configureAutoFormatting so
32332
+ // we don't overwrite a value the parent just pushed.
32333
+ this.maskInstance.on('accept', () => {
32334
+ if (this._configuringMask) return;
32335
+ this.value = this.util.toModelValue(this.maskInstance.value, this.format);
32336
+ });
31698
32337
 
31699
- this.maskInstance.on('accept', () => {
31700
- this.value = this.util.toModelValue(this.maskInstance.value, this.format);
31701
- if (this.type === "date") {
31702
- this._rawMaskValue = this.maskInstance.value;
31703
- }
31704
- });
32338
+ // Mask fires 'complete' on the restore step below for any value that
32339
+ // happens to be a complete match. Same setup-suppression as 'accept'.
32340
+ this.maskInstance.on('complete', () => {
32341
+ if (this._configuringMask) return;
32342
+ this.value = this.util.toModelValue(this.maskInstance.value, this.format);
32343
+ });
31705
32344
 
31706
- this.maskInstance.on('complete', () => {
31707
- this.value = this.util.toModelValue(this.maskInstance.value, this.format);
31708
- if (this.type === "date") {
31709
- this._rawMaskValue = this.maskInstance.value;
32345
+ // Write existingValue through the mask (not the input directly) so
32346
+ // the mask reformats it under the new rules and keeps its internal
32347
+ // _value aligned with the input's displayed text.
32348
+ if (existingValue) {
32349
+ this.maskInstance.value = existingValue;
31710
32350
  }
31711
- });
31712
-
31713
- // Restore the stashed value through IMask so it's properly masked
31714
- if (existingValue) {
31715
- this.maskInstance.value = existingValue;
31716
32351
  }
32352
+ } finally {
32353
+ this._configuringMask = false;
31717
32354
  }
31718
32355
  }
31719
32356
 
@@ -31723,14 +32360,17 @@ class BaseInput extends AuroElement$1 {
31723
32360
  * @returns {void}
31724
32361
  */
31725
32362
  notifyValueChanged() {
31726
- let inputEvent = null;
31727
-
31728
- inputEvent = new Event('input', {
32363
+ // This echoes Lit's reactive value update (and handleClickClear's
32364
+ // programmatic clear) — it is NOT a fresh user-input event. Mark it
32365
+ // `isProgrammatic` so consumers (e.g. auro-combobox) can distinguish
32366
+ // it from genuine user typing and skip clobbering their own
32367
+ // programmatic state during init-time renders.
32368
+ const inputEvent = new Event('input', {
31729
32369
  bubbles: true,
31730
32370
  composed: true,
31731
32371
  });
32372
+ inputEvent.isProgrammatic = true;
31732
32373
 
31733
- // Dispatched event to alert outside shadow DOM context of event firing.
31734
32374
  this.dispatchEvent(inputEvent);
31735
32375
  }
31736
32376
 
@@ -31787,6 +32427,38 @@ class BaseInput extends AuroElement$1 {
31787
32427
  this.touched = true;
31788
32428
  this.validation.validate(this);
31789
32429
  }
32430
+
32431
+ // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
32432
+ // update that can re-render the input and reset the native cursor; we
32433
+ // capture the caret position before that update commits and restore it
32434
+ // via `setSelectionRange` once the update has flushed. Gated on
32435
+ // `setSelectionInputTypes` so credit-card (and other masked types whose
32436
+ // formatter manages the cursor itself) doesn't get a competing write.
32437
+ // Capture the caret position INSIDE the gate — reading `selectionStart`
32438
+ // on input types that don't support text selection (number, email in
32439
+ // some browsers) throws InvalidStateError, which would crash all input
32440
+ // handling. Wrap the read in try/catch belt-and-suspenders even though
32441
+ // the gated types currently support it, since the list is a public
32442
+ // property a consumer could mutate.
32443
+ if (this.setSelectionInputTypes.includes(this.type)) {
32444
+ let selectionStart = null;
32445
+ try {
32446
+ ({ selectionStart } = this.inputElement);
32447
+ } catch {
32448
+ return;
32449
+ }
32450
+ if (typeof selectionStart !== 'number') {
32451
+ return;
32452
+ }
32453
+ this.updateComplete.then(() => {
32454
+ try {
32455
+ this.inputElement.setSelectionRange(selectionStart, selectionStart);
32456
+ } catch {
32457
+ // Some input types (number/email in certain UAs) throw on
32458
+ // setSelectionRange; swallow and let the native cursor stand.
32459
+ }
32460
+ });
32461
+ }
31790
32462
  }
31791
32463
 
31792
32464
  /**
@@ -31875,7 +32547,6 @@ class BaseInput extends AuroElement$1 {
31875
32547
  */
31876
32548
  reset() {
31877
32549
  this.value = undefined;
31878
- this.setDateObjectProperty('valueObject', undefined);
31879
32550
  this.validation.reset(this);
31880
32551
  }
31881
32552
 
@@ -31884,7 +32555,6 @@ class BaseInput extends AuroElement$1 {
31884
32555
  */
31885
32556
  clear() {
31886
32557
  this.value = undefined;
31887
- this.setDateObjectProperty('valueObject', undefined);
31888
32558
  }
31889
32559
 
31890
32560
  /**
@@ -31909,8 +32579,7 @@ class BaseInput extends AuroElement$1 {
31909
32579
 
31910
32580
  // Set default date format if type=date and no format is defined
31911
32581
  if (this.type === "date" && !this.format) {
31912
- // Use locale to determine default date format
31913
- this.format = this.util.getDateMaskFromLocale().toLowerCase();
32582
+ this._setFormatFromLocale(this.util.getDateMaskFromLocale().toLowerCase());
31914
32583
  this.util.updateFormat(this.format);
31915
32584
  }
31916
32585
  }
@@ -31922,7 +32591,7 @@ class BaseInput extends AuroElement$1 {
31922
32591
  */
31923
32592
  get placeholderStr() {
31924
32593
  if (!this.placeholder && this.type === 'date') {
31925
- return this.format ? this.format.toUpperCase() : 'MM/DD/YYYY';
32594
+ return this.format.toUpperCase();
31926
32595
  }
31927
32596
  return this.placeholder || "";
31928
32597
  }
@@ -31939,7 +32608,7 @@ class BaseInput extends AuroElement$1 {
31939
32608
  const creditCard = this.matchInputValueToCreditCard();
31940
32609
  const previousFormat = this.format;
31941
32610
 
31942
- this.format = creditCard.maskFormat;
32611
+ this._setFormatFromLocale(creditCard.maskFormat);
31943
32612
 
31944
32613
  this.maxLength = creditCard.formatLength;
31945
32614
  this.minLength = creditCard.formatMinLength;
@@ -31959,7 +32628,7 @@ class BaseInput extends AuroElement$1 {
31959
32628
  /**
31960
32629
  * Function to support credit-card feature type.
31961
32630
  * @private
31962
- * @deprecated https://dev.azure.com/itsals/E_Retain_Content/_workitems/edit/1557296
32631
+ * @deprecated See https://dev.azure.com/itsals/E_Retain_Content/_workitems/edit/1557296.
31963
32632
  * @returns {object} JSON with data for credit card formatting.
31964
32633
  */
31965
32634
  matchInputValueToCreditCard() {
@@ -32000,10 +32669,10 @@ class BaseInput extends AuroElement$1 {
32000
32669
  },
32001
32670
  {
32002
32671
  name: 'Diners club',
32003
- regex: /^(?<num>36|38)\d{0}/u,
32672
+ regex: /^(?<num>30[0-5]|36|38)\d{0}/u,
32004
32673
  formatLength: 16,
32005
32674
  errorMessage: CreditCardValidationMessage,
32006
- cardIcon: 'credit-card',
32675
+ cardIcon: 'cc-dinersclub',
32007
32676
  maskFormat: "0000 000000 0000"
32008
32677
  },
32009
32678
  {
@@ -32413,7 +33082,7 @@ let AuroHelpText$1 = class AuroHelpText extends LitElement {
32413
33082
  }
32414
33083
  };
32415
33084
 
32416
- var formkitVersion = '202606191810';
33085
+ var formkitVersion = '202607221815';
32417
33086
 
32418
33087
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
32419
33088
  // See LICENSE in the project root for license information.
@@ -32699,20 +33368,50 @@ class AuroInput extends BaseInput {
32699
33368
  * @returns {void}
32700
33369
  */
32701
33370
  checkDisplayValueSlotChange() {
32702
- let nodes = this.shadowRoot.querySelector('slot[name="displayValue"]').assignedNodes();
32703
-
32704
- // Handle when DisplayValue is multi-level slot content (e.g. combobox passing displayValue to input)
32705
- if (nodes && nodes[0] && nodes[0].tagName === 'SLOT') {
32706
- nodes = nodes[0].assignedNodes();
33371
+ const slot = this.shadowRoot?.querySelector('slot[name="displayValue"]');
33372
+ if (!slot) {
33373
+ // Shadow slot not yet rendered fall back to checking light-DOM
33374
+ // children so hasDisplayValueContent isn't stuck false when called
33375
+ // before firstUpdated (e.g. from auro-combobox during mount).
33376
+ // Check for any element (including custom elements like <auro-icon>
33377
+ // that render via shadow DOM with no text content).
33378
+ const lightDomNodes = Array.from(this.querySelectorAll('[slot="displayValue"]:not(slot)'));
33379
+ const hasContent = lightDomNodes.some((node) => (
33380
+ node.textContent.trim().length > 0 ||
33381
+ node.children.length > 0 ||
33382
+ node.shadowRoot !== null
33383
+ ));
33384
+ if (this.hasDisplayValueContent !== hasContent) {
33385
+ this.hasDisplayValueContent = hasContent;
33386
+ this.requestUpdate();
33387
+ }
33388
+ return;
32707
33389
  }
32708
-
32709
- let hasContent = false;
32710
-
32711
- if (nodes.length > 0) {
32712
- hasContent = true;
33390
+ const nodes = slot.assignedNodes({ flatten: true });
33391
+
33392
+ // Check for actual visible content, not just node existence.
33393
+ // An empty <span slot="displayValue"></span> forwarded from the
33394
+ // consumer should not be treated as "has content" — it causes the
33395
+ // displayValue wrapper to render (with hasContent class) but show
33396
+ // nothing, blocking the combobox's synthetic displayValue from
33397
+ // being visible on preset/deeplink load.
33398
+ // Custom elements (e.g. <auro-icon>) that render via shadow DOM are
33399
+ // treated as content even when they have no text or light-DOM children.
33400
+ const hasContent = nodes.some((node) => {
33401
+ if (node.nodeType === Node.TEXT_NODE) {
33402
+ return node.textContent.trim().length > 0;
33403
+ }
33404
+ if (node.nodeType === Node.ELEMENT_NODE) {
33405
+ return node.textContent.trim().length > 0 ||
33406
+ node.children.length > 0 ||
33407
+ node.shadowRoot !== null;
33408
+ }
33409
+ return false;
33410
+ });
33411
+ if (this.hasDisplayValueContent !== hasContent) {
33412
+ this.hasDisplayValueContent = hasContent;
33413
+ this.requestUpdate();
32713
33414
  }
32714
-
32715
- this.hasDisplayValueContent = hasContent;
32716
33415
  }
32717
33416
 
32718
33417
  firstUpdated() {
@@ -32736,7 +33435,7 @@ class AuroInput extends BaseInput {
32736
33435
  /**
32737
33436
  * Determines default help text string.
32738
33437
  * @private
32739
- * @deprecated https://dev.azure.com/itsals/E_Retain_Content/_workitems/edit/1557296
33438
+ * @deprecated See https://dev.azure.com/itsals/E_Retain_Content/_workitems/edit/1557296.
32740
33439
  * @returns {string} Evaluates pre-determined help text.
32741
33440
  */
32742
33441
  getHelpText() {
@@ -32916,6 +33615,7 @@ class AuroInput extends BaseInput {
32916
33615
  <${this.buttonTag}
32917
33616
  @click="${this.handleClickShowPassword}"
32918
33617
  appearance="${this.onDark ? 'inverse' : this.appearance}"
33618
+ aria-pressed="${this.showPassword ? 'true' : 'false'}"
32919
33619
  class="notificationBtn passwordBtn"
32920
33620
  shape="circle"
32921
33621
  size="sm"
@@ -32989,25 +33689,29 @@ class AuroInput extends BaseInput {
32989
33689
  * @returns {html} - Returns HTML for the help text and error message.
32990
33690
  */
32991
33691
  renderHtmlHelpText() {
33692
+ // Single `<p>` with stable identity across validity transitions —
33693
+ // previously two distinct templates (valid vs invalid) caused Lit to
33694
+ // replace the node entirely on a flip, and VoiceOver wouldn't
33695
+ // re-announce because the live-region element it was watching had been
33696
+ // removed and a new one inserted. Keeping one node means the `role`,
33697
+ // `aria-live`, and text content all change in-place, which AT does
33698
+ // observe and announce.
33699
+ const isError = this.validity && this.validity !== 'valid';
32992
33700
  return html$1`
32993
- ${!this.validity || this.validity === undefined || this.validity === 'valid'
32994
- ? html$1`
32995
- <${this.helpTextTag}
32996
- appearance="${this.onDark ? 'inverse' : this.appearance}">
32997
- <p id="${this.uniqueId}" part="helpText">
32998
- <slot name="helpText">${this.getHelpText()}</slot>
32999
- </p>
33000
- </${this.helpTextTag}>
33001
- `
33002
- : html$1`
33003
- <${this.helpTextTag} error
33004
- appearance="${this.onDark ? 'inverse' : this.appearance}">
33005
- <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
33006
- ${this.errorMessage}
33007
- </p>
33008
- </${this.helpTextTag}>
33009
- `
33010
- }
33701
+ <${this.helpTextTag}
33702
+ appearance="${this.onDark ? 'inverse' : this.appearance}"
33703
+ ?error=${isError}>
33704
+ <p
33705
+ id="${this.uniqueId}"
33706
+ part="helpText"
33707
+ role="${ifDefined(isError ? 'alert' : undefined)}"
33708
+ aria-live="${ifDefined(isError ? 'assertive' : undefined)}">
33709
+ ${isError
33710
+ ? this.errorMessage
33711
+ : html$1`<slot name="helpText">${this.getHelpText()}</slot>`
33712
+ }
33713
+ </p>
33714
+ </${this.helpTextTag}>
33011
33715
  `;
33012
33716
  }
33013
33717
 
@@ -33154,6 +33858,15 @@ function formatISODate(isoStr, format) {
33154
33858
  try {
33155
33859
  const date = dateFormatter.stringToDateInstance(isoStr);
33156
33860
 
33861
+ // `stringToDateInstance` returns an `Invalid Date` for malformed strings
33862
+ // and `null` for non-string input — it does NOT throw. Without this
33863
+ // guard, `getFullYear()`/`getMonth()`/`getDate()` on an Invalid Date
33864
+ // yield `NaN`, and `String(NaN).padStart(4, '0')` produces literals
33865
+ // like "0NaN/0NaN/0NaN" instead of `undefined`.
33866
+ if (!(date instanceof Date) || Number.isNaN(date.getTime())) {
33867
+ return undefined;
33868
+ }
33869
+
33157
33870
  const year = String(date.getFullYear()).padStart(4, '0');
33158
33871
  const month = String(date.getMonth() + 1).padStart(2, '0');
33159
33872
  const day = String(date.getDate()).padStart(2, '0');
@@ -33164,7 +33877,10 @@ function formatISODate(isoStr, format) {
33164
33877
  replace(/mm/iu, month).
33165
33878
  replace(/dd/iu, day);
33166
33879
  } catch (err) {
33167
- // If the input string is not a valid date, return undefined
33880
+ // Defensive: the Date-returning path is guarded above, but `parseDate`
33881
+ // (inside `stringToDateInstance`) could throw on pathological input
33882
+ // future-library-versions might introduce. Treat any thrown error as
33883
+ // "not a valid date" and return undefined.
33168
33884
  return undefined;
33169
33885
  }
33170
33886
  }
@@ -33776,6 +34492,15 @@ const datepickerKeyboardStrategy = {
33776
34492
  evt.stopPropagation();
33777
34493
  evt.preventDefault();
33778
34494
 
34495
+ // Signal to the visibility-change handler in auro-datepicker.js that
34496
+ // focus should be restored to the trigger regardless of hasFocus.
34497
+ // hidePopover() (desktop non-modal path) does not auto-restore focus,
34498
+ // and hiding the grid's popover ancestor drops focus to <body>. That
34499
+ // synchronously fires focusout on the datepicker host — clearing
34500
+ // hasFocus — before updated() runs, which would otherwise skip the
34501
+ // input refocus. Native <dialog>.close() (modal path) restores focus
34502
+ // itself, but the flag is harmless there.
34503
+ component._restoreFocusOnClose = true;
33779
34504
  component.hideBib();
33780
34505
  },
33781
34506
 
@@ -33836,6 +34561,8 @@ const datepickerKeyboardStrategy = {
33836
34561
  * @slot label - Defines the label content for the entire datepicker when `layout="snowflake"`.
33837
34562
  * @slot toLabel - Defines the label content for the second input when the `range` attribute is used.
33838
34563
  * @slot fromLabel - Defines the label content for the first input.
34564
+ * @slot optionalFromLabel - Overrides the "(optional)" text rendered next to the first input's label when the datepicker is not `required`.
34565
+ * @slot optionalToLabel - Overrides the "(optional)" text rendered next to the second input's label when `range` is set and the datepicker is not `required`.
33839
34566
  * @slot date_YYYY_MM_DD - Defines the content to display in the auro-calendar-cell for the specified date. The content text is colored using the success state token when the `highlight` attribute is applied to the slot.
33840
34567
  * @slot popover_YYYY_MM_DD - Defines the content to display in the auro-calendar-cell popover for the specified date.
33841
34568
  * @csspart dropdown - Use for customizing the style of the dropdown.
@@ -33891,6 +34618,7 @@ class AuroDatePicker extends AuroElement {
33891
34618
  this.rangeLabelBeforeRange = 'before range';
33892
34619
  this.rangeLabelInRange = 'in range';
33893
34620
  this.rangeLabelAfterRange = 'after range';
34621
+ this.rangeLabelEndPreview = 'previewing range end';
33894
34622
  this.blackoutDates = [];
33895
34623
  this.blackoutLabel = 'unavailable';
33896
34624
  this.navLabelPrevMonth = 'Previous month';
@@ -33990,6 +34718,22 @@ class AuroDatePicker extends AuroElement {
33990
34718
  */
33991
34719
  this.handleClick = this.handleClick.bind(this);
33992
34720
 
34721
+ /**
34722
+ * Single AbortController shared by every listener registered in the
34723
+ * configure* methods. Lets disconnectedCallback tear all of them down
34724
+ * with one abort() call.
34725
+ *
34726
+ * The genuine leak risk is the listeners attached to children that can
34727
+ * outlive the host if they get reparented — `this.dropdown`,
34728
+ * `this.calendar`, and the inputs inside the dropdown's slot.
34729
+ * Listeners attached to `this` (e.g. focusin/focusout on the host)
34730
+ * form a self-contained reference graph that the GC can collect with
34731
+ * the host anyway, but they share the same signal so the cleanup
34732
+ * pattern stays uniform across all configure* sites.
34733
+ * @private
34734
+ */
34735
+ this._listenerAbortController = new AbortController();
34736
+
33993
34737
  /**
33994
34738
  * @private
33995
34739
  */
@@ -34030,6 +34774,14 @@ class AuroDatePicker extends AuroElement {
34030
34774
 
34031
34775
  /**
34032
34776
  * Array of dates that cannot be selected. Dates should be in ISO format (YYYY-MM-DD).
34777
+ *
34778
+ * **Immutable update required.** The datepicker treats this array as
34779
+ * immutable and memoizes a lookup Set keyed on the array's reference
34780
+ * identity — matching Lit's own reactivity semantics for array
34781
+ * properties. In-place mutations (`blackoutDates.push(...)`,
34782
+ * `blackoutDates[i] = ...`, `blackoutDates.splice(...)`) will not
34783
+ * invalidate the cache and the new entries will be silently ignored.
34784
+ * To update, reassign the property: `el.blackoutDates = [...el.blackoutDates, '2024-12-25']`.
34033
34785
  */
34034
34786
  blackoutDates: {
34035
34787
  type: Array,
@@ -34038,6 +34790,7 @@ class AuroDatePicker extends AuroElement {
34038
34790
 
34039
34791
  /**
34040
34792
  * Label announced for blackout (disabled but in-range) date cells.
34793
+ * @default 'unavailable'
34041
34794
  */
34042
34795
  blackoutLabel: {
34043
34796
  type: String,
@@ -34054,6 +34807,7 @@ class AuroDatePicker extends AuroElement {
34054
34807
 
34055
34808
  /**
34056
34809
  * Accessible label for the calendar grid containing the days of the month.
34810
+ * @default 'Calendar days of the month'
34057
34811
  */
34058
34812
  calendarGridLabel: {
34059
34813
  type: String,
@@ -34216,6 +34970,7 @@ class AuroDatePicker extends AuroElement {
34216
34970
 
34217
34971
  /**
34218
34972
  * Accessible label for the next month navigation button.
34973
+ * @default 'Next month'
34219
34974
  */
34220
34975
  navLabelNextMonth: {
34221
34976
  type: String,
@@ -34224,6 +34979,7 @@ class AuroDatePicker extends AuroElement {
34224
34979
 
34225
34980
  /**
34226
34981
  * Accessible label for the previous month navigation button.
34982
+ * @default 'Previous month'
34227
34983
  */
34228
34984
  navLabelPrevMonth: {
34229
34985
  type: String,
@@ -34301,7 +35057,11 @@ class AuroDatePicker extends AuroElement {
34301
35057
  },
34302
35058
 
34303
35059
  /**
34304
- * Label announced for cells after the range (or after start when no end is selected).
35060
+ * Label announced for cells after a fully selected range (both
35061
+ * `dateFrom` and `dateTo` are set). While a range is still being
35062
+ * picked (`dateFrom` set, `dateTo` unset), focused cells past the
35063
+ * start use `rangeLabelEndPreview` instead.
35064
+ * @default 'after range'
34305
35065
  */
34306
35066
  rangeLabelAfterRange: {
34307
35067
  type: String,
@@ -34310,6 +35070,7 @@ class AuroDatePicker extends AuroElement {
34310
35070
 
34311
35071
  /**
34312
35072
  * Label announced for cells before the range start.
35073
+ * @default 'before range'
34313
35074
  */
34314
35075
  rangeLabelBeforeRange: {
34315
35076
  type: String,
@@ -34318,14 +35079,27 @@ class AuroDatePicker extends AuroElement {
34318
35079
 
34319
35080
  /**
34320
35081
  * Label announced for the range end date cell.
35082
+ * @default 'range end'
34321
35083
  */
34322
35084
  rangeLabelEnd: {
34323
35085
  type: String,
34324
35086
  reflect: true
34325
35087
  },
34326
35088
 
35089
+ /**
35090
+ * Label announced for the focused cell while previewing a range end
35091
+ * (dateFrom set, dateTo not yet selected). Tells AT users that
35092
+ * pressing Enter would commit this cell as the range end.
35093
+ * @default 'previewing range end'
35094
+ */
35095
+ rangeLabelEndPreview: {
35096
+ type: String,
35097
+ reflect: true
35098
+ },
35099
+
34327
35100
  /**
34328
35101
  * Label announced for cells within the selected range.
35102
+ * @default 'in range'
34329
35103
  */
34330
35104
  rangeLabelInRange: {
34331
35105
  type: String,
@@ -34334,6 +35108,7 @@ class AuroDatePicker extends AuroElement {
34334
35108
 
34335
35109
  /**
34336
35110
  * Label announced for the range start date cell.
35111
+ * @default 'range start'
34337
35112
  */
34338
35113
  rangeLabelStart: {
34339
35114
  type: String,
@@ -34341,7 +35116,7 @@ class AuroDatePicker extends AuroElement {
34341
35116
  },
34342
35117
 
34343
35118
  /**
34344
- * Dates that the user should have for reference as part of their decision making when selecting a date.
35119
+ * Dates that the user should have for reference as part of their decision-making when selecting a date.
34345
35120
  * This should be a JSON string array of ISO date strings (`YYYY-MM-DD`).
34346
35121
  */
34347
35122
  referenceDates: {
@@ -34698,10 +35473,26 @@ class AuroDatePicker extends AuroElement {
34698
35473
  // ─── Vendor calendar time conversions ─────────────────────────────────────
34699
35474
 
34700
35475
  /**
34701
- * Converts a Unix timestamp (seconds) from the vendor calendar to an ISO date string.
35476
+ * Converts a Unix timestamp (seconds) from the vendored range-datepicker
35477
+ * (`src/vendor/wc-range-datepicker/day.js`) to an ISO date string.
35478
+ *
35479
+ * Timezone contract:
35480
+ * - INPUT: `time` is assumed to be the seconds-since-epoch of **local
35481
+ * midnight** for the intended calendar day. The vendor's Day constructor
35482
+ * builds it via `date-fns format(date, 't')` from a locally-constructed
35483
+ * Date, so this assumption currently holds end-to-end.
35484
+ * - OUTPUT: `dateFormatter.toISOFormatString` reads the Date's local
35485
+ * getFullYear/getMonth/getDate components, so the returned YYYY-MM-DD
35486
+ * string matches the local calendar day.
35487
+ *
35488
+ * If the vendor ever switches to emitting UTC-midnight timestamps, this
35489
+ * conversion will silently shift the returned date by one day in zones
35490
+ * west of UTC. Any vendor swap should re-verify this contract; the TZ
35491
+ * regression suite (`npm run test:hst`, UTC-10) will catch the symptom.
35492
+ *
34702
35493
  * @private
34703
- * @param {number} time - Unix timestamp in seconds.
34704
- * @returns {string} ISO date string (yyyy-mm-dd).
35494
+ * @param {number} time - Unix timestamp (seconds), local midnight of the day.
35495
+ * @returns {string} ISO date string (yyyy-mm-dd) reflecting the local calendar day.
34705
35496
  */
34706
35497
  convertWcTimeToDate(time) {
34707
35498
  return dateFormatter$1.toISOFormatString(new Date(time * 1000));
@@ -34803,8 +35594,8 @@ class AuroDatePicker extends AuroElement {
34803
35594
  }
34804
35595
  }
34805
35596
 
34806
- // Focus the calendar grid wrapper (aria-activedescendant handles
34807
- // the SR announcement for the active cell).
35597
+ // Focus the calendar grid wrapper. The live region (announced just
35598
+ // below) handles the SR announcement for the active cell.
34808
35599
  if (activeCell) {
34809
35600
  this.calendar.focusActiveCell();
34810
35601
 
@@ -34818,11 +35609,14 @@ class AuroDatePicker extends AuroElement {
34818
35609
  this.calendar.announceSelection(announcement);
34819
35610
  }, 500);
34820
35611
 
34821
- // On mobile fullscreen, scroll the month list so the active cell's
34822
- // month is visible. Without this, the list stays scrolled to the
34823
- // calendarStartDate month which may be far from the active cell.
34824
- if (this.dropdown.isBibFullscreen) {
35612
+ // On mobile fullscreen or when an explicit focusDate change has
35613
+ // requested a forced scroll on the next render scroll the active
35614
+ // cell into view. Doing this here (after activeCellDate has been
35615
+ // resolved by the rAF loop above) prevents a no-op scroll that
35616
+ // would happen if we tried to scroll before the cell was set.
35617
+ if (this.dropdown.isBibFullscreen || this.forceScrollOnNextMobileCalendarRender) {
34825
35618
  this.calendar.scrollToActiveCell();
35619
+ this.forceScrollOnNextMobileCalendarRender = false;
34826
35620
  }
34827
35621
  } else if (attempts < MAX_ATTEMPTS) {
34828
35622
  requestAnimationFrame(tryFocus);
@@ -34854,11 +35648,13 @@ class AuroDatePicker extends AuroElement {
34854
35648
  this.dropdown.bibDialogLabel = labelElement.textContent.trim() || undefined;
34855
35649
  }
34856
35650
 
35651
+ const { signal } = this._listenerAbortController;
35652
+
34857
35653
  this.dropdown.addEventListener('auroDropdown-triggerClick', () => {
34858
35654
  if (!this.isPopoverVisible) {
34859
35655
  this.dropdown.show();
34860
35656
  }
34861
- });
35657
+ }, { signal });
34862
35658
 
34863
35659
  this.dropdown.addEventListener('auroDropdown-toggled', () => {
34864
35660
  this.notifyDatepickerToggled();
@@ -34870,13 +35666,17 @@ class AuroDatePicker extends AuroElement {
34870
35666
  // what centralDate renders, causing all cells to have tabindex="-1".
34871
35667
  this.calendar.activeCellDate = null;
34872
35668
 
34873
- // Show the month containing the selected date (or today) instead of
34874
- // whichever month the user last navigated to.
34875
- // Respect consumer-provided centralDate/calendarStartDate if no value is set.
34876
- if (this.valueObject) {
34877
- this.centralDate = this.value;
35669
+ // On open, reset the visible month to a predictable source rather than
35670
+ // whichever month the user last navigated to. Route through updateCentralDate
35671
+ // so centralDate stays first-of-month.
35672
+ // Priority: calendarFocusDate (when valid) -> value (when set) -> today (when neither is set).
35673
+ // Respect consumer-provided centralDate/calendarStartDate/minDate when neither calendarFocusDate nor value is set.
35674
+ if (this.calendarFocusDate && dateFormatter$1.isValidDate(this.calendarFocusDate)) {
35675
+ this.calendarRenderUtil.updateCentralDate(this, this.calendarFocusDateObject);
35676
+ } else if (this.valueObject) {
35677
+ this.calendarRenderUtil.updateCentralDate(this, this.value);
34878
35678
  } else if (!this.centralDate && !this.calendarStartDate && !this.minDate) {
34879
- this.centralDate = new Date();
35679
+ this.calendarRenderUtil.updateCentralDate(this, new Date());
34880
35680
  }
34881
35681
  }
34882
35682
 
@@ -34934,8 +35734,15 @@ class AuroDatePicker extends AuroElement {
34934
35734
  // Always clear the inert flag. Only restore focus to the input when the datepicker
34935
35735
  // still has focus (e.g. Escape, date selected) — not when the user tabbed away,
34936
35736
  // which would pull them back and require extra Tab presses to escape.
35737
+ //
35738
+ // `_restoreFocusOnClose` is set by the Escape handler in
35739
+ // datepickerKeyboardStrategy.js to force restore even when hasFocus
35740
+ // has already been cleared — hidePopover() (desktop non-modal path)
35741
+ // can drop focus to <body> before this update fires.
34937
35742
  this.dropdown.trigger.inert = false;
34938
- if (this.hasFocus) {
35743
+ const shouldRestoreFocus = this.hasFocus || this._restoreFocusOnClose;
35744
+ this._restoreFocusOnClose = false;
35745
+ if (shouldRestoreFocus) {
34939
35746
  requestAnimationFrame(() => {
34940
35747
  if (!this.dropdown.isPopoverVisible) {
34941
35748
  this.inputList[0].focus();
@@ -34944,19 +35751,11 @@ class AuroDatePicker extends AuroElement {
34944
35751
  }
34945
35752
  }
34946
35753
 
34947
- // If on mobile, and the calendar is opened, scroll the focus date into view if the flag is set
34948
- if (this.dropdown.isPopoverVisible && this.forceScrollOnNextMobileCalendarRender) {
34949
-
34950
- // Since the calendar is not rendered until the dropdown is opened,
34951
- // and the auroDropdown-toggled event fires before the popover is actually open,
34952
- // we need to wait until the next frame to ensure the calendar is fully rendered
34953
- // and the area we're trying to scroll to is present in the DOM.
34954
- setTimeout(() => {
34955
- this.calendar.scrollMonthIntoView(this.calendarFocusDate);
34956
- this.forceScrollOnNextMobileCalendarRender = false;
34957
- }, 0);
34958
- }
34959
- });
35754
+ // Note: the forceScrollOnNextMobileCalendarRender scroll-into-view
35755
+ // happens inside focusActiveCellWhenReady() once activeCellDate has
35756
+ // been resolved by its rAF wait — not here in a setTimeout(0), which
35757
+ // fired before the active date was set and silently no-op'd.
35758
+ }, { signal });
34960
35759
 
34961
35760
  // Handle responsive strategy changes while the dropdown is open
34962
35761
  // (e.g. resizing from desktop → mobile or vice versa).
@@ -35003,7 +35802,7 @@ class AuroDatePicker extends AuroElement {
35003
35802
  });
35004
35803
  });
35005
35804
  }
35006
- });
35805
+ }, { signal });
35007
35806
  }
35008
35807
 
35009
35808
  /**
@@ -35016,6 +35815,8 @@ class AuroDatePicker extends AuroElement {
35016
35815
 
35017
35816
  this.inputList = [...this.dropdown.querySelectorAll(this.inputTag._$litStatic$)];
35018
35817
 
35818
+ const { signal } = this._listenerAbortController;
35819
+
35019
35820
  this.inputList.forEach((input, index) => {
35020
35821
  input.addEventListener('input', (event) => {
35021
35822
  event.stopPropagation();
@@ -35027,7 +35828,7 @@ class AuroDatePicker extends AuroElement {
35027
35828
  }
35028
35829
 
35029
35830
  this.notifyValueChanged();
35030
- });
35831
+ }, { signal });
35031
35832
 
35032
35833
  input.addEventListener('auroFormElement-validated', (evt) => {
35033
35834
  // not to bubble up input's validated event.
@@ -35043,7 +35844,7 @@ class AuroDatePicker extends AuroElement {
35043
35844
  this.validity = evt.detail.validity;
35044
35845
  this.errorMessage = evt.detail.message;
35045
35846
  }
35046
- });
35847
+ }, { signal });
35047
35848
  });
35048
35849
  }
35049
35850
 
@@ -35057,19 +35858,32 @@ class AuroDatePicker extends AuroElement {
35057
35858
  this.calendar.datepicker = this;
35058
35859
  this.calendar.dropdown = this.dropdown;
35059
35860
 
35861
+ const { signal } = this._listenerAbortController;
35862
+
35060
35863
  this.calendar.addEventListener('auroCalendar-dateSelected', () => {
35061
- if (this.inputList[0].value !== this.calendar.dateFrom && this.calendar.dateFrom !== undefined) {
35062
- this.inputList[0].value = this.convertWcTimeToDate(this.calendar.dateFrom);
35864
+ // Compare the input's ISO value against the *converted* calendar
35865
+ // timestamp (the vendor's `dateFrom`/`dateTo` are Unix-seconds
35866
+ // strings — comparing the input ISO directly against them would
35867
+ // never match, so the write would fire on every event and emit
35868
+ // redundant input/change activity).
35869
+ if (this.calendar.dateFrom !== undefined) {
35870
+ const fromIso = this.convertWcTimeToDate(this.calendar.dateFrom);
35871
+ if (this.inputList[0].value !== fromIso) {
35872
+ this.inputList[0].value = fromIso;
35873
+ }
35063
35874
  }
35064
35875
 
35065
- if (this.inputList[1] && this.calendar.dateTo && this.inputList[1].value !== this.calendar.dateTo) {
35066
- this.inputList[1].value = this.convertWcTimeToDate(this.calendar.dateTo);
35876
+ if (this.inputList[1] && this.calendar.dateTo) {
35877
+ const toIso = this.convertWcTimeToDate(this.calendar.dateTo);
35878
+ if (this.inputList[1].value !== toIso) {
35879
+ this.inputList[1].value = toIso;
35880
+ }
35067
35881
  }
35068
- });
35882
+ }, { signal });
35069
35883
 
35070
35884
  this.calendar.addEventListener('auroCalendar-dismissRequest', () => {
35071
35885
  this.dropdown.hide();
35072
- });
35886
+ }, { signal });
35073
35887
 
35074
35888
  this.calendar.addEventListener('auroCalendar-centralDateChanged', (event) => {
35075
35889
  const match = this.centralDateObject && this.util.datesMatch(event.detail.date, this.centralDateObject);
@@ -35079,7 +35893,7 @@ class AuroDatePicker extends AuroElement {
35079
35893
  }
35080
35894
 
35081
35895
  this.notifyMonthChanged(event);
35082
- });
35896
+ }, { signal });
35083
35897
  }
35084
35898
 
35085
35899
  /**
@@ -35088,10 +35902,17 @@ class AuroDatePicker extends AuroElement {
35088
35902
  * @returns {void}
35089
35903
  */
35090
35904
  configureDatepicker() {
35905
+ // These listeners are on `this` (the host), so they would GC with the
35906
+ // host even without the abort signal — see the leak rationale on
35907
+ // `_listenerAbortController`. The signal is still passed for uniform
35908
+ // cleanup semantics with the child-element listeners in the other
35909
+ // configure* methods.
35910
+ const { signal } = this._listenerAbortController;
35911
+
35091
35912
  this.addEventListener('focusin', () => {
35092
35913
  this.touched = true;
35093
35914
  this.hasFocus = true;
35094
- });
35915
+ }, { signal });
35095
35916
 
35096
35917
  this.addEventListener('focusout', () => {
35097
35918
  this.hasFocus = false;
@@ -35103,7 +35924,7 @@ class AuroDatePicker extends AuroElement {
35103
35924
  if (!this.matches(':focus-within')) {
35104
35925
  this.validate();
35105
35926
  }
35106
- });
35927
+ }, { signal });
35107
35928
 
35108
35929
  if (this.valueObject) {
35109
35930
  this.calendar.dateFrom = this.convertToWcValidTime(this.valueObject);
@@ -35301,6 +36122,41 @@ class AuroDatePicker extends AuroElement {
35301
36122
  return this.validity !== undefined && this.validity !== 'valid';
35302
36123
  }
35303
36124
 
36125
+ /**
36126
+ * Per-class dedup set used by `_warnInvalidLocale`. Static so the dedup
36127
+ * spans every datepicker instance on the page; lives on the class (not
36128
+ * at module scope) so it stays an encapsulated implementation detail of
36129
+ * this component and does not interfere with WCA's class-JSDoc
36130
+ * attachment.
36131
+ * @private
36132
+ */
36133
+ static _warnedInvalidLocales = new Set();
36134
+
36135
+ /**
36136
+ * Logs a one-time `console.debug` when an unsupported locale falls back to
36137
+ * en-US. Deduped by the offending tag so noisy re-renders that resurface
36138
+ * the same bad value stay quiet, but each new bad value still signals so
36139
+ * consumers can spot the typo or missing tag.
36140
+ * @private
36141
+ * @param {string|undefined} badLocale - The locale value that failed.
36142
+ * @returns {void}
36143
+ */
36144
+ _warnInvalidLocale(badLocale) {
36145
+ // Stringify without coalescing — `String(undefined)` / `String(null)`
36146
+ // surface the actual offending value in the log, instead of the
36147
+ // ambiguous `Locale ""` that `String(badLocale ?? '')` would produce.
36148
+ // Dedup still works correctly because each unique stringification
36149
+ // becomes its own Set entry.
36150
+ const key = String(badLocale);
36151
+ const seen = AuroDatePicker._warnedInvalidLocales;
36152
+ if (seen.has(key)) {
36153
+ return;
36154
+ }
36155
+ seen.add(key);
36156
+ // eslint-disable-next-line no-console
36157
+ 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".`);
36158
+ }
36159
+
35304
36160
  /**
35305
36161
  * Lifecycle method to check if the locale is valid.
35306
36162
  * @ignore
@@ -35311,10 +36167,15 @@ class AuroDatePicker extends AuroElement {
35311
36167
  if (changedProperties.has('locale')) {
35312
36168
  try {
35313
36169
  const supported = Intl.DateTimeFormat.supportedLocalesOf([this.locale], { localeMatcher: 'lookup' });
35314
- this._validLocale = supported.length > 0 ? this.locale : 'en-US';
36170
+ if (supported.length > 0) {
36171
+ this._validLocale = this.locale;
36172
+ } else {
36173
+ this._validLocale = 'en-US';
36174
+ this._warnInvalidLocale(this.locale);
36175
+ }
35315
36176
  } catch {
35316
- console.debug(`[AuroDatePicker] The locale "${this.locale}" is not valid. Falling back to "en-US".`); // eslint-disable-line no-console
35317
36177
  this._validLocale = 'en-US';
36178
+ this._warnInvalidLocale(this.locale);
35318
36179
  }
35319
36180
 
35320
36181
  const previousLocaleFormat = getDateFormatFromLocale$1(changedProperties.get('locale'));
@@ -35327,6 +36188,18 @@ class AuroDatePicker extends AuroElement {
35327
36188
  this.calendar.requestUpdate();
35328
36189
  this.dispatchEvent(new CustomEvent('auroDatePicker-newSlotContent'));
35329
36190
  }
36191
+
36192
+ // Range invariant: if a value change (from click or programmatic) has
36193
+ // moved start past end, clear valueEnd here so both properties land in
36194
+ // the SAME reactive cycle. Doing it in updated() would schedule a
36195
+ // second cycle after cellClickActive/wasCellClick has already been
36196
+ // consumed by the value branch, leaving the valueEnd branch to run
36197
+ // with a stale handshake and racing with any intervening programmatic
36198
+ // value assignments.
36199
+ if ((changedProperties.has('value') || changedProperties.has('valueEnd')) &&
36200
+ this.valueObject && this.valueEndObject && this.valueObject > this.valueEndObject) {
36201
+ this.valueEnd = undefined;
36202
+ }
35330
36203
  }
35331
36204
 
35332
36205
  updated(changedProperties) {
@@ -35341,10 +36214,6 @@ class AuroDatePicker extends AuroElement {
35341
36214
  }
35342
36215
  }
35343
36216
 
35344
- if (changedProperties.has('calendarFocusDate')) {
35345
- this.handleFocusDateChange();
35346
- }
35347
-
35348
36217
  if (changedProperties.has('calendarStartDate')) {
35349
36218
  this.calendar.setAttribute('calendarStartDate', this.calendarStartDate || '');
35350
36219
  }
@@ -35394,10 +36263,12 @@ class AuroDatePicker extends AuroElement {
35394
36263
 
35395
36264
  if (this.value && this.value.length === this.inputList[0].lengthForType && !(this.wasCellClick && this.range)) {
35396
36265
  // Skip centralDate update when user clicked a cell in range mode
35397
- // to prevent the displayed months from shifting
35398
- this.centralDate = this.value;
35399
- //TODO: TEST THIS CHANGE
35400
- // this.calendarRenderUtil.updateCentralDate(this, this.value);
36266
+ // to prevent the displayed months from shifting. Route through
36267
+ // updateCentralDate so centralDate stays first-of-month — direct
36268
+ // assignment of the raw value briefly holds a mid-month string
36269
+ // and violates the invariant that observers (e.g. calendar sync)
36270
+ // rely on.
36271
+ this.calendarRenderUtil.updateCentralDate(this, this.value);
35401
36272
  }
35402
36273
 
35403
36274
  this.setHasValue();
@@ -35431,7 +36302,7 @@ class AuroDatePicker extends AuroElement {
35431
36302
  // update the calendar
35432
36303
  if (this.valueEndObject) {
35433
36304
  this.calendar.dateTo = this.convertToWcValidTime(this.valueEndObject);
35434
- if (!(this.wasCellClick && this.range)) {
36305
+ if (!this.wasCellClick) {
35435
36306
  this.calendarRenderUtil.updateCentralDate(this, this.valueEndObject);
35436
36307
  }
35437
36308
  } else {
@@ -35455,16 +36326,23 @@ class AuroDatePicker extends AuroElement {
35455
36326
 
35456
36327
  if (this.valueEnd && this.valueEnd.length === this.inputList[1].lengthForType && !this.wasCellClick) {
35457
36328
  // Skip centralDate update when user clicked a cell in range mode
35458
- // to prevent the displayed months from shifting
35459
- this.centralDate = this.valueEnd;
35460
- // TODO: TEST THIS CHANGE
35461
- // this.calendarRenderUtil.updateCentralDate(this, this.formattedValueEnd);
36329
+ // to prevent the displayed months from shifting. Route through
36330
+ // updateCentralDate to preserve the first-of-month invariant
36331
+ // (see matching comment in the value branch above).
36332
+ this.calendarRenderUtil.updateCentralDate(this, this.valueEnd);
35462
36333
  }
35463
36334
 
35464
36335
  this.validate();
35465
36336
  this.setHasValue();
35466
36337
  }
35467
36338
 
36339
+ // Run focus-date handling AFTER value/valueEnd so that when a consumer sets
36340
+ // calendarFocusDate together with value, the focus date wins for the visible
36341
+ // month instead of being overwritten by the value branch's updateCentralDate.
36342
+ if (changedProperties.has('calendarFocusDate')) {
36343
+ this.handleFocusDateChange();
36344
+ }
36345
+
35468
36346
  if (changedProperties.has('error')) {
35469
36347
  // Error attribute is passed down to the last input in the list to control the error state
35470
36348
  // This is done to prevent error icon from displaying on both inputs in range support
@@ -35482,10 +36360,6 @@ class AuroDatePicker extends AuroElement {
35482
36360
  this.validation.validate(lastInput, true);
35483
36361
  }
35484
36362
 
35485
- if (this.valueObject && this.valueEndObject && this.valueObject > this.valueEndObject) {
35486
- this.valueEnd = undefined;
35487
- }
35488
-
35489
36363
  // This resets the datepicker when the minDate is set to a new value that is
35490
36364
  // a later date than the current value date
35491
36365
  if (changedProperties.has('minDate') && this.minDate) {
@@ -35577,9 +36451,28 @@ class AuroDatePicker extends AuroElement {
35577
36451
  * @returns {void}
35578
36452
  */
35579
36453
  handleClick(event) {
35580
-
35581
- // Get the initial target of the click event
35582
- const [initTarget] = event.composedPath();
36454
+ const path = event.composedPath();
36455
+ const [initTarget] = path;
36456
+ const pathIncludesBib = path.includes(this.dropdown?.bibContent);
36457
+ const triggerIsInert = this.dropdown?.trigger?.inert;
36458
+
36459
+ // When desktopModal is open, the datepicker marks the dropdown's #trigger
36460
+ // element inert to keep AT and Tab off the input. Inert also blocks pointer
36461
+ // events, so a click on the visible trigger area passes through to the
36462
+ // wrapper <div> that sits alongside #trigger in the dropdown's shadow root.
36463
+ // composedPath() then no longer contains #trigger, and the floater's
36464
+ // window-level click-outside handler treats the click as an outside click
36465
+ // and closes the bib. Suppress that misdetection here: if the click lands
36466
+ // inside the trigger's bounds and outside the bib, stop propagation before
36467
+ // it reaches the window listener.
36468
+ if (this.dropdown?.isPopoverVisible && triggerIsInert && !pathIncludesBib) {
36469
+ const triggerRect = this.dropdown.trigger?.getBoundingClientRect();
36470
+ if (triggerRect &&
36471
+ event.clientX >= triggerRect.left && event.clientX <= triggerRect.right &&
36472
+ event.clientY >= triggerRect.top && event.clientY <= triggerRect.bottom) {
36473
+ event.stopPropagation();
36474
+ }
36475
+ }
35583
36476
 
35584
36477
  // Determine if the current layout requires special handling
35585
36478
  const layoutRequiresHandling = ['snowflake'].includes(this.layout);
@@ -35588,7 +36481,7 @@ class AuroDatePicker extends AuroElement {
35588
36481
  const targetIsInput = initTarget.tagName === 'INPUT';
35589
36482
  const isFocusAlreadyOnInput = this.inputList.includes(this.shadowRoot.activeElement);
35590
36483
 
35591
- if (layoutRequiresHandling && !targetIsInput && !isFocusAlreadyOnInput && !event.composedPath().includes(this.dropdown.bibContent)) {
36484
+ if (layoutRequiresHandling && !targetIsInput && !isFocusAlreadyOnInput && !pathIncludesBib) {
35592
36485
  // Focus the first input
35593
36486
  this.inputList[0].focus();
35594
36487
  }
@@ -35600,7 +36493,7 @@ class AuroDatePicker extends AuroElement {
35600
36493
  * @returns {void}
35601
36494
  */
35602
36495
  configureClickHandler() {
35603
- this.addEventListener('click', this.handleClick);
36496
+ this.addEventListener('click', this.handleClick, { signal: this._listenerAbortController.signal });
35604
36497
  }
35605
36498
 
35606
36499
  firstUpdated() {
@@ -35608,6 +36501,15 @@ class AuroDatePicker extends AuroElement {
35608
36501
  // Add the tag name as an attribute if it is different than the component name
35609
36502
  this.runtimeUtils.handleComponentTagRename(this, 'auro-datepicker');
35610
36503
 
36504
+ // If the element was disconnected before this first render finished,
36505
+ // disconnectedCallback's microtask already aborted the controller. The
36506
+ // connectedCallback reinit guard skips that case because `hasUpdated`
36507
+ // is still false. Mint a fresh controller here so configure* registers
36508
+ // listeners against a live signal.
36509
+ if (this._listenerAbortController.signal.aborted) {
36510
+ this._listenerAbortController = new AbortController();
36511
+ }
36512
+
35611
36513
  this.configureDropdown();
35612
36514
  this.configureInput();
35613
36515
  this.configureCalendar();
@@ -35619,9 +36521,36 @@ class AuroDatePicker extends AuroElement {
35619
36521
  connectedCallback() {
35620
36522
  super.connectedCallback();
35621
36523
 
36524
+ // True reconnect after `disconnectedCallback` aborted our controller:
36525
+ // the existing signal is dead, so listeners registered against it
36526
+ // would never fire. Create a fresh controller and re-run the
36527
+ // configure* wiring (each method is idempotent — it just re-caches
36528
+ // child refs and re-registers listeners against the new signal).
36529
+ // `hasUpdated` gates this so the *first* connect (which precedes
36530
+ // firstUpdated) still falls through to firstUpdated's initial wiring.
36531
+ if (this.hasUpdated && this._listenerAbortController.signal.aborted) {
36532
+ this._listenerAbortController = new AbortController();
36533
+ this.configureDropdown();
36534
+ this.configureInput();
36535
+ this.configureCalendar();
36536
+ this.configureDatepicker();
36537
+ this.configureClickHandler();
36538
+ }
36539
+
35622
36540
  this.locale = this.domHandler.getLocale(this);
35623
36541
  }
35624
36542
 
36543
+ disconnectedCallback() {
36544
+ super.disconnectedCallback();
36545
+ // Defer so that re-parenting (auro-drawer slotting it into a dialog,
36546
+ // for example) does not abort listeners we still need after reconnect.
36547
+ queueMicrotask(() => {
36548
+ if (!this.isConnected) {
36549
+ this._listenerAbortController.abort();
36550
+ }
36551
+ });
36552
+ }
36553
+
35625
36554
  // layout render methods
35626
36555
  // ------------------------------------
35627
36556
 
@@ -35828,6 +36757,7 @@ class AuroDatePicker extends AuroElement {
35828
36757
  }
35829
36758
  <span slot="ariaLabel.clear">${this.runtimeUtils.getSlotText(this, 'ariaLabel.input.clear') || i18n(this.lang, 'clearInput')}</span>
35830
36759
  <span slot="label"><slot name="fromLabel"></slot></span>
36760
+ <slot name="optionalFromLabel" slot="optionalLabel"> (optional)</slot>
35831
36761
  </${this.inputTag}>
35832
36762
  </div>
35833
36763
 
@@ -35872,6 +36802,7 @@ class AuroDatePicker extends AuroElement {
35872
36802
  }
35873
36803
  <span slot="ariaLabel.clear">${this.runtimeUtils.getSlotText(this, 'ariaLabel.input.clear') || this.runtimeUtils.getSlotText(this, 'ariaLabel.input.clear') || i18n(this.lang, 'clearInput')}</span>
35874
36804
  <span slot="label"><slot name="toLabel"></slot></span>
36805
+ <slot name="optionalToLabel" slot="optionalLabel"> (optional)</slot>
35875
36806
  </${this.inputTag}>
35876
36807
  </div>
35877
36808
  ` : undefined}
@@ -36020,8 +36951,8 @@ class AuroDatePicker extends AuroElement {
36020
36951
  <slot slot="bib.fullscreen.dateLabel" name="bib.fullscreen.dateLabel" @slotchange="${this.handleSlotToSlot}"></slot>
36021
36952
  <slot slot="bib.fullscreen.toLabel" name="bib.fullscreen.toLabel" @slotchange="${this.handleSlotToSlot}"></slot>
36022
36953
  <slot slot="bib.fullscreen.fromLabel" name="bib.fullscreen.fromLabel" @slotchange="${this.handleSlotToSlot}"></slot>
36023
- <span slot="bib.fullscreen.fromStr">${AuroInputUtil.toFormattedValue(this.valueObject, this.format) || html$1`<span class="placeholderDate">${(this.format || 'mm/dd/yyyy').toUpperCase()}</span>`}</span>
36024
- ${this.range ? html$1`<span slot="bib.fullscreen.toStr">${AuroInputUtil.toFormattedValue(this.valueEndObject, this.format) || html$1`<span class="placeholderDate">${(this.format || 'mm/dd/yyyy').toUpperCase()}</span>`}</span>` : undefined}
36954
+ <span slot="bib.fullscreen.fromStr" class="body-default">${AuroInputUtil.toFormattedValue(this.valueObject, this.format) || html$1`<span class="placeholderDate">${(this.format || 'mm/dd/yyyy').toUpperCase()}</span>`}</span>
36955
+ ${this.range ? html$1`<span slot="bib.fullscreen.toStr" class="body-default">${AuroInputUtil.toFormattedValue(this.valueEndObject, this.format) || html$1`<span class="placeholderDate">${(this.format || 'mm/dd/yyyy').toUpperCase()}</span>`}</span>` : undefined}
36025
36956
  </auro-formkit-calendar>
36026
36957
  `;
36027
36958
  }