@sapudex/web-components 2.62.0 → 2.63.1

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 (375) hide show
  1. package/cypress/specs/FilterMenu.cy.tsx +43 -22
  2. package/cypress/specs/FilterMenuAccessibility.cy.tsx +1017 -0
  3. package/cypress/specs/ListItem.cy.tsx +234 -6
  4. package/cypress/specs/MastheadCountrySelector.cy.tsx +177 -0
  5. package/cypress/specs/SelectBox.cy.tsx +7 -2
  6. package/cypress/specs/SelectBoxAccessibility.cy.tsx +5 -5
  7. package/cypress/specs/SideNavigation.cy.tsx +49 -0
  8. package/cypress/specs/SideNavigationMobile.cy.tsx +69 -0
  9. package/cypress/support/component-imports.instrumented.ts +4 -0
  10. package/cypress/support/component-imports.src.ts +4 -0
  11. package/dist/AccordionItemTemplate.js +1 -1
  12. package/dist/AccordionItemTemplate.js.map +1 -1
  13. package/dist/FilterMenu.d.ts +2 -2
  14. package/dist/FilterMenu.js +6 -4
  15. package/dist/FilterMenu.js.map +1 -1
  16. package/dist/FilterMenuTemplate.js +2 -2
  17. package/dist/FilterMenuTemplate.js.map +1 -1
  18. package/dist/List.d.ts +1 -8
  19. package/dist/List.js +4 -12
  20. package/dist/List.js.map +1 -1
  21. package/dist/ListGroupHeaderTemplate.js +8 -7
  22. package/dist/ListGroupHeaderTemplate.js.map +1 -1
  23. package/dist/ListItem.js +12 -1
  24. package/dist/ListItem.js.map +1 -1
  25. package/dist/ListItemBase.d.ts +5 -0
  26. package/dist/ListItemBase.js +3 -0
  27. package/dist/ListItemBase.js.map +1 -1
  28. package/dist/ListItemTemplate.js +2 -2
  29. package/dist/ListItemTemplate.js.map +1 -1
  30. package/dist/ListSelectAllTemplate.js +1 -1
  31. package/dist/ListSelectAllTemplate.js.map +1 -1
  32. package/dist/MastheadCountrySelector.d.ts +14 -0
  33. package/dist/MastheadCountrySelector.js +6 -0
  34. package/dist/MastheadCountrySelector.js.map +1 -1
  35. package/dist/MastheadCountrySelectorTemplate.js +1 -1
  36. package/dist/MastheadCountrySelectorTemplate.js.map +1 -1
  37. package/dist/MessageStrip.d.ts +1 -0
  38. package/dist/MessageStrip.js +6 -0
  39. package/dist/MessageStrip.js.map +1 -1
  40. package/dist/SearchTemplate.js +1 -1
  41. package/dist/SearchTemplate.js.map +1 -1
  42. package/dist/SearchableListBaseTemplate.js +8 -10
  43. package/dist/SearchableListBaseTemplate.js.map +1 -1
  44. package/dist/SideNavigation.d.ts +9 -0
  45. package/dist/SideNavigation.js +9 -0
  46. package/dist/SideNavigation.js.map +1 -1
  47. package/dist/SideNavigationMobile.d.ts +19 -0
  48. package/dist/SideNavigationMobile.js +32 -1
  49. package/dist/SideNavigationMobile.js.map +1 -1
  50. package/dist/SideNavigationMobileTemplate.js +1 -2
  51. package/dist/SideNavigationMobileTemplate.js.map +1 -1
  52. package/dist/SideNavigationSubItem.d.ts +4 -1
  53. package/dist/SideNavigationSubItem.js +20 -9
  54. package/dist/SideNavigationSubItem.js.map +1 -1
  55. package/dist/SideNavigationSubItemTemplate.js +1 -1
  56. package/dist/SideNavigationSubItemTemplate.js.map +1 -1
  57. package/dist/SideNavigationTemplate.d.ts +2 -0
  58. package/dist/SideNavigationTemplate.js +6 -0
  59. package/dist/SideNavigationTemplate.js.map +1 -0
  60. package/dist/assets/{InputSuggestions-BPKrPqPb.js → InputSuggestions-DSPGFWZq.js} +2 -2
  61. package/dist/assets/{ListItemStandardExpandableTextTemplate-DkdOcCxC.js → ListItemStandardExpandableTextTemplate-hSNo3Xyr.js} +2 -2
  62. package/dist/assets/{bundle.esm-17Yt5gDr.js → bundle.esm-qSu0eWiH.js} +237 -238
  63. package/dist/assets/messagebundle_ar-22dGHdkl.js +1 -0
  64. package/dist/assets/messagebundle_ar-DbxuUDUB.js +1 -0
  65. package/dist/assets/messagebundle_bg-CaaOz5e4.js +1 -0
  66. package/dist/assets/messagebundle_bg-QOUvq6-8.js +1 -0
  67. package/dist/assets/messagebundle_ca-D-8eSg1w.js +1 -0
  68. package/dist/assets/messagebundle_ca-jsUpFfNJ.js +1 -0
  69. package/dist/assets/messagebundle_cnr-BdSolJRo.js +1 -0
  70. package/dist/assets/messagebundle_cnr-rtr9Ox4O.js +1 -0
  71. package/dist/assets/messagebundle_cs-CbM7zJ23.js +1 -0
  72. package/dist/assets/messagebundle_cy-D5E7e9o1.js +1 -0
  73. package/dist/assets/messagebundle_cy-hajQLyoj.js +1 -0
  74. package/dist/assets/messagebundle_da-C3PD-hWQ.js +1 -0
  75. package/dist/assets/messagebundle_da-DFzvQYW2.js +1 -0
  76. package/dist/assets/messagebundle_de-C106E9io.js +1 -0
  77. package/dist/assets/messagebundle_de-C36z5lgV.js +1 -0
  78. package/dist/assets/messagebundle_el-BLHqa1_J.js +1 -0
  79. package/dist/assets/messagebundle_el-k8W9FVQI.js +1 -0
  80. package/dist/assets/messagebundle_en-ClXds397.js +1 -0
  81. package/dist/assets/messagebundle_en-DgPtAFO8.js +1 -0
  82. package/dist/assets/messagebundle_en_GB-DxulA9qE.js +1 -0
  83. package/dist/assets/messagebundle_en_GB-LxAIZigF.js +1 -0
  84. package/dist/assets/{messagebundle_en_US_sappsd-Se8GgI58.js → messagebundle_en_US_sappsd-TZz2y4pV.js} +1 -1
  85. package/dist/assets/messagebundle_en_US_sappsd-oE0A2op2.js +1 -0
  86. package/dist/assets/messagebundle_en_US_saprigi-C6FsbpF8.js +1 -0
  87. package/dist/assets/{messagebundle_en_US_saprigi-CbfvaHUL.js → messagebundle_en_US_saprigi-CkPhuOLS.js} +1 -1
  88. package/dist/assets/messagebundle_en_US_saptrc-CFSYKuS7.js +1 -0
  89. package/dist/assets/messagebundle_en_US_saptrc-CNZe1wPP.js +1 -0
  90. package/dist/assets/messagebundle_es-C3ijAvKG.js +1 -0
  91. package/dist/assets/messagebundle_es-wi4P-8Bo.js +1 -0
  92. package/dist/assets/messagebundle_es_MX-JEoOD2AD.js +1 -0
  93. package/dist/assets/messagebundle_es_MX-qDQ65ei9.js +1 -0
  94. package/dist/assets/messagebundle_et-C3wgDmm9.js +1 -0
  95. package/dist/assets/messagebundle_et-D4r4iubd.js +1 -0
  96. package/dist/assets/messagebundle_fi-BjyQcbRb.js +1 -0
  97. package/dist/assets/messagebundle_fi-CivJKH9k.js +1 -0
  98. package/dist/assets/messagebundle_fr-BxDSBfD5.js +1 -0
  99. package/dist/assets/messagebundle_fr-JN2VAe-b.js +1 -0
  100. package/dist/assets/messagebundle_fr_CA-FkrcsWH5.js +1 -0
  101. package/dist/assets/messagebundle_fr_CA-phd0XOeR.js +1 -0
  102. package/dist/assets/messagebundle_hi-B_pehoTp.js +1 -0
  103. package/dist/assets/messagebundle_hi-CVOoC3dA.js +1 -0
  104. package/dist/assets/messagebundle_hr-BYS-ya62.js +1 -0
  105. package/dist/assets/messagebundle_hr-DHuCJjK8.js +1 -0
  106. package/dist/assets/messagebundle_hu-Crn0Y1hl.js +1 -0
  107. package/dist/assets/messagebundle_hu-DJL3QHT4.js +1 -0
  108. package/dist/assets/messagebundle_id-BJEG-7Up.js +1 -0
  109. package/dist/assets/messagebundle_id-CgbG2IVb.js +1 -0
  110. package/dist/assets/messagebundle_it-B-E3gO1k.js +1 -0
  111. package/dist/assets/messagebundle_it-DHwy0JuE.js +1 -0
  112. package/dist/assets/messagebundle_iw-BFfL9nZy.js +1 -0
  113. package/dist/assets/messagebundle_iw-BgyHu_0a.js +1 -0
  114. package/dist/assets/messagebundle_ja-BDNEwBMO.js +1 -0
  115. package/dist/assets/messagebundle_ja-eyoqeb4r.js +1 -0
  116. package/dist/assets/messagebundle_kk-BA_1qhYv.js +1 -0
  117. package/dist/assets/messagebundle_kk-CTAXqbPN.js +1 -0
  118. package/dist/assets/messagebundle_ko-C1tsjQMn.js +1 -0
  119. package/dist/assets/messagebundle_ko-CkiNi7iV.js +1 -0
  120. package/dist/assets/messagebundle_lt-Dp0c8r7p.js +1 -0
  121. package/dist/assets/{messagebundle_lt-BGK5mpcm.js → messagebundle_lt-bNum-ekg.js} +1 -1
  122. package/dist/assets/messagebundle_lv-B9UWTGX9.js +1 -0
  123. package/dist/assets/messagebundle_lv-D02PBhtR.js +1 -0
  124. package/dist/assets/messagebundle_mk--Xt_Ciey.js +1 -0
  125. package/dist/assets/messagebundle_mk-D6s2Tr95.js +1 -0
  126. package/dist/assets/messagebundle_ms-BAqsvtp5.js +1 -0
  127. package/dist/assets/messagebundle_ms-BobJaFPp.js +1 -0
  128. package/dist/assets/messagebundle_nl-BJCykHj1.js +1 -0
  129. package/dist/assets/messagebundle_nl-Dj7LaMyb.js +1 -0
  130. package/dist/assets/messagebundle_no-CR_uQXUz.js +1 -0
  131. package/dist/assets/messagebundle_no-CnwJbEW8.js +1 -0
  132. package/dist/assets/messagebundle_pl-D6FQ-6EC.js +1 -0
  133. package/dist/assets/messagebundle_pl-eJC2NE6N.js +1 -0
  134. package/dist/assets/messagebundle_pt-CbdPbTKR.js +1 -0
  135. package/dist/assets/messagebundle_pt-n8LcOyWG.js +1 -0
  136. package/dist/assets/messagebundle_pt_PT-B17ziKL9.js +1 -0
  137. package/dist/assets/messagebundle_pt_PT-BVpS4lrC.js +1 -0
  138. package/dist/assets/messagebundle_ro-C0jrNva4.js +1 -0
  139. package/dist/assets/messagebundle_ro-ixITTbJt.js +1 -0
  140. package/dist/assets/messagebundle_ru-Bh6RMNe2.js +1 -0
  141. package/dist/assets/messagebundle_ru-Dbxms1Xm.js +1 -0
  142. package/dist/assets/messagebundle_sh-CMDXUWge.js +1 -0
  143. package/dist/assets/messagebundle_sh-Cb-sVI_0.js +1 -0
  144. package/dist/assets/messagebundle_sk-DZkkgRSd.js +1 -0
  145. package/dist/assets/{messagebundle_sk-CXOF1RuF.js → messagebundle_sk-Dqb_XwMg.js} +1 -1
  146. package/dist/assets/messagebundle_sl-DIl-2Lb1.js +1 -0
  147. package/dist/assets/messagebundle_sl-Dx6UWXni.js +1 -0
  148. package/dist/assets/messagebundle_sr-DstlyDjZ.js +1 -0
  149. package/dist/assets/messagebundle_sr-yQWBd9jR.js +1 -0
  150. package/dist/assets/messagebundle_sv-Dr2hDyEO.js +1 -0
  151. package/dist/assets/messagebundle_sv-iHKWgaRg.js +1 -0
  152. package/dist/assets/messagebundle_th-DbWfCb5y.js +1 -0
  153. package/dist/assets/messagebundle_th-yLU2SE6L.js +1 -0
  154. package/dist/assets/messagebundle_tr-CIoGg6uY.js +1 -0
  155. package/dist/assets/messagebundle_tr-lAQvvdUi.js +1 -0
  156. package/dist/assets/messagebundle_uk-DIBItAKu.js +1 -0
  157. package/dist/assets/messagebundle_uk-j_sqGY4D.js +1 -0
  158. package/dist/assets/messagebundle_vi-C40OW2eC.js +1 -0
  159. package/dist/assets/messagebundle_vi-xWTpoKPI.js +1 -0
  160. package/dist/assets/messagebundle_zh_CN-CmeOlVfl.js +1 -0
  161. package/dist/assets/messagebundle_zh_CN-U8Z0kuQb.js +1 -0
  162. package/dist/assets/messagebundle_zh_TW-B_1_vc8O.js +1 -0
  163. package/dist/assets/messagebundle_zh_TW-hwHN6ElU.js +1 -0
  164. package/dist/assets/{parameters-bundle.css-Cv89y49I.js → parameters-bundle.css-2ZsUlBNO.js} +299 -151
  165. package/dist/assets/parameters-bundle.css-31Bw5XOG.js +2 -0
  166. package/dist/assets/parameters-bundle.css-BJp4ZvSQ.js +2 -0
  167. package/dist/assets/{parameters-bundle.css-vNsSPPU5.js → parameters-bundle.css-BKlkVfkE.js} +742 -494
  168. package/dist/assets/parameters-bundle.css-BMOU75LU.js +2 -0
  169. package/dist/assets/parameters-bundle.css-BZF5sWSb.js +1 -0
  170. package/dist/assets/{parameters-bundle.css-DmEWEk0u.js → parameters-bundle.css-Bf1GOISM.js} +786 -513
  171. package/dist/assets/parameters-bundle.css-BpWLGMCI.js +2 -0
  172. package/dist/assets/parameters-bundle.css-BsoxE2UF.js +2 -0
  173. package/dist/assets/parameters-bundle.css-CAhrGUcA.js +2 -0
  174. package/dist/assets/{parameters-bundle.css-C3eDVARm.js → parameters-bundle.css-CDJt5bvS.js} +176 -89
  175. package/dist/assets/parameters-bundle.css-CIr3BQBD.js +2 -0
  176. package/dist/assets/parameters-bundle.css-CVUmNgQM.js +2 -0
  177. package/dist/assets/parameters-bundle.css-C_pu3Dce.js +2 -0
  178. package/dist/assets/parameters-bundle.css-ChtqHIDX.js +2 -0
  179. package/dist/assets/parameters-bundle.css-CvaMQVtq.js +1 -0
  180. package/dist/assets/parameters-bundle.css-Cwz89dEH.js +2 -0
  181. package/dist/assets/parameters-bundle.css-CyCovTbK.js +2 -0
  182. package/dist/assets/parameters-bundle.css-Cyf5K2-Q.js +2 -0
  183. package/dist/assets/parameters-bundle.css-DdDLbfHl.js +2 -0
  184. package/dist/assets/{parameters-bundle.css-C5V2Zp_F.js → parameters-bundle.css-Dfz9lgd6.js} +131 -95
  185. package/dist/assets/{parameters-bundle.css-K-MvKimD.js → parameters-bundle.css-DjW0INFD.js} +139 -88
  186. package/dist/assets/parameters-bundle.css-JyFiyY-_.js +2 -0
  187. package/dist/assets/parameters-bundle.css-tf-z7jv9.js +2 -0
  188. package/dist/css/themes/MastheadShell.css +1 -1
  189. package/dist/css/themes/PromoTile.css +1 -1
  190. package/dist/css/themes/SideNavigation.css +1 -1
  191. package/dist/css/themes/SideNavigationMobile.css +1 -1
  192. package/dist/css/themes/Slider.css +1 -1
  193. package/dist/css/themes/sap_fiori_3/parameters-bundle.css +0 -1
  194. package/dist/css/themes/sap_glow/parameters-bundle.css +0 -1
  195. package/dist/css/themes/sap_horizon/parameters-bundle.css +0 -1
  196. package/dist/custom-elements-internal.json +1436 -0
  197. package/dist/custom-elements.json +1490 -21
  198. package/dist/generated/assets/themes/sap_fiori_3/parameters-bundle.css.json +1 -1
  199. package/dist/generated/assets/themes/sap_glow/parameters-bundle.css.json +1 -1
  200. package/dist/generated/assets/themes/sap_horizon/parameters-bundle.css.json +1 -1
  201. package/dist/generated/themes/MastheadShell.css.d.ts +1 -1
  202. package/dist/generated/themes/MastheadShell.css.js +1 -1
  203. package/dist/generated/themes/MastheadShell.css.js.map +1 -1
  204. package/dist/generated/themes/PromoTile.css.d.ts +1 -1
  205. package/dist/generated/themes/PromoTile.css.js +1 -1
  206. package/dist/generated/themes/PromoTile.css.js.map +1 -1
  207. package/dist/generated/themes/SideNavigation.css.d.ts +1 -1
  208. package/dist/generated/themes/SideNavigation.css.js +1 -1
  209. package/dist/generated/themes/SideNavigation.css.js.map +1 -1
  210. package/dist/generated/themes/SideNavigationMobile.css.d.ts +1 -1
  211. package/dist/generated/themes/SideNavigationMobile.css.js +1 -1
  212. package/dist/generated/themes/SideNavigationMobile.css.js.map +1 -1
  213. package/dist/generated/themes/Slider.css.d.ts +1 -1
  214. package/dist/generated/themes/Slider.css.js +1 -1
  215. package/dist/generated/themes/Slider.css.js.map +1 -1
  216. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.d.ts +1 -1
  217. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.js +1 -1
  218. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.js.map +1 -1
  219. package/dist/generated/themes/sap_glow/parameters-bundle.css.d.ts +1 -1
  220. package/dist/generated/themes/sap_glow/parameters-bundle.css.js +1 -1
  221. package/dist/generated/themes/sap_glow/parameters-bundle.css.js.map +1 -1
  222. package/dist/generated/themes/sap_horizon/parameters-bundle.css.d.ts +1 -1
  223. package/dist/generated/themes/sap_horizon/parameters-bundle.css.js +1 -1
  224. package/dist/generated/themes/sap_horizon/parameters-bundle.css.js.map +1 -1
  225. package/dist/vscode.html-custom-data.json +12 -2
  226. package/dist/web-types.json +33 -3
  227. package/package.json +8 -8
  228. package/src/AccordionItemTemplate.tsx +1 -0
  229. package/src/FilterMenu.ts +6 -4
  230. package/src/FilterMenuTemplate.tsx +12 -8
  231. package/src/List.ts +4 -12
  232. package/src/ListGroupHeaderTemplate.tsx +9 -3
  233. package/src/ListItem.ts +12 -1
  234. package/src/ListItemBase.ts +7 -0
  235. package/src/ListItemTemplate.tsx +6 -1
  236. package/src/ListSelectAllTemplate.tsx +11 -12
  237. package/src/MastheadCountrySelector.ts +18 -0
  238. package/src/MastheadCountrySelectorTemplate.tsx +2 -0
  239. package/src/MessageStrip.ts +7 -0
  240. package/src/SearchTemplate.tsx +3 -1
  241. package/src/SearchableListBaseTemplate.tsx +12 -12
  242. package/src/SideNavigation.ts +17 -0
  243. package/src/SideNavigationMobile.ts +52 -0
  244. package/src/SideNavigationMobileTemplate.tsx +3 -5
  245. package/src/SideNavigationSubItem.ts +17 -5
  246. package/src/SideNavigationSubItemTemplate.tsx +3 -1
  247. package/src/SideNavigationTemplate.tsx +17 -0
  248. package/src/generated/themes/MastheadShell.css.ts +1 -1
  249. package/src/generated/themes/PromoTile.css.ts +1 -1
  250. package/src/generated/themes/SideNavigation.css.ts +1 -1
  251. package/src/generated/themes/SideNavigationMobile.css.ts +1 -1
  252. package/src/generated/themes/Slider.css.ts +1 -1
  253. package/src/generated/themes/sap_fiori_3/parameters-bundle.css.ts +1 -1
  254. package/src/generated/themes/sap_glow/parameters-bundle.css.ts +1 -1
  255. package/src/generated/themes/sap_horizon/parameters-bundle.css.ts +1 -1
  256. package/src/themes/MastheadShell.css +14 -2
  257. package/src/themes/PromoTile.css +5 -0
  258. package/src/themes/SideNavigation.css +43 -8
  259. package/src/themes/SideNavigationMobile.css +1 -0
  260. package/src/themes/Slider.css +25 -11
  261. package/dist/assets/messagebundle_ar-C3EXytoC.js +0 -1
  262. package/dist/assets/messagebundle_ar-DmZrrjEF.js +0 -1
  263. package/dist/assets/messagebundle_bg-BaZ97Q_b.js +0 -1
  264. package/dist/assets/messagebundle_bg-CgU7GPvK.js +0 -1
  265. package/dist/assets/messagebundle_ca-BwjVUbUA.js +0 -1
  266. package/dist/assets/messagebundle_ca-YiUGbO_8.js +0 -1
  267. package/dist/assets/messagebundle_cnr-CN2hPZIN.js +0 -1
  268. package/dist/assets/messagebundle_cnr-zdEdPJvc.js +0 -1
  269. package/dist/assets/messagebundle_cs-CGbnEjza.js +0 -1
  270. package/dist/assets/messagebundle_cy-BF0YH9Iz.js +0 -1
  271. package/dist/assets/messagebundle_cy-CUiGsjO6.js +0 -1
  272. package/dist/assets/messagebundle_da-CWKLQJiq.js +0 -1
  273. package/dist/assets/messagebundle_da-bTkr4pUc.js +0 -1
  274. package/dist/assets/messagebundle_de-BmnClk4G.js +0 -1
  275. package/dist/assets/messagebundle_de-vB6qhgvG.js +0 -1
  276. package/dist/assets/messagebundle_el-DKdItEgW.js +0 -1
  277. package/dist/assets/messagebundle_el-Gv1Ly8aj.js +0 -1
  278. package/dist/assets/messagebundle_en-DbKo-Dkl.js +0 -1
  279. package/dist/assets/messagebundle_en-DcV886MF.js +0 -1
  280. package/dist/assets/messagebundle_en_GB-Be93_Z4H.js +0 -1
  281. package/dist/assets/messagebundle_en_GB-CFh7e8hQ.js +0 -1
  282. package/dist/assets/messagebundle_en_US_sappsd-HCarC-Yr.js +0 -1
  283. package/dist/assets/messagebundle_en_US_saprigi-CCHFk7YZ.js +0 -1
  284. package/dist/assets/messagebundle_en_US_saptrc-B8AIRzlo.js +0 -1
  285. package/dist/assets/messagebundle_en_US_saptrc-yJ3PcdEm.js +0 -1
  286. package/dist/assets/messagebundle_es-BH-a8BxO.js +0 -1
  287. package/dist/assets/messagebundle_es-Dt93wbGV.js +0 -1
  288. package/dist/assets/messagebundle_es_MX-BedlYlF3.js +0 -1
  289. package/dist/assets/messagebundle_es_MX-COPqooo9.js +0 -1
  290. package/dist/assets/messagebundle_et-BsYgDw46.js +0 -1
  291. package/dist/assets/messagebundle_et-UwpqUE-p.js +0 -1
  292. package/dist/assets/messagebundle_fi-BN3UWEz0.js +0 -1
  293. package/dist/assets/messagebundle_fi-Cwf7Puui.js +0 -1
  294. package/dist/assets/messagebundle_fr-43w09LAE.js +0 -1
  295. package/dist/assets/messagebundle_fr-CVRaf9_H.js +0 -1
  296. package/dist/assets/messagebundle_fr_CA-BM04X6xU.js +0 -1
  297. package/dist/assets/messagebundle_fr_CA-CdnVYumi.js +0 -1
  298. package/dist/assets/messagebundle_hi-DfeonbAH.js +0 -1
  299. package/dist/assets/messagebundle_hi-JRJlP9Uh.js +0 -1
  300. package/dist/assets/messagebundle_hr-CKOnn34q.js +0 -1
  301. package/dist/assets/messagebundle_hr-CbyIBlH3.js +0 -1
  302. package/dist/assets/messagebundle_hu-DF1gQudE.js +0 -1
  303. package/dist/assets/messagebundle_hu-D_IQ9kTy.js +0 -1
  304. package/dist/assets/messagebundle_id-B0K1usj4.js +0 -1
  305. package/dist/assets/messagebundle_id-gDJYoaGq.js +0 -1
  306. package/dist/assets/messagebundle_it-B80_R2Ih.js +0 -1
  307. package/dist/assets/messagebundle_it-CVqU4g6t.js +0 -1
  308. package/dist/assets/messagebundle_iw-BoelOIS4.js +0 -1
  309. package/dist/assets/messagebundle_iw-iMDtLxaa.js +0 -1
  310. package/dist/assets/messagebundle_ja-BlRbv4vb.js +0 -1
  311. package/dist/assets/messagebundle_ja-BrDH-19-.js +0 -1
  312. package/dist/assets/messagebundle_kk-C7VPek1-.js +0 -1
  313. package/dist/assets/messagebundle_kk-DhAT_bim.js +0 -1
  314. package/dist/assets/messagebundle_ko-CIqP8x6n.js +0 -1
  315. package/dist/assets/messagebundle_ko-DgD6uyZ5.js +0 -1
  316. package/dist/assets/messagebundle_lt-BV0kKrY0.js +0 -1
  317. package/dist/assets/messagebundle_lv-5IcjoxWD.js +0 -1
  318. package/dist/assets/messagebundle_lv-DDBi7iKe.js +0 -1
  319. package/dist/assets/messagebundle_mk-BUrn04sZ.js +0 -1
  320. package/dist/assets/messagebundle_mk-P5veRdg2.js +0 -1
  321. package/dist/assets/messagebundle_ms-9VDLR5en.js +0 -1
  322. package/dist/assets/messagebundle_ms-CB8sQUg2.js +0 -1
  323. package/dist/assets/messagebundle_nl-BaAgPO7h.js +0 -1
  324. package/dist/assets/messagebundle_nl-f1Up3dB9.js +0 -1
  325. package/dist/assets/messagebundle_no-C-_ldp7o.js +0 -1
  326. package/dist/assets/messagebundle_no-DRSqWQ-C.js +0 -1
  327. package/dist/assets/messagebundle_pl-BQoPaokq.js +0 -1
  328. package/dist/assets/messagebundle_pl-DBO1atMe.js +0 -1
  329. package/dist/assets/messagebundle_pt-BNEglYxa.js +0 -1
  330. package/dist/assets/messagebundle_pt-DgAMHmW-.js +0 -1
  331. package/dist/assets/messagebundle_pt_PT-BtYzp9KB.js +0 -1
  332. package/dist/assets/messagebundle_pt_PT-D1Ef8kUU.js +0 -1
  333. package/dist/assets/messagebundle_ro-CuDPp2fe.js +0 -1
  334. package/dist/assets/messagebundle_ro-D591wJ6f.js +0 -1
  335. package/dist/assets/messagebundle_ru-D0NridWi.js +0 -1
  336. package/dist/assets/messagebundle_ru-I8YLCfrn.js +0 -1
  337. package/dist/assets/messagebundle_sh-BswdbSRi.js +0 -1
  338. package/dist/assets/messagebundle_sh-Dw2y_oct.js +0 -1
  339. package/dist/assets/messagebundle_sk-BG4S4ZVk.js +0 -1
  340. package/dist/assets/messagebundle_sl-CAnJO_8X.js +0 -1
  341. package/dist/assets/messagebundle_sl-kpVWxIp_.js +0 -1
  342. package/dist/assets/messagebundle_sr-BTWvO8VQ.js +0 -1
  343. package/dist/assets/messagebundle_sr-VJmRSdj4.js +0 -1
  344. package/dist/assets/messagebundle_sv-B-RCgnW_.js +0 -1
  345. package/dist/assets/messagebundle_sv-Bd4wCcDb.js +0 -1
  346. package/dist/assets/messagebundle_th-CMHmLdI3.js +0 -1
  347. package/dist/assets/messagebundle_th-CZ1imsCy.js +0 -1
  348. package/dist/assets/messagebundle_tr-BfWAYIdW.js +0 -1
  349. package/dist/assets/messagebundle_tr-D-BnBirv.js +0 -1
  350. package/dist/assets/messagebundle_uk-DhxIThVl.js +0 -1
  351. package/dist/assets/messagebundle_uk-HU8hI0yj.js +0 -1
  352. package/dist/assets/messagebundle_vi-BUTqUKd4.js +0 -1
  353. package/dist/assets/messagebundle_vi-D1El4_Wj.js +0 -1
  354. package/dist/assets/messagebundle_zh_CN-Dt0azUea.js +0 -1
  355. package/dist/assets/messagebundle_zh_CN-Ofgx2uXY.js +0 -1
  356. package/dist/assets/messagebundle_zh_TW-5lv7yYS1.js +0 -1
  357. package/dist/assets/messagebundle_zh_TW-LSErOAsd.js +0 -1
  358. package/dist/assets/parameters-bundle.css-B68EyCuR.js +0 -278
  359. package/dist/assets/parameters-bundle.css-BkJSEiFx.js +0 -278
  360. package/dist/assets/parameters-bundle.css-CI4HNvFw.js +0 -1
  361. package/dist/assets/parameters-bundle.css-COeynv6D.js +0 -277
  362. package/dist/assets/parameters-bundle.css-CRa5DITh.js +0 -1
  363. package/dist/assets/parameters-bundle.css-CnIzAMdG.js +0 -3
  364. package/dist/assets/parameters-bundle.css-CsV5qbZp.js +0 -3
  365. package/dist/assets/parameters-bundle.css-DCvHNL3s.js +0 -3
  366. package/dist/assets/parameters-bundle.css-DK40uKOQ.js +0 -3
  367. package/dist/assets/parameters-bundle.css-DMfTAqMv.js +0 -2
  368. package/dist/assets/parameters-bundle.css-DO35k9r0.js +0 -2
  369. package/dist/assets/parameters-bundle.css-Df7wtRW4.js +0 -2
  370. package/dist/assets/parameters-bundle.css-DvAfqdlT.js +0 -3
  371. package/dist/assets/parameters-bundle.css-KoXGNyLG.js +0 -3
  372. package/dist/assets/parameters-bundle.css-P_M_rm9z.js +0 -3
  373. package/dist/assets/parameters-bundle.css-UJIxXHL5.js +0 -2
  374. package/dist/assets/parameters-bundle.css-co26r5Nz.js +0 -3
  375. package/dist/assets/parameters-bundle.css-uT62L0va.js +0 -3
@@ -223,7 +223,8 @@ describe("ListItem", () => {
223
223
  });
224
224
 
225
225
  describe("Standalone rated MultiSelect preservation", () => {
226
- it("keeps real focus and selection on the inner option while retaining the standalone checkbox and rating names", () => {
226
+ // Updated: decorative checkboxes are unnamed in every mode; the real-focus row owns the complete rating name.
227
+ it("keeps real focus and native selection on the fully named inner option with an unnamed decorative checkbox", () => {
227
228
  cy.mount(
228
229
  <div>
229
230
  <button id="before-rated-list-item">Previous</button>
@@ -238,6 +239,7 @@ describe("ListItem", () => {
238
239
  expect($row).to.have.attr("role", "option");
239
240
  expect($row).to.have.attr("tabindex", "0");
240
241
  expect($row).to.have.attr("aria-selected", String(UDExSelected));
242
+ expect($row).to.have.attr("aria-label", "Rated choice Rating 4.0, Total 20, Rating Indicator 4 of 5");
241
243
  expect($row).not.to.have.attr("aria-checked");
242
244
  });
243
245
  UDExItem().should($host => {
@@ -249,12 +251,12 @@ describe("ListItem", () => {
249
251
  expect($checkbox).to.have.attr("aria-hidden", "true");
250
252
  expect($checkbox).to.have.attr("tabindex", "-1");
251
253
  expect($checkbox[0]).to.have.property("checked", UDExSelected);
252
- // Standalone real-focus items retain the existing name, including its trailing space.
253
- const UDExName = `checkbox ${UDExSelected ? "Selected" : "Unselected"} `;
254
- expect($checkbox[0]).to.have.property("accessibleName", UDExName);
255
- expect($checkbox).to.have.attr("accessible-name", UDExName);
254
+ expect($checkbox).not.to.have.attr("accessible-name");
255
+ expect($checkbox).not.to.have.attr("aria-label");
256
+ expect(($checkbox[0] as HTMLElement & { accessibleName?: string }).accessibleName || "").to.equal("");
256
257
  });
257
- UDExItem().shadow().find(".udex-list__content-wrap").should("have.attr", "aria-label", "Rated choice");
258
+ UDExItem().shadow().find(".udex-list__content-wrap")
259
+ .should("have.attr", "aria-label", "Rated choice Rating 4.0, Total 20, Rating Indicator 4 of 5");
258
260
  UDExItem().shadow().find("[udex-rating-indicator]").should($rating => {
259
261
  expect($rating).to.have.attr("aria-label", "Rating 4.0, Total 20, Rating Indicator 4 of 5");
260
262
  expect($rating).to.have.attr("disabled");
@@ -272,6 +274,232 @@ describe("ListItem", () => {
272
274
  });
273
275
  });
274
276
 
277
+ describe("Accessible row name ownership", () => {
278
+ const normalizeText = (text: string | null) => (text || "").replace(/\s+/g, " ").trim();
279
+
280
+ function flattenedTextContent(node: Node): string {
281
+ if (node.nodeType === Node.ELEMENT_NODE && (node as Element).localName === "slot") {
282
+ const assigned = (node as HTMLSlotElement).assignedNodes({ flatten: true });
283
+ const nodes = assigned.length ? assigned : Array.from(node.childNodes);
284
+ return nodes.map(flattenedTextContent).join("");
285
+ }
286
+ if (!node.hasChildNodes()) {
287
+ return node.textContent || "";
288
+ }
289
+ // Preserve the raw text-node sequence, including adjacent inline elements, without adding separators.
290
+ return Array.from(node.childNodes).map(flattenedTextContent).join("");
291
+ }
292
+
293
+ function assertVisibleName(item: Cypress.Chainable<JQuery<HTMLElement>>, expected: string,
294
+ { owner = "row", name = expected, slotted = false }:
295
+ { owner?: "row" | "content" | "host"; name?: string; slotted?: boolean } = {}) {
296
+ item.shadow().find(".udex-list__content-wrap").should($wrapper => {
297
+ const wrapper = $wrapper[0];
298
+ const root = wrapper.getRootNode() as ShadowRoot;
299
+ const row = root.querySelector('[part="item"]')!;
300
+ const content = wrapper.querySelector(".udex-list__content")!;
301
+ const visibleText = normalizeText(slotted ? flattenedTextContent(content) : content.textContent);
302
+ expect(visibleText, "raw shared-container text retains literal word boundaries").to.equal(expected);
303
+ expect(wrapper).to.have.attr("aria-label", name);
304
+ const nameId = wrapper.getAttribute("aria-labelledby")!;
305
+ expect(nameId).to.equal(`${wrapper.getAttribute("_id")}-invisibleText`);
306
+ const source = root.getElementById(nameId);
307
+ expect(source, "hidden name source resolves in the row's own shadow root").not.to.equal(null);
308
+ expect(source!.getRootNode()).to.equal(root);
309
+ expect(source).to.have.class("hidden");
310
+ expect(normalizeText(source!.textContent)).to.equal(name);
311
+ if (owner === "row") {
312
+ expect(row).to.have.attr("aria-label", name);
313
+ } else {
314
+ expect(row).not.to.have.attr("aria-label");
315
+ if (owner === "host") {
316
+ expect(root.host).to.have.attr("aria-label", name);
317
+ }
318
+ }
319
+ if (name === expected) {
320
+ expect(normalizeText(source!.textContent)).to.equal(visibleText);
321
+ }
322
+ });
323
+ }
324
+
325
+ [UDExListMode.SingleSelect, UDExListMode.MultiSelect, UDExListMode.SingleContent].forEach(mode => {
326
+ it(`preserves raw label/support/additional boundaries and local name ownership in ${mode}`, () => {
327
+ cy.mount(
328
+ <div>
329
+ <button id="before-boundary-item">Previous</button>
330
+ <UDExListItem id="boundary-item" mode={mode} label="<b>Java</b>Script"
331
+ supportingText="Frontend web development" additionalText="Code JS" />
332
+ </div>
333
+ );
334
+ const item = () => cy.get("#boundary-item");
335
+ const row = () => item().shadow().find('[part="item"]');
336
+ const singleContent = mode === UDExListMode.SingleContent;
337
+ if (!singleContent) {
338
+ cy.get("#before-boundary-item").realClick();
339
+ cy.realPress("Tab");
340
+ row().should("be.focused");
341
+ row().should("have.attr", "aria-selected", "false");
342
+ }
343
+ row().should("have.attr", "role", singleContent ? "listitem" : "option");
344
+ assertVisibleName(item(), "JavaScript Frontend web development Code JS",
345
+ { owner: singleContent ? "content" : "row" });
346
+ item().shadow().find(".udex-list__text-holder").should($holder => {
347
+ expect(normalizeText($holder[0].textContent)).to.equal("JavaScript Frontend web development");
348
+ });
349
+ item().shadow().find('[part="title"]').should("have.text", "JavaScript");
350
+ item().shadow().find('[part="title"] b').should("have.text", "Java");
351
+ });
352
+ });
353
+
354
+ it("preserves raw label/support/additional boundaries with a host-owned name and presentational native row", () => {
355
+ const expected = "JavaScript Frontend web development Code JS";
356
+ cy.mount(<UDExListItem id="host-boundary-item" mode={UDExListMode.MultiSelect}
357
+ _useHostAriaRole={true} role="option" aria-label={expected} aria-selected="false"
358
+ label="<b>Java</b>Script" supportingText="Frontend web development" additionalText="Code JS" />);
359
+ const item = () => cy.get("#host-boundary-item");
360
+ assertVisibleName(item(), expected, { owner: "host" });
361
+ item().shadow().find('[part="title"]').should("have.text", "JavaScript");
362
+ item().shadow().find('[part="item"]').should($row => {
363
+ expect($row).to.have.attr("role", "presentation");
364
+ ["aria-label", "aria-selected", "aria-checked", "tabindex"].forEach(attribute => {
365
+ expect($row).not.to.have.attr(attribute);
366
+ });
367
+ });
368
+ });
369
+
370
+ it("preserves literal boundaries with supporting-only or additional-only secondary text", () => {
371
+ cy.wrap([
372
+ { supportingText: "Frontend web development", additionalText: "", expected: "JavaScript Frontend web development" },
373
+ { supportingText: "", additionalText: "Code JS", expected: "JavaScript Code JS" },
374
+ ]).each(testCase => {
375
+ cy.mount(<UDExListItem id="partial-boundary-item" mode={UDExListMode.SingleSelect}
376
+ label="<b>Java</b>Script" supportingText={testCase.supportingText} additionalText={testCase.additionalText} />);
377
+ const item = () => cy.get("#partial-boundary-item");
378
+ assertVisibleName(item(), testCase.expected);
379
+ item().shadow().find('[part="title"]').should("have.text", "JavaScript");
380
+ item().shadow().find(testCase.supportingText ? '[part="additional-text"]' : '[part="supporting"]')
381
+ .should("not.exist");
382
+ });
383
+ });
384
+
385
+ it("removes and restores supporting text without concatenating label and additional text while focused", () => {
386
+ cy.mount(
387
+ <div>
388
+ <button id="before-reactive-boundary-item">Previous</button>
389
+ <UDExListItem id="reactive-boundary-item" mode={UDExListMode.MultiSelect}
390
+ label="<b>Java</b>Script" supportingText="Frontend web development" additionalText="Code JS" />
391
+ </div>
392
+ );
393
+ const item = () => cy.get("#reactive-boundary-item");
394
+ const row = () => item().shadow().find('[part="item"]');
395
+ cy.get("#before-reactive-boundary-item").realClick();
396
+ cy.realPress("Tab");
397
+ row().should("be.focused");
398
+ assertVisibleName(item(), "JavaScript Frontend web development Code JS");
399
+ item().invoke("prop", "supportingText", "");
400
+ assertVisibleName(item(), "JavaScript Code JS");
401
+ item().shadow().find('[part="supporting"]').should("not.exist");
402
+ row().should("be.focused");
403
+ item().invoke("prop", "supportingText", "Digital Builders");
404
+ assertVisibleName(item(), "JavaScript Digital Builders Code JS");
405
+ item().shadow().find('[part="title"]').should("have.text", "JavaScript");
406
+ row().should("be.focused");
407
+ });
408
+
409
+ // Updated: flatten the shared slot container without inserting whitespace, checking hidden names even during overrides.
410
+ it("names a real-focus row from default slotted text before support and additional text, restoring it after an explicit override", () => {
411
+ cy.mount(
412
+ <div>
413
+ <button id="before-slotted-list-item">Previous</button>
414
+ <UDExListItem id="slotted-name-item" mode={UDExListMode.MultiSelect}
415
+ supportingText="Choice support" additionalText="Code A">
416
+ {" Slotted \n "}<span id="slotted-choice-label"><b>choice</b>{" label"}</span>{" \t text"}
417
+ </UDExListItem>
418
+ </div>
419
+ );
420
+ const UDExItem = () => cy.get("#slotted-name-item");
421
+ const UDExRow = () => UDExItem().shadow().find('[part="item"]');
422
+ const UDExFullName = "Slotted choice label text Choice support Code A";
423
+ const UDExAssertSlottedName = (UDExName: string) => {
424
+ assertVisibleName(UDExItem(), UDExFullName, { name: UDExName, slotted: true });
425
+ UDExItem().should($item => {
426
+ expect($item).not.to.have.attr("label");
427
+ expect(($item[0] as UDExListItem).label || "").to.equal("");
428
+ });
429
+ UDExRow().should("be.focused").should($row => {
430
+ expect($row).to.have.attr("role", "option");
431
+ expect($row).to.have.attr("aria-label", UDExName);
432
+ expect($row).to.have.attr("aria-selected", "false");
433
+ expect($row).not.to.have.attr("aria-checked");
434
+ });
435
+ UDExItem().shadow().find('slot[part="content"]').should($slot => {
436
+ expect(normalizeText(flattenedTextContent($slot[0]))).to.equal("Slotted choice label text");
437
+ });
438
+ UDExItem().find("#slotted-choice-label").should("be.visible").and("have.text", "choice label");
439
+ UDExItem().find("#slotted-choice-label b").should("be.visible").and("have.text", "choice");
440
+ UDExItem().shadow().find('[part="supporting"]').should("have.text", "Choice support");
441
+ UDExItem().shadow().find('[part="additional-text"]').should("have.text", "Code A");
442
+ };
443
+
444
+ cy.get("#before-slotted-list-item").realClick();
445
+ cy.realPress("Tab");
446
+ UDExAssertSlottedName(UDExFullName);
447
+ UDExItem().invoke("prop", "accessibleName", "Explicit slotted choice");
448
+ UDExAssertSlottedName("Explicit slotted choice");
449
+ UDExItem().invoke("prop", "accessibleName", "");
450
+ UDExAssertSlottedName(UDExFullName);
451
+ });
452
+
453
+ // Updated: verify the referenced hidden source independently without equating visible text to an override.
454
+ it("keeps an explicit row name instead of appending visible support, additional text or rating metadata", () => {
455
+ cy.mount(<UDExListItem id="explicit-name-item" mode={UDExListMode.MultiSelect}
456
+ accessibleName="Explicit choice" label="<b>Rated</b> choice" supportingText="Choice support"
457
+ additionalText="Code A" rating="4" ratingCount="4.0" totalCount="20" />);
458
+ const UDExRow = () => cy.get("#explicit-name-item").shadow().find('[part="item"]');
459
+ const assertNameSource = (expected: string) => {
460
+ UDExRow().should("have.attr", "aria-label", expected);
461
+ cy.get("#explicit-name-item").shadow().find(".udex-list__content-wrap").should($wrapper => {
462
+ const root = $wrapper[0].getRootNode() as ShadowRoot;
463
+ expect($wrapper).to.have.attr("aria-label", expected);
464
+ const source = root.getElementById($wrapper[0].getAttribute("aria-labelledby")!);
465
+ expect(source, "explicit name source resolves in the native row's shadow root").not.to.equal(null);
466
+ expect(source!.getRootNode()).to.equal(root);
467
+ expect(source).to.have.class("hidden");
468
+ expect(normalizeText(source!.textContent)).to.equal(expected);
469
+ });
470
+ cy.get("#explicit-name-item").shadow().find('[part="title"]').should("have.text", "Rated choice");
471
+ };
472
+ assertNameSource("Explicit choice");
473
+ cy.get("#explicit-name-item").invoke("prop", "accessibleName", "");
474
+ assertNameSource("Rated choice Choice support Code A Rating 4.0, Total 20, Rating Indicator 4 of 5");
475
+ cy.get("#explicit-name-item").invoke("prop", "accessibleName", "Restored override");
476
+ assertNameSource("Restored override");
477
+ });
478
+
479
+ it("does not duplicate the host-owned name or state on a presentational inner row", () => {
480
+ cy.mount(<UDExListItem id="host-named-item" mode={UDExListMode.MultiSelect}
481
+ _useHostAriaRole={true} role="option" aria-label="Host-owned choice" aria-selected="true"
482
+ selected accessibleName="Explicit inner name" label="Visible choice" supportingText="Choice support" />);
483
+ cy.get("#host-named-item").should($host => {
484
+ expect($host).to.have.attr("role", "option");
485
+ expect($host).to.have.attr("aria-label", "Host-owned choice");
486
+ expect($host).to.have.attr("aria-selected", "true");
487
+ });
488
+ cy.get("#host-named-item").shadow().find('[part="item"]').should($row => {
489
+ expect($row).to.have.attr("role", "presentation");
490
+ ["aria-label", "aria-selected", "aria-checked", "tabindex"].forEach(UDExAttribute => {
491
+ expect($row).not.to.have.attr(UDExAttribute);
492
+ });
493
+ });
494
+ cy.get("#host-named-item").shadow().find("[udex-checkbox]").should($checkbox => {
495
+ expect($checkbox).to.have.attr("aria-hidden", "true");
496
+ expect($checkbox).to.have.attr("tabindex", "-1");
497
+ expect($checkbox).not.to.have.attr("accessible-name");
498
+ expect($checkbox[0]).to.have.property("checked", true);
499
+ });
500
+ });
501
+ });
502
+
275
503
  // Added: unit-level coverage for the WCAG 4.1.2 Treeview Checkbox pattern getter
276
504
  // (ariaCheckedValue). It only activates when the item's accessible-role ===
277
505
  // "treeitem" (set by SearchableListBase in the tree pattern). The inner checkbox
@@ -0,0 +1,177 @@
1
+ import { UDExMastheadCountrySelector } from "../support/component-imports.js";
2
+
3
+ const singleRegion = JSON.stringify([
4
+ {
5
+ title: "Europe",
6
+ countries: [
7
+ { displayTitle: "Germany", countryCode: "DE", url: "/germany/store.html" },
8
+ { displayTitle: "France", countryCode: "FR", url: "/france/store.html" },
9
+ { displayTitle: "Poland", countryCode: "PL", url: "/poland/store.html" },
10
+ ],
11
+ },
12
+ ]);
13
+
14
+ const multiRegion = JSON.stringify([
15
+ {
16
+ title: "Americas",
17
+ countries: [
18
+ { displayTitle: "Canada", countryCode: "CA", url: "/canada/store.html" },
19
+ { displayTitle: "Brazil", countryCode: "BR", url: "/brazil/store.html" },
20
+ ],
21
+ },
22
+ {
23
+ title: "Europe",
24
+ countries: [
25
+ { displayTitle: "Germany", countryCode: "DE", url: "/germany/store.html" },
26
+ { displayTitle: "France", countryCode: "FR", url: "/france/store.html" },
27
+ ],
28
+ },
29
+ ]);
30
+
31
+ describe("MastheadCountrySelector", () => {
32
+ describe("accessibleNameSearch property", () => {
33
+ it("passes accessible-name to the search field when set", () => {
34
+ cy.mount(
35
+ <UDExMastheadCountrySelector
36
+ id="country-selector"
37
+ accessible-name-search="Search countries"
38
+ search-label="Search"
39
+ country-title="Choose your Country"
40
+ regions={singleRegion}>
41
+ </UDExMastheadCountrySelector>
42
+ );
43
+
44
+ cy.get("[udex-masthead-country-selector]").shadow()
45
+ .find("[udex-search]")
46
+ .should("have.attr", "accessible-name", "Search countries");
47
+ });
48
+
49
+ it("applies accessible-name as aria-label on the search input", () => {
50
+ cy.mount(
51
+ <UDExMastheadCountrySelector
52
+ id="country-selector-aria"
53
+ accessible-name-search="Find a country"
54
+ search-label="Search"
55
+ country-title="Choose your Country"
56
+ regions={singleRegion}>
57
+ </UDExMastheadCountrySelector>
58
+ );
59
+
60
+ cy.get("[udex-masthead-country-selector]").shadow()
61
+ .find("[udex-search]")
62
+ .shadow()
63
+ .find("input")
64
+ .should("have.attr", "aria-label", "Find a country");
65
+ });
66
+
67
+ it("does not set accessible-name on search when property is empty", () => {
68
+ cy.mount(
69
+ <UDExMastheadCountrySelector
70
+ id="country-selector-no-a11y-name"
71
+ search-label="Search"
72
+ country-title="Choose your Country"
73
+ regions={singleRegion}>
74
+ </UDExMastheadCountrySelector>
75
+ );
76
+
77
+ cy.get("[udex-masthead-country-selector]").shadow()
78
+ .find("[udex-search]")
79
+ .should("not.have.attr", "accessible-name");
80
+ });
81
+ });
82
+
83
+ describe("accessibleNameSearchResetIcon property", () => {
84
+ it("passes accessible-name-reset-icon to the search field when set", () => {
85
+ cy.mount(
86
+ <UDExMastheadCountrySelector
87
+ id="country-selector-reset-icon"
88
+ accessible-name-search-reset-icon="Clear search"
89
+ search-label="Search"
90
+ country-title="Choose your Country"
91
+ regions={singleRegion}>
92
+ </UDExMastheadCountrySelector>
93
+ );
94
+
95
+ cy.get("[udex-masthead-country-selector]").shadow()
96
+ .find("[udex-search]")
97
+ .should("have.attr", "accessible-name-reset-icon", "Clear search");
98
+ });
99
+
100
+ it("does not set accessible-name-reset-icon on search when property is empty", () => {
101
+ cy.mount(
102
+ <UDExMastheadCountrySelector
103
+ id="country-selector-no-reset-icon-name"
104
+ search-label="Search"
105
+ country-title="Choose your Country"
106
+ regions={singleRegion}>
107
+ </UDExMastheadCountrySelector>
108
+ );
109
+
110
+ cy.get("[udex-masthead-country-selector]").shadow()
111
+ .find("[udex-search]")
112
+ .should("not.have.attr", "accessible-name-reset-icon");
113
+ });
114
+ });
115
+
116
+ describe("regions view", () => {
117
+ beforeEach(() => {
118
+ cy.mount(
119
+ <UDExMastheadCountrySelector
120
+ id="country-selector-multi"
121
+ region-title="Choose your Region"
122
+ country-title="Choose your Country"
123
+ search-label="Search"
124
+ regions={multiRegion}>
125
+ </UDExMastheadCountrySelector>
126
+ );
127
+ cy.get("[udex-masthead-country-selector]").shadow().as("shadow");
128
+ });
129
+
130
+ it("renders region title", () => {
131
+ cy.get("@shadow").find(".udex-masthead-country-selector__title").should("have.text", "Choose your Region");
132
+ });
133
+
134
+ it("renders region items", () => {
135
+ cy.get("@shadow").find(".udex-masthead-country-selector__item_region").should("have.length", 2);
136
+ });
137
+
138
+ it("opens country list on region item click", () => {
139
+ cy.get("@shadow").find(".udex-masthead-country-selector__item_region").first().click();
140
+ cy.get("@shadow").find(".udex-masthead-country-selector__list_countries").should("exist");
141
+ });
142
+ });
143
+
144
+ describe("single region mode", () => {
145
+ it("shows the country list directly without region selection", () => {
146
+ cy.mount(
147
+ <UDExMastheadCountrySelector
148
+ id="country-selector-single"
149
+ country-title="Choose your Country"
150
+ search-label="Search"
151
+ regions={singleRegion}>
152
+ </UDExMastheadCountrySelector>
153
+ );
154
+
155
+ cy.get("[udex-masthead-country-selector]").shadow()
156
+ .find(".udex-masthead-country-selector__list_countries")
157
+ .should("exist");
158
+ });
159
+ });
160
+
161
+ describe("hideSearch property", () => {
162
+ it("hides the search field when hideSearch is true", () => {
163
+ cy.mount(
164
+ <UDExMastheadCountrySelector
165
+ id="country-selector-no-search"
166
+ hide-search
167
+ country-title="Choose your Country"
168
+ regions={singleRegion}>
169
+ </UDExMastheadCountrySelector>
170
+ );
171
+
172
+ cy.get("[udex-masthead-country-selector]").shadow()
173
+ .find("[udex-search]")
174
+ .should("not.exist");
175
+ });
176
+ });
177
+ });
@@ -3020,10 +3020,15 @@ describe("SelectBox", () => {
3020
3020
  .to.deep.equal([$host[0]]);
3021
3021
  });
3022
3022
  });
3023
- // Preserve rendered title checks in addition to the complete host aria-label.
3023
+ // Updated: the full accessible name includes metadata; the visible title is only the primary label.
3024
3024
  UDExActiveHost().then($host => {
3025
3025
  if ($host.is("[udex-list-item]")) {
3026
- cy.wrap($host).shadow().find(".udex-list__content-wrap").should("have.attr", "aria-label", UDExLabel);
3026
+ cy.wrap($host).shadow().find(".udex-list__content-wrap").should($content => {
3027
+ expect($content).to.have.attr("aria-label", UDExAccessibleName);
3028
+ const labelId = $content.attr("aria-labelledby")!;
3029
+ const root = $content[0].getRootNode() as ShadowRoot;
3030
+ expect(root.getElementById(labelId)?.textContent).to.equal(UDExAccessibleName);
3031
+ });
3027
3032
  cy.wrap($host).shadow().find('[part="title"]').should("have.text", UDExLabel);
3028
3033
  }
3029
3034
  });
@@ -260,14 +260,14 @@ function UDExAssertNativeHostStates() {
260
260
  }
261
261
 
262
262
  function UDExAssertLeafName(UDExHost: Cypress.Chainable<JQuery<HTMLElement>>, UDExLabel: string, UDExSupportingText = "", UDExAdditionalText = "") {
263
- // Active-descendant hosts expose the complete name, including text outside the title.
264
- UDExHost.should("have.attr", "aria-label", [UDExLabel, UDExSupportingText, UDExAdditionalText].filter(Boolean).join(" "));
265
- // Keep the rendered title/name-source checks, including after search highlighting.
263
+ const accessibleName = [UDExLabel, UDExSupportingText, UDExAdditionalText].filter(Boolean).join(" ");
264
+ // Updated: hosts and both wrapper name sources expose the full name, not just the visible title.
265
+ UDExHost.should("have.attr", "aria-label", accessibleName);
266
266
  UDExHost.shadow().find(".udex-list__content-wrap").should($content => {
267
- expect($content).to.have.attr("aria-label", UDExLabel);
267
+ expect($content).to.have.attr("aria-label", accessibleName);
268
268
  const UDExLabelId = $content.attr("aria-labelledby")!;
269
269
  const UDExRoot = $content[0].getRootNode() as ShadowRoot;
270
- expect(UDExRoot.getElementById(UDExLabelId)?.textContent).to.equal(UDExLabel);
270
+ expect(UDExRoot.getElementById(UDExLabelId)?.textContent).to.equal(accessibleName);
271
271
  expect($content.find('[part="title"]').text()).to.equal(UDExLabel);
272
272
  });
273
273
  }
@@ -507,3 +507,52 @@ describe("SideNavigation - group collapse not blocked by selected child", () =>
507
507
  cy.get("[udex-side-navigation-item]").first().should("have.attr", "expanded");
508
508
  });
509
509
  });
510
+
511
+ describe("SideNavigation - additionalContent slot", () => {
512
+ it("renders the additional-content area when content is slotted", () => {
513
+ cy.mount(
514
+ <SideNav id="side-nav">
515
+ <UDExSideNavigationItem text="Item 1"></UDExSideNavigationItem>
516
+ <div slot="additionalContent">
517
+ <p>Lorem ipsum dolor sit amet</p>
518
+ <button>Button</button>
519
+ </div>
520
+ </SideNav>,
521
+ );
522
+ cy.get("[udex-side-navigation]")
523
+ .shadow()
524
+ .find(".udex-side-navigation__additional-content")
525
+ .should("exist");
526
+ });
527
+
528
+ it("does not render the additional-content area when the slot is empty", () => {
529
+ cy.mount(
530
+ <SideNav id="side-nav">
531
+ <UDExSideNavigationItem text="Item 1"></UDExSideNavigationItem>
532
+ </SideNav>,
533
+ );
534
+ cy.get("[udex-side-navigation]")
535
+ .shadow()
536
+ .find(".udex-side-navigation__additional-content")
537
+ .should("not.exist");
538
+ });
539
+
540
+ it("projects the slotted content into the additional-content area", () => {
541
+ cy.mount(
542
+ <SideNav id="side-nav">
543
+ <UDExSideNavigationItem text="Item 1"></UDExSideNavigationItem>
544
+ <div slot="additionalContent">
545
+ <button type="button">Call to action</button>
546
+ </div>
547
+ </SideNav>,
548
+ );
549
+ cy.get("[udex-side-navigation]")
550
+ .shadow()
551
+ .find(".udex-side-navigation__additional-content slot[name='additionalContent']")
552
+ .should("exist");
553
+ cy.get("[udex-side-navigation] [slot='additionalContent'] button").should(
554
+ "have.text",
555
+ "Call to action",
556
+ );
557
+ });
558
+ });
@@ -0,0 +1,69 @@
1
+ import {
2
+ UDExSideNavigationMobile,
3
+ UDExSideNavigationItem,
4
+ } from "../support/component-imports.js";
5
+
6
+ describe("SideNavigationMobile - additionalContent slot", () => {
7
+ const getAdditionalContent = () =>
8
+ cy.get("[udex-side-navigation-mobile]")
9
+ .shadow()
10
+ .find("[udex-side-navigation]")
11
+ .shadow()
12
+ .find(".udex-side-navigation__additional-content");
13
+
14
+ it("renders the additional-content area inside the inner nav when content is slotted", () => {
15
+ cy.mount(
16
+ <UDExSideNavigationMobile>
17
+ <UDExSideNavigationItem text="Item 1"></UDExSideNavigationItem>
18
+ <div slot="additionalContent">
19
+ <button type="button">Button</button>
20
+ </div>
21
+ </UDExSideNavigationMobile>,
22
+ );
23
+
24
+ getAdditionalContent().should("exist");
25
+ });
26
+
27
+ it("does not render the additional-content area when the slot is empty", () => {
28
+ cy.mount(
29
+ <UDExSideNavigationMobile>
30
+ <UDExSideNavigationItem text="Item 1"></UDExSideNavigationItem>
31
+ </UDExSideNavigationMobile>,
32
+ );
33
+
34
+ getAdditionalContent().should("not.exist");
35
+ });
36
+
37
+ it("projects the slotted content into the inner nav's additionalContent slot", () => {
38
+ cy.mount(
39
+ <UDExSideNavigationMobile>
40
+ <UDExSideNavigationItem text="Item 1"></UDExSideNavigationItem>
41
+ <div slot="additionalContent">
42
+ <button type="button">Call to action</button>
43
+ </div>
44
+ </UDExSideNavigationMobile>,
45
+ );
46
+
47
+ getAdditionalContent()
48
+ .find("slot[name='additionalContent']")
49
+ .should("exist");
50
+ cy.get("[udex-side-navigation-mobile]")
51
+ .shadow()
52
+ .find("[udex-side-navigation] [slot='additionalContent'] button")
53
+ .should("have.text", "Call to action");
54
+ });
55
+
56
+ it("renders the additional-content area alongside fixed items", () => {
57
+ cy.mount(
58
+ <UDExSideNavigationMobile>
59
+ <UDExSideNavigationItem text="Item 1"></UDExSideNavigationItem>
60
+ <UDExSideNavigationItem slot="fixedItems" text="Fixed 1"></UDExSideNavigationItem>
61
+ <div slot="additionalContent">
62
+ <button type="button">Button</button>
63
+ </div>
64
+ </UDExSideNavigationMobile>,
65
+ );
66
+
67
+ getAdditionalContent().should("exist");
68
+ });
69
+ });
@@ -40,6 +40,7 @@ import UDExList from "../../instrumented/List.js";
40
40
  import UDExListGroupHeader from "../../instrumented/ListGroupHeader.js";
41
41
  import UDExListItem from "../../instrumented/ListItem.js";
42
42
  import UDExMastheadItem from "../../instrumented/MastheadItem.js";
43
+ import UDExMastheadCountrySelector from "../../instrumented/MastheadCountrySelector.js";
43
44
  import UDExMastheadMenu from "../../instrumented/MastheadMenu.js";
44
45
  import UDExMastheadMobileMenu from "../../instrumented/MastheadMobileMenu.js";
45
46
  import UDExMastheadProfileMenu from "../../instrumented/MastheadProfileMenu.js";
@@ -61,6 +62,7 @@ import UDExSecondaryNavigation from "../../instrumented/SecondaryNavigation.js";
61
62
  import UDExSelectBox from "../../instrumented/SelectBox.js";
62
63
  import UDExSideNavigation from "../../instrumented/SideNavigation.js";
63
64
  import UDExSideNavigationItem from "../../instrumented/SideNavigationItem.js";
65
+ import UDExSideNavigationMobile from "../../instrumented/SideNavigationMobile.js";
64
66
  import UDExSideNavigationSubItem from "../../instrumented/SideNavigationSubItem.js";
65
67
  import UDExSelectBoxGroupHeader from "../../instrumented/SelectBoxGroupHeader.js";
66
68
  import UDExSelectBoxItem from "../../instrumented/SelectBoxItem.js";
@@ -135,6 +137,7 @@ export {
135
137
  UDExListItem,
136
138
  UDExListGroupHeader,
137
139
  UDExMastheadItem,
140
+ UDExMastheadCountrySelector,
138
141
  UDExMastheadMenu,
139
142
  UDExMastheadMobileMenu,
140
143
  UDExMastheadProfileMenu,
@@ -156,6 +159,7 @@ export {
156
159
  UDExSelectBox,
157
160
  UDExSideNavigation,
158
161
  UDExSideNavigationItem,
162
+ UDExSideNavigationMobile,
159
163
  UDExSideNavigationSubItem,
160
164
  UDExSelectBoxGroupHeader,
161
165
  UDExSelectBoxItem,