@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
@@ -2,6 +2,29 @@ import { UDExSelectBox, UDExSelectBoxSelectAll, UDExSelectBoxGroupHeader, UDExSe
2
2
  import { UDExListItemSize, UDExListMode, UDExListStyleType } from "../../src/types/List.js";
3
3
  import { UDExAvatarShape, UDExAvatarSize } from "../../src/Avatar.js";
4
4
  import UDExStatusBadgeValueState from "../../src/types/StatusBadgeValueState.js";
5
+ import { renderFinished } from "@ui5/webcomponents-base/dist/Render.js";
6
+
7
+ function UDExAssertActiveItem(UDExIndex: number) {
8
+ cy.get("#select-box").shadow().find("[udex-list-item]").eq(UDExIndex).should($item => {
9
+ expect($item).to.have.attr("_active-descendant");
10
+ expect($item).to.have.class("_udex-active-descendant");
11
+ }).then($item => {
12
+ cy.get("#select-box").shadow().find("[_active-descendant]").should("have.length", 1).and($active => {
13
+ expect($active[0]).to.equal($item[0]);
14
+ });
15
+ cy.get("#select-box").shadow().find("._udex-active-descendant").should("have.length", 1).and($highlight => {
16
+ expect($highlight[0]).to.equal($item[0]);
17
+ });
18
+ cy.get("#select-box").shadow().find('input[role="combobox"]')
19
+ .should("have.attr", "aria-activedescendant", $item[0].id);
20
+ });
21
+ cy.get("#select-box").shadow().find("[udex-list-item]").eq(UDExIndex).should("not.be.focused");
22
+ cy.get("#select-box").shadow().find('input[role="combobox"]').should("be.focused").should($input => {
23
+ const UDExRoot = $input[0].getRootNode() as ShadowRoot;
24
+ expect($input[0].ownerDocument.activeElement).to.equal(UDExRoot.host);
25
+ expect(UDExRoot.activeElement).to.equal($input[0]);
26
+ });
27
+ }
5
28
 
6
29
  const selectBoxWithRating = <div style="width: 350px; position:relative;"><UDExSelectBox
7
30
  id="select-box"
@@ -373,25 +396,38 @@ describe("SelectBox", () => {
373
396
  .should("have.attr", "open");
374
397
  });
375
398
 
399
+ // Updated: closed ArrowDown announces expanded and highlights the first item; the next press advances silently.
376
400
  it("dropdown opens on pressing the `ArrowDown` key on the search", () => {
377
401
  cy.mount(fullComponent);
378
402
  cy.get("#select-box").shadow()
379
403
  .find(".udex-text-field__search")
380
- .click()
404
+ .focus()
381
405
  .realPress("ArrowDown");
382
406
 
383
407
  cy.get("#select-box").shadow()
384
408
  .find(".udex-select-box__dropdown")
385
409
  .should("have.attr","open");
410
+ cy.get("#select-box").shadow().find('input[role="combobox"]')
411
+ .should("be.focused").and("have.attr", "aria-expanded", "true");
412
+ UDExAssertActiveItem(0);
413
+ cy.get("#select-box").shadow().find('[aria-live="polite"]').should("have.length", 1).and("have.text", "expanded");
414
+
415
+ cy.realPress("ArrowDown");
416
+ UDExAssertActiveItem(1);
417
+ cy.get("#select-box").shadow().find('[aria-live="polite"]').should("have.text", "");
386
418
  });
387
419
 
420
+ // Updated: Escape clears the immediately active item and status; reopening re-announces expanded before navigation.
388
421
  it("dropdown closes on pressing the `Escape`", () => {
389
422
  cy.mount(fullComponent);
390
423
  cy.get("#select-box").shadow()
391
424
  .find(".udex-text-field__search")
392
- .click()
425
+ .focus()
393
426
  .realPress("ArrowDown");
394
427
 
428
+ cy.get("#select-box").shadow().find(".udex-select-box__dropdown").should("have.attr", "open");
429
+ UDExAssertActiveItem(0);
430
+
395
431
  cy.get("#select-box").shadow()
396
432
  .find(".udex-text-field__search")
397
433
  .realPress("Escape");
@@ -399,6 +435,19 @@ describe("SelectBox", () => {
399
435
  cy.get("#select-box").shadow()
400
436
  .find(".udex-select-box__dropdown")
401
437
  .should("not.have.attr","open");
438
+ cy.get("#select-box").shadow().find('input[role="combobox"]')
439
+ .should("be.focused").and("have.attr", "aria-expanded", "false");
440
+ cy.get("#select-box").shadow().find('input[role="combobox"]').should("not.have.attr", "aria-activedescendant");
441
+ cy.get("#select-box").shadow().find("[_active-descendant], ._udex-active-descendant").should("not.exist");
442
+ cy.get("#select-box").shadow().find('[aria-live="polite"]').should("have.text", "");
443
+
444
+ cy.realPress("ArrowDown");
445
+ cy.get("#select-box").shadow().find(".udex-select-box__dropdown").should("have.attr", "open");
446
+ cy.get("#select-box").shadow().find('input[role="combobox"]').should("have.attr", "aria-expanded", "true");
447
+ UDExAssertActiveItem(0);
448
+ cy.get("#select-box").shadow().find('[aria-live="polite"]').should("have.length", 1).and("have.text", "expanded");
449
+ cy.realPress("ArrowDown");
450
+ UDExAssertActiveItem(1);
402
451
  });
403
452
 
404
453
  it("sets option label when Arrow Down key press on the list items", () => {
@@ -547,14 +596,31 @@ describe("SelectBox", () => {
547
596
  .should("have.attr", "_active-descendant");
548
597
  });
549
598
 
550
- it("SingleSelect mode - opening the dropdown with ArrowDown focuses the selected item", () => {
599
+ // Updated: plain preselected options remain a listbox; opening announces expanded before silent ArrowDown navigation.
600
+ it("SingleSelect mode - ArrowDown opens with the selected item active and the next ArrowDown activates the next item", () => {
551
601
  cy.mount(singleSelectPreselected);
552
602
  cy.get("#select-box").shadow().find(".udex-text-field__search").focus();
553
603
  cy.realPress("ArrowDown");
554
604
 
605
+ cy.get("#select-box").shadow().find('input[role="combobox"]').should("have.attr", "aria-haspopup", "listbox");
606
+ cy.get("#select-box").shadow().find("[udex-list]").should("have.attr", "role", "listbox");
555
607
  cy.get("#select-box").shadow().find(".udex-select-box__dropdown").should("have.attr", "open");
608
+ cy.get("#select-box").shadow().find('input[role="combobox"]')
609
+ .should("be.focused").and("have.attr", "aria-expanded", "true");
610
+ UDExAssertActiveItem(2);
611
+ cy.get("#select-box").shadow().find('[aria-live="polite"]').should("have.length", 1).and("have.text", "expanded");
556
612
  cy.get("#select-box").shadow().find("[udex-list-item]").eq(2)
557
613
  .should("have.attr", "_active-descendant");
614
+ cy.get("#select-box").shadow().find("[udex-list-item]").eq(0)
615
+ .should("not.have.attr", "_active-descendant");
616
+
617
+ cy.realPress("ArrowDown");
618
+ UDExAssertActiveItem(3);
619
+ cy.get("#select-box").shadow().find("[udex-list-item]").eq(2)
620
+ .should("not.have.attr", "_active-descendant");
621
+ cy.get("#select-box").find("[udex-select-box-item][selected]").should("have.length", 1).and("have.attr", "label", "Java");
622
+ cy.get("#select-box").shadow().find('[aria-live="polite"]').should("have.text", "");
623
+ cy.get("#select-box").shadow().find('input[role="combobox"]').should("be.focused");
558
624
  });
559
625
 
560
626
  it("SingleSelect mode - reopening restores focus to the previously selected item", () => {
@@ -629,14 +695,27 @@ describe("SelectBox", () => {
629
695
  .should("have.attr", "_active-descendant");
630
696
  });
631
697
 
632
- it("MultiSelect mode - opening the dropdown with ArrowDown focuses the first item", () => {
698
+ // Updated: keyboard opening announces expanded with the first item active; ArrowDown advances silently to the second.
699
+ it("MultiSelect mode - ArrowDown opens with the first item active and the next ArrowDown activates the next item", () => {
633
700
  cy.mount(multiSelect);
634
701
  cy.get("#select-box").shadow().find(".udex-text-field__search").focus();
635
702
  cy.realPress("ArrowDown");
636
703
 
637
704
  cy.get("#select-box").shadow().find(".udex-select-box__dropdown").should("have.attr", "open");
705
+ cy.get("#select-box").shadow().find('input[role="combobox"]')
706
+ .should("be.focused").and("have.attr", "aria-expanded", "true");
707
+ UDExAssertActiveItem(0);
708
+ cy.get("#select-box").shadow().find('[aria-live="polite"]').should("have.length", 1).and("have.text", "expanded");
638
709
  cy.get("#select-box").shadow().find("[udex-list-item]").eq(0)
639
710
  .should("have.attr", "_active-descendant");
711
+
712
+ cy.realPress("ArrowDown");
713
+ UDExAssertActiveItem(1);
714
+ cy.get("#select-box").shadow().find("[udex-list-item]").eq(0)
715
+ .should("not.have.attr", "_active-descendant");
716
+ cy.get("#select-box").find("[udex-select-box-item][selected]").should("not.exist");
717
+ cy.get("#select-box").shadow().find('[aria-live="polite"]').should("have.text", "");
718
+ cy.get("#select-box").shadow().find('input[role="combobox"]').should("be.focused");
640
719
  });
641
720
 
642
721
  it("MultiSelect mode - selected items do not steal focus from the first item on open", () => {
@@ -1190,9 +1269,10 @@ describe("SelectBox", () => {
1190
1269
  cy.get("@select").shadow().find(".udex-text-field__trigger").as("trigger")
1191
1270
 
1192
1271
  cy.get("@select").shadow()
1193
- .find("udex-list")
1194
- .find("udex-list-select-all").shadow()
1195
- .find(".udex-list__group-header")
1272
+ .find("[udex-list]")
1273
+ .find("[udex-list-select-all]").shadow()
1274
+ .find('[udex-list-item][part="group-item"]').shadow()
1275
+ .find('[part="title"]')
1196
1276
  .should("have.text", "Select All");
1197
1277
  });
1198
1278
 
@@ -2861,10 +2941,13 @@ describe("SelectBox", () => {
2861
2941
  .find("[udex-list]").should("have.attr", "aria-multiselectable", "true");
2862
2942
  });
2863
2943
 
2864
- it("inner list div has role=\"tree\"", () => {
2944
+ // Updated: the host owns the tree; its shadow container must not create a second tree.
2945
+ it("inner list div is transparent when the host owns the tree role", () => {
2946
+ cy.get("#select-box-tree-regression").shadow()
2947
+ .find("[udex-list]").should("have.attr", "role", "tree");
2865
2948
  cy.get("#select-box-tree-regression").shadow()
2866
2949
  .find("[udex-list]").shadow()
2867
- .find("#udex-list").should("have.attr", "role", "tree");
2950
+ .find("#udex-list").should("have.attr", "role", "none");
2868
2951
  });
2869
2952
 
2870
2953
  it("group header host has _tree-mode attribute", () => {
@@ -2880,11 +2963,13 @@ describe("SelectBox", () => {
2880
2963
  .should("have.attr", "role", "treeitem");
2881
2964
  });
2882
2965
 
2883
- it("child items have aria-checked on the host (MultiSelect tree)", () => {
2966
+ // Updated: selectable popup treeitems expose only Boolean aria-selected on the host.
2967
+ it("child items have Boolean aria-selected and no aria-checked on the host (MultiSelect tree)", () => {
2884
2968
  cy.get("#select-box-tree-regression").shadow()
2885
- .find("udex-list-group-header")
2886
- .find("udex-list-item").eq(0)
2887
- .should("have.attr", "aria-checked", "false");
2969
+ .find("[udex-list-group-header]")
2970
+ .find("[udex-list-item]").eq(0)
2971
+ .should("have.attr", "aria-selected", "false")
2972
+ .and("not.have.attr", "aria-checked");
2888
2973
  });
2889
2974
 
2890
2975
  it("child items' inner [part=item] div is role=\"presentation\" (host carries the role)", () => {
@@ -2894,7 +2979,8 @@ describe("SelectBox", () => {
2894
2979
  .find("[part=item]").should("have.attr", "role", "presentation");
2895
2980
  });
2896
2981
 
2897
- it("child items' checkbox is aria-hidden (tree mode, JAWS uses host aria-checked)", () => {
2982
+ // Updated: decorative checkboxes remain hidden; native selection is owned by the treeitem host.
2983
+ it("child items' checkbox is aria-hidden (tree mode uses host aria-selected)", () => {
2898
2984
  cy.get("#select-box-tree-regression").shadow()
2899
2985
  .find("udex-list-group-header")
2900
2986
  .find("udex-list-item").eq(0).shadow()
@@ -2902,91 +2988,121 @@ describe("SelectBox", () => {
2902
2988
  });
2903
2989
  });
2904
2990
 
2905
- // Covers the aria-live="polite" region that announces the active item
2906
- // during keyboard navigation. _setActiveDescendant(item) sets _liveRegionText to
2907
- // "Label, X of Y"; _setActiveDescendant(null) (on close/Escape) resets it to "".
2908
- describe("Select Box live region announcements", () => {
2909
- it("populates the live region with 'Label, X of Y' when ArrowDown activates an item", () => {
2910
- cy.mount(shortComponent);
2911
- cy.get("#select-box").shadow()
2912
- .find(".udex-text-field__search")
2913
- .click();
2991
+ // Updated: expanded active groups open silently; other hosts keep the popup fallback, never live item metadata.
2992
+ describe("Select Box supplemental announcements without label echo", () => {
2993
+ const UDExCombobox = () => cy.get("#select-box").shadow().find('input[role="combobox"]');
2994
+ const UDExStatus = () => cy.get("#select-box").shadow().find('[aria-live="polite"]');
2995
+ const UDExActiveHost = () => cy.get("#select-box").shadow().find("[_active-descendant]");
2996
+
2997
+ function UDExAssertActiveHost(UDExRole: string, UDExLabel: string, UDExPosition: number, UDExSize: number, UDExExpectedStatus: "" | "expanded", UDExLevel?: number, UDExAccessibleName = UDExLabel) {
2998
+ UDExActiveHost().should($host => {
2999
+ expect($host).to.have.length(1);
3000
+ expect($host).to.have.attr("role", UDExRole);
3001
+ expect($host).to.have.attr("aria-posinset", String(UDExPosition));
3002
+ expect($host).to.have.attr("aria-setsize", String(UDExSize));
3003
+ expect($host).to.have.attr("aria-label", UDExAccessibleName);
3004
+ if (UDExLevel !== undefined) {
3005
+ expect($host).to.have.attr("aria-level", String(UDExLevel));
3006
+ } else {
3007
+ expect($host).not.to.have.attr("aria-level");
3008
+ }
3009
+ if ($host.is("[udex-list-group-header]")) {
3010
+ expect($host).to.have.attr("aria-label", UDExLabel);
3011
+ } else {
3012
+ expect($host).to.have.attr("label", UDExLabel);
3013
+ }
3014
+ }).then($host => {
3015
+ UDExCombobox().should($input => {
3016
+ const UDExRoot = $input[0].getRootNode() as ShadowRoot;
3017
+ expect($input).to.have.attr("aria-activedescendant", $host[0].id);
3018
+ expect(UDExRoot.getElementById($host[0].id)).to.equal($host[0]);
3019
+ expect(Array.from(UDExRoot.querySelectorAll("[id]")).filter(UDExElement => UDExElement.id === $host[0].id))
3020
+ .to.deep.equal([$host[0]]);
3021
+ });
3022
+ });
3023
+ // Preserve rendered title checks in addition to the complete host aria-label.
3024
+ UDExActiveHost().then($host => {
3025
+ if ($host.is("[udex-list-item]")) {
3026
+ cy.wrap($host).shadow().find(".udex-list__content-wrap").should("have.attr", "aria-label", UDExLabel);
3027
+ cy.wrap($host).shadow().find('[part="title"]').should("have.text", UDExLabel);
3028
+ }
3029
+ });
3030
+ UDExCombobox().should("be.focused");
3031
+ // Updated: drain pending live-region rendering so an empty expectation cannot pass prematurely.
3032
+ cy.then(() => renderFinished());
3033
+ UDExStatus().should($status => {
3034
+ expect($status).to.have.length(1);
3035
+ expect($status.text()).to.equal(UDExExpectedStatus);
3036
+ const UDExSelectBox = ($status[0].getRootNode() as ShadowRoot).host;
3037
+ UDExSelectBox.querySelectorAll("[udex-select-box-item], [udex-select-box-group-header]").forEach(UDExItem => {
3038
+ ["label", "supporting-text", "additional-text"].forEach(UDExAttribute => {
3039
+ const UDExName = UDExItem.getAttribute(UDExAttribute);
3040
+ if (UDExName) {
3041
+ expect($status.text(), `status excludes ${UDExAttribute}: ${UDExName}`).not.to.contain(UDExName);
3042
+ }
3043
+ });
3044
+ });
3045
+ });
3046
+ }
2914
3047
 
2915
- // Opening activates the first item "JavaScript" (shortComponent has 6 items).
2916
- cy.get("#select-box").shadow()
2917
- .find('[aria-live="polite"]')
2918
- .invoke("text")
2919
- .should("match", /^JavaScript, 1 of 6$/);
3048
+ // Updated: actionable opening is expanded-only, with level-1 positions and complete names retained natively.
3049
+ it("announces only expanded on flat actionable opening while retaining the complete native name and position", () => {
3050
+ cy.mount(shortComponent);
3051
+ UDExCombobox().realClick();
3052
+ UDExAssertActiveHost("treeitem", "JavaScript", 1, 6, "expanded", 1, "JavaScript Additional Text");
3053
+ UDExCombobox().should("have.attr", "aria-haspopup", "tree");
3054
+ cy.get("#select-box").shadow().find("[udex-list]").should("have.attr", "role", "tree");
3055
+ UDExActiveHost().should("not.have.attr", "aria-expanded");
3056
+ UDExActiveHost().should("have.attr", "aria-selected", "false");
2920
3057
  });
2921
3058
 
2922
- // Added: covers _treePositionText — for a grouped SelectBox the announcement
2923
- // carries the tree position. ArrowDown activates the group header ("level 0");
2924
- // a further ArrowDown reaches its first child ("level 1").
2925
- it("uses tree positional text ('level 0' for the group header, 'level 1' for its child)", () => {
3059
+ // Updated: the expanded group supplies native state; opening and child navigation have no live metadata.
3060
+ it("keeps live status empty on expanded-group opening and child navigation with native positions and selection", () => {
2926
3061
  cy.mount(groupHeaderCollapsible);
2927
- cy.get("#select-box").shadow()
2928
- .find(".udex-text-field__search")
2929
- .click();
2930
-
2931
- // Opening activates the group header -> tree text reports "level 0".
2932
- cy.get("#select-box").shadow()
2933
- .find('[aria-live="polite"]')
2934
- .invoke("text")
2935
- .should("contain", "level 0");
2936
-
2937
- // A further ArrowDown reaches the first child -> tree text reports "level 1".
2938
- cy.get("#select-box").shadow()
2939
- .find(".udex-text-field__search")
2940
- .realPress("ArrowDown");
2941
-
2942
- cy.get("#select-box").shadow()
2943
- .find('[aria-live="polite"]')
2944
- .invoke("text")
2945
- .should("contain", "level 1");
3062
+ UDExCombobox().realClick();
3063
+ UDExAssertActiveHost("treeitem", "Programming Languages", 1, 1, "", 1);
3064
+ UDExActiveHost().should("have.attr", "aria-expanded", "true");
3065
+ UDExActiveHost().should("have.attr", "aria-selected", "false").and("not.have.attr", "aria-checked");
3066
+ cy.realPress("ArrowDown");
3067
+ UDExAssertActiveHost("treeitem", "JavaScript", 1, 2, "", 2, "JavaScript Frontend web development");
3068
+ UDExActiveHost().should("have.attr", "aria-selected", "false").and("not.have.attr", "aria-checked");
2946
3069
  });
2947
3070
 
2948
- it("clears the live region text when the dropdown closes on Escape", () => {
3071
+ // Updated: actionable opening is expanded-only; navigation is silent even on hosts without icons.
3072
+ it("announces expanded on actionable opening, keeps navigation silent and clears the active descendant on Escape", () => {
2949
3073
  cy.mount(shortComponent);
2950
- cy.get("#select-box").shadow()
2951
- .find(".udex-text-field__search")
2952
- .click()
2953
- .realPress("ArrowDown");
2954
-
2955
- // Precondition: the live region is populated by the navigation above.
2956
- cy.get("#select-box").shadow()
2957
- .find('[aria-live="polite"]')
2958
- .invoke("text")
2959
- .should("not.be.empty");
2960
-
2961
- cy.get("#select-box").shadow()
2962
- .find(".udex-text-field__search")
2963
- .realPress("Escape");
3074
+ UDExCombobox().realClick();
3075
+ UDExAssertActiveHost("treeitem", "JavaScript", 1, 6, "expanded", 1, "JavaScript Additional Text");
3076
+ cy.realPress("ArrowDown");
3077
+ UDExAssertActiveHost("treeitem", "Python", 2, 6, "", 1);
3078
+ UDExActiveHost().should("have.attr", "aria-selected", "false");
3079
+ UDExActiveHost().should("not.have.attr", "aria-expanded");
3080
+ cy.realPress("Escape");
2964
3081
 
2965
3082
  cy.get("#select-box").shadow()
2966
3083
  .find(".udex-select-box__dropdown")
2967
3084
  .should("not.have.attr", "open");
2968
-
2969
- // _setActiveDescendant(null) resets _liveRegionText to "".
2970
- cy.get("#select-box").shadow()
2971
- .find('[aria-live="polite"]')
2972
- .invoke("text")
2973
- .should("equal", "");
3085
+ UDExActiveHost().should("not.exist");
3086
+ UDExCombobox().should("not.have.attr", "aria-activedescendant");
3087
+ UDExCombobox().should("be.focused");
3088
+ UDExStatus().should("have.text", "");
2974
3089
  });
2975
3090
 
2976
- it("appends 'Unselected' to the live region for an unchecked MultiSelect item", () => {
3091
+ // Updated: plain flat MultiSelect announces expanded only on opening; option navigation remains silent.
3092
+ it("announces expanded on flat unselected MultiSelect opening and keeps navigation status silent", () => {
2977
3093
  cy.mount(multiSelect);
2978
- cy.get("#select-box").shadow()
2979
- .find(".udex-text-field__search")
2980
- .click()
2981
- .realPress("ArrowDown");
2982
-
2983
- // First MultiSelect item is not selected -> state suffix is "Unselected".
2984
- cy.get("#select-box").shadow()
2985
- .find('[aria-live="polite"]')
2986
- .should("contain.text", "Unselected");
3094
+ UDExCombobox().realClick();
3095
+ UDExCombobox().should("have.attr", "aria-haspopup", "listbox");
3096
+ cy.get("#select-box").shadow().find("[udex-list]").should("have.attr", "role", "listbox");
3097
+ UDExAssertActiveHost("option", "JavaScript", 1, 15, "expanded", undefined, "JavaScript Frontend web development");
3098
+ cy.realPress("ArrowDown");
3099
+ UDExAssertActiveHost("option", "Python", 2, 15, "", undefined, "Python Used in data analysis");
3100
+ UDExActiveHost().should("have.attr", "aria-selected", "false");
3101
+ UDExActiveHost().should("not.have.attr", "aria-checked");
2987
3102
  });
2988
3103
 
2989
- it("appends 'Selected' to the live region for a checked MultiSelect item", () => {
3104
+ // Updated: preselection remains native; opening announces expanded without repeating the selected option's name.
3105
+ it("announces only expanded when a preselected flat MultiSelect option is initially active", () => {
2990
3106
  const checkedMultiSelect = <div style="width: 350px; position:relative;">
2991
3107
  <UDExSelectBox
2992
3108
  id="select-box"
@@ -3000,18 +3116,15 @@ describe("SelectBox", () => {
3000
3116
  </div>;
3001
3117
 
3002
3118
  cy.mount(checkedMultiSelect);
3003
- cy.get("#select-box").shadow()
3004
- .find(".udex-text-field__search")
3005
- .click();
3006
-
3007
- // Opening activates the first MultiSelect item, which is pre-selected -> state
3008
- // suffix is "Selected".
3009
- cy.get("#select-box").shadow()
3010
- .find('[aria-live="polite"]')
3011
- .should("contain.text", "Selected");
3119
+ UDExCombobox().realClick();
3120
+ UDExAssertActiveHost("option", "JavaScript", 1, 3, "expanded", undefined, "JavaScript Frontend web development");
3121
+ UDExActiveHost().should("have.attr", "aria-selected", "true");
3122
+ UDExActiveHost().should("not.have.attr", "aria-checked");
3123
+ cy.get("#select-box").find('[udex-select-box-item][label="JavaScript"]').should("have.attr", "selected");
3012
3124
  });
3013
3125
 
3014
- it("appends 'collapsed' to the live region for a collapsed collapsible group header", () => {
3126
+ // Updated: an initially collapsed header still needs the expanded popup fallback; its native group stays collapsed.
3127
+ it("announces only expanded on pointer opening of a collapsed group and retains native header state", () => {
3015
3128
  const collapsedGroupHeader = <div style="width: 350px; position:relative;">
3016
3129
  <UDExSelectBox
3017
3130
  id="select-box"
@@ -3025,34 +3138,25 @@ describe("SelectBox", () => {
3025
3138
  </div>;
3026
3139
 
3027
3140
  cy.mount(collapsedGroupHeader);
3028
- cy.get("#select-box").shadow()
3029
- .find(".udex-text-field__search")
3030
- .click()
3031
- .realPress("ArrowDown");
3032
-
3033
- // ArrowDown activates the collapsed group header -> tree text reports
3034
- // "level 0" and the state suffix is "collapsed".
3035
- cy.get("#select-box").shadow()
3036
- .find('[aria-live="polite"]')
3037
- .invoke("text")
3038
- .should("contain", "level 0")
3039
- .and("contain", "collapsed");
3141
+ UDExCombobox().realClick();
3142
+ UDExAssertActiveHost("treeitem", "Programming Languages", 1, 1, "expanded", 1);
3143
+ UDExActiveHost().should("have.attr", "aria-expanded", "false");
3144
+ cy.realPress("ArrowDown");
3145
+ UDExAssertActiveHost("treeitem", "Programming Languages", 1, 1, "", 1);
3146
+ UDExActiveHost().should("have.attr", "aria-expanded", "false");
3147
+ UDExActiveHost().should("have.attr", "aria-selected", "false").and("not.have.attr", "aria-checked");
3148
+ UDExActiveHost().should("have.attr", "collapsed");
3040
3149
  });
3041
3150
 
3042
- it("appends 'expanded' to the live region for an expanded collapsible group header", () => {
3151
+ // Updated: native expanded-header state replaces the popup fallback, rather than duplicating expansion live.
3152
+ it("keeps live status empty on pointer opening and retains native expanded header state", () => {
3043
3153
  // groupHeaderCollapsible starts expanded (no `collapsed` attribute).
3044
3154
  cy.mount(groupHeaderCollapsible);
3045
- cy.get("#select-box").shadow()
3046
- .find(".udex-text-field__search")
3047
- .click();
3048
-
3049
- // Opening activates the expanded group header -> tree text reports
3050
- // "level 0" and the state suffix is "expanded".
3051
- cy.get("#select-box").shadow()
3052
- .find('[aria-live="polite"]')
3053
- .invoke("text")
3054
- .should("contain", "level 0")
3055
- .and("contain", "expanded");
3155
+ UDExCombobox().realClick();
3156
+ UDExAssertActiveHost("treeitem", "Programming Languages", 1, 1, "", 1);
3157
+ UDExActiveHost().should("have.attr", "aria-expanded", "true");
3158
+ UDExActiveHost().should("have.attr", "aria-selected", "false").and("not.have.attr", "aria-checked");
3159
+ UDExActiveHost().should("not.have.attr", "collapsed");
3056
3160
  });
3057
3161
  });
3058
3162
 
@@ -3183,14 +3287,10 @@ describe("SelectBox", () => {
3183
3287
  });
3184
3288
  });
3185
3289
 
3186
- // When focus lands on the body div of a collapsible single-select group header
3187
- // (tabindex="0"), SelectBox.handleInputFocusOut detects it — either by the
3188
- // udex-list__group-content class on the raw body div, or by checking isGroup +
3189
- // collapsible + !modeMultiSelect on the shadow-DOM-retargeted HOST element —
3190
- // sets the group header as the active descendant, and redirects DOM focus back
3191
- // to the search input.
3290
+ // Host-ARIA group rows have no tab stop. Clicking their body must activate the
3291
+ // header directly while DOM focus stays on the combobox input.
3192
3292
  describe("Select Box collapsible single-select group header click", () => {
3193
- it("clicking the body of a collapsible single-select group header returns DOM focus to the search input", () => {
3293
+ it("clicking the body of a collapsible single-select group header keeps DOM focus on the search input", () => {
3194
3294
  cy.mount(groupHeaderCollapsibleSingleSelect);
3195
3295
  cy.get("#select-box").shadow().find(".udex-text-field__trigger").click();
3196
3296
 
@@ -3198,8 +3298,10 @@ describe("SelectBox", () => {
3198
3298
  .find(".udex-select-box__dropdown")
3199
3299
  .should("have.attr", "open");
3200
3300
 
3201
- // realClick fires native browser events so the body div receives real focus,
3202
- // triggering the focusout on the search input with a valid relatedTarget.
3301
+ cy.get("#select-box").shadow().find(".udex-text-field__search").then($input => {
3302
+ $input[0].addEventListener("blur", cy.stub().as("headerClickBlur"));
3303
+ });
3304
+ // Use native mouse events to catch transient focus loss.
3203
3305
  // Click left side to avoid the collapse icon on the right.
3204
3306
  cy.get("#select-box").shadow()
3205
3307
  .find("[udex-list-group-header]")
@@ -3207,14 +3309,13 @@ describe("SelectBox", () => {
3207
3309
  .find("div[part='group-item'].udex-list__group-content")
3208
3310
  .realClick({ position: "left" });
3209
3311
 
3210
- // handleInputFocusOut detects the group header HOST (via isGroup + collapsible +
3211
- // !modeMultiSelect after shadow DOM retargeting) and calls _search.focus().
3212
3312
  cy.get("#select-box").shadow()
3213
3313
  .find(".udex-text-field__search")
3214
3314
  .should("be.focused");
3315
+ cy.get("@headerClickBlur").should("not.have.been.called");
3215
3316
  });
3216
3317
 
3217
- it("clicking the body returns focus after click and arrow navigation uses the group header as starting point", () => {
3318
+ it("clicking the body activates the header and arrow navigation uses it as starting point", () => {
3218
3319
  cy.mount(groupHeaderCollapsibleSingleSelect);
3219
3320
  cy.get("#select-box").shadow().find(".udex-text-field__trigger").click();
3220
3321
 
@@ -3222,8 +3323,13 @@ describe("SelectBox", () => {
3222
3323
  .find(".udex-select-box__dropdown")
3223
3324
  .should("have.attr", "open");
3224
3325
 
3225
- // realClick fires native browser events so the body div receives real focus,
3226
- // triggering the focusout on the search input with a valid relatedTarget.
3326
+ // Start on a leaf so this checks pointer activation rather than initial
3327
+ // dropdown activation accidentally supplying the same group header.
3328
+ cy.get("#select-box").shadow().find("[_active-descendant]").should("have.length", 1);
3329
+ cy.realPress("End");
3330
+ cy.get("#select-box").shadow().find("[udex-list-item]").eq(1)
3331
+ .should("have.attr", "_active-descendant");
3332
+
3227
3333
  // Click left side to avoid the collapse icon on the right.
3228
3334
  cy.get("#select-box").shadow()
3229
3335
  .find("[udex-list-group-header]")
@@ -3234,6 +3340,8 @@ describe("SelectBox", () => {
3234
3340
  cy.get("#select-box").shadow()
3235
3341
  .find(".udex-text-field__search")
3236
3342
  .should("be.focused");
3343
+ cy.get("#select-box").shadow().find("[udex-list-group-header]")
3344
+ .should("have.attr", "_active-descendant");
3237
3345
 
3238
3346
  // ArrowDown (via onKeyDownSearch) advances from the group header active
3239
3347
  // descendant to the FIRST list item (United States) — not back to item 0 /