@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
@@ -4512,15 +4512,17 @@ let AuroFormValidation$7 = class AuroFormValidation {
4512
4512
  );
4513
4513
  }
4514
4514
 
4515
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
4516
- if (this.auroInputElements?.length === 2) {
4517
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
4515
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
4516
+
4517
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
4518
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
4519
+ // field (datepicker is the intended consumer — start/end are independently required).
4520
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
4521
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
4518
4522
  hasValue = false;
4519
4523
  }
4520
4524
  }
4521
4525
 
4522
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
4523
-
4524
4526
  if (isCombobox) {
4525
4527
 
4526
4528
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -5135,7 +5137,7 @@ function normalizeDates$3(context, ...dates) {
5135
5137
  * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))
5136
5138
  * //=> Tue Sep 02 2014 00:00:00
5137
5139
  */
5138
- function startOfDay$4(date, options) {
5140
+ function startOfDay$3(date, options) {
5139
5141
  const _date = toDate$3(date, options?.in);
5140
5142
  _date.setHours(0, 0, 0, 0);
5141
5143
  return _date;
@@ -5183,8 +5185,8 @@ function differenceInCalendarDays$3(laterDate, earlierDate, options) {
5183
5185
  earlierDate,
5184
5186
  );
5185
5187
 
5186
- const laterStartOfDay = startOfDay$4(laterDate_);
5187
- const earlierStartOfDay = startOfDay$4(earlierDate_);
5188
+ const laterStartOfDay = startOfDay$3(laterDate_);
5189
+ const earlierStartOfDay = startOfDay$3(earlierDate_);
5188
5190
 
5189
5191
  const laterTimestamp =
5190
5192
  +laterStartOfDay - getTimezoneOffsetInMilliseconds$3(laterStartOfDay);
@@ -10456,6 +10458,13 @@ let AuroInputUtilities$3 = class AuroInputUtilities {
10456
10458
  * @returns {string | undefined}
10457
10459
  */
10458
10460
  toFormattedValue(valueObject, format) {
10461
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
10462
+ // `format` argument has to fail gracefully rather than throw on
10463
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
10464
+ // as "no format → no display value".
10465
+ if (!format) {
10466
+ return undefined;
10467
+ }
10459
10468
  const normalizedFormat = format.toLowerCase();
10460
10469
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
10461
10470
 
@@ -10607,76 +10616,19 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
10607
10616
  constructor() {
10608
10617
  super();
10609
10618
 
10610
- this.appearance = "default";
10611
- this.disabled = false;
10612
- this.layout = 'classic';
10613
- this.locale = 'en-US';
10614
- this.max = undefined;
10615
- this.maxLength = undefined;
10616
- this.min = undefined;
10617
- this.minLength = undefined;
10618
- this.required = false;
10619
- this.onDark = false;
10620
- this.setCustomValidityForType = undefined;
10621
- this.size = 'lg';
10622
- this.shape = 'classic';
10623
- this.value = undefined;
10624
-
10625
- this._initializePrivateDefaults();
10626
- }
10627
-
10628
- /**
10629
- * Internal Defaults.
10630
- * @private
10631
- * @returns {void}
10632
- */
10633
- _initializePrivateDefaults() {
10619
+ // Single-source initialization. Alphabetized so duplicate or stale
10620
+ // defaults are immediately obvious on a diff. Every field is assigned
10621
+ // exactly once here (previously the constructor + the old
10622
+ // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
10623
+ // fields and double-allocated `util` and `validation`, discarding the
10624
+ // first instance). `validation` is now allocated exactly once; `util`
10625
+ // is seeded here with an en-US default and then rebuilt in
10626
+ // `connectedCallback` once the consumer-resolved locale is available,
10627
+ // so a parent (datepicker/combobox) calling `validate()` synchronously
10628
+ // during its own update cycle sees a populated util instance.
10634
10629
  this.activeLabel = false;
10635
- this.appearance = "default";
10636
- this.icon = false;
10637
- this.disabled = false;
10638
- this.dvInputOnly = false;
10639
- this.hideLabelVisually = false;
10640
- this.max = undefined;
10641
- this.maxLength = undefined;
10642
- this.min = undefined;
10643
- this.minLength = undefined;
10644
- this.noValidate = false;
10645
- this.onDark = false;
10646
- this.required = false;
10647
- this.setCustomValidityForType = undefined;
10648
-
10649
- // Used for storing raw values returned from input mask.
10650
- this._rawMaskValue = undefined;
10651
-
10652
- /**
10653
- * @private
10654
- */
10655
- this.layout = 'classic';
10656
-
10657
- /**
10658
- * @private
10659
- */
10660
- this.shape = 'classic';
10661
-
10662
- /**
10663
- * @private
10664
- */
10665
- this.size = 'lg';
10666
-
10667
- this.touched = false;
10668
- this.util = new AuroInputUtilities$3({
10669
- locale: "en-US",
10670
- format: this.format
10671
- });
10672
- this.validation = new AuroFormValidation$7();
10673
- this.inputIconName = undefined;
10674
- this.showPassword = false;
10675
- this.validationCCLength = undefined;
10676
- this.hasValue = false;
10677
- this.label = 'Input label is undefined';
10678
-
10679
10630
 
10631
+ /** @private */
10680
10632
  this.allowedInputTypes = [
10681
10633
  "text",
10682
10634
  "number",
@@ -10685,7 +10637,9 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
10685
10637
  "credit-card",
10686
10638
  "tel"
10687
10639
  ];
10688
- this.icon = false;
10640
+ this.appearance = "default";
10641
+
10642
+ /** @private */
10689
10643
  this.dateFormatMap = {
10690
10644
  'mm/dd/yyyy': 'dateMMDDYYYY',
10691
10645
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -10702,27 +10656,62 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
10702
10656
  'dd/mm': 'dateDDMM',
10703
10657
  'mm/dd': 'dateMMDD'
10704
10658
  };
10659
+ this.disabled = false;
10660
+
10661
+ /** @private */
10705
10662
  this.domHandler = new DomHandler$3();
10706
10663
  this.dvInputOnly = false;
10707
10664
  this.hasValue = false;
10665
+ this.hideLabelVisually = false;
10666
+ this.icon = false;
10667
+
10668
+ /** @private */
10708
10669
  this.inputIconName = undefined;
10670
+
10671
+ /** @private */
10709
10672
  this.label = 'Input label is undefined';
10673
+ this.layout = 'classic';
10674
+ this.locale = 'en-US';
10675
+ this.max = undefined;
10676
+ this.maxLength = undefined;
10677
+ this.min = undefined;
10678
+ this.minLength = undefined;
10710
10679
  this.noValidate = false;
10711
- this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
10680
+ this.onDark = false;
10681
+ // Raw values returned from the input mask before model normalization.
10682
+ this._rawMaskValue = undefined;
10683
+ this.required = false;
10684
+ this.setCustomValidityForType = undefined;
10685
+ // Credit Card is intentionally excluded — its mask manages the cursor
10686
+ // itself, and listing it here caused cursor placement issues in Safari.
10687
+ /** @private */
10712
10688
  this.setSelectionInputTypes = [
10713
10689
  "text",
10714
10690
  "password",
10715
10691
  "email"
10716
- ]; // Credit Card is not included as this caused cursor placement issues in Safari.
10692
+ ];
10693
+ this.shape = 'classic';
10694
+
10695
+ /** @private */
10717
10696
  this.showPassword = false;
10697
+ this.size = 'lg';
10718
10698
  this.touched = false;
10699
+
10700
+ /** @private */
10719
10701
  this.uniqueId = new UniqueId$2().create();
10702
+
10703
+ /** @private */
10720
10704
  this.util = new AuroInputUtilities$3({
10721
10705
  locale: this.locale,
10722
10706
  format: this.format
10723
10707
  });
10708
+
10709
+ /** @private */
10724
10710
  this.validation = new AuroFormValidation$7();
10711
+
10712
+ /** @private */
10725
10713
  this.validationCCLength = undefined;
10714
+ this.value = undefined;
10726
10715
  }
10727
10716
 
10728
10717
  // function to define props used within the scope of this component
@@ -11226,6 +11215,15 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11226
11215
 
11227
11216
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
11228
11217
 
11218
+ // Normalize the format token to lowercase so case-mixed values supplied
11219
+ // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
11220
+ // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
11221
+ // format silently misses the map and leaves `setCustomValidityForType`
11222
+ // unset.
11223
+ if (this.format) {
11224
+ this.format = this.format.toLowerCase();
11225
+ }
11226
+
11229
11227
  // use validity message override if declared when initializing the component
11230
11228
  if (this.hasAttribute('setCustomValidity')) {
11231
11229
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -11309,6 +11307,13 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11309
11307
 
11310
11308
  if (typeToI18n.includes(this.type)) {
11311
11309
  this.setCustomValidityForType = i18n$3(this.lang, this.type);
11310
+ // COVERAGE: this `else if` branch is unreachable in WTR. connectedCallback
11311
+ // (L682) calls configureDataForType, which at L1266-1268 assigns
11312
+ // `this.format = this.util.getDateMaskFromLocale().toLowerCase()` for any
11313
+ // type=date input whose `format` attribute is unset. That runs before
11314
+ // firstUpdated invokes setCustomHelpTextMessage, so `!this.format` is
11315
+ // always false here. Retained as a defensive fallback; the whole function
11316
+ // is @deprecated per AB#1557296 and slated for removal.
11312
11317
  } else if (!this.format && this.type === 'date') {
11313
11318
  this.setCustomValidityForType = i18n$3(this.lang, 'dateMMDDYYYY');
11314
11319
  } else if (this.dateFormatMap[this.format]) {
@@ -11598,6 +11603,38 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11598
11603
  this.touched = true;
11599
11604
  this.validation.validate(this);
11600
11605
  }
11606
+
11607
+ // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
11608
+ // update that can re-render the input and reset the native cursor; we
11609
+ // capture the caret position before that update commits and restore it
11610
+ // via `setSelectionRange` once the update has flushed. Gated on
11611
+ // `setSelectionInputTypes` so credit-card (and other masked types whose
11612
+ // formatter manages the cursor itself) doesn't get a competing write.
11613
+ // Capture the caret position INSIDE the gate — reading `selectionStart`
11614
+ // on input types that don't support text selection (number, email in
11615
+ // some browsers) throws InvalidStateError, which would crash all input
11616
+ // handling. Wrap the read in try/catch belt-and-suspenders even though
11617
+ // the gated types currently support it, since the list is a public
11618
+ // property a consumer could mutate.
11619
+ if (this.setSelectionInputTypes.includes(this.type)) {
11620
+ let selectionStart = null;
11621
+ try {
11622
+ ({ selectionStart } = this.inputElement);
11623
+ } catch (error) { // eslint-disable-line no-unused-vars
11624
+ return;
11625
+ }
11626
+ if (typeof selectionStart !== 'number') {
11627
+ return;
11628
+ }
11629
+ this.updateComplete.then(() => {
11630
+ try {
11631
+ this.inputElement.setSelectionRange(selectionStart, selectionStart);
11632
+ } catch (error) { // eslint-disable-line no-unused-vars
11633
+ // Some input types (number/email in certain UAs) throw on
11634
+ // setSelectionRange; swallow and let the native cursor stand.
11635
+ }
11636
+ });
11637
+ }
11601
11638
  }
11602
11639
 
11603
11640
  /**
@@ -11731,7 +11768,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11731
11768
  */
11732
11769
  get placeholderStr() {
11733
11770
  if (!this.placeholder && this.type === 'date') {
11734
- return this.format ? this.format.toUpperCase() : 'MM/DD/YYYY';
11771
+ return this.format.toUpperCase();
11735
11772
  }
11736
11773
  return this.placeholder || "";
11737
11774
  }
@@ -12222,7 +12259,7 @@ let AuroHelpText$8 = class AuroHelpText extends i$2 {
12222
12259
  }
12223
12260
  };
12224
12261
 
12225
- var formkitVersion$8 = '202606231948';
12262
+ var formkitVersion$8 = '202607010104';
12226
12263
 
12227
12264
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
12228
12265
  // See LICENSE in the project root for license information.
@@ -12725,6 +12762,7 @@ let AuroInput$2 = class AuroInput extends BaseInput$2 {
12725
12762
  <${this.buttonTag}
12726
12763
  @click="${this.handleClickShowPassword}"
12727
12764
  appearance="${this.onDark ? 'inverse' : this.appearance}"
12765
+ aria-pressed="${this.showPassword ? 'true' : 'false'}"
12728
12766
  class="notificationBtn passwordBtn"
12729
12767
  shape="circle"
12730
12768
  size="sm"
@@ -12798,25 +12836,29 @@ let AuroInput$2 = class AuroInput extends BaseInput$2 {
12798
12836
  * @returns {html} - Returns HTML for the help text and error message.
12799
12837
  */
12800
12838
  renderHtmlHelpText() {
12839
+ // Single `<p>` with stable identity across validity transitions —
12840
+ // previously two distinct templates (valid vs invalid) caused Lit to
12841
+ // replace the node entirely on a flip, and VoiceOver wouldn't
12842
+ // re-announce because the live-region element it was watching had been
12843
+ // removed and a new one inserted. Keeping one node means the `role`,
12844
+ // `aria-live`, and text content all change in-place, which AT does
12845
+ // observe and announce.
12846
+ const isError = this.validity && this.validity !== 'valid';
12801
12847
  return u$d`
12802
- ${!this.validity || this.validity === undefined || this.validity === 'valid'
12803
- ? u$d`
12804
- <${this.helpTextTag}
12805
- appearance="${this.onDark ? 'inverse' : this.appearance}">
12806
- <p id="${this.uniqueId}" part="helpText">
12807
- <slot name="helpText">${this.getHelpText()}</slot>
12808
- </p>
12809
- </${this.helpTextTag}>
12810
- `
12811
- : u$d`
12812
- <${this.helpTextTag} error
12813
- appearance="${this.onDark ? 'inverse' : this.appearance}">
12814
- <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
12815
- ${this.errorMessage}
12816
- </p>
12817
- </${this.helpTextTag}>
12818
- `
12819
- }
12848
+ <${this.helpTextTag}
12849
+ appearance="${this.onDark ? 'inverse' : this.appearance}"
12850
+ ?error=${isError}>
12851
+ <p
12852
+ id="${this.uniqueId}"
12853
+ part="helpText"
12854
+ role="${o$4(isError ? 'alert' : undefined)}"
12855
+ aria-live="${o$4(isError ? 'assertive' : undefined)}">
12856
+ ${isError
12857
+ ? this.errorMessage
12858
+ : u$d`<slot name="helpText">${this.getHelpText()}</slot>`
12859
+ }
12860
+ </p>
12861
+ </${this.helpTextTag}>
12820
12862
  `;
12821
12863
  }
12822
12864
 
@@ -13590,15 +13632,17 @@ let AuroFormValidation$1$1 = class AuroFormValidation {
13590
13632
  );
13591
13633
  }
13592
13634
 
13593
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
13594
- if (this.auroInputElements?.length === 2) {
13595
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
13635
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
13636
+
13637
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
13638
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
13639
+ // field (datepicker is the intended consumer — start/end are independently required).
13640
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
13641
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
13596
13642
  hasValue = false;
13597
13643
  }
13598
13644
  }
13599
13645
 
13600
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
13601
-
13602
13646
  if (isCombobox) {
13603
13647
 
13604
13648
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -14306,7 +14350,7 @@ function normalizeDates$1(context, ...dates) {
14306
14350
  * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))
14307
14351
  * //=> Tue Sep 02 2014 00:00:00
14308
14352
  */
14309
- function startOfDay$2(date, options) {
14353
+ function startOfDay$1(date, options) {
14310
14354
  const _date = toDate$1(date, options?.in);
14311
14355
  _date.setHours(0, 0, 0, 0);
14312
14356
  return _date;
@@ -14354,8 +14398,8 @@ function differenceInCalendarDays$1(laterDate, earlierDate, options) {
14354
14398
  earlierDate,
14355
14399
  );
14356
14400
 
14357
- const laterStartOfDay = startOfDay$2(laterDate_);
14358
- const earlierStartOfDay = startOfDay$2(earlierDate_);
14401
+ const laterStartOfDay = startOfDay$1(laterDate_);
14402
+ const earlierStartOfDay = startOfDay$1(earlierDate_);
14359
14403
 
14360
14404
  const laterTimestamp =
14361
14405
  +laterStartOfDay - getTimezoneOffsetInMilliseconds$1(laterStartOfDay);
@@ -23457,6 +23501,13 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
23457
23501
  * @returns {string | undefined}
23458
23502
  */
23459
23503
  toFormattedValue(valueObject, format) {
23504
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
23505
+ // `format` argument has to fail gracefully rather than throw on
23506
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
23507
+ // as "no format → no display value".
23508
+ if (!format) {
23509
+ return undefined;
23510
+ }
23460
23511
  const normalizedFormat = format.toLowerCase();
23461
23512
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
23462
23513
 
@@ -23717,11 +23768,11 @@ var snowflakeStyle = i$4`:host([layout*=snowflake]) [auro-input]{flex:1;text-ali
23717
23768
 
23718
23769
  var snowflakeColors = i$4`:host([layout=snowflake]) [auro-dropdown]:not(:is([error],.hasFocus)){--ds-auro-dropdown-trigger-border-color: transparent}`;
23719
23770
 
23720
- var styleCss$7$1 = i$4`.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}`;
23771
+ var styleCss$7$1 = i$4`.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}`;
23721
23772
 
23722
- var colorCss$7$1 = i$4`.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)}}`;
23773
+ var colorCss$7$1 = i$4`.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)}}`;
23723
23774
 
23724
- var styleCss$6$1 = i$4`: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)}`;
23775
+ var styleCss$6$1 = i$4`: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)}`;
23725
23776
 
23726
23777
  var colorCss$6$1 = i$4`: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)}`;
23727
23778
 
@@ -23813,8 +23864,8 @@ class RangeDatepickerCell extends i$2 {
23813
23864
  const parsedDateFrom = parseInt(dateFrom, 10);
23814
23865
  const parsedDateTo = parseInt(dateTo, 10);
23815
23866
  if (day) {
23816
- if (getTime(startOfDay$2(parsedDateTo * 1000)) / 1000 === day.date ||
23817
- getTime(startOfDay$2(parsedDateFrom * 1000)) / 1000 === day.date) {
23867
+ if (getTime(startOfDay$1(parsedDateTo * 1000)) / 1000 === day.date ||
23868
+ getTime(startOfDay$1(parsedDateFrom * 1000)) / 1000 === day.date) {
23818
23869
  this.selected = true;
23819
23870
  }
23820
23871
  if (((hoveredDate === day.date || day.date < hoveredDate) &&
@@ -24002,7 +24053,7 @@ class RangeDatepickerCalendar extends i$2 {
24002
24053
  this.dayNamesOfTheWeek = [];
24003
24054
  this.daysOfMonth = [];
24004
24055
  this._locale = null;
24005
- this.currentDate = parseInt(format$1(startOfDay$2(Date.now()), 't'), 10);
24056
+ this.currentDate = parseInt(format$1(startOfDay$1(Date.now()), 't'), 10);
24006
24057
  this.localeChanged();
24007
24058
  this.yearAndMonthChanged(this.year, this.month);
24008
24059
  }
@@ -24476,7 +24527,7 @@ __decorate([n$4({ type: Array })], RangeDatepickerCalendar.prototype, "dayNamesO
24476
24527
  __decorate([n$4({ type: Array })], RangeDatepickerCalendar.prototype, "daysOfMonth", void 0);
24477
24528
  AuroLibraryRuntimeUtils$5$1.prototype.registerComponent('wc-range-datepicker-calendar', RangeDatepickerCalendar);
24478
24529
 
24479
- var styleCss$5$2 = i$4`.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}`;
24530
+ var styleCss$5$2 = i$4`.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}`;
24480
24531
 
24481
24532
  var colorCss$5$2 = i$4`: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}`;
24482
24533
 
@@ -24501,13 +24552,103 @@ class s{registerComponent(e,t){customElements.get(e)||customElements.define(e,cl
24501
24552
 
24502
24553
  var popoverVersion = '6.0.1';
24503
24554
 
24504
- /* 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 */
24555
+ /**
24556
+ * Single source of truth for parsing and matching blackout dates across the
24557
+ * datepicker. Both `auro-calendar` (memoized Set + `isDateBlackout`) and the
24558
+ * pre-`firstUpdated` fallback inside `auro-calendar-cell` route through these
24559
+ * helpers so the YYYY-MM-DD → seconds conversion and the merge-with-legacy
24560
+ * `disabledDays` rules are defined exactly once.
24561
+ */
24505
24562
 
24506
- const startOfDay$1 = (ms) => {
24507
- const date = new Date(ms);
24508
- date.setHours(0, 0, 0, 0);
24509
- return date.getTime();
24510
- };
24563
+ /**
24564
+ * Converts a `YYYY-MM-DD` ISO date string to a Unix timestamp (seconds)
24565
+ * representing local midnight on that calendar day. Returns `null` for
24566
+ * inputs that don't parse to a finite timestamp.
24567
+ *
24568
+ * Uses the `new Date(year, monthIndex, day)` constructor (NOT
24569
+ * `new Date(isoStr)`) so the result is local-midnight rather than UTC
24570
+ * midnight — required to keep the calendar grid aligned with the user's
24571
+ * local calendar day in negative-offset timezones.
24572
+ *
24573
+ * @param {string} isoStr - Date string in `YYYY-MM-DD` format.
24574
+ * @returns {number|null} Local-midnight Unix timestamp (seconds), or null.
24575
+ */
24576
+ function parseIsoToTimestamp(isoStr) {
24577
+ if (typeof isoStr !== 'string') {
24578
+ return null;
24579
+ }
24580
+ const parts = isoStr.split('-');
24581
+ if (parts.length !== 3) {
24582
+ return null;
24583
+ }
24584
+ const year = parseInt(parts[0], 10);
24585
+ const month = parseInt(parts[1], 10);
24586
+ const day = parseInt(parts[2], 10);
24587
+ if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) {
24588
+ return null;
24589
+ }
24590
+ // Reject overflow values like "2024-13-40" — JS `new Date(year, month, day)`
24591
+ // silently normalizes those to a different calendar day, which would
24592
+ // disable the wrong date if we let the result through.
24593
+ if (month < 1 || month > 12 || day < 1 || day > 31) {
24594
+ return null;
24595
+ }
24596
+ const date = new Date(year, month - 1, day);
24597
+ // Guard the residual case where JS still rolls a value (e.g. Feb 30 → Mar 2).
24598
+ // After construction, getFullYear/getMonth/getDate should match the inputs.
24599
+ if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) {
24600
+ return null;
24601
+ }
24602
+ const ts = Math.floor(date.getTime() / 1000);
24603
+ return Number.isFinite(ts) ? ts : null;
24604
+ }
24605
+
24606
+ /**
24607
+ * Builds a `Set<number>` of seconds-since-epoch timestamps covering both the
24608
+ * legacy `disabledDays` (already-numeric) array and the ISO `blackoutDates`
24609
+ * array. Use this for O(1) membership checks in hot paths.
24610
+ *
24611
+ * @param {Array<string|number>|undefined} disabledDays - Legacy timestamp array.
24612
+ * @param {Array<string>|undefined} blackoutDates - ISO `YYYY-MM-DD` array.
24613
+ * @returns {Set<number>}
24614
+ */
24615
+ function buildBlackoutSet(disabledDays, blackoutDates) {
24616
+ const set = new Set();
24617
+ if (Array.isArray(disabledDays)) {
24618
+ for (const day of disabledDays) {
24619
+ const ts = parseInt(day, 10);
24620
+ if (Number.isFinite(ts)) {
24621
+ set.add(ts);
24622
+ }
24623
+ }
24624
+ }
24625
+ if (Array.isArray(blackoutDates)) {
24626
+ for (const isoStr of blackoutDates) {
24627
+ const ts = parseIsoToTimestamp(isoStr);
24628
+ if (ts !== null) {
24629
+ set.add(ts);
24630
+ }
24631
+ }
24632
+ }
24633
+ return set;
24634
+ }
24635
+
24636
+ /**
24637
+ * One-shot membership test for a single timestamp against both blackout
24638
+ * sources. Allocates a Set on each call; only use this in cold paths
24639
+ * (e.g. the pre-`firstUpdated` cell fallback). Hot paths should hold the
24640
+ * Set returned from `buildBlackoutSet` and `.has(ts)` directly.
24641
+ *
24642
+ * @param {number} dateTs - Unix timestamp (seconds) to test.
24643
+ * @param {Array<string|number>|undefined} disabledDays - Legacy timestamp array.
24644
+ * @param {Array<string>|undefined} blackoutDates - ISO `YYYY-MM-DD` array.
24645
+ * @returns {boolean}
24646
+ */
24647
+ function isBlackoutTimestamp(dateTs, disabledDays, blackoutDates) {
24648
+ return buildBlackoutSet(disabledDays, blackoutDates).has(dateTs);
24649
+ }
24650
+
24651
+ /* 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 */
24511
24652
 
24512
24653
  class AuroCalendarCell extends i$2 {
24513
24654
  constructor() {
@@ -24555,6 +24696,14 @@ class AuroCalendarCell extends i$2 {
24555
24696
  type: Boolean,
24556
24697
  reflect: true
24557
24698
  },
24699
+ /**
24700
+ * @deprecated Propagated from the legacy `auro-calendar.disabledDays`
24701
+ * Unix-timestamp array. The cell honors it for backward compatibility
24702
+ * (see the divergence-check fallback inside `isBlackout`), but
24703
+ * consumers should migrate to `auro-datepicker.blackoutDates`
24704
+ * (YYYY-MM-DD ISO strings). The calendar emits a one-time
24705
+ * deprecation warning the first time a non-empty value is observed.
24706
+ */
24558
24707
  disabledDays: { type: Array },
24559
24708
  isCurrentDate: { type: Boolean },
24560
24709
  locale: { type: String },
@@ -24600,8 +24749,8 @@ class AuroCalendarCell extends i$2 {
24600
24749
  const parsedDateTo = parseInt(dateTo, 10);
24601
24750
 
24602
24751
  if (day) {
24603
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
24604
- const returnTimestamp = startOfDay$1(parsedDateTo * 1000) / 1000;
24752
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
24753
+ const returnTimestamp = new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000;
24605
24754
 
24606
24755
  if (day.date === departTimestamp || day.date === returnTimestamp) {
24607
24756
  this.selected = true;
@@ -24685,27 +24834,33 @@ class AuroCalendarCell extends i$2 {
24685
24834
  return false;
24686
24835
  }
24687
24836
 
24688
- // Check against disabledDays timestamps (legacy path)
24689
- if (Array.isArray(this.disabledDays) && this.disabledDays.length > 0 &&
24690
- (this.disabledDays.findIndex(dd => parseInt(dd, 10) === this.day.date) !== -1)) {
24691
- return true;
24692
- }
24693
-
24694
- // Check against blackoutDates (ISO format YYYY-MM-DD) on the datepicker
24695
- const blackoutDates = this.datepicker?.blackoutDates;
24696
-
24697
- if (Array.isArray(blackoutDates) && blackoutDates.length > 0) {
24698
- const date = new Date(this.day.date * 1000);
24699
- const yyyy = date.getFullYear();
24700
- const mm = String(date.getMonth() + 1).padStart(2, '0');
24701
- const dd = String(date.getDate()).padStart(2, '0');
24702
- const cellDate = `${yyyy}-${mm}-${dd}`;
24703
- if (blackoutDates.includes(cellDate)) {
24837
+ // Delegate to the calendar's memoized blackout Set for O(1) lookup
24838
+ // (instead of rescanning disabledDays + blackoutDates per render). The
24839
+ // Set is rebuilt only when either source array reference changes — see
24840
+ // auro-calendar.js#_getBlackoutSet.
24841
+ if (this.calendar && typeof this.calendar._getBlackoutSet === 'function') {
24842
+ if (this.calendar._getBlackoutSet().has(this.day.date)) {
24704
24843
  return true;
24705
24844
  }
24845
+ // If the cell's local disabledDays diverged from the calendar's (a
24846
+ // consumer or test mutated cell.disabledDays directly), the Set does
24847
+ // not reflect that addition — fall through to the per-cell scan only
24848
+ // when the reference no longer matches. Production data flow keeps
24849
+ // these identical, so this branch stays cold. Guarded with
24850
+ // Array.isArray to match `_getBlackoutSet`'s contract: non-array
24851
+ // values are treated as empty rather than crashing on `.findIndex`.
24852
+ if (Array.isArray(this.disabledDays) && this.disabledDays !== this.calendar.disabledDays && this.disabledDays.length > 0) {
24853
+ if (this.disabledDays.findIndex((dd) => parseInt(dd, 10) === this.day.date) !== -1) {
24854
+ return true;
24855
+ }
24856
+ }
24857
+ return false;
24706
24858
  }
24707
24859
 
24708
- return false;
24860
+ // Pre-firstUpdated fallback — the cell may render once before the
24861
+ // ancestor calendar is wired up. Routes through the shared
24862
+ // blackoutUtils helper so the parsing rules stay in one place.
24863
+ return isBlackoutTimestamp(this.day.date, this.disabledDays, this.datepicker?.blackoutDates);
24709
24864
  }
24710
24865
 
24711
24866
  /**
@@ -24811,12 +24966,12 @@ class AuroCalendarCell extends i$2 {
24811
24966
  const parsedDateFrom = Number.parseInt(this.dateFrom, 10);
24812
24967
  if (!Number.isFinite(parsedDateFrom)) return null;
24813
24968
 
24814
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
24969
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
24815
24970
  const dayDate = this.day.date;
24816
24971
 
24817
24972
  const parsedDateTo = Number.parseInt(this.dateTo, 10);
24818
24973
  const hasDateTo = Number.isFinite(parsedDateTo);
24819
- const returnTimestamp = hasDateTo ? startOfDay$1(parsedDateTo * 1000) / 1000 : null;
24974
+ const returnTimestamp = hasDateTo ? new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000 : null;
24820
24975
 
24821
24976
  if (dayDate === departTimestamp) return this.datepicker.rangeLabelStart || 'range start';
24822
24977
 
@@ -24826,7 +24981,9 @@ class AuroCalendarCell extends i$2 {
24826
24981
 
24827
24982
  if (hasDateTo && dayDate > departTimestamp && dayDate < returnTimestamp) return this.datepicker.rangeLabelInRange || 'in range';
24828
24983
 
24829
- // After start date, no end date yet, or after end date
24984
+ if (!hasDateTo && dayDate > departTimestamp) return this.datepicker.rangeLabelEndPreview || 'previewing range end';
24985
+
24986
+ // After end date when both dateFrom and dateTo are set.
24830
24987
  return this.datepicker.rangeLabelAfterRange || 'after range';
24831
24988
  }
24832
24989
 
@@ -24839,7 +24996,7 @@ class AuroCalendarCell extends i$2 {
24839
24996
  */
24840
24997
  isDepartDate(day, dateFrom) {
24841
24998
  const parsedDateFrom = parseInt(dateFrom, 10);
24842
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
24999
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
24843
25000
 
24844
25001
  return this.selected && day.date === departTimestamp;
24845
25002
  }
@@ -24854,7 +25011,7 @@ class AuroCalendarCell extends i$2 {
24854
25011
  */
24855
25012
  isReturnDate(day, dateFrom, dateTo) {
24856
25013
  const parsedDateTo = parseInt(dateTo, 10);
24857
- const returnTimestamp = startOfDay$1(parsedDateTo * 1000) / 1000;
25014
+ const returnTimestamp = new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000;
24858
25015
 
24859
25016
  return this.selected && day.date === returnTimestamp && dateFrom;
24860
25017
  }
@@ -25018,6 +25175,7 @@ class AuroCalendarCell extends i$2 {
25018
25175
  setTimeout(() => this.firstUpdated(), 0);
25019
25176
  return;
25020
25177
  }
25178
+ this.calendar = calendar;
25021
25179
  this.datepicker = calendar.datepicker;
25022
25180
  this._slotContentHandler = () => {
25023
25181
  this.handleSlotContent();
@@ -25075,15 +25233,28 @@ class AuroCalendarCell extends i$2 {
25075
25233
  this._cachedButton = this.shadowRoot.querySelector('button.day');
25076
25234
  });
25077
25235
 
25078
- // Update host-level aria attributes for ariaActiveDescendantElement.
25236
+ // Keep the host's gridcell aria attributes in sync with the day data.
25079
25237
  this.updateHostAria();
25080
25238
  }
25081
25239
 
25082
25240
  // Update host aria when selection changes (aria-selected, range labels)
25083
- if (properties.has('dateFrom') || properties.has('dateTo') || properties.has('selected')) {
25241
+ // or when isCurrentDate flips (aria-current).
25242
+ if (properties.has('dateFrom') || properties.has('dateTo') || properties.has('selected') || properties.has('isCurrentDate')) {
25084
25243
  this.updateHostAria();
25085
25244
  }
25086
25245
 
25246
+ // When the rendered range shifts (month nav, min/max change), a cell
25247
+ // host may be re-rendered for a new date that is now out-of-range —
25248
+ // but its imperatively-set `active` flag and `activeCell` ring class
25249
+ // from the previous date persist because setActiveCell only iterates
25250
+ // focusable (in-range) cells when clearing the prior active state.
25251
+ // Drop the active state here so the disabled cell isn't left visually
25252
+ // ringed.
25253
+ if ((properties.has('day') || properties.has('min') || properties.has('max')) &&
25254
+ this.active && this.isOutOfRange(this.day, this.min, this.max)) {
25255
+ this.clearActive();
25256
+ }
25257
+
25087
25258
  // Configure popover when it first becomes rendered
25088
25259
  if (properties.has('hasPopoverContent') && this.hasPopoverContent) {
25089
25260
  this.updateComplete.then(() => this.configurePopover());
@@ -25091,8 +25262,8 @@ class AuroCalendarCell extends i$2 {
25091
25262
  }
25092
25263
 
25093
25264
  /**
25094
- * Updates ARIA attributes on the host element so that
25095
- * ariaActiveDescendantElement can expose cell info to the SR.
25265
+ * Sets host-level ARIA so each cell exposes its date, selection state,
25266
+ * and blackout status to assistive tech browsing the month grid.
25096
25267
  * @private
25097
25268
  * @returns {void}
25098
25269
  */
@@ -25101,16 +25272,27 @@ class AuroCalendarCell extends i$2 {
25101
25272
 
25102
25273
  const outOfRange = this.isOutOfRange(this.day, this.min, this.max);
25103
25274
  if (outOfRange) {
25275
+ // Strip every aria attribute the in-range branch may have set on a
25276
+ // previous render — if a cell flips from in-range to out-of-range
25277
+ // (calendar shifts months, minDate/maxDate change, etc.).
25104
25278
  this.removeAttribute('role');
25105
25279
  this.removeAttribute('aria-label');
25280
+ this.removeAttribute('aria-current');
25281
+ this.removeAttribute('aria-selected');
25282
+ this.removeAttribute('aria-disabled');
25106
25283
  return;
25107
25284
  }
25108
25285
 
25109
- // The host acts as the gridcell for ariaActiveDescendantElement.
25110
25286
  this.setAttribute('role', 'gridcell');
25111
25287
  this.setAttribute('aria-label', this.getAriaLabel());
25112
25288
  this.setAttribute('aria-selected', this.selected ? 'true' : 'false');
25113
25289
 
25290
+ if (this.isCurrentDate) {
25291
+ this.setAttribute('aria-current', 'date');
25292
+ } else {
25293
+ this.removeAttribute('aria-current');
25294
+ }
25295
+
25114
25296
  if (this.isBlackout()) {
25115
25297
  this.setAttribute('aria-disabled', 'true');
25116
25298
  } else {
@@ -25125,7 +25307,7 @@ class AuroCalendarCell extends i$2 {
25125
25307
  * @returns {void}
25126
25308
  */
25127
25309
  focusButton() {
25128
- const button = this._cachedButton || this.shadowRoot.querySelector('button:not([aria-hidden])');
25310
+ const button = this._cachedButton || this.shadowRoot.querySelector('button:not([disabled])');
25129
25311
  if (button) {
25130
25312
  button.focus({ focusVisible: true });
25131
25313
  }
@@ -25133,10 +25315,22 @@ class AuroCalendarCell extends i$2 {
25133
25315
 
25134
25316
  /**
25135
25317
  * Imperatively marks this cell as active without triggering a Lit re-render.
25136
- * Note: buttons stay tabindex="-1" because the grid uses aria-activedescendant.
25318
+ * Buttons stay tabindex="-1" because DOM focus stays on the grid wrapper
25319
+ * arrow keys move the active cell imperatively and the live region carries
25320
+ * the SR announcement.
25321
+ *
25322
+ * Refuses to activate out-of-range cells: those are aria-hidden, have no
25323
+ * click/focus handlers, and are filtered out of `getFocusableCells`. The
25324
+ * active class showing on a disabled cell would be visually misleading,
25325
+ * so this guard is the single source of truth across every code path
25326
+ * that might call setActive (keyboard nav, focus restore, cell click).
25137
25327
  * @returns {void}
25138
25328
  */
25139
25329
  setActive() {
25330
+ if (this.isOutOfRange(this.day, this.min, this.max)) {
25331
+ return;
25332
+ }
25333
+
25140
25334
  this.active = true;
25141
25335
 
25142
25336
  // Show the popover when this cell becomes active via keyboard navigation.
@@ -25175,10 +25369,13 @@ class AuroCalendarCell extends i$2 {
25175
25369
  if (!btn || !this.day) return;
25176
25370
 
25177
25371
  const dayDate = this.day.date;
25178
- const departTimestamp = startOfDay$1(dateFrom * 1000) / 1000;
25372
+ const departTimestamp = new Date(dateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
25179
25373
  const isInRange = dayDate > departTimestamp && dayDate < hoveredDate;
25180
- const isLastHovered = dayDate === hoveredDate && hoveredDate > departTimestamp;
25181
- const isDepartWithPreview = dayDate === departTimestamp && hoveredDate > departTimestamp;
25374
+ // `>=` so hovering the depart cell itself (a same-day round-trip
25375
+ // preview) still surfaces a visual cue: the depart cell receives both
25376
+ // rangeDepartDate and lastHoveredDate.
25377
+ const isLastHovered = dayDate === hoveredDate && hoveredDate >= departTimestamp;
25378
+ const isDepartWithPreview = dayDate === departTimestamp && hoveredDate >= departTimestamp;
25182
25379
 
25183
25380
  btn.classList.toggle('inRange', isInRange);
25184
25381
  btn.classList.toggle('lastHoveredDate', isLastHovered);
@@ -25236,7 +25433,6 @@ class AuroCalendarCell extends i$2 {
25236
25433
  @focus="${outOfRange ? undefined : this.handleFocus}"
25237
25434
  class="${e$2(buttonClasses)}"
25238
25435
  ?disabled="${outOfRange}"
25239
- aria-hidden="${outOfRange ? 'true' : A$7}"
25240
25436
  tabindex="-1">
25241
25437
  <div class="buttonWrapper" aria-hidden="true">
25242
25438
  <div class="currentDayMarker">${this.day?.title || A$7}</div>
@@ -25947,7 +26143,7 @@ class CalendarUtilities {
25947
26143
 
25948
26144
  var colorCss$4$2 = i$4`#headerContainer{box-shadow:var(--ds-auro-dropdownbib-header-boxshadow-color)}#footerContainer{background-color:var(--ds-auro-dropdownbib-footer-container-color)}`;
25949
26145
 
25950
- var styleCss$4$3 = i$4`#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)}`;
26146
+ var styleCss$4$3 = i$4`#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)}`;
25951
26147
 
25952
26148
  var tokenCss$4 = i$4`: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)}`;
25953
26149
 
@@ -26342,7 +26538,7 @@ let AuroBibtemplate$3 = class AuroBibtemplate extends i$2 {
26342
26538
  }
26343
26539
  };
26344
26540
 
26345
- var formkitVersion$2$1 = '202606231948';
26541
+ var formkitVersion$2$1 = '202607010104';
26346
26542
 
26347
26543
  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$5`${s$5(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$4`: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}
26348
26544
  `,u$4$2=i$4`.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}}
@@ -26447,6 +26643,15 @@ class AuroCalendar extends RangeDatepicker {
26447
26643
  */
26448
26644
  this.activeCellDate = null;
26449
26645
 
26646
+ /**
26647
+ * Cached reference to the active cell host. Set by setActiveCell and
26648
+ * refreshed by scrollToActiveCell when its cache check misses (stale
26649
+ * or missing). Lets scrollToActiveCell skip a full cell scan on each
26650
+ * arrow key.
26651
+ * @private
26652
+ */
26653
+ this._activeCell = null;
26654
+
26450
26655
  /**
26451
26656
  * Whether the #calendarGrid wrapper currently has focus.
26452
26657
  * Used to determine whether the visualFocus ring should be shown.
@@ -26465,7 +26670,11 @@ class AuroCalendar extends RangeDatepicker {
26465
26670
  this.calendarRangeMonths = null;
26466
26671
 
26467
26672
  /**
26468
- * Legacy array of disabled-date timestamps.
26673
+ * @deprecated Use `auro-datepicker.blackoutDates` (an array of
26674
+ * `YYYY-MM-DD` ISO strings) instead. This legacy array of Unix
26675
+ * timestamps is still honored for backward compatibility but emits a
26676
+ * one-time `console.debug` the first time a non-empty value is observed.
26677
+ * Support will be removed in a future major release.
26469
26678
  * @private
26470
26679
  */
26471
26680
  this.disabledDays = [];
@@ -26722,17 +26931,44 @@ class AuroCalendar extends RangeDatepicker {
26722
26931
  * @returns {void}
26723
26932
  */
26724
26933
  updateActiveCellForVisibleMonth() {
26725
- // Use double-rAF to ensure child month/cell components have fully
26726
- // rendered and cached their button references before we set tabindex.
26727
- requestAnimationFrame(() => {
26728
- requestAnimationFrame(() => {
26729
- const newDate = this.computeActiveDate({ skipDateFrom: true });
26934
+ this._afterMonthRender(() => {
26935
+ const newDate = this.computeActiveDate({ skipDateFrom: true });
26730
26936
 
26731
- if (newDate !== null && newDate !== undefined) {
26732
- this.activeCellDate = newDate;
26733
- this.setActiveCell(this.activeCellDate);
26734
- }
26735
- });
26937
+ if (newDate !== null && newDate !== undefined) {
26938
+ this.activeCellDate = newDate;
26939
+ this.setActiveCell(this.activeCellDate);
26940
+ }
26941
+ });
26942
+ }
26943
+
26944
+ /**
26945
+ * Schedules `callback` two animation frames out, giving the child
26946
+ * `auro-formkit-calendar-month` and `auro-formkit-calendar-cell` elements
26947
+ * a full render-and-paint cycle to settle before the callback reads or
26948
+ * mutates DOM.
26949
+ *
26950
+ * Why two frames, not one:
26951
+ * 1. Lit batches property updates and renders in a microtask, so frame N
26952
+ * schedules the render but the new DOM may not be painted yet.
26953
+ * 2. Cells re-cache `_cachedButton` inside their own `updateComplete.then`,
26954
+ * which also lands a tick later. Reading buttons from frame N+1
26955
+ * (after both renders + cache refresh have flushed) reliably hits the
26956
+ * new month's cells.
26957
+ *
26958
+ * Used by every code path that calls `handleNextMonth`/`handlePrevMonth`
26959
+ * and then needs to inspect the freshly-rendered cells (cross-month
26960
+ * keyboard nav, boundary events, `updateActiveCellForVisibleMonth`).
26961
+ * Do NOT collapse to a single rAF — it intermittently lands before
26962
+ * `_cachedButton` is refreshed, which silently breaks focus restoration
26963
+ * and `setActiveCell` lookups.
26964
+ * @private
26965
+ * @param {() => void} callback - Runs once after the month re-render and
26966
+ * the cells' button caches have refreshed.
26967
+ * @returns {void}
26968
+ */
26969
+ _afterMonthRender(callback) {
26970
+ requestAnimationFrame(() => {
26971
+ requestAnimationFrame(callback);
26736
26972
  });
26737
26973
  }
26738
26974
 
@@ -26850,6 +27086,47 @@ class AuroCalendar extends RangeDatepicker {
26850
27086
  return Array.from(this.shadowRoot.querySelectorAll('auro-formkit-calendar-month'));
26851
27087
  }
26852
27088
 
27089
+ /**
27090
+ * Picks the focusable cell whose date is closest to targetTs. Used as a
27091
+ * fallback after a month-boundary nav when the exact target date isn't
27092
+ * focusable — typically because the month re-render lagged or the date
27093
+ * was filtered out by isOutOfRange. When two cells are equidistant, the
27094
+ * navigation direction breaks the tie so the user moves the way they
27095
+ * pressed (forward → later cell, backward → earlier cell).
27096
+ * @private
27097
+ * @param {Array} cells - Focusable cells from getAllFocusableCells.
27098
+ * @param {Number} targetTs - Desired Unix timestamp (seconds).
27099
+ * @param {'next'|'prev'} direction - Navigation direction.
27100
+ * @returns {Object|null} The nearest cell, or null when cells is empty.
27101
+ */
27102
+ pickNearestCell(cells, targetTs, direction) {
27103
+ if (!cells.length) {
27104
+ return null;
27105
+ }
27106
+ const forward = direction === 'next';
27107
+ let best = null;
27108
+ let bestDelta = Infinity;
27109
+ cells.forEach((cell) => {
27110
+ if (!cell.day) {
27111
+ return;
27112
+ }
27113
+ const distance = Math.abs(cell.day.date - targetTs);
27114
+ if (distance < bestDelta) {
27115
+ best = cell;
27116
+ bestDelta = distance;
27117
+ return;
27118
+ }
27119
+ if (distance === bestDelta && best) {
27120
+ if (forward && cell.day.date > best.day.date) {
27121
+ best = cell;
27122
+ } else if (!forward && cell.day.date < best.day.date) {
27123
+ best = cell;
27124
+ }
27125
+ }
27126
+ });
27127
+ return best;
27128
+ }
27129
+
26853
27130
  /**
26854
27131
  * Gets all focusable cells across all rendered months.
26855
27132
  * @private
@@ -26866,9 +27143,9 @@ class AuroCalendar extends RangeDatepicker {
26866
27143
 
26867
27144
  /**
26868
27145
  * Sets the active cell across all months. Only one cell has tabindex="0" at a time.
26869
- * Uses imperative DOM manipulation — no Lit re-render triggered.
26870
- * Also updates ariaActiveDescendantElement on the grid wrapper so
26871
- * screen readers announce the active cell without moving DOM focus.
27146
+ * Uses imperative DOM manipulation — no Lit re-render triggered. DOM focus
27147
+ * stays on the grid wrapper; the live region (see getOrCreateLiveRegion)
27148
+ * is what announces the active cell to assistive tech.
26872
27149
  * @param {Number} date - Unix timestamp of the cell to activate.
26873
27150
  * @returns {void}
26874
27151
  */
@@ -26886,6 +27163,9 @@ class AuroCalendar extends RangeDatepicker {
26886
27163
  });
26887
27164
 
26888
27165
  this.activeCellDate = date;
27166
+ // Cache so scrollToActiveCell can scroll without re-querying all cells
27167
+ // on every arrow keypress.
27168
+ this._activeCell = newActiveCell;
26889
27169
 
26890
27170
  // Apply activeCell ring only when the grid currently has focus.
26891
27171
  if (newActiveCell && this._gridHasFocus) {
@@ -26917,10 +27197,23 @@ class AuroCalendar extends RangeDatepicker {
26917
27197
  /**
26918
27198
  * Shows the activeCell ring when the grid gains focus.
26919
27199
  * @private
27200
+ * @param {FocusEvent} [event] - The focusin event.
26920
27201
  * @returns {void}
26921
27202
  */
26922
- handleGridFocusIn() {
27203
+ handleGridFocusIn(event) {
26923
27204
  this._gridHasFocus = true;
27205
+
27206
+ // Only apply the activeCell ring when the grid wrapper itself receives focus
27207
+ // (Tab/programmatic). When focus moves into a cell button via mousedown,
27208
+ // event.target is the cell descendant — skip the ring here. The subsequent
27209
+ // click handler calls setActiveCell on the clicked cell, which applies the
27210
+ // ring there. Without this guard, mousedown briefly flashes the ring on the
27211
+ // previously-active cell (e.g. the 1st-of-month set by month navigation
27212
+ // when the grid was not focused).
27213
+ if (event && event.target !== event.currentTarget) {
27214
+ return;
27215
+ }
27216
+
26924
27217
  const activeCell = this.getAllFocusableCells().find((cell) => cell.active);
26925
27218
  if (activeCell) {
26926
27219
  const btn = activeCell._cachedButton || activeCell.shadowRoot.querySelector('button.day');
@@ -26949,6 +27242,65 @@ class AuroCalendar extends RangeDatepicker {
26949
27242
  this.clearRangePreview();
26950
27243
  }
26951
27244
 
27245
+ /**
27246
+ * Returns a memoized Set of blackout timestamps (seconds) drawn from both
27247
+ * the legacy `disabledDays` array and the datepicker's ISO `blackoutDates`.
27248
+ * The cache invalidates when either source array's reference changes, which
27249
+ * matches Lit's own reactive identity semantics for array properties.
27250
+ * @private
27251
+ * @returns {Set<Number>}
27252
+ */
27253
+ _getBlackoutSet() {
27254
+ // Normalize non-array values to a stable `null` sentinel rather than a
27255
+ // fresh `[]` per call — otherwise the reference-identity cache key
27256
+ // (`_cachedBlackoutDisabledDays === disabledDays`) never matches on
27257
+ // subsequent calls and the Set rebuilds every time. `buildBlackoutSet`
27258
+ // already treats null/non-array as "no legacy disabledDays" via its
27259
+ // own Array.isArray gate.
27260
+ const disabledDays = Array.isArray(this.disabledDays) ? this.disabledDays : null;
27261
+ const blackoutDates = this.datepicker?.blackoutDates;
27262
+ if (this._blackoutSet &&
27263
+ this._cachedBlackoutDisabledDays === disabledDays &&
27264
+ this._cachedBlackoutDates === blackoutDates) {
27265
+ return this._blackoutSet;
27266
+ }
27267
+
27268
+ if (disabledDays && disabledDays.length > 0) {
27269
+ this._warnDisabledDaysDeprecated();
27270
+ }
27271
+
27272
+ this._blackoutSet = buildBlackoutSet(disabledDays, blackoutDates);
27273
+ this._cachedBlackoutDisabledDays = disabledDays;
27274
+ this._cachedBlackoutDates = blackoutDates;
27275
+ return this._blackoutSet;
27276
+ }
27277
+
27278
+ /**
27279
+ * Per-class flag that gates the `disabledDays` deprecation warning so it
27280
+ * fires exactly once per page no matter how many calendars or rebuild
27281
+ * cycles encounter the legacy array.
27282
+ * @private
27283
+ */
27284
+ static _warnedDisabledDaysDeprecation = false;
27285
+
27286
+ /**
27287
+ * One-time `console.debug` directing consumers from the legacy
27288
+ * `disabledDays` Unix-timestamp API to the ISO `blackoutDates` API. Fires
27289
+ * the first time `_getBlackoutSet` rebuilds from a non-empty
27290
+ * `disabledDays`; subsequent calls (on this or any other AuroCalendar
27291
+ * instance on the page) are silent.
27292
+ * @private
27293
+ * @returns {void}
27294
+ */
27295
+ _warnDisabledDaysDeprecated() {
27296
+ if (AuroCalendar._warnedDisabledDaysDeprecation) {
27297
+ return;
27298
+ }
27299
+ AuroCalendar._warnedDisabledDaysDeprecation = true;
27300
+ // eslint-disable-next-line no-console
27301
+ 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.');
27302
+ }
27303
+
26952
27304
  /**
26953
27305
  * Computes the initial active date from data properties alone — no DOM required.
26954
27306
  * Priority:
@@ -26993,21 +27345,10 @@ class AuroCalendar extends RangeDatepicker {
26993
27345
  const minTs = Number.isFinite(rawMin) ? rawMin : -Infinity;
26994
27346
  const maxTs = Number.isFinite(rawMax) ? rawMax : Infinity;
26995
27347
 
26996
- // Build a Set of blackout timestamps for O(1) lookup.
26997
- const blackoutSet = new Set(this.disabledDays.map((day) => parseInt(day, 10)));
26998
-
26999
- // Also include ISO-format blackoutDates from the datepicker if available.
27000
- // Parse YYYY-MM-DD as local date to avoid UTC shift issues.
27001
- const isoBlackouts = this.datepicker?.blackoutDates;
27002
- if (Array.isArray(isoBlackouts)) {
27003
- for (const isoStr of isoBlackouts) {
27004
- const parts = isoStr.split('-');
27005
- const ts = Math.floor(new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10)).getTime() / 1000);
27006
- if (Number.isFinite(ts)) {
27007
- blackoutSet.add(ts);
27008
- }
27009
- }
27010
- }
27348
+ // Build a Set of blackout timestamps for O(1) lookup. Memoized by the
27349
+ // identity of the source arrays so rapid month nav doesn't rebuild the
27350
+ // Set (and re-parse every ISO string) on every keypress.
27351
+ const blackoutSet = this._getBlackoutSet();
27011
27352
 
27012
27353
  /**
27013
27354
  * A date (unix timestamp in seconds, midnight-aligned) is "enabled" when
@@ -27203,8 +27544,8 @@ class AuroCalendar extends RangeDatepicker {
27203
27544
 
27204
27545
  /**
27205
27546
  * Handles arrow key navigation on the calendar grid wrapper.
27206
- * Focus stays on the grid wrapper; only ariaActiveDescendantElement
27207
- * and the visual active-cell indicator change.
27547
+ * Focus stays on the grid wrapper; only the visual active-cell indicator
27548
+ * changes. The live region announces the new active cell.
27208
27549
  * @private
27209
27550
  * @param {KeyboardEvent} event - The keyboard event.
27210
27551
  * @returns {void}
@@ -27269,21 +27610,24 @@ class AuroCalendar extends RangeDatepicker {
27269
27610
  } else {
27270
27611
  this.handlePrevMonth({ skipActiveUpdate: true });
27271
27612
  }
27272
- requestAnimationFrame(() => {
27273
- requestAnimationFrame(() => {
27274
- const cells = this.getAllFocusableCells();
27275
- const target = cells.find((cell) => cell.day && cell.day.date === targetTs);
27276
- if (target) {
27277
- this.setActiveCell(target.day.date);
27278
- this.handleCellFocused({ detail: { date: target.day.date } });
27279
- } else if (cells.length > 0) {
27280
- const fallback = navDir === 'next' ? cells[cells.length - 1] : cells[0];
27613
+ this._afterMonthRender(() => {
27614
+ const cells = this.getAllFocusableCells();
27615
+ const target = cells.find((cell) => cell.day && cell.day.date === targetTs);
27616
+ if (target) {
27617
+ this.setActiveCell(target.day.date);
27618
+ this.handleCellFocused({ detail: { date: target.day.date } });
27619
+ } else {
27620
+ const fallback = this.pickNearestCell(cells, targetTs, navDir);
27621
+ if (fallback) {
27281
27622
  this.setActiveCell(fallback.day.date);
27282
27623
  this.handleCellFocused({ detail: { date: fallback.day.date } });
27283
27624
  }
27284
- // Re-focus grid wrapper after month change re-render
27285
- this.focusActiveCell();
27286
- });
27625
+ }
27626
+ // Scroll AFTER the cross-month setActiveCell so the freshly
27627
+ // activated cell is what gets scrolled into view.
27628
+ this.scrollToActiveCell();
27629
+ // Re-focus grid wrapper after month change re-render
27630
+ this.focusActiveCell();
27287
27631
  });
27288
27632
  }
27289
27633
  }
@@ -27309,26 +27653,23 @@ class AuroCalendar extends RangeDatepicker {
27309
27653
  } else {
27310
27654
  this.handlePrevMonth({ skipActiveUpdate: true });
27311
27655
  }
27312
- requestAnimationFrame(() => {
27313
- requestAnimationFrame(() => {
27314
- const cells = this.getAllFocusableCells();
27315
- const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
27316
- if (target) {
27317
- this.setActiveCell(target.day.date);
27318
- this.handleCellFocused({ detail: { date: target.day.date } });
27319
- } else if (cells.length > 0) {
27320
- let nearest = null;
27321
-
27322
- if (navDirection === 'next') {
27323
- [nearest] = cells;
27324
- } else {
27325
- nearest = cells[cells.length - 1];
27326
- }
27656
+ this._afterMonthRender(() => {
27657
+ const cells = this.getAllFocusableCells();
27658
+ const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
27659
+ if (target) {
27660
+ this.setActiveCell(target.day.date);
27661
+ this.handleCellFocused({ detail: { date: target.day.date } });
27662
+ } else {
27663
+ const nearest = this.pickNearestCell(cells, targetDate, navDirection);
27664
+ if (nearest) {
27327
27665
  this.setActiveCell(nearest.day.date);
27328
27666
  this.handleCellFocused({ detail: { date: nearest.day.date } });
27329
27667
  }
27330
- this.focusActiveCell();
27331
- });
27668
+ }
27669
+ // Scroll AFTER the cross-month setActiveCell so the freshly
27670
+ // activated cell is what gets scrolled into view.
27671
+ this.scrollToActiveCell();
27672
+ this.focusActiveCell();
27332
27673
  });
27333
27674
  }
27334
27675
  }
@@ -27362,6 +27703,8 @@ class AuroCalendar extends RangeDatepicker {
27362
27703
  const targetCell = allCells[targetIndex];
27363
27704
  this.setActiveCell(targetCell.day.date);
27364
27705
  this.scrollToActiveCell();
27706
+ // Match the cross-month branches: keep DOM focus on the grid wrapper
27707
+ // so subsequent arrow keys continue to land on this handler.
27365
27708
  this.focusActiveCell();
27366
27709
  } else if (direction === 'next' && this.showNextMonthBtn) {
27367
27710
  // Navigate to next month and focus the computed next date.
@@ -27378,19 +27721,22 @@ class AuroCalendar extends RangeDatepicker {
27378
27721
  }
27379
27722
 
27380
27723
  this.handleNextMonth({ skipActiveUpdate: true });
27381
- requestAnimationFrame(() => {
27382
- requestAnimationFrame(() => {
27383
- const cells = this.getAllFocusableCells();
27384
- const target = cells.find((cell) => cell.day && cell.day.date === nextTs);
27385
- if (target) {
27386
- this.setActiveCell(target.day.date);
27387
- this.focusActiveCell();
27388
- } else if (cells.length > 0) {
27389
- // Fallback: first cell of the last rendered month
27390
- this.setActiveCell(cells[cells.length - 1].day.date);
27391
- this.focusActiveCell();
27724
+ this._afterMonthRender(() => {
27725
+ const cells = this.getAllFocusableCells();
27726
+ const target = cells.find((cell) => cell.day && cell.day.date === nextTs);
27727
+ if (target) {
27728
+ this.setActiveCell(target.day.date);
27729
+ } else {
27730
+ // Same nearest-by-date fallback handleGridKeyDown uses — direct
27731
+ // `cells[length - 1]` would land on the end of the new month,
27732
+ // far from the user's intended `nextTs`.
27733
+ const fallback = this.pickNearestCell(cells, nextTs, 'next');
27734
+ if (fallback) {
27735
+ this.setActiveCell(fallback.day.date);
27392
27736
  }
27393
- });
27737
+ }
27738
+ this.scrollToActiveCell();
27739
+ this.focusActiveCell();
27394
27740
  });
27395
27741
  } else if (direction === 'prev' && this.showPrevMonthBtn) {
27396
27742
  // Navigate to previous month and focus the computed previous date.
@@ -27404,19 +27750,22 @@ class AuroCalendar extends RangeDatepicker {
27404
27750
  }
27405
27751
 
27406
27752
  this.handlePrevMonth({ skipActiveUpdate: true });
27407
- requestAnimationFrame(() => {
27408
- requestAnimationFrame(() => {
27409
- const cells = this.getAllFocusableCells();
27410
- const target = cells.find((cell) => cell.day && cell.day.date === prevTs);
27411
- if (target) {
27412
- this.setActiveCell(target.day.date);
27413
- this.focusActiveCell();
27414
- } else if (cells.length > 0) {
27415
- // Fallback: last cell of the first rendered month
27416
- this.setActiveCell(cells[0].day.date);
27417
- this.focusActiveCell();
27753
+ this._afterMonthRender(() => {
27754
+ const cells = this.getAllFocusableCells();
27755
+ const target = cells.find((cell) => cell.day && cell.day.date === prevTs);
27756
+ if (target) {
27757
+ this.setActiveCell(target.day.date);
27758
+ } else {
27759
+ // Same nearest-by-date fallback handleGridKeyDown uses — direct
27760
+ // `cells[0]` would land on the start of the previous month, far
27761
+ // from the user's intended `prevTs`.
27762
+ const fallback = this.pickNearestCell(cells, prevTs, 'prev');
27763
+ if (fallback) {
27764
+ this.setActiveCell(fallback.day.date);
27418
27765
  }
27419
- });
27766
+ }
27767
+ this.scrollToActiveCell();
27768
+ this.focusActiveCell();
27420
27769
  });
27421
27770
  }
27422
27771
  } else if (key === 'ArrowDown' || key === 'ArrowUp') {
@@ -27444,20 +27793,22 @@ class AuroCalendar extends RangeDatepicker {
27444
27793
  } else {
27445
27794
  this.handlePrevMonth({ skipActiveUpdate: true });
27446
27795
  }
27447
- requestAnimationFrame(() => {
27448
- requestAnimationFrame(() => {
27449
- const cells = this.getAllFocusableCells();
27450
- const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
27451
- if (target) {
27452
- this.setActiveCell(target.day.date);
27453
- this.focusActiveCell();
27454
- } else if (cells.length > 0) {
27455
- // Clamp to nearest focusable cell
27456
- const nearest = navDirection === 'next' ? cells[0] : cells[cells.length - 1];
27796
+ this._afterMonthRender(() => {
27797
+ const cells = this.getAllFocusableCells();
27798
+ const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
27799
+ if (target) {
27800
+ this.setActiveCell(target.day.date);
27801
+ } else {
27802
+ // Same nearest-by-date fallback handleGridKeyDown uses — the
27803
+ // old direction-based `cells[0]`/`cells[length-1]` clamp
27804
+ // could land 25+ days from the intended target.
27805
+ const nearest = this.pickNearestCell(cells, targetDate, navDirection);
27806
+ if (nearest) {
27457
27807
  this.setActiveCell(nearest.day.date);
27458
- this.focusActiveCell();
27459
27808
  }
27460
- });
27809
+ }
27810
+ this.scrollToActiveCell();
27811
+ this.focusActiveCell();
27461
27812
  });
27462
27813
  }
27463
27814
  }
@@ -27496,8 +27847,9 @@ class AuroCalendar extends RangeDatepicker {
27496
27847
  return;
27497
27848
  }
27498
27849
 
27499
- // With aria-activedescendant, the button no longer receives native focus,
27500
- // so we use the debounced live region for the full context announcement.
27850
+ // DOM focus stays on the grid wrapper while arrow keys move the active
27851
+ // cell, so cell buttons never receive native focus. The debounced live
27852
+ // region carries the full-context announcement instead.
27501
27853
  const announcement = this.buildFocusAnnouncement(date);
27502
27854
  this.announceFocusDebounced(announcement);
27503
27855
 
@@ -27567,10 +27919,10 @@ class AuroCalendar extends RangeDatepicker {
27567
27919
  return null;
27568
27920
  }
27569
27921
 
27570
- const departTs = startOfDay$2(parsedFrom * 1000) / 1000;
27922
+ const departTs = new Date(parsedFrom * 1000).setHours(0, 0, 0, 0) / 1000;
27571
27923
  const parsedTo = Number.parseInt(this.dateTo, 10);
27572
27924
  const hasTo = Number.isFinite(parsedTo);
27573
- const returnTs = hasTo ? startOfDay$2(parsedTo * 1000) / 1000 : null;
27925
+ const returnTs = hasTo ? new Date(parsedTo * 1000).setHours(0, 0, 0, 0) / 1000 : null;
27574
27926
 
27575
27927
  if (date === departTs) {
27576
27928
  return this.datepicker.rangeLabelStart || 'range start';
@@ -27584,36 +27936,22 @@ class AuroCalendar extends RangeDatepicker {
27584
27936
  if (hasTo && date > departTs && date < returnTs) {
27585
27937
  return this.datepicker.rangeLabelInRange || 'in range';
27586
27938
  }
27939
+ if (!hasTo && date > departTs) {
27940
+ return this.datepicker.rangeLabelEndPreview || 'previewing range end';
27941
+ }
27587
27942
  return this.datepicker.rangeLabelAfterRange || 'after range';
27588
27943
  }
27589
27944
 
27590
27945
  /**
27591
- * Checks whether a given date is a blackout date.
27946
+ * Checks whether a given date is a blackout date. Delegates to the
27947
+ * memoized `_getBlackoutSet` so the YYYY-MM-DD parsing and the
27948
+ * legacy/ISO merge rules live in exactly one place (see `blackoutUtils.js`).
27592
27949
  * @private
27593
27950
  * @param {Number} dateTs - Unix timestamp (seconds).
27594
27951
  * @returns {Boolean} True if the date is blacked out.
27595
27952
  */
27596
27953
  isDateBlackout(dateTs) {
27597
- // Check legacy disabledDays.
27598
- if (Array.isArray(this.disabledDays) && this.disabledDays.length > 0) {
27599
- if (this.disabledDays.findIndex((day) => parseInt(day, 10) === dateTs) !== -1) {
27600
- return true;
27601
- }
27602
- }
27603
-
27604
- // Check ISO blackoutDates.
27605
- const blackoutDates = this.datepicker?.blackoutDates;
27606
- if (Array.isArray(blackoutDates) && blackoutDates.length > 0) {
27607
- const date = new Date(dateTs * 1000);
27608
- const yyyy = date.getFullYear();
27609
- const mm = String(date.getMonth() + 1).padStart(2, '0');
27610
- const dd = String(date.getDate()).padStart(2, '0');
27611
- if (blackoutDates.includes(`${yyyy}-${mm}-${dd}`)) {
27612
- return true;
27613
- }
27614
- }
27615
-
27616
- return false;
27954
+ return this._getBlackoutSet().has(dateTs);
27617
27955
  }
27618
27956
 
27619
27957
  /**
@@ -27671,7 +28009,28 @@ class AuroCalendar extends RangeDatepicker {
27671
28009
  }
27672
28010
 
27673
28011
  /**
27674
- * Scrolls the calendar to ensure the month containing the active cell is visible.
28012
+ * Scrolls the calendar so the active cell is visible.
28013
+ *
28014
+ * Walks the flat tree (rendered, slot-aware) outward from the active
28015
+ * cell's button and calls `scrollBy` on every vertically-scrollable
28016
+ * ancestor by whatever delta still separates the cell from that
28017
+ * ancestor's viewport. Native `scrollIntoView` is not used because the
28018
+ * cell sits inside multiple nested scroll containers (the dropdown bib's
28019
+ * `<dialog>`, the bibtemplate's `#bodyContainer`) and the algorithm only
28020
+ * scrolls one of them on its own, leaving the cell short of the
28021
+ * viewport in mobile fullscreen.
28022
+ *
28023
+ * Uses `behavior: 'auto'` (the spec's universally-supported non-animated
28024
+ * value) so each `scrollBy` resolves synchronously and the next
28025
+ * iteration's `getBoundingClientRect` reads post-scroll positions
28026
+ * accurately. This also satisfies `prefers-reduced-motion` users — the
28027
+ * scroll containers do not set CSS `scroll-behavior: smooth`, so `auto`
28028
+ * is effectively instant.
28029
+ *
28030
+ * The active cell is looked up from the cache populated by
28031
+ * `setActiveCell`. On a cache miss (stale or absent) the cache is
28032
+ * refreshed from a single full scan so subsequent calls stay on the
28033
+ * fast path.
27675
28034
  * @private
27676
28035
  * @returns {void}
27677
28036
  */
@@ -27680,16 +28039,69 @@ class AuroCalendar extends RangeDatepicker {
27680
28039
  return;
27681
28040
  }
27682
28041
 
27683
- const date = new Date(this.activeCellDate * 1000);
27684
- const month = date.getMonth() + 1;
27685
- const year = date.getFullYear();
27686
- const selector = `#month-${month}-${year}`;
27687
- const monthElem = this.shadowRoot.querySelector(selector);
28042
+ // Prefer the cell cached by setActiveCell so arrow-key navigation does
28043
+ // not rebuild the full cell list on every keypress. Fall back to a
28044
+ // lookup when the cache is stale (e.g. detached after month re-render)
28045
+ // or absent (scrollToActiveCell called without a prior setActiveCell);
28046
+ // refresh the cache on the fallback path so a subsequent call reuses it.
28047
+ const activeDate = this.activeCellDate;
28048
+ const cached = this._activeCell;
28049
+ const cacheFresh = cached && cached.isConnected && cached.day && cached.day.date === activeDate;
28050
+ let activeCell = null;
28051
+ if (cacheFresh) {
28052
+ activeCell = cached;
28053
+ } else {
28054
+ activeCell = this.getAllFocusableCells().find((cell) => cell.day && cell.day.date === activeDate);
28055
+ this._activeCell = activeCell || null;
28056
+ }
28057
+ if (!activeCell) {
28058
+ return;
28059
+ }
27688
28060
 
27689
- if (monthElem) {
27690
- const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
27691
- monthElem.scrollIntoView({ block: 'nearest',
27692
- behavior: prefersReducedMotion ? 'instant' : 'smooth' });
28061
+ // Scroll the button inside the cell — it has concrete dimensions,
28062
+ // which avoids quirks when the cell host has display: inline / contents
28063
+ // / flex-without-explicit-size.
28064
+ const target = activeCell._cachedButton ||
28065
+ activeCell.shadowRoot?.querySelector('button.day') ||
28066
+ activeCell;
28067
+
28068
+ // parentNode follows the authored DOM tree and steps over shadow roots
28069
+ // via slot projection. A slotted element's visual parent is its
28070
+ // assignedSlot's parent (inside the host's shadow tree), not the host
28071
+ // itself. Without this hop, the walk skips right past #bodyContainer
28072
+ // and <dialog> and finds no scrollable ancestor at all.
28073
+ const flatParent = (current) => {
28074
+ if (current.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
28075
+ return current.host || null;
28076
+ }
28077
+ if (current.assignedSlot) {
28078
+ return current.assignedSlot.parentNode;
28079
+ }
28080
+ return current.parentNode;
28081
+ };
28082
+
28083
+ let node = flatParent(target);
28084
+ while (node && node !== document && node !== window) {
28085
+ if (node.nodeType === Node.ELEMENT_NODE) {
28086
+ const { overflowY } = window.getComputedStyle(node);
28087
+ if (overflowY === 'auto' || overflowY === 'scroll') {
28088
+ const targetRect = target.getBoundingClientRect();
28089
+ const scrollerRect = node.getBoundingClientRect();
28090
+ let delta = 0;
28091
+ if (targetRect.top < scrollerRect.top) {
28092
+ delta = targetRect.top - scrollerRect.top;
28093
+ } else if (targetRect.bottom > scrollerRect.bottom) {
28094
+ delta = targetRect.bottom - scrollerRect.bottom;
28095
+ }
28096
+ if (delta !== 0) {
28097
+ node.scrollBy({
28098
+ top: delta,
28099
+ behavior: 'auto'
28100
+ });
28101
+ }
28102
+ }
28103
+ }
28104
+ node = flatParent(node);
27693
28105
  }
27694
28106
  }
27695
28107
 
@@ -27780,9 +28192,34 @@ class AuroCalendar extends RangeDatepicker {
27780
28192
  // the last one.
27781
28193
  if (this._announceRafId) {
27782
28194
  cancelAnimationFrame(this._announceRafId);
28195
+ this._announceRafId = null;
27783
28196
  }
28197
+ this._deliverAnnouncement(dateStr, 0);
28198
+ }
28199
+
28200
+ /**
28201
+ * Writes `dateStr` to the live region. If the dropdown's dialog hasn't
28202
+ * mounted yet (so getOrCreateLiveRegion can't attach), retries on the
28203
+ * next animation frame up to MAX_LIVE_REGION_RETRIES instead of silently
28204
+ * dropping the announcement. The retry uses the same `_announceRafId`
28205
+ * the double-rAF below uses, so a newer announceSelection call (or
28206
+ * disconnectedCallback) cancels any in-flight retry.
28207
+ * @private
28208
+ * @param {String} dateStr - The localized date string to announce.
28209
+ * @param {Number} attempts - Number of prior retry attempts.
28210
+ * @returns {void}
28211
+ */
28212
+ _deliverAnnouncement(dateStr, attempts) {
27784
28213
  const liveRegion = this.getOrCreateLiveRegion();
27785
28214
  if (!liveRegion) {
28215
+ const MAX_LIVE_REGION_RETRIES = 10;
28216
+ if (attempts < MAX_LIVE_REGION_RETRIES) {
28217
+ this._announceRafId = requestAnimationFrame(() => {
28218
+ this._deliverAnnouncement(dateStr, attempts + 1);
28219
+ });
28220
+ } else {
28221
+ this._announceRafId = null;
28222
+ }
27786
28223
  return;
27787
28224
  }
27788
28225
 
@@ -27955,7 +28392,7 @@ class AuroCalendar extends RangeDatepicker {
27955
28392
  </div>
27956
28393
  </div>
27957
28394
 
27958
- <div class="calendarWrapper ${!this.isFullscreen && this.dropdown?.desktopModal ? 'hasFooter' : ''}">
28395
+ <div class="calendarWrapper">
27959
28396
  <div class="calendarNavButtons">
27960
28397
  ${this.showPrevMonthBtn ? u$d`
27961
28398
  <button tabIndex="0" class="calendarNavBtn prevMonth" aria-label="${this.datepicker?.navLabelPrevMonth || 'Previous month'}" @click="${this.handlePrevMonth}">
@@ -27968,7 +28405,7 @@ class AuroCalendar extends RangeDatepicker {
27968
28405
  </button>
27969
28406
  ` : undefined}
27970
28407
  </div>
27971
- <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}">
28408
+ <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}">
27972
28409
  ${this.renderAllCalendars()}
27973
28410
  </div>
27974
28411
  </div>
@@ -31853,7 +32290,7 @@ let AuroHelpText$2$1 = class AuroHelpText extends i$2 {
31853
32290
  }
31854
32291
  };
31855
32292
 
31856
- var formkitVersion$1$3 = '202606231948';
32293
+ var formkitVersion$1$3 = '202607010104';
31857
32294
 
31858
32295
  let AuroElement$2$2 = class AuroElement extends i$2 {
31859
32296
  static get properties() {
@@ -33125,6 +33562,7 @@ let AuroDropdown$3 = class AuroDropdown extends AuroElement$2$2 {
33125
33562
  role="${o$4(this.triggerContentFocusable ? undefined : this.a11yRole)}"
33126
33563
  aria-expanded="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
33127
33564
  aria-controls="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
33565
+ aria-haspopup="${o$4(this.a11yRole === 'combobox' && !this.triggerContentFocusable ? 'listbox' : undefined)}"
33128
33566
  aria-labelledby="${o$4(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
33129
33567
  aria-disabled="${o$4(this.disabled ? 'true' : undefined)}"
33130
33568
  @focusin="${this.handleFocusin}"
@@ -37627,15 +38065,17 @@ let AuroFormValidation$6 = class AuroFormValidation {
37627
38065
  );
37628
38066
  }
37629
38067
 
37630
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
37631
- if (this.auroInputElements?.length === 2) {
37632
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
38068
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
38069
+
38070
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
38071
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
38072
+ // field (datepicker is the intended consumer — start/end are independently required).
38073
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
38074
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
37633
38075
  hasValue = false;
37634
38076
  }
37635
38077
  }
37636
38078
 
37637
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
37638
-
37639
38079
  if (isCombobox) {
37640
38080
 
37641
38081
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -38250,7 +38690,7 @@ function normalizeDates$2(context, ...dates) {
38250
38690
  * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))
38251
38691
  * //=> Tue Sep 02 2014 00:00:00
38252
38692
  */
38253
- function startOfDay$3(date, options) {
38693
+ function startOfDay$2(date, options) {
38254
38694
  const _date = toDate$2(date, options?.in);
38255
38695
  _date.setHours(0, 0, 0, 0);
38256
38696
  return _date;
@@ -38298,8 +38738,8 @@ function differenceInCalendarDays$2(laterDate, earlierDate, options) {
38298
38738
  earlierDate,
38299
38739
  );
38300
38740
 
38301
- const laterStartOfDay = startOfDay$3(laterDate_);
38302
- const earlierStartOfDay = startOfDay$3(earlierDate_);
38741
+ const laterStartOfDay = startOfDay$2(laterDate_);
38742
+ const earlierStartOfDay = startOfDay$2(earlierDate_);
38303
38743
 
38304
38744
  const laterTimestamp =
38305
38745
  +laterStartOfDay - getTimezoneOffsetInMilliseconds$2(laterStartOfDay);
@@ -43571,6 +44011,13 @@ let AuroInputUtilities$2 = class AuroInputUtilities {
43571
44011
  * @returns {string | undefined}
43572
44012
  */
43573
44013
  toFormattedValue(valueObject, format) {
44014
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
44015
+ // `format` argument has to fail gracefully rather than throw on
44016
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
44017
+ // as "no format → no display value".
44018
+ if (!format) {
44019
+ return undefined;
44020
+ }
43574
44021
  const normalizedFormat = format.toLowerCase();
43575
44022
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
43576
44023
 
@@ -43722,76 +44169,19 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
43722
44169
  constructor() {
43723
44170
  super();
43724
44171
 
43725
- this.appearance = "default";
43726
- this.disabled = false;
43727
- this.layout = 'classic';
43728
- this.locale = 'en-US';
43729
- this.max = undefined;
43730
- this.maxLength = undefined;
43731
- this.min = undefined;
43732
- this.minLength = undefined;
43733
- this.required = false;
43734
- this.onDark = false;
43735
- this.setCustomValidityForType = undefined;
43736
- this.size = 'lg';
43737
- this.shape = 'classic';
43738
- this.value = undefined;
43739
-
43740
- this._initializePrivateDefaults();
43741
- }
43742
-
43743
- /**
43744
- * Internal Defaults.
43745
- * @private
43746
- * @returns {void}
43747
- */
43748
- _initializePrivateDefaults() {
44172
+ // Single-source initialization. Alphabetized so duplicate or stale
44173
+ // defaults are immediately obvious on a diff. Every field is assigned
44174
+ // exactly once here (previously the constructor + the old
44175
+ // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
44176
+ // fields and double-allocated `util` and `validation`, discarding the
44177
+ // first instance). `validation` is now allocated exactly once; `util`
44178
+ // is seeded here with an en-US default and then rebuilt in
44179
+ // `connectedCallback` once the consumer-resolved locale is available,
44180
+ // so a parent (datepicker/combobox) calling `validate()` synchronously
44181
+ // during its own update cycle sees a populated util instance.
43749
44182
  this.activeLabel = false;
43750
- this.appearance = "default";
43751
- this.icon = false;
43752
- this.disabled = false;
43753
- this.dvInputOnly = false;
43754
- this.hideLabelVisually = false;
43755
- this.max = undefined;
43756
- this.maxLength = undefined;
43757
- this.min = undefined;
43758
- this.minLength = undefined;
43759
- this.noValidate = false;
43760
- this.onDark = false;
43761
- this.required = false;
43762
- this.setCustomValidityForType = undefined;
43763
-
43764
- // Used for storing raw values returned from input mask.
43765
- this._rawMaskValue = undefined;
43766
-
43767
- /**
43768
- * @private
43769
- */
43770
- this.layout = 'classic';
43771
-
43772
- /**
43773
- * @private
43774
- */
43775
- this.shape = 'classic';
43776
-
43777
- /**
43778
- * @private
43779
- */
43780
- this.size = 'lg';
43781
-
43782
- this.touched = false;
43783
- this.util = new AuroInputUtilities$2({
43784
- locale: "en-US",
43785
- format: this.format
43786
- });
43787
- this.validation = new AuroFormValidation$6();
43788
- this.inputIconName = undefined;
43789
- this.showPassword = false;
43790
- this.validationCCLength = undefined;
43791
- this.hasValue = false;
43792
- this.label = 'Input label is undefined';
43793
-
43794
44183
 
44184
+ /** @private */
43795
44185
  this.allowedInputTypes = [
43796
44186
  "text",
43797
44187
  "number",
@@ -43800,7 +44190,9 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
43800
44190
  "credit-card",
43801
44191
  "tel"
43802
44192
  ];
43803
- this.icon = false;
44193
+ this.appearance = "default";
44194
+
44195
+ /** @private */
43804
44196
  this.dateFormatMap = {
43805
44197
  'mm/dd/yyyy': 'dateMMDDYYYY',
43806
44198
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -43817,27 +44209,62 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
43817
44209
  'dd/mm': 'dateDDMM',
43818
44210
  'mm/dd': 'dateMMDD'
43819
44211
  };
44212
+ this.disabled = false;
44213
+
44214
+ /** @private */
43820
44215
  this.domHandler = new DomHandler$2();
43821
44216
  this.dvInputOnly = false;
43822
44217
  this.hasValue = false;
44218
+ this.hideLabelVisually = false;
44219
+ this.icon = false;
44220
+
44221
+ /** @private */
43823
44222
  this.inputIconName = undefined;
44223
+
44224
+ /** @private */
43824
44225
  this.label = 'Input label is undefined';
44226
+ this.layout = 'classic';
44227
+ this.locale = 'en-US';
44228
+ this.max = undefined;
44229
+ this.maxLength = undefined;
44230
+ this.min = undefined;
44231
+ this.minLength = undefined;
43825
44232
  this.noValidate = false;
43826
- this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
44233
+ this.onDark = false;
44234
+ // Raw values returned from the input mask before model normalization.
44235
+ this._rawMaskValue = undefined;
44236
+ this.required = false;
44237
+ this.setCustomValidityForType = undefined;
44238
+ // Credit Card is intentionally excluded — its mask manages the cursor
44239
+ // itself, and listing it here caused cursor placement issues in Safari.
44240
+ /** @private */
43827
44241
  this.setSelectionInputTypes = [
43828
44242
  "text",
43829
44243
  "password",
43830
44244
  "email"
43831
- ]; // Credit Card is not included as this caused cursor placement issues in Safari.
44245
+ ];
44246
+ this.shape = 'classic';
44247
+
44248
+ /** @private */
43832
44249
  this.showPassword = false;
44250
+ this.size = 'lg';
43833
44251
  this.touched = false;
44252
+
44253
+ /** @private */
43834
44254
  this.uniqueId = new UniqueId$1().create();
44255
+
44256
+ /** @private */
43835
44257
  this.util = new AuroInputUtilities$2({
43836
44258
  locale: this.locale,
43837
44259
  format: this.format
43838
44260
  });
44261
+
44262
+ /** @private */
43839
44263
  this.validation = new AuroFormValidation$6();
44264
+
44265
+ /** @private */
43840
44266
  this.validationCCLength = undefined;
44267
+ this.value = undefined;
43841
44268
  }
43842
44269
 
43843
44270
  // function to define props used within the scope of this component
@@ -44341,6 +44768,15 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44341
44768
 
44342
44769
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
44343
44770
 
44771
+ // Normalize the format token to lowercase so case-mixed values supplied
44772
+ // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
44773
+ // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
44774
+ // format silently misses the map and leaves `setCustomValidityForType`
44775
+ // unset.
44776
+ if (this.format) {
44777
+ this.format = this.format.toLowerCase();
44778
+ }
44779
+
44344
44780
  // use validity message override if declared when initializing the component
44345
44781
  if (this.hasAttribute('setCustomValidity')) {
44346
44782
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -44424,6 +44860,13 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44424
44860
 
44425
44861
  if (typeToI18n.includes(this.type)) {
44426
44862
  this.setCustomValidityForType = i18n$1(this.lang, this.type);
44863
+ // COVERAGE: this `else if` branch is unreachable in WTR. connectedCallback
44864
+ // (L682) calls configureDataForType, which at L1266-1268 assigns
44865
+ // `this.format = this.util.getDateMaskFromLocale().toLowerCase()` for any
44866
+ // type=date input whose `format` attribute is unset. That runs before
44867
+ // firstUpdated invokes setCustomHelpTextMessage, so `!this.format` is
44868
+ // always false here. Retained as a defensive fallback; the whole function
44869
+ // is @deprecated per AB#1557296 and slated for removal.
44427
44870
  } else if (!this.format && this.type === 'date') {
44428
44871
  this.setCustomValidityForType = i18n$1(this.lang, 'dateMMDDYYYY');
44429
44872
  } else if (this.dateFormatMap[this.format]) {
@@ -44713,6 +45156,38 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44713
45156
  this.touched = true;
44714
45157
  this.validation.validate(this);
44715
45158
  }
45159
+
45160
+ // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
45161
+ // update that can re-render the input and reset the native cursor; we
45162
+ // capture the caret position before that update commits and restore it
45163
+ // via `setSelectionRange` once the update has flushed. Gated on
45164
+ // `setSelectionInputTypes` so credit-card (and other masked types whose
45165
+ // formatter manages the cursor itself) doesn't get a competing write.
45166
+ // Capture the caret position INSIDE the gate — reading `selectionStart`
45167
+ // on input types that don't support text selection (number, email in
45168
+ // some browsers) throws InvalidStateError, which would crash all input
45169
+ // handling. Wrap the read in try/catch belt-and-suspenders even though
45170
+ // the gated types currently support it, since the list is a public
45171
+ // property a consumer could mutate.
45172
+ if (this.setSelectionInputTypes.includes(this.type)) {
45173
+ let selectionStart = null;
45174
+ try {
45175
+ ({ selectionStart } = this.inputElement);
45176
+ } catch (error) { // eslint-disable-line no-unused-vars
45177
+ return;
45178
+ }
45179
+ if (typeof selectionStart !== 'number') {
45180
+ return;
45181
+ }
45182
+ this.updateComplete.then(() => {
45183
+ try {
45184
+ this.inputElement.setSelectionRange(selectionStart, selectionStart);
45185
+ } catch (error) { // eslint-disable-line no-unused-vars
45186
+ // Some input types (number/email in certain UAs) throw on
45187
+ // setSelectionRange; swallow and let the native cursor stand.
45188
+ }
45189
+ });
45190
+ }
44716
45191
  }
44717
45192
 
44718
45193
  /**
@@ -44846,7 +45321,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44846
45321
  */
44847
45322
  get placeholderStr() {
44848
45323
  if (!this.placeholder && this.type === 'date') {
44849
- return this.format ? this.format.toUpperCase() : 'MM/DD/YYYY';
45324
+ return this.format.toUpperCase();
44850
45325
  }
44851
45326
  return this.placeholder || "";
44852
45327
  }
@@ -45337,7 +45812,7 @@ let AuroHelpText$1$3 = class AuroHelpText extends i$2 {
45337
45812
  }
45338
45813
  };
45339
45814
 
45340
- var formkitVersion$7 = '202606231948';
45815
+ var formkitVersion$7 = '202607010104';
45341
45816
 
45342
45817
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
45343
45818
  // See LICENSE in the project root for license information.
@@ -45840,6 +46315,7 @@ let AuroInput$1 = class AuroInput extends BaseInput$1 {
45840
46315
  <${this.buttonTag}
45841
46316
  @click="${this.handleClickShowPassword}"
45842
46317
  appearance="${this.onDark ? 'inverse' : this.appearance}"
46318
+ aria-pressed="${this.showPassword ? 'true' : 'false'}"
45843
46319
  class="notificationBtn passwordBtn"
45844
46320
  shape="circle"
45845
46321
  size="sm"
@@ -45913,25 +46389,29 @@ let AuroInput$1 = class AuroInput extends BaseInput$1 {
45913
46389
  * @returns {html} - Returns HTML for the help text and error message.
45914
46390
  */
45915
46391
  renderHtmlHelpText() {
46392
+ // Single `<p>` with stable identity across validity transitions —
46393
+ // previously two distinct templates (valid vs invalid) caused Lit to
46394
+ // replace the node entirely on a flip, and VoiceOver wouldn't
46395
+ // re-announce because the live-region element it was watching had been
46396
+ // removed and a new one inserted. Keeping one node means the `role`,
46397
+ // `aria-live`, and text content all change in-place, which AT does
46398
+ // observe and announce.
46399
+ const isError = this.validity && this.validity !== 'valid';
45916
46400
  return u$d`
45917
- ${!this.validity || this.validity === undefined || this.validity === 'valid'
45918
- ? u$d`
45919
- <${this.helpTextTag}
45920
- appearance="${this.onDark ? 'inverse' : this.appearance}">
45921
- <p id="${this.uniqueId}" part="helpText">
45922
- <slot name="helpText">${this.getHelpText()}</slot>
45923
- </p>
45924
- </${this.helpTextTag}>
45925
- `
45926
- : u$d`
45927
- <${this.helpTextTag} error
45928
- appearance="${this.onDark ? 'inverse' : this.appearance}">
45929
- <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
45930
- ${this.errorMessage}
45931
- </p>
45932
- </${this.helpTextTag}>
45933
- `
45934
- }
46401
+ <${this.helpTextTag}
46402
+ appearance="${this.onDark ? 'inverse' : this.appearance}"
46403
+ ?error=${isError}>
46404
+ <p
46405
+ id="${this.uniqueId}"
46406
+ part="helpText"
46407
+ role="${o$4(isError ? 'alert' : undefined)}"
46408
+ aria-live="${o$4(isError ? 'assertive' : undefined)}">
46409
+ ${isError
46410
+ ? this.errorMessage
46411
+ : u$d`<slot name="helpText">${this.getHelpText()}</slot>`
46412
+ }
46413
+ </p>
46414
+ </${this.helpTextTag}>
45935
46415
  `;
45936
46416
  }
45937
46417
 
@@ -46078,6 +46558,15 @@ function formatISODate(isoStr, format) {
46078
46558
  try {
46079
46559
  const date = dateFormatter$2.stringToDateInstance(isoStr);
46080
46560
 
46561
+ // `stringToDateInstance` returns an `Invalid Date` for malformed strings
46562
+ // and `null` for non-string input — it does NOT throw. Without this
46563
+ // guard, `getFullYear()`/`getMonth()`/`getDate()` on an Invalid Date
46564
+ // yield `NaN`, and `String(NaN).padStart(4, '0')` produces literals
46565
+ // like "0NaN/0NaN/0NaN" instead of `undefined`.
46566
+ if (!(date instanceof Date) || Number.isNaN(date.getTime())) {
46567
+ return undefined;
46568
+ }
46569
+
46081
46570
  const year = String(date.getFullYear()).padStart(4, '0');
46082
46571
  const month = String(date.getMonth() + 1).padStart(2, '0');
46083
46572
  const day = String(date.getDate()).padStart(2, '0');
@@ -46088,7 +46577,10 @@ function formatISODate(isoStr, format) {
46088
46577
  replace(/mm/iu, month).
46089
46578
  replace(/dd/iu, day);
46090
46579
  } catch (err) {
46091
- // If the input string is not a valid date, return undefined
46580
+ // Defensive: the Date-returning path is guarded above, but `parseDate`
46581
+ // (inside `stringToDateInstance`) could throw on pathological input
46582
+ // future-library-versions might introduce. Treat any thrown error as
46583
+ // "not a valid date" and return undefined.
46092
46584
  return undefined;
46093
46585
  }
46094
46586
  }
@@ -46814,6 +47306,7 @@ class AuroDatePicker extends AuroElement$5 {
46814
47306
  this.rangeLabelBeforeRange = 'before range';
46815
47307
  this.rangeLabelInRange = 'in range';
46816
47308
  this.rangeLabelAfterRange = 'after range';
47309
+ this.rangeLabelEndPreview = 'previewing range end';
46817
47310
  this.blackoutDates = [];
46818
47311
  this.blackoutLabel = 'unavailable';
46819
47312
  this.navLabelPrevMonth = 'Previous month';
@@ -46913,6 +47406,22 @@ class AuroDatePicker extends AuroElement$5 {
46913
47406
  */
46914
47407
  this.handleClick = this.handleClick.bind(this);
46915
47408
 
47409
+ /**
47410
+ * Single AbortController shared by every listener registered in the
47411
+ * configure* methods. Lets disconnectedCallback tear all of them down
47412
+ * with one abort() call.
47413
+ *
47414
+ * The genuine leak risk is the listeners attached to children that can
47415
+ * outlive the host if they get reparented — `this.dropdown`,
47416
+ * `this.calendar`, and the inputs inside the dropdown's slot.
47417
+ * Listeners attached to `this` (e.g. focusin/focusout on the host)
47418
+ * form a self-contained reference graph that the GC can collect with
47419
+ * the host anyway, but they share the same signal so the cleanup
47420
+ * pattern stays uniform across all configure* sites.
47421
+ * @private
47422
+ */
47423
+ this._listenerAbortController = new AbortController();
47424
+
46916
47425
  /**
46917
47426
  * @private
46918
47427
  */
@@ -46961,6 +47470,7 @@ class AuroDatePicker extends AuroElement$5 {
46961
47470
 
46962
47471
  /**
46963
47472
  * Label announced for blackout (disabled but in-range) date cells.
47473
+ * @default 'unavailable'
46964
47474
  */
46965
47475
  blackoutLabel: {
46966
47476
  type: String,
@@ -46977,6 +47487,7 @@ class AuroDatePicker extends AuroElement$5 {
46977
47487
 
46978
47488
  /**
46979
47489
  * Accessible label for the calendar grid containing the days of the month.
47490
+ * @default 'Calendar days of the month'
46980
47491
  */
46981
47492
  calendarGridLabel: {
46982
47493
  type: String,
@@ -47139,6 +47650,7 @@ class AuroDatePicker extends AuroElement$5 {
47139
47650
 
47140
47651
  /**
47141
47652
  * Accessible label for the next month navigation button.
47653
+ * @default 'Next month'
47142
47654
  */
47143
47655
  navLabelNextMonth: {
47144
47656
  type: String,
@@ -47147,6 +47659,7 @@ class AuroDatePicker extends AuroElement$5 {
47147
47659
 
47148
47660
  /**
47149
47661
  * Accessible label for the previous month navigation button.
47662
+ * @default 'Previous month'
47150
47663
  */
47151
47664
  navLabelPrevMonth: {
47152
47665
  type: String,
@@ -47224,7 +47737,11 @@ class AuroDatePicker extends AuroElement$5 {
47224
47737
  },
47225
47738
 
47226
47739
  /**
47227
- * Label announced for cells after the range (or after start when no end is selected).
47740
+ * Label announced for cells after a fully selected range (both
47741
+ * `dateFrom` and `dateTo` are set). While a range is still being
47742
+ * picked (`dateFrom` set, `dateTo` unset), focused cells past the
47743
+ * start use `rangeLabelEndPreview` instead.
47744
+ * @default 'after range'
47228
47745
  */
47229
47746
  rangeLabelAfterRange: {
47230
47747
  type: String,
@@ -47233,6 +47750,7 @@ class AuroDatePicker extends AuroElement$5 {
47233
47750
 
47234
47751
  /**
47235
47752
  * Label announced for cells before the range start.
47753
+ * @default 'before range'
47236
47754
  */
47237
47755
  rangeLabelBeforeRange: {
47238
47756
  type: String,
@@ -47241,14 +47759,27 @@ class AuroDatePicker extends AuroElement$5 {
47241
47759
 
47242
47760
  /**
47243
47761
  * Label announced for the range end date cell.
47762
+ * @default 'range end'
47244
47763
  */
47245
47764
  rangeLabelEnd: {
47246
47765
  type: String,
47247
47766
  reflect: true
47248
47767
  },
47249
47768
 
47769
+ /**
47770
+ * Label announced for the focused cell while previewing a range end
47771
+ * (dateFrom set, dateTo not yet selected). Tells AT users that
47772
+ * pressing Enter would commit this cell as the range end.
47773
+ * @default 'previewing range end'
47774
+ */
47775
+ rangeLabelEndPreview: {
47776
+ type: String,
47777
+ reflect: true
47778
+ },
47779
+
47250
47780
  /**
47251
47781
  * Label announced for cells within the selected range.
47782
+ * @default 'in range'
47252
47783
  */
47253
47784
  rangeLabelInRange: {
47254
47785
  type: String,
@@ -47257,6 +47788,7 @@ class AuroDatePicker extends AuroElement$5 {
47257
47788
 
47258
47789
  /**
47259
47790
  * Label announced for the range start date cell.
47791
+ * @default 'range start'
47260
47792
  */
47261
47793
  rangeLabelStart: {
47262
47794
  type: String,
@@ -47264,7 +47796,7 @@ class AuroDatePicker extends AuroElement$5 {
47264
47796
  },
47265
47797
 
47266
47798
  /**
47267
- * Dates that the user should have for reference as part of their decision making when selecting a date.
47799
+ * Dates that the user should have for reference as part of their decision-making when selecting a date.
47268
47800
  * This should be a JSON string array of ISO date strings (`YYYY-MM-DD`).
47269
47801
  */
47270
47802
  referenceDates: {
@@ -47621,10 +48153,26 @@ class AuroDatePicker extends AuroElement$5 {
47621
48153
  // ─── Vendor calendar time conversions ─────────────────────────────────────
47622
48154
 
47623
48155
  /**
47624
- * Converts a Unix timestamp (seconds) from the vendor calendar to an ISO date string.
48156
+ * Converts a Unix timestamp (seconds) from the vendored range-datepicker
48157
+ * (`src/vendor/wc-range-datepicker/day.js`) to an ISO date string.
48158
+ *
48159
+ * Timezone contract:
48160
+ * - INPUT: `time` is assumed to be the seconds-since-epoch of **local
48161
+ * midnight** for the intended calendar day. The vendor's Day constructor
48162
+ * builds it via `date-fns format(date, 't')` from a locally-constructed
48163
+ * Date, so this assumption currently holds end-to-end.
48164
+ * - OUTPUT: `dateFormatter.toISOFormatString` reads the Date's local
48165
+ * getFullYear/getMonth/getDate components, so the returned YYYY-MM-DD
48166
+ * string matches the local calendar day.
48167
+ *
48168
+ * If the vendor ever switches to emitting UTC-midnight timestamps, this
48169
+ * conversion will silently shift the returned date by one day in zones
48170
+ * west of UTC. Any vendor swap should re-verify this contract; the TZ
48171
+ * regression suite (`npm run test:hst`, UTC-10) will catch the symptom.
48172
+ *
47625
48173
  * @private
47626
- * @param {number} time - Unix timestamp in seconds.
47627
- * @returns {string} ISO date string (yyyy-mm-dd).
48174
+ * @param {number} time - Unix timestamp (seconds), local midnight of the day.
48175
+ * @returns {string} ISO date string (yyyy-mm-dd) reflecting the local calendar day.
47628
48176
  */
47629
48177
  convertWcTimeToDate(time) {
47630
48178
  return dateFormatter$1.toISOFormatString(new Date(time * 1000));
@@ -47726,8 +48274,8 @@ class AuroDatePicker extends AuroElement$5 {
47726
48274
  }
47727
48275
  }
47728
48276
 
47729
- // Focus the calendar grid wrapper (aria-activedescendant handles
47730
- // the SR announcement for the active cell).
48277
+ // Focus the calendar grid wrapper. The live region (announced just
48278
+ // below) handles the SR announcement for the active cell.
47731
48279
  if (activeCell) {
47732
48280
  this.calendar.focusActiveCell();
47733
48281
 
@@ -47741,11 +48289,14 @@ class AuroDatePicker extends AuroElement$5 {
47741
48289
  this.calendar.announceSelection(announcement);
47742
48290
  }, 500);
47743
48291
 
47744
- // On mobile fullscreen, scroll the month list so the active cell's
47745
- // month is visible. Without this, the list stays scrolled to the
47746
- // calendarStartDate month which may be far from the active cell.
47747
- if (this.dropdown.isBibFullscreen) {
48292
+ // On mobile fullscreen or when an explicit focusDate change has
48293
+ // requested a forced scroll on the next render scroll the active
48294
+ // cell into view. Doing this here (after activeCellDate has been
48295
+ // resolved by the rAF loop above) prevents a no-op scroll that
48296
+ // would happen if we tried to scroll before the cell was set.
48297
+ if (this.dropdown.isBibFullscreen || this.forceScrollOnNextMobileCalendarRender) {
47748
48298
  this.calendar.scrollToActiveCell();
48299
+ this.forceScrollOnNextMobileCalendarRender = false;
47749
48300
  }
47750
48301
  } else if (attempts < MAX_ATTEMPTS) {
47751
48302
  requestAnimationFrame(tryFocus);
@@ -47777,11 +48328,13 @@ class AuroDatePicker extends AuroElement$5 {
47777
48328
  this.dropdown.bibDialogLabel = labelElement.textContent.trim() || undefined;
47778
48329
  }
47779
48330
 
48331
+ const { signal } = this._listenerAbortController;
48332
+
47780
48333
  this.dropdown.addEventListener('auroDropdown-triggerClick', () => {
47781
48334
  if (!this.isPopoverVisible) {
47782
48335
  this.dropdown.show();
47783
48336
  }
47784
- });
48337
+ }, { signal });
47785
48338
 
47786
48339
  this.dropdown.addEventListener('auroDropdown-toggled', () => {
47787
48340
  this.notifyDatepickerToggled();
@@ -47799,7 +48352,7 @@ class AuroDatePicker extends AuroElement$5 {
47799
48352
  if (this.valueObject) {
47800
48353
  this.centralDate = this.value;
47801
48354
  } else if (!this.centralDate && !this.calendarStartDate && !this.minDate) {
47802
- this.centralDate = new Date();
48355
+ this.centralDate = dateFormatter$1.toISOFormatString(new Date());
47803
48356
  }
47804
48357
  }
47805
48358
 
@@ -47867,19 +48420,11 @@ class AuroDatePicker extends AuroElement$5 {
47867
48420
  }
47868
48421
  }
47869
48422
 
47870
- // If on mobile, and the calendar is opened, scroll the focus date into view if the flag is set
47871
- if (this.dropdown.isPopoverVisible && this.forceScrollOnNextMobileCalendarRender) {
47872
-
47873
- // Since the calendar is not rendered until the dropdown is opened,
47874
- // and the auroDropdown-toggled event fires before the popover is actually open,
47875
- // we need to wait until the next frame to ensure the calendar is fully rendered
47876
- // and the area we're trying to scroll to is present in the DOM.
47877
- setTimeout(() => {
47878
- this.calendar.scrollMonthIntoView(this.calendarFocusDate);
47879
- this.forceScrollOnNextMobileCalendarRender = false;
47880
- }, 0);
47881
- }
47882
- });
48423
+ // Note: the forceScrollOnNextMobileCalendarRender scroll-into-view
48424
+ // happens inside focusActiveCellWhenReady() once activeCellDate has
48425
+ // been resolved by its rAF wait — not here in a setTimeout(0), which
48426
+ // fired before the active date was set and silently no-op'd.
48427
+ }, { signal });
47883
48428
 
47884
48429
  // Handle responsive strategy changes while the dropdown is open
47885
48430
  // (e.g. resizing from desktop → mobile or vice versa).
@@ -47926,7 +48471,7 @@ class AuroDatePicker extends AuroElement$5 {
47926
48471
  });
47927
48472
  });
47928
48473
  }
47929
- });
48474
+ }, { signal });
47930
48475
  }
47931
48476
 
47932
48477
  /**
@@ -47939,6 +48484,8 @@ class AuroDatePicker extends AuroElement$5 {
47939
48484
 
47940
48485
  this.inputList = [...this.dropdown.querySelectorAll(this.inputTag._$litStatic$)];
47941
48486
 
48487
+ const { signal } = this._listenerAbortController;
48488
+
47942
48489
  this.inputList.forEach((input, index) => {
47943
48490
  input.addEventListener('input', (event) => {
47944
48491
  event.stopPropagation();
@@ -47950,7 +48497,7 @@ class AuroDatePicker extends AuroElement$5 {
47950
48497
  }
47951
48498
 
47952
48499
  this.notifyValueChanged();
47953
- });
48500
+ }, { signal });
47954
48501
 
47955
48502
  input.addEventListener('auroFormElement-validated', (evt) => {
47956
48503
  // not to bubble up input's validated event.
@@ -47966,7 +48513,7 @@ class AuroDatePicker extends AuroElement$5 {
47966
48513
  this.validity = evt.detail.validity;
47967
48514
  this.errorMessage = evt.detail.message;
47968
48515
  }
47969
- });
48516
+ }, { signal });
47970
48517
  });
47971
48518
  }
47972
48519
 
@@ -47980,19 +48527,32 @@ class AuroDatePicker extends AuroElement$5 {
47980
48527
  this.calendar.datepicker = this;
47981
48528
  this.calendar.dropdown = this.dropdown;
47982
48529
 
48530
+ const { signal } = this._listenerAbortController;
48531
+
47983
48532
  this.calendar.addEventListener('auroCalendar-dateSelected', () => {
47984
- if (this.inputList[0].value !== this.calendar.dateFrom && this.calendar.dateFrom !== undefined) {
47985
- this.inputList[0].value = this.convertWcTimeToDate(this.calendar.dateFrom);
48533
+ // Compare the input's ISO value against the *converted* calendar
48534
+ // timestamp (the vendor's `dateFrom`/`dateTo` are Unix-seconds
48535
+ // strings — comparing the input ISO directly against them would
48536
+ // never match, so the write would fire on every event and emit
48537
+ // redundant input/change activity).
48538
+ if (this.calendar.dateFrom !== undefined) {
48539
+ const fromIso = this.convertWcTimeToDate(this.calendar.dateFrom);
48540
+ if (this.inputList[0].value !== fromIso) {
48541
+ this.inputList[0].value = fromIso;
48542
+ }
47986
48543
  }
47987
48544
 
47988
- if (this.inputList[1] && this.calendar.dateTo && this.inputList[1].value !== this.calendar.dateTo) {
47989
- this.inputList[1].value = this.convertWcTimeToDate(this.calendar.dateTo);
48545
+ if (this.inputList[1] && this.calendar.dateTo) {
48546
+ const toIso = this.convertWcTimeToDate(this.calendar.dateTo);
48547
+ if (this.inputList[1].value !== toIso) {
48548
+ this.inputList[1].value = toIso;
48549
+ }
47990
48550
  }
47991
- });
48551
+ }, { signal });
47992
48552
 
47993
48553
  this.calendar.addEventListener('auroCalendar-dismissRequest', () => {
47994
48554
  this.dropdown.hide();
47995
- });
48555
+ }, { signal });
47996
48556
 
47997
48557
  this.calendar.addEventListener('auroCalendar-centralDateChanged', (event) => {
47998
48558
  const match = this.centralDateObject && this.util.datesMatch(event.detail.date, this.centralDateObject);
@@ -48002,7 +48562,7 @@ class AuroDatePicker extends AuroElement$5 {
48002
48562
  }
48003
48563
 
48004
48564
  this.notifyMonthChanged(event);
48005
- });
48565
+ }, { signal });
48006
48566
  }
48007
48567
 
48008
48568
  /**
@@ -48011,10 +48571,17 @@ class AuroDatePicker extends AuroElement$5 {
48011
48571
  * @returns {void}
48012
48572
  */
48013
48573
  configureDatepicker() {
48574
+ // These listeners are on `this` (the host), so they would GC with the
48575
+ // host even without the abort signal — see the leak rationale on
48576
+ // `_listenerAbortController`. The signal is still passed for uniform
48577
+ // cleanup semantics with the child-element listeners in the other
48578
+ // configure* methods.
48579
+ const { signal } = this._listenerAbortController;
48580
+
48014
48581
  this.addEventListener('focusin', () => {
48015
48582
  this.touched = true;
48016
48583
  this.hasFocus = true;
48017
- });
48584
+ }, { signal });
48018
48585
 
48019
48586
  this.addEventListener('focusout', () => {
48020
48587
  this.hasFocus = false;
@@ -48026,7 +48593,7 @@ class AuroDatePicker extends AuroElement$5 {
48026
48593
  if (!this.matches(':focus-within')) {
48027
48594
  this.validate();
48028
48595
  }
48029
- });
48596
+ }, { signal });
48030
48597
 
48031
48598
  if (this.valueObject) {
48032
48599
  this.calendar.dateFrom = this.convertToWcValidTime(this.valueObject);
@@ -48224,6 +48791,41 @@ class AuroDatePicker extends AuroElement$5 {
48224
48791
  return this.validity !== undefined && this.validity !== 'valid';
48225
48792
  }
48226
48793
 
48794
+ /**
48795
+ * Per-class dedup set used by `_warnInvalidLocale`. Static so the dedup
48796
+ * spans every datepicker instance on the page; lives on the class (not
48797
+ * at module scope) so it stays an encapsulated implementation detail of
48798
+ * this component and does not interfere with WCA's class-JSDoc
48799
+ * attachment.
48800
+ * @private
48801
+ */
48802
+ static _warnedInvalidLocales = new Set();
48803
+
48804
+ /**
48805
+ * Logs a one-time `console.debug` when an unsupported locale falls back to
48806
+ * en-US. Deduped by the offending tag so noisy re-renders that resurface
48807
+ * the same bad value stay quiet, but each new bad value still signals so
48808
+ * consumers can spot the typo or missing tag.
48809
+ * @private
48810
+ * @param {string|undefined} badLocale - The locale value that failed.
48811
+ * @returns {void}
48812
+ */
48813
+ _warnInvalidLocale(badLocale) {
48814
+ // Stringify without coalescing — `String(undefined)` / `String(null)`
48815
+ // surface the actual offending value in the log, instead of the
48816
+ // ambiguous `Locale ""` that `String(badLocale ?? '')` would produce.
48817
+ // Dedup still works correctly because each unique stringification
48818
+ // becomes its own Set entry.
48819
+ const key = String(badLocale);
48820
+ const seen = AuroDatePicker._warnedInvalidLocales;
48821
+ if (seen.has(key)) {
48822
+ return;
48823
+ }
48824
+ seen.add(key);
48825
+ // eslint-disable-next-line no-console
48826
+ 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".`);
48827
+ }
48828
+
48227
48829
  /**
48228
48830
  * Lifecycle method to check if the locale is valid.
48229
48831
  * @ignore
@@ -48234,10 +48836,15 @@ class AuroDatePicker extends AuroElement$5 {
48234
48836
  if (changedProperties.has('locale')) {
48235
48837
  try {
48236
48838
  const supported = Intl.DateTimeFormat.supportedLocalesOf([this.locale], { localeMatcher: 'lookup' });
48237
- this._validLocale = supported.length > 0 ? this.locale : 'en-US';
48839
+ if (supported.length > 0) {
48840
+ this._validLocale = this.locale;
48841
+ } else {
48842
+ this._validLocale = 'en-US';
48843
+ this._warnInvalidLocale(this.locale);
48844
+ }
48238
48845
  } catch {
48239
- console.debug(`[AuroDatePicker] The locale "${this.locale}" is not valid. Falling back to "en-US".`); // eslint-disable-line no-console
48240
48846
  this._validLocale = 'en-US';
48847
+ this._warnInvalidLocale(this.locale);
48241
48848
  }
48242
48849
 
48243
48850
  const previousLocaleFormat = getDateFormatFromLocale$1(changedProperties.get('locale'));
@@ -48319,8 +48926,6 @@ class AuroDatePicker extends AuroElement$5 {
48319
48926
  // Skip centralDate update when user clicked a cell in range mode
48320
48927
  // to prevent the displayed months from shifting
48321
48928
  this.centralDate = this.value;
48322
- //TODO: TEST THIS CHANGE
48323
- // this.calendarRenderUtil.updateCentralDate(this, this.value);
48324
48929
  }
48325
48930
 
48326
48931
  this.setHasValue();
@@ -48380,8 +48985,6 @@ class AuroDatePicker extends AuroElement$5 {
48380
48985
  // Skip centralDate update when user clicked a cell in range mode
48381
48986
  // to prevent the displayed months from shifting
48382
48987
  this.centralDate = this.valueEnd;
48383
- // TODO: TEST THIS CHANGE
48384
- // this.calendarRenderUtil.updateCentralDate(this, this.formattedValueEnd);
48385
48988
  }
48386
48989
 
48387
48990
  this.validate();
@@ -48523,7 +49126,7 @@ class AuroDatePicker extends AuroElement$5 {
48523
49126
  * @returns {void}
48524
49127
  */
48525
49128
  configureClickHandler() {
48526
- this.addEventListener('click', this.handleClick);
49129
+ this.addEventListener('click', this.handleClick, { signal: this._listenerAbortController.signal });
48527
49130
  }
48528
49131
 
48529
49132
  firstUpdated() {
@@ -48531,6 +49134,15 @@ class AuroDatePicker extends AuroElement$5 {
48531
49134
  // Add the tag name as an attribute if it is different than the component name
48532
49135
  this.runtimeUtils.handleComponentTagRename(this, 'auro-datepicker');
48533
49136
 
49137
+ // If the element was disconnected before this first render finished,
49138
+ // disconnectedCallback's microtask already aborted the controller. The
49139
+ // connectedCallback reinit guard skips that case because `hasUpdated`
49140
+ // is still false. Mint a fresh controller here so configure* registers
49141
+ // listeners against a live signal.
49142
+ if (this._listenerAbortController.signal.aborted) {
49143
+ this._listenerAbortController = new AbortController();
49144
+ }
49145
+
48534
49146
  this.configureDropdown();
48535
49147
  this.configureInput();
48536
49148
  this.configureCalendar();
@@ -48542,9 +49154,36 @@ class AuroDatePicker extends AuroElement$5 {
48542
49154
  connectedCallback() {
48543
49155
  super.connectedCallback();
48544
49156
 
49157
+ // True reconnect after `disconnectedCallback` aborted our controller:
49158
+ // the existing signal is dead, so listeners registered against it
49159
+ // would never fire. Create a fresh controller and re-run the
49160
+ // configure* wiring (each method is idempotent — it just re-caches
49161
+ // child refs and re-registers listeners against the new signal).
49162
+ // `hasUpdated` gates this so the *first* connect (which precedes
49163
+ // firstUpdated) still falls through to firstUpdated's initial wiring.
49164
+ if (this.hasUpdated && this._listenerAbortController.signal.aborted) {
49165
+ this._listenerAbortController = new AbortController();
49166
+ this.configureDropdown();
49167
+ this.configureInput();
49168
+ this.configureCalendar();
49169
+ this.configureDatepicker();
49170
+ this.configureClickHandler();
49171
+ }
49172
+
48545
49173
  this.locale = this.domHandler.getLocale(this);
48546
49174
  }
48547
49175
 
49176
+ disconnectedCallback() {
49177
+ super.disconnectedCallback();
49178
+ // Defer so that re-parenting (auro-drawer slotting it into a dialog,
49179
+ // for example) does not abort listeners we still need after reconnect.
49180
+ queueMicrotask(() => {
49181
+ if (!this.isConnected) {
49182
+ this._listenerAbortController.abort();
49183
+ }
49184
+ });
49185
+ }
49186
+
48548
49187
  // layout render methods
48549
49188
  // ------------------------------------
48550
49189
 
@@ -49567,15 +50206,17 @@ let AuroFormValidation$5 = class AuroFormValidation {
49567
50206
  );
49568
50207
  }
49569
50208
 
49570
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
49571
- if (this.auroInputElements?.length === 2) {
49572
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
50209
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
50210
+
50211
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
50212
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
50213
+ // field (datepicker is the intended consumer — start/end are independently required).
50214
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
50215
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
49573
50216
  hasValue = false;
49574
50217
  }
49575
50218
  }
49576
50219
 
49577
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
49578
-
49579
50220
  if (isCombobox) {
49580
50221
 
49581
50222
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -50040,7 +50681,7 @@ let AuroHelpText$1$2 = class AuroHelpText extends i$2 {
50040
50681
  }
50041
50682
  };
50042
50683
 
50043
- var formkitVersion$1$2 = '202606231948';
50684
+ var formkitVersion$1$2 = '202607010104';
50044
50685
 
50045
50686
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
50046
50687
  // See LICENSE in the project root for license information.
@@ -54368,7 +55009,7 @@ let AuroHelpText$6 = class AuroHelpText extends i$2 {
54368
55009
  }
54369
55010
  };
54370
55011
 
54371
- var formkitVersion$6 = '202606231948';
55012
+ var formkitVersion$6 = '202607010104';
54372
55013
 
54373
55014
  let AuroElement$1$2 = class AuroElement extends i$2 {
54374
55015
  static get properties() {
@@ -55640,6 +56281,7 @@ let AuroDropdown$2 = class AuroDropdown extends AuroElement$1$2 {
55640
56281
  role="${o$4(this.triggerContentFocusable ? undefined : this.a11yRole)}"
55641
56282
  aria-expanded="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
55642
56283
  aria-controls="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
56284
+ aria-haspopup="${o$4(this.a11yRole === 'combobox' && !this.triggerContentFocusable ? 'listbox' : undefined)}"
55643
56285
  aria-labelledby="${o$4(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
55644
56286
  aria-disabled="${o$4(this.disabled ? 'true' : undefined)}"
55645
56287
  @focusin="${this.handleFocusin}"
@@ -55766,7 +56408,7 @@ let AuroDropdown$2 = class AuroDropdown extends AuroElement$1$2 {
55766
56408
 
55767
56409
  var colorCss$1$6 = i$4`#headerContainer{box-shadow:var(--ds-auro-dropdownbib-header-boxshadow-color)}#footerContainer{background-color:var(--ds-auro-dropdownbib-footer-container-color)}`;
55768
56410
 
55769
- var styleCss$1$6 = i$4`#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)}`;
56411
+ var styleCss$1$6 = i$4`#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)}`;
55770
56412
 
55771
56413
  var tokenCss$3 = i$4`: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)}`;
55772
56414
 
@@ -56772,6 +57414,13 @@ class AuroCounterGroup extends AuroElement$4 {
56772
57414
  */
56773
57415
  configureDropdownCounters() {
56774
57416
  this.dropdown = this.shadowRoot.querySelector(this.dropdownTag._$litStatic$);
57417
+
57418
+ // Counter rows are slotted into the bib through multiple shadow roots
57419
+ // (dropdown → bib → bibtemplate → counter-group → counter), so the floater's
57420
+ // `:focus-within` focus-loss check fails to match the dropdown host in Chromium
57421
+ // and the bib auto-closes immediately after opening. Mirrors auro-select.
57422
+ this.dropdown.noHideOnThisFocusLoss = true;
57423
+
56775
57424
  this.dropdown.requestUpdate();
56776
57425
 
56777
57426
  const counterWrapper = this.shadowRoot.querySelector('auro-counter-wrapper');
@@ -57909,15 +58558,17 @@ let AuroFormValidation$4 = class AuroFormValidation {
57909
58558
  );
57910
58559
  }
57911
58560
 
57912
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
57913
- if (this.auroInputElements?.length === 2) {
57914
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
58561
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
58562
+
58563
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
58564
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
58565
+ // field (datepicker is the intended consumer — start/end are independently required).
58566
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
58567
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
57915
58568
  hasValue = false;
57916
58569
  }
57917
58570
  }
57918
58571
 
57919
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
57920
-
57921
58572
  if (isCombobox) {
57922
58573
 
57923
58574
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -58308,7 +58959,7 @@ let AuroHelpText$5 = class AuroHelpText extends i$2 {
58308
58959
  }
58309
58960
  };
58310
58961
 
58311
- var formkitVersion$5 = '202606231948';
58962
+ var formkitVersion$5 = '202607010104';
58312
58963
 
58313
58964
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
58314
58965
  // See LICENSE in the project root for license information.
@@ -59655,15 +60306,17 @@ let AuroFormValidation$3 = class AuroFormValidation {
59655
60306
  );
59656
60307
  }
59657
60308
 
59658
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
59659
- if (this.auroInputElements?.length === 2) {
59660
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
60309
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
60310
+
60311
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
60312
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
60313
+ // field (datepicker is the intended consumer — start/end are independently required).
60314
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
60315
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
59661
60316
  hasValue = false;
59662
60317
  }
59663
60318
  }
59664
60319
 
59665
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
59666
-
59667
60320
  if (isCombobox) {
59668
60321
 
59669
60322
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -60058,7 +60711,7 @@ let AuroHelpText$4 = class AuroHelpText extends i$2 {
60058
60711
  }
60059
60712
  };
60060
60713
 
60061
- var formkitVersion$4 = '202606231948';
60714
+ var formkitVersion$4 = '202607010104';
60062
60715
 
60063
60716
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
60064
60717
  // See LICENSE in the project root for license information.
@@ -60915,15 +61568,17 @@ let AuroFormValidation$1 = class AuroFormValidation {
60915
61568
  );
60916
61569
  }
60917
61570
 
60918
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
60919
- if (this.auroInputElements?.length === 2) {
60920
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
61571
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
61572
+
61573
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
61574
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
61575
+ // field (datepicker is the intended consumer — start/end are independently required).
61576
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
61577
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
60921
61578
  hasValue = false;
60922
61579
  }
60923
61580
  }
60924
61581
 
60925
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
60926
-
60927
61582
  if (isCombobox) {
60928
61583
 
60929
61584
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -61292,11 +61947,7 @@ const comboboxKeyboardStrategy = {
61292
61947
 
61293
61948
  // navigate if bib is open otherwise open it
61294
61949
  if (component.dropdown.isPopoverVisible) {
61295
- if (evt.altKey || evt.ctrlKey || evt.metaKey) {
61296
- component.activateLastEnabledAvailableOption();
61297
- } else {
61298
- navigateArrow$1(component, 'down');
61299
- }
61950
+ navigateArrow$1(component, 'down');
61300
61951
  } else {
61301
61952
  component.showBib();
61302
61953
  }
@@ -61315,11 +61966,7 @@ const comboboxKeyboardStrategy = {
61315
61966
 
61316
61967
  // navigate if bib is open otherwise open it
61317
61968
  if (component.dropdown.isPopoverVisible) {
61318
- if (evt.altKey || evt.ctrlKey || evt.metaKey) {
61319
- component.activateFirstEnabledAvailableOption();
61320
- } else {
61321
- navigateArrow$1(component, 'up');
61322
- }
61969
+ navigateArrow$1(component, 'up');
61323
61970
  } else {
61324
61971
  component.showBib();
61325
61972
  }
@@ -61335,13 +61982,18 @@ const comboboxKeyboardStrategy = {
61335
61982
  },
61336
61983
 
61337
61984
  Enter(component, evt, ctx) {
61985
+ // Forms should not submit on Enter from a combobox, regardless of which
61986
+ // child element (input, clear button, menu) is focused.
61987
+ evt.stopPropagation();
61988
+
61338
61989
  if (isClearBtnFocused(ctx)) {
61339
- // If the clear button has focus, let the browser activate it normally.
61340
- // stopPropagation prevents parent containers (e.g., forms) from treating
61341
- // Enter as a submit, but we must NOT call preventDefault — that would
61342
- // block the browser's built-in "Enter activates focused button" behavior.
61343
- evt.stopPropagation();
61344
- } else if (ctx.isExpanded && component.menu.optionActive) {
61990
+ // Let the browser dispatch Enter to the focused clear button so its
61991
+ // built-in activation fires and clears the selection. Do NOT call
61992
+ // preventDefault — that would block the activation.
61993
+ return;
61994
+ }
61995
+
61996
+ if (ctx.isExpanded && component.menu.optionActive) {
61345
61997
  reconcileMenuIndex(component.menu);
61346
61998
  component.menu.makeSelection();
61347
61999
 
@@ -61350,14 +62002,8 @@ const comboboxKeyboardStrategy = {
61350
62002
  }
61351
62003
 
61352
62004
  evt.preventDefault();
61353
- evt.stopPropagation();
61354
62005
  } else {
61355
- // Prevent the keypress from bubbling to parent containers (e.g., forms)
61356
- // which could interpret Enter as a submit or trigger other unintended behavior.
61357
- // This is safe because showBib() opens the dialog programmatically,
61358
- // not via event propagation.
61359
62006
  evt.preventDefault();
61360
- evt.stopPropagation();
61361
62007
  component.showBib();
61362
62008
  }
61363
62009
  },
@@ -61402,7 +62048,7 @@ const comboboxKeyboardStrategy = {
61402
62048
  component.setClearBtnFocus();
61403
62049
  }
61404
62050
  }
61405
- },
62051
+ }
61406
62052
  };
61407
62053
 
61408
62054
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
@@ -65273,7 +65919,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$2 {
65273
65919
  }
65274
65920
  };
65275
65921
 
65276
- var formkitVersion$2 = '202606231948';
65922
+ var formkitVersion$2 = '202607010104';
65277
65923
 
65278
65924
  let AuroElement$2$1 = class AuroElement extends i$2 {
65279
65925
  static get properties() {
@@ -66545,6 +67191,7 @@ let AuroDropdown$1 = class AuroDropdown extends AuroElement$2$1 {
66545
67191
  role="${o$4(this.triggerContentFocusable ? undefined : this.a11yRole)}"
66546
67192
  aria-expanded="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
66547
67193
  aria-controls="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
67194
+ aria-haspopup="${o$4(this.a11yRole === 'combobox' && !this.triggerContentFocusable ? 'listbox' : undefined)}"
66548
67195
  aria-labelledby="${o$4(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
66549
67196
  aria-disabled="${o$4(this.disabled ? 'true' : undefined)}"
66550
67197
  @focusin="${this.handleFocusin}"
@@ -71047,15 +71694,17 @@ let AuroFormValidation$2 = class AuroFormValidation {
71047
71694
  );
71048
71695
  }
71049
71696
 
71050
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
71051
- if (this.auroInputElements?.length === 2) {
71052
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
71697
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
71698
+
71699
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
71700
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
71701
+ // field (datepicker is the intended consumer — start/end are independently required).
71702
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
71703
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
71053
71704
  hasValue = false;
71054
71705
  }
71055
71706
  }
71056
71707
 
71057
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
71058
-
71059
71708
  if (isCombobox) {
71060
71709
 
71061
71710
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -76991,6 +77640,13 @@ class AuroInputUtilities {
76991
77640
  * @returns {string | undefined}
76992
77641
  */
76993
77642
  toFormattedValue(valueObject, format) {
77643
+ // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
77644
+ // `format` argument has to fail gracefully rather than throw on
77645
+ // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
77646
+ // as "no format → no display value".
77647
+ if (!format) {
77648
+ return undefined;
77649
+ }
76994
77650
  const normalizedFormat = format.toLowerCase();
76995
77651
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
76996
77652
 
@@ -77142,76 +77798,19 @@ class BaseInput extends AuroElement$1$1 {
77142
77798
  constructor() {
77143
77799
  super();
77144
77800
 
77145
- this.appearance = "default";
77146
- this.disabled = false;
77147
- this.layout = 'classic';
77148
- this.locale = 'en-US';
77149
- this.max = undefined;
77150
- this.maxLength = undefined;
77151
- this.min = undefined;
77152
- this.minLength = undefined;
77153
- this.required = false;
77154
- this.onDark = false;
77155
- this.setCustomValidityForType = undefined;
77156
- this.size = 'lg';
77157
- this.shape = 'classic';
77158
- this.value = undefined;
77159
-
77160
- this._initializePrivateDefaults();
77161
- }
77162
-
77163
- /**
77164
- * Internal Defaults.
77165
- * @private
77166
- * @returns {void}
77167
- */
77168
- _initializePrivateDefaults() {
77801
+ // Single-source initialization. Alphabetized so duplicate or stale
77802
+ // defaults are immediately obvious on a diff. Every field is assigned
77803
+ // exactly once here (previously the constructor + the old
77804
+ // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
77805
+ // fields and double-allocated `util` and `validation`, discarding the
77806
+ // first instance). `validation` is now allocated exactly once; `util`
77807
+ // is seeded here with an en-US default and then rebuilt in
77808
+ // `connectedCallback` once the consumer-resolved locale is available,
77809
+ // so a parent (datepicker/combobox) calling `validate()` synchronously
77810
+ // during its own update cycle sees a populated util instance.
77169
77811
  this.activeLabel = false;
77170
- this.appearance = "default";
77171
- this.icon = false;
77172
- this.disabled = false;
77173
- this.dvInputOnly = false;
77174
- this.hideLabelVisually = false;
77175
- this.max = undefined;
77176
- this.maxLength = undefined;
77177
- this.min = undefined;
77178
- this.minLength = undefined;
77179
- this.noValidate = false;
77180
- this.onDark = false;
77181
- this.required = false;
77182
- this.setCustomValidityForType = undefined;
77183
-
77184
- // Used for storing raw values returned from input mask.
77185
- this._rawMaskValue = undefined;
77186
-
77187
- /**
77188
- * @private
77189
- */
77190
- this.layout = 'classic';
77191
-
77192
- /**
77193
- * @private
77194
- */
77195
- this.shape = 'classic';
77196
-
77197
- /**
77198
- * @private
77199
- */
77200
- this.size = 'lg';
77201
-
77202
- this.touched = false;
77203
- this.util = new AuroInputUtilities({
77204
- locale: "en-US",
77205
- format: this.format
77206
- });
77207
- this.validation = new AuroFormValidation$2();
77208
- this.inputIconName = undefined;
77209
- this.showPassword = false;
77210
- this.validationCCLength = undefined;
77211
- this.hasValue = false;
77212
- this.label = 'Input label is undefined';
77213
-
77214
77812
 
77813
+ /** @private */
77215
77814
  this.allowedInputTypes = [
77216
77815
  "text",
77217
77816
  "number",
@@ -77220,7 +77819,9 @@ class BaseInput extends AuroElement$1$1 {
77220
77819
  "credit-card",
77221
77820
  "tel"
77222
77821
  ];
77223
- this.icon = false;
77822
+ this.appearance = "default";
77823
+
77824
+ /** @private */
77224
77825
  this.dateFormatMap = {
77225
77826
  'mm/dd/yyyy': 'dateMMDDYYYY',
77226
77827
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -77237,27 +77838,62 @@ class BaseInput extends AuroElement$1$1 {
77237
77838
  'dd/mm': 'dateDDMM',
77238
77839
  'mm/dd': 'dateMMDD'
77239
77840
  };
77841
+ this.disabled = false;
77842
+
77843
+ /** @private */
77240
77844
  this.domHandler = new DomHandler();
77241
77845
  this.dvInputOnly = false;
77242
77846
  this.hasValue = false;
77847
+ this.hideLabelVisually = false;
77848
+ this.icon = false;
77849
+
77850
+ /** @private */
77243
77851
  this.inputIconName = undefined;
77852
+
77853
+ /** @private */
77244
77854
  this.label = 'Input label is undefined';
77855
+ this.layout = 'classic';
77856
+ this.locale = 'en-US';
77857
+ this.max = undefined;
77858
+ this.maxLength = undefined;
77859
+ this.min = undefined;
77860
+ this.minLength = undefined;
77245
77861
  this.noValidate = false;
77246
- this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
77862
+ this.onDark = false;
77863
+ // Raw values returned from the input mask before model normalization.
77864
+ this._rawMaskValue = undefined;
77865
+ this.required = false;
77866
+ this.setCustomValidityForType = undefined;
77867
+ // Credit Card is intentionally excluded — its mask manages the cursor
77868
+ // itself, and listing it here caused cursor placement issues in Safari.
77869
+ /** @private */
77247
77870
  this.setSelectionInputTypes = [
77248
77871
  "text",
77249
77872
  "password",
77250
77873
  "email"
77251
- ]; // Credit Card is not included as this caused cursor placement issues in Safari.
77874
+ ];
77875
+ this.shape = 'classic';
77876
+
77877
+ /** @private */
77252
77878
  this.showPassword = false;
77879
+ this.size = 'lg';
77253
77880
  this.touched = false;
77881
+
77882
+ /** @private */
77254
77883
  this.uniqueId = new UniqueId().create();
77884
+
77885
+ /** @private */
77255
77886
  this.util = new AuroInputUtilities({
77256
77887
  locale: this.locale,
77257
77888
  format: this.format
77258
77889
  });
77890
+
77891
+ /** @private */
77259
77892
  this.validation = new AuroFormValidation$2();
77893
+
77894
+ /** @private */
77260
77895
  this.validationCCLength = undefined;
77896
+ this.value = undefined;
77261
77897
  }
77262
77898
 
77263
77899
  // function to define props used within the scope of this component
@@ -77761,6 +78397,15 @@ class BaseInput extends AuroElement$1$1 {
77761
78397
 
77762
78398
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
77763
78399
 
78400
+ // Normalize the format token to lowercase so case-mixed values supplied
78401
+ // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
78402
+ // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
78403
+ // format silently misses the map and leaves `setCustomValidityForType`
78404
+ // unset.
78405
+ if (this.format) {
78406
+ this.format = this.format.toLowerCase();
78407
+ }
78408
+
77764
78409
  // use validity message override if declared when initializing the component
77765
78410
  if (this.hasAttribute('setCustomValidity')) {
77766
78411
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -77844,6 +78489,13 @@ class BaseInput extends AuroElement$1$1 {
77844
78489
 
77845
78490
  if (typeToI18n.includes(this.type)) {
77846
78491
  this.setCustomValidityForType = i18n(this.lang, this.type);
78492
+ // COVERAGE: this `else if` branch is unreachable in WTR. connectedCallback
78493
+ // (L682) calls configureDataForType, which at L1266-1268 assigns
78494
+ // `this.format = this.util.getDateMaskFromLocale().toLowerCase()` for any
78495
+ // type=date input whose `format` attribute is unset. That runs before
78496
+ // firstUpdated invokes setCustomHelpTextMessage, so `!this.format` is
78497
+ // always false here. Retained as a defensive fallback; the whole function
78498
+ // is @deprecated per AB#1557296 and slated for removal.
77847
78499
  } else if (!this.format && this.type === 'date') {
77848
78500
  this.setCustomValidityForType = i18n(this.lang, 'dateMMDDYYYY');
77849
78501
  } else if (this.dateFormatMap[this.format]) {
@@ -78133,6 +78785,38 @@ class BaseInput extends AuroElement$1$1 {
78133
78785
  this.touched = true;
78134
78786
  this.validation.validate(this);
78135
78787
  }
78788
+
78789
+ // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
78790
+ // update that can re-render the input and reset the native cursor; we
78791
+ // capture the caret position before that update commits and restore it
78792
+ // via `setSelectionRange` once the update has flushed. Gated on
78793
+ // `setSelectionInputTypes` so credit-card (and other masked types whose
78794
+ // formatter manages the cursor itself) doesn't get a competing write.
78795
+ // Capture the caret position INSIDE the gate — reading `selectionStart`
78796
+ // on input types that don't support text selection (number, email in
78797
+ // some browsers) throws InvalidStateError, which would crash all input
78798
+ // handling. Wrap the read in try/catch belt-and-suspenders even though
78799
+ // the gated types currently support it, since the list is a public
78800
+ // property a consumer could mutate.
78801
+ if (this.setSelectionInputTypes.includes(this.type)) {
78802
+ let selectionStart = null;
78803
+ try {
78804
+ ({ selectionStart } = this.inputElement);
78805
+ } catch (error) { // eslint-disable-line no-unused-vars
78806
+ return;
78807
+ }
78808
+ if (typeof selectionStart !== 'number') {
78809
+ return;
78810
+ }
78811
+ this.updateComplete.then(() => {
78812
+ try {
78813
+ this.inputElement.setSelectionRange(selectionStart, selectionStart);
78814
+ } catch (error) { // eslint-disable-line no-unused-vars
78815
+ // Some input types (number/email in certain UAs) throw on
78816
+ // setSelectionRange; swallow and let the native cursor stand.
78817
+ }
78818
+ });
78819
+ }
78136
78820
  }
78137
78821
 
78138
78822
  /**
@@ -78266,7 +78950,7 @@ class BaseInput extends AuroElement$1$1 {
78266
78950
  */
78267
78951
  get placeholderStr() {
78268
78952
  if (!this.placeholder && this.type === 'date') {
78269
- return this.format ? this.format.toUpperCase() : 'MM/DD/YYYY';
78953
+ return this.format.toUpperCase();
78270
78954
  }
78271
78955
  return this.placeholder || "";
78272
78956
  }
@@ -78757,7 +79441,7 @@ let AuroHelpText$1$1 = class AuroHelpText extends i$2 {
78757
79441
  }
78758
79442
  };
78759
79443
 
78760
- var formkitVersion$1$1 = '202606231948';
79444
+ var formkitVersion$1$1 = '202607010104';
78761
79445
 
78762
79446
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
78763
79447
  // See LICENSE in the project root for license information.
@@ -79260,6 +79944,7 @@ class AuroInput extends BaseInput {
79260
79944
  <${this.buttonTag}
79261
79945
  @click="${this.handleClickShowPassword}"
79262
79946
  appearance="${this.onDark ? 'inverse' : this.appearance}"
79947
+ aria-pressed="${this.showPassword ? 'true' : 'false'}"
79263
79948
  class="notificationBtn passwordBtn"
79264
79949
  shape="circle"
79265
79950
  size="sm"
@@ -79333,25 +80018,29 @@ class AuroInput extends BaseInput {
79333
80018
  * @returns {html} - Returns HTML for the help text and error message.
79334
80019
  */
79335
80020
  renderHtmlHelpText() {
80021
+ // Single `<p>` with stable identity across validity transitions —
80022
+ // previously two distinct templates (valid vs invalid) caused Lit to
80023
+ // replace the node entirely on a flip, and VoiceOver wouldn't
80024
+ // re-announce because the live-region element it was watching had been
80025
+ // removed and a new one inserted. Keeping one node means the `role`,
80026
+ // `aria-live`, and text content all change in-place, which AT does
80027
+ // observe and announce.
80028
+ const isError = this.validity && this.validity !== 'valid';
79336
80029
  return u$d`
79337
- ${!this.validity || this.validity === undefined || this.validity === 'valid'
79338
- ? u$d`
79339
- <${this.helpTextTag}
79340
- appearance="${this.onDark ? 'inverse' : this.appearance}">
79341
- <p id="${this.uniqueId}" part="helpText">
79342
- <slot name="helpText">${this.getHelpText()}</slot>
79343
- </p>
79344
- </${this.helpTextTag}>
79345
- `
79346
- : u$d`
79347
- <${this.helpTextTag} error
79348
- appearance="${this.onDark ? 'inverse' : this.appearance}">
79349
- <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
79350
- ${this.errorMessage}
79351
- </p>
79352
- </${this.helpTextTag}>
79353
- `
79354
- }
80030
+ <${this.helpTextTag}
80031
+ appearance="${this.onDark ? 'inverse' : this.appearance}"
80032
+ ?error=${isError}>
80033
+ <p
80034
+ id="${this.uniqueId}"
80035
+ part="helpText"
80036
+ role="${o$4(isError ? 'alert' : undefined)}"
80037
+ aria-live="${o$4(isError ? 'assertive' : undefined)}">
80038
+ ${isError
80039
+ ? this.errorMessage
80040
+ : u$d`<slot name="helpText">${this.getHelpText()}</slot>`
80041
+ }
80042
+ </p>
80043
+ </${this.helpTextTag}>
79355
80044
  `;
79356
80045
  }
79357
80046
 
@@ -79483,7 +80172,7 @@ class AuroInput extends BaseInput {
79483
80172
 
79484
80173
  var colorCss$1$3 = i$4`#headerContainer{box-shadow:var(--ds-auro-dropdownbib-header-boxshadow-color)}#footerContainer{background-color:var(--ds-auro-dropdownbib-footer-container-color)}`;
79485
80174
 
79486
- var styleCss$2$2 = i$4`#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)}`;
80175
+ var styleCss$2$2 = i$4`#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)}`;
79487
80176
 
79488
80177
  var tokenCss$1 = i$4`: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)}`;
79489
80178
 
@@ -79878,7 +80567,7 @@ let AuroBibtemplate$1 = class AuroBibtemplate extends i$2 {
79878
80567
  }
79879
80568
  };
79880
80569
 
79881
- var formkitVersion$3 = '202606231948';
80570
+ var formkitVersion$3 = '202607010104';
79882
80571
 
79883
80572
  var styleCss$1$3 = i$4`.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}`;
79884
80573
 
@@ -80246,12 +80935,23 @@ function getOptionLabel(option) {
80246
80935
  if (!option) {
80247
80936
  return '';
80248
80937
  }
80249
- const clone = option.cloneNode(true);
80250
- const displayValueEl = clone.querySelector('[slot="displayValue"]');
80251
- if (displayValueEl) {
80252
- displayValueEl.remove();
80938
+
80939
+ // Consumer-provided override: short-circuit the DOM walk entirely.
80940
+ if (option.dataset && option.dataset.label) {
80941
+ return option.dataset.label;
80942
+ }
80943
+
80944
+ // Walk direct children — the `slot` attribute only applies to direct children
80945
+ // of the slot host, so a shallow filter is sufficient. Avoids the cloneNode +
80946
+ // querySelector allocation that ran on every keystroke via syncValuesAndStates.
80947
+ let text = '';
80948
+ for (const node of option.childNodes) {
80949
+ const isDisplayValueSlot = node.nodeType === Node.ELEMENT_NODE && node.getAttribute('slot') === 'displayValue';
80950
+ if (!isDisplayValueSlot) {
80951
+ text += node.textContent || '';
80952
+ }
80253
80953
  }
80254
- return (clone.textContent || '').replace(/\s+/gu, ' ').trim();
80954
+ return text.replace(/\s+/gu, ' ').trim();
80255
80955
  }
80256
80956
 
80257
80957
  // See https://git.io/JJ6SJ for "How to document your components using JSDoc"
@@ -80326,8 +81026,6 @@ class AuroCombobox extends AuroElement$3 {
80326
81026
  this.availableOptions = [];
80327
81027
  this.dropdownId = undefined;
80328
81028
  this.dropdownOpen = false;
80329
- this.triggerExpandedState = false;
80330
- this._expandedTimeout = null;
80331
81029
  this._inFullscreenTransition = false;
80332
81030
  this.errorMessage = null;
80333
81031
  this.isHiddenWhileLoading = false;
@@ -80338,6 +81036,30 @@ class AuroCombobox extends AuroElement$3 {
80338
81036
  this.touched = false;
80339
81037
  this.validation = new AuroFormValidation$1();
80340
81038
  this.validity = undefined;
81039
+ this._userTyped = false;
81040
+ // Tracks every setTimeout scheduled via _scheduleTimer so
81041
+ // disconnectedCallback can cancel them. Without this, a detached
81042
+ // combobox's pending timers still fire — most are no-ops, but
81043
+ // configureMenu's racing-condition retry would otherwise loop.
81044
+ this._pendingTimers = new Set();
81045
+ }
81046
+
81047
+ /**
81048
+ * setTimeout wrapper that records the timer id so disconnectedCallback
81049
+ * can cancel any outstanding callbacks. The id is removed from the set
81050
+ * once the callback fires so the set doesn't grow unbounded.
81051
+ * @param {Function} fn - Callback to run.
81052
+ * @param {number} ms - Delay in milliseconds.
81053
+ * @returns {number} The timer id.
81054
+ * @private
81055
+ */
81056
+ _scheduleTimer(fn, ms) {
81057
+ const id = setTimeout(() => {
81058
+ this._pendingTimers.delete(id);
81059
+ fn();
81060
+ }, ms);
81061
+ this._pendingTimers.add(id);
81062
+ return id;
80341
81063
  }
80342
81064
 
80343
81065
  // This function is to define props used within the scope of this component
@@ -80699,17 +81421,6 @@ class AuroCombobox extends AuroElement$3 {
80699
81421
  attribute: false
80700
81422
  },
80701
81423
 
80702
- /**
80703
- * Deferred aria-expanded state for the trigger input.
80704
- * Delays the "true" transition so VoiceOver finishes its character echo
80705
- * before announcing "expanded".
80706
- * @private
80707
- */
80708
- triggerExpandedState: {
80709
- type: Boolean,
80710
- reflect: false,
80711
- attribute: false
80712
- },
80713
81424
  };
80714
81425
  }
80715
81426
 
@@ -80732,13 +81443,6 @@ class AuroCombobox extends AuroElement$3 {
80732
81443
  return this.input.value;
80733
81444
  }
80734
81445
 
80735
- // /**
80736
- // * Sets the value of the input element within the combobox.
80737
- // */
80738
- // set inputValue(value) {
80739
- // this.input.value = value;
80740
- // }
80741
-
80742
81446
  /**
80743
81447
  * Checks if the element is valid.
80744
81448
  * @returns {boolean} - Returns true if the element is valid, false otherwise.
@@ -80884,8 +81588,11 @@ class AuroCombobox extends AuroElement$3 {
80884
81588
  this.syncInputValuesAcrossTriggerAndBib(label || this.value);
80885
81589
  }
80886
81590
 
80887
- // update the displayValue in the trigger if displayValue slot content is present
80888
- const displayValueInTrigger = this.input.querySelector('[slot="displayValue"]');
81591
+ // Replace any previously appended displayValue clone in the trigger.
81592
+ // :not(slot) excludes the template's <slot name="displayValue"
81593
+ // slot="displayValue"> forwarder, which also has slot="displayValue"
81594
+ // and would otherwise be matched first and removed.
81595
+ const displayValueInTrigger = this.input.querySelector('[slot="displayValue"]:not(slot)');
80889
81596
 
80890
81597
  if (displayValueInTrigger) {
80891
81598
  displayValueInTrigger.remove();
@@ -80913,19 +81620,19 @@ class AuroCombobox extends AuroElement$3 {
80913
81620
  * Writes nextValue to the trigger input and the bib input when their current
80914
81621
  * value differs, then re-asserts imask after Lit's update flushes.
80915
81622
  * @param {string} nextValue - The value to write to both inputs.
80916
- * @returns {Promise<void> | null} Promise that resolves after the inputs flush,
80917
- * or null when no sync was needed (so callers can skip post-flush work).
81623
+ * @returns {Promise<void>} Resolves after both inputs flush and imask
81624
+ * re-asserts; resolves immediately when no sync is needed.
80918
81625
  * @private
80919
81626
  */
80920
- syncInputValuesAcrossTriggerAndBib(nextValue) {
81627
+ async syncInputValuesAcrossTriggerAndBib(nextValue) {
80921
81628
  // Only set the flag when there's an actual write to suppress —
80922
81629
  // syncValuesAndStates re-enters here during typing when both inputs
80923
81630
  // already match, and a no-op flag flip would make the bib branch's
80924
81631
  // bail eat legitimate user-input events.
80925
81632
  const triggerNeedsSync = this.input.value !== nextValue;
80926
- const bibNeedsSync = this.inputInBib.value !== nextValue;
81633
+ const bibNeedsSync = Boolean(this.inputInBib) && this.inputInBib.value !== nextValue;
80927
81634
  if (!triggerNeedsSync && !bibNeedsSync) {
80928
- return null;
81635
+ return;
80929
81636
  }
80930
81637
 
80931
81638
  this._syncingDisplayValue = true;
@@ -80939,16 +81646,21 @@ class AuroCombobox extends AuroElement$3 {
80939
81646
  this.inputInBib.value = nextValue;
80940
81647
  pending.push(this.inputInBib.updateComplete);
80941
81648
  }
80942
- return Promise.all(pending).then(() => {
81649
+ // finally — not a bare .then — so that an imask throw (see commit
81650
+ // d1857401c: imask can throw on credit-card format change) doesn't strand
81651
+ // _syncingDisplayValue=true and silently swallow every subsequent input.
81652
+ try {
81653
+ await Promise.all(pending);
80943
81654
  // imask reasserts otherwise, and handleBlur reverts to its stale value.
80944
81655
  if (triggerNeedsSync && this.input.maskInstance && typeof this.input.maskInstance.updateValue === 'function') {
80945
81656
  this.input.maskInstance.updateValue();
80946
81657
  }
80947
- if (bibNeedsSync && this.inputInBib && this.inputInBib.maskInstance && typeof this.inputInBib.maskInstance.updateValue === 'function') {
81658
+ if (bibNeedsSync && this.inputInBib.maskInstance && typeof this.inputInBib.maskInstance.updateValue === 'function') {
80948
81659
  this.inputInBib.maskInstance.updateValue();
80949
81660
  }
81661
+ } finally {
80950
81662
  this._syncingDisplayValue = false;
80951
- });
81663
+ }
80952
81664
  }
80953
81665
 
80954
81666
  /**
@@ -80959,6 +81671,13 @@ class AuroCombobox extends AuroElement$3 {
80959
81671
  handleMenuOptions() {
80960
81672
  this.generateOptionsArray();
80961
81673
  this.availableOptions = [];
81674
+ // Single source of truth for the menu's filter/highlight token per call.
81675
+ // syncValuesAndStates re-writes the same value on exact-match keystrokes —
81676
+ // Lit's hasChanged makes that a no-op — and the prior duplicate set inside
81677
+ // handleTriggerInputValueChange is gone.
81678
+ if (this.menu) {
81679
+ this.menu.matchWord = normalizeFilterValue(this.input.value);
81680
+ }
80962
81681
  this.updateFilter();
80963
81682
 
80964
81683
  // Set aria-setsize/aria-posinset on each visible option so screen readers
@@ -80970,11 +81689,8 @@ class AuroCombobox extends AuroElement$3 {
80970
81689
  option.setAttribute('aria-posinset', index + 1);
80971
81690
  });
80972
81691
 
80973
- if (this.value && this.input.value && !this.menu.value) {
80974
- if (this.behavior === 'suggestion' && this.menu.options && this.menu.options.some((opt) => opt.value === this.value)) {
80975
- this.setMenuValue(this.value);
80976
- }
80977
-
81692
+ if (this.input.value && this.menu.options && this.menu.options.some((opt) => opt.value === this.input.value)) {
81693
+ this.setMenuValue(this.input.value);
80978
81694
  this.syncValuesAndStates();
80979
81695
  }
80980
81696
 
@@ -81053,18 +81769,6 @@ class AuroCombobox extends AuroElement$3 {
81053
81769
  this.dropdownOpen = ev.detail.expanded;
81054
81770
  this.updateMenuShapeSize();
81055
81771
 
81056
- // Defer aria-expanded "true" so VoiceOver finishes character echo
81057
- // before announcing "expanded". Set "false" immediately on close.
81058
- clearTimeout(this._expandedTimeout);
81059
- if (this.dropdownOpen) {
81060
- const expandedDelay = 150;
81061
- this._expandedTimeout = setTimeout(() => {
81062
- this.triggerExpandedState = true;
81063
- }, expandedDelay);
81064
- } else {
81065
- this.triggerExpandedState = false;
81066
- }
81067
-
81068
81772
  // Clear aria-activedescendant when dropdown closes
81069
81773
  if (!this.dropdownOpen && this.input) {
81070
81774
  this.input.setActiveDescendant(null);
@@ -81169,7 +81873,7 @@ class AuroCombobox extends AuroElement$3 {
81169
81873
  this.dropdown.trigger.inert = false;
81170
81874
  }
81171
81875
 
81172
- setTimeout(() => {
81876
+ this._scheduleTimer(() => {
81173
81877
  this.setInputFocus();
81174
81878
  }, 0);
81175
81879
  });
@@ -81313,7 +82017,7 @@ class AuroCombobox extends AuroElement$3 {
81313
82017
 
81314
82018
  // racing condition on custom-combobox with custom-menu
81315
82019
  if (!this.menu) {
81316
- setTimeout(() => {
82020
+ this._scheduleTimer(() => {
81317
82021
  this.configureMenu();
81318
82022
  }, 0);
81319
82023
  return;
@@ -81368,9 +82072,7 @@ class AuroCombobox extends AuroElement$3 {
81368
82072
  // Hide dropdown on selection (except during slot changes)
81369
82073
  if (evt.detail && evt.detail.source !== 'slotchange') {
81370
82074
  // do not close while typing in suggestion mode with no value selected, to allow freeform input
81371
- if (this.menu.value || this.behavior !== 'suggestion') {
81372
- this.hideBib();
81373
- }
82075
+ this.hideBib();
81374
82076
 
81375
82077
  // Move focus to the clear button when the user makes a selection.
81376
82078
  if (!isEcho && this.menu.value !== undefined) {
@@ -81384,7 +82086,7 @@ class AuroCombobox extends AuroElement$3 {
81384
82086
  const selectedValue = this.menu.value;
81385
82087
  if (selectedValue) {
81386
82088
  const announcementDelay = 300;
81387
- setTimeout(() => {
82089
+ this._scheduleTimer(() => {
81388
82090
  announceToScreenReader$1(this._getAnnouncementRoot(), `${selectedValue}, selected`);
81389
82091
  }, announcementDelay);
81390
82092
  }
@@ -81396,10 +82098,6 @@ class AuroCombobox extends AuroElement$3 {
81396
82098
  // only — fresh user selections take the existing hideBib path.
81397
82099
  if (isEcho && this.menu.optionSelected) {
81398
82100
  this._programmaticFilterRefresh = true;
81399
- this.handleMenuOptions();
81400
- setTimeout(() => {
81401
- this._programmaticFilterRefresh = false;
81402
- }, 0);
81403
82101
  }
81404
82102
  });
81405
82103
 
@@ -81412,6 +82110,14 @@ class AuroCombobox extends AuroElement$3 {
81412
82110
  // stale option. Safe from re-entrancy because any resulting
81413
82111
  // input.value changes dispatch isProgrammatic events.
81414
82112
  this.menu.addEventListener('auroMenu-selectValueFailure', () => {
82113
+ // Announce the rejection BEFORE we clear `this.value` so the live
82114
+ // region carries the attempted value — without this the bib closes
82115
+ // silently and screen-reader users get no signal that their request
82116
+ // (e.g. a direct setMenuValue() call) was dropped.
82117
+ const attemptedValue = this.value;
82118
+ if (attemptedValue) {
82119
+ announceToScreenReader$1(this._getAnnouncementRoot(), `No matching option for ${attemptedValue}`);
82120
+ }
81415
82121
  this.value = undefined;
81416
82122
  this.optionSelected = undefined;
81417
82123
  });
@@ -81423,10 +82129,13 @@ class AuroCombobox extends AuroElement$3 {
81423
82129
  this.input.setActiveDescendant(this.optionActive);
81424
82130
  }
81425
82131
 
81426
- // Announce the active option for screen readers including position,
81427
- // since shadow DOM boundaries prevent native reading of
81428
- // aria-setsize/aria-posinset via aria-activedescendant.
81429
- if (this.optionActive) {
82132
+ // In fullscreen mode the menu sits inside a nested <dialog> shadow root,
82133
+ // and aria-activedescendant references across that boundary are lost —
82134
+ // VoiceOver/NVDA don't read the active option natively, so we mirror it
82135
+ // into the polite live region. In popover mode aria-activedescendant on
82136
+ // the trigger input is read natively; double-announcing would flood the
82137
+ // queue on arrow-key repeat.
82138
+ if (this.optionActive && this.dropdown.isBibFullscreen) {
81430
82139
  const optionText = this.optionActive.textContent.trim();
81431
82140
  const selectedState = this.optionActive.hasAttribute('selected') ? ', selected' : ', not selected';
81432
82141
  const optionIndex = this.availableOptions.indexOf(this.optionActive) + 1;
@@ -81459,7 +82168,12 @@ class AuroCombobox extends AuroElement$3 {
81459
82168
  * Validate every time we remove focus from the combo box.
81460
82169
  */
81461
82170
  this.addEventListener('focusout', () => {
81462
- if (!this.componentHasFocus && !this._inFullscreenTransition) {
82171
+ // Skip while the dropdown is open — focus transits out briefly on
82172
+ // mousedown of a menu option (popover top-layer breaks :focus-within),
82173
+ // and validating against the pre-selection value flashes a stale error
82174
+ // between mousedown and mouseup. The next focusout fires after the
82175
+ // dropdown closes and validates against the post-selection value.
82176
+ if (!this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen) {
81463
82177
  this.validate();
81464
82178
  }
81465
82179
  });
@@ -81522,49 +82236,40 @@ class AuroCombobox extends AuroElement$3 {
81522
82236
  if (this._syncingDisplayValue) {
81523
82237
  return;
81524
82238
  }
81525
- this._syncingBibValue = true;
81526
- this.input.value = this.inputInBib.value;
81527
- this.input.updateComplete.then(() => {
81528
- this._syncingBibValue = false;
81529
- });
81530
-
81531
- // Run filtering inline — the re-entrant event won't reach this code.
81532
- this.menu.matchWord = normalizeFilterValue(this.inputInBib.value);
81533
- this.optionActive = null;
81534
82239
 
81535
- // In suggestion mode, keep the combobox value in sync with the typed
81536
- // text so that freeform values are captured (mirroring the non-fullscreen
81537
- // path). Clear the selection when the input is emptied.
81538
- if (this.behavior === 'suggestion') {
81539
- this.value = this.inputInBib.value || undefined;
82240
+ // Filtering runs via re-entrance: writing this.input.value below
82241
+ // dispatches an 'input' event that the trigger's listener routes to
82242
+ // handleTriggerInputValueChange, which refreshes the menu filter.
82243
+ if (this.input.value !== this.inputInBib.value) {
82244
+ this._syncingBibValue = true;
82245
+ this.input.value = this.inputInBib.value;
82246
+ this.input.updateComplete.then(() => {
82247
+ this._syncingBibValue = false;
82248
+ });
81540
82249
  }
81541
82250
 
81542
- this.handleMenuOptions();
81543
82251
  this.dispatchEvent(new CustomEvent('inputValue', { detail: { value: this.inputValue } }));
81544
- return;
82252
+ } else if (event.target === this.input) {
82253
+
82254
+ // Also sync the native input immediately so keystrokes arriving
82255
+ // before Lit's async update cycle (e.g. rapid Backspaces during a
82256
+ // fullscreen transition) operate on the correct content.
82257
+ // Skip the next programmatic input event to prevent the patched setter
82258
+ // from re-entering handleInputValueChange via the bib path.
82259
+ const bibNativeInput = this.inputInBib.inputElement;
82260
+ if (bibNativeInput && bibNativeInput.value !== this.input.value) {
82261
+ this.inputInBib.skipNextProgrammaticInputEvent = true;
82262
+ bibNativeInput.value = this.input.value || '';
82263
+ }
81545
82264
  }
81546
82265
 
82266
+ this.value = this.input.value;
82267
+
81547
82268
  // Ignore re-entrant input events caused by programmatic value sets.
81548
82269
  if (this._syncingBibValue || this._syncingDisplayValue) {
81549
82270
  return;
81550
82271
  }
81551
82272
 
81552
- this.inputInBib.value = this.input.value;
81553
-
81554
- // Also sync the native input immediately so keystrokes arriving
81555
- // before Lit's async update cycle (e.g. rapid Backspaces during a
81556
- // fullscreen transition) operate on the correct content.
81557
- // Skip the next programmatic input event to prevent the patched setter
81558
- // from re-entering handleInputValueChange via the bib path.
81559
- const bibNativeInput = this.inputInBib.inputElement;
81560
- if (bibNativeInput && bibNativeInput.value !== this.input.value) {
81561
- this.inputInBib.skipNextProgrammaticInputEvent = true;
81562
- bibNativeInput.value = this.input.value || '';
81563
- }
81564
-
81565
- this.menu.matchWord = normalizeFilterValue(this.input.value);
81566
- this.optionActive = null;
81567
-
81568
82273
  if (this.behavior === 'suggestion') {
81569
82274
  this.value = this.input.value;
81570
82275
  }
@@ -81572,7 +82277,6 @@ class AuroCombobox extends AuroElement$3 {
81572
82277
  if (!this.input.value && !this._clearing) {
81573
82278
  this.clear();
81574
82279
  }
81575
- this.handleMenuOptions();
81576
82280
 
81577
82281
  // Validate only if the value was set programmatically (not during user
81578
82282
  // interaction). In fullscreen dialog mode, componentHasFocus returns false
@@ -81582,34 +82286,44 @@ class AuroCombobox extends AuroElement$3 {
81582
82286
  this.validate();
81583
82287
  }
81584
82288
 
81585
- if (this.input.value && this.input.value.length === 0) {
81586
- // Hide menu if value is empty, otherwise show if there are available suggestions
81587
- this.hideBib();
81588
- } else if (this.menu.loading) {
81589
- // if input has value but menu is loading, show bib immediately
81590
- this.showBib();
81591
- } else if (this.availableOptions.length === 0 && !this.dropdown.isBibFullscreen) {
81592
- // Force dropdown bib to hide if input value has no matching suggestions
81593
- this.hideBib();
82289
+ this.dispatchEvent(new CustomEvent('inputValue', { detail: { value: this.inputValue } }));
82290
+ }
82291
+
82292
+ /**
82293
+ * Handles input value changes originating from the trigger input.
82294
+ * Refreshes menu options and filtering, delegates to handleInputValueChange
82295
+ * for value synchronization, and manages fullscreen bib focus.
82296
+ * @private
82297
+ * @param {Event} event - The input event from the trigger input element.
82298
+ * @returns {void}
82299
+ */
82300
+ handleTriggerInputValueChange(event) {
82301
+ // 'input' fires for every user-initiated value change — typing, paste,
82302
+ // IME composition end, dead-key composition, drag-drop. Flip _userTyped
82303
+ // here so updated('availableOptions') auto-opens the bib for sources
82304
+ // that keydown alone misses: paste fires no keydown, IME uses
82305
+ // key='Process', and dead keys produce multi-char keys (all bypass the
82306
+ // prior keydown.key.length===1 gate). Skip programmatic syncs.
82307
+ if (!this._syncingDisplayValue && !this._syncingBibValue && !this._programmaticFilterRefresh) {
82308
+ this._userTyped = true;
81594
82309
  }
81595
82310
 
81596
- // iOS virtual keyboard retention: when in fullscreen mode, ensure the
81597
- // dialog opens and the bib input is focused synchronously within the
81598
- // input event (user gesture) chain. Without this, Lit's async update
81599
- // cycle delays showModal() past the user activation window, causing
81600
- // iOS Safari to dismiss the virtual keyboard when the fullscreen
81601
- // dialog opens — the user then has to tap the input again to resume
81602
- // typing.
81603
- if (this.dropdown.isBibFullscreen && this.input.value && this.input.value.length > 0) {
81604
- if (!this.dropdown.isPopoverVisible) {
81605
- this.showBib();
81606
- }
81607
- if (this.dropdown.isPopoverVisible) {
81608
- this.setInputFocus();
81609
- }
82311
+ this.handleMenuOptions();
82312
+ this.optionActive = null;
82313
+
82314
+ if (this.value === this.input.value) {
82315
+ return;
81610
82316
  }
81611
82317
 
81612
- this.dispatchEvent(new CustomEvent('inputValue', { detail: { value: this.inputValue } }));
82318
+ this.handleInputValueChange(event);
82319
+
82320
+ if (this.dropdown.isBibFullscreen && this.input.value && this.input.value.length > 0 && this.dropdown.isPopoverVisible) {
82321
+ this.setInputFocus();
82322
+ }
82323
+
82324
+ if (this._programmaticFilterRefresh) {
82325
+ this._programmaticFilterRefresh = false;
82326
+ }
81613
82327
  }
81614
82328
 
81615
82329
  /**
@@ -81677,6 +82391,11 @@ class AuroCombobox extends AuroElement$3 {
81677
82391
  disconnectedCallback() {
81678
82392
  super.disconnectedCallback();
81679
82393
  this._inFullscreenTransition = false;
82394
+ // Cancel any outstanding timers so detached callbacks don't fire on
82395
+ // disposed DOM — most are no-ops, but configureMenu's racing-condition
82396
+ // retry would otherwise keep rescheduling itself indefinitely.
82397
+ this._pendingTimers.forEach((id) => clearTimeout(id));
82398
+ this._pendingTimers.clear();
81680
82399
  }
81681
82400
 
81682
82401
  firstUpdated() {
@@ -81718,7 +82437,7 @@ class AuroCombobox extends AuroElement$3 {
81718
82437
  this.menu.value = value;
81719
82438
  // Backup clear: if menu.value === menu.optionSelected.value already, the
81720
82439
  // listener won't fire and the flag would swallow the next user click.
81721
- setTimeout(() => {
82440
+ this._scheduleTimer(() => {
81722
82441
  this._pendingMenuValueSync = false;
81723
82442
  }, 0);
81724
82443
  }
@@ -81753,6 +82472,17 @@ class AuroCombobox extends AuroElement$3 {
81753
82472
  this.optionSelected = undefined;
81754
82473
  this.value = undefined;
81755
82474
 
82475
+ // Clear the appended displayValue clone in the trigger if present.
82476
+ // :not(slot) excludes the template's <slot name="displayValue"
82477
+ // slot="displayValue"> forwarder (line 1816), which also has
82478
+ // slot="displayValue" and would otherwise be matched first and removed,
82479
+ // permanently breaking the consumer-provided displayValue slot.
82480
+ const displayValueInTrigger = this.input.querySelector('[slot="displayValue"]:not(slot)');
82481
+
82482
+ if (displayValueInTrigger) {
82483
+ displayValueInTrigger.remove();
82484
+ }
82485
+
81756
82486
  if (this.input.value) {
81757
82487
  this.input.clear();
81758
82488
  }
@@ -81776,56 +82506,50 @@ class AuroCombobox extends AuroElement$3 {
81776
82506
  }
81777
82507
 
81778
82508
  updated(changedProperties) {
81779
- // After the component is ready, send direct value changes to auro-menu.
82509
+ // After the component is ready, propagate direct changes down to child components.
81780
82510
  if (changedProperties.has('value')) {
81781
- if (this.value && this.value.length > 0) {
81782
- this.hasValue = true;
81783
- } else {
81784
- this.hasValue = false;
82511
+ // Only flag programmatic refreshes — user-typed value changes must not
82512
+ // suppress the availableOptions branch's showBib(). Firefox batches
82513
+ // 'value' and 'availableOptions' into the same updated() call, so
82514
+ // setting the flag unconditionally here masks the user-typed open path.
82515
+ if (!this._userTyped) {
82516
+ this._programmaticFilterRefresh = true;
81785
82517
  }
81786
82518
 
81787
- if (this.hasValue && !this.input.value && (!this.menu.options || this.menu.options.length === 0)) {
81788
- this.input.value = this.value;
81789
- }
82519
+ if (this.input.value !== this.value) {
82520
+ // Clear menu.value AND menu.optionSelected together. Clearing only
82521
+ // menu.value leaves the previously-selected option element pinned
82522
+ // as menu.optionSelected; a later auroMenu-selectedOption event
82523
+ // would then write its stale .value back into combobox.value
82524
+ // (e.g. Tab-after-Backspace re-selecting the prior option).
82525
+ if (this.menu.value || this.menu.optionSelected) {
82526
+ this.menu.clearSelection();
82527
+ }
81790
82528
 
81791
- // Sync menu.value only when an option actually matches, or when filter
81792
- // mode needs setMenuValue to dispatch auroMenu-selectValueFailure (the
81793
- // listener at line 1206 clears combobox.value, mirroring select's
81794
- // pattern). Otherwise sync the input display for freeform values.
81795
- if (this.menu.options && this.menu.options.length > 0) {
81796
- if (this.menu.options.some((opt) => opt.value === this.value) || this.behavior === 'filter') {
81797
- this.setMenuValue(this.value);
81798
- } else {
81799
- // Clear menu.value AND menu.optionSelected together. Clearing only
81800
- // menu.value leaves the previously-selected option element pinned
81801
- // as menu.optionSelected; a later auroMenu-selectedOption event
81802
- // would then write its stale .value back into combobox.value.
81803
- if (this.menu.value || this.menu.optionSelected) {
81804
- this.menu.clearSelection();
81805
- }
81806
- // Suggestion-mode freeform value: sync the trigger + bib to show it,
81807
- // then refresh the filter once the inputs flush (handleInputValueChange
81808
- // bailed on _syncingDisplayValue).
81809
- const syncPromise = this.syncInputValuesAcrossTriggerAndBib(this.value || '');
81810
- if (syncPromise) {
81811
- syncPromise.then(() => {
81812
- this._programmaticFilterRefresh = true;
81813
- this.handleMenuOptions();
81814
- setTimeout(() => {
81815
- this._programmaticFilterRefresh = false;
81816
- }, 0);
81817
- });
81818
- }
82529
+ if (!this.persistInput) {
82530
+ this.syncInputValuesAcrossTriggerAndBib(this.value || '');
82531
+ }
82532
+
82533
+ // Programmatic value with no matching option: updateFilter will close
82534
+ // the bib silently (see line 648 no noMatchOption + 0 results
82535
+ // hides). Announce so screen-reader users hear the request was
82536
+ // dropped. Gated on `input.value !== this.value` so this never fires
82537
+ // for user typing that path always reconciles input.value to
82538
+ // this.value before updated() runs.
82539
+ if (
82540
+ this.value &&
82541
+ this.menu &&
82542
+ this.menu.options &&
82543
+ this.menu.options.length > 0 &&
82544
+ !this.menu.options.some((opt) => opt.value === this.value)
82545
+ ) {
82546
+ announceToScreenReader$1(this._getAnnouncementRoot(), `No matching option for ${this.value}`);
81819
82547
  }
81820
82548
  }
82549
+
81821
82550
  if (!this.value) {
81822
82551
  this.clear();
81823
82552
  }
81824
- if (this.value && !this.componentHasFocus) {
81825
- // If the value got set programmatically make sure we hide the bib
81826
- // when input is not taking the focus (input can be in dropdown.trigger or in bibtemplate)
81827
- this.hideBib();
81828
- }
81829
82553
 
81830
82554
  // Sync the input and match word, but don't directly set menu.value again
81831
82555
  if (this.menu) {
@@ -81838,7 +82562,7 @@ class AuroCombobox extends AuroElement$3 {
81838
82562
  composed: true,
81839
82563
  detail: {
81840
82564
  optionSelected: this.menu.optionSelected,
81841
- value: this.menu.value
82565
+ value: this.value
81842
82566
  }
81843
82567
  }));
81844
82568
 
@@ -81861,16 +82585,30 @@ class AuroCombobox extends AuroElement$3 {
81861
82585
  // from a programmatic filter refresh after a value swap — the user
81862
82586
  // didn't interact, so we shouldn't auto-open the bib (especially for
81863
82587
  // the no-match path where the existing condition unconditionally fires).
81864
- if (this._programmaticFilterRefresh) {
81865
- this._programmaticFilterRefresh = false;
81866
- } else if ((this.availableOptions.length > 0 && (this.componentHasFocus || this.dropdownOpen)) || (this.menu && this.menu.loading) || (this.availableOptions.length === 0 && this.noMatchOption)) {
81867
- this.showBib();
82588
+ if ((this.menu && !this._programmaticFilterRefresh)) {
82589
+ if (
82590
+ this.availableOptions.length > 0 ||
82591
+ this.menu.loading ||
82592
+ this.noMatchOption
82593
+ ) {
82594
+ if (this._userTyped) {
82595
+ if (!this.dropdownOpen) {
82596
+ this.showBib();
82597
+ }
82598
+ this._userTyped = false;
82599
+ }
82600
+ }
82601
+
81868
82602
  if (!this.availableOptions.includes(this.menu.optionActive)) {
81869
82603
  this.activateFirstEnabledAvailableOption();
81870
82604
  }
81871
- } else if (this.dropdown && this.dropdown.isPopoverVisible) {
82605
+ } else if (!this.dropdown.isBibFullscreen) {
81872
82606
  this.hideBib();
81873
82607
  }
82608
+
82609
+ if (this._programmaticFilterRefresh) {
82610
+ this._programmaticFilterRefresh = false;
82611
+ }
81874
82612
  }
81875
82613
 
81876
82614
  if (changedProperties.has('error')) {
@@ -82012,10 +82750,10 @@ class AuroCombobox extends AuroElement$3 {
82012
82750
  shape="${this.shape}"
82013
82751
  size="${this.size}">
82014
82752
  <${this.inputTag}
82015
- @input="${this.handleInputValueChange}"
82753
+ @input="${this.handleTriggerInputValueChange}"
82016
82754
  appearance="${this.onDark ? 'inverse' : this.appearance}"
82017
82755
  .a11yActivedescendant="${this.dropdownOpen && this.optionActive ? this.optionActive.id : undefined}"
82018
- .a11yExpanded="${this.triggerExpandedState}"
82756
+ .a11yExpanded="${this.dropdownOpen}"
82019
82757
  .a11yControls="${this.dropdownId}"
82020
82758
  .autocomplete="${this.autocomplete}"
82021
82759
  .inputmode="${this.inputmode}"
@@ -84263,15 +85001,17 @@ class AuroFormValidation {
84263
85001
  );
84264
85002
  }
84265
85003
 
84266
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
84267
- if (this.auroInputElements?.length === 2) {
84268
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
85004
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
85005
+
85006
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
85007
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
85008
+ // field (datepicker is the intended consumer — start/end are independently required).
85009
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
85010
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
84269
85011
  hasValue = false;
84270
85012
  }
84271
85013
  }
84272
85014
 
84273
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
84274
-
84275
85015
  if (isCombobox) {
84276
85016
 
84277
85017
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -84663,19 +85403,28 @@ const selectKeyboardStrategy = {
84663
85403
  },
84664
85404
 
84665
85405
  End(component, evt, ctx) {
84666
- if (!ctx.isExpanded) {
84667
- return;
84668
- }
84669
85406
  evt.preventDefault();
84670
85407
  evt.stopPropagation();
84671
85408
  // `pop()` is safe here: getEnabledOptions returns a fresh filtered array.
84672
85409
  const lastOption = getEnabledOptions(component.menu).pop();
84673
- if (lastOption) {
84674
- component.menu.updateActiveOption(lastOption);
85410
+ if (!lastOption) {
85411
+ return;
85412
+ }
85413
+ // Pre-stash before show() so the auroDropdown-toggled handler's
85414
+ // `!optionActive` guard short-circuits the firstActive/selected fallback —
85415
+ // otherwise show() synchronously fires the handler and writes
85416
+ // aria-activedescendant once before we overwrite it.
85417
+ component.menu.updateActiveOption(lastOption);
85418
+ if (!ctx.isExpanded) {
85419
+ component.dropdown.show();
84675
85420
  }
84676
85421
  },
84677
85422
 
84678
85423
  Enter(component, evt, ctx) {
85424
+ // Prevent the keypress from bubbling to parent containers (e.g., forms)
85425
+ // which could interpret Enter as a submit. Matches APG select-only combobox
85426
+ // and native <select> behavior: Enter opens the listbox when closed, selects
85427
+ // the active option when open — it does not submit a parent form.
84679
85428
  evt.preventDefault();
84680
85429
  evt.stopPropagation();
84681
85430
  if (!ctx.isExpanded) {
@@ -84686,14 +85435,16 @@ const selectKeyboardStrategy = {
84686
85435
  },
84687
85436
 
84688
85437
  Home(component, evt, ctx) {
84689
- if (!ctx.isExpanded) {
84690
- return;
84691
- }
84692
85438
  evt.preventDefault();
84693
85439
  evt.stopPropagation();
84694
85440
  const [firstOption] = getEnabledOptions(component.menu);
84695
- if (firstOption) {
84696
- component.menu.updateActiveOption(firstOption);
85441
+ if (!firstOption) {
85442
+ return;
85443
+ }
85444
+ // See End() for why this must run before show().
85445
+ component.menu.updateActiveOption(firstOption);
85446
+ if (!ctx.isExpanded) {
85447
+ component.dropdown.show();
84697
85448
  }
84698
85449
  },
84699
85450
 
@@ -88641,7 +89392,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
88641
89392
  }
88642
89393
  };
88643
89394
 
88644
- var formkitVersion$1 = '202606231948';
89395
+ var formkitVersion$1 = '202607010104';
88645
89396
 
88646
89397
  class AuroElement extends i$2 {
88647
89398
  static get properties() {
@@ -89913,6 +90664,7 @@ class AuroDropdown extends AuroElement {
89913
90664
  role="${o$4(this.triggerContentFocusable ? undefined : this.a11yRole)}"
89914
90665
  aria-expanded="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.isPopoverVisible)}"
89915
90666
  aria-controls="${o$4(this.a11yRole === 'button' || this.triggerContentFocusable ? undefined : this.dropdownId)}"
90667
+ aria-haspopup="${o$4(this.a11yRole === 'combobox' && !this.triggerContentFocusable ? 'listbox' : undefined)}"
89916
90668
  aria-labelledby="${o$4(this.triggerContentFocusable ? undefined : 'triggerLabel')}"
89917
90669
  aria-disabled="${o$4(this.disabled ? 'true' : undefined)}"
89918
90670
  @focusin="${this.handleFocusin}"
@@ -90039,7 +90791,7 @@ class AuroDropdown extends AuroElement {
90039
90791
 
90040
90792
  var colorCss$1 = i$4`#headerContainer{box-shadow:var(--ds-auro-dropdownbib-header-boxshadow-color)}#footerContainer{background-color:var(--ds-auro-dropdownbib-footer-container-color)}`;
90041
90793
 
90042
- var styleCss$2 = i$4`#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)}`;
90794
+ var styleCss$2 = i$4`#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)}`;
90043
90795
 
90044
90796
  var tokenCss = i$4`: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)}`;
90045
90797
 
@@ -90662,7 +91414,7 @@ class AuroHelpText extends i$2 {
90662
91414
  }
90663
91415
  }
90664
91416
 
90665
- var formkitVersion = '202606231948';
91417
+ var formkitVersion = '202607010104';
90666
91418
 
90667
91419
  var styleCss = i$4`.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}`;
90668
91420
 
@@ -90994,14 +91746,6 @@ class AuroSelect extends AuroElement$1 {
90994
91746
  reflect: true
90995
91747
  },
90996
91748
 
90997
- /**
90998
- * @private
90999
- */
91000
- options: {
91001
- type: Array,
91002
- state: true
91003
- },
91004
-
91005
91749
  /**
91006
91750
  * Specifies the current selected menuOption. Default type is `HTMLElement`, changing to `Array<HTMLElement>` when `multiSelect` is true.
91007
91751
  * @type {HTMLElement|Array<HTMLElement>}
@@ -91289,16 +92033,68 @@ class AuroSelect extends AuroElement$1 {
91289
92033
  this.dropdown.dropdownWidth = this.customBibWidth;
91290
92034
  }
91291
92035
 
91292
- // Pass label text to the dropdown bib for accessible dialog naming
91293
- const labelElement = this.querySelector('span[slot="label"]');
91294
- if (labelElement) {
91295
- this.dropdown.bibDialogLabel = labelElement.textContent.trim() || undefined;
91296
- }
92036
+ this._syncLabelText();
91297
92037
 
91298
92038
  // Exposes the CSS parts from the dropdown for styling
91299
92039
  this.dropdown.exposeCssParts();
91300
92040
  }
91301
92041
 
92042
+ /**
92043
+ * Reads the current label slot text and pushes it to the dropdown bib
92044
+ * (for dialog naming) and the menu (for listbox aria-label). Safe to call
92045
+ * before either child has been wired up — each branch self-guards.
92046
+ * @private
92047
+ */
92048
+ _syncLabelText() {
92049
+ const labelElement = this.querySelector('[slot="label"]');
92050
+ const text = labelElement ? labelElement.textContent.trim() : '';
92051
+ if (this.dropdown) {
92052
+ this.dropdown.bibDialogLabel = text || undefined;
92053
+ }
92054
+ if (this.menu) {
92055
+ if (text) {
92056
+ this.menu.setAttribute('aria-label', text);
92057
+ } else {
92058
+ this.menu.removeAttribute('aria-label');
92059
+ }
92060
+ }
92061
+ }
92062
+
92063
+ /**
92064
+ * Keeps the dialog/menu accessible names in sync when consumers mutate the
92065
+ * label slot at runtime (e.g., i18n locale swap). `slotchange` alone is
92066
+ * insufficient — it doesn't fire when textContent of an already-assigned
92067
+ * slotted node changes, which is the common case. We scope the observer to
92068
+ * the label node itself (not the whole host subtree) so option-content
92069
+ * mutations don't trigger label re-syncs, and re-target on `slotchange`
92070
+ * when consumers add or replace the label element.
92071
+ * @private
92072
+ */
92073
+ _observeLabelChanges() {
92074
+ if (this._labelObserver) return;
92075
+ this._labelObserver = new MutationObserver(() => this._syncLabelText());
92076
+
92077
+ const retarget = () => {
92078
+ this._labelObserver.disconnect();
92079
+ const labelElement = this.querySelector('[slot="label"]');
92080
+ if (labelElement) {
92081
+ this._labelObserver.observe(labelElement, {
92082
+ childList: true,
92083
+ subtree: true,
92084
+ characterData: true
92085
+ });
92086
+ }
92087
+ this._syncLabelText();
92088
+ };
92089
+
92090
+ retarget();
92091
+
92092
+ this._retargetLabelObserver = retarget;
92093
+ this.shadowRoot.querySelectorAll('slot[name="label"]').forEach((slot) => {
92094
+ slot.addEventListener('slotchange', retarget);
92095
+ });
92096
+ }
92097
+
91302
92098
  /**
91303
92099
  * This will register this element with the browser.
91304
92100
  * @param {string} [name="auro-select"] - The name of element that you want to register to.
@@ -91449,11 +92245,7 @@ class AuroSelect extends AuroElement$1 {
91449
92245
  this.updateMenuShapeSize();
91450
92246
  this.setMenuValue(this.value);
91451
92247
 
91452
- // Set accessible name on the menu for screen readers based on the label slot content
91453
- const labelElement = this.querySelector('[slot="label"]');
91454
- if (labelElement) {
91455
- this.menu.setAttribute('aria-label', labelElement.textContent.trim());
91456
- }
92248
+ this._syncLabelText();
91457
92249
 
91458
92250
  if (this.multiSelect) {
91459
92251
  this.menu.multiSelect = this.multiSelect;
@@ -91465,8 +92257,21 @@ class AuroSelect extends AuroElement$1 {
91465
92257
  if (typeof this.menu.initItems === 'function') {
91466
92258
  this.menu.initItems();
91467
92259
  }
91468
- this.options = this.menu.options;
91469
92260
  this.updateOptionPositions();
92261
+ // renderNativeSelect reads this.menu.options, which the parent doesn't
92262
+ // observe — request an update so the hidden native <option> list reflects
92263
+ // the menu's options after initItems populates them.
92264
+ this.requestUpdate();
92265
+
92266
+ // Keep aria-setsize/aria-posinset (and the native <option> list) in sync
92267
+ // when the menu re-initializes its items — e.g., slotchange, async/lazy
92268
+ // loads, value-triggered re-init. Without this, stale set-size is
92269
+ // announced and the native select goes stale after dynamic mutations.
92270
+ this.menu.addEventListener('auroMenu-optionsChange', () => {
92271
+ this.updateOptionPositions();
92272
+ this.requestUpdate();
92273
+ });
92274
+
91470
92275
  this.menu.addEventListener("auroMenu-loadingChange", (event) => this.handleMenuLoadingChange(event));
91471
92276
 
91472
92277
  this.menu.addEventListener("auroMenu-selectValueFailure", () => {
@@ -91485,11 +92290,26 @@ class AuroSelect extends AuroElement$1 {
91485
92290
  this.dropdown.setActiveDescendant(this.optionActive);
91486
92291
  }
91487
92292
 
91488
- // Announce the active option for screen readers
91489
- if (this.optionActive) {
92293
+ // Live-region announce only for [not selected] options. For activations
92294
+ // on an already-selected option — auto-activation on bib open, arrow
92295
+ // navigation back to the selection, or click in multiSelect — rely on
92296
+ // aria-activedescendant + aria-selected="true" to convey state per the
92297
+ // WAI-ARIA listbox pattern. This is intentional, not limited to the
92298
+ // initial activation on open: it also prevents a duplicate "X, selected"
92299
+ // when Enter on the active+selected option re-fires
92300
+ // auroMenu-selectedOption (see 03b289e39).
92301
+ if (this.optionActive && !this.optionActive.hasAttribute('selected')) {
91490
92302
  const optionText = this.optionActive.textContent.trim();
91491
- const selectedState = this.optionActive.hasAttribute('selected') ? ', selected' : ', not selected';
91492
- announceToScreenReader(this._getAnnouncementRoot(), `${optionText}${selectedState}`);
92303
+ const message = `${optionText}, not selected`;
92304
+ if (this.dropdown.isPopoverVisible) {
92305
+ announceToScreenReader(this._getAnnouncementRoot(), message);
92306
+ } else {
92307
+ // Typeahead-on-closed fires this event before `show()` flips
92308
+ // isPopoverVisible. Defer so the announcement targets the bib's
92309
+ // live region once the fullscreen <dialog> opens — otherwise it
92310
+ // lands in the host root, which is inert under the active modal.
92311
+ queueMicrotask(() => announceToScreenReader(this._getAnnouncementRoot(), message));
92312
+ }
91493
92313
  }
91494
92314
 
91495
92315
  if (this.dropdown.isPopoverVisible) {
@@ -91498,6 +92318,7 @@ class AuroSelect extends AuroElement$1 {
91498
92318
  });
91499
92319
 
91500
92320
  this.menu.addEventListener('auroMenu-selectedOption', () => {
92321
+ const previousSelected = this.optionSelected;
91501
92322
 
91502
92323
  // Update the displayed value
91503
92324
  this.updateDisplayedValue();
@@ -91517,13 +92338,32 @@ class AuroSelect extends AuroElement$1 {
91517
92338
  this.dropdown.trigger.focus();
91518
92339
  }
91519
92340
 
91520
- // Announce the selection after the dropdown closes so it isn't
91521
- // overridden by VoiceOver's "collapsed" announcement from aria-expanded.
91522
- const selectedValue = this.menu.currentLabel;
91523
- const announcementDelay = 300;
91524
- setTimeout(() => {
91525
- announceToScreenReader(this._getAnnouncementRoot(), `${selectedValue}, selected`);
91526
- }, announcementDelay);
92341
+ // Describe the actual change. In multiSelect, currentLabel is the
92342
+ // concatenated remaining list — announcing "{list}, selected" after a
92343
+ // deselect would falsely claim every remaining label was just added.
92344
+ // Diff previous vs next to recover the toggled option.
92345
+ let announcement = '';
92346
+ if (this.multiSelect) {
92347
+ const prev = Array.isArray(previousSelected) ? previousSelected : [];
92348
+ const removed = prev.find((opt) => !nextSelected.includes(opt));
92349
+ const added = nextSelected.find((opt) => !prev.includes(opt));
92350
+ if (removed) {
92351
+ announcement = `${removed.textContent.trim()}, not selected`;
92352
+ } else if (added) {
92353
+ announcement = `${added.textContent.trim()}, selected`;
92354
+ }
92355
+ } else {
92356
+ announcement = `${this.menu.currentLabel}, selected`;
92357
+ }
92358
+
92359
+ // Delay so the utterance isn't overridden by VoiceOver's "collapsed"
92360
+ // announcement from aria-expanded when the dropdown closes.
92361
+ if (announcement) {
92362
+ const announcementDelay = 300;
92363
+ setTimeout(() => {
92364
+ announceToScreenReader(this._getAnnouncementRoot(), announcement);
92365
+ }, announcementDelay);
92366
+ }
91527
92367
  });
91528
92368
  }
91529
92369
 
@@ -91621,24 +92461,32 @@ class AuroSelect extends AuroElement$1 {
91621
92461
 
91622
92462
  this.typeaheadBuffer += key;
91623
92463
 
91624
- const isRepeatedChar = this.typeaheadBuffer.length > 1 && new Set(this.typeaheadBuffer).size === 1;
92464
+ // Prefer the literal buffer as a prefix per WAI-ARIA APG ("focus moves to the
92465
+ // next item with a name that starts with the string of characters typed").
92466
+ // Only fall back to single-char cycling when the repeated buffer has no
92467
+ // longer prefix match — e.g. "aa" cycles through ["Apple", "Apricot"] only
92468
+ // because no option starts with "aa".
92469
+ let match = options.find((option) => this._getOptionDisplayText(option).startsWith(this.typeaheadBuffer));
91625
92470
 
91626
- let match = null;
92471
+ const isRepeatedChar = !match && this.typeaheadBuffer.length > 1 && new Set(this.typeaheadBuffer).size === 1;
91627
92472
  if (isRepeatedChar) {
91628
92473
  const matches = options.filter((option) => this._getOptionDisplayText(option).startsWith(key));
91629
92474
  if (matches.length) {
91630
92475
  const cycleIndex = (this.typeaheadBuffer.length - 1) % matches.length;
91631
92476
  match = matches[cycleIndex];
91632
92477
  }
91633
- } else {
91634
- match = options.find((option) => this._getOptionDisplayText(option).startsWith(this.typeaheadBuffer));
91635
92478
  }
91636
92479
 
92480
+ // Intentional: no-match leaves the bib closed (deviates from APG / some native <select>).
91637
92481
  if (match) {
92482
+ // Pre-stash the match so the auroDropdown-toggled handler's `!optionActive`
92483
+ // guard short-circuits and skips the firstActive/selected fallback —
92484
+ // otherwise show() synchronously fires the handler, which writes
92485
+ // aria-activedescendant once before we overwrite it.
92486
+ this.menu.updateActiveOption(match);
91638
92487
  if (!this.dropdown.isPopoverVisible) {
91639
92488
  this.dropdown.show();
91640
92489
  }
91641
- this.menu.updateActiveOption(match);
91642
92490
  }
91643
92491
  }
91644
92492
 
@@ -91755,6 +92603,28 @@ class AuroSelect extends AuroElement$1 {
91755
92603
  disconnectedCallback() {
91756
92604
  super.disconnectedCallback();
91757
92605
  this._clearTypeaheadBuffer();
92606
+ if (this._labelObserver) {
92607
+ this._labelObserver.disconnect();
92608
+ this._labelObserver = null;
92609
+ }
92610
+ if (this._retargetLabelObserver && this.shadowRoot) {
92611
+ this.shadowRoot.querySelectorAll('slot[name="label"]').forEach((slot) => {
92612
+ slot.removeEventListener('slotchange', this._retargetLabelObserver);
92613
+ });
92614
+ this._retargetLabelObserver = null;
92615
+ }
92616
+ }
92617
+
92618
+ connectedCallback() {
92619
+ super.connectedCallback();
92620
+ // Regression guard: firstUpdated() fires once per instance, so the label
92621
+ // observer setup it triggers does NOT re-run on reconnect. After a
92622
+ // disconnect+reconnect (reparent, SPA route swap), runtime label mutations
92623
+ // would silently stop syncing menu aria-label / dropdown.bibDialogLabel
92624
+ // unless we re-wire the observer here.
92625
+ if (this.hasUpdated) {
92626
+ this._observeLabelChanges();
92627
+ }
91758
92628
  }
91759
92629
 
91760
92630
  // lifecycle runs only after the element's DOM has been updated the first time
@@ -91765,6 +92635,7 @@ class AuroSelect extends AuroElement$1 {
91765
92635
  this.configureDropdown();
91766
92636
  this.configureMenu();
91767
92637
  this.configureSelect();
92638
+ this._observeLabelChanges();
91768
92639
  }
91769
92640
 
91770
92641
  setMenuValue(value) {
@@ -91897,25 +92768,18 @@ class AuroSelect extends AuroElement$1 {
91897
92768
  * @private
91898
92769
  */
91899
92770
  _handleNativeSelectChange(event) {
92771
+ // Hidden native <select> has no `multiple` attribute, so any change it fires
92772
+ // is a single raw value — applying it in multiSelect mode would collapse the
92773
+ // JSON-array `value` shape. Bfcache/autofill can reach this on a name-bearing
92774
+ // form control even with aria-hidden/tabindex=-1.
92775
+ if (this.multiSelect) return;
92776
+
91900
92777
  const selectedOption = event.target.options[event.target.selectedIndex];
91901
92778
  if (!selectedOption) return;
91902
92779
  const selectedValue = selectedOption.value;
91903
92780
 
91904
- if (this.multiSelect) {
91905
- const currentArray = this.menu.value || [];
91906
-
91907
- if (!currentArray.includes(selectedValue)) {
91908
- this.value = JSON.stringify([
91909
- ...currentArray,
91910
- selectedValue
91911
- ]);
91912
- }
91913
- } else {
91914
- const currentValue = this.value;
91915
-
91916
- if (currentValue !== selectedValue) {
91917
- this.value = selectedValue;
91918
- }
92781
+ if (this.value !== selectedValue) {
92782
+ this.value = selectedValue;
91919
92783
  }
91920
92784
  }
91921
92785