@sapudex/web-components 2.40.0 → 2.42.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 (163) hide show
  1. package/config/wdio.conf.cjs +18 -2
  2. package/cypress/specs/Dropdown.cy.tsx +90 -0
  3. package/cypress/specs/MessageStrip.cy.tsx +77 -0
  4. package/cypress/specs/PasswordField.cy.tsx +37 -0
  5. package/cypress/specs/Search.cy.tsx +244 -138
  6. package/cypress/specs/SelectBox.cy.tsx +184 -5
  7. package/cypress/support/component-imports.instrumented.ts +2 -0
  8. package/cypress/support/component-imports.src.ts +2 -0
  9. package/cypress.config.ts +10 -0
  10. package/dist/Dropdown.d.ts +5 -0
  11. package/dist/Dropdown.js +56 -0
  12. package/dist/Dropdown.js.map +1 -1
  13. package/dist/List.d.ts +1 -6
  14. package/dist/List.js +2 -10
  15. package/dist/List.js.map +1 -1
  16. package/dist/MastheadCountrySelector.d.ts +7 -0
  17. package/dist/MastheadCountrySelector.js +3 -0
  18. package/dist/MastheadCountrySelector.js.map +1 -1
  19. package/dist/MessageStrip.d.ts +25 -0
  20. package/dist/MessageStrip.js +16 -4
  21. package/dist/MessageStrip.js.map +1 -1
  22. package/dist/PasswordField.d.ts +10 -0
  23. package/dist/PasswordField.js +17 -2
  24. package/dist/PasswordField.js.map +1 -1
  25. package/dist/PasswordFieldTemplate.js +1 -1
  26. package/dist/PasswordFieldTemplate.js.map +1 -1
  27. package/dist/Search.d.ts +1 -1
  28. package/dist/Search.js +13 -9
  29. package/dist/Search.js.map +1 -1
  30. package/dist/SearchTemplate.js +3 -3
  31. package/dist/SearchTemplate.js.map +1 -1
  32. package/dist/SearchableListBase.d.ts +1 -6
  33. package/dist/SearchableListBase.js.map +1 -1
  34. package/dist/SearchableListBaseTemplate.js +1 -1
  35. package/dist/SearchableListBaseTemplate.js.map +1 -1
  36. package/dist/SelectBase.d.ts +7 -1
  37. package/dist/SelectBase.js +114 -17
  38. package/dist/SelectBase.js.map +1 -1
  39. package/dist/TextField.d.ts +1 -1
  40. package/dist/TextField.js +2 -2
  41. package/dist/TextField.js.map +1 -1
  42. package/dist/TextFieldTemplate.js +1 -1
  43. package/dist/TextFieldTemplate.js.map +1 -1
  44. package/dist/assets/{InputSuggestions-DAElWNvY.js → InputSuggestions-DVRXb_CJ.js} +1 -1
  45. package/dist/assets/{ListItemStandardExpandableTextTemplate-B2fGcGW7.js → ListItemStandardExpandableTextTemplate-DhmGlKzk.js} +1 -1
  46. package/dist/assets/{bundle.esm-DPVxY8xv.js → bundle.esm-CjF11YUZ.js} +233 -233
  47. package/dist/assets/messagebundle_en-BZqDcZHN.js +1 -0
  48. package/dist/assets/messagebundle_hu-CBV3ISbF.js +1 -0
  49. package/dist/assets/messagebundle_tr-DOeCmUdx.js +1 -0
  50. package/dist/assets/messagebundle_uk-GmdhsMsP.js +1 -0
  51. package/dist/assets/messagebundle_zh_CN-CHwH3F3-.js +1 -0
  52. package/dist/assets/messagebundle_zh_TW-FO0BCkub.js +1 -0
  53. package/dist/css/themes/MastheadCountrySelector.css +1 -1
  54. package/dist/css/themes/MastheadMenuItem.css +1 -1
  55. package/dist/css/themes/MastheadProfileMenu.css +1 -1
  56. package/dist/css/themes/StatusMessage.css +1 -1
  57. package/dist/css/themes/TextField.css +1 -1
  58. package/dist/css/themes/Toast.css +1 -1
  59. package/dist/css/themes/Wizard.css +1 -1
  60. package/dist/css/themes/WizardTab.css +1 -1
  61. package/dist/custom-elements-internal.json +114 -146
  62. package/dist/custom-elements.json +114 -114
  63. package/dist/features/SearchSuggestionsPopover.d.ts +6 -9
  64. package/dist/features/SearchSuggestionsPopover.js +47 -163
  65. package/dist/features/SearchSuggestionsPopover.js.map +1 -1
  66. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  67. package/dist/generated/assets/i18n/messagebundle_hu.json +1 -1
  68. package/dist/generated/assets/i18n/messagebundle_tr.json +1 -1
  69. package/dist/generated/assets/i18n/messagebundle_uk.json +1 -1
  70. package/dist/generated/assets/i18n/messagebundle_zh_CN.json +1 -1
  71. package/dist/generated/assets/i18n/messagebundle_zh_TW.json +1 -1
  72. package/dist/generated/i18n/i18n-defaults.d.ts +3 -2
  73. package/dist/generated/i18n/i18n-defaults.js +3 -2
  74. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  75. package/dist/generated/templates/MastheadCountrySelectorTemplate.lit.js +6 -5
  76. package/dist/generated/templates/MastheadCountrySelectorTemplate.lit.js.map +1 -1
  77. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js +1 -1
  78. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js.map +1 -1
  79. package/dist/generated/themes/MastheadCountrySelector.css.d.ts +1 -1
  80. package/dist/generated/themes/MastheadCountrySelector.css.js +1 -1
  81. package/dist/generated/themes/MastheadCountrySelector.css.js.map +1 -1
  82. package/dist/generated/themes/MastheadMenuItem.css.d.ts +1 -1
  83. package/dist/generated/themes/MastheadMenuItem.css.js +1 -1
  84. package/dist/generated/themes/MastheadMenuItem.css.js.map +1 -1
  85. package/dist/generated/themes/MastheadProfileMenu.css.d.ts +1 -1
  86. package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
  87. package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
  88. package/dist/generated/themes/StatusMessage.css.d.ts +1 -1
  89. package/dist/generated/themes/StatusMessage.css.js +1 -1
  90. package/dist/generated/themes/StatusMessage.css.js.map +1 -1
  91. package/dist/generated/themes/TextField.css.d.ts +1 -1
  92. package/dist/generated/themes/TextField.css.js +1 -1
  93. package/dist/generated/themes/TextField.css.js.map +1 -1
  94. package/dist/generated/themes/Toast.css.d.ts +1 -1
  95. package/dist/generated/themes/Toast.css.js +1 -1
  96. package/dist/generated/themes/Toast.css.js.map +1 -1
  97. package/dist/generated/themes/Wizard.css.d.ts +1 -1
  98. package/dist/generated/themes/Wizard.css.js +1 -1
  99. package/dist/generated/themes/Wizard.css.js.map +1 -1
  100. package/dist/generated/themes/WizardTab.css.d.ts +1 -1
  101. package/dist/generated/themes/WizardTab.css.js +1 -1
  102. package/dist/generated/themes/WizardTab.css.js.map +1 -1
  103. package/dist/messagebundle.properties +2 -1
  104. package/dist/messagebundle_en.properties +2 -1
  105. package/dist/messagebundle_hu.properties +125 -0
  106. package/dist/messagebundle_tr.properties +126 -0
  107. package/dist/messagebundle_uk.properties +128 -0
  108. package/dist/messagebundle_zh_CN.properties +126 -0
  109. package/dist/messagebundle_zh_TW.properties +126 -0
  110. package/dist/utils/sanitizeString.js +1 -4
  111. package/dist/utils/sanitizeString.js.map +1 -1
  112. package/dist/vscode.html-custom-data.json +30 -25
  113. package/dist/web-types.json +61 -41
  114. package/package.json +2 -2
  115. package/src/Dropdown.ts +62 -0
  116. package/src/List.ts +3 -18
  117. package/src/MastheadCountrySelector.hbs +2 -0
  118. package/src/MastheadCountrySelector.ts +9 -0
  119. package/src/MastheadMobileMenu.hbs +1 -0
  120. package/src/MessageStrip.ts +37 -4
  121. package/src/PasswordField.ts +24 -0
  122. package/src/PasswordFieldTemplate.tsx +2 -2
  123. package/src/Search.ts +13 -9
  124. package/src/SearchTemplate.tsx +0 -3
  125. package/src/SearchableListBase.ts +1 -6
  126. package/src/SearchableListBaseTemplate.tsx +0 -1
  127. package/src/SelectBase.ts +114 -19
  128. package/src/TextField.ts +1 -1
  129. package/src/TextFieldTemplate.tsx +1 -1
  130. package/src/features/SearchSuggestionsPopover.ts +55 -177
  131. package/src/generated/i18n/i18n-defaults.ts +2 -2
  132. package/src/generated/templates/MastheadCountrySelectorTemplate.lit.ts +6 -5
  133. package/src/generated/templates/MastheadMobileMenuTemplate.lit.ts +1 -1
  134. package/src/generated/themes/MastheadCountrySelector.css.ts +1 -1
  135. package/src/generated/themes/MastheadMenuItem.css.ts +1 -1
  136. package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
  137. package/src/generated/themes/StatusMessage.css.ts +1 -1
  138. package/src/generated/themes/TextField.css.ts +1 -1
  139. package/src/generated/themes/Toast.css.ts +1 -1
  140. package/src/generated/themes/Wizard.css.ts +1 -1
  141. package/src/generated/themes/WizardTab.css.ts +1 -1
  142. package/src/i18n/messagebundle.properties +2 -1
  143. package/src/i18n/messagebundle_en.properties +2 -1
  144. package/src/i18n/messagebundle_hu.properties +125 -0
  145. package/src/i18n/messagebundle_tr.properties +126 -0
  146. package/src/i18n/messagebundle_uk.properties +128 -0
  147. package/src/i18n/messagebundle_zh_CN.properties +126 -0
  148. package/src/i18n/messagebundle_zh_TW.properties +126 -0
  149. package/src/themes/MastheadCountrySelector.css +5 -2
  150. package/src/themes/MastheadMenuItem.css +12 -4
  151. package/src/themes/MastheadProfileMenu.css +0 -5
  152. package/src/themes/StatusMessage.css +4 -4
  153. package/src/themes/TextField.css +3 -0
  154. package/src/themes/Toast.css +14 -2
  155. package/src/themes/Wizard.css +7 -0
  156. package/src/themes/WizardTab.css +23 -0
  157. package/src/utils/sanitizeString.ts +1 -4
  158. package/dist/assets/messagebundle_en-BxjFAY2S.js +0 -1
  159. package/dist/assets/messagebundle_hu-BEMbu-EE.js +0 -1
  160. package/dist/assets/messagebundle_tr-9FvYSV7d.js +0 -1
  161. package/dist/assets/messagebundle_uk-BgTRxken.js +0 -1
  162. package/dist/assets/messagebundle_zh_CN-BsCxQ-NE.js +0 -1
  163. package/dist/assets/messagebundle_zh_TW-Li9m-Dgo.js +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
3
3
  "name": "@sapudex/web-components",
4
- "version": "2.40.0",
4
+ "version": "2.42.0",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
@@ -971,11 +971,6 @@
971
971
  "name": "show-search-input",
972
972
  "description": "Defines if the search input is visible.",
973
973
  "value": { "type": "boolean", "default": "false" }
974
- },
975
- {
976
- "name": "tab-navigation-enabled",
977
- "description": "Enables tab navigation for the list.",
978
- "value": { "type": "boolean | undefined", "default": "\"\"" }
979
974
  }
980
975
  ],
981
976
  "slots": [
@@ -1085,11 +1080,6 @@
1085
1080
  "name": "show-search-input",
1086
1081
  "description": "Defines if the search input is visible.",
1087
1082
  "value": { "type": "boolean" }
1088
- },
1089
- {
1090
- "name": "tab-navigation-enabled",
1091
- "description": "Enables tab navigation for the list.",
1092
- "value": { "type": "boolean | undefined" }
1093
1083
  }
1094
1084
  ],
1095
1085
  "events": [
@@ -1789,11 +1779,6 @@
1789
1779
  "description": "Defines if the search input is visible.",
1790
1780
  "value": { "type": "boolean", "default": "false" }
1791
1781
  },
1792
- {
1793
- "name": "tab-navigation-enabled",
1794
- "description": "Enables tab navigation for the list.",
1795
- "value": { "type": "boolean | undefined", "default": "\"\"" }
1796
- },
1797
1782
  {
1798
1783
  "name": "trigger-accessible-role",
1799
1784
  "description": "Allows setting a custom role for dropdown trigger.",
@@ -1985,11 +1970,6 @@
1985
1970
  "description": "Defines if the search input is visible.",
1986
1971
  "value": { "type": "boolean" }
1987
1972
  },
1988
- {
1989
- "name": "tab-navigation-enabled",
1990
- "description": "Enables tab navigation for the list.",
1991
- "value": { "type": "boolean | undefined" }
1992
- },
1993
1973
  {
1994
1974
  "name": "trigger-accessible-role",
1995
1975
  "description": "Allows setting a custom role for dropdown trigger.",
@@ -3749,11 +3729,6 @@
3749
3729
  "default": "\"SingleSelect\""
3750
3730
  }
3751
3731
  },
3752
- {
3753
- "name": "tab-navigation-enabled",
3754
- "description": "Enables tab navigation for the list.",
3755
- "value": { "type": "boolean | undefined", "default": "\"\"" }
3756
- },
3757
3732
  {
3758
3733
  "name": "type",
3759
3734
  "description": "Defines the type of the item.",
@@ -3811,11 +3786,6 @@
3811
3786
  "type": "\"SingleSelect\" | \"MultiSelect\" | \"SingleContent\" | \"RadioGroup\""
3812
3787
  }
3813
3788
  },
3814
- {
3815
- "name": "tab-navigation-enabled",
3816
- "description": "Enables tab navigation for the list.",
3817
- "value": { "type": "boolean | undefined" }
3818
- },
3819
3789
  {
3820
3790
  "name": "type",
3821
3791
  "description": "Defines the type of the item.",
@@ -4683,6 +4653,11 @@
4683
4653
  "description": "Defines title of the countries menu",
4684
4654
  "value": { "type": "string", "default": "\"\"" }
4685
4655
  },
4656
+ {
4657
+ "name": "hide-search",
4658
+ "description": "Hides the search field in the country list view.",
4659
+ "value": { "type": "boolean", "default": "false" }
4660
+ },
4686
4661
  {
4687
4662
  "name": "language-voice",
4688
4663
  "description": "Defines the language voice of the search",
@@ -4740,6 +4715,11 @@
4740
4715
  "description": "Defines title of the countries menu",
4741
4716
  "value": { "type": "string" }
4742
4717
  },
4718
+ {
4719
+ "name": "hide-search",
4720
+ "description": "Hides the search field in the country list view.",
4721
+ "value": { "type": "boolean" }
4722
+ },
4743
4723
  {
4744
4724
  "name": "language-voice",
4745
4725
  "description": "Defines the language voice of the search",
@@ -6045,10 +6025,30 @@
6045
6025
  "description": "Defines whether the MessageStrip renders close button.",
6046
6026
  "value": { "type": "boolean" }
6047
6027
  },
6028
+ {
6029
+ "name": "status-error-text",
6030
+ "description": "Defines custom status text for error type",
6031
+ "value": { "type": "string", "default": "\"\"" }
6032
+ },
6033
+ {
6034
+ "name": "status-information-text",
6035
+ "description": "Defines custom status text for information type",
6036
+ "value": { "type": "string", "default": "\"\"" }
6037
+ },
6038
+ {
6039
+ "name": "status-success-text",
6040
+ "description": "Defines custom status text for success type",
6041
+ "value": { "type": "string", "default": "\"\"" }
6042
+ },
6048
6043
  {
6049
6044
  "name": "status-type",
6050
6045
  "description": "Defines the component Status Type.",
6051
6046
  "value": { "type": "\"Text\" | \"None\" | \"Icon\"" }
6047
+ },
6048
+ {
6049
+ "name": "status-warning-text",
6050
+ "description": "Defines custom status text for warning type",
6051
+ "value": { "type": "string", "default": "\"\"" }
6052
6052
  }
6053
6053
  ],
6054
6054
  "slots": [
@@ -6082,10 +6082,30 @@
6082
6082
  "description": "Defines whether the MessageStrip renders close button.",
6083
6083
  "value": { "type": "boolean" }
6084
6084
  },
6085
+ {
6086
+ "name": "status-error-text",
6087
+ "description": "Defines custom status text for error type",
6088
+ "value": { "type": "string" }
6089
+ },
6090
+ {
6091
+ "name": "status-information-text",
6092
+ "description": "Defines custom status text for information type",
6093
+ "value": { "type": "string" }
6094
+ },
6095
+ {
6096
+ "name": "status-success-text",
6097
+ "description": "Defines custom status text for success type",
6098
+ "value": { "type": "string" }
6099
+ },
6085
6100
  {
6086
6101
  "name": "status-type",
6087
6102
  "description": "Defines the component Status Type.",
6088
6103
  "value": { "type": "\"Text\" | \"None\" | \"Icon\"" }
6104
+ },
6105
+ {
6106
+ "name": "status-warning-text",
6107
+ "description": "Defines custom status text for warning type",
6108
+ "value": { "type": "string" }
6089
6109
  }
6090
6110
  ],
6091
6111
  "events": []
@@ -6216,6 +6236,11 @@
6216
6236
  "description": "Defines the inner stored displayonly state.",
6217
6237
  "value": { "type": "boolean", "default": "false" }
6218
6238
  },
6239
+ {
6240
+ "name": "hide-button-tooltip",
6241
+ "description": "Defines the tooltip for the hide password button.",
6242
+ "value": { "type": "string", "default": "\"\"" }
6243
+ },
6219
6244
  {
6220
6245
  "name": "label",
6221
6246
  "description": "Defines label text for the input field.",
@@ -6315,6 +6340,11 @@
6315
6340
  "description": "Defines the inner stored displayonly state.",
6316
6341
  "value": { "type": "boolean" }
6317
6342
  },
6343
+ {
6344
+ "name": "hide-button-tooltip",
6345
+ "description": "Defines the tooltip for the hide password button.",
6346
+ "value": { "type": "string" }
6347
+ },
6318
6348
  {
6319
6349
  "name": "label",
6320
6350
  "description": "Defines label text for the input field.",
@@ -7767,11 +7797,6 @@
7767
7797
  "description": "Defines if the search input is visible.",
7768
7798
  "value": { "type": "boolean", "default": "false" }
7769
7799
  },
7770
- {
7771
- "name": "tab-navigation-enabled",
7772
- "description": "Enables tab navigation for the list.",
7773
- "value": { "type": "boolean | undefined", "default": "\"\"" }
7774
- },
7775
7800
  {
7776
7801
  "name": "tooltip-placement",
7777
7802
  "description": "Determines on which side of the component the Tooltip is displayed.",
@@ -7887,11 +7912,6 @@
7887
7912
  "description": "Defines if the search input is visible.",
7888
7913
  "value": { "type": "boolean" }
7889
7914
  },
7890
- {
7891
- "name": "tab-navigation-enabled",
7892
- "description": "Enables tab navigation for the list.",
7893
- "value": { "type": "boolean | undefined" }
7894
- },
7895
7915
  {
7896
7916
  "name": "tooltip-placement",
7897
7917
  "description": "Determines on which side of the component the Tooltip is displayed.",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@sapudex/web-components",
4
- "version": "2.40.0",
4
+ "version": "2.42.0",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
7
7
  },
@@ -50,7 +50,7 @@
50
50
  "@cypress/code-coverage": "^3.14.5",
51
51
  "@ui5/cypress-ct-ui5-webc": "^0.0.4",
52
52
  "@ui5/webcomponents-tools": "2.22.0",
53
- "chromedriver": "142.0.0",
53
+ "chromedriver": "149.0.2",
54
54
  "cross-env": "^7.0.3",
55
55
  "cypress": "^14.3.3",
56
56
  "cypress-real-events": "^1.14.0",
package/src/Dropdown.ts CHANGED
@@ -7,6 +7,8 @@ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
7
7
  import DropdownCss from "./generated/themes/Dropdown.css.js";
8
8
  import getEffectiveScrollbarStyle from "./utils/getEffectiveScrollbarStyle.js";
9
9
 
10
+ type HTMLElementWithDisabled = HTMLElement & { disabled?: boolean };
11
+
10
12
  /**
11
13
  * @class
12
14
  *
@@ -59,6 +61,66 @@ class UDExDropdown extends Popover {
59
61
  content.style.maxHeight = this.height;
60
62
  }
61
63
  }
64
+
65
+ // Shift+Tab from first focusable element: close and return focus to opener
66
+ forwardToLast(): Promise<void> {
67
+ this.closePopup(false, false, true);
68
+ const openerEl = this.getOpenerHTMLElement(this.opener);
69
+ if (openerEl) {
70
+ openerEl.focus();
71
+ }
72
+ return Promise.resolve();
73
+ }
74
+
75
+ // Tab from last focusable element: close and move focus to next element after opener
76
+ forwardToFirst(): Promise<void> {
77
+ const openerHost = this._getOpenerHost();
78
+ this.closePopup(false, false, true);
79
+ if (openerHost) {
80
+ this._moveFocusAfter(openerHost);
81
+ }
82
+ return Promise.resolve();
83
+ }
84
+
85
+ private _getOpenerHost(): HTMLElement | null {
86
+ const opener = this.opener;
87
+ if (!opener) { return null; }
88
+ if (opener instanceof HTMLElement) { return opener; }
89
+ const root = this.getRootNode() as Document | ShadowRoot;
90
+ return (root as Document).getElementById?.(opener) ?? document.getElementById(opener);
91
+ }
92
+
93
+ private _moveFocusAfter(from: Element): void {
94
+ let node: Element | null = from;
95
+ while (node && node !== document.documentElement) {
96
+ let sibling = node.nextElementSibling;
97
+ while (sibling) {
98
+ const focusable = this._firstFocusableIn(sibling as HTMLElement);
99
+ if (focusable) {
100
+ focusable.focus();
101
+ return;
102
+ }
103
+ sibling = sibling.nextElementSibling;
104
+ }
105
+ node = node.parentElement;
106
+ }
107
+ }
108
+
109
+ private _firstFocusableIn(el: HTMLElement): HTMLElement | null {
110
+ if (!el) { return null; }
111
+ if (
112
+ el.tabIndex >= 0
113
+ && !el.hidden
114
+ && !(el as HTMLElementWithDisabled).disabled
115
+ && (!!el.offsetParent || el.matches("body"))
116
+ ) {
117
+ return el;
118
+ }
119
+ return Array.from(el.children).reduce<HTMLElement | null>(
120
+ (found, child) => found ?? this._firstFocusableIn(child as HTMLElement),
121
+ null,
122
+ );
123
+ }
62
124
  }
63
125
 
64
126
  UDExDropdown.define();
package/src/List.ts CHANGED
@@ -146,12 +146,7 @@ class UDExList extends UI5Element {
146
146
  @property({ type: String })
147
147
  itemIcon: string = "";
148
148
 
149
- /**
150
- * Enables tab navigation for the list.
151
- *
152
- * @default ""
153
- * @public
154
- */
149
+ /** @deprecated Tab keyboard navigation is no longer allowed. */
155
150
  @property({ type: Boolean })
156
151
  tabNavigationEnabled?: boolean;
157
152
 
@@ -190,10 +185,6 @@ class UDExList extends UI5Element {
190
185
  }
191
186
 
192
187
  handleKeyDown(e: KeyboardEvent): void {
193
- if (this.tabNavigationEnabled) {
194
- return;
195
- }
196
-
197
188
  if (isRight(e)) {
198
189
  this.handleArrowRight(e);
199
190
  }
@@ -398,10 +389,8 @@ class UDExList extends UI5Element {
398
389
  clickedItem.selected = true;
399
390
  }
400
391
 
401
- if (!this.tabNavigationEnabled) {
402
- this.resetTabIndexes();
403
- clickedItem._tabIndex = "0";
404
- }
392
+ this.resetTabIndexes();
393
+ clickedItem._tabIndex = "0";
405
394
 
406
395
  this.fireDecoratorEvent("selection-change", {
407
396
  listItems: this.getItemsFromList(),
@@ -487,10 +476,6 @@ class UDExList extends UI5Element {
487
476
  }
488
477
 
489
478
  getTabIndex(index: number, item: UDExListItemBase): string {
490
- if (this.tabNavigationEnabled) {
491
- return "0";
492
- }
493
-
494
479
  const isFirstItem = this.modeSelected && index === 0;
495
480
  const isFirstItemInGroupList = this.isGroupList && index === 1;
496
481
  const listGroupHeader = item.closest("[udex-list-group-header]") as UDExListGroupHeader;
@@ -14,6 +14,7 @@
14
14
  icon-start>
15
15
  </udex-masthead-menu-item>
16
16
  {{/unless}}
17
+ {{#unless hideSearch}}
17
18
  <udex-search
18
19
  class="udex-masthead-country-selector__search"
19
20
  @ui5-handle-value-search="{{handleSearch}}"
@@ -27,6 +28,7 @@
27
28
  show-submit-button>
28
29
  </udex-search>
29
30
  <span aria-live="polite" aria-atomic="true" class="hidden">{{_accSearchResultInfo}}</span>
31
+ {{/unless}}
30
32
  <div class="udex-masthead-country-selector__list-container">
31
33
  <div class="udex-masthead-country-selector__list-wrap" @scroll={{this.handleCountryListShadowVisible}}>
32
34
  <ul class="udex-masthead-country-selector__list udex-masthead-country-selector__list_countries" role="menu">
@@ -192,6 +192,15 @@ class UDExMastheadCountrySelector extends UI5Element {
192
192
  @property({ type: Boolean })
193
193
  showSearchVoiceButton!: boolean;
194
194
 
195
+ /**
196
+ * Hides the search field in the country list view.
197
+ *
198
+ * @default false
199
+ * @public
200
+ */
201
+ @property({ type: Boolean })
202
+ hideSearch!: boolean;
203
+
195
204
  /**
196
205
  * Defines the language voice of the search
197
206
  *
@@ -243,6 +243,7 @@
243
243
  @click="{{../handleMobileCategoryItemEvent}}"
244
244
  label="{{this.title}}"
245
245
  url="{{this.url}}"
246
+ has-border
246
247
  third-level>
247
248
  </udex-masthead-menu-item>
248
249
  </li>
@@ -64,6 +64,39 @@ class UDExMessageStrip extends MessageStrip {
64
64
  @property({ type: Boolean })
65
65
  hideCloseButton!: boolean;
66
66
 
67
+ /**
68
+ * Defines custom status text for information type
69
+ *
70
+ * @default ""
71
+ * @public
72
+ */
73
+ @property()
74
+ statusInformationText!: string;
75
+
76
+ /**
77
+ * Defines custom status text for success type
78
+ * @default ""
79
+ * @public
80
+ */
81
+ @property()
82
+ statusSuccessText!: string;
83
+
84
+ /**
85
+ * Defines custom status text for error type
86
+ * @default ""
87
+ * @public
88
+ */
89
+ @property()
90
+ statusErrorText!: string;
91
+
92
+ /**
93
+ * Defines custom status text for warning type
94
+ * @default ""
95
+ * @public
96
+ */
97
+ @property()
98
+ statusWarningText!: string;
99
+
67
100
  /**
68
101
  * Defines accessible name for close icon
69
102
  *
@@ -105,10 +138,10 @@ class UDExMessageStrip extends MessageStrip {
105
138
 
106
139
  textStatusTypeMapping(): Record<string, string> {
107
140
  return {
108
- [UDExMessageStripDesign.Information]: this.getTranslation(MESSAGE_STRIP_INFORMATION),
109
- [UDExMessageStripDesign.Positive]: this.getTranslation(MESSAGE_STRIP_SUCCESS),
110
- [UDExMessageStripDesign.Negative]: this.getTranslation(MESSAGE_STRIP_ERROR),
111
- [UDExMessageStripDesign.Warning]: this.getTranslation(MESSAGE_STRIP_WARNING),
141
+ [UDExMessageStripDesign.Information]: this.statusInformationText || this.getTranslation(MESSAGE_STRIP_INFORMATION),
142
+ [UDExMessageStripDesign.Positive]: this.statusSuccessText || this.getTranslation(MESSAGE_STRIP_SUCCESS),
143
+ [UDExMessageStripDesign.Negative]: this.statusErrorText || this.getTranslation(MESSAGE_STRIP_ERROR),
144
+ [UDExMessageStripDesign.Warning]: this.statusWarningText || this.getTranslation(MESSAGE_STRIP_WARNING),
112
145
  [UDExMessageStripDesign.Action]: this.getTranslation(MESSAGE_STRIP_ACTION),
113
146
  };
114
147
  }
@@ -8,6 +8,8 @@ import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
8
8
  import UDExTextField from "./TextField.js";
9
9
  import UDExValueState from "./types/common.js";
10
10
  import PasswordFieldTemplate from "./PasswordFieldTemplate.js";
11
+ import { SHOW_PASSWORD, HIDE_PASSWORD } from "./generated/i18n/i18n-defaults.js";
12
+ import translate from "./utils/translate.js";
11
13
 
12
14
  export enum UDExInputType {
13
15
  Password = "Password",
@@ -233,6 +235,16 @@ class UDExPasswordField extends UI5Element {
233
235
  @property({ type: String })
234
236
  showButtonTooltip!: string;
235
237
 
238
+ /**
239
+ * Defines the tooltip for the hide password button.
240
+ *
241
+ * @default ""
242
+ * @public
243
+ */
244
+
245
+ @property({ type: String })
246
+ hideButtonTooltip!: string;
247
+
236
248
  /**
237
249
  * Defines the inner stored readonly state.
238
250
  *
@@ -309,6 +321,18 @@ class UDExPasswordField extends UI5Element {
309
321
  get iconButton(): string | undefined {
310
322
  return this.renderShowButton ? this.icon : undefined;
311
323
  }
324
+
325
+ get activeButtonTooltip(): string {
326
+ return this.passwordVisible ? this.hideButtonTooltipText : this.showButtonTooltipText;
327
+ }
328
+
329
+ get hideButtonTooltipText(): string {
330
+ return this.hideButtonTooltip || translate(UDExPasswordField, HIDE_PASSWORD);
331
+ }
332
+
333
+ get showButtonTooltipText(): string {
334
+ return this.showButtonTooltip || translate(UDExPasswordField, SHOW_PASSWORD);
335
+ }
312
336
  }
313
337
 
314
338
  UDExPasswordField.define();
@@ -19,8 +19,8 @@ export default function PasswordFieldTemplate(this: UDExPasswordField) {
19
19
  supporting-text={this.supportingText}
20
20
  accessible-name={this.accessibleName}
21
21
  accessible-name-ref={this.accessibleNameRef}
22
- accessible-icon-name={this.showButtonTooltip}
23
- show-button-tooltip={this.showButtonTooltip}
22
+ accessible-icon-name={this.activeButtonTooltip}
23
+ button-tooltip={this.activeButtonTooltip}
24
24
  onui5-input={this.handleInput}
25
25
  onui5-change={this.handleChange}
26
26
  onui5-blur={this.handleBlur}
package/src/Search.ts CHANGED
@@ -1005,7 +1005,7 @@ class UDExSearch extends UI5Element {
1005
1005
  e.stopPropagation();
1006
1006
  this.handleEnterKey(e);
1007
1007
  this.handleTabKey(e);
1008
- this.handleShiftTabKey(e);
1008
+ this.handleDownKey(e);
1009
1009
  this.handleEscapeKey(e);
1010
1010
  this.fireDecoratorEvent("search-keydown", { e });
1011
1011
  };
@@ -1022,14 +1022,21 @@ class UDExSearch extends UI5Element {
1022
1022
  }
1023
1023
 
1024
1024
  handleTabKey(e: KeyboardEvent) {
1025
- if (isTabNext(e) && this.open) {
1026
- this.Suggestion?.onTab(e);
1025
+ if (!this.open || this.openSuggestionPopup) {
1026
+ return;
1027
+ }
1028
+ if (isTabNext(e) || isTabPrevious(e)) {
1029
+ this.onClosePopover();
1027
1030
  }
1028
1031
  }
1029
1032
 
1030
- handleShiftTabKey(e: KeyboardEvent) {
1031
- if (isTabPrevious(e) && this.open) {
1032
- this.Suggestion?.onShiftTab(e);
1033
+ handleDownKey(e: KeyboardEvent) {
1034
+ if (isDown(e) && this.showSuggestedPopover) {
1035
+ e.preventDefault();
1036
+ if (!this.open) {
1037
+ this.onOpenPopover();
1038
+ }
1039
+ this.Suggestion?.onKeyDown(e);
1033
1040
  }
1034
1041
  }
1035
1042
 
@@ -1104,9 +1111,6 @@ class UDExSearch extends UI5Element {
1104
1111
  }
1105
1112
 
1106
1113
  handleKeyDownReset(e: KeyboardEvent) {
1107
- if (isTabPrevious(e) && this.open) {
1108
- this.Suggestion?.handlePrevTabReset(e);
1109
- }
1110
1114
  if (isEnter(e) || isSpace(e)) {
1111
1115
  e.preventDefault();
1112
1116
  e.stopPropagation();
@@ -232,7 +232,6 @@ function renderSearchSuggestionPopover(this: UDExSearch) {
232
232
  style={this.popoverStyles}
233
233
  id={this.getSuggestionsPopoverId}
234
234
  aria-orientation="vertical"
235
- accessible-role="Dialog"
236
235
  onKeyDown={this.handleKeyPressSuggestionList}
237
236
  accessible-name={this.suggestionsAccessibleName}
238
237
  >
@@ -277,7 +276,6 @@ function renderSearchSuggestionPopoverResultsSuggestedList(this: UDExSearch) {
277
276
  <div class="udex-search-suggestions__list"
278
277
  role="listbox"
279
278
  aria-labelledby="suggested-heading"
280
- tabindex={0}
281
279
  onKeyDown={this.handleKeyDownPopover}
282
280
  >
283
281
  {
@@ -317,7 +315,6 @@ function renderSearchSuggestionPopoverResultsRecommendedList(this: UDExSearch) {
317
315
  <div class="udex-search-suggestions__list"
318
316
  role="listbox"
319
317
  aria-labelledby="recommended-heading"
320
- tabindex={0}
321
318
  onKeyDown={this.handleKeyDownPopover}
322
319
  >
323
320
  {
@@ -125,12 +125,7 @@ export type UDExSearchableListBaseEvents = {
125
125
 
126
126
  class UDExSearchableListBase extends UI5Element {
127
127
  eventDetails!: UDExSearchableListBaseEvents;
128
- /**
129
- * Enables tab navigation for the list.
130
- *
131
- * @default ""
132
- * @public
133
- */
128
+ /** @deprecated Tab keyboard navigation is no longer allowed. */
134
129
  @property({ type: Boolean })
135
130
  tabNavigationEnabled?: boolean;
136
131
 
@@ -50,7 +50,6 @@ export default function SearchableListBaseTemplate(this: UDExSearchableListBase)
50
50
  role={this.roleForGroupList as AriaRole}
51
51
  accessible-role={this.accessibleRoleForList}
52
52
  class="udex-filter-menu__list"
53
- tab-navigation-enabled={this.tabNavigationEnabled}
54
53
  controlled={this.isControlled}
55
54
  mode={this.mode}>
56
55
  {this._filteredItems.map((processedItem, index) => (