@sapudex/web-components 2.59.0 → 2.61.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 (322) hide show
  1. package/cypress/specs/Carousel.cy.tsx +46 -0
  2. package/cypress/specs/SecondaryNavigationDesktop.cy.tsx +52 -3
  3. package/cypress/specs/SelectBox.cy.tsx +390 -252
  4. package/cypress/specs/SideNavigation.cy.tsx +509 -0
  5. package/cypress/specs/Table.cy.tsx +90 -0
  6. package/cypress/support/component-imports.instrumented.ts +6 -0
  7. package/cypress/support/component-imports.src.ts +6 -0
  8. package/dist/Carousel.d.ts +1 -0
  9. package/dist/Carousel.js +16 -1
  10. package/dist/Carousel.js.map +1 -1
  11. package/dist/ListGroupHeaderBase.js +9 -0
  12. package/dist/ListGroupHeaderBase.js.map +1 -1
  13. package/dist/ListGroupHeaderTemplate.js +15 -1
  14. package/dist/ListGroupHeaderTemplate.js.map +1 -1
  15. package/dist/MastheadCountrySelectorTemplate.js +1 -1
  16. package/dist/MastheadCountrySelectorTemplate.js.map +1 -1
  17. package/dist/Pagination.d.ts +0 -1
  18. package/dist/Pagination.js +2 -2
  19. package/dist/Pagination.js.map +1 -1
  20. package/dist/SearchableListBaseTemplate.js +0 -1
  21. package/dist/SearchableListBaseTemplate.js.map +1 -1
  22. package/dist/SecondaryNavigation.d.ts +2 -1
  23. package/dist/SecondaryNavigation.js.map +1 -1
  24. package/dist/SecondaryNavigationItem.js +12 -6
  25. package/dist/SecondaryNavigationItem.js.map +1 -1
  26. package/dist/SecondaryNavigationTemplate.js +1 -2
  27. package/dist/SecondaryNavigationTemplate.js.map +1 -1
  28. package/dist/SelectBase.d.ts +7 -2
  29. package/dist/SelectBase.js +27 -39
  30. package/dist/SelectBase.js.map +1 -1
  31. package/dist/SideNavigation.d.ts +23 -0
  32. package/dist/SideNavigation.js +39 -0
  33. package/dist/SideNavigation.js.map +1 -1
  34. package/dist/SideNavigationItem.d.ts +10 -0
  35. package/dist/SideNavigationItem.js +67 -0
  36. package/dist/SideNavigationItem.js.map +1 -1
  37. package/dist/SideNavigationMobileTemplate.js +1 -1
  38. package/dist/SideNavigationMobileTemplate.js.map +1 -1
  39. package/dist/SideNavigationSubItem.d.ts +23 -0
  40. package/dist/SideNavigationSubItem.js +103 -0
  41. package/dist/SideNavigationSubItem.js.map +1 -1
  42. package/dist/SideNavigationSubItemTemplate.d.ts +2 -0
  43. package/dist/SideNavigationSubItemTemplate.js +10 -0
  44. package/dist/SideNavigationSubItemTemplate.js.map +1 -0
  45. package/dist/Table.js +1 -1
  46. package/dist/Table.js.map +1 -1
  47. package/dist/TableCell.d.ts +8 -2
  48. package/dist/TableCell.js +13 -11
  49. package/dist/TableCell.js.map +1 -1
  50. package/dist/TableCellBase.d.ts +2 -1
  51. package/dist/TableCellBase.js +9 -0
  52. package/dist/TableCellBase.js.map +1 -1
  53. package/dist/TableHeaderCell.d.ts +0 -1
  54. package/dist/TableHeaderCell.js +0 -4
  55. package/dist/TableHeaderCell.js.map +1 -1
  56. package/dist/TableRow.d.ts +10 -0
  57. package/dist/TableRow.js +23 -0
  58. package/dist/TableRow.js.map +1 -1
  59. package/dist/UploadItem.js +3 -4
  60. package/dist/UploadItem.js.map +1 -1
  61. package/dist/assets/{InputSuggestions-CloTVyrf.js → InputSuggestions-1OnUn6pM.js} +1 -1
  62. package/dist/assets/{ListItemStandardExpandableTextTemplate-DpquSMb2.js → ListItemStandardExpandableTextTemplate-CoBAMp_v.js} +1 -1
  63. package/dist/assets/{bundle.esm-Cyz8a5IX.js → bundle.esm-BqaVWFKf.js} +233 -233
  64. package/dist/css/themes/AccordionSpotlight.css +1 -1
  65. package/dist/css/themes/Contact.css +1 -1
  66. package/dist/css/themes/EventRibbon.css +1 -1
  67. package/dist/css/themes/Feed.css +1 -1
  68. package/dist/css/themes/FeedItem.css +1 -1
  69. package/dist/css/themes/HeroBanner.css +1 -1
  70. package/dist/css/themes/ImageGridCloud.css +1 -1
  71. package/dist/css/themes/ImageGridTicker.css +1 -1
  72. package/dist/css/themes/ImageGridTickerItem.css +1 -1
  73. package/dist/css/themes/LinkList.css +1 -1
  74. package/dist/css/themes/ListGroupHeader.css +1 -1
  75. package/dist/css/themes/MastheadCountrySelector.css +1 -1
  76. package/dist/css/themes/MastheadItem.css +1 -1
  77. package/dist/css/themes/MastheadMenu.css +1 -1
  78. package/dist/css/themes/MastheadMenuItem.css +1 -1
  79. package/dist/css/themes/MastheadMobileMenu.css +1 -1
  80. package/dist/css/themes/MastheadProfileMenu.css +1 -1
  81. package/dist/css/themes/MastheadShell.css +1 -1
  82. package/dist/css/themes/MessageStrip.css +1 -1
  83. package/dist/css/themes/Modal.css +1 -1
  84. package/dist/css/themes/Pagination.css +1 -1
  85. package/dist/css/themes/PromoTile.css +1 -1
  86. package/dist/css/themes/Quote.css +1 -1
  87. package/dist/css/themes/Review.css +1 -1
  88. package/dist/css/themes/ReviewItem.css +1 -1
  89. package/dist/css/themes/SecondaryNavigation.css +1 -1
  90. package/dist/css/themes/SecondaryNavigationItem.css +1 -1
  91. package/dist/css/themes/SelectBase.css +1 -1
  92. package/dist/css/themes/SideNavigation.css +1 -1
  93. package/dist/css/themes/SideNavigationItem.css +1 -1
  94. package/dist/css/themes/SideNavigationMobile.css +1 -1
  95. package/dist/css/themes/SideNavigationMobileDropdown.css +1 -1
  96. package/dist/css/themes/SideNavigationSubItem.css +1 -1
  97. package/dist/css/themes/TabNavigation.css +1 -1
  98. package/dist/css/themes/Table.css +1 -1
  99. package/dist/css/themes/TableCellBase.css +1 -1
  100. package/dist/css/themes/Upload.css +1 -1
  101. package/dist/css/themes/UploadItem.css +1 -1
  102. package/dist/custom-elements-internal.json +155 -12
  103. package/dist/custom-elements.json +144 -19
  104. package/dist/generated/themes/AccordionSpotlight.css.d.ts +1 -1
  105. package/dist/generated/themes/AccordionSpotlight.css.js +1 -1
  106. package/dist/generated/themes/AccordionSpotlight.css.js.map +1 -1
  107. package/dist/generated/themes/Contact.css.d.ts +1 -1
  108. package/dist/generated/themes/Contact.css.js +1 -1
  109. package/dist/generated/themes/Contact.css.js.map +1 -1
  110. package/dist/generated/themes/EventRibbon.css.d.ts +1 -1
  111. package/dist/generated/themes/EventRibbon.css.js +1 -1
  112. package/dist/generated/themes/EventRibbon.css.js.map +1 -1
  113. package/dist/generated/themes/Feed.css.d.ts +1 -1
  114. package/dist/generated/themes/Feed.css.js +1 -1
  115. package/dist/generated/themes/Feed.css.js.map +1 -1
  116. package/dist/generated/themes/FeedItem.css.d.ts +1 -1
  117. package/dist/generated/themes/FeedItem.css.js +1 -1
  118. package/dist/generated/themes/FeedItem.css.js.map +1 -1
  119. package/dist/generated/themes/HeroBanner.css.d.ts +1 -1
  120. package/dist/generated/themes/HeroBanner.css.js +1 -1
  121. package/dist/generated/themes/HeroBanner.css.js.map +1 -1
  122. package/dist/generated/themes/ImageGridCloud.css.d.ts +1 -1
  123. package/dist/generated/themes/ImageGridCloud.css.js +1 -1
  124. package/dist/generated/themes/ImageGridCloud.css.js.map +1 -1
  125. package/dist/generated/themes/ImageGridTicker.css.d.ts +1 -1
  126. package/dist/generated/themes/ImageGridTicker.css.js +1 -1
  127. package/dist/generated/themes/ImageGridTicker.css.js.map +1 -1
  128. package/dist/generated/themes/ImageGridTickerItem.css.d.ts +1 -1
  129. package/dist/generated/themes/ImageGridTickerItem.css.js +1 -1
  130. package/dist/generated/themes/ImageGridTickerItem.css.js.map +1 -1
  131. package/dist/generated/themes/LinkList.css.d.ts +1 -1
  132. package/dist/generated/themes/LinkList.css.js +1 -1
  133. package/dist/generated/themes/LinkList.css.js.map +1 -1
  134. package/dist/generated/themes/ListGroupHeader.css.d.ts +1 -1
  135. package/dist/generated/themes/ListGroupHeader.css.js +1 -1
  136. package/dist/generated/themes/ListGroupHeader.css.js.map +1 -1
  137. package/dist/generated/themes/MastheadCountrySelector.css.d.ts +1 -1
  138. package/dist/generated/themes/MastheadCountrySelector.css.js +1 -1
  139. package/dist/generated/themes/MastheadCountrySelector.css.js.map +1 -1
  140. package/dist/generated/themes/MastheadItem.css.d.ts +1 -1
  141. package/dist/generated/themes/MastheadItem.css.js +1 -1
  142. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  143. package/dist/generated/themes/MastheadMenu.css.d.ts +1 -1
  144. package/dist/generated/themes/MastheadMenu.css.js +1 -1
  145. package/dist/generated/themes/MastheadMenu.css.js.map +1 -1
  146. package/dist/generated/themes/MastheadMenuItem.css.d.ts +1 -1
  147. package/dist/generated/themes/MastheadMenuItem.css.js +1 -1
  148. package/dist/generated/themes/MastheadMenuItem.css.js.map +1 -1
  149. package/dist/generated/themes/MastheadMobileMenu.css.d.ts +1 -1
  150. package/dist/generated/themes/MastheadMobileMenu.css.js +1 -1
  151. package/dist/generated/themes/MastheadMobileMenu.css.js.map +1 -1
  152. package/dist/generated/themes/MastheadProfileMenu.css.d.ts +1 -1
  153. package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
  154. package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
  155. package/dist/generated/themes/MastheadShell.css.d.ts +1 -1
  156. package/dist/generated/themes/MastheadShell.css.js +1 -1
  157. package/dist/generated/themes/MastheadShell.css.js.map +1 -1
  158. package/dist/generated/themes/MessageStrip.css.d.ts +1 -1
  159. package/dist/generated/themes/MessageStrip.css.js +1 -1
  160. package/dist/generated/themes/MessageStrip.css.js.map +1 -1
  161. package/dist/generated/themes/Modal.css.d.ts +1 -1
  162. package/dist/generated/themes/Modal.css.js +1 -1
  163. package/dist/generated/themes/Modal.css.js.map +1 -1
  164. package/dist/generated/themes/Pagination.css.d.ts +1 -1
  165. package/dist/generated/themes/Pagination.css.js +1 -1
  166. package/dist/generated/themes/Pagination.css.js.map +1 -1
  167. package/dist/generated/themes/PromoTile.css.d.ts +1 -1
  168. package/dist/generated/themes/PromoTile.css.js +1 -1
  169. package/dist/generated/themes/PromoTile.css.js.map +1 -1
  170. package/dist/generated/themes/Quote.css.d.ts +1 -1
  171. package/dist/generated/themes/Quote.css.js +1 -1
  172. package/dist/generated/themes/Quote.css.js.map +1 -1
  173. package/dist/generated/themes/Review.css.d.ts +1 -1
  174. package/dist/generated/themes/Review.css.js +1 -1
  175. package/dist/generated/themes/Review.css.js.map +1 -1
  176. package/dist/generated/themes/ReviewItem.css.d.ts +1 -1
  177. package/dist/generated/themes/ReviewItem.css.js +1 -1
  178. package/dist/generated/themes/ReviewItem.css.js.map +1 -1
  179. package/dist/generated/themes/SecondaryNavigation.css.d.ts +1 -1
  180. package/dist/generated/themes/SecondaryNavigation.css.js +1 -1
  181. package/dist/generated/themes/SecondaryNavigation.css.js.map +1 -1
  182. package/dist/generated/themes/SecondaryNavigationItem.css.d.ts +1 -1
  183. package/dist/generated/themes/SecondaryNavigationItem.css.js +1 -1
  184. package/dist/generated/themes/SecondaryNavigationItem.css.js.map +1 -1
  185. package/dist/generated/themes/SelectBase.css.d.ts +1 -1
  186. package/dist/generated/themes/SelectBase.css.js +1 -1
  187. package/dist/generated/themes/SelectBase.css.js.map +1 -1
  188. package/dist/generated/themes/SideNavigation.css.d.ts +1 -1
  189. package/dist/generated/themes/SideNavigation.css.js +1 -1
  190. package/dist/generated/themes/SideNavigation.css.js.map +1 -1
  191. package/dist/generated/themes/SideNavigationItem.css.d.ts +1 -1
  192. package/dist/generated/themes/SideNavigationItem.css.js +1 -1
  193. package/dist/generated/themes/SideNavigationItem.css.js.map +1 -1
  194. package/dist/generated/themes/SideNavigationMobile.css.d.ts +1 -1
  195. package/dist/generated/themes/SideNavigationMobile.css.js +1 -1
  196. package/dist/generated/themes/SideNavigationMobile.css.js.map +1 -1
  197. package/dist/generated/themes/SideNavigationMobileDropdown.css.d.ts +1 -1
  198. package/dist/generated/themes/SideNavigationMobileDropdown.css.js +1 -1
  199. package/dist/generated/themes/SideNavigationMobileDropdown.css.js.map +1 -1
  200. package/dist/generated/themes/SideNavigationSubItem.css.d.ts +1 -1
  201. package/dist/generated/themes/SideNavigationSubItem.css.js +1 -1
  202. package/dist/generated/themes/SideNavigationSubItem.css.js.map +1 -1
  203. package/dist/generated/themes/TabNavigation.css.d.ts +1 -1
  204. package/dist/generated/themes/TabNavigation.css.js +1 -1
  205. package/dist/generated/themes/TabNavigation.css.js.map +1 -1
  206. package/dist/generated/themes/Table.css.d.ts +1 -1
  207. package/dist/generated/themes/Table.css.js +1 -1
  208. package/dist/generated/themes/Table.css.js.map +1 -1
  209. package/dist/generated/themes/TableCellBase.css.d.ts +1 -1
  210. package/dist/generated/themes/TableCellBase.css.js +1 -1
  211. package/dist/generated/themes/TableCellBase.css.js.map +1 -1
  212. package/dist/generated/themes/Upload.css.d.ts +1 -1
  213. package/dist/generated/themes/Upload.css.js +1 -1
  214. package/dist/generated/themes/Upload.css.js.map +1 -1
  215. package/dist/generated/themes/UploadItem.css.d.ts +1 -1
  216. package/dist/generated/themes/UploadItem.css.js +1 -1
  217. package/dist/generated/themes/UploadItem.css.js.map +1 -1
  218. package/dist/types/Table.d.ts +6 -2
  219. package/dist/types/Table.js +7 -2
  220. package/dist/types/Table.js.map +1 -1
  221. package/dist/vscode.html-custom-data.json +44 -3
  222. package/dist/web-types.json +80 -6
  223. package/package.json +1 -1
  224. package/run-cypress.js +8 -1
  225. package/src/Carousel.ts +17 -1
  226. package/src/ListGroupHeaderBase.ts +9 -0
  227. package/src/ListGroupHeaderTemplate.tsx +15 -3
  228. package/src/MastheadCountrySelectorTemplate.tsx +3 -2
  229. package/src/Pagination.ts +2 -3
  230. package/src/SearchableListBaseTemplate.tsx +0 -1
  231. package/src/SecondaryNavigation.ts +2 -1
  232. package/src/SecondaryNavigationItem.ts +14 -6
  233. package/src/SecondaryNavigationTemplate.tsx +4 -6
  234. package/src/SelectBase.ts +30 -47
  235. package/src/SideNavigation.ts +35 -0
  236. package/src/SideNavigationItem.ts +75 -0
  237. package/src/SideNavigationMobileTemplate.tsx +2 -1
  238. package/src/SideNavigationSubItem.ts +117 -1
  239. package/src/SideNavigationSubItemTemplate.tsx +56 -0
  240. package/src/Table.ts +1 -2
  241. package/src/TableCell.ts +9 -12
  242. package/src/TableCellBase.ts +10 -1
  243. package/src/TableHeaderCell.ts +0 -5
  244. package/src/TableRow.ts +20 -0
  245. package/src/UploadItem.ts +3 -5
  246. package/src/generated/themes/AccordionSpotlight.css.ts +1 -1
  247. package/src/generated/themes/Contact.css.ts +1 -1
  248. package/src/generated/themes/EventRibbon.css.ts +1 -1
  249. package/src/generated/themes/Feed.css.ts +1 -1
  250. package/src/generated/themes/FeedItem.css.ts +1 -1
  251. package/src/generated/themes/HeroBanner.css.ts +1 -1
  252. package/src/generated/themes/ImageGridCloud.css.ts +1 -1
  253. package/src/generated/themes/ImageGridTicker.css.ts +1 -1
  254. package/src/generated/themes/ImageGridTickerItem.css.ts +1 -1
  255. package/src/generated/themes/LinkList.css.ts +1 -1
  256. package/src/generated/themes/ListGroupHeader.css.ts +1 -1
  257. package/src/generated/themes/MastheadCountrySelector.css.ts +1 -1
  258. package/src/generated/themes/MastheadItem.css.ts +1 -1
  259. package/src/generated/themes/MastheadMenu.css.ts +1 -1
  260. package/src/generated/themes/MastheadMenuItem.css.ts +1 -1
  261. package/src/generated/themes/MastheadMobileMenu.css.ts +1 -1
  262. package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
  263. package/src/generated/themes/MastheadShell.css.ts +1 -1
  264. package/src/generated/themes/MessageStrip.css.ts +1 -1
  265. package/src/generated/themes/Modal.css.ts +1 -1
  266. package/src/generated/themes/Pagination.css.ts +1 -1
  267. package/src/generated/themes/PromoTile.css.ts +1 -1
  268. package/src/generated/themes/Quote.css.ts +1 -1
  269. package/src/generated/themes/Review.css.ts +1 -1
  270. package/src/generated/themes/ReviewItem.css.ts +1 -1
  271. package/src/generated/themes/SecondaryNavigation.css.ts +1 -1
  272. package/src/generated/themes/SecondaryNavigationItem.css.ts +1 -1
  273. package/src/generated/themes/SelectBase.css.ts +1 -1
  274. package/src/generated/themes/SideNavigation.css.ts +1 -1
  275. package/src/generated/themes/SideNavigationItem.css.ts +1 -1
  276. package/src/generated/themes/SideNavigationMobile.css.ts +1 -1
  277. package/src/generated/themes/SideNavigationMobileDropdown.css.ts +1 -1
  278. package/src/generated/themes/SideNavigationSubItem.css.ts +1 -1
  279. package/src/generated/themes/TabNavigation.css.ts +1 -1
  280. package/src/generated/themes/Table.css.ts +1 -1
  281. package/src/generated/themes/TableCellBase.css.ts +1 -1
  282. package/src/generated/themes/Upload.css.ts +1 -1
  283. package/src/generated/themes/UploadItem.css.ts +1 -1
  284. package/src/themes/AccordionSpotlight.css +4 -1
  285. package/src/themes/Contact.css +1 -1
  286. package/src/themes/EventRibbon.css +4 -4
  287. package/src/themes/Feed.css +2 -2
  288. package/src/themes/FeedItem.css +2 -1
  289. package/src/themes/HeroBanner.css +3 -3
  290. package/src/themes/ImageGridCloud.css +1 -1
  291. package/src/themes/ImageGridTicker.css +1 -1
  292. package/src/themes/ImageGridTickerItem.css +1 -1
  293. package/src/themes/LinkList.css +4 -4
  294. package/src/themes/ListGroupHeader.css +6 -4
  295. package/src/themes/MastheadCountrySelector.css +1 -1
  296. package/src/themes/MastheadItem.css +4 -4
  297. package/src/themes/MastheadMenu.css +1 -1
  298. package/src/themes/MastheadMenuItem.css +1 -1
  299. package/src/themes/MastheadMobileMenu.css +2 -2
  300. package/src/themes/MastheadProfileMenu.css +1 -1
  301. package/src/themes/MastheadShell.css +4 -4
  302. package/src/themes/MessageStrip.css +7 -2
  303. package/src/themes/Modal.css +1 -1
  304. package/src/themes/Pagination.css +14 -5
  305. package/src/themes/PromoTile.css +4 -3
  306. package/src/themes/Quote.css +2 -2
  307. package/src/themes/Review.css +2 -2
  308. package/src/themes/ReviewItem.css +2 -2
  309. package/src/themes/SecondaryNavigation.css +1 -2
  310. package/src/themes/SecondaryNavigationItem.css +3 -6
  311. package/src/themes/SelectBase.css +1 -1
  312. package/src/themes/SideNavigation.css +31 -8
  313. package/src/themes/SideNavigationItem.css +46 -18
  314. package/src/themes/SideNavigationMobile.css +6 -7
  315. package/src/themes/SideNavigationMobileDropdown.css +10 -3
  316. package/src/themes/SideNavigationSubItem.css +73 -17
  317. package/src/themes/TabNavigation.css +2 -2
  318. package/src/themes/Table.css +1 -1
  319. package/src/themes/TableCellBase.css +8 -0
  320. package/src/themes/Upload.css +1 -1
  321. package/src/themes/UploadItem.css +1 -1
  322. package/src/types/Table.ts +6 -2
@@ -3312,7 +3312,14 @@
3312
3312
  {
3313
3313
  "name": "max-dropdown-height",
3314
3314
  "description": "Defines the height of the dropdown opened on mobile screen.",
3315
- "values": []
3315
+ "values": [
3316
+ { "name": "`${number}px`" },
3317
+ { "name": "`${number}vh`" },
3318
+ { "name": "`${number}vw`" },
3319
+ { "name": "`${number}rem`" },
3320
+ { "name": "`${number}em`" },
3321
+ { "name": "`${number}%`" }
3322
+ ]
3316
3323
  },
3317
3324
  {
3318
3325
  "name": "mobile-menu-opener-aria-label",
@@ -3947,6 +3954,16 @@
3947
3954
  "name": "is-fixed-in-place",
3948
3955
  "description": "Defines if Side Navigation is fixed in place or scrollable with the content.",
3949
3956
  "values": []
3957
+ },
3958
+ {
3959
+ "name": "placement",
3960
+ "description": "Defines which side the navigation panel is on.",
3961
+ "values": [{ "name": "Left" }, { "name": "Right" }]
3962
+ },
3963
+ {
3964
+ "name": "variant",
3965
+ "description": "Defines the variant of the component.",
3966
+ "values": [{ "name": "Full" }, { "name": "Content" }]
3950
3967
  }
3951
3968
  ],
3952
3969
  "references": []
@@ -3971,8 +3988,14 @@
3971
3988
  },
3972
3989
  {
3973
3990
  "name": "udex-side-navigation-sub-item",
3974
- "description": "<h3 class=\"comment-api-title\">Overview</h3>\n\n\n<h3>Usage</h3>\n\nFor the <code>udex-side-navigation-sub-item</code>\n<h3>ES6 Module Import</h3>\n\n<code>import \"@sapudex/web-components/dist/SideNavigationSubItem.js\";</code>\n---\n",
3975
- "attributes": [],
3991
+ "description": "<h3 class=\"comment-api-title\">Overview</h3>\n\n\n<h3>Usage</h3>\n\nFor the <code>udex-side-navigation-sub-item</code>\n<h3>ES6 Module Import</h3>\n\n<code>import \"@sapudex/web-components/dist/SideNavigationSubItem.js\";</code>\n---\n\n\n### **Slots:**\n - **default** - Defines the level-3 sub-items slotted inside this sub-item.",
3992
+ "attributes": [
3993
+ {
3994
+ "name": "expanded",
3995
+ "description": "Defines whether the sub-item is expanded (shows level-3 children).",
3996
+ "values": []
3997
+ }
3998
+ ],
3976
3999
  "references": []
3977
4000
  },
3978
4001
  {
@@ -4409,6 +4432,15 @@
4409
4432
  "name": "icon",
4410
4433
  "description": "Defines the name of the UI5 Icon, that will be displayed at the beginning of the content.",
4411
4434
  "values": []
4435
+ },
4436
+ {
4437
+ "name": "vertical-align",
4438
+ "description": "Determines the vertical alignment of the cell content.",
4439
+ "values": [
4440
+ { "name": "Top" },
4441
+ { "name": "Center" },
4442
+ { "name": "Bottom" }
4443
+ ]
4412
4444
  }
4413
4445
  ],
4414
4446
  "references": []
@@ -4487,6 +4519,15 @@
4487
4519
  "name": "interactive",
4488
4520
  "description": "Defines the interactive state of the row.",
4489
4521
  "values": []
4522
+ },
4523
+ {
4524
+ "name": "vertical-align",
4525
+ "description": "Determines the vertical alignment of all cells in the row.\nApplies to every cell that does not define its own verticalAlign.",
4526
+ "values": [
4527
+ { "name": "Top" },
4528
+ { "name": "Center" },
4529
+ { "name": "Bottom" }
4530
+ ]
4490
4531
  }
4491
4532
  ],
4492
4533
  "references": []
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
3
3
  "name": "@sapudex/web-components",
4
- "version": "2.59.0",
4
+ "version": "2.61.0",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
@@ -7687,7 +7687,9 @@
7687
7687
  {
7688
7688
  "name": "max-dropdown-height",
7689
7689
  "description": "Defines the height of the dropdown opened on mobile screen.",
7690
- "value": { "type": "string" }
7690
+ "value": {
7691
+ "type": "`${number}px` | `${number}vh` | `${number}vw` | `${number}rem` | `${number}em` | `${number}%`"
7692
+ }
7691
7693
  },
7692
7694
  {
7693
7695
  "name": "mobile-menu-opener-aria-label",
@@ -7733,7 +7735,9 @@
7733
7735
  {
7734
7736
  "name": "max-dropdown-height",
7735
7737
  "description": "Defines the height of the dropdown opened on mobile screen.",
7736
- "value": { "type": "string" }
7738
+ "value": {
7739
+ "type": "`${number}px` | `${number}vh` | `${number}vw` | `${number}rem` | `${number}em` | `${number}%`"
7740
+ }
7737
7741
  },
7738
7742
  {
7739
7743
  "name": "mobile-menu-opener-aria-label",
@@ -9133,6 +9137,19 @@
9133
9137
  "name": "is-fixed-in-place",
9134
9138
  "description": "Defines if Side Navigation is fixed in place or scrollable with the content.",
9135
9139
  "value": { "type": "boolean", "default": "false" }
9140
+ },
9141
+ {
9142
+ "name": "placement",
9143
+ "description": "Defines which side the navigation panel is on.",
9144
+ "value": { "type": "\"Left\" | \"Right\"", "default": "\"Left\"" }
9145
+ },
9146
+ {
9147
+ "name": "variant",
9148
+ "description": "Defines the variant of the component.",
9149
+ "value": {
9150
+ "type": "\"Full\" | \"Content\"",
9151
+ "default": "\"Full\""
9152
+ }
9136
9153
  }
9137
9154
  ],
9138
9155
  "events": [],
@@ -9142,6 +9159,16 @@
9142
9159
  "name": "is-fixed-in-place",
9143
9160
  "description": "Defines if Side Navigation is fixed in place or scrollable with the content.",
9144
9161
  "value": { "type": "boolean" }
9162
+ },
9163
+ {
9164
+ "name": "placement",
9165
+ "description": "Defines which side the navigation panel is on.",
9166
+ "value": { "type": "\"Left\" | \"Right\"" }
9167
+ },
9168
+ {
9169
+ "name": "variant",
9170
+ "description": "Defines the variant of the component.",
9171
+ "value": { "type": "\"Full\" | \"Content\"" }
9145
9172
  }
9146
9173
  ],
9147
9174
  "events": []
@@ -9183,11 +9210,32 @@
9183
9210
  },
9184
9211
  {
9185
9212
  "name": "udex-side-navigation-sub-item",
9186
- "description": "<h3 class=\"comment-api-title\">Overview</h3>\n\n\n<h3>Usage</h3>\n\nFor the <code>udex-side-navigation-sub-item</code>\n<h3>ES6 Module Import</h3>\n\n<code>import \"@sapudex/web-components/dist/SideNavigationSubItem.js\";</code>\n---\n",
9213
+ "description": "<h3 class=\"comment-api-title\">Overview</h3>\n\n\n<h3>Usage</h3>\n\nFor the <code>udex-side-navigation-sub-item</code>\n<h3>ES6 Module Import</h3>\n\n<code>import \"@sapudex/web-components/dist/SideNavigationSubItem.js\";</code>\n---\n\n\n### **Slots:**\n - **default** - Defines the level-3 sub-items slotted inside this sub-item.",
9187
9214
  "doc-url": "",
9188
- "attributes": [],
9215
+ "attributes": [
9216
+ {
9217
+ "name": "expanded",
9218
+ "description": "Defines whether the sub-item is expanded (shows level-3 children).",
9219
+ "value": { "type": "boolean", "default": "false" }
9220
+ }
9221
+ ],
9222
+ "slots": [
9223
+ {
9224
+ "name": "default",
9225
+ "description": "Defines the level-3 sub-items slotted inside this sub-item."
9226
+ }
9227
+ ],
9189
9228
  "events": [],
9190
- "js": { "properties": [], "events": [] }
9229
+ "js": {
9230
+ "properties": [
9231
+ {
9232
+ "name": "expanded",
9233
+ "description": "Defines whether the sub-item is expanded (shows level-3 children).",
9234
+ "value": { "type": "boolean" }
9235
+ }
9236
+ ],
9237
+ "events": []
9238
+ }
9191
9239
  },
9192
9240
  {
9193
9241
  "name": "udex-slider",
@@ -10088,6 +10136,14 @@
10088
10136
  "name": "icon",
10089
10137
  "description": "Defines the name of the UI5 Icon, that will be displayed at the beginning of the content.",
10090
10138
  "value": { "type": "string | undefined", "default": "undefined" }
10139
+ },
10140
+ {
10141
+ "name": "vertical-align",
10142
+ "description": "Determines the vertical alignment of the cell content.",
10143
+ "value": {
10144
+ "type": "\"Top\" | \"Center\" | \"Bottom\"",
10145
+ "default": "\"Center\""
10146
+ }
10091
10147
  }
10092
10148
  ],
10093
10149
  "slots": [
@@ -10110,6 +10166,11 @@
10110
10166
  "name": "icon",
10111
10167
  "description": "Defines the name of the UI5 Icon, that will be displayed at the beginning of the content.",
10112
10168
  "value": { "type": "string | undefined" }
10169
+ },
10170
+ {
10171
+ "name": "vertical-align",
10172
+ "description": "Determines the vertical alignment of the cell content.",
10173
+ "value": { "type": "\"Top\" | \"Center\" | \"Bottom\"" }
10113
10174
  }
10114
10175
  ],
10115
10176
  "events": []
@@ -10256,6 +10317,14 @@
10256
10317
  "name": "interactive",
10257
10318
  "description": "Defines the interactive state of the row.",
10258
10319
  "value": { "type": "boolean | undefined", "default": "false" }
10320
+ },
10321
+ {
10322
+ "name": "vertical-align",
10323
+ "description": "Determines the vertical alignment of all cells in the row.\nApplies to every cell that does not define its own verticalAlign.",
10324
+ "value": {
10325
+ "type": "\"Top\" | \"Center\" | \"Bottom\"",
10326
+ "default": "\"Center\""
10327
+ }
10259
10328
  }
10260
10329
  ],
10261
10330
  "slots": [
@@ -10276,6 +10345,11 @@
10276
10345
  "name": "interactive",
10277
10346
  "description": "Defines the interactive state of the row.",
10278
10347
  "value": { "type": "boolean | undefined" }
10348
+ },
10349
+ {
10350
+ "name": "vertical-align",
10351
+ "description": "Determines the vertical alignment of all cells in the row.\nApplies to every cell that does not define its own verticalAlign.",
10352
+ "value": { "type": "\"Top\" | \"Center\" | \"Bottom\"" }
10279
10353
  }
10280
10354
  ],
10281
10355
  "events": []
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@sapudex/web-components",
4
- "version": "2.59.0",
4
+ "version": "2.61.0",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
7
7
  },
package/run-cypress.js CHANGED
@@ -9,4 +9,11 @@ const specArg = inputSpec
9
9
 
10
10
  const command = `npx cypress run --component --browser chrome ${specArg}`;
11
11
 
12
- execSync(command, { stdio: "inherit" });
12
+ // ELECTRON_RUN_AS_NODE is set by VS Code / Claude Code and causes the Cypress
13
+ // Electron binary to start as a plain Node process instead of an Electron app,
14
+ // breaking its internal path resolution. Remove it so Cypress starts correctly
15
+ // regardless of whether this script is invoked from an IDE terminal or a shell.
16
+ const env = { ...process.env };
17
+ delete env.ELECTRON_RUN_AS_NODE;
18
+
19
+ execSync(command, { stdio: "inherit", env });
package/src/Carousel.ts CHANGED
@@ -219,6 +219,7 @@ class UDExCarousel extends UI5Element {
219
219
  _autoplayMinTimeBetweenToggle = 250;
220
220
  _autoplayManualStop = false;
221
221
  _resizeHandler: ResizeObserverCallback;
222
+ _resizeRafHandle: number | null = null;
222
223
 
223
224
  constructor() {
224
225
  super();
@@ -238,6 +239,11 @@ class UDExCarousel extends UI5Element {
238
239
  onExitDOM(): void {
239
240
  ResizeHandler.deregister(this, this._resizeHandler);
240
241
 
242
+ if (this._resizeRafHandle !== null) {
243
+ cancelAnimationFrame(this._resizeRafHandle);
244
+ this._resizeRafHandle = null;
245
+ }
246
+
241
247
  if (this._autoplayInterval) {
242
248
  clearInterval(this._autoplayInterval);
243
249
  }
@@ -248,7 +254,17 @@ class UDExCarousel extends UI5Element {
248
254
  }
249
255
 
250
256
  _onResize(): void {
251
- this._hasManyPages = this._carousel?.hasManyPages ?? false;
257
+ if (this._resizeRafHandle !== null) {
258
+ cancelAnimationFrame(this._resizeRafHandle);
259
+ }
260
+ // Defer until after the inner UI5 carousel has processed its own resize
261
+ // (outer element's ResizeObserver fires before inner element's, so the inner
262
+ // carousel's effectiveItemsPerPage and _currentPageIndex are still stale here)
263
+ this._resizeRafHandle = requestAnimationFrame(() => {
264
+ this._resizeRafHandle = null;
265
+ this._hasManyPages = this._carousel?.hasManyPages ?? false;
266
+ this._calculateDisabledButtonsState();
267
+ });
252
268
  }
253
269
 
254
270
  _autoplayLoop = () => {
@@ -233,6 +233,15 @@ class UDExListGroupHeaderBase extends UDExListItemBase {
233
233
  }
234
234
 
235
235
  get singleCollapsibleHeaderRole(): string {
236
+ // In aria-activedescendant mode (SelectBox/CountrySelector) the HOST element
237
+ // carries the treeitem role + state (set via SearchableListBaseTemplate's
238
+ // hostAriaAttrs). The inner focusable div must then be presentational, otherwise
239
+ // it is a second treeitem nested inside the host treeitem with no owning
240
+ // tree/group — the "role not inside the required context" axe/SiteImprove error.
241
+ // Mirrors UDExListItem.roleItem, which is presentational under _useHostAriaRole.
242
+ if (this._useHostAriaRole) {
243
+ return "presentation";
244
+ }
236
245
  return this._treeMode ? "treeitem" : "button";
237
246
  }
238
247
 
@@ -85,6 +85,20 @@ function SingleGroupHeaderCollapsible(this: UDExListGroupHeader) {
85
85
  // (aria-activedescendant, _useHostAriaRole) and non-tree modes, which keep the flat
86
86
  // structure with the content region emitted as a sibling by the template body.
87
87
  const nested = this.isTreeAccessibleRole && !this._useHostAriaRole;
88
+ // In aria-activedescendant mode (SelectBox) the HOST element is the treeitem and
89
+ // already carries aria-expanded + the accessible name. This inner div must then be
90
+ // presentational (singleCollapsibleHeaderRole) and must NOT duplicate those states,
91
+ // otherwise it is a second treeitem nested inside the host treeitem with no owning
92
+ // tree/group (axe/SiteImprove aria-required-parent). It stays focusable, though:
93
+ // clicking the collapsible-header body relies on it receiving DOM focus to redirect
94
+ // focus back to the combobox input — the same focusable, role="presentation" shape
95
+ // the list-item [part=item] divs already use. The real-focus (FilterMenu) path keeps
96
+ // the treeitem semantics plus controls/labelling on this div.
97
+ const headerAriaAttrs = this._useHostAriaRole ? {} : {
98
+ "aria-expanded": this.expanded,
99
+ "aria-controls": this.ariaControlsId,
100
+ "aria-labelledby": this.collapsibleHeaderLabelledBy,
101
+ };
88
102
  return (
89
103
  <div
90
104
  class={`udex-list__group-content ${nested ? "udex-list__group-content--nested " : ""}udex-list__group-header-wrap ${this.sizeClass}`}
@@ -93,9 +107,7 @@ function SingleGroupHeaderCollapsible(this: UDExListGroupHeader) {
93
107
  role={this.singleCollapsibleHeaderRole as AriaRole}
94
108
  tabIndex={0}
95
109
  onKeyDown={this.handleKeyDown}
96
- aria-expanded={this.expanded}
97
- aria-controls={this.ariaControlsId}
98
- aria-labelledby={this.collapsibleHeaderLabelledBy}
110
+ {...headerAriaAttrs}
99
111
  _tab-index={Number(this._effectiveTabIndex)}>
100
112
  {nested ? (
101
113
  <>
@@ -45,12 +45,13 @@ function activeRegionView(this: UDExMastheadCountrySelector) {
45
45
  )}
46
46
  <div class="udex-masthead-country-selector__list-container">
47
47
  <div class="udex-masthead-country-selector__list-wrap" onScroll={this.handleCountryListShadowVisible}>
48
- <ul class="udex-masthead-country-selector__list udex-masthead-country-selector__list_countries" role="menu">
48
+ <ul class="udex-masthead-country-selector__list udex-masthead-country-selector__list_countries">
49
49
  {this._activeCountries.map((country, index) => (
50
- <li role="none" key={index}>
50
+ <li key={index}>
51
51
  <UDExMastheadMenuItem
52
52
  class="udex-masthead-country-selector__item udex-masthead-country-selector__item_countries"
53
53
  onClick={this.handleCountryClick as any}
54
+ accessible-role="link"
54
55
  url={country.url}
55
56
  label={country.displayTitle}
56
57
  index={index}
package/src/Pagination.ts CHANGED
@@ -18,6 +18,7 @@ import {
18
18
  } from "./generated/i18n/i18n-defaults.js";
19
19
  import Button from "./Button.js";
20
20
  import translate from "./utils/translate.js";
21
+ import { BreakpointUtils } from "./utils/Breakpoints.js";
21
22
 
22
23
  // Template
23
24
  import PaginationTemplate from "./PaginationTemplate.js";
@@ -149,8 +150,6 @@ class UDExPagination extends UI5Element {
149
150
  @i18n("@sapudex/web-components")
150
151
  static i18nBundle: I18nBundle;
151
152
 
152
- static readonly AUTO_DISPLAY_BREAKPOINT = 980;
153
-
154
153
  _pages: Page[];
155
154
  _visiblePages: Page[];
156
155
 
@@ -200,7 +199,7 @@ class UDExPagination extends UI5Element {
200
199
  }
201
200
 
202
201
  get _displayType(): `${UDExDisplayType}` {
203
- return window.innerWidth > UDExPagination.AUTO_DISPLAY_BREAKPOINT
202
+ return BreakpointUtils.isAbove("M")
204
203
  ? UDExDisplayType.desktop
205
204
  : UDExDisplayType.mobile;
206
205
  }
@@ -179,7 +179,6 @@ function renderListItem(
179
179
  const effectiveRole = accessibleRole ?? (role !== "none" ? role : undefined) ?? "option";
180
180
  const hostRole = activeDescendantMode ? (effectiveRole as AriaRole) : (role as AriaRole);
181
181
  const hostAriaAttrs = activeDescendantMode ? {
182
- "aria-label": "test",
183
182
  // option role (listbox): always aria-selected; treeitem + MultiSelect: aria-checked only
184
183
  "aria-selected": (effectiveRole !== "treeitem" || !modeMultiSelect) ? (item.selected ? "true" : "false") as string : undefined,
185
184
  "aria-checked": (effectiveRole === "treeitem" && !!modeMultiSelect) ? (item.indeterminate ? "mixed" : (item.selected ? "true" : "false")) as string : undefined,
@@ -21,6 +21,7 @@ import { BreakpointUtils } from "./utils/Breakpoints.js";
21
21
  import parseArrayFromString from "./utils/parseArrayFromString.js";
22
22
  import AnalyticsName from "./types/AnalyticsName.js";
23
23
  import translate from "./utils/translate.js";
24
+ import type { RelativeValue } from "./utils/parseRelativeUnits.js";
24
25
 
25
26
  // Styles
26
27
  import SecondaryNavigationCss from "./generated/themes/SecondaryNavigation.css.js";
@@ -180,7 +181,7 @@ class UDExSecondaryNavigation extends UI5Element {
180
181
  * @public
181
182
  */
182
183
  @property({ type: String })
183
- maxDropdownHeight!: string;
184
+ maxDropdownHeight!: RelativeValue;
184
185
 
185
186
  @property({ type: Boolean, noAttribute: true })
186
187
  _selectedMore!: boolean;
@@ -32,6 +32,11 @@ type UDExSecondaryNavigationItemSubItemClickEventDetail = {
32
32
  originalEvent: PointerEvent | KeyboardEvent
33
33
  }
34
34
 
35
+ const DROPDOWN_MAX_HEIGHT_VAR = {
36
+ desktop: "--udex-secondary-navigation-item-dropdown-desktop-max-height",
37
+ mobile: "--udex-secondary-navigation-item-dropdown-mobile-max-height",
38
+ } as const;
39
+
35
40
  /**
36
41
  * @class
37
42
  *
@@ -394,24 +399,27 @@ class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
394
399
  setDesktopDropdownMaxHeight(): void {
395
400
  const { top } = this.dropdown.getBoundingClientRect();
396
401
  const maxHeight = window.innerHeight - top - DESKTOP_DROPDOWN_BOTTOM_GAP;
397
- this.style.setProperty("--udex-secondary-navigation-item-dropdown-desktop-max-height", `${maxHeight}px`);
402
+ this.style.setProperty(DROPDOWN_MAX_HEIGHT_VAR.desktop, `${maxHeight}px`);
398
403
  }
399
404
 
400
405
  setMobileDropdownMaxHeight(): void {
401
406
  if (!this._maxHeight || this._dropdownMaxHeightExceeds || !this.heightSatisfiesType) {
402
- const secondaryNavigationMobileTrigger = this.shadowRoot!.querySelector(".udex-secondary-navigation__item")!;
403
- const maxDropdownHeight = window.innerHeight - secondaryNavigationMobileTrigger.clientHeight;
404
- this.style.setProperty("--udex-secondary-navigation-item-dropdown-mobile-max-height", `${maxDropdownHeight}px`);
407
+ const { clientHeight } = this.shadowRoot!.querySelector(".udex-secondary-navigation__item")!;
408
+ const { top } = this.getBoundingClientRect();
409
+ const maxDropdownHeight = window.innerHeight - top - clientHeight;
410
+
411
+ this.style.setProperty(DROPDOWN_MAX_HEIGHT_VAR.mobile, `${maxDropdownHeight}px`);
405
412
  return;
406
413
  }
407
414
 
408
- this.style.setProperty("--udex-secondary-navigation-item-dropdown-mobile-max-height", `${this._maxHeight}`);
415
+ this.style.setProperty(DROPDOWN_MAX_HEIGHT_VAR.mobile, `${this._maxHeight}`);
409
416
  }
410
417
 
411
418
  get _dropdownMaxHeightExceeds(): boolean {
412
419
  const normalizedHeight = parseRelativeUnits(this._maxHeight, this.dropdown);
420
+ const { top } = this.getBoundingClientRect();
413
421
  const secondaryNavigationMobileTriggerHeight = this.shadowRoot!.querySelector(".udex-secondary-navigation__item")!.clientHeight;
414
- return normalizedHeight >= window.innerHeight - secondaryNavigationMobileTriggerHeight;
422
+ return normalizedHeight >= window.innerHeight - top - secondaryNavigationMobileTriggerHeight;
415
423
  }
416
424
 
417
425
  get heightSatisfiesType(): boolean {
@@ -41,7 +41,7 @@ export default function SecondaryNavigationTemplate(this: UDExSecondaryNavigatio
41
41
  subItems={item.items ?? []}
42
42
  onui5-sub-item-click={this.handleSubItemClick}
43
43
  onui5-nav-item-click={this.handleItemClick}
44
- {...{ "_nav-items-length": this.visibleItems.length }}>
44
+ _navItemsLength={this.visibleItems.length}>
45
45
  </UDExSecondaryNavigationItem>
46
46
  </li>
47
47
  ))}
@@ -53,7 +53,7 @@ export default function SecondaryNavigationTemplate(this: UDExSecondaryNavigatio
53
53
  onui5-nav-item-click={this.handleItemClick}
54
54
  label={this.moreButtonText}
55
55
  subItems={this._overflowItems}
56
- {...{ "_nav-items-length": this.visibleItems.length }}>
56
+ _navItemsLength={this.visibleItems.length}>
57
57
  </UDExSecondaryNavigationItem>
58
58
  </li>
59
59
  )}
@@ -75,10 +75,8 @@ export default function SecondaryNavigationTemplate(this: UDExSecondaryNavigatio
75
75
  onui5-sub-item-click={this.handleSubItemClick}
76
76
  onKeyDown={this.handleKeyDown}
77
77
  subItems={this.parsedItems}
78
- {...{
79
- "_is-mobile-menu-opener": "",
80
- "_max-height": this.maxDropdownHeight
81
- }}>
78
+ _maxHeight={this.maxDropdownHeight}
79
+ _is-mobile-menu-opener={true}>
82
80
  {this.hasMobileButtonsSlot && (
83
81
  <div className="udex-secondary-navigation__buttons" onClick={this.handleMobileButtonsClick}>
84
82
  <slot name="buttons"></slot>
package/src/SelectBase.ts CHANGED
@@ -353,6 +353,31 @@ class UDExSelectBase extends UDExSearchableListBase {
353
353
  this._setActiveDescendant(items[firstIndex], false);
354
354
  }
355
355
 
356
+ /**
357
+ * Establishes the initial aria-activedescendant when the dropdown opens, without moving
358
+ * DOM focus. In SingleSelect mode the currently selected item is activated so reopening
359
+ * restores focus to it; when nothing is selected (or in other modes) the first navigable
360
+ * item is activated instead.
361
+ */
362
+ _activateSelectedOrFirstItem(): void {
363
+ const items = this._list?.getKeyboardNavigationItems();
364
+ if (!items?.length) {
365
+ return;
366
+ }
367
+
368
+ const firstIndex = (items[0]?.nonInteractive && !items[0]?.collapsible) ? 1 : 0;
369
+ const selectedIndex = this.modeSingleSelect
370
+ ? items.findIndex(item => item.selected && !item.isGroup)
371
+ : -1;
372
+ const targetIndex = selectedIndex >= 0 ? selectedIndex : firstIndex;
373
+
374
+ this._list.setTabIndexByIndex(items, targetIndex);
375
+ this._setActiveDescendant(items[targetIndex], false);
376
+ if (this.showImageFlags) {
377
+ this.handleImagePosition(items, targetIndex);
378
+ }
379
+ }
380
+
356
381
  /**
357
382
  * Navigates to the item at the given index, updating aria-activedescendant and _selectedOption.
358
383
  */
@@ -490,48 +515,6 @@ class UDExSelectBase extends UDExSearchableListBase {
490
515
  this._navigateToIndex(items, firstIndex);
491
516
  }
492
517
 
493
- handleDownKeyPress(items: UDExListItemBase[], currentSelectedIndex: number, lastItemIndex: number) {
494
- const nextIndex = currentSelectedIndex + 1;
495
- const nextSelectIndex = nextIndex > lastItemIndex ? 0 : nextIndex;
496
- const isNonInteractive = items[nextSelectIndex].nonInteractive && !items[nextSelectIndex].collapsible;
497
-
498
- if (isNonInteractive) {
499
- const skipIndex = nextSelectIndex + 1 > lastItemIndex ? 0 : nextSelectIndex + 1;
500
- this._selectedOption = items[skipIndex].label;
501
- if (this.showImageFlags) {
502
- this.handleImagePosition(items, skipIndex);
503
- }
504
- return;
505
- }
506
-
507
- this._selectedOption = items[nextSelectIndex].label;
508
-
509
- if (this.showImageFlags) {
510
- this.handleImagePosition(items, nextSelectIndex);
511
- }
512
- }
513
-
514
- handleUpKeyPress(items: UDExListItemBase[], currentSelectedIndex: number, lastItemIndex: number) {
515
- const prevIndex = currentSelectedIndex - 1;
516
- const previousSelectIndex = prevIndex < 0 ? lastItemIndex : prevIndex;
517
- const isNonInteractive = items[previousSelectIndex].nonInteractive && !items[previousSelectIndex].collapsible;
518
-
519
- if (isNonInteractive) {
520
- const skipIndex = previousSelectIndex === 0 ? lastItemIndex : previousSelectIndex - 1;
521
- this._selectedOption = items[skipIndex].label;
522
- if (this.showImageFlags) {
523
- this.handleImagePosition(items, skipIndex);
524
- }
525
- return;
526
- }
527
-
528
- this._selectedOption = items[previousSelectIndex].label;
529
-
530
- if (this.showImageFlags) {
531
- this.handleImagePosition(items, previousSelectIndex);
532
- }
533
- }
534
-
535
518
  handleLetterKeyPress(e: KeyboardEvent) {
536
519
  e.stopPropagation();
537
520
  e.preventDefault();
@@ -638,10 +621,7 @@ class UDExSelectBase extends UDExSearchableListBase {
638
621
  if (isDownAndPopoverClosed) {
639
622
  e.preventDefault();
640
623
  this.openDropdown();
641
- this._activateFirstItem();
642
- if (this.showImageFlags) {
643
- this.handleImagePosition(items, firstIndex);
644
- }
624
+ this._activateSelectedOrFirstItem();
645
625
  return;
646
626
  }
647
627
 
@@ -740,7 +720,7 @@ class UDExSelectBase extends UDExSearchableListBase {
740
720
  }
741
721
 
742
722
  // Sync _selectedOption display for the first item (used when popover just opened via click).
743
- if (!this._activeDescendantItem && hasItems) {
723
+ if (popoverOpened && !this._activeDescendantItem && hasItems) {
744
724
  this._selectedOption = items[firstIndex].label;
745
725
  }
746
726
  }
@@ -799,6 +779,9 @@ class UDExSelectBase extends UDExSearchableListBase {
799
779
  this._expandCollapsedGroupsWithSelection();
800
780
  return renderFinished();
801
781
  }).then(() => {
782
+ if (!this._activeDescendantItem) {
783
+ this._activateSelectedOrFirstItem();
784
+ }
802
785
  this._handleDropdownScroll();
803
786
  this._announceCurrentOrFirst();
804
787
  }).catch(() => {});
@@ -6,6 +6,16 @@ import SideNavigation from "@ui5/webcomponents-fiori/dist/SideNavigation.js";
6
6
  // Styles
7
7
  import SideNavigationCss from "./generated/themes/SideNavigation.css.js";
8
8
 
9
+ export enum UDExSideNavigationVariant {
10
+ Full = "Full",
11
+ Content = "Content",
12
+ }
13
+
14
+ export enum UDExSideNavigationPlacement {
15
+ Left = "Left",
16
+ Right = "Right",
17
+ }
18
+
9
19
  /**
10
20
  * @class
11
21
  *
@@ -38,6 +48,31 @@ class UDExSideNavigation extends SideNavigation {
38
48
  */
39
49
  @property({ type: Boolean })
40
50
  isFixedInPlace!: boolean;
51
+
52
+ /**
53
+ * Defines the variant of the component.
54
+ *
55
+ * @default "Full"
56
+ * @public
57
+ */
58
+ @property()
59
+ variant: `${UDExSideNavigationVariant}` = UDExSideNavigationVariant.Full;
60
+
61
+ /**
62
+ * Defines which side the navigation panel is on.
63
+ *
64
+ * @default "Left"
65
+ * @public
66
+ */
67
+ @property()
68
+ placement: `${UDExSideNavigationPlacement}` = UDExSideNavigationPlacement.Left;
69
+
70
+ onBeforeRendering() {
71
+ super.onBeforeRendering();
72
+ this.querySelectorAll("[udex-side-navigation-item], [udex-side-navigation-sub-item]").forEach(item => {
73
+ item.setAttribute("variant", this.variant);
74
+ });
75
+ }
41
76
  }
42
77
 
43
78
  UDExSideNavigation.define();