@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
@@ -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
+ });
@@ -1,4 +1,5 @@
1
1
  import { UDExTagGroup, UDExTag } from "../support/component-imports.js";
2
+ import type Tokenizer from "@ui5/webcomponents/dist/Tokenizer.js";
2
3
 
3
4
  const defaultTagGroup = <UDExTagGroup>
4
5
  <UDExTag text="Default"></UDExTag>
@@ -106,6 +107,173 @@ describe("TagGroup", () => {
106
107
  cy.get("[udex-tag-group]").shadow().find("[udex-tooltip]").should("have.attr", "accessible-name", "Hidden tags");
107
108
  });
108
109
 
110
+ describe("Empty tokenizer accessibility", () => {
111
+ const UDExLongTagText = "JavaScript is a lightweight interpreted programming language with a deliberately long selected tag";
112
+ const UDExTagTexts = [UDExLongTagText, "Swift", "React", "Angular", "Django"];
113
+ const UDExTokenizer = () => cy.get("[udex-tag-group]").shadow().find(".udex-tag-group__tokenizer");
114
+ const UDExTokenizerList = () => UDExTokenizer().shadow().find(".ui5-tokenizer--list");
115
+ const UDExMoreButton = () => UDExTokenizer().shadow().find(".ui5-tokenizer-more-text");
116
+
117
+ function UDExMountOverflowTags(UDExTexts = UDExTagTexts) {
118
+ cy.mount(
119
+ <div id="tag-group-overflow-fixture" style="width: 320px;">
120
+ <button id="before-overflow-tags">Previous</button>
121
+ <UDExTagGroup tooltipAccessibleName="Hidden selected languages">
122
+ {UDExTexts.map(UDExText => <UDExTag text={UDExText}></UDExTag>)}
123
+ </UDExTagGroup>
124
+ </div>
125
+ );
126
+ }
127
+
128
+ function UDExAssertTokenizerList(UDExVisibleCount: number, UDExTotalCount = UDExTagTexts.length) {
129
+ // Retry ownership and semantics together: UI5 computes overflow after rendering.
130
+ UDExTokenizerList().should($list => {
131
+ const UDExAssignedTags = Array.from($list[0].querySelectorAll("slot"))
132
+ .flatMap(UDExSlot => UDExSlot.assignedElements());
133
+ const UDExVisibleTags = UDExAssignedTags.filter(UDExTokenElement => !UDExTokenElement.hasAttribute("overflows"));
134
+ expect(UDExAssignedTags, "all tags remain slotted into the tokenizer list").to.have.length(UDExTotalCount);
135
+ expect(UDExVisibleTags, "visible tags owned through the tokenizer list's slots").to.have.length(UDExVisibleCount);
136
+ expect($list).to.have.attr("role", UDExVisibleCount ? "listbox" : "presentation");
137
+ if (UDExVisibleCount) {
138
+ const UDExTokenizerHost = ($list[0].getRootNode() as ShadowRoot).host as Tokenizer;
139
+ expect($list).to.have.attr("aria-label", UDExTokenizerHost.tokenizerLabel);
140
+ expect(UDExTokenizerHost.tokenizerLabel).not.to.equal("");
141
+ UDExVisibleTags.forEach(UDExTokenElement => {
142
+ expect(UDExTokenElement.shadowRoot?.querySelector('[role="option"]'), "owned tag exposes an option").to.exist;
143
+ });
144
+ } else {
145
+ ["aria-label", "aria-description", "aria-disabled", "aria-readonly"].forEach(UDExAttribute => {
146
+ expect($list, `empty list omits ${UDExAttribute}`).not.to.have.attr(UDExAttribute);
147
+ });
148
+ }
149
+ });
150
+ }
151
+
152
+ it("makes a tokenizer without tags presentational and removes global ARIA again after a tokenizer-only render", () => {
153
+ cy.mount(<UDExTagGroup></UDExTagGroup>);
154
+ UDExTokenizer().find("[udex-tag]").should("not.exist");
155
+ UDExAssertTokenizerList(0, 0);
156
+
157
+ // These public UI5 properties would otherwise restore the global ARIA attributes.
158
+ UDExTokenizer().invoke("prop", "accessibleName", "Selected languages");
159
+ UDExTokenizer().invoke("prop", "disabled", true);
160
+ UDExTokenizer().then($tokenizer => {
161
+ // jQuery.prop maps "readonly" to native "readOnly", not UI5's property.
162
+ ($tokenizer[0] as Tokenizer).readonly = true;
163
+ });
164
+ UDExTokenizer().should("have.attr", "accessible-name", "Selected languages");
165
+ UDExTokenizer().should("have.attr", "disabled");
166
+ UDExTokenizer().should("have.attr", "readonly");
167
+ UDExAssertTokenizerList(0, 0);
168
+ });
169
+
170
+ it("keeps More named and keyboard-operable when all five tags overflow at 320px", () => {
171
+ UDExMountOverflowTags();
172
+ UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 5);
173
+ UDExAssertTokenizerList(0);
174
+ UDExMoreButton().should("be.visible").and("have.attr", "role", "button");
175
+ UDExMoreButton().should($more => {
176
+ expect($more.text()).to.contain("5");
177
+ expect($more[0].closest(".ui5-tokenizer--list"), "More is outside the presentational list").to.equal(null);
178
+ let UDExNode: HTMLElement | null = $more[0];
179
+ while (UDExNode) {
180
+ expect(UDExNode.getAttribute("aria-hidden"), "More has no hidden composed ancestor").not.to.equal("true");
181
+ expect(UDExNode.hasAttribute("hidden") || UDExNode.hasAttribute("inert")).to.equal(false);
182
+ UDExNode = UDExNode.assignedSlot || UDExNode.parentElement
183
+ || ((UDExNode.getRootNode() as ShadowRoot).host as HTMLElement | undefined) || null;
184
+ }
185
+ });
186
+
187
+ cy.get("#before-overflow-tags").focus();
188
+ cy.realPress("Tab");
189
+ UDExMoreButton().should("be.focused");
190
+ cy.realPress("Enter");
191
+ cy.get("[udex-tag-group]").shadow().find("[udex-tooltip]").should("have.attr", "open");
192
+ cy.get("[udex-tag-group]").shadow().find(".udex-tag-group-tooltip__content [udex-tag]").should("have.length", 5);
193
+ UDExAssertTokenizerList(0);
194
+ });
195
+
196
+ it("restores the current tokenizer name and owned options on expansion, then removes the empty listbox on collapse", () => {
197
+ UDExMountOverflowTags();
198
+ UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 5);
199
+ UDExAssertTokenizerList(0);
200
+ UDExTokenizer().invoke("prop", "accessibleName", "Selected languages");
201
+ UDExTokenizer().should("have.attr", "accessible-name", "Selected languages");
202
+ UDExAssertTokenizerList(0);
203
+
204
+ cy.get("[udex-tag-group]").invoke("prop", "tokenizerExpanded", true);
205
+ UDExAssertTokenizerList(5);
206
+ UDExTokenizerList().should("have.attr", "aria-label", "Selected languages");
207
+ UDExMoreButton().should("not.exist");
208
+
209
+ cy.get("[udex-tag-group]").invoke("prop", "tokenizerExpanded", false);
210
+ UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 5);
211
+ UDExAssertTokenizerList(0);
212
+ UDExMoreButton().should("be.visible");
213
+ });
214
+
215
+ it("retains a named listbox when collapse leaves one visible option and four overflowing tags", () => {
216
+ UDExMountOverflowTags(["Python", UDExLongTagText, "React", "Angular", "Django"]);
217
+ UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 4);
218
+ UDExAssertTokenizerList(1);
219
+ UDExMoreButton().should("be.visible");
220
+
221
+ cy.get("[udex-tag-group]").invoke("prop", "tokenizerExpanded", true);
222
+ UDExAssertTokenizerList(5);
223
+ cy.get("[udex-tag-group]").invoke("prop", "tokenizerExpanded", false);
224
+ UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 4);
225
+ UDExAssertTokenizerList(1);
226
+ UDExMoreButton().should("be.visible");
227
+ });
228
+
229
+ it("updates list semantics after real container resizes from all-overflow to visible tags and back", () => {
230
+ cy.viewport(1400, 800);
231
+ UDExMountOverflowTags();
232
+ UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 5);
233
+ UDExAssertTokenizerList(0);
234
+
235
+ cy.get("#tag-group-overflow-fixture").invoke("attr", "style", "width: 1200px;");
236
+ UDExAssertTokenizerList(5);
237
+ UDExMoreButton().should("not.exist");
238
+
239
+ cy.get("#tag-group-overflow-fixture").invoke("attr", "style", "width: 320px;");
240
+ UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 5);
241
+ UDExAssertTokenizerList(0);
242
+ UDExMoreButton().should("be.visible");
243
+ });
244
+
245
+ it("resumes tokenizer ARIA synchronization after the same TagGroup is detached and reattached", () => {
246
+ let UDExDetachedGroup: HTMLElement & { tokenizerExpanded: boolean };
247
+ UDExMountOverflowTags();
248
+ UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 5);
249
+ UDExAssertTokenizerList(0);
250
+ cy.get("[udex-tag-group]").then($group => {
251
+ UDExDetachedGroup = $group[0] as typeof UDExDetachedGroup;
252
+ UDExDetachedGroup.remove();
253
+ });
254
+ cy.then(() => {
255
+ // The detached node is intentional; do not make it a Cypress DOM subject.
256
+ expect(UDExDetachedGroup.isConnected).to.equal(false);
257
+ UDExDetachedGroup.tokenizerExpanded = true;
258
+ });
259
+ cy.get("#tag-group-overflow-fixture").then($fixture => {
260
+ $fixture[0].append(UDExDetachedGroup);
261
+ });
262
+ cy.get("[udex-tag-group]").should($group => {
263
+ expect($group[0]).to.equal(UDExDetachedGroup);
264
+ expect($group[0].isConnected).to.equal(true);
265
+ });
266
+
267
+ UDExAssertTokenizerList(5);
268
+ UDExTokenizer().invoke("prop", "accessibleName", "Reattached selected languages");
269
+ UDExTokenizerList().should("have.attr", "aria-label", "Reattached selected languages");
270
+ cy.get("[udex-tag-group]").invoke("prop", "tokenizerExpanded", false);
271
+ UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 5);
272
+ UDExAssertTokenizerList(0);
273
+ UDExMoreButton().should("be.visible");
274
+ });
275
+ });
276
+
109
277
  describe("Keyboard focus with hidden tags", () => {
110
278
  it("keeps the 'n more' button visible when a visible tag receives focus (overflow case)", () => {
111
279
  cy.mount(<div><button id="before">before</button>{defaultTagGroup}</div>);
@@ -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,
@@ -40,6 +40,7 @@ import UDExList from "../../src/List.js";
40
40
  import UDExListGroupHeader from "../../src/ListGroupHeader.js";
41
41
  import UDExListItem from "../../src/ListItem.js";
42
42
  import UDExMastheadItem from "../../src/MastheadItem.js";
43
+ import UDExMastheadCountrySelector from "../../src/MastheadCountrySelector.js";
43
44
  import UDExMastheadMenu from "../../src/MastheadMenu.js";
44
45
  import UDExMastheadMobileMenu from "../../src/MastheadMobileMenu.js";
45
46
  import UDExMastheadProfileMenu from "../../src/MastheadProfileMenu.js";
@@ -61,6 +62,7 @@ import UDExSecondaryNavigation from "../../src/SecondaryNavigation.js";
61
62
  import UDExSelectBox from "../../src/SelectBox.js";
62
63
  import UDExSideNavigation from "../../src/SideNavigation.js";
63
64
  import UDExSideNavigationItem from "../../src/SideNavigationItem.js";
65
+ import UDExSideNavigationMobile from "../../src/SideNavigationMobile.js";
64
66
  import UDExSideNavigationSubItem from "../../src/SideNavigationSubItem.js";
65
67
  import UDExSelectBoxGroupHeader from "../../src/SelectBoxGroupHeader.js";
66
68
  import UDExSelectBoxItem from "../../src/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,
@@ -14,6 +14,6 @@ export default function AccordionItemTemplate() {
14
14
  return (_jsxs(_Fragment, { children: [_jsxs("button", { id: ariaLabelledbyId, "aria-controls": ariaControlsId, className: `${headlineClass}`, onFocusIn: this.focusHandler, onClick: this.itemClickHandler, onKeyDown: this.keydownHandler, "aria-expanded": this.expanded, type: "button", children: [this.labelIcon ?
15
15
  _jsx("div", { className: `${rootClass}__icon-wrapper ${rootClass}__label-icon-wrapper`, children: _jsx(UI5Icon, { class: `${rootClass}__icon ${rootClass}__label-icon`, mode: IconMode.Decorative, name: this.labelIcon }) })
16
16
  : "", _jsxs("span", { className: `${rootClass}__title`, children: [this.label, this.numberBadge &&
17
- _jsx(UDExBadge, { class: `${rootClass}__badge`, "number-design": this.numberBadgeDesign, type: UDExTypeBadgeDesign.Number, size: UDExSizeBadgeDesign.Medium, children: this.numberBadge })] }), _jsx("div", { className: `${rootClass}__icon-wrapper`, children: _jsx(UI5Icon, { class: `${rootClass}__icon`, mode: IconMode.Decorative, name: slimArrowRight }) })] }), _jsx("div", { id: ariaControlsId, "aria-hidden": !this.expanded, "aria-labelledby": ariaLabelledbyId, className: `${rootClass}__content ${titleClass}`, onKeyDown: this.contentKeydown, role: "region", children: _jsx("div", { className: `${rootClass}__content-inner`, children: _jsx("slot", {}) }) }), _jsx(UDExDivider, {})] }));
17
+ _jsx(UDExBadge, { class: `${rootClass}__badge`, "number-design": this.numberBadgeDesign, type: UDExTypeBadgeDesign.Number, size: UDExSizeBadgeDesign.Medium, children: this.numberBadge })] }), _jsx("div", { className: `${rootClass}__icon-wrapper`, children: _jsx(UI5Icon, { class: `${rootClass}__icon`, mode: IconMode.Decorative, name: slimArrowRight }) })] }), _jsx("div", { id: ariaControlsId, "aria-hidden": !this.expanded, inert: !this.expanded, "aria-labelledby": ariaLabelledbyId, className: `${rootClass}__content ${titleClass}`, onKeyDown: this.contentKeydown, role: "region", children: _jsx("div", { className: `${rootClass}__content-inner`, children: _jsx("slot", {}) }) }), _jsx(UDExDivider, {})] }));
18
18
  }
19
19
  //# sourceMappingURL=AccordionItemTemplate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AccordionItemTemplate.js","sourceRoot":"","sources":["../src/AccordionItemTemplate.tsx"],"names":[],"mappings":";AACA,OAAO,OAAO,MAAM,iCAAiC,CAAC;AACtD,OAAO,QAAQ,MAAM,2CAA2C,CAAC;AACjE,OAAO,cAAc,MAAM,mDAAmD,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,WAAW,MAAM,cAAc,CAAC;AAEvC,MAAM,CAAC,OAAO,UAAU,qBAAqB;IAC3C,MAAM,cAAc,GAAG,wBAAwB,IAAI,CAAC,GAAG,UAAU,CAAC;IAClE,MAAM,gBAAgB,GAAG,wBAAwB,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5D,MAAM,SAAS,GAAG,qBAAqB,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,MAAM,aAAa,GAAG,GAAG,SAAS,YAAY,SAAS,aAAa,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;IAEnG,OAAO,CACL,8BACE,kBACE,EAAE,EAAE,gBAAgB,mBACL,cAAc,EAC7B,SAAS,EAAE,GAAG,aAAa,EAAE,EAC7B,SAAS,EAAE,IAAI,CAAC,YAAY,EAC5B,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAC9B,SAAS,EAAE,IAAI,CAAC,cAAc,mBACf,IAAI,CAAC,QAAQ,EAC5B,IAAI,EAAC,QAAQ,aACZ,IAAI,CAAC,SAAS,CAAC,CAAC;wBACf,cAAK,SAAS,EAAE,GAAG,SAAS,kBAAkB,SAAS,sBAAsB,YAC3E,KAAC,OAAO,IACN,KAAK,EAAE,GAAG,SAAS,UAAU,SAAS,cAAc,EACpD,IAAI,EAAE,QAAQ,CAAC,UAAU,EACzB,IAAI,EAAE,IAAI,CAAC,SAAS,GACZ,GACN;wBACN,CAAC,CAAC,EAAE,EACN,gBAAM,SAAS,EAAE,GAAG,SAAS,SAAS,aACnC,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,WAAW;gCACf,KAAC,SAAS,IACR,KAAK,EAAE,GAAG,SAAS,SAAS,mBACb,IAAI,CAAC,iBAAiB,EACrC,IAAI,EAAE,mBAAmB,CAAC,MAAM,EAChC,IAAI,EAAE,mBAAmB,CAAC,MAAM,YAC/B,IAAI,CAAC,WAAW,GACP,IAET,EACP,cAAK,SAAS,EAAE,GAAG,SAAS,gBAAgB,YAC1C,KAAC,OAAO,IACN,KAAK,EAAE,GAAG,SAAS,QAAQ,EAC3B,IAAI,EAAE,QAAQ,CAAC,UAAU,EACzB,IAAI,EAAE,cAAc,GACZ,GACN,IACC,EACT,cACE,EAAE,EAAE,cAAc,iBACL,CAAC,IAAI,CAAC,QAAQ,qBACV,gBAAgB,EACjC,SAAS,EAAE,GAAG,SAAS,aAAa,UAAU,EAAE,EAChD,SAAS,EAAE,IAAI,CAAC,cAAc,EAC9B,IAAI,EAAC,QAAQ,YACb,cAAK,SAAS,EAAE,GAAG,SAAS,iBAAiB,YAC3C,gBAAa,GACT,GACF,EACN,KAAC,WAAW,KAAe,IAC1B,CACJ,CAAC;AACJ,CAAC","sourcesContent":["import type AccordionItem from \"./AccordionItem.js\";\nimport UI5Icon from \"@ui5/webcomponents/dist/Icon.js\";\nimport IconMode from \"@ui5/webcomponents/dist/types/IconMode.js\";\nimport slimArrowRight from \"@ui5/webcomponents-icons/dist/slim-arrow-right.js\";\nimport { UDExSizeBadgeDesign, UDExTypeBadgeDesign } from \"./types/BadgeDesign.js\";\nimport UDExBadge from \"./Badge.js\";\nimport UDExDivider from \"./Divider.js\";\n\nexport default function AccordionItemTemplate(this: AccordionItem) {\n const ariaControlsId = `udex-accordion-item__${this._id}-content`;\n const ariaLabelledbyId = `udex-accordion-item__${this._id}`;\n const rootClass = \"udex-accordion-item\";\n const titleClass = this.labelIcon ? `${rootClass}--with-title` : \"\";\n const headlineClass = `${rootClass}__header ${rootClass}__header--${this.labelSize.toLowerCase()}`;\n\n return (\n <>\n <button\n id={ariaLabelledbyId}\n aria-controls={ariaControlsId}\n className={`${headlineClass}`}\n onFocusIn={this.focusHandler}\n onClick={this.itemClickHandler}\n onKeyDown={this.keydownHandler}\n aria-expanded={this.expanded}\n type=\"button\">\n {this.labelIcon ?\n <div className={`${rootClass}__icon-wrapper ${rootClass}__label-icon-wrapper`}>\n <UI5Icon\n class={`${rootClass}__icon ${rootClass}__label-icon`}\n mode={IconMode.Decorative}\n name={this.labelIcon}>\n </UI5Icon>\n </div>\n : \"\"}\n <span className={`${rootClass}__title`}>\n {this.label}\n {this.numberBadge &&\n <UDExBadge\n class={`${rootClass}__badge`}\n number-design={this.numberBadgeDesign}\n type={UDExTypeBadgeDesign.Number}\n size={UDExSizeBadgeDesign.Medium}>\n {this.numberBadge}\n </UDExBadge>\n }\n </span>\n <div className={`${rootClass}__icon-wrapper`}>\n <UI5Icon\n class={`${rootClass}__icon`}\n mode={IconMode.Decorative}\n name={slimArrowRight}>\n </UI5Icon>\n </div>\n </button>\n <div\n id={ariaControlsId}\n aria-hidden={!this.expanded}\n aria-labelledby={ariaLabelledbyId}\n className={`${rootClass}__content ${titleClass}`}\n onKeyDown={this.contentKeydown}\n role=\"region\">\n <div className={`${rootClass}__content-inner`}>\n <slot></slot>\n </div>\n </div>\n <UDExDivider></UDExDivider>\n </>\n );\n}\n"]}
1
+ {"version":3,"file":"AccordionItemTemplate.js","sourceRoot":"","sources":["../src/AccordionItemTemplate.tsx"],"names":[],"mappings":";AACA,OAAO,OAAO,MAAM,iCAAiC,CAAC;AACtD,OAAO,QAAQ,MAAM,2CAA2C,CAAC;AACjE,OAAO,cAAc,MAAM,mDAAmD,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,WAAW,MAAM,cAAc,CAAC;AAEvC,MAAM,CAAC,OAAO,UAAU,qBAAqB;IAC3C,MAAM,cAAc,GAAG,wBAAwB,IAAI,CAAC,GAAG,UAAU,CAAC;IAClE,MAAM,gBAAgB,GAAG,wBAAwB,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5D,MAAM,SAAS,GAAG,qBAAqB,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,MAAM,aAAa,GAAG,GAAG,SAAS,YAAY,SAAS,aAAa,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;IAEnG,OAAO,CACL,8BACE,kBACE,EAAE,EAAE,gBAAgB,mBACL,cAAc,EAC7B,SAAS,EAAE,GAAG,aAAa,EAAE,EAC7B,SAAS,EAAE,IAAI,CAAC,YAAY,EAC5B,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAC9B,SAAS,EAAE,IAAI,CAAC,cAAc,mBACf,IAAI,CAAC,QAAQ,EAC5B,IAAI,EAAC,QAAQ,aACZ,IAAI,CAAC,SAAS,CAAC,CAAC;wBACf,cAAK,SAAS,EAAE,GAAG,SAAS,kBAAkB,SAAS,sBAAsB,YAC3E,KAAC,OAAO,IACN,KAAK,EAAE,GAAG,SAAS,UAAU,SAAS,cAAc,EACpD,IAAI,EAAE,QAAQ,CAAC,UAAU,EACzB,IAAI,EAAE,IAAI,CAAC,SAAS,GACZ,GACN;wBACN,CAAC,CAAC,EAAE,EACN,gBAAM,SAAS,EAAE,GAAG,SAAS,SAAS,aACnC,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,WAAW;gCACf,KAAC,SAAS,IACR,KAAK,EAAE,GAAG,SAAS,SAAS,mBACb,IAAI,CAAC,iBAAiB,EACrC,IAAI,EAAE,mBAAmB,CAAC,MAAM,EAChC,IAAI,EAAE,mBAAmB,CAAC,MAAM,YAC/B,IAAI,CAAC,WAAW,GACP,IAET,EACP,cAAK,SAAS,EAAE,GAAG,SAAS,gBAAgB,YAC1C,KAAC,OAAO,IACN,KAAK,EAAE,GAAG,SAAS,QAAQ,EAC3B,IAAI,EAAE,QAAQ,CAAC,UAAU,EACzB,IAAI,EAAE,cAAc,GACZ,GACN,IACC,EACT,cACE,EAAE,EAAE,cAAc,iBACL,CAAC,IAAI,CAAC,QAAQ,EAC3B,KAAK,EAAE,CAAC,IAAI,CAAC,QAAQ,qBACJ,gBAAgB,EACjC,SAAS,EAAE,GAAG,SAAS,aAAa,UAAU,EAAE,EAChD,SAAS,EAAE,IAAI,CAAC,cAAc,EAC9B,IAAI,EAAC,QAAQ,YACb,cAAK,SAAS,EAAE,GAAG,SAAS,iBAAiB,YAC3C,gBAAa,GACT,GACF,EACN,KAAC,WAAW,KAAe,IAC1B,CACJ,CAAC;AACJ,CAAC","sourcesContent":["import type AccordionItem from \"./AccordionItem.js\";\nimport UI5Icon from \"@ui5/webcomponents/dist/Icon.js\";\nimport IconMode from \"@ui5/webcomponents/dist/types/IconMode.js\";\nimport slimArrowRight from \"@ui5/webcomponents-icons/dist/slim-arrow-right.js\";\nimport { UDExSizeBadgeDesign, UDExTypeBadgeDesign } from \"./types/BadgeDesign.js\";\nimport UDExBadge from \"./Badge.js\";\nimport UDExDivider from \"./Divider.js\";\n\nexport default function AccordionItemTemplate(this: AccordionItem) {\n const ariaControlsId = `udex-accordion-item__${this._id}-content`;\n const ariaLabelledbyId = `udex-accordion-item__${this._id}`;\n const rootClass = \"udex-accordion-item\";\n const titleClass = this.labelIcon ? `${rootClass}--with-title` : \"\";\n const headlineClass = `${rootClass}__header ${rootClass}__header--${this.labelSize.toLowerCase()}`;\n\n return (\n <>\n <button\n id={ariaLabelledbyId}\n aria-controls={ariaControlsId}\n className={`${headlineClass}`}\n onFocusIn={this.focusHandler}\n onClick={this.itemClickHandler}\n onKeyDown={this.keydownHandler}\n aria-expanded={this.expanded}\n type=\"button\">\n {this.labelIcon ?\n <div className={`${rootClass}__icon-wrapper ${rootClass}__label-icon-wrapper`}>\n <UI5Icon\n class={`${rootClass}__icon ${rootClass}__label-icon`}\n mode={IconMode.Decorative}\n name={this.labelIcon}>\n </UI5Icon>\n </div>\n : \"\"}\n <span className={`${rootClass}__title`}>\n {this.label}\n {this.numberBadge &&\n <UDExBadge\n class={`${rootClass}__badge`}\n number-design={this.numberBadgeDesign}\n type={UDExTypeBadgeDesign.Number}\n size={UDExSizeBadgeDesign.Medium}>\n {this.numberBadge}\n </UDExBadge>\n }\n </span>\n <div className={`${rootClass}__icon-wrapper`}>\n <UI5Icon\n class={`${rootClass}__icon`}\n mode={IconMode.Decorative}\n name={slimArrowRight}>\n </UI5Icon>\n </div>\n </button>\n <div\n id={ariaControlsId}\n aria-hidden={!this.expanded}\n inert={!this.expanded}\n aria-labelledby={ariaLabelledbyId}\n className={`${rootClass}__content ${titleClass}`}\n onKeyDown={this.contentKeydown}\n role=\"region\">\n <div className={`${rootClass}__content-inner`}>\n <slot></slot>\n </div>\n </div>\n <UDExDivider></UDExDivider>\n </>\n );\n}\n"]}
@@ -43,8 +43,9 @@ declare class UDExAccordionSpotlight extends UI5Element {
43
43
  };
44
44
  };
45
45
  /**
46
- * The index of the currently expanded item (0-based).
47
- * Derived from items' <code>selected</code> attribute; kept in sync by the parent.
46
+ * The index of the currently expanded item (0-based), or <code>-1</code> when
47
+ * no item is expanded. Derived from items' <code>selected</code> attribute;
48
+ * kept in sync by the parent.
48
49
  *
49
50
  * @private
50
51
  */
@@ -105,6 +106,10 @@ declare class UDExAccordionSpotlight extends UI5Element {
105
106
  /**
106
107
  * The slotted AccordionSpotlightItem elements.
107
108
  *
109
+ * <code>invalidateOnChildChange</code> lets the component react when an item's
110
+ * <code>selected</code> property is set programmatically, so
111
+ * <code>item.selected = true</code> switches the expanded item at runtime.
112
+ *
108
113
  * @public
109
114
  */
110
115
  items: DefaultSlot<AccordionSpotlightItem>;
@@ -59,12 +59,13 @@ let UDExAccordionSpotlight = class UDExAccordionSpotlight extends UI5Element {
59
59
  constructor() {
60
60
  super();
61
61
  /**
62
- * The index of the currently expanded item (0-based).
63
- * Derived from items' <code>selected</code> attribute; kept in sync by the parent.
62
+ * The index of the currently expanded item (0-based), or <code>-1</code> when
63
+ * no item is expanded. Derived from items' <code>selected</code> attribute;
64
+ * kept in sync by the parent.
64
65
  *
65
66
  * @private
66
67
  */
67
- this._selectedIndex = 0;
68
+ this._selectedIndex = -1;
68
69
  /**
69
70
  * Vertical alignment of the navigation sidebar relative to the content panel.
70
71
  *
@@ -158,8 +159,27 @@ let UDExAccordionSpotlight = class UDExAccordionSpotlight extends UI5Element {
158
159
  if (this.items.length === 0) {
159
160
  return;
160
161
  }
161
- const foundIndex = this.items.findIndex(item => item.selected);
162
- const activeIndex = foundIndex === -1 ? 0 : foundIndex;
162
+ const selectedIndexes = this.items.reduce((acc, item, index) => {
163
+ if (item.selected) {
164
+ acc.push(index);
165
+ }
166
+ return acc;
167
+ }, []);
168
+ // Prefer a selected item that differs from the currently tracked index — it
169
+ // signals a selection requested via `item.selected = true`. Otherwise keep
170
+ // the current index if it is still selected. When no item is selected, leave
171
+ // the component with no active item (-1) rather than forcing the first one.
172
+ let activeIndex;
173
+ const newlySelected = selectedIndexes.find(index => index !== this._selectedIndex);
174
+ if (newlySelected !== undefined) {
175
+ activeIndex = newlySelected;
176
+ }
177
+ else if (selectedIndexes.includes(this._selectedIndex)) {
178
+ activeIndex = this._selectedIndex;
179
+ }
180
+ else {
181
+ activeIndex = selectedIndexes[0] ?? -1;
182
+ }
163
183
  this._selectedIndex = activeIndex;
164
184
  this.items.forEach((item, index) => {
165
185
  item.selected = index === activeIndex;
@@ -254,7 +274,12 @@ __decorate([
254
274
  property({ type: Boolean, noAttribute: true })
255
275
  ], UDExAccordionSpotlight.prototype, "_isPaused", void 0);
256
276
  __decorate([
257
- slot({ type: HTMLElement, "default": true, individualSlots: true })
277
+ slot({
278
+ type: HTMLElement,
279
+ "default": true,
280
+ individualSlots: true,
281
+ invalidateOnChildChange: true,
282
+ })
258
283
  ], UDExAccordionSpotlight.prototype, "items", void 0);
259
284
  __decorate([
260
285
  slot({ type: HTMLElement })
@@ -1 +1 @@
1
- {"version":3,"file":"AccordionSpotlight.js","sourceRoot":"","sources":["../src/AccordionSpotlight.ts"],"names":[],"mappings":"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","sourcesContent":["import UI5Element from \"@ui5/webcomponents-base/dist/UI5Element.js\";\nimport customElement from \"@ui5/webcomponents-base/dist/decorators/customElement.js\";\nimport property from \"@ui5/webcomponents-base/dist/decorators/property.js\";\nimport type { DefaultSlot, Slot } from \"@ui5/webcomponents-base/dist/UI5Element.js\";\nimport slot from \"@ui5/webcomponents-base/dist/decorators/slot-strict.js\";\nimport event from \"@ui5/webcomponents-base/dist/decorators/event-strict.js\";\nimport jsxRenderer from \"@ui5/webcomponents-base/dist/renderer/JsxRenderer.js\";\nimport { isDesktop } from \"@ui5/webcomponents-base/dist/Device.js\";\nimport AccordionSpotlightTemplate from \"./AccordionSpotlightTemplate.js\";\nimport AccordionSpotlightItem from \"./AccordionSpotlightItem.js\";\nimport UDExButton from \"./Button.js\";\nimport \"@ui5/webcomponents-icons/dist/play.js\";\nimport \"@ui5/webcomponents-icons/dist/pause.js\";\nimport type { ResizeObserverCallback } from \"@ui5/webcomponents-base/dist/delegate/ResizeHandler.js\";\nimport ResizeHandler from \"@ui5/webcomponents-base/dist/delegate/ResizeHandler.js\";\nimport { BreakpointUtils } from \"./utils/Breakpoints.js\";\n\n// Styles\nimport AccordionSpotlightCss from \"./generated/themes/AccordionSpotlight.css.js\";\n\nexport enum UDExAccordionSpotlightVerticalAlignment {\n Top = \"Top\",\n Center = \"Center\",\n}\n\nexport enum UDExAccordionSpotlightPlacement {\n Start = \"Start\",\n End = \"End\",\n}\n\nexport enum UDExAccordionSpotlightMediaMode {\n Dynamic = \"Dynamic\",\n Static = \"Static\",\n}\n\n/**\n * @class\n *\n * <h3 class=\"comment-api-title\">Overview</h3>\n *\n * Vertical accordion navigation with spotlight layout. Items are listed on the\n * left; the expanded panel is displayed on the right (desktop) or inline below\n * the heading (mobile). Follows the WAI-ARIA APG Accordion pattern.\n *\n * <h3>Usage</h3>\n *\n * For the <code>udex-accordion-spotlight</code>\n * <h3>ES6 Module Import</h3>\n *\n * <code>import \"@sapudex/web-components/dist/AccordionSpotlight.js\";</code>\n *\n * @constructor\n * @extends UI5Element\n * @public\n */\n@customElement({\n tag: \"udex-accordion-spotlight\",\n renderer: jsxRenderer,\n styles: AccordionSpotlightCss,\n template: AccordionSpotlightTemplate,\n dependencies: [AccordionSpotlightItem, UDExButton],\n})\n\n/**\n * Fired when the expanded item clicked.\n *\n * @public\n * @param {AccordionSpotlightItem} [item] The accordion spotlight item that was clicked\n */\n@event(\"item-click\", { bubbles: true })\n\nclass UDExAccordionSpotlight extends UI5Element {\n eventDetails!: {\n \"item-click\": { item: AccordionSpotlightItem },\n };\n\n /**\n * The index of the currently expanded item (0-based).\n * Derived from items' <code>selected</code> attribute; kept in sync by the parent.\n *\n * @private\n */\n @property({ type: Number, noAttribute: true })\n _selectedIndex: number = 0;\n\n /**\n * Vertical alignment of the navigation sidebar relative to the content panel.\n *\n * @default \"Top\"\n * @public\n */\n @property()\n verticalAlignment: `${UDExAccordionSpotlightVerticalAlignment}` = UDExAccordionSpotlightVerticalAlignment.Top;\n\n /**\n * Placement of the navigation sidebar — \"Start\" (left) or \"End\" (right).\n *\n * @default \"Start\"\n * @public\n */\n @property()\n placement: `${UDExAccordionSpotlightPlacement}` = UDExAccordionSpotlightPlacement.Start;\n\n /**\n * Enables automatic cycling through items on an interval.\n *\n * @default false\n * @public\n */\n @property({ type: Boolean })\n autoPlay: boolean = false;\n\n /**\n * Interval in milliseconds between automatic item advances. Applies only when autoPlay is enabled.\n *\n * @default 5000\n * @public\n */\n @property({ type: Number })\n autoPlayInterval: number = 5000;\n\n /**\n * Defines the width of the navigation panel.\n *\n * @default \"auto\"\n * @public\n */\n @property({ type: String })\n tabWidth: string = \"auto\";\n\n /**\n * Controls how the media area behaves. In <code>Static</code> mode a single\n * persistent media element (image or video) is displayed alongside the nav\n * list and never changes when items are expanded. In <code>Dynamic</code>\n * mode (default) each item provides its own content panel.\n *\n * @default \"Dynamic\"\n * @public\n */\n @property()\n mediaMode: `${UDExAccordionSpotlightMediaMode}` = UDExAccordionSpotlightMediaMode.Dynamic;\n\n /**\n * @private\n */\n @property({ type: Boolean, noAttribute: true })\n _isMobile: boolean = false;\n\n /**\n * @private\n */\n @property({ type: Boolean, noAttribute: true })\n _isPaused: boolean = false;\n\n /**\n * The slotted AccordionSpotlightItem elements.\n *\n * @public\n */\n @slot({ type: HTMLElement, \"default\": true, individualSlots: true })\n items!: DefaultSlot<AccordionSpotlightItem>;\n\n /**\n * Defines optional content rendered below the navigation items.\n * Use to place a button or any action element beneath the items.\n *\n * @slot footer\n * @public\n */\n @slot({ type: HTMLElement })\n footer!: Slot<HTMLElement>;\n\n /**\n * Persistent media area shown in <code>Static</code> media mode.\n * Place an <code>&lt;img&gt;</code> or <code>&lt;video&gt;</code> element here;\n * it remains visible regardless of which item is currently expanded.\n *\n * @slot media\n * @public\n */\n @slot({ type: HTMLElement })\n media!: Slot<HTMLElement>;\n\n _handleResizeBound: ResizeObserverCallback;\n _autoPlayTimer?: number;\n\n constructor() {\n super();\n this._handleResizeBound = this._handleResize.bind(this);\n }\n\n onBeforeRendering() {\n this._syncItemStates();\n }\n\n onAfterRendering() {\n this._checkMobile();\n }\n\n onEnterDOM() {\n ResizeHandler.register(this, this._handleResizeBound);\n\n if (isDesktop()) {\n this.setAttribute(\"desktop\", \"\");\n }\n\n if (this.autoPlay) {\n const prefersReducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n if (prefersReducedMotion) {\n this._isPaused = true;\n } else {\n this._startAutoPlay();\n }\n }\n }\n\n onExitDOM() {\n ResizeHandler.deregister(this, this._handleResizeBound);\n this._stopAutoPlay();\n }\n\n _handleResize(): void {\n this._checkMobile();\n }\n\n _checkMobile() {\n const isMobile = BreakpointUtils.isAtMost(\"S\");\n if (isMobile !== this._isMobile) {\n this._isMobile = isMobile;\n }\n }\n\n _syncItemStates() {\n if (this.items.length === 0) {\n return;\n }\n\n const foundIndex = this.items.findIndex(item => item.selected);\n const activeIndex = foundIndex === -1 ? 0 : foundIndex;\n this._selectedIndex = activeIndex;\n\n this.items.forEach((item, index) => {\n item.selected = index === activeIndex;\n item._isMobile = this._isMobile;\n });\n }\n\n _startAutoPlay(): void {\n this._stopAutoPlay();\n this._isPaused = false;\n this._autoPlayTimer = window.setInterval(() => {\n this._advanceItem();\n }, this.autoPlayInterval);\n }\n\n _stopAutoPlay(): void {\n if (this._autoPlayTimer !== undefined) {\n window.clearInterval(this._autoPlayTimer);\n this._autoPlayTimer = undefined;\n }\n }\n\n _advanceItem(): void {\n const count = this.items.length;\n if (count === 0) {\n return;\n }\n\n const next = (this._selectedIndex + 1) % count;\n this._selectItem(next);\n }\n\n onPlayButtonClick(): void {\n if (this._isPaused) {\n this._startAutoPlay();\n } else {\n this._stopAutoPlay();\n this._isPaused = true;\n }\n }\n\n handleNavItemClick(e: MouseEvent) {\n const btn = (e.target as HTMLElement).closest<HTMLElement>(\"[data-index]\");\n if (!btn) {\n return;\n }\n const index = Number.parseInt(btn.dataset.index!);\n this._selectItem(index);\n }\n\n private _selectItem(index: number) {\n if (index === this._selectedIndex) {\n return;\n }\n\n this._selectedIndex = index;\n this.items.forEach((item, i) => { item.selected = i === index; });\n const item = this.items[index];\n this.fireDecoratorEvent(\"item-click\", { item });\n }\n\n get playBtnIcon(): string {\n return this._isPaused ? \"play\" : \"pause\";\n }\n\n get showFooterSlot(): boolean {\n return this.footer?.length > 0;\n }\n\n get isStaticMedia(): boolean {\n return this.mediaMode === UDExAccordionSpotlightMediaMode.Static;\n }\n\n get showMediaSlot(): boolean {\n return this.isStaticMedia && this.media?.length > 0;\n }\n}\n\nUDExAccordionSpotlight.define();\n\nexport default UDExAccordionSpotlight;\n"]}
1
+ {"version":3,"file":"AccordionSpotlight.js","sourceRoot":"","sources":["../src/AccordionSpotlight.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,UAAU,MAAM,4CAA4C,CAAC;AACpE,OAAO,aAAa,MAAM,0DAA0D,CAAC;AACrF,OAAO,QAAQ,MAAM,qDAAqD,CAAC;AAE3E,OAAO,IAAI,MAAM,wDAAwD,CAAC;AAC1E,OAAO,KAAK,MAAM,yDAAyD,CAAC;AAC5E,OAAO,WAAW,MAAM,sDAAsD,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AACnE,OAAO,0BAA0B,MAAM,iCAAiC,CAAC;AACzE,OAAO,sBAAsB,MAAM,6BAA6B,CAAC;AACjE,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,uCAAuC,CAAC;AAC/C,OAAO,wCAAwC,CAAC;AAEhD,OAAO,aAAa,MAAM,wDAAwD,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,SAAS;AACT,OAAO,qBAAqB,MAAM,8CAA8C,CAAC;AAEjF,MAAM,CAAN,IAAY,uCAGX;AAHD,WAAY,uCAAuC;IACjD,sDAAW,CAAA;IACX,4DAAiB,CAAA;AACnB,CAAC,EAHW,uCAAuC,KAAvC,uCAAuC,QAGlD;AAED,MAAM,CAAN,IAAY,+BAGX;AAHD,WAAY,+BAA+B;IACzC,kDAAe,CAAA;IACf,8CAAW,CAAA;AACb,CAAC,EAHW,+BAA+B,KAA/B,+BAA+B,QAG1C;AAED,MAAM,CAAN,IAAY,+BAGX;AAHD,WAAY,+BAA+B;IACzC,sDAAmB,CAAA;IACnB,oDAAiB,CAAA;AACnB,CAAC,EAHW,+BAA+B,KAA/B,+BAA+B,QAG1C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AAiBH,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,UAAU;IA6H7C;QACE,KAAK,EAAE,CAAC;QAzHV;;;;;;WAMG;QAED,mBAAc,GAAW,CAAC,CAAC,CAAC;QAE9B;;;;;WAKG;QAED,sBAAiB,GAAiD,uCAAuC,CAAC,GAAG,CAAC;QAEhH;;;;;WAKG;QAED,cAAS,GAAyC,+BAA+B,CAAC,KAAK,CAAC;QAE1F;;;;;WAKG;QAED,aAAQ,GAAY,KAAK,CAAC;QAE5B;;;;;WAKG;QAED,qBAAgB,GAAW,IAAI,CAAC;QAElC;;;;;WAKG;QAED,aAAQ,GAAW,MAAM,CAAC;QAE5B;;;;;;;;WAQG;QAED,cAAS,GAAyC,+BAA+B,CAAC,OAAO,CAAC;QAE5F;;WAEG;QAED,cAAS,GAAY,KAAK,CAAC;QAE7B;;WAEG;QAED,cAAS,GAAY,KAAK,CAAC;QA6C3B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,UAAU;QACR,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAEtD,IAAI,SAAS,EAAE,EAAE,CAAC;YAChB,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,oBAAoB,GAAG,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC,OAAO,CAAC;YAC3F,IAAI,oBAAoB,EAAE,CAAC;gBACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS;QACP,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACxD,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,aAAa;QACX,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,YAAY;QACV,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,QAAQ,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,eAAe;QACb,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAW,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;YACvE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,4EAA4E;QAC5E,2EAA2E;QAC3E,6EAA6E;QAC7E,4EAA4E;QAC5E,IAAI,WAAmB,CAAC;QACxB,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,cAAc,CAAC,CAAC;QACnF,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,WAAW,GAAG,aAAa,CAAC;QAC9B,CAAC;aAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YACzD,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC;QAElC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACjC,IAAI,CAAC,QAAQ,GAAG,KAAK,KAAK,WAAW,CAAC;YACtC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE;YAC5C,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC5B,CAAC;IAED,aAAa;QACX,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC1C,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAClC,CAAC;IACH,CAAC;IAED,YAAY;QACV,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAChC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAC/C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,iBAAiB;QACf,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,CAAa;QAC9B,MAAM,GAAG,GAAI,CAAC,CAAC,MAAsB,CAAC,OAAO,CAAc,cAAc,CAAC,CAAC;QAC3E,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAEO,WAAW,CAAC,KAAa;QAC/B,IAAI,KAAK,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3C,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,SAAS,KAAK,+BAA+B,CAAC,MAAM,CAAC;IACnE,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;IACtD,CAAC;CACF,CAAA;AArQG;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;8DAChB;AAS5B;IADD,QAAQ,EAAE;iEACqG;AAS9G;IADD,QAAQ,EAAE;yDAC+E;AASxF;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;wDACA;AAS1B;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gEACO;AAShC;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wDACC;AAY1B;IADD,QAAQ,EAAE;yDACiF;AAM1F;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;yDAClB;AAM3B;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;yDAClB;AAiB3B;IAND,IAAI,CAAC;QACJ,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,IAAI;QACf,eAAe,EAAE,IAAI;QACrB,uBAAuB,EAAE,IAAI;KAC9B,CAAC;qDAC4C;AAU5C;IADD,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;sDACC;AAW3B;IADD,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;qDACA;AAxHxB,sBAAsB;IAhB3B,aAAa,CAAC;QACb,GAAG,EAAE,0BAA0B;QAC/B,QAAQ,EAAE,WAAW;QACrB,MAAM,EAAE,qBAAqB;QAC7B,QAAQ,EAAE,0BAA0B;QACpC,YAAY,EAAE,CAAC,sBAAsB,EAAE,UAAU,CAAC;KACnD,CAAC;IAEF;;;;;OAKG;;IACF,KAAK,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;GAEjC,sBAAsB,CAkR3B;AAED,sBAAsB,CAAC,MAAM,EAAE,CAAC;AAEhC,eAAe,sBAAsB,CAAC","sourcesContent":["import UI5Element from \"@ui5/webcomponents-base/dist/UI5Element.js\";\nimport customElement from \"@ui5/webcomponents-base/dist/decorators/customElement.js\";\nimport property from \"@ui5/webcomponents-base/dist/decorators/property.js\";\nimport type { DefaultSlot, Slot } from \"@ui5/webcomponents-base/dist/UI5Element.js\";\nimport slot from \"@ui5/webcomponents-base/dist/decorators/slot-strict.js\";\nimport event from \"@ui5/webcomponents-base/dist/decorators/event-strict.js\";\nimport jsxRenderer from \"@ui5/webcomponents-base/dist/renderer/JsxRenderer.js\";\nimport { isDesktop } from \"@ui5/webcomponents-base/dist/Device.js\";\nimport AccordionSpotlightTemplate from \"./AccordionSpotlightTemplate.js\";\nimport AccordionSpotlightItem from \"./AccordionSpotlightItem.js\";\nimport UDExButton from \"./Button.js\";\nimport \"@ui5/webcomponents-icons/dist/play.js\";\nimport \"@ui5/webcomponents-icons/dist/pause.js\";\nimport type { ResizeObserverCallback } from \"@ui5/webcomponents-base/dist/delegate/ResizeHandler.js\";\nimport ResizeHandler from \"@ui5/webcomponents-base/dist/delegate/ResizeHandler.js\";\nimport { BreakpointUtils } from \"./utils/Breakpoints.js\";\n\n// Styles\nimport AccordionSpotlightCss from \"./generated/themes/AccordionSpotlight.css.js\";\n\nexport enum UDExAccordionSpotlightVerticalAlignment {\n Top = \"Top\",\n Center = \"Center\",\n}\n\nexport enum UDExAccordionSpotlightPlacement {\n Start = \"Start\",\n End = \"End\",\n}\n\nexport enum UDExAccordionSpotlightMediaMode {\n Dynamic = \"Dynamic\",\n Static = \"Static\",\n}\n\n/**\n * @class\n *\n * <h3 class=\"comment-api-title\">Overview</h3>\n *\n * Vertical accordion navigation with spotlight layout. Items are listed on the\n * left; the expanded panel is displayed on the right (desktop) or inline below\n * the heading (mobile). Follows the WAI-ARIA APG Accordion pattern.\n *\n * <h3>Usage</h3>\n *\n * For the <code>udex-accordion-spotlight</code>\n * <h3>ES6 Module Import</h3>\n *\n * <code>import \"@sapudex/web-components/dist/AccordionSpotlight.js\";</code>\n *\n * @constructor\n * @extends UI5Element\n * @public\n */\n@customElement({\n tag: \"udex-accordion-spotlight\",\n renderer: jsxRenderer,\n styles: AccordionSpotlightCss,\n template: AccordionSpotlightTemplate,\n dependencies: [AccordionSpotlightItem, UDExButton],\n})\n\n/**\n * Fired when the expanded item clicked.\n *\n * @public\n * @param {AccordionSpotlightItem} [item] The accordion spotlight item that was clicked\n */\n@event(\"item-click\", { bubbles: true })\n\nclass UDExAccordionSpotlight extends UI5Element {\n eventDetails!: {\n \"item-click\": { item: AccordionSpotlightItem },\n };\n\n /**\n * The index of the currently expanded item (0-based), or <code>-1</code> when\n * no item is expanded. Derived from items' <code>selected</code> attribute;\n * kept in sync by the parent.\n *\n * @private\n */\n @property({ type: Number, noAttribute: true })\n _selectedIndex: number = -1;\n\n /**\n * Vertical alignment of the navigation sidebar relative to the content panel.\n *\n * @default \"Top\"\n * @public\n */\n @property()\n verticalAlignment: `${UDExAccordionSpotlightVerticalAlignment}` = UDExAccordionSpotlightVerticalAlignment.Top;\n\n /**\n * Placement of the navigation sidebar — \"Start\" (left) or \"End\" (right).\n *\n * @default \"Start\"\n * @public\n */\n @property()\n placement: `${UDExAccordionSpotlightPlacement}` = UDExAccordionSpotlightPlacement.Start;\n\n /**\n * Enables automatic cycling through items on an interval.\n *\n * @default false\n * @public\n */\n @property({ type: Boolean })\n autoPlay: boolean = false;\n\n /**\n * Interval in milliseconds between automatic item advances. Applies only when autoPlay is enabled.\n *\n * @default 5000\n * @public\n */\n @property({ type: Number })\n autoPlayInterval: number = 5000;\n\n /**\n * Defines the width of the navigation panel.\n *\n * @default \"auto\"\n * @public\n */\n @property({ type: String })\n tabWidth: string = \"auto\";\n\n /**\n * Controls how the media area behaves. In <code>Static</code> mode a single\n * persistent media element (image or video) is displayed alongside the nav\n * list and never changes when items are expanded. In <code>Dynamic</code>\n * mode (default) each item provides its own content panel.\n *\n * @default \"Dynamic\"\n * @public\n */\n @property()\n mediaMode: `${UDExAccordionSpotlightMediaMode}` = UDExAccordionSpotlightMediaMode.Dynamic;\n\n /**\n * @private\n */\n @property({ type: Boolean, noAttribute: true })\n _isMobile: boolean = false;\n\n /**\n * @private\n */\n @property({ type: Boolean, noAttribute: true })\n _isPaused: boolean = false;\n\n /**\n * The slotted AccordionSpotlightItem elements.\n *\n * <code>invalidateOnChildChange</code> lets the component react when an item's\n * <code>selected</code> property is set programmatically, so\n * <code>item.selected = true</code> switches the expanded item at runtime.\n *\n * @public\n */\n @slot({\n type: HTMLElement,\n \"default\": true,\n individualSlots: true,\n invalidateOnChildChange: true,\n })\n items!: DefaultSlot<AccordionSpotlightItem>;\n\n /**\n * Defines optional content rendered below the navigation items.\n * Use to place a button or any action element beneath the items.\n *\n * @slot footer\n * @public\n */\n @slot({ type: HTMLElement })\n footer!: Slot<HTMLElement>;\n\n /**\n * Persistent media area shown in <code>Static</code> media mode.\n * Place an <code>&lt;img&gt;</code> or <code>&lt;video&gt;</code> element here;\n * it remains visible regardless of which item is currently expanded.\n *\n * @slot media\n * @public\n */\n @slot({ type: HTMLElement })\n media!: Slot<HTMLElement>;\n\n _handleResizeBound: ResizeObserverCallback;\n _autoPlayTimer?: number;\n\n constructor() {\n super();\n this._handleResizeBound = this._handleResize.bind(this);\n }\n\n onBeforeRendering() {\n this._syncItemStates();\n }\n\n onAfterRendering() {\n this._checkMobile();\n }\n\n onEnterDOM() {\n ResizeHandler.register(this, this._handleResizeBound);\n\n if (isDesktop()) {\n this.setAttribute(\"desktop\", \"\");\n }\n\n if (this.autoPlay) {\n const prefersReducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n if (prefersReducedMotion) {\n this._isPaused = true;\n } else {\n this._startAutoPlay();\n }\n }\n }\n\n onExitDOM() {\n ResizeHandler.deregister(this, this._handleResizeBound);\n this._stopAutoPlay();\n }\n\n _handleResize(): void {\n this._checkMobile();\n }\n\n _checkMobile() {\n const isMobile = BreakpointUtils.isAtMost(\"S\");\n if (isMobile !== this._isMobile) {\n this._isMobile = isMobile;\n }\n }\n\n _syncItemStates() {\n if (this.items.length === 0) {\n return;\n }\n\n const selectedIndexes = this.items.reduce<number[]>((acc, item, index) => {\n if (item.selected) {\n acc.push(index);\n }\n return acc;\n }, []);\n\n // Prefer a selected item that differs from the currently tracked index — it\n // signals a selection requested via `item.selected = true`. Otherwise keep\n // the current index if it is still selected. When no item is selected, leave\n // the component with no active item (-1) rather than forcing the first one.\n let activeIndex: number;\n const newlySelected = selectedIndexes.find(index => index !== this._selectedIndex);\n if (newlySelected !== undefined) {\n activeIndex = newlySelected;\n } else if (selectedIndexes.includes(this._selectedIndex)) {\n activeIndex = this._selectedIndex;\n } else {\n activeIndex = selectedIndexes[0] ?? -1;\n }\n\n this._selectedIndex = activeIndex;\n\n this.items.forEach((item, index) => {\n item.selected = index === activeIndex;\n item._isMobile = this._isMobile;\n });\n }\n\n _startAutoPlay(): void {\n this._stopAutoPlay();\n this._isPaused = false;\n this._autoPlayTimer = window.setInterval(() => {\n this._advanceItem();\n }, this.autoPlayInterval);\n }\n\n _stopAutoPlay(): void {\n if (this._autoPlayTimer !== undefined) {\n window.clearInterval(this._autoPlayTimer);\n this._autoPlayTimer = undefined;\n }\n }\n\n _advanceItem(): void {\n const count = this.items.length;\n if (count === 0) {\n return;\n }\n\n const next = (this._selectedIndex + 1) % count;\n this._selectItem(next);\n }\n\n onPlayButtonClick(): void {\n if (this._isPaused) {\n this._startAutoPlay();\n } else {\n this._stopAutoPlay();\n this._isPaused = true;\n }\n }\n\n handleNavItemClick(e: MouseEvent) {\n const btn = (e.target as HTMLElement).closest<HTMLElement>(\"[data-index]\");\n if (!btn) {\n return;\n }\n const index = Number.parseInt(btn.dataset.index!);\n this._selectItem(index);\n }\n\n private _selectItem(index: number) {\n if (index === this._selectedIndex) {\n return;\n }\n\n this._selectedIndex = index;\n this.items.forEach((item, i) => { item.selected = i === index; });\n const item = this.items[index];\n this.fireDecoratorEvent(\"item-click\", { item });\n }\n\n get playBtnIcon(): string {\n return this._isPaused ? \"play\" : \"pause\";\n }\n\n get showFooterSlot(): boolean {\n return this.footer?.length > 0;\n }\n\n get isStaticMedia(): boolean {\n return this.mediaMode === UDExAccordionSpotlightMediaMode.Static;\n }\n\n get showMediaSlot(): boolean {\n return this.isStaticMedia && this.media?.length > 0;\n }\n}\n\nUDExAccordionSpotlight.define();\n\nexport default UDExAccordionSpotlight;\n"]}
@@ -37,7 +37,9 @@ declare class UDExAccordionSpotlightItem extends UI5Element {
37
37
  subheading: string;
38
38
  /**
39
39
  * Whether this item is currently expanded.
40
- * Set on the element directly to control the initial selection.
40
+ * Set on the element directly to control the initial selection, or at runtime
41
+ * (<code>item.selected = true</code>) to expand this item programmatically —
42
+ * the parent deselects the other items automatically.
41
43
  *
42
44
  * @default false
43
45
  * @public
@@ -51,7 +51,9 @@ let UDExAccordionSpotlightItem = class UDExAccordionSpotlightItem extends UI5Ele
51
51
  this.subheading = "";
52
52
  /**
53
53
  * Whether this item is currently expanded.
54
- * Set on the element directly to control the initial selection.
54
+ * Set on the element directly to control the initial selection, or at runtime
55
+ * (<code>item.selected = true</code>) to expand this item programmatically —
56
+ * the parent deselects the other items automatically.
55
57
  *
56
58
  * @default false
57
59
  * @public
@@ -1 +1 @@
1
- {"version":3,"file":"AccordionSpotlightItem.js","sourceRoot":"","sources":["../src/AccordionSpotlightItem.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,UAAU,MAAM,4CAA4C,CAAC;AAEpE,OAAO,IAAI,MAAM,wDAAwD,CAAC;AAC1E,OAAO,aAAa,MAAM,0DAA0D,CAAC;AACrF,OAAO,QAAQ,MAAM,qDAAqD,CAAC;AAC3E,OAAO,WAAW,MAAM,sDAAsD,CAAC;AAE/E,OAAO,8BAA8B,MAAM,qCAAqC,CAAC;AAEjF,SAAS;AACT,OAAO,yBAAyB,MAAM,kDAAkD,CAAC;AAEzF;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,UAAU;IAAnD;;QACE;;;;;WAKG;QAED,YAAO,GAAW,EAAE,CAAC;QAEvB;;;;;WAKG;QAED,eAAU,GAAW,EAAE,CAAC;QAE1B;;;;;;WAMG;QAED,aAAQ,GAAY,KAAK,CAAC;QAE5B;;;;;WAKG;QAED,cAAS,GAAY,KAAK,CAAC;QAE7B;;;;WAIG;QAED,WAAM,GAAW,CAAC,CAAC;IA8BvB,CAAC;IAVC,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,YAAY;QACd,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;CACF,CAAA;AAlEG;IADD,QAAQ,EAAE;2DACY;AASrB;IADD,QAAQ,EAAE;8DACe;AAUxB;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;4DACA;AAS1B;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;6DAClB;AAQ3B;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;0DACzB;AAQnB;IADD,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;2DACR;AAU5B;IADD,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;wDACD;AA9DvB,0BAA0B;IAN/B,aAAa,CAAC;QACb,GAAG,EAAE,+BAA+B;QACpC,QAAQ,EAAE,WAAW;QACrB,MAAM,EAAE,yBAAyB;QACjC,QAAQ,EAAE,8BAA8B;KACzC,CAAC;GACI,0BAA0B,CA0E/B;AAED,0BAA0B,CAAC,MAAM,EAAE,CAAC;AAEpC,eAAe,0BAA0B,CAAC","sourcesContent":["import UI5Element from \"@ui5/webcomponents-base/dist/UI5Element.js\";\nimport type { DefaultSlot, Slot } from \"@ui5/webcomponents-base/dist/UI5Element.js\";\nimport slot from \"@ui5/webcomponents-base/dist/decorators/slot-strict.js\";\nimport customElement from \"@ui5/webcomponents-base/dist/decorators/customElement.js\";\nimport property from \"@ui5/webcomponents-base/dist/decorators/property.js\";\nimport jsxRenderer from \"@ui5/webcomponents-base/dist/renderer/JsxRenderer.js\";\n\nimport AccordionSpotlightItemTemplate from \"./AccordionSpotlightItemTemplate.js\";\n\n// Styles\nimport AccordionSpotlightItemCss from \"./generated/themes/AccordionSpotlightItem.css.js\";\n\n/**\n * @class\n *\n * <h3 class=\"comment-api-title\">Overview</h3>\n *\n * A single item within the <code>udex-accordion-spotlight</code> component.\n * Provides a heading button (<code>aria-expanded</code>) and an associated\n * content region (<code>role=\"region\"</code>).\n *\n * <h3>Usage</h3>\n *\n * For the <code>udex-accordion-spotlight-item</code>\n * <h3>ES6 Module Import</h3>\n *\n * <code>import \"@sapudex/web-components/dist/AccordionSpotlightItem.js\";</code>\n *\n * @constructor\n * @extends UI5Element\n * @public\n */\n@customElement({\n tag: \"udex-accordion-spotlight-item\",\n renderer: jsxRenderer,\n styles: AccordionSpotlightItemCss,\n template: AccordionSpotlightItemTemplate,\n})\nclass UDExAccordionSpotlightItem extends UI5Element {\n /**\n * The label text shown in the heading button.\n *\n * @default \"\"\n * @public\n */\n @property()\n heading: string = \"\";\n\n /**\n * Optional descriptive subtext visible when the item is expanded.\n *\n * @default \"\"\n * @public\n */\n @property()\n subheading: string = \"\";\n\n /**\n * Whether this item is currently expanded.\n * Set on the element directly to control the initial selection.\n *\n * @default false\n * @public\n */\n @property({ type: Boolean })\n selected: boolean = false;\n\n /**\n * Whether the parent is in mobile layout mode (managed by the parent component).\n *\n * @default false\n * @private\n */\n @property({ type: Boolean, noAttribute: true })\n _isMobile: boolean = false;\n\n /**\n * Zero-based index within the parent (managed by the parent component).\n *\n * @private\n */\n @property({ type: Number, noAttribute: true })\n _index: number = 0;\n\n /**\n * The slotted content for this item's panel.\n *\n * @public\n */\n @slot({ type: Node, \"default\": true })\n content!: DefaultSlot<Node>;\n\n /**\n * Defines the link(s) to be displayed in the tab header (vertical orientation only).\n * Use this slot to add one or more udex-link elements to the tab button.\n *\n * @slot link\n * @public\n */\n @slot({ type: HTMLElement })\n link!: Slot<HTMLElement>;\n\n get hasLinkSlot(): boolean {\n return this.link && this.link.length > 0;\n }\n\n get linkSlotHtml(): string {\n if (!this.link || this.link.length === 0) {\n return \"\";\n }\n return this.link.map(l => l.outerHTML).join(\"\");\n }\n}\n\nUDExAccordionSpotlightItem.define();\n\nexport default UDExAccordionSpotlightItem;\n"]}
1
+ {"version":3,"file":"AccordionSpotlightItem.js","sourceRoot":"","sources":["../src/AccordionSpotlightItem.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,UAAU,MAAM,4CAA4C,CAAC;AAEpE,OAAO,IAAI,MAAM,wDAAwD,CAAC;AAC1E,OAAO,aAAa,MAAM,0DAA0D,CAAC;AACrF,OAAO,QAAQ,MAAM,qDAAqD,CAAC;AAC3E,OAAO,WAAW,MAAM,sDAAsD,CAAC;AAE/E,OAAO,8BAA8B,MAAM,qCAAqC,CAAC;AAEjF,SAAS;AACT,OAAO,yBAAyB,MAAM,kDAAkD,CAAC;AAEzF;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,UAAU;IAAnD;;QACE;;;;;WAKG;QAED,YAAO,GAAW,EAAE,CAAC;QAEvB;;;;;WAKG;QAED,eAAU,GAAW,EAAE,CAAC;QAE1B;;;;;;;;WAQG;QAED,aAAQ,GAAY,KAAK,CAAC;QAE5B;;;;;WAKG;QAED,cAAS,GAAY,KAAK,CAAC;QAE7B;;;;WAIG;QAED,WAAM,GAAW,CAAC,CAAC;IA8BvB,CAAC;IAVC,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,YAAY;QACd,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;CACF,CAAA;AApEG;IADD,QAAQ,EAAE;2DACY;AASrB;IADD,QAAQ,EAAE;8DACe;AAYxB;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;4DACA;AAS1B;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;6DAClB;AAQ3B;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;0DACzB;AAQnB;IADD,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;2DACR;AAU5B;IADD,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;wDACD;AAhEvB,0BAA0B;IAN/B,aAAa,CAAC;QACb,GAAG,EAAE,+BAA+B;QACpC,QAAQ,EAAE,WAAW;QACrB,MAAM,EAAE,yBAAyB;QACjC,QAAQ,EAAE,8BAA8B;KACzC,CAAC;GACI,0BAA0B,CA4E/B;AAED,0BAA0B,CAAC,MAAM,EAAE,CAAC;AAEpC,eAAe,0BAA0B,CAAC","sourcesContent":["import UI5Element from \"@ui5/webcomponents-base/dist/UI5Element.js\";\nimport type { DefaultSlot, Slot } from \"@ui5/webcomponents-base/dist/UI5Element.js\";\nimport slot from \"@ui5/webcomponents-base/dist/decorators/slot-strict.js\";\nimport customElement from \"@ui5/webcomponents-base/dist/decorators/customElement.js\";\nimport property from \"@ui5/webcomponents-base/dist/decorators/property.js\";\nimport jsxRenderer from \"@ui5/webcomponents-base/dist/renderer/JsxRenderer.js\";\n\nimport AccordionSpotlightItemTemplate from \"./AccordionSpotlightItemTemplate.js\";\n\n// Styles\nimport AccordionSpotlightItemCss from \"./generated/themes/AccordionSpotlightItem.css.js\";\n\n/**\n * @class\n *\n * <h3 class=\"comment-api-title\">Overview</h3>\n *\n * A single item within the <code>udex-accordion-spotlight</code> component.\n * Provides a heading button (<code>aria-expanded</code>) and an associated\n * content region (<code>role=\"region\"</code>).\n *\n * <h3>Usage</h3>\n *\n * For the <code>udex-accordion-spotlight-item</code>\n * <h3>ES6 Module Import</h3>\n *\n * <code>import \"@sapudex/web-components/dist/AccordionSpotlightItem.js\";</code>\n *\n * @constructor\n * @extends UI5Element\n * @public\n */\n@customElement({\n tag: \"udex-accordion-spotlight-item\",\n renderer: jsxRenderer,\n styles: AccordionSpotlightItemCss,\n template: AccordionSpotlightItemTemplate,\n})\nclass UDExAccordionSpotlightItem extends UI5Element {\n /**\n * The label text shown in the heading button.\n *\n * @default \"\"\n * @public\n */\n @property()\n heading: string = \"\";\n\n /**\n * Optional descriptive subtext visible when the item is expanded.\n *\n * @default \"\"\n * @public\n */\n @property()\n subheading: string = \"\";\n\n /**\n * Whether this item is currently expanded.\n * Set on the element directly to control the initial selection, or at runtime\n * (<code>item.selected = true</code>) to expand this item programmatically —\n * the parent deselects the other items automatically.\n *\n * @default false\n * @public\n */\n @property({ type: Boolean })\n selected: boolean = false;\n\n /**\n * Whether the parent is in mobile layout mode (managed by the parent component).\n *\n * @default false\n * @private\n */\n @property({ type: Boolean, noAttribute: true })\n _isMobile: boolean = false;\n\n /**\n * Zero-based index within the parent (managed by the parent component).\n *\n * @private\n */\n @property({ type: Number, noAttribute: true })\n _index: number = 0;\n\n /**\n * The slotted content for this item's panel.\n *\n * @public\n */\n @slot({ type: Node, \"default\": true })\n content!: DefaultSlot<Node>;\n\n /**\n * Defines the link(s) to be displayed in the tab header (vertical orientation only).\n * Use this slot to add one or more udex-link elements to the tab button.\n *\n * @slot link\n * @public\n */\n @slot({ type: HTMLElement })\n link!: Slot<HTMLElement>;\n\n get hasLinkSlot(): boolean {\n return this.link && this.link.length > 0;\n }\n\n get linkSlotHtml(): string {\n if (!this.link || this.link.length === 0) {\n return \"\";\n }\n return this.link.map(l => l.outerHTML).join(\"\");\n }\n}\n\nUDExAccordionSpotlightItem.define();\n\nexport default UDExAccordionSpotlightItem;\n"]}
@@ -163,6 +163,7 @@ declare class UDExCarousel extends UI5Element {
163
163
  _calculateDisabledButtonsState(): void;
164
164
  _prevButtonClick(): void;
165
165
  _nextButtonClick(): void;
166
+ _navigateToPage(direction: 1 | -1): void;
166
167
  _onkeydown(e: KeyboardEvent): void;
167
168
  _handleNavigate(e: UI5CustomEvent<UI5Carousel, "navigate">): void;
168
169
  get nextPageText(): string;