@aurodesignsystem-dev/auro-formkit 0.0.0-pr1516.0 → 0.0.0-pr1518.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 (54) hide show
  1. package/components/checkbox/demo/customize.min.js +8 -6
  2. package/components/checkbox/demo/getting-started.min.js +8 -6
  3. package/components/checkbox/demo/index.min.js +8 -6
  4. package/components/checkbox/dist/index.js +8 -6
  5. package/components/checkbox/dist/registered.js +8 -6
  6. package/components/combobox/README.md +1 -1
  7. package/components/combobox/demo/customize.md +2 -10
  8. package/components/combobox/demo/customize.min.js +382 -466
  9. package/components/combobox/demo/getting-started.min.js +382 -462
  10. package/components/combobox/demo/index.md +1 -1
  11. package/components/combobox/demo/index.min.js +382 -462
  12. package/components/combobox/demo/keyboard-behavior.md +2 -142
  13. package/components/combobox/demo/readme.md +1 -1
  14. package/components/combobox/demo/why-combobox.md +2 -2
  15. package/components/combobox/dist/auro-combobox.d.ts +30 -14
  16. package/components/combobox/dist/index.js +382 -462
  17. package/components/combobox/dist/registered.js +382 -462
  18. package/components/counter/demo/customize.min.js +9 -7
  19. package/components/counter/demo/index.min.js +9 -7
  20. package/components/counter/dist/index.js +9 -7
  21. package/components/counter/dist/registered.js +9 -7
  22. package/components/datepicker/demo/customize.min.js +78 -169
  23. package/components/datepicker/demo/index.min.js +78 -169
  24. package/components/datepicker/dist/index.js +78 -169
  25. package/components/datepicker/dist/registered.js +78 -169
  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 +561 -816
  32. package/components/form/demo/getting-started.min.js +561 -816
  33. package/components/form/demo/index.min.js +561 -816
  34. package/components/form/demo/registerDemoDeps.min.js +561 -816
  35. package/components/input/demo/customize.min.js +67 -159
  36. package/components/input/demo/getting-started.min.js +67 -159
  37. package/components/input/demo/index.min.js +67 -159
  38. package/components/input/dist/auro-input.d.ts +1 -1
  39. package/components/input/dist/base-input.d.ts +3 -51
  40. package/components/input/dist/index.js +67 -159
  41. package/components/input/dist/registered.js +67 -159
  42. package/components/input/dist/utilities.d.ts +1 -1
  43. package/components/radio/demo/customize.min.js +8 -6
  44. package/components/radio/demo/getting-started.min.js +8 -6
  45. package/components/radio/demo/index.min.js +8 -6
  46. package/components/radio/dist/index.js +8 -6
  47. package/components/radio/dist/registered.js +8 -6
  48. package/components/select/demo/customize.min.js +9 -7
  49. package/components/select/demo/getting-started.min.js +9 -7
  50. package/components/select/demo/index.min.js +9 -7
  51. package/components/select/dist/index.js +9 -7
  52. package/components/select/dist/registered.js +9 -7
  53. package/custom-elements.json +1503 -1709
  54. package/package.json +1 -1
@@ -500,15 +500,17 @@ let AuroFormValidation$1 = class AuroFormValidation {
500
500
  );
501
501
  }
502
502
 
503
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
504
- if (this.auroInputElements?.length === 2) {
505
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
503
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
504
+
505
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
506
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
507
+ // field (datepicker is the intended consumer — start/end are independently required).
508
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
509
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
506
510
  hasValue = false;
507
511
  }
508
512
  }
509
513
 
510
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
511
-
512
514
  if (isCombobox) {
513
515
 
514
516
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -825,6 +827,8 @@ function navigateArrow(component, direction, options = {}) {
825
827
  }
826
828
  }
827
829
 
830
+ /* eslint-disable no-underscore-dangle */
831
+
828
832
  /**
829
833
  * Returns the clear button element from the active input's shadow
830
834
  * DOM, if available.
@@ -860,11 +864,9 @@ function isClearBtnFocused(ctx, clearBtn = getClearBtn(ctx)) {
860
864
  * @param {Object} menu - The menu component.
861
865
  */
862
866
  function reconcileMenuIndex(menu) {
863
- // eslint-disable-next-line no-underscore-dangle
864
867
  if (menu._index < 0 && menu.optionActive && menu.items) {
865
868
  const idx = menu.items.indexOf(menu.optionActive);
866
869
  if (idx >= 0) {
867
- // eslint-disable-next-line no-underscore-dangle
868
870
  menu._index = idx;
869
871
  }
870
872
  }
@@ -883,11 +885,7 @@ const comboboxKeyboardStrategy = {
883
885
 
884
886
  // navigate if bib is open otherwise open it
885
887
  if (component.dropdown.isPopoverVisible) {
886
- if (evt.altKey || evt.ctrlKey || evt.metaKey) {
887
- component.activateLastEnabledAvailableOption();
888
- } else {
889
- navigateArrow(component, 'down');
890
- }
888
+ navigateArrow(component, 'down');
891
889
  } else {
892
890
  component.showBib();
893
891
  }
@@ -906,11 +904,7 @@ const comboboxKeyboardStrategy = {
906
904
 
907
905
  // navigate if bib is open otherwise open it
908
906
  if (component.dropdown.isPopoverVisible) {
909
- if (evt.altKey || evt.ctrlKey || evt.metaKey) {
910
- component.activateFirstEnabledAvailableOption();
911
- } else {
912
- navigateArrow(component, 'up');
913
- }
907
+ navigateArrow(component, 'up');
914
908
  } else {
915
909
  component.showBib();
916
910
  }
@@ -926,13 +920,18 @@ const comboboxKeyboardStrategy = {
926
920
  },
927
921
 
928
922
  Enter(component, evt, ctx) {
923
+ // Forms should not submit on Enter from a combobox, regardless of which
924
+ // child element (input, clear button, menu) is focused.
925
+ evt.stopPropagation();
926
+
929
927
  if (isClearBtnFocused(ctx)) {
930
- // If the clear button has focus, let the browser activate it normally.
931
- // stopPropagation prevents parent containers (e.g., forms) from treating
932
- // Enter as a submit, but we must NOT call preventDefault — that would
933
- // block the browser's built-in "Enter activates focused button" behavior.
934
- evt.stopPropagation();
935
- } else if (ctx.isExpanded && component.menu.optionActive) {
928
+ // Let the browser dispatch Enter to the focused clear button so its
929
+ // built-in activation fires and clears the selection. Do NOT call
930
+ // preventDefault — that would block the activation.
931
+ return;
932
+ }
933
+
934
+ if (ctx.isExpanded && component.menu.optionActive) {
936
935
  reconcileMenuIndex(component.menu);
937
936
  component.menu.makeSelection();
938
937
 
@@ -941,14 +940,8 @@ const comboboxKeyboardStrategy = {
941
940
  }
942
941
 
943
942
  evt.preventDefault();
944
- evt.stopPropagation();
945
943
  } else {
946
- // Prevent the keypress from bubbling to parent containers (e.g., forms)
947
- // which could interpret Enter as a submit or trigger other unintended behavior.
948
- // This is safe because showBib() opens the dialog programmatically,
949
- // not via event propagation.
950
944
  evt.preventDefault();
951
- evt.stopPropagation();
952
945
  component.showBib();
953
946
  }
954
947
  },
@@ -993,7 +986,7 @@ const comboboxKeyboardStrategy = {
993
986
  component.setClearBtnFocus();
994
987
  }
995
988
  }
996
- },
989
+ }
997
990
  };
998
991
 
999
992
  /**
@@ -4888,7 +4881,7 @@ let AuroHelpText$2 = class AuroHelpText extends i$3 {
4888
4881
  }
4889
4882
  };
4890
4883
 
4891
- var formkitVersion$2 = '202606292156';
4884
+ var formkitVersion$2 = '202607011652';
4892
4885
 
4893
4886
  let AuroElement$2 = class AuroElement extends i$3 {
4894
4887
  static get properties() {
@@ -6294,7 +6287,7 @@ const u$4=(e,s,t)=>{const r=new Map;for(let l=s;l<=t;l++)r.set(e[l],l);return r}
6294
6287
 
6295
6288
  var shapeSizeCss = i$6`.shape-classic-xl,.shape-classic-lg,.shape-classic-md,.shape-classic-sm,.shape-classic-xs{min-height:56px;max-height:56px;border-style:solid;border-width:1px;border-radius:var(--ds-border-radius, 0.375rem)}.shape-classic-xl.simple,.shape-classic-lg.simple,.shape-classic-md.simple,.shape-classic-sm.simple,.shape-classic-xs.simple{border-width:0px;min-height:58px;max-height:58px;background-color:unset;box-shadow:none}.shape-classic-xl.thin,.shape-classic-lg.thin,.shape-classic-md.thin,.shape-classic-sm.thin,.shape-classic-xs.thin{border-width:1px;min-height:56px;max-height:56px;background-color:unset}.shape-classic-xl.parentBorder,.shape-classic-lg.parentBorder,.shape-classic-md.parentBorder,.shape-classic-sm.parentBorder,.shape-classic-xs.parentBorder{border:0;box-shadow:unset;min-height:54px;max-height:54px}.shape-snowflake-xl,.shape-snowflake-lg,.shape-snowflake-md,.shape-snowflake-sm,.shape-snowflake-xs{min-height:56px;max-height:56px;border-style:solid;border-width:2px;border-color:transparent;border-radius:30px}.shape-snowflake-xl.simple,.shape-snowflake-lg.simple,.shape-snowflake-md.simple,.shape-snowflake-sm.simple,.shape-snowflake-xs.simple{border-width:0px;min-height:60px;max-height:60px;background-color:unset;box-shadow:none}.shape-snowflake-xl.thin,.shape-snowflake-lg.thin,.shape-snowflake-md.thin,.shape-snowflake-sm.thin,.shape-snowflake-xs.thin{border-width:1px;min-height:58px;max-height:58px;background-color:unset}.shape-snowflake-xl.parentBorder,.shape-snowflake-lg.parentBorder,.shape-snowflake-md.parentBorder,.shape-snowflake-sm.parentBorder,.shape-snowflake-xs.parentBorder{border:0;box-shadow:unset;min-height:56px;max-height:56px}.shape-box-xl{min-height:68px;max-height:68px;border-style:solid;border-width:2px;border-color:transparent}.shape-box-xl.simple{border-width:0px;min-height:72px;max-height:72px;background-color:unset;box-shadow:none}.shape-box-xl.thin{border-width:1px;min-height:70px;max-height:70px;background-color:unset}.shape-box-xl.parentBorder{border:0;box-shadow:unset;min-height:68px;max-height:68px}.shape-box-lg{min-height:52px;max-height:52px;border-style:solid;border-width:2px;border-color:transparent}.shape-box-lg.simple{border-width:0px;min-height:56px;max-height:56px;background-color:unset;box-shadow:none}.shape-box-lg.thin{border-width:1px;min-height:54px;max-height:54px;background-color:unset}.shape-box-lg.parentBorder{border:0;box-shadow:unset;min-height:52px;max-height:52px}.shape-box-md{min-height:44px;max-height:44px;border-style:solid;border-width:2px;border-color:transparent}.shape-box-md.simple{border-width:0px;min-height:48px;max-height:48px;background-color:unset;box-shadow:none}.shape-box-md.thin{border-width:1px;min-height:46px;max-height:46px;background-color:unset}.shape-box-md.parentBorder{border:0;box-shadow:unset;min-height:44px;max-height:44px}.shape-box-sm{min-height:32px;max-height:32px;border-style:solid;border-width:2px;border-color:transparent}.shape-box-sm.simple{border-width:0px;min-height:36px;max-height:36px;background-color:unset;box-shadow:none}.shape-box-sm.thin{border-width:1px;min-height:34px;max-height:34px;background-color:unset}.shape-box-sm.parentBorder{border:0;box-shadow:unset;min-height:32px;max-height:32px}.shape-box-xs{min-height:20px;max-height:20px;border-style:solid;border-width:2px;border-color:transparent}.shape-box-xs.simple{border-width:0px;min-height:24px;max-height:24px;background-color:unset;box-shadow:none}.shape-box-xs.thin{border-width:1px;min-height:22px;max-height:22px;background-color:unset}.shape-box-xs.parentBorder{border:0;box-shadow:unset;min-height:20px;max-height:20px}.shape-rounded-lg{min-height:56px;max-height:56px;border-style:solid;border-width:2px;border-color:transparent;border-radius:6px}.shape-rounded-lg.simple{border-width:0px;min-height:56px;max-height:56px;background-color:unset;box-shadow:none}.shape-rounded-lg.thin{border-width:1px;min-height:54px;max-height:54px;background-color:unset}.shape-rounded-lg.parentBorder{border:0;box-shadow:unset;min-height:52px;max-height:52px}.shape-pill-xl{min-height:68px;max-height:68px;border-style:solid;border-width:2px;border-color:transparent;border-radius:36px}.shape-pill-xl.simple{border-width:0px;min-height:72px;max-height:72px;background-color:unset;box-shadow:none}.shape-pill-xl.thin{border-width:1px;min-height:70px;max-height:70px;background-color:unset}.shape-pill-xl.parentBorder{border:0;box-shadow:unset;min-height:68px;max-height:68px}.shape-pill-left-xl{min-height:68px;max-height:68px;border-style:solid;border-width:2px;border-color:transparent;border-radius:36px 0 0 36px}.shape-pill-left-xl.simple{border-width:0px;min-height:72px;max-height:72px;background-color:unset;box-shadow:none}.shape-pill-left-xl.thin{border-width:1px;min-height:70px;max-height:70px;background-color:unset}.shape-pill-left-xl.parentBorder{border:0;box-shadow:unset;min-height:68px;max-height:68px}.shape-pill-right-xl{min-height:68px;max-height:68px;border-style:solid;border-width:2px;border-color:transparent;border-radius:0 36px 36px 0}.shape-pill-right-xl.simple{border-width:0px;min-height:72px;max-height:72px;background-color:unset;box-shadow:none}.shape-pill-right-xl.thin{border-width:1px;min-height:70px;max-height:70px;background-color:unset}.shape-pill-right-xl.parentBorder{border:0;box-shadow:unset;min-height:68px;max-height:68px}.shape-pill-md{min-height:44px;max-height:44px;border-style:solid;border-width:2px;border-color:transparent;border-radius:36px}.shape-pill-md.simple{border-width:0px;min-height:48px;max-height:48px;background-color:unset;box-shadow:none}.shape-pill-md.thin{border-width:1px;min-height:46px;max-height:46px;background-color:unset}.shape-pill-md.parentBorder{border:0;box-shadow:unset;min-height:44px;max-height:44px}.shape-pill-left-md{min-height:44px;max-height:44px;border-style:solid;border-width:2px;border-color:transparent;border-radius:36px 0 0 36px}.shape-pill-left-md.simple{border-width:0px;min-height:48px;max-height:48px;background-color:unset;box-shadow:none}.shape-pill-left-md.thin{border-width:1px;min-height:46px;max-height:46px;background-color:unset}.shape-pill-left-md.parentBorder{border:0;box-shadow:unset;min-height:44px;max-height:44px}.shape-pill-right-md{min-height:44px;max-height:44px;border-style:solid;border-width:2px;border-color:transparent;border-radius:0 36px 36px 0}.shape-pill-right-md.simple{border-width:0px;min-height:48px;max-height:48px;background-color:unset;box-shadow:none}.shape-pill-right-md.thin{border-width:1px;min-height:46px;max-height:46px;background-color:unset}.shape-pill-right-md.parentBorder{border:0;box-shadow:unset;min-height:44px;max-height:44px}`;
6296
6289
 
6297
- var styleCss$1$1 = 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}:host{display:block}.wrapper:has(:enabled){cursor:text}.wrapper:has(:enabled) label{cursor:text}.helpTextClasses{cursor:default}input{overflow:clip !important;width:100%;padding:0;border:0;background:unset;outline:none;overflow-clip-margin:0 !important;text-overflow:ellipsis}input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.displayValue{display:none}.displayValue.hasContent:is(.withValue):not(.hasFocus){display:flex;align-items:center}.accents:not(.util_displayHidden){display:flex;flex-direction:row;align-items:center;justify-content:center;gap:8px}.wrapper:not(:focus-within):not(:hover) .notificationBtn.passwordBtn,.wrapper:not(:focus-within):not(:hover) .notification.clear{display:none}.notification{display:flex;align-items:center;justify-content:center}`;
6290
+ var styleCss$1$1 = 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}:host{display:block}.wrapper:has(:enabled){cursor:text}.wrapper:has(:enabled) label{cursor:text}.helpTextClasses{cursor:default}input{overflow:clip !important;width:100%;padding:0;border:0;background:unset;outline:none;overflow-clip-margin:0 !important;text-overflow:ellipsis}input[type=number]{appearance:textfield}input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.displayValue{display:none}.displayValue.hasContent:is(.withValue):not(.hasFocus){display:flex;align-items:center}.accents:not(.util_displayHidden){display:flex;flex-direction:row;align-items:center;justify-content:center;gap:8px}.wrapper:not(:focus-within):not(:hover) .notificationBtn.passwordBtn,.wrapper:not(:focus-within):not(:hover) .notification.clear{display:none}.notification{display:flex;align-items:center;justify-content:center}`;
6298
6291
 
6299
6292
  var styleDefaultCss = i$6`.layoutDefault .typeIcon,:host(:not([layout])) .typeIcon{display:flex;flex-direction:row;align-items:center}.layoutDefault .typeIcon [auro-icon],:host(:not([layout])) .typeIcon [auro-icon]{--ds-auro-icon-size: var(--ds-size-300, 1.5rem);height:var(--ds-size-300, 1.5rem);margin-right:var(--ds-size-100, 0.5rem)}.layoutDefault .notificationIcons,:host(:not([layout])) .notificationIcons{display:flex;flex-direction:row;padding-right:var(--ds-size-100, 0.5rem)}:host([class=layoutDefault][bordered]) .typeIcon,:host(:not([layout])[bordered]) .typeIcon{padding-left:var(--ds-size-100, 0.5rem)}:host([class=layoutDefault][bordered]) .notificationIcons,:host(:not([layout])[bordered]) .notificationIcons{align-items:center}:host([class=layoutDefault][bordered]) .notification:not(:first-of-type),:host(:not([layout])[bordered]) .notification:not(:first-of-type){margin-left:var(--ds-size-100, 0.5rem)}:host([class=layoutDefault][bordered]) .alertNotification,:host(:not([layout])[bordered]) .alertNotification{width:calc(var(--ds-size-300, 1.5rem) + var(--ds-size-25, 0.125rem));height:calc(var(--ds-size-300, 1.5rem) + var(--ds-size-25, 0.125rem))}:host([class=layoutDefault][bordered]) .passwordBtn,:host(:not([layout])[bordered]) .passwordBtn{width:calc(var(--ds-size-300, 1.5rem));height:calc(var(--ds-size-300, 1.5rem))}:host([class=layoutDefault][bordered]) .notificationBtn,:host(:not([layout])[bordered]) .notificationBtn{display:block;width:var(--ds-size-300, 1.5rem);height:var(--ds-size-300, 1.5rem);padding:0;border:0;background:unset;cursor:pointer}:host([class=layoutDefault][bordered]) .notificationBtn [auro-icon],:host(:not([layout])[bordered]) .notificationBtn [auro-icon]{display:block;height:var(--ds-size-300, 1.5rem);--ds-auro-icon-size: var(--ds-size-300, 1.5rem)}:host([class=layoutDefault][bordered]) .notificationBtn [auro-icon][hidden],:host(:not([layout])[bordered]) .notificationBtn [auro-icon][hidden]{display:none}:host([class=layoutDefault]:not([bordered])) .typeIcon,:host([class=layoutDefault]:not([bordered])) .notificationIcons,:host(:not([layout]):not([bordered])) .typeIcon,:host(:not([layout]):not([bordered])) .notificationIcons{align-items:flex-end;padding-bottom:var(--ds-size-50, 0.25rem)}:host([class=layoutDefault]:not([bordered])) .clearBtn,:host(:not([layout]):not([bordered])) .clearBtn{transition:all .3s cubic-bezier(0.215, 0.61, 0.355, 1);overflow:hidden;width:0;opacity:0}.layoutDefault .wrapper:hover .clearBtn,.layoutDefault .wrapper:focus-within .clearBtn,:host(:not([layout])) .wrapper:hover .clearBtn,:host(:not([layout])) .wrapper:focus-within .clearBtn{width:calc(var(--ds-size-200, 1rem) + var(--ds-size-25, 0.125rem));height:calc(var(--ds-size-200, 1rem) + var(--ds-size-25, 0.125rem));opacity:1}:host([class=layoutDefault]:focus-within[type=password]) .notificationIcons[hasValue] .alertNotification,:host(:not([layout]):focus-within[type=password]) .notificationIcons[hasValue] .alertNotification{overflow:hidden;width:0;height:0;padding:0;margin:0;visibility:hidden}.layoutDefault input,:host(:not([layout])) input{border:unset}.layoutDefault .wrapper,:host(:not([layout])) .wrapper{position:relative;overflow:hidden;border-style:solid}:host([class=layoutDefault]:not([bordered],[borderless])) .wrapper,:host(:not([layout]):not([bordered],[borderless])) .wrapper{border-width:1px 0}:host([class=layoutDefault][bordered]) .wrapper,:host(:not([layout])[bordered]) .wrapper{border-width:1px;border-radius:var(--ds-border-radius, 0.375rem)}:host([class=layoutDefault]:not([borderless])) .wrapper:focus-within:before,:host(:not([layout]):not([borderless])) .wrapper:focus-within:before{position:absolute;display:block;border-bottom-width:1px;border-bottom-style:solid;content:"";inset:0;pointer-events:none}:host([class=layoutDefault][validity]:not([validity=valid])) .wrapper:before,:host(:not([layout])[validity]:not([validity=valid])) .wrapper:before{border-bottom:0}:focus:not(:focus-visible){outline:3px solid transparent}.util_displayInline{display:inline}.util_displayInlineBlock{display:inline-block}.util_displayBlock,:host{display:block}.util_displayFlex{display:flex}.util_displayHidden,:host([hidden]:not(:focus):not(:active)){display:none}.util_displayHiddenVisually,:host([hiddenVisually]:not(:focus):not(:active)){position:absolute;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);width:1px;height:1px;padding:0;border:0}:host{text-align:left}.layoutDefault :host,:host(:not([layout])) :host{position:relative;display:block}.layoutDefault .wrapper,:host(:not([layout])) .wrapper{display:flex;flex-direction:row}.layoutDefault .main,:host(:not([layout])) .main{display:flex;flex-direction:row;position:relative;flex:1}`;
6300
6293
 
@@ -10670,15 +10663,17 @@ class AuroFormValidation {
10670
10663
  );
10671
10664
  }
10672
10665
 
10673
- // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false;
10674
- if (this.auroInputElements?.length === 2) {
10675
- if (!this.auroInputElements[1].value || this.auroInputElements[1].length === 0) {
10666
+ const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
10667
+
10668
+ // If there is a second input in the elem and that value is undefined or an empty string set hasValue to false.
10669
+ // Skip for combobox: its second auro-input is the fullscreen-bib mirror of the same value, not an independent
10670
+ // field (datepicker is the intended consumer — start/end are independently required).
10671
+ if (this.auroInputElements?.length === 2 && !isCombobox) {
10672
+ if (!this.auroInputElements[1].value || this.auroInputElements[1].value.length === 0) {
10676
10673
  hasValue = false;
10677
10674
  }
10678
10675
  }
10679
10676
 
10680
- const isCombobox = this.runtimeUtils.elementMatch(elem, 'auro-combobox');
10681
-
10682
10677
  if (isCombobox) {
10683
10678
 
10684
10679
  if (!elem.persistInput || elem.behavior === "filter") {
@@ -16359,8 +16354,6 @@ function cleanEscapedString(input) {
16359
16354
  return input.match(escapedStringRegExp)[1].replace(doubleQuoteRegExp, "'");
16360
16355
  }
16361
16356
 
16362
- /* eslint-disable max-lines */
16363
-
16364
16357
  class AuroInputUtilities {
16365
16358
 
16366
16359
  /**
@@ -16403,7 +16396,7 @@ class AuroInputUtilities {
16403
16396
  /**
16404
16397
  * Converts an IMask-style date mask to a date-fns compatible format string.
16405
16398
  * @param {string} mask - IMask date mask (e.g. "MM/DD/YYYY").
16406
- * @returns {string} date-fns format string (e.g. "MM/dd/yyyy").
16399
+ * @returns {string} A date-fns format string (e.g. "MM/dd/yyyy").
16407
16400
  */
16408
16401
  toDateFnsMask(mask) {
16409
16402
  return mask
@@ -16625,6 +16618,7 @@ class AuroInputUtilities {
16625
16618
  const maskOptions = this.getMaskOptions('date', normalizedFormat);
16626
16619
 
16627
16620
  if (!(valueObject instanceof Date) || Number.isNaN(valueObject.getTime()) || !maskOptions || typeof maskOptions.format !== 'function') {
16621
+ console.debug('Invalid date object or mask options for formatting', { valueObject, maskOptions }); // eslint-disable-line no-console
16628
16622
  return undefined;
16629
16623
  }
16630
16624
 
@@ -16782,6 +16776,7 @@ class BaseInput extends AuroElement$1 {
16782
16776
  // so a parent (datepicker/combobox) calling `validate()` synchronously
16783
16777
  // during its own update cycle sees a populated util instance.
16784
16778
  this.activeLabel = false;
16779
+
16785
16780
  /** @private */
16786
16781
  this.allowedInputTypes = [
16787
16782
  "text",
@@ -16792,6 +16787,7 @@ class BaseInput extends AuroElement$1 {
16792
16787
  "tel"
16793
16788
  ];
16794
16789
  this.appearance = "default";
16790
+
16795
16791
  /** @private */
16796
16792
  this.dateFormatMap = {
16797
16793
  'mm/dd/yyyy': 'dateMMDDYYYY',
@@ -16810,23 +16806,24 @@ class BaseInput extends AuroElement$1 {
16810
16806
  'mm/dd': 'dateMMDD'
16811
16807
  };
16812
16808
  this.disabled = false;
16809
+
16813
16810
  /** @private */
16814
16811
  this.domHandler = new DomHandler();
16815
16812
  this.dvInputOnly = false;
16816
16813
  this.hasValue = false;
16817
16814
  this.hideLabelVisually = false;
16818
16815
  this.icon = false;
16816
+
16819
16817
  /** @private */
16820
16818
  this.inputIconName = undefined;
16819
+
16821
16820
  /** @private */
16822
16821
  this.label = 'Input label is undefined';
16823
16822
  this.layout = 'classic';
16824
16823
  this.locale = 'en-US';
16825
16824
  this.max = undefined;
16826
- this._maxObject = undefined;
16827
16825
  this.maxLength = undefined;
16828
16826
  this.min = undefined;
16829
- this._minObject = undefined;
16830
16827
  this.minLength = undefined;
16831
16828
  this.noValidate = false;
16832
16829
  this.onDark = false;
@@ -16843,23 +16840,27 @@ class BaseInput extends AuroElement$1 {
16843
16840
  "email"
16844
16841
  ];
16845
16842
  this.shape = 'classic';
16843
+
16846
16844
  /** @private */
16847
16845
  this.showPassword = false;
16848
16846
  this.size = 'lg';
16849
16847
  this.touched = false;
16848
+
16850
16849
  /** @private */
16851
16850
  this.uniqueId = new UniqueId().create();
16851
+
16852
16852
  /** @private */
16853
16853
  this.util = new AuroInputUtilities({
16854
16854
  locale: this.locale,
16855
16855
  format: this.format
16856
16856
  });
16857
+
16857
16858
  /** @private */
16858
16859
  this.validation = new AuroFormValidation();
16860
+
16859
16861
  /** @private */
16860
16862
  this.validationCCLength = undefined;
16861
16863
  this.value = undefined;
16862
- this._valueObject = undefined;
16863
16864
  }
16864
16865
 
16865
16866
  // function to define props used within the scope of this component
@@ -17297,7 +17298,7 @@ class BaseInput extends AuroElement$1 {
17297
17298
  * @returns {Date|undefined}
17298
17299
  */
17299
17300
  get valueObject() {
17300
- return this._valueObject || this._computeDateObjectFallback(this.value);
17301
+ return this.value && dateFormatter.isValidDate(this.value) ? dateFormatter.stringToDateInstance(this.value) : undefined;
17301
17302
  }
17302
17303
 
17303
17304
  /**
@@ -17305,7 +17306,7 @@ class BaseInput extends AuroElement$1 {
17305
17306
  * @returns {Date|undefined}
17306
17307
  */
17307
17308
  get minObject() {
17308
- return this._minObject || this._computeDateObjectFallback(this.min);
17309
+ return this.min && dateFormatter.isValidDate(this.min) ? dateFormatter.stringToDateInstance(this.min) : undefined;
17309
17310
  }
17310
17311
 
17311
17312
  /**
@@ -17313,50 +17314,7 @@ class BaseInput extends AuroElement$1 {
17313
17314
  * @returns {Date|undefined}
17314
17315
  */
17315
17316
  get maxObject() {
17316
- return this._maxObject || this._computeDateObjectFallback(this.max);
17317
- }
17318
-
17319
- /**
17320
- * Parses a date string into a Date object when the corresponding `_*Object`
17321
- * field hasn't been synced yet by `updated()`. Returns undefined when the
17322
- * input type/format isn't a full date or the string is not a valid date.
17323
- *
17324
- * Why this exists: a parent (datepicker) can call `inputN.validate()` from
17325
- * inside its own `updated()` before this input's `updated()` has run
17326
- * `syncDateValues()` — so `_valueObject`/`_maxObject` are still `undefined`
17327
- * and range checks would otherwise silently no-op (flipping the result to
17328
- * `valid` or `patternMismatch`).
17329
- * @private
17330
- * @param {string|undefined} dateStr - ISO date string from `value`/`min`/`max`.
17331
- * @returns {Date|undefined}
17332
- */
17333
- _computeDateObjectFallback(dateStr) {
17334
- if (!dateStr || !this.util || !this.util.isFullDateFormat(this.type, this.format)) {
17335
- return undefined;
17336
- }
17337
- if (!dateFormatter.isValidDate(dateStr)) {
17338
- return undefined;
17339
- }
17340
- return dateFormatter.stringToDateInstance(dateStr);
17341
- }
17342
-
17343
- /**
17344
- * Internal setter for readonly date object properties.
17345
- * @private
17346
- * @param {'valueObject'|'minObject'|'maxObject'} propertyName - Public object property name.
17347
- * @param {Date|undefined} propertyValue - Value to assign.
17348
- * @returns {void}
17349
- */
17350
- setDateObjectProperty(propertyName, propertyValue) {
17351
- const internalPropertyName = `_${propertyName}`;
17352
- const previousValue = this[internalPropertyName];
17353
-
17354
- if (previousValue === propertyValue) {
17355
- return;
17356
- }
17357
-
17358
- this[internalPropertyName] = propertyValue;
17359
- this.requestUpdate(propertyName, previousValue);
17317
+ return this.max && dateFormatter.isValidDate(this.max) ? dateFormatter.stringToDateInstance(this.max) : undefined;
17360
17318
  }
17361
17319
 
17362
17320
  connectedCallback() {
@@ -17385,7 +17343,6 @@ class BaseInput extends AuroElement$1 {
17385
17343
  format: this.format
17386
17344
  });
17387
17345
  this.configureDataForType();
17388
- this.syncDateValues();
17389
17346
  }
17390
17347
 
17391
17348
  disconnectedCallback() {
@@ -17424,7 +17381,6 @@ class BaseInput extends AuroElement$1 {
17424
17381
  this.setCustomHelpTextMessage();
17425
17382
  this.configureAutoFormatting();
17426
17383
  this.configureDataForType();
17427
- this.syncDateValues();
17428
17384
  }
17429
17385
 
17430
17386
  /**
@@ -17482,7 +17438,7 @@ class BaseInput extends AuroElement$1 {
17482
17438
 
17483
17439
  /**
17484
17440
  * @private
17485
- * @deprecated https://dev.azure.com/itsals/E_Retain_Content/_workitems/edit/1557296
17441
+ * @deprecated See https://dev.azure.com/itsals/E_Retain_Content/_workitems/edit/1557296.
17486
17442
  * @returns {void} Sets the default help text for the input.
17487
17443
  */
17488
17444
  setCustomHelpTextMessage() {
@@ -17568,8 +17524,6 @@ class BaseInput extends AuroElement$1 {
17568
17524
  this.configureDataForType();
17569
17525
  }
17570
17526
 
17571
- this.syncDateValues(changedProperties);
17572
-
17573
17527
  if (changedProperties.has('value')) {
17574
17528
  if (this.value && this.value.length > 0) {
17575
17529
  this.hasValue = true;
@@ -17591,14 +17545,14 @@ class BaseInput extends AuroElement$1 {
17591
17545
 
17592
17546
  if (formattedValue !== this.inputElement.value) {
17593
17547
  this.skipNextProgrammaticInputEvent = true;
17594
- if (this.maskInstance && this.type === 'credit-card') {
17548
+ if (this.maskInstance && this.type !== 'date') {
17595
17549
  // Route through the mask so its _value and el.value stay in lock-step
17596
17550
  // (set value calls updateControl which writes el.value = displayValue).
17597
17551
  // Writing el.value directly leaves the mask thinking displayValue is
17598
- // stale; _saveSelection on the next focus/click then warns. Scoped to
17599
- // credit-card so date's own formattedValue (raw ISO when calendar-invalid)
17600
- // isn't re-masked through the mm/dd/yyyy mask, which would truncate it
17601
- // and flip validity from patternMismatch to tooShort.
17552
+ // stale; _saveSelection on the next focus/click then warns. Date is
17553
+ // excluded because its formattedValue can be raw ISO when the calendar
17554
+ // is invalid, and re-masking through mm/dd/yyyy would truncate it and
17555
+ // flip validity from patternMismatch to tooShort.
17602
17556
  this.maskInstance.value = formattedValue || '';
17603
17557
  } else if (formattedValue) {
17604
17558
  this.inputElement.value = formattedValue;
@@ -17640,120 +17594,65 @@ class BaseInput extends AuroElement$1 {
17640
17594
  }));
17641
17595
  }
17642
17596
 
17643
-
17644
- /**
17645
- * Synchronizes the ISO string values and Date object representations for date-related properties.
17646
- * This keeps the model and display values aligned when either side changes.
17647
- *
17648
- * When a full date format is in use, this method updates `value`, `min`, and `max` from their corresponding
17649
- * Date objects or vice versa, based on which properties have changed. It only runs when the current configuration
17650
- * represents a full year/month/day date format.
17651
- *
17652
- * @param {Map<string, unknown>|undefined} [changedProperties=undefined] - Optional map of changed properties used to limit which values are synchronized.
17653
- * @returns {void}
17654
- * @private
17655
- */
17656
- syncDateValues(changedProperties = undefined) {
17657
- if (!this.util.isFullDateFormat(this.type, this.format)) {
17658
- return;
17659
- }
17660
-
17661
- this.syncSingleDateValue(changedProperties, 'valueObject', 'value');
17662
- this.syncSingleDateValue(changedProperties, 'minObject', 'min');
17663
- this.syncSingleDateValue(changedProperties, 'maxObject', 'max');
17664
- }
17665
-
17666
- /**
17667
- * Synchronizes one date object/string property pair.
17668
- * @private
17669
- * @param {Map<string, unknown>|undefined} changedProperties - Map of changed properties from Lit.
17670
- * @param {string} objectProperty - Date object property name.
17671
- * @param {string} valueProperty - ISO string property name.
17672
- * @returns {void}
17673
- */
17674
- syncSingleDateValue(changedProperties, objectProperty, valueProperty) {
17675
- const objectPropertyChanged = !changedProperties || changedProperties.has(objectProperty);
17676
-
17677
- // objectProperty wins over valueProperty when both changed
17678
- if (objectPropertyChanged && this[objectProperty]) {
17679
- this[valueProperty] = dateFormatter.toISOFormatString(this[objectProperty]);
17680
- return;
17681
- }
17682
-
17683
- const valuePropertyChanged = !changedProperties || changedProperties.has(valueProperty);
17684
- if (!valuePropertyChanged) {
17685
- return;
17686
- }
17687
-
17688
- // when value is newly set to the same ISO string that corresponds to the existing Date object, do not clear the Date object (avoid unnecessary updates)
17689
- if (
17690
- changedProperties &&
17691
- valueProperty === 'value' &&
17692
- changedProperties.get('value') === undefined &&
17693
- this[objectProperty] instanceof Date &&
17694
- this[valueProperty] === dateFormatter.toISOFormatString(this[objectProperty])
17695
- ) {
17696
- return;
17697
- }
17698
-
17699
- if (dateFormatter.isValidDate(this[valueProperty])) {
17700
- this.setDateObjectProperty(objectProperty, dateFormatter.stringToDateInstance(this[valueProperty]));
17701
- } else {
17702
- this.setDateObjectProperty(objectProperty, undefined);
17703
- }
17704
- }
17705
-
17706
17597
  /**
17707
17598
  * Sets up IMasks and logic based on auto-formatting requirements.
17708
17599
  * @private
17709
17600
  * @returns {void}
17710
17601
  */
17711
17602
  configureAutoFormatting() {
17712
- // Re-entrancy guard. The patched-setter's synthetic input event (suppressed
17713
- // by _configuringMask above) could otherwise trigger handleInput
17714
- // processCreditCard configureAutoFormatting before the outer call's
17715
- // set value has finished its alignCursor pass.
17603
+ // _configuringMask gates two things: external re-entry into this method
17604
+ // while setup is mid-flight (from property changes that call back here),
17605
+ // and the accept/complete listeners below — both need to ignore the mask
17606
+ // events fired by our own value-restore step.
17716
17607
  if (this._configuringMask) return;
17717
17608
  this._configuringMask = true;
17718
17609
  try {
17610
+ // Destroy any prior mask so IMask can attach fresh under the new format.
17611
+ // Null the reference too — if the new maskOptions.mask is falsy (e.g.
17612
+ // type switched from credit-card to text) the IMask() reassignment
17613
+ // below is skipped, and downstream writes at line ~823 would otherwise
17614
+ // route through the destroyed instance.
17719
17615
  if (this.maskInstance) {
17720
17616
  this.maskInstance.destroy();
17617
+ this.maskInstance = null;
17721
17618
  }
17722
17619
 
17723
- // Pass new format to util
17724
17620
  this.util.updateFormat(this.format);
17725
17621
 
17726
17622
  const maskOptions = this.util.getMaskOptions(this.type, this.format);
17727
17623
 
17728
17624
  if (this.inputElement && maskOptions.mask) {
17729
-
17730
- // Stash and clear any existing value before IMask init.
17731
- // IMask's constructor processes the current input value which requires
17732
- // selection state clearing first avoids that scenario entirely.
17733
- // When the format changes (e.g. locale switch) and we have a valid ISO
17734
- // model value, compute the display string for the NEW format instead of
17735
- // re-using the old display string, which may be invalid in the new mask.
17625
+ // Capture the current display so it can be re-applied after IMask
17626
+ // attaches. The restore at the bottom goes through maskInstance.value
17627
+ // (not inputElement.value directly) so the mask's internal state and
17628
+ // the input's displayed text stay in lock-step.
17736
17629
  let existingValue = this.inputElement.value;
17630
+
17631
+ // Format-change case (e.g. locale switch): existingValue is the OLD
17632
+ // mask's display string and may not parse under the new mask. When
17633
+ // we have a valid date model, rebuild the display from valueObject
17634
+ // (the canonical source) using the new mask's format function.
17737
17635
  if (
17738
17636
  this.util.isFullDateFormat(this.type, this.format) &&
17739
17637
  this.value &&
17740
- dateFormatter.isValidDate(this.value) &&
17741
- this.valueObject instanceof Date &&
17742
- !Number.isNaN(this.valueObject.getTime()) &&
17638
+ this.valueObject &&
17743
17639
  typeof maskOptions.format === 'function'
17744
17640
  ) {
17745
17641
  existingValue = maskOptions.format(this.valueObject);
17746
17642
  }
17747
17643
 
17644
+ // Clear before IMask attaches so the constructor seeds an empty
17645
+ // internal value. Otherwise IMask reads the stale unmasked string
17646
+ // and emits a spurious 'accept' before the restore below runs.
17748
17647
  this.skipNextProgrammaticInputEvent = true;
17749
17648
  this.inputElement.value = '';
17750
17649
 
17751
17650
  this.maskInstance = IMask(this.inputElement, maskOptions);
17752
17651
 
17652
+ // Mask fires 'accept' on every value change, including the restore
17653
+ // step below. Skip events fired during configureAutoFormatting so
17654
+ // we don't overwrite a value the parent just pushed.
17753
17655
  this.maskInstance.on('accept', () => {
17754
- // Suppress propagation during configureAutoFormatting's own value-restoration
17755
- // (line below) — the mask emits 'accept' on every value-set, including ours,
17756
- // and we don't want to overwrite a value the parent just pushed.
17757
17656
  if (this._configuringMask) return;
17758
17657
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
17759
17658
  if (this.type === "date") {
@@ -17761,6 +17660,8 @@ class BaseInput extends AuroElement$1 {
17761
17660
  }
17762
17661
  });
17763
17662
 
17663
+ // Mask fires 'complete' on the restore step below for any value that
17664
+ // happens to be a complete match. Same setup-suppression as 'accept'.
17764
17665
  this.maskInstance.on('complete', () => {
17765
17666
  if (this._configuringMask) return;
17766
17667
  this.value = this.util.toModelValue(this.maskInstance.value, this.format);
@@ -17769,7 +17670,9 @@ class BaseInput extends AuroElement$1 {
17769
17670
  }
17770
17671
  });
17771
17672
 
17772
- // Restore the stashed value through IMask so it's properly masked
17673
+ // Write existingValue through the mask (not the input directly) so
17674
+ // the mask reformats it under the new rules and keeps its internal
17675
+ // _value aligned with the input's displayed text.
17773
17676
  if (existingValue) {
17774
17677
  this.maskInstance.value = existingValue;
17775
17678
  }
@@ -17863,10 +17766,10 @@ class BaseInput extends AuroElement$1 {
17863
17766
  // the gated types currently support it, since the list is a public
17864
17767
  // property a consumer could mutate.
17865
17768
  if (this.setSelectionInputTypes.includes(this.type)) {
17866
- let selectionStart;
17769
+ let selectionStart = null;
17867
17770
  try {
17868
- selectionStart = this.inputElement.selectionStart;
17869
- } catch (error) { // eslint-disable-line no-unused-vars
17771
+ ({ selectionStart } = this.inputElement);
17772
+ } catch {
17870
17773
  return;
17871
17774
  }
17872
17775
  if (typeof selectionStart !== 'number') {
@@ -17875,7 +17778,7 @@ class BaseInput extends AuroElement$1 {
17875
17778
  this.updateComplete.then(() => {
17876
17779
  try {
17877
17780
  this.inputElement.setSelectionRange(selectionStart, selectionStart);
17878
- } catch (error) { // eslint-disable-line no-unused-vars
17781
+ } catch {
17879
17782
  // Some input types (number/email in certain UAs) throw on
17880
17783
  // setSelectionRange; swallow and let the native cursor stand.
17881
17784
  }
@@ -17969,7 +17872,6 @@ class BaseInput extends AuroElement$1 {
17969
17872
  */
17970
17873
  reset() {
17971
17874
  this.value = undefined;
17972
- this.setDateObjectProperty('valueObject', undefined);
17973
17875
  this.validation.reset(this);
17974
17876
  }
17975
17877
 
@@ -17978,7 +17880,6 @@ class BaseInput extends AuroElement$1 {
17978
17880
  */
17979
17881
  clear() {
17980
17882
  this.value = undefined;
17981
- this.setDateObjectProperty('valueObject', undefined);
17982
17883
  }
17983
17884
 
17984
17885
  /**
@@ -18053,7 +17954,7 @@ class BaseInput extends AuroElement$1 {
18053
17954
  /**
18054
17955
  * Function to support credit-card feature type.
18055
17956
  * @private
18056
- * @deprecated https://dev.azure.com/itsals/E_Retain_Content/_workitems/edit/1557296
17957
+ * @deprecated See https://dev.azure.com/itsals/E_Retain_Content/_workitems/edit/1557296.
18057
17958
  * @returns {object} JSON with data for credit card formatting.
18058
17959
  */
18059
17960
  matchInputValueToCreditCard() {
@@ -18507,7 +18408,7 @@ let AuroHelpText$1 = class AuroHelpText extends i$3 {
18507
18408
  }
18508
18409
  };
18509
18410
 
18510
- var formkitVersion$1 = '202606292156';
18411
+ var formkitVersion$1 = '202607011652';
18511
18412
 
18512
18413
  // Copyright (c) 2025 Alaska Airlines. All right reserved. Licensed under the Apache-2.0 license
18513
18414
  // See LICENSE in the project root for license information.
@@ -18830,7 +18731,7 @@ class AuroInput extends BaseInput {
18830
18731
  /**
18831
18732
  * Determines default help text string.
18832
18733
  * @private
18833
- * @deprecated https://dev.azure.com/itsals/E_Retain_Content/_workitems/edit/1557296
18734
+ * @deprecated See https://dev.azure.com/itsals/E_Retain_Content/_workitems/edit/1557296.
18834
18735
  * @returns {string} Evaluates pre-determined help text.
18835
18736
  */
18836
18737
  getHelpText() {
@@ -19633,7 +19534,7 @@ class AuroBibtemplate extends i$3 {
19633
19534
  }
19634
19535
  }
19635
19536
 
19636
- var formkitVersion = '202606292156';
19537
+ var formkitVersion = '202607011652';
19637
19538
 
19638
19539
  var styleCss$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}`;
19639
19540
 
@@ -20001,12 +19902,23 @@ function getOptionLabel(option) {
20001
19902
  if (!option) {
20002
19903
  return '';
20003
19904
  }
20004
- const clone = option.cloneNode(true);
20005
- const displayValueEl = clone.querySelector('[slot="displayValue"]');
20006
- if (displayValueEl) {
20007
- displayValueEl.remove();
19905
+
19906
+ // Consumer-provided override: short-circuit the DOM walk entirely.
19907
+ if (option.dataset && option.dataset.label) {
19908
+ return option.dataset.label;
19909
+ }
19910
+
19911
+ // Walk direct children — the `slot` attribute only applies to direct children
19912
+ // of the slot host, so a shallow filter is sufficient. Avoids the cloneNode +
19913
+ // querySelector allocation that ran on every keystroke via syncValuesAndStates.
19914
+ let text = '';
19915
+ for (const node of option.childNodes) {
19916
+ const isDisplayValueSlot = node.nodeType === Node.ELEMENT_NODE && node.getAttribute('slot') === 'displayValue';
19917
+ if (!isDisplayValueSlot) {
19918
+ text += node.textContent || '';
19919
+ }
20008
19920
  }
20009
- return (clone.textContent || '').replace(/\s+/gu, ' ').trim();
19921
+ return text.replace(/\s+/gu, ' ').trim();
20010
19922
  }
20011
19923
 
20012
19924
  // See https://git.io/JJ6SJ for "How to document your components using JSDoc"
@@ -20081,8 +19993,6 @@ class AuroCombobox extends AuroElement {
20081
19993
  this.availableOptions = [];
20082
19994
  this.dropdownId = undefined;
20083
19995
  this.dropdownOpen = false;
20084
- this.triggerExpandedState = false;
20085
- this._expandedTimeout = null;
20086
19996
  this._inFullscreenTransition = false;
20087
19997
  this.errorMessage = null;
20088
19998
  this.isHiddenWhileLoading = false;
@@ -20093,6 +20003,30 @@ class AuroCombobox extends AuroElement {
20093
20003
  this.touched = false;
20094
20004
  this.validation = new AuroFormValidation$1();
20095
20005
  this.validity = undefined;
20006
+ this._userTyped = false;
20007
+ // Tracks every setTimeout scheduled via _scheduleTimer so
20008
+ // disconnectedCallback can cancel them. Without this, a detached
20009
+ // combobox's pending timers still fire — most are no-ops, but
20010
+ // configureMenu's racing-condition retry would otherwise loop.
20011
+ this._pendingTimers = new Set();
20012
+ }
20013
+
20014
+ /**
20015
+ * Wraps setTimeout and records the timer id so disconnectedCallback
20016
+ * can cancel any outstanding callbacks. The id is removed from the set
20017
+ * once the callback fires so the set doesn't grow unbounded.
20018
+ * @param {Function} fn - Callback to run.
20019
+ * @param {number} ms - Delay in milliseconds.
20020
+ * @returns {number} The timer id.
20021
+ * @private
20022
+ */
20023
+ _scheduleTimer(fn, ms) {
20024
+ const id = setTimeout(() => {
20025
+ this._pendingTimers.delete(id);
20026
+ fn();
20027
+ }, ms);
20028
+ this._pendingTimers.add(id);
20029
+ return id;
20096
20030
  }
20097
20031
 
20098
20032
  // This function is to define props used within the scope of this component
@@ -20454,17 +20388,6 @@ class AuroCombobox extends AuroElement {
20454
20388
  attribute: false
20455
20389
  },
20456
20390
 
20457
- /**
20458
- * Deferred aria-expanded state for the trigger input.
20459
- * Delays the "true" transition so VoiceOver finishes its character echo
20460
- * before announcing "expanded".
20461
- * @private
20462
- */
20463
- triggerExpandedState: {
20464
- type: Boolean,
20465
- reflect: false,
20466
- attribute: false
20467
- },
20468
20391
  };
20469
20392
  }
20470
20393
 
@@ -20487,13 +20410,6 @@ class AuroCombobox extends AuroElement {
20487
20410
  return this.input.value;
20488
20411
  }
20489
20412
 
20490
- // /**
20491
- // * Sets the value of the input element within the combobox.
20492
- // */
20493
- // set inputValue(value) {
20494
- // this.input.value = value;
20495
- // }
20496
-
20497
20413
  /**
20498
20414
  * Checks if the element is valid.
20499
20415
  * @returns {boolean} - Returns true if the element is valid, false otherwise.
@@ -20620,7 +20536,7 @@ class AuroCombobox extends AuroElement {
20620
20536
  if (this.menu) {
20621
20537
  this.menu.matchWord = normalizeFilterValue(this.input.value);
20622
20538
  }
20623
- const label = getOptionLabel(this.menu.optionSelected) || this.menu.currentLabel;
20539
+ const label = getOptionLabel(this.menu.optionSelected);
20624
20540
  this.updateTriggerTextDisplay(label || this.value);
20625
20541
  }
20626
20542
 
@@ -20634,44 +20550,16 @@ class AuroCombobox extends AuroElement {
20634
20550
  // in suggestion mode, do not override input value if no selection has been made and the input currently has focus
20635
20551
  const isInputFocusedWithNoSelection = !this.menu.value && (this.input.matches(':focus-within') || (this.inputInBib && this.inputInBib.matches(':focus-within')));
20636
20552
 
20637
- if (!this.persistInput && !(this.behavior === 'suggestion' && isInputFocusedWithNoSelection)) {
20638
- const nextValue = label || this.value;
20639
- // Only set the flag when there's an actual write to suppress —
20640
- // syncValuesAndStates re-enters here during typing when both inputs
20641
- // already match, and a no-op flag flip would make the bib branch's
20642
- // bail eat legitimate user-input events.
20643
- const triggerNeedsSync = this.input.value !== nextValue;
20644
- const bibNeedsSync = Boolean(this.inputInBib && this.inputInBib !== this.input && this.inputInBib.value !== nextValue);
20645
- if (triggerNeedsSync || bibNeedsSync) {
20646
- this._syncingDisplayValue = true;
20647
- if (triggerNeedsSync) {
20648
- this.input.value = nextValue;
20649
- }
20650
- if (bibNeedsSync) {
20651
- this.inputInBib.value = nextValue;
20652
- }
20653
- const pending = [];
20654
- if (triggerNeedsSync) {
20655
- pending.push(this.input.updateComplete);
20656
- }
20657
- if (bibNeedsSync) {
20658
- pending.push(this.inputInBib.updateComplete);
20659
- }
20660
- Promise.all(pending).then(() => {
20661
- // imask reasserts otherwise, and handleBlur reverts to its stale value.
20662
- if (triggerNeedsSync && this.input.maskInstance && typeof this.input.maskInstance.updateValue === 'function') {
20663
- this.input.maskInstance.updateValue();
20664
- }
20665
- if (bibNeedsSync && this.inputInBib && this.inputInBib.maskInstance && typeof this.inputInBib.maskInstance.updateValue === 'function') {
20666
- this.inputInBib.maskInstance.updateValue();
20667
- }
20668
- this._syncingDisplayValue = false;
20669
- });
20670
- }
20553
+ const suppressed = this.persistInput || (this.behavior === 'suggestion' && isInputFocusedWithNoSelection);
20554
+ if (!suppressed) {
20555
+ this.syncInputValuesAcrossTriggerAndBib(label || this.value);
20671
20556
  }
20672
20557
 
20673
- // update the displayValue in the trigger if displayValue slot content is present
20674
- const displayValueInTrigger = this.input.querySelector('[slot="displayValue"]');
20558
+ // Replace any previously appended displayValue clone in the trigger.
20559
+ // :not(slot) excludes the template's <slot name="displayValue"
20560
+ // slot="displayValue"> forwarder, which also has slot="displayValue"
20561
+ // and would otherwise be matched first and removed.
20562
+ const displayValueInTrigger = this.input.querySelector('[slot="displayValue"]:not(slot)');
20675
20563
 
20676
20564
  if (displayValueInTrigger) {
20677
20565
  displayValueInTrigger.remove();
@@ -20695,6 +20583,53 @@ class AuroCombobox extends AuroElement {
20695
20583
  this.requestUpdate();
20696
20584
  }
20697
20585
 
20586
+ /**
20587
+ * Writes nextValue to the trigger input and the bib input when their current
20588
+ * value differs, then re-asserts imask after Lit's update flushes.
20589
+ * @param {string} nextValue - The value to write to both inputs.
20590
+ * @returns {Promise<void>} Resolves after both inputs flush and imask
20591
+ * re-asserts; resolves immediately when no sync is needed.
20592
+ * @private
20593
+ */
20594
+ async syncInputValuesAcrossTriggerAndBib(nextValue) {
20595
+ // Only set the flag when there's an actual write to suppress —
20596
+ // syncValuesAndStates re-enters here during typing when both inputs
20597
+ // already match, and a no-op flag flip would make the bib branch's
20598
+ // bail eat legitimate user-input events.
20599
+ const triggerNeedsSync = this.input.value !== nextValue;
20600
+ const bibNeedsSync = Boolean(this.inputInBib) && this.inputInBib.value !== nextValue;
20601
+ if (!triggerNeedsSync && !bibNeedsSync) {
20602
+ return;
20603
+ }
20604
+
20605
+ this._syncingDisplayValue = true;
20606
+
20607
+ const pending = [];
20608
+ if (triggerNeedsSync) {
20609
+ this.input.value = nextValue;
20610
+ pending.push(this.input.updateComplete);
20611
+ }
20612
+ if (bibNeedsSync) {
20613
+ this.inputInBib.value = nextValue;
20614
+ pending.push(this.inputInBib.updateComplete);
20615
+ }
20616
+ // finally — not a bare .then — so that an imask throw (see commit
20617
+ // d1857401c: imask can throw on credit-card format change) doesn't strand
20618
+ // _syncingDisplayValue=true and silently swallow every subsequent input.
20619
+ try {
20620
+ await Promise.all(pending);
20621
+ // imask reasserts otherwise, and handleBlur reverts to its stale value.
20622
+ if (triggerNeedsSync && this.input.maskInstance && typeof this.input.maskInstance.updateValue === 'function') {
20623
+ this.input.maskInstance.updateValue();
20624
+ }
20625
+ if (bibNeedsSync && this.inputInBib.maskInstance && typeof this.inputInBib.maskInstance.updateValue === 'function') {
20626
+ this.inputInBib.maskInstance.updateValue();
20627
+ }
20628
+ } finally {
20629
+ this._syncingDisplayValue = false;
20630
+ }
20631
+ }
20632
+
20698
20633
  /**
20699
20634
  * Processes hidden state of all menu options and determines if there are any available options not hidden.
20700
20635
  * @private
@@ -20703,6 +20638,13 @@ class AuroCombobox extends AuroElement {
20703
20638
  handleMenuOptions() {
20704
20639
  this.generateOptionsArray();
20705
20640
  this.availableOptions = [];
20641
+ // Single source of truth for the menu's filter/highlight token per call.
20642
+ // syncValuesAndStates re-writes the same value on exact-match keystrokes —
20643
+ // Lit's hasChanged makes that a no-op — and the prior duplicate set inside
20644
+ // handleTriggerInputValueChange is gone.
20645
+ if (this.menu) {
20646
+ this.menu.matchWord = normalizeFilterValue(this.input.value);
20647
+ }
20706
20648
  this.updateFilter();
20707
20649
 
20708
20650
  // Set aria-setsize/aria-posinset on each visible option so screen readers
@@ -20714,17 +20656,14 @@ class AuroCombobox extends AuroElement {
20714
20656
  option.setAttribute('aria-posinset', index + 1);
20715
20657
  });
20716
20658
 
20717
- if (this.value && this.input.value && !this.menu.value) {
20718
- if (this.behavior === 'suggestion' && this.menu.options && this.menu.options.some((opt) => opt.value === this.value)) {
20719
- this.setMenuValue(this.value);
20720
- }
20721
-
20659
+ if (this.input.value && this.menu.options && this.menu.options.some((opt) => opt.value === this.input.value)) {
20660
+ this.setMenuValue(this.input.value);
20722
20661
  this.syncValuesAndStates();
20723
20662
  }
20724
20663
 
20725
- // Re-activate when optionActive is no longer visible, or when _index has
20726
- // been reset (e.g. by clearSelection in an async update) so that
20727
- // makeSelection() can find the correct option.
20664
+ // Re-activate when optionActive is not in the current scrollable viewport,
20665
+ // or when _index has been reset (e.g. by clearSelection in an async update)
20666
+ // so that makeSelection() can find the correct option.
20728
20667
  if (!this.availableOptions.includes(this.menu.optionActive) || this.menu._index < 0) {
20729
20668
  this.activateFirstEnabledAvailableOption();
20730
20669
  }
@@ -20797,18 +20736,6 @@ class AuroCombobox extends AuroElement {
20797
20736
  this.dropdownOpen = ev.detail.expanded;
20798
20737
  this.updateMenuShapeSize();
20799
20738
 
20800
- // Defer aria-expanded "true" so VoiceOver finishes character echo
20801
- // before announcing "expanded". Set "false" immediately on close.
20802
- clearTimeout(this._expandedTimeout);
20803
- if (this.dropdownOpen) {
20804
- const expandedDelay = 150;
20805
- this._expandedTimeout = setTimeout(() => {
20806
- this.triggerExpandedState = true;
20807
- }, expandedDelay);
20808
- } else {
20809
- this.triggerExpandedState = false;
20810
- }
20811
-
20812
20739
  // Clear aria-activedescendant when dropdown closes
20813
20740
  if (!this.dropdownOpen && this.input) {
20814
20741
  this.input.setActiveDescendant(null);
@@ -20858,28 +20785,25 @@ class AuroCombobox extends AuroElement {
20858
20785
 
20859
20786
  guardTouchPassthrough(this.menu);
20860
20787
 
20861
- // The dialog's showModal() steals focus from the trigger.
20862
- // A single rAF is enough for the dialog DOM to be painted and
20863
- // focusable, then doubleRaf finalizes the transition.
20788
+ // showModal() takes focus away from the trigger. Early focus once
20789
+ // the dialog has painted; the shared doubleRaf below is the fallback
20790
+ // for when the dialog needs an extra frame and also clears the
20791
+ // validation guard.
20864
20792
  requestAnimationFrame(() => {
20865
20793
  this.setInputFocus();
20866
20794
  });
20867
-
20868
- doubleRaf(() => {
20869
- this.setInputFocus();
20870
- this._inFullscreenTransition = false;
20871
- });
20872
- } else {
20873
- // Desktop popover-open: restore the trigger caret to end-of-text.
20874
- // Clicking the trigger lands on auro-input's floating <label for="…">
20875
- // overlay; Chrome resets the native input's selection to [0, 0] on
20876
- // label-focus before any JS runs. setInputFocus()'s non-fullscreen
20877
- // branch parks the caret at end. doubleRaf lets the dropdown layout
20878
- // settle first, matching the fullscreen branch timing.
20879
- doubleRaf(() => {
20880
- this.setInputFocus();
20881
- });
20882
20795
  }
20796
+ // else (desktop popover-open): Chrome resets the trigger caret to
20797
+ // [0, 0] when its floating <label for="…"> overlay receives focus.
20798
+ // The shared doubleRaf below parks the caret back at end-of-text
20799
+ // after the dropdown layout settles.
20800
+
20801
+ doubleRaf(() => {
20802
+ this.setInputFocus();
20803
+ if (this._inFullscreenTransition) {
20804
+ this._inFullscreenTransition = false;
20805
+ }
20806
+ });
20883
20807
  }
20884
20808
  });
20885
20809
 
@@ -20916,7 +20840,7 @@ class AuroCombobox extends AuroElement {
20916
20840
  this.dropdown.trigger.inert = false;
20917
20841
  }
20918
20842
 
20919
- setTimeout(() => {
20843
+ this._scheduleTimer(() => {
20920
20844
  this.setInputFocus();
20921
20845
  }, 0);
20922
20846
  });
@@ -21060,7 +20984,7 @@ class AuroCombobox extends AuroElement {
21060
20984
 
21061
20985
  // racing condition on custom-combobox with custom-menu
21062
20986
  if (!this.menu) {
21063
- setTimeout(() => {
20987
+ this._scheduleTimer(() => {
21064
20988
  this.configureMenu();
21065
20989
  }, 0);
21066
20990
  return;
@@ -21090,7 +21014,7 @@ class AuroCombobox extends AuroElement {
21090
21014
  if (this.menu.optionSelected) {
21091
21015
  const selected = this.menu.optionSelected;
21092
21016
 
21093
- if (!this.optionSelected || this.optionSelected !== selected) {
21017
+ if (this.optionSelected !== selected) {
21094
21018
  this.optionSelected = selected;
21095
21019
  }
21096
21020
 
@@ -21103,7 +21027,7 @@ class AuroCombobox extends AuroElement {
21103
21027
  }
21104
21028
 
21105
21029
  // Update display
21106
- this.updateTriggerTextDisplay(getOptionLabel(this.optionSelected) || this.menu.value);
21030
+ this.updateTriggerTextDisplay(getOptionLabel(this.optionSelected));
21107
21031
 
21108
21032
  // Update match word for filtering
21109
21033
  const trimmedInput = normalizeFilterValue(this.input.value);
@@ -21115,17 +21039,24 @@ class AuroCombobox extends AuroElement {
21115
21039
  // Hide dropdown on selection (except during slot changes)
21116
21040
  if (evt.detail && evt.detail.source !== 'slotchange') {
21117
21041
  // do not close while typing in suggestion mode with no value selected, to allow freeform input
21118
- if (this.menu.value || this.behavior !== 'suggestion') {
21119
- this.hideBib();
21042
+ this.hideBib();
21043
+
21044
+ // Move focus to the clear button when the user makes a selection.
21045
+ if (!isEcho && this.menu.value !== undefined) {
21046
+ this.setClearBtnFocus();
21120
21047
  }
21121
21048
 
21122
21049
  // Announce the selection after the dropdown closes so it isn't
21123
21050
  // overridden by VoiceOver's "collapsed" announcement from aria-expanded.
21051
+ // Skip when there's no selected value (e.g. menu.clearSelection() from
21052
+ // the unmatched-value path), otherwise VoiceOver reads "undefined".
21124
21053
  const selectedValue = this.menu.value;
21125
- const announcementDelay = 300;
21126
- setTimeout(() => {
21127
- announceToScreenReader(this._getAnnouncementRoot(), `${selectedValue}, selected`);
21128
- }, announcementDelay);
21054
+ if (selectedValue) {
21055
+ const announcementDelay = 300;
21056
+ this._scheduleTimer(() => {
21057
+ announceToScreenReader(this._getAnnouncementRoot(), `${selectedValue}, selected`);
21058
+ }, announcementDelay);
21059
+ }
21129
21060
  }
21130
21061
 
21131
21062
  // Programmatic value syncs leave availableOptions stale because
@@ -21134,22 +21065,6 @@ class AuroCombobox extends AuroElement {
21134
21065
  // only — fresh user selections take the existing hideBib path.
21135
21066
  if (isEcho && this.menu.optionSelected) {
21136
21067
  this._programmaticFilterRefresh = true;
21137
- this.handleMenuOptions();
21138
- setTimeout(() => {
21139
- this._programmaticFilterRefresh = false;
21140
- }, 0);
21141
- }
21142
-
21143
- // base-input skips auto-validate when focus is inside its own shadow,
21144
- // which it is after setTriggerInputFocus — re-run so prior tooShort
21145
- // clears. processCreditCard reasserts errorMessage on every render.
21146
- if (!isEcho && this.menu.optionSelected && this.input.validate) {
21147
- this.input.updateComplete.then(() => {
21148
- this.input.validate(true);
21149
- if (this.input.validity === 'valid') {
21150
- this.input.errorMessage = '';
21151
- }
21152
- });
21153
21068
  }
21154
21069
  });
21155
21070
 
@@ -21162,6 +21077,14 @@ class AuroCombobox extends AuroElement {
21162
21077
  // stale option. Safe from re-entrancy because any resulting
21163
21078
  // input.value changes dispatch isProgrammatic events.
21164
21079
  this.menu.addEventListener('auroMenu-selectValueFailure', () => {
21080
+ // Announce the rejection BEFORE we clear `this.value` so the live
21081
+ // region carries the attempted value — without this the bib closes
21082
+ // silently and screen-reader users get no signal that their request
21083
+ // (e.g. a direct setMenuValue() call) was dropped.
21084
+ const attemptedValue = this.value;
21085
+ if (attemptedValue) {
21086
+ announceToScreenReader(this._getAnnouncementRoot(), `No matching option for ${attemptedValue}`);
21087
+ }
21165
21088
  this.value = undefined;
21166
21089
  this.optionSelected = undefined;
21167
21090
  });
@@ -21173,10 +21096,13 @@ class AuroCombobox extends AuroElement {
21173
21096
  this.input.setActiveDescendant(this.optionActive);
21174
21097
  }
21175
21098
 
21176
- // Announce the active option for screen readers including position,
21177
- // since shadow DOM boundaries prevent native reading of
21178
- // aria-setsize/aria-posinset via aria-activedescendant.
21179
- if (this.optionActive) {
21099
+ // In fullscreen mode the menu sits inside a nested <dialog> shadow root,
21100
+ // and aria-activedescendant references across that boundary are lost —
21101
+ // VoiceOver/NVDA don't read the active option natively, so we mirror it
21102
+ // into the polite live region. In popover mode aria-activedescendant on
21103
+ // the trigger input is read natively; double-announcing would flood the
21104
+ // queue on arrow-key repeat.
21105
+ if (this.optionActive && this.dropdown.isBibFullscreen) {
21180
21106
  const optionText = this.optionActive.textContent.trim();
21181
21107
  const selectedState = this.optionActive.hasAttribute('selected') ? ', selected' : ', not selected';
21182
21108
  const optionIndex = this.availableOptions.indexOf(this.optionActive) + 1;
@@ -21209,7 +21135,12 @@ class AuroCombobox extends AuroElement {
21209
21135
  * Validate every time we remove focus from the combo box.
21210
21136
  */
21211
21137
  this.addEventListener('focusout', () => {
21212
- if (!this.componentHasFocus && !this._inFullscreenTransition) {
21138
+ // Skip while the dropdown is open — focus transits out briefly on
21139
+ // mousedown of a menu option (popover top-layer breaks :focus-within),
21140
+ // and validating against the pre-selection value flashes a stale error
21141
+ // between mousedown and mouseup. The next focusout fires after the
21142
+ // dropdown closes and validates against the post-selection value.
21143
+ if (!this.componentHasFocus && !this._inFullscreenTransition && !this.dropdownOpen) {
21213
21144
  this.validate();
21214
21145
  }
21215
21146
  });
@@ -21272,49 +21203,40 @@ class AuroCombobox extends AuroElement {
21272
21203
  if (this._syncingDisplayValue) {
21273
21204
  return;
21274
21205
  }
21275
- this._syncingBibValue = true;
21276
- this.input.value = this.inputInBib.value;
21277
- this.input.updateComplete.then(() => {
21278
- this._syncingBibValue = false;
21279
- });
21280
-
21281
- // Run filtering inline — the re-entrant event won't reach this code.
21282
- this.menu.matchWord = normalizeFilterValue(this.inputInBib.value);
21283
- this.optionActive = null;
21284
21206
 
21285
- // In suggestion mode, keep the combobox value in sync with the typed
21286
- // text so that freeform values are captured (mirroring the non-fullscreen
21287
- // path). Clear the selection when the input is emptied.
21288
- if (this.behavior === 'suggestion') {
21289
- this.value = this.inputInBib.value || undefined;
21207
+ // Filtering runs via re-entrance: writing this.input.value below
21208
+ // dispatches an 'input' event that the trigger's listener routes to
21209
+ // handleTriggerInputValueChange, which refreshes the menu filter.
21210
+ if (this.input.value !== this.inputInBib.value) {
21211
+ this._syncingBibValue = true;
21212
+ this.input.value = this.inputInBib.value;
21213
+ this.input.updateComplete.then(() => {
21214
+ this._syncingBibValue = false;
21215
+ });
21290
21216
  }
21291
21217
 
21292
- this.handleMenuOptions();
21293
21218
  this.dispatchEvent(new CustomEvent('inputValue', { detail: { value: this.inputValue } }));
21294
- return;
21219
+ } else if (event.target === this.input) {
21220
+
21221
+ // Also sync the native input immediately so keystrokes arriving
21222
+ // before Lit's async update cycle (e.g. rapid Backspaces during a
21223
+ // fullscreen transition) operate on the correct content.
21224
+ // Skip the next programmatic input event to prevent the patched setter
21225
+ // from re-entering handleInputValueChange via the bib path.
21226
+ const bibNativeInput = this.inputInBib.inputElement;
21227
+ if (bibNativeInput && bibNativeInput.value !== this.input.value) {
21228
+ this.inputInBib.skipNextProgrammaticInputEvent = true;
21229
+ bibNativeInput.value = this.input.value || '';
21230
+ }
21295
21231
  }
21296
21232
 
21233
+ this.value = this.input.value;
21234
+
21297
21235
  // Ignore re-entrant input events caused by programmatic value sets.
21298
21236
  if (this._syncingBibValue || this._syncingDisplayValue) {
21299
21237
  return;
21300
21238
  }
21301
21239
 
21302
- this.inputInBib.value = this.input.value;
21303
-
21304
- // Also sync the native input immediately so keystrokes arriving
21305
- // before Lit's async update cycle (e.g. rapid Backspaces during a
21306
- // fullscreen transition) operate on the correct content.
21307
- // Skip the next programmatic input event to prevent the patched setter
21308
- // from re-entering handleInputValueChange via the bib path.
21309
- const bibNativeInput = this.inputInBib.inputElement;
21310
- if (bibNativeInput && bibNativeInput.value !== this.input.value) {
21311
- this.inputInBib.skipNextProgrammaticInputEvent = true;
21312
- bibNativeInput.value = this.input.value || '';
21313
- }
21314
-
21315
- this.menu.matchWord = normalizeFilterValue(this.input.value);
21316
- this.optionActive = null;
21317
-
21318
21240
  if (this.behavior === 'suggestion') {
21319
21241
  this.value = this.input.value;
21320
21242
  }
@@ -21322,7 +21244,6 @@ class AuroCombobox extends AuroElement {
21322
21244
  if (!this.input.value && !this._clearing) {
21323
21245
  this.clear();
21324
21246
  }
21325
- this.handleMenuOptions();
21326
21247
 
21327
21248
  // Validate only if the value was set programmatically (not during user
21328
21249
  // interaction). In fullscreen dialog mode, componentHasFocus returns false
@@ -21332,34 +21253,44 @@ class AuroCombobox extends AuroElement {
21332
21253
  this.validate();
21333
21254
  }
21334
21255
 
21335
- if (this.input.value && this.input.value.length === 0) {
21336
- // Hide menu if value is empty, otherwise show if there are available suggestions
21337
- this.hideBib();
21338
- } else if (this.menu.loading) {
21339
- // if input has value but menu is loading, show bib immediately
21340
- this.showBib();
21341
- } else if (this.availableOptions.length === 0 && !this.dropdown.isBibFullscreen) {
21342
- // Force dropdown bib to hide if input value has no matching suggestions
21343
- this.hideBib();
21256
+ this.dispatchEvent(new CustomEvent('inputValue', { detail: { value: this.inputValue } }));
21257
+ }
21258
+
21259
+ /**
21260
+ * Handles input value changes originating from the trigger input.
21261
+ * Refreshes menu options and filtering, delegates to handleInputValueChange
21262
+ * for value synchronization, and manages fullscreen bib focus.
21263
+ * @private
21264
+ * @param {Event} event - The input event from the trigger input element.
21265
+ * @returns {void}
21266
+ */
21267
+ handleTriggerInputValueChange(event) {
21268
+ // 'input' fires for every user-initiated value change — typing, paste,
21269
+ // IME composition end, dead-key composition, drag-drop. Flip _userTyped
21270
+ // here so updated('availableOptions') auto-opens the bib for sources
21271
+ // that keydown alone misses: paste fires no keydown, IME uses
21272
+ // key='Process', and dead keys produce multi-char keys (all bypass the
21273
+ // prior keydown.key.length===1 gate). Skip programmatic syncs.
21274
+ if (!this._syncingDisplayValue && !this._syncingBibValue && !this._programmaticFilterRefresh) {
21275
+ this._userTyped = true;
21344
21276
  }
21345
21277
 
21346
- // iOS virtual keyboard retention: when in fullscreen mode, ensure the
21347
- // dialog opens and the bib input is focused synchronously within the
21348
- // input event (user gesture) chain. Without this, Lit's async update
21349
- // cycle delays showModal() past the user activation window, causing
21350
- // iOS Safari to dismiss the virtual keyboard when the fullscreen
21351
- // dialog opens — the user then has to tap the input again to resume
21352
- // typing.
21353
- if (this.dropdown.isBibFullscreen && this.input.value && this.input.value.length > 0) {
21354
- if (!this.dropdown.isPopoverVisible) {
21355
- this.showBib();
21356
- }
21357
- if (this.dropdown.isPopoverVisible) {
21358
- this.setInputFocus();
21359
- }
21278
+ this.handleMenuOptions();
21279
+ this.optionActive = null;
21280
+
21281
+ if (this.value === this.input.value) {
21282
+ return;
21360
21283
  }
21361
21284
 
21362
- this.dispatchEvent(new CustomEvent('inputValue', { detail: { value: this.inputValue } }));
21285
+ this.handleInputValueChange(event);
21286
+
21287
+ if (this.dropdown.isBibFullscreen && this.input.value && this.input.value.length > 0 && this.dropdown.isPopoverVisible) {
21288
+ this.setInputFocus();
21289
+ }
21290
+
21291
+ if (this._programmaticFilterRefresh) {
21292
+ this._programmaticFilterRefresh = false;
21293
+ }
21363
21294
  }
21364
21295
 
21365
21296
  /**
@@ -21427,6 +21358,11 @@ class AuroCombobox extends AuroElement {
21427
21358
  disconnectedCallback() {
21428
21359
  super.disconnectedCallback();
21429
21360
  this._inFullscreenTransition = false;
21361
+ // Cancel any outstanding timers so detached callbacks don't fire on
21362
+ // disposed DOM — most are no-ops, but configureMenu's racing-condition
21363
+ // retry would otherwise keep rescheduling itself indefinitely.
21364
+ this._pendingTimers.forEach((id) => clearTimeout(id));
21365
+ this._pendingTimers.clear();
21430
21366
  }
21431
21367
 
21432
21368
  firstUpdated() {
@@ -21468,7 +21404,7 @@ class AuroCombobox extends AuroElement {
21468
21404
  this.menu.value = value;
21469
21405
  // Backup clear: if menu.value === menu.optionSelected.value already, the
21470
21406
  // listener won't fire and the flag would swallow the next user click.
21471
- setTimeout(() => {
21407
+ this._scheduleTimer(() => {
21472
21408
  this._pendingMenuValueSync = false;
21473
21409
  }, 0);
21474
21410
  }
@@ -21485,15 +21421,7 @@ class AuroCombobox extends AuroElement {
21485
21421
  this.menu.value = undefined;
21486
21422
  this.validation.reset(this);
21487
21423
  this.touched = false;
21488
- // Force validity back to the cleared state. validation.reset() calls
21489
- // validate() at the end, and (post-credit-card-fix) the trigger input's
21490
- // residual validity may still be copied into the combobox by the
21491
- // auroInputElements loop. Explicitly clear here so reset() actually
21492
- // leaves the component in a "no validity" state.
21493
21424
  this.validity = undefined;
21494
- this.errorMessage = '';
21495
- this.input.validity = undefined;
21496
- this.input.errorMessage = '';
21497
21425
  }
21498
21426
 
21499
21427
  /**
@@ -21511,6 +21439,17 @@ class AuroCombobox extends AuroElement {
21511
21439
  this.optionSelected = undefined;
21512
21440
  this.value = undefined;
21513
21441
 
21442
+ // Clear the appended displayValue clone in the trigger if present.
21443
+ // :not(slot) excludes the template's <slot name="displayValue"
21444
+ // slot="displayValue"> forwarder (line 1816), which also has
21445
+ // slot="displayValue" and would otherwise be matched first and removed,
21446
+ // permanently breaking the consumer-provided displayValue slot.
21447
+ const displayValueInTrigger = this.input.querySelector('[slot="displayValue"]:not(slot)');
21448
+
21449
+ if (displayValueInTrigger) {
21450
+ displayValueInTrigger.remove();
21451
+ }
21452
+
21514
21453
  if (this.input.value) {
21515
21454
  this.input.clear();
21516
21455
  }
@@ -21534,81 +21473,50 @@ class AuroCombobox extends AuroElement {
21534
21473
  }
21535
21474
 
21536
21475
  updated(changedProperties) {
21537
- // After the component is ready, send direct value changes to auro-menu.
21476
+ // After the component is ready, propagate direct changes down to child components.
21538
21477
  if (changedProperties.has('value')) {
21539
- if (this.value && this.value.length > 0) {
21540
- this.hasValue = true;
21541
- } else {
21542
- this.hasValue = false;
21478
+ // Only flag programmatic refreshes — user-typed value changes must not
21479
+ // suppress the availableOptions branch's showBib(). Firefox batches
21480
+ // 'value' and 'availableOptions' into the same updated() call, so
21481
+ // setting the flag unconditionally here masks the user-typed open path.
21482
+ if (!this._userTyped) {
21483
+ this._programmaticFilterRefresh = true;
21543
21484
  }
21544
21485
 
21545
- if (this.hasValue && !this.input.value && (!this.menu.options || this.menu.options.length === 0)) {
21546
- this.input.value = this.value;
21547
- }
21486
+ if (this.input.value !== this.value) {
21487
+ // Clear menu.value AND menu.optionSelected together. Clearing only
21488
+ // menu.value leaves the previously-selected option element pinned
21489
+ // as menu.optionSelected; a later auroMenu-selectedOption event
21490
+ // would then write its stale .value back into combobox.value
21491
+ // (e.g. Tab-after-Backspace re-selecting the prior option).
21492
+ if (this.menu.value || this.menu.optionSelected) {
21493
+ this.menu.clearSelection();
21494
+ }
21548
21495
 
21549
- // Sync menu.value only when an option actually matches; otherwise clear it.
21550
- if (this.menu.options && this.menu.options.length > 0) {
21551
- if (this.menu.options.some((opt) => opt.value === this.value)) {
21552
- this.setMenuValue(this.value);
21553
- } else if (this.behavior === 'filter') {
21554
- // In filter mode, freeform values aren't allowed. Push the unmatched
21555
- // value through setMenuValue so menu dispatches auroMenu-selectValueFailure
21556
- // and the listener at line 1206 clears combobox.value (mirrors select's
21557
- // pattern). Bypassing setMenuValue here would skip the failure cascade.
21558
- this.setMenuValue(this.value);
21559
- } else {
21560
- if (this.menu.value) {
21561
- this.menu.value = undefined;
21562
- }
21563
- // Sync the display for programmatic freeform value changes (e.g. the
21564
- // swap-values pattern). Guard with _syncingDisplayValue so that the
21565
- // re-entrant input event from base-input.notifyValueChanged() is
21566
- // ignored by handleInputValueChange. Skip the sync when input already
21567
- // matches to avoid spurious events during the normal typing path.
21568
- const nextValue = this.value || '';
21569
- const triggerNeedsSync = this.input.value !== nextValue;
21570
- const bibNeedsSync = Boolean(this.inputInBib && this.inputInBib !== this.input && this.inputInBib.value !== nextValue);
21571
- if (triggerNeedsSync || bibNeedsSync) {
21572
- this._syncingDisplayValue = true;
21573
- if (triggerNeedsSync) {
21574
- this.input.value = nextValue;
21575
- }
21576
- if (bibNeedsSync) {
21577
- this.inputInBib.value = nextValue;
21578
- }
21579
- const pending = [];
21580
- if (triggerNeedsSync) {
21581
- pending.push(this.input.updateComplete);
21582
- }
21583
- if (bibNeedsSync) {
21584
- pending.push(this.inputInBib.updateComplete);
21585
- }
21586
- Promise.all(pending).then(() => {
21587
- if (triggerNeedsSync && this.input.maskInstance && typeof this.input.maskInstance.updateValue === 'function') {
21588
- this.input.maskInstance.updateValue();
21589
- }
21590
- if (bibNeedsSync && this.inputInBib && this.inputInBib.maskInstance && typeof this.inputInBib.maskInstance.updateValue === 'function') {
21591
- this.inputInBib.maskInstance.updateValue();
21592
- }
21593
- this._syncingDisplayValue = false;
21594
- // handleInputValueChange bailed on the flag — refresh the filter.
21595
- this._programmaticFilterRefresh = true;
21596
- this.handleMenuOptions();
21597
- setTimeout(() => {
21598
- this._programmaticFilterRefresh = false;
21599
- }, 0);
21600
- });
21601
- }
21496
+ if (!this.persistInput) {
21497
+ this.syncInputValuesAcrossTriggerAndBib(this.value || '');
21498
+ }
21499
+
21500
+ // Programmatic value with no matching option: updateFilter will close
21501
+ // the bib silently (see line 648 no noMatchOption + 0 results
21502
+ // hides). Announce so screen-reader users hear the request was
21503
+ // dropped. Gated on `input.value !== this.value` so this never fires
21504
+ // for user typing that path always reconciles input.value to
21505
+ // this.value before updated() runs.
21506
+ if (
21507
+ this.value &&
21508
+ this.menu &&
21509
+ this.menu.options &&
21510
+ this.menu.options.length > 0 &&
21511
+ !this.menu.options.some((opt) => opt.value === this.value)
21512
+ ) {
21513
+ announceToScreenReader(this._getAnnouncementRoot(), `No matching option for ${this.value}`);
21602
21514
  }
21603
21515
  }
21516
+
21604
21517
  if (!this.value) {
21605
21518
  this.clear();
21606
21519
  }
21607
- if (this.value && !this.componentHasFocus) {
21608
- // If the value got set programmatically make sure we hide the bib
21609
- // when input is not taking the focus (input can be in dropdown.trigger or in bibtemplate)
21610
- this.hideBib();
21611
- }
21612
21520
 
21613
21521
  // Sync the input and match word, but don't directly set menu.value again
21614
21522
  if (this.menu) {
@@ -21621,7 +21529,7 @@ class AuroCombobox extends AuroElement {
21621
21529
  composed: true,
21622
21530
  detail: {
21623
21531
  optionSelected: this.menu.optionSelected,
21624
- value: this.menu.value
21532
+ value: this.value
21625
21533
  }
21626
21534
  }));
21627
21535
 
@@ -21644,16 +21552,28 @@ class AuroCombobox extends AuroElement {
21644
21552
  // from a programmatic filter refresh after a value swap — the user
21645
21553
  // didn't interact, so we shouldn't auto-open the bib (especially for
21646
21554
  // the no-match path where the existing condition unconditionally fires).
21647
- if (this._programmaticFilterRefresh) {
21648
- this._programmaticFilterRefresh = false;
21649
- } else if ((this.availableOptions.length > 0 && (this.componentHasFocus || this.dropdownOpen)) || (this.menu && this.menu.loading) || (this.availableOptions.length === 0 && this.noMatchOption)) {
21650
- this.showBib();
21555
+ if ((this.menu && !this._programmaticFilterRefresh)) {
21556
+ if (
21557
+ this.availableOptions.length > 0 ||
21558
+ this.menu.loading ||
21559
+ this.noMatchOption
21560
+ ) {
21561
+ if (this._userTyped && !this.dropdownOpen) {
21562
+ this.showBib();
21563
+ }
21564
+ this._userTyped = false;
21565
+ }
21566
+
21651
21567
  if (!this.availableOptions.includes(this.menu.optionActive)) {
21652
21568
  this.activateFirstEnabledAvailableOption();
21653
21569
  }
21654
- } else if (this.dropdown && this.dropdown.isPopoverVisible) {
21570
+ } else if (!this.dropdown.isBibFullscreen) {
21655
21571
  this.hideBib();
21656
21572
  }
21573
+
21574
+ if (this._programmaticFilterRefresh) {
21575
+ this._programmaticFilterRefresh = false;
21576
+ }
21657
21577
  }
21658
21578
 
21659
21579
  if (changedProperties.has('error')) {
@@ -21795,10 +21715,10 @@ class AuroCombobox extends AuroElement {
21795
21715
  shape="${this.shape}"
21796
21716
  size="${this.size}">
21797
21717
  <${this.inputTag}
21798
- @input="${this.handleInputValueChange}"
21718
+ @input="${this.handleTriggerInputValueChange}"
21799
21719
  appearance="${this.onDark ? 'inverse' : this.appearance}"
21800
21720
  .a11yActivedescendant="${this.dropdownOpen && this.optionActive ? this.optionActive.id : undefined}"
21801
- .a11yExpanded="${this.triggerExpandedState}"
21721
+ .a11yExpanded="${this.dropdownOpen}"
21802
21722
  .a11yControls="${this.dropdownId}"
21803
21723
  .autocomplete="${this.autocomplete}"
21804
21724
  .inputmode="${this.inputmode}"