@sapudex/web-components 2.39.0 → 2.41.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 (161) hide show
  1. package/cypress/specs/Dropdown.cy.tsx +90 -0
  2. package/cypress/specs/PasswordField.cy.tsx +37 -0
  3. package/cypress/specs/Search.cy.tsx +244 -138
  4. package/cypress/specs/SelectBox.cy.tsx +457 -0
  5. package/cypress/specs/Tile.cy.tsx +96 -0
  6. package/cypress/support/component-imports.instrumented.ts +4 -0
  7. package/cypress/support/component-imports.src.ts +4 -0
  8. package/dist/Dropdown.d.ts +5 -0
  9. package/dist/Dropdown.js +56 -0
  10. package/dist/Dropdown.js.map +1 -1
  11. package/dist/List.d.ts +1 -6
  12. package/dist/List.js +2 -10
  13. package/dist/List.js.map +1 -1
  14. package/dist/MastheadCountrySelector.d.ts +7 -0
  15. package/dist/MastheadCountrySelector.js +3 -0
  16. package/dist/MastheadCountrySelector.js.map +1 -1
  17. package/dist/PasswordField.d.ts +10 -0
  18. package/dist/PasswordField.js +17 -2
  19. package/dist/PasswordField.js.map +1 -1
  20. package/dist/PasswordFieldTemplate.js +1 -1
  21. package/dist/PasswordFieldTemplate.js.map +1 -1
  22. package/dist/Search.d.ts +1 -1
  23. package/dist/Search.js +13 -9
  24. package/dist/Search.js.map +1 -1
  25. package/dist/SearchTemplate.js +3 -3
  26. package/dist/SearchTemplate.js.map +1 -1
  27. package/dist/SearchableListBase.d.ts +2 -6
  28. package/dist/SearchableListBase.js +6 -3
  29. package/dist/SearchableListBase.js.map +1 -1
  30. package/dist/SearchableListBaseTemplate.js +1 -1
  31. package/dist/SearchableListBaseTemplate.js.map +1 -1
  32. package/dist/SelectBase.d.ts +20 -2
  33. package/dist/SelectBase.js +189 -13
  34. package/dist/SelectBase.js.map +1 -1
  35. package/dist/SelectBox.js +2 -1
  36. package/dist/SelectBox.js.map +1 -1
  37. package/dist/SelectBoxTemplate.js +4 -4
  38. package/dist/SelectBoxTemplate.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-jTW8u1vD.js → InputSuggestions-BSg7bjcx.js} +1 -1
  45. package/dist/assets/{ListItemStandardExpandableTextTemplate-ShRY1eSJ.js → ListItemStandardExpandableTextTemplate-CCEQur_J.js} +1 -1
  46. package/dist/assets/{bundle.esm-VI-guBTG.js → bundle.esm-I7iOjLgn.js} +232 -232
  47. package/dist/assets/messagebundle_en-BZqDcZHN.js +1 -0
  48. package/dist/assets/messagebundle_et-yYsmBPXN.js +1 -0
  49. package/dist/assets/messagebundle_fi-DeMNrHC9.js +1 -0
  50. package/dist/assets/messagebundle_fr-qEm5Eykz.js +1 -0
  51. package/dist/assets/messagebundle_hr-NBdiYo-T.js +1 -0
  52. package/dist/assets/messagebundle_hu-CBV3ISbF.js +1 -0
  53. package/dist/css/themes/MastheadCountrySelector.css +1 -1
  54. package/dist/css/themes/MastheadProfileMenu.css +1 -1
  55. package/dist/css/themes/SelectBase.css +1 -1
  56. package/dist/css/themes/SelectBox.css +1 -1
  57. package/dist/css/themes/StatusMessage.css +1 -1
  58. package/dist/css/themes/TextField.css +1 -1
  59. package/dist/css/themes/Tile.css +1 -1
  60. package/dist/css/themes/Toast.css +1 -1
  61. package/dist/custom-elements-internal.json +85 -161
  62. package/dist/custom-elements.json +56 -120
  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_et.json +1 -1
  68. package/dist/generated/assets/i18n/messagebundle_fi.json +1 -1
  69. package/dist/generated/assets/i18n/messagebundle_fr.json +1 -1
  70. package/dist/generated/assets/i18n/messagebundle_hr.json +1 -1
  71. package/dist/generated/assets/i18n/messagebundle_hu.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/MastheadProfileMenu.css.d.ts +1 -1
  83. package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
  84. package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
  85. package/dist/generated/themes/SelectBase.css.d.ts +1 -1
  86. package/dist/generated/themes/SelectBase.css.js +1 -1
  87. package/dist/generated/themes/SelectBase.css.js.map +1 -1
  88. package/dist/generated/themes/SelectBox.css.d.ts +1 -1
  89. package/dist/generated/themes/SelectBox.css.js +1 -1
  90. package/dist/generated/themes/SelectBox.css.js.map +1 -1
  91. package/dist/generated/themes/StatusMessage.css.d.ts +1 -1
  92. package/dist/generated/themes/StatusMessage.css.js +1 -1
  93. package/dist/generated/themes/StatusMessage.css.js.map +1 -1
  94. package/dist/generated/themes/TextField.css.d.ts +1 -1
  95. package/dist/generated/themes/TextField.css.js +1 -1
  96. package/dist/generated/themes/TextField.css.js.map +1 -1
  97. package/dist/generated/themes/Tile.css.d.ts +1 -1
  98. package/dist/generated/themes/Tile.css.js +1 -1
  99. package/dist/generated/themes/Tile.css.js.map +1 -1
  100. package/dist/generated/themes/Toast.css.d.ts +1 -1
  101. package/dist/generated/themes/Toast.css.js +1 -1
  102. package/dist/generated/themes/Toast.css.js.map +1 -1
  103. package/dist/messagebundle.properties +2 -1
  104. package/dist/messagebundle_en.properties +2 -1
  105. package/dist/messagebundle_et.properties +126 -0
  106. package/dist/messagebundle_fi.properties +127 -0
  107. package/dist/messagebundle_fr.properties +120 -0
  108. package/dist/messagebundle_hr.properties +125 -0
  109. package/dist/messagebundle_hu.properties +125 -0
  110. package/dist/vscode.html-custom-data.json +12 -27
  111. package/dist/web-types.json +36 -44
  112. package/package.json +1 -1
  113. package/src/Dropdown.ts +62 -0
  114. package/src/List.ts +3 -18
  115. package/src/MastheadCountrySelector.hbs +2 -0
  116. package/src/MastheadCountrySelector.ts +9 -0
  117. package/src/MastheadMobileMenu.hbs +1 -0
  118. package/src/PasswordField.ts +24 -0
  119. package/src/PasswordFieldTemplate.tsx +2 -2
  120. package/src/Search.ts +13 -9
  121. package/src/SearchTemplate.tsx +0 -3
  122. package/src/SearchableListBase.ts +8 -9
  123. package/src/SearchableListBaseTemplate.tsx +0 -1
  124. package/src/SelectBase.ts +203 -16
  125. package/src/SelectBox.ts +2 -1
  126. package/src/SelectBoxTemplate.tsx +1 -0
  127. package/src/TextField.ts +1 -1
  128. package/src/TextFieldTemplate.tsx +1 -1
  129. package/src/features/SearchSuggestionsPopover.ts +55 -177
  130. package/src/generated/i18n/i18n-defaults.ts +2 -2
  131. package/src/generated/templates/MastheadCountrySelectorTemplate.lit.ts +6 -5
  132. package/src/generated/templates/MastheadMobileMenuTemplate.lit.ts +1 -1
  133. package/src/generated/themes/MastheadCountrySelector.css.ts +1 -1
  134. package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
  135. package/src/generated/themes/SelectBase.css.ts +1 -1
  136. package/src/generated/themes/SelectBox.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/Tile.css.ts +1 -1
  140. package/src/generated/themes/Toast.css.ts +1 -1
  141. package/src/i18n/messagebundle.properties +2 -1
  142. package/src/i18n/messagebundle_en.properties +2 -1
  143. package/src/i18n/messagebundle_et.properties +126 -0
  144. package/src/i18n/messagebundle_fi.properties +127 -0
  145. package/src/i18n/messagebundle_fr.properties +120 -0
  146. package/src/i18n/messagebundle_hr.properties +125 -0
  147. package/src/i18n/messagebundle_hu.properties +125 -0
  148. package/src/themes/MastheadCountrySelector.css +5 -2
  149. package/src/themes/MastheadProfileMenu.css +0 -5
  150. package/src/themes/SelectBase.css +7 -0
  151. package/src/themes/SelectBox.css +4 -0
  152. package/src/themes/StatusMessage.css +4 -4
  153. package/src/themes/TextField.css +3 -0
  154. package/src/themes/Tile.css +11 -3
  155. package/src/themes/Toast.css +14 -2
  156. package/dist/assets/messagebundle_en-BxjFAY2S.js +0 -1
  157. package/dist/assets/messagebundle_et-BCYOcg2t.js +0 -1
  158. package/dist/assets/messagebundle_fi-CssCIjmp.js +0 -1
  159. package/dist/assets/messagebundle_fr-CvOyuAVw.js +0 -1
  160. package/dist/assets/messagebundle_hr-CashhWbN.js +0 -1
  161. package/dist/assets/messagebundle_hu-BEMbu-EE.js +0 -1
@@ -440,7 +440,7 @@
440
440
  },
441
441
  {
442
442
  "name": "udex-country-selector",
443
- "description": "<h3 class=\"comment-api-title\">Overview</h3>\n\n\n<h3>Usage</h3>\n\nFor the <code>udex-country-selector</code>\n<h3>ES6 Module Import</h3>\n\n<code>import \"@sapudex/web-components/dist/CountrySelector.js\";</code>\n\n\n---\n\n\n\n\n### **Events:**\n - **change-search** - Fired event when the user submitted the value in the search.\n- **first-icon-click** - Fired event when the user clicks on the first icon.\n- **reset-search** - Fired event when the user clicks on the reset button in the search.\n- **second-icon-click** - Fired event when the user clicks on the second icon.\n- **select-all** - Fired event when the user clicks on the Select All header.\n- **selection-change** - \n- **submit-search** - Fired event when the user clicks on the submitted icon in the search.\n\n### **Methods:**\n - **resetSearch()** - Reset the search value.\n\n### **Slots:**\n - **default** - Slot for items.",
443
+ "description": "<h3 class=\"comment-api-title\">Overview</h3>\n\n\n<h3>Usage</h3>\n\nFor the <code>udex-country-selector</code>\n<h3>ES6 Module Import</h3>\n\n<code>import \"@sapudex/web-components/dist/CountrySelector.js\";</code>\n\n\n---\n\n\n\n\n### **Events:**\n - **change-search** - Fired event when the user submitted the value in the search.\n- **first-icon-click** - Fired event when the user clicks on the first icon.\n- **reset-search** - Fired event when the user clicks on the reset button in the search.\n- **second-icon-click** - Fired event when the user clicks on the second icon.\n- **select-all** - Fired event when the user clicks on the Select All header.\n- **selection-change** - \n- **submit-search** - Fired event when the user clicks on the submitted icon in the search.\n\n### **Methods:**\n - **resetSearch()** - Reset the search value.\n\n### **Slots:**\n - **default** - Slot for items.\n- **footer** - Defines the footer content for the component dropdown.\nPlace any content (e.g. an action button) here. Clicking footer content does not close the dropdown —\nuse the <code>close</code> method if needed.",
444
444
  "attributes": [
445
445
  {
446
446
  "name": "blocked-country-codes",
@@ -516,11 +516,6 @@
516
516
  "name": "show-search-input",
517
517
  "description": "Defines if the search input is visible.",
518
518
  "values": []
519
- },
520
- {
521
- "name": "tab-navigation-enabled",
522
- "description": "Enables tab navigation for the list.",
523
- "values": []
524
519
  }
525
520
  ],
526
521
  "references": []
@@ -914,11 +909,6 @@
914
909
  "description": "Defines if the search input is visible.",
915
910
  "values": []
916
911
  },
917
- {
918
- "name": "tab-navigation-enabled",
919
- "description": "Enables tab navigation for the list.",
920
- "values": []
921
- },
922
912
  {
923
913
  "name": "trigger-accessible-role",
924
914
  "description": "Allows setting a custom role for dropdown trigger.",
@@ -1672,11 +1662,6 @@
1672
1662
  { "name": "RadioGroup" }
1673
1663
  ]
1674
1664
  },
1675
- {
1676
- "name": "tab-navigation-enabled",
1677
- "description": "Enables tab navigation for the list.",
1678
- "values": []
1679
- },
1680
1665
  {
1681
1666
  "name": "type",
1682
1667
  "description": "Defines the type of the item.",
@@ -2282,6 +2267,11 @@
2282
2267
  "description": "Defines title of the countries menu",
2283
2268
  "values": []
2284
2269
  },
2270
+ {
2271
+ "name": "hide-search",
2272
+ "description": "Hides the search field in the country list view.",
2273
+ "values": []
2274
+ },
2285
2275
  {
2286
2276
  "name": "language-voice",
2287
2277
  "description": "Defines the language voice of the search",
@@ -2883,6 +2873,11 @@
2883
2873
  "description": "Defines the inner stored displayonly state.",
2884
2874
  "values": []
2885
2875
  },
2876
+ {
2877
+ "name": "hide-button-tooltip",
2878
+ "description": "Defines the tooltip for the hide password button.",
2879
+ "values": []
2880
+ },
2886
2881
  {
2887
2882
  "name": "label",
2888
2883
  "description": "Defines label text for the input field.",
@@ -3396,11 +3391,6 @@
3396
3391
  "name": "show-search-input",
3397
3392
  "description": "Defines if the search input is visible.",
3398
3393
  "values": []
3399
- },
3400
- {
3401
- "name": "tab-navigation-enabled",
3402
- "description": "Enables tab navigation for the list.",
3403
- "values": []
3404
3394
  }
3405
3395
  ],
3406
3396
  "references": []
@@ -3627,7 +3617,7 @@
3627
3617
  },
3628
3618
  {
3629
3619
  "name": "udex-select-box",
3630
- "description": "<h3 class=\"comment-api-title\">Overview</h3>\n\n\n<h3>Usage</h3>\n\nFor the <code>udex-select-box</code>\n<h3>ES6 Module Import</h3>\n\n<code>import \"@sapudex/web-components/dist/UDExSelectBox.js\";</code>\n\n\n---\n\n\n\n\n### **Events:**\n - **change-search** - Fired event when the user submitted the value in the search.\n- **first-icon-click** - Fired event when the user clicks on the first icon.\n- **remove** - Fired event when the user remove tag.\n- **reset-search** - Fired event when the user clicks on the reset button in the search.\n- **second-icon-click** - Fired event when the user clicks on the second icon.\n- **select-all** - Fired event when the user clicks on the Select All header.\n- **selection-change** - \n- **show-more** - Fired event when the user clicks on the More button.\n- **submit-search** - Fired event when the user clicks on the submitted icon in the search.\n\n### **Methods:**\n - **close(): _void_** - Close the dropdown.\n- **resetSearch()** - Reset the search value.\n\n### **Slots:**\n - **default** - Slot for items.",
3620
+ "description": "<h3 class=\"comment-api-title\">Overview</h3>\n\n\n<h3>Usage</h3>\n\nFor the <code>udex-select-box</code>\n<h3>ES6 Module Import</h3>\n\n<code>import \"@sapudex/web-components/dist/UDExSelectBox.js\";</code>\n\n\n---\n\n\n\n\n### **Events:**\n - **change-search** - Fired event when the user submitted the value in the search.\n- **first-icon-click** - Fired event when the user clicks on the first icon.\n- **remove** - Fired event when the user remove tag.\n- **reset-search** - Fired event when the user clicks on the reset button in the search.\n- **second-icon-click** - Fired event when the user clicks on the second icon.\n- **select-all** - Fired event when the user clicks on the Select All header.\n- **selection-change** - \n- **show-more** - Fired event when the user clicks on the More button.\n- **submit-search** - Fired event when the user clicks on the submitted icon in the search.\n\n### **Methods:**\n - **close(): _void_** - Close the dropdown.\n- **resetSearch()** - Reset the search value.\n\n### **Slots:**\n - **default** - Slot for items.\n- **footer** - Defines the footer content for the component dropdown.\nPlace any content (e.g. an action button) here. Clicking footer content does not close the dropdown —\nuse the <code>close</code> method if needed.",
3631
3621
  "attributes": [
3632
3622
  {
3633
3623
  "name": "busy",
@@ -3694,11 +3684,6 @@
3694
3684
  "description": "Defines if the search input is visible.",
3695
3685
  "values": []
3696
3686
  },
3697
- {
3698
- "name": "tab-navigation-enabled",
3699
- "description": "Enables tab navigation for the list.",
3700
- "values": []
3701
- },
3702
3687
  {
3703
3688
  "name": "tooltip-placement",
3704
3689
  "description": "Determines on which side of the component the Tooltip is displayed.",
@@ -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.39.0",
4
+ "version": "2.41.0",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
@@ -896,7 +896,7 @@
896
896
  },
897
897
  {
898
898
  "name": "udex-country-selector",
899
- "description": "<h3 class=\"comment-api-title\">Overview</h3>\n\n\n<h3>Usage</h3>\n\nFor the <code>udex-country-selector</code>\n<h3>ES6 Module Import</h3>\n\n<code>import \"@sapudex/web-components/dist/CountrySelector.js\";</code>\n---\n\n\n### **Events:**\n - **change-search** - Fired event when the user submitted the value in the search.\n- **first-icon-click** - Fired event when the user clicks on the first icon.\n- **reset-search** - Fired event when the user clicks on the reset button in the search.\n- **second-icon-click** - Fired event when the user clicks on the second icon.\n- **select-all** - Fired event when the user clicks on the Select All header.\n- **selection-change** - \n- **submit-search** - Fired event when the user clicks on the submitted icon in the search.\n\n### **Methods:**\n - **resetSearch()** - Reset the search value.\n\n### **Slots:**\n - **default** - Slot for items.",
899
+ "description": "<h3 class=\"comment-api-title\">Overview</h3>\n\n\n<h3>Usage</h3>\n\nFor the <code>udex-country-selector</code>\n<h3>ES6 Module Import</h3>\n\n<code>import \"@sapudex/web-components/dist/CountrySelector.js\";</code>\n---\n\n\n### **Events:**\n - **change-search** - Fired event when the user submitted the value in the search.\n- **first-icon-click** - Fired event when the user clicks on the first icon.\n- **reset-search** - Fired event when the user clicks on the reset button in the search.\n- **second-icon-click** - Fired event when the user clicks on the second icon.\n- **select-all** - Fired event when the user clicks on the Select All header.\n- **selection-change** - \n- **submit-search** - Fired event when the user clicks on the submitted icon in the search.\n\n### **Methods:**\n - **resetSearch()** - Reset the search value.\n\n### **Slots:**\n - **default** - Slot for items.\n- **footer** - Defines the footer content for the component dropdown.\nPlace any content (e.g. an action button) here. Clicking footer content does not close the dropdown —\nuse the <code>close</code> method if needed.",
900
900
  "doc-url": "",
901
901
  "attributes": [
902
902
  {
@@ -971,14 +971,15 @@
971
971
  "name": "show-search-input",
972
972
  "description": "Defines if the search input is visible.",
973
973
  "value": { "type": "boolean", "default": "false" }
974
- },
974
+ }
975
+ ],
976
+ "slots": [
977
+ { "name": "default", "description": "Slot for items." },
975
978
  {
976
- "name": "tab-navigation-enabled",
977
- "description": "Enables tab navigation for the list.",
978
- "value": { "type": "boolean | undefined", "default": "\"\"" }
979
+ "name": "footer",
980
+ "description": "Defines the footer content for the component dropdown.\nPlace any content (e.g. an action button) here. Clicking footer content does not close the dropdown —\nuse the <code>close</code> method if needed."
979
981
  }
980
982
  ],
981
- "slots": [{ "name": "default", "description": "Slot for items." }],
982
983
  "events": [
983
984
  {
984
985
  "name": "change-search",
@@ -1079,11 +1080,6 @@
1079
1080
  "name": "show-search-input",
1080
1081
  "description": "Defines if the search input is visible.",
1081
1082
  "value": { "type": "boolean" }
1082
- },
1083
- {
1084
- "name": "tab-navigation-enabled",
1085
- "description": "Enables tab navigation for the list.",
1086
- "value": { "type": "boolean | undefined" }
1087
1083
  }
1088
1084
  ],
1089
1085
  "events": [
@@ -1783,11 +1779,6 @@
1783
1779
  "description": "Defines if the search input is visible.",
1784
1780
  "value": { "type": "boolean", "default": "false" }
1785
1781
  },
1786
- {
1787
- "name": "tab-navigation-enabled",
1788
- "description": "Enables tab navigation for the list.",
1789
- "value": { "type": "boolean | undefined", "default": "\"\"" }
1790
- },
1791
1782
  {
1792
1783
  "name": "trigger-accessible-role",
1793
1784
  "description": "Allows setting a custom role for dropdown trigger.",
@@ -1979,11 +1970,6 @@
1979
1970
  "description": "Defines if the search input is visible.",
1980
1971
  "value": { "type": "boolean" }
1981
1972
  },
1982
- {
1983
- "name": "tab-navigation-enabled",
1984
- "description": "Enables tab navigation for the list.",
1985
- "value": { "type": "boolean | undefined" }
1986
- },
1987
1973
  {
1988
1974
  "name": "trigger-accessible-role",
1989
1975
  "description": "Allows setting a custom role for dropdown trigger.",
@@ -3743,11 +3729,6 @@
3743
3729
  "default": "\"SingleSelect\""
3744
3730
  }
3745
3731
  },
3746
- {
3747
- "name": "tab-navigation-enabled",
3748
- "description": "Enables tab navigation for the list.",
3749
- "value": { "type": "boolean | undefined", "default": "\"\"" }
3750
- },
3751
3732
  {
3752
3733
  "name": "type",
3753
3734
  "description": "Defines the type of the item.",
@@ -3805,11 +3786,6 @@
3805
3786
  "type": "\"SingleSelect\" | \"MultiSelect\" | \"SingleContent\" | \"RadioGroup\""
3806
3787
  }
3807
3788
  },
3808
- {
3809
- "name": "tab-navigation-enabled",
3810
- "description": "Enables tab navigation for the list.",
3811
- "value": { "type": "boolean | undefined" }
3812
- },
3813
3789
  {
3814
3790
  "name": "type",
3815
3791
  "description": "Defines the type of the item.",
@@ -4677,6 +4653,11 @@
4677
4653
  "description": "Defines title of the countries menu",
4678
4654
  "value": { "type": "string", "default": "\"\"" }
4679
4655
  },
4656
+ {
4657
+ "name": "hide-search",
4658
+ "description": "Hides the search field in the country list view.",
4659
+ "value": { "type": "boolean", "default": "false" }
4660
+ },
4680
4661
  {
4681
4662
  "name": "language-voice",
4682
4663
  "description": "Defines the language voice of the search",
@@ -4734,6 +4715,11 @@
4734
4715
  "description": "Defines title of the countries menu",
4735
4716
  "value": { "type": "string" }
4736
4717
  },
4718
+ {
4719
+ "name": "hide-search",
4720
+ "description": "Hides the search field in the country list view.",
4721
+ "value": { "type": "boolean" }
4722
+ },
4737
4723
  {
4738
4724
  "name": "language-voice",
4739
4725
  "description": "Defines the language voice of the search",
@@ -6210,6 +6196,11 @@
6210
6196
  "description": "Defines the inner stored displayonly state.",
6211
6197
  "value": { "type": "boolean", "default": "false" }
6212
6198
  },
6199
+ {
6200
+ "name": "hide-button-tooltip",
6201
+ "description": "Defines the tooltip for the hide password button.",
6202
+ "value": { "type": "string", "default": "\"\"" }
6203
+ },
6213
6204
  {
6214
6205
  "name": "label",
6215
6206
  "description": "Defines label text for the input field.",
@@ -6309,6 +6300,11 @@
6309
6300
  "description": "Defines the inner stored displayonly state.",
6310
6301
  "value": { "type": "boolean" }
6311
6302
  },
6303
+ {
6304
+ "name": "hide-button-tooltip",
6305
+ "description": "Defines the tooltip for the hide password button.",
6306
+ "value": { "type": "string" }
6307
+ },
6312
6308
  {
6313
6309
  "name": "label",
6314
6310
  "description": "Defines label text for the input field.",
@@ -7695,7 +7691,7 @@
7695
7691
  },
7696
7692
  {
7697
7693
  "name": "udex-select-box",
7698
- "description": "<h3 class=\"comment-api-title\">Overview</h3>\n\n\n<h3>Usage</h3>\n\nFor the <code>udex-select-box</code>\n<h3>ES6 Module Import</h3>\n\n<code>import \"@sapudex/web-components/dist/UDExSelectBox.js\";</code>\n---\n\n\n### **Events:**\n - **change-search** - Fired event when the user submitted the value in the search.\n- **first-icon-click** - Fired event when the user clicks on the first icon.\n- **remove** - Fired event when the user remove tag.\n- **reset-search** - Fired event when the user clicks on the reset button in the search.\n- **second-icon-click** - Fired event when the user clicks on the second icon.\n- **select-all** - Fired event when the user clicks on the Select All header.\n- **selection-change** - \n- **show-more** - Fired event when the user clicks on the More button.\n- **submit-search** - Fired event when the user clicks on the submitted icon in the search.\n\n### **Methods:**\n - **close(): _void_** - Close the dropdown.\n- **resetSearch()** - Reset the search value.\n\n### **Slots:**\n - **default** - Slot for items.",
7694
+ "description": "<h3 class=\"comment-api-title\">Overview</h3>\n\n\n<h3>Usage</h3>\n\nFor the <code>udex-select-box</code>\n<h3>ES6 Module Import</h3>\n\n<code>import \"@sapudex/web-components/dist/UDExSelectBox.js\";</code>\n---\n\n\n### **Events:**\n - **change-search** - Fired event when the user submitted the value in the search.\n- **first-icon-click** - Fired event when the user clicks on the first icon.\n- **remove** - Fired event when the user remove tag.\n- **reset-search** - Fired event when the user clicks on the reset button in the search.\n- **second-icon-click** - Fired event when the user clicks on the second icon.\n- **select-all** - Fired event when the user clicks on the Select All header.\n- **selection-change** - \n- **show-more** - Fired event when the user clicks on the More button.\n- **submit-search** - Fired event when the user clicks on the submitted icon in the search.\n\n### **Methods:**\n - **close(): _void_** - Close the dropdown.\n- **resetSearch()** - Reset the search value.\n\n### **Slots:**\n - **default** - Slot for items.\n- **footer** - Defines the footer content for the component dropdown.\nPlace any content (e.g. an action button) here. Clicking footer content does not close the dropdown —\nuse the <code>close</code> method if needed.",
7699
7695
  "doc-url": "",
7700
7696
  "attributes": [
7701
7697
  {
@@ -7761,11 +7757,6 @@
7761
7757
  "description": "Defines if the search input is visible.",
7762
7758
  "value": { "type": "boolean", "default": "false" }
7763
7759
  },
7764
- {
7765
- "name": "tab-navigation-enabled",
7766
- "description": "Enables tab navigation for the list.",
7767
- "value": { "type": "boolean | undefined", "default": "\"\"" }
7768
- },
7769
7760
  {
7770
7761
  "name": "tooltip-placement",
7771
7762
  "description": "Determines on which side of the component the Tooltip is displayed.",
@@ -7775,7 +7766,13 @@
7775
7766
  }
7776
7767
  }
7777
7768
  ],
7778
- "slots": [{ "name": "default", "description": "Slot for items." }],
7769
+ "slots": [
7770
+ { "name": "default", "description": "Slot for items." },
7771
+ {
7772
+ "name": "footer",
7773
+ "description": "Defines the footer content for the component dropdown.\nPlace any content (e.g. an action button) here. Clicking footer content does not close the dropdown —\nuse the <code>close</code> method if needed."
7774
+ }
7775
+ ],
7779
7776
  "events": [
7780
7777
  {
7781
7778
  "name": "change-search",
@@ -7875,11 +7872,6 @@
7875
7872
  "description": "Defines if the search input is visible.",
7876
7873
  "value": { "type": "boolean" }
7877
7874
  },
7878
- {
7879
- "name": "tab-navigation-enabled",
7880
- "description": "Enables tab navigation for the list.",
7881
- "value": { "type": "boolean | undefined" }
7882
- },
7883
7875
  {
7884
7876
  "name": "tooltip-placement",
7885
7877
  "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.39.0",
4
+ "version": "2.41.0",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
7
7
  },
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>
@@ -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
 
@@ -573,8 +568,12 @@ class UDExSearchableListBase extends UI5Element {
573
568
  return item.getAttribute("data-token-id") as string;
574
569
  }
575
570
 
571
+ get _validItems(): Array<UDExListItemBase | UDExListGroupHeaderBase> {
572
+ return this.items.filter(item => !(item instanceof HTMLElement) || "isGroup" in item);
573
+ }
574
+
576
575
  getProcessedItems(): Array<UDExProcessedItem> {
577
- return this.items.map(item => {
576
+ return this._validItems.map(item => {
578
577
  const isGroup = item.isGroup;
579
578
  const groupItems = isGroup ? (item as UDExListGroupHeaderBase).getItems() : [];
580
579
 
@@ -632,7 +631,7 @@ class UDExSearchableListBase extends UI5Element {
632
631
  }
633
632
 
634
633
  get selectedItems(): Array<UDExListItemBase> {
635
- const selectedItems: Array<UDExListItemBase> = this.getSlottedItems(this.items).filter(({ selected }) => selected);
634
+ const selectedItems: Array<UDExListItemBase> = this.getSlottedItems(this._validItems).filter(({ selected }) => selected);
636
635
  return selectedItems;
637
636
  }
638
637
 
@@ -672,7 +671,7 @@ class UDExSearchableListBase extends UI5Element {
672
671
  }
673
672
 
674
673
  get nonGroupItems(): Array<UDExListItemBase> {
675
- return this.getSlottedItems(this.items).filter(item => !item.isGroup);
674
+ return this.getSlottedItems(this._validItems).filter(item => !item.isGroup);
676
675
  }
677
676
 
678
677
  get roleForGroupList(): string {
@@ -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) => (