@sapudex/web-components 2.60.0 → 2.62.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 (385) hide show
  1. package/cypress/specs/AccordionSpotlight.cy.tsx +43 -2
  2. package/cypress/specs/Carousel.cy.tsx +134 -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/SecondaryNavigationDesktop.cy.tsx +52 -3
  8. package/cypress/specs/SelectBox.cy.tsx +276 -136
  9. package/cypress/specs/SelectBoxAccessibility.cy.tsx +3109 -0
  10. package/cypress/specs/SideNavigation.cy.tsx +509 -0
  11. package/cypress/specs/Table.cy.tsx +90 -0
  12. package/cypress/specs/TagGroup.cy.tsx +168 -0
  13. package/cypress/support/component-imports.instrumented.ts +6 -0
  14. package/cypress/support/component-imports.src.ts +6 -0
  15. package/dist/AccordionSpotlight.d.ts +7 -2
  16. package/dist/AccordionSpotlight.js +31 -6
  17. package/dist/AccordionSpotlight.js.map +1 -1
  18. package/dist/AccordionSpotlightItem.d.ts +3 -1
  19. package/dist/AccordionSpotlightItem.js +3 -1
  20. package/dist/AccordionSpotlightItem.js.map +1 -1
  21. package/dist/Carousel.d.ts +2 -0
  22. package/dist/Carousel.js +35 -4
  23. package/dist/Carousel.js.map +1 -1
  24. package/dist/CountrySelector.js +1 -3
  25. package/dist/CountrySelector.js.map +1 -1
  26. package/dist/List.d.ts +2 -0
  27. package/dist/List.js +22 -4
  28. package/dist/List.js.map +1 -1
  29. package/dist/ListGroupHeader.js +5 -1
  30. package/dist/ListGroupHeader.js.map +1 -1
  31. package/dist/ListGroupHeaderBase.d.ts +2 -0
  32. package/dist/ListGroupHeaderBase.js +15 -2
  33. package/dist/ListGroupHeaderBase.js.map +1 -1
  34. package/dist/ListGroupHeaderTemplate.js +14 -22
  35. package/dist/ListGroupHeaderTemplate.js.map +1 -1
  36. package/dist/ListItem.d.ts +1 -2
  37. package/dist/ListItem.js +14 -12
  38. package/dist/ListItem.js.map +1 -1
  39. package/dist/ListItemBase.d.ts +5 -0
  40. package/dist/ListItemBase.js +11 -1
  41. package/dist/ListItemBase.js.map +1 -1
  42. package/dist/ListItemTemplate.js +1 -1
  43. package/dist/ListItemTemplate.js.map +1 -1
  44. package/dist/ListSelectAllTemplate.js +1 -1
  45. package/dist/ListSelectAllTemplate.js.map +1 -1
  46. package/dist/ListTemplate.js +2 -1
  47. package/dist/ListTemplate.js.map +1 -1
  48. package/dist/Pagination.d.ts +0 -1
  49. package/dist/Pagination.js +2 -2
  50. package/dist/Pagination.js.map +1 -1
  51. package/dist/Search.d.ts +13 -3
  52. package/dist/Search.js +36 -11
  53. package/dist/Search.js.map +1 -1
  54. package/dist/SearchableListBase.d.ts +2 -0
  55. package/dist/SearchableListBase.js +13 -3
  56. package/dist/SearchableListBase.js.map +1 -1
  57. package/dist/SearchableListBaseTemplate.js +42 -34
  58. package/dist/SearchableListBaseTemplate.js.map +1 -1
  59. package/dist/SecondaryNavigation.d.ts +2 -1
  60. package/dist/SecondaryNavigation.js.map +1 -1
  61. package/dist/SecondaryNavigationItem.js +12 -6
  62. package/dist/SecondaryNavigationItem.js.map +1 -1
  63. package/dist/SecondaryNavigationTemplate.js +1 -2
  64. package/dist/SecondaryNavigationTemplate.js.map +1 -1
  65. package/dist/SelectBase.d.ts +18 -33
  66. package/dist/SelectBase.js +125 -140
  67. package/dist/SelectBase.js.map +1 -1
  68. package/dist/SelectBox.d.ts +3 -0
  69. package/dist/SelectBox.js +19 -7
  70. package/dist/SelectBox.js.map +1 -1
  71. package/dist/SelectBoxTemplate.js +3 -3
  72. package/dist/SelectBoxTemplate.js.map +1 -1
  73. package/dist/SideNavigation.d.ts +23 -0
  74. package/dist/SideNavigation.js +39 -0
  75. package/dist/SideNavigation.js.map +1 -1
  76. package/dist/SideNavigationItem.d.ts +10 -0
  77. package/dist/SideNavigationItem.js +69 -0
  78. package/dist/SideNavigationItem.js.map +1 -1
  79. package/dist/SideNavigationItemTemplate.d.ts +2 -0
  80. package/dist/SideNavigationItemTemplate.js +15 -0
  81. package/dist/SideNavigationItemTemplate.js.map +1 -0
  82. package/dist/SideNavigationMobile.js +1 -2
  83. package/dist/SideNavigationMobile.js.map +1 -1
  84. package/dist/SideNavigationMobileTemplate.js +1 -1
  85. package/dist/SideNavigationMobileTemplate.js.map +1 -1
  86. package/dist/SideNavigationSubItem.d.ts +23 -0
  87. package/dist/SideNavigationSubItem.js +105 -1
  88. package/dist/SideNavigationSubItem.js.map +1 -1
  89. package/dist/SideNavigationSubItemTemplate.d.ts +2 -0
  90. package/dist/SideNavigationSubItemTemplate.js +9 -0
  91. package/dist/SideNavigationSubItemTemplate.js.map +1 -0
  92. package/dist/Table.js +1 -1
  93. package/dist/Table.js.map +1 -1
  94. package/dist/TableCell.d.ts +8 -2
  95. package/dist/TableCell.js +13 -11
  96. package/dist/TableCell.js.map +1 -1
  97. package/dist/TableCellBase.d.ts +2 -1
  98. package/dist/TableCellBase.js +9 -0
  99. package/dist/TableCellBase.js.map +1 -1
  100. package/dist/TableHeaderCell.d.ts +0 -1
  101. package/dist/TableHeaderCell.js +0 -4
  102. package/dist/TableHeaderCell.js.map +1 -1
  103. package/dist/TableRow.d.ts +10 -0
  104. package/dist/TableRow.js +23 -0
  105. package/dist/TableRow.js.map +1 -1
  106. package/dist/TagGroup.d.ts +3 -0
  107. package/dist/TagGroup.js +31 -0
  108. package/dist/TagGroup.js.map +1 -1
  109. package/dist/TagGroupTemplate.js +1 -1
  110. package/dist/TagGroupTemplate.js.map +1 -1
  111. package/dist/UploadItem.js +3 -4
  112. package/dist/UploadItem.js.map +1 -1
  113. package/dist/assets/{InputSuggestions-DyNcKgip.js → InputSuggestions-BPKrPqPb.js} +1 -1
  114. package/dist/assets/{ListItemStandardExpandableTextTemplate-qdKPzaOQ.js → ListItemStandardExpandableTextTemplate-DkdOcCxC.js} +1 -1
  115. package/dist/assets/{bundle.esm-sUYwSJOp.js → bundle.esm-17Yt5gDr.js} +234 -235
  116. package/dist/css/themes/AccordionSpotlight.css +1 -1
  117. package/dist/css/themes/Contact.css +1 -1
  118. package/dist/css/themes/EventRibbon.css +1 -1
  119. package/dist/css/themes/Feed.css +1 -1
  120. package/dist/css/themes/HeroBanner.css +1 -1
  121. package/dist/css/themes/ImageGridCloud.css +1 -1
  122. package/dist/css/themes/ImageGridTicker.css +1 -1
  123. package/dist/css/themes/ImageGridTickerItem.css +1 -1
  124. package/dist/css/themes/LinkList.css +1 -1
  125. package/dist/css/themes/ListGroupHeader.css +1 -1
  126. package/dist/css/themes/MastheadCountrySelector.css +1 -1
  127. package/dist/css/themes/MastheadItem.css +1 -1
  128. package/dist/css/themes/MastheadMenu.css +1 -1
  129. package/dist/css/themes/MastheadMenuItem.css +1 -1
  130. package/dist/css/themes/MastheadMobileMenu.css +1 -1
  131. package/dist/css/themes/MastheadProfileMenu.css +1 -1
  132. package/dist/css/themes/MastheadShell.css +1 -1
  133. package/dist/css/themes/MessageStrip.css +1 -1
  134. package/dist/css/themes/Modal.css +1 -1
  135. package/dist/css/themes/PromoTile.css +1 -1
  136. package/dist/css/themes/Quote.css +1 -1
  137. package/dist/css/themes/Review.css +1 -1
  138. package/dist/css/themes/ReviewItem.css +1 -1
  139. package/dist/css/themes/SecondaryNavigation.css +1 -1
  140. package/dist/css/themes/SecondaryNavigationItem.css +1 -1
  141. package/dist/css/themes/SelectBase.css +1 -1
  142. package/dist/css/themes/SideNavigation.css +1 -1
  143. package/dist/css/themes/SideNavigationItem.css +1 -1
  144. package/dist/css/themes/SideNavigationMobile.css +1 -1
  145. package/dist/css/themes/SideNavigationSubItem.css +1 -1
  146. package/dist/css/themes/TabNavigation.css +1 -1
  147. package/dist/css/themes/Table.css +1 -1
  148. package/dist/css/themes/TableCellBase.css +1 -1
  149. package/dist/css/themes/Upload.css +1 -1
  150. package/dist/css/themes/UploadItem.css +1 -1
  151. package/dist/custom-elements-internal.json +162 -19
  152. package/dist/custom-elements.json +151 -26
  153. package/dist/generated/i18n/i18n-defaults.d.ts +2 -1
  154. package/dist/generated/i18n/i18n-defaults.js +2 -1
  155. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  156. package/dist/generated/themes/AccordionSpotlight.css.d.ts +1 -1
  157. package/dist/generated/themes/AccordionSpotlight.css.js +1 -1
  158. package/dist/generated/themes/AccordionSpotlight.css.js.map +1 -1
  159. package/dist/generated/themes/Contact.css.d.ts +1 -1
  160. package/dist/generated/themes/Contact.css.js +1 -1
  161. package/dist/generated/themes/Contact.css.js.map +1 -1
  162. package/dist/generated/themes/EventRibbon.css.d.ts +1 -1
  163. package/dist/generated/themes/EventRibbon.css.js +1 -1
  164. package/dist/generated/themes/EventRibbon.css.js.map +1 -1
  165. package/dist/generated/themes/Feed.css.d.ts +1 -1
  166. package/dist/generated/themes/Feed.css.js +1 -1
  167. package/dist/generated/themes/Feed.css.js.map +1 -1
  168. package/dist/generated/themes/HeroBanner.css.d.ts +1 -1
  169. package/dist/generated/themes/HeroBanner.css.js +1 -1
  170. package/dist/generated/themes/HeroBanner.css.js.map +1 -1
  171. package/dist/generated/themes/ImageGridCloud.css.d.ts +1 -1
  172. package/dist/generated/themes/ImageGridCloud.css.js +1 -1
  173. package/dist/generated/themes/ImageGridCloud.css.js.map +1 -1
  174. package/dist/generated/themes/ImageGridTicker.css.d.ts +1 -1
  175. package/dist/generated/themes/ImageGridTicker.css.js +1 -1
  176. package/dist/generated/themes/ImageGridTicker.css.js.map +1 -1
  177. package/dist/generated/themes/ImageGridTickerItem.css.d.ts +1 -1
  178. package/dist/generated/themes/ImageGridTickerItem.css.js +1 -1
  179. package/dist/generated/themes/ImageGridTickerItem.css.js.map +1 -1
  180. package/dist/generated/themes/LinkList.css.d.ts +1 -1
  181. package/dist/generated/themes/LinkList.css.js +1 -1
  182. package/dist/generated/themes/LinkList.css.js.map +1 -1
  183. package/dist/generated/themes/ListGroupHeader.css.d.ts +1 -1
  184. package/dist/generated/themes/ListGroupHeader.css.js +1 -1
  185. package/dist/generated/themes/ListGroupHeader.css.js.map +1 -1
  186. package/dist/generated/themes/MastheadCountrySelector.css.d.ts +1 -1
  187. package/dist/generated/themes/MastheadCountrySelector.css.js +1 -1
  188. package/dist/generated/themes/MastheadCountrySelector.css.js.map +1 -1
  189. package/dist/generated/themes/MastheadItem.css.d.ts +1 -1
  190. package/dist/generated/themes/MastheadItem.css.js +1 -1
  191. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  192. package/dist/generated/themes/MastheadMenu.css.d.ts +1 -1
  193. package/dist/generated/themes/MastheadMenu.css.js +1 -1
  194. package/dist/generated/themes/MastheadMenu.css.js.map +1 -1
  195. package/dist/generated/themes/MastheadMenuItem.css.d.ts +1 -1
  196. package/dist/generated/themes/MastheadMenuItem.css.js +1 -1
  197. package/dist/generated/themes/MastheadMenuItem.css.js.map +1 -1
  198. package/dist/generated/themes/MastheadMobileMenu.css.d.ts +1 -1
  199. package/dist/generated/themes/MastheadMobileMenu.css.js +1 -1
  200. package/dist/generated/themes/MastheadMobileMenu.css.js.map +1 -1
  201. package/dist/generated/themes/MastheadProfileMenu.css.d.ts +1 -1
  202. package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
  203. package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
  204. package/dist/generated/themes/MastheadShell.css.d.ts +1 -1
  205. package/dist/generated/themes/MastheadShell.css.js +1 -1
  206. package/dist/generated/themes/MastheadShell.css.js.map +1 -1
  207. package/dist/generated/themes/MessageStrip.css.d.ts +1 -1
  208. package/dist/generated/themes/MessageStrip.css.js +1 -1
  209. package/dist/generated/themes/MessageStrip.css.js.map +1 -1
  210. package/dist/generated/themes/Modal.css.d.ts +1 -1
  211. package/dist/generated/themes/Modal.css.js +1 -1
  212. package/dist/generated/themes/Modal.css.js.map +1 -1
  213. package/dist/generated/themes/PromoTile.css.d.ts +1 -1
  214. package/dist/generated/themes/PromoTile.css.js +1 -1
  215. package/dist/generated/themes/PromoTile.css.js.map +1 -1
  216. package/dist/generated/themes/Quote.css.d.ts +1 -1
  217. package/dist/generated/themes/Quote.css.js +1 -1
  218. package/dist/generated/themes/Quote.css.js.map +1 -1
  219. package/dist/generated/themes/Review.css.d.ts +1 -1
  220. package/dist/generated/themes/Review.css.js +1 -1
  221. package/dist/generated/themes/Review.css.js.map +1 -1
  222. package/dist/generated/themes/ReviewItem.css.d.ts +1 -1
  223. package/dist/generated/themes/ReviewItem.css.js +1 -1
  224. package/dist/generated/themes/ReviewItem.css.js.map +1 -1
  225. package/dist/generated/themes/SecondaryNavigation.css.d.ts +1 -1
  226. package/dist/generated/themes/SecondaryNavigation.css.js +1 -1
  227. package/dist/generated/themes/SecondaryNavigation.css.js.map +1 -1
  228. package/dist/generated/themes/SecondaryNavigationItem.css.d.ts +1 -1
  229. package/dist/generated/themes/SecondaryNavigationItem.css.js +1 -1
  230. package/dist/generated/themes/SecondaryNavigationItem.css.js.map +1 -1
  231. package/dist/generated/themes/SelectBase.css.d.ts +1 -1
  232. package/dist/generated/themes/SelectBase.css.js +1 -1
  233. package/dist/generated/themes/SelectBase.css.js.map +1 -1
  234. package/dist/generated/themes/SideNavigation.css.d.ts +1 -1
  235. package/dist/generated/themes/SideNavigation.css.js +1 -1
  236. package/dist/generated/themes/SideNavigation.css.js.map +1 -1
  237. package/dist/generated/themes/SideNavigationItem.css.d.ts +1 -1
  238. package/dist/generated/themes/SideNavigationItem.css.js +1 -1
  239. package/dist/generated/themes/SideNavigationItem.css.js.map +1 -1
  240. package/dist/generated/themes/SideNavigationMobile.css.d.ts +1 -1
  241. package/dist/generated/themes/SideNavigationMobile.css.js +1 -1
  242. package/dist/generated/themes/SideNavigationMobile.css.js.map +1 -1
  243. package/dist/generated/themes/SideNavigationSubItem.css.d.ts +1 -1
  244. package/dist/generated/themes/SideNavigationSubItem.css.js +1 -1
  245. package/dist/generated/themes/SideNavigationSubItem.css.js.map +1 -1
  246. package/dist/generated/themes/TabNavigation.css.d.ts +1 -1
  247. package/dist/generated/themes/TabNavigation.css.js +1 -1
  248. package/dist/generated/themes/TabNavigation.css.js.map +1 -1
  249. package/dist/generated/themes/Table.css.d.ts +1 -1
  250. package/dist/generated/themes/Table.css.js +1 -1
  251. package/dist/generated/themes/Table.css.js.map +1 -1
  252. package/dist/generated/themes/TableCellBase.css.d.ts +1 -1
  253. package/dist/generated/themes/TableCellBase.css.js +1 -1
  254. package/dist/generated/themes/TableCellBase.css.js.map +1 -1
  255. package/dist/generated/themes/Upload.css.d.ts +1 -1
  256. package/dist/generated/themes/Upload.css.js +1 -1
  257. package/dist/generated/themes/Upload.css.js.map +1 -1
  258. package/dist/generated/themes/UploadItem.css.d.ts +1 -1
  259. package/dist/generated/themes/UploadItem.css.js +1 -1
  260. package/dist/generated/themes/UploadItem.css.js.map +1 -1
  261. package/dist/messagebundle.properties +3 -0
  262. package/dist/types/Table.d.ts +6 -2
  263. package/dist/types/Table.js +7 -2
  264. package/dist/types/Table.js.map +1 -1
  265. package/dist/vscode.html-custom-data.json +48 -7
  266. package/dist/web-types.json +88 -14
  267. package/package.json +1 -1
  268. package/run-cypress.js +8 -1
  269. package/src/AccordionSpotlight.ts +35 -6
  270. package/src/AccordionSpotlightItem.ts +3 -1
  271. package/src/Carousel.ts +39 -4
  272. package/src/CountrySelector.ts +1 -3
  273. package/src/List.ts +21 -4
  274. package/src/ListGroupHeader.ts +5 -1
  275. package/src/ListGroupHeaderBase.ts +16 -2
  276. package/src/ListGroupHeaderTemplate.tsx +29 -47
  277. package/src/ListItem.ts +14 -13
  278. package/src/ListItemBase.ts +14 -1
  279. package/src/ListItemTemplate.tsx +4 -4
  280. package/src/ListSelectAllTemplate.tsx +10 -8
  281. package/src/ListTemplate.tsx +14 -10
  282. package/src/Pagination.ts +2 -3
  283. package/src/Search.ts +48 -13
  284. package/src/SearchableListBase.ts +15 -3
  285. package/src/SearchableListBaseTemplate.tsx +51 -37
  286. package/src/SecondaryNavigation.ts +2 -1
  287. package/src/SecondaryNavigationItem.ts +14 -6
  288. package/src/SecondaryNavigationTemplate.tsx +4 -6
  289. package/src/SelectBase.ts +131 -145
  290. package/src/SelectBox.ts +21 -7
  291. package/src/SelectBoxTemplate.tsx +10 -9
  292. package/src/SideNavigation.ts +35 -0
  293. package/src/SideNavigationItem.ts +77 -0
  294. package/src/SideNavigationItemTemplate.tsx +97 -0
  295. package/src/SideNavigationMobile.ts +1 -2
  296. package/src/SideNavigationMobileTemplate.tsx +2 -1
  297. package/src/SideNavigationSubItem.ts +119 -2
  298. package/src/SideNavigationSubItemTemplate.tsx +57 -0
  299. package/src/Table.ts +1 -2
  300. package/src/TableCell.ts +9 -12
  301. package/src/TableCellBase.ts +10 -1
  302. package/src/TableHeaderCell.ts +0 -5
  303. package/src/TableRow.ts +20 -0
  304. package/src/TagGroup.ts +32 -0
  305. package/src/TagGroupTemplate.tsx +1 -1
  306. package/src/UploadItem.ts +3 -5
  307. package/src/generated/i18n/i18n-defaults.ts +2 -2
  308. package/src/generated/themes/AccordionSpotlight.css.ts +1 -1
  309. package/src/generated/themes/Contact.css.ts +1 -1
  310. package/src/generated/themes/EventRibbon.css.ts +1 -1
  311. package/src/generated/themes/Feed.css.ts +1 -1
  312. package/src/generated/themes/HeroBanner.css.ts +1 -1
  313. package/src/generated/themes/ImageGridCloud.css.ts +1 -1
  314. package/src/generated/themes/ImageGridTicker.css.ts +1 -1
  315. package/src/generated/themes/ImageGridTickerItem.css.ts +1 -1
  316. package/src/generated/themes/LinkList.css.ts +1 -1
  317. package/src/generated/themes/ListGroupHeader.css.ts +1 -1
  318. package/src/generated/themes/MastheadCountrySelector.css.ts +1 -1
  319. package/src/generated/themes/MastheadItem.css.ts +1 -1
  320. package/src/generated/themes/MastheadMenu.css.ts +1 -1
  321. package/src/generated/themes/MastheadMenuItem.css.ts +1 -1
  322. package/src/generated/themes/MastheadMobileMenu.css.ts +1 -1
  323. package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
  324. package/src/generated/themes/MastheadShell.css.ts +1 -1
  325. package/src/generated/themes/MessageStrip.css.ts +1 -1
  326. package/src/generated/themes/Modal.css.ts +1 -1
  327. package/src/generated/themes/PromoTile.css.ts +1 -1
  328. package/src/generated/themes/Quote.css.ts +1 -1
  329. package/src/generated/themes/Review.css.ts +1 -1
  330. package/src/generated/themes/ReviewItem.css.ts +1 -1
  331. package/src/generated/themes/SecondaryNavigation.css.ts +1 -1
  332. package/src/generated/themes/SecondaryNavigationItem.css.ts +1 -1
  333. package/src/generated/themes/SelectBase.css.ts +1 -1
  334. package/src/generated/themes/SideNavigation.css.ts +1 -1
  335. package/src/generated/themes/SideNavigationItem.css.ts +1 -1
  336. package/src/generated/themes/SideNavigationMobile.css.ts +1 -1
  337. package/src/generated/themes/SideNavigationSubItem.css.ts +1 -1
  338. package/src/generated/themes/TabNavigation.css.ts +1 -1
  339. package/src/generated/themes/Table.css.ts +1 -1
  340. package/src/generated/themes/TableCellBase.css.ts +1 -1
  341. package/src/generated/themes/Upload.css.ts +1 -1
  342. package/src/generated/themes/UploadItem.css.ts +1 -1
  343. package/src/i18n/messagebundle.properties +3 -0
  344. package/src/themes/AccordionSpotlight.css +11 -8
  345. package/src/themes/Contact.css +1 -1
  346. package/src/themes/EventRibbon.css +4 -4
  347. package/src/themes/Feed.css +2 -2
  348. package/src/themes/HeroBanner.css +3 -3
  349. package/src/themes/ImageGridCloud.css +1 -1
  350. package/src/themes/ImageGridTicker.css +1 -1
  351. package/src/themes/ImageGridTickerItem.css +1 -1
  352. package/src/themes/LinkList.css +4 -4
  353. package/src/themes/ListGroupHeader.css +2 -43
  354. package/src/themes/MastheadCountrySelector.css +1 -1
  355. package/src/themes/MastheadItem.css +4 -4
  356. package/src/themes/MastheadMenu.css +1 -1
  357. package/src/themes/MastheadMenuItem.css +1 -1
  358. package/src/themes/MastheadMobileMenu.css +2 -2
  359. package/src/themes/MastheadProfileMenu.css +1 -1
  360. package/src/themes/MastheadShell.css +4 -4
  361. package/src/themes/MessageStrip.css +7 -2
  362. package/src/themes/Modal.css +1 -1
  363. package/src/themes/PromoTile.css +4 -3
  364. package/src/themes/Quote.css +2 -2
  365. package/src/themes/Review.css +2 -2
  366. package/src/themes/ReviewItem.css +2 -2
  367. package/src/themes/SecondaryNavigation.css +1 -2
  368. package/src/themes/SecondaryNavigationItem.css +3 -6
  369. package/src/themes/SelectBase.css +1 -1
  370. package/src/themes/SideNavigation.css +31 -8
  371. package/src/themes/SideNavigationItem.css +100 -22
  372. package/src/themes/SideNavigationMobile.css +65 -20
  373. package/src/themes/SideNavigationSubItem.css +15 -54
  374. package/src/themes/TabNavigation.css +2 -2
  375. package/src/themes/Table.css +7 -2
  376. package/src/themes/TableCellBase.css +8 -0
  377. package/src/themes/Upload.css +1 -1
  378. package/src/themes/UploadItem.css +1 -1
  379. package/src/types/Table.ts +6 -2
  380. package/dist/css/themes/SideNavigationMobileDropdown.css +0 -1
  381. package/dist/generated/themes/SideNavigationMobileDropdown.css.d.ts +0 -2
  382. package/dist/generated/themes/SideNavigationMobileDropdown.css.js +0 -8
  383. package/dist/generated/themes/SideNavigationMobileDropdown.css.js.map +0 -1
  384. package/src/generated/themes/SideNavigationMobileDropdown.css.ts +0 -9
  385. package/src/themes/SideNavigationMobileDropdown.css +0 -29
@@ -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>);
@@ -59,6 +59,9 @@ import UDExReview from "../../instrumented/Review.js";
59
59
  import UDExReviewItem from "../../instrumented/ReviewItem.js";
60
60
  import UDExSecondaryNavigation from "../../instrumented/SecondaryNavigation.js";
61
61
  import UDExSelectBox from "../../instrumented/SelectBox.js";
62
+ import UDExSideNavigation from "../../instrumented/SideNavigation.js";
63
+ import UDExSideNavigationItem from "../../instrumented/SideNavigationItem.js";
64
+ import UDExSideNavigationSubItem from "../../instrumented/SideNavigationSubItem.js";
62
65
  import UDExSelectBoxGroupHeader from "../../instrumented/SelectBoxGroupHeader.js";
63
66
  import UDExSelectBoxItem from "../../instrumented/SelectBoxItem.js";
64
67
  import UDExSelectBoxSelectAll from "../../instrumented/SelectBoxSelectAll.js";
@@ -151,6 +154,9 @@ export {
151
154
  UDExReviewItem,
152
155
  UDExSecondaryNavigation,
153
156
  UDExSelectBox,
157
+ UDExSideNavigation,
158
+ UDExSideNavigationItem,
159
+ UDExSideNavigationSubItem,
154
160
  UDExSelectBoxGroupHeader,
155
161
  UDExSelectBoxItem,
156
162
  UDExSelectBoxSelectAll,
@@ -59,6 +59,9 @@ import UDExReview from "../../src/Review.js";
59
59
  import UDExReviewItem from "../../src/ReviewItem.js";
60
60
  import UDExSecondaryNavigation from "../../src/SecondaryNavigation.js";
61
61
  import UDExSelectBox from "../../src/SelectBox.js";
62
+ import UDExSideNavigation from "../../src/SideNavigation.js";
63
+ import UDExSideNavigationItem from "../../src/SideNavigationItem.js";
64
+ import UDExSideNavigationSubItem from "../../src/SideNavigationSubItem.js";
62
65
  import UDExSelectBoxGroupHeader from "../../src/SelectBoxGroupHeader.js";
63
66
  import UDExSelectBoxItem from "../../src/SelectBoxItem.js";
64
67
  import UDExSelectBoxSelectAll from "../../src/SelectBoxSelectAll.js";
@@ -151,6 +154,9 @@ export {
151
154
  UDExReviewItem,
152
155
  UDExSecondaryNavigation,
153
156
  UDExSelectBox,
157
+ UDExSideNavigation,
158
+ UDExSideNavigationItem,
159
+ UDExSideNavigationSubItem,
154
160
  UDExSelectBoxGroupHeader,
155
161
  UDExSelectBoxItem,
156
162
  UDExSelectBoxSelectAll,
@@ -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":"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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), 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"]}
@@ -146,6 +146,7 @@ declare class UDExCarousel extends UI5Element {
146
146
  _autoplayMinTimeBetweenToggle: number;
147
147
  _autoplayManualStop: boolean;
148
148
  _resizeHandler: ResizeObserverCallback;
149
+ _resizeRafHandle: number | null;
149
150
  constructor();
150
151
  onAfterRendering(): void;
151
152
  onExitDOM(): void;
@@ -162,6 +163,7 @@ declare class UDExCarousel extends UI5Element {
162
163
  _calculateDisabledButtonsState(): void;
163
164
  _prevButtonClick(): void;
164
165
  _nextButtonClick(): void;
166
+ _navigateToPage(direction: 1 | -1): void;
165
167
  _onkeydown(e: KeyboardEvent): void;
166
168
  _handleNavigate(e: UI5CustomEvent<UI5Carousel, "navigate">): void;
167
169
  get nextPageText(): string;
package/dist/Carousel.js CHANGED
@@ -123,6 +123,7 @@ let UDExCarousel = UDExCarousel_1 = class UDExCarousel extends UI5Element {
123
123
  this._autoplayLastToggle = Date.now();
124
124
  this._autoplayMinTimeBetweenToggle = 250;
125
125
  this._autoplayManualStop = false;
126
+ this._resizeRafHandle = null;
126
127
  this._autoplayLoop = () => {
127
128
  const items = this._carousel?.items;
128
129
  if (!items) {
@@ -151,6 +152,10 @@ let UDExCarousel = UDExCarousel_1 = class UDExCarousel extends UI5Element {
151
152
  }
152
153
  onExitDOM() {
153
154
  ResizeHandler.deregister(this, this._resizeHandler);
155
+ if (this._resizeRafHandle !== null) {
156
+ cancelAnimationFrame(this._resizeRafHandle);
157
+ this._resizeRafHandle = null;
158
+ }
154
159
  if (this._autoplayInterval) {
155
160
  clearInterval(this._autoplayInterval);
156
161
  }
@@ -159,7 +164,17 @@ let UDExCarousel = UDExCarousel_1 = class UDExCarousel extends UI5Element {
159
164
  ResizeHandler.register(this, this._resizeHandler);
160
165
  }
161
166
  _onResize() {
162
- this._hasManyPages = this._carousel?.hasManyPages ?? false;
167
+ if (this._resizeRafHandle !== null) {
168
+ cancelAnimationFrame(this._resizeRafHandle);
169
+ }
170
+ // Defer until after the inner UI5 carousel has processed its own resize
171
+ // (outer element's ResizeObserver fires before inner element's, so the inner
172
+ // carousel's effectiveItemsPerPage and _currentPageIndex are still stale here)
173
+ this._resizeRafHandle = requestAnimationFrame(() => {
174
+ this._resizeRafHandle = null;
175
+ this._hasManyPages = this._carousel?.hasManyPages ?? false;
176
+ this._calculateDisabledButtonsState();
177
+ });
163
178
  }
164
179
  _startAutoplay() {
165
180
  if (!this.autoplay) {
@@ -226,14 +241,30 @@ let UDExCarousel = UDExCarousel_1 = class UDExCarousel extends UI5Element {
226
241
  if (this.isPrevButtonDisabled || !this._carousel) {
227
242
  return;
228
243
  }
229
- this._carousel.navigateArrowLeft();
230
- this._calculateDisabledButtonsState();
244
+ this._navigateToPage(-1);
231
245
  }
232
246
  _nextButtonClick() {
233
247
  if (this.isNextButtonDisabled || !this._carousel) {
234
248
  return;
235
249
  }
236
- this._carousel.navigateArrowRight();
250
+ this._navigateToPage(1);
251
+ }
252
+ _navigateToPage(direction) {
253
+ const carousel = this._carousel;
254
+ if (!carousel) {
255
+ return;
256
+ }
257
+ let newPageIndex = carousel._currentPageIndex + direction;
258
+ if (this.cyclic) {
259
+ const lastPageIndex = carousel.items.length - carousel.effectiveItemsPerPage;
260
+ if (newPageIndex > lastPageIndex) {
261
+ newPageIndex = 0;
262
+ }
263
+ else if (newPageIndex < 0) {
264
+ newPageIndex = carousel.items.length - 1;
265
+ }
266
+ }
267
+ carousel._changePageIndex(newPageIndex);
237
268
  this._calculateDisabledButtonsState();
238
269
  }
239
270
  _onkeydown(e) {