@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
@@ -0,0 +1,509 @@
1
+ import {
2
+ UDExSideNavigation,
3
+ UDExSideNavigationItem,
4
+ UDExSideNavigationSubItem,
5
+ } from "../support/component-imports.js";
6
+
7
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
+ const SideNav = UDExSideNavigation as any;
9
+
10
+ describe("SideNavigation - placement property", () => {
11
+ describe("Host attribute reflection", () => {
12
+ it("reflects placement 'Left' as the default host attribute", () => {
13
+ cy.mount(
14
+ <SideNav id="side-nav">
15
+ <UDExSideNavigationItem text="Item 1"></UDExSideNavigationItem>
16
+ </SideNav>,
17
+ );
18
+
19
+ cy.get("[udex-side-navigation]").should("have.attr", "placement", "Left");
20
+ });
21
+
22
+ it("reflects placement 'Right' when set on the host", () => {
23
+ cy.mount(
24
+ <SideNav id="side-nav" placement="Right">
25
+ <UDExSideNavigationItem text="Item 1"></UDExSideNavigationItem>
26
+ </SideNav>,
27
+ );
28
+
29
+ cy.get("[udex-side-navigation]").should("have.attr", "placement", "Right");
30
+ });
31
+ });
32
+
33
+ });
34
+
35
+ describe("SideNavigation - third-level nesting", () => {
36
+ const mountWithThirdLevel = (subItemExpanded = false) => {
37
+ cy.mount(
38
+ <SideNav id="side-nav">
39
+ <UDExSideNavigationItem text="Item 1" expanded>
40
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
41
+ <UDExSideNavigationSubItem text="Sub Item 1" {...(subItemExpanded ? { expanded: true } as any : {})}>
42
+ <UDExSideNavigationSubItem text="Sub Item 1.1"></UDExSideNavigationSubItem>
43
+ <UDExSideNavigationSubItem text="Sub Item 1.2"></UDExSideNavigationSubItem>
44
+ </UDExSideNavigationSubItem>
45
+ </UDExSideNavigationItem>
46
+ </SideNav>,
47
+ );
48
+ };
49
+
50
+ it("renders a toggle icon on a level-2 sub-item that has children", () => {
51
+ mountWithThirdLevel();
52
+ cy.get("[udex-side-navigation-sub-item]").first()
53
+ .shadow()
54
+ .find(".ui5-sn-item-toggle-icon")
55
+ .should("exist");
56
+ });
57
+
58
+ it("expands level-3 children when the level-2 sub-item is clicked", () => {
59
+ mountWithThirdLevel(false);
60
+ cy.get("[udex-side-navigation-sub-item]").first().shadow().find(".ui5-sn-item").click();
61
+ cy.get("[udex-side-navigation-sub-item]").first().should("have.attr", "expanded");
62
+ });
63
+
64
+ it("collapses level-3 children when an expanded level-2 sub-item is clicked again", () => {
65
+ mountWithThirdLevel(true);
66
+ cy.get("[udex-side-navigation-sub-item]").first().shadow().find(".ui5-sn-item").click();
67
+ cy.get("[udex-side-navigation-sub-item]").first().should("not.have.attr", "expanded");
68
+ });
69
+
70
+ it("sets the nested attribute on level-3 sub-items", () => {
71
+ mountWithThirdLevel(true);
72
+ cy.get("[udex-side-navigation-sub-item][nested]").should("have.length", 2);
73
+ });
74
+
75
+ // Updated: nested-item-click removed (#2822) — level-3 leaves now fire the standard
76
+ // bubbling selection-change on the host and gain the selected attribute, like level 1/2.
77
+ it("fires selection-change on the host when a leaf level-3 sub-item is clicked", () => {
78
+ mountWithThirdLevel(true);
79
+ const onSelectionChange = cy.stub().as("selectionChange");
80
+ cy.get("[udex-side-navigation]").then(($el) => {
81
+ $el[0].addEventListener("selection-change", onSelectionChange);
82
+ });
83
+ cy.get("[udex-side-navigation-sub-item][nested]").first().shadow().find(".ui5-sn-item").click();
84
+ cy.get("@selectionChange").should("have.been.calledOnce");
85
+ cy.get("[udex-side-navigation-sub-item][nested]").first().then(($leaf) => {
86
+ cy.get("@selectionChange").should((stub) => {
87
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
88
+ const detail = (stub as any).firstCall.args[0].detail;
89
+ expect(detail.item).to.equal($leaf[0]);
90
+ });
91
+ });
92
+ cy.get("[udex-side-navigation-sub-item][nested]").first().should("have.attr", "selected");
93
+ });
94
+
95
+ // Updated: nested-item-click (and its preventDefault capability) removed (#2822) —
96
+ // a level-3 leaf with an href now navigates natively, matching level-1/level-2 leaves.
97
+ it("navigates natively when a level-3 leaf with an href is clicked", () => {
98
+ cy.mount(
99
+ <SideNav id="side-nav">
100
+ <UDExSideNavigationItem text="Item 1" expanded>
101
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
102
+ <UDExSideNavigationSubItem text="Sub Item 1" {...{ expanded: true } as any}>
103
+ <UDExSideNavigationSubItem text="Sub Item 1.1" href="#section-1"></UDExSideNavigationSubItem>
104
+ </UDExSideNavigationSubItem>
105
+ </UDExSideNavigationItem>
106
+ </SideNav>,
107
+ );
108
+ cy.get("[udex-side-navigation-sub-item][nested]").first().shadow().find(".ui5-sn-item").click();
109
+ cy.url().should("include", "section-1");
110
+ });
111
+ });
112
+
113
+ describe("SideNavigation - cross-level deselection (#2822)", () => {
114
+ // Added: the component now overrides selectableItems/allItems so the base selection
115
+ // sweep reaches level 3 — selecting any item deselects the previously selected item
116
+ // at any level, across levels.
117
+ const clickLeaf = (text: string) => {
118
+ cy.get(`[udex-side-navigation-sub-item][text="${text}"]`).shadow().find(".ui5-sn-item").click();
119
+ };
120
+
121
+ const mountTwoThirdLevelBranches = () => {
122
+ cy.mount(
123
+ <SideNav id="side-nav">
124
+ <UDExSideNavigationItem text="Item 1" expanded>
125
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
126
+ <UDExSideNavigationSubItem text="Sub Item A" {...{ expanded: true } as any}>
127
+ <UDExSideNavigationSubItem text="Leaf A.1"></UDExSideNavigationSubItem>
128
+ </UDExSideNavigationSubItem>
129
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
130
+ <UDExSideNavigationSubItem text="Sub Item B" {...{ expanded: true } as any}>
131
+ <UDExSideNavigationSubItem text="Leaf B.1"></UDExSideNavigationSubItem>
132
+ </UDExSideNavigationSubItem>
133
+ </UDExSideNavigationItem>
134
+ </SideNav>,
135
+ );
136
+ };
137
+
138
+ it("deselects a level-3 leaf when a different level-3 leaf under another parent is selected", () => {
139
+ mountTwoThirdLevelBranches();
140
+ clickLeaf("Leaf A.1");
141
+ cy.get(`[udex-side-navigation-sub-item][text="Leaf A.1"]`).should("have.attr", "selected");
142
+ clickLeaf("Leaf B.1");
143
+ cy.get(`[udex-side-navigation-sub-item][text="Leaf A.1"]`).should("not.have.attr", "selected");
144
+ cy.get(`[udex-side-navigation-sub-item][text="Leaf B.1"]`).should("have.attr", "selected");
145
+ });
146
+
147
+ it("deselects a level-1 leaf when a level-3 leaf is selected", () => {
148
+ cy.mount(
149
+ <SideNav id="side-nav">
150
+ <UDExSideNavigationItem text="L1 Leaf" href="#l1"></UDExSideNavigationItem>
151
+ <UDExSideNavigationItem text="Item 2" expanded>
152
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
153
+ <UDExSideNavigationSubItem text="Sub Item A" {...{ expanded: true } as any}>
154
+ <UDExSideNavigationSubItem text="Leaf A.1"></UDExSideNavigationSubItem>
155
+ </UDExSideNavigationSubItem>
156
+ </UDExSideNavigationItem>
157
+ </SideNav>,
158
+ );
159
+ cy.get(`[udex-side-navigation-item][text="L1 Leaf"]`).shadow().find(".ui5-sn-item").click();
160
+ cy.get(`[udex-side-navigation-item][text="L1 Leaf"]`).should("have.attr", "selected");
161
+ clickLeaf("Leaf A.1");
162
+ cy.get(`[udex-side-navigation-item][text="L1 Leaf"]`).should("not.have.attr", "selected");
163
+ cy.get(`[udex-side-navigation-sub-item][text="Leaf A.1"]`).should("have.attr", "selected");
164
+ });
165
+
166
+ it("deselects a level-3 leaf when a level-2 leaf is selected", () => {
167
+ cy.mount(
168
+ <SideNav id="side-nav">
169
+ <UDExSideNavigationItem text="Item 1" expanded>
170
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
171
+ <UDExSideNavigationSubItem text="Sub Item A" {...{ expanded: true } as any}>
172
+ <UDExSideNavigationSubItem text="Leaf A.1"></UDExSideNavigationSubItem>
173
+ </UDExSideNavigationSubItem>
174
+ <UDExSideNavigationSubItem text="L2 Leaf"></UDExSideNavigationSubItem>
175
+ </UDExSideNavigationItem>
176
+ </SideNav>,
177
+ );
178
+ clickLeaf("Leaf A.1");
179
+ cy.get(`[udex-side-navigation-sub-item][text="Leaf A.1"]`).should("have.attr", "selected");
180
+ clickLeaf("L2 Leaf");
181
+ cy.get(`[udex-side-navigation-sub-item][text="Leaf A.1"]`).should("not.have.attr", "selected");
182
+ cy.get(`[udex-side-navigation-sub-item][text="L2 Leaf"]`).should("have.attr", "selected");
183
+ });
184
+
185
+ it("moves selection to a level-3 leaf on click (sideNavigation selection wiring regression guard)", () => {
186
+ mountTwoThirdLevelBranches();
187
+ cy.get(`[udex-side-navigation-sub-item][text="Leaf A.1"]`).should("not.have.attr", "selected");
188
+ clickLeaf("Leaf A.1");
189
+ cy.get(`[udex-side-navigation-sub-item][text="Leaf A.1"]`).should("have.attr", "selected");
190
+ });
191
+ });
192
+
193
+ describe("SideNavigation - grouping item click toggles expand/collapse", () => {
194
+ // A parent item that has children toggles expand/collapse on title click and never
195
+ // navigates: the click is preventDefault'd + stopPropagation'd so it does not reach a
196
+ // host/document listener. This holds for both level-1 items and level-2 group sub-items.
197
+ // A parent with children must not carry an href — only leaf items navigate.
198
+ it("level-1 group expands on title click and does not propagate to a host listener", () => {
199
+ cy.mount(
200
+ <SideNav id="side-nav">
201
+ <UDExSideNavigationItem text="L1">
202
+ <UDExSideNavigationSubItem text="L2"></UDExSideNavigationSubItem>
203
+ </UDExSideNavigationItem>
204
+ </SideNav>,
205
+ );
206
+ const onHostClick = cy.stub().as("hostClick");
207
+ cy.get("[udex-side-navigation]").then(($el) => {
208
+ $el[0].addEventListener("click", onHostClick);
209
+ });
210
+ cy.get("[udex-side-navigation-item]").first().should("not.have.attr", "expanded");
211
+ cy.get("[udex-side-navigation-item]").first().shadow().find(".ui5-sn-item").first().realClick();
212
+ cy.get("[udex-side-navigation-item]").first().should("have.attr", "expanded");
213
+ cy.get("@hostClick").should("not.have.been.called");
214
+ });
215
+
216
+ it("level-1 group collapses on a second title click", () => {
217
+ cy.mount(
218
+ <SideNav id="side-nav">
219
+ <UDExSideNavigationItem text="L1" expanded>
220
+ <UDExSideNavigationSubItem text="L2"></UDExSideNavigationSubItem>
221
+ </UDExSideNavigationItem>
222
+ </SideNav>,
223
+ );
224
+ cy.get("[udex-side-navigation-item]").first().shadow().find(".ui5-sn-item").first().realClick();
225
+ cy.get("[udex-side-navigation-item]").first().should("not.have.attr", "expanded");
226
+ });
227
+
228
+ it("level-1 group expands when the arrow icon is clicked", () => {
229
+ cy.mount(
230
+ <SideNav id="side-nav">
231
+ <UDExSideNavigationItem text="L1">
232
+ <UDExSideNavigationSubItem text="L2"></UDExSideNavigationSubItem>
233
+ </UDExSideNavigationItem>
234
+ </SideNav>,
235
+ );
236
+ cy.get("[udex-side-navigation-item]").first().shadow().find(".ui5-sn-item-toggle-icon").realClick();
237
+ cy.get("[udex-side-navigation-item]").first().should("have.attr", "expanded");
238
+ });
239
+
240
+ it("level-2 group expands on title click and does not propagate to a host listener", () => {
241
+ cy.mount(
242
+ <SideNav id="side-nav">
243
+ <UDExSideNavigationItem text="L1" expanded>
244
+ <UDExSideNavigationSubItem text="L2">
245
+ <UDExSideNavigationSubItem text="L3"></UDExSideNavigationSubItem>
246
+ </UDExSideNavigationSubItem>
247
+ </UDExSideNavigationItem>
248
+ </SideNav>,
249
+ );
250
+ const onHostClick = cy.stub().as("hostClick");
251
+ cy.get("[udex-side-navigation]").then(($el) => {
252
+ $el[0].addEventListener("click", onHostClick);
253
+ });
254
+ cy.get("[udex-side-navigation-sub-item]").first().should("not.have.attr", "expanded");
255
+ cy.get("[udex-side-navigation-sub-item]").first().shadow().find(".ui5-sn-item").first().realClick();
256
+ cy.get("[udex-side-navigation-sub-item]").first().should("have.attr", "expanded");
257
+ cy.get("@hostClick").should("not.have.been.called");
258
+ });
259
+
260
+ it("level-2 group collapses on a second title click", () => {
261
+ cy.mount(
262
+ <SideNav id="side-nav">
263
+ <UDExSideNavigationItem text="L1" expanded>
264
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
265
+ <UDExSideNavigationSubItem text="L2" {...({ expanded: true } as any)}>
266
+ <UDExSideNavigationSubItem text="L3"></UDExSideNavigationSubItem>
267
+ </UDExSideNavigationSubItem>
268
+ </UDExSideNavigationItem>
269
+ </SideNav>,
270
+ );
271
+ cy.get("[udex-side-navigation-sub-item]").first().shadow().find(".ui5-sn-item").first().realClick();
272
+ cy.get("[udex-side-navigation-sub-item]").first().should("not.have.attr", "expanded");
273
+ });
274
+
275
+ it("level-2 group expands when the arrow icon is clicked", () => {
276
+ cy.mount(
277
+ <SideNav id="side-nav">
278
+ <UDExSideNavigationItem text="L1" expanded>
279
+ <UDExSideNavigationSubItem text="L2">
280
+ <UDExSideNavigationSubItem text="L3"></UDExSideNavigationSubItem>
281
+ </UDExSideNavigationSubItem>
282
+ </UDExSideNavigationItem>
283
+ </SideNav>,
284
+ );
285
+ cy.get("[udex-side-navigation-sub-item]").first().shadow().find(".ui5-sn-item-toggle-icon").realClick();
286
+ cy.get("[udex-side-navigation-sub-item]").first().should("have.attr", "expanded");
287
+ });
288
+ });
289
+
290
+ describe("SideNavigation - third-level keyboard navigation", () => {
291
+ const mountExpandedThreeLevels = () => {
292
+ cy.mount(
293
+ <SideNav id="side-nav">
294
+ <UDExSideNavigationItem text="Item 1" expanded>
295
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
296
+ <UDExSideNavigationSubItem text="Sub Item 1" {...{ expanded: true } as any}>
297
+ <UDExSideNavigationSubItem text="Sub Item 1.1"></UDExSideNavigationSubItem>
298
+ <UDExSideNavigationSubItem text="Sub Item 1.2"></UDExSideNavigationSubItem>
299
+ </UDExSideNavigationSubItem>
300
+ </UDExSideNavigationItem>
301
+ </SideNav>,
302
+ );
303
+ };
304
+
305
+ it("includes expanded level-3 items in the parent level-2 focusableItems", () => {
306
+ mountExpandedThreeLevels();
307
+ cy.get("[udex-side-navigation-sub-item]").first().then(($el) => {
308
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
309
+ const focusable = ($el[0] as any).focusableItems as HTMLElement[];
310
+ // the level-2 group itself plus its two level-3 children
311
+ expect(focusable).to.have.length(3);
312
+ expect(focusable[1].getAttribute("text")).to.equal("Sub Item 1.1");
313
+ expect(focusable[2].getAttribute("text")).to.equal("Sub Item 1.2");
314
+ });
315
+ });
316
+
317
+ it("excludes collapsed level-3 items from the parent level-2 focusableItems", () => {
318
+ cy.mount(
319
+ <SideNav id="side-nav">
320
+ <UDExSideNavigationItem text="Item 1" expanded>
321
+ <UDExSideNavigationSubItem text="Sub Item 1">
322
+ <UDExSideNavigationSubItem text="Sub Item 1.1"></UDExSideNavigationSubItem>
323
+ </UDExSideNavigationSubItem>
324
+ </UDExSideNavigationItem>
325
+ </SideNav>,
326
+ );
327
+ cy.get("[udex-side-navigation-sub-item]").first().then(($el) => {
328
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
329
+ const focusable = ($el[0] as any).focusableItems as HTMLElement[];
330
+ // only the group itself when collapsed
331
+ expect(focusable).to.have.length(1);
332
+ });
333
+ });
334
+
335
+ it("reaches a level-3 item by walking down with the ArrowDown key", () => {
336
+ mountExpandedThreeLevels();
337
+ cy.get("[udex-side-navigation-item]").first().shadow().find(".ui5-sn-item").first()
338
+ .then(($el) => { ($el[0] as HTMLElement).focus(); });
339
+ // Item 1 -> Sub Item 1 -> Sub Item 1.1
340
+ cy.realPress("ArrowDown");
341
+ cy.realPress("ArrowDown");
342
+ cy.focused().should(($el) => {
343
+ const host = ($el[0].getRootNode() as ShadowRoot).host as HTMLElement;
344
+ expect(host.getAttribute("text")).to.equal("Sub Item 1.1");
345
+ });
346
+ });
347
+ });
348
+
349
+ describe("SideNavigation - third-level expand/collapse via keyboard", () => {
350
+ const mountGroup = (expanded = false) => {
351
+ cy.mount(
352
+ <SideNav id="side-nav">
353
+ <UDExSideNavigationItem text="Item 1" expanded>
354
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
355
+ <UDExSideNavigationSubItem text="Sub Item 1" {...(expanded ? { expanded: true } as any : {})}>
356
+ <UDExSideNavigationSubItem text="Sub Item 1.1"></UDExSideNavigationSubItem>
357
+ </UDExSideNavigationSubItem>
358
+ </UDExSideNavigationItem>
359
+ </SideNav>,
360
+ );
361
+ cy.get("[udex-side-navigation-sub-item]").first().shadow().find(".ui5-sn-item").first()
362
+ .then(($el) => { ($el[0] as HTMLElement).focus(); });
363
+ };
364
+
365
+ it("expands a collapsed group sub-item with ArrowRight", () => {
366
+ mountGroup(false);
367
+ cy.realPress("ArrowRight");
368
+ cy.get("[udex-side-navigation-sub-item]").first().should("have.attr", "expanded");
369
+ });
370
+
371
+ it("collapses an expanded group sub-item with ArrowLeft", () => {
372
+ mountGroup(true);
373
+ cy.realPress("ArrowLeft");
374
+ cy.get("[udex-side-navigation-sub-item]").first().should("not.have.attr", "expanded");
375
+ });
376
+
377
+ it("expands a collapsed group sub-item with the Plus key", () => {
378
+ mountGroup(false);
379
+ cy.realPress("+");
380
+ cy.get("[udex-side-navigation-sub-item]").first().should("have.attr", "expanded");
381
+ });
382
+
383
+ it("collapses an expanded group sub-item with the Minus key", () => {
384
+ mountGroup(true);
385
+ cy.realPress("-");
386
+ cy.get("[udex-side-navigation-sub-item]").first().should("not.have.attr", "expanded");
387
+ });
388
+
389
+ it("keeps expand/collapse working after a level-3 child is selected", () => {
390
+ cy.mount(
391
+ <SideNav id="side-nav">
392
+ <UDExSideNavigationItem text="Item 1" expanded>
393
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
394
+ <UDExSideNavigationSubItem text="Sub Item 1" {...{ expanded: true } as any}>
395
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
396
+ <UDExSideNavigationSubItem text="Sub Item 1.1" {...{ selected: true } as any}></UDExSideNavigationSubItem>
397
+ </UDExSideNavigationSubItem>
398
+ </UDExSideNavigationItem>
399
+ </SideNav>,
400
+ );
401
+ cy.get("[udex-side-navigation-sub-item]").first().shadow().find(".ui5-sn-item").first()
402
+ .then(($el) => { ($el[0] as HTMLElement).focus(); });
403
+ cy.realPress("ArrowLeft");
404
+ cy.get("[udex-side-navigation-sub-item]").first().should("not.have.attr", "expanded");
405
+ cy.realPress("ArrowRight");
406
+ cy.get("[udex-side-navigation-sub-item]").first().should("have.attr", "expanded");
407
+ });
408
+ });
409
+
410
+ describe("SideNavigation - third-level keyboard selection", () => {
411
+ const mountLeaf = () => {
412
+ cy.mount(
413
+ <SideNav id="side-nav">
414
+ <UDExSideNavigationItem text="Item 1" expanded>
415
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
416
+ <UDExSideNavigationSubItem text="Sub Item 1" {...{ expanded: true } as any}>
417
+ <UDExSideNavigationSubItem text="Sub Item 1.1"></UDExSideNavigationSubItem>
418
+ </UDExSideNavigationSubItem>
419
+ </UDExSideNavigationItem>
420
+ </SideNav>,
421
+ );
422
+ };
423
+
424
+ // Updated: nested-item-click removed (#2822) — Enter on a focused level-3 leaf now
425
+ // fires the standard bubbling selection-change on the host.
426
+ it("fires selection-change when Enter is pressed on a focused level-3 item", () => {
427
+ mountLeaf();
428
+ const onSelectionChange = cy.stub().as("selectionChange");
429
+ cy.get("[udex-side-navigation]").then(($el) => {
430
+ $el[0].addEventListener("selection-change", onSelectionChange);
431
+ });
432
+ cy.get("[udex-side-navigation-sub-item][nested]").first().shadow().find(".ui5-sn-item").first()
433
+ .then(($el) => { ($el[0] as HTMLElement).focus(); });
434
+ cy.realPress("Enter");
435
+ cy.get("@selectionChange").should("have.been.calledOnce");
436
+ cy.get("[udex-side-navigation-sub-item][nested]").first().then(($leaf) => {
437
+ cy.get("@selectionChange").should((stub) => {
438
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
439
+ const detail = (stub as any).firstCall.args[0].detail;
440
+ expect(detail.item).to.equal($leaf[0]);
441
+ });
442
+ });
443
+ });
444
+
445
+ // Updated: nested-item-click removed (#2822) — Space on a focused level-3 leaf now
446
+ // fires the standard bubbling selection-change on the host.
447
+ it("fires selection-change when Space is pressed on a focused level-3 item", () => {
448
+ mountLeaf();
449
+ const onSelectionChange = cy.stub().as("selectionChange");
450
+ cy.get("[udex-side-navigation]").then(($el) => {
451
+ $el[0].addEventListener("selection-change", onSelectionChange);
452
+ });
453
+ cy.get("[udex-side-navigation-sub-item][nested]").first().shadow().find(".ui5-sn-item").first()
454
+ .then(($el) => { ($el[0] as HTMLElement).focus(); });
455
+ cy.realPress("Space");
456
+ cy.get("@selectionChange").should("have.been.calledOnce");
457
+ cy.get("[udex-side-navigation-sub-item][nested]").first().then(($leaf) => {
458
+ cy.get("@selectionChange").should((stub) => {
459
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
460
+ const detail = (stub as any).firstCall.args[0].detail;
461
+ expect(detail.item).to.equal($leaf[0]);
462
+ });
463
+ });
464
+ });
465
+ });
466
+
467
+ describe("SideNavigation - group collapse not blocked by selected child", () => {
468
+ it("collapses a level-1 group via ArrowLeft even when a direct child is selected", () => {
469
+ cy.mount(
470
+ <SideNav id="side-nav">
471
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
472
+ <UDExSideNavigationItem text="L1" {...({ expanded: true } as any)}>
473
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
474
+ <UDExSideNavigationSubItem text="L2" {...({ selected: true } as any)}></UDExSideNavigationSubItem>
475
+ </UDExSideNavigationItem>
476
+ </SideNav>,
477
+ );
478
+ cy.get("[udex-side-navigation-item]").first().shadow().find(".ui5-sn-item").first()
479
+ .then(($el) => { ($el[0] as HTMLElement).focus(); });
480
+ cy.realPress("ArrowLeft");
481
+ cy.get("[udex-side-navigation-item]").first().should("not.have.attr", "expanded");
482
+ });
483
+
484
+ it("collapses a level-1 group via click even when a direct child is selected", () => {
485
+ cy.mount(
486
+ <SideNav id="side-nav">
487
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
488
+ <UDExSideNavigationItem text="L1" {...({ expanded: true } as any)}>
489
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
490
+ <UDExSideNavigationSubItem text="L2" {...({ selected: true } as any)}></UDExSideNavigationSubItem>
491
+ </UDExSideNavigationItem>
492
+ </SideNav>,
493
+ );
494
+ cy.get("[udex-side-navigation-item]").first().shadow().find(".ui5-sn-item").first().realClick();
495
+ cy.get("[udex-side-navigation-item]").first().should("not.have.attr", "expanded");
496
+ });
497
+
498
+ it("opens a level-1 group on initial render when a child starts selected", () => {
499
+ cy.mount(
500
+ <SideNav id="side-nav">
501
+ <UDExSideNavigationItem text="L1">
502
+ {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
503
+ <UDExSideNavigationSubItem text="L2" {...({ selected: true } as any)}></UDExSideNavigationSubItem>
504
+ </UDExSideNavigationItem>
505
+ </SideNav>,
506
+ );
507
+ cy.get("[udex-side-navigation-item]").first().should("have.attr", "expanded");
508
+ });
509
+ });
@@ -1,4 +1,5 @@
1
1
  import { UDExTable, UDExTableHeaderRow, UDExTableHeaderCell, UDExTableRow, UDExTableGroupRow, UDExTableCell, UDExButton, UDExLink, UDExRatingIndicator } from "../support/component-imports.js";
2
+ import { UDExTableCellVerticalAlign } from "../../src/types/Table.js";
2
3
 
3
4
  const defaultTable = <UDExTable
4
5
  id="table"
@@ -527,3 +528,92 @@ describe("TableGroupRow ARIA Structure", () => {
527
528
  });
528
529
  });
529
530
  });
531
+
532
+ const cellVerticalAlignTable = <UDExTable id="cell-va-table">
533
+ <UDExTableHeaderRow slot="headerRow">
534
+ <UDExTableHeaderCell>Product</UDExTableHeaderCell>
535
+ <UDExTableHeaderCell>Price</UDExTableHeaderCell>
536
+ <UDExTableHeaderCell>Stock</UDExTableHeaderCell>
537
+ <UDExTableHeaderCell>Qty</UDExTableHeaderCell>
538
+ </UDExTableHeaderRow>
539
+ <UDExTableRow>
540
+ <UDExTableCell id="cva-cell-top" vertical-align="Top">Item</UDExTableCell>
541
+ <UDExTableCell id="cva-cell-bottom" vertical-align="Bottom">$100</UDExTableCell>
542
+ <UDExTableCell id="cva-cell-center" vertical-align="Center">5</UDExTableCell>
543
+ <UDExTableCell id="cva-cell-default">10</UDExTableCell>
544
+ </UDExTableRow>
545
+ </UDExTable>;
546
+
547
+ const rowVerticalAlignTable = <UDExTable id="row-va-table">
548
+ <UDExTableHeaderRow slot="headerRow">
549
+ <UDExTableHeaderCell id="rva-header">Product</UDExTableHeaderCell>
550
+ <UDExTableHeaderCell>Price</UDExTableHeaderCell>
551
+ </UDExTableHeaderRow>
552
+ <UDExTableRow id="rva-row-aligned" vertical-align="Top">
553
+ <UDExTableCell id="rva-cell-inherit">Item 1</UDExTableCell>
554
+ <UDExTableCell id="rva-cell-override" vertical-align="Bottom">$100</UDExTableCell>
555
+ <UDExTableCell id="rva-cell-explicit-center" vertical-align="Center">5</UDExTableCell>
556
+ </UDExTableRow>
557
+ <UDExTableRow id="rva-row-plain">
558
+ <UDExTableCell id="rva-cell-plain">Item 2</UDExTableCell>
559
+ <UDExTableCell>$200</UDExTableCell>
560
+ </UDExTableRow>
561
+ </UDExTable>;
562
+
563
+ describe("TableCell and TableRow verticalAlign", () => {
564
+ describe("cell-level (UDExTableCell)", () => {
565
+ beforeEach(() => {
566
+ cy.mount(cellVerticalAlignTable);
567
+ });
568
+
569
+ it("cell with vertical-align='Top' gets align-items: flex-start", () => {
570
+ cy.get("#cva-cell-top").should("have.css", "align-items", "flex-start");
571
+ });
572
+
573
+ it("cell with vertical-align='Bottom' gets align-items: flex-end", () => {
574
+ cy.get("#cva-cell-bottom").should("have.css", "align-items", "flex-end");
575
+ });
576
+
577
+ it("cell with vertical-align='Center' gets align-items: center", () => {
578
+ cy.get("#cva-cell-center").should("have.css", "align-items", "center");
579
+ });
580
+
581
+ it("cell without vertical-align defaults to align-items: center", () => {
582
+ cy.get("#cva-cell-default").should("have.css", "align-items", "center");
583
+ });
584
+
585
+ it("cell verticalAlign property defaults to 'Center'", () => {
586
+ cy.get("#cva-cell-default").then($cell => {
587
+ expect(($cell[0] as UDExTableCell).verticalAlign).to.equal(UDExTableCellVerticalAlign.Center);
588
+ });
589
+ });
590
+ });
591
+
592
+ describe("row-level (UDExTableRow)", () => {
593
+ beforeEach(() => {
594
+ cy.mount(rowVerticalAlignTable);
595
+ });
596
+
597
+ it("row vertical-align propagates to a cell without its own vertical-align", () => {
598
+ cy.get("#rva-cell-inherit").should("have.css", "align-items", "flex-start");
599
+ });
600
+
601
+ it("a cell's own vertical-align overrides the row's vertical-align", () => {
602
+ cy.get("#rva-cell-override").should("have.css", "align-items", "flex-end");
603
+ });
604
+
605
+ it("a cell in a row without vertical-align defaults to align-items: center", () => {
606
+ cy.get("#rva-cell-plain").should("have.css", "align-items", "center");
607
+ });
608
+
609
+ it("row verticalAlign property defaults to 'Center'", () => {
610
+ cy.get("#rva-row-plain").then($row => {
611
+ expect(($row[0] as UDExTableRow).verticalAlign).to.equal(UDExTableCellVerticalAlign.Center);
612
+ });
613
+ });
614
+
615
+ it("a cell left at the default 'Center' takes the aligned row's value", () => {
616
+ cy.get("#rva-cell-explicit-center").should("have.css", "align-items", "flex-start");
617
+ });
618
+ });
619
+ });