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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/components/checkbox/demo/customize.min.js +1 -1
  2. package/components/checkbox/demo/getting-started.min.js +1 -1
  3. package/components/checkbox/demo/index.min.js +1 -1
  4. package/components/checkbox/dist/index.js +1 -1
  5. package/components/checkbox/dist/registered.js +1 -1
  6. package/components/combobox/demo/customize.min.js +96 -119
  7. package/components/combobox/demo/getting-started.min.js +96 -119
  8. package/components/combobox/demo/index.min.js +96 -119
  9. package/components/combobox/dist/index.js +95 -118
  10. package/components/combobox/dist/registered.js +95 -118
  11. package/components/counter/demo/customize.min.js +2 -2
  12. package/components/counter/demo/index.min.js +2 -2
  13. package/components/counter/dist/index.js +2 -2
  14. package/components/counter/dist/registered.js +2 -2
  15. package/components/datepicker/demo/accessibility.md +2 -1
  16. package/components/datepicker/demo/api.md +63 -62
  17. package/components/datepicker/demo/customize.md +12 -1
  18. package/components/datepicker/demo/customize.min.js +716 -336
  19. package/components/datepicker/demo/index.min.js +716 -336
  20. package/components/datepicker/dist/{src/auro-calendar-cell.d.ts → auro-calendar-cell.d.ts} +14 -3
  21. package/components/datepicker/dist/{src/auro-calendar.d.ts → auro-calendar.d.ts} +91 -6
  22. package/components/datepicker/dist/{src/auro-datepicker.d.ts → auro-datepicker.d.ts} +78 -5
  23. package/components/datepicker/dist/blackoutUtils.d.ts +43 -0
  24. package/components/datepicker/dist/index.js +716 -336
  25. package/components/datepicker/dist/registered.js +716 -336
  26. package/components/dropdown/demo/customize.min.js +1 -1
  27. package/components/dropdown/demo/getting-started.min.js +1 -1
  28. package/components/dropdown/demo/index.min.js +1 -1
  29. package/components/dropdown/dist/index.js +1 -1
  30. package/components/dropdown/dist/registered.js +1 -1
  31. package/components/form/demo/customize.min.js +918 -584
  32. package/components/form/demo/getting-started.min.js +918 -584
  33. package/components/form/demo/index.min.js +918 -584
  34. package/components/form/demo/registerDemoDeps.min.js +918 -584
  35. package/components/input/demo/api.md +5 -5
  36. package/components/input/demo/customize.md +8 -8
  37. package/components/input/demo/customize.min.js +93 -116
  38. package/components/input/demo/getting-started.min.js +93 -116
  39. package/components/input/demo/index.min.js +93 -116
  40. package/components/input/dist/base-input.d.ts +44 -33
  41. package/components/input/dist/index.js +94 -129
  42. package/components/input/dist/registered.js +93 -116
  43. package/components/radio/demo/customize.min.js +1 -1
  44. package/components/radio/demo/getting-started.min.js +1 -1
  45. package/components/radio/demo/index.min.js +1 -1
  46. package/components/radio/dist/index.js +1 -1
  47. package/components/radio/dist/registered.js +1 -1
  48. package/components/select/demo/customize.min.js +2 -2
  49. package/components/select/demo/getting-started.min.js +2 -2
  50. package/components/select/demo/index.min.js +2 -2
  51. package/components/select/dist/index.js +2 -2
  52. package/components/select/dist/registered.js +2 -2
  53. package/custom-elements.json +1996 -1914
  54. package/package.json +6 -2
  55. package/components/checkbox/demo/customize.js +0 -22
  56. package/components/checkbox/demo/demo-support.js +0 -1
  57. package/components/checkbox/demo/getting-started.js +0 -22
  58. package/components/checkbox/demo/index.js +0 -8
  59. package/components/checkbox/demo/styles.scss +0 -1
  60. package/components/combobox/demo/customize.js +0 -24
  61. package/components/combobox/demo/demo-support.js +0 -1
  62. package/components/combobox/demo/getting-started.js +0 -21
  63. package/components/combobox/demo/index.js +0 -23
  64. package/components/combobox/demo/styles.scss +0 -1
  65. package/components/counter/demo/customize.js +0 -21
  66. package/components/counter/demo/demo-support.js +0 -1
  67. package/components/counter/demo/index.js +0 -21
  68. package/components/counter/demo/styles.scss +0 -1
  69. package/components/datepicker/demo/customize.js +0 -17
  70. package/components/datepicker/demo/demo-support.js +0 -1
  71. package/components/datepicker/demo/index.js +0 -23
  72. package/components/datepicker/demo/styles.scss +0 -1
  73. package/components/dropdown/demo/customize.js +0 -9
  74. package/components/dropdown/demo/demo-support.js +0 -1
  75. package/components/dropdown/demo/getting-started.js +0 -9
  76. package/components/dropdown/demo/index.js +0 -16
  77. package/components/dropdown/demo/styles.scss +0 -1
  78. package/components/form/demo/customize.js +0 -28
  79. package/components/form/demo/demo-support.js +0 -1
  80. package/components/form/demo/getting-started.js +0 -9
  81. package/components/form/demo/index.js +0 -5
  82. package/components/form/demo/registerDemoDeps.js +0 -23
  83. package/components/form/demo/styles.scss +0 -1
  84. package/components/input/demo/customize.js +0 -25
  85. package/components/input/demo/demo-support.js +0 -1
  86. package/components/input/demo/getting-started.js +0 -8
  87. package/components/input/demo/index.js +0 -8
  88. package/components/input/demo/styles.css +0 -974
  89. package/components/input/demo/styles.scss +0 -1
  90. package/components/menu/demo/demo-support.js +0 -1
  91. package/components/menu/demo/index.js +0 -25
  92. package/components/menu/demo/styles.scss +0 -1
  93. package/components/radio/demo/customize.js +0 -22
  94. package/components/radio/demo/demo-support.js +0 -1
  95. package/components/radio/demo/getting-started.js +0 -24
  96. package/components/radio/demo/index.js +0 -8
  97. package/components/radio/demo/styles.scss +0 -1
  98. package/components/select/demo/customize.js +0 -11
  99. package/components/select/demo/demo-support.js +0 -1
  100. package/components/select/demo/getting-started.js +0 -26
  101. package/components/select/demo/index.js +0 -11
  102. package/components/select/demo/styles.scss +0 -1
  103. /package/components/datepicker/dist/{src/auro-calendar-month.d.ts → auro-calendar-month.d.ts} +0 -0
  104. /package/components/datepicker/dist/{src/buttonVersion.d.ts → buttonVersion.d.ts} +0 -0
  105. /package/components/datepicker/dist/{src/datepickerKeyboardStrategy.d.ts → datepickerKeyboardStrategy.d.ts} +0 -0
  106. /package/components/datepicker/dist/{src/iconVersion.d.ts → iconVersion.d.ts} +0 -0
  107. /package/components/datepicker/dist/{src/index.d.ts → index.d.ts} +0 -0
  108. /package/components/datepicker/dist/{src/popoverVersion.d.ts → popoverVersion.d.ts} +0 -0
  109. /package/components/datepicker/dist/{src/styles → styles}/classic/color-css.d.ts +0 -0
  110. /package/components/datepicker/dist/{src/styles → styles}/classic/style-css.d.ts +0 -0
  111. /package/components/datepicker/dist/{src/styles → styles}/color-calendar-css.d.ts +0 -0
  112. /package/components/datepicker/dist/{src/styles → styles}/color-cell-css.d.ts +0 -0
  113. /package/components/datepicker/dist/{src/styles → styles}/color-css.d.ts +0 -0
  114. /package/components/datepicker/dist/{src/styles → styles}/color-month-css.d.ts +0 -0
  115. /package/components/datepicker/dist/{src/styles → styles}/shapeSize-css.d.ts +0 -0
  116. /package/components/datepicker/dist/{src/styles → styles}/snowflake/color-css.d.ts +0 -0
  117. /package/components/datepicker/dist/{src/styles → styles}/snowflake/style-css.d.ts +0 -0
  118. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-cell-css.d.ts +0 -0
  119. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-css.d.ts +0 -0
  120. /package/components/datepicker/dist/{src/styles → styles}/style-auro-calendar-month-css.d.ts +0 -0
  121. /package/components/datepicker/dist/{src/styles → styles}/style-css.d.ts +0 -0
  122. /package/components/datepicker/dist/{src/styles → styles}/tokens-css.d.ts +0 -0
  123. /package/components/datepicker/dist/{src/utilities.d.ts → utilities.d.ts} +0 -0
  124. /package/components/datepicker/dist/{src/utilitiesCalendar.d.ts → utilitiesCalendar.d.ts} +0 -0
  125. /package/components/datepicker/dist/{src/utilitiesCalendarRender.d.ts → utilitiesCalendarRender.d.ts} +0 -0
  126. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/day.d.ts +0 -0
  127. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker-calendar.d.ts +0 -0
  128. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker-cell.d.ts +0 -0
  129. /package/components/datepicker/dist/{src/vendor → vendor}/wc-range-datepicker/range-datepicker.d.ts +0 -0
@@ -6176,7 +6176,7 @@ function normalizeDates$3(context, ...dates) {
6176
6176
  * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))
6177
6177
  * //=> Tue Sep 02 2014 00:00:00
6178
6178
  */
6179
- function startOfDay$4(date, options) {
6179
+ function startOfDay$3(date, options) {
6180
6180
  const _date = toDate$3(date, options?.in);
6181
6181
  _date.setHours(0, 0, 0, 0);
6182
6182
  return _date;
@@ -6224,8 +6224,8 @@ function differenceInCalendarDays$3(laterDate, earlierDate, options) {
6224
6224
  earlierDate,
6225
6225
  );
6226
6226
 
6227
- const laterStartOfDay = startOfDay$4(laterDate_);
6228
- const earlierStartOfDay = startOfDay$4(earlierDate_);
6227
+ const laterStartOfDay = startOfDay$3(laterDate_);
6228
+ const earlierStartOfDay = startOfDay$3(earlierDate_);
6229
6229
 
6230
6230
  const laterTimestamp =
6231
6231
  +laterStartOfDay - getTimezoneOffsetInMilliseconds$3(laterStartOfDay);
@@ -11497,13 +11497,6 @@ let AuroInputUtilities$3 = class AuroInputUtilities {
11497
11497
  * @returns {string | undefined}
11498
11498
  */
11499
11499
  toFormattedValue(valueObject, format) {
11500
- // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
11501
- // `format` argument has to fail gracefully rather than throw on
11502
- // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
11503
- // as "no format → no display value".
11504
- if (!format) {
11505
- return undefined;
11506
- }
11507
11500
  const normalizedFormat = format.toLowerCase();
11508
11501
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
11509
11502
 
@@ -11654,18 +11647,79 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11654
11647
  constructor() {
11655
11648
  super();
11656
11649
 
11657
- // Single-source initialization. Alphabetized so duplicate or stale
11658
- // defaults are immediately obvious on a diff. Every field is assigned
11659
- // exactly once here (previously the constructor + the old
11660
- // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
11661
- // fields and double-allocated `util` and `validation`, discarding the
11662
- // first instance). `validation` is now allocated exactly once; `util`
11663
- // is seeded here with an en-US default and then rebuilt in
11664
- // `connectedCallback` once the consumer-resolved locale is available,
11665
- // so a parent (datepicker/combobox) calling `validate()` synchronously
11666
- // during its own update cycle sees a populated util instance.
11650
+ this.appearance = "default";
11651
+ this.disabled = false;
11652
+ this.layout = 'classic';
11653
+ this.locale = 'en-US';
11654
+ this.max = undefined;
11655
+ this._maxObject = undefined;
11656
+ this.maxLength = undefined;
11657
+ this.min = undefined;
11658
+ this._minObject = undefined;
11659
+ this.minLength = undefined;
11660
+ this.required = false;
11661
+ this.onDark = false;
11662
+ this.setCustomValidityForType = undefined;
11663
+ this.size = 'lg';
11664
+ this.shape = 'classic';
11665
+ this.value = undefined;
11666
+ this._valueObject = undefined;
11667
+
11668
+ this._initializePrivateDefaults();
11669
+ }
11670
+
11671
+ /**
11672
+ * Internal Defaults.
11673
+ * @private
11674
+ * @returns {void}
11675
+ */
11676
+ _initializePrivateDefaults() {
11667
11677
  this.activeLabel = false;
11668
- /** @private */
11678
+ this.appearance = "default";
11679
+ this.icon = false;
11680
+ this.disabled = false;
11681
+ this.dvInputOnly = false;
11682
+ this.hideLabelVisually = false;
11683
+ this.max = undefined;
11684
+ this.maxLength = undefined;
11685
+ this.min = undefined;
11686
+ this.minLength = undefined;
11687
+ this.noValidate = false;
11688
+ this.onDark = false;
11689
+ this.required = false;
11690
+ this.setCustomValidityForType = undefined;
11691
+
11692
+ // Used for storing raw values returned from input mask.
11693
+ this._rawMaskValue = undefined;
11694
+
11695
+ /**
11696
+ * @private
11697
+ */
11698
+ this.layout = 'classic';
11699
+
11700
+ /**
11701
+ * @private
11702
+ */
11703
+ this.shape = 'classic';
11704
+
11705
+ /**
11706
+ * @private
11707
+ */
11708
+ this.size = 'lg';
11709
+
11710
+ this.touched = false;
11711
+ this.util = new AuroInputUtilities$3({
11712
+ locale: "en-US",
11713
+ format: this.format
11714
+ });
11715
+ this.validation = new AuroFormValidation$7();
11716
+ this.inputIconName = undefined;
11717
+ this.showPassword = false;
11718
+ this.validationCCLength = undefined;
11719
+ this.hasValue = false;
11720
+ this.label = 'Input label is undefined';
11721
+
11722
+
11669
11723
  this.allowedInputTypes = [
11670
11724
  "text",
11671
11725
  "number",
@@ -11674,8 +11728,7 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11674
11728
  "credit-card",
11675
11729
  "tel"
11676
11730
  ];
11677
- this.appearance = "default";
11678
- /** @private */
11731
+ this.icon = false;
11679
11732
  this.dateFormatMap = {
11680
11733
  'mm/dd/yyyy': 'dateMMDDYYYY',
11681
11734
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -11692,57 +11745,27 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
11692
11745
  'dd/mm': 'dateDDMM',
11693
11746
  'mm/dd': 'dateMMDD'
11694
11747
  };
11695
- this.disabled = false;
11696
- /** @private */
11697
11748
  this.domHandler = new DomHandler$3();
11698
11749
  this.dvInputOnly = false;
11699
11750
  this.hasValue = false;
11700
- this.hideLabelVisually = false;
11701
- this.icon = false;
11702
- /** @private */
11703
11751
  this.inputIconName = undefined;
11704
- /** @private */
11705
11752
  this.label = 'Input label is undefined';
11706
- this.layout = 'classic';
11707
- this.locale = 'en-US';
11708
- this.max = undefined;
11709
- this._maxObject = undefined;
11710
- this.maxLength = undefined;
11711
- this.min = undefined;
11712
- this._minObject = undefined;
11713
- this.minLength = undefined;
11714
11753
  this.noValidate = false;
11715
- this.onDark = false;
11716
- // Raw values returned from the input mask before model normalization.
11717
- this._rawMaskValue = undefined;
11718
- this.required = false;
11719
- this.setCustomValidityForType = undefined;
11720
- // Credit Card is intentionally excluded — its mask manages the cursor
11721
- // itself, and listing it here caused cursor placement issues in Safari.
11722
- /** @private */
11754
+ this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
11723
11755
  this.setSelectionInputTypes = [
11724
11756
  "text",
11725
11757
  "password",
11726
11758
  "email"
11727
- ];
11728
- this.shape = 'classic';
11729
- /** @private */
11759
+ ]; // Credit Card is not included as this caused cursor placement issues in Safari.
11730
11760
  this.showPassword = false;
11731
- this.size = 'lg';
11732
11761
  this.touched = false;
11733
- /** @private */
11734
11762
  this.uniqueId = new UniqueId$2().create();
11735
- /** @private */
11736
11763
  this.util = new AuroInputUtilities$3({
11737
11764
  locale: this.locale,
11738
11765
  format: this.format
11739
11766
  });
11740
- /** @private */
11741
11767
  this.validation = new AuroFormValidation$7();
11742
- /** @private */
11743
11768
  this.validationCCLength = undefined;
11744
- this.value = undefined;
11745
- this._valueObject = undefined;
11746
11769
  }
11747
11770
 
11748
11771
  // function to define props used within the scope of this component
@@ -12290,15 +12313,6 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12290
12313
 
12291
12314
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
12292
12315
 
12293
- // Normalize the format token to lowercase so case-mixed values supplied
12294
- // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
12295
- // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
12296
- // format silently misses the map and leaves `setCustomValidityForType`
12297
- // unset.
12298
- if (this.format) {
12299
- this.format = this.format.toLowerCase();
12300
- }
12301
-
12302
12316
  // use validity message override if declared when initializing the component
12303
12317
  if (this.hasAttribute('setCustomValidity')) {
12304
12318
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -12732,38 +12746,6 @@ let BaseInput$2 = class BaseInput extends AuroElement$6 {
12732
12746
  this.touched = true;
12733
12747
  this.validation.validate(this);
12734
12748
  }
12735
-
12736
- // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
12737
- // update that can re-render the input and reset the native cursor; we
12738
- // capture the caret position before that update commits and restore it
12739
- // via `setSelectionRange` once the update has flushed. Gated on
12740
- // `setSelectionInputTypes` so credit-card (and other masked types whose
12741
- // formatter manages the cursor itself) doesn't get a competing write.
12742
- // Capture the caret position INSIDE the gate — reading `selectionStart`
12743
- // on input types that don't support text selection (number, email in
12744
- // some browsers) throws InvalidStateError, which would crash all input
12745
- // handling. Wrap the read in try/catch belt-and-suspenders even though
12746
- // the gated types currently support it, since the list is a public
12747
- // property a consumer could mutate.
12748
- if (this.setSelectionInputTypes.includes(this.type)) {
12749
- let selectionStart;
12750
- try {
12751
- selectionStart = this.inputElement.selectionStart;
12752
- } catch (error) { // eslint-disable-line no-unused-vars
12753
- return;
12754
- }
12755
- if (typeof selectionStart !== 'number') {
12756
- return;
12757
- }
12758
- this.updateComplete.then(() => {
12759
- try {
12760
- this.inputElement.setSelectionRange(selectionStart, selectionStart);
12761
- } catch (error) { // eslint-disable-line no-unused-vars
12762
- // Some input types (number/email in certain UAs) throw on
12763
- // setSelectionRange; swallow and let the native cursor stand.
12764
- }
12765
- });
12766
- }
12767
12749
  }
12768
12750
 
12769
12751
  /**
@@ -13390,7 +13372,7 @@ let AuroHelpText$8 = class AuroHelpText extends i$3 {
13390
13372
  }
13391
13373
  };
13392
13374
 
13393
- var formkitVersion$8 = '202606252337';
13375
+ var formkitVersion$8 = '202606291440';
13394
13376
 
13395
13377
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
13396
13378
  // See LICENSE in the project root for license information.
@@ -13893,7 +13875,6 @@ let AuroInput$2 = class AuroInput extends BaseInput$2 {
13893
13875
  <${this.buttonTag}
13894
13876
  @click="${this.handleClickShowPassword}"
13895
13877
  appearance="${this.onDark ? 'inverse' : this.appearance}"
13896
- aria-pressed="${this.showPassword ? 'true' : 'false'}"
13897
13878
  class="notificationBtn passwordBtn"
13898
13879
  shape="circle"
13899
13880
  size="sm"
@@ -13967,29 +13948,25 @@ let AuroInput$2 = class AuroInput extends BaseInput$2 {
13967
13948
  * @returns {html} - Returns HTML for the help text and error message.
13968
13949
  */
13969
13950
  renderHtmlHelpText() {
13970
- // Single `<p>` with stable identity across validity transitions —
13971
- // previously two distinct templates (valid vs invalid) caused Lit to
13972
- // replace the node entirely on a flip, and VoiceOver wouldn't
13973
- // re-announce because the live-region element it was watching had been
13974
- // removed and a new one inserted. Keeping one node means the `role`,
13975
- // `aria-live`, and text content all change in-place, which AT does
13976
- // observe and announce.
13977
- const isError = this.validity && this.validity !== 'valid';
13978
13951
  return u$c`
13979
- <${this.helpTextTag}
13980
- appearance="${this.onDark ? 'inverse' : this.appearance}"
13981
- ?error=${isError}>
13982
- <p
13983
- id="${this.uniqueId}"
13984
- part="helpText"
13985
- role="${o$4(isError ? 'alert' : undefined)}"
13986
- aria-live="${o$4(isError ? 'assertive' : undefined)}">
13987
- ${isError
13988
- ? this.errorMessage
13989
- : u$c`<slot name="helpText">${this.getHelpText()}</slot>`
13990
- }
13991
- </p>
13992
- </${this.helpTextTag}>
13952
+ ${!this.validity || this.validity === undefined || this.validity === 'valid'
13953
+ ? u$c`
13954
+ <${this.helpTextTag}
13955
+ appearance="${this.onDark ? 'inverse' : this.appearance}">
13956
+ <p id="${this.uniqueId}" part="helpText">
13957
+ <slot name="helpText">${this.getHelpText()}</slot>
13958
+ </p>
13959
+ </${this.helpTextTag}>
13960
+ `
13961
+ : u$c`
13962
+ <${this.helpTextTag} error
13963
+ appearance="${this.onDark ? 'inverse' : this.appearance}">
13964
+ <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
13965
+ ${this.errorMessage}
13966
+ </p>
13967
+ </${this.helpTextTag}>
13968
+ `
13969
+ }
13993
13970
  `;
13994
13971
  }
13995
13972
 
@@ -15479,7 +15456,7 @@ function normalizeDates$1(context, ...dates) {
15479
15456
  * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))
15480
15457
  * //=> Tue Sep 02 2014 00:00:00
15481
15458
  */
15482
- function startOfDay$2(date, options) {
15459
+ function startOfDay$1(date, options) {
15483
15460
  const _date = toDate$1(date, options?.in);
15484
15461
  _date.setHours(0, 0, 0, 0);
15485
15462
  return _date;
@@ -15527,8 +15504,8 @@ function differenceInCalendarDays$1(laterDate, earlierDate, options) {
15527
15504
  earlierDate,
15528
15505
  );
15529
15506
 
15530
- const laterStartOfDay = startOfDay$2(laterDate_);
15531
- const earlierStartOfDay = startOfDay$2(earlierDate_);
15507
+ const laterStartOfDay = startOfDay$1(laterDate_);
15508
+ const earlierStartOfDay = startOfDay$1(earlierDate_);
15532
15509
 
15533
15510
  const laterTimestamp =
15534
15511
  +laterStartOfDay - getTimezoneOffsetInMilliseconds$1(laterStartOfDay);
@@ -24630,13 +24607,6 @@ let AuroInputUtilities$1 = class AuroInputUtilities {
24630
24607
  * @returns {string | undefined}
24631
24608
  */
24632
24609
  toFormattedValue(valueObject, format) {
24633
- // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
24634
- // `format` argument has to fail gracefully rather than throw on
24635
- // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
24636
- // as "no format → no display value".
24637
- if (!format) {
24638
- return undefined;
24639
- }
24640
24610
  const normalizedFormat = format.toLowerCase();
24641
24611
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
24642
24612
 
@@ -24992,8 +24962,8 @@ class RangeDatepickerCell extends i$3 {
24992
24962
  const parsedDateFrom = parseInt(dateFrom, 10);
24993
24963
  const parsedDateTo = parseInt(dateTo, 10);
24994
24964
  if (day) {
24995
- if (getTime(startOfDay$2(parsedDateTo * 1000)) / 1000 === day.date ||
24996
- getTime(startOfDay$2(parsedDateFrom * 1000)) / 1000 === day.date) {
24965
+ if (getTime(startOfDay$1(parsedDateTo * 1000)) / 1000 === day.date ||
24966
+ getTime(startOfDay$1(parsedDateFrom * 1000)) / 1000 === day.date) {
24997
24967
  this.selected = true;
24998
24968
  }
24999
24969
  if (((hoveredDate === day.date || day.date < hoveredDate) &&
@@ -25181,7 +25151,7 @@ class RangeDatepickerCalendar extends i$3 {
25181
25151
  this.dayNamesOfTheWeek = [];
25182
25152
  this.daysOfMonth = [];
25183
25153
  this._locale = null;
25184
- this.currentDate = parseInt(format$1(startOfDay$2(Date.now()), 't'), 10);
25154
+ this.currentDate = parseInt(format$1(startOfDay$1(Date.now()), 't'), 10);
25185
25155
  this.localeChanged();
25186
25156
  this.yearAndMonthChanged(this.year, this.month);
25187
25157
  }
@@ -25655,7 +25625,7 @@ __decorate([n$4({ type: Array })], RangeDatepickerCalendar.prototype, "dayNamesO
25655
25625
  __decorate([n$4({ type: Array })], RangeDatepickerCalendar.prototype, "daysOfMonth", void 0);
25656
25626
  AuroLibraryRuntimeUtils$5$1.prototype.registerComponent('wc-range-datepicker-calendar', RangeDatepickerCalendar);
25657
25627
 
25658
- var styleCss$5$2 = i$6`.body-default{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-default-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-default-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-emphasized-font-size, 1rem);line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.body-lg{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-lg-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-lg-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-sm-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-font-size, 0.875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-sm-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.body-xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-font-size, 0.75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);line-height:var(--wcss-body-xs-emphasized-line-height, 1rem)}.body-2xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-2xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-font-size, 0.625rem);line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-2xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);line-height:var(--wcss-body-2xs-emphasized-line-height, 0.875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-2xl-weight, 300);line-height:var(--wcss-display-2xl-line-height, 1.3);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));letter-spacing:var(--wcss-display-2xl-letter-spacing, 0)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-xl-weight, 300);line-height:var(--wcss-display-xl-line-height, 1.3);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));letter-spacing:var(--wcss-display-xl-letter-spacing, 0)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-lg-weight, 300);line-height:var(--wcss-display-lg-line-height, 1.3);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));letter-spacing:var(--wcss-display-lg-letter-spacing, 0)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-md-weight, 300);line-height:var(--wcss-display-md-line-height, 1.3);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));letter-spacing:var(--wcss-display-md-letter-spacing, 0)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-sm-weight, 300);line-height:var(--wcss-display-sm-line-height, 1.3);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));letter-spacing:var(--wcss-display-sm-letter-spacing, 0)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-xs-weight, 300);line-height:var(--wcss-display-xs-line-height, 1.3);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));letter-spacing:var(--wcss-display-xs-letter-spacing, 0)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-xl-weight, 300);line-height:var(--wcss-heading-xl-line-height, 1.3);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));letter-spacing:var(--wcss-heading-xl-letter-spacing, 0)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-lg-weight, 300);line-height:var(--wcss-heading-lg-line-height, 1.3);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));letter-spacing:var(--wcss-heading-lg-letter-spacing, 0)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-md-weight, 300);line-height:var(--wcss-heading-md-line-height, 1.3);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));letter-spacing:var(--wcss-heading-md-letter-spacing, 0)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-sm-weight, 300);line-height:var(--wcss-heading-sm-line-height, 1.3);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));letter-spacing:var(--wcss-heading-sm-letter-spacing, 0)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-xs-weight, 300);line-height:var(--wcss-heading-xs-line-height, 1.3);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));letter-spacing:var(--wcss-heading-xs-letter-spacing, 0)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-2xs-weight, 300);line-height:var(--wcss-heading-2xs-line-height, 1.3);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-2xl-weight, 450);line-height:var(--wcss-accent-2xl-line-height, 1);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));letter-spacing:var(--wcss-accent-2xl-letter-spacing, 0.05em);text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-xl-weight, 450);line-height:var(--wcss-accent-xl-line-height, 1.3);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));letter-spacing:var(--wcss-accent-xl-letter-spacing, 0.05em);text-transform:uppercase}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-lg-weight, 450);line-height:var(--wcss-accent-lg-line-height, 1.3);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));letter-spacing:var(--wcss-accent-lg-letter-spacing, 0.05em);text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-md-weight, 500);line-height:var(--wcss-accent-md-line-height, 1.3);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));letter-spacing:var(--wcss-accent-md-letter-spacing, 0.05em);text-transform:uppercase}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-sm-weight, 500);line-height:var(--wcss-accent-sm-line-height, 1.3);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));letter-spacing:var(--wcss-accent-sm-letter-spacing, 0.05em);text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-xs-weight, 500);line-height:var(--wcss-accent-xs-line-height, 1.3);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));letter-spacing:var(--wcss-accent-xs-letter-spacing, 0.1em);text-transform:uppercase}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-2xs-weight, 450);line-height:var(--wcss-accent-2xs-line-height, 1.3);font-size:var(--wcss-accent-2xs-font-size, clamp(0.875rem, 1.1666666667vw, 0.875rem));letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);text-transform:uppercase}@media screen and (max-width: 576px){:host{display:flex;justify-content:center}}.day{position:relative;width:48px;height:56px;padding:0;border-width:2px;border-style:solid;border-radius:10px;cursor:pointer;user-select:none}.day:focus-visible{outline:none;background-color:unset}.day.activeCell{outline-width:2px;outline-style:solid;outline-offset:-4px}.day.disabled{cursor:default !important;pointer-events:none}.day.blackout{cursor:pointer}.day.reference:after{position:absolute;top:-2px;left:-2px;display:block;width:calc(100% + 2px);height:calc(100% + 2px);box-sizing:content-box;border-radius:10px;border-style:solid;border-width:1px;content:""}.day.inRange::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:""}.day.rangeDepartDate::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:"";border-radius:10px 0 0 10px;overflow:hidden}.day.rangeReturnDate::before,.day.lastHoveredDate::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:"";border-radius:0 10px 10px 0;overflow:hidden}.day.firstDayOfMonth::before{border-radius:10px 0 0 10px;overflow:hidden}.day.lastDayOfMonth::before{border-radius:0 10px 10px 0;overflow:hidden}.buttonWrapper{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.dateSlot{display:block}::slotted([slot^=date_]){width:100%;white-space:nowrap}::slotted(auro-icon){max-height:24px;max-width:24px}:host([renderForDateSlot]) .buttonWrapper{position:relative;width:100%;height:100%}:host([renderForDateSlot]) .currentDayMarker{position:relative}`;
25628
+ var styleCss$5$2 = i$6`.body-default{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-default-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-default-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-default-emphasized-font-size, 1rem);line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.body-lg{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-lg-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-lg-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-sm-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-font-size, 0.875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-sm-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.body-xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-font-size, 0.75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);line-height:var(--wcss-body-xs-emphasized-line-height, 1rem)}.body-2xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-2xs-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-font-size, 0.625rem);line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-2xs-emphasized-weight, );letter-spacing:var(--wcss-body-letter-spacing, 0);font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);line-height:var(--wcss-body-2xs-emphasized-line-height, 0.875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-2xl-weight, 300);line-height:var(--wcss-display-2xl-line-height, 1.3);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));letter-spacing:var(--wcss-display-2xl-letter-spacing, 0)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-xl-weight, 300);line-height:var(--wcss-display-xl-line-height, 1.3);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));letter-spacing:var(--wcss-display-xl-letter-spacing, 0)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-lg-weight, 300);line-height:var(--wcss-display-lg-line-height, 1.3);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));letter-spacing:var(--wcss-display-lg-letter-spacing, 0)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-md-weight, 300);line-height:var(--wcss-display-md-line-height, 1.3);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));letter-spacing:var(--wcss-display-md-letter-spacing, 0)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-sm-weight, 300);line-height:var(--wcss-display-sm-line-height, 1.3);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));letter-spacing:var(--wcss-display-sm-letter-spacing, 0)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-display-xs-weight, 300);line-height:var(--wcss-display-xs-line-height, 1.3);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));letter-spacing:var(--wcss-display-xs-letter-spacing, 0)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-xl-weight, 300);line-height:var(--wcss-heading-xl-line-height, 1.3);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));letter-spacing:var(--wcss-heading-xl-letter-spacing, 0)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-lg-weight, 300);line-height:var(--wcss-heading-lg-line-height, 1.3);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));letter-spacing:var(--wcss-heading-lg-letter-spacing, 0)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-md-weight, 300);line-height:var(--wcss-heading-md-line-height, 1.3);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));letter-spacing:var(--wcss-heading-md-letter-spacing, 0)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-sm-weight, 300);line-height:var(--wcss-heading-sm-line-height, 1.3);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));letter-spacing:var(--wcss-heading-sm-letter-spacing, 0)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-xs-weight, 300);line-height:var(--wcss-heading-xs-line-height, 1.3);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));letter-spacing:var(--wcss-heading-xs-letter-spacing, 0)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-heading-2xs-weight, 300);line-height:var(--wcss-heading-2xs-line-height, 1.3);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-2xl-weight, 450);line-height:var(--wcss-accent-2xl-line-height, 1);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));letter-spacing:var(--wcss-accent-2xl-letter-spacing, 0.05em);text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-xl-weight, 450);line-height:var(--wcss-accent-xl-line-height, 1.3);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));letter-spacing:var(--wcss-accent-xl-letter-spacing, 0.05em);text-transform:uppercase}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-lg-weight, 450);line-height:var(--wcss-accent-lg-line-height, 1.3);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));letter-spacing:var(--wcss-accent-lg-letter-spacing, 0.05em);text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-md-weight, 500);line-height:var(--wcss-accent-md-line-height, 1.3);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));letter-spacing:var(--wcss-accent-md-letter-spacing, 0.05em);text-transform:uppercase}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-sm-weight, 500);line-height:var(--wcss-accent-sm-line-height, 1.3);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));letter-spacing:var(--wcss-accent-sm-letter-spacing, 0.05em);text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-xs-weight, 500);line-height:var(--wcss-accent-xs-line-height, 1.3);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));letter-spacing:var(--wcss-accent-xs-letter-spacing, 0.1em);text-transform:uppercase}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-weight:var(--wcss-accent-2xs-weight, 450);line-height:var(--wcss-accent-2xs-line-height, 1.3);font-size:var(--wcss-accent-2xs-font-size, clamp(0.875rem, 1.1666666667vw, 0.875rem));letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);text-transform:uppercase}@media screen and (max-width: 576px){:host{display:flex;justify-content:center}}.day{position:relative;width:48px;height:56px;padding:0;border-width:2px;border-style:solid;border-radius:10px;cursor:pointer;user-select:none}.day:focus-visible{outline:none;background-color:unset}.day.activeCell{outline-width:2px;outline-style:solid;outline-offset:-4px}.day.disabled{cursor:default !important;pointer-events:none}.day.blackout{cursor:pointer}.day.reference:after{position:absolute;top:-2px;left:-2px;display:block;width:calc(100% + 2px);height:calc(100% + 2px);box-sizing:content-box;border-radius:10px;border-style:solid;border-width:1px;content:""}.day.inRange::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:""}.day.rangeDepartDate::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:"";border-radius:10px 0 0 10px;overflow:hidden}.day.rangeReturnDate::before,.day.lastHoveredDate::before{position:absolute;z-index:-1;top:-2px;left:-2px;display:block;width:calc(100% + 4px);height:calc(100% + 4px);box-sizing:content-box;content:"";border-radius:0 10px 10px 0;overflow:hidden}.day.rangeDepartDate.lastHoveredDate::before{border-radius:10px}.day.firstDayOfMonth::before{border-radius:10px 0 0 10px;overflow:hidden}.day.lastDayOfMonth::before{border-radius:0 10px 10px 0;overflow:hidden}.buttonWrapper{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.dateSlot{display:block}::slotted([slot^=date_]){width:100%;white-space:nowrap}::slotted(auro-icon){max-height:24px;max-width:24px}:host([renderForDateSlot]) .buttonWrapper{position:relative;width:100%;height:100%}:host([renderForDateSlot]) .currentDayMarker{position:relative}`;
25659
25629
 
25660
25630
  var colorCss$5$2 = i$6`:host ::slotted([slot^=date_]){color:var(--ds-auro-calendar-cell-price-text-color)}:host ::slotted([slot^=date_][highlight]){--ds-auro-calendar-cell-price-text-color: var(--ds-basic-color-status-success, #447a1f)}:host .day{border-color:var(--ds-auro-calendar-cell-border-color);background-color:var(--ds-auro-calendar-cell-container-color);color:var(--ds-auro-calendar-cell-text-color)}:host .day.activeCell:not(.selected){--ds-auro-calendar-cell-container-color: var(--ds-auro-calendar-cell-in-range-color);border-color:var(--ds-advanced-color-state-selected);outline-color:var(--ds-auro-calendar-cell-container-color)}:host .day.selected{--ds-auro-calendar-cell-container-color: var(--ds-advanced-color-state-selected, #01426a);--ds-auro-calendar-cell-text-color: var(--ds-basic-color-texticon-inverse, #ffffff);--ds-auro-calendar-cell-price-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host .day.selected ::slotted([slot^=date_][highlight]){--ds-auro-calendar-cell-price-text-color: var(--ds-basic-color-status-success-subtle, #d6eac7)}:host .day.selected:hover{--ds-auro-calendar-cell-container-color: var(--ds-advanced-color-state-selected-hover, #00274a);--ds-auro-calendar-cell-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host .day.reference:after{border-color:var(--ds-basic-color-border-default, #959595);box-shadow:inset 0 0 0 2px var(--ds-basic-color-surface-default, #ffffff)}:host .day.reference:hover::after{box-shadow:inset 0 0 0 2px var(--ds-advanced-color-shared-background-muted, #f7f7f7)}:host .day:hover{--ds-auro-calendar-cell-container-color: var(--ds-advanced-color-state-background-hover, #f2f2f2);--ds-auro-calendar-cell-text-color: var(--ds-basic-color-texticon-default, #2a2a2a)}:host .day.disabled{--ds-auro-calendar-cell-container-color: transparent;--ds-auro-calendar-cell-text-color: var(--ds-basic-color-texticon-disabled, #d0d0d0);--ds-auro-calendar-cell-price-text-color: var(--ds-basic-color-texticon-disabled, #d0d0d0)}:host .day.blackout{--ds-auro-calendar-cell-container-color: transparent;--ds-auro-calendar-cell-text-color: var(--ds-basic-color-texticon-disabled, #d0d0d0);--ds-auro-calendar-cell-price-text-color: var(--ds-basic-color-texticon-disabled, #d0d0d0)}:host .day.inRange:before,:host .day.rangeDepartDate:before,:host .day.rangeReturnDate:before,:host .day.lastHoveredDate:before{background-color:var(--ds-auro-calendar-cell-in-range-color)}:host .day.sameDateTrip:before{--ds-auro-calendar-cell-in-range-color: transparent}`;
25661
25631
 
@@ -25680,13 +25650,103 @@ class s{registerComponent(e,t){customElements.get(e)||customElements.define(e,cl
25680
25650
 
25681
25651
  var popoverVersion = '6.0.1';
25682
25652
 
25683
- /* 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 */
25653
+ /**
25654
+ * Single source of truth for parsing and matching blackout dates across the
25655
+ * datepicker. Both `auro-calendar` (memoized Set + `isDateBlackout`) and the
25656
+ * pre-`firstUpdated` fallback inside `auro-calendar-cell` route through these
25657
+ * helpers so the YYYY-MM-DD → seconds conversion and the merge-with-legacy
25658
+ * `disabledDays` rules are defined exactly once.
25659
+ */
25684
25660
 
25685
- const startOfDay$1 = (ms) => {
25686
- const date = new Date(ms);
25687
- date.setHours(0, 0, 0, 0);
25688
- return date.getTime();
25689
- };
25661
+ /**
25662
+ * Converts a `YYYY-MM-DD` ISO date string to a Unix timestamp (seconds)
25663
+ * representing local midnight on that calendar day. Returns `null` for
25664
+ * inputs that don't parse to a finite timestamp.
25665
+ *
25666
+ * Uses the `new Date(year, monthIndex, day)` constructor (NOT
25667
+ * `new Date(isoStr)`) so the result is local-midnight rather than UTC
25668
+ * midnight — required to keep the calendar grid aligned with the user's
25669
+ * local calendar day in negative-offset timezones.
25670
+ *
25671
+ * @param {string} isoStr - Date string in `YYYY-MM-DD` format.
25672
+ * @returns {number|null} Local-midnight Unix timestamp (seconds), or null.
25673
+ */
25674
+ function parseIsoToTimestamp(isoStr) {
25675
+ if (typeof isoStr !== 'string') {
25676
+ return null;
25677
+ }
25678
+ const parts = isoStr.split('-');
25679
+ if (parts.length !== 3) {
25680
+ return null;
25681
+ }
25682
+ const year = parseInt(parts[0], 10);
25683
+ const month = parseInt(parts[1], 10);
25684
+ const day = parseInt(parts[2], 10);
25685
+ if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) {
25686
+ return null;
25687
+ }
25688
+ // Reject overflow values like "2024-13-40" — JS `new Date(year, month, day)`
25689
+ // silently normalizes those to a different calendar day, which would
25690
+ // disable the wrong date if we let the result through.
25691
+ if (month < 1 || month > 12 || day < 1 || day > 31) {
25692
+ return null;
25693
+ }
25694
+ const date = new Date(year, month - 1, day);
25695
+ // Guard the residual case where JS still rolls a value (e.g. Feb 30 → Mar 2).
25696
+ // After construction, getFullYear/getMonth/getDate should match the inputs.
25697
+ if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) {
25698
+ return null;
25699
+ }
25700
+ const ts = Math.floor(date.getTime() / 1000);
25701
+ return Number.isFinite(ts) ? ts : null;
25702
+ }
25703
+
25704
+ /**
25705
+ * Builds a `Set<number>` of seconds-since-epoch timestamps covering both the
25706
+ * legacy `disabledDays` (already-numeric) array and the ISO `blackoutDates`
25707
+ * array. Use this for O(1) membership checks in hot paths.
25708
+ *
25709
+ * @param {Array<string|number>|undefined} disabledDays - Legacy timestamp array.
25710
+ * @param {Array<string>|undefined} blackoutDates - ISO `YYYY-MM-DD` array.
25711
+ * @returns {Set<number>}
25712
+ */
25713
+ function buildBlackoutSet(disabledDays, blackoutDates) {
25714
+ const set = new Set();
25715
+ if (Array.isArray(disabledDays)) {
25716
+ for (const day of disabledDays) {
25717
+ const ts = parseInt(day, 10);
25718
+ if (Number.isFinite(ts)) {
25719
+ set.add(ts);
25720
+ }
25721
+ }
25722
+ }
25723
+ if (Array.isArray(blackoutDates)) {
25724
+ for (const isoStr of blackoutDates) {
25725
+ const ts = parseIsoToTimestamp(isoStr);
25726
+ if (ts !== null) {
25727
+ set.add(ts);
25728
+ }
25729
+ }
25730
+ }
25731
+ return set;
25732
+ }
25733
+
25734
+ /**
25735
+ * One-shot membership test for a single timestamp against both blackout
25736
+ * sources. Allocates a Set on each call; only use this in cold paths
25737
+ * (e.g. the pre-`firstUpdated` cell fallback). Hot paths should hold the
25738
+ * Set returned from `buildBlackoutSet` and `.has(ts)` directly.
25739
+ *
25740
+ * @param {number} dateTs - Unix timestamp (seconds) to test.
25741
+ * @param {Array<string|number>|undefined} disabledDays - Legacy timestamp array.
25742
+ * @param {Array<string>|undefined} blackoutDates - ISO `YYYY-MM-DD` array.
25743
+ * @returns {boolean}
25744
+ */
25745
+ function isBlackoutTimestamp(dateTs, disabledDays, blackoutDates) {
25746
+ return buildBlackoutSet(disabledDays, blackoutDates).has(dateTs);
25747
+ }
25748
+
25749
+ /* 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 */
25690
25750
 
25691
25751
  class AuroCalendarCell extends i$3 {
25692
25752
  constructor() {
@@ -25734,6 +25794,14 @@ class AuroCalendarCell extends i$3 {
25734
25794
  type: Boolean,
25735
25795
  reflect: true
25736
25796
  },
25797
+ /**
25798
+ * @deprecated Propagated from the legacy `auro-calendar.disabledDays`
25799
+ * Unix-timestamp array. The cell honors it for backward compatibility
25800
+ * (see the divergence-check fallback inside `isBlackout`), but
25801
+ * consumers should migrate to `auro-datepicker.blackoutDates`
25802
+ * (YYYY-MM-DD ISO strings). The calendar emits a one-time
25803
+ * deprecation warning the first time a non-empty value is observed.
25804
+ */
25737
25805
  disabledDays: { type: Array },
25738
25806
  isCurrentDate: { type: Boolean },
25739
25807
  locale: { type: String },
@@ -25779,8 +25847,8 @@ class AuroCalendarCell extends i$3 {
25779
25847
  const parsedDateTo = parseInt(dateTo, 10);
25780
25848
 
25781
25849
  if (day) {
25782
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
25783
- const returnTimestamp = startOfDay$1(parsedDateTo * 1000) / 1000;
25850
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
25851
+ const returnTimestamp = new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000;
25784
25852
 
25785
25853
  if (day.date === departTimestamp || day.date === returnTimestamp) {
25786
25854
  this.selected = true;
@@ -25864,27 +25932,33 @@ class AuroCalendarCell extends i$3 {
25864
25932
  return false;
25865
25933
  }
25866
25934
 
25867
- // Check against disabledDays timestamps (legacy path)
25868
- if (Array.isArray(this.disabledDays) && this.disabledDays.length > 0 &&
25869
- (this.disabledDays.findIndex(dd => parseInt(dd, 10) === this.day.date) !== -1)) {
25870
- return true;
25871
- }
25872
-
25873
- // Check against blackoutDates (ISO format YYYY-MM-DD) on the datepicker
25874
- const blackoutDates = this.datepicker?.blackoutDates;
25875
-
25876
- if (Array.isArray(blackoutDates) && blackoutDates.length > 0) {
25877
- const date = new Date(this.day.date * 1000);
25878
- const yyyy = date.getFullYear();
25879
- const mm = String(date.getMonth() + 1).padStart(2, '0');
25880
- const dd = String(date.getDate()).padStart(2, '0');
25881
- const cellDate = `${yyyy}-${mm}-${dd}`;
25882
- if (blackoutDates.includes(cellDate)) {
25935
+ // Delegate to the calendar's memoized blackout Set for O(1) lookup
25936
+ // (instead of rescanning disabledDays + blackoutDates per render). The
25937
+ // Set is rebuilt only when either source array reference changes — see
25938
+ // auro-calendar.js#_getBlackoutSet.
25939
+ if (this.calendar && typeof this.calendar._getBlackoutSet === 'function') {
25940
+ if (this.calendar._getBlackoutSet().has(this.day.date)) {
25883
25941
  return true;
25884
25942
  }
25943
+ // If the cell's local disabledDays diverged from the calendar's (a
25944
+ // consumer or test mutated cell.disabledDays directly), the Set does
25945
+ // not reflect that addition — fall through to the per-cell scan only
25946
+ // when the reference no longer matches. Production data flow keeps
25947
+ // these identical, so this branch stays cold. Guarded with
25948
+ // Array.isArray to match `_getBlackoutSet`'s contract: non-array
25949
+ // values are treated as empty rather than crashing on `.findIndex`.
25950
+ if (Array.isArray(this.disabledDays) && this.disabledDays !== this.calendar.disabledDays && this.disabledDays.length > 0) {
25951
+ if (this.disabledDays.findIndex((dd) => parseInt(dd, 10) === this.day.date) !== -1) {
25952
+ return true;
25953
+ }
25954
+ }
25955
+ return false;
25885
25956
  }
25886
25957
 
25887
- return false;
25958
+ // Pre-firstUpdated fallback — the cell may render once before the
25959
+ // ancestor calendar is wired up. Routes through the shared
25960
+ // blackoutUtils helper so the parsing rules stay in one place.
25961
+ return isBlackoutTimestamp(this.day.date, this.disabledDays, this.datepicker?.blackoutDates);
25888
25962
  }
25889
25963
 
25890
25964
  /**
@@ -25990,12 +26064,12 @@ class AuroCalendarCell extends i$3 {
25990
26064
  const parsedDateFrom = Number.parseInt(this.dateFrom, 10);
25991
26065
  if (!Number.isFinite(parsedDateFrom)) return null;
25992
26066
 
25993
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
26067
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
25994
26068
  const dayDate = this.day.date;
25995
26069
 
25996
26070
  const parsedDateTo = Number.parseInt(this.dateTo, 10);
25997
26071
  const hasDateTo = Number.isFinite(parsedDateTo);
25998
- const returnTimestamp = hasDateTo ? startOfDay$1(parsedDateTo * 1000) / 1000 : null;
26072
+ const returnTimestamp = hasDateTo ? new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000 : null;
25999
26073
 
26000
26074
  if (dayDate === departTimestamp) return this.datepicker.rangeLabelStart || 'range start';
26001
26075
 
@@ -26005,7 +26079,9 @@ class AuroCalendarCell extends i$3 {
26005
26079
 
26006
26080
  if (hasDateTo && dayDate > departTimestamp && dayDate < returnTimestamp) return this.datepicker.rangeLabelInRange || 'in range';
26007
26081
 
26008
- // After start date, no end date yet, or after end date
26082
+ if (!hasDateTo && dayDate > departTimestamp) return this.datepicker.rangeLabelEndPreview || 'previewing range end';
26083
+
26084
+ // After end date when both dateFrom and dateTo are set.
26009
26085
  return this.datepicker.rangeLabelAfterRange || 'after range';
26010
26086
  }
26011
26087
 
@@ -26018,7 +26094,7 @@ class AuroCalendarCell extends i$3 {
26018
26094
  */
26019
26095
  isDepartDate(day, dateFrom) {
26020
26096
  const parsedDateFrom = parseInt(dateFrom, 10);
26021
- const departTimestamp = startOfDay$1(parsedDateFrom * 1000) / 1000;
26097
+ const departTimestamp = new Date(parsedDateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
26022
26098
 
26023
26099
  return this.selected && day.date === departTimestamp;
26024
26100
  }
@@ -26033,7 +26109,7 @@ class AuroCalendarCell extends i$3 {
26033
26109
  */
26034
26110
  isReturnDate(day, dateFrom, dateTo) {
26035
26111
  const parsedDateTo = parseInt(dateTo, 10);
26036
- const returnTimestamp = startOfDay$1(parsedDateTo * 1000) / 1000;
26112
+ const returnTimestamp = new Date(parsedDateTo * 1000).setHours(0, 0, 0, 0) / 1000;
26037
26113
 
26038
26114
  return this.selected && day.date === returnTimestamp && dateFrom;
26039
26115
  }
@@ -26197,6 +26273,7 @@ class AuroCalendarCell extends i$3 {
26197
26273
  setTimeout(() => this.firstUpdated(), 0);
26198
26274
  return;
26199
26275
  }
26276
+ this.calendar = calendar;
26200
26277
  this.datepicker = calendar.datepicker;
26201
26278
  this._slotContentHandler = () => {
26202
26279
  this.handleSlotContent();
@@ -26254,12 +26331,13 @@ class AuroCalendarCell extends i$3 {
26254
26331
  this._cachedButton = this.shadowRoot.querySelector('button.day');
26255
26332
  });
26256
26333
 
26257
- // Update host-level aria attributes for ariaActiveDescendantElement.
26334
+ // Keep the host's gridcell aria attributes in sync with the day data.
26258
26335
  this.updateHostAria();
26259
26336
  }
26260
26337
 
26261
26338
  // Update host aria when selection changes (aria-selected, range labels)
26262
- if (properties.has('dateFrom') || properties.has('dateTo') || properties.has('selected')) {
26339
+ // or when isCurrentDate flips (aria-current).
26340
+ if (properties.has('dateFrom') || properties.has('dateTo') || properties.has('selected') || properties.has('isCurrentDate')) {
26263
26341
  this.updateHostAria();
26264
26342
  }
26265
26343
 
@@ -26270,8 +26348,8 @@ class AuroCalendarCell extends i$3 {
26270
26348
  }
26271
26349
 
26272
26350
  /**
26273
- * Updates ARIA attributes on the host element so that
26274
- * ariaActiveDescendantElement can expose cell info to the SR.
26351
+ * Sets host-level ARIA so each cell exposes its date, selection state,
26352
+ * and blackout status to assistive tech browsing the month grid.
26275
26353
  * @private
26276
26354
  * @returns {void}
26277
26355
  */
@@ -26280,16 +26358,27 @@ class AuroCalendarCell extends i$3 {
26280
26358
 
26281
26359
  const outOfRange = this.isOutOfRange(this.day, this.min, this.max);
26282
26360
  if (outOfRange) {
26361
+ // Strip every aria attribute the in-range branch may have set on a
26362
+ // previous render — if a cell flips from in-range to out-of-range
26363
+ // (calendar shifts months, minDate/maxDate change, etc.).
26283
26364
  this.removeAttribute('role');
26284
26365
  this.removeAttribute('aria-label');
26366
+ this.removeAttribute('aria-current');
26367
+ this.removeAttribute('aria-selected');
26368
+ this.removeAttribute('aria-disabled');
26285
26369
  return;
26286
26370
  }
26287
26371
 
26288
- // The host acts as the gridcell for ariaActiveDescendantElement.
26289
26372
  this.setAttribute('role', 'gridcell');
26290
26373
  this.setAttribute('aria-label', this.getAriaLabel());
26291
26374
  this.setAttribute('aria-selected', this.selected ? 'true' : 'false');
26292
26375
 
26376
+ if (this.isCurrentDate) {
26377
+ this.setAttribute('aria-current', 'date');
26378
+ } else {
26379
+ this.removeAttribute('aria-current');
26380
+ }
26381
+
26293
26382
  if (this.isBlackout()) {
26294
26383
  this.setAttribute('aria-disabled', 'true');
26295
26384
  } else {
@@ -26304,7 +26393,7 @@ class AuroCalendarCell extends i$3 {
26304
26393
  * @returns {void}
26305
26394
  */
26306
26395
  focusButton() {
26307
- const button = this._cachedButton || this.shadowRoot.querySelector('button:not([aria-hidden])');
26396
+ const button = this._cachedButton || this.shadowRoot.querySelector('button:not([disabled])');
26308
26397
  if (button) {
26309
26398
  button.focus({ focusVisible: true });
26310
26399
  }
@@ -26312,7 +26401,9 @@ class AuroCalendarCell extends i$3 {
26312
26401
 
26313
26402
  /**
26314
26403
  * Imperatively marks this cell as active without triggering a Lit re-render.
26315
- * Note: buttons stay tabindex="-1" because the grid uses aria-activedescendant.
26404
+ * Buttons stay tabindex="-1" because DOM focus stays on the grid wrapper
26405
+ * arrow keys move the active cell imperatively and the live region carries
26406
+ * the SR announcement.
26316
26407
  * @returns {void}
26317
26408
  */
26318
26409
  setActive() {
@@ -26354,10 +26445,13 @@ class AuroCalendarCell extends i$3 {
26354
26445
  if (!btn || !this.day) return;
26355
26446
 
26356
26447
  const dayDate = this.day.date;
26357
- const departTimestamp = startOfDay$1(dateFrom * 1000) / 1000;
26448
+ const departTimestamp = new Date(dateFrom * 1000).setHours(0, 0, 0, 0) / 1000;
26358
26449
  const isInRange = dayDate > departTimestamp && dayDate < hoveredDate;
26359
- const isLastHovered = dayDate === hoveredDate && hoveredDate > departTimestamp;
26360
- const isDepartWithPreview = dayDate === departTimestamp && hoveredDate > departTimestamp;
26450
+ // `>=` so hovering the depart cell itself (a same-day round-trip
26451
+ // preview) still surfaces a visual cue: the depart cell receives both
26452
+ // rangeDepartDate and lastHoveredDate.
26453
+ const isLastHovered = dayDate === hoveredDate && hoveredDate >= departTimestamp;
26454
+ const isDepartWithPreview = dayDate === departTimestamp && hoveredDate >= departTimestamp;
26361
26455
 
26362
26456
  btn.classList.toggle('inRange', isInRange);
26363
26457
  btn.classList.toggle('lastHoveredDate', isLastHovered);
@@ -26415,7 +26509,6 @@ class AuroCalendarCell extends i$3 {
26415
26509
  @focus="${outOfRange ? undefined : this.handleFocus}"
26416
26510
  class="${e$2(buttonClasses)}"
26417
26511
  ?disabled="${outOfRange}"
26418
- aria-hidden="${outOfRange ? 'true' : A$7}"
26419
26512
  tabindex="-1">
26420
26513
  <div class="buttonWrapper" aria-hidden="true">
26421
26514
  <div class="currentDayMarker">${this.day?.title || A$7}</div>
@@ -27521,7 +27614,7 @@ let AuroBibtemplate$3 = class AuroBibtemplate extends i$3 {
27521
27614
  }
27522
27615
  };
27523
27616
 
27524
- var formkitVersion$2$1 = '202606252337';
27617
+ var formkitVersion$2$1 = '202606291440';
27525
27618
 
27526
27619
  let l$1$2 = class l{generateElementName(t,e){let o=t;return o+="-",o+=e.replace(/[.]/g,"_"),o}generateTag(o,s,a){const r=this.generateElementName(o,s),i=i$2`${s$3(r)}`;return customElements.get(r)||customElements.define(r,class extends a{}),i}};let d$1$2 = class d{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}getSlotText(t,e){const o=t.shadowRoot?.querySelector(`slot[name="${e}"]`),s=(o?.assignedNodes({flatten:true})||[]).map(t=>t.textContent?.trim()).join(" ").trim();return s||null}};let h$1$2 = class h{registerComponent(t,e){customElements.get(t)||customElements.define(t,class extends e{});}closestElement(t,e=this,o=(e,s=e&&e.closest(t))=>e&&e!==document&&e!==window?s||o(e.getRootNode().host):null){return o(e)}handleComponentTagRename(t,e){const o=e.toLowerCase();t.tagName.toLowerCase()!==o&&t.setAttribute(o,true);}elementMatch(t,e){const o=e.toLowerCase();return t.tagName.toLowerCase()===o||t.hasAttribute(o)}};var c$1$3=i$6`:host{color:var(--ds-auro-loader-color)}:host>span{background-color:var(--ds-auro-loader-background-color);border-color:var(--ds-auro-loader-border-color)}:host([onlight]),:host([appearance=brand]){--ds-auro-loader-color: var(--ds-basic-color-brand-primary, #01426a)}:host([ondark]),:host([appearance=inverse]){--ds-auro-loader-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host([orbit])>span{--ds-auro-loader-background-color: transparent}:host([orbit])>span:nth-child(1){--ds-auro-loader-border-color: currentcolor;opacity:.25}:host([orbit])>span:nth-child(2){--ds-auro-loader-border-color: currentcolor;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}
27527
27620
  `,u$4$2=i$6`.body-default{font-size:var(--wcss-body-default-font-size, 1rem);line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default,.body-lg{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-lg{font-size:var(--wcss-body-lg-font-size, 1.125rem);line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-sm{font-size:var(--wcss-body-sm-font-size, .875rem);line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm,.body-xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-xs{font-size:var(--wcss-body-xs-font-size, .75rem);line-height:var(--wcss-body-xs-line-height, 1rem)}.body-2xs{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:var(--wcss-body-2xs-font-size, .625rem);font-weight:var(--wcss-body-weight, 450);letter-spacing:var(--wcss-body-letter-spacing, 0);line-height:var(--wcss-body-2xs-line-height, .875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));font-weight:var(--wcss-display-2xl-weight, 300);letter-spacing:var(--wcss-display-2xl-letter-spacing, 0);line-height:var(--wcss-display-2xl-line-height, 1.3)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));font-weight:var(--wcss-display-xl-weight, 300);letter-spacing:var(--wcss-display-xl-letter-spacing, 0);line-height:var(--wcss-display-xl-line-height, 1.3)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));font-weight:var(--wcss-display-lg-weight, 300);letter-spacing:var(--wcss-display-lg-letter-spacing, 0);line-height:var(--wcss-display-lg-line-height, 1.3)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));font-weight:var(--wcss-display-md-weight, 300);letter-spacing:var(--wcss-display-md-letter-spacing, 0);line-height:var(--wcss-display-md-line-height, 1.3)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));font-weight:var(--wcss-display-sm-weight, 300);letter-spacing:var(--wcss-display-sm-letter-spacing, 0);line-height:var(--wcss-display-sm-line-height, 1.3)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));font-weight:var(--wcss-display-xs-weight, 300);letter-spacing:var(--wcss-display-xs-letter-spacing, 0);line-height:var(--wcss-display-xs-line-height, 1.3)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));font-weight:var(--wcss-heading-xl-weight, 300);letter-spacing:var(--wcss-heading-xl-letter-spacing, 0);line-height:var(--wcss-heading-xl-line-height, 1.3)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));font-weight:var(--wcss-heading-lg-weight, 300);letter-spacing:var(--wcss-heading-lg-letter-spacing, 0);line-height:var(--wcss-heading-lg-line-height, 1.3)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));font-weight:var(--wcss-heading-md-weight, 300);letter-spacing:var(--wcss-heading-md-letter-spacing, 0);line-height:var(--wcss-heading-md-line-height, 1.3)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));font-weight:var(--wcss-heading-sm-weight, 300);letter-spacing:var(--wcss-heading-sm-letter-spacing, 0);line-height:var(--wcss-heading-sm-line-height, 1.3)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));font-weight:var(--wcss-heading-xs-weight, 450);letter-spacing:var(--wcss-heading-xs-letter-spacing, 0);line-height:var(--wcss-heading-xs-line-height, 1.3)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));font-weight:var(--wcss-heading-2xs-weight, 450);letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0);line-height:var(--wcss-heading-2xs-line-height, 1.3)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));font-weight:var(--wcss-accent-2xl-weight, 450);letter-spacing:var(--wcss-accent-2xl-letter-spacing, .05em);line-height:var(--wcss-accent-2xl-line-height, 1)}.accent-2xl,.accent-xl{text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));font-weight:var(--wcss-accent-xl-weight, 450);letter-spacing:var(--wcss-accent-xl-letter-spacing, .05em);line-height:var(--wcss-accent-xl-line-height, 1.3)}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));font-weight:var(--wcss-accent-lg-weight, 450);letter-spacing:var(--wcss-accent-lg-letter-spacing, .05em);line-height:var(--wcss-accent-lg-line-height, 1.3)}.accent-lg,.accent-md{text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));font-weight:var(--wcss-accent-md-weight, 500);letter-spacing:var(--wcss-accent-md-letter-spacing, .05em);line-height:var(--wcss-accent-md-line-height, 1.3)}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));font-weight:var(--wcss-accent-sm-weight, 500);letter-spacing:var(--wcss-accent-sm-letter-spacing, .05em);line-height:var(--wcss-accent-sm-line-height, 1.3)}.accent-sm,.accent-xs{text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));font-weight:var(--wcss-accent-xs-weight, 500);letter-spacing:var(--wcss-accent-xs-letter-spacing, .1em);line-height:var(--wcss-accent-xs-line-height, 1.3)}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xs-font-size, clamp(.875rem, 1.1666666667vw, .875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, .1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}:focus:not(:focus-visible){outline:3px solid transparent}:host,:host>span{position:relative}:host{width:2rem;height:2rem;display:inline-block;font-size:0}:host>span{position:absolute;display:inline-block;float:none;top:0;left:0;width:2rem;height:2rem;border-radius:100%;border-style:solid;border-width:0;box-sizing:border-box}:host([xs]),:host([xs])>span{width:1.2rem;height:1.2rem}:host([sm]),:host([sm])>span{width:3rem;height:3rem}:host([md]),:host([md])>span{width:5rem;height:5rem}:host([lg]),:host([lg])>span{width:8rem;height:8rem}:host{--margin: .375rem;--margin-xs: .2rem;--margin-sm: .5rem;--margin-md: .75rem;--margin-lg: 1rem}:host([pulse]),:host([pulse])>span{position:relative}:host([pulse]){width:calc(3rem + var(--margin) * 6);height:calc(1rem + var(--margin) * 2)}:host([pulse])>span{width:1rem;height:1rem;margin:var(--margin);animation:pulse 1.5s ease infinite}:host([pulse][xs]){width:calc(1.95rem + var(--margin-xs) * 6);height:calc(.65rem + var(--margin-xs) * 2)}:host([pulse][xs])>span{margin:var(--margin-xs);width:.65rem;height:.65rem}:host([pulse][sm]){width:calc(6rem + var(--margin-sm) * 6);height:calc(2rem + var(--margin-sm) * 2)}:host([pulse][sm])>span{margin:var(--margin-sm);width:2rem;height:2rem}:host([pulse][md]){width:calc(9rem + var(--margin-md) * 6);height:calc(3rem + var(--margin-md) * 2)}:host([pulse][md])>span{margin:var(--margin-md);width:3rem;height:3rem}:host([pulse][lg]){width:calc(15rem + var(--margin-lg) * 6);height:calc(5rem + var(--margin-lg) * 2)}:host([pulse][lg])>span{margin:var(--margin-lg);width:5rem;height:5rem}:host([pulse])>span:nth-child(1){animation-delay:-.4s}:host([pulse])>span:nth-child(2){animation-delay:-.2s}:host([pulse])>span:nth-child(3){animation-delay:0ms}@keyframes pulse{0%,to{opacity:.1;transform:scale(.9)}50%{opacity:1;transform:scale(1.1)}}:host([orbit]),:host([orbit])>span{opacity:1}:host([orbit])>span{border-width:5px}:host([orbit])>span:nth-child(2){animation:orbit 2s linear infinite}:host([orbit][sm])>span{border-width:8px}:host([orbit][md])>span{border-width:13px}:host([orbit][lg])>span{border-width:21px}@keyframes orbit{0%{transform:rotate(0)}to{transform:rotate(360deg)}}:host([ringworm])>svg{animation:rotate 2s linear infinite;height:100%;width:100%;stroke:currentcolor;stroke-width:8}:host([ringworm]) .path{stroke-dashoffset:0;animation:ringworm 1.5s ease-in-out infinite;stroke-linecap:round}@keyframes rotate{to{transform:rotate(360deg)}}@keyframes ringworm{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}:host([laser]){position:static;width:100%;display:block;height:0;overflow:hidden;font-size:unset}:host([laser])>span{position:fixed;width:100%;height:.25rem;border-radius:0;z-index:100}:host([laser])>span:nth-child(1){border-color:currentcolor;opacity:.25}:host([laser])>span:nth-child(2){border-color:currentcolor;animation:laser 2s linear infinite;opacity:1;width:50%}:host([laser][sm])>span:nth-child(2){width:20%}:host([laser][md])>span:nth-child(2){width:30%}:host([laser][lg])>span:nth-child(2){width:50%;animation-duration:1.5s}:host([laser][xl])>span:nth-child(2){width:80%;animation-duration:1.5s}@keyframes laser{0%{left:-100%}to{left:110%}}:host>.no-animation{display:none}@media (prefers-reduced-motion: reduce){:host{display:flex;align-items:center;justify-content:center}:host>span{opacity:1}:host>.loader{display:none}:host>svg{display:none}:host>.no-animation{display:block}}
@@ -27644,7 +27737,11 @@ class AuroCalendar extends RangeDatepicker {
27644
27737
  this.calendarRangeMonths = null;
27645
27738
 
27646
27739
  /**
27647
- * Legacy array of disabled-date timestamps.
27740
+ * @deprecated Use `auro-datepicker.blackoutDates` (an array of
27741
+ * `YYYY-MM-DD` ISO strings) instead. This legacy array of Unix
27742
+ * timestamps is still honored for backward compatibility but emits a
27743
+ * one-time `console.debug` the first time a non-empty value is observed.
27744
+ * Support will be removed in a future major release.
27648
27745
  * @private
27649
27746
  */
27650
27747
  this.disabledDays = [];
@@ -27901,17 +27998,44 @@ class AuroCalendar extends RangeDatepicker {
27901
27998
  * @returns {void}
27902
27999
  */
27903
28000
  updateActiveCellForVisibleMonth() {
27904
- // Use double-rAF to ensure child month/cell components have fully
27905
- // rendered and cached their button references before we set tabindex.
27906
- requestAnimationFrame(() => {
27907
- requestAnimationFrame(() => {
27908
- const newDate = this.computeActiveDate({ skipDateFrom: true });
28001
+ this._afterMonthRender(() => {
28002
+ const newDate = this.computeActiveDate({ skipDateFrom: true });
27909
28003
 
27910
- if (newDate !== null && newDate !== undefined) {
27911
- this.activeCellDate = newDate;
27912
- this.setActiveCell(this.activeCellDate);
27913
- }
27914
- });
28004
+ if (newDate !== null && newDate !== undefined) {
28005
+ this.activeCellDate = newDate;
28006
+ this.setActiveCell(this.activeCellDate);
28007
+ }
28008
+ });
28009
+ }
28010
+
28011
+ /**
28012
+ * Schedules `callback` two animation frames out, giving the child
28013
+ * `auro-formkit-calendar-month` and `auro-formkit-calendar-cell` elements
28014
+ * a full render-and-paint cycle to settle before the callback reads or
28015
+ * mutates DOM.
28016
+ *
28017
+ * Why two frames, not one:
28018
+ * 1. Lit batches property updates and renders in a microtask, so frame N
28019
+ * schedules the render but the new DOM may not be painted yet.
28020
+ * 2. Cells re-cache `_cachedButton` inside their own `updateComplete.then`,
28021
+ * which also lands a tick later. Reading buttons from frame N+1
28022
+ * (after both renders + cache refresh have flushed) reliably hits the
28023
+ * new month's cells.
28024
+ *
28025
+ * Used by every code path that calls `handleNextMonth`/`handlePrevMonth`
28026
+ * and then needs to inspect the freshly-rendered cells (cross-month
28027
+ * keyboard nav, boundary events, `updateActiveCellForVisibleMonth`).
28028
+ * Do NOT collapse to a single rAF — it intermittently lands before
28029
+ * `_cachedButton` is refreshed, which silently breaks focus restoration
28030
+ * and `setActiveCell` lookups.
28031
+ * @private
28032
+ * @param {() => void} callback - Runs once after the month re-render and
28033
+ * the cells' button caches have refreshed.
28034
+ * @returns {void}
28035
+ */
28036
+ _afterMonthRender(callback) {
28037
+ requestAnimationFrame(() => {
28038
+ requestAnimationFrame(callback);
27915
28039
  });
27916
28040
  }
27917
28041
 
@@ -28029,6 +28153,47 @@ class AuroCalendar extends RangeDatepicker {
28029
28153
  return Array.from(this.shadowRoot.querySelectorAll('auro-formkit-calendar-month'));
28030
28154
  }
28031
28155
 
28156
+ /**
28157
+ * Picks the focusable cell whose date is closest to targetTs. Used as a
28158
+ * fallback after a month-boundary nav when the exact target date isn't
28159
+ * focusable — typically because the month re-render lagged or the date
28160
+ * was filtered out by isOutOfRange. When two cells are equidistant, the
28161
+ * navigation direction breaks the tie so the user moves the way they
28162
+ * pressed (forward → later cell, backward → earlier cell).
28163
+ * @private
28164
+ * @param {Array} cells - Focusable cells from getAllFocusableCells.
28165
+ * @param {Number} targetTs - Desired Unix timestamp (seconds).
28166
+ * @param {'next'|'prev'} direction - Navigation direction.
28167
+ * @returns {Object|null} The nearest cell, or null when cells is empty.
28168
+ */
28169
+ pickNearestCell(cells, targetTs, direction) {
28170
+ if (!cells.length) {
28171
+ return null;
28172
+ }
28173
+ const forward = direction === 'next';
28174
+ let best = null;
28175
+ let bestDelta = Infinity;
28176
+ cells.forEach((cell) => {
28177
+ if (!cell.day) {
28178
+ return;
28179
+ }
28180
+ const distance = Math.abs(cell.day.date - targetTs);
28181
+ if (distance < bestDelta) {
28182
+ best = cell;
28183
+ bestDelta = distance;
28184
+ return;
28185
+ }
28186
+ if (distance === bestDelta && best) {
28187
+ if (forward && cell.day.date > best.day.date) {
28188
+ best = cell;
28189
+ } else if (!forward && cell.day.date < best.day.date) {
28190
+ best = cell;
28191
+ }
28192
+ }
28193
+ });
28194
+ return best;
28195
+ }
28196
+
28032
28197
  /**
28033
28198
  * Gets all focusable cells across all rendered months.
28034
28199
  * @private
@@ -28045,9 +28210,9 @@ class AuroCalendar extends RangeDatepicker {
28045
28210
 
28046
28211
  /**
28047
28212
  * Sets the active cell across all months. Only one cell has tabindex="0" at a time.
28048
- * Uses imperative DOM manipulation — no Lit re-render triggered.
28049
- * Also updates ariaActiveDescendantElement on the grid wrapper so
28050
- * screen readers announce the active cell without moving DOM focus.
28213
+ * Uses imperative DOM manipulation — no Lit re-render triggered. DOM focus
28214
+ * stays on the grid wrapper; the live region (see getOrCreateLiveRegion)
28215
+ * is what announces the active cell to assistive tech.
28051
28216
  * @param {Number} date - Unix timestamp of the cell to activate.
28052
28217
  * @returns {void}
28053
28218
  */
@@ -28096,10 +28261,23 @@ class AuroCalendar extends RangeDatepicker {
28096
28261
  /**
28097
28262
  * Shows the activeCell ring when the grid gains focus.
28098
28263
  * @private
28264
+ * @param {FocusEvent} [event] - The focusin event.
28099
28265
  * @returns {void}
28100
28266
  */
28101
- handleGridFocusIn() {
28267
+ handleGridFocusIn(event) {
28102
28268
  this._gridHasFocus = true;
28269
+
28270
+ // Only apply the activeCell ring when the grid wrapper itself receives focus
28271
+ // (Tab/programmatic). When focus moves into a cell button via mousedown,
28272
+ // event.target is the cell descendant — skip the ring here. The subsequent
28273
+ // click handler calls setActiveCell on the clicked cell, which applies the
28274
+ // ring there. Without this guard, mousedown briefly flashes the ring on the
28275
+ // previously-active cell (e.g. the 1st-of-month set by month navigation
28276
+ // when the grid was not focused).
28277
+ if (event && event.target !== event.currentTarget) {
28278
+ return;
28279
+ }
28280
+
28103
28281
  const activeCell = this.getAllFocusableCells().find((cell) => cell.active);
28104
28282
  if (activeCell) {
28105
28283
  const btn = activeCell._cachedButton || activeCell.shadowRoot.querySelector('button.day');
@@ -28128,6 +28306,65 @@ class AuroCalendar extends RangeDatepicker {
28128
28306
  this.clearRangePreview();
28129
28307
  }
28130
28308
 
28309
+ /**
28310
+ * Returns a memoized Set of blackout timestamps (seconds) drawn from both
28311
+ * the legacy `disabledDays` array and the datepicker's ISO `blackoutDates`.
28312
+ * The cache invalidates when either source array's reference changes, which
28313
+ * matches Lit's own reactive identity semantics for array properties.
28314
+ * @private
28315
+ * @returns {Set<Number>}
28316
+ */
28317
+ _getBlackoutSet() {
28318
+ // Normalize non-array values to a stable `null` sentinel rather than a
28319
+ // fresh `[]` per call — otherwise the reference-identity cache key
28320
+ // (`_cachedBlackoutDisabledDays === disabledDays`) never matches on
28321
+ // subsequent calls and the Set rebuilds every time. `buildBlackoutSet`
28322
+ // already treats null/non-array as "no legacy disabledDays" via its
28323
+ // own Array.isArray gate.
28324
+ const disabledDays = Array.isArray(this.disabledDays) ? this.disabledDays : null;
28325
+ const blackoutDates = this.datepicker?.blackoutDates;
28326
+ if (this._blackoutSet &&
28327
+ this._cachedBlackoutDisabledDays === disabledDays &&
28328
+ this._cachedBlackoutDates === blackoutDates) {
28329
+ return this._blackoutSet;
28330
+ }
28331
+
28332
+ if (disabledDays && disabledDays.length > 0) {
28333
+ this._warnDisabledDaysDeprecated();
28334
+ }
28335
+
28336
+ this._blackoutSet = buildBlackoutSet(disabledDays, blackoutDates);
28337
+ this._cachedBlackoutDisabledDays = disabledDays;
28338
+ this._cachedBlackoutDates = blackoutDates;
28339
+ return this._blackoutSet;
28340
+ }
28341
+
28342
+ /**
28343
+ * Per-class flag that gates the `disabledDays` deprecation warning so it
28344
+ * fires exactly once per page no matter how many calendars or rebuild
28345
+ * cycles encounter the legacy array.
28346
+ * @private
28347
+ */
28348
+ static _warnedDisabledDaysDeprecation = false;
28349
+
28350
+ /**
28351
+ * One-time `console.debug` directing consumers from the legacy
28352
+ * `disabledDays` Unix-timestamp API to the ISO `blackoutDates` API. Fires
28353
+ * the first time `_getBlackoutSet` rebuilds from a non-empty
28354
+ * `disabledDays`; subsequent calls (on this or any other AuroCalendar
28355
+ * instance on the page) are silent.
28356
+ * @private
28357
+ * @returns {void}
28358
+ */
28359
+ _warnDisabledDaysDeprecated() {
28360
+ if (AuroCalendar._warnedDisabledDaysDeprecation) {
28361
+ return;
28362
+ }
28363
+ AuroCalendar._warnedDisabledDaysDeprecation = true;
28364
+ // eslint-disable-next-line no-console
28365
+ 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.');
28366
+ }
28367
+
28131
28368
  /**
28132
28369
  * Computes the initial active date from data properties alone — no DOM required.
28133
28370
  * Priority:
@@ -28172,21 +28409,10 @@ class AuroCalendar extends RangeDatepicker {
28172
28409
  const minTs = Number.isFinite(rawMin) ? rawMin : -Infinity;
28173
28410
  const maxTs = Number.isFinite(rawMax) ? rawMax : Infinity;
28174
28411
 
28175
- // Build a Set of blackout timestamps for O(1) lookup.
28176
- const blackoutSet = new Set(this.disabledDays.map((day) => parseInt(day, 10)));
28177
-
28178
- // Also include ISO-format blackoutDates from the datepicker if available.
28179
- // Parse YYYY-MM-DD as local date to avoid UTC shift issues.
28180
- const isoBlackouts = this.datepicker?.blackoutDates;
28181
- if (Array.isArray(isoBlackouts)) {
28182
- for (const isoStr of isoBlackouts) {
28183
- const parts = isoStr.split('-');
28184
- const ts = Math.floor(new Date(parseInt(parts[0], 10), parseInt(parts[1], 10) - 1, parseInt(parts[2], 10)).getTime() / 1000);
28185
- if (Number.isFinite(ts)) {
28186
- blackoutSet.add(ts);
28187
- }
28188
- }
28189
- }
28412
+ // Build a Set of blackout timestamps for O(1) lookup. Memoized by the
28413
+ // identity of the source arrays so rapid month nav doesn't rebuild the
28414
+ // Set (and re-parse every ISO string) on every keypress.
28415
+ const blackoutSet = this._getBlackoutSet();
28190
28416
 
28191
28417
  /**
28192
28418
  * A date (unix timestamp in seconds, midnight-aligned) is "enabled" when
@@ -28382,8 +28608,8 @@ class AuroCalendar extends RangeDatepicker {
28382
28608
 
28383
28609
  /**
28384
28610
  * Handles arrow key navigation on the calendar grid wrapper.
28385
- * Focus stays on the grid wrapper; only ariaActiveDescendantElement
28386
- * and the visual active-cell indicator change.
28611
+ * Focus stays on the grid wrapper; only the visual active-cell indicator
28612
+ * changes. The live region announces the new active cell.
28387
28613
  * @private
28388
28614
  * @param {KeyboardEvent} event - The keyboard event.
28389
28615
  * @returns {void}
@@ -28448,21 +28674,21 @@ class AuroCalendar extends RangeDatepicker {
28448
28674
  } else {
28449
28675
  this.handlePrevMonth({ skipActiveUpdate: true });
28450
28676
  }
28451
- requestAnimationFrame(() => {
28452
- requestAnimationFrame(() => {
28453
- const cells = this.getAllFocusableCells();
28454
- const target = cells.find((cell) => cell.day && cell.day.date === targetTs);
28455
- if (target) {
28456
- this.setActiveCell(target.day.date);
28457
- this.handleCellFocused({ detail: { date: target.day.date } });
28458
- } else if (cells.length > 0) {
28459
- const fallback = navDir === 'next' ? cells[cells.length - 1] : cells[0];
28677
+ this._afterMonthRender(() => {
28678
+ const cells = this.getAllFocusableCells();
28679
+ const target = cells.find((cell) => cell.day && cell.day.date === targetTs);
28680
+ if (target) {
28681
+ this.setActiveCell(target.day.date);
28682
+ this.handleCellFocused({ detail: { date: target.day.date } });
28683
+ } else {
28684
+ const fallback = this.pickNearestCell(cells, targetTs, navDir);
28685
+ if (fallback) {
28460
28686
  this.setActiveCell(fallback.day.date);
28461
28687
  this.handleCellFocused({ detail: { date: fallback.day.date } });
28462
28688
  }
28463
- // Re-focus grid wrapper after month change re-render
28464
- this.focusActiveCell();
28465
- });
28689
+ }
28690
+ // Re-focus grid wrapper after month change re-render
28691
+ this.focusActiveCell();
28466
28692
  });
28467
28693
  }
28468
28694
  }
@@ -28488,26 +28714,20 @@ class AuroCalendar extends RangeDatepicker {
28488
28714
  } else {
28489
28715
  this.handlePrevMonth({ skipActiveUpdate: true });
28490
28716
  }
28491
- requestAnimationFrame(() => {
28492
- requestAnimationFrame(() => {
28493
- const cells = this.getAllFocusableCells();
28494
- const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
28495
- if (target) {
28496
- this.setActiveCell(target.day.date);
28497
- this.handleCellFocused({ detail: { date: target.day.date } });
28498
- } else if (cells.length > 0) {
28499
- let nearest = null;
28500
-
28501
- if (navDirection === 'next') {
28502
- [nearest] = cells;
28503
- } else {
28504
- nearest = cells[cells.length - 1];
28505
- }
28717
+ this._afterMonthRender(() => {
28718
+ const cells = this.getAllFocusableCells();
28719
+ const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
28720
+ if (target) {
28721
+ this.setActiveCell(target.day.date);
28722
+ this.handleCellFocused({ detail: { date: target.day.date } });
28723
+ } else {
28724
+ const nearest = this.pickNearestCell(cells, targetDate, navDirection);
28725
+ if (nearest) {
28506
28726
  this.setActiveCell(nearest.day.date);
28507
28727
  this.handleCellFocused({ detail: { date: nearest.day.date } });
28508
28728
  }
28509
- this.focusActiveCell();
28510
- });
28729
+ }
28730
+ this.focusActiveCell();
28511
28731
  });
28512
28732
  }
28513
28733
  }
@@ -28557,19 +28777,22 @@ class AuroCalendar extends RangeDatepicker {
28557
28777
  }
28558
28778
 
28559
28779
  this.handleNextMonth({ skipActiveUpdate: true });
28560
- requestAnimationFrame(() => {
28561
- requestAnimationFrame(() => {
28562
- const cells = this.getAllFocusableCells();
28563
- const target = cells.find((cell) => cell.day && cell.day.date === nextTs);
28564
- if (target) {
28565
- this.setActiveCell(target.day.date);
28566
- this.focusActiveCell();
28567
- } else if (cells.length > 0) {
28568
- // Fallback: first cell of the last rendered month
28569
- this.setActiveCell(cells[cells.length - 1].day.date);
28780
+ this._afterMonthRender(() => {
28781
+ const cells = this.getAllFocusableCells();
28782
+ const target = cells.find((cell) => cell.day && cell.day.date === nextTs);
28783
+ if (target) {
28784
+ this.setActiveCell(target.day.date);
28785
+ this.focusActiveCell();
28786
+ } else {
28787
+ // Same nearest-by-date fallback handleGridKeyDown uses — direct
28788
+ // `cells[length - 1]` would land on the end of the new month,
28789
+ // far from the user's intended `nextTs`.
28790
+ const fallback = this.pickNearestCell(cells, nextTs, 'next');
28791
+ if (fallback) {
28792
+ this.setActiveCell(fallback.day.date);
28570
28793
  this.focusActiveCell();
28571
28794
  }
28572
- });
28795
+ }
28573
28796
  });
28574
28797
  } else if (direction === 'prev' && this.showPrevMonthBtn) {
28575
28798
  // Navigate to previous month and focus the computed previous date.
@@ -28583,19 +28806,22 @@ class AuroCalendar extends RangeDatepicker {
28583
28806
  }
28584
28807
 
28585
28808
  this.handlePrevMonth({ skipActiveUpdate: true });
28586
- requestAnimationFrame(() => {
28587
- requestAnimationFrame(() => {
28588
- const cells = this.getAllFocusableCells();
28589
- const target = cells.find((cell) => cell.day && cell.day.date === prevTs);
28590
- if (target) {
28591
- this.setActiveCell(target.day.date);
28592
- this.focusActiveCell();
28593
- } else if (cells.length > 0) {
28594
- // Fallback: last cell of the first rendered month
28595
- this.setActiveCell(cells[0].day.date);
28809
+ this._afterMonthRender(() => {
28810
+ const cells = this.getAllFocusableCells();
28811
+ const target = cells.find((cell) => cell.day && cell.day.date === prevTs);
28812
+ if (target) {
28813
+ this.setActiveCell(target.day.date);
28814
+ this.focusActiveCell();
28815
+ } else {
28816
+ // Same nearest-by-date fallback handleGridKeyDown uses — direct
28817
+ // `cells[0]` would land on the start of the previous month, far
28818
+ // from the user's intended `prevTs`.
28819
+ const fallback = this.pickNearestCell(cells, prevTs, 'prev');
28820
+ if (fallback) {
28821
+ this.setActiveCell(fallback.day.date);
28596
28822
  this.focusActiveCell();
28597
28823
  }
28598
- });
28824
+ }
28599
28825
  });
28600
28826
  }
28601
28827
  } else if (key === 'ArrowDown' || key === 'ArrowUp') {
@@ -28623,20 +28849,22 @@ class AuroCalendar extends RangeDatepicker {
28623
28849
  } else {
28624
28850
  this.handlePrevMonth({ skipActiveUpdate: true });
28625
28851
  }
28626
- requestAnimationFrame(() => {
28627
- requestAnimationFrame(() => {
28628
- const cells = this.getAllFocusableCells();
28629
- const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
28630
- if (target) {
28631
- this.setActiveCell(target.day.date);
28632
- this.focusActiveCell();
28633
- } else if (cells.length > 0) {
28634
- // Clamp to nearest focusable cell
28635
- const nearest = navDirection === 'next' ? cells[0] : cells[cells.length - 1];
28852
+ this._afterMonthRender(() => {
28853
+ const cells = this.getAllFocusableCells();
28854
+ const target = cells.find((cell) => cell.day && cell.day.date === targetDate);
28855
+ if (target) {
28856
+ this.setActiveCell(target.day.date);
28857
+ this.focusActiveCell();
28858
+ } else {
28859
+ // Same nearest-by-date fallback handleGridKeyDown uses — the
28860
+ // old direction-based `cells[0]`/`cells[length-1]` clamp
28861
+ // could land 25+ days from the intended target.
28862
+ const nearest = this.pickNearestCell(cells, targetDate, navDirection);
28863
+ if (nearest) {
28636
28864
  this.setActiveCell(nearest.day.date);
28637
28865
  this.focusActiveCell();
28638
28866
  }
28639
- });
28867
+ }
28640
28868
  });
28641
28869
  }
28642
28870
  }
@@ -28675,8 +28903,9 @@ class AuroCalendar extends RangeDatepicker {
28675
28903
  return;
28676
28904
  }
28677
28905
 
28678
- // With aria-activedescendant, the button no longer receives native focus,
28679
- // so we use the debounced live region for the full context announcement.
28906
+ // DOM focus stays on the grid wrapper while arrow keys move the active
28907
+ // cell, so cell buttons never receive native focus. The debounced live
28908
+ // region carries the full-context announcement instead.
28680
28909
  const announcement = this.buildFocusAnnouncement(date);
28681
28910
  this.announceFocusDebounced(announcement);
28682
28911
 
@@ -28746,10 +28975,10 @@ class AuroCalendar extends RangeDatepicker {
28746
28975
  return null;
28747
28976
  }
28748
28977
 
28749
- const departTs = startOfDay$2(parsedFrom * 1000) / 1000;
28978
+ const departTs = new Date(parsedFrom * 1000).setHours(0, 0, 0, 0) / 1000;
28750
28979
  const parsedTo = Number.parseInt(this.dateTo, 10);
28751
28980
  const hasTo = Number.isFinite(parsedTo);
28752
- const returnTs = hasTo ? startOfDay$2(parsedTo * 1000) / 1000 : null;
28981
+ const returnTs = hasTo ? new Date(parsedTo * 1000).setHours(0, 0, 0, 0) / 1000 : null;
28753
28982
 
28754
28983
  if (date === departTs) {
28755
28984
  return this.datepicker.rangeLabelStart || 'range start';
@@ -28763,36 +28992,22 @@ class AuroCalendar extends RangeDatepicker {
28763
28992
  if (hasTo && date > departTs && date < returnTs) {
28764
28993
  return this.datepicker.rangeLabelInRange || 'in range';
28765
28994
  }
28995
+ if (!hasTo && date > departTs) {
28996
+ return this.datepicker.rangeLabelEndPreview || 'previewing range end';
28997
+ }
28766
28998
  return this.datepicker.rangeLabelAfterRange || 'after range';
28767
28999
  }
28768
29000
 
28769
29001
  /**
28770
- * Checks whether a given date is a blackout date.
29002
+ * Checks whether a given date is a blackout date. Delegates to the
29003
+ * memoized `_getBlackoutSet` so the YYYY-MM-DD parsing and the
29004
+ * legacy/ISO merge rules live in exactly one place (see `blackoutUtils.js`).
28771
29005
  * @private
28772
29006
  * @param {Number} dateTs - Unix timestamp (seconds).
28773
29007
  * @returns {Boolean} True if the date is blacked out.
28774
29008
  */
28775
29009
  isDateBlackout(dateTs) {
28776
- // Check legacy disabledDays.
28777
- if (Array.isArray(this.disabledDays) && this.disabledDays.length > 0) {
28778
- if (this.disabledDays.findIndex((day) => parseInt(day, 10) === dateTs) !== -1) {
28779
- return true;
28780
- }
28781
- }
28782
-
28783
- // Check ISO blackoutDates.
28784
- const blackoutDates = this.datepicker?.blackoutDates;
28785
- if (Array.isArray(blackoutDates) && blackoutDates.length > 0) {
28786
- const date = new Date(dateTs * 1000);
28787
- const yyyy = date.getFullYear();
28788
- const mm = String(date.getMonth() + 1).padStart(2, '0');
28789
- const dd = String(date.getDate()).padStart(2, '0');
28790
- if (blackoutDates.includes(`${yyyy}-${mm}-${dd}`)) {
28791
- return true;
28792
- }
28793
- }
28794
-
28795
- return false;
29010
+ return this._getBlackoutSet().has(dateTs);
28796
29011
  }
28797
29012
 
28798
29013
  /**
@@ -28959,9 +29174,34 @@ class AuroCalendar extends RangeDatepicker {
28959
29174
  // the last one.
28960
29175
  if (this._announceRafId) {
28961
29176
  cancelAnimationFrame(this._announceRafId);
29177
+ this._announceRafId = null;
28962
29178
  }
29179
+ this._deliverAnnouncement(dateStr, 0);
29180
+ }
29181
+
29182
+ /**
29183
+ * Writes `dateStr` to the live region. If the dropdown's dialog hasn't
29184
+ * mounted yet (so getOrCreateLiveRegion can't attach), retries on the
29185
+ * next animation frame up to MAX_LIVE_REGION_RETRIES instead of silently
29186
+ * dropping the announcement. The retry uses the same `_announceRafId`
29187
+ * the double-rAF below uses, so a newer announceSelection call (or
29188
+ * disconnectedCallback) cancels any in-flight retry.
29189
+ * @private
29190
+ * @param {String} dateStr - The localized date string to announce.
29191
+ * @param {Number} attempts - Number of prior retry attempts.
29192
+ * @returns {void}
29193
+ */
29194
+ _deliverAnnouncement(dateStr, attempts) {
28963
29195
  const liveRegion = this.getOrCreateLiveRegion();
28964
29196
  if (!liveRegion) {
29197
+ const MAX_LIVE_REGION_RETRIES = 10;
29198
+ if (attempts < MAX_LIVE_REGION_RETRIES) {
29199
+ this._announceRafId = requestAnimationFrame(() => {
29200
+ this._deliverAnnouncement(dateStr, attempts + 1);
29201
+ });
29202
+ } else {
29203
+ this._announceRafId = null;
29204
+ }
28965
29205
  return;
28966
29206
  }
28967
29207
 
@@ -29147,7 +29387,7 @@ class AuroCalendar extends RangeDatepicker {
29147
29387
  </button>
29148
29388
  ` : undefined}
29149
29389
  </div>
29150
- <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}">
29390
+ <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}">
29151
29391
  ${this.renderAllCalendars()}
29152
29392
  </div>
29153
29393
  </div>
@@ -33032,7 +33272,7 @@ let AuroHelpText$2$1 = class AuroHelpText extends i$3 {
33032
33272
  }
33033
33273
  };
33034
33274
 
33035
- var formkitVersion$1$3 = '202606252337';
33275
+ var formkitVersion$1$3 = '202606291440';
33036
33276
 
33037
33277
  let AuroElement$2$2 = class AuroElement extends i$3 {
33038
33278
  static get properties() {
@@ -39429,7 +39669,7 @@ function normalizeDates$2(context, ...dates) {
39429
39669
  * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))
39430
39670
  * //=> Tue Sep 02 2014 00:00:00
39431
39671
  */
39432
- function startOfDay$3(date, options) {
39672
+ function startOfDay$2(date, options) {
39433
39673
  const _date = toDate$2(date, options?.in);
39434
39674
  _date.setHours(0, 0, 0, 0);
39435
39675
  return _date;
@@ -39477,8 +39717,8 @@ function differenceInCalendarDays$2(laterDate, earlierDate, options) {
39477
39717
  earlierDate,
39478
39718
  );
39479
39719
 
39480
- const laterStartOfDay = startOfDay$3(laterDate_);
39481
- const earlierStartOfDay = startOfDay$3(earlierDate_);
39720
+ const laterStartOfDay = startOfDay$2(laterDate_);
39721
+ const earlierStartOfDay = startOfDay$2(earlierDate_);
39482
39722
 
39483
39723
  const laterTimestamp =
39484
39724
  +laterStartOfDay - getTimezoneOffsetInMilliseconds$2(laterStartOfDay);
@@ -44750,13 +44990,6 @@ let AuroInputUtilities$2 = class AuroInputUtilities {
44750
44990
  * @returns {string | undefined}
44751
44991
  */
44752
44992
  toFormattedValue(valueObject, format) {
44753
- // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
44754
- // `format` argument has to fail gracefully rather than throw on
44755
- // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
44756
- // as "no format → no display value".
44757
- if (!format) {
44758
- return undefined;
44759
- }
44760
44993
  const normalizedFormat = format.toLowerCase();
44761
44994
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
44762
44995
 
@@ -44907,18 +45140,79 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44907
45140
  constructor() {
44908
45141
  super();
44909
45142
 
44910
- // Single-source initialization. Alphabetized so duplicate or stale
44911
- // defaults are immediately obvious on a diff. Every field is assigned
44912
- // exactly once here (previously the constructor + the old
44913
- // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
44914
- // fields and double-allocated `util` and `validation`, discarding the
44915
- // first instance). `validation` is now allocated exactly once; `util`
44916
- // is seeded here with an en-US default and then rebuilt in
44917
- // `connectedCallback` once the consumer-resolved locale is available,
44918
- // so a parent (datepicker/combobox) calling `validate()` synchronously
44919
- // during its own update cycle sees a populated util instance.
45143
+ this.appearance = "default";
45144
+ this.disabled = false;
45145
+ this.layout = 'classic';
45146
+ this.locale = 'en-US';
45147
+ this.max = undefined;
45148
+ this._maxObject = undefined;
45149
+ this.maxLength = undefined;
45150
+ this.min = undefined;
45151
+ this._minObject = undefined;
45152
+ this.minLength = undefined;
45153
+ this.required = false;
45154
+ this.onDark = false;
45155
+ this.setCustomValidityForType = undefined;
45156
+ this.size = 'lg';
45157
+ this.shape = 'classic';
45158
+ this.value = undefined;
45159
+ this._valueObject = undefined;
45160
+
45161
+ this._initializePrivateDefaults();
45162
+ }
45163
+
45164
+ /**
45165
+ * Internal Defaults.
45166
+ * @private
45167
+ * @returns {void}
45168
+ */
45169
+ _initializePrivateDefaults() {
44920
45170
  this.activeLabel = false;
44921
- /** @private */
45171
+ this.appearance = "default";
45172
+ this.icon = false;
45173
+ this.disabled = false;
45174
+ this.dvInputOnly = false;
45175
+ this.hideLabelVisually = false;
45176
+ this.max = undefined;
45177
+ this.maxLength = undefined;
45178
+ this.min = undefined;
45179
+ this.minLength = undefined;
45180
+ this.noValidate = false;
45181
+ this.onDark = false;
45182
+ this.required = false;
45183
+ this.setCustomValidityForType = undefined;
45184
+
45185
+ // Used for storing raw values returned from input mask.
45186
+ this._rawMaskValue = undefined;
45187
+
45188
+ /**
45189
+ * @private
45190
+ */
45191
+ this.layout = 'classic';
45192
+
45193
+ /**
45194
+ * @private
45195
+ */
45196
+ this.shape = 'classic';
45197
+
45198
+ /**
45199
+ * @private
45200
+ */
45201
+ this.size = 'lg';
45202
+
45203
+ this.touched = false;
45204
+ this.util = new AuroInputUtilities$2({
45205
+ locale: "en-US",
45206
+ format: this.format
45207
+ });
45208
+ this.validation = new AuroFormValidation$6();
45209
+ this.inputIconName = undefined;
45210
+ this.showPassword = false;
45211
+ this.validationCCLength = undefined;
45212
+ this.hasValue = false;
45213
+ this.label = 'Input label is undefined';
45214
+
45215
+
44922
45216
  this.allowedInputTypes = [
44923
45217
  "text",
44924
45218
  "number",
@@ -44927,8 +45221,7 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44927
45221
  "credit-card",
44928
45222
  "tel"
44929
45223
  ];
44930
- this.appearance = "default";
44931
- /** @private */
45224
+ this.icon = false;
44932
45225
  this.dateFormatMap = {
44933
45226
  'mm/dd/yyyy': 'dateMMDDYYYY',
44934
45227
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -44945,57 +45238,27 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
44945
45238
  'dd/mm': 'dateDDMM',
44946
45239
  'mm/dd': 'dateMMDD'
44947
45240
  };
44948
- this.disabled = false;
44949
- /** @private */
44950
45241
  this.domHandler = new DomHandler$2();
44951
45242
  this.dvInputOnly = false;
44952
45243
  this.hasValue = false;
44953
- this.hideLabelVisually = false;
44954
- this.icon = false;
44955
- /** @private */
44956
45244
  this.inputIconName = undefined;
44957
- /** @private */
44958
45245
  this.label = 'Input label is undefined';
44959
- this.layout = 'classic';
44960
- this.locale = 'en-US';
44961
- this.max = undefined;
44962
- this._maxObject = undefined;
44963
- this.maxLength = undefined;
44964
- this.min = undefined;
44965
- this._minObject = undefined;
44966
- this.minLength = undefined;
44967
45246
  this.noValidate = false;
44968
- this.onDark = false;
44969
- // Raw values returned from the input mask before model normalization.
44970
- this._rawMaskValue = undefined;
44971
- this.required = false;
44972
- this.setCustomValidityForType = undefined;
44973
- // Credit Card is intentionally excluded — its mask manages the cursor
44974
- // itself, and listing it here caused cursor placement issues in Safari.
44975
- /** @private */
45247
+ this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
44976
45248
  this.setSelectionInputTypes = [
44977
45249
  "text",
44978
45250
  "password",
44979
45251
  "email"
44980
- ];
44981
- this.shape = 'classic';
44982
- /** @private */
45252
+ ]; // Credit Card is not included as this caused cursor placement issues in Safari.
44983
45253
  this.showPassword = false;
44984
- this.size = 'lg';
44985
45254
  this.touched = false;
44986
- /** @private */
44987
45255
  this.uniqueId = new UniqueId$1().create();
44988
- /** @private */
44989
45256
  this.util = new AuroInputUtilities$2({
44990
45257
  locale: this.locale,
44991
45258
  format: this.format
44992
45259
  });
44993
- /** @private */
44994
45260
  this.validation = new AuroFormValidation$6();
44995
- /** @private */
44996
45261
  this.validationCCLength = undefined;
44997
- this.value = undefined;
44998
- this._valueObject = undefined;
44999
45262
  }
45000
45263
 
45001
45264
  // function to define props used within the scope of this component
@@ -45543,15 +45806,6 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45543
45806
 
45544
45807
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
45545
45808
 
45546
- // Normalize the format token to lowercase so case-mixed values supplied
45547
- // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
45548
- // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
45549
- // format silently misses the map and leaves `setCustomValidityForType`
45550
- // unset.
45551
- if (this.format) {
45552
- this.format = this.format.toLowerCase();
45553
- }
45554
-
45555
45809
  // use validity message override if declared when initializing the component
45556
45810
  if (this.hasAttribute('setCustomValidity')) {
45557
45811
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -45985,38 +46239,6 @@ let BaseInput$1 = class BaseInput extends AuroElement$1$3 {
45985
46239
  this.touched = true;
45986
46240
  this.validation.validate(this);
45987
46241
  }
45988
-
45989
- // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
45990
- // update that can re-render the input and reset the native cursor; we
45991
- // capture the caret position before that update commits and restore it
45992
- // via `setSelectionRange` once the update has flushed. Gated on
45993
- // `setSelectionInputTypes` so credit-card (and other masked types whose
45994
- // formatter manages the cursor itself) doesn't get a competing write.
45995
- // Capture the caret position INSIDE the gate — reading `selectionStart`
45996
- // on input types that don't support text selection (number, email in
45997
- // some browsers) throws InvalidStateError, which would crash all input
45998
- // handling. Wrap the read in try/catch belt-and-suspenders even though
45999
- // the gated types currently support it, since the list is a public
46000
- // property a consumer could mutate.
46001
- if (this.setSelectionInputTypes.includes(this.type)) {
46002
- let selectionStart;
46003
- try {
46004
- selectionStart = this.inputElement.selectionStart;
46005
- } catch (error) { // eslint-disable-line no-unused-vars
46006
- return;
46007
- }
46008
- if (typeof selectionStart !== 'number') {
46009
- return;
46010
- }
46011
- this.updateComplete.then(() => {
46012
- try {
46013
- this.inputElement.setSelectionRange(selectionStart, selectionStart);
46014
- } catch (error) { // eslint-disable-line no-unused-vars
46015
- // Some input types (number/email in certain UAs) throw on
46016
- // setSelectionRange; swallow and let the native cursor stand.
46017
- }
46018
- });
46019
- }
46020
46242
  }
46021
46243
 
46022
46244
  /**
@@ -46643,7 +46865,7 @@ let AuroHelpText$1$3 = class AuroHelpText extends i$3 {
46643
46865
  }
46644
46866
  };
46645
46867
 
46646
- var formkitVersion$7 = '202606252337';
46868
+ var formkitVersion$7 = '202606291440';
46647
46869
 
46648
46870
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
46649
46871
  // See LICENSE in the project root for license information.
@@ -47146,7 +47368,6 @@ let AuroInput$1 = class AuroInput extends BaseInput$1 {
47146
47368
  <${this.buttonTag}
47147
47369
  @click="${this.handleClickShowPassword}"
47148
47370
  appearance="${this.onDark ? 'inverse' : this.appearance}"
47149
- aria-pressed="${this.showPassword ? 'true' : 'false'}"
47150
47371
  class="notificationBtn passwordBtn"
47151
47372
  shape="circle"
47152
47373
  size="sm"
@@ -47220,29 +47441,25 @@ let AuroInput$1 = class AuroInput extends BaseInput$1 {
47220
47441
  * @returns {html} - Returns HTML for the help text and error message.
47221
47442
  */
47222
47443
  renderHtmlHelpText() {
47223
- // Single `<p>` with stable identity across validity transitions —
47224
- // previously two distinct templates (valid vs invalid) caused Lit to
47225
- // replace the node entirely on a flip, and VoiceOver wouldn't
47226
- // re-announce because the live-region element it was watching had been
47227
- // removed and a new one inserted. Keeping one node means the `role`,
47228
- // `aria-live`, and text content all change in-place, which AT does
47229
- // observe and announce.
47230
- const isError = this.validity && this.validity !== 'valid';
47231
47444
  return u$c`
47232
- <${this.helpTextTag}
47233
- appearance="${this.onDark ? 'inverse' : this.appearance}"
47234
- ?error=${isError}>
47235
- <p
47236
- id="${this.uniqueId}"
47237
- part="helpText"
47238
- role="${o$4(isError ? 'alert' : undefined)}"
47239
- aria-live="${o$4(isError ? 'assertive' : undefined)}">
47240
- ${isError
47241
- ? this.errorMessage
47242
- : u$c`<slot name="helpText">${this.getHelpText()}</slot>`
47243
- }
47244
- </p>
47245
- </${this.helpTextTag}>
47445
+ ${!this.validity || this.validity === undefined || this.validity === 'valid'
47446
+ ? u$c`
47447
+ <${this.helpTextTag}
47448
+ appearance="${this.onDark ? 'inverse' : this.appearance}">
47449
+ <p id="${this.uniqueId}" part="helpText">
47450
+ <slot name="helpText">${this.getHelpText()}</slot>
47451
+ </p>
47452
+ </${this.helpTextTag}>
47453
+ `
47454
+ : u$c`
47455
+ <${this.helpTextTag} error
47456
+ appearance="${this.onDark ? 'inverse' : this.appearance}">
47457
+ <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
47458
+ ${this.errorMessage}
47459
+ </p>
47460
+ </${this.helpTextTag}>
47461
+ `
47462
+ }
47246
47463
  `;
47247
47464
  }
47248
47465
 
@@ -47389,15 +47606,6 @@ function formatISODate(isoStr, format) {
47389
47606
  try {
47390
47607
  const date = dateFormatter$2.stringToDateInstance(isoStr);
47391
47608
 
47392
- // `stringToDateInstance` returns an `Invalid Date` for malformed strings
47393
- // and `null` for non-string input — it does NOT throw. Without this
47394
- // guard, `getFullYear()`/`getMonth()`/`getDate()` on an Invalid Date
47395
- // yield `NaN`, and `String(NaN).padStart(4, '0')` produces literals
47396
- // like "0NaN/0NaN/0NaN" instead of `undefined`.
47397
- if (!(date instanceof Date) || Number.isNaN(date.getTime())) {
47398
- return undefined;
47399
- }
47400
-
47401
47609
  const year = String(date.getFullYear()).padStart(4, '0');
47402
47610
  const month = String(date.getMonth() + 1).padStart(2, '0');
47403
47611
  const day = String(date.getDate()).padStart(2, '0');
@@ -47408,10 +47616,7 @@ function formatISODate(isoStr, format) {
47408
47616
  replace(/mm/iu, month).
47409
47617
  replace(/dd/iu, day);
47410
47618
  } catch (err) {
47411
- // Defensive: the Date-returning path is guarded above, but `parseDate`
47412
- // (inside `stringToDateInstance`) could throw on pathological input
47413
- // future-library-versions might introduce. Treat any thrown error as
47414
- // "not a valid date" and return undefined.
47619
+ // If the input string is not a valid date, return undefined
47415
47620
  return undefined;
47416
47621
  }
47417
47622
  }
@@ -48137,6 +48342,7 @@ class AuroDatePicker extends AuroElement$5 {
48137
48342
  this.rangeLabelBeforeRange = 'before range';
48138
48343
  this.rangeLabelInRange = 'in range';
48139
48344
  this.rangeLabelAfterRange = 'after range';
48345
+ this.rangeLabelEndPreview = 'previewing range end';
48140
48346
  this.blackoutDates = [];
48141
48347
  this.blackoutLabel = 'unavailable';
48142
48348
  this.navLabelPrevMonth = 'Previous month';
@@ -48236,6 +48442,22 @@ class AuroDatePicker extends AuroElement$5 {
48236
48442
  */
48237
48443
  this.handleClick = this.handleClick.bind(this);
48238
48444
 
48445
+ /**
48446
+ * Single AbortController shared by every listener registered in the
48447
+ * configure* methods. Lets disconnectedCallback tear all of them down
48448
+ * with one abort() call.
48449
+ *
48450
+ * The genuine leak risk is the listeners attached to children that can
48451
+ * outlive the host if they get reparented — `this.dropdown`,
48452
+ * `this.calendar`, and the inputs inside the dropdown's slot.
48453
+ * Listeners attached to `this` (e.g. focusin/focusout on the host)
48454
+ * form a self-contained reference graph that the GC can collect with
48455
+ * the host anyway, but they share the same signal so the cleanup
48456
+ * pattern stays uniform across all configure* sites.
48457
+ * @private
48458
+ */
48459
+ this._listenerAbortController = new AbortController();
48460
+
48239
48461
  /**
48240
48462
  * @private
48241
48463
  */
@@ -48284,6 +48506,7 @@ class AuroDatePicker extends AuroElement$5 {
48284
48506
 
48285
48507
  /**
48286
48508
  * Label announced for blackout (disabled but in-range) date cells.
48509
+ * @default 'unavailable'
48287
48510
  */
48288
48511
  blackoutLabel: {
48289
48512
  type: String,
@@ -48300,6 +48523,7 @@ class AuroDatePicker extends AuroElement$5 {
48300
48523
 
48301
48524
  /**
48302
48525
  * Accessible label for the calendar grid containing the days of the month.
48526
+ * @default 'Calendar days of the month'
48303
48527
  */
48304
48528
  calendarGridLabel: {
48305
48529
  type: String,
@@ -48462,6 +48686,7 @@ class AuroDatePicker extends AuroElement$5 {
48462
48686
 
48463
48687
  /**
48464
48688
  * Accessible label for the next month navigation button.
48689
+ * @default 'Next month'
48465
48690
  */
48466
48691
  navLabelNextMonth: {
48467
48692
  type: String,
@@ -48470,6 +48695,7 @@ class AuroDatePicker extends AuroElement$5 {
48470
48695
 
48471
48696
  /**
48472
48697
  * Accessible label for the previous month navigation button.
48698
+ * @default 'Previous month'
48473
48699
  */
48474
48700
  navLabelPrevMonth: {
48475
48701
  type: String,
@@ -48547,7 +48773,11 @@ class AuroDatePicker extends AuroElement$5 {
48547
48773
  },
48548
48774
 
48549
48775
  /**
48550
- * Label announced for cells after the range (or after start when no end is selected).
48776
+ * Label announced for cells after a fully selected range (both
48777
+ * `dateFrom` and `dateTo` are set). While a range is still being
48778
+ * picked (`dateFrom` set, `dateTo` unset), focused cells past the
48779
+ * start use `rangeLabelEndPreview` instead.
48780
+ * @default 'after range'
48551
48781
  */
48552
48782
  rangeLabelAfterRange: {
48553
48783
  type: String,
@@ -48556,6 +48786,7 @@ class AuroDatePicker extends AuroElement$5 {
48556
48786
 
48557
48787
  /**
48558
48788
  * Label announced for cells before the range start.
48789
+ * @default 'before range'
48559
48790
  */
48560
48791
  rangeLabelBeforeRange: {
48561
48792
  type: String,
@@ -48564,14 +48795,27 @@ class AuroDatePicker extends AuroElement$5 {
48564
48795
 
48565
48796
  /**
48566
48797
  * Label announced for the range end date cell.
48798
+ * @default 'range end'
48567
48799
  */
48568
48800
  rangeLabelEnd: {
48569
48801
  type: String,
48570
48802
  reflect: true
48571
48803
  },
48572
48804
 
48805
+ /**
48806
+ * Label announced for the focused cell while previewing a range end
48807
+ * (dateFrom set, dateTo not yet selected). Tells AT users that
48808
+ * pressing Enter would commit this cell as the range end.
48809
+ * @default 'previewing range end'
48810
+ */
48811
+ rangeLabelEndPreview: {
48812
+ type: String,
48813
+ reflect: true
48814
+ },
48815
+
48573
48816
  /**
48574
48817
  * Label announced for cells within the selected range.
48818
+ * @default 'in range'
48575
48819
  */
48576
48820
  rangeLabelInRange: {
48577
48821
  type: String,
@@ -48580,6 +48824,7 @@ class AuroDatePicker extends AuroElement$5 {
48580
48824
 
48581
48825
  /**
48582
48826
  * Label announced for the range start date cell.
48827
+ * @default 'range start'
48583
48828
  */
48584
48829
  rangeLabelStart: {
48585
48830
  type: String,
@@ -48587,7 +48832,7 @@ class AuroDatePicker extends AuroElement$5 {
48587
48832
  },
48588
48833
 
48589
48834
  /**
48590
- * Dates that the user should have for reference as part of their decision making when selecting a date.
48835
+ * Dates that the user should have for reference as part of their decision-making when selecting a date.
48591
48836
  * This should be a JSON string array of ISO date strings (`YYYY-MM-DD`).
48592
48837
  */
48593
48838
  referenceDates: {
@@ -48944,10 +49189,26 @@ class AuroDatePicker extends AuroElement$5 {
48944
49189
  // ─── Vendor calendar time conversions ─────────────────────────────────────
48945
49190
 
48946
49191
  /**
48947
- * Converts a Unix timestamp (seconds) from the vendor calendar to an ISO date string.
49192
+ * Converts a Unix timestamp (seconds) from the vendored range-datepicker
49193
+ * (`src/vendor/wc-range-datepicker/day.js`) to an ISO date string.
49194
+ *
49195
+ * Timezone contract:
49196
+ * - INPUT: `time` is assumed to be the seconds-since-epoch of **local
49197
+ * midnight** for the intended calendar day. The vendor's Day constructor
49198
+ * builds it via `date-fns format(date, 't')` from a locally-constructed
49199
+ * Date, so this assumption currently holds end-to-end.
49200
+ * - OUTPUT: `dateFormatter.toISOFormatString` reads the Date's local
49201
+ * getFullYear/getMonth/getDate components, so the returned YYYY-MM-DD
49202
+ * string matches the local calendar day.
49203
+ *
49204
+ * If the vendor ever switches to emitting UTC-midnight timestamps, this
49205
+ * conversion will silently shift the returned date by one day in zones
49206
+ * west of UTC. Any vendor swap should re-verify this contract; the TZ
49207
+ * regression suite (`npm run test:hst`, UTC-10) will catch the symptom.
49208
+ *
48948
49209
  * @private
48949
- * @param {number} time - Unix timestamp in seconds.
48950
- * @returns {string} ISO date string (yyyy-mm-dd).
49210
+ * @param {number} time - Unix timestamp (seconds), local midnight of the day.
49211
+ * @returns {string} ISO date string (yyyy-mm-dd) reflecting the local calendar day.
48951
49212
  */
48952
49213
  convertWcTimeToDate(time) {
48953
49214
  return dateFormatter$1.toISOFormatString(new Date(time * 1000));
@@ -49049,8 +49310,8 @@ class AuroDatePicker extends AuroElement$5 {
49049
49310
  }
49050
49311
  }
49051
49312
 
49052
- // Focus the calendar grid wrapper (aria-activedescendant handles
49053
- // the SR announcement for the active cell).
49313
+ // Focus the calendar grid wrapper. The live region (announced just
49314
+ // below) handles the SR announcement for the active cell.
49054
49315
  if (activeCell) {
49055
49316
  this.calendar.focusActiveCell();
49056
49317
 
@@ -49100,11 +49361,13 @@ class AuroDatePicker extends AuroElement$5 {
49100
49361
  this.dropdown.bibDialogLabel = labelElement.textContent.trim() || undefined;
49101
49362
  }
49102
49363
 
49364
+ const { signal } = this._listenerAbortController;
49365
+
49103
49366
  this.dropdown.addEventListener('auroDropdown-triggerClick', () => {
49104
49367
  if (!this.isPopoverVisible) {
49105
49368
  this.dropdown.show();
49106
49369
  }
49107
- });
49370
+ }, { signal });
49108
49371
 
49109
49372
  this.dropdown.addEventListener('auroDropdown-toggled', () => {
49110
49373
  this.notifyDatepickerToggled();
@@ -49122,7 +49385,7 @@ class AuroDatePicker extends AuroElement$5 {
49122
49385
  if (this.valueObject) {
49123
49386
  this.centralDate = this.value;
49124
49387
  } else if (!this.centralDate && !this.calendarStartDate && !this.minDate) {
49125
- this.centralDate = new Date();
49388
+ this.centralDate = dateFormatter$1.toISOFormatString(new Date());
49126
49389
  }
49127
49390
  }
49128
49391
 
@@ -49202,7 +49465,7 @@ class AuroDatePicker extends AuroElement$5 {
49202
49465
  this.forceScrollOnNextMobileCalendarRender = false;
49203
49466
  }, 0);
49204
49467
  }
49205
- });
49468
+ }, { signal });
49206
49469
 
49207
49470
  // Handle responsive strategy changes while the dropdown is open
49208
49471
  // (e.g. resizing from desktop → mobile or vice versa).
@@ -49249,7 +49512,7 @@ class AuroDatePicker extends AuroElement$5 {
49249
49512
  });
49250
49513
  });
49251
49514
  }
49252
- });
49515
+ }, { signal });
49253
49516
  }
49254
49517
 
49255
49518
  /**
@@ -49262,6 +49525,8 @@ class AuroDatePicker extends AuroElement$5 {
49262
49525
 
49263
49526
  this.inputList = [...this.dropdown.querySelectorAll(this.inputTag._$litStatic$)];
49264
49527
 
49528
+ const { signal } = this._listenerAbortController;
49529
+
49265
49530
  this.inputList.forEach((input, index) => {
49266
49531
  input.addEventListener('input', (event) => {
49267
49532
  event.stopPropagation();
@@ -49273,7 +49538,7 @@ class AuroDatePicker extends AuroElement$5 {
49273
49538
  }
49274
49539
 
49275
49540
  this.notifyValueChanged();
49276
- });
49541
+ }, { signal });
49277
49542
 
49278
49543
  input.addEventListener('auroFormElement-validated', (evt) => {
49279
49544
  // not to bubble up input's validated event.
@@ -49289,7 +49554,7 @@ class AuroDatePicker extends AuroElement$5 {
49289
49554
  this.validity = evt.detail.validity;
49290
49555
  this.errorMessage = evt.detail.message;
49291
49556
  }
49292
- });
49557
+ }, { signal });
49293
49558
  });
49294
49559
  }
49295
49560
 
@@ -49303,19 +49568,32 @@ class AuroDatePicker extends AuroElement$5 {
49303
49568
  this.calendar.datepicker = this;
49304
49569
  this.calendar.dropdown = this.dropdown;
49305
49570
 
49571
+ const { signal } = this._listenerAbortController;
49572
+
49306
49573
  this.calendar.addEventListener('auroCalendar-dateSelected', () => {
49307
- if (this.inputList[0].value !== this.calendar.dateFrom && this.calendar.dateFrom !== undefined) {
49308
- this.inputList[0].value = this.convertWcTimeToDate(this.calendar.dateFrom);
49574
+ // Compare the input's ISO value against the *converted* calendar
49575
+ // timestamp (the vendor's `dateFrom`/`dateTo` are Unix-seconds
49576
+ // strings — comparing the input ISO directly against them would
49577
+ // never match, so the write would fire on every event and emit
49578
+ // redundant input/change activity).
49579
+ if (this.calendar.dateFrom !== undefined) {
49580
+ const fromIso = this.convertWcTimeToDate(this.calendar.dateFrom);
49581
+ if (this.inputList[0].value !== fromIso) {
49582
+ this.inputList[0].value = fromIso;
49583
+ }
49309
49584
  }
49310
49585
 
49311
- if (this.inputList[1] && this.calendar.dateTo && this.inputList[1].value !== this.calendar.dateTo) {
49312
- this.inputList[1].value = this.convertWcTimeToDate(this.calendar.dateTo);
49586
+ if (this.inputList[1] && this.calendar.dateTo) {
49587
+ const toIso = this.convertWcTimeToDate(this.calendar.dateTo);
49588
+ if (this.inputList[1].value !== toIso) {
49589
+ this.inputList[1].value = toIso;
49590
+ }
49313
49591
  }
49314
- });
49592
+ }, { signal });
49315
49593
 
49316
49594
  this.calendar.addEventListener('auroCalendar-dismissRequest', () => {
49317
49595
  this.dropdown.hide();
49318
- });
49596
+ }, { signal });
49319
49597
 
49320
49598
  this.calendar.addEventListener('auroCalendar-centralDateChanged', (event) => {
49321
49599
  const match = this.centralDateObject && this.util.datesMatch(event.detail.date, this.centralDateObject);
@@ -49325,7 +49603,7 @@ class AuroDatePicker extends AuroElement$5 {
49325
49603
  }
49326
49604
 
49327
49605
  this.notifyMonthChanged(event);
49328
- });
49606
+ }, { signal });
49329
49607
  }
49330
49608
 
49331
49609
  /**
@@ -49334,10 +49612,17 @@ class AuroDatePicker extends AuroElement$5 {
49334
49612
  * @returns {void}
49335
49613
  */
49336
49614
  configureDatepicker() {
49615
+ // These listeners are on `this` (the host), so they would GC with the
49616
+ // host even without the abort signal — see the leak rationale on
49617
+ // `_listenerAbortController`. The signal is still passed for uniform
49618
+ // cleanup semantics with the child-element listeners in the other
49619
+ // configure* methods.
49620
+ const { signal } = this._listenerAbortController;
49621
+
49337
49622
  this.addEventListener('focusin', () => {
49338
49623
  this.touched = true;
49339
49624
  this.hasFocus = true;
49340
- });
49625
+ }, { signal });
49341
49626
 
49342
49627
  this.addEventListener('focusout', () => {
49343
49628
  this.hasFocus = false;
@@ -49349,7 +49634,7 @@ class AuroDatePicker extends AuroElement$5 {
49349
49634
  if (!this.matches(':focus-within')) {
49350
49635
  this.validate();
49351
49636
  }
49352
- });
49637
+ }, { signal });
49353
49638
 
49354
49639
  if (this.valueObject) {
49355
49640
  this.calendar.dateFrom = this.convertToWcValidTime(this.valueObject);
@@ -49547,6 +49832,41 @@ class AuroDatePicker extends AuroElement$5 {
49547
49832
  return this.validity !== undefined && this.validity !== 'valid';
49548
49833
  }
49549
49834
 
49835
+ /**
49836
+ * Per-class dedup set used by `_warnInvalidLocale`. Static so the dedup
49837
+ * spans every datepicker instance on the page; lives on the class (not
49838
+ * at module scope) so it stays an encapsulated implementation detail of
49839
+ * this component and does not interfere with WCA's class-JSDoc
49840
+ * attachment.
49841
+ * @private
49842
+ */
49843
+ static _warnedInvalidLocales = new Set();
49844
+
49845
+ /**
49846
+ * Logs a one-time `console.debug` when an unsupported locale falls back to
49847
+ * en-US. Deduped by the offending tag so noisy re-renders that resurface
49848
+ * the same bad value stay quiet, but each new bad value still signals so
49849
+ * consumers can spot the typo or missing tag.
49850
+ * @private
49851
+ * @param {string|undefined} badLocale - The locale value that failed.
49852
+ * @returns {void}
49853
+ */
49854
+ _warnInvalidLocale(badLocale) {
49855
+ // Stringify without coalescing — `String(undefined)` / `String(null)`
49856
+ // surface the actual offending value in the log, instead of the
49857
+ // ambiguous `Locale ""` that `String(badLocale ?? '')` would produce.
49858
+ // Dedup still works correctly because each unique stringification
49859
+ // becomes its own Set entry.
49860
+ const key = String(badLocale);
49861
+ const seen = AuroDatePicker._warnedInvalidLocales;
49862
+ if (seen.has(key)) {
49863
+ return;
49864
+ }
49865
+ seen.add(key);
49866
+ // eslint-disable-next-line no-console
49867
+ console.debug(`[auro-datepicker] Locale "${key}" is not supported by Intl.DateTimeFormat. Falling back to "en-US". Pass a BCP 47 tag such as "en-US", "fr-FR", or "ja-JP".`);
49868
+ }
49869
+
49550
49870
  /**
49551
49871
  * Lifecycle method to check if the locale is valid.
49552
49872
  * @ignore
@@ -49557,10 +49877,15 @@ class AuroDatePicker extends AuroElement$5 {
49557
49877
  if (changedProperties.has('locale')) {
49558
49878
  try {
49559
49879
  const supported = Intl.DateTimeFormat.supportedLocalesOf([this.locale], { localeMatcher: 'lookup' });
49560
- this._validLocale = supported.length > 0 ? this.locale : 'en-US';
49880
+ if (supported.length > 0) {
49881
+ this._validLocale = this.locale;
49882
+ } else {
49883
+ this._validLocale = 'en-US';
49884
+ this._warnInvalidLocale(this.locale);
49885
+ }
49561
49886
  } catch {
49562
- console.debug(`[AuroDatePicker] The locale "${this.locale}" is not valid. Falling back to "en-US".`); // eslint-disable-line no-console
49563
49887
  this._validLocale = 'en-US';
49888
+ this._warnInvalidLocale(this.locale);
49564
49889
  }
49565
49890
 
49566
49891
  const previousLocaleFormat = getDateFormatFromLocale$1(changedProperties.get('locale'));
@@ -49642,8 +49967,6 @@ class AuroDatePicker extends AuroElement$5 {
49642
49967
  // Skip centralDate update when user clicked a cell in range mode
49643
49968
  // to prevent the displayed months from shifting
49644
49969
  this.centralDate = this.value;
49645
- //TODO: TEST THIS CHANGE
49646
- // this.calendarRenderUtil.updateCentralDate(this, this.value);
49647
49970
  }
49648
49971
 
49649
49972
  this.setHasValue();
@@ -49703,8 +50026,6 @@ class AuroDatePicker extends AuroElement$5 {
49703
50026
  // Skip centralDate update when user clicked a cell in range mode
49704
50027
  // to prevent the displayed months from shifting
49705
50028
  this.centralDate = this.valueEnd;
49706
- // TODO: TEST THIS CHANGE
49707
- // this.calendarRenderUtil.updateCentralDate(this, this.formattedValueEnd);
49708
50029
  }
49709
50030
 
49710
50031
  this.validate();
@@ -49846,7 +50167,7 @@ class AuroDatePicker extends AuroElement$5 {
49846
50167
  * @returns {void}
49847
50168
  */
49848
50169
  configureClickHandler() {
49849
- this.addEventListener('click', this.handleClick);
50170
+ this.addEventListener('click', this.handleClick, { signal: this._listenerAbortController.signal });
49850
50171
  }
49851
50172
 
49852
50173
  firstUpdated() {
@@ -49854,6 +50175,15 @@ class AuroDatePicker extends AuroElement$5 {
49854
50175
  // Add the tag name as an attribute if it is different than the component name
49855
50176
  this.runtimeUtils.handleComponentTagRename(this, 'auro-datepicker');
49856
50177
 
50178
+ // If the element was disconnected before this first render finished,
50179
+ // disconnectedCallback's microtask already aborted the controller. The
50180
+ // connectedCallback reinit guard skips that case because `hasUpdated`
50181
+ // is still false. Mint a fresh controller here so configure* registers
50182
+ // listeners against a live signal.
50183
+ if (this._listenerAbortController.signal.aborted) {
50184
+ this._listenerAbortController = new AbortController();
50185
+ }
50186
+
49857
50187
  this.configureDropdown();
49858
50188
  this.configureInput();
49859
50189
  this.configureCalendar();
@@ -49865,9 +50195,36 @@ class AuroDatePicker extends AuroElement$5 {
49865
50195
  connectedCallback() {
49866
50196
  super.connectedCallback();
49867
50197
 
50198
+ // True reconnect after `disconnectedCallback` aborted our controller:
50199
+ // the existing signal is dead, so listeners registered against it
50200
+ // would never fire. Create a fresh controller and re-run the
50201
+ // configure* wiring (each method is idempotent — it just re-caches
50202
+ // child refs and re-registers listeners against the new signal).
50203
+ // `hasUpdated` gates this so the *first* connect (which precedes
50204
+ // firstUpdated) still falls through to firstUpdated's initial wiring.
50205
+ if (this.hasUpdated && this._listenerAbortController.signal.aborted) {
50206
+ this._listenerAbortController = new AbortController();
50207
+ this.configureDropdown();
50208
+ this.configureInput();
50209
+ this.configureCalendar();
50210
+ this.configureDatepicker();
50211
+ this.configureClickHandler();
50212
+ }
50213
+
49868
50214
  this.locale = this.domHandler.getLocale(this);
49869
50215
  }
49870
50216
 
50217
+ disconnectedCallback() {
50218
+ super.disconnectedCallback();
50219
+ // Defer so that re-parenting (auro-drawer slotting it into a dialog,
50220
+ // for example) does not abort listeners we still need after reconnect.
50221
+ queueMicrotask(() => {
50222
+ if (!this.isConnected) {
50223
+ this._listenerAbortController.abort();
50224
+ }
50225
+ });
50226
+ }
50227
+
49871
50228
  // layout render methods
49872
50229
  // ------------------------------------
49873
50230
 
@@ -51363,7 +51720,7 @@ let AuroHelpText$1$2 = class AuroHelpText extends i$3 {
51363
51720
  }
51364
51721
  };
51365
51722
 
51366
- var formkitVersion$1$2 = '202606252337';
51723
+ var formkitVersion$1$2 = '202606291440';
51367
51724
 
51368
51725
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
51369
51726
  // See LICENSE in the project root for license information.
@@ -55691,7 +56048,7 @@ let AuroHelpText$6 = class AuroHelpText extends i$3 {
55691
56048
  }
55692
56049
  };
55693
56050
 
55694
- var formkitVersion$6 = '202606252337';
56051
+ var formkitVersion$6 = '202606291440';
55695
56052
 
55696
56053
  let AuroElement$1$2 = class AuroElement extends i$3 {
55697
56054
  static get properties() {
@@ -59631,7 +59988,7 @@ let AuroHelpText$5 = class AuroHelpText extends i$3 {
59631
59988
  }
59632
59989
  };
59633
59990
 
59634
- var formkitVersion$5 = '202606252337';
59991
+ var formkitVersion$5 = '202606291440';
59635
59992
 
59636
59993
  // Copyright (c) Alaska Air. All right reserved. Licensed under the Apache-2.0 license
59637
59994
  // See LICENSE in the project root for license information.
@@ -61381,7 +61738,7 @@ let AuroHelpText$4 = class AuroHelpText extends i$3 {
61381
61738
  }
61382
61739
  };
61383
61740
 
61384
- var formkitVersion$4 = '202606252337';
61741
+ var formkitVersion$4 = '202606291440';
61385
61742
 
61386
61743
  // Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
61387
61744
  // See LICENSE in the project root for license information.
@@ -66596,7 +66953,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$3 {
66596
66953
  }
66597
66954
  };
66598
66955
 
66599
- var formkitVersion$2 = '202606252337';
66956
+ var formkitVersion$2 = '202606291440';
66600
66957
 
66601
66958
  let AuroElement$2$1 = class AuroElement extends i$3 {
66602
66959
  static get properties() {
@@ -78314,13 +78671,6 @@ class AuroInputUtilities {
78314
78671
  * @returns {string | undefined}
78315
78672
  */
78316
78673
  toFormattedValue(valueObject, format) {
78317
- // Exposed publicly via `AuroInputUtil.toFormattedValue`, so a missing
78318
- // `format` argument has to fail gracefully rather than throw on
78319
- // `format.toLowerCase()`. Treat any falsy value (undefined, null, '')
78320
- // as "no format → no display value".
78321
- if (!format) {
78322
- return undefined;
78323
- }
78324
78674
  const normalizedFormat = format.toLowerCase();
78325
78675
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
78326
78676
 
@@ -78471,18 +78821,79 @@ class BaseInput extends AuroElement$1$1 {
78471
78821
  constructor() {
78472
78822
  super();
78473
78823
 
78474
- // Single-source initialization. Alphabetized so duplicate or stale
78475
- // defaults are immediately obvious on a diff. Every field is assigned
78476
- // exactly once here (previously the constructor + the old
78477
- // `_initializePrivateDefaults` overlapped — both wrote ~14 of the same
78478
- // fields and double-allocated `util` and `validation`, discarding the
78479
- // first instance). `validation` is now allocated exactly once; `util`
78480
- // is seeded here with an en-US default and then rebuilt in
78481
- // `connectedCallback` once the consumer-resolved locale is available,
78482
- // so a parent (datepicker/combobox) calling `validate()` synchronously
78483
- // during its own update cycle sees a populated util instance.
78824
+ this.appearance = "default";
78825
+ this.disabled = false;
78826
+ this.layout = 'classic';
78827
+ this.locale = 'en-US';
78828
+ this.max = undefined;
78829
+ this._maxObject = undefined;
78830
+ this.maxLength = undefined;
78831
+ this.min = undefined;
78832
+ this._minObject = undefined;
78833
+ this.minLength = undefined;
78834
+ this.required = false;
78835
+ this.onDark = false;
78836
+ this.setCustomValidityForType = undefined;
78837
+ this.size = 'lg';
78838
+ this.shape = 'classic';
78839
+ this.value = undefined;
78840
+ this._valueObject = undefined;
78841
+
78842
+ this._initializePrivateDefaults();
78843
+ }
78844
+
78845
+ /**
78846
+ * Internal Defaults.
78847
+ * @private
78848
+ * @returns {void}
78849
+ */
78850
+ _initializePrivateDefaults() {
78484
78851
  this.activeLabel = false;
78485
- /** @private */
78852
+ this.appearance = "default";
78853
+ this.icon = false;
78854
+ this.disabled = false;
78855
+ this.dvInputOnly = false;
78856
+ this.hideLabelVisually = false;
78857
+ this.max = undefined;
78858
+ this.maxLength = undefined;
78859
+ this.min = undefined;
78860
+ this.minLength = undefined;
78861
+ this.noValidate = false;
78862
+ this.onDark = false;
78863
+ this.required = false;
78864
+ this.setCustomValidityForType = undefined;
78865
+
78866
+ // Used for storing raw values returned from input mask.
78867
+ this._rawMaskValue = undefined;
78868
+
78869
+ /**
78870
+ * @private
78871
+ */
78872
+ this.layout = 'classic';
78873
+
78874
+ /**
78875
+ * @private
78876
+ */
78877
+ this.shape = 'classic';
78878
+
78879
+ /**
78880
+ * @private
78881
+ */
78882
+ this.size = 'lg';
78883
+
78884
+ this.touched = false;
78885
+ this.util = new AuroInputUtilities({
78886
+ locale: "en-US",
78887
+ format: this.format
78888
+ });
78889
+ this.validation = new AuroFormValidation$2();
78890
+ this.inputIconName = undefined;
78891
+ this.showPassword = false;
78892
+ this.validationCCLength = undefined;
78893
+ this.hasValue = false;
78894
+ this.label = 'Input label is undefined';
78895
+
78896
+
78486
78897
  this.allowedInputTypes = [
78487
78898
  "text",
78488
78899
  "number",
@@ -78491,8 +78902,7 @@ class BaseInput extends AuroElement$1$1 {
78491
78902
  "credit-card",
78492
78903
  "tel"
78493
78904
  ];
78494
- this.appearance = "default";
78495
- /** @private */
78905
+ this.icon = false;
78496
78906
  this.dateFormatMap = {
78497
78907
  'mm/dd/yyyy': 'dateMMDDYYYY',
78498
78908
  'dd/mm/yyyy': 'dateDDMMYYYY',
@@ -78509,57 +78919,27 @@ class BaseInput extends AuroElement$1$1 {
78509
78919
  'dd/mm': 'dateDDMM',
78510
78920
  'mm/dd': 'dateMMDD'
78511
78921
  };
78512
- this.disabled = false;
78513
- /** @private */
78514
78922
  this.domHandler = new DomHandler();
78515
78923
  this.dvInputOnly = false;
78516
78924
  this.hasValue = false;
78517
- this.hideLabelVisually = false;
78518
- this.icon = false;
78519
- /** @private */
78520
78925
  this.inputIconName = undefined;
78521
- /** @private */
78522
78926
  this.label = 'Input label is undefined';
78523
- this.layout = 'classic';
78524
- this.locale = 'en-US';
78525
- this.max = undefined;
78526
- this._maxObject = undefined;
78527
- this.maxLength = undefined;
78528
- this.min = undefined;
78529
- this._minObject = undefined;
78530
- this.minLength = undefined;
78531
78927
  this.noValidate = false;
78532
- this.onDark = false;
78533
- // Raw values returned from the input mask before model normalization.
78534
- this._rawMaskValue = undefined;
78535
- this.required = false;
78536
- this.setCustomValidityForType = undefined;
78537
- // Credit Card is intentionally excluded — its mask manages the cursor
78538
- // itself, and listing it here caused cursor placement issues in Safari.
78539
- /** @private */
78928
+ this._rawMaskValue = undefined; // Used for storing raw values returned from input mask.
78540
78929
  this.setSelectionInputTypes = [
78541
78930
  "text",
78542
78931
  "password",
78543
78932
  "email"
78544
- ];
78545
- this.shape = 'classic';
78546
- /** @private */
78933
+ ]; // Credit Card is not included as this caused cursor placement issues in Safari.
78547
78934
  this.showPassword = false;
78548
- this.size = 'lg';
78549
78935
  this.touched = false;
78550
- /** @private */
78551
78936
  this.uniqueId = new UniqueId().create();
78552
- /** @private */
78553
78937
  this.util = new AuroInputUtilities({
78554
78938
  locale: this.locale,
78555
78939
  format: this.format
78556
78940
  });
78557
- /** @private */
78558
78941
  this.validation = new AuroFormValidation$2();
78559
- /** @private */
78560
78942
  this.validationCCLength = undefined;
78561
- this.value = undefined;
78562
- this._valueObject = undefined;
78563
78943
  }
78564
78944
 
78565
78945
  // function to define props used within the scope of this component
@@ -79107,15 +79487,6 @@ class BaseInput extends AuroElement$1$1 {
79107
79487
 
79108
79488
  this.inputId = this.id ? `${this.id}-input` : window.crypto.randomUUID();
79109
79489
 
79110
- // Normalize the format token to lowercase so case-mixed values supplied
79111
- // via attribute (e.g. `format="MM/DD/YYYY"`) hit the `dateFormatMap`
79112
- // lookup inside `setCustomHelpTextMessage`. Without this, an uppercase
79113
- // format silently misses the map and leaves `setCustomValidityForType`
79114
- // unset.
79115
- if (this.format) {
79116
- this.format = this.format.toLowerCase();
79117
- }
79118
-
79119
79490
  // use validity message override if declared when initializing the component
79120
79491
  if (this.hasAttribute('setCustomValidity')) {
79121
79492
  this.ValidityMessageOverride = this.setCustomValidity;
@@ -79549,38 +79920,6 @@ class BaseInput extends AuroElement$1$1 {
79549
79920
  this.touched = true;
79550
79921
  this.validation.validate(this);
79551
79922
  }
79552
-
79553
- // Prevents cursor jumping in Safari. Setting `this.value` triggers a Lit
79554
- // update that can re-render the input and reset the native cursor; we
79555
- // capture the caret position before that update commits and restore it
79556
- // via `setSelectionRange` once the update has flushed. Gated on
79557
- // `setSelectionInputTypes` so credit-card (and other masked types whose
79558
- // formatter manages the cursor itself) doesn't get a competing write.
79559
- // Capture the caret position INSIDE the gate — reading `selectionStart`
79560
- // on input types that don't support text selection (number, email in
79561
- // some browsers) throws InvalidStateError, which would crash all input
79562
- // handling. Wrap the read in try/catch belt-and-suspenders even though
79563
- // the gated types currently support it, since the list is a public
79564
- // property a consumer could mutate.
79565
- if (this.setSelectionInputTypes.includes(this.type)) {
79566
- let selectionStart;
79567
- try {
79568
- selectionStart = this.inputElement.selectionStart;
79569
- } catch (error) { // eslint-disable-line no-unused-vars
79570
- return;
79571
- }
79572
- if (typeof selectionStart !== 'number') {
79573
- return;
79574
- }
79575
- this.updateComplete.then(() => {
79576
- try {
79577
- this.inputElement.setSelectionRange(selectionStart, selectionStart);
79578
- } catch (error) { // eslint-disable-line no-unused-vars
79579
- // Some input types (number/email in certain UAs) throw on
79580
- // setSelectionRange; swallow and let the native cursor stand.
79581
- }
79582
- });
79583
- }
79584
79923
  }
79585
79924
 
79586
79925
  /**
@@ -80207,7 +80546,7 @@ let AuroHelpText$1$1 = class AuroHelpText extends i$3 {
80207
80546
  }
80208
80547
  };
80209
80548
 
80210
- var formkitVersion$1$1 = '202606252337';
80549
+ var formkitVersion$1$1 = '202606291440';
80211
80550
 
80212
80551
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
80213
80552
  // See LICENSE in the project root for license information.
@@ -80710,7 +81049,6 @@ class AuroInput extends BaseInput {
80710
81049
  <${this.buttonTag}
80711
81050
  @click="${this.handleClickShowPassword}"
80712
81051
  appearance="${this.onDark ? 'inverse' : this.appearance}"
80713
- aria-pressed="${this.showPassword ? 'true' : 'false'}"
80714
81052
  class="notificationBtn passwordBtn"
80715
81053
  shape="circle"
80716
81054
  size="sm"
@@ -80784,29 +81122,25 @@ class AuroInput extends BaseInput {
80784
81122
  * @returns {html} - Returns HTML for the help text and error message.
80785
81123
  */
80786
81124
  renderHtmlHelpText() {
80787
- // Single `<p>` with stable identity across validity transitions —
80788
- // previously two distinct templates (valid vs invalid) caused Lit to
80789
- // replace the node entirely on a flip, and VoiceOver wouldn't
80790
- // re-announce because the live-region element it was watching had been
80791
- // removed and a new one inserted. Keeping one node means the `role`,
80792
- // `aria-live`, and text content all change in-place, which AT does
80793
- // observe and announce.
80794
- const isError = this.validity && this.validity !== 'valid';
80795
81125
  return u$c`
80796
- <${this.helpTextTag}
80797
- appearance="${this.onDark ? 'inverse' : this.appearance}"
80798
- ?error=${isError}>
80799
- <p
80800
- id="${this.uniqueId}"
80801
- part="helpText"
80802
- role="${o$4(isError ? 'alert' : undefined)}"
80803
- aria-live="${o$4(isError ? 'assertive' : undefined)}">
80804
- ${isError
80805
- ? this.errorMessage
80806
- : u$c`<slot name="helpText">${this.getHelpText()}</slot>`
80807
- }
80808
- </p>
80809
- </${this.helpTextTag}>
81126
+ ${!this.validity || this.validity === undefined || this.validity === 'valid'
81127
+ ? u$c`
81128
+ <${this.helpTextTag}
81129
+ appearance="${this.onDark ? 'inverse' : this.appearance}">
81130
+ <p id="${this.uniqueId}" part="helpText">
81131
+ <slot name="helpText">${this.getHelpText()}</slot>
81132
+ </p>
81133
+ </${this.helpTextTag}>
81134
+ `
81135
+ : u$c`
81136
+ <${this.helpTextTag} error
81137
+ appearance="${this.onDark ? 'inverse' : this.appearance}">
81138
+ <p id="${this.uniqueId}" role="alert" aria-live="assertive" part="helpText">
81139
+ ${this.errorMessage}
81140
+ </p>
81141
+ </${this.helpTextTag}>
81142
+ `
81143
+ }
80810
81144
  `;
80811
81145
  }
80812
81146
 
@@ -81333,7 +81667,7 @@ let AuroBibtemplate$1 = class AuroBibtemplate extends i$3 {
81333
81667
  }
81334
81668
  };
81335
81669
 
81336
- var formkitVersion$3 = '202606252337';
81670
+ var formkitVersion$3 = '202606291440';
81337
81671
 
81338
81672
  var styleCss$1$3 = i$6`.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock{display:block}.util_displayFlex{display:flex}.util_displayHidden{display:none}.util_displayHiddenVisually{position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}:host{display:block;text-align:left}:host [auro-dropdown]{--ds-auro-dropdown-trigger-background-color: transparent}:host #inputInBib::part(wrapper){box-shadow:none}:host #inputInBib::part(accent-left){display:none}:host([layout*=classic]) [auro-input]{width:100%}:host([layout*=classic]) [auro-input]::part(helpText){display:none}:host([layout*=classic]) #slotHolder{display:none}`;
81339
81673
 
@@ -90124,7 +90458,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
90124
90458
  }
90125
90459
  };
90126
90460
 
90127
- var formkitVersion$1 = '202606252337';
90461
+ var formkitVersion$1 = '202606291440';
90128
90462
 
90129
90463
  class AuroElement extends i$3 {
90130
90464
  static get properties() {
@@ -92145,7 +92479,7 @@ class AuroHelpText extends i$3 {
92145
92479
  }
92146
92480
  }
92147
92481
 
92148
- var formkitVersion = '202606252337';
92482
+ var formkitVersion = '202606291440';
92149
92483
 
92150
92484
  var styleCss = i$6`.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock{display:block}.util_displayFlex{display:flex}.util_displayHidden{display:none}.util_displayHiddenVisually{position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}.body-default{font-size:var(--wcss-body-default-font-size, 1rem);font-weight:var(--wcss-body-default-weight, );line-height:var(--wcss-body-default-line-height, 1.5rem)}.body-default,.body-default-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-default-emphasized{font-size:var(--wcss-body-default-emphasized-font-size, 1rem);font-weight:var(--wcss-body-default-emphasized-weight, );line-height:var(--wcss-body-default-emphasized-line-height, 1.5rem)}.body-lg{font-size:var(--wcss-body-lg-font-size, 1.125rem);font-weight:var(--wcss-body-lg-weight, );line-height:var(--wcss-body-lg-line-height, 1.625rem)}.body-lg,.body-lg-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-lg-emphasized{font-size:var(--wcss-body-lg-emphasized-font-size, 1.125rem);font-weight:var(--wcss-body-lg-emphasized-weight, );line-height:var(--wcss-body-lg-emphasized-line-height, 1.625rem)}.body-sm{font-size:var(--wcss-body-sm-font-size, 0.875rem);font-weight:var(--wcss-body-sm-weight, );line-height:var(--wcss-body-sm-line-height, 1.25rem)}.body-sm,.body-sm-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-sm-emphasized{font-size:var(--wcss-body-sm-emphasized-font-size, 0.875rem);font-weight:var(--wcss-body-sm-emphasized-weight, );line-height:var(--wcss-body-sm-emphasized-line-height, 1.25rem)}.body-xs{font-size:var(--wcss-body-xs-font-size, 0.75rem);font-weight:var(--wcss-body-xs-weight, );line-height:var(--wcss-body-xs-line-height, 1rem)}.body-xs,.body-xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-xs-emphasized{font-size:var(--wcss-body-xs-emphasized-font-size, 0.75rem);font-weight:var(--wcss-body-xs-emphasized-weight, );line-height:var(--wcss-body-xs-emphasized-line-height, 1rem)}.body-2xs{font-size:var(--wcss-body-2xs-font-size, 0.625rem);font-weight:var(--wcss-body-2xs-weight, );line-height:var(--wcss-body-2xs-line-height, 0.875rem)}.body-2xs,.body-2xs-emphasized{font-family:var(--wcss-body-family, "AS Circular"),system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;letter-spacing:var(--wcss-body-letter-spacing, 0)}.body-2xs-emphasized{font-size:var(--wcss-body-2xs-emphasized-font-size, 0.625rem);font-weight:var(--wcss-body-2xs-emphasized-weight, );line-height:var(--wcss-body-2xs-emphasized-line-height, 0.875rem)}.display-2xl{font-family:var(--wcss-display-2xl-family, "AS Circular"),var(--wcss-display-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-2xl-font-size, clamp(3.5rem, 6vw, 5.375rem));font-weight:var(--wcss-display-2xl-weight, 300);letter-spacing:var(--wcss-display-2xl-letter-spacing, 0);line-height:var(--wcss-display-2xl-line-height, 1.3)}.display-xl{font-family:var(--wcss-display-xl-family, "AS Circular"),var(--wcss-display-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xl-font-size, clamp(3rem, 5.3333333333vw, 4.5rem));font-weight:var(--wcss-display-xl-weight, 300);letter-spacing:var(--wcss-display-xl-letter-spacing, 0);line-height:var(--wcss-display-xl-line-height, 1.3)}.display-lg{font-family:var(--wcss-display-lg-family, "AS Circular"),var(--wcss-display-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-lg-font-size, clamp(2.75rem, 4.6666666667vw, 4rem));font-weight:var(--wcss-display-lg-weight, 300);letter-spacing:var(--wcss-display-lg-letter-spacing, 0);line-height:var(--wcss-display-lg-line-height, 1.3)}.display-md{font-family:var(--wcss-display-md-family, "AS Circular"),var(--wcss-display-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-md-font-size, clamp(2.5rem, 4vw, 3.5rem));font-weight:var(--wcss-display-md-weight, 300);letter-spacing:var(--wcss-display-md-letter-spacing, 0);line-height:var(--wcss-display-md-line-height, 1.3)}.display-sm{font-family:var(--wcss-display-sm-family, "AS Circular"),var(--wcss-display-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-sm-font-size, clamp(2rem, 3.6666666667vw, 3rem));font-weight:var(--wcss-display-sm-weight, 300);letter-spacing:var(--wcss-display-sm-letter-spacing, 0);line-height:var(--wcss-display-sm-line-height, 1.3)}.display-xs{font-family:var(--wcss-display-xs-family, "AS Circular"),var(--wcss-display-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-display-xs-font-size, clamp(1.75rem, 3vw, 2.375rem));font-weight:var(--wcss-display-xs-weight, 300);letter-spacing:var(--wcss-display-xs-letter-spacing, 0);line-height:var(--wcss-display-xs-line-height, 1.3)}.heading-xl{font-family:var(--wcss-heading-xl-family, "AS Circular"),var(--wcss-heading-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xl-font-size, clamp(2rem, 3vw, 2.5rem));font-weight:var(--wcss-heading-xl-weight, 300);letter-spacing:var(--wcss-heading-xl-letter-spacing, 0);line-height:var(--wcss-heading-xl-line-height, 1.3)}.heading-lg{font-family:var(--wcss-heading-lg-family, "AS Circular"),var(--wcss-heading-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-lg-font-size, clamp(1.75rem, 2.6666666667vw, 2.25rem));font-weight:var(--wcss-heading-lg-weight, 300);letter-spacing:var(--wcss-heading-lg-letter-spacing, 0);line-height:var(--wcss-heading-lg-line-height, 1.3)}.heading-md{font-family:var(--wcss-heading-md-family, "AS Circular"),var(--wcss-heading-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-md-font-size, clamp(1.625rem, 2.3333333333vw, 1.75rem));font-weight:var(--wcss-heading-md-weight, 300);letter-spacing:var(--wcss-heading-md-letter-spacing, 0);line-height:var(--wcss-heading-md-line-height, 1.3)}.heading-sm{font-family:var(--wcss-heading-sm-family, "AS Circular"),var(--wcss-heading-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-sm-font-size, clamp(1.375rem, 2vw, 1.5rem));font-weight:var(--wcss-heading-sm-weight, 300);letter-spacing:var(--wcss-heading-sm-letter-spacing, 0);line-height:var(--wcss-heading-sm-line-height, 1.3)}.heading-xs{font-family:var(--wcss-heading-xs-family, "AS Circular"),var(--wcss-heading-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-xs-font-size, clamp(1.25rem, 1.6666666667vw, 1.25rem));font-weight:var(--wcss-heading-xs-weight, 300);letter-spacing:var(--wcss-heading-xs-letter-spacing, 0);line-height:var(--wcss-heading-xs-line-height, 1.3)}.heading-2xs{font-family:var(--wcss-heading-2xs-family, "AS Circular"),var(--wcss-heading-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-heading-2xs-font-size, clamp(1.125rem, 1.5vw, 1.125rem));font-weight:var(--wcss-heading-2xs-weight, 300);letter-spacing:var(--wcss-heading-2xs-letter-spacing, 0);line-height:var(--wcss-heading-2xs-line-height, 1.3)}.accent-2xl{font-family:var(--wcss-accent-2xl-family, "Good OT"),var(--wcss-accent-2xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xl-font-size, clamp(2rem, 3.1666666667vw, 2.375rem));font-weight:var(--wcss-accent-2xl-weight, 450);letter-spacing:var(--wcss-accent-2xl-letter-spacing, 0.05em);line-height:var(--wcss-accent-2xl-line-height, 1)}.accent-2xl,.accent-xl{text-transform:uppercase}.accent-xl{font-family:var(--wcss-accent-xl-family, "Good OT"),var(--wcss-accent-xl-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xl-font-size, clamp(1.625rem, 2.3333333333vw, 2rem));font-weight:var(--wcss-accent-xl-weight, 450);letter-spacing:var(--wcss-accent-xl-letter-spacing, 0.05em);line-height:var(--wcss-accent-xl-line-height, 1.3)}.accent-lg{font-family:var(--wcss-accent-lg-family, "Good OT"),var(--wcss-accent-lg-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-lg-font-size, clamp(1.5rem, 2.1666666667vw, 1.75rem));font-weight:var(--wcss-accent-lg-weight, 450);letter-spacing:var(--wcss-accent-lg-letter-spacing, 0.05em);line-height:var(--wcss-accent-lg-line-height, 1.3)}.accent-lg,.accent-md{text-transform:uppercase}.accent-md{font-family:var(--wcss-accent-md-family, "Good OT"),var(--wcss-accent-md-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-md-font-size, clamp(1.375rem, 1.8333333333vw, 1.5rem));font-weight:var(--wcss-accent-md-weight, 500);letter-spacing:var(--wcss-accent-md-letter-spacing, 0.05em);line-height:var(--wcss-accent-md-line-height, 1.3)}.accent-sm{font-family:var(--wcss-accent-sm-family, "Good OT"),var(--wcss-accent-sm-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-sm-font-size, clamp(1.125rem, 1.5vw, 1.25rem));font-weight:var(--wcss-accent-sm-weight, 500);letter-spacing:var(--wcss-accent-sm-letter-spacing, 0.05em);line-height:var(--wcss-accent-sm-line-height, 1.3)}.accent-sm,.accent-xs{text-transform:uppercase}.accent-xs{font-family:var(--wcss-accent-xs-family, "Good OT"),var(--wcss-accent-xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-xs-font-size, clamp(1rem, 1.3333333333vw, 1rem));font-weight:var(--wcss-accent-xs-weight, 500);letter-spacing:var(--wcss-accent-xs-letter-spacing, 0.1em);line-height:var(--wcss-accent-xs-line-height, 1.3)}.accent-2xs{font-family:var(--wcss-accent-2xs-family, "Good OT"),var(--wcss-accent-2xs-family-fallback, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);font-size:var(--wcss-accent-2xs-font-size, clamp(0.875rem, 1.1666666667vw, 0.875rem));font-weight:var(--wcss-accent-2xs-weight, 450);letter-spacing:var(--wcss-accent-2xs-letter-spacing, 0.1em);line-height:var(--wcss-accent-2xs-line-height, 1.3);text-transform:uppercase}[auro-dropdown]{--ds-auro-dropdown-trigger-border-color: var(--ds-auro-select-border-color);--ds-auro-dropdown-trigger-background-color: var(--ds-auro-select-background-color);--ds-auro-dropdown-trigger-container-color: var(--ds-auro-select-background-color);--ds-auro-dropdown-trigger-outline-color: var(--ds-auro-select-outline-color)}:host{display:inline-block;text-align:left;vertical-align:top}:host([layout*=emphasized]) [auro-dropdown],:host([layout*=snowflake]) [auro-dropdown]{--ds-auro-select-border-color: transparent}:host([layout*=emphasized]) .mainContent,:host([layout*=snowflake]) .mainContent{text-align:center}.mainContent{position:relative;display:flex;overflow:hidden;flex:1;flex-direction:column;align-items:center;justify-content:center}.valueContainer [slot=displayValue]{display:none}.accents{display:flex;flex-direction:row;align-items:center;justify-content:center}::slotted([slot=typeIcon]){margin-right:var(--ds-size-100, 0.5rem)}.displayValue{display:block}.displayValue:not(.force){display:none}.displayValue:not(.force).hasContent:is(.withValue):not(.hasFocus){display:block}.triggerContent{display:flex;width:100%;align-items:center;justify-content:center}:host([layout*=emphasized]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem) 0 var(--ds-size-300, 1.5rem)}:host([layout*=snowflake]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem) 0 var(--ds-size-200, 1rem)}:host([layout*=snowflake]) label{padding-block:var(--ds-size-25, 0.125rem)}:host([layout*=classic]) .triggerContent{padding:0 var(--ds-size-100, 0.5rem)}:host([layout*=classic]) .mainContent{align-items:start}:host([layout*=classic]) label{overflow:hidden;cursor:text;text-overflow:ellipsis;white-space:nowrap}:host([layout*=classic]) .value{height:auto}label{color:var(--ds-auro-select-label-text-color)}:host(:is([validity]:not([validity=valid]))) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-basic-color-status-error, #e31f26);--ds-auro-select-outline-color: var(--ds-basic-color-status-error, #e31f26);--ds-auro-dropdown-helptext-text-color: var(--ds-basic-color-texticon-default, #2a2a2a)}:host([ondark]:is([validity]:not([validity=valid]))) [auro-dropdown],:host([appearance=inverse]:is([validity]:not([validity=valid]))) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-advanced-color-state-error-inverse, #f9a4a8);--ds-auro-select-outline-color: var(--ds-advanced-color-state-error-inverse, #f9a4a8);--ds-auro-dropdown-helptext-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}#slotHolder{display:none}:host([fluid]){width:100%}:host([disabled]){pointer-events:none;user-select:none}:host([disabled]:not([ondark])) [auro-dropdown],:host([disabled]:not([appearance=inverse])) [auro-dropdown]{--ds-auro-select-border-color: var(--ds-basic-color-border-subtle, #dddddd)}:host(:not([layout*=classic])[disabled][ondark]) [auro-dropdown],:host(:not([layout*=classic])[disabled][appearance=inverse]) [auro-dropdown]{--ds-auro-select-border-color: transparent}`;
92151
92485