@sapudex/web-components 2.61.0 → 2.63.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 (467) hide show
  1. package/cypress/specs/AccordionSpotlight.cy.tsx +43 -2
  2. package/cypress/specs/Carousel.cy.tsx +88 -0
  3. package/cypress/specs/CountrySelector.cy.tsx +233 -6
  4. package/cypress/specs/FilterMenu.cy.tsx +39 -45
  5. package/cypress/specs/List.cy.tsx +624 -10
  6. package/cypress/specs/ListItem.cy.tsx +50 -0
  7. package/cypress/specs/MastheadCountrySelector.cy.tsx +177 -0
  8. package/cypress/specs/SelectBox.cy.tsx +239 -131
  9. package/cypress/specs/SelectBoxAccessibility.cy.tsx +3109 -0
  10. package/cypress/specs/SideNavigation.cy.tsx +49 -0
  11. package/cypress/specs/SideNavigationMobile.cy.tsx +69 -0
  12. package/cypress/specs/TagGroup.cy.tsx +168 -0
  13. package/cypress/support/component-imports.instrumented.ts +4 -0
  14. package/cypress/support/component-imports.src.ts +4 -0
  15. package/dist/AccordionItemTemplate.js +1 -1
  16. package/dist/AccordionItemTemplate.js.map +1 -1
  17. package/dist/AccordionSpotlight.d.ts +7 -2
  18. package/dist/AccordionSpotlight.js +31 -6
  19. package/dist/AccordionSpotlight.js.map +1 -1
  20. package/dist/AccordionSpotlightItem.d.ts +3 -1
  21. package/dist/AccordionSpotlightItem.js +3 -1
  22. package/dist/AccordionSpotlightItem.js.map +1 -1
  23. package/dist/Carousel.d.ts +1 -0
  24. package/dist/Carousel.js +19 -3
  25. package/dist/Carousel.js.map +1 -1
  26. package/dist/CountrySelector.js +1 -3
  27. package/dist/CountrySelector.js.map +1 -1
  28. package/dist/List.d.ts +2 -0
  29. package/dist/List.js +22 -4
  30. package/dist/List.js.map +1 -1
  31. package/dist/ListGroupHeader.js +5 -1
  32. package/dist/ListGroupHeader.js.map +1 -1
  33. package/dist/ListGroupHeaderBase.d.ts +2 -0
  34. package/dist/ListGroupHeaderBase.js +15 -2
  35. package/dist/ListGroupHeaderBase.js.map +1 -1
  36. package/dist/ListGroupHeaderTemplate.js +14 -22
  37. package/dist/ListGroupHeaderTemplate.js.map +1 -1
  38. package/dist/ListItem.d.ts +1 -2
  39. package/dist/ListItem.js +14 -12
  40. package/dist/ListItem.js.map +1 -1
  41. package/dist/ListItemBase.d.ts +5 -0
  42. package/dist/ListItemBase.js +11 -1
  43. package/dist/ListItemBase.js.map +1 -1
  44. package/dist/ListItemTemplate.js +1 -1
  45. package/dist/ListItemTemplate.js.map +1 -1
  46. package/dist/ListSelectAllTemplate.js +1 -1
  47. package/dist/ListSelectAllTemplate.js.map +1 -1
  48. package/dist/ListTemplate.js +2 -1
  49. package/dist/ListTemplate.js.map +1 -1
  50. package/dist/MastheadCountrySelector.d.ts +14 -0
  51. package/dist/MastheadCountrySelector.js +6 -0
  52. package/dist/MastheadCountrySelector.js.map +1 -1
  53. package/dist/MastheadCountrySelectorTemplate.js +1 -1
  54. package/dist/MastheadCountrySelectorTemplate.js.map +1 -1
  55. package/dist/MessageStrip.d.ts +1 -0
  56. package/dist/MessageStrip.js +6 -0
  57. package/dist/MessageStrip.js.map +1 -1
  58. package/dist/Search.d.ts +13 -3
  59. package/dist/Search.js +36 -11
  60. package/dist/Search.js.map +1 -1
  61. package/dist/SearchTemplate.js +1 -1
  62. package/dist/SearchTemplate.js.map +1 -1
  63. package/dist/SearchableListBase.d.ts +2 -0
  64. package/dist/SearchableListBase.js +13 -3
  65. package/dist/SearchableListBase.js.map +1 -1
  66. package/dist/SearchableListBaseTemplate.js +42 -33
  67. package/dist/SearchableListBaseTemplate.js.map +1 -1
  68. package/dist/SelectBase.d.ts +18 -33
  69. package/dist/SelectBase.js +124 -139
  70. package/dist/SelectBase.js.map +1 -1
  71. package/dist/SelectBox.d.ts +3 -0
  72. package/dist/SelectBox.js +19 -7
  73. package/dist/SelectBox.js.map +1 -1
  74. package/dist/SelectBoxTemplate.js +3 -3
  75. package/dist/SelectBoxTemplate.js.map +1 -1
  76. package/dist/SideNavigation.d.ts +9 -0
  77. package/dist/SideNavigation.js +9 -0
  78. package/dist/SideNavigation.js.map +1 -1
  79. package/dist/SideNavigationItem.js +2 -0
  80. package/dist/SideNavigationItem.js.map +1 -1
  81. package/dist/SideNavigationItemTemplate.d.ts +2 -0
  82. package/dist/SideNavigationItemTemplate.js +15 -0
  83. package/dist/SideNavigationItemTemplate.js.map +1 -0
  84. package/dist/SideNavigationMobile.d.ts +19 -0
  85. package/dist/SideNavigationMobile.js +33 -3
  86. package/dist/SideNavigationMobile.js.map +1 -1
  87. package/dist/SideNavigationMobileTemplate.js +1 -2
  88. package/dist/SideNavigationMobileTemplate.js.map +1 -1
  89. package/dist/SideNavigationSubItem.d.ts +4 -1
  90. package/dist/SideNavigationSubItem.js +22 -10
  91. package/dist/SideNavigationSubItem.js.map +1 -1
  92. package/dist/SideNavigationSubItemTemplate.js +1 -2
  93. package/dist/SideNavigationSubItemTemplate.js.map +1 -1
  94. package/dist/SideNavigationTemplate.d.ts +2 -0
  95. package/dist/SideNavigationTemplate.js +6 -0
  96. package/dist/SideNavigationTemplate.js.map +1 -0
  97. package/dist/TagGroup.d.ts +3 -0
  98. package/dist/TagGroup.js +31 -0
  99. package/dist/TagGroup.js.map +1 -1
  100. package/dist/TagGroupTemplate.js +1 -1
  101. package/dist/TagGroupTemplate.js.map +1 -1
  102. package/dist/assets/{InputSuggestions-1OnUn6pM.js → InputSuggestions-6S5UueXO.js} +2 -2
  103. package/dist/assets/{ListItemStandardExpandableTextTemplate-CoBAMp_v.js → ListItemStandardExpandableTextTemplate-OidrwM_d.js} +2 -2
  104. package/dist/assets/{bundle.esm-BqaVWFKf.js → bundle.esm-DaFsZANO.js} +237 -239
  105. package/dist/assets/messagebundle_ar-22dGHdkl.js +1 -0
  106. package/dist/assets/messagebundle_ar-DbxuUDUB.js +1 -0
  107. package/dist/assets/messagebundle_bg-CaaOz5e4.js +1 -0
  108. package/dist/assets/messagebundle_bg-QOUvq6-8.js +1 -0
  109. package/dist/assets/messagebundle_ca-D-8eSg1w.js +1 -0
  110. package/dist/assets/messagebundle_ca-jsUpFfNJ.js +1 -0
  111. package/dist/assets/messagebundle_cnr-BdSolJRo.js +1 -0
  112. package/dist/assets/messagebundle_cnr-rtr9Ox4O.js +1 -0
  113. package/dist/assets/messagebundle_cs-CbM7zJ23.js +1 -0
  114. package/dist/assets/messagebundle_cy-D5E7e9o1.js +1 -0
  115. package/dist/assets/messagebundle_cy-hajQLyoj.js +1 -0
  116. package/dist/assets/messagebundle_da-C3PD-hWQ.js +1 -0
  117. package/dist/assets/messagebundle_da-DFzvQYW2.js +1 -0
  118. package/dist/assets/messagebundle_de-C106E9io.js +1 -0
  119. package/dist/assets/messagebundle_de-C36z5lgV.js +1 -0
  120. package/dist/assets/messagebundle_el-BLHqa1_J.js +1 -0
  121. package/dist/assets/messagebundle_el-k8W9FVQI.js +1 -0
  122. package/dist/assets/messagebundle_en-ClXds397.js +1 -0
  123. package/dist/assets/messagebundle_en-DgPtAFO8.js +1 -0
  124. package/dist/assets/messagebundle_en_GB-DxulA9qE.js +1 -0
  125. package/dist/assets/messagebundle_en_GB-LxAIZigF.js +1 -0
  126. package/dist/assets/{messagebundle_en_US_sappsd-Se8GgI58.js → messagebundle_en_US_sappsd-TZz2y4pV.js} +1 -1
  127. package/dist/assets/messagebundle_en_US_sappsd-oE0A2op2.js +1 -0
  128. package/dist/assets/messagebundle_en_US_saprigi-C6FsbpF8.js +1 -0
  129. package/dist/assets/{messagebundle_en_US_saprigi-CbfvaHUL.js → messagebundle_en_US_saprigi-CkPhuOLS.js} +1 -1
  130. package/dist/assets/messagebundle_en_US_saptrc-CFSYKuS7.js +1 -0
  131. package/dist/assets/messagebundle_en_US_saptrc-CNZe1wPP.js +1 -0
  132. package/dist/assets/messagebundle_es-C3ijAvKG.js +1 -0
  133. package/dist/assets/messagebundle_es-wi4P-8Bo.js +1 -0
  134. package/dist/assets/messagebundle_es_MX-JEoOD2AD.js +1 -0
  135. package/dist/assets/messagebundle_es_MX-qDQ65ei9.js +1 -0
  136. package/dist/assets/messagebundle_et-C3wgDmm9.js +1 -0
  137. package/dist/assets/messagebundle_et-D4r4iubd.js +1 -0
  138. package/dist/assets/messagebundle_fi-BjyQcbRb.js +1 -0
  139. package/dist/assets/messagebundle_fi-CivJKH9k.js +1 -0
  140. package/dist/assets/messagebundle_fr-BxDSBfD5.js +1 -0
  141. package/dist/assets/messagebundle_fr-JN2VAe-b.js +1 -0
  142. package/dist/assets/messagebundle_fr_CA-FkrcsWH5.js +1 -0
  143. package/dist/assets/messagebundle_fr_CA-phd0XOeR.js +1 -0
  144. package/dist/assets/messagebundle_hi-B_pehoTp.js +1 -0
  145. package/dist/assets/messagebundle_hi-CVOoC3dA.js +1 -0
  146. package/dist/assets/messagebundle_hr-BYS-ya62.js +1 -0
  147. package/dist/assets/messagebundle_hr-DHuCJjK8.js +1 -0
  148. package/dist/assets/messagebundle_hu-Crn0Y1hl.js +1 -0
  149. package/dist/assets/messagebundle_hu-DJL3QHT4.js +1 -0
  150. package/dist/assets/messagebundle_id-BJEG-7Up.js +1 -0
  151. package/dist/assets/messagebundle_id-CgbG2IVb.js +1 -0
  152. package/dist/assets/messagebundle_it-B-E3gO1k.js +1 -0
  153. package/dist/assets/messagebundle_it-DHwy0JuE.js +1 -0
  154. package/dist/assets/messagebundle_iw-BFfL9nZy.js +1 -0
  155. package/dist/assets/messagebundle_iw-BgyHu_0a.js +1 -0
  156. package/dist/assets/messagebundle_ja-BDNEwBMO.js +1 -0
  157. package/dist/assets/messagebundle_ja-eyoqeb4r.js +1 -0
  158. package/dist/assets/messagebundle_kk-BA_1qhYv.js +1 -0
  159. package/dist/assets/messagebundle_kk-CTAXqbPN.js +1 -0
  160. package/dist/assets/messagebundle_ko-C1tsjQMn.js +1 -0
  161. package/dist/assets/messagebundle_ko-CkiNi7iV.js +1 -0
  162. package/dist/assets/messagebundle_lt-Dp0c8r7p.js +1 -0
  163. package/dist/assets/{messagebundle_lt-BGK5mpcm.js → messagebundle_lt-bNum-ekg.js} +1 -1
  164. package/dist/assets/messagebundle_lv-B9UWTGX9.js +1 -0
  165. package/dist/assets/messagebundle_lv-D02PBhtR.js +1 -0
  166. package/dist/assets/messagebundle_mk--Xt_Ciey.js +1 -0
  167. package/dist/assets/messagebundle_mk-D6s2Tr95.js +1 -0
  168. package/dist/assets/messagebundle_ms-BAqsvtp5.js +1 -0
  169. package/dist/assets/messagebundle_ms-BobJaFPp.js +1 -0
  170. package/dist/assets/messagebundle_nl-BJCykHj1.js +1 -0
  171. package/dist/assets/messagebundle_nl-Dj7LaMyb.js +1 -0
  172. package/dist/assets/messagebundle_no-CR_uQXUz.js +1 -0
  173. package/dist/assets/messagebundle_no-CnwJbEW8.js +1 -0
  174. package/dist/assets/messagebundle_pl-D6FQ-6EC.js +1 -0
  175. package/dist/assets/messagebundle_pl-eJC2NE6N.js +1 -0
  176. package/dist/assets/messagebundle_pt-CbdPbTKR.js +1 -0
  177. package/dist/assets/messagebundle_pt-n8LcOyWG.js +1 -0
  178. package/dist/assets/messagebundle_pt_PT-B17ziKL9.js +1 -0
  179. package/dist/assets/messagebundle_pt_PT-BVpS4lrC.js +1 -0
  180. package/dist/assets/messagebundle_ro-C0jrNva4.js +1 -0
  181. package/dist/assets/messagebundle_ro-ixITTbJt.js +1 -0
  182. package/dist/assets/messagebundle_ru-Bh6RMNe2.js +1 -0
  183. package/dist/assets/messagebundle_ru-Dbxms1Xm.js +1 -0
  184. package/dist/assets/messagebundle_sh-CMDXUWge.js +1 -0
  185. package/dist/assets/messagebundle_sh-Cb-sVI_0.js +1 -0
  186. package/dist/assets/messagebundle_sk-DZkkgRSd.js +1 -0
  187. package/dist/assets/{messagebundle_sk-CXOF1RuF.js → messagebundle_sk-Dqb_XwMg.js} +1 -1
  188. package/dist/assets/messagebundle_sl-DIl-2Lb1.js +1 -0
  189. package/dist/assets/messagebundle_sl-Dx6UWXni.js +1 -0
  190. package/dist/assets/messagebundle_sr-DstlyDjZ.js +1 -0
  191. package/dist/assets/messagebundle_sr-yQWBd9jR.js +1 -0
  192. package/dist/assets/messagebundle_sv-Dr2hDyEO.js +1 -0
  193. package/dist/assets/messagebundle_sv-iHKWgaRg.js +1 -0
  194. package/dist/assets/messagebundle_th-DbWfCb5y.js +1 -0
  195. package/dist/assets/messagebundle_th-yLU2SE6L.js +1 -0
  196. package/dist/assets/messagebundle_tr-CIoGg6uY.js +1 -0
  197. package/dist/assets/messagebundle_tr-lAQvvdUi.js +1 -0
  198. package/dist/assets/messagebundle_uk-DIBItAKu.js +1 -0
  199. package/dist/assets/messagebundle_uk-j_sqGY4D.js +1 -0
  200. package/dist/assets/messagebundle_vi-C40OW2eC.js +1 -0
  201. package/dist/assets/messagebundle_vi-xWTpoKPI.js +1 -0
  202. package/dist/assets/messagebundle_zh_CN-CmeOlVfl.js +1 -0
  203. package/dist/assets/messagebundle_zh_CN-U8Z0kuQb.js +1 -0
  204. package/dist/assets/messagebundle_zh_TW-B_1_vc8O.js +1 -0
  205. package/dist/assets/messagebundle_zh_TW-hwHN6ElU.js +1 -0
  206. package/dist/assets/{parameters-bundle.css-Cv89y49I.js → parameters-bundle.css-2ZsUlBNO.js} +299 -151
  207. package/dist/assets/parameters-bundle.css-31Bw5XOG.js +2 -0
  208. package/dist/assets/parameters-bundle.css-BJp4ZvSQ.js +2 -0
  209. package/dist/assets/{parameters-bundle.css-vNsSPPU5.js → parameters-bundle.css-BKlkVfkE.js} +742 -494
  210. package/dist/assets/parameters-bundle.css-BMOU75LU.js +2 -0
  211. package/dist/assets/parameters-bundle.css-BZF5sWSb.js +1 -0
  212. package/dist/assets/{parameters-bundle.css-DmEWEk0u.js → parameters-bundle.css-Bf1GOISM.js} +786 -513
  213. package/dist/assets/parameters-bundle.css-BpWLGMCI.js +2 -0
  214. package/dist/assets/parameters-bundle.css-BsoxE2UF.js +2 -0
  215. package/dist/assets/parameters-bundle.css-CAhrGUcA.js +2 -0
  216. package/dist/assets/{parameters-bundle.css-C3eDVARm.js → parameters-bundle.css-CDJt5bvS.js} +176 -89
  217. package/dist/assets/parameters-bundle.css-CIr3BQBD.js +2 -0
  218. package/dist/assets/parameters-bundle.css-CVUmNgQM.js +2 -0
  219. package/dist/assets/parameters-bundle.css-C_pu3Dce.js +2 -0
  220. package/dist/assets/parameters-bundle.css-ChtqHIDX.js +2 -0
  221. package/dist/assets/parameters-bundle.css-CvaMQVtq.js +1 -0
  222. package/dist/assets/parameters-bundle.css-Cwz89dEH.js +2 -0
  223. package/dist/assets/parameters-bundle.css-CyCovTbK.js +2 -0
  224. package/dist/assets/parameters-bundle.css-Cyf5K2-Q.js +2 -0
  225. package/dist/assets/parameters-bundle.css-DdDLbfHl.js +2 -0
  226. package/dist/assets/{parameters-bundle.css-C5V2Zp_F.js → parameters-bundle.css-Dfz9lgd6.js} +131 -95
  227. package/dist/assets/{parameters-bundle.css-K-MvKimD.js → parameters-bundle.css-DjW0INFD.js} +139 -88
  228. package/dist/assets/parameters-bundle.css-JyFiyY-_.js +2 -0
  229. package/dist/assets/parameters-bundle.css-tf-z7jv9.js +2 -0
  230. package/dist/css/themes/AccordionSpotlight.css +1 -1
  231. package/dist/css/themes/ListGroupHeader.css +1 -1
  232. package/dist/css/themes/MastheadShell.css +1 -1
  233. package/dist/css/themes/SideNavigation.css +1 -1
  234. package/dist/css/themes/SideNavigationItem.css +1 -1
  235. package/dist/css/themes/SideNavigationMobile.css +1 -1
  236. package/dist/css/themes/SideNavigationSubItem.css +1 -1
  237. package/dist/css/themes/Slider.css +1 -1
  238. package/dist/css/themes/Table.css +1 -1
  239. package/dist/css/themes/sap_fiori_3/parameters-bundle.css +0 -1
  240. package/dist/css/themes/sap_glow/parameters-bundle.css +0 -1
  241. package/dist/css/themes/sap_horizon/parameters-bundle.css +0 -1
  242. package/dist/custom-elements-internal.json +1443 -7
  243. package/dist/custom-elements.json +1497 -28
  244. package/dist/generated/assets/themes/sap_fiori_3/parameters-bundle.css.json +1 -1
  245. package/dist/generated/assets/themes/sap_glow/parameters-bundle.css.json +1 -1
  246. package/dist/generated/assets/themes/sap_horizon/parameters-bundle.css.json +1 -1
  247. package/dist/generated/i18n/i18n-defaults.d.ts +2 -1
  248. package/dist/generated/i18n/i18n-defaults.js +2 -1
  249. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  250. package/dist/generated/themes/AccordionSpotlight.css.d.ts +1 -1
  251. package/dist/generated/themes/AccordionSpotlight.css.js +1 -1
  252. package/dist/generated/themes/AccordionSpotlight.css.js.map +1 -1
  253. package/dist/generated/themes/ListGroupHeader.css.d.ts +1 -1
  254. package/dist/generated/themes/ListGroupHeader.css.js +1 -1
  255. package/dist/generated/themes/ListGroupHeader.css.js.map +1 -1
  256. package/dist/generated/themes/MastheadShell.css.d.ts +1 -1
  257. package/dist/generated/themes/MastheadShell.css.js +1 -1
  258. package/dist/generated/themes/MastheadShell.css.js.map +1 -1
  259. package/dist/generated/themes/SideNavigation.css.d.ts +1 -1
  260. package/dist/generated/themes/SideNavigation.css.js +1 -1
  261. package/dist/generated/themes/SideNavigation.css.js.map +1 -1
  262. package/dist/generated/themes/SideNavigationItem.css.d.ts +1 -1
  263. package/dist/generated/themes/SideNavigationItem.css.js +1 -1
  264. package/dist/generated/themes/SideNavigationItem.css.js.map +1 -1
  265. package/dist/generated/themes/SideNavigationMobile.css.d.ts +1 -1
  266. package/dist/generated/themes/SideNavigationMobile.css.js +1 -1
  267. package/dist/generated/themes/SideNavigationMobile.css.js.map +1 -1
  268. package/dist/generated/themes/SideNavigationSubItem.css.d.ts +1 -1
  269. package/dist/generated/themes/SideNavigationSubItem.css.js +1 -1
  270. package/dist/generated/themes/SideNavigationSubItem.css.js.map +1 -1
  271. package/dist/generated/themes/Slider.css.d.ts +1 -1
  272. package/dist/generated/themes/Slider.css.js +1 -1
  273. package/dist/generated/themes/Slider.css.js.map +1 -1
  274. package/dist/generated/themes/Table.css.d.ts +1 -1
  275. package/dist/generated/themes/Table.css.js +1 -1
  276. package/dist/generated/themes/Table.css.js.map +1 -1
  277. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.d.ts +1 -1
  278. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.js +1 -1
  279. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.js.map +1 -1
  280. package/dist/generated/themes/sap_glow/parameters-bundle.css.d.ts +1 -1
  281. package/dist/generated/themes/sap_glow/parameters-bundle.css.js +1 -1
  282. package/dist/generated/themes/sap_glow/parameters-bundle.css.js.map +1 -1
  283. package/dist/generated/themes/sap_horizon/parameters-bundle.css.d.ts +1 -1
  284. package/dist/generated/themes/sap_horizon/parameters-bundle.css.js +1 -1
  285. package/dist/generated/themes/sap_horizon/parameters-bundle.css.js.map +1 -1
  286. package/dist/messagebundle.properties +3 -0
  287. package/dist/vscode.html-custom-data.json +16 -6
  288. package/dist/web-types.json +41 -11
  289. package/package.json +8 -8
  290. package/src/AccordionItemTemplate.tsx +1 -0
  291. package/src/AccordionSpotlight.ts +35 -6
  292. package/src/AccordionSpotlightItem.ts +3 -1
  293. package/src/Carousel.ts +22 -3
  294. package/src/CountrySelector.ts +1 -3
  295. package/src/List.ts +21 -4
  296. package/src/ListGroupHeader.ts +5 -1
  297. package/src/ListGroupHeaderBase.ts +16 -2
  298. package/src/ListGroupHeaderTemplate.tsx +29 -47
  299. package/src/ListItem.ts +14 -13
  300. package/src/ListItemBase.ts +14 -1
  301. package/src/ListItemTemplate.tsx +4 -4
  302. package/src/ListSelectAllTemplate.tsx +10 -8
  303. package/src/ListTemplate.tsx +14 -10
  304. package/src/MastheadCountrySelector.ts +18 -0
  305. package/src/MastheadCountrySelectorTemplate.tsx +2 -0
  306. package/src/MessageStrip.ts +7 -0
  307. package/src/Search.ts +48 -13
  308. package/src/SearchTemplate.tsx +3 -1
  309. package/src/SearchableListBase.ts +15 -3
  310. package/src/SearchableListBaseTemplate.tsx +54 -39
  311. package/src/SelectBase.ts +130 -144
  312. package/src/SelectBox.ts +21 -7
  313. package/src/SelectBoxTemplate.tsx +10 -9
  314. package/src/SideNavigation.ts +17 -0
  315. package/src/SideNavigationItem.ts +2 -0
  316. package/src/SideNavigationItemTemplate.tsx +97 -0
  317. package/src/SideNavigationMobile.ts +53 -2
  318. package/src/SideNavigationMobileTemplate.tsx +3 -5
  319. package/src/SideNavigationSubItem.ts +19 -6
  320. package/src/SideNavigationSubItemTemplate.tsx +10 -7
  321. package/src/SideNavigationTemplate.tsx +17 -0
  322. package/src/TagGroup.ts +32 -0
  323. package/src/TagGroupTemplate.tsx +1 -1
  324. package/src/generated/i18n/i18n-defaults.ts +2 -2
  325. package/src/generated/themes/AccordionSpotlight.css.ts +1 -1
  326. package/src/generated/themes/ListGroupHeader.css.ts +1 -1
  327. package/src/generated/themes/MastheadShell.css.ts +1 -1
  328. package/src/generated/themes/SideNavigation.css.ts +1 -1
  329. package/src/generated/themes/SideNavigationItem.css.ts +1 -1
  330. package/src/generated/themes/SideNavigationMobile.css.ts +1 -1
  331. package/src/generated/themes/SideNavigationSubItem.css.ts +1 -1
  332. package/src/generated/themes/Slider.css.ts +1 -1
  333. package/src/generated/themes/Table.css.ts +1 -1
  334. package/src/generated/themes/sap_fiori_3/parameters-bundle.css.ts +1 -1
  335. package/src/generated/themes/sap_glow/parameters-bundle.css.ts +1 -1
  336. package/src/generated/themes/sap_horizon/parameters-bundle.css.ts +1 -1
  337. package/src/i18n/messagebundle.properties +3 -0
  338. package/src/themes/AccordionSpotlight.css +9 -9
  339. package/src/themes/ListGroupHeader.css +2 -43
  340. package/src/themes/MastheadShell.css +13 -1
  341. package/src/themes/SideNavigation.css +43 -8
  342. package/src/themes/SideNavigationItem.css +56 -6
  343. package/src/themes/SideNavigationMobile.css +62 -15
  344. package/src/themes/SideNavigationSubItem.css +14 -109
  345. package/src/themes/Slider.css +25 -11
  346. package/src/themes/Table.css +6 -1
  347. package/dist/assets/messagebundle_ar-C3EXytoC.js +0 -1
  348. package/dist/assets/messagebundle_ar-DmZrrjEF.js +0 -1
  349. package/dist/assets/messagebundle_bg-BaZ97Q_b.js +0 -1
  350. package/dist/assets/messagebundle_bg-CgU7GPvK.js +0 -1
  351. package/dist/assets/messagebundle_ca-BwjVUbUA.js +0 -1
  352. package/dist/assets/messagebundle_ca-YiUGbO_8.js +0 -1
  353. package/dist/assets/messagebundle_cnr-CN2hPZIN.js +0 -1
  354. package/dist/assets/messagebundle_cnr-zdEdPJvc.js +0 -1
  355. package/dist/assets/messagebundle_cs-CGbnEjza.js +0 -1
  356. package/dist/assets/messagebundle_cy-BF0YH9Iz.js +0 -1
  357. package/dist/assets/messagebundle_cy-CUiGsjO6.js +0 -1
  358. package/dist/assets/messagebundle_da-CWKLQJiq.js +0 -1
  359. package/dist/assets/messagebundle_da-bTkr4pUc.js +0 -1
  360. package/dist/assets/messagebundle_de-BmnClk4G.js +0 -1
  361. package/dist/assets/messagebundle_de-vB6qhgvG.js +0 -1
  362. package/dist/assets/messagebundle_el-DKdItEgW.js +0 -1
  363. package/dist/assets/messagebundle_el-Gv1Ly8aj.js +0 -1
  364. package/dist/assets/messagebundle_en-DbKo-Dkl.js +0 -1
  365. package/dist/assets/messagebundle_en-DcV886MF.js +0 -1
  366. package/dist/assets/messagebundle_en_GB-Be93_Z4H.js +0 -1
  367. package/dist/assets/messagebundle_en_GB-CFh7e8hQ.js +0 -1
  368. package/dist/assets/messagebundle_en_US_sappsd-HCarC-Yr.js +0 -1
  369. package/dist/assets/messagebundle_en_US_saprigi-CCHFk7YZ.js +0 -1
  370. package/dist/assets/messagebundle_en_US_saptrc-B8AIRzlo.js +0 -1
  371. package/dist/assets/messagebundle_en_US_saptrc-yJ3PcdEm.js +0 -1
  372. package/dist/assets/messagebundle_es-BH-a8BxO.js +0 -1
  373. package/dist/assets/messagebundle_es-Dt93wbGV.js +0 -1
  374. package/dist/assets/messagebundle_es_MX-BedlYlF3.js +0 -1
  375. package/dist/assets/messagebundle_es_MX-COPqooo9.js +0 -1
  376. package/dist/assets/messagebundle_et-BsYgDw46.js +0 -1
  377. package/dist/assets/messagebundle_et-UwpqUE-p.js +0 -1
  378. package/dist/assets/messagebundle_fi-BN3UWEz0.js +0 -1
  379. package/dist/assets/messagebundle_fi-Cwf7Puui.js +0 -1
  380. package/dist/assets/messagebundle_fr-43w09LAE.js +0 -1
  381. package/dist/assets/messagebundle_fr-CVRaf9_H.js +0 -1
  382. package/dist/assets/messagebundle_fr_CA-BM04X6xU.js +0 -1
  383. package/dist/assets/messagebundle_fr_CA-CdnVYumi.js +0 -1
  384. package/dist/assets/messagebundle_hi-DfeonbAH.js +0 -1
  385. package/dist/assets/messagebundle_hi-JRJlP9Uh.js +0 -1
  386. package/dist/assets/messagebundle_hr-CKOnn34q.js +0 -1
  387. package/dist/assets/messagebundle_hr-CbyIBlH3.js +0 -1
  388. package/dist/assets/messagebundle_hu-DF1gQudE.js +0 -1
  389. package/dist/assets/messagebundle_hu-D_IQ9kTy.js +0 -1
  390. package/dist/assets/messagebundle_id-B0K1usj4.js +0 -1
  391. package/dist/assets/messagebundle_id-gDJYoaGq.js +0 -1
  392. package/dist/assets/messagebundle_it-B80_R2Ih.js +0 -1
  393. package/dist/assets/messagebundle_it-CVqU4g6t.js +0 -1
  394. package/dist/assets/messagebundle_iw-BoelOIS4.js +0 -1
  395. package/dist/assets/messagebundle_iw-iMDtLxaa.js +0 -1
  396. package/dist/assets/messagebundle_ja-BlRbv4vb.js +0 -1
  397. package/dist/assets/messagebundle_ja-BrDH-19-.js +0 -1
  398. package/dist/assets/messagebundle_kk-C7VPek1-.js +0 -1
  399. package/dist/assets/messagebundle_kk-DhAT_bim.js +0 -1
  400. package/dist/assets/messagebundle_ko-CIqP8x6n.js +0 -1
  401. package/dist/assets/messagebundle_ko-DgD6uyZ5.js +0 -1
  402. package/dist/assets/messagebundle_lt-BV0kKrY0.js +0 -1
  403. package/dist/assets/messagebundle_lv-5IcjoxWD.js +0 -1
  404. package/dist/assets/messagebundle_lv-DDBi7iKe.js +0 -1
  405. package/dist/assets/messagebundle_mk-BUrn04sZ.js +0 -1
  406. package/dist/assets/messagebundle_mk-P5veRdg2.js +0 -1
  407. package/dist/assets/messagebundle_ms-9VDLR5en.js +0 -1
  408. package/dist/assets/messagebundle_ms-CB8sQUg2.js +0 -1
  409. package/dist/assets/messagebundle_nl-BaAgPO7h.js +0 -1
  410. package/dist/assets/messagebundle_nl-f1Up3dB9.js +0 -1
  411. package/dist/assets/messagebundle_no-C-_ldp7o.js +0 -1
  412. package/dist/assets/messagebundle_no-DRSqWQ-C.js +0 -1
  413. package/dist/assets/messagebundle_pl-BQoPaokq.js +0 -1
  414. package/dist/assets/messagebundle_pl-DBO1atMe.js +0 -1
  415. package/dist/assets/messagebundle_pt-BNEglYxa.js +0 -1
  416. package/dist/assets/messagebundle_pt-DgAMHmW-.js +0 -1
  417. package/dist/assets/messagebundle_pt_PT-BtYzp9KB.js +0 -1
  418. package/dist/assets/messagebundle_pt_PT-D1Ef8kUU.js +0 -1
  419. package/dist/assets/messagebundle_ro-CuDPp2fe.js +0 -1
  420. package/dist/assets/messagebundle_ro-D591wJ6f.js +0 -1
  421. package/dist/assets/messagebundle_ru-D0NridWi.js +0 -1
  422. package/dist/assets/messagebundle_ru-I8YLCfrn.js +0 -1
  423. package/dist/assets/messagebundle_sh-BswdbSRi.js +0 -1
  424. package/dist/assets/messagebundle_sh-Dw2y_oct.js +0 -1
  425. package/dist/assets/messagebundle_sk-BG4S4ZVk.js +0 -1
  426. package/dist/assets/messagebundle_sl-CAnJO_8X.js +0 -1
  427. package/dist/assets/messagebundle_sl-kpVWxIp_.js +0 -1
  428. package/dist/assets/messagebundle_sr-BTWvO8VQ.js +0 -1
  429. package/dist/assets/messagebundle_sr-VJmRSdj4.js +0 -1
  430. package/dist/assets/messagebundle_sv-B-RCgnW_.js +0 -1
  431. package/dist/assets/messagebundle_sv-Bd4wCcDb.js +0 -1
  432. package/dist/assets/messagebundle_th-CMHmLdI3.js +0 -1
  433. package/dist/assets/messagebundle_th-CZ1imsCy.js +0 -1
  434. package/dist/assets/messagebundle_tr-BfWAYIdW.js +0 -1
  435. package/dist/assets/messagebundle_tr-D-BnBirv.js +0 -1
  436. package/dist/assets/messagebundle_uk-DhxIThVl.js +0 -1
  437. package/dist/assets/messagebundle_uk-HU8hI0yj.js +0 -1
  438. package/dist/assets/messagebundle_vi-BUTqUKd4.js +0 -1
  439. package/dist/assets/messagebundle_vi-D1El4_Wj.js +0 -1
  440. package/dist/assets/messagebundle_zh_CN-Dt0azUea.js +0 -1
  441. package/dist/assets/messagebundle_zh_CN-Ofgx2uXY.js +0 -1
  442. package/dist/assets/messagebundle_zh_TW-5lv7yYS1.js +0 -1
  443. package/dist/assets/messagebundle_zh_TW-LSErOAsd.js +0 -1
  444. package/dist/assets/parameters-bundle.css-B68EyCuR.js +0 -278
  445. package/dist/assets/parameters-bundle.css-BkJSEiFx.js +0 -278
  446. package/dist/assets/parameters-bundle.css-CI4HNvFw.js +0 -1
  447. package/dist/assets/parameters-bundle.css-COeynv6D.js +0 -277
  448. package/dist/assets/parameters-bundle.css-CRa5DITh.js +0 -1
  449. package/dist/assets/parameters-bundle.css-CnIzAMdG.js +0 -3
  450. package/dist/assets/parameters-bundle.css-CsV5qbZp.js +0 -3
  451. package/dist/assets/parameters-bundle.css-DCvHNL3s.js +0 -3
  452. package/dist/assets/parameters-bundle.css-DK40uKOQ.js +0 -3
  453. package/dist/assets/parameters-bundle.css-DMfTAqMv.js +0 -2
  454. package/dist/assets/parameters-bundle.css-DO35k9r0.js +0 -2
  455. package/dist/assets/parameters-bundle.css-Df7wtRW4.js +0 -2
  456. package/dist/assets/parameters-bundle.css-DvAfqdlT.js +0 -3
  457. package/dist/assets/parameters-bundle.css-KoXGNyLG.js +0 -3
  458. package/dist/assets/parameters-bundle.css-P_M_rm9z.js +0 -3
  459. package/dist/assets/parameters-bundle.css-UJIxXHL5.js +0 -2
  460. package/dist/assets/parameters-bundle.css-co26r5Nz.js +0 -3
  461. package/dist/assets/parameters-bundle.css-uT62L0va.js +0 -3
  462. package/dist/css/themes/SideNavigationMobileDropdown.css +0 -1
  463. package/dist/generated/themes/SideNavigationMobileDropdown.css.d.ts +0 -2
  464. package/dist/generated/themes/SideNavigationMobileDropdown.css.js +0 -8
  465. package/dist/generated/themes/SideNavigationMobileDropdown.css.js.map +0 -1
  466. package/src/generated/themes/SideNavigationMobileDropdown.css.ts +0 -9
  467. package/src/themes/SideNavigationMobileDropdown.css +0 -36
@@ -57,6 +57,7 @@ function SingleCollapsibleHeaderRow(this: UDExListGroupHeader) {
57
57
  class="udex-list__header-title"
58
58
  {...({ innerHTML: this.label } as object)}>
59
59
  </span>
60
+ {this.supportingText && " "}
60
61
  {this.supportingText && (
61
62
  <span id="group-supporting-text" class={`udex-list__supporting-text ${this.sizeClass}`}>{this.supportingText}</span>
62
63
  )}
@@ -79,48 +80,32 @@ function SingleCollapsibleHeaderRow(this: UDExListGroupHeader) {
79
80
  }
80
81
 
81
82
  function SingleGroupHeaderCollapsible(this: UDExListGroupHeader) {
82
- // Conformant WAI-ARIA tree (FilterMenu real focus): nest the child role="group"
83
- // INSIDE this treeitem so screen readers count children per group natively — no
84
- // explicit aria-posinset/aria-setsize (which JAWS distrusts). Excludes SelectBox
85
- // (aria-activedescendant, _useHostAriaRole) and non-tree modes, which keep the flat
86
- // structure with the content region emitted as a sibling by the template body.
87
- const nested = this.isTreeAccessibleRole && !this._useHostAriaRole;
88
83
  // In aria-activedescendant mode (SelectBox) the HOST element is the treeitem and
89
84
  // already carries aria-expanded + the accessible name. This inner div must then be
90
85
  // presentational (singleCollapsibleHeaderRole) and must NOT duplicate those states,
91
86
  // otherwise it is a second treeitem nested inside the host treeitem with no owning
92
- // tree/group (axe/SiteImprove aria-required-parent). It stays focusable, though:
93
- // clicking the collapsible-header body relies on it receiving DOM focus to redirect
94
- // focus back to the combobox input — the same focusable, role="presentation" shape
95
- // the list-item [part=item] divs already use. The real-focus (FilterMenu) path keeps
87
+ // tree/group (axe/SiteImprove aria-required-parent). It has no tab stop in that
88
+ // mode: DOM focus stays on the combobox input. Real-focus (FilterMenu) keeps
96
89
  // the treeitem semantics plus controls/labelling on this div.
97
90
  const headerAriaAttrs = this._useHostAriaRole ? {} : {
98
91
  "aria-expanded": this.expanded,
99
92
  "aria-controls": this.ariaControlsId,
100
93
  "aria-labelledby": this.collapsibleHeaderLabelledBy,
94
+ // Own the sibling group without including its visible options in this row's label.
95
+ "aria-owns": this.isTreeAccessibleRole ? this.ariaControlsId : undefined,
101
96
  };
102
97
  return (
103
98
  <div
104
- class={`udex-list__group-content ${nested ? "udex-list__group-content--nested " : ""}udex-list__group-header-wrap ${this.sizeClass}`}
99
+ class={`udex-list__group-content udex-list__group-header-wrap ${this.sizeClass}`}
105
100
  part="group-item"
106
101
  id={`${this._id}_group-content__focusable`}
107
102
  role={this.singleCollapsibleHeaderRole as AriaRole}
108
- tabIndex={0}
103
+ tabIndex={this._useHostAriaRole ? undefined : 0}
104
+ onMouseDown={this.handleCollapseIconMouseDown}
109
105
  onKeyDown={this.handleKeyDown}
110
106
  {...headerAriaAttrs}
111
107
  _tab-index={Number(this._effectiveTabIndex)}>
112
- {nested ? (
113
- <>
114
- <div class="udex-list__group-header-row">
115
- {SingleCollapsibleHeaderRow.call(this)}
116
- </div>
117
- <div id={this.ariaControlsId} role={this.contentRegionRole as AriaRole} class="udex-list__group-list__content">
118
- <slot></slot>
119
- </div>
120
- </>
121
- ) : (
122
- SingleCollapsibleHeaderRow.call(this)
123
- )}
108
+ {SingleCollapsibleHeaderRow.call(this)}
124
109
  </div>
125
110
  );
126
111
  }
@@ -155,6 +140,7 @@ function MultiOrRadioGroupHeader(this: UDExListGroupHeader) {
155
140
  size={this.size}
156
141
  supportingText={this.supportingText}
157
142
  accessible-role={this.nonCollapsibleHeaderAccessibleRole}
143
+ _useHostAriaRole={this._useHostAriaRole}
158
144
  _additional-class-name={this._additionalClassName}
159
145
  _tab-index={Number(this._effectiveTabIndex)}
160
146
  _aria-pos-in-set={this._ariaPosInSet}
@@ -169,12 +155,13 @@ function MultiOrRadioGroupHeaderCollapsible(this: UDExListGroupHeader) {
169
155
  if (this.isNonActiveHeader) {
170
156
  return (
171
157
  <header
172
- role="button"
158
+ role={this._useHostAriaRole ? "presentation" : "button"}
173
159
  id="group-heading"
174
160
  class="udex-list__inactive-header udex-list__group-header-wrap"
175
- tabIndex={Number(this._effectiveTabIndex)}
176
- aria-expanded={this.expanded}
177
- aria-controls={this.ariaControlsId}>
161
+ tabIndex={this._useHostAriaRole ? undefined : Number(this._effectiveTabIndex)}
162
+ aria-expanded={this._useHostAriaRole ? undefined : this.expanded}
163
+ aria-controls={this._useHostAriaRole ? undefined : this.ariaControlsId}
164
+ onMouseDown={this.handleCollapseIconMouseDown}>
178
165
  <div class="udex-list__inactive-header-content">
179
166
  <span class="udex-list__header-title" {...({ innerHTML: this.label } as object)}></span>
180
167
  {this.supportingText && (
@@ -196,13 +183,13 @@ function MultiOrRadioGroupHeaderCollapsible(this: UDExListGroupHeader) {
196
183
  </header>
197
184
  );
198
185
  }
186
+ // Keep this host transparent: aria-expanded/aria-controls would override role="none"
187
+ // and interrupt the inner treeitem's required context. The inner row exposes expanded.
199
188
  return (
200
189
  <UDExListItem
201
190
  id="group-heading"
202
191
  part="group-item"
203
192
  role="none"
204
- aria-expanded={this.expanded}
205
- aria-controls={this.ariaControlsId}
206
193
  selected={this.selected}
207
194
  indeterminate={this.indeterminate}
208
195
  collapsible={this.collapsible}
@@ -217,6 +204,7 @@ function MultiOrRadioGroupHeaderCollapsible(this: UDExListGroupHeader) {
217
204
  size={this.size}
218
205
  supportingText={this.supportingText}
219
206
  accessible-role={this.collapsibleHeaderAccessibleRole}
207
+ _useHostAriaRole={this._useHostAriaRole}
220
208
  onAccordionIconClick={this.handleCollapseIconClick as EventListener}
221
209
  _additional-class-name={this._additionalClassName}
222
210
  _tab-index={Number(this._effectiveTabIndex)}
@@ -229,16 +217,12 @@ function MultiOrRadioGroupHeaderCollapsible(this: UDExListGroupHeader) {
229
217
  }
230
218
 
231
219
  export default function ListGroupHeaderTemplate(this: UDExListGroupHeader) {
232
- // Single-select real-focus tree: SingleGroupHeaderCollapsible now emits the
233
- // role="group" content region as a CHILD of the treeitem (conformant nesting),
234
- // so the template body must not also emit it as a sibling.
235
- const singleSelectNested = this.isTreeAccessibleRole && !this.useListItemHeader && !this._useHostAriaRole;
236
220
  return (
237
221
  <div
238
222
  part="item"
239
223
  class="udex-list__group"
240
224
  role={this.groupWrapperRole as AriaRole}
241
- aria-labelledby={(!this.isTreeAccessibleRole && !this.isPerGroupListbox) ? "group-heading" : undefined}>
225
+ aria-labelledby={(!this._useHostAriaRole && !this.isTreeAccessibleRole && !this.isPerGroupListbox) ? "group-heading" : undefined}>
242
226
  {this.collapsible ? (
243
227
  <div
244
228
  class="udex-list__group-list"
@@ -248,17 +232,15 @@ export default function ListGroupHeaderTemplate(this: UDExListGroupHeader) {
248
232
  ? MultiOrRadioGroupHeaderCollapsible.call(this)
249
233
  : SingleGroupHeaderCollapsible.call(this)
250
234
  }
251
- {!singleSelectNested && (
252
- <div id={this.ariaControlsId} role={this.contentRegionRole as AriaRole} class="udex-list__group-list__content">
253
- {this.isTreeAccessibleRole ? (
235
+ <div id={this.ariaControlsId} role={this.contentRegionRole as AriaRole} class="udex-list__group-list__content">
236
+ {this.isTreeAccessibleRole || this.isSingleContentList ? (
237
+ <slot></slot>
238
+ ) : (
239
+ <div role="listbox" aria-label="group">
254
240
  <slot></slot>
255
- ) : (
256
- <div role="listbox" aria-label="group">
257
- <slot></slot>
258
- </div>
259
- )}
260
- </div>
261
- )}
241
+ </div>
242
+ )}
243
+ </div>
262
244
  </div>
263
245
  ) : (
264
246
  <div
@@ -270,8 +252,8 @@ export default function ListGroupHeaderTemplate(this: UDExListGroupHeader) {
270
252
  ? MultiOrRadioGroupHeader.call(this)
271
253
  : SingleGroupHeader.call(this)
272
254
  }
273
- {this.isTreeAccessibleRole ? (
274
- <div role="group">
255
+ {this.isTreeAccessibleRole || this.isSingleContentList ? (
256
+ <div role={this.contentRegionRole as AriaRole}>
275
257
  <slot></slot>
276
258
  </div>
277
259
  ) : this.isPerGroupListbox ? (
package/src/ListItem.ts CHANGED
@@ -21,7 +21,7 @@ import UDExRadioButton from "./RadioButton.js";
21
21
  import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
22
22
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
23
23
  import {
24
- INDETERMINATE, SELECTED, UNSELECTED, RATING_INDICATOR_TEXT, RATING_COUNT_TITLE, TOTAL,
24
+ INDETERMINATE, SELECTED, UNSELECTED,
25
25
  } from "./generated/i18n/i18n-defaults.js";
26
26
  import translate from "./utils/translate.js";
27
27
 
@@ -267,7 +267,10 @@ class UDExListItem extends UDExListItemBase {
267
267
  document.removeEventListener("mouseup", this.deactivate);
268
268
  }
269
269
 
270
- handleMouseDown() {
270
+ handleMouseDown(e: MouseEvent) {
271
+ if (this._useHostAriaRole) {
272
+ e.preventDefault();
273
+ }
271
274
  this.activate();
272
275
  }
273
276
 
@@ -276,6 +279,10 @@ class UDExListItem extends UDExListItemBase {
276
279
  }
277
280
 
278
281
  handleKeyUp(e: KeyboardEvent) {
282
+ // Space activates a native button on keyup; the row must not cancel it.
283
+ if (this.firstIconElement === e.target || this.secondIconElement === e.target || (e.target as HTMLElement).classList.contains("udex-list__group-heading__icon")) {
284
+ return;
285
+ }
279
286
  e.preventDefault();
280
287
  if (isSpace(e) || isEnter(e)) {
281
288
  this.deactivate();
@@ -372,7 +379,8 @@ class UDExListItem extends UDExListItemBase {
372
379
  if (this._useHostAriaRole) {
373
380
  return "presentation";
374
381
  }
375
- if (this.accessibleRole.length > 0) {
382
+ // Removing the reflected attribute can reset the property to null.
383
+ if (this.accessibleRole) {
376
384
  return this.accessibleRole;
377
385
  }
378
386
  // SingleContent is informational (not a selection widget) — listitem is semantically correct
@@ -380,11 +388,11 @@ class UDExListItem extends UDExListItemBase {
380
388
  }
381
389
 
382
390
  get effectiveRole(): string {
383
- return this.accessibleRole.length > 0 ? this.accessibleRole : listItemRole;
391
+ return this.accessibleRole || listItemRole;
384
392
  }
385
393
 
386
394
  get ariaCheckedValue(): "true" | "false" | "mixed" | undefined {
387
- if (this.effectiveRole !== "treeitem") {
395
+ if (this.roleItem !== "treeitem") {
388
396
  return undefined;
389
397
  }
390
398
  // Only MultiSelect treeitems expose aria-checked; SingleSelect uses aria-selected.
@@ -424,7 +432,7 @@ class UDExListItem extends UDExListItemBase {
424
432
  // actually expand/collapse. Non-collapsible group headers must NOT report an
425
433
  // expanded/collapsed state (nothing to toggle); the tree hierarchy is conveyed
426
434
  // structurally by the nested role="group", not by aria-expanded.
427
- if (!this.collapsible) {
435
+ if (this._useHostAriaRole || !this.collapsible) {
428
436
  return undefined;
429
437
  }
430
438
  return this.expanded ? "true" : "false";
@@ -460,13 +468,6 @@ class UDExListItem extends UDExListItemBase {
460
468
  }
461
469
  return `${this.selected ? translate(UDExListItem, SELECTED) : translate(UDExListItem, UNSELECTED)} `;
462
470
  }
463
-
464
- get ratingAriaLabel(): string {
465
- const ratingText = this.ratingCount ? `${translate(UDExListItem, RATING_COUNT_TITLE)} ${this.ratingCount}` : "";
466
- const totalText = this.totalCount ? `${translate(UDExListItem, TOTAL)} ${this.totalCount}` : "";
467
- const ratingTitleText = translate(UDExListItem, RATING_INDICATOR_TEXT);
468
- return [...[ratingText, totalText].filter(Boolean), `${ratingTitleText} ${this.rating} of ${this.ratingMax}`].join(", ");
469
- }
470
471
  }
471
472
 
472
473
  UDExListItem.define();
@@ -8,7 +8,9 @@ import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.j
8
8
  import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
9
9
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
10
10
  import translate from "./utils/translate.js";
11
- import { COLLAPSE, EXPAND } from "./generated/i18n/i18n-defaults.js";
11
+ import {
12
+ COLLAPSE, EXPAND, RATING_COUNT_TITLE, RATING_INDICATOR_TEXT, TOTAL,
13
+ } from "./generated/i18n/i18n-defaults.js";
12
14
 
13
15
  export type UDExListItemBaseEvents = {
14
16
  "first-icon-click": UDExListItemBaseEventDetail,
@@ -407,6 +409,17 @@ class UDExListItemBase extends UI5Element {
407
409
  get hasRating(): boolean {
408
410
  return !!this.rating;
409
411
  }
412
+
413
+ /**
414
+ * Shared rating description for rendered options and their source items.
415
+ * @private
416
+ */
417
+ get ratingAriaLabel(): string {
418
+ const ratingText = this.ratingCount ? `${translate(UDExListItemBase, RATING_COUNT_TITLE)} ${this.ratingCount}` : "";
419
+ const totalText = this.totalCount ? `${translate(UDExListItemBase, TOTAL)} ${this.totalCount}` : "";
420
+ const ratingTitleText = translate(UDExListItemBase, RATING_INDICATOR_TEXT);
421
+ return [...[ratingText, totalText].filter(Boolean), `${ratingTitleText} ${this.rating} of ${this.ratingMax}`].join(", ");
422
+ }
410
423
  }
411
424
 
412
425
  export default UDExListItemBase;
@@ -136,8 +136,8 @@ export default function ListItemTemplate(this: UDExListItem) {
136
136
  {this.modeSelected && (
137
137
  <div
138
138
  part="item"
139
- tabIndex={Number(this._effectiveTabIndex)}
140
- aria-disabled={this._ariaDisabled}
139
+ tabIndex={this._useHostAriaRole ? undefined : Number(this._effectiveTabIndex)}
140
+ aria-disabled={this._useHostAriaRole ? undefined : this._ariaDisabled}
141
141
  class={this.className}
142
142
  role={this.roleItem as AriaRole}
143
143
  aria-checked={this.ariaCheckedValue}
@@ -160,7 +160,7 @@ export default function ListItemTemplate(this: UDExListItem) {
160
160
  part="checkbox"
161
161
  tabindex={-1}
162
162
  indeterminate={this.indeterminate}
163
- accessible-name={`checkbox ${this.stateAccessibleName}`}
163
+ accessible-name={this._useHostAriaRole ? undefined : `checkbox ${this.stateAccessibleName}`}
164
164
  checked={this.selected}
165
165
  disabled={this.disabled}
166
166
  aria-hidden="true"
@@ -183,7 +183,7 @@ export default function ListItemTemplate(this: UDExListItem) {
183
183
  <div
184
184
  part="item"
185
185
  role={this.roleItem as AriaRole}
186
- aria-selected={this.selected}
186
+ aria-selected={this.ariaSelectedValue}
187
187
  class={this.className}>
188
188
  {ContentList.call(this)}
189
189
  </div>
@@ -6,22 +6,24 @@ export default function ListSelectAllTemplate(this: UDExListSelectAll) {
6
6
  <div
7
7
  part="item"
8
8
  class="udex-list__group"
9
- role="group"
10
- aria-labelledby="group-select-all">
9
+ role={this._useHostAriaRole ? "presentation" : "group"}
10
+ aria-labelledby={this._useHostAriaRole ? undefined : "group-select-all"}>
11
11
  <div
12
- role="listbox"
13
- aria-label="select-all-group"
12
+ role={this._useHostAriaRole ? "presentation" : "listbox"}
13
+ aria-label={this._useHostAriaRole ? undefined : "select-all-group"}
14
14
  class={this.groupListClassName}
15
15
  onui5-item-press={this.handleSelectAllGroupItemsPress}>
16
16
  <UDExListItem
17
- role="group"
17
+ role={this._useHostAriaRole ? "none" : "group"}
18
18
  part="group-item"
19
19
  accessible-role="option"
20
+ _useHostAriaRole={this._useHostAriaRole}
21
+ label={this._useHostAriaRole ? this.selectAllLabel : undefined}
20
22
  mode={this.multiselectMode}
21
23
  onClick={this.handleSelectAllPress}
22
24
  class={this.className}
23
25
  selected={this.selected}
24
- aria-current={this.selected}
26
+ aria-current={this._useHostAriaRole ? undefined : this.selected}
25
27
  indeterminate={this.indeterminate}
26
28
  controlled={this.controlled}
27
29
  onKeyDown={this.handleKeyDownPress}
@@ -29,9 +31,9 @@ export default function ListSelectAllTemplate(this: UDExListSelectAll) {
29
31
  _additional-class-name={this.additionalClassName}
30
32
  supportingText={this.supportingText}
31
33
  divider>
32
- {this.selectAllLabel}
34
+ {!this._useHostAriaRole && this.selectAllLabel}
33
35
  </UDExListItem>
34
- <slot></slot>
36
+ {this._useHostAriaRole ? <div role="group"><slot></slot></div> : <slot></slot>}
35
37
  </div>
36
38
  </div>
37
39
  );
@@ -2,6 +2,8 @@ import type UDExList from "./List.js";
2
2
  import type { AriaRole } from "@ui5/webcomponents-base/types.js";
3
3
 
4
4
  export default function ListTemplate(this: UDExList) {
5
+ const hasHostAriaRole = this._hasHostAriaRole;
6
+
5
7
  return (
6
8
  <>
7
9
  {this.modeSelected && (
@@ -13,16 +15,18 @@ export default function ListTemplate(this: UDExList) {
13
15
  onui5-header-press={this.handleItemPress}>
14
16
  <div class="udex-list__scroll-container">
15
17
  {HeaderText.call(this)}
16
- <span id={`${this._id}-mode-label`} class="udex-list__hidden-text">
17
- {this.ariaLabelModeText}
18
- </span>
18
+ {!hasHostAriaRole && (
19
+ <span id={this.ariaLabelledBy} class="udex-list__hidden-text">
20
+ {this.ariaLabelModeText}
21
+ </span>
22
+ )}
19
23
  <div
20
24
  id="udex-list"
21
25
  class="udex-list"
22
- role={this.effectiveAccessibleRole as AriaRole}
23
- aria-labelledby={this.ariaLabelledBy}
24
- aria-multiselectable={this._listAriaMultiSelectable as "true" | undefined}
25
- aria-busy={(this.ariaBusy ?? undefined) as "true" | "false" | undefined}>
26
+ role={(hasHostAriaRole ? "none" : this.effectiveAccessibleRole) as AriaRole}
27
+ aria-labelledby={hasHostAriaRole ? undefined : this.ariaLabelledBy}
28
+ aria-multiselectable={(hasHostAriaRole ? undefined : this._listAriaMultiSelectable) as "true" | undefined}
29
+ aria-busy={(hasHostAriaRole ? undefined : this.ariaBusy ?? undefined) as "true" | "false" | undefined}>
26
30
  <slot></slot>
27
31
  </div>
28
32
  </div>
@@ -34,9 +38,9 @@ export default function ListTemplate(this: UDExList) {
34
38
  <div
35
39
  id="udex-list"
36
40
  class="udex-list"
37
- role={this.singleContentRole as AriaRole}
38
- aria-label={this.singleContentAriaLabel}
39
- aria-busy={(this.ariaBusy ?? undefined) as "true" | "false" | undefined}>
41
+ role={(hasHostAriaRole ? "none" : this.singleContentRole) as AriaRole}
42
+ aria-label={hasHostAriaRole ? undefined : this.singleContentAriaLabel}
43
+ aria-busy={(hasHostAriaRole ? undefined : this.ariaBusy ?? undefined) as "true" | "false" | undefined}>
40
44
  <slot></slot>
41
45
  </div>
42
46
  </>
@@ -207,6 +207,24 @@ class UDExMastheadCountrySelector extends UI5Element {
207
207
  @property()
208
208
  languageVoice!: string;
209
209
 
210
+ /**
211
+ * Defines the accessible ARIA name of the search field.
212
+ *
213
+ * @default ""
214
+ * @public
215
+ */
216
+ @property()
217
+ accessibleNameSearch!: string;
218
+
219
+ /**
220
+ * Defines the accessible ARIA name of the search reset icon.
221
+ *
222
+ * @default ""
223
+ * @public
224
+ */
225
+ @property()
226
+ accessibleNameSearchResetIcon!: string;
227
+
210
228
  /**
211
229
  * Defines the country list of the region is opened
212
230
  *
@@ -35,6 +35,8 @@ function activeRegionView(this: UDExMastheadCountrySelector) {
35
35
  onui5-submit-search-value={this.handleSearch}
36
36
  language-voice={this.languageVoice}
37
37
  label={this.searchLabel}
38
+ accessible-name={this.accessibleNameSearch}
39
+ accessible-name-reset-icon={this.accessibleNameSearchResetIcon}
38
40
  mode={this.homeSearchMode}
39
41
  show-voice-button={this.showSearchVoiceButton}
40
42
  non-interactive-submit-button={true}
@@ -224,6 +224,13 @@ class UDExMessageStrip extends MessageStrip {
224
224
  return this.isDecorativeDesign || this.isNotIconStatusType;
225
225
  }
226
226
 
227
+ get _closableText(): string {
228
+ if (!MessageStrip.i18nBundle) {
229
+ return "";
230
+ }
231
+ return super._closableText;
232
+ }
233
+
227
234
  get hiddenText(): string {
228
235
  const statusText = this.isDecorativeDesign ? (this.textStatusTypeMapping()[this.design] ?? "") : this.textStatusTypeMapping()[this.design];
229
236
  return `${statusText} ${this.hideCloseButton ? "" : this._closableText}`.trim();
package/src/Search.ts CHANGED
@@ -333,7 +333,10 @@ class UDExSearch extends UI5Element {
333
333
  labelPrefix!: string;
334
334
 
335
335
  /**
336
- * Defines display the suggestion popover in the component.
336
+ * Enables the suggestion popover to open automatically as the user types.
337
+ * The popover opens when the input has 2 or more characters and closes when cleared.
338
+ * Use this property for automatic, input-driven popover management.
339
+ * For programmatic control from the host application, use <code>openSuggestionPopup</code> instead.
337
340
  *
338
341
  * @default false
339
342
  * @public
@@ -371,7 +374,12 @@ class UDExSearch extends UI5Element {
371
374
  showPopoverWhenClickedIntoInput!: boolean;
372
375
 
373
376
  /**
374
- * Defines open suggestion popover.
377
+ * Programmatically controls the visibility of the suggestion popover.
378
+ * Set to <code>true</code> to open the popover; set to <code>false</code> to close it.
379
+ * Use this property when the host application needs to control the popover state manually,
380
+ * for example after receiving an asynchronous API response.
381
+ * The <code>suggestionList</code> property must be populated with data for suggestions to appear.
382
+ * Use either this property or <code>showSuggestedPopover</code> — avoid using both simultaneously.
375
383
  *
376
384
  * @default false
377
385
  * @public
@@ -563,6 +571,9 @@ class UDExSearch extends UI5Element {
563
571
  @property({ type: Boolean })
564
572
  _isTouched!: boolean;
565
573
 
574
+ private _openSuggestionHandled = false;
575
+ private _intersectionObserver?: IntersectionObserver;
576
+
566
577
  @i18n("@sapudex/web-components")
567
578
  static i18nBundle: I18nBundle;
568
579
 
@@ -576,11 +587,22 @@ class UDExSearch extends UI5Element {
576
587
  this.isNotMozillaFirefoxIOS = !this.isMozillaFirefox("FxiOS");
577
588
  this.initSpeechRecognition();
578
589
  ResizeHandler.register(this, this._handleResizeBound);
590
+ this._intersectionObserver = new IntersectionObserver(entries => {
591
+ entries.forEach(entry => {
592
+ if (entry.isIntersecting && this.openSuggestionPopup) {
593
+ this._openSuggestionHandled = false;
594
+ this.handleOpenSuggestionPopover();
595
+ }
596
+ });
597
+ });
598
+ this._intersectionObserver.observe(this);
579
599
  }
580
600
 
581
601
  onExitDOM(): void {
582
602
  ResizeHandler.deregister(this, this._handleResizeBound);
583
603
  this.removeEventListener("dropdown-trigger-event", () => { });
604
+ this._intersectionObserver?.disconnect();
605
+ this._intersectionObserver = undefined;
584
606
  }
585
607
 
586
608
  initSpeechRecognition(): void {
@@ -633,6 +655,7 @@ class UDExSearch extends UI5Element {
633
655
 
634
656
  setPopoverState(changeInfo: ChangeInfo): void {
635
657
  if (changeInfo.name === "openSuggestionPopup") {
658
+ this._openSuggestionHandled = false;
636
659
  this.handlePopoverTrigger(changeInfo.newValue as boolean);
637
660
  }
638
661
  }
@@ -651,8 +674,8 @@ class UDExSearch extends UI5Element {
651
674
  }
652
675
  }
653
676
 
654
- setSuggestedRecommendedLists(value: string): void {
655
- if (this.showSuggestedPopover && value) {
677
+ setSuggestedRecommendedLists(value: string, handleClose = true): void {
678
+ if ((this.showSuggestedPopover || this.openSuggestionPopup) && value) {
656
679
  const parsedData: SuggestionRecommendLists = JSON.parse(value);
657
680
  const hasDataLabels = this.hasDataLabel(parsedData);
658
681
 
@@ -661,7 +684,7 @@ class UDExSearch extends UI5Element {
661
684
  this.suggestedList = this.getListWithSuggestion(this.getSuggestedList(hasDataLabels, parsedData), "suggested");
662
685
  this.recommendedList = this.getListWithSuggestion(this.getRecommendedList(hasDataLabels, parsedData), "recommended");
663
686
  }
664
- if (!this.shouldShowPopover(parsedData, hasDataLabels)) {
687
+ if (handleClose && !this.shouldShowPopover(parsedData, hasDataLabels)) {
665
688
  this.onClosePopover();
666
689
  this.resetSuggestedRecommendedLists();
667
690
  }
@@ -864,7 +887,7 @@ class UDExSearch extends UI5Element {
864
887
  }
865
888
 
866
889
  onOpenPopover(): void {
867
- if (this.showSuggestedPopover) {
890
+ if (this.showSuggestedPopover || this.openSuggestionPopup) {
868
891
  if (!this.Suggestion) {
869
892
  retryUntilSuccessful(() => this.Suggestion, this.retryDelay, this.maxRetryAttempts, this.unsuccessfulRetryMessage)
870
893
  .then(() => {
@@ -884,8 +907,8 @@ class UDExSearch extends UI5Element {
884
907
  }
885
908
 
886
909
  onClosePopover(): void {
887
- if (this.showSuggestedPopover) {
888
- this.Suggestion!.close();
910
+ if (this.showSuggestedPopover || this.open) {
911
+ this.Suggestion?.close();
889
912
  this.handleAriaExpanded();
890
913
  this.open = false;
891
914
  this.fireDecoratorEvent("suggestion-popover-closed");
@@ -897,15 +920,18 @@ class UDExSearch extends UI5Element {
897
920
  }
898
921
 
899
922
  get rootClasses(): string {
900
- if (this.mode === Mode.HomeSearch && this.showSuggestedPopover && this.open) {
923
+ if (this.mode === Mode.HomeSearch && (this.showSuggestedPopover) && this.open) {
901
924
  return this.isSuggestionPopoverTop ? "udex-search__root--show-popover-top" : "udex-search__root--show-popover";
902
925
  }
903
926
  return "";
904
927
  }
905
928
 
906
929
  onBeforeRendering(): void {
907
- if (this.showSuggestedPopover) {
930
+ if (this.showSuggestedPopover || this.openSuggestionPopup) {
908
931
  this.enableSuggestions();
932
+ if (this.suggestionList && !this.suggestedList?.length && !this.recommendedList?.length) {
933
+ this.setSuggestedRecommendedLists(this.suggestionList, false);
934
+ }
909
935
  }
910
936
 
911
937
  if (this.isHomeSearchWithPrefixMode && this.dropdownPrefix.length) {
@@ -976,7 +1002,7 @@ class UDExSearch extends UI5Element {
976
1002
  }
977
1003
 
978
1004
  onAfterRendering(): void {
979
- if (this.showSuggestedPopover) {
1005
+ if (this.showSuggestedPopover || this.openSuggestionPopup) {
980
1006
  const prefixPopover = this.getPrefixPopover();
981
1007
 
982
1008
  if (this.Suggestion?.popover) {
@@ -998,9 +1024,18 @@ class UDExSearch extends UI5Element {
998
1024
  }
999
1025
 
1000
1026
  handleOpenSuggestionPopover() {
1001
- if (this.openSuggestionPopup) {
1027
+ if (this.openSuggestionPopup && !this._openSuggestionHandled) {
1028
+ this._openSuggestionHandled = true;
1002
1029
  this.Suggestion?._getSuggestionPopover();
1003
- this.handlePopoverTrigger(this.openSuggestionPopup);
1030
+ // Defer to the next animation frame so the opener element has a resolved
1031
+ // layout before UI5 Popover calculates its position. Without this, opening
1032
+ // during onAfterRendering (which runs in a microtask, before layout) causes
1033
+ // the popover to anchor at 0,0 — appearing detached from the search input.
1034
+ requestAnimationFrame(() => {
1035
+ if (this.openSuggestionPopup) {
1036
+ this.handlePopoverTrigger(this.openSuggestionPopup);
1037
+ }
1038
+ });
1004
1039
  }
1005
1040
  }
1006
1041
 
@@ -49,12 +49,12 @@ export default function SearchTemplate(this: UDExSearch) {
49
49
  size={UDExButtonSize.Small}
50
50
  design={UDExButtonDesign.Default}
51
51
  tooltip={this.tooltipInfo.tooltipResetButton}
52
+ accessible-name={this.accInfo.accessibleNameResetIcon}
52
53
  onClick={this.onReset as any}
53
54
  onKeyDown={this.handleKeyDownReset}
54
55
  >
55
56
  <UI5Icon
56
57
  class="udex-search__button-icon"
57
- accessible-name={this.accInfo.accessibleNameResetIcon}
58
58
  accessible-role="presentation"
59
59
  name={decline}
60
60
  ></UI5Icon>
@@ -111,6 +111,7 @@ export default function SearchTemplate(this: UDExSearch) {
111
111
  design={UDExButtonDesign.Default}
112
112
  icon={search}
113
113
  size={UDExButtonSize.Small}
114
+ accessible-name={this.accInfo.accessibleNameSearchIcon}
114
115
  tooltip={this.tooltipInfo.tooltipSubmitButton}
115
116
  onClick={this.onSubmit as any}
116
117
  ></UDExButton>
@@ -127,6 +128,7 @@ export default function SearchTemplate(this: UDExSearch) {
127
128
  icon={search}
128
129
  tooltip={this.tooltipInfo.tooltipSubmitButton}
129
130
  onClick={this.onSubmit as any}
131
+ accessible-name={this.accInfo.accessibleNameSearchIcon}
130
132
  ></UDExControlButton>
131
133
  ) : ""
132
134
  }