@aurodesignsystem-dev/auro-formkit 0.0.0-pr1508.0 → 0.0.0-pr1508.2

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 (141) 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/customize.min.js +8 -6
  4. package/components/checkbox/demo/getting-started.min.js +8 -6
  5. package/components/checkbox/demo/index.min.js +8 -6
  6. package/components/checkbox/dist/index.js +8 -6
  7. package/components/checkbox/dist/registered.js +8 -6
  8. package/components/combobox/README.md +1 -1
  9. package/components/combobox/demo/customize.md +2 -10
  10. package/components/combobox/demo/customize.min.js +386 -305
  11. package/components/combobox/demo/getting-started.min.js +386 -301
  12. package/components/combobox/demo/index.md +1 -1
  13. package/components/combobox/demo/index.min.js +386 -301
  14. package/components/combobox/demo/keyboard-behavior.md +2 -142
  15. package/components/combobox/demo/readme.md +1 -1
  16. package/components/combobox/demo/why-combobox.md +2 -2
  17. package/components/combobox/dist/auro-combobox.d.ts +23 -16
  18. package/components/combobox/dist/index.js +385 -300
  19. package/components/combobox/dist/registered.js +385 -300
  20. package/components/counter/demo/customize.min.js +18 -8
  21. package/components/counter/demo/index.min.js +18 -8
  22. package/components/counter/dist/index.js +18 -8
  23. package/components/counter/dist/registered.js +18 -8
  24. package/components/datepicker/demo/accessibility.md +2 -1
  25. package/components/datepicker/demo/api.md +63 -62
  26. package/components/datepicker/demo/customize.md +12 -1
  27. package/components/datepicker/demo/customize.min.js +932 -335
  28. package/components/datepicker/demo/index.min.js +932 -335
  29. package/components/datepicker/dist/{src/auro-calendar-cell.d.ts → auro-calendar-cell.d.ts} +20 -3
  30. package/components/datepicker/dist/{src/auro-calendar.d.ts → auro-calendar.d.ts} +121 -7
  31. package/components/datepicker/dist/{src/auro-datepicker.d.ts → auro-datepicker.d.ts} +78 -5
  32. package/components/datepicker/dist/blackoutUtils.d.ts +43 -0
  33. package/components/datepicker/dist/index.js +932 -335
  34. package/components/datepicker/dist/registered.js +932 -335
  35. package/components/dropdown/demo/customize.min.js +2 -1
  36. package/components/dropdown/demo/getting-started.min.js +2 -1
  37. package/components/dropdown/demo/index.min.js +2 -1
  38. package/components/dropdown/dist/index.js +2 -1
  39. package/components/dropdown/dist/registered.js +2 -1
  40. package/components/form/demo/customize.min.js +1690 -826
  41. package/components/form/demo/getting-started.min.js +1690 -826
  42. package/components/form/demo/index.min.js +1690 -826
  43. package/components/form/demo/registerDemoDeps.min.js +1690 -826
  44. package/components/input/demo/api.md +5 -5
  45. package/components/input/demo/customize.md +8 -8
  46. package/components/input/demo/customize.min.js +137 -95
  47. package/components/input/demo/getting-started.min.js +137 -95
  48. package/components/input/demo/index.min.js +137 -95
  49. package/components/input/dist/base-input.d.ts +33 -44
  50. package/components/input/dist/index.js +150 -96
  51. package/components/input/dist/registered.js +137 -95
  52. package/components/radio/demo/customize.min.js +8 -6
  53. package/components/radio/demo/getting-started.min.js +8 -6
  54. package/components/radio/demo/index.min.js +8 -6
  55. package/components/radio/dist/index.js +8 -6
  56. package/components/radio/dist/registered.js +8 -6
  57. package/components/select/demo/customize.md +86 -0
  58. package/components/select/demo/customize.min.js +194 -68
  59. package/components/select/demo/getting-started.min.js +196 -115
  60. package/components/select/demo/index.min.js +194 -68
  61. package/components/select/demo/keyboard-behavior.md +18 -4
  62. package/components/select/dist/auro-select.d.ts +20 -8
  63. package/components/select/dist/index.js +194 -68
  64. package/components/select/dist/registered.js +194 -68
  65. package/custom-elements.json +2365 -1819
  66. package/package.json +6 -2
  67. package/components/checkbox/demo/customize.js +0 -22
  68. package/components/checkbox/demo/demo-support.js +0 -1
  69. package/components/checkbox/demo/getting-started.js +0 -22
  70. package/components/checkbox/demo/index.js +0 -8
  71. package/components/checkbox/demo/styles.scss +0 -1
  72. package/components/combobox/demo/customize.js +0 -24
  73. package/components/combobox/demo/demo-support.js +0 -1
  74. package/components/combobox/demo/getting-started.js +0 -21
  75. package/components/combobox/demo/index.js +0 -23
  76. package/components/combobox/demo/styles.scss +0 -1
  77. package/components/counter/demo/customize.js +0 -21
  78. package/components/counter/demo/demo-support.js +0 -1
  79. package/components/counter/demo/index.js +0 -21
  80. package/components/counter/demo/styles.scss +0 -1
  81. package/components/datepicker/demo/customize.js +0 -17
  82. package/components/datepicker/demo/demo-support.js +0 -1
  83. package/components/datepicker/demo/index.js +0 -23
  84. package/components/datepicker/demo/styles.scss +0 -1
  85. package/components/dropdown/demo/customize.js +0 -9
  86. package/components/dropdown/demo/demo-support.js +0 -1
  87. package/components/dropdown/demo/getting-started.js +0 -9
  88. package/components/dropdown/demo/index.js +0 -16
  89. package/components/dropdown/demo/styles.scss +0 -1
  90. package/components/form/demo/customize.js +0 -28
  91. package/components/form/demo/demo-support.js +0 -1
  92. package/components/form/demo/getting-started.js +0 -9
  93. package/components/form/demo/index.js +0 -5
  94. package/components/form/demo/registerDemoDeps.js +0 -23
  95. package/components/form/demo/styles.scss +0 -1
  96. package/components/input/demo/customize.js +0 -25
  97. package/components/input/demo/demo-support.js +0 -1
  98. package/components/input/demo/getting-started.js +0 -8
  99. package/components/input/demo/index.js +0 -8
  100. package/components/input/demo/styles.css +0 -974
  101. package/components/input/demo/styles.scss +0 -1
  102. package/components/menu/demo/demo-support.js +0 -1
  103. package/components/menu/demo/index.js +0 -25
  104. package/components/menu/demo/styles.scss +0 -1
  105. package/components/radio/demo/customize.js +0 -22
  106. package/components/radio/demo/demo-support.js +0 -1
  107. package/components/radio/demo/getting-started.js +0 -24
  108. package/components/radio/demo/index.js +0 -8
  109. package/components/radio/demo/styles.scss +0 -1
  110. package/components/select/demo/customize.js +0 -11
  111. package/components/select/demo/demo-support.js +0 -1
  112. package/components/select/demo/getting-started.js +0 -26
  113. package/components/select/demo/index.js +0 -11
  114. package/components/select/demo/styles.scss +0 -1
  115. /package/components/datepicker/dist/{src/auro-calendar-month.d.ts → auro-calendar-month.d.ts} +0 -0
  116. /package/components/datepicker/dist/{src/buttonVersion.d.ts → buttonVersion.d.ts} +0 -0
  117. /package/components/datepicker/dist/{src/datepickerKeyboardStrategy.d.ts → datepickerKeyboardStrategy.d.ts} +0 -0
  118. /package/components/datepicker/dist/{src/iconVersion.d.ts → iconVersion.d.ts} +0 -0
  119. /package/components/datepicker/dist/{src/index.d.ts → index.d.ts} +0 -0
  120. /package/components/datepicker/dist/{src/popoverVersion.d.ts → popoverVersion.d.ts} +0 -0
  121. /package/components/datepicker/dist/{src/styles → styles}/classic/color-css.d.ts +0 -0
  122. /package/components/datepicker/dist/{src/styles → styles}/classic/style-css.d.ts +0 -0
  123. /package/components/datepicker/dist/{src/styles → styles}/color-calendar-css.d.ts +0 -0
  124. /package/components/datepicker/dist/{src/styles → styles}/color-cell-css.d.ts +0 -0
  125. /package/components/datepicker/dist/{src/styles → styles}/color-css.d.ts +0 -0
  126. /package/components/datepicker/dist/{src/styles → styles}/color-month-css.d.ts +0 -0
  127. /package/components/datepicker/dist/{src/styles → styles}/shapeSize-css.d.ts +0 -0
  128. /package/components/datepicker/dist/{src/styles → styles}/snowflake/color-css.d.ts +0 -0
  129. /package/components/datepicker/dist/{src/styles → styles}/snowflake/style-css.d.ts +0 -0
  130. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-cell-css.d.ts +0 -0
  131. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-css.d.ts +0 -0
  132. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-month-css.d.ts +0 -0
  133. /package/components/datepicker/dist/{src/styles → styles}/style-css.d.ts +0 -0
  134. /package/components/datepicker/dist/{src/styles → styles}/tokens-css.d.ts +0 -0
  135. /package/components/datepicker/dist/{src/utilities.d.ts → utilities.d.ts} +0 -0
  136. /package/components/datepicker/dist/{src/utilitiesCalendar.d.ts → utilitiesCalendar.d.ts} +0 -0
  137. /package/components/datepicker/dist/{src/utilitiesCalendarRender.d.ts → utilitiesCalendarRender.d.ts} +0 -0
  138. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/day.d.ts +0 -0
  139. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker-calendar.d.ts +0 -0
  140. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker-cell.d.ts +0 -0
  141. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker.d.ts +0 -0
@@ -5553,15 +5553,17 @@ let AuroFormValidation$7 = class AuroFormValidation {
5553
5553
  );
5554
5554
  }
5555
5555
 
5556
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
5557
- if (this.auroInputElements?.length === 2) {
5558
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
5556
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
5557
+
5558
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
5559
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
5560
+ // field (datepicker is the intended consumer — start/end are independently required).
5561
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
5562
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
5559
5563
  hasValue = false;
5560
5564
  }
5561
5565
  }
5562
5566
 
5563
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
5564
-
5565
5567
  if (isCombobox) {
5566
5568
 
5567
5569
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -6176,7 +6178,7 @@ function normalizeDates$3(context, ...dates) {
6176
6178
  * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))
6177
6179
  * //=> Tue Sep 02 2014 00:00:00
6178
6180
  */
6179
- function startOfDay$4(date, options) {
6181
+ function startOfDay$3(date, options) {
6180
6182
  const _date = toDate$3(date, options?.in);
6181
6183
  _date.setHours(0, 0, 0, 0);
6182
6184
  return _date;
@@ -6224,8 +6226,8 @@ function differenceInCalendarDays$3(laterDate, earlierDate, options) {
6224
6226
  earlierDate,
6225
6227
  );
6226
6228
 
6227
- const laterStartOfDay = startOfDay$4(laterDate_);
6228
- const earlierStartOfDay = startOfDay$4(earlierDate_);
6229
+ const laterStartOfDay = startOfDay$3(laterDate_);
6230
+ const earlierStartOfDay = startOfDay$3(earlierDate_);
6229
6231
 
6230
6232
  const laterTimestamp =
6231
6233
  +laterStartOfDay - getTimezoneOffsetInMilliseconds$3(laterStartOfDay);
@@ -11497,6 +11499,13 @@ let AuroInputUtilities$3 = class AuroInputUtilities {
11497
11499
  * @returns {string | undefined}
11498
11500
  */
11499
11501
  toFormattedValue(valueObject, format) {
11502
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
11503
+ // `format` argument has to fail gracefully rather than throw on
11504
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
11505
+ // as "no format → no display value".
11506
+ if (!format) {
11507
+ return undefined;
11508
+ }
11500
11509
  const normalizedFormat = format.toLowerCase();
11501
11510
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
11502
11511
 
@@ -11648,76 +11657,19 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11648
11657
  constructor() {
11649
11658
  super();
11650
11659
 
11651
- this.appearance = "default";
11652
- this.disabled = false;
11653
- this.layout = 'classic';
11654
- this.locale = 'en-US';
11655
- this.max = undefined;
11656
- this.maxLength = undefined;
11657
- this.min = undefined;
11658
- this.minLength = undefined;
11659
- this.required = false;
11660
- this.onDark = false;
11661
- this.setCustomValidityForType = undefined;
11662
- this.size = 'lg';
11663
- this.shape = 'classic';
11664
- this.value = undefined;
11665
-
11666
- this._initializePrivateDefaults();
11667
- }
11668
-
11669
- /**
11670
- * Internal Defaults.
11671
- * @private
11672
- * @returns {void}
11673
- */
11674
- _initializePrivateDefaults() {
11660
+ // Single-source initialization. Alphabetized so duplicate or stale
11661
+ // defaults are immediately obvious on a diff. Every field is assigned
11662
+ // exactly once here (previously the constructor + the old
11663
+ // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
11664
+ // fields and double-allocated `util` and `validation`, discarding the
11665
+ // first instance). `validation` is now allocated exactly once; `util`
11666
+ // is seeded here with an en-US default and then rebuilt in
11667
+ // `connectedCallback` once the consumer-resolved locale is available,
11668
+ // so a parent (datepicker/combobox) calling `validate()` synchronously
11669
+ // during its own update cycle sees a populated util instance.
11675
11670
  this.activeLabel = false;
11676
- this.appearance = "default";
11677
- this.icon = false;
11678
- this.disabled = false;
11679
- this.dvInputOnly = false;
11680
- this.hideLabelVisually = false;
11681
- this.max = undefined;
11682
- this.maxLength = undefined;
11683
- this.min = undefined;
11684
- this.minLength = undefined;
11685
- this.noValidate = false;
11686
- this.onDark = false;
11687
- this.required = false;
11688
- this.setCustomValidityForType = undefined;
11689
-
11690
- // Used for storing raw values returned from input mask.
11691
- this._rawMaskValue = undefined;
11692
-
11693
- /**
11694
- * @private
11695
- */
11696
- this.layout = 'classic';
11697
-
11698
- /**
11699
- * @private
11700
- */
11701
- this.shape = 'classic';
11702
-
11703
- /**
11704
- * @private
11705
- */
11706
- this.size = 'lg';
11707
-
11708
- this.touched = false;
11709
- this.util = new AuroInputUtilities$3({
11710
- locale: "en-US",
11711
- format: this.format
11712
- });
11713
- this.validation = new AuroFormValidation$7();
11714
- this.inputIconName = undefined;
11715
- this.showPassword = false;
11716
- this.validationCCLength = undefined;
11717
- this.hasValue = false;
11718
- this.label = 'Input label is undefined';
11719
-
11720
11671
 
11672
+ /** @private */
11721
11673
  this.allowedInputTypes = [
11722
11674
  "text",
11723
11675
  "number",
@@ -11726,7 +11678,9 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11726
11678
  "credit-card",
11727
11679
  "tel"
11728
11680
  ];
11729
- this.icon = false;
11681
+ this.appearance = "default";
11682
+
11683
+ /** @private */
11730
11684
  this.dateFormatMap = {
11731
11685
  'mm/dd/yyyy': 'dateMMDDYYYY',
11732
11686
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -11743,27 +11697,62 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11743
11697
  'dd/mm': 'dateDDMM',
11744
11698
  'mm/dd': 'dateMMDD'
11745
11699
  };
11700
+ this.disabled = false;
11701
+
11702
+ /** @private */
11746
11703
  this.domHandler = new DomHandler$3();
11747
11704
  this.dvInputOnly = false;
11748
11705
  this.hasValue = false;
11706
+ this.hideLabelVisually = false;
11707
+ this.icon = false;
11708
+
11709
+ /** @private */
11749
11710
  this.inputIconName = undefined;
11711
+
11712
+ /** @private */
11750
11713
  this.label = 'Input label is undefined';
11714
+ this.layout = 'classic';
11715
+ this.locale = 'en-US';
11716
+ this.max = undefined;
11717
+ this.maxLength = undefined;
11718
+ this.min = undefined;
11719
+ this.minLength = undefined;
11751
11720
  this.noValidate = false;
11752
- this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
11721
+ this.onDark = false;
11722
+ // Raw values returned from the input mask before model normalization.
11723
+ this._rawMaskValue = undefined;
11724
+ this.required = false;
11725
+ this.setCustomValidityForType = undefined;
11726
+ // Credit Card is intentionally excluded — its mask manages the cursor
11727
+ // itself, and listing it here caused cursor placement issues in Safari.
11728
+ /** @private */
11753
11729
  this.setSelectionInputTypes = [
11754
11730
  "text",
11755
11731
  "password",
11756
11732
  "email"
11757
- ]; // Credit Card is not included as this caused cursor placement issues in Safari.
11733
+ ];
11734
+ this.shape = 'classic';
11735
+
11736
+ /** @private */
11758
11737
  this.showPassword = false;
11738
+ this.size = 'lg';
11759
11739
  this.touched = false;
11740
+
11741
+ /** @private */
11760
11742
  this.uniqueId = new UniqueId$2().create();
11743
+
11744
+ /** @private */
11761
11745
  this.util = new AuroInputUtilities$3({
11762
11746
  locale: this.locale,
11763
11747
  format: this.format
11764
11748
  });
11749
+
11750
+ /** @private */
11765
11751
  this.validation = new AuroFormValidation$7();
11752
+
11753
+ /** @private */
11766
11754
  this.validationCCLength = undefined;
11755
+ this.value = undefined;
11767
11756
  }
11768
11757
 
11769
11758
  // function to define props used within the scope of this component
@@ -12267,6 +12256,15 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12267
12256
 
12268
12257
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
12269
12258
 
12259
+ // Normalize the format token to lowercase so case-mixed values supplied
12260
+ // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
12261
+ // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
12262
+ // format silently misses the map and leaves `setCustomValidityForType`
12263
+ // unset.
12264
+ if (this.format) {
12265
+ this.format = this.format.toLowerCase();
12266
+ }
12267
+
12270
12268
  // use validity message override if declared when initializing the component
12271
12269
  if (this.hasAttribute('setCustomValidity')) {
12272
12270
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -12350,6 +12348,13 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12350
12348
 
12351
12349
  if (typeToI18n.includes(this.type)) {
12352
12350
  this.setCustomValidityForType = i18n$3(this.lang, this.type);
12351
+ // COVERAGE: this `else if` branch is unreachable in WTR. connectedCallback
12352
+ // (L682) calls configureDataForType, which at L1266-1268 assigns
12353
+ // `this.format = this.util.getDateMaskFromLocale().toLowerCase()` for any
12354
+ // type=date input whose `format` attribute is unset. That runs before
12355
+ // firstUpdated invokes setCustomHelpTextMessage, so `!this.format` is
12356
+ // always false here. Retained as a defensive fallback; the whole function
12357
+ // is @deprecated per AB#1557296 and slated for removal.
12353
12358
  } else if (!this.format && this.type === 'date') {
12354
12359
  this.setCustomValidityForType = i18n$3(this.lang, 'dateMMDDYYYY');
12355
12360
  } else if (this.dateFormatMap[this.format]) {
@@ -12639,6 +12644,38 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12639
12644
  this.touched = true;
12640
12645
  this.validation.validate(this);
12641
12646
  }
12647
+
12648
+ // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
12649
+ // update that can re-render the input and reset the native cursor; we
12650
+ // capture the caret position before that update commits and restore it
12651
+ // via `setSelectionRange` once the update has flushed. Gated on
12652
+ // `setSelectionInputTypes` so credit-card (and other masked types whose
12653
+ // formatter manages the cursor itself) doesn't get a competing write.
12654
+ // Capture the caret position INSIDE the gate — reading `selectionStart`
12655
+ // on input types that don't support text selection (number, email in
12656
+ // some browsers) throws InvalidStateError, which would crash all input
12657
+ // handling. Wrap the read in try/catch belt-and-suspenders even though
12658
+ // the gated types currently support it, since the list is a public
12659
+ // property a consumer could mutate.
12660
+ if (this.setSelectionInputTypes.includes(this.type)) {
12661
+ let selectionStart = null;
12662
+ try {
12663
+ ({ selectionStart } = this.inputElement);
12664
+ } catch (error) { // eslint-disable-line no-unused-vars
12665
+ return;
12666
+ }
12667
+ if (typeof selectionStart !== 'number') {
12668
+ return;
12669
+ }
12670
+ this.updateComplete.then(() => {
12671
+ try {
12672
+ this.inputElement.setSelectionRange(selectionStart, selectionStart);
12673
+ } catch (error) { // eslint-disable-line no-unused-vars
12674
+ // Some input types (number/email in certain UAs) throw on
12675
+ // setSelectionRange; swallow and let the native cursor stand.
12676
+ }
12677
+ });
12678
+ }
12642
12679
  }
12643
12680
 
12644
12681
  /**
@@ -12772,7 +12809,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12772
12809
  */
12773
12810
  get placeholderStr() {
12774
12811
  if (!this.placeholder && this.type === 'date') {
12775
- return this.format ? this.format.toUpperCase() : 'MM/DD/YYYY';
12812
+ return this.format.toUpperCase();
12776
12813
  }
12777
12814
  return this.placeholder || "";
12778
12815
  }
@@ -13263,7 +13300,7 @@ let AuroHelpText$8 = class AuroHelpText extends i$3 {
13263
13300
  }
13264
13301
  };
13265
13302
 
13266
- var formkitVersion$8 = '202606231948';
13303
+ var formkitVersion$8 = '202607010104';
13267
13304
 
13268
13305
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
13269
13306
  // See LICENSE in the project root for license information.
@@ -13766,6 +13803,7 @@ let AuroInput$2 = class AuroInput extends BaseInput$2 {
13766
13803
  <${this.buttonTag}
13767
13804
  @click="${this.handleClickShowPassword}"
13768
13805
  appearance="${this.onDark ? 'inverse' : this.appearance}"
13806
+ aria-pressed="${this.showPassword ? 'true' : 'false'}"
13769
13807
  class="notificationBtn passwordBtn"
13770
13808
  shape="circle"
13771
13809
  size="sm"
@@ -13839,25 +13877,29 @@ let AuroInput$2 = class AuroInput extends BaseInput$2 {
13839
13877
  * @returns {html} - Returns HTML for the help text and error message.
13840
13878
  */
13841
13879
  renderHtmlHelpText() {
13880
+ // Single `<p>` with stable identity across validity transitions —
13881
+ // previously two distinct templates (valid vs invalid) caused Lit to
13882
+ // replace the node entirely on a flip, and VoiceOver wouldn't
13883
+ // re-announce because the live-region element it was watching had been
13884
+ // removed and a new one inserted. Keeping one node means the `role`,
13885
+ // `aria-live`, and text content all change in-place, which AT does
13886
+ // observe and announce.
13887
+ const isError = this.validity && this.validity !== 'valid';
13842
13888
  return u$c`
13843
- ${!this.validity || this.validity === undefined || this.validity === 'valid'
13844
- ? u$c`
13845
- <${this.helpTextTag}
13846
- appearance="${this.onDark ? 'inverse' : this.appearance}">
13847
- <p id="${this.uniqueId}" part="helpText">
13848
- <slot name="helpText">${this.getHelpText()}</slot>
13849
- </p>
13850
- </${this.helpTextTag}>
13851
- `
13852
- : u$c`
13853
- <${this.helpTextTag} error
13854
- appearance="${this.onDark ? 'inverse' : this.appearance}">
13855
- <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
13856
- ${this.errorMessage}
13857
- </p>
13858
- </${this.helpTextTag}>
13859
- `
13860
- }
13889
+ <${this.helpTextTag}
13890
+ appearance="${this.onDark ? 'inverse' : this.appearance}"
13891
+ ?error=${isError}>
13892
+ <p
13893
+ id="${this.uniqueId}"
13894
+ part="helpText"
13895
+ role="${o$4(isError ? 'alert' : undefined)}"
13896
+ aria-live="${o$4(isError ? 'assertive' : undefined)}">
13897
+ ${isError
13898
+ ? this.errorMessage
13899
+ : u$c`<slot name="helpText">${this.getHelpText()}</slot>`
13900
+ }
13901
+ </p>
13902
+ </${this.helpTextTag}>
13861
13903
  `;
13862
13904
  }
13863
13905
 
@@ -14631,15 +14673,17 @@ let AuroFormValidation$1$1 = class AuroFormValidation {
14631
14673
  );
14632
14674
  }
14633
14675
 
14634
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
14635
- if (this.auroInputElements?.length === 2) {
14636
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
14676
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
14677
+
14678
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
14679
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
14680
+ // field (datepicker is the intended consumer — start/end are independently required).
14681
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
14682
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
14637
14683
  hasValue = false;
14638
14684
  }
14639
14685
  }
14640
14686
 
14641
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
14642
-
14643
14687
  if (isCombobox) {
14644
14688
 
14645
14689
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -15347,7 +15391,7 @@ function normalizeDates$1(context, ...dates) {
15347
15391
  * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))
15348
15392
  * //=> Tue Sep 02 2014 00:00:00
15349
15393
  */
15350
- function startOfDay$2(date, options) {
15394
+ function startOfDay$1(date, options) {
15351
15395
  const _date = toDate$1(date, options?.in);
15352
15396
  _date.setHours(0, 0, 0, 0);
15353
15397
  return _date;
@@ -15395,8 +15439,8 @@ function differenceInCalendarDays$1(laterDate, earlierDate, options) {
15395
15439
  earlierDate,
15396
15440
  );
15397
15441
 
15398
- const laterStartOfDay = startOfDay$2(laterDate_);
15399
- const earlierStartOfDay = startOfDay$2(earlierDate_);
15442
+ const laterStartOfDay = startOfDay$1(laterDate_);
15443
+ const earlierStartOfDay = startOfDay$1(earlierDate_);
15400
15444
 
15401
15445
  const laterTimestamp =
15402
15446
  +laterStartOfDay - getTimezoneOffsetInMilliseconds$1(laterStartOfDay);
@@ -24498,6 +24542,13 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
24498
24542
  * @returns {string | undefined}
24499
24543
  */
24500
24544
  toFormattedValue(valueObject, format) {
24545
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
24546
+ // `format` argument has to fail gracefully rather than throw on
24547
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
24548
+ // as "no format → no display value".
24549
+ if (!format) {
24550
+ return undefined;
24551
+ }
24501
24552
  const normalizedFormat = format.toLowerCase();
24502
24553
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
24503
24554
 
@@ -24758,11 +24809,11 @@ var snowflakeStyle = i$6`:host([layout*=snowflake]) [auro-input]{flex:1;text-ali
24758
24809
 
24759
24810
  var snowflakeColors = i$6`:host([layout=snowflake]) [auro-dropdown]:not(:is([error],.hasFocus)){--ds-auro-dropdown-trigger-border-color: transparent}`;
24760
24811
 
24761
- var styleCss$7$1 = i$6`.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}`;
24812
+ var styleCss$7$1 = i$6`.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%}: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}`;
24762
24813
 
24763
- var colorCss$7$1 = i$6`.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)}}`;
24814
+ var colorCss$7$1 = i$6`.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)}}`;
24764
24815
 
24765
- var styleCss$6$1 = i$6`: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: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)}`;
24816
+ var styleCss$6$1 = i$6`: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)}`;
24766
24817
 
24767
24818
  var colorCss$6$1 = i$6`: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)}`;
24768
24819
 
@@ -24854,8 +24905,8 @@ class RangeDatepickerCell extends i$3 {
24854
24905
  const parsedDateFrom = parseInt(dateFrom, 10);
24855
24906
  const parsedDateTo = parseInt(dateTo, 10);
24856
24907
  if (day) {
24857
- if (getTime(startOfDay$2(parsedDateTo * 1000)) / 1000 === day.date ||
24858
- getTime(startOfDay$2(parsedDateFrom * 1000)) / 1000 === day.date) {
24908
+ if (getTime(startOfDay$1(parsedDateTo * 1000)) / 1000 === day.date ||
24909
+ getTime(startOfDay$1(parsedDateFrom * 1000)) / 1000 === day.date) {
24859
24910
  this.selected = true;
24860
24911
  }
24861
24912
  if (((hoveredDate === day.date || day.date < hoveredDate) &&
@@ -25043,7 +25094,7 @@ class RangeDatepickerCalendar extends i$3 {
25043
25094
  this.dayNamesOfTheWeek = [];
25044
25095
  this.daysOfMonth = [];
25045
25096
  this._locale = null;
25046
- this.currentDate = parseInt(format$1(startOfDay$2(Date.now()), 't'), 10);
25097
+ this.currentDate = parseInt(format$1(startOfDay$1(Date.now()), 't'), 10);
25047
25098
  this.localeChanged();
25048
25099
  this.yearAndMonthChanged(this.year, this.month);
25049
25100
  }
@@ -25517,7 +25568,7 @@ __decorate([n$4({ type: Array })], RangeDatepickerCalendar.prototype, "dayNamesO
25517
25568
  __decorate([n$4({ type: Array })], RangeDatepickerCalendar.prototype, "daysOfMonth", void 0);
25518
25569
  AuroLibraryRuntimeUtils$5$1.prototype.registerComponent('wc-range-datepicker-calendar', RangeDatepickerCalendar);
25519
25570
 
25520
- var styleCss$5$2 = i$6`.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}`;
25571
+ var styleCss$5$2 = i$6`.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}`;
25521
25572
 
25522
25573
  var colorCss$5$2 = i$6`: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}`;
25523
25574
 
@@ -25542,13 +25593,103 @@ class s{registerComponent(e,t){customElements.get(e)||customElements.define(e,cl
25542
25593
 
25543
25594
  var popoverVersion = '6.0.1';
25544
25595
 
25545
- /* 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 */
25596
+ /**
25597
+ * Single source of truth for parsing and matching blackout dates across the
25598
+ * datepicker. Both `auro-calendar` (memoized Set + `isDateBlackout`) and the
25599
+ * pre-`firstUpdated` fallback inside `auro-calendar-cell` route through these
25600
+ * helpers so the YYYY-MM-DD → seconds conversion and the merge-with-legacy
25601
+ * `disabledDays` rules are defined exactly once.
25602
+ */
25546
25603
 
25547
- const startOfDay$1 = (ms) => {
25548
- const date = new Date(ms);
25549
- date.setHours(0, 0, 0, 0);
25550
- return date.getTime();
25551
- };
25604
+ /**
25605
+ * Converts a `YYYY-MM-DD` ISO date string to a Unix timestamp (seconds)
25606
+ * representing local midnight on that calendar day. Returns `null` for
25607
+ * inputs that don't parse to a finite timestamp.
25608
+ *
25609
+ * Uses the `new Date(year, monthIndex, day)` constructor (NOT
25610
+ * `new Date(isoStr)`) so the result is local-midnight rather than UTC
25611
+ * midnight — required to keep the calendar grid aligned with the user's
25612
+ * local calendar day in negative-offset timezones.
25613
+ *
25614
+ * @param {string} isoStr - Date string in `YYYY-MM-DD` format.
25615
+ * @returns {number|null} Local-midnight Unix timestamp (seconds), or null.
25616
+ */
25617
+ function parseIsoToTimestamp(isoStr) {
25618
+ if (typeof isoStr !== 'string') {
25619
+ return null;
25620
+ }
25621
+ const parts = isoStr.split('-');
25622
+ if (parts.length !== 3) {
25623
+ return null;
25624
+ }
25625
+ const year = parseInt(parts[0], 10);
25626
+ const month = parseInt(parts[1], 10);
25627
+ const day = parseInt(parts[2], 10);
25628
+ if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) {
25629
+ return null;
25630
+ }
25631
+ // Reject overflow values like "2024-13-40" — JS `new Date(year, month, day)`
25632
+ // silently normalizes those to a different calendar day, which would
25633
+ // disable the wrong date if we let the result through.
25634
+ if (month < 1 || month > 12 || day < 1 || day > 31) {
25635
+ return null;
25636
+ }
25637
+ const date = new Date(year, month - 1, day);
25638
+ // Guard the residual case where JS still rolls a value (e.g. Feb 30 → Mar 2).
25639
+ // After construction, getFullYear/getMonth/getDate should match the inputs.
25640
+ if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) {
25641
+ return null;
25642
+ }
25643
+ const ts = Math.floor(date.getTime() / 1000);
25644
+ return Number.isFinite(ts) ? ts : null;
25645
+ }
25646
+
25647
+ /**
25648
+ * Builds a `Set<number>` of seconds-since-epoch timestamps covering both the
25649
+ * legacy `disabledDays` (already-numeric) array and the ISO `blackoutDates`
25650
+ * array. Use this for O(1) membership checks in hot paths.
25651
+ *
25652
+ * @param {Array<string|number>|undefined} disabledDays - Legacy timestamp array.
25653
+ * @param {Array<string>|undefined} blackoutDates - ISO `YYYY-MM-DD` array.
25654
+ * @returns {Set<number>}
25655
+ */
25656
+ function buildBlackoutSet(disabledDays, blackoutDates) {
25657
+ const set = new Set();
25658
+ if (Array.isArray(disabledDays)) {
25659
+ for (const day of disabledDays) {
25660
+ const ts = parseInt(day, 10);
25661
+ if (Number.isFinite(ts)) {
25662
+ set.add(ts);
25663
+ }
25664
+ }
25665
+ }
25666
+ if (Array.isArray(blackoutDates)) {
25667
+ for (const isoStr of blackoutDates) {
25668
+ const ts = parseIsoToTimestamp(isoStr);
25669
+ if (ts !== null) {
25670
+ set.add(ts);
25671
+ }
25672
+ }
25673
+ }
25674
+ return set;
25675
+ }
25676
+
25677
+ /**
25678
+ * One-shot membership test for a single timestamp against both blackout
25679
+ * sources. Allocates a Set on each call; only use this in cold paths
25680
+ * (e.g. the pre-`firstUpdated` cell fallback). Hot paths should hold the
25681
+ * Set returned from `buildBlackoutSet` and `.has(ts)` directly.
25682
+ *
25683
+ * @param {number} dateTs - Unix timestamp (seconds) to test.
25684
+ * @param {Array<string|number>|undefined} disabledDays - Legacy timestamp array.
25685
+ * @param {Array<string>|undefined} blackoutDates - ISO `YYYY-MM-DD` array.
25686
+ * @returns {boolean}
25687
+ */
25688
+ function isBlackoutTimestamp(dateTs, disabledDays, blackoutDates) {
25689
+ return buildBlackoutSet(disabledDays, blackoutDates).has(dateTs);
25690
+ }
25691
+
25692
+ /* 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 */
25552
25693
 
25553
25694
  class AuroCalendarCell extends i$3 {
25554
25695
  constructor() {
@@ -25596,6 +25737,14 @@ class AuroCalendarCell extends i$3 {
25596
25737
  type: Boolean,
25597
25738
  reflect: true
25598
25739
  },
25740
+ /**
25741
+ * @deprecated Propagated from the legacy `auro-calendar.disabledDays`
25742
+ * Unix-timestamp array. The cell honors it for backward compatibility
25743
+ * (see the divergence-check fallback inside `isBlackout`), but
25744
+ * consumers should migrate to `auro-datepicker.blackoutDates`
25745
+ * (YYYY-MM-DD ISO strings). The calendar emits a one-time
25746
+ * deprecation warning the first time a non-empty value is observed.
25747
+ */
25599
25748
  disabledDays: { type: Array },
25600
25749
  isCurrentDate: { type: Boolean },
25601
25750
  locale: { type: String },
@@ -25641,8 +25790,8 @@ class AuroCalendarCell extends i$3 {
25641
25790
  const parsedDateTo = parseInt(dateTo, 10);
25642
25791
 
25643
25792
  if (day) {
25644
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
25645
- const returnTimestamp = startOfDay$1(parsedDateTo * 1000) / 1000;
25793
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
25794
+ const returnTimestamp = new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000;
25646
25795
 
25647
25796
  if (day.date === departTimestamp || day.date === returnTimestamp) {
25648
25797
  this.selected = true;
@@ -25726,27 +25875,33 @@ class AuroCalendarCell extends i$3 {
25726
25875
  return false;
25727
25876
  }
25728
25877
 
25729
- // Check against disabledDays timestamps (legacy path)
25730
- if (Array.isArray(this.disabledDays) && this.disabledDays.length > 0 &&
25731
- (this.disabledDays.findIndex(dd => parseInt(dd, 10) === this.day.date) !== -1)) {
25732
- return true;
25733
- }
25734
-
25735
- // Check against blackoutDates (ISO format YYYY-MM-DD) on the datepicker
25736
- const blackoutDates = this.datepicker?.blackoutDates;
25737
-
25738
- if (Array.isArray(blackoutDates) && blackoutDates.length > 0) {
25739
- const date = new Date(this.day.date * 1000);
25740
- const yyyy = date.getFullYear();
25741
- const mm = String(date.getMonth() + 1).padStart(2, '0');
25742
- const dd = String(date.getDate()).padStart(2, '0');
25743
- const cellDate = `${yyyy}-${mm}-${dd}`;
25744
- if (blackoutDates.includes(cellDate)) {
25878
+ // Delegate to the calendar's memoized blackout Set for O(1) lookup
25879
+ // (instead of rescanning disabledDays + blackoutDates per render). The
25880
+ // Set is rebuilt only when either source array reference changes — see
25881
+ // auro-calendar.js#_getBlackoutSet.
25882
+ if (this.calendar && typeof this.calendar._getBlackoutSet === 'function') {
25883
+ if (this.calendar._getBlackoutSet().has(this.day.date)) {
25745
25884
  return true;
25746
25885
  }
25886
+ // If the cell's local disabledDays diverged from the calendar's (a
25887
+ // consumer or test mutated cell.disabledDays directly), the Set does
25888
+ // not reflect that addition — fall through to the per-cell scan only
25889
+ // when the reference no longer matches. Production data flow keeps
25890
+ // these identical, so this branch stays cold. Guarded with
25891
+ // Array.isArray to match `_getBlackoutSet`'s contract: non-array
25892
+ // values are treated as empty rather than crashing on `.findIndex`.
25893
+ if (Array.isArray(this.disabledDays) && this.disabledDays !== this.calendar.disabledDays && this.disabledDays.length > 0) {
25894
+ if (this.disabledDays.findIndex((dd) => parseInt(dd, 10) === this.day.date) !== -1) {
25895
+ return true;
25896
+ }
25897
+ }
25898
+ return false;
25747
25899
  }
25748
25900
 
25749
- return false;
25901
+ // Pre-firstUpdated fallback — the cell may render once before the
25902
+ // ancestor calendar is wired up. Routes through the shared
25903
+ // blackoutUtils helper so the parsing rules stay in one place.
25904
+ return isBlackoutTimestamp(this.day.date, this.disabledDays, this.datepicker?.blackoutDates);
25750
25905
  }
25751
25906
 
25752
25907
  /**
@@ -25852,12 +26007,12 @@ class AuroCalendarCell extends i$3 {
25852
26007
  const parsedDateFrom = Number.parseInt(this.dateFrom, 10);
25853
26008
  if (!Number.isFinite(parsedDateFrom)) return null;
25854
26009
 
25855
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
26010
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
25856
26011
  const dayDate = this.day.date;
25857
26012
 
25858
26013
  const parsedDateTo = Number.parseInt(this.dateTo, 10);
25859
26014
  const hasDateTo = Number.isFinite(parsedDateTo);
25860
- const returnTimestamp = hasDateTo ? startOfDay$1(parsedDateTo * 1000) / 1000 : null;
26015
+ const returnTimestamp = hasDateTo ? new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000 : null;
25861
26016
 
25862
26017
  if (dayDate === departTimestamp) return this.datepicker.rangeLabelStart || 'range start';
25863
26018
 
@@ -25867,7 +26022,9 @@ class AuroCalendarCell extends i$3 {
25867
26022
 
25868
26023
  if (hasDateTo && dayDate > departTimestamp && dayDate < returnTimestamp) return this.datepicker.rangeLabelInRange || 'in range';
25869
26024
 
25870
- // After start date, no end date yet, or after end date
26025
+ if (!hasDateTo && dayDate > departTimestamp) return this.datepicker.rangeLabelEndPreview || 'previewing range end';
26026
+
26027
+ // After end date when both dateFrom and dateTo are set.
25871
26028
  return this.datepicker.rangeLabelAfterRange || 'after range';
25872
26029
  }
25873
26030
 
@@ -25880,7 +26037,7 @@ class AuroCalendarCell extends i$3 {
25880
26037
  */
25881
26038
  isDepartDate(day, dateFrom) {
25882
26039
  const parsedDateFrom = parseInt(dateFrom, 10);
25883
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
26040
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
25884
26041
 
25885
26042
  return this.selected && day.date === departTimestamp;
25886
26043
  }
@@ -25895,7 +26052,7 @@ class AuroCalendarCell extends i$3 {
25895
26052
  */
25896
26053
  isReturnDate(day, dateFrom, dateTo) {
25897
26054
  const parsedDateTo = parseInt(dateTo, 10);
25898
- const returnTimestamp = startOfDay$1(parsedDateTo * 1000) / 1000;
26055
+ const returnTimestamp = new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000;
25899
26056
 
25900
26057
  return this.selected && day.date === returnTimestamp && dateFrom;
25901
26058
  }
@@ -26059,6 +26216,7 @@ class AuroCalendarCell extends i$3 {
26059
26216
  setTimeout(() => this.firstUpdated(), 0);
26060
26217
  return;
26061
26218
  }
26219
+ this.calendar = calendar;
26062
26220
  this.datepicker = calendar.datepicker;
26063
26221
  this._slotContentHandler = () => {
26064
26222
  this.handleSlotContent();
@@ -26116,15 +26274,28 @@ class AuroCalendarCell extends i$3 {
26116
26274
  this._cachedButton = this.shadowRoot.querySelector('button.day');
26117
26275
  });
26118
26276
 
26119
- // Update host-level aria attributes for ariaActiveDescendantElement.
26277
+ // Keep the host's gridcell aria attributes in sync with the day data.
26120
26278
  this.updateHostAria();
26121
26279
  }
26122
26280
 
26123
26281
  // Update host aria when selection changes (aria-selected, range labels)
26124
- if (properties.has('dateFrom') || properties.has('dateTo') || properties.has('selected')) {
26282
+ // or when isCurrentDate flips (aria-current).
26283
+ if (properties.has('dateFrom') || properties.has('dateTo') || properties.has('selected') || properties.has('isCurrentDate')) {
26125
26284
  this.updateHostAria();
26126
26285
  }
26127
26286
 
26287
+ // When the rendered range shifts (month nav, min/max change), a cell
26288
+ // host may be re-rendered for a new date that is now out-of-range —
26289
+ // but its imperatively-set `active` flag and `activeCell` ring class
26290
+ // from the previous date persist because setActiveCell only iterates
26291
+ // focusable (in-range) cells when clearing the prior active state.
26292
+ // Drop the active state here so the disabled cell isn't left visually
26293
+ // ringed.
26294
+ if ((properties.has('day') || properties.has('min') || properties.has('max')) &&
26295
+ this.active && this.isOutOfRange(this.day, this.min, this.max)) {
26296
+ this.clearActive();
26297
+ }
26298
+
26128
26299
  // Configure popover when it first becomes rendered
26129
26300
  if (properties.has('hasPopoverContent') && this.hasPopoverContent) {
26130
26301
  this.updateComplete.then(() => this.configurePopover());
@@ -26132,8 +26303,8 @@ class AuroCalendarCell extends i$3 {
26132
26303
  }
26133
26304
 
26134
26305
  /**
26135
- * Updates ARIA attributes on the host element so that
26136
- * ariaActiveDescendantElement can expose cell info to the SR.
26306
+ * Sets host-level ARIA so each cell exposes its date, selection state,
26307
+ * and blackout status to assistive tech browsing the month grid.
26137
26308
  * @private
26138
26309
  * @returns {void}
26139
26310
  */
@@ -26142,16 +26313,27 @@ class AuroCalendarCell extends i$3 {
26142
26313
 
26143
26314
  const outOfRange = this.isOutOfRange(this.day, this.min, this.max);
26144
26315
  if (outOfRange) {
26316
+ // Strip every aria attribute the in-range branch may have set on a
26317
+ // previous render — if a cell flips from in-range to out-of-range
26318
+ // (calendar shifts months, minDate/maxDate change, etc.).
26145
26319
  this.removeAttribute('role');
26146
26320
  this.removeAttribute('aria-label');
26321
+ this.removeAttribute('aria-current');
26322
+ this.removeAttribute('aria-selected');
26323
+ this.removeAttribute('aria-disabled');
26147
26324
  return;
26148
26325
  }
26149
26326
 
26150
- // The host acts as the gridcell for ariaActiveDescendantElement.
26151
26327
  this.setAttribute('role', 'gridcell');
26152
26328
  this.setAttribute('aria-label', this.getAriaLabel());
26153
26329
  this.setAttribute('aria-selected', this.selected ? 'true' : 'false');
26154
26330
 
26331
+ if (this.isCurrentDate) {
26332
+ this.setAttribute('aria-current', 'date');
26333
+ } else {
26334
+ this.removeAttribute('aria-current');
26335
+ }
26336
+
26155
26337
  if (this.isBlackout()) {
26156
26338
  this.setAttribute('aria-disabled', 'true');
26157
26339
  } else {
@@ -26166,7 +26348,7 @@ class AuroCalendarCell extends i$3 {
26166
26348
  * @returns {void}
26167
26349
  */
26168
26350
  focusButton() {
26169
- const button = this._cachedButton || this.shadowRoot.querySelector('button:not([aria-hidden])');
26351
+ const button = this._cachedButton || this.shadowRoot.querySelector('button:not([disabled])');
26170
26352
  if (button) {
26171
26353
  button.focus({ focusVisible: true });
26172
26354
  }
@@ -26174,10 +26356,22 @@ class AuroCalendarCell extends i$3 {
26174
26356
 
26175
26357
  /**
26176
26358
  * Imperatively marks this cell as active without triggering a Lit re-render.
26177
- * Note: buttons stay tabindex="-1" because the grid uses aria-activedescendant.
26359
+ * Buttons stay tabindex="-1" because DOM focus stays on the grid wrapper
26360
+ * arrow keys move the active cell imperatively and the live region carries
26361
+ * the SR announcement.
26362
+ *
26363
+ * Refuses to activate out-of-range cells: those are aria-hidden, have no
26364
+ * click/focus handlers, and are filtered out of `getFocusableCells`. The
26365
+ * active class showing on a disabled cell would be visually misleading,
26366
+ * so this guard is the single source of truth across every code path
26367
+ * that might call setActive (keyboard nav, focus restore, cell click).
26178
26368
  * @returns {void}
26179
26369
  */
26180
26370
  setActive() {
26371
+ if (this.isOutOfRange(this.day, this.min, this.max)) {
26372
+ return;
26373
+ }
26374
+
26181
26375
  this.active = true;
26182
26376
 
26183
26377
  // Show the popover when this cell becomes active via keyboard navigation.
@@ -26216,10 +26410,13 @@ class AuroCalendarCell extends i$3 {
26216
26410
  if (!btn || !this.day) return;
26217
26411
 
26218
26412
  const dayDate = this.day.date;
26219
- const departTimestamp = startOfDay$1(dateFrom * 1000) / 1000;
26413
+ const departTimestamp = new Date(dateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
26220
26414
  const isInRange = dayDate > departTimestamp && dayDate < hoveredDate;
26221
- const isLastHovered = dayDate === hoveredDate && hoveredDate > departTimestamp;
26222
- const isDepartWithPreview = dayDate === departTimestamp && hoveredDate > departTimestamp;
26415
+ // `>=` so hovering the depart cell itself (a same-day round-trip
26416
+ // preview) still surfaces a visual cue: the depart cell receives both
26417
+ // rangeDepartDate and lastHoveredDate.
26418
+ const isLastHovered = dayDate === hoveredDate && hoveredDate >= departTimestamp;
26419
+ const isDepartWithPreview = dayDate === departTimestamp && hoveredDate >= departTimestamp;
26223
26420
 
26224
26421
  btn.classList.toggle('inRange', isInRange);
26225
26422
  btn.classList.toggle('lastHoveredDate', isLastHovered);
@@ -26277,7 +26474,6 @@ class AuroCalendarCell extends i$3 {
26277
26474
  @focus="${outOfRange ? undefined : this.handleFocus}"
26278
26475
  class="${e$2(buttonClasses)}"
26279
26476
  ?disabled="${outOfRange}"
26280
- aria-hidden="${outOfRange ? 'true' : A$7}"
26281
26477
  tabindex="-1">
26282
26478
  <div class="buttonWrapper" aria-hidden="true">
26283
26479
  <div class="currentDayMarker">${this.day?.title || A$7}</div>
@@ -26988,7 +27184,7 @@ class CalendarUtilities {
26988
27184
 
26989
27185
  var colorCss$4$2 = i$6`#headerContainer{box-shadow:var(--ds-auro-dropdownbib-header-boxshadow-color)}#footerContainer{background-color:var(--ds-auro-dropdownbib-footer-container-color)}`;
26990
27186
 
26991
- var styleCss$4$3 = i$6`#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)}`;
27187
+ var styleCss$4$3 = i$6`#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}:host([isfullscreen]) #bibTemplate{max-height:100dvh}:host([isfullscreen]) #bodyContainer{margin-top:var(--ds-size-100, 0.5rem)}#footerContainer{padding:var(--ds-size-200, 1rem)}`;
26992
27188
 
26993
27189
  var tokenCss$4 = i$6`: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)}`;
26994
27190
 
@@ -27383,7 +27579,7 @@ let AuroBibtemplate$3 = class AuroBibtemplate extends i$3 {
27383
27579
  }
27384
27580
  };
27385
27581
 
27386
- var formkitVersion$2$1 = '202606231948';
27582
+ var formkitVersion$2$1 = '202607010104';
27387
27583
 
27388
27584
  let l$1$2 = class l{generateElementName(t,e){let o=t;return o+="-",o+=e.replace(/[.]/g,"_"),o}generateTag(o,s,a){const r=this.generateElementName(o,s),i=i$2`${s$3(r)}`;return customElements.get(r)||customElements.define(r,class extends a{}),i}};let d$1$2 = 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$2 = 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$3=i$6`: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}
27389
27585
  `,u$4$2=i$6`.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}}
@@ -27488,6 +27684,15 @@ class AuroCalendar extends RangeDatepicker {
27488
27684
  */
27489
27685
  this.activeCellDate = null;
27490
27686
 
27687
+ /**
27688
+ * Cached reference to the active cell host. Set by setActiveCell and
27689
+ * refreshed by scrollToActiveCell when its cache check misses (stale
27690
+ * or missing). Lets scrollToActiveCell skip a full cell scan on each
27691
+ * arrow key.
27692
+ * @private
27693
+ */
27694
+ this._activeCell = null;
27695
+
27491
27696
  /**
27492
27697
  * Whether the #calendarGrid wrapper currently has focus.
27493
27698
  * Used to determine whether the visualFocus ring should be shown.
@@ -27506,7 +27711,11 @@ class AuroCalendar extends RangeDatepicker {
27506
27711
  this.calendarRangeMonths = null;
27507
27712
 
27508
27713
  /**
27509
- * Legacy array of disabled-date timestamps.
27714
+ * @deprecated Use `auro-datepicker.blackoutDates` (an array of
27715
+ * `YYYY-MM-DD` ISO strings) instead. This legacy array of Unix
27716
+ * timestamps is still honored for backward compatibility but emits a
27717
+ * one-time `console.debug` the first time a non-empty value is observed.
27718
+ * Support will be removed in a future major release.
27510
27719
  * @private
27511
27720
  */
27512
27721
  this.disabledDays = [];
@@ -27763,17 +27972,44 @@ class AuroCalendar extends RangeDatepicker {
27763
27972
  * @returns {void}
27764
27973
  */
27765
27974
  updateActiveCellForVisibleMonth() {
27766
- // Use double-rAF to ensure child month/cell components have fully
27767
- // rendered and cached their button references before we set tabindex.
27768
- requestAnimationFrame(() => {
27769
- requestAnimationFrame(() => {
27770
- const newDate = this.computeActiveDate({ skipDateFrom: true });
27975
+ this._afterMonthRender(() => {
27976
+ const newDate = this.computeActiveDate({ skipDateFrom: true });
27771
27977
 
27772
- if (newDate !== null && newDate !== undefined) {
27773
- this.activeCellDate = newDate;
27774
- this.setActiveCell(this.activeCellDate);
27775
- }
27776
- });
27978
+ if (newDate !== null && newDate !== undefined) {
27979
+ this.activeCellDate = newDate;
27980
+ this.setActiveCell(this.activeCellDate);
27981
+ }
27982
+ });
27983
+ }
27984
+
27985
+ /**
27986
+ * Schedules `callback` two animation frames out, giving the child
27987
+ * `auro-formkit-calendar-month` and `auro-formkit-calendar-cell` elements
27988
+ * a full render-and-paint cycle to settle before the callback reads or
27989
+ * mutates DOM.
27990
+ *
27991
+ * Why two frames, not one:
27992
+ * 1. Lit batches property updates and renders in a microtask, so frame N
27993
+ * schedules the render but the new DOM may not be painted yet.
27994
+ * 2. Cells re-cache `_cachedButton` inside their own `updateComplete.then`,
27995
+ * which also lands a tick later. Reading buttons from frame N+1
27996
+ * (after both renders + cache refresh have flushed) reliably hits the
27997
+ * new month's cells.
27998
+ *
27999
+ * Used by every code path that calls `handleNextMonth`/`handlePrevMonth`
28000
+ * and then needs to inspect the freshly-rendered cells (cross-month
28001
+ * keyboard nav, boundary events, `updateActiveCellForVisibleMonth`).
28002
+ * Do NOT collapse to a single rAF — it intermittently lands before
28003
+ * `_cachedButton` is refreshed, which silently breaks focus restoration
28004
+ * and `setActiveCell` lookups.
28005
+ * @private
28006
+ * @param {() => void} callback - Runs once after the month re-render and
28007
+ * the cells' button caches have refreshed.
28008
+ * @returns {void}
28009
+ */
28010
+ _afterMonthRender(callback) {
28011
+ requestAnimationFrame(() => {
28012
+ requestAnimationFrame(callback);
27777
28013
  });
27778
28014
  }
27779
28015
 
@@ -27891,6 +28127,47 @@ class AuroCalendar extends RangeDatepicker {
27891
28127
  return Array.from(this.shadowRoot.querySelectorAll('auro-formkit-calendar-month'));
27892
28128
  }
27893
28129
 
28130
+ /**
28131
+ * Picks the focusable cell whose date is closest to targetTs. Used as a
28132
+ * fallback after a month-boundary nav when the exact target date isn't
28133
+ * focusable — typically because the month re-render lagged or the date
28134
+ * was filtered out by isOutOfRange. When two cells are equidistant, the
28135
+ * navigation direction breaks the tie so the user moves the way they
28136
+ * pressed (forward → later cell, backward → earlier cell).
28137
+ * @private
28138
+ * @param {Array} cells - Focusable cells from getAllFocusableCells.
28139
+ * @param {Number} targetTs - Desired Unix timestamp (seconds).
28140
+ * @param {'next'|'prev'} direction - Navigation direction.
28141
+ * @returns {Object|null} The nearest cell, or null when cells is empty.
28142
+ */
28143
+ pickNearestCell(cells, targetTs, direction) {
28144
+ if (!cells.length) {
28145
+ return null;
28146
+ }
28147
+ const forward = direction === 'next';
28148
+ let best = null;
28149
+ let bestDelta = Infinity;
28150
+ cells.forEach((cell) => {
28151
+ if (!cell.day) {
28152
+ return;
28153
+ }
28154
+ const distance = Math.abs(cell.day.date - targetTs);
28155
+ if (distance < bestDelta) {
28156
+ best = cell;
28157
+ bestDelta = distance;
28158
+ return;
28159
+ }
28160
+ if (distance === bestDelta && best) {
28161
+ if (forward && cell.day.date > best.day.date) {
28162
+ best = cell;
28163
+ } else if (!forward && cell.day.date < best.day.date) {
28164
+ best = cell;
28165
+ }
28166
+ }
28167
+ });
28168
+ return best;
28169
+ }
28170
+
27894
28171
  /**
27895
28172
  * Gets all focusable cells across all rendered months.
27896
28173
  * @private
@@ -27907,9 +28184,9 @@ class AuroCalendar extends RangeDatepicker {
27907
28184
 
27908
28185
  /**
27909
28186
  * Sets the active cell across all months. Only one cell has tabindex="0" at a time.
27910
- * Uses imperative DOM manipulation — no Lit re-render triggered.
27911
- * Also updates ariaActiveDescendantElement on the grid wrapper so
27912
- * screen readers announce the active cell without moving DOM focus.
28187
+ * Uses imperative DOM manipulation — no Lit re-render triggered. DOM focus
28188
+ * stays on the grid wrapper; the live region (see getOrCreateLiveRegion)
28189
+ * is what announces the active cell to assistive tech.
27913
28190
  * @param {Number} date - Unix timestamp of the cell to activate.
27914
28191
  * @returns {void}
27915
28192
  */
@@ -27927,6 +28204,9 @@ class AuroCalendar extends RangeDatepicker {
27927
28204
  });
27928
28205
 
27929
28206
  this.activeCellDate = date;
28207
+ // Cache so scrollToActiveCell can scroll without re-querying all cells
28208
+ // on every arrow keypress.
28209
+ this._activeCell = newActiveCell;
27930
28210
 
27931
28211
  // Apply activeCell ring only when the grid currently has focus.
27932
28212
  if (newActiveCell && this._gridHasFocus) {
@@ -27958,10 +28238,23 @@ class AuroCalendar extends RangeDatepicker {
27958
28238
  /**
27959
28239
  * Shows the activeCell ring when the grid gains focus.
27960
28240
  * @private
28241
+ * @param {FocusEvent} [event] - The focusin event.
27961
28242
  * @returns {void}
27962
28243
  */
27963
- handleGridFocusIn() {
28244
+ handleGridFocusIn(event) {
27964
28245
  this._gridHasFocus = true;
28246
+
28247
+ // Only apply the activeCell ring when the grid wrapper itself receives focus
28248
+ // (Tab/programmatic). When focus moves into a cell button via mousedown,
28249
+ // event.target is the cell descendant — skip the ring here. The subsequent
28250
+ // click handler calls setActiveCell on the clicked cell, which applies the
28251
+ // ring there. Without this guard, mousedown briefly flashes the ring on the
28252
+ // previously-active cell (e.g. the 1st-of-month set by month navigation
28253
+ // when the grid was not focused).
28254
+ if (event && event.target !== event.currentTarget) {
28255
+ return;
28256
+ }
28257
+
27965
28258
  const activeCell = this.getAllFocusableCells().find((cell) => cell.active);
27966
28259
  if (activeCell) {
27967
28260
  const btn = activeCell._cachedButton || activeCell.shadowRoot.querySelector('button.day');
@@ -27990,6 +28283,65 @@ class AuroCalendar extends RangeDatepicker {
27990
28283
  this.clearRangePreview();
27991
28284
  }
27992
28285
 
28286
+ /**
28287
+ * Returns a memoized Set of blackout timestamps (seconds) drawn from both
28288
+ * the legacy `disabledDays` array and the datepicker's ISO `blackoutDates`.
28289
+ * The cache invalidates when either source array's reference changes, which
28290
+ * matches Lit's own reactive identity semantics for array properties.
28291
+ * @private
28292
+ * @returns {Set<Number>}
28293
+ */
28294
+ _getBlackoutSet() {
28295
+ // Normalize non-array values to a stable `null` sentinel rather than a
28296
+ // fresh `[]` per call — otherwise the reference-identity cache key
28297
+ // (`_cachedBlackoutDisabledDays === disabledDays`) never matches on
28298
+ // subsequent calls and the Set rebuilds every time. `buildBlackoutSet`
28299
+ // already treats null/non-array as "no legacy disabledDays" via its
28300
+ // own Array.isArray gate.
28301
+ const disabledDays = Array.isArray(this.disabledDays) ? this.disabledDays : null;
28302
+ const blackoutDates = this.datepicker?.blackoutDates;
28303
+ if (this._blackoutSet &&
28304
+ this._cachedBlackoutDisabledDays === disabledDays &&
28305
+ this._cachedBlackoutDates === blackoutDates) {
28306
+ return this._blackoutSet;
28307
+ }
28308
+
28309
+ if (disabledDays && disabledDays.length > 0) {
28310
+ this._warnDisabledDaysDeprecated();
28311
+ }
28312
+
28313
+ this._blackoutSet = buildBlackoutSet(disabledDays, blackoutDates);
28314
+ this._cachedBlackoutDisabledDays = disabledDays;
28315
+ this._cachedBlackoutDates = blackoutDates;
28316
+ return this._blackoutSet;
28317
+ }
28318
+
28319
+ /**
28320
+ * Per-class flag that gates the `disabledDays` deprecation warning so it
28321
+ * fires exactly once per page no matter how many calendars or rebuild
28322
+ * cycles encounter the legacy array.
28323
+ * @private
28324
+ */
28325
+ static _warnedDisabledDaysDeprecation = false;
28326
+
28327
+ /**
28328
+ * One-time `console.debug` directing consumers from the legacy
28329
+ * `disabledDays` Unix-timestamp API to the ISO `blackoutDates` API. Fires
28330
+ * the first time `_getBlackoutSet` rebuilds from a non-empty
28331
+ * `disabledDays`; subsequent calls (on this or any other AuroCalendar
28332
+ * instance on the page) are silent.
28333
+ * @private
28334
+ * @returns {void}
28335
+ */
28336
+ _warnDisabledDaysDeprecated() {
28337
+ if (AuroCalendar._warnedDisabledDaysDeprecation) {
28338
+ return;
28339
+ }
28340
+ AuroCalendar._warnedDisabledDaysDeprecation = true;
28341
+ // eslint-disable-next-line no-console
28342
+ 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.');
28343
+ }
28344
+
27993
28345
  /**
27994
28346
  * Computes the initial active date from data properties alone — no DOM required.
27995
28347
  * Priority:
@@ -28034,21 +28386,10 @@ class AuroCalendar extends RangeDatepicker {
28034
28386
  const minTs = Number.isFinite(rawMin) ? rawMin : -Infinity;
28035
28387
  const maxTs = Number.isFinite(rawMax) ? rawMax : Infinity;
28036
28388
 
28037
- // Build a Set of blackout timestamps for O(1) lookup.
28038
- const blackoutSet = new Set(this.disabledDays.map((day) => parseInt(day, 10)));
28039
-
28040
- // Also include ISO-format blackoutDates from the datepicker if available.
28041
- // Parse YYYY-MM-DD as local date to avoid UTC shift issues.
28042
- const isoBlackouts = this.datepicker?.blackoutDates;
28043
- if (Array.isArray(isoBlackouts)) {
28044
- for (const isoStr of isoBlackouts) {
28045
- const parts = isoStr.split('-');
28046
- const ts = Math.floor(new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10)).getTime() / 1000);
28047
- if (Number.isFinite(ts)) {
28048
- blackoutSet.add(ts);
28049
- }
28050
- }
28051
- }
28389
+ // Build a Set of blackout timestamps for O(1) lookup. Memoized by the
28390
+ // identity of the source arrays so rapid month nav doesn't rebuild the
28391
+ // Set (and re-parse every ISO string) on every keypress.
28392
+ const blackoutSet = this._getBlackoutSet();
28052
28393
 
28053
28394
  /**
28054
28395
  * A date (unix timestamp in seconds, midnight-aligned) is "enabled" when
@@ -28244,8 +28585,8 @@ class AuroCalendar extends RangeDatepicker {
28244
28585
 
28245
28586
  /**
28246
28587
  * Handles arrow key navigation on the calendar grid wrapper.
28247
- * Focus stays on the grid wrapper; only ariaActiveDescendantElement
28248
- * and the visual active-cell indicator change.
28588
+ * Focus stays on the grid wrapper; only the visual active-cell indicator
28589
+ * changes. The live region announces the new active cell.
28249
28590
  * @private
28250
28591
  * @param {KeyboardEvent} event - The keyboard event.
28251
28592
  * @returns {void}
@@ -28310,21 +28651,24 @@ class AuroCalendar extends RangeDatepicker {
28310
28651
  } else {
28311
28652
  this.handlePrevMonth({ skipActiveUpdate: true });
28312
28653
  }
28313
- requestAnimationFrame(() => {
28314
- requestAnimationFrame(() => {
28315
- const cells = this.getAllFocusableCells();
28316
- const target = cells.find((cell) => cell.day && cell.day.date === targetTs);
28317
- if (target) {
28318
- this.setActiveCell(target.day.date);
28319
- this.handleCellFocused({ detail: { date: target.day.date } });
28320
- } else if (cells.length > 0) {
28321
- const fallback = navDir === 'next' ? cells[cells.length - 1] : cells[0];
28654
+ this._afterMonthRender(() => {
28655
+ const cells = this.getAllFocusableCells();
28656
+ const target = cells.find((cell) => cell.day && cell.day.date === targetTs);
28657
+ if (target) {
28658
+ this.setActiveCell(target.day.date);
28659
+ this.handleCellFocused({ detail: { date: target.day.date } });
28660
+ } else {
28661
+ const fallback = this.pickNearestCell(cells, targetTs, navDir);
28662
+ if (fallback) {
28322
28663
  this.setActiveCell(fallback.day.date);
28323
28664
  this.handleCellFocused({ detail: { date: fallback.day.date } });
28324
28665
  }
28325
- // Re-focus grid wrapper after month change re-render
28326
- this.focusActiveCell();
28327
- });
28666
+ }
28667
+ // Scroll AFTER the cross-month setActiveCell so the freshly
28668
+ // activated cell is what gets scrolled into view.
28669
+ this.scrollToActiveCell();
28670
+ // Re-focus grid wrapper after month change re-render
28671
+ this.focusActiveCell();
28328
28672
  });
28329
28673
  }
28330
28674
  }
@@ -28350,26 +28694,23 @@ class AuroCalendar extends RangeDatepicker {
28350
28694
  } else {
28351
28695
  this.handlePrevMonth({ skipActiveUpdate: true });
28352
28696
  }
28353
- requestAnimationFrame(() => {
28354
- requestAnimationFrame(() => {
28355
- const cells = this.getAllFocusableCells();
28356
- const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
28357
- if (target) {
28358
- this.setActiveCell(target.day.date);
28359
- this.handleCellFocused({ detail: { date: target.day.date } });
28360
- } else if (cells.length > 0) {
28361
- let nearest = null;
28362
-
28363
- if (navDirection === 'next') {
28364
- [nearest] = cells;
28365
- } else {
28366
- nearest = cells[cells.length - 1];
28367
- }
28697
+ this._afterMonthRender(() => {
28698
+ const cells = this.getAllFocusableCells();
28699
+ const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
28700
+ if (target) {
28701
+ this.setActiveCell(target.day.date);
28702
+ this.handleCellFocused({ detail: { date: target.day.date } });
28703
+ } else {
28704
+ const nearest = this.pickNearestCell(cells, targetDate, navDirection);
28705
+ if (nearest) {
28368
28706
  this.setActiveCell(nearest.day.date);
28369
28707
  this.handleCellFocused({ detail: { date: nearest.day.date } });
28370
28708
  }
28371
- this.focusActiveCell();
28372
- });
28709
+ }
28710
+ // Scroll AFTER the cross-month setActiveCell so the freshly
28711
+ // activated cell is what gets scrolled into view.
28712
+ this.scrollToActiveCell();
28713
+ this.focusActiveCell();
28373
28714
  });
28374
28715
  }
28375
28716
  }
@@ -28403,6 +28744,8 @@ class AuroCalendar extends RangeDatepicker {
28403
28744
  const targetCell = allCells[targetIndex];
28404
28745
  this.setActiveCell(targetCell.day.date);
28405
28746
  this.scrollToActiveCell();
28747
+ // Match the cross-month branches: keep DOM focus on the grid wrapper
28748
+ // so subsequent arrow keys continue to land on this handler.
28406
28749
  this.focusActiveCell();
28407
28750
  } else if (direction === 'next' && this.showNextMonthBtn) {
28408
28751
  // Navigate to next month and focus the computed next date.
@@ -28419,19 +28762,22 @@ class AuroCalendar extends RangeDatepicker {
28419
28762
  }
28420
28763
 
28421
28764
  this.handleNextMonth({ skipActiveUpdate: true });
28422
- requestAnimationFrame(() => {
28423
- requestAnimationFrame(() => {
28424
- const cells = this.getAllFocusableCells();
28425
- const target = cells.find((cell) => cell.day && cell.day.date === nextTs);
28426
- if (target) {
28427
- this.setActiveCell(target.day.date);
28428
- this.focusActiveCell();
28429
- } else if (cells.length > 0) {
28430
- // Fallback: first cell of the last rendered month
28431
- this.setActiveCell(cells[cells.length - 1].day.date);
28432
- this.focusActiveCell();
28765
+ this._afterMonthRender(() => {
28766
+ const cells = this.getAllFocusableCells();
28767
+ const target = cells.find((cell) => cell.day && cell.day.date === nextTs);
28768
+ if (target) {
28769
+ this.setActiveCell(target.day.date);
28770
+ } else {
28771
+ // Same nearest-by-date fallback handleGridKeyDown uses — direct
28772
+ // `cells[length - 1]` would land on the end of the new month,
28773
+ // far from the user's intended `nextTs`.
28774
+ const fallback = this.pickNearestCell(cells, nextTs, 'next');
28775
+ if (fallback) {
28776
+ this.setActiveCell(fallback.day.date);
28433
28777
  }
28434
- });
28778
+ }
28779
+ this.scrollToActiveCell();
28780
+ this.focusActiveCell();
28435
28781
  });
28436
28782
  } else if (direction === 'prev' && this.showPrevMonthBtn) {
28437
28783
  // Navigate to previous month and focus the computed previous date.
@@ -28445,19 +28791,22 @@ class AuroCalendar extends RangeDatepicker {
28445
28791
  }
28446
28792
 
28447
28793
  this.handlePrevMonth({ skipActiveUpdate: true });
28448
- requestAnimationFrame(() => {
28449
- requestAnimationFrame(() => {
28450
- const cells = this.getAllFocusableCells();
28451
- const target = cells.find((cell) => cell.day && cell.day.date === prevTs);
28452
- if (target) {
28453
- this.setActiveCell(target.day.date);
28454
- this.focusActiveCell();
28455
- } else if (cells.length > 0) {
28456
- // Fallback: last cell of the first rendered month
28457
- this.setActiveCell(cells[0].day.date);
28458
- this.focusActiveCell();
28794
+ this._afterMonthRender(() => {
28795
+ const cells = this.getAllFocusableCells();
28796
+ const target = cells.find((cell) => cell.day && cell.day.date === prevTs);
28797
+ if (target) {
28798
+ this.setActiveCell(target.day.date);
28799
+ } else {
28800
+ // Same nearest-by-date fallback handleGridKeyDown uses — direct
28801
+ // `cells[0]` would land on the start of the previous month, far
28802
+ // from the user's intended `prevTs`.
28803
+ const fallback = this.pickNearestCell(cells, prevTs, 'prev');
28804
+ if (fallback) {
28805
+ this.setActiveCell(fallback.day.date);
28459
28806
  }
28460
- });
28807
+ }
28808
+ this.scrollToActiveCell();
28809
+ this.focusActiveCell();
28461
28810
  });
28462
28811
  }
28463
28812
  } else if (key === 'ArrowDown' || key === 'ArrowUp') {
@@ -28485,20 +28834,22 @@ class AuroCalendar extends RangeDatepicker {
28485
28834
  } else {
28486
28835
  this.handlePrevMonth({ skipActiveUpdate: true });
28487
28836
  }
28488
- requestAnimationFrame(() => {
28489
- requestAnimationFrame(() => {
28490
- const cells = this.getAllFocusableCells();
28491
- const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
28492
- if (target) {
28493
- this.setActiveCell(target.day.date);
28494
- this.focusActiveCell();
28495
- } else if (cells.length > 0) {
28496
- // Clamp to nearest focusable cell
28497
- const nearest = navDirection === 'next' ? cells[0] : cells[cells.length - 1];
28837
+ this._afterMonthRender(() => {
28838
+ const cells = this.getAllFocusableCells();
28839
+ const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
28840
+ if (target) {
28841
+ this.setActiveCell(target.day.date);
28842
+ } else {
28843
+ // Same nearest-by-date fallback handleGridKeyDown uses — the
28844
+ // old direction-based `cells[0]`/`cells[length-1]` clamp
28845
+ // could land 25+ days from the intended target.
28846
+ const nearest = this.pickNearestCell(cells, targetDate, navDirection);
28847
+ if (nearest) {
28498
28848
  this.setActiveCell(nearest.day.date);
28499
- this.focusActiveCell();
28500
28849
  }
28501
- });
28850
+ }
28851
+ this.scrollToActiveCell();
28852
+ this.focusActiveCell();
28502
28853
  });
28503
28854
  }
28504
28855
  }
@@ -28537,8 +28888,9 @@ class AuroCalendar extends RangeDatepicker {
28537
28888
  return;
28538
28889
  }
28539
28890
 
28540
- // With aria-activedescendant, the button no longer receives native focus,
28541
- // so we use the debounced live region for the full context announcement.
28891
+ // DOM focus stays on the grid wrapper while arrow keys move the active
28892
+ // cell, so cell buttons never receive native focus. The debounced live
28893
+ // region carries the full-context announcement instead.
28542
28894
  const announcement = this.buildFocusAnnouncement(date);
28543
28895
  this.announceFocusDebounced(announcement);
28544
28896
 
@@ -28608,10 +28960,10 @@ class AuroCalendar extends RangeDatepicker {
28608
28960
  return null;
28609
28961
  }
28610
28962
 
28611
- const departTs = startOfDay$2(parsedFrom * 1000) / 1000;
28963
+ const departTs = new Date(parsedFrom * 1000).setHours(0, 0, 0, 0) / 1000;
28612
28964
  const parsedTo = Number.parseInt(this.dateTo, 10);
28613
28965
  const hasTo = Number.isFinite(parsedTo);
28614
- const returnTs = hasTo ? startOfDay$2(parsedTo * 1000) / 1000 : null;
28966
+ const returnTs = hasTo ? new Date(parsedTo * 1000).setHours(0, 0, 0, 0) / 1000 : null;
28615
28967
 
28616
28968
  if (date === departTs) {
28617
28969
  return this.datepicker.rangeLabelStart || 'range start';
@@ -28625,36 +28977,22 @@ class AuroCalendar extends RangeDatepicker {
28625
28977
  if (hasTo && date > departTs && date < returnTs) {
28626
28978
  return this.datepicker.rangeLabelInRange || 'in range';
28627
28979
  }
28980
+ if (!hasTo && date > departTs) {
28981
+ return this.datepicker.rangeLabelEndPreview || 'previewing range end';
28982
+ }
28628
28983
  return this.datepicker.rangeLabelAfterRange || 'after range';
28629
28984
  }
28630
28985
 
28631
28986
  /**
28632
- * Checks whether a given date is a blackout date.
28987
+ * Checks whether a given date is a blackout date. Delegates to the
28988
+ * memoized `_getBlackoutSet` so the YYYY-MM-DD parsing and the
28989
+ * legacy/ISO merge rules live in exactly one place (see `blackoutUtils.js`).
28633
28990
  * @private
28634
28991
  * @param {Number} dateTs - Unix timestamp (seconds).
28635
28992
  * @returns {Boolean} True if the date is blacked out.
28636
28993
  */
28637
28994
  isDateBlackout(dateTs) {
28638
- // Check legacy disabledDays.
28639
- if (Array.isArray(this.disabledDays) && this.disabledDays.length > 0) {
28640
- if (this.disabledDays.findIndex((day) => parseInt(day, 10) === dateTs) !== -1) {
28641
- return true;
28642
- }
28643
- }
28644
-
28645
- // Check ISO blackoutDates.
28646
- const blackoutDates = this.datepicker?.blackoutDates;
28647
- if (Array.isArray(blackoutDates) && blackoutDates.length > 0) {
28648
- const date = new Date(dateTs * 1000);
28649
- const yyyy = date.getFullYear();
28650
- const mm = String(date.getMonth() + 1).padStart(2, '0');
28651
- const dd = String(date.getDate()).padStart(2, '0');
28652
- if (blackoutDates.includes(`${yyyy}-${mm}-${dd}`)) {
28653
- return true;
28654
- }
28655
- }
28656
-
28657
- return false;
28995
+ return this._getBlackoutSet().has(dateTs);
28658
28996
  }
28659
28997
 
28660
28998
  /**
@@ -28712,7 +29050,28 @@ class AuroCalendar extends RangeDatepicker {
28712
29050
  }
28713
29051
 
28714
29052
  /**
28715
- * Scrolls the calendar to ensure the month containing the active cell is visible.
29053
+ * Scrolls the calendar so the active cell is visible.
29054
+ *
29055
+ * Walks the flat tree (rendered, slot-aware) outward from the active
29056
+ * cell's button and calls `scrollBy` on every vertically-scrollable
29057
+ * ancestor by whatever delta still separates the cell from that
29058
+ * ancestor's viewport. Native `scrollIntoView` is not used because the
29059
+ * cell sits inside multiple nested scroll containers (the dropdown bib's
29060
+ * `<dialog>`, the bibtemplate's `#bodyContainer`) and the algorithm only
29061
+ * scrolls one of them on its own, leaving the cell short of the
29062
+ * viewport in mobile fullscreen.
29063
+ *
29064
+ * Uses `behavior: 'auto'` (the spec's universally-supported non-animated
29065
+ * value) so each `scrollBy` resolves synchronously and the next
29066
+ * iteration's `getBoundingClientRect` reads post-scroll positions
29067
+ * accurately. This also satisfies `prefers-reduced-motion` users — the
29068
+ * scroll containers do not set CSS `scroll-behavior: smooth`, so `auto`
29069
+ * is effectively instant.
29070
+ *
29071
+ * The active cell is looked up from the cache populated by
29072
+ * `setActiveCell`. On a cache miss (stale or absent) the cache is
29073
+ * refreshed from a single full scan so subsequent calls stay on the
29074
+ * fast path.
28716
29075
  * @private
28717
29076
  * @returns {void}
28718
29077
  */
@@ -28721,16 +29080,69 @@ class AuroCalendar extends RangeDatepicker {
28721
29080
  return;
28722
29081
  }
28723
29082
 
28724
- const date = new Date(this.activeCellDate * 1000);
28725
- const month = date.getMonth() + 1;
28726
- const year = date.getFullYear();
28727
- const selector = `#month-${month}-${year}`;
28728
- const monthElem = this.shadowRoot.querySelector(selector);
29083
+ // Prefer the cell cached by setActiveCell so arrow-key navigation does
29084
+ // not rebuild the full cell list on every keypress. Fall back to a
29085
+ // lookup when the cache is stale (e.g. detached after month re-render)
29086
+ // or absent (scrollToActiveCell called without a prior setActiveCell);
29087
+ // refresh the cache on the fallback path so a subsequent call reuses it.
29088
+ const activeDate = this.activeCellDate;
29089
+ const cached = this._activeCell;
29090
+ const cacheFresh = cached && cached.isConnected && cached.day && cached.day.date === activeDate;
29091
+ let activeCell = null;
29092
+ if (cacheFresh) {
29093
+ activeCell = cached;
29094
+ } else {
29095
+ activeCell = this.getAllFocusableCells().find((cell) => cell.day && cell.day.date === activeDate);
29096
+ this._activeCell = activeCell || null;
29097
+ }
29098
+ if (!activeCell) {
29099
+ return;
29100
+ }
28729
29101
 
28730
- if (monthElem) {
28731
- const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
28732
- monthElem.scrollIntoView({ block: 'nearest',
28733
- behavior: prefersReducedMotion ? 'instant' : 'smooth' });
29102
+ // Scroll the button inside the cell — it has concrete dimensions,
29103
+ // which avoids quirks when the cell host has display: inline / contents
29104
+ // / flex-without-explicit-size.
29105
+ const target = activeCell._cachedButton ||
29106
+ activeCell.shadowRoot?.querySelector('button.day') ||
29107
+ activeCell;
29108
+
29109
+ // parentNode follows the authored DOM tree and steps over shadow roots
29110
+ // via slot projection. A slotted element's visual parent is its
29111
+ // assignedSlot's parent (inside the host's shadow tree), not the host
29112
+ // itself. Without this hop, the walk skips right past #bodyContainer
29113
+ // and <dialog> and finds no scrollable ancestor at all.
29114
+ const flatParent = (current) => {
29115
+ if (current.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
29116
+ return current.host || null;
29117
+ }
29118
+ if (current.assignedSlot) {
29119
+ return current.assignedSlot.parentNode;
29120
+ }
29121
+ return current.parentNode;
29122
+ };
29123
+
29124
+ let node = flatParent(target);
29125
+ while (node && node !== document && node !== window) {
29126
+ if (node.nodeType === Node.ELEMENT_NODE) {
29127
+ const { overflowY } = window.getComputedStyle(node);
29128
+ if (overflowY === 'auto' || overflowY === 'scroll') {
29129
+ const targetRect = target.getBoundingClientRect();
29130
+ const scrollerRect = node.getBoundingClientRect();
29131
+ let delta = 0;
29132
+ if (targetRect.top < scrollerRect.top) {
29133
+ delta = targetRect.top - scrollerRect.top;
29134
+ } else if (targetRect.bottom > scrollerRect.bottom) {
29135
+ delta = targetRect.bottom - scrollerRect.bottom;
29136
+ }
29137
+ if (delta !== 0) {
29138
+ node.scrollBy({
29139
+ top: delta,
29140
+ behavior: 'auto'
29141
+ });
29142
+ }
29143
+ }
29144
+ }
29145
+ node = flatParent(node);
28734
29146
  }
28735
29147
  }
28736
29148
 
@@ -28821,9 +29233,34 @@ class AuroCalendar extends RangeDatepicker {
28821
29233
  // the last one.
28822
29234
  if (this._announceRafId) {
28823
29235
  cancelAnimationFrame(this._announceRafId);
29236
+ this._announceRafId = null;
28824
29237
  }
29238
+ this._deliverAnnouncement(dateStr, 0);
29239
+ }
29240
+
29241
+ /**
29242
+ * Writes `dateStr` to the live region. If the dropdown's dialog hasn't
29243
+ * mounted yet (so getOrCreateLiveRegion can't attach), retries on the
29244
+ * next animation frame up to MAX_LIVE_REGION_RETRIES instead of silently
29245
+ * dropping the announcement. The retry uses the same `_announceRafId`
29246
+ * the double-rAF below uses, so a newer announceSelection call (or
29247
+ * disconnectedCallback) cancels any in-flight retry.
29248
+ * @private
29249
+ * @param {String} dateStr - The localized date string to announce.
29250
+ * @param {Number} attempts - Number of prior retry attempts.
29251
+ * @returns {void}
29252
+ */
29253
+ _deliverAnnouncement(dateStr, attempts) {
28825
29254
  const liveRegion = this.getOrCreateLiveRegion();
28826
29255
  if (!liveRegion) {
29256
+ const MAX_LIVE_REGION_RETRIES = 10;
29257
+ if (attempts < MAX_LIVE_REGION_RETRIES) {
29258
+ this._announceRafId = requestAnimationFrame(() => {
29259
+ this._deliverAnnouncement(dateStr, attempts + 1);
29260
+ });
29261
+ } else {
29262
+ this._announceRafId = null;
29263
+ }
28827
29264
  return;
28828
29265
  }
28829
29266
 
@@ -28996,7 +29433,7 @@ class AuroCalendar extends RangeDatepicker {
28996
29433
  </div>
28997
29434
  </div>
28998
29435
 
28999
- <div class="calendarWrapper ${!this.isFullscreen && this.dropdown?.desktopModal ? 'hasFooter' : ''}">
29436
+ <div class="calendarWrapper">
29000
29437
  <div class="calendarNavButtons">
29001
29438
  ${this.showPrevMonthBtn ? u$c`
29002
29439
  <button tabIndex="0" class="calendarNavBtn prevMonth" aria-label="${this.datepicker?.navLabelPrevMonth || 'Previous month'}" @click="${this.handlePrevMonth}">
@@ -29009,7 +29446,7 @@ class AuroCalendar extends RangeDatepicker {
29009
29446
  </button>
29010
29447
  ` : undefined}
29011
29448
  </div>
29012
- <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}">
29449
+ <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}">
29013
29450
  ${this.renderAllCalendars()}
29014
29451
  </div>
29015
29452
  </div>
@@ -32894,7 +33331,7 @@ let AuroHelpText$2$1 = class AuroHelpText extends i$3 {
32894
33331
  }
32895
33332
  };
32896
33333
 
32897
- var formkitVersion$1$3 = '202606231948';
33334
+ var formkitVersion$1$3 = '202607010104';
32898
33335
 
32899
33336
  let AuroElement$2$2 = class AuroElement extends i$3 {
32900
33337
  static get properties() {
@@ -34166,6 +34603,7 @@ let AuroDropdown$3 = class AuroDropdown extends AuroElement$2$2 {
34166
34603
  role="${o$4(this.triggerContentFocusable ? undefined : this.a11yRole)}"
34167
34604
  aria-expanded="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
34168
34605
  aria-controls="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
34606
+ aria-haspopup="${o$4(this.a11yRole === 'combobox' && !this.triggerContentFocusable ? 'listbox' : undefined)}"
34169
34607
  aria-labelledby="${o$4(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
34170
34608
  aria-disabled="${o$4(this.disabled ? 'true' : undefined)}"
34171
34609
  @focusin="${this.handleFocusin}"
@@ -38668,15 +39106,17 @@ let AuroFormValidation$6 = class AuroFormValidation {
38668
39106
  );
38669
39107
  }
38670
39108
 
38671
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
38672
- if (this.auroInputElements?.length === 2) {
38673
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
39109
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
39110
+
39111
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
39112
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
39113
+ // field (datepicker is the intended consumer — start/end are independently required).
39114
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
39115
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
38674
39116
  hasValue = false;
38675
39117
  }
38676
39118
  }
38677
39119
 
38678
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
38679
-
38680
39120
  if (isCombobox) {
38681
39121
 
38682
39122
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -39291,7 +39731,7 @@ function normalizeDates$2(context, ...dates) {
39291
39731
  * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))
39292
39732
  * //=> Tue Sep 02 2014 00:00:00
39293
39733
  */
39294
- function startOfDay$3(date, options) {
39734
+ function startOfDay$2(date, options) {
39295
39735
  const _date = toDate$2(date, options?.in);
39296
39736
  _date.setHours(0, 0, 0, 0);
39297
39737
  return _date;
@@ -39339,8 +39779,8 @@ function differenceInCalendarDays$2(laterDate, earlierDate, options) {
39339
39779
  earlierDate,
39340
39780
  );
39341
39781
 
39342
- const laterStartOfDay = startOfDay$3(laterDate_);
39343
- const earlierStartOfDay = startOfDay$3(earlierDate_);
39782
+ const laterStartOfDay = startOfDay$2(laterDate_);
39783
+ const earlierStartOfDay = startOfDay$2(earlierDate_);
39344
39784
 
39345
39785
  const laterTimestamp =
39346
39786
  +laterStartOfDay - getTimezoneOffsetInMilliseconds$2(laterStartOfDay);
@@ -44612,6 +45052,13 @@ let AuroInputUtilities$2 = class AuroInputUtilities {
44612
45052
  * @returns {string | undefined}
44613
45053
  */
44614
45054
  toFormattedValue(valueObject, format) {
45055
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
45056
+ // `format` argument has to fail gracefully rather than throw on
45057
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
45058
+ // as "no format → no display value".
45059
+ if (!format) {
45060
+ return undefined;
45061
+ }
44615
45062
  const normalizedFormat = format.toLowerCase();
44616
45063
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
44617
45064
 
@@ -44763,76 +45210,19 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44763
45210
  constructor() {
44764
45211
  super();
44765
45212
 
44766
- this.appearance = "default";
44767
- this.disabled = false;
44768
- this.layout = 'classic';
44769
- this.locale = 'en-US';
44770
- this.max = undefined;
44771
- this.maxLength = undefined;
44772
- this.min = undefined;
44773
- this.minLength = undefined;
44774
- this.required = false;
44775
- this.onDark = false;
44776
- this.setCustomValidityForType = undefined;
44777
- this.size = 'lg';
44778
- this.shape = 'classic';
44779
- this.value = undefined;
44780
-
44781
- this._initializePrivateDefaults();
44782
- }
44783
-
44784
- /**
44785
- * Internal Defaults.
44786
- * @private
44787
- * @returns {void}
44788
- */
44789
- _initializePrivateDefaults() {
45213
+ // Single-source initialization. Alphabetized so duplicate or stale
45214
+ // defaults are immediately obvious on a diff. Every field is assigned
45215
+ // exactly once here (previously the constructor + the old
45216
+ // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
45217
+ // fields and double-allocated `util` and `validation`, discarding the
45218
+ // first instance). `validation` is now allocated exactly once; `util`
45219
+ // is seeded here with an en-US default and then rebuilt in
45220
+ // `connectedCallback` once the consumer-resolved locale is available,
45221
+ // so a parent (datepicker/combobox) calling `validate()` synchronously
45222
+ // during its own update cycle sees a populated util instance.
44790
45223
  this.activeLabel = false;
44791
- this.appearance = "default";
44792
- this.icon = false;
44793
- this.disabled = false;
44794
- this.dvInputOnly = false;
44795
- this.hideLabelVisually = false;
44796
- this.max = undefined;
44797
- this.maxLength = undefined;
44798
- this.min = undefined;
44799
- this.minLength = undefined;
44800
- this.noValidate = false;
44801
- this.onDark = false;
44802
- this.required = false;
44803
- this.setCustomValidityForType = undefined;
44804
-
44805
- // Used for storing raw values returned from input mask.
44806
- this._rawMaskValue = undefined;
44807
-
44808
- /**
44809
- * @private
44810
- */
44811
- this.layout = 'classic';
44812
-
44813
- /**
44814
- * @private
44815
- */
44816
- this.shape = 'classic';
44817
-
44818
- /**
44819
- * @private
44820
- */
44821
- this.size = 'lg';
44822
-
44823
- this.touched = false;
44824
- this.util = new AuroInputUtilities$2({
44825
- locale: "en-US",
44826
- format: this.format
44827
- });
44828
- this.validation = new AuroFormValidation$6();
44829
- this.inputIconName = undefined;
44830
- this.showPassword = false;
44831
- this.validationCCLength = undefined;
44832
- this.hasValue = false;
44833
- this.label = 'Input label is undefined';
44834
-
44835
45224
 
45225
+ /** @private */
44836
45226
  this.allowedInputTypes = [
44837
45227
  "text",
44838
45228
  "number",
@@ -44841,7 +45231,9 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44841
45231
  "credit-card",
44842
45232
  "tel"
44843
45233
  ];
44844
- this.icon = false;
45234
+ this.appearance = "default";
45235
+
45236
+ /** @private */
44845
45237
  this.dateFormatMap = {
44846
45238
  'mm/dd/yyyy': 'dateMMDDYYYY',
44847
45239
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -44858,27 +45250,62 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44858
45250
  'dd/mm': 'dateDDMM',
44859
45251
  'mm/dd': 'dateMMDD'
44860
45252
  };
45253
+ this.disabled = false;
45254
+
45255
+ /** @private */
44861
45256
  this.domHandler = new DomHandler$2();
44862
45257
  this.dvInputOnly = false;
44863
45258
  this.hasValue = false;
45259
+ this.hideLabelVisually = false;
45260
+ this.icon = false;
45261
+
45262
+ /** @private */
44864
45263
  this.inputIconName = undefined;
45264
+
45265
+ /** @private */
44865
45266
  this.label = 'Input label is undefined';
45267
+ this.layout = 'classic';
45268
+ this.locale = 'en-US';
45269
+ this.max = undefined;
45270
+ this.maxLength = undefined;
45271
+ this.min = undefined;
45272
+ this.minLength = undefined;
44866
45273
  this.noValidate = false;
44867
- this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
45274
+ this.onDark = false;
45275
+ // Raw values returned from the input mask before model normalization.
45276
+ this._rawMaskValue = undefined;
45277
+ this.required = false;
45278
+ this.setCustomValidityForType = undefined;
45279
+ // Credit Card is intentionally excluded — its mask manages the cursor
45280
+ // itself, and listing it here caused cursor placement issues in Safari.
45281
+ /** @private */
44868
45282
  this.setSelectionInputTypes = [
44869
45283
  "text",
44870
45284
  "password",
44871
45285
  "email"
44872
- ]; // Credit Card is not included as this caused cursor placement issues in Safari.
45286
+ ];
45287
+ this.shape = 'classic';
45288
+
45289
+ /** @private */
44873
45290
  this.showPassword = false;
45291
+ this.size = 'lg';
44874
45292
  this.touched = false;
45293
+
45294
+ /** @private */
44875
45295
  this.uniqueId = new UniqueId$1().create();
45296
+
45297
+ /** @private */
44876
45298
  this.util = new AuroInputUtilities$2({
44877
45299
  locale: this.locale,
44878
45300
  format: this.format
44879
45301
  });
45302
+
45303
+ /** @private */
44880
45304
  this.validation = new AuroFormValidation$6();
45305
+
45306
+ /** @private */
44881
45307
  this.validationCCLength = undefined;
45308
+ this.value = undefined;
44882
45309
  }
44883
45310
 
44884
45311
  // function to define props used within the scope of this component
@@ -45382,6 +45809,15 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45382
45809
 
45383
45810
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
45384
45811
 
45812
+ // Normalize the format token to lowercase so case-mixed values supplied
45813
+ // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
45814
+ // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
45815
+ // format silently misses the map and leaves `setCustomValidityForType`
45816
+ // unset.
45817
+ if (this.format) {
45818
+ this.format = this.format.toLowerCase();
45819
+ }
45820
+
45385
45821
  // use validity message override if declared when initializing the component
45386
45822
  if (this.hasAttribute('setCustomValidity')) {
45387
45823
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -45465,6 +45901,13 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45465
45901
 
45466
45902
  if (typeToI18n.includes(this.type)) {
45467
45903
  this.setCustomValidityForType = i18n$1(this.lang, this.type);
45904
+ // COVERAGE: this `else if` branch is unreachable in WTR. connectedCallback
45905
+ // (L682) calls configureDataForType, which at L1266-1268 assigns
45906
+ // `this.format = this.util.getDateMaskFromLocale().toLowerCase()` for any
45907
+ // type=date input whose `format` attribute is unset. That runs before
45908
+ // firstUpdated invokes setCustomHelpTextMessage, so `!this.format` is
45909
+ // always false here. Retained as a defensive fallback; the whole function
45910
+ // is @deprecated per AB#1557296 and slated for removal.
45468
45911
  } else if (!this.format && this.type === 'date') {
45469
45912
  this.setCustomValidityForType = i18n$1(this.lang, 'dateMMDDYYYY');
45470
45913
  } else if (this.dateFormatMap[this.format]) {
@@ -45754,6 +46197,38 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45754
46197
  this.touched = true;
45755
46198
  this.validation.validate(this);
45756
46199
  }
46200
+
46201
+ // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
46202
+ // update that can re-render the input and reset the native cursor; we
46203
+ // capture the caret position before that update commits and restore it
46204
+ // via `setSelectionRange` once the update has flushed. Gated on
46205
+ // `setSelectionInputTypes` so credit-card (and other masked types whose
46206
+ // formatter manages the cursor itself) doesn't get a competing write.
46207
+ // Capture the caret position INSIDE the gate — reading `selectionStart`
46208
+ // on input types that don't support text selection (number, email in
46209
+ // some browsers) throws InvalidStateError, which would crash all input
46210
+ // handling. Wrap the read in try/catch belt-and-suspenders even though
46211
+ // the gated types currently support it, since the list is a public
46212
+ // property a consumer could mutate.
46213
+ if (this.setSelectionInputTypes.includes(this.type)) {
46214
+ let selectionStart = null;
46215
+ try {
46216
+ ({ selectionStart } = this.inputElement);
46217
+ } catch (error) { // eslint-disable-line no-unused-vars
46218
+ return;
46219
+ }
46220
+ if (typeof selectionStart !== 'number') {
46221
+ return;
46222
+ }
46223
+ this.updateComplete.then(() => {
46224
+ try {
46225
+ this.inputElement.setSelectionRange(selectionStart, selectionStart);
46226
+ } catch (error) { // eslint-disable-line no-unused-vars
46227
+ // Some input types (number/email in certain UAs) throw on
46228
+ // setSelectionRange; swallow and let the native cursor stand.
46229
+ }
46230
+ });
46231
+ }
45757
46232
  }
45758
46233
 
45759
46234
  /**
@@ -45887,7 +46362,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45887
46362
  */
45888
46363
  get placeholderStr() {
45889
46364
  if (!this.placeholder && this.type === 'date') {
45890
- return this.format ? this.format.toUpperCase() : 'MM/DD/YYYY';
46365
+ return this.format.toUpperCase();
45891
46366
  }
45892
46367
  return this.placeholder || "";
45893
46368
  }
@@ -46378,7 +46853,7 @@ let AuroHelpText$1$3 = class AuroHelpText extends i$3 {
46378
46853
  }
46379
46854
  };
46380
46855
 
46381
- var formkitVersion$7 = '202606231948';
46856
+ var formkitVersion$7 = '202607010104';
46382
46857
 
46383
46858
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
46384
46859
  // See LICENSE in the project root for license information.
@@ -46881,6 +47356,7 @@ let AuroInput$1 = class AuroInput extends BaseInput$1 {
46881
47356
  <${this.buttonTag}
46882
47357
  @click="${this.handleClickShowPassword}"
46883
47358
  appearance="${this.onDark ? 'inverse' : this.appearance}"
47359
+ aria-pressed="${this.showPassword ? 'true' : 'false'}"
46884
47360
  class="notificationBtn passwordBtn"
46885
47361
  shape="circle"
46886
47362
  size="sm"
@@ -46954,25 +47430,29 @@ let AuroInput$1 = class AuroInput extends BaseInput$1 {
46954
47430
  * @returns {html} - Returns HTML for the help text and error message.
46955
47431
  */
46956
47432
  renderHtmlHelpText() {
47433
+ // Single `<p>` with stable identity across validity transitions —
47434
+ // previously two distinct templates (valid vs invalid) caused Lit to
47435
+ // replace the node entirely on a flip, and VoiceOver wouldn't
47436
+ // re-announce because the live-region element it was watching had been
47437
+ // removed and a new one inserted. Keeping one node means the `role`,
47438
+ // `aria-live`, and text content all change in-place, which AT does
47439
+ // observe and announce.
47440
+ const isError = this.validity && this.validity !== 'valid';
46957
47441
  return u$c`
46958
- ${!this.validity || this.validity === undefined || this.validity === 'valid'
46959
- ? u$c`
46960
- <${this.helpTextTag}
46961
- appearance="${this.onDark ? 'inverse' : this.appearance}">
46962
- <p id="${this.uniqueId}" part="helpText">
46963
- <slot name="helpText">${this.getHelpText()}</slot>
46964
- </p>
46965
- </${this.helpTextTag}>
46966
- `
46967
- : u$c`
46968
- <${this.helpTextTag} error
46969
- appearance="${this.onDark ? 'inverse' : this.appearance}">
46970
- <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
46971
- ${this.errorMessage}
46972
- </p>
46973
- </${this.helpTextTag}>
46974
- `
46975
- }
47442
+ <${this.helpTextTag}
47443
+ appearance="${this.onDark ? 'inverse' : this.appearance}"
47444
+ ?error=${isError}>
47445
+ <p
47446
+ id="${this.uniqueId}"
47447
+ part="helpText"
47448
+ role="${o$4(isError ? 'alert' : undefined)}"
47449
+ aria-live="${o$4(isError ? 'assertive' : undefined)}">
47450
+ ${isError
47451
+ ? this.errorMessage
47452
+ : u$c`<slot name="helpText">${this.getHelpText()}</slot>`
47453
+ }
47454
+ </p>
47455
+ </${this.helpTextTag}>
46976
47456
  `;
46977
47457
  }
46978
47458
 
@@ -47119,6 +47599,15 @@ function formatISODate(isoStr, format) {
47119
47599
  try {
47120
47600
  const date = dateFormatter$2.stringToDateInstance(isoStr);
47121
47601
 
47602
+ // `stringToDateInstance` returns an `Invalid Date` for malformed strings
47603
+ // and `null` for non-string input — it does NOT throw. Without this
47604
+ // guard, `getFullYear()`/`getMonth()`/`getDate()` on an Invalid Date
47605
+ // yield `NaN`, and `String(NaN).padStart(4, '0')` produces literals
47606
+ // like "0NaN/0NaN/0NaN" instead of `undefined`.
47607
+ if (!(date instanceof Date) || Number.isNaN(date.getTime())) {
47608
+ return undefined;
47609
+ }
47610
+
47122
47611
  const year = String(date.getFullYear()).padStart(4, '0');
47123
47612
  const month = String(date.getMonth() + 1).padStart(2, '0');
47124
47613
  const day = String(date.getDate()).padStart(2, '0');
@@ -47129,7 +47618,10 @@ function formatISODate(isoStr, format) {
47129
47618
  replace(/mm/iu, month).
47130
47619
  replace(/dd/iu, day);
47131
47620
  } catch (err) {
47132
- // If the input string is not a valid date, return undefined
47621
+ // Defensive: the Date-returning path is guarded above, but `parseDate`
47622
+ // (inside `stringToDateInstance`) could throw on pathological input
47623
+ // future-library-versions might introduce. Treat any thrown error as
47624
+ // "not a valid date" and return undefined.
47133
47625
  return undefined;
47134
47626
  }
47135
47627
  }
@@ -47855,6 +48347,7 @@ class AuroDatePicker extends AuroElement$5 {
47855
48347
  this.rangeLabelBeforeRange = 'before range';
47856
48348
  this.rangeLabelInRange = 'in range';
47857
48349
  this.rangeLabelAfterRange = 'after range';
48350
+ this.rangeLabelEndPreview = 'previewing range end';
47858
48351
  this.blackoutDates = [];
47859
48352
  this.blackoutLabel = 'unavailable';
47860
48353
  this.navLabelPrevMonth = 'Previous month';
@@ -47954,6 +48447,22 @@ class AuroDatePicker extends AuroElement$5 {
47954
48447
  */
47955
48448
  this.handleClick = this.handleClick.bind(this);
47956
48449
 
48450
+ /**
48451
+ * Single AbortController shared by every listener registered in the
48452
+ * configure* methods. Lets disconnectedCallback tear all of them down
48453
+ * with one abort() call.
48454
+ *
48455
+ * The genuine leak risk is the listeners attached to children that can
48456
+ * outlive the host if they get reparented — `this.dropdown`,
48457
+ * `this.calendar`, and the inputs inside the dropdown's slot.
48458
+ * Listeners attached to `this` (e.g. focusin/focusout on the host)
48459
+ * form a self-contained reference graph that the GC can collect with
48460
+ * the host anyway, but they share the same signal so the cleanup
48461
+ * pattern stays uniform across all configure* sites.
48462
+ * @private
48463
+ */
48464
+ this._listenerAbortController = new AbortController();
48465
+
47957
48466
  /**
47958
48467
  * @private
47959
48468
  */
@@ -48002,6 +48511,7 @@ class AuroDatePicker extends AuroElement$5 {
48002
48511
 
48003
48512
  /**
48004
48513
  * Label announced for blackout (disabled but in-range) date cells.
48514
+ * @default 'unavailable'
48005
48515
  */
48006
48516
  blackoutLabel: {
48007
48517
  type: String,
@@ -48018,6 +48528,7 @@ class AuroDatePicker extends AuroElement$5 {
48018
48528
 
48019
48529
  /**
48020
48530
  * Accessible label for the calendar grid containing the days of the month.
48531
+ * @default 'Calendar days of the month'
48021
48532
  */
48022
48533
  calendarGridLabel: {
48023
48534
  type: String,
@@ -48180,6 +48691,7 @@ class AuroDatePicker extends AuroElement$5 {
48180
48691
 
48181
48692
  /**
48182
48693
  * Accessible label for the next month navigation button.
48694
+ * @default 'Next month'
48183
48695
  */
48184
48696
  navLabelNextMonth: {
48185
48697
  type: String,
@@ -48188,6 +48700,7 @@ class AuroDatePicker extends AuroElement$5 {
48188
48700
 
48189
48701
  /**
48190
48702
  * Accessible label for the previous month navigation button.
48703
+ * @default 'Previous month'
48191
48704
  */
48192
48705
  navLabelPrevMonth: {
48193
48706
  type: String,
@@ -48265,7 +48778,11 @@ class AuroDatePicker extends AuroElement$5 {
48265
48778
  },
48266
48779
 
48267
48780
  /**
48268
- * Label announced for cells after the range (or after start when no end is selected).
48781
+ * Label announced for cells after a fully selected range (both
48782
+ * `dateFrom` and `dateTo` are set). While a range is still being
48783
+ * picked (`dateFrom` set, `dateTo` unset), focused cells past the
48784
+ * start use `rangeLabelEndPreview` instead.
48785
+ * @default 'after range'
48269
48786
  */
48270
48787
  rangeLabelAfterRange: {
48271
48788
  type: String,
@@ -48274,6 +48791,7 @@ class AuroDatePicker extends AuroElement$5 {
48274
48791
 
48275
48792
  /**
48276
48793
  * Label announced for cells before the range start.
48794
+ * @default 'before range'
48277
48795
  */
48278
48796
  rangeLabelBeforeRange: {
48279
48797
  type: String,
@@ -48282,14 +48800,27 @@ class AuroDatePicker extends AuroElement$5 {
48282
48800
 
48283
48801
  /**
48284
48802
  * Label announced for the range end date cell.
48803
+ * @default 'range end'
48285
48804
  */
48286
48805
  rangeLabelEnd: {
48287
48806
  type: String,
48288
48807
  reflect: true
48289
48808
  },
48290
48809
 
48810
+ /**
48811
+ * Label announced for the focused cell while previewing a range end
48812
+ * (dateFrom set, dateTo not yet selected). Tells AT users that
48813
+ * pressing Enter would commit this cell as the range end.
48814
+ * @default 'previewing range end'
48815
+ */
48816
+ rangeLabelEndPreview: {
48817
+ type: String,
48818
+ reflect: true
48819
+ },
48820
+
48291
48821
  /**
48292
48822
  * Label announced for cells within the selected range.
48823
+ * @default 'in range'
48293
48824
  */
48294
48825
  rangeLabelInRange: {
48295
48826
  type: String,
@@ -48298,6 +48829,7 @@ class AuroDatePicker extends AuroElement$5 {
48298
48829
 
48299
48830
  /**
48300
48831
  * Label announced for the range start date cell.
48832
+ * @default 'range start'
48301
48833
  */
48302
48834
  rangeLabelStart: {
48303
48835
  type: String,
@@ -48305,7 +48837,7 @@ class AuroDatePicker extends AuroElement$5 {
48305
48837
  },
48306
48838
 
48307
48839
  /**
48308
- * Dates that the user should have for reference as part of their decision making when selecting a date.
48840
+ * Dates that the user should have for reference as part of their decision-making when selecting a date.
48309
48841
  * This should be a JSON string array of ISO date strings (`YYYY-MM-DD`).
48310
48842
  */
48311
48843
  referenceDates: {
@@ -48662,10 +49194,26 @@ class AuroDatePicker extends AuroElement$5 {
48662
49194
  // ─── Vendor calendar time conversions ─────────────────────────────────────
48663
49195
 
48664
49196
  /**
48665
- * Converts a Unix timestamp (seconds) from the vendor calendar to an ISO date string.
49197
+ * Converts a Unix timestamp (seconds) from the vendored range-datepicker
49198
+ * (`src/vendor/wc-range-datepicker/day.js`) to an ISO date string.
49199
+ *
49200
+ * Timezone contract:
49201
+ * - INPUT: `time` is assumed to be the seconds-since-epoch of **local
49202
+ * midnight** for the intended calendar day. The vendor's Day constructor
49203
+ * builds it via `date-fns format(date, 't')` from a locally-constructed
49204
+ * Date, so this assumption currently holds end-to-end.
49205
+ * - OUTPUT: `dateFormatter.toISOFormatString` reads the Date's local
49206
+ * getFullYear/getMonth/getDate components, so the returned YYYY-MM-DD
49207
+ * string matches the local calendar day.
49208
+ *
49209
+ * If the vendor ever switches to emitting UTC-midnight timestamps, this
49210
+ * conversion will silently shift the returned date by one day in zones
49211
+ * west of UTC. Any vendor swap should re-verify this contract; the TZ
49212
+ * regression suite (`npm run test:hst`, UTC-10) will catch the symptom.
49213
+ *
48666
49214
  * @private
48667
- * @param {number} time - Unix timestamp in seconds.
48668
- * @returns {string} ISO date string (yyyy-mm-dd).
49215
+ * @param {number} time - Unix timestamp (seconds), local midnight of the day.
49216
+ * @returns {string} ISO date string (yyyy-mm-dd) reflecting the local calendar day.
48669
49217
  */
48670
49218
  convertWcTimeToDate(time) {
48671
49219
  return dateFormatter$1.toISOFormatString(new Date(time * 1000));
@@ -48767,8 +49315,8 @@ class AuroDatePicker extends AuroElement$5 {
48767
49315
  }
48768
49316
  }
48769
49317
 
48770
- // Focus the calendar grid wrapper (aria-activedescendant handles
48771
- // the SR announcement for the active cell).
49318
+ // Focus the calendar grid wrapper. The live region (announced just
49319
+ // below) handles the SR announcement for the active cell.
48772
49320
  if (activeCell) {
48773
49321
  this.calendar.focusActiveCell();
48774
49322
 
@@ -48782,11 +49330,14 @@ class AuroDatePicker extends AuroElement$5 {
48782
49330
  this.calendar.announceSelection(announcement);
48783
49331
  }, 500);
48784
49332
 
48785
- // On mobile fullscreen, scroll the month list so the active cell's
48786
- // month is visible. Without this, the list stays scrolled to the
48787
- // calendarStartDate month which may be far from the active cell.
48788
- if (this.dropdown.isBibFullscreen) {
49333
+ // On mobile fullscreen or when an explicit focusDate change has
49334
+ // requested a forced scroll on the next render scroll the active
49335
+ // cell into view. Doing this here (after activeCellDate has been
49336
+ // resolved by the rAF loop above) prevents a no-op scroll that
49337
+ // would happen if we tried to scroll before the cell was set.
49338
+ if (this.dropdown.isBibFullscreen || this.forceScrollOnNextMobileCalendarRender) {
48789
49339
  this.calendar.scrollToActiveCell();
49340
+ this.forceScrollOnNextMobileCalendarRender = false;
48790
49341
  }
48791
49342
  } else if (attempts < MAX_ATTEMPTS) {
48792
49343
  requestAnimationFrame(tryFocus);
@@ -48818,11 +49369,13 @@ class AuroDatePicker extends AuroElement$5 {
48818
49369
  this.dropdown.bibDialogLabel = labelElement.textContent.trim() || undefined;
48819
49370
  }
48820
49371
 
49372
+ const { signal } = this._listenerAbortController;
49373
+
48821
49374
  this.dropdown.addEventListener('auroDropdown-triggerClick', () => {
48822
49375
  if (!this.isPopoverVisible) {
48823
49376
  this.dropdown.show();
48824
49377
  }
48825
- });
49378
+ }, { signal });
48826
49379
 
48827
49380
  this.dropdown.addEventListener('auroDropdown-toggled', () => {
48828
49381
  this.notifyDatepickerToggled();
@@ -48840,7 +49393,7 @@ class AuroDatePicker extends AuroElement$5 {
48840
49393
  if (this.valueObject) {
48841
49394
  this.centralDate = this.value;
48842
49395
  } else if (!this.centralDate && !this.calendarStartDate && !this.minDate) {
48843
- this.centralDate = new Date();
49396
+ this.centralDate = dateFormatter$1.toISOFormatString(new Date());
48844
49397
  }
48845
49398
  }
48846
49399
 
@@ -48908,19 +49461,11 @@ class AuroDatePicker extends AuroElement$5 {
48908
49461
  }
48909
49462
  }
48910
49463
 
48911
- // If on mobile, and the calendar is opened, scroll the focus date into view if the flag is set
48912
- if (this.dropdown.isPopoverVisible && this.forceScrollOnNextMobileCalendarRender) {
48913
-
48914
- // Since the calendar is not rendered until the dropdown is opened,
48915
- // and the auroDropdown-toggled event fires before the popover is actually open,
48916
- // we need to wait until the next frame to ensure the calendar is fully rendered
48917
- // and the area we're trying to scroll to is present in the DOM.
48918
- setTimeout(() => {
48919
- this.calendar.scrollMonthIntoView(this.calendarFocusDate);
48920
- this.forceScrollOnNextMobileCalendarRender = false;
48921
- }, 0);
48922
- }
48923
- });
49464
+ // Note: the forceScrollOnNextMobileCalendarRender scroll-into-view
49465
+ // happens inside focusActiveCellWhenReady() once activeCellDate has
49466
+ // been resolved by its rAF wait — not here in a setTimeout(0), which
49467
+ // fired before the active date was set and silently no-op'd.
49468
+ }, { signal });
48924
49469
 
48925
49470
  // Handle responsive strategy changes while the dropdown is open
48926
49471
  // (e.g. resizing from desktop → mobile or vice versa).
@@ -48967,7 +49512,7 @@ class AuroDatePicker extends AuroElement$5 {
48967
49512
  });
48968
49513
  });
48969
49514
  }
48970
- });
49515
+ }, { signal });
48971
49516
  }
48972
49517
 
48973
49518
  /**
@@ -48980,6 +49525,8 @@ class AuroDatePicker extends AuroElement$5 {
48980
49525
 
48981
49526
  this.inputList = [...this.dropdown.querySelectorAll(this.inputTag._$litStatic$)];
48982
49527
 
49528
+ const { signal } = this._listenerAbortController;
49529
+
48983
49530
  this.inputList.forEach((input, index) => {
48984
49531
  input.addEventListener('input', (event) => {
48985
49532
  event.stopPropagation();
@@ -48991,7 +49538,7 @@ class AuroDatePicker extends AuroElement$5 {
48991
49538
  }
48992
49539
 
48993
49540
  this.notifyValueChanged();
48994
- });
49541
+ }, { signal });
48995
49542
 
48996
49543
  input.addEventListener('auroFormElement-validated', (evt) => {
48997
49544
  // not to bubble up input's validated event.
@@ -49007,7 +49554,7 @@ class AuroDatePicker extends AuroElement$5 {
49007
49554
  this.validity = evt.detail.validity;
49008
49555
  this.errorMessage = evt.detail.message;
49009
49556
  }
49010
- });
49557
+ }, { signal });
49011
49558
  });
49012
49559
  }
49013
49560
 
@@ -49021,19 +49568,32 @@ class AuroDatePicker extends AuroElement$5 {
49021
49568
  this.calendar.datepicker = this;
49022
49569
  this.calendar.dropdown = this.dropdown;
49023
49570
 
49571
+ const { signal } = this._listenerAbortController;
49572
+
49024
49573
  this.calendar.addEventListener('auroCalendar-dateSelected', () => {
49025
- if (this.inputList[0].value !== this.calendar.dateFrom && this.calendar.dateFrom !== undefined) {
49026
- this.inputList[0].value = this.convertWcTimeToDate(this.calendar.dateFrom);
49574
+ // Compare the input's ISO value against the *converted* calendar
49575
+ // timestamp (the vendor's `dateFrom`/`dateTo` are Unix-seconds
49576
+ // strings — comparing the input ISO directly against them would
49577
+ // never match, so the write would fire on every event and emit
49578
+ // redundant input/change activity).
49579
+ if (this.calendar.dateFrom !== undefined) {
49580
+ const fromIso = this.convertWcTimeToDate(this.calendar.dateFrom);
49581
+ if (this.inputList[0].value !== fromIso) {
49582
+ this.inputList[0].value = fromIso;
49583
+ }
49027
49584
  }
49028
49585
 
49029
- if (this.inputList[1] && this.calendar.dateTo && this.inputList[1].value !== this.calendar.dateTo) {
49030
- this.inputList[1].value = this.convertWcTimeToDate(this.calendar.dateTo);
49586
+ if (this.inputList[1] && this.calendar.dateTo) {
49587
+ const toIso = this.convertWcTimeToDate(this.calendar.dateTo);
49588
+ if (this.inputList[1].value !== toIso) {
49589
+ this.inputList[1].value = toIso;
49590
+ }
49031
49591
  }
49032
- });
49592
+ }, { signal });
49033
49593
 
49034
49594
  this.calendar.addEventListener('auroCalendar-dismissRequest', () => {
49035
49595
  this.dropdown.hide();
49036
- });
49596
+ }, { signal });
49037
49597
 
49038
49598
  this.calendar.addEventListener('auroCalendar-centralDateChanged', (event) => {
49039
49599
  const match = this.centralDateObject && this.util.datesMatch(event.detail.date, this.centralDateObject);
@@ -49043,7 +49603,7 @@ class AuroDatePicker extends AuroElement$5 {
49043
49603
  }
49044
49604
 
49045
49605
  this.notifyMonthChanged(event);
49046
- });
49606
+ }, { signal });
49047
49607
  }
49048
49608
 
49049
49609
  /**
@@ -49052,10 +49612,17 @@ class AuroDatePicker extends AuroElement$5 {
49052
49612
  * @returns {void}
49053
49613
  */
49054
49614
  configureDatepicker() {
49615
+ // These listeners are on `this` (the host), so they would GC with the
49616
+ // host even without the abort signal — see the leak rationale on
49617
+ // `_listenerAbortController`. The signal is still passed for uniform
49618
+ // cleanup semantics with the child-element listeners in the other
49619
+ // configure* methods.
49620
+ const { signal } = this._listenerAbortController;
49621
+
49055
49622
  this.addEventListener('focusin', () => {
49056
49623
  this.touched = true;
49057
49624
  this.hasFocus = true;
49058
- });
49625
+ }, { signal });
49059
49626
 
49060
49627
  this.addEventListener('focusout', () => {
49061
49628
  this.hasFocus = false;
@@ -49067,7 +49634,7 @@ class AuroDatePicker extends AuroElement$5 {
49067
49634
  if (!this.matches(':focus-within')) {
49068
49635
  this.validate();
49069
49636
  }
49070
- });
49637
+ }, { signal });
49071
49638
 
49072
49639
  if (this.valueObject) {
49073
49640
  this.calendar.dateFrom = this.convertToWcValidTime(this.valueObject);
@@ -49265,6 +49832,41 @@ class AuroDatePicker extends AuroElement$5 {
49265
49832
  return this.validity !== undefined && this.validity !== 'valid';
49266
49833
  }
49267
49834
 
49835
+ /**
49836
+ * Per-class dedup set used by `_warnInvalidLocale`. Static so the dedup
49837
+ * spans every datepicker instance on the page; lives on the class (not
49838
+ * at module scope) so it stays an encapsulated implementation detail of
49839
+ * this component and does not interfere with WCA's class-JSDoc
49840
+ * attachment.
49841
+ * @private
49842
+ */
49843
+ static _warnedInvalidLocales = new Set();
49844
+
49845
+ /**
49846
+ * Logs a one-time `console.debug` when an unsupported locale falls back to
49847
+ * en-US. Deduped by the offending tag so noisy re-renders that resurface
49848
+ * the same bad value stay quiet, but each new bad value still signals so
49849
+ * consumers can spot the typo or missing tag.
49850
+ * @private
49851
+ * @param {string|undefined} badLocale - The locale value that failed.
49852
+ * @returns {void}
49853
+ */
49854
+ _warnInvalidLocale(badLocale) {
49855
+ // Stringify without coalescing — `String(undefined)` / `String(null)`
49856
+ // surface the actual offending value in the log, instead of the
49857
+ // ambiguous `Locale ""` that `String(badLocale ?? '')` would produce.
49858
+ // Dedup still works correctly because each unique stringification
49859
+ // becomes its own Set entry.
49860
+ const key = String(badLocale);
49861
+ const seen = AuroDatePicker._warnedInvalidLocales;
49862
+ if (seen.has(key)) {
49863
+ return;
49864
+ }
49865
+ seen.add(key);
49866
+ // eslint-disable-next-line no-console
49867
+ 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".`);
49868
+ }
49869
+
49268
49870
  /**
49269
49871
  * Lifecycle method to check if the locale is valid.
49270
49872
  * @ignore
@@ -49275,10 +49877,15 @@ class AuroDatePicker extends AuroElement$5 {
49275
49877
  if (changedProperties.has('locale')) {
49276
49878
  try {
49277
49879
  const supported = Intl.DateTimeFormat.supportedLocalesOf([this.locale], { localeMatcher: 'lookup' });
49278
- this._validLocale = supported.length > 0 ? this.locale : 'en-US';
49880
+ if (supported.length > 0) {
49881
+ this._validLocale = this.locale;
49882
+ } else {
49883
+ this._validLocale = 'en-US';
49884
+ this._warnInvalidLocale(this.locale);
49885
+ }
49279
49886
  } catch {
49280
- console.debug(`[AuroDatePicker] The locale "${this.locale}" is not valid. Falling back to "en-US".`); // eslint-disable-line no-console
49281
49887
  this._validLocale = 'en-US';
49888
+ this._warnInvalidLocale(this.locale);
49282
49889
  }
49283
49890
 
49284
49891
  const previousLocaleFormat = getDateFormatFromLocale$1(changedProperties.get('locale'));
@@ -49360,8 +49967,6 @@ class AuroDatePicker extends AuroElement$5 {
49360
49967
  // Skip centralDate update when user clicked a cell in range mode
49361
49968
  // to prevent the displayed months from shifting
49362
49969
  this.centralDate = this.value;
49363
- //TODO: TEST THIS CHANGE
49364
- // this.calendarRenderUtil.updateCentralDate(this, this.value);
49365
49970
  }
49366
49971
 
49367
49972
  this.setHasValue();
@@ -49421,8 +50026,6 @@ class AuroDatePicker extends AuroElement$5 {
49421
50026
  // Skip centralDate update when user clicked a cell in range mode
49422
50027
  // to prevent the displayed months from shifting
49423
50028
  this.centralDate = this.valueEnd;
49424
- // TODO: TEST THIS CHANGE
49425
- // this.calendarRenderUtil.updateCentralDate(this, this.formattedValueEnd);
49426
50029
  }
49427
50030
 
49428
50031
  this.validate();
@@ -49564,7 +50167,7 @@ class AuroDatePicker extends AuroElement$5 {
49564
50167
  * @returns {void}
49565
50168
  */
49566
50169
  configureClickHandler() {
49567
- this.addEventListener('click', this.handleClick);
50170
+ this.addEventListener('click', this.handleClick, { signal: this._listenerAbortController.signal });
49568
50171
  }
49569
50172
 
49570
50173
  firstUpdated() {
@@ -49572,6 +50175,15 @@ class AuroDatePicker extends AuroElement$5 {
49572
50175
  // Add the tag name as an attribute if it is different than the component name
49573
50176
  this.runtimeUtils.handleComponentTagRename(this, 'auro-datepicker');
49574
50177
 
50178
+ // If the element was disconnected before this first render finished,
50179
+ // disconnectedCallback's microtask already aborted the controller. The
50180
+ // connectedCallback reinit guard skips that case because `hasUpdated`
50181
+ // is still false. Mint a fresh controller here so configure* registers
50182
+ // listeners against a live signal.
50183
+ if (this._listenerAbortController.signal.aborted) {
50184
+ this._listenerAbortController = new AbortController();
50185
+ }
50186
+
49575
50187
  this.configureDropdown();
49576
50188
  this.configureInput();
49577
50189
  this.configureCalendar();
@@ -49583,9 +50195,36 @@ class AuroDatePicker extends AuroElement$5 {
49583
50195
  connectedCallback() {
49584
50196
  super.connectedCallback();
49585
50197
 
50198
+ // True reconnect after `disconnectedCallback` aborted our controller:
50199
+ // the existing signal is dead, so listeners registered against it
50200
+ // would never fire. Create a fresh controller and re-run the
50201
+ // configure* wiring (each method is idempotent — it just re-caches
50202
+ // child refs and re-registers listeners against the new signal).
50203
+ // `hasUpdated` gates this so the *first* connect (which precedes
50204
+ // firstUpdated) still falls through to firstUpdated's initial wiring.
50205
+ if (this.hasUpdated && this._listenerAbortController.signal.aborted) {
50206
+ this._listenerAbortController = new AbortController();
50207
+ this.configureDropdown();
50208
+ this.configureInput();
50209
+ this.configureCalendar();
50210
+ this.configureDatepicker();
50211
+ this.configureClickHandler();
50212
+ }
50213
+
49586
50214
  this.locale = this.domHandler.getLocale(this);
49587
50215
  }
49588
50216
 
50217
+ disconnectedCallback() {
50218
+ super.disconnectedCallback();
50219
+ // Defer so that re-parenting (auro-drawer slotting it into a dialog,
50220
+ // for example) does not abort listeners we still need after reconnect.
50221
+ queueMicrotask(() => {
50222
+ if (!this.isConnected) {
50223
+ this._listenerAbortController.abort();
50224
+ }
50225
+ });
50226
+ }
50227
+
49589
50228
  // layout render methods
49590
50229
  // ------------------------------------
49591
50230
 
@@ -50608,15 +51247,17 @@ let AuroFormValidation$5 = class AuroFormValidation {
50608
51247
  );
50609
51248
  }
50610
51249
 
50611
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
50612
- if (this.auroInputElements?.length === 2) {
50613
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
51250
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
51251
+
51252
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
51253
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
51254
+ // field (datepicker is the intended consumer — start/end are independently required).
51255
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
51256
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
50614
51257
  hasValue = false;
50615
51258
  }
50616
51259
  }
50617
51260
 
50618
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
50619
-
50620
51261
  if (isCombobox) {
50621
51262
 
50622
51263
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -51081,7 +51722,7 @@ let AuroHelpText$1$2 = class AuroHelpText extends i$3 {
51081
51722
  }
51082
51723
  };
51083
51724
 
51084
- var formkitVersion$1$2 = '202606231948';
51725
+ var formkitVersion$1$2 = '202607010104';
51085
51726
 
51086
51727
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
51087
51728
  // See LICENSE in the project root for license information.
@@ -55409,7 +56050,7 @@ let AuroHelpText$6 = class AuroHelpText extends i$3 {
55409
56050
  }
55410
56051
  };
55411
56052
 
55412
- var formkitVersion$6 = '202606231948';
56053
+ var formkitVersion$6 = '202607010104';
55413
56054
 
55414
56055
  let AuroElement$1$2 = class AuroElement extends i$3 {
55415
56056
  static get properties() {
@@ -56681,6 +57322,7 @@ let AuroDropdown$2 = class AuroDropdown extends AuroElement$1$2 {
56681
57322
  role="${o$4(this.triggerContentFocusable ? undefined : this.a11yRole)}"
56682
57323
  aria-expanded="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
56683
57324
  aria-controls="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
57325
+ aria-haspopup="${o$4(this.a11yRole === 'combobox' && !this.triggerContentFocusable ? 'listbox' : undefined)}"
56684
57326
  aria-labelledby="${o$4(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
56685
57327
  aria-disabled="${o$4(this.disabled ? 'true' : undefined)}"
56686
57328
  @focusin="${this.handleFocusin}"
@@ -56807,7 +57449,7 @@ let AuroDropdown$2 = class AuroDropdown extends AuroElement$1$2 {
56807
57449
 
56808
57450
  var colorCss$1$6 = i$6`#headerContainer{box-shadow:var(--ds-auro-dropdownbib-header-boxshadow-color)}#footerContainer{background-color:var(--ds-auro-dropdownbib-footer-container-color)}`;
56809
57451
 
56810
- var styleCss$1$6 = i$6`#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)}`;
57452
+ var styleCss$1$6 = i$6`#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}:host([isfullscreen]) #bibTemplate{max-height:100dvh}:host([isfullscreen]) #bodyContainer{margin-top:var(--ds-size-100, 0.5rem)}#footerContainer{padding:var(--ds-size-200, 1rem)}`;
56811
57453
 
56812
57454
  var tokenCss$3 = i$6`: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)}`;
56813
57455
 
@@ -57813,6 +58455,13 @@ class AuroCounterGroup extends AuroElement$4 {
57813
58455
  */
57814
58456
  configureDropdownCounters() {
57815
58457
  this.dropdown = this.shadowRoot.querySelector(this.dropdownTag._$litStatic$);
58458
+
58459
+ // Counter rows are slotted into the bib through multiple shadow roots
58460
+ // (dropdown → bib → bibtemplate → counter-group → counter), so the floater's
58461
+ // `:focus-within` focus-loss check fails to match the dropdown host in Chromium
58462
+ // and the bib auto-closes immediately after opening. Mirrors auro-select.
58463
+ this.dropdown.noHideOnThisFocusLoss = true;
58464
+
57816
58465
  this.dropdown.requestUpdate();
57817
58466
 
57818
58467
  const counterWrapper = this.shadowRoot.querySelector('auro-counter-wrapper');
@@ -58950,15 +59599,17 @@ let AuroFormValidation$4 = class AuroFormValidation {
58950
59599
  );
58951
59600
  }
58952
59601
 
58953
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
58954
- if (this.auroInputElements?.length === 2) {
58955
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
59602
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
59603
+
59604
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
59605
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
59606
+ // field (datepicker is the intended consumer — start/end are independently required).
59607
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
59608
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
58956
59609
  hasValue = false;
58957
59610
  }
58958
59611
  }
58959
59612
 
58960
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
58961
-
58962
59613
  if (isCombobox) {
58963
59614
 
58964
59615
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -59349,7 +60000,7 @@ let AuroHelpText$5 = class AuroHelpText extends i$3 {
59349
60000
  }
59350
60001
  };
59351
60002
 
59352
- var formkitVersion$5 = '202606231948';
60003
+ var formkitVersion$5 = '202607010104';
59353
60004
 
59354
60005
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
59355
60006
  // See LICENSE in the project root for license information.
@@ -60696,15 +61347,17 @@ let AuroFormValidation$3 = class AuroFormValidation {
60696
61347
  );
60697
61348
  }
60698
61349
 
60699
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
60700
- if (this.auroInputElements?.length === 2) {
60701
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
61350
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
61351
+
61352
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
61353
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
61354
+ // field (datepicker is the intended consumer — start/end are independently required).
61355
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
61356
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
60702
61357
  hasValue = false;
60703
61358
  }
60704
61359
  }
60705
61360
 
60706
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
60707
-
60708
61361
  if (isCombobox) {
60709
61362
 
60710
61363
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -61099,7 +61752,7 @@ let AuroHelpText$4 = class AuroHelpText extends i$3 {
61099
61752
  }
61100
61753
  };
61101
61754
 
61102
- var formkitVersion$4 = '202606231948';
61755
+ var formkitVersion$4 = '202607010104';
61103
61756
 
61104
61757
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
61105
61758
  // See LICENSE in the project root for license information.
@@ -61956,15 +62609,17 @@ let AuroFormValidation$1 = class AuroFormValidation {
61956
62609
  );
61957
62610
  }
61958
62611
 
61959
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
61960
- if (this.auroInputElements?.length === 2) {
61961
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
62612
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
62613
+
62614
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
62615
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
62616
+ // field (datepicker is the intended consumer — start/end are independently required).
62617
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
62618
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
61962
62619
  hasValue = false;
61963
62620
  }
61964
62621
  }
61965
62622
 
61966
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
61967
-
61968
62623
  if (isCombobox) {
61969
62624
 
61970
62625
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -62333,11 +62988,7 @@ const comboboxKeyboardStrategy = {
62333
62988
 
62334
62989
  // navigate if bib is open otherwise open it
62335
62990
  if (component.dropdown.isPopoverVisible) {
62336
- if (evt.altKey || evt.ctrlKey || evt.metaKey) {
62337
- component.activateLastEnabledAvailableOption();
62338
- } else {
62339
- navigateArrow$1(component, 'down');
62340
- }
62991
+ navigateArrow$1(component, 'down');
62341
62992
  } else {
62342
62993
  component.showBib();
62343
62994
  }
@@ -62356,11 +63007,7 @@ const comboboxKeyboardStrategy = {
62356
63007
 
62357
63008
  // navigate if bib is open otherwise open it
62358
63009
  if (component.dropdown.isPopoverVisible) {
62359
- if (evt.altKey || evt.ctrlKey || evt.metaKey) {
62360
- component.activateFirstEnabledAvailableOption();
62361
- } else {
62362
- navigateArrow$1(component, 'up');
62363
- }
63010
+ navigateArrow$1(component, 'up');
62364
63011
  } else {
62365
63012
  component.showBib();
62366
63013
  }
@@ -62376,13 +63023,18 @@ const comboboxKeyboardStrategy = {
62376
63023
  },
62377
63024
 
62378
63025
  Enter(component, evt, ctx) {
63026
+ // Forms should not submit on Enter from a combobox, regardless of which
63027
+ // child element (input, clear button, menu) is focused.
63028
+ evt.stopPropagation();
63029
+
62379
63030
  if (isClearBtnFocused(ctx)) {
62380
- // If the clear button has focus, let the browser activate it normally.
62381
- // stopPropagation prevents parent containers (e.g., forms) from treating
62382
- // Enter as a submit, but we must NOT call preventDefault — that would
62383
- // block the browser's built-in "Enter activates focused button" behavior.
62384
- evt.stopPropagation();
62385
- } else if (ctx.isExpanded && component.menu.optionActive) {
63031
+ // Let the browser dispatch Enter to the focused clear button so its
63032
+ // built-in activation fires and clears the selection. Do NOT call
63033
+ // preventDefault — that would block the activation.
63034
+ return;
63035
+ }
63036
+
63037
+ if (ctx.isExpanded && component.menu.optionActive) {
62386
63038
  reconcileMenuIndex(component.menu);
62387
63039
  component.menu.makeSelection();
62388
63040
 
@@ -62391,14 +63043,8 @@ const comboboxKeyboardStrategy = {
62391
63043
  }
62392
63044
 
62393
63045
  evt.preventDefault();
62394
- evt.stopPropagation();
62395
63046
  } else {
62396
- // Prevent the keypress from bubbling to parent containers (e.g., forms)
62397
- // which could interpret Enter as a submit or trigger other unintended behavior.
62398
- // This is safe because showBib() opens the dialog programmatically,
62399
- // not via event propagation.
62400
63047
  evt.preventDefault();
62401
- evt.stopPropagation();
62402
63048
  component.showBib();
62403
63049
  }
62404
63050
  },
@@ -62443,7 +63089,7 @@ const comboboxKeyboardStrategy = {
62443
63089
  component.setClearBtnFocus();
62444
63090
  }
62445
63091
  }
62446
- },
63092
+ }
62447
63093
  };
62448
63094
 
62449
63095
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
@@ -66314,7 +66960,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$3 {
66314
66960
  }
66315
66961
  };
66316
66962
 
66317
- var formkitVersion$2 = '202606231948';
66963
+ var formkitVersion$2 = '202607010104';
66318
66964
 
66319
66965
  let AuroElement$2$1 = class AuroElement extends i$3 {
66320
66966
  static get properties() {
@@ -67586,6 +68232,7 @@ let AuroDropdown$1 = class AuroDropdown extends AuroElement$2$1 {
67586
68232
  role="${o$4(this.triggerContentFocusable ? undefined : this.a11yRole)}"
67587
68233
  aria-expanded="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
67588
68234
  aria-controls="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
68235
+ aria-haspopup="${o$4(this.a11yRole === 'combobox' && !this.triggerContentFocusable ? 'listbox' : undefined)}"
67589
68236
  aria-labelledby="${o$4(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
67590
68237
  aria-disabled="${o$4(this.disabled ? 'true' : undefined)}"
67591
68238
  @focusin="${this.handleFocusin}"
@@ -72088,15 +72735,17 @@ let AuroFormValidation$2 = class AuroFormValidation {
72088
72735
  );
72089
72736
  }
72090
72737
 
72091
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
72092
- if (this.auroInputElements?.length === 2) {
72093
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
72738
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
72739
+
72740
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
72741
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
72742
+ // field (datepicker is the intended consumer — start/end are independently required).
72743
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
72744
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
72094
72745
  hasValue = false;
72095
72746
  }
72096
72747
  }
72097
72748
 
72098
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
72099
-
72100
72749
  if (isCombobox) {
72101
72750
 
72102
72751
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -78032,6 +78681,13 @@ class AuroInputUtilities {
78032
78681
  * @returns {string | undefined}
78033
78682
  */
78034
78683
  toFormattedValue(valueObject, format) {
78684
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
78685
+ // `format` argument has to fail gracefully rather than throw on
78686
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
78687
+ // as "no format → no display value".
78688
+ if (!format) {
78689
+ return undefined;
78690
+ }
78035
78691
  const normalizedFormat = format.toLowerCase();
78036
78692
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
78037
78693
 
@@ -78183,76 +78839,19 @@ class BaseInput extends AuroElement$1$1 {
78183
78839
  constructor() {
78184
78840
  super();
78185
78841
 
78186
- this.appearance = "default";
78187
- this.disabled = false;
78188
- this.layout = 'classic';
78189
- this.locale = 'en-US';
78190
- this.max = undefined;
78191
- this.maxLength = undefined;
78192
- this.min = undefined;
78193
- this.minLength = undefined;
78194
- this.required = false;
78195
- this.onDark = false;
78196
- this.setCustomValidityForType = undefined;
78197
- this.size = 'lg';
78198
- this.shape = 'classic';
78199
- this.value = undefined;
78200
-
78201
- this._initializePrivateDefaults();
78202
- }
78203
-
78204
- /**
78205
- * Internal Defaults.
78206
- * @private
78207
- * @returns {void}
78208
- */
78209
- _initializePrivateDefaults() {
78842
+ // Single-source initialization. Alphabetized so duplicate or stale
78843
+ // defaults are immediately obvious on a diff. Every field is assigned
78844
+ // exactly once here (previously the constructor + the old
78845
+ // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
78846
+ // fields and double-allocated `util` and `validation`, discarding the
78847
+ // first instance). `validation` is now allocated exactly once; `util`
78848
+ // is seeded here with an en-US default and then rebuilt in
78849
+ // `connectedCallback` once the consumer-resolved locale is available,
78850
+ // so a parent (datepicker/combobox) calling `validate()` synchronously
78851
+ // during its own update cycle sees a populated util instance.
78210
78852
  this.activeLabel = false;
78211
- this.appearance = "default";
78212
- this.icon = false;
78213
- this.disabled = false;
78214
- this.dvInputOnly = false;
78215
- this.hideLabelVisually = false;
78216
- this.max = undefined;
78217
- this.maxLength = undefined;
78218
- this.min = undefined;
78219
- this.minLength = undefined;
78220
- this.noValidate = false;
78221
- this.onDark = false;
78222
- this.required = false;
78223
- this.setCustomValidityForType = undefined;
78224
-
78225
- // Used for storing raw values returned from input mask.
78226
- this._rawMaskValue = undefined;
78227
-
78228
- /**
78229
- * @private
78230
- */
78231
- this.layout = 'classic';
78232
-
78233
- /**
78234
- * @private
78235
- */
78236
- this.shape = 'classic';
78237
-
78238
- /**
78239
- * @private
78240
- */
78241
- this.size = 'lg';
78242
-
78243
- this.touched = false;
78244
- this.util = new AuroInputUtilities({
78245
- locale: "en-US",
78246
- format: this.format
78247
- });
78248
- this.validation = new AuroFormValidation$2();
78249
- this.inputIconName = undefined;
78250
- this.showPassword = false;
78251
- this.validationCCLength = undefined;
78252
- this.hasValue = false;
78253
- this.label = 'Input label is undefined';
78254
-
78255
78853
 
78854
+ /** @private */
78256
78855
  this.allowedInputTypes = [
78257
78856
  "text",
78258
78857
  "number",
@@ -78261,7 +78860,9 @@ class BaseInput extends AuroElement$1$1 {
78261
78860
  "credit-card",
78262
78861
  "tel"
78263
78862
  ];
78264
- this.icon = false;
78863
+ this.appearance = "default";
78864
+
78865
+ /** @private */
78265
78866
  this.dateFormatMap = {
78266
78867
  'mm/dd/yyyy': 'dateMMDDYYYY',
78267
78868
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -78278,27 +78879,62 @@ class BaseInput extends AuroElement$1$1 {
78278
78879
  'dd/mm': 'dateDDMM',
78279
78880
  'mm/dd': 'dateMMDD'
78280
78881
  };
78882
+ this.disabled = false;
78883
+
78884
+ /** @private */
78281
78885
  this.domHandler = new DomHandler();
78282
78886
  this.dvInputOnly = false;
78283
78887
  this.hasValue = false;
78888
+ this.hideLabelVisually = false;
78889
+ this.icon = false;
78890
+
78891
+ /** @private */
78284
78892
  this.inputIconName = undefined;
78893
+
78894
+ /** @private */
78285
78895
  this.label = 'Input label is undefined';
78896
+ this.layout = 'classic';
78897
+ this.locale = 'en-US';
78898
+ this.max = undefined;
78899
+ this.maxLength = undefined;
78900
+ this.min = undefined;
78901
+ this.minLength = undefined;
78286
78902
  this.noValidate = false;
78287
- this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
78903
+ this.onDark = false;
78904
+ // Raw values returned from the input mask before model normalization.
78905
+ this._rawMaskValue = undefined;
78906
+ this.required = false;
78907
+ this.setCustomValidityForType = undefined;
78908
+ // Credit Card is intentionally excluded — its mask manages the cursor
78909
+ // itself, and listing it here caused cursor placement issues in Safari.
78910
+ /** @private */
78288
78911
  this.setSelectionInputTypes = [
78289
78912
  "text",
78290
78913
  "password",
78291
78914
  "email"
78292
- ]; // Credit Card is not included as this caused cursor placement issues in Safari.
78915
+ ];
78916
+ this.shape = 'classic';
78917
+
78918
+ /** @private */
78293
78919
  this.showPassword = false;
78920
+ this.size = 'lg';
78294
78921
  this.touched = false;
78922
+
78923
+ /** @private */
78295
78924
  this.uniqueId = new UniqueId().create();
78925
+
78926
+ /** @private */
78296
78927
  this.util = new AuroInputUtilities({
78297
78928
  locale: this.locale,
78298
78929
  format: this.format
78299
78930
  });
78931
+
78932
+ /** @private */
78300
78933
  this.validation = new AuroFormValidation$2();
78934
+
78935
+ /** @private */
78301
78936
  this.validationCCLength = undefined;
78937
+ this.value = undefined;
78302
78938
  }
78303
78939
 
78304
78940
  // function to define props used within the scope of this component
@@ -78802,6 +79438,15 @@ class BaseInput extends AuroElement$1$1 {
78802
79438
 
78803
79439
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
78804
79440
 
79441
+ // Normalize the format token to lowercase so case-mixed values supplied
79442
+ // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
79443
+ // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
79444
+ // format silently misses the map and leaves `setCustomValidityForType`
79445
+ // unset.
79446
+ if (this.format) {
79447
+ this.format = this.format.toLowerCase();
79448
+ }
79449
+
78805
79450
  // use validity message override if declared when initializing the component
78806
79451
  if (this.hasAttribute('setCustomValidity')) {
78807
79452
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -78885,6 +79530,13 @@ class BaseInput extends AuroElement$1$1 {
78885
79530
 
78886
79531
  if (typeToI18n.includes(this.type)) {
78887
79532
  this.setCustomValidityForType = i18n(this.lang, this.type);
79533
+ // COVERAGE: this `else if` branch is unreachable in WTR. connectedCallback
79534
+ // (L682) calls configureDataForType, which at L1266-1268 assigns
79535
+ // `this.format = this.util.getDateMaskFromLocale().toLowerCase()` for any
79536
+ // type=date input whose `format` attribute is unset. That runs before
79537
+ // firstUpdated invokes setCustomHelpTextMessage, so `!this.format` is
79538
+ // always false here. Retained as a defensive fallback; the whole function
79539
+ // is @deprecated per AB#1557296 and slated for removal.
78888
79540
  } else if (!this.format && this.type === 'date') {
78889
79541
  this.setCustomValidityForType = i18n(this.lang, 'dateMMDDYYYY');
78890
79542
  } else if (this.dateFormatMap[this.format]) {
@@ -79174,6 +79826,38 @@ class BaseInput extends AuroElement$1$1 {
79174
79826
  this.touched = true;
79175
79827
  this.validation.validate(this);
79176
79828
  }
79829
+
79830
+ // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
79831
+ // update that can re-render the input and reset the native cursor; we
79832
+ // capture the caret position before that update commits and restore it
79833
+ // via `setSelectionRange` once the update has flushed. Gated on
79834
+ // `setSelectionInputTypes` so credit-card (and other masked types whose
79835
+ // formatter manages the cursor itself) doesn't get a competing write.
79836
+ // Capture the caret position INSIDE the gate — reading `selectionStart`
79837
+ // on input types that don't support text selection (number, email in
79838
+ // some browsers) throws InvalidStateError, which would crash all input
79839
+ // handling. Wrap the read in try/catch belt-and-suspenders even though
79840
+ // the gated types currently support it, since the list is a public
79841
+ // property a consumer could mutate.
79842
+ if (this.setSelectionInputTypes.includes(this.type)) {
79843
+ let selectionStart = null;
79844
+ try {
79845
+ ({ selectionStart } = this.inputElement);
79846
+ } catch (error) { // eslint-disable-line no-unused-vars
79847
+ return;
79848
+ }
79849
+ if (typeof selectionStart !== 'number') {
79850
+ return;
79851
+ }
79852
+ this.updateComplete.then(() => {
79853
+ try {
79854
+ this.inputElement.setSelectionRange(selectionStart, selectionStart);
79855
+ } catch (error) { // eslint-disable-line no-unused-vars
79856
+ // Some input types (number/email in certain UAs) throw on
79857
+ // setSelectionRange; swallow and let the native cursor stand.
79858
+ }
79859
+ });
79860
+ }
79177
79861
  }
79178
79862
 
79179
79863
  /**
@@ -79307,7 +79991,7 @@ class BaseInput extends AuroElement$1$1 {
79307
79991
  */
79308
79992
  get placeholderStr() {
79309
79993
  if (!this.placeholder && this.type === 'date') {
79310
- return this.format ? this.format.toUpperCase() : 'MM/DD/YYYY';
79994
+ return this.format.toUpperCase();
79311
79995
  }
79312
79996
  return this.placeholder || "";
79313
79997
  }
@@ -79798,7 +80482,7 @@ let AuroHelpText$1$1 = class AuroHelpText extends i$3 {
79798
80482
  }
79799
80483
  };
79800
80484
 
79801
- var formkitVersion$1$1 = '202606231948';
80485
+ var formkitVersion$1$1 = '202607010104';
79802
80486
 
79803
80487
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
79804
80488
  // See LICENSE in the project root for license information.
@@ -80301,6 +80985,7 @@ class AuroInput extends BaseInput {
80301
80985
  <${this.buttonTag}
80302
80986
  @click="${this.handleClickShowPassword}"
80303
80987
  appearance="${this.onDark ? 'inverse' : this.appearance}"
80988
+ aria-pressed="${this.showPassword ? 'true' : 'false'}"
80304
80989
  class="notificationBtn passwordBtn"
80305
80990
  shape="circle"
80306
80991
  size="sm"
@@ -80374,25 +81059,29 @@ class AuroInput extends BaseInput {
80374
81059
  * @returns {html} - Returns HTML for the help text and error message.
80375
81060
  */
80376
81061
  renderHtmlHelpText() {
81062
+ // Single `<p>` with stable identity across validity transitions —
81063
+ // previously two distinct templates (valid vs invalid) caused Lit to
81064
+ // replace the node entirely on a flip, and VoiceOver wouldn't
81065
+ // re-announce because the live-region element it was watching had been
81066
+ // removed and a new one inserted. Keeping one node means the `role`,
81067
+ // `aria-live`, and text content all change in-place, which AT does
81068
+ // observe and announce.
81069
+ const isError = this.validity && this.validity !== 'valid';
80377
81070
  return u$c`
80378
- ${!this.validity || this.validity === undefined || this.validity === 'valid'
80379
- ? u$c`
80380
- <${this.helpTextTag}
80381
- appearance="${this.onDark ? 'inverse' : this.appearance}">
80382
- <p id="${this.uniqueId}" part="helpText">
80383
- <slot name="helpText">${this.getHelpText()}</slot>
80384
- </p>
80385
- </${this.helpTextTag}>
80386
- `
80387
- : u$c`
80388
- <${this.helpTextTag} error
80389
- appearance="${this.onDark ? 'inverse' : this.appearance}">
80390
- <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
80391
- ${this.errorMessage}
80392
- </p>
80393
- </${this.helpTextTag}>
80394
- `
80395
- }
81071
+ <${this.helpTextTag}
81072
+ appearance="${this.onDark ? 'inverse' : this.appearance}"
81073
+ ?error=${isError}>
81074
+ <p
81075
+ id="${this.uniqueId}"
81076
+ part="helpText"
81077
+ role="${o$4(isError ? 'alert' : undefined)}"
81078
+ aria-live="${o$4(isError ? 'assertive' : undefined)}">
81079
+ ${isError
81080
+ ? this.errorMessage
81081
+ : u$c`<slot name="helpText">${this.getHelpText()}</slot>`
81082
+ }
81083
+ </p>
81084
+ </${this.helpTextTag}>
80396
81085
  `;
80397
81086
  }
80398
81087
 
@@ -80524,7 +81213,7 @@ class AuroInput extends BaseInput {
80524
81213
 
80525
81214
  var colorCss$1$3 = i$6`#headerContainer{box-shadow:var(--ds-auro-dropdownbib-header-boxshadow-color)}#footerContainer{background-color:var(--ds-auro-dropdownbib-footer-container-color)}`;
80526
81215
 
80527
- var styleCss$2$2 = i$6`#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)}`;
81216
+ var styleCss$2$2 = i$6`#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}:host([isfullscreen]) #bibTemplate{max-height:100dvh}:host([isfullscreen]) #bodyContainer{margin-top:var(--ds-size-100, 0.5rem)}#footerContainer{padding:var(--ds-size-200, 1rem)}`;
80528
81217
 
80529
81218
  var tokenCss$1 = i$6`: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)}`;
80530
81219
 
@@ -80919,7 +81608,7 @@ let AuroBibtemplate$1 = class AuroBibtemplate extends i$3 {
80919
81608
  }
80920
81609
  };
80921
81610
 
80922
- var formkitVersion$3 = '202606231948';
81611
+ var formkitVersion$3 = '202607010104';
80923
81612
 
80924
81613
  var styleCss$1$3 = i$6`.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}:host{display:block;text-align:left}:host [auro-dropdown]{--ds-auro-dropdown-trigger-background-color: transparent}:host #inputInBib::part(wrapper){box-shadow:none}:host #inputInBib::part(accent-left){display:none}:host([layout*=classic]) [auro-input]{width:100%}:host([layout*=classic]) [auro-input]::part(helpText){display:none}:host([layout*=classic]) #slotHolder{display:none}`;
80925
81614
 
@@ -81287,12 +81976,23 @@ function getOptionLabel(option) {
81287
81976
  if (!option) {
81288
81977
  return '';
81289
81978
  }
81290
- const clone = option.cloneNode(true);
81291
- const displayValueEl = clone.querySelector('[slot="displayValue"]');
81292
- if (displayValueEl) {
81293
- displayValueEl.remove();
81979
+
81980
+ // Consumer-provided override: short-circuit the DOM walk entirely.
81981
+ if (option.dataset && option.dataset.label) {
81982
+ return option.dataset.label;
81983
+ }
81984
+
81985
+ // Walk direct children — the `slot` attribute only applies to direct children
81986
+ // of the slot host, so a shallow filter is sufficient. Avoids the cloneNode +
81987
+ // querySelector allocation that ran on every keystroke via syncValuesAndStates.
81988
+ let text = '';
81989
+ for (const node of option.childNodes) {
81990
+ const isDisplayValueSlot = node.nodeType === Node.ELEMENT_NODE && node.getAttribute('slot') === 'displayValue';
81991
+ if (!isDisplayValueSlot) {
81992
+ text += node.textContent || '';
81993
+ }
81294
81994
  }
81295
- return (clone.textContent || '').replace(/\s+/gu, ' ').trim();
81995
+ return text.replace(/\s+/gu, ' ').trim();
81296
81996
  }
81297
81997
 
81298
81998
  // See https://git.io/JJ6SJ for "How to document your components using JSDoc"
@@ -81367,8 +82067,6 @@ class AuroCombobox extends AuroElement$3 {
81367
82067
  this.availableOptions = [];
81368
82068
  this.dropdownId = undefined;
81369
82069
  this.dropdownOpen = false;
81370
- this.triggerExpandedState = false;
81371
- this._expandedTimeout = null;
81372
82070
  this._inFullscreenTransition = false;
81373
82071
  this.errorMessage = null;
81374
82072
  this.isHiddenWhileLoading = false;
@@ -81379,6 +82077,30 @@ class AuroCombobox extends AuroElement$3 {
81379
82077
  this.touched = false;
81380
82078
  this.validation = new AuroFormValidation$1();
81381
82079
  this.validity = undefined;
82080
+ this._userTyped = false;
82081
+ // Tracks every setTimeout scheduled via _scheduleTimer so
82082
+ // disconnectedCallback can cancel them. Without this, a detached
82083
+ // combobox's pending timers still fire — most are no-ops, but
82084
+ // configureMenu's racing-condition retry would otherwise loop.
82085
+ this._pendingTimers = new Set();
82086
+ }
82087
+
82088
+ /**
82089
+ * setTimeout wrapper that records the timer id so disconnectedCallback
82090
+ * can cancel any outstanding callbacks. The id is removed from the set
82091
+ * once the callback fires so the set doesn't grow unbounded.
82092
+ * @param {Function} fn - Callback to run.
82093
+ * @param {number} ms - Delay in milliseconds.
82094
+ * @returns {number} The timer id.
82095
+ * @private
82096
+ */
82097
+ _scheduleTimer(fn, ms) {
82098
+ const id = setTimeout(() => {
82099
+ this._pendingTimers.delete(id);
82100
+ fn();
82101
+ }, ms);
82102
+ this._pendingTimers.add(id);
82103
+ return id;
81382
82104
  }
81383
82105
 
81384
82106
  // This function is to define props used within the scope of this component
@@ -81740,17 +82462,6 @@ class AuroCombobox extends AuroElement$3 {
81740
82462
  attribute: false
81741
82463
  },
81742
82464
 
81743
- /**
81744
- * Deferred aria-expanded state for the trigger input.
81745
- * Delays the "true" transition so VoiceOver finishes its character echo
81746
- * before announcing "expanded".
81747
- * @private
81748
- */
81749
- triggerExpandedState: {
81750
- type: Boolean,
81751
- reflect: false,
81752
- attribute: false
81753
- },
81754
82465
  };
81755
82466
  }
81756
82467
 
@@ -81773,13 +82484,6 @@ class AuroCombobox extends AuroElement$3 {
81773
82484
  return this.input.value;
81774
82485
  }
81775
82486
 
81776
- // /**
81777
- // * Sets the value of the input element within the combobox.
81778
- // */
81779
- // set inputValue(value) {
81780
- // this.input.value = value;
81781
- // }
81782
-
81783
82487
  /**
81784
82488
  * Checks if the element is valid.
81785
82489
  * @returns {boolean} - Returns true if the element is valid, false otherwise.
@@ -81925,8 +82629,11 @@ class AuroCombobox extends AuroElement$3 {
81925
82629
  this.syncInputValuesAcrossTriggerAndBib(label || this.value);
81926
82630
  }
81927
82631
 
81928
- // update the displayValue in the trigger if displayValue slot content is present
81929
- const displayValueInTrigger = this.input.querySelector('[slot="displayValue"]');
82632
+ // Replace any previously appended displayValue clone in the trigger.
82633
+ // :not(slot) excludes the template's <slot name="displayValue"
82634
+ // slot="displayValue"> forwarder, which also has slot="displayValue"
82635
+ // and would otherwise be matched first and removed.
82636
+ const displayValueInTrigger = this.input.querySelector('[slot="displayValue"]:not(slot)');
81930
82637
 
81931
82638
  if (displayValueInTrigger) {
81932
82639
  displayValueInTrigger.remove();
@@ -81954,19 +82661,19 @@ class AuroCombobox extends AuroElement$3 {
81954
82661
  * Writes nextValue to the trigger input and the bib input when their current
81955
82662
  * value differs, then re-asserts imask after Lit's update flushes.
81956
82663
  * @param {string} nextValue - The value to write to both inputs.
81957
- * @returns {Promise<void> | null} Promise that resolves after the inputs flush,
81958
- * or null when no sync was needed (so callers can skip post-flush work).
82664
+ * @returns {Promise<void>} Resolves after both inputs flush and imask
82665
+ * re-asserts; resolves immediately when no sync is needed.
81959
82666
  * @private
81960
82667
  */
81961
- syncInputValuesAcrossTriggerAndBib(nextValue) {
82668
+ async syncInputValuesAcrossTriggerAndBib(nextValue) {
81962
82669
  // Only set the flag when there's an actual write to suppress —
81963
82670
  // syncValuesAndStates re-enters here during typing when both inputs
81964
82671
  // already match, and a no-op flag flip would make the bib branch's
81965
82672
  // bail eat legitimate user-input events.
81966
82673
  const triggerNeedsSync = this.input.value !== nextValue;
81967
- const bibNeedsSync = this.inputInBib.value !== nextValue;
82674
+ const bibNeedsSync = Boolean(this.inputInBib) && this.inputInBib.value !== nextValue;
81968
82675
  if (!triggerNeedsSync && !bibNeedsSync) {
81969
- return null;
82676
+ return;
81970
82677
  }
81971
82678
 
81972
82679
  this._syncingDisplayValue = true;
@@ -81980,16 +82687,21 @@ class AuroCombobox extends AuroElement$3 {
81980
82687
  this.inputInBib.value = nextValue;
81981
82688
  pending.push(this.inputInBib.updateComplete);
81982
82689
  }
81983
- return Promise.all(pending).then(() => {
82690
+ // finally — not a bare .then — so that an imask throw (see commit
82691
+ // d1857401c: imask can throw on credit-card format change) doesn't strand
82692
+ // _syncingDisplayValue=true and silently swallow every subsequent input.
82693
+ try {
82694
+ await Promise.all(pending);
81984
82695
  // imask reasserts otherwise, and handleBlur reverts to its stale value.
81985
82696
  if (triggerNeedsSync && this.input.maskInstance && typeof this.input.maskInstance.updateValue === 'function') {
81986
82697
  this.input.maskInstance.updateValue();
81987
82698
  }
81988
- if (bibNeedsSync && this.inputInBib && this.inputInBib.maskInstance && typeof this.inputInBib.maskInstance.updateValue === 'function') {
82699
+ if (bibNeedsSync && this.inputInBib.maskInstance && typeof this.inputInBib.maskInstance.updateValue === 'function') {
81989
82700
  this.inputInBib.maskInstance.updateValue();
81990
82701
  }
82702
+ } finally {
81991
82703
  this._syncingDisplayValue = false;
81992
- });
82704
+ }
81993
82705
  }
81994
82706
 
81995
82707
  /**
@@ -82000,6 +82712,13 @@ class AuroCombobox extends AuroElement$3 {
82000
82712
  handleMenuOptions() {
82001
82713
  this.generateOptionsArray();
82002
82714
  this.availableOptions = [];
82715
+ // Single source of truth for the menu's filter/highlight token per call.
82716
+ // syncValuesAndStates re-writes the same value on exact-match keystrokes —
82717
+ // Lit's hasChanged makes that a no-op — and the prior duplicate set inside
82718
+ // handleTriggerInputValueChange is gone.
82719
+ if (this.menu) {
82720
+ this.menu.matchWord = normalizeFilterValue(this.input.value);
82721
+ }
82003
82722
  this.updateFilter();
82004
82723
 
82005
82724
  // Set aria-setsize/aria-posinset on each visible option so screen readers
@@ -82011,11 +82730,8 @@ class AuroCombobox extends AuroElement$3 {
82011
82730
  option.setAttribute('aria-posinset', index + 1);
82012
82731
  });
82013
82732
 
82014
- if (this.value && this.input.value && !this.menu.value) {
82015
- if (this.behavior === 'suggestion' && this.menu.options && this.menu.options.some((opt) => opt.value === this.value)) {
82016
- this.setMenuValue(this.value);
82017
- }
82018
-
82733
+ if (this.input.value && this.menu.options && this.menu.options.some((opt) => opt.value === this.input.value)) {
82734
+ this.setMenuValue(this.input.value);
82019
82735
  this.syncValuesAndStates();
82020
82736
  }
82021
82737
 
@@ -82094,18 +82810,6 @@ class AuroCombobox extends AuroElement$3 {
82094
82810
  this.dropdownOpen = ev.detail.expanded;
82095
82811
  this.updateMenuShapeSize();
82096
82812
 
82097
- // Defer aria-expanded "true" so VoiceOver finishes character echo
82098
- // before announcing "expanded". Set "false" immediately on close.
82099
- clearTimeout(this._expandedTimeout);
82100
- if (this.dropdownOpen) {
82101
- const expandedDelay = 150;
82102
- this._expandedTimeout = setTimeout(() => {
82103
- this.triggerExpandedState = true;
82104
- }, expandedDelay);
82105
- } else {
82106
- this.triggerExpandedState = false;
82107
- }
82108
-
82109
82813
  // Clear aria-activedescendant when dropdown closes
82110
82814
  if (!this.dropdownOpen && this.input) {
82111
82815
  this.input.setActiveDescendant(null);
@@ -82210,7 +82914,7 @@ class AuroCombobox extends AuroElement$3 {
82210
82914
  this.dropdown.trigger.inert = false;
82211
82915
  }
82212
82916
 
82213
- setTimeout(() => {
82917
+ this._scheduleTimer(() => {
82214
82918
  this.setInputFocus();
82215
82919
  }, 0);
82216
82920
  });
@@ -82354,7 +83058,7 @@ class AuroCombobox extends AuroElement$3 {
82354
83058
 
82355
83059
  // racing condition on custom-combobox with custom-menu
82356
83060
  if (!this.menu) {
82357
- setTimeout(() => {
83061
+ this._scheduleTimer(() => {
82358
83062
  this.configureMenu();
82359
83063
  }, 0);
82360
83064
  return;
@@ -82409,9 +83113,7 @@ class AuroCombobox extends AuroElement$3 {
82409
83113
  // Hide dropdown on selection (except during slot changes)
82410
83114
  if (evt.detail && evt.detail.source !== 'slotchange') {
82411
83115
  // do not close while typing in suggestion mode with no value selected, to allow freeform input
82412
- if (this.menu.value || this.behavior !== 'suggestion') {
82413
- this.hideBib();
82414
- }
83116
+ this.hideBib();
82415
83117
 
82416
83118
  // Move focus to the clear button when the user makes a selection.
82417
83119
  if (!isEcho && this.menu.value !== undefined) {
@@ -82425,7 +83127,7 @@ class AuroCombobox extends AuroElement$3 {
82425
83127
  const selectedValue = this.menu.value;
82426
83128
  if (selectedValue) {
82427
83129
  const announcementDelay = 300;
82428
- setTimeout(() => {
83130
+ this._scheduleTimer(() => {
82429
83131
  announceToScreenReader$1(this._getAnnouncementRoot(), `${selectedValue}, selected`);
82430
83132
  }, announcementDelay);
82431
83133
  }
@@ -82437,10 +83139,6 @@ class AuroCombobox extends AuroElement$3 {
82437
83139
  // only — fresh user selections take the existing hideBib path.
82438
83140
  if (isEcho && this.menu.optionSelected) {
82439
83141
  this._programmaticFilterRefresh = true;
82440
- this.handleMenuOptions();
82441
- setTimeout(() => {
82442
- this._programmaticFilterRefresh = false;
82443
- }, 0);
82444
83142
  }
82445
83143
  });
82446
83144
 
@@ -82453,6 +83151,14 @@ class AuroCombobox extends AuroElement$3 {
82453
83151
  // stale option. Safe from re-entrancy because any resulting
82454
83152
  // input.value changes dispatch isProgrammatic events.
82455
83153
  this.menu.addEventListener('auroMenu-selectValueFailure', () => {
83154
+ // Announce the rejection BEFORE we clear `this.value` so the live
83155
+ // region carries the attempted value — without this the bib closes
83156
+ // silently and screen-reader users get no signal that their request
83157
+ // (e.g. a direct setMenuValue() call) was dropped.
83158
+ const attemptedValue = this.value;
83159
+ if (attemptedValue) {
83160
+ announceToScreenReader$1(this._getAnnouncementRoot(), `No matching option for ${attemptedValue}`);
83161
+ }
82456
83162
  this.value = undefined;
82457
83163
  this.optionSelected = undefined;
82458
83164
  });
@@ -82464,10 +83170,13 @@ class AuroCombobox extends AuroElement$3 {
82464
83170
  this.input.setActiveDescendant(this.optionActive);
82465
83171
  }
82466
83172
 
82467
- // Announce the active option for screen readers including position,
82468
- // since shadow DOM boundaries prevent native reading of
82469
- // aria-setsize/aria-posinset via aria-activedescendant.
82470
- if (this.optionActive) {
83173
+ // In fullscreen mode the menu sits inside a nested <dialog> shadow root,
83174
+ // and aria-activedescendant references across that boundary are lost —
83175
+ // VoiceOver/NVDA don't read the active option natively, so we mirror it
83176
+ // into the polite live region. In popover mode aria-activedescendant on
83177
+ // the trigger input is read natively; double-announcing would flood the
83178
+ // queue on arrow-key repeat.
83179
+ if (this.optionActive && this.dropdown.isBibFullscreen) {
82471
83180
  const optionText = this.optionActive.textContent.trim();
82472
83181
  const selectedState = this.optionActive.hasAttribute('selected') ? ', selected' : ', not selected';
82473
83182
  const optionIndex = this.availableOptions.indexOf(this.optionActive) + 1;
@@ -82500,7 +83209,12 @@ class AuroCombobox extends AuroElement$3 {
82500
83209
  * Validate every time we remove focus from the combo box.
82501
83210
  */
82502
83211
  this.addEventListener('focusout', () => {
82503
- if (!this.componentHasFocus && !this._inFullscreenTransition) {
83212
+ // Skip while the dropdown is open — focus transits out briefly on
83213
+ // mousedown of a menu option (popover top-layer breaks :focus-within),
83214
+ // and validating against the pre-selection value flashes a stale error
83215
+ // between mousedown and mouseup. The next focusout fires after the
83216
+ // dropdown closes and validates against the post-selection value.
83217
+ if (!this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen) {
82504
83218
  this.validate();
82505
83219
  }
82506
83220
  });
@@ -82563,49 +83277,40 @@ class AuroCombobox extends AuroElement$3 {
82563
83277
  if (this._syncingDisplayValue) {
82564
83278
  return;
82565
83279
  }
82566
- this._syncingBibValue = true;
82567
- this.input.value = this.inputInBib.value;
82568
- this.input.updateComplete.then(() => {
82569
- this._syncingBibValue = false;
82570
- });
82571
83280
 
82572
- // Run filtering inline — the re-entrant event won't reach this code.
82573
- this.menu.matchWord = normalizeFilterValue(this.inputInBib.value);
82574
- this.optionActive = null;
82575
-
82576
- // In suggestion mode, keep the combobox value in sync with the typed
82577
- // text so that freeform values are captured (mirroring the non-fullscreen
82578
- // path). Clear the selection when the input is emptied.
82579
- if (this.behavior === 'suggestion') {
82580
- this.value = this.inputInBib.value || undefined;
83281
+ // Filtering runs via re-entrance: writing this.input.value below
83282
+ // dispatches an 'input' event that the trigger's listener routes to
83283
+ // handleTriggerInputValueChange, which refreshes the menu filter.
83284
+ if (this.input.value !== this.inputInBib.value) {
83285
+ this._syncingBibValue = true;
83286
+ this.input.value = this.inputInBib.value;
83287
+ this.input.updateComplete.then(() => {
83288
+ this._syncingBibValue = false;
83289
+ });
82581
83290
  }
82582
83291
 
82583
- this.handleMenuOptions();
82584
83292
  this.dispatchEvent(new CustomEvent('inputValue', { detail: { value: this.inputValue } }));
82585
- return;
83293
+ } else if (event.target === this.input) {
83294
+
83295
+ // Also sync the native input immediately so keystrokes arriving
83296
+ // before Lit's async update cycle (e.g. rapid Backspaces during a
83297
+ // fullscreen transition) operate on the correct content.
83298
+ // Skip the next programmatic input event to prevent the patched setter
83299
+ // from re-entering handleInputValueChange via the bib path.
83300
+ const bibNativeInput = this.inputInBib.inputElement;
83301
+ if (bibNativeInput && bibNativeInput.value !== this.input.value) {
83302
+ this.inputInBib.skipNextProgrammaticInputEvent = true;
83303
+ bibNativeInput.value = this.input.value || '';
83304
+ }
82586
83305
  }
82587
83306
 
83307
+ this.value = this.input.value;
83308
+
82588
83309
  // Ignore re-entrant input events caused by programmatic value sets.
82589
83310
  if (this._syncingBibValue || this._syncingDisplayValue) {
82590
83311
  return;
82591
83312
  }
82592
83313
 
82593
- this.inputInBib.value = this.input.value;
82594
-
82595
- // Also sync the native input immediately so keystrokes arriving
82596
- // before Lit's async update cycle (e.g. rapid Backspaces during a
82597
- // fullscreen transition) operate on the correct content.
82598
- // Skip the next programmatic input event to prevent the patched setter
82599
- // from re-entering handleInputValueChange via the bib path.
82600
- const bibNativeInput = this.inputInBib.inputElement;
82601
- if (bibNativeInput && bibNativeInput.value !== this.input.value) {
82602
- this.inputInBib.skipNextProgrammaticInputEvent = true;
82603
- bibNativeInput.value = this.input.value || '';
82604
- }
82605
-
82606
- this.menu.matchWord = normalizeFilterValue(this.input.value);
82607
- this.optionActive = null;
82608
-
82609
83314
  if (this.behavior === 'suggestion') {
82610
83315
  this.value = this.input.value;
82611
83316
  }
@@ -82613,7 +83318,6 @@ class AuroCombobox extends AuroElement$3 {
82613
83318
  if (!this.input.value && !this._clearing) {
82614
83319
  this.clear();
82615
83320
  }
82616
- this.handleMenuOptions();
82617
83321
 
82618
83322
  // Validate only if the value was set programmatically (not during user
82619
83323
  // interaction). In fullscreen dialog mode, componentHasFocus returns false
@@ -82623,34 +83327,44 @@ class AuroCombobox extends AuroElement$3 {
82623
83327
  this.validate();
82624
83328
  }
82625
83329
 
82626
- if (this.input.value && this.input.value.length === 0) {
82627
- // Hide menu if value is empty, otherwise show if there are available suggestions
82628
- this.hideBib();
82629
- } else if (this.menu.loading) {
82630
- // if input has value but menu is loading, show bib immediately
82631
- this.showBib();
82632
- } else if (this.availableOptions.length === 0 && !this.dropdown.isBibFullscreen) {
82633
- // Force dropdown bib to hide if input value has no matching suggestions
82634
- this.hideBib();
83330
+ this.dispatchEvent(new CustomEvent('inputValue', { detail: { value: this.inputValue } }));
83331
+ }
83332
+
83333
+ /**
83334
+ * Handles input value changes originating from the trigger input.
83335
+ * Refreshes menu options and filtering, delegates to handleInputValueChange
83336
+ * for value synchronization, and manages fullscreen bib focus.
83337
+ * @private
83338
+ * @param {Event} event - The input event from the trigger input element.
83339
+ * @returns {void}
83340
+ */
83341
+ handleTriggerInputValueChange(event) {
83342
+ // 'input' fires for every user-initiated value change — typing, paste,
83343
+ // IME composition end, dead-key composition, drag-drop. Flip _userTyped
83344
+ // here so updated('availableOptions') auto-opens the bib for sources
83345
+ // that keydown alone misses: paste fires no keydown, IME uses
83346
+ // key='Process', and dead keys produce multi-char keys (all bypass the
83347
+ // prior keydown.key.length===1 gate). Skip programmatic syncs.
83348
+ if (!this._syncingDisplayValue && !this._syncingBibValue && !this._programmaticFilterRefresh) {
83349
+ this._userTyped = true;
82635
83350
  }
82636
83351
 
82637
- // iOS virtual keyboard retention: when in fullscreen mode, ensure the
82638
- // dialog opens and the bib input is focused synchronously within the
82639
- // input event (user gesture) chain. Without this, Lit's async update
82640
- // cycle delays showModal() past the user activation window, causing
82641
- // iOS Safari to dismiss the virtual keyboard when the fullscreen
82642
- // dialog opens — the user then has to tap the input again to resume
82643
- // typing.
82644
- if (this.dropdown.isBibFullscreen && this.input.value && this.input.value.length > 0) {
82645
- if (!this.dropdown.isPopoverVisible) {
82646
- this.showBib();
82647
- }
82648
- if (this.dropdown.isPopoverVisible) {
82649
- this.setInputFocus();
82650
- }
83352
+ this.handleMenuOptions();
83353
+ this.optionActive = null;
83354
+
83355
+ if (this.value === this.input.value) {
83356
+ return;
82651
83357
  }
82652
83358
 
82653
- this.dispatchEvent(new CustomEvent('inputValue', { detail: { value: this.inputValue } }));
83359
+ this.handleInputValueChange(event);
83360
+
83361
+ if (this.dropdown.isBibFullscreen && this.input.value && this.input.value.length > 0 && this.dropdown.isPopoverVisible) {
83362
+ this.setInputFocus();
83363
+ }
83364
+
83365
+ if (this._programmaticFilterRefresh) {
83366
+ this._programmaticFilterRefresh = false;
83367
+ }
82654
83368
  }
82655
83369
 
82656
83370
  /**
@@ -82718,6 +83432,11 @@ class AuroCombobox extends AuroElement$3 {
82718
83432
  disconnectedCallback() {
82719
83433
  super.disconnectedCallback();
82720
83434
  this._inFullscreenTransition = false;
83435
+ // Cancel any outstanding timers so detached callbacks don't fire on
83436
+ // disposed DOM — most are no-ops, but configureMenu's racing-condition
83437
+ // retry would otherwise keep rescheduling itself indefinitely.
83438
+ this._pendingTimers.forEach((id) => clearTimeout(id));
83439
+ this._pendingTimers.clear();
82721
83440
  }
82722
83441
 
82723
83442
  firstUpdated() {
@@ -82759,7 +83478,7 @@ class AuroCombobox extends AuroElement$3 {
82759
83478
  this.menu.value = value;
82760
83479
  // Backup clear: if menu.value === menu.optionSelected.value already, the
82761
83480
  // listener won't fire and the flag would swallow the next user click.
82762
- setTimeout(() => {
83481
+ this._scheduleTimer(() => {
82763
83482
  this._pendingMenuValueSync = false;
82764
83483
  }, 0);
82765
83484
  }
@@ -82794,6 +83513,17 @@ class AuroCombobox extends AuroElement$3 {
82794
83513
  this.optionSelected = undefined;
82795
83514
  this.value = undefined;
82796
83515
 
83516
+ // Clear the appended displayValue clone in the trigger if present.
83517
+ // :not(slot) excludes the template's <slot name="displayValue"
83518
+ // slot="displayValue"> forwarder (line 1816), which also has
83519
+ // slot="displayValue" and would otherwise be matched first and removed,
83520
+ // permanently breaking the consumer-provided displayValue slot.
83521
+ const displayValueInTrigger = this.input.querySelector('[slot="displayValue"]:not(slot)');
83522
+
83523
+ if (displayValueInTrigger) {
83524
+ displayValueInTrigger.remove();
83525
+ }
83526
+
82797
83527
  if (this.input.value) {
82798
83528
  this.input.clear();
82799
83529
  }
@@ -82817,56 +83547,50 @@ class AuroCombobox extends AuroElement$3 {
82817
83547
  }
82818
83548
 
82819
83549
  updated(changedProperties) {
82820
- // After the component is ready, send direct value changes to auro-menu.
83550
+ // After the component is ready, propagate direct changes down to child components.
82821
83551
  if (changedProperties.has('value')) {
82822
- if (this.value && this.value.length > 0) {
82823
- this.hasValue = true;
82824
- } else {
82825
- this.hasValue = false;
83552
+ // Only flag programmatic refreshes — user-typed value changes must not
83553
+ // suppress the availableOptions branch's showBib(). Firefox batches
83554
+ // 'value' and 'availableOptions' into the same updated() call, so
83555
+ // setting the flag unconditionally here masks the user-typed open path.
83556
+ if (!this._userTyped) {
83557
+ this._programmaticFilterRefresh = true;
82826
83558
  }
82827
83559
 
82828
- if (this.hasValue && !this.input.value && (!this.menu.options || this.menu.options.length === 0)) {
82829
- this.input.value = this.value;
82830
- }
83560
+ if (this.input.value !== this.value) {
83561
+ // Clear menu.value AND menu.optionSelected together. Clearing only
83562
+ // menu.value leaves the previously-selected option element pinned
83563
+ // as menu.optionSelected; a later auroMenu-selectedOption event
83564
+ // would then write its stale .value back into combobox.value
83565
+ // (e.g. Tab-after-Backspace re-selecting the prior option).
83566
+ if (this.menu.value || this.menu.optionSelected) {
83567
+ this.menu.clearSelection();
83568
+ }
82831
83569
 
82832
- // Sync menu.value only when an option actually matches, or when filter
82833
- // mode needs setMenuValue to dispatch auroMenu-selectValueFailure (the
82834
- // listener at line 1206 clears combobox.value, mirroring select's
82835
- // pattern). Otherwise sync the input display for freeform values.
82836
- if (this.menu.options && this.menu.options.length > 0) {
82837
- if (this.menu.options.some((opt) => opt.value === this.value) || this.behavior === 'filter') {
82838
- this.setMenuValue(this.value);
82839
- } else {
82840
- // Clear menu.value AND menu.optionSelected together. Clearing only
82841
- // menu.value leaves the previously-selected option element pinned
82842
- // as menu.optionSelected; a later auroMenu-selectedOption event
82843
- // would then write its stale .value back into combobox.value.
82844
- if (this.menu.value || this.menu.optionSelected) {
82845
- this.menu.clearSelection();
82846
- }
82847
- // Suggestion-mode freeform value: sync the trigger + bib to show it,
82848
- // then refresh the filter once the inputs flush (handleInputValueChange
82849
- // bailed on _syncingDisplayValue).
82850
- const syncPromise = this.syncInputValuesAcrossTriggerAndBib(this.value || '');
82851
- if (syncPromise) {
82852
- syncPromise.then(() => {
82853
- this._programmaticFilterRefresh = true;
82854
- this.handleMenuOptions();
82855
- setTimeout(() => {
82856
- this._programmaticFilterRefresh = false;
82857
- }, 0);
82858
- });
82859
- }
83570
+ if (!this.persistInput) {
83571
+ this.syncInputValuesAcrossTriggerAndBib(this.value || '');
83572
+ }
83573
+
83574
+ // Programmatic value with no matching option: updateFilter will close
83575
+ // the bib silently (see line 648 no noMatchOption + 0 results
83576
+ // hides). Announce so screen-reader users hear the request was
83577
+ // dropped. Gated on `input.value !== this.value` so this never fires
83578
+ // for user typing that path always reconciles input.value to
83579
+ // this.value before updated() runs.
83580
+ if (
83581
+ this.value &&
83582
+ this.menu &&
83583
+ this.menu.options &&
83584
+ this.menu.options.length > 0 &&
83585
+ !this.menu.options.some((opt) => opt.value === this.value)
83586
+ ) {
83587
+ announceToScreenReader$1(this._getAnnouncementRoot(), `No matching option for ${this.value}`);
82860
83588
  }
82861
83589
  }
83590
+
82862
83591
  if (!this.value) {
82863
83592
  this.clear();
82864
83593
  }
82865
- if (this.value && !this.componentHasFocus) {
82866
- // If the value got set programmatically make sure we hide the bib
82867
- // when input is not taking the focus (input can be in dropdown.trigger or in bibtemplate)
82868
- this.hideBib();
82869
- }
82870
83594
 
82871
83595
  // Sync the input and match word, but don't directly set menu.value again
82872
83596
  if (this.menu) {
@@ -82879,7 +83603,7 @@ class AuroCombobox extends AuroElement$3 {
82879
83603
  composed: true,
82880
83604
  detail: {
82881
83605
  optionSelected: this.menu.optionSelected,
82882
- value: this.menu.value
83606
+ value: this.value
82883
83607
  }
82884
83608
  }));
82885
83609
 
@@ -82902,16 +83626,30 @@ class AuroCombobox extends AuroElement$3 {
82902
83626
  // from a programmatic filter refresh after a value swap — the user
82903
83627
  // didn't interact, so we shouldn't auto-open the bib (especially for
82904
83628
  // the no-match path where the existing condition unconditionally fires).
82905
- if (this._programmaticFilterRefresh) {
82906
- this._programmaticFilterRefresh = false;
82907
- } else if ((this.availableOptions.length > 0 && (this.componentHasFocus || this.dropdownOpen)) || (this.menu && this.menu.loading) || (this.availableOptions.length === 0 && this.noMatchOption)) {
82908
- this.showBib();
83629
+ if ((this.menu && !this._programmaticFilterRefresh)) {
83630
+ if (
83631
+ this.availableOptions.length > 0 ||
83632
+ this.menu.loading ||
83633
+ this.noMatchOption
83634
+ ) {
83635
+ if (this._userTyped) {
83636
+ if (!this.dropdownOpen) {
83637
+ this.showBib();
83638
+ }
83639
+ this._userTyped = false;
83640
+ }
83641
+ }
83642
+
82909
83643
  if (!this.availableOptions.includes(this.menu.optionActive)) {
82910
83644
  this.activateFirstEnabledAvailableOption();
82911
83645
  }
82912
- } else if (this.dropdown && this.dropdown.isPopoverVisible) {
83646
+ } else if (!this.dropdown.isBibFullscreen) {
82913
83647
  this.hideBib();
82914
83648
  }
83649
+
83650
+ if (this._programmaticFilterRefresh) {
83651
+ this._programmaticFilterRefresh = false;
83652
+ }
82915
83653
  }
82916
83654
 
82917
83655
  if (changedProperties.has('error')) {
@@ -83053,10 +83791,10 @@ class AuroCombobox extends AuroElement$3 {
83053
83791
  shape="${this.shape}"
83054
83792
  size="${this.size}">
83055
83793
  <${this.inputTag}
83056
- @input="${this.handleInputValueChange}"
83794
+ @input="${this.handleTriggerInputValueChange}"
83057
83795
  appearance="${this.onDark ? 'inverse' : this.appearance}"
83058
83796
  .a11yActivedescendant="${this.dropdownOpen && this.optionActive ? this.optionActive.id : undefined}"
83059
- .a11yExpanded="${this.triggerExpandedState}"
83797
+ .a11yExpanded="${this.dropdownOpen}"
83060
83798
  .a11yControls="${this.dropdownId}"
83061
83799
  .autocomplete="${this.autocomplete}"
83062
83800
  .inputmode="${this.inputmode}"
@@ -85304,15 +86042,17 @@ class AuroFormValidation {
85304
86042
  );
85305
86043
  }
85306
86044
 
85307
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
85308
- if (this.auroInputElements?.length === 2) {
85309
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
86045
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
86046
+
86047
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
86048
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
86049
+ // field (datepicker is the intended consumer — start/end are independently required).
86050
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
86051
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
85310
86052
  hasValue = false;
85311
86053
  }
85312
86054
  }
85313
86055
 
85314
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
85315
-
85316
86056
  if (isCombobox) {
85317
86057
 
85318
86058
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -85704,19 +86444,28 @@ const selectKeyboardStrategy = {
85704
86444
  },
85705
86445
 
85706
86446
  End(component, evt, ctx) {
85707
- if (!ctx.isExpanded) {
85708
- return;
85709
- }
85710
86447
  evt.preventDefault();
85711
86448
  evt.stopPropagation();
85712
86449
  // `pop()` is safe here: getEnabledOptions returns a fresh filtered array.
85713
86450
  const lastOption = getEnabledOptions(component.menu).pop();
85714
- if (lastOption) {
85715
- component.menu.updateActiveOption(lastOption);
86451
+ if (!lastOption) {
86452
+ return;
86453
+ }
86454
+ // Pre-stash before show() so the auroDropdown-toggled handler's
86455
+ // `!optionActive` guard short-circuits the firstActive/selected fallback —
86456
+ // otherwise show() synchronously fires the handler and writes
86457
+ // aria-activedescendant once before we overwrite it.
86458
+ component.menu.updateActiveOption(lastOption);
86459
+ if (!ctx.isExpanded) {
86460
+ component.dropdown.show();
85716
86461
  }
85717
86462
  },
85718
86463
 
85719
86464
  Enter(component, evt, ctx) {
86465
+ // Prevent the keypress from bubbling to parent containers (e.g., forms)
86466
+ // which could interpret Enter as a submit. Matches APG select-only combobox
86467
+ // and native <select> behavior: Enter opens the listbox when closed, selects
86468
+ // the active option when open — it does not submit a parent form.
85720
86469
  evt.preventDefault();
85721
86470
  evt.stopPropagation();
85722
86471
  if (!ctx.isExpanded) {
@@ -85727,14 +86476,16 @@ const selectKeyboardStrategy = {
85727
86476
  },
85728
86477
 
85729
86478
  Home(component, evt, ctx) {
85730
- if (!ctx.isExpanded) {
85731
- return;
85732
- }
85733
86479
  evt.preventDefault();
85734
86480
  evt.stopPropagation();
85735
86481
  const [firstOption] = getEnabledOptions(component.menu);
85736
- if (firstOption) {
85737
- component.menu.updateActiveOption(firstOption);
86482
+ if (!firstOption) {
86483
+ return;
86484
+ }
86485
+ // See End() for why this must run before show().
86486
+ component.menu.updateActiveOption(firstOption);
86487
+ if (!ctx.isExpanded) {
86488
+ component.dropdown.show();
85738
86489
  }
85739
86490
  },
85740
86491
 
@@ -89682,7 +90433,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
89682
90433
  }
89683
90434
  };
89684
90435
 
89685
- var formkitVersion$1 = '202606231948';
90436
+ var formkitVersion$1 = '202607010104';
89686
90437
 
89687
90438
  class AuroElement extends i$3 {
89688
90439
  static get properties() {
@@ -90954,6 +91705,7 @@ class AuroDropdown extends AuroElement {
90954
91705
  role="${o$4(this.triggerContentFocusable ? undefined : this.a11yRole)}"
90955
91706
  aria-expanded="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
90956
91707
  aria-controls="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
91708
+ aria-haspopup="${o$4(this.a11yRole === 'combobox' && !this.triggerContentFocusable ? 'listbox' : undefined)}"
90957
91709
  aria-labelledby="${o$4(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
90958
91710
  aria-disabled="${o$4(this.disabled ? 'true' : undefined)}"
90959
91711
  @focusin="${this.handleFocusin}"
@@ -91080,7 +91832,7 @@ class AuroDropdown extends AuroElement {
91080
91832
 
91081
91833
  var colorCss$1 = i$6`#headerContainer{box-shadow:var(--ds-auro-dropdownbib-header-boxshadow-color)}#footerContainer{background-color:var(--ds-auro-dropdownbib-footer-container-color)}`;
91082
91834
 
91083
- var styleCss$2 = i$6`#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)}`;
91835
+ var styleCss$2 = i$6`#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}:host([isfullscreen]) #bibTemplate{max-height:100dvh}:host([isfullscreen]) #bodyContainer{margin-top:var(--ds-size-100, 0.5rem)}#footerContainer{padding:var(--ds-size-200, 1rem)}`;
91084
91836
 
91085
91837
  var tokenCss = i$6`: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)}`;
91086
91838
 
@@ -91703,7 +92455,7 @@ class AuroHelpText extends i$3 {
91703
92455
  }
91704
92456
  }
91705
92457
 
91706
- var formkitVersion = '202606231948';
92458
+ var formkitVersion = '202607010104';
91707
92459
 
91708
92460
  var styleCss = i$6`.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}[auro-dropdown]{--ds-auro-dropdown-trigger-border-color: var(--ds-auro-select-border-color);--ds-auro-dropdown-trigger-background-color: var(--ds-auro-select-background-color);--ds-auro-dropdown-trigger-container-color: var(--ds-auro-select-background-color);--ds-auro-dropdown-trigger-outline-color: var(--ds-auro-select-outline-color)}:host{display:inline-block;text-align:left;vertical-align:top}:host([layout*=emphasized]) [auro-dropdown],:host([layout*=snowflake]) [auro-dropdown]{--ds-auro-select-border-color: transparent}:host([layout*=emphasized]) .mainContent,:host([layout*=snowflake]) .mainContent{text-align:center}.mainContent{position:relative;display:flex;overflow:hidden;flex:1;flex-direction:column;align-items:center;justify-content:center}.valueContainer [slot=displayValue]{display:none}.accents{display:flex;flex-direction:row;align-items:center;justify-content:center}::slotted([slot=typeIcon]){margin-right:var(--ds-size-100, 0.5rem)}.displayValue{display:block}.displayValue:not(.force){display:none}.displayValue:not(.force).hasContent:is(.withValue):not(.hasFocus){display:block}.triggerContent{display:flex;width:100%;align-items:center;justify-content:center}:host([layout*=emphasized]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem) 0 var(--ds-size-300, 1.5rem)}:host([layout*=snowflake]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem) 0 var(--ds-size-200, 1rem)}:host([layout*=snowflake]) label{padding-block:var(--ds-size-25, 0.125rem)}:host([layout*=classic]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem)}:host([layout*=classic]) .mainContent{align-items:start}:host([layout*=classic]) label{overflow:hidden;cursor:text;text-overflow:ellipsis;white-space:nowrap}:host([layout*=classic]) .value{height:auto}label{color:var(--ds-auro-select-label-text-color)}:host(:is([validity]:not([validity=valid]))) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-basic-color-status-error, #e31f26);--ds-auro-select-outline-color: var(--ds-basic-color-status-error, #e31f26);--ds-auro-dropdown-helptext-text-color: var(--ds-basic-color-texticon-default, #2a2a2a)}:host([ondark]:is([validity]:not([validity=valid]))) [auro-dropdown],:host([appearance=inverse]:is([validity]:not([validity=valid]))) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-advanced-color-state-error-inverse, #f9a4a8);--ds-auro-select-outline-color: var(--ds-advanced-color-state-error-inverse, #f9a4a8);--ds-auro-dropdown-helptext-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}#slotHolder{display:none}:host([fluid]){width:100%}:host([disabled]){pointer-events:none;user-select:none}:host([disabled]:not([ondark])) [auro-dropdown],:host([disabled]:not([appearance=inverse])) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-basic-color-border-subtle, #dddddd)}:host(:not([layout*=classic])[disabled][ondark]) [auro-dropdown],:host(:not([layout*=classic])[disabled][appearance=inverse]) [auro-dropdown]{--ds-auro-select-border-color: transparent}`;
91709
92461
 
@@ -92035,14 +92787,6 @@ class AuroSelect extends AuroElement$1 {
92035
92787
  reflect: true
92036
92788
  },
92037
92789
 
92038
- /**
92039
- * @private
92040
- */
92041
- options: {
92042
- type: Array,
92043
- state: true
92044
- },
92045
-
92046
92790
  /**
92047
92791
  * Specifies the current selected menuOption. Default type is `HTMLElement`, changing to `Array<HTMLElement>` when `multiSelect` is true.
92048
92792
  * @type {HTMLElement|Array<HTMLElement>}
@@ -92330,16 +93074,68 @@ class AuroSelect extends AuroElement$1 {
92330
93074
  this.dropdown.dropdownWidth = this.customBibWidth;
92331
93075
  }
92332
93076
 
92333
- // Pass label text to the dropdown bib for accessible dialog naming
92334
- const labelElement = this.querySelector('span[slot="label"]');
92335
- if (labelElement) {
92336
- this.dropdown.bibDialogLabel = labelElement.textContent.trim() || undefined;
92337
- }
93077
+ this._syncLabelText();
92338
93078
 
92339
93079
  // Exposes the CSS parts from the dropdown for styling
92340
93080
  this.dropdown.exposeCssParts();
92341
93081
  }
92342
93082
 
93083
+ /**
93084
+ * Reads the current label slot text and pushes it to the dropdown bib
93085
+ * (for dialog naming) and the menu (for listbox aria-label). Safe to call
93086
+ * before either child has been wired up — each branch self-guards.
93087
+ * @private
93088
+ */
93089
+ _syncLabelText() {
93090
+ const labelElement = this.querySelector('[slot="label"]');
93091
+ const text = labelElement ? labelElement.textContent.trim() : '';
93092
+ if (this.dropdown) {
93093
+ this.dropdown.bibDialogLabel = text || undefined;
93094
+ }
93095
+ if (this.menu) {
93096
+ if (text) {
93097
+ this.menu.setAttribute('aria-label', text);
93098
+ } else {
93099
+ this.menu.removeAttribute('aria-label');
93100
+ }
93101
+ }
93102
+ }
93103
+
93104
+ /**
93105
+ * Keeps the dialog/menu accessible names in sync when consumers mutate the
93106
+ * label slot at runtime (e.g., i18n locale swap). `slotchange` alone is
93107
+ * insufficient — it doesn't fire when textContent of an already-assigned
93108
+ * slotted node changes, which is the common case. We scope the observer to
93109
+ * the label node itself (not the whole host subtree) so option-content
93110
+ * mutations don't trigger label re-syncs, and re-target on `slotchange`
93111
+ * when consumers add or replace the label element.
93112
+ * @private
93113
+ */
93114
+ _observeLabelChanges() {
93115
+ if (this._labelObserver) return;
93116
+ this._labelObserver = new MutationObserver(() => this._syncLabelText());
93117
+
93118
+ const retarget = () => {
93119
+ this._labelObserver.disconnect();
93120
+ const labelElement = this.querySelector('[slot="label"]');
93121
+ if (labelElement) {
93122
+ this._labelObserver.observe(labelElement, {
93123
+ childList: true,
93124
+ subtree: true,
93125
+ characterData: true
93126
+ });
93127
+ }
93128
+ this._syncLabelText();
93129
+ };
93130
+
93131
+ retarget();
93132
+
93133
+ this._retargetLabelObserver = retarget;
93134
+ this.shadowRoot.querySelectorAll('slot[name="label"]').forEach((slot) => {
93135
+ slot.addEventListener('slotchange', retarget);
93136
+ });
93137
+ }
93138
+
92343
93139
  /**
92344
93140
  * This will register this element with the browser.
92345
93141
  * @param {string} [name="auro-select"] - The name of element that you want to register to.
@@ -92490,11 +93286,7 @@ class AuroSelect extends AuroElement$1 {
92490
93286
  this.updateMenuShapeSize();
92491
93287
  this.setMenuValue(this.value);
92492
93288
 
92493
- // Set accessible name on the menu for screen readers based on the label slot content
92494
- const labelElement = this.querySelector('[slot="label"]');
92495
- if (labelElement) {
92496
- this.menu.setAttribute('aria-label', labelElement.textContent.trim());
92497
- }
93289
+ this._syncLabelText();
92498
93290
 
92499
93291
  if (this.multiSelect) {
92500
93292
  this.menu.multiSelect = this.multiSelect;
@@ -92506,8 +93298,21 @@ class AuroSelect extends AuroElement$1 {
92506
93298
  if (typeof this.menu.initItems === 'function') {
92507
93299
  this.menu.initItems();
92508
93300
  }
92509
- this.options = this.menu.options;
92510
93301
  this.updateOptionPositions();
93302
+ // renderNativeSelect reads this.menu.options, which the parent doesn't
93303
+ // observe — request an update so the hidden native <option> list reflects
93304
+ // the menu's options after initItems populates them.
93305
+ this.requestUpdate();
93306
+
93307
+ // Keep aria-setsize/aria-posinset (and the native <option> list) in sync
93308
+ // when the menu re-initializes its items — e.g., slotchange, async/lazy
93309
+ // loads, value-triggered re-init. Without this, stale set-size is
93310
+ // announced and the native select goes stale after dynamic mutations.
93311
+ this.menu.addEventListener('auroMenu-optionsChange', () => {
93312
+ this.updateOptionPositions();
93313
+ this.requestUpdate();
93314
+ });
93315
+
92511
93316
  this.menu.addEventListener("auroMenu-loadingChange", (event) => this.handleMenuLoadingChange(event));
92512
93317
 
92513
93318
  this.menu.addEventListener("auroMenu-selectValueFailure", () => {
@@ -92526,11 +93331,26 @@ class AuroSelect extends AuroElement$1 {
92526
93331
  this.dropdown.setActiveDescendant(this.optionActive);
92527
93332
  }
92528
93333
 
92529
- // Announce the active option for screen readers
92530
- if (this.optionActive) {
93334
+ // Live-region announce only for [not selected] options. For activations
93335
+ // on an already-selected option — auto-activation on bib open, arrow
93336
+ // navigation back to the selection, or click in multiSelect — rely on
93337
+ // aria-activedescendant + aria-selected="true" to convey state per the
93338
+ // WAI-ARIA listbox pattern. This is intentional, not limited to the
93339
+ // initial activation on open: it also prevents a duplicate "X, selected"
93340
+ // when Enter on the active+selected option re-fires
93341
+ // auroMenu-selectedOption (see 03b289e39).
93342
+ if (this.optionActive && !this.optionActive.hasAttribute('selected')) {
92531
93343
  const optionText = this.optionActive.textContent.trim();
92532
- const selectedState = this.optionActive.hasAttribute('selected') ? ', selected' : ', not selected';
92533
- announceToScreenReader(this._getAnnouncementRoot(), `${optionText}${selectedState}`);
93344
+ const message = `${optionText}, not selected`;
93345
+ if (this.dropdown.isPopoverVisible) {
93346
+ announceToScreenReader(this._getAnnouncementRoot(), message);
93347
+ } else {
93348
+ // Typeahead-on-closed fires this event before `show()` flips
93349
+ // isPopoverVisible. Defer so the announcement targets the bib's
93350
+ // live region once the fullscreen <dialog> opens — otherwise it
93351
+ // lands in the host root, which is inert under the active modal.
93352
+ queueMicrotask(() => announceToScreenReader(this._getAnnouncementRoot(), message));
93353
+ }
92534
93354
  }
92535
93355
 
92536
93356
  if (this.dropdown.isPopoverVisible) {
@@ -92539,6 +93359,7 @@ class AuroSelect extends AuroElement$1 {
92539
93359
  });
92540
93360
 
92541
93361
  this.menu.addEventListener('auroMenu-selectedOption', () => {
93362
+ const previousSelected = this.optionSelected;
92542
93363
 
92543
93364
  // Update the displayed value
92544
93365
  this.updateDisplayedValue();
@@ -92558,13 +93379,32 @@ class AuroSelect extends AuroElement$1 {
92558
93379
  this.dropdown.trigger.focus();
92559
93380
  }
92560
93381
 
92561
- // Announce the selection after the dropdown closes so it isn't
92562
- // overridden by VoiceOver's "collapsed" announcement from aria-expanded.
92563
- const selectedValue = this.menu.currentLabel;
92564
- const announcementDelay = 300;
92565
- setTimeout(() => {
92566
- announceToScreenReader(this._getAnnouncementRoot(), `${selectedValue}, selected`);
92567
- }, announcementDelay);
93382
+ // Describe the actual change. In multiSelect, currentLabel is the
93383
+ // concatenated remaining list — announcing "{list}, selected" after a
93384
+ // deselect would falsely claim every remaining label was just added.
93385
+ // Diff previous vs next to recover the toggled option.
93386
+ let announcement = '';
93387
+ if (this.multiSelect) {
93388
+ const prev = Array.isArray(previousSelected) ? previousSelected : [];
93389
+ const removed = prev.find((opt) => !nextSelected.includes(opt));
93390
+ const added = nextSelected.find((opt) => !prev.includes(opt));
93391
+ if (removed) {
93392
+ announcement = `${removed.textContent.trim()}, not selected`;
93393
+ } else if (added) {
93394
+ announcement = `${added.textContent.trim()}, selected`;
93395
+ }
93396
+ } else {
93397
+ announcement = `${this.menu.currentLabel}, selected`;
93398
+ }
93399
+
93400
+ // Delay so the utterance isn't overridden by VoiceOver's "collapsed"
93401
+ // announcement from aria-expanded when the dropdown closes.
93402
+ if (announcement) {
93403
+ const announcementDelay = 300;
93404
+ setTimeout(() => {
93405
+ announceToScreenReader(this._getAnnouncementRoot(), announcement);
93406
+ }, announcementDelay);
93407
+ }
92568
93408
  });
92569
93409
  }
92570
93410
 
@@ -92662,24 +93502,32 @@ class AuroSelect extends AuroElement$1 {
92662
93502
 
92663
93503
  this.typeaheadBuffer += key;
92664
93504
 
92665
- const isRepeatedChar = this.typeaheadBuffer.length > 1 && new Set(this.typeaheadBuffer).size === 1;
93505
+ // Prefer the literal buffer as a prefix per WAI-ARIA APG ("focus moves to the
93506
+ // next item with a name that starts with the string of characters typed").
93507
+ // Only fall back to single-char cycling when the repeated buffer has no
93508
+ // longer prefix match — e.g. "aa" cycles through ["Apple", "Apricot"] only
93509
+ // because no option starts with "aa".
93510
+ let match = options.find((option) => this._getOptionDisplayText(option).startsWith(this.typeaheadBuffer));
92666
93511
 
92667
- let match = null;
93512
+ const isRepeatedChar = !match && this.typeaheadBuffer.length > 1 && new Set(this.typeaheadBuffer).size === 1;
92668
93513
  if (isRepeatedChar) {
92669
93514
  const matches = options.filter((option) => this._getOptionDisplayText(option).startsWith(key));
92670
93515
  if (matches.length) {
92671
93516
  const cycleIndex = (this.typeaheadBuffer.length - 1) % matches.length;
92672
93517
  match = matches[cycleIndex];
92673
93518
  }
92674
- } else {
92675
- match = options.find((option) => this._getOptionDisplayText(option).startsWith(this.typeaheadBuffer));
92676
93519
  }
92677
93520
 
93521
+ // Intentional: no-match leaves the bib closed (deviates from APG / some native <select>).
92678
93522
  if (match) {
93523
+ // Pre-stash the match so the auroDropdown-toggled handler's `!optionActive`
93524
+ // guard short-circuits and skips the firstActive/selected fallback —
93525
+ // otherwise show() synchronously fires the handler, which writes
93526
+ // aria-activedescendant once before we overwrite it.
93527
+ this.menu.updateActiveOption(match);
92679
93528
  if (!this.dropdown.isPopoverVisible) {
92680
93529
  this.dropdown.show();
92681
93530
  }
92682
- this.menu.updateActiveOption(match);
92683
93531
  }
92684
93532
  }
92685
93533
 
@@ -92796,6 +93644,28 @@ class AuroSelect extends AuroElement$1 {
92796
93644
  disconnectedCallback() {
92797
93645
  super.disconnectedCallback();
92798
93646
  this._clearTypeaheadBuffer();
93647
+ if (this._labelObserver) {
93648
+ this._labelObserver.disconnect();
93649
+ this._labelObserver = null;
93650
+ }
93651
+ if (this._retargetLabelObserver && this.shadowRoot) {
93652
+ this.shadowRoot.querySelectorAll('slot[name="label"]').forEach((slot) => {
93653
+ slot.removeEventListener('slotchange', this._retargetLabelObserver);
93654
+ });
93655
+ this._retargetLabelObserver = null;
93656
+ }
93657
+ }
93658
+
93659
+ connectedCallback() {
93660
+ super.connectedCallback();
93661
+ // Regression guard: firstUpdated() fires once per instance, so the label
93662
+ // observer setup it triggers does NOT re-run on reconnect. After a
93663
+ // disconnect+reconnect (reparent, SPA route swap), runtime label mutations
93664
+ // would silently stop syncing menu aria-label / dropdown.bibDialogLabel
93665
+ // unless we re-wire the observer here.
93666
+ if (this.hasUpdated) {
93667
+ this._observeLabelChanges();
93668
+ }
92799
93669
  }
92800
93670
 
92801
93671
  // lifecycle runs only after the element's DOM has been updated the first time
@@ -92806,6 +93676,7 @@ class AuroSelect extends AuroElement$1 {
92806
93676
  this.configureDropdown();
92807
93677
  this.configureMenu();
92808
93678
  this.configureSelect();
93679
+ this._observeLabelChanges();
92809
93680
  }
92810
93681
 
92811
93682
  setMenuValue(value) {
@@ -92938,25 +93809,18 @@ class AuroSelect extends AuroElement$1 {
92938
93809
  * @private
92939
93810
  */
92940
93811
  _handleNativeSelectChange(event) {
93812
+ // Hidden native <select> has no `multiple` attribute, so any change it fires
93813
+ // is a single raw value — applying it in multiSelect mode would collapse the
93814
+ // JSON-array `value` shape. Bfcache/autofill can reach this on a name-bearing
93815
+ // form control even with aria-hidden/tabindex=-1.
93816
+ if (this.multiSelect) return;
93817
+
92941
93818
  const selectedOption = event.target.options[event.target.selectedIndex];
92942
93819
  if (!selectedOption) return;
92943
93820
  const selectedValue = selectedOption.value;
92944
93821
 
92945
- if (this.multiSelect) {
92946
- const currentArray = this.menu.value || [];
92947
-
92948
- if (!currentArray.includes(selectedValue)) {
92949
- this.value = JSON.stringify([
92950
- ...currentArray,
92951
- selectedValue
92952
- ]);
92953
- }
92954
- } else {
92955
- const currentValue = this.value;
92956
-
92957
- if (currentValue !== selectedValue) {
92958
- this.value = selectedValue;
92959
- }
93822
+ if (this.value !== selectedValue) {
93823
+ this.value = selectedValue;
92960
93824
  }
92961
93825
  }
92962
93826