@aurodesignsystem-dev/auro-formkit 0.0.0-pr1512.0 → 0.0.0-pr1513.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/components/checkbox/demo/customize.min.js +1 -1
  2. package/components/checkbox/demo/getting-started.min.js +1 -1
  3. package/components/checkbox/demo/index.min.js +1 -1
  4. package/components/checkbox/dist/index.js +1 -1
  5. package/components/checkbox/dist/registered.js +1 -1
  6. package/components/combobox/demo/customize.min.js +96 -119
  7. package/components/combobox/demo/getting-started.min.js +96 -119
  8. package/components/combobox/demo/index.min.js +96 -119
  9. package/components/combobox/dist/index.js +95 -118
  10. package/components/combobox/dist/registered.js +95 -118
  11. package/components/counter/demo/customize.min.js +2 -2
  12. package/components/counter/demo/index.min.js +2 -2
  13. package/components/counter/dist/index.js +2 -2
  14. package/components/counter/dist/registered.js +2 -2
  15. package/components/datepicker/demo/accessibility.md +2 -1
  16. package/components/datepicker/demo/api.md +63 -62
  17. package/components/datepicker/demo/customize.md +12 -1
  18. package/components/datepicker/demo/customize.min.js +716 -336
  19. package/components/datepicker/demo/index.min.js +716 -336
  20. package/components/datepicker/dist/{src/auro-calendar-cell.d.ts → auro-calendar-cell.d.ts} +14 -3
  21. package/components/datepicker/dist/{src/auro-calendar.d.ts → auro-calendar.d.ts} +91 -6
  22. package/components/datepicker/dist/{src/auro-datepicker.d.ts → auro-datepicker.d.ts} +78 -5
  23. package/components/datepicker/dist/blackoutUtils.d.ts +43 -0
  24. package/components/datepicker/dist/index.js +716 -336
  25. package/components/datepicker/dist/registered.js +716 -336
  26. package/components/dropdown/demo/customize.min.js +1 -1
  27. package/components/dropdown/demo/getting-started.min.js +1 -1
  28. package/components/dropdown/demo/index.min.js +1 -1
  29. package/components/dropdown/dist/index.js +1 -1
  30. package/components/dropdown/dist/registered.js +1 -1
  31. package/components/form/demo/customize.min.js +918 -584
  32. package/components/form/demo/getting-started.min.js +918 -584
  33. package/components/form/demo/index.min.js +918 -584
  34. package/components/form/demo/registerDemoDeps.min.js +918 -584
  35. package/components/input/demo/api.md +5 -5
  36. package/components/input/demo/customize.md +8 -8
  37. package/components/input/demo/customize.min.js +93 -116
  38. package/components/input/demo/getting-started.min.js +93 -116
  39. package/components/input/demo/index.min.js +93 -116
  40. package/components/input/dist/base-input.d.ts +44 -33
  41. package/components/input/dist/index.js +94 -129
  42. package/components/input/dist/registered.js +93 -116
  43. package/components/radio/demo/customize.min.js +1 -1
  44. package/components/radio/demo/getting-started.min.js +1 -1
  45. package/components/radio/demo/index.min.js +1 -1
  46. package/components/radio/dist/index.js +1 -1
  47. package/components/radio/dist/registered.js +1 -1
  48. package/components/select/demo/customize.min.js +2 -2
  49. package/components/select/demo/getting-started.min.js +2 -2
  50. package/components/select/demo/index.min.js +2 -2
  51. package/components/select/dist/index.js +2 -2
  52. package/components/select/dist/registered.js +2 -2
  53. package/custom-elements.json +562 -480
  54. package/package.json +6 -2
  55. package/components/checkbox/demo/customize.js +0 -22
  56. package/components/checkbox/demo/demo-support.js +0 -1
  57. package/components/checkbox/demo/getting-started.js +0 -22
  58. package/components/checkbox/demo/index.js +0 -8
  59. package/components/checkbox/demo/styles.scss +0 -1
  60. package/components/combobox/demo/customize.js +0 -24
  61. package/components/combobox/demo/demo-support.js +0 -1
  62. package/components/combobox/demo/getting-started.js +0 -21
  63. package/components/combobox/demo/index.js +0 -23
  64. package/components/combobox/demo/styles.scss +0 -1
  65. package/components/counter/demo/customize.js +0 -21
  66. package/components/counter/demo/demo-support.js +0 -1
  67. package/components/counter/demo/index.js +0 -21
  68. package/components/counter/demo/styles.scss +0 -1
  69. package/components/datepicker/demo/customize.js +0 -17
  70. package/components/datepicker/demo/demo-support.js +0 -1
  71. package/components/datepicker/demo/index.js +0 -23
  72. package/components/datepicker/demo/styles.scss +0 -1
  73. package/components/dropdown/demo/customize.js +0 -9
  74. package/components/dropdown/demo/demo-support.js +0 -1
  75. package/components/dropdown/demo/getting-started.js +0 -9
  76. package/components/dropdown/demo/index.js +0 -16
  77. package/components/dropdown/demo/styles.scss +0 -1
  78. package/components/form/demo/customize.js +0 -28
  79. package/components/form/demo/demo-support.js +0 -1
  80. package/components/form/demo/getting-started.js +0 -9
  81. package/components/form/demo/index.js +0 -5
  82. package/components/form/demo/registerDemoDeps.js +0 -23
  83. package/components/form/demo/styles.scss +0 -1
  84. package/components/input/demo/customize.js +0 -25
  85. package/components/input/demo/demo-support.js +0 -1
  86. package/components/input/demo/getting-started.js +0 -8
  87. package/components/input/demo/index.js +0 -8
  88. package/components/input/demo/styles.css +0 -974
  89. package/components/input/demo/styles.scss +0 -1
  90. package/components/menu/demo/demo-support.js +0 -1
  91. package/components/menu/demo/index.js +0 -25
  92. package/components/menu/demo/styles.scss +0 -1
  93. package/components/radio/demo/customize.js +0 -22
  94. package/components/radio/demo/demo-support.js +0 -1
  95. package/components/radio/demo/getting-started.js +0 -24
  96. package/components/radio/demo/index.js +0 -8
  97. package/components/radio/demo/styles.scss +0 -1
  98. package/components/select/demo/customize.js +0 -11
  99. package/components/select/demo/demo-support.js +0 -1
  100. package/components/select/demo/getting-started.js +0 -26
  101. package/components/select/demo/index.js +0 -11
  102. package/components/select/demo/styles.scss +0 -1
  103. /package/components/datepicker/dist/{src/auro-calendar-month.d.ts → auro-calendar-month.d.ts} +0 -0
  104. /package/components/datepicker/dist/{src/buttonVersion.d.ts → buttonVersion.d.ts} +0 -0
  105. /package/components/datepicker/dist/{src/datepickerKeyboardStrategy.d.ts → datepickerKeyboardStrategy.d.ts} +0 -0
  106. /package/components/datepicker/dist/{src/iconVersion.d.ts → iconVersion.d.ts} +0 -0
  107. /package/components/datepicker/dist/{src/index.d.ts → index.d.ts} +0 -0
  108. /package/components/datepicker/dist/{src/popoverVersion.d.ts → popoverVersion.d.ts} +0 -0
  109. /package/components/datepicker/dist/{src/styles → styles}/classic/color-css.d.ts +0 -0
  110. /package/components/datepicker/dist/{src/styles → styles}/classic/style-css.d.ts +0 -0
  111. /package/components/datepicker/dist/{src/styles → styles}/color-calendar-css.d.ts +0 -0
  112. /package/components/datepicker/dist/{src/styles → styles}/color-cell-css.d.ts +0 -0
  113. /package/components/datepicker/dist/{src/styles → styles}/color-css.d.ts +0 -0
  114. /package/components/datepicker/dist/{src/styles → styles}/color-month-css.d.ts +0 -0
  115. /package/components/datepicker/dist/{src/styles → styles}/shapeSize-css.d.ts +0 -0
  116. /package/components/datepicker/dist/{src/styles → styles}/snowflake/color-css.d.ts +0 -0
  117. /package/components/datepicker/dist/{src/styles → styles}/snowflake/style-css.d.ts +0 -0
  118. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-cell-css.d.ts +0 -0
  119. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-css.d.ts +0 -0
  120. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-month-css.d.ts +0 -0
  121. /package/components/datepicker/dist/{src/styles → styles}/style-css.d.ts +0 -0
  122. /package/components/datepicker/dist/{src/styles → styles}/tokens-css.d.ts +0 -0
  123. /package/components/datepicker/dist/{src/utilities.d.ts → utilities.d.ts} +0 -0
  124. /package/components/datepicker/dist/{src/utilitiesCalendar.d.ts → utilitiesCalendar.d.ts} +0 -0
  125. /package/components/datepicker/dist/{src/utilitiesCalendarRender.d.ts → utilitiesCalendarRender.d.ts} +0 -0
  126. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/day.d.ts +0 -0
  127. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker-calendar.d.ts +0 -0
  128. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker-cell.d.ts +0 -0
  129. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker.d.ts +0 -0
@@ -5135,7 +5135,7 @@ function normalizeDates$3(context, ...dates) {
5135
5135
  * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))
5136
5136
  * //=> Tue Sep 02 2014 00:00:00
5137
5137
  */
5138
- function startOfDay$4(date, options) {
5138
+ function startOfDay$3(date, options) {
5139
5139
  const _date = toDate$3(date, options?.in);
5140
5140
  _date.setHours(0, 0, 0, 0);
5141
5141
  return _date;
@@ -5183,8 +5183,8 @@ function differenceInCalendarDays$3(laterDate, earlierDate, options) {
5183
5183
  earlierDate,
5184
5184
  );
5185
5185
 
5186
- const laterStartOfDay = startOfDay$4(laterDate_);
5187
- const earlierStartOfDay = startOfDay$4(earlierDate_);
5186
+ const laterStartOfDay = startOfDay$3(laterDate_);
5187
+ const earlierStartOfDay = startOfDay$3(earlierDate_);
5188
5188
 
5189
5189
  const laterTimestamp =
5190
5190
  +laterStartOfDay - getTimezoneOffsetInMilliseconds$3(laterStartOfDay);
@@ -10456,13 +10456,6 @@ let AuroInputUtilities$3 = class AuroInputUtilities {
10456
10456
  * @returns {string | undefined}
10457
10457
  */
10458
10458
  toFormattedValue(valueObject, format) {
10459
- // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
10460
- // `format` argument has to fail gracefully rather than throw on
10461
- // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
10462
- // as "no format → no display value".
10463
- if (!format) {
10464
- return undefined;
10465
- }
10466
10459
  const normalizedFormat = format.toLowerCase();
10467
10460
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
10468
10461
 
@@ -10613,18 +10606,79 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
10613
10606
  constructor() {
10614
10607
  super();
10615
10608
 
10616
- // Single-source initialization. Alphabetized so duplicate or stale
10617
- // defaults are immediately obvious on a diff. Every field is assigned
10618
- // exactly once here (previously the constructor + the old
10619
- // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
10620
- // fields and double-allocated `util` and `validation`, discarding the
10621
- // first instance). `validation` is now allocated exactly once; `util`
10622
- // is seeded here with an en-US default and then rebuilt in
10623
- // `connectedCallback` once the consumer-resolved locale is available,
10624
- // so a parent (datepicker/combobox) calling `validate()` synchronously
10625
- // during its own update cycle sees a populated util instance.
10609
+ this.appearance = "default";
10610
+ this.disabled = false;
10611
+ this.layout = 'classic';
10612
+ this.locale = 'en-US';
10613
+ this.max = undefined;
10614
+ this._maxObject = undefined;
10615
+ this.maxLength = undefined;
10616
+ this.min = undefined;
10617
+ this._minObject = undefined;
10618
+ this.minLength = undefined;
10619
+ this.required = false;
10620
+ this.onDark = false;
10621
+ this.setCustomValidityForType = undefined;
10622
+ this.size = 'lg';
10623
+ this.shape = 'classic';
10624
+ this.value = undefined;
10625
+ this._valueObject = undefined;
10626
+
10627
+ this._initializePrivateDefaults();
10628
+ }
10629
+
10630
+ /**
10631
+ * Internal Defaults.
10632
+ * @private
10633
+ * @returns {void}
10634
+ */
10635
+ _initializePrivateDefaults() {
10626
10636
  this.activeLabel = false;
10627
- /** @private */
10637
+ this.appearance = "default";
10638
+ this.icon = false;
10639
+ this.disabled = false;
10640
+ this.dvInputOnly = false;
10641
+ this.hideLabelVisually = false;
10642
+ this.max = undefined;
10643
+ this.maxLength = undefined;
10644
+ this.min = undefined;
10645
+ this.minLength = undefined;
10646
+ this.noValidate = false;
10647
+ this.onDark = false;
10648
+ this.required = false;
10649
+ this.setCustomValidityForType = undefined;
10650
+
10651
+ // Used for storing raw values returned from input mask.
10652
+ this._rawMaskValue = undefined;
10653
+
10654
+ /**
10655
+ * @private
10656
+ */
10657
+ this.layout = 'classic';
10658
+
10659
+ /**
10660
+ * @private
10661
+ */
10662
+ this.shape = 'classic';
10663
+
10664
+ /**
10665
+ * @private
10666
+ */
10667
+ this.size = 'lg';
10668
+
10669
+ this.touched = false;
10670
+ this.util = new AuroInputUtilities$3({
10671
+ locale: "en-US",
10672
+ format: this.format
10673
+ });
10674
+ this.validation = new AuroFormValidation$7();
10675
+ this.inputIconName = undefined;
10676
+ this.showPassword = false;
10677
+ this.validationCCLength = undefined;
10678
+ this.hasValue = false;
10679
+ this.label = 'Input label is undefined';
10680
+
10681
+
10628
10682
  this.allowedInputTypes = [
10629
10683
  "text",
10630
10684
  "number",
@@ -10633,8 +10687,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
10633
10687
  "credit-card",
10634
10688
  "tel"
10635
10689
  ];
10636
- this.appearance = "default";
10637
- /** @private */
10690
+ this.icon = false;
10638
10691
  this.dateFormatMap = {
10639
10692
  'mm/dd/yyyy': 'dateMMDDYYYY',
10640
10693
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -10651,57 +10704,27 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
10651
10704
  'dd/mm': 'dateDDMM',
10652
10705
  'mm/dd': 'dateMMDD'
10653
10706
  };
10654
- this.disabled = false;
10655
- /** @private */
10656
10707
  this.domHandler = new DomHandler$3();
10657
10708
  this.dvInputOnly = false;
10658
10709
  this.hasValue = false;
10659
- this.hideLabelVisually = false;
10660
- this.icon = false;
10661
- /** @private */
10662
10710
  this.inputIconName = undefined;
10663
- /** @private */
10664
10711
  this.label = 'Input label is undefined';
10665
- this.layout = 'classic';
10666
- this.locale = 'en-US';
10667
- this.max = undefined;
10668
- this._maxObject = undefined;
10669
- this.maxLength = undefined;
10670
- this.min = undefined;
10671
- this._minObject = undefined;
10672
- this.minLength = undefined;
10673
10712
  this.noValidate = false;
10674
- this.onDark = false;
10675
- // Raw values returned from the input mask before model normalization.
10676
- this._rawMaskValue = undefined;
10677
- this.required = false;
10678
- this.setCustomValidityForType = undefined;
10679
- // Credit Card is intentionally excluded — its mask manages the cursor
10680
- // itself, and listing it here caused cursor placement issues in Safari.
10681
- /** @private */
10713
+ this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
10682
10714
  this.setSelectionInputTypes = [
10683
10715
  "text",
10684
10716
  "password",
10685
10717
  "email"
10686
- ];
10687
- this.shape = 'classic';
10688
- /** @private */
10718
+ ]; // Credit Card is not included as this caused cursor placement issues in Safari.
10689
10719
  this.showPassword = false;
10690
- this.size = 'lg';
10691
10720
  this.touched = false;
10692
- /** @private */
10693
10721
  this.uniqueId = new UniqueId$2().create();
10694
- /** @private */
10695
10722
  this.util = new AuroInputUtilities$3({
10696
10723
  locale: this.locale,
10697
10724
  format: this.format
10698
10725
  });
10699
- /** @private */
10700
10726
  this.validation = new AuroFormValidation$7();
10701
- /** @private */
10702
10727
  this.validationCCLength = undefined;
10703
- this.value = undefined;
10704
- this._valueObject = undefined;
10705
10728
  }
10706
10729
 
10707
10730
  // function to define props used within the scope of this component
@@ -11249,15 +11272,6 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11249
11272
 
11250
11273
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
11251
11274
 
11252
- // Normalize the format token to lowercase so case-mixed values supplied
11253
- // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
11254
- // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
11255
- // format silently misses the map and leaves `setCustomValidityForType`
11256
- // unset.
11257
- if (this.format) {
11258
- this.format = this.format.toLowerCase();
11259
- }
11260
-
11261
11275
  // use validity message override if declared when initializing the component
11262
11276
  if (this.hasAttribute('setCustomValidity')) {
11263
11277
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -11691,38 +11705,6 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11691
11705
  this.touched = true;
11692
11706
  this.validation.validate(this);
11693
11707
  }
11694
-
11695
- // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
11696
- // update that can re-render the input and reset the native cursor; we
11697
- // capture the caret position before that update commits and restore it
11698
- // via `setSelectionRange` once the update has flushed. Gated on
11699
- // `setSelectionInputTypes` so credit-card (and other masked types whose
11700
- // formatter manages the cursor itself) doesn't get a competing write.
11701
- // Capture the caret position INSIDE the gate — reading `selectionStart`
11702
- // on input types that don't support text selection (number, email in
11703
- // some browsers) throws InvalidStateError, which would crash all input
11704
- // handling. Wrap the read in try/catch belt-and-suspenders even though
11705
- // the gated types currently support it, since the list is a public
11706
- // property a consumer could mutate.
11707
- if (this.setSelectionInputTypes.includes(this.type)) {
11708
- let selectionStart;
11709
- try {
11710
- selectionStart = this.inputElement.selectionStart;
11711
- } catch (error) { // eslint-disable-line no-unused-vars
11712
- return;
11713
- }
11714
- if (typeof selectionStart !== 'number') {
11715
- return;
11716
- }
11717
- this.updateComplete.then(() => {
11718
- try {
11719
- this.inputElement.setSelectionRange(selectionStart, selectionStart);
11720
- } catch (error) { // eslint-disable-line no-unused-vars
11721
- // Some input types (number/email in certain UAs) throw on
11722
- // setSelectionRange; swallow and let the native cursor stand.
11723
- }
11724
- });
11725
- }
11726
11708
  }
11727
11709
 
11728
11710
  /**
@@ -12349,7 +12331,7 @@ let AuroHelpText$8 = class AuroHelpText extends i$2 {
12349
12331
  }
12350
12332
  };
12351
12333
 
12352
- var formkitVersion$8 = '202606252337';
12334
+ var formkitVersion$8 = '202606291455';
12353
12335
 
12354
12336
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
12355
12337
  // See LICENSE in the project root for license information.
@@ -12852,7 +12834,6 @@ let AuroInput$2 = class AuroInput extends BaseInput$2 {
12852
12834
  <${this.buttonTag}
12853
12835
  @click="${this.handleClickShowPassword}"
12854
12836
  appearance="${this.onDark ? 'inverse' : this.appearance}"
12855
- aria-pressed="${this.showPassword ? 'true' : 'false'}"
12856
12837
  class="notificationBtn passwordBtn"
12857
12838
  shape="circle"
12858
12839
  size="sm"
@@ -12926,29 +12907,25 @@ let AuroInput$2 = class AuroInput extends BaseInput$2 {
12926
12907
  * @returns {html} - Returns HTML for the help text and error message.
12927
12908
  */
12928
12909
  renderHtmlHelpText() {
12929
- // Single `<p>` with stable identity across validity transitions —
12930
- // previously two distinct templates (valid vs invalid) caused Lit to
12931
- // replace the node entirely on a flip, and VoiceOver wouldn't
12932
- // re-announce because the live-region element it was watching had been
12933
- // removed and a new one inserted. Keeping one node means the `role`,
12934
- // `aria-live`, and text content all change in-place, which AT does
12935
- // observe and announce.
12936
- const isError = this.validity && this.validity !== 'valid';
12937
12910
  return u$d`
12938
- <${this.helpTextTag}
12939
- appearance="${this.onDark ? 'inverse' : this.appearance}"
12940
- ?error=${isError}>
12941
- <p
12942
- id="${this.uniqueId}"
12943
- part="helpText"
12944
- role="${o$4(isError ? 'alert' : undefined)}"
12945
- aria-live="${o$4(isError ? 'assertive' : undefined)}">
12946
- ${isError
12947
- ? this.errorMessage
12948
- : u$d`<slot name="helpText">${this.getHelpText()}</slot>`
12949
- }
12950
- </p>
12951
- </${this.helpTextTag}>
12911
+ ${!this.validity || this.validity === undefined || this.validity === 'valid'
12912
+ ? u$d`
12913
+ <${this.helpTextTag}
12914
+ appearance="${this.onDark ? 'inverse' : this.appearance}">
12915
+ <p id="${this.uniqueId}" part="helpText">
12916
+ <slot name="helpText">${this.getHelpText()}</slot>
12917
+ </p>
12918
+ </${this.helpTextTag}>
12919
+ `
12920
+ : u$d`
12921
+ <${this.helpTextTag} error
12922
+ appearance="${this.onDark ? 'inverse' : this.appearance}">
12923
+ <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
12924
+ ${this.errorMessage}
12925
+ </p>
12926
+ </${this.helpTextTag}>
12927
+ `
12928
+ }
12952
12929
  `;
12953
12930
  }
12954
12931
 
@@ -14438,7 +14415,7 @@ function normalizeDates$1(context, ...dates) {
14438
14415
  * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))
14439
14416
  * //=> Tue Sep 02 2014 00:00:00
14440
14417
  */
14441
- function startOfDay$2(date, options) {
14418
+ function startOfDay$1(date, options) {
14442
14419
  const _date = toDate$1(date, options?.in);
14443
14420
  _date.setHours(0, 0, 0, 0);
14444
14421
  return _date;
@@ -14486,8 +14463,8 @@ function differenceInCalendarDays$1(laterDate, earlierDate, options) {
14486
14463
  earlierDate,
14487
14464
  );
14488
14465
 
14489
- const laterStartOfDay = startOfDay$2(laterDate_);
14490
- const earlierStartOfDay = startOfDay$2(earlierDate_);
14466
+ const laterStartOfDay = startOfDay$1(laterDate_);
14467
+ const earlierStartOfDay = startOfDay$1(earlierDate_);
14491
14468
 
14492
14469
  const laterTimestamp =
14493
14470
  +laterStartOfDay - getTimezoneOffsetInMilliseconds$1(laterStartOfDay);
@@ -23589,13 +23566,6 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
23589
23566
  * @returns {string | undefined}
23590
23567
  */
23591
23568
  toFormattedValue(valueObject, format) {
23592
- // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
23593
- // `format` argument has to fail gracefully rather than throw on
23594
- // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
23595
- // as "no format → no display value".
23596
- if (!format) {
23597
- return undefined;
23598
- }
23599
23569
  const normalizedFormat = format.toLowerCase();
23600
23570
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
23601
23571
 
@@ -23951,8 +23921,8 @@ class RangeDatepickerCell extends i$2 {
23951
23921
  const parsedDateFrom = parseInt(dateFrom, 10);
23952
23922
  const parsedDateTo = parseInt(dateTo, 10);
23953
23923
  if (day) {
23954
- if (getTime(startOfDay$2(parsedDateTo * 1000)) / 1000 === day.date ||
23955
- getTime(startOfDay$2(parsedDateFrom * 1000)) / 1000 === day.date) {
23924
+ if (getTime(startOfDay$1(parsedDateTo * 1000)) / 1000 === day.date ||
23925
+ getTime(startOfDay$1(parsedDateFrom * 1000)) / 1000 === day.date) {
23956
23926
  this.selected = true;
23957
23927
  }
23958
23928
  if (((hoveredDate === day.date || day.date < hoveredDate) &&
@@ -24140,7 +24110,7 @@ class RangeDatepickerCalendar extends i$2 {
24140
24110
  this.dayNamesOfTheWeek = [];
24141
24111
  this.daysOfMonth = [];
24142
24112
  this._locale = null;
24143
- this.currentDate = parseInt(format$1(startOfDay$2(Date.now()), 't'), 10);
24113
+ this.currentDate = parseInt(format$1(startOfDay$1(Date.now()), 't'), 10);
24144
24114
  this.localeChanged();
24145
24115
  this.yearAndMonthChanged(this.year, this.month);
24146
24116
  }
@@ -24614,7 +24584,7 @@ __decorate([n$4({ type: Array })], RangeDatepickerCalendar.prototype, "dayNamesO
24614
24584
  __decorate([n$4({ type: Array })], RangeDatepickerCalendar.prototype, "daysOfMonth", void 0);
24615
24585
  AuroLibraryRuntimeUtils$5$1.prototype.registerComponent('wc-range-datepicker-calendar', RangeDatepickerCalendar);
24616
24586
 
24617
- 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}`;
24587
+ 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}`;
24618
24588
 
24619
24589
  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}`;
24620
24590
 
@@ -24639,13 +24609,103 @@ class s{registerComponent(e,t){customElements.get(e)||customElements.define(e,cl
24639
24609
 
24640
24610
  var popoverVersion = '6.0.1';
24641
24611
 
24642
- /* 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 */
24612
+ /**
24613
+ * Single source of truth for parsing and matching blackout dates across the
24614
+ * datepicker. Both `auro-calendar` (memoized Set + `isDateBlackout`) and the
24615
+ * pre-`firstUpdated` fallback inside `auro-calendar-cell` route through these
24616
+ * helpers so the YYYY-MM-DD → seconds conversion and the merge-with-legacy
24617
+ * `disabledDays` rules are defined exactly once.
24618
+ */
24643
24619
 
24644
- const startOfDay$1 = (ms) => {
24645
- const date = new Date(ms);
24646
- date.setHours(0, 0, 0, 0);
24647
- return date.getTime();
24648
- };
24620
+ /**
24621
+ * Converts a `YYYY-MM-DD` ISO date string to a Unix timestamp (seconds)
24622
+ * representing local midnight on that calendar day. Returns `null` for
24623
+ * inputs that don't parse to a finite timestamp.
24624
+ *
24625
+ * Uses the `new Date(year, monthIndex, day)` constructor (NOT
24626
+ * `new Date(isoStr)`) so the result is local-midnight rather than UTC
24627
+ * midnight — required to keep the calendar grid aligned with the user's
24628
+ * local calendar day in negative-offset timezones.
24629
+ *
24630
+ * @param {string} isoStr - Date string in `YYYY-MM-DD` format.
24631
+ * @returns {number|null} Local-midnight Unix timestamp (seconds), or null.
24632
+ */
24633
+ function parseIsoToTimestamp(isoStr) {
24634
+ if (typeof isoStr !== 'string') {
24635
+ return null;
24636
+ }
24637
+ const parts = isoStr.split('-');
24638
+ if (parts.length !== 3) {
24639
+ return null;
24640
+ }
24641
+ const year = parseInt(parts[0], 10);
24642
+ const month = parseInt(parts[1], 10);
24643
+ const day = parseInt(parts[2], 10);
24644
+ if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) {
24645
+ return null;
24646
+ }
24647
+ // Reject overflow values like "2024-13-40" — JS `new Date(year, month, day)`
24648
+ // silently normalizes those to a different calendar day, which would
24649
+ // disable the wrong date if we let the result through.
24650
+ if (month < 1 || month > 12 || day < 1 || day > 31) {
24651
+ return null;
24652
+ }
24653
+ const date = new Date(year, month - 1, day);
24654
+ // Guard the residual case where JS still rolls a value (e.g. Feb 30 → Mar 2).
24655
+ // After construction, getFullYear/getMonth/getDate should match the inputs.
24656
+ if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) {
24657
+ return null;
24658
+ }
24659
+ const ts = Math.floor(date.getTime() / 1000);
24660
+ return Number.isFinite(ts) ? ts : null;
24661
+ }
24662
+
24663
+ /**
24664
+ * Builds a `Set<number>` of seconds-since-epoch timestamps covering both the
24665
+ * legacy `disabledDays` (already-numeric) array and the ISO `blackoutDates`
24666
+ * array. Use this for O(1) membership checks in hot paths.
24667
+ *
24668
+ * @param {Array<string|number>|undefined} disabledDays - Legacy timestamp array.
24669
+ * @param {Array<string>|undefined} blackoutDates - ISO `YYYY-MM-DD` array.
24670
+ * @returns {Set<number>}
24671
+ */
24672
+ function buildBlackoutSet(disabledDays, blackoutDates) {
24673
+ const set = new Set();
24674
+ if (Array.isArray(disabledDays)) {
24675
+ for (const day of disabledDays) {
24676
+ const ts = parseInt(day, 10);
24677
+ if (Number.isFinite(ts)) {
24678
+ set.add(ts);
24679
+ }
24680
+ }
24681
+ }
24682
+ if (Array.isArray(blackoutDates)) {
24683
+ for (const isoStr of blackoutDates) {
24684
+ const ts = parseIsoToTimestamp(isoStr);
24685
+ if (ts !== null) {
24686
+ set.add(ts);
24687
+ }
24688
+ }
24689
+ }
24690
+ return set;
24691
+ }
24692
+
24693
+ /**
24694
+ * One-shot membership test for a single timestamp against both blackout
24695
+ * sources. Allocates a Set on each call; only use this in cold paths
24696
+ * (e.g. the pre-`firstUpdated` cell fallback). Hot paths should hold the
24697
+ * Set returned from `buildBlackoutSet` and `.has(ts)` directly.
24698
+ *
24699
+ * @param {number} dateTs - Unix timestamp (seconds) to test.
24700
+ * @param {Array<string|number>|undefined} disabledDays - Legacy timestamp array.
24701
+ * @param {Array<string>|undefined} blackoutDates - ISO `YYYY-MM-DD` array.
24702
+ * @returns {boolean}
24703
+ */
24704
+ function isBlackoutTimestamp(dateTs, disabledDays, blackoutDates) {
24705
+ return buildBlackoutSet(disabledDays, blackoutDates).has(dateTs);
24706
+ }
24707
+
24708
+ /* 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 */
24649
24709
 
24650
24710
  class AuroCalendarCell extends i$2 {
24651
24711
  constructor() {
@@ -24693,6 +24753,14 @@ class AuroCalendarCell extends i$2 {
24693
24753
  type: Boolean,
24694
24754
  reflect: true
24695
24755
  },
24756
+ /**
24757
+ * @deprecated Propagated from the legacy `auro-calendar.disabledDays`
24758
+ * Unix-timestamp array. The cell honors it for backward compatibility
24759
+ * (see the divergence-check fallback inside `isBlackout`), but
24760
+ * consumers should migrate to `auro-datepicker.blackoutDates`
24761
+ * (YYYY-MM-DD ISO strings). The calendar emits a one-time
24762
+ * deprecation warning the first time a non-empty value is observed.
24763
+ */
24696
24764
  disabledDays: { type: Array },
24697
24765
  isCurrentDate: { type: Boolean },
24698
24766
  locale: { type: String },
@@ -24738,8 +24806,8 @@ class AuroCalendarCell extends i$2 {
24738
24806
  const parsedDateTo = parseInt(dateTo, 10);
24739
24807
 
24740
24808
  if (day) {
24741
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
24742
- const returnTimestamp = startOfDay$1(parsedDateTo * 1000) / 1000;
24809
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
24810
+ const returnTimestamp = new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000;
24743
24811
 
24744
24812
  if (day.date === departTimestamp || day.date === returnTimestamp) {
24745
24813
  this.selected = true;
@@ -24823,27 +24891,33 @@ class AuroCalendarCell extends i$2 {
24823
24891
  return false;
24824
24892
  }
24825
24893
 
24826
- // Check against disabledDays timestamps (legacy path)
24827
- if (Array.isArray(this.disabledDays) && this.disabledDays.length > 0 &&
24828
- (this.disabledDays.findIndex(dd => parseInt(dd, 10) === this.day.date) !== -1)) {
24829
- return true;
24830
- }
24831
-
24832
- // Check against blackoutDates (ISO format YYYY-MM-DD) on the datepicker
24833
- const blackoutDates = this.datepicker?.blackoutDates;
24834
-
24835
- if (Array.isArray(blackoutDates) && blackoutDates.length > 0) {
24836
- const date = new Date(this.day.date * 1000);
24837
- const yyyy = date.getFullYear();
24838
- const mm = String(date.getMonth() + 1).padStart(2, '0');
24839
- const dd = String(date.getDate()).padStart(2, '0');
24840
- const cellDate = `${yyyy}-${mm}-${dd}`;
24841
- if (blackoutDates.includes(cellDate)) {
24894
+ // Delegate to the calendar's memoized blackout Set for O(1) lookup
24895
+ // (instead of rescanning disabledDays + blackoutDates per render). The
24896
+ // Set is rebuilt only when either source array reference changes — see
24897
+ // auro-calendar.js#_getBlackoutSet.
24898
+ if (this.calendar && typeof this.calendar._getBlackoutSet === 'function') {
24899
+ if (this.calendar._getBlackoutSet().has(this.day.date)) {
24842
24900
  return true;
24843
24901
  }
24902
+ // If the cell's local disabledDays diverged from the calendar's (a
24903
+ // consumer or test mutated cell.disabledDays directly), the Set does
24904
+ // not reflect that addition — fall through to the per-cell scan only
24905
+ // when the reference no longer matches. Production data flow keeps
24906
+ // these identical, so this branch stays cold. Guarded with
24907
+ // Array.isArray to match `_getBlackoutSet`'s contract: non-array
24908
+ // values are treated as empty rather than crashing on `.findIndex`.
24909
+ if (Array.isArray(this.disabledDays) && this.disabledDays !== this.calendar.disabledDays && this.disabledDays.length > 0) {
24910
+ if (this.disabledDays.findIndex((dd) => parseInt(dd, 10) === this.day.date) !== -1) {
24911
+ return true;
24912
+ }
24913
+ }
24914
+ return false;
24844
24915
  }
24845
24916
 
24846
- return false;
24917
+ // Pre-firstUpdated fallback — the cell may render once before the
24918
+ // ancestor calendar is wired up. Routes through the shared
24919
+ // blackoutUtils helper so the parsing rules stay in one place.
24920
+ return isBlackoutTimestamp(this.day.date, this.disabledDays, this.datepicker?.blackoutDates);
24847
24921
  }
24848
24922
 
24849
24923
  /**
@@ -24949,12 +25023,12 @@ class AuroCalendarCell extends i$2 {
24949
25023
  const parsedDateFrom = Number.parseInt(this.dateFrom, 10);
24950
25024
  if (!Number.isFinite(parsedDateFrom)) return null;
24951
25025
 
24952
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
25026
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
24953
25027
  const dayDate = this.day.date;
24954
25028
 
24955
25029
  const parsedDateTo = Number.parseInt(this.dateTo, 10);
24956
25030
  const hasDateTo = Number.isFinite(parsedDateTo);
24957
- const returnTimestamp = hasDateTo ? startOfDay$1(parsedDateTo * 1000) / 1000 : null;
25031
+ const returnTimestamp = hasDateTo ? new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000 : null;
24958
25032
 
24959
25033
  if (dayDate === departTimestamp) return this.datepicker.rangeLabelStart || 'range start';
24960
25034
 
@@ -24964,7 +25038,9 @@ class AuroCalendarCell extends i$2 {
24964
25038
 
24965
25039
  if (hasDateTo && dayDate > departTimestamp && dayDate < returnTimestamp) return this.datepicker.rangeLabelInRange || 'in range';
24966
25040
 
24967
- // After start date, no end date yet, or after end date
25041
+ if (!hasDateTo && dayDate > departTimestamp) return this.datepicker.rangeLabelEndPreview || 'previewing range end';
25042
+
25043
+ // After end date when both dateFrom and dateTo are set.
24968
25044
  return this.datepicker.rangeLabelAfterRange || 'after range';
24969
25045
  }
24970
25046
 
@@ -24977,7 +25053,7 @@ class AuroCalendarCell extends i$2 {
24977
25053
  */
24978
25054
  isDepartDate(day, dateFrom) {
24979
25055
  const parsedDateFrom = parseInt(dateFrom, 10);
24980
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
25056
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
24981
25057
 
24982
25058
  return this.selected && day.date === departTimestamp;
24983
25059
  }
@@ -24992,7 +25068,7 @@ class AuroCalendarCell extends i$2 {
24992
25068
  */
24993
25069
  isReturnDate(day, dateFrom, dateTo) {
24994
25070
  const parsedDateTo = parseInt(dateTo, 10);
24995
- const returnTimestamp = startOfDay$1(parsedDateTo * 1000) / 1000;
25071
+ const returnTimestamp = new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000;
24996
25072
 
24997
25073
  return this.selected && day.date === returnTimestamp && dateFrom;
24998
25074
  }
@@ -25156,6 +25232,7 @@ class AuroCalendarCell extends i$2 {
25156
25232
  setTimeout(() => this.firstUpdated(), 0);
25157
25233
  return;
25158
25234
  }
25235
+ this.calendar = calendar;
25159
25236
  this.datepicker = calendar.datepicker;
25160
25237
  this._slotContentHandler = () => {
25161
25238
  this.handleSlotContent();
@@ -25213,12 +25290,13 @@ class AuroCalendarCell extends i$2 {
25213
25290
  this._cachedButton = this.shadowRoot.querySelector('button.day');
25214
25291
  });
25215
25292
 
25216
- // Update host-level aria attributes for ariaActiveDescendantElement.
25293
+ // Keep the host's gridcell aria attributes in sync with the day data.
25217
25294
  this.updateHostAria();
25218
25295
  }
25219
25296
 
25220
25297
  // Update host aria when selection changes (aria-selected, range labels)
25221
- if (properties.has('dateFrom') || properties.has('dateTo') || properties.has('selected')) {
25298
+ // or when isCurrentDate flips (aria-current).
25299
+ if (properties.has('dateFrom') || properties.has('dateTo') || properties.has('selected') || properties.has('isCurrentDate')) {
25222
25300
  this.updateHostAria();
25223
25301
  }
25224
25302
 
@@ -25229,8 +25307,8 @@ class AuroCalendarCell extends i$2 {
25229
25307
  }
25230
25308
 
25231
25309
  /**
25232
- * Updates ARIA attributes on the host element so that
25233
- * ariaActiveDescendantElement can expose cell info to the SR.
25310
+ * Sets host-level ARIA so each cell exposes its date, selection state,
25311
+ * and blackout status to assistive tech browsing the month grid.
25234
25312
  * @private
25235
25313
  * @returns {void}
25236
25314
  */
@@ -25239,16 +25317,27 @@ class AuroCalendarCell extends i$2 {
25239
25317
 
25240
25318
  const outOfRange = this.isOutOfRange(this.day, this.min, this.max);
25241
25319
  if (outOfRange) {
25320
+ // Strip every aria attribute the in-range branch may have set on a
25321
+ // previous render — if a cell flips from in-range to out-of-range
25322
+ // (calendar shifts months, minDate/maxDate change, etc.).
25242
25323
  this.removeAttribute('role');
25243
25324
  this.removeAttribute('aria-label');
25325
+ this.removeAttribute('aria-current');
25326
+ this.removeAttribute('aria-selected');
25327
+ this.removeAttribute('aria-disabled');
25244
25328
  return;
25245
25329
  }
25246
25330
 
25247
- // The host acts as the gridcell for ariaActiveDescendantElement.
25248
25331
  this.setAttribute('role', 'gridcell');
25249
25332
  this.setAttribute('aria-label', this.getAriaLabel());
25250
25333
  this.setAttribute('aria-selected', this.selected ? 'true' : 'false');
25251
25334
 
25335
+ if (this.isCurrentDate) {
25336
+ this.setAttribute('aria-current', 'date');
25337
+ } else {
25338
+ this.removeAttribute('aria-current');
25339
+ }
25340
+
25252
25341
  if (this.isBlackout()) {
25253
25342
  this.setAttribute('aria-disabled', 'true');
25254
25343
  } else {
@@ -25263,7 +25352,7 @@ class AuroCalendarCell extends i$2 {
25263
25352
  * @returns {void}
25264
25353
  */
25265
25354
  focusButton() {
25266
- const button = this._cachedButton || this.shadowRoot.querySelector('button:not([aria-hidden])');
25355
+ const button = this._cachedButton || this.shadowRoot.querySelector('button:not([disabled])');
25267
25356
  if (button) {
25268
25357
  button.focus({ focusVisible: true });
25269
25358
  }
@@ -25271,7 +25360,9 @@ class AuroCalendarCell extends i$2 {
25271
25360
 
25272
25361
  /**
25273
25362
  * Imperatively marks this cell as active without triggering a Lit re-render.
25274
- * Note: buttons stay tabindex="-1" because the grid uses aria-activedescendant.
25363
+ * Buttons stay tabindex="-1" because DOM focus stays on the grid wrapper
25364
+ * arrow keys move the active cell imperatively and the live region carries
25365
+ * the SR announcement.
25275
25366
  * @returns {void}
25276
25367
  */
25277
25368
  setActive() {
@@ -25313,10 +25404,13 @@ class AuroCalendarCell extends i$2 {
25313
25404
  if (!btn || !this.day) return;
25314
25405
 
25315
25406
  const dayDate = this.day.date;
25316
- const departTimestamp = startOfDay$1(dateFrom * 1000) / 1000;
25407
+ const departTimestamp = new Date(dateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
25317
25408
  const isInRange = dayDate > departTimestamp && dayDate < hoveredDate;
25318
- const isLastHovered = dayDate === hoveredDate && hoveredDate > departTimestamp;
25319
- const isDepartWithPreview = dayDate === departTimestamp && hoveredDate > departTimestamp;
25409
+ // `>=` so hovering the depart cell itself (a same-day round-trip
25410
+ // preview) still surfaces a visual cue: the depart cell receives both
25411
+ // rangeDepartDate and lastHoveredDate.
25412
+ const isLastHovered = dayDate === hoveredDate && hoveredDate >= departTimestamp;
25413
+ const isDepartWithPreview = dayDate === departTimestamp && hoveredDate >= departTimestamp;
25320
25414
 
25321
25415
  btn.classList.toggle('inRange', isInRange);
25322
25416
  btn.classList.toggle('lastHoveredDate', isLastHovered);
@@ -25374,7 +25468,6 @@ class AuroCalendarCell extends i$2 {
25374
25468
  @focus="${outOfRange ? undefined : this.handleFocus}"
25375
25469
  class="${e$2(buttonClasses)}"
25376
25470
  ?disabled="${outOfRange}"
25377
- aria-hidden="${outOfRange ? 'true' : A$7}"
25378
25471
  tabindex="-1">
25379
25472
  <div class="buttonWrapper" aria-hidden="true">
25380
25473
  <div class="currentDayMarker">${this.day?.title || A$7}</div>
@@ -26480,7 +26573,7 @@ let AuroBibtemplate$3 = class AuroBibtemplate extends i$2 {
26480
26573
  }
26481
26574
  };
26482
26575
 
26483
- var formkitVersion$2$1 = '202606252337';
26576
+ var formkitVersion$2$1 = '202606291455';
26484
26577
 
26485
26578
  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}
26486
26579
  `,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}}
@@ -26603,7 +26696,11 @@ class AuroCalendar extends RangeDatepicker {
26603
26696
  this.calendarRangeMonths = null;
26604
26697
 
26605
26698
  /**
26606
- * Legacy array of disabled-date timestamps.
26699
+ * @deprecated Use `auro-datepicker.blackoutDates` (an array of
26700
+ * `YYYY-MM-DD` ISO strings) instead. This legacy array of Unix
26701
+ * timestamps is still honored for backward compatibility but emits a
26702
+ * one-time `console.debug` the first time a non-empty value is observed.
26703
+ * Support will be removed in a future major release.
26607
26704
  * @private
26608
26705
  */
26609
26706
  this.disabledDays = [];
@@ -26860,17 +26957,44 @@ class AuroCalendar extends RangeDatepicker {
26860
26957
  * @returns {void}
26861
26958
  */
26862
26959
  updateActiveCellForVisibleMonth() {
26863
- // Use double-rAF to ensure child month/cell components have fully
26864
- // rendered and cached their button references before we set tabindex.
26865
- requestAnimationFrame(() => {
26866
- requestAnimationFrame(() => {
26867
- const newDate = this.computeActiveDate({ skipDateFrom: true });
26960
+ this._afterMonthRender(() => {
26961
+ const newDate = this.computeActiveDate({ skipDateFrom: true });
26868
26962
 
26869
- if (newDate !== null && newDate !== undefined) {
26870
- this.activeCellDate = newDate;
26871
- this.setActiveCell(this.activeCellDate);
26872
- }
26873
- });
26963
+ if (newDate !== null && newDate !== undefined) {
26964
+ this.activeCellDate = newDate;
26965
+ this.setActiveCell(this.activeCellDate);
26966
+ }
26967
+ });
26968
+ }
26969
+
26970
+ /**
26971
+ * Schedules `callback` two animation frames out, giving the child
26972
+ * `auro-formkit-calendar-month` and `auro-formkit-calendar-cell` elements
26973
+ * a full render-and-paint cycle to settle before the callback reads or
26974
+ * mutates DOM.
26975
+ *
26976
+ * Why two frames, not one:
26977
+ * 1. Lit batches property updates and renders in a microtask, so frame N
26978
+ * schedules the render but the new DOM may not be painted yet.
26979
+ * 2. Cells re-cache `_cachedButton` inside their own `updateComplete.then`,
26980
+ * which also lands a tick later. Reading buttons from frame N+1
26981
+ * (after both renders + cache refresh have flushed) reliably hits the
26982
+ * new month's cells.
26983
+ *
26984
+ * Used by every code path that calls `handleNextMonth`/`handlePrevMonth`
26985
+ * and then needs to inspect the freshly-rendered cells (cross-month
26986
+ * keyboard nav, boundary events, `updateActiveCellForVisibleMonth`).
26987
+ * Do NOT collapse to a single rAF — it intermittently lands before
26988
+ * `_cachedButton` is refreshed, which silently breaks focus restoration
26989
+ * and `setActiveCell` lookups.
26990
+ * @private
26991
+ * @param {() => void} callback - Runs once after the month re-render and
26992
+ * the cells' button caches have refreshed.
26993
+ * @returns {void}
26994
+ */
26995
+ _afterMonthRender(callback) {
26996
+ requestAnimationFrame(() => {
26997
+ requestAnimationFrame(callback);
26874
26998
  });
26875
26999
  }
26876
27000
 
@@ -26988,6 +27112,47 @@ class AuroCalendar extends RangeDatepicker {
26988
27112
  return Array.from(this.shadowRoot.querySelectorAll('auro-formkit-calendar-month'));
26989
27113
  }
26990
27114
 
27115
+ /**
27116
+ * Picks the focusable cell whose date is closest to targetTs. Used as a
27117
+ * fallback after a month-boundary nav when the exact target date isn't
27118
+ * focusable — typically because the month re-render lagged or the date
27119
+ * was filtered out by isOutOfRange. When two cells are equidistant, the
27120
+ * navigation direction breaks the tie so the user moves the way they
27121
+ * pressed (forward → later cell, backward → earlier cell).
27122
+ * @private
27123
+ * @param {Array} cells - Focusable cells from getAllFocusableCells.
27124
+ * @param {Number} targetTs - Desired Unix timestamp (seconds).
27125
+ * @param {'next'|'prev'} direction - Navigation direction.
27126
+ * @returns {Object|null} The nearest cell, or null when cells is empty.
27127
+ */
27128
+ pickNearestCell(cells, targetTs, direction) {
27129
+ if (!cells.length) {
27130
+ return null;
27131
+ }
27132
+ const forward = direction === 'next';
27133
+ let best = null;
27134
+ let bestDelta = Infinity;
27135
+ cells.forEach((cell) => {
27136
+ if (!cell.day) {
27137
+ return;
27138
+ }
27139
+ const distance = Math.abs(cell.day.date - targetTs);
27140
+ if (distance < bestDelta) {
27141
+ best = cell;
27142
+ bestDelta = distance;
27143
+ return;
27144
+ }
27145
+ if (distance === bestDelta && best) {
27146
+ if (forward && cell.day.date > best.day.date) {
27147
+ best = cell;
27148
+ } else if (!forward && cell.day.date < best.day.date) {
27149
+ best = cell;
27150
+ }
27151
+ }
27152
+ });
27153
+ return best;
27154
+ }
27155
+
26991
27156
  /**
26992
27157
  * Gets all focusable cells across all rendered months.
26993
27158
  * @private
@@ -27004,9 +27169,9 @@ class AuroCalendar extends RangeDatepicker {
27004
27169
 
27005
27170
  /**
27006
27171
  * Sets the active cell across all months. Only one cell has tabindex="0" at a time.
27007
- * Uses imperative DOM manipulation — no Lit re-render triggered.
27008
- * Also updates ariaActiveDescendantElement on the grid wrapper so
27009
- * screen readers announce the active cell without moving DOM focus.
27172
+ * Uses imperative DOM manipulation — no Lit re-render triggered. DOM focus
27173
+ * stays on the grid wrapper; the live region (see getOrCreateLiveRegion)
27174
+ * is what announces the active cell to assistive tech.
27010
27175
  * @param {Number} date - Unix timestamp of the cell to activate.
27011
27176
  * @returns {void}
27012
27177
  */
@@ -27055,10 +27220,23 @@ class AuroCalendar extends RangeDatepicker {
27055
27220
  /**
27056
27221
  * Shows the activeCell ring when the grid gains focus.
27057
27222
  * @private
27223
+ * @param {FocusEvent} [event] - The focusin event.
27058
27224
  * @returns {void}
27059
27225
  */
27060
- handleGridFocusIn() {
27226
+ handleGridFocusIn(event) {
27061
27227
  this._gridHasFocus = true;
27228
+
27229
+ // Only apply the activeCell ring when the grid wrapper itself receives focus
27230
+ // (Tab/programmatic). When focus moves into a cell button via mousedown,
27231
+ // event.target is the cell descendant — skip the ring here. The subsequent
27232
+ // click handler calls setActiveCell on the clicked cell, which applies the
27233
+ // ring there. Without this guard, mousedown briefly flashes the ring on the
27234
+ // previously-active cell (e.g. the 1st-of-month set by month navigation
27235
+ // when the grid was not focused).
27236
+ if (event && event.target !== event.currentTarget) {
27237
+ return;
27238
+ }
27239
+
27062
27240
  const activeCell = this.getAllFocusableCells().find((cell) => cell.active);
27063
27241
  if (activeCell) {
27064
27242
  const btn = activeCell._cachedButton || activeCell.shadowRoot.querySelector('button.day');
@@ -27087,6 +27265,65 @@ class AuroCalendar extends RangeDatepicker {
27087
27265
  this.clearRangePreview();
27088
27266
  }
27089
27267
 
27268
+ /**
27269
+ * Returns a memoized Set of blackout timestamps (seconds) drawn from both
27270
+ * the legacy `disabledDays` array and the datepicker's ISO `blackoutDates`.
27271
+ * The cache invalidates when either source array's reference changes, which
27272
+ * matches Lit's own reactive identity semantics for array properties.
27273
+ * @private
27274
+ * @returns {Set<Number>}
27275
+ */
27276
+ _getBlackoutSet() {
27277
+ // Normalize non-array values to a stable `null` sentinel rather than a
27278
+ // fresh `[]` per call — otherwise the reference-identity cache key
27279
+ // (`_cachedBlackoutDisabledDays === disabledDays`) never matches on
27280
+ // subsequent calls and the Set rebuilds every time. `buildBlackoutSet`
27281
+ // already treats null/non-array as "no legacy disabledDays" via its
27282
+ // own Array.isArray gate.
27283
+ const disabledDays = Array.isArray(this.disabledDays) ? this.disabledDays : null;
27284
+ const blackoutDates = this.datepicker?.blackoutDates;
27285
+ if (this._blackoutSet &&
27286
+ this._cachedBlackoutDisabledDays === disabledDays &&
27287
+ this._cachedBlackoutDates === blackoutDates) {
27288
+ return this._blackoutSet;
27289
+ }
27290
+
27291
+ if (disabledDays && disabledDays.length > 0) {
27292
+ this._warnDisabledDaysDeprecated();
27293
+ }
27294
+
27295
+ this._blackoutSet = buildBlackoutSet(disabledDays, blackoutDates);
27296
+ this._cachedBlackoutDisabledDays = disabledDays;
27297
+ this._cachedBlackoutDates = blackoutDates;
27298
+ return this._blackoutSet;
27299
+ }
27300
+
27301
+ /**
27302
+ * Per-class flag that gates the `disabledDays` deprecation warning so it
27303
+ * fires exactly once per page no matter how many calendars or rebuild
27304
+ * cycles encounter the legacy array.
27305
+ * @private
27306
+ */
27307
+ static _warnedDisabledDaysDeprecation = false;
27308
+
27309
+ /**
27310
+ * One-time `console.debug` directing consumers from the legacy
27311
+ * `disabledDays` Unix-timestamp API to the ISO `blackoutDates` API. Fires
27312
+ * the first time `_getBlackoutSet` rebuilds from a non-empty
27313
+ * `disabledDays`; subsequent calls (on this or any other AuroCalendar
27314
+ * instance on the page) are silent.
27315
+ * @private
27316
+ * @returns {void}
27317
+ */
27318
+ _warnDisabledDaysDeprecated() {
27319
+ if (AuroCalendar._warnedDisabledDaysDeprecation) {
27320
+ return;
27321
+ }
27322
+ AuroCalendar._warnedDisabledDaysDeprecation = true;
27323
+ // eslint-disable-next-line no-console
27324
+ 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.');
27325
+ }
27326
+
27090
27327
  /**
27091
27328
  * Computes the initial active date from data properties alone — no DOM required.
27092
27329
  * Priority:
@@ -27131,21 +27368,10 @@ class AuroCalendar extends RangeDatepicker {
27131
27368
  const minTs = Number.isFinite(rawMin) ? rawMin : -Infinity;
27132
27369
  const maxTs = Number.isFinite(rawMax) ? rawMax : Infinity;
27133
27370
 
27134
- // Build a Set of blackout timestamps for O(1) lookup.
27135
- const blackoutSet = new Set(this.disabledDays.map((day) => parseInt(day, 10)));
27136
-
27137
- // Also include ISO-format blackoutDates from the datepicker if available.
27138
- // Parse YYYY-MM-DD as local date to avoid UTC shift issues.
27139
- const isoBlackouts = this.datepicker?.blackoutDates;
27140
- if (Array.isArray(isoBlackouts)) {
27141
- for (const isoStr of isoBlackouts) {
27142
- const parts = isoStr.split('-');
27143
- const ts = Math.floor(new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10)).getTime() / 1000);
27144
- if (Number.isFinite(ts)) {
27145
- blackoutSet.add(ts);
27146
- }
27147
- }
27148
- }
27371
+ // Build a Set of blackout timestamps for O(1) lookup. Memoized by the
27372
+ // identity of the source arrays so rapid month nav doesn't rebuild the
27373
+ // Set (and re-parse every ISO string) on every keypress.
27374
+ const blackoutSet = this._getBlackoutSet();
27149
27375
 
27150
27376
  /**
27151
27377
  * A date (unix timestamp in seconds, midnight-aligned) is "enabled" when
@@ -27341,8 +27567,8 @@ class AuroCalendar extends RangeDatepicker {
27341
27567
 
27342
27568
  /**
27343
27569
  * Handles arrow key navigation on the calendar grid wrapper.
27344
- * Focus stays on the grid wrapper; only ariaActiveDescendantElement
27345
- * and the visual active-cell indicator change.
27570
+ * Focus stays on the grid wrapper; only the visual active-cell indicator
27571
+ * changes. The live region announces the new active cell.
27346
27572
  * @private
27347
27573
  * @param {KeyboardEvent} event - The keyboard event.
27348
27574
  * @returns {void}
@@ -27407,21 +27633,21 @@ class AuroCalendar extends RangeDatepicker {
27407
27633
  } else {
27408
27634
  this.handlePrevMonth({ skipActiveUpdate: true });
27409
27635
  }
27410
- requestAnimationFrame(() => {
27411
- requestAnimationFrame(() => {
27412
- const cells = this.getAllFocusableCells();
27413
- const target = cells.find((cell) => cell.day && cell.day.date === targetTs);
27414
- if (target) {
27415
- this.setActiveCell(target.day.date);
27416
- this.handleCellFocused({ detail: { date: target.day.date } });
27417
- } else if (cells.length > 0) {
27418
- const fallback = navDir === 'next' ? cells[cells.length - 1] : cells[0];
27636
+ this._afterMonthRender(() => {
27637
+ const cells = this.getAllFocusableCells();
27638
+ const target = cells.find((cell) => cell.day && cell.day.date === targetTs);
27639
+ if (target) {
27640
+ this.setActiveCell(target.day.date);
27641
+ this.handleCellFocused({ detail: { date: target.day.date } });
27642
+ } else {
27643
+ const fallback = this.pickNearestCell(cells, targetTs, navDir);
27644
+ if (fallback) {
27419
27645
  this.setActiveCell(fallback.day.date);
27420
27646
  this.handleCellFocused({ detail: { date: fallback.day.date } });
27421
27647
  }
27422
- // Re-focus grid wrapper after month change re-render
27423
- this.focusActiveCell();
27424
- });
27648
+ }
27649
+ // Re-focus grid wrapper after month change re-render
27650
+ this.focusActiveCell();
27425
27651
  });
27426
27652
  }
27427
27653
  }
@@ -27447,26 +27673,20 @@ class AuroCalendar extends RangeDatepicker {
27447
27673
  } else {
27448
27674
  this.handlePrevMonth({ skipActiveUpdate: true });
27449
27675
  }
27450
- requestAnimationFrame(() => {
27451
- requestAnimationFrame(() => {
27452
- const cells = this.getAllFocusableCells();
27453
- const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
27454
- if (target) {
27455
- this.setActiveCell(target.day.date);
27456
- this.handleCellFocused({ detail: { date: target.day.date } });
27457
- } else if (cells.length > 0) {
27458
- let nearest = null;
27459
-
27460
- if (navDirection === 'next') {
27461
- [nearest] = cells;
27462
- } else {
27463
- nearest = cells[cells.length - 1];
27464
- }
27676
+ this._afterMonthRender(() => {
27677
+ const cells = this.getAllFocusableCells();
27678
+ const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
27679
+ if (target) {
27680
+ this.setActiveCell(target.day.date);
27681
+ this.handleCellFocused({ detail: { date: target.day.date } });
27682
+ } else {
27683
+ const nearest = this.pickNearestCell(cells, targetDate, navDirection);
27684
+ if (nearest) {
27465
27685
  this.setActiveCell(nearest.day.date);
27466
27686
  this.handleCellFocused({ detail: { date: nearest.day.date } });
27467
27687
  }
27468
- this.focusActiveCell();
27469
- });
27688
+ }
27689
+ this.focusActiveCell();
27470
27690
  });
27471
27691
  }
27472
27692
  }
@@ -27516,19 +27736,22 @@ class AuroCalendar extends RangeDatepicker {
27516
27736
  }
27517
27737
 
27518
27738
  this.handleNextMonth({ skipActiveUpdate: true });
27519
- requestAnimationFrame(() => {
27520
- requestAnimationFrame(() => {
27521
- const cells = this.getAllFocusableCells();
27522
- const target = cells.find((cell) => cell.day && cell.day.date === nextTs);
27523
- if (target) {
27524
- this.setActiveCell(target.day.date);
27525
- this.focusActiveCell();
27526
- } else if (cells.length > 0) {
27527
- // Fallback: first cell of the last rendered month
27528
- this.setActiveCell(cells[cells.length - 1].day.date);
27739
+ this._afterMonthRender(() => {
27740
+ const cells = this.getAllFocusableCells();
27741
+ const target = cells.find((cell) => cell.day && cell.day.date === nextTs);
27742
+ if (target) {
27743
+ this.setActiveCell(target.day.date);
27744
+ this.focusActiveCell();
27745
+ } else {
27746
+ // Same nearest-by-date fallback handleGridKeyDown uses — direct
27747
+ // `cells[length - 1]` would land on the end of the new month,
27748
+ // far from the user's intended `nextTs`.
27749
+ const fallback = this.pickNearestCell(cells, nextTs, 'next');
27750
+ if (fallback) {
27751
+ this.setActiveCell(fallback.day.date);
27529
27752
  this.focusActiveCell();
27530
27753
  }
27531
- });
27754
+ }
27532
27755
  });
27533
27756
  } else if (direction === 'prev' && this.showPrevMonthBtn) {
27534
27757
  // Navigate to previous month and focus the computed previous date.
@@ -27542,19 +27765,22 @@ class AuroCalendar extends RangeDatepicker {
27542
27765
  }
27543
27766
 
27544
27767
  this.handlePrevMonth({ skipActiveUpdate: true });
27545
- requestAnimationFrame(() => {
27546
- requestAnimationFrame(() => {
27547
- const cells = this.getAllFocusableCells();
27548
- const target = cells.find((cell) => cell.day && cell.day.date === prevTs);
27549
- if (target) {
27550
- this.setActiveCell(target.day.date);
27551
- this.focusActiveCell();
27552
- } else if (cells.length > 0) {
27553
- // Fallback: last cell of the first rendered month
27554
- this.setActiveCell(cells[0].day.date);
27768
+ this._afterMonthRender(() => {
27769
+ const cells = this.getAllFocusableCells();
27770
+ const target = cells.find((cell) => cell.day && cell.day.date === prevTs);
27771
+ if (target) {
27772
+ this.setActiveCell(target.day.date);
27773
+ this.focusActiveCell();
27774
+ } else {
27775
+ // Same nearest-by-date fallback handleGridKeyDown uses — direct
27776
+ // `cells[0]` would land on the start of the previous month, far
27777
+ // from the user's intended `prevTs`.
27778
+ const fallback = this.pickNearestCell(cells, prevTs, 'prev');
27779
+ if (fallback) {
27780
+ this.setActiveCell(fallback.day.date);
27555
27781
  this.focusActiveCell();
27556
27782
  }
27557
- });
27783
+ }
27558
27784
  });
27559
27785
  }
27560
27786
  } else if (key === 'ArrowDown' || key === 'ArrowUp') {
@@ -27582,20 +27808,22 @@ class AuroCalendar extends RangeDatepicker {
27582
27808
  } else {
27583
27809
  this.handlePrevMonth({ skipActiveUpdate: true });
27584
27810
  }
27585
- requestAnimationFrame(() => {
27586
- requestAnimationFrame(() => {
27587
- const cells = this.getAllFocusableCells();
27588
- const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
27589
- if (target) {
27590
- this.setActiveCell(target.day.date);
27591
- this.focusActiveCell();
27592
- } else if (cells.length > 0) {
27593
- // Clamp to nearest focusable cell
27594
- const nearest = navDirection === 'next' ? cells[0] : cells[cells.length - 1];
27811
+ this._afterMonthRender(() => {
27812
+ const cells = this.getAllFocusableCells();
27813
+ const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
27814
+ if (target) {
27815
+ this.setActiveCell(target.day.date);
27816
+ this.focusActiveCell();
27817
+ } else {
27818
+ // Same nearest-by-date fallback handleGridKeyDown uses — the
27819
+ // old direction-based `cells[0]`/`cells[length-1]` clamp
27820
+ // could land 25+ days from the intended target.
27821
+ const nearest = this.pickNearestCell(cells, targetDate, navDirection);
27822
+ if (nearest) {
27595
27823
  this.setActiveCell(nearest.day.date);
27596
27824
  this.focusActiveCell();
27597
27825
  }
27598
- });
27826
+ }
27599
27827
  });
27600
27828
  }
27601
27829
  }
@@ -27634,8 +27862,9 @@ class AuroCalendar extends RangeDatepicker {
27634
27862
  return;
27635
27863
  }
27636
27864
 
27637
- // With aria-activedescendant, the button no longer receives native focus,
27638
- // so we use the debounced live region for the full context announcement.
27865
+ // DOM focus stays on the grid wrapper while arrow keys move the active
27866
+ // cell, so cell buttons never receive native focus. The debounced live
27867
+ // region carries the full-context announcement instead.
27639
27868
  const announcement = this.buildFocusAnnouncement(date);
27640
27869
  this.announceFocusDebounced(announcement);
27641
27870
 
@@ -27705,10 +27934,10 @@ class AuroCalendar extends RangeDatepicker {
27705
27934
  return null;
27706
27935
  }
27707
27936
 
27708
- const departTs = startOfDay$2(parsedFrom * 1000) / 1000;
27937
+ const departTs = new Date(parsedFrom * 1000).setHours(0, 0, 0, 0) / 1000;
27709
27938
  const parsedTo = Number.parseInt(this.dateTo, 10);
27710
27939
  const hasTo = Number.isFinite(parsedTo);
27711
- const returnTs = hasTo ? startOfDay$2(parsedTo * 1000) / 1000 : null;
27940
+ const returnTs = hasTo ? new Date(parsedTo * 1000).setHours(0, 0, 0, 0) / 1000 : null;
27712
27941
 
27713
27942
  if (date === departTs) {
27714
27943
  return this.datepicker.rangeLabelStart || 'range start';
@@ -27722,36 +27951,22 @@ class AuroCalendar extends RangeDatepicker {
27722
27951
  if (hasTo && date > departTs && date < returnTs) {
27723
27952
  return this.datepicker.rangeLabelInRange || 'in range';
27724
27953
  }
27954
+ if (!hasTo && date > departTs) {
27955
+ return this.datepicker.rangeLabelEndPreview || 'previewing range end';
27956
+ }
27725
27957
  return this.datepicker.rangeLabelAfterRange || 'after range';
27726
27958
  }
27727
27959
 
27728
27960
  /**
27729
- * Checks whether a given date is a blackout date.
27961
+ * Checks whether a given date is a blackout date. Delegates to the
27962
+ * memoized `_getBlackoutSet` so the YYYY-MM-DD parsing and the
27963
+ * legacy/ISO merge rules live in exactly one place (see `blackoutUtils.js`).
27730
27964
  * @private
27731
27965
  * @param {Number} dateTs - Unix timestamp (seconds).
27732
27966
  * @returns {Boolean} True if the date is blacked out.
27733
27967
  */
27734
27968
  isDateBlackout(dateTs) {
27735
- // Check legacy disabledDays.
27736
- if (Array.isArray(this.disabledDays) && this.disabledDays.length > 0) {
27737
- if (this.disabledDays.findIndex((day) => parseInt(day, 10) === dateTs) !== -1) {
27738
- return true;
27739
- }
27740
- }
27741
-
27742
- // Check ISO blackoutDates.
27743
- const blackoutDates = this.datepicker?.blackoutDates;
27744
- if (Array.isArray(blackoutDates) && blackoutDates.length > 0) {
27745
- const date = new Date(dateTs * 1000);
27746
- const yyyy = date.getFullYear();
27747
- const mm = String(date.getMonth() + 1).padStart(2, '0');
27748
- const dd = String(date.getDate()).padStart(2, '0');
27749
- if (blackoutDates.includes(`${yyyy}-${mm}-${dd}`)) {
27750
- return true;
27751
- }
27752
- }
27753
-
27754
- return false;
27969
+ return this._getBlackoutSet().has(dateTs);
27755
27970
  }
27756
27971
 
27757
27972
  /**
@@ -27918,9 +28133,34 @@ class AuroCalendar extends RangeDatepicker {
27918
28133
  // the last one.
27919
28134
  if (this._announceRafId) {
27920
28135
  cancelAnimationFrame(this._announceRafId);
28136
+ this._announceRafId = null;
27921
28137
  }
28138
+ this._deliverAnnouncement(dateStr, 0);
28139
+ }
28140
+
28141
+ /**
28142
+ * Writes `dateStr` to the live region. If the dropdown's dialog hasn't
28143
+ * mounted yet (so getOrCreateLiveRegion can't attach), retries on the
28144
+ * next animation frame up to MAX_LIVE_REGION_RETRIES instead of silently
28145
+ * dropping the announcement. The retry uses the same `_announceRafId`
28146
+ * the double-rAF below uses, so a newer announceSelection call (or
28147
+ * disconnectedCallback) cancels any in-flight retry.
28148
+ * @private
28149
+ * @param {String} dateStr - The localized date string to announce.
28150
+ * @param {Number} attempts - Number of prior retry attempts.
28151
+ * @returns {void}
28152
+ */
28153
+ _deliverAnnouncement(dateStr, attempts) {
27922
28154
  const liveRegion = this.getOrCreateLiveRegion();
27923
28155
  if (!liveRegion) {
28156
+ const MAX_LIVE_REGION_RETRIES = 10;
28157
+ if (attempts < MAX_LIVE_REGION_RETRIES) {
28158
+ this._announceRafId = requestAnimationFrame(() => {
28159
+ this._deliverAnnouncement(dateStr, attempts + 1);
28160
+ });
28161
+ } else {
28162
+ this._announceRafId = null;
28163
+ }
27924
28164
  return;
27925
28165
  }
27926
28166
 
@@ -28106,7 +28346,7 @@ class AuroCalendar extends RangeDatepicker {
28106
28346
  </button>
28107
28347
  ` : undefined}
28108
28348
  </div>
28109
- <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}">
28349
+ <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}">
28110
28350
  ${this.renderAllCalendars()}
28111
28351
  </div>
28112
28352
  </div>
@@ -31991,7 +32231,7 @@ let AuroHelpText$2$1 = class AuroHelpText extends i$2 {
31991
32231
  }
31992
32232
  };
31993
32233
 
31994
- var formkitVersion$1$3 = '202606252337';
32234
+ var formkitVersion$1$3 = '202606291455';
31995
32235
 
31996
32236
  let AuroElement$2$2 = class AuroElement extends i$2 {
31997
32237
  static get properties() {
@@ -38388,7 +38628,7 @@ function normalizeDates$2(context, ...dates) {
38388
38628
  * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))
38389
38629
  * //=> Tue Sep 02 2014 00:00:00
38390
38630
  */
38391
- function startOfDay$3(date, options) {
38631
+ function startOfDay$2(date, options) {
38392
38632
  const _date = toDate$2(date, options?.in);
38393
38633
  _date.setHours(0, 0, 0, 0);
38394
38634
  return _date;
@@ -38436,8 +38676,8 @@ function differenceInCalendarDays$2(laterDate, earlierDate, options) {
38436
38676
  earlierDate,
38437
38677
  );
38438
38678
 
38439
- const laterStartOfDay = startOfDay$3(laterDate_);
38440
- const earlierStartOfDay = startOfDay$3(earlierDate_);
38679
+ const laterStartOfDay = startOfDay$2(laterDate_);
38680
+ const earlierStartOfDay = startOfDay$2(earlierDate_);
38441
38681
 
38442
38682
  const laterTimestamp =
38443
38683
  +laterStartOfDay - getTimezoneOffsetInMilliseconds$2(laterStartOfDay);
@@ -43709,13 +43949,6 @@ let AuroInputUtilities$2 = class AuroInputUtilities {
43709
43949
  * @returns {string | undefined}
43710
43950
  */
43711
43951
  toFormattedValue(valueObject, format) {
43712
- // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
43713
- // `format` argument has to fail gracefully rather than throw on
43714
- // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
43715
- // as "no format → no display value".
43716
- if (!format) {
43717
- return undefined;
43718
- }
43719
43952
  const normalizedFormat = format.toLowerCase();
43720
43953
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
43721
43954
 
@@ -43866,18 +44099,79 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
43866
44099
  constructor() {
43867
44100
  super();
43868
44101
 
43869
- // Single-source initialization. Alphabetized so duplicate or stale
43870
- // defaults are immediately obvious on a diff. Every field is assigned
43871
- // exactly once here (previously the constructor + the old
43872
- // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
43873
- // fields and double-allocated `util` and `validation`, discarding the
43874
- // first instance). `validation` is now allocated exactly once; `util`
43875
- // is seeded here with an en-US default and then rebuilt in
43876
- // `connectedCallback` once the consumer-resolved locale is available,
43877
- // so a parent (datepicker/combobox) calling `validate()` synchronously
43878
- // during its own update cycle sees a populated util instance.
44102
+ this.appearance = "default";
44103
+ this.disabled = false;
44104
+ this.layout = 'classic';
44105
+ this.locale = 'en-US';
44106
+ this.max = undefined;
44107
+ this._maxObject = undefined;
44108
+ this.maxLength = undefined;
44109
+ this.min = undefined;
44110
+ this._minObject = undefined;
44111
+ this.minLength = undefined;
44112
+ this.required = false;
44113
+ this.onDark = false;
44114
+ this.setCustomValidityForType = undefined;
44115
+ this.size = 'lg';
44116
+ this.shape = 'classic';
44117
+ this.value = undefined;
44118
+ this._valueObject = undefined;
44119
+
44120
+ this._initializePrivateDefaults();
44121
+ }
44122
+
44123
+ /**
44124
+ * Internal Defaults.
44125
+ * @private
44126
+ * @returns {void}
44127
+ */
44128
+ _initializePrivateDefaults() {
43879
44129
  this.activeLabel = false;
43880
- /** @private */
44130
+ this.appearance = "default";
44131
+ this.icon = false;
44132
+ this.disabled = false;
44133
+ this.dvInputOnly = false;
44134
+ this.hideLabelVisually = false;
44135
+ this.max = undefined;
44136
+ this.maxLength = undefined;
44137
+ this.min = undefined;
44138
+ this.minLength = undefined;
44139
+ this.noValidate = false;
44140
+ this.onDark = false;
44141
+ this.required = false;
44142
+ this.setCustomValidityForType = undefined;
44143
+
44144
+ // Used for storing raw values returned from input mask.
44145
+ this._rawMaskValue = undefined;
44146
+
44147
+ /**
44148
+ * @private
44149
+ */
44150
+ this.layout = 'classic';
44151
+
44152
+ /**
44153
+ * @private
44154
+ */
44155
+ this.shape = 'classic';
44156
+
44157
+ /**
44158
+ * @private
44159
+ */
44160
+ this.size = 'lg';
44161
+
44162
+ this.touched = false;
44163
+ this.util = new AuroInputUtilities$2({
44164
+ locale: "en-US",
44165
+ format: this.format
44166
+ });
44167
+ this.validation = new AuroFormValidation$6();
44168
+ this.inputIconName = undefined;
44169
+ this.showPassword = false;
44170
+ this.validationCCLength = undefined;
44171
+ this.hasValue = false;
44172
+ this.label = 'Input label is undefined';
44173
+
44174
+
43881
44175
  this.allowedInputTypes = [
43882
44176
  "text",
43883
44177
  "number",
@@ -43886,8 +44180,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
43886
44180
  "credit-card",
43887
44181
  "tel"
43888
44182
  ];
43889
- this.appearance = "default";
43890
- /** @private */
44183
+ this.icon = false;
43891
44184
  this.dateFormatMap = {
43892
44185
  'mm/dd/yyyy': 'dateMMDDYYYY',
43893
44186
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -43904,57 +44197,27 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
43904
44197
  'dd/mm': 'dateDDMM',
43905
44198
  'mm/dd': 'dateMMDD'
43906
44199
  };
43907
- this.disabled = false;
43908
- /** @private */
43909
44200
  this.domHandler = new DomHandler$2();
43910
44201
  this.dvInputOnly = false;
43911
44202
  this.hasValue = false;
43912
- this.hideLabelVisually = false;
43913
- this.icon = false;
43914
- /** @private */
43915
44203
  this.inputIconName = undefined;
43916
- /** @private */
43917
44204
  this.label = 'Input label is undefined';
43918
- this.layout = 'classic';
43919
- this.locale = 'en-US';
43920
- this.max = undefined;
43921
- this._maxObject = undefined;
43922
- this.maxLength = undefined;
43923
- this.min = undefined;
43924
- this._minObject = undefined;
43925
- this.minLength = undefined;
43926
44205
  this.noValidate = false;
43927
- this.onDark = false;
43928
- // Raw values returned from the input mask before model normalization.
43929
- this._rawMaskValue = undefined;
43930
- this.required = false;
43931
- this.setCustomValidityForType = undefined;
43932
- // Credit Card is intentionally excluded — its mask manages the cursor
43933
- // itself, and listing it here caused cursor placement issues in Safari.
43934
- /** @private */
44206
+ this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
43935
44207
  this.setSelectionInputTypes = [
43936
44208
  "text",
43937
44209
  "password",
43938
44210
  "email"
43939
- ];
43940
- this.shape = 'classic';
43941
- /** @private */
44211
+ ]; // Credit Card is not included as this caused cursor placement issues in Safari.
43942
44212
  this.showPassword = false;
43943
- this.size = 'lg';
43944
44213
  this.touched = false;
43945
- /** @private */
43946
44214
  this.uniqueId = new UniqueId$1().create();
43947
- /** @private */
43948
44215
  this.util = new AuroInputUtilities$2({
43949
44216
  locale: this.locale,
43950
44217
  format: this.format
43951
44218
  });
43952
- /** @private */
43953
44219
  this.validation = new AuroFormValidation$6();
43954
- /** @private */
43955
44220
  this.validationCCLength = undefined;
43956
- this.value = undefined;
43957
- this._valueObject = undefined;
43958
44221
  }
43959
44222
 
43960
44223
  // function to define props used within the scope of this component
@@ -44502,15 +44765,6 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44502
44765
 
44503
44766
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
44504
44767
 
44505
- // Normalize the format token to lowercase so case-mixed values supplied
44506
- // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
44507
- // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
44508
- // format silently misses the map and leaves `setCustomValidityForType`
44509
- // unset.
44510
- if (this.format) {
44511
- this.format = this.format.toLowerCase();
44512
- }
44513
-
44514
44768
  // use validity message override if declared when initializing the component
44515
44769
  if (this.hasAttribute('setCustomValidity')) {
44516
44770
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -44944,38 +45198,6 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44944
45198
  this.touched = true;
44945
45199
  this.validation.validate(this);
44946
45200
  }
44947
-
44948
- // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
44949
- // update that can re-render the input and reset the native cursor; we
44950
- // capture the caret position before that update commits and restore it
44951
- // via `setSelectionRange` once the update has flushed. Gated on
44952
- // `setSelectionInputTypes` so credit-card (and other masked types whose
44953
- // formatter manages the cursor itself) doesn't get a competing write.
44954
- // Capture the caret position INSIDE the gate — reading `selectionStart`
44955
- // on input types that don't support text selection (number, email in
44956
- // some browsers) throws InvalidStateError, which would crash all input
44957
- // handling. Wrap the read in try/catch belt-and-suspenders even though
44958
- // the gated types currently support it, since the list is a public
44959
- // property a consumer could mutate.
44960
- if (this.setSelectionInputTypes.includes(this.type)) {
44961
- let selectionStart;
44962
- try {
44963
- selectionStart = this.inputElement.selectionStart;
44964
- } catch (error) { // eslint-disable-line no-unused-vars
44965
- return;
44966
- }
44967
- if (typeof selectionStart !== 'number') {
44968
- return;
44969
- }
44970
- this.updateComplete.then(() => {
44971
- try {
44972
- this.inputElement.setSelectionRange(selectionStart, selectionStart);
44973
- } catch (error) { // eslint-disable-line no-unused-vars
44974
- // Some input types (number/email in certain UAs) throw on
44975
- // setSelectionRange; swallow and let the native cursor stand.
44976
- }
44977
- });
44978
- }
44979
45201
  }
44980
45202
 
44981
45203
  /**
@@ -45602,7 +45824,7 @@ let AuroHelpText$1$3 = class AuroHelpText extends i$2 {
45602
45824
  }
45603
45825
  };
45604
45826
 
45605
- var formkitVersion$7 = '202606252337';
45827
+ var formkitVersion$7 = '202606291455';
45606
45828
 
45607
45829
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
45608
45830
  // See LICENSE in the project root for license information.
@@ -46105,7 +46327,6 @@ let AuroInput$1 = class AuroInput extends BaseInput$1 {
46105
46327
  <${this.buttonTag}
46106
46328
  @click="${this.handleClickShowPassword}"
46107
46329
  appearance="${this.onDark ? 'inverse' : this.appearance}"
46108
- aria-pressed="${this.showPassword ? 'true' : 'false'}"
46109
46330
  class="notificationBtn passwordBtn"
46110
46331
  shape="circle"
46111
46332
  size="sm"
@@ -46179,29 +46400,25 @@ let AuroInput$1 = class AuroInput extends BaseInput$1 {
46179
46400
  * @returns {html} - Returns HTML for the help text and error message.
46180
46401
  */
46181
46402
  renderHtmlHelpText() {
46182
- // Single `<p>` with stable identity across validity transitions —
46183
- // previously two distinct templates (valid vs invalid) caused Lit to
46184
- // replace the node entirely on a flip, and VoiceOver wouldn't
46185
- // re-announce because the live-region element it was watching had been
46186
- // removed and a new one inserted. Keeping one node means the `role`,
46187
- // `aria-live`, and text content all change in-place, which AT does
46188
- // observe and announce.
46189
- const isError = this.validity && this.validity !== 'valid';
46190
46403
  return u$d`
46191
- <${this.helpTextTag}
46192
- appearance="${this.onDark ? 'inverse' : this.appearance}"
46193
- ?error=${isError}>
46194
- <p
46195
- id="${this.uniqueId}"
46196
- part="helpText"
46197
- role="${o$4(isError ? 'alert' : undefined)}"
46198
- aria-live="${o$4(isError ? 'assertive' : undefined)}">
46199
- ${isError
46200
- ? this.errorMessage
46201
- : u$d`<slot name="helpText">${this.getHelpText()}</slot>`
46202
- }
46203
- </p>
46204
- </${this.helpTextTag}>
46404
+ ${!this.validity || this.validity === undefined || this.validity === 'valid'
46405
+ ? u$d`
46406
+ <${this.helpTextTag}
46407
+ appearance="${this.onDark ? 'inverse' : this.appearance}">
46408
+ <p id="${this.uniqueId}" part="helpText">
46409
+ <slot name="helpText">${this.getHelpText()}</slot>
46410
+ </p>
46411
+ </${this.helpTextTag}>
46412
+ `
46413
+ : u$d`
46414
+ <${this.helpTextTag} error
46415
+ appearance="${this.onDark ? 'inverse' : this.appearance}">
46416
+ <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
46417
+ ${this.errorMessage}
46418
+ </p>
46419
+ </${this.helpTextTag}>
46420
+ `
46421
+ }
46205
46422
  `;
46206
46423
  }
46207
46424
 
@@ -46348,15 +46565,6 @@ function formatISODate(isoStr, format) {
46348
46565
  try {
46349
46566
  const date = dateFormatter$2.stringToDateInstance(isoStr);
46350
46567
 
46351
- // `stringToDateInstance` returns an `Invalid Date` for malformed strings
46352
- // and `null` for non-string input — it does NOT throw. Without this
46353
- // guard, `getFullYear()`/`getMonth()`/`getDate()` on an Invalid Date
46354
- // yield `NaN`, and `String(NaN).padStart(4, '0')` produces literals
46355
- // like "0NaN/0NaN/0NaN" instead of `undefined`.
46356
- if (!(date instanceof Date) || Number.isNaN(date.getTime())) {
46357
- return undefined;
46358
- }
46359
-
46360
46568
  const year = String(date.getFullYear()).padStart(4, '0');
46361
46569
  const month = String(date.getMonth() + 1).padStart(2, '0');
46362
46570
  const day = String(date.getDate()).padStart(2, '0');
@@ -46367,10 +46575,7 @@ function formatISODate(isoStr, format) {
46367
46575
  replace(/mm/iu, month).
46368
46576
  replace(/dd/iu, day);
46369
46577
  } catch (err) {
46370
- // Defensive: the Date-returning path is guarded above, but `parseDate`
46371
- // (inside `stringToDateInstance`) could throw on pathological input
46372
- // future-library-versions might introduce. Treat any thrown error as
46373
- // "not a valid date" and return undefined.
46578
+ // If the input string is not a valid date, return undefined
46374
46579
  return undefined;
46375
46580
  }
46376
46581
  }
@@ -47096,6 +47301,7 @@ class AuroDatePicker extends AuroElement$5 {
47096
47301
  this.rangeLabelBeforeRange = 'before range';
47097
47302
  this.rangeLabelInRange = 'in range';
47098
47303
  this.rangeLabelAfterRange = 'after range';
47304
+ this.rangeLabelEndPreview = 'previewing range end';
47099
47305
  this.blackoutDates = [];
47100
47306
  this.blackoutLabel = 'unavailable';
47101
47307
  this.navLabelPrevMonth = 'Previous month';
@@ -47195,6 +47401,22 @@ class AuroDatePicker extends AuroElement$5 {
47195
47401
  */
47196
47402
  this.handleClick = this.handleClick.bind(this);
47197
47403
 
47404
+ /**
47405
+ * Single AbortController shared by every listener registered in the
47406
+ * configure* methods. Lets disconnectedCallback tear all of them down
47407
+ * with one abort() call.
47408
+ *
47409
+ * The genuine leak risk is the listeners attached to children that can
47410
+ * outlive the host if they get reparented — `this.dropdown`,
47411
+ * `this.calendar`, and the inputs inside the dropdown's slot.
47412
+ * Listeners attached to `this` (e.g. focusin/focusout on the host)
47413
+ * form a self-contained reference graph that the GC can collect with
47414
+ * the host anyway, but they share the same signal so the cleanup
47415
+ * pattern stays uniform across all configure* sites.
47416
+ * @private
47417
+ */
47418
+ this._listenerAbortController = new AbortController();
47419
+
47198
47420
  /**
47199
47421
  * @private
47200
47422
  */
@@ -47243,6 +47465,7 @@ class AuroDatePicker extends AuroElement$5 {
47243
47465
 
47244
47466
  /**
47245
47467
  * Label announced for blackout (disabled but in-range) date cells.
47468
+ * @default 'unavailable'
47246
47469
  */
47247
47470
  blackoutLabel: {
47248
47471
  type: String,
@@ -47259,6 +47482,7 @@ class AuroDatePicker extends AuroElement$5 {
47259
47482
 
47260
47483
  /**
47261
47484
  * Accessible label for the calendar grid containing the days of the month.
47485
+ * @default 'Calendar days of the month'
47262
47486
  */
47263
47487
  calendarGridLabel: {
47264
47488
  type: String,
@@ -47421,6 +47645,7 @@ class AuroDatePicker extends AuroElement$5 {
47421
47645
 
47422
47646
  /**
47423
47647
  * Accessible label for the next month navigation button.
47648
+ * @default 'Next month'
47424
47649
  */
47425
47650
  navLabelNextMonth: {
47426
47651
  type: String,
@@ -47429,6 +47654,7 @@ class AuroDatePicker extends AuroElement$5 {
47429
47654
 
47430
47655
  /**
47431
47656
  * Accessible label for the previous month navigation button.
47657
+ * @default 'Previous month'
47432
47658
  */
47433
47659
  navLabelPrevMonth: {
47434
47660
  type: String,
@@ -47506,7 +47732,11 @@ class AuroDatePicker extends AuroElement$5 {
47506
47732
  },
47507
47733
 
47508
47734
  /**
47509
- * Label announced for cells after the range (or after start when no end is selected).
47735
+ * Label announced for cells after a fully selected range (both
47736
+ * `dateFrom` and `dateTo` are set). While a range is still being
47737
+ * picked (`dateFrom` set, `dateTo` unset), focused cells past the
47738
+ * start use `rangeLabelEndPreview` instead.
47739
+ * @default 'after range'
47510
47740
  */
47511
47741
  rangeLabelAfterRange: {
47512
47742
  type: String,
@@ -47515,6 +47745,7 @@ class AuroDatePicker extends AuroElement$5 {
47515
47745
 
47516
47746
  /**
47517
47747
  * Label announced for cells before the range start.
47748
+ * @default 'before range'
47518
47749
  */
47519
47750
  rangeLabelBeforeRange: {
47520
47751
  type: String,
@@ -47523,14 +47754,27 @@ class AuroDatePicker extends AuroElement$5 {
47523
47754
 
47524
47755
  /**
47525
47756
  * Label announced for the range end date cell.
47757
+ * @default 'range end'
47526
47758
  */
47527
47759
  rangeLabelEnd: {
47528
47760
  type: String,
47529
47761
  reflect: true
47530
47762
  },
47531
47763
 
47764
+ /**
47765
+ * Label announced for the focused cell while previewing a range end
47766
+ * (dateFrom set, dateTo not yet selected). Tells AT users that
47767
+ * pressing Enter would commit this cell as the range end.
47768
+ * @default 'previewing range end'
47769
+ */
47770
+ rangeLabelEndPreview: {
47771
+ type: String,
47772
+ reflect: true
47773
+ },
47774
+
47532
47775
  /**
47533
47776
  * Label announced for cells within the selected range.
47777
+ * @default 'in range'
47534
47778
  */
47535
47779
  rangeLabelInRange: {
47536
47780
  type: String,
@@ -47539,6 +47783,7 @@ class AuroDatePicker extends AuroElement$5 {
47539
47783
 
47540
47784
  /**
47541
47785
  * Label announced for the range start date cell.
47786
+ * @default 'range start'
47542
47787
  */
47543
47788
  rangeLabelStart: {
47544
47789
  type: String,
@@ -47546,7 +47791,7 @@ class AuroDatePicker extends AuroElement$5 {
47546
47791
  },
47547
47792
 
47548
47793
  /**
47549
- * Dates that the user should have for reference as part of their decision making when selecting a date.
47794
+ * Dates that the user should have for reference as part of their decision-making when selecting a date.
47550
47795
  * This should be a JSON string array of ISO date strings (`YYYY-MM-DD`).
47551
47796
  */
47552
47797
  referenceDates: {
@@ -47903,10 +48148,26 @@ class AuroDatePicker extends AuroElement$5 {
47903
48148
  // ─── Vendor calendar time conversions ─────────────────────────────────────
47904
48149
 
47905
48150
  /**
47906
- * Converts a Unix timestamp (seconds) from the vendor calendar to an ISO date string.
48151
+ * Converts a Unix timestamp (seconds) from the vendored range-datepicker
48152
+ * (`src/vendor/wc-range-datepicker/day.js`) to an ISO date string.
48153
+ *
48154
+ * Timezone contract:
48155
+ * - INPUT: `time` is assumed to be the seconds-since-epoch of **local
48156
+ * midnight** for the intended calendar day. The vendor's Day constructor
48157
+ * builds it via `date-fns format(date, 't')` from a locally-constructed
48158
+ * Date, so this assumption currently holds end-to-end.
48159
+ * - OUTPUT: `dateFormatter.toISOFormatString` reads the Date's local
48160
+ * getFullYear/getMonth/getDate components, so the returned YYYY-MM-DD
48161
+ * string matches the local calendar day.
48162
+ *
48163
+ * If the vendor ever switches to emitting UTC-midnight timestamps, this
48164
+ * conversion will silently shift the returned date by one day in zones
48165
+ * west of UTC. Any vendor swap should re-verify this contract; the TZ
48166
+ * regression suite (`npm run test:hst`, UTC-10) will catch the symptom.
48167
+ *
47907
48168
  * @private
47908
- * @param {number} time - Unix timestamp in seconds.
47909
- * @returns {string} ISO date string (yyyy-mm-dd).
48169
+ * @param {number} time - Unix timestamp (seconds), local midnight of the day.
48170
+ * @returns {string} ISO date string (yyyy-mm-dd) reflecting the local calendar day.
47910
48171
  */
47911
48172
  convertWcTimeToDate(time) {
47912
48173
  return dateFormatter$1.toISOFormatString(new Date(time * 1000));
@@ -48008,8 +48269,8 @@ class AuroDatePicker extends AuroElement$5 {
48008
48269
  }
48009
48270
  }
48010
48271
 
48011
- // Focus the calendar grid wrapper (aria-activedescendant handles
48012
- // the SR announcement for the active cell).
48272
+ // Focus the calendar grid wrapper. The live region (announced just
48273
+ // below) handles the SR announcement for the active cell.
48013
48274
  if (activeCell) {
48014
48275
  this.calendar.focusActiveCell();
48015
48276
 
@@ -48059,11 +48320,13 @@ class AuroDatePicker extends AuroElement$5 {
48059
48320
  this.dropdown.bibDialogLabel = labelElement.textContent.trim() || undefined;
48060
48321
  }
48061
48322
 
48323
+ const { signal } = this._listenerAbortController;
48324
+
48062
48325
  this.dropdown.addEventListener('auroDropdown-triggerClick', () => {
48063
48326
  if (!this.isPopoverVisible) {
48064
48327
  this.dropdown.show();
48065
48328
  }
48066
- });
48329
+ }, { signal });
48067
48330
 
48068
48331
  this.dropdown.addEventListener('auroDropdown-toggled', () => {
48069
48332
  this.notifyDatepickerToggled();
@@ -48081,7 +48344,7 @@ class AuroDatePicker extends AuroElement$5 {
48081
48344
  if (this.valueObject) {
48082
48345
  this.centralDate = this.value;
48083
48346
  } else if (!this.centralDate && !this.calendarStartDate && !this.minDate) {
48084
- this.centralDate = new Date();
48347
+ this.centralDate = dateFormatter$1.toISOFormatString(new Date());
48085
48348
  }
48086
48349
  }
48087
48350
 
@@ -48161,7 +48424,7 @@ class AuroDatePicker extends AuroElement$5 {
48161
48424
  this.forceScrollOnNextMobileCalendarRender = false;
48162
48425
  }, 0);
48163
48426
  }
48164
- });
48427
+ }, { signal });
48165
48428
 
48166
48429
  // Handle responsive strategy changes while the dropdown is open
48167
48430
  // (e.g. resizing from desktop → mobile or vice versa).
@@ -48208,7 +48471,7 @@ class AuroDatePicker extends AuroElement$5 {
48208
48471
  });
48209
48472
  });
48210
48473
  }
48211
- });
48474
+ }, { signal });
48212
48475
  }
48213
48476
 
48214
48477
  /**
@@ -48221,6 +48484,8 @@ class AuroDatePicker extends AuroElement$5 {
48221
48484
 
48222
48485
  this.inputList = [...this.dropdown.querySelectorAll(this.inputTag._$litStatic$)];
48223
48486
 
48487
+ const { signal } = this._listenerAbortController;
48488
+
48224
48489
  this.inputList.forEach((input, index) => {
48225
48490
  input.addEventListener('input', (event) => {
48226
48491
  event.stopPropagation();
@@ -48232,7 +48497,7 @@ class AuroDatePicker extends AuroElement$5 {
48232
48497
  }
48233
48498
 
48234
48499
  this.notifyValueChanged();
48235
- });
48500
+ }, { signal });
48236
48501
 
48237
48502
  input.addEventListener('auroFormElement-validated', (evt) => {
48238
48503
  // not to bubble up input's validated event.
@@ -48248,7 +48513,7 @@ class AuroDatePicker extends AuroElement$5 {
48248
48513
  this.validity = evt.detail.validity;
48249
48514
  this.errorMessage = evt.detail.message;
48250
48515
  }
48251
- });
48516
+ }, { signal });
48252
48517
  });
48253
48518
  }
48254
48519
 
@@ -48262,19 +48527,32 @@ class AuroDatePicker extends AuroElement$5 {
48262
48527
  this.calendar.datepicker = this;
48263
48528
  this.calendar.dropdown = this.dropdown;
48264
48529
 
48530
+ const { signal } = this._listenerAbortController;
48531
+
48265
48532
  this.calendar.addEventListener('auroCalendar-dateSelected', () => {
48266
- if (this.inputList[0].value !== this.calendar.dateFrom && this.calendar.dateFrom !== undefined) {
48267
- 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
+ }
48268
48543
  }
48269
48544
 
48270
- if (this.inputList[1] && this.calendar.dateTo && this.inputList[1].value !== this.calendar.dateTo) {
48271
- 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
+ }
48272
48550
  }
48273
- });
48551
+ }, { signal });
48274
48552
 
48275
48553
  this.calendar.addEventListener('auroCalendar-dismissRequest', () => {
48276
48554
  this.dropdown.hide();
48277
- });
48555
+ }, { signal });
48278
48556
 
48279
48557
  this.calendar.addEventListener('auroCalendar-centralDateChanged', (event) => {
48280
48558
  const match = this.centralDateObject && this.util.datesMatch(event.detail.date, this.centralDateObject);
@@ -48284,7 +48562,7 @@ class AuroDatePicker extends AuroElement$5 {
48284
48562
  }
48285
48563
 
48286
48564
  this.notifyMonthChanged(event);
48287
- });
48565
+ }, { signal });
48288
48566
  }
48289
48567
 
48290
48568
  /**
@@ -48293,10 +48571,17 @@ class AuroDatePicker extends AuroElement$5 {
48293
48571
  * @returns {void}
48294
48572
  */
48295
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
+
48296
48581
  this.addEventListener('focusin', () => {
48297
48582
  this.touched = true;
48298
48583
  this.hasFocus = true;
48299
- });
48584
+ }, { signal });
48300
48585
 
48301
48586
  this.addEventListener('focusout', () => {
48302
48587
  this.hasFocus = false;
@@ -48308,7 +48593,7 @@ class AuroDatePicker extends AuroElement$5 {
48308
48593
  if (!this.matches(':focus-within')) {
48309
48594
  this.validate();
48310
48595
  }
48311
- });
48596
+ }, { signal });
48312
48597
 
48313
48598
  if (this.valueObject) {
48314
48599
  this.calendar.dateFrom = this.convertToWcValidTime(this.valueObject);
@@ -48506,6 +48791,41 @@ class AuroDatePicker extends AuroElement$5 {
48506
48791
  return this.validity !== undefined && this.validity !== 'valid';
48507
48792
  }
48508
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
+
48509
48829
  /**
48510
48830
  * Lifecycle method to check if the locale is valid.
48511
48831
  * @ignore
@@ -48516,10 +48836,15 @@ class AuroDatePicker extends AuroElement$5 {
48516
48836
  if (changedProperties.has('locale')) {
48517
48837
  try {
48518
48838
  const supported = Intl.DateTimeFormat.supportedLocalesOf([this.locale], { localeMatcher: 'lookup' });
48519
- 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
+ }
48520
48845
  } catch {
48521
- console.debug(`[AuroDatePicker] The locale "${this.locale}" is not valid. Falling back to "en-US".`); // eslint-disable-line no-console
48522
48846
  this._validLocale = 'en-US';
48847
+ this._warnInvalidLocale(this.locale);
48523
48848
  }
48524
48849
 
48525
48850
  const previousLocaleFormat = getDateFormatFromLocale$1(changedProperties.get('locale'));
@@ -48601,8 +48926,6 @@ class AuroDatePicker extends AuroElement$5 {
48601
48926
  // Skip centralDate update when user clicked a cell in range mode
48602
48927
  // to prevent the displayed months from shifting
48603
48928
  this.centralDate = this.value;
48604
- //TODO: TEST THIS CHANGE
48605
- // this.calendarRenderUtil.updateCentralDate(this, this.value);
48606
48929
  }
48607
48930
 
48608
48931
  this.setHasValue();
@@ -48662,8 +48985,6 @@ class AuroDatePicker extends AuroElement$5 {
48662
48985
  // Skip centralDate update when user clicked a cell in range mode
48663
48986
  // to prevent the displayed months from shifting
48664
48987
  this.centralDate = this.valueEnd;
48665
- // TODO: TEST THIS CHANGE
48666
- // this.calendarRenderUtil.updateCentralDate(this, this.formattedValueEnd);
48667
48988
  }
48668
48989
 
48669
48990
  this.validate();
@@ -48805,7 +49126,7 @@ class AuroDatePicker extends AuroElement$5 {
48805
49126
  * @returns {void}
48806
49127
  */
48807
49128
  configureClickHandler() {
48808
- this.addEventListener('click', this.handleClick);
49129
+ this.addEventListener('click', this.handleClick, { signal: this._listenerAbortController.signal });
48809
49130
  }
48810
49131
 
48811
49132
  firstUpdated() {
@@ -48813,6 +49134,15 @@ class AuroDatePicker extends AuroElement$5 {
48813
49134
  // Add the tag name as an attribute if it is different than the component name
48814
49135
  this.runtimeUtils.handleComponentTagRename(this, 'auro-datepicker');
48815
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
+
48816
49146
  this.configureDropdown();
48817
49147
  this.configureInput();
48818
49148
  this.configureCalendar();
@@ -48824,9 +49154,36 @@ class AuroDatePicker extends AuroElement$5 {
48824
49154
  connectedCallback() {
48825
49155
  super.connectedCallback();
48826
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
+
48827
49173
  this.locale = this.domHandler.getLocale(this);
48828
49174
  }
48829
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
+
48830
49187
  // layout render methods
48831
49188
  // ------------------------------------
48832
49189
 
@@ -50322,7 +50679,7 @@ let AuroHelpText$1$2 = class AuroHelpText extends i$2 {
50322
50679
  }
50323
50680
  };
50324
50681
 
50325
- var formkitVersion$1$2 = '202606252337';
50682
+ var formkitVersion$1$2 = '202606291455';
50326
50683
 
50327
50684
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
50328
50685
  // See LICENSE in the project root for license information.
@@ -54650,7 +55007,7 @@ let AuroHelpText$6 = class AuroHelpText extends i$2 {
54650
55007
  }
54651
55008
  };
54652
55009
 
54653
- var formkitVersion$6 = '202606252337';
55010
+ var formkitVersion$6 = '202606291455';
54654
55011
 
54655
55012
  let AuroElement$1$2 = class AuroElement extends i$2 {
54656
55013
  static get properties() {
@@ -58590,7 +58947,7 @@ let AuroHelpText$5 = class AuroHelpText extends i$2 {
58590
58947
  }
58591
58948
  };
58592
58949
 
58593
- var formkitVersion$5 = '202606252337';
58950
+ var formkitVersion$5 = '202606291455';
58594
58951
 
58595
58952
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
58596
58953
  // See LICENSE in the project root for license information.
@@ -60340,7 +60697,7 @@ let AuroHelpText$4 = class AuroHelpText extends i$2 {
60340
60697
  }
60341
60698
  };
60342
60699
 
60343
- var formkitVersion$4 = '202606252337';
60700
+ var formkitVersion$4 = '202606291455';
60344
60701
 
60345
60702
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
60346
60703
  // See LICENSE in the project root for license information.
@@ -65555,7 +65912,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$2 {
65555
65912
  }
65556
65913
  };
65557
65914
 
65558
- var formkitVersion$2 = '202606252337';
65915
+ var formkitVersion$2 = '202606291455';
65559
65916
 
65560
65917
  let AuroElement$2$1 = class AuroElement extends i$2 {
65561
65918
  static get properties() {
@@ -77273,13 +77630,6 @@ class AuroInputUtilities {
77273
77630
  * @returns {string | undefined}
77274
77631
  */
77275
77632
  toFormattedValue(valueObject, format) {
77276
- // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
77277
- // `format` argument has to fail gracefully rather than throw on
77278
- // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
77279
- // as "no format → no display value".
77280
- if (!format) {
77281
- return undefined;
77282
- }
77283
77633
  const normalizedFormat = format.toLowerCase();
77284
77634
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
77285
77635
 
@@ -77430,18 +77780,79 @@ class BaseInput extends AuroElement$1$1 {
77430
77780
  constructor() {
77431
77781
  super();
77432
77782
 
77433
- // Single-source initialization. Alphabetized so duplicate or stale
77434
- // defaults are immediately obvious on a diff. Every field is assigned
77435
- // exactly once here (previously the constructor + the old
77436
- // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
77437
- // fields and double-allocated `util` and `validation`, discarding the
77438
- // first instance). `validation` is now allocated exactly once; `util`
77439
- // is seeded here with an en-US default and then rebuilt in
77440
- // `connectedCallback` once the consumer-resolved locale is available,
77441
- // so a parent (datepicker/combobox) calling `validate()` synchronously
77442
- // during its own update cycle sees a populated util instance.
77783
+ this.appearance = "default";
77784
+ this.disabled = false;
77785
+ this.layout = 'classic';
77786
+ this.locale = 'en-US';
77787
+ this.max = undefined;
77788
+ this._maxObject = undefined;
77789
+ this.maxLength = undefined;
77790
+ this.min = undefined;
77791
+ this._minObject = undefined;
77792
+ this.minLength = undefined;
77793
+ this.required = false;
77794
+ this.onDark = false;
77795
+ this.setCustomValidityForType = undefined;
77796
+ this.size = 'lg';
77797
+ this.shape = 'classic';
77798
+ this.value = undefined;
77799
+ this._valueObject = undefined;
77800
+
77801
+ this._initializePrivateDefaults();
77802
+ }
77803
+
77804
+ /**
77805
+ * Internal Defaults.
77806
+ * @private
77807
+ * @returns {void}
77808
+ */
77809
+ _initializePrivateDefaults() {
77443
77810
  this.activeLabel = false;
77444
- /** @private */
77811
+ this.appearance = "default";
77812
+ this.icon = false;
77813
+ this.disabled = false;
77814
+ this.dvInputOnly = false;
77815
+ this.hideLabelVisually = false;
77816
+ this.max = undefined;
77817
+ this.maxLength = undefined;
77818
+ this.min = undefined;
77819
+ this.minLength = undefined;
77820
+ this.noValidate = false;
77821
+ this.onDark = false;
77822
+ this.required = false;
77823
+ this.setCustomValidityForType = undefined;
77824
+
77825
+ // Used for storing raw values returned from input mask.
77826
+ this._rawMaskValue = undefined;
77827
+
77828
+ /**
77829
+ * @private
77830
+ */
77831
+ this.layout = 'classic';
77832
+
77833
+ /**
77834
+ * @private
77835
+ */
77836
+ this.shape = 'classic';
77837
+
77838
+ /**
77839
+ * @private
77840
+ */
77841
+ this.size = 'lg';
77842
+
77843
+ this.touched = false;
77844
+ this.util = new AuroInputUtilities({
77845
+ locale: "en-US",
77846
+ format: this.format
77847
+ });
77848
+ this.validation = new AuroFormValidation$2();
77849
+ this.inputIconName = undefined;
77850
+ this.showPassword = false;
77851
+ this.validationCCLength = undefined;
77852
+ this.hasValue = false;
77853
+ this.label = 'Input label is undefined';
77854
+
77855
+
77445
77856
  this.allowedInputTypes = [
77446
77857
  "text",
77447
77858
  "number",
@@ -77450,8 +77861,7 @@ class BaseInput extends AuroElement$1$1 {
77450
77861
  "credit-card",
77451
77862
  "tel"
77452
77863
  ];
77453
- this.appearance = "default";
77454
- /** @private */
77864
+ this.icon = false;
77455
77865
  this.dateFormatMap = {
77456
77866
  'mm/dd/yyyy': 'dateMMDDYYYY',
77457
77867
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -77468,57 +77878,27 @@ class BaseInput extends AuroElement$1$1 {
77468
77878
  'dd/mm': 'dateDDMM',
77469
77879
  'mm/dd': 'dateMMDD'
77470
77880
  };
77471
- this.disabled = false;
77472
- /** @private */
77473
77881
  this.domHandler = new DomHandler();
77474
77882
  this.dvInputOnly = false;
77475
77883
  this.hasValue = false;
77476
- this.hideLabelVisually = false;
77477
- this.icon = false;
77478
- /** @private */
77479
77884
  this.inputIconName = undefined;
77480
- /** @private */
77481
77885
  this.label = 'Input label is undefined';
77482
- this.layout = 'classic';
77483
- this.locale = 'en-US';
77484
- this.max = undefined;
77485
- this._maxObject = undefined;
77486
- this.maxLength = undefined;
77487
- this.min = undefined;
77488
- this._minObject = undefined;
77489
- this.minLength = undefined;
77490
77886
  this.noValidate = false;
77491
- this.onDark = false;
77492
- // Raw values returned from the input mask before model normalization.
77493
- this._rawMaskValue = undefined;
77494
- this.required = false;
77495
- this.setCustomValidityForType = undefined;
77496
- // Credit Card is intentionally excluded — its mask manages the cursor
77497
- // itself, and listing it here caused cursor placement issues in Safari.
77498
- /** @private */
77887
+ this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
77499
77888
  this.setSelectionInputTypes = [
77500
77889
  "text",
77501
77890
  "password",
77502
77891
  "email"
77503
- ];
77504
- this.shape = 'classic';
77505
- /** @private */
77892
+ ]; // Credit Card is not included as this caused cursor placement issues in Safari.
77506
77893
  this.showPassword = false;
77507
- this.size = 'lg';
77508
77894
  this.touched = false;
77509
- /** @private */
77510
77895
  this.uniqueId = new UniqueId().create();
77511
- /** @private */
77512
77896
  this.util = new AuroInputUtilities({
77513
77897
  locale: this.locale,
77514
77898
  format: this.format
77515
77899
  });
77516
- /** @private */
77517
77900
  this.validation = new AuroFormValidation$2();
77518
- /** @private */
77519
77901
  this.validationCCLength = undefined;
77520
- this.value = undefined;
77521
- this._valueObject = undefined;
77522
77902
  }
77523
77903
 
77524
77904
  // function to define props used within the scope of this component
@@ -78066,15 +78446,6 @@ class BaseInput extends AuroElement$1$1 {
78066
78446
 
78067
78447
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
78068
78448
 
78069
- // Normalize the format token to lowercase so case-mixed values supplied
78070
- // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
78071
- // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
78072
- // format silently misses the map and leaves `setCustomValidityForType`
78073
- // unset.
78074
- if (this.format) {
78075
- this.format = this.format.toLowerCase();
78076
- }
78077
-
78078
78449
  // use validity message override if declared when initializing the component
78079
78450
  if (this.hasAttribute('setCustomValidity')) {
78080
78451
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -78508,38 +78879,6 @@ class BaseInput extends AuroElement$1$1 {
78508
78879
  this.touched = true;
78509
78880
  this.validation.validate(this);
78510
78881
  }
78511
-
78512
- // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
78513
- // update that can re-render the input and reset the native cursor; we
78514
- // capture the caret position before that update commits and restore it
78515
- // via `setSelectionRange` once the update has flushed. Gated on
78516
- // `setSelectionInputTypes` so credit-card (and other masked types whose
78517
- // formatter manages the cursor itself) doesn't get a competing write.
78518
- // Capture the caret position INSIDE the gate — reading `selectionStart`
78519
- // on input types that don't support text selection (number, email in
78520
- // some browsers) throws InvalidStateError, which would crash all input
78521
- // handling. Wrap the read in try/catch belt-and-suspenders even though
78522
- // the gated types currently support it, since the list is a public
78523
- // property a consumer could mutate.
78524
- if (this.setSelectionInputTypes.includes(this.type)) {
78525
- let selectionStart;
78526
- try {
78527
- selectionStart = this.inputElement.selectionStart;
78528
- } catch (error) { // eslint-disable-line no-unused-vars
78529
- return;
78530
- }
78531
- if (typeof selectionStart !== 'number') {
78532
- return;
78533
- }
78534
- this.updateComplete.then(() => {
78535
- try {
78536
- this.inputElement.setSelectionRange(selectionStart, selectionStart);
78537
- } catch (error) { // eslint-disable-line no-unused-vars
78538
- // Some input types (number/email in certain UAs) throw on
78539
- // setSelectionRange; swallow and let the native cursor stand.
78540
- }
78541
- });
78542
- }
78543
78882
  }
78544
78883
 
78545
78884
  /**
@@ -79166,7 +79505,7 @@ let AuroHelpText$1$1 = class AuroHelpText extends i$2 {
79166
79505
  }
79167
79506
  };
79168
79507
 
79169
- var formkitVersion$1$1 = '202606252337';
79508
+ var formkitVersion$1$1 = '202606291455';
79170
79509
 
79171
79510
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
79172
79511
  // See LICENSE in the project root for license information.
@@ -79669,7 +80008,6 @@ class AuroInput extends BaseInput {
79669
80008
  <${this.buttonTag}
79670
80009
  @click="${this.handleClickShowPassword}"
79671
80010
  appearance="${this.onDark ? 'inverse' : this.appearance}"
79672
- aria-pressed="${this.showPassword ? 'true' : 'false'}"
79673
80011
  class="notificationBtn passwordBtn"
79674
80012
  shape="circle"
79675
80013
  size="sm"
@@ -79743,29 +80081,25 @@ class AuroInput extends BaseInput {
79743
80081
  * @returns {html} - Returns HTML for the help text and error message.
79744
80082
  */
79745
80083
  renderHtmlHelpText() {
79746
- // Single `<p>` with stable identity across validity transitions —
79747
- // previously two distinct templates (valid vs invalid) caused Lit to
79748
- // replace the node entirely on a flip, and VoiceOver wouldn't
79749
- // re-announce because the live-region element it was watching had been
79750
- // removed and a new one inserted. Keeping one node means the `role`,
79751
- // `aria-live`, and text content all change in-place, which AT does
79752
- // observe and announce.
79753
- const isError = this.validity && this.validity !== 'valid';
79754
80084
  return u$d`
79755
- <${this.helpTextTag}
79756
- appearance="${this.onDark ? 'inverse' : this.appearance}"
79757
- ?error=${isError}>
79758
- <p
79759
- id="${this.uniqueId}"
79760
- part="helpText"
79761
- role="${o$4(isError ? 'alert' : undefined)}"
79762
- aria-live="${o$4(isError ? 'assertive' : undefined)}">
79763
- ${isError
79764
- ? this.errorMessage
79765
- : u$d`<slot name="helpText">${this.getHelpText()}</slot>`
79766
- }
79767
- </p>
79768
- </${this.helpTextTag}>
80085
+ ${!this.validity || this.validity === undefined || this.validity === 'valid'
80086
+ ? u$d`
80087
+ <${this.helpTextTag}
80088
+ appearance="${this.onDark ? 'inverse' : this.appearance}">
80089
+ <p id="${this.uniqueId}" part="helpText">
80090
+ <slot name="helpText">${this.getHelpText()}</slot>
80091
+ </p>
80092
+ </${this.helpTextTag}>
80093
+ `
80094
+ : u$d`
80095
+ <${this.helpTextTag} error
80096
+ appearance="${this.onDark ? 'inverse' : this.appearance}">
80097
+ <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
80098
+ ${this.errorMessage}
80099
+ </p>
80100
+ </${this.helpTextTag}>
80101
+ `
80102
+ }
79769
80103
  `;
79770
80104
  }
79771
80105
 
@@ -80292,7 +80626,7 @@ let AuroBibtemplate$1 = class AuroBibtemplate extends i$2 {
80292
80626
  }
80293
80627
  };
80294
80628
 
80295
- var formkitVersion$3 = '202606252337';
80629
+ var formkitVersion$3 = '202606291455';
80296
80630
 
80297
80631
  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}`;
80298
80632
 
@@ -89083,7 +89417,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$2 {
89083
89417
  }
89084
89418
  };
89085
89419
 
89086
- var formkitVersion$1 = '202606252337';
89420
+ var formkitVersion$1 = '202606291455';
89087
89421
 
89088
89422
  class AuroElement extends i$2 {
89089
89423
  static get properties() {
@@ -91104,7 +91438,7 @@ class AuroHelpText extends i$2 {
91104
91438
  }
91105
91439
  }
91106
91440
 
91107
- var formkitVersion = '202606252337';
91441
+ var formkitVersion = '202606291455';
91108
91442
 
91109
91443
  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}`;
91110
91444