@sapudex/web-components 2.60.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 (294) 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 +37 -5
  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/Pagination.d.ts +0 -1
  12. package/dist/Pagination.js +2 -2
  13. package/dist/Pagination.js.map +1 -1
  14. package/dist/SearchableListBaseTemplate.js +0 -1
  15. package/dist/SearchableListBaseTemplate.js.map +1 -1
  16. package/dist/SecondaryNavigation.d.ts +2 -1
  17. package/dist/SecondaryNavigation.js.map +1 -1
  18. package/dist/SecondaryNavigationItem.js +12 -6
  19. package/dist/SecondaryNavigationItem.js.map +1 -1
  20. package/dist/SecondaryNavigationTemplate.js +1 -2
  21. package/dist/SecondaryNavigationTemplate.js.map +1 -1
  22. package/dist/SelectBase.js +1 -1
  23. package/dist/SelectBase.js.map +1 -1
  24. package/dist/SideNavigation.d.ts +23 -0
  25. package/dist/SideNavigation.js +39 -0
  26. package/dist/SideNavigation.js.map +1 -1
  27. package/dist/SideNavigationItem.d.ts +10 -0
  28. package/dist/SideNavigationItem.js +67 -0
  29. package/dist/SideNavigationItem.js.map +1 -1
  30. package/dist/SideNavigationMobileTemplate.js +1 -1
  31. package/dist/SideNavigationMobileTemplate.js.map +1 -1
  32. package/dist/SideNavigationSubItem.d.ts +23 -0
  33. package/dist/SideNavigationSubItem.js +103 -0
  34. package/dist/SideNavigationSubItem.js.map +1 -1
  35. package/dist/SideNavigationSubItemTemplate.d.ts +2 -0
  36. package/dist/SideNavigationSubItemTemplate.js +10 -0
  37. package/dist/SideNavigationSubItemTemplate.js.map +1 -0
  38. package/dist/Table.js +1 -1
  39. package/dist/Table.js.map +1 -1
  40. package/dist/TableCell.d.ts +8 -2
  41. package/dist/TableCell.js +13 -11
  42. package/dist/TableCell.js.map +1 -1
  43. package/dist/TableCellBase.d.ts +2 -1
  44. package/dist/TableCellBase.js +9 -0
  45. package/dist/TableCellBase.js.map +1 -1
  46. package/dist/TableHeaderCell.d.ts +0 -1
  47. package/dist/TableHeaderCell.js +0 -4
  48. package/dist/TableHeaderCell.js.map +1 -1
  49. package/dist/TableRow.d.ts +10 -0
  50. package/dist/TableRow.js +23 -0
  51. package/dist/TableRow.js.map +1 -1
  52. package/dist/UploadItem.js +3 -4
  53. package/dist/UploadItem.js.map +1 -1
  54. package/dist/assets/{InputSuggestions-DyNcKgip.js → InputSuggestions-1OnUn6pM.js} +1 -1
  55. package/dist/assets/{ListItemStandardExpandableTextTemplate-qdKPzaOQ.js → ListItemStandardExpandableTextTemplate-CoBAMp_v.js} +1 -1
  56. package/dist/assets/{bundle.esm-sUYwSJOp.js → bundle.esm-BqaVWFKf.js} +233 -233
  57. package/dist/css/themes/AccordionSpotlight.css +1 -1
  58. package/dist/css/themes/Contact.css +1 -1
  59. package/dist/css/themes/EventRibbon.css +1 -1
  60. package/dist/css/themes/Feed.css +1 -1
  61. package/dist/css/themes/HeroBanner.css +1 -1
  62. package/dist/css/themes/ImageGridCloud.css +1 -1
  63. package/dist/css/themes/ImageGridTicker.css +1 -1
  64. package/dist/css/themes/ImageGridTickerItem.css +1 -1
  65. package/dist/css/themes/LinkList.css +1 -1
  66. package/dist/css/themes/MastheadCountrySelector.css +1 -1
  67. package/dist/css/themes/MastheadItem.css +1 -1
  68. package/dist/css/themes/MastheadMenu.css +1 -1
  69. package/dist/css/themes/MastheadMenuItem.css +1 -1
  70. package/dist/css/themes/MastheadMobileMenu.css +1 -1
  71. package/dist/css/themes/MastheadProfileMenu.css +1 -1
  72. package/dist/css/themes/MastheadShell.css +1 -1
  73. package/dist/css/themes/MessageStrip.css +1 -1
  74. package/dist/css/themes/Modal.css +1 -1
  75. package/dist/css/themes/PromoTile.css +1 -1
  76. package/dist/css/themes/Quote.css +1 -1
  77. package/dist/css/themes/Review.css +1 -1
  78. package/dist/css/themes/ReviewItem.css +1 -1
  79. package/dist/css/themes/SecondaryNavigation.css +1 -1
  80. package/dist/css/themes/SecondaryNavigationItem.css +1 -1
  81. package/dist/css/themes/SelectBase.css +1 -1
  82. package/dist/css/themes/SideNavigation.css +1 -1
  83. package/dist/css/themes/SideNavigationItem.css +1 -1
  84. package/dist/css/themes/SideNavigationMobile.css +1 -1
  85. package/dist/css/themes/SideNavigationMobileDropdown.css +1 -1
  86. package/dist/css/themes/SideNavigationSubItem.css +1 -1
  87. package/dist/css/themes/TabNavigation.css +1 -1
  88. package/dist/css/themes/Table.css +1 -1
  89. package/dist/css/themes/TableCellBase.css +1 -1
  90. package/dist/css/themes/Upload.css +1 -1
  91. package/dist/css/themes/UploadItem.css +1 -1
  92. package/dist/custom-elements-internal.json +155 -12
  93. package/dist/custom-elements.json +144 -19
  94. package/dist/generated/themes/AccordionSpotlight.css.d.ts +1 -1
  95. package/dist/generated/themes/AccordionSpotlight.css.js +1 -1
  96. package/dist/generated/themes/AccordionSpotlight.css.js.map +1 -1
  97. package/dist/generated/themes/Contact.css.d.ts +1 -1
  98. package/dist/generated/themes/Contact.css.js +1 -1
  99. package/dist/generated/themes/Contact.css.js.map +1 -1
  100. package/dist/generated/themes/EventRibbon.css.d.ts +1 -1
  101. package/dist/generated/themes/EventRibbon.css.js +1 -1
  102. package/dist/generated/themes/EventRibbon.css.js.map +1 -1
  103. package/dist/generated/themes/Feed.css.d.ts +1 -1
  104. package/dist/generated/themes/Feed.css.js +1 -1
  105. package/dist/generated/themes/Feed.css.js.map +1 -1
  106. package/dist/generated/themes/HeroBanner.css.d.ts +1 -1
  107. package/dist/generated/themes/HeroBanner.css.js +1 -1
  108. package/dist/generated/themes/HeroBanner.css.js.map +1 -1
  109. package/dist/generated/themes/ImageGridCloud.css.d.ts +1 -1
  110. package/dist/generated/themes/ImageGridCloud.css.js +1 -1
  111. package/dist/generated/themes/ImageGridCloud.css.js.map +1 -1
  112. package/dist/generated/themes/ImageGridTicker.css.d.ts +1 -1
  113. package/dist/generated/themes/ImageGridTicker.css.js +1 -1
  114. package/dist/generated/themes/ImageGridTicker.css.js.map +1 -1
  115. package/dist/generated/themes/ImageGridTickerItem.css.d.ts +1 -1
  116. package/dist/generated/themes/ImageGridTickerItem.css.js +1 -1
  117. package/dist/generated/themes/ImageGridTickerItem.css.js.map +1 -1
  118. package/dist/generated/themes/LinkList.css.d.ts +1 -1
  119. package/dist/generated/themes/LinkList.css.js +1 -1
  120. package/dist/generated/themes/LinkList.css.js.map +1 -1
  121. package/dist/generated/themes/MastheadCountrySelector.css.d.ts +1 -1
  122. package/dist/generated/themes/MastheadCountrySelector.css.js +1 -1
  123. package/dist/generated/themes/MastheadCountrySelector.css.js.map +1 -1
  124. package/dist/generated/themes/MastheadItem.css.d.ts +1 -1
  125. package/dist/generated/themes/MastheadItem.css.js +1 -1
  126. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  127. package/dist/generated/themes/MastheadMenu.css.d.ts +1 -1
  128. package/dist/generated/themes/MastheadMenu.css.js +1 -1
  129. package/dist/generated/themes/MastheadMenu.css.js.map +1 -1
  130. package/dist/generated/themes/MastheadMenuItem.css.d.ts +1 -1
  131. package/dist/generated/themes/MastheadMenuItem.css.js +1 -1
  132. package/dist/generated/themes/MastheadMenuItem.css.js.map +1 -1
  133. package/dist/generated/themes/MastheadMobileMenu.css.d.ts +1 -1
  134. package/dist/generated/themes/MastheadMobileMenu.css.js +1 -1
  135. package/dist/generated/themes/MastheadMobileMenu.css.js.map +1 -1
  136. package/dist/generated/themes/MastheadProfileMenu.css.d.ts +1 -1
  137. package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
  138. package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
  139. package/dist/generated/themes/MastheadShell.css.d.ts +1 -1
  140. package/dist/generated/themes/MastheadShell.css.js +1 -1
  141. package/dist/generated/themes/MastheadShell.css.js.map +1 -1
  142. package/dist/generated/themes/MessageStrip.css.d.ts +1 -1
  143. package/dist/generated/themes/MessageStrip.css.js +1 -1
  144. package/dist/generated/themes/MessageStrip.css.js.map +1 -1
  145. package/dist/generated/themes/Modal.css.d.ts +1 -1
  146. package/dist/generated/themes/Modal.css.js +1 -1
  147. package/dist/generated/themes/Modal.css.js.map +1 -1
  148. package/dist/generated/themes/PromoTile.css.d.ts +1 -1
  149. package/dist/generated/themes/PromoTile.css.js +1 -1
  150. package/dist/generated/themes/PromoTile.css.js.map +1 -1
  151. package/dist/generated/themes/Quote.css.d.ts +1 -1
  152. package/dist/generated/themes/Quote.css.js +1 -1
  153. package/dist/generated/themes/Quote.css.js.map +1 -1
  154. package/dist/generated/themes/Review.css.d.ts +1 -1
  155. package/dist/generated/themes/Review.css.js +1 -1
  156. package/dist/generated/themes/Review.css.js.map +1 -1
  157. package/dist/generated/themes/ReviewItem.css.d.ts +1 -1
  158. package/dist/generated/themes/ReviewItem.css.js +1 -1
  159. package/dist/generated/themes/ReviewItem.css.js.map +1 -1
  160. package/dist/generated/themes/SecondaryNavigation.css.d.ts +1 -1
  161. package/dist/generated/themes/SecondaryNavigation.css.js +1 -1
  162. package/dist/generated/themes/SecondaryNavigation.css.js.map +1 -1
  163. package/dist/generated/themes/SecondaryNavigationItem.css.d.ts +1 -1
  164. package/dist/generated/themes/SecondaryNavigationItem.css.js +1 -1
  165. package/dist/generated/themes/SecondaryNavigationItem.css.js.map +1 -1
  166. package/dist/generated/themes/SelectBase.css.d.ts +1 -1
  167. package/dist/generated/themes/SelectBase.css.js +1 -1
  168. package/dist/generated/themes/SelectBase.css.js.map +1 -1
  169. package/dist/generated/themes/SideNavigation.css.d.ts +1 -1
  170. package/dist/generated/themes/SideNavigation.css.js +1 -1
  171. package/dist/generated/themes/SideNavigation.css.js.map +1 -1
  172. package/dist/generated/themes/SideNavigationItem.css.d.ts +1 -1
  173. package/dist/generated/themes/SideNavigationItem.css.js +1 -1
  174. package/dist/generated/themes/SideNavigationItem.css.js.map +1 -1
  175. package/dist/generated/themes/SideNavigationMobile.css.d.ts +1 -1
  176. package/dist/generated/themes/SideNavigationMobile.css.js +1 -1
  177. package/dist/generated/themes/SideNavigationMobile.css.js.map +1 -1
  178. package/dist/generated/themes/SideNavigationMobileDropdown.css.d.ts +1 -1
  179. package/dist/generated/themes/SideNavigationMobileDropdown.css.js +1 -1
  180. package/dist/generated/themes/SideNavigationMobileDropdown.css.js.map +1 -1
  181. package/dist/generated/themes/SideNavigationSubItem.css.d.ts +1 -1
  182. package/dist/generated/themes/SideNavigationSubItem.css.js +1 -1
  183. package/dist/generated/themes/SideNavigationSubItem.css.js.map +1 -1
  184. package/dist/generated/themes/TabNavigation.css.d.ts +1 -1
  185. package/dist/generated/themes/TabNavigation.css.js +1 -1
  186. package/dist/generated/themes/TabNavigation.css.js.map +1 -1
  187. package/dist/generated/themes/Table.css.d.ts +1 -1
  188. package/dist/generated/themes/Table.css.js +1 -1
  189. package/dist/generated/themes/Table.css.js.map +1 -1
  190. package/dist/generated/themes/TableCellBase.css.d.ts +1 -1
  191. package/dist/generated/themes/TableCellBase.css.js +1 -1
  192. package/dist/generated/themes/TableCellBase.css.js.map +1 -1
  193. package/dist/generated/themes/Upload.css.d.ts +1 -1
  194. package/dist/generated/themes/Upload.css.js +1 -1
  195. package/dist/generated/themes/Upload.css.js.map +1 -1
  196. package/dist/generated/themes/UploadItem.css.d.ts +1 -1
  197. package/dist/generated/themes/UploadItem.css.js +1 -1
  198. package/dist/generated/themes/UploadItem.css.js.map +1 -1
  199. package/dist/types/Table.d.ts +6 -2
  200. package/dist/types/Table.js +7 -2
  201. package/dist/types/Table.js.map +1 -1
  202. package/dist/vscode.html-custom-data.json +44 -3
  203. package/dist/web-types.json +80 -6
  204. package/package.json +1 -1
  205. package/run-cypress.js +8 -1
  206. package/src/Carousel.ts +17 -1
  207. package/src/Pagination.ts +2 -3
  208. package/src/SearchableListBaseTemplate.tsx +0 -1
  209. package/src/SecondaryNavigation.ts +2 -1
  210. package/src/SecondaryNavigationItem.ts +14 -6
  211. package/src/SecondaryNavigationTemplate.tsx +4 -6
  212. package/src/SelectBase.ts +1 -1
  213. package/src/SideNavigation.ts +35 -0
  214. package/src/SideNavigationItem.ts +75 -0
  215. package/src/SideNavigationMobileTemplate.tsx +2 -1
  216. package/src/SideNavigationSubItem.ts +117 -1
  217. package/src/SideNavigationSubItemTemplate.tsx +56 -0
  218. package/src/Table.ts +1 -2
  219. package/src/TableCell.ts +9 -12
  220. package/src/TableCellBase.ts +10 -1
  221. package/src/TableHeaderCell.ts +0 -5
  222. package/src/TableRow.ts +20 -0
  223. package/src/UploadItem.ts +3 -5
  224. package/src/generated/themes/AccordionSpotlight.css.ts +1 -1
  225. package/src/generated/themes/Contact.css.ts +1 -1
  226. package/src/generated/themes/EventRibbon.css.ts +1 -1
  227. package/src/generated/themes/Feed.css.ts +1 -1
  228. package/src/generated/themes/HeroBanner.css.ts +1 -1
  229. package/src/generated/themes/ImageGridCloud.css.ts +1 -1
  230. package/src/generated/themes/ImageGridTicker.css.ts +1 -1
  231. package/src/generated/themes/ImageGridTickerItem.css.ts +1 -1
  232. package/src/generated/themes/LinkList.css.ts +1 -1
  233. package/src/generated/themes/MastheadCountrySelector.css.ts +1 -1
  234. package/src/generated/themes/MastheadItem.css.ts +1 -1
  235. package/src/generated/themes/MastheadMenu.css.ts +1 -1
  236. package/src/generated/themes/MastheadMenuItem.css.ts +1 -1
  237. package/src/generated/themes/MastheadMobileMenu.css.ts +1 -1
  238. package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
  239. package/src/generated/themes/MastheadShell.css.ts +1 -1
  240. package/src/generated/themes/MessageStrip.css.ts +1 -1
  241. package/src/generated/themes/Modal.css.ts +1 -1
  242. package/src/generated/themes/PromoTile.css.ts +1 -1
  243. package/src/generated/themes/Quote.css.ts +1 -1
  244. package/src/generated/themes/Review.css.ts +1 -1
  245. package/src/generated/themes/ReviewItem.css.ts +1 -1
  246. package/src/generated/themes/SecondaryNavigation.css.ts +1 -1
  247. package/src/generated/themes/SecondaryNavigationItem.css.ts +1 -1
  248. package/src/generated/themes/SelectBase.css.ts +1 -1
  249. package/src/generated/themes/SideNavigation.css.ts +1 -1
  250. package/src/generated/themes/SideNavigationItem.css.ts +1 -1
  251. package/src/generated/themes/SideNavigationMobile.css.ts +1 -1
  252. package/src/generated/themes/SideNavigationMobileDropdown.css.ts +1 -1
  253. package/src/generated/themes/SideNavigationSubItem.css.ts +1 -1
  254. package/src/generated/themes/TabNavigation.css.ts +1 -1
  255. package/src/generated/themes/Table.css.ts +1 -1
  256. package/src/generated/themes/TableCellBase.css.ts +1 -1
  257. package/src/generated/themes/Upload.css.ts +1 -1
  258. package/src/generated/themes/UploadItem.css.ts +1 -1
  259. package/src/themes/AccordionSpotlight.css +4 -1
  260. package/src/themes/Contact.css +1 -1
  261. package/src/themes/EventRibbon.css +4 -4
  262. package/src/themes/Feed.css +2 -2
  263. package/src/themes/HeroBanner.css +3 -3
  264. package/src/themes/ImageGridCloud.css +1 -1
  265. package/src/themes/ImageGridTicker.css +1 -1
  266. package/src/themes/ImageGridTickerItem.css +1 -1
  267. package/src/themes/LinkList.css +4 -4
  268. package/src/themes/MastheadCountrySelector.css +1 -1
  269. package/src/themes/MastheadItem.css +4 -4
  270. package/src/themes/MastheadMenu.css +1 -1
  271. package/src/themes/MastheadMenuItem.css +1 -1
  272. package/src/themes/MastheadMobileMenu.css +2 -2
  273. package/src/themes/MastheadProfileMenu.css +1 -1
  274. package/src/themes/MastheadShell.css +4 -4
  275. package/src/themes/MessageStrip.css +7 -2
  276. package/src/themes/Modal.css +1 -1
  277. package/src/themes/PromoTile.css +4 -3
  278. package/src/themes/Quote.css +2 -2
  279. package/src/themes/Review.css +2 -2
  280. package/src/themes/ReviewItem.css +2 -2
  281. package/src/themes/SecondaryNavigation.css +1 -2
  282. package/src/themes/SecondaryNavigationItem.css +3 -6
  283. package/src/themes/SelectBase.css +1 -1
  284. package/src/themes/SideNavigation.css +31 -8
  285. package/src/themes/SideNavigationItem.css +46 -18
  286. package/src/themes/SideNavigationMobile.css +6 -7
  287. package/src/themes/SideNavigationMobileDropdown.css +10 -3
  288. package/src/themes/SideNavigationSubItem.css +73 -17
  289. package/src/themes/TabNavigation.css +2 -2
  290. package/src/themes/Table.css +1 -1
  291. package/src/themes/TableCellBase.css +8 -0
  292. package/src/themes/Upload.css +1 -1
  293. package/src/themes/UploadItem.css +1 -1
  294. package/src/types/Table.ts +6 -2
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 = () => {
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
@@ -720,7 +720,7 @@ class UDExSelectBase extends UDExSearchableListBase {
720
720
  }
721
721
 
722
722
  // Sync _selectedOption display for the first item (used when popover just opened via click).
723
- if (!this._activeDescendantItem && hasItems) {
723
+ if (popoverOpened && !this._activeDescendantItem && hasItems) {
724
724
  this._selectedOption = items[firstIndex].label;
725
725
  }
726
726
  }
@@ -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();
@@ -1,6 +1,9 @@
1
1
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
2
2
  import jsxRenderer from "@ui5/webcomponents-base/dist/renderer/JsxRenderer.js";
3
3
  import SideNavigationItem from "@ui5/webcomponents-fiori/dist/SideNavigationItem.js";
4
+ import type SideNavigationItemBase from "@ui5/webcomponents-fiori/dist/SideNavigationItemBase.js";
5
+ import type SideNavigationSelectableItemBase from "@ui5/webcomponents-fiori/dist/SideNavigationSelectableItemBase.js";
6
+ import type UDExSideNavigationSubItem from "./SideNavigationSubItem.js";
4
7
 
5
8
  // Styles
6
9
  import SideNavigationItemCss from "./generated/themes/SideNavigationItem.css.js";
@@ -30,6 +33,78 @@ import { isDesktop } from "@ui5/webcomponents-base";
30
33
  })
31
34
 
32
35
  class UDExSideNavigationItem extends SideNavigationItem {
36
+ get _selected() {
37
+ if (this.sideNavCollapsed) {
38
+ return this.selected || this.items.some(item => item.selected);
39
+ }
40
+ return this.selected;
41
+ }
42
+
43
+ get focusableItems(): Array<SideNavigationItemBase> {
44
+ // Recurse one level into expanded level-2 sub-items so their level-3 children join
45
+ // the Side Navigation's keyboard focus set (UI5's base getter is flat). Only one level
46
+ // of recursion is needed because the component supports at most three nesting levels.
47
+ if (!this.sideNavCollapsed && this.expanded) {
48
+ return [this, ...this.items.reduce((result, item) => {
49
+ return result.concat((item as UDExSideNavigationSubItem).focusableItems || [item]);
50
+ }, new Array<SideNavigationItemBase>())];
51
+ }
52
+ return super.focusableItems;
53
+ }
54
+
55
+ get selectableItems(): Array<SideNavigationSelectableItemBase> {
56
+ // Recurse one level into level-2 sub-items so their level-3 children are part of the
57
+ // Side Navigation's selection registry (UI5's base getter is flat). Without this the
58
+ // selection sweep in SideNavigation._selectItem never reaches level 3, so selecting a
59
+ // level-3 item would not deselect items at other levels, and vice versa.
60
+ return this.items.reduce((result, item) => {
61
+ return result.concat((item as UDExSideNavigationSubItem).selectableItems || [item]);
62
+ }, new Array<SideNavigationSelectableItemBase>(this));
63
+ }
64
+
65
+ get allItems(): Array<SideNavigationItemBase> {
66
+ // Recurse one level into level-2 sub-items so level-3 children are enumerated by
67
+ // SideNavigation._getAllItems. That loop wires `sideNavigation` (and collapsed state)
68
+ // onto every item; without this, level-3 items never get `sideNavigation` set and
69
+ // their click handler cannot reach SideNavigation._handleItemClick to fire selection-change.
70
+ return this.items.reduce((result, item) => {
71
+ return result.concat((item as UDExSideNavigationSubItem).allItems || [item]);
72
+ }, new Array<SideNavigationItemBase>(this));
73
+ }
74
+
75
+ _initialExpandDone = false;
76
+
77
+ onBeforeRendering() {
78
+ super.onBeforeRendering();
79
+ // Open the group once on initial render if it contains a selected child, so the
80
+ // selection is visible. Do not re-apply on later renders — that would prevent the
81
+ // user from collapsing a group while one of its children stays selected.
82
+ if (!this._initialExpandDone) {
83
+ this._initialExpandDone = true;
84
+ if (!this.sideNavCollapsed && !this.expanded && this.items.some(item => item.selected)) {
85
+ this.expanded = true;
86
+ }
87
+ }
88
+ }
89
+
90
+ _onclick(e: MouseEvent) {
91
+ // A grouping item (one with sub-items) toggles expand/collapse on click and
92
+ // never navigates — a parent with children must not have an href. Only leaf
93
+ // items navigate, so they fall through to the base handler.
94
+ if (this.hasSubItems && !this.sideNavCollapsed) {
95
+ e.preventDefault();
96
+ e.stopPropagation();
97
+ this.expanded = !this.expanded;
98
+ return;
99
+ }
100
+ super._onclick(e);
101
+ }
102
+
103
+ _onToggleClick(e: CustomEvent) {
104
+ e.preventDefault();
105
+ super._onToggleClick(e);
106
+ }
107
+
33
108
  onEnterDOM() {
34
109
  this.setAttribute("id", this._id);
35
110
 
@@ -51,7 +51,8 @@ export default function SideNavigationMobileTemplate(this: UDExSideNavigationMob
51
51
  }}>
52
52
  <UDExSideNavigation
53
53
  ref={this._setNavItems}
54
- onSelectionChange={this._handleSelectionChanged as any}>
54
+ onSelectionChange={this._handleSelectionChanged as any}
55
+ {...{ "in-mobile": "" }}>
55
56
  </UDExSideNavigation>
56
57
  </UDExDropdown>
57
58
  </>
@@ -1,6 +1,16 @@
1
1
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
2
2
  import jsxRenderer from "@ui5/webcomponents-base/dist/renderer/JsxRenderer.js";
3
+ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
4
+ import slot from "@ui5/webcomponents-base/dist/decorators/slot-strict.js";
5
+ import type { DefaultSlot } from "@ui5/webcomponents-base/dist/UI5Element.js";
6
+ import {
7
+ isLeft,
8
+ isRight,
9
+ isMinus,
10
+ isPlus,
11
+ } from "@ui5/webcomponents-base/dist/Keys.js";
3
12
  import SideNavigationSubItem from "@ui5/webcomponents-fiori/dist/SideNavigationSubItem.js";
13
+ import SideNavigationSubItemTemplate from "./SideNavigationSubItemTemplate.js";
4
14
 
5
15
  // Styles
6
16
  import SideNavigationSubItemCss from "./generated/themes/SideNavigationSubItem.css.js";
@@ -25,10 +35,116 @@ import SideNavigationSubItemCss from "./generated/themes/SideNavigationSubItem.c
25
35
  @customElement({
26
36
  tag: "udex-side-navigation-sub-item",
27
37
  renderer: jsxRenderer,
38
+ template: SideNavigationSubItemTemplate,
28
39
  styles: [SideNavigationSubItem.styles, SideNavigationSubItemCss],
40
+ dependencies: [UDExSideNavigationSubItem],
29
41
  })
30
42
 
31
- class UDExSideNavigationSubItem extends SideNavigationSubItem {}
43
+ class UDExSideNavigationSubItem extends SideNavigationSubItem {
44
+ /**
45
+ * Defines whether the sub-item is expanded (shows level-3 children).
46
+ *
47
+ * @default false
48
+ * @public
49
+ */
50
+ @property({ type: Boolean })
51
+ expanded = false;
52
+
53
+ /**
54
+ * Defines the level-3 sub-items slotted inside this sub-item.
55
+ * @public
56
+ */
57
+ @slot({ type: HTMLElement, invalidateOnChildChange: true, "default": true })
58
+ subItems!: DefaultSlot<UDExSideNavigationSubItem>;
59
+
60
+ get hasSubItems() {
61
+ return this.subItems.length > 0;
62
+ }
63
+
64
+ get focusableItems(): Array<UDExSideNavigationSubItem> {
65
+ if (this.hasSubItems && this.expanded) {
66
+ return [this, ...this.subItems];
67
+ }
68
+ return [this];
69
+ }
70
+
71
+ get selectableItems(): Array<UDExSideNavigationSubItem> {
72
+ // Expose this level-2 sub-item plus its level-3 children so the Side Navigation's
73
+ // selection registry (built by UDExSideNavigationItem.selectableItems) reaches level 3.
74
+ return this.hasSubItems ? [this, ...this.subItems] : [this];
75
+ }
76
+
77
+ get allItems(): Array<UDExSideNavigationSubItem> {
78
+ // Expose this sub-item plus its level-3 children so SideNavigation._getAllItems wires
79
+ // `sideNavigation` and collapsed state onto level-3 items. Without it, a level-3 leaf's
80
+ // click handler has no `sideNavigation` reference and cannot fire selection-change.
81
+ return this.hasSubItems ? [this, ...this.subItems] : [this];
82
+ }
83
+
84
+ onBeforeRendering() {
85
+ super.onBeforeRendering();
86
+ this.subItems.forEach(subItem => {
87
+ if (!subItem.hasAttribute("nested")) { subItem.setAttribute("nested", ""); }
88
+ });
89
+ }
90
+
91
+ get _subGroupId(): string | undefined {
92
+ return this.hasSubItems ? `${this._id}-group` : undefined;
93
+ }
94
+
95
+ get _subExpanded(): boolean | undefined {
96
+ return this.hasSubItems ? this.expanded : undefined;
97
+ }
98
+
99
+ _onToggleClick(e: Event) {
100
+ e.stopPropagation();
101
+ e.preventDefault();
102
+ this.expanded = !this.expanded;
103
+ }
104
+
105
+ _onkeydown(e: KeyboardEvent) {
106
+ if (this.hasSubItems && !this.sideNavCollapsed) {
107
+ const isRTL = this.effectiveDir === "rtl";
108
+ if (isLeft(e)) {
109
+ e.preventDefault();
110
+ this.expanded = isRTL;
111
+ return;
112
+ }
113
+ if (isRight(e)) {
114
+ e.preventDefault();
115
+ this.expanded = !isRTL;
116
+ return;
117
+ }
118
+ if (isMinus(e)) {
119
+ e.preventDefault();
120
+ this.expanded = false;
121
+ return;
122
+ }
123
+ if (isPlus(e)) {
124
+ e.preventDefault();
125
+ this.expanded = true;
126
+ return;
127
+ }
128
+ }
129
+ // Level-3 leaves fall through to the base, which activates on Enter and fires
130
+ // selection-change — the same behaviour as level-1 and level-2 leaves.
131
+ super._onkeydown(e);
132
+ }
133
+
134
+ _onclick(e: MouseEvent) {
135
+ // A group sub-item (one with sub-items) toggles expand/collapse and never navigates —
136
+ // a parent with children must not have an href. A leaf (including a level-3 leaf) falls
137
+ // through to the base handler, which fires selection-change and navigates via its href,
138
+ // exactly like level-1 and level-2 leaves.
139
+ if (this.hasSubItems) {
140
+ e.preventDefault();
141
+ e.stopPropagation();
142
+ this.expanded = !this.expanded;
143
+ } else {
144
+ super._onclick(e);
145
+ }
146
+ }
147
+ }
32
148
 
33
149
  UDExSideNavigationSubItem.define();
34
150
 
@@ -0,0 +1,56 @@
1
+ import Icon from "@ui5/webcomponents/dist/Icon.js";
2
+ import arrowRight from "@ui5/webcomponents-icons/dist/arrow-right.js";
3
+ import navRightArrow from "@ui5/webcomponents-icons/dist/navigation-right-arrow.js";
4
+ import navDownArrow from "@ui5/webcomponents-icons/dist/navigation-down-arrow.js";
5
+ import type UDExSideNavigationSubItem from "./SideNavigationSubItem.js";
6
+
7
+ export default function SideNavigationSubItemTemplate(this: UDExSideNavigationSubItem) {
8
+ const EffectiveTag = this._effectiveTag;
9
+ return (
10
+ <li id={this._id} class="ui5-sn-list-li" role="none">
11
+ <EffectiveTag
12
+ id={this._id}
13
+ data-sap-focus-ref
14
+ class={`ui5-sn-item ui5-sn-item-level2 ${this._classes}`}
15
+ role={this.ariaRole}
16
+ onKeyDown={this._onkeydown}
17
+ onKeyUp={this._onkeyup}
18
+ onClick={this._onclick}
19
+ onFocusIn={this._onfocusin}
20
+ tabIndex={this.effectiveTabIndex}
21
+ aria-current={this._ariaCurrent}
22
+ aria-selected={this._ariaSelected}
23
+ aria-label={this.accessibleName || undefined}
24
+ title={this._tooltip}
25
+ aria-disabled={this.effectiveDisabled}
26
+ href={this._href}
27
+ target={this._target}
28
+ aria-haspopup={this._ariaHasPopup}
29
+ aria-describedby={this._describedBy}
30
+ aria-expanded={this._subExpanded}
31
+ aria-owns={this._subGroupId}
32
+ >
33
+ {this.icon && <Icon class="ui5-sn-item-icon" name={this.icon} />}
34
+ <div class="ui5-sn-item-text" id={this._textId}>{this.text}</div>
35
+ {this.hasTag && (
36
+ <div id={this._tagId} class="ui5-sn-item-tag-slot">
37
+ <slot name="tag" />
38
+ </div>
39
+ )}
40
+ {this.hasSubItems && (
41
+ <Icon
42
+ class="ui5-sn-item-toggle-icon"
43
+ name={this.expanded ? navDownArrow : navRightArrow}
44
+ onClick={(e: Event) => this._onToggleClick(e)}
45
+ />
46
+ )}
47
+ {this.isExternalLink && <Icon class="ui5-sn-item-external-link-icon" name={arrowRight} />}
48
+ </EffectiveTag>
49
+ {this.hasSubItems && (
50
+ <ul id={this._subGroupId} class="ui5-sn-item-ul" role="group">
51
+ <slot />
52
+ </ul>
53
+ )}
54
+ </li>
55
+ );
56
+ }
package/src/Table.ts CHANGED
@@ -15,11 +15,10 @@ import { TABLE_NO_DATA_FOUND } from "./generated/i18n/i18n-defaults.js";
15
15
  import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
16
16
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
17
17
  import TableTemplate from "./TableTemplate.js";
18
-
18
+ import translate from "./utils/translate.js";
19
19
  // Styles
20
20
  import TableCss from "./generated/themes/Table.css.js";
21
21
  import getEffectiveScrollbarStyle from "./utils/getEffectiveScrollbarStyle.js";
22
- import translate from "./utils/translate.js";
23
22
 
24
23
  export type TableBaseRow = UDExTableHeaderRow | UDExTableRow;
25
24
 
package/src/TableCell.ts CHANGED
@@ -3,6 +3,7 @@ import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
3
3
  import property from "@ui5/webcomponents-base/dist/decorators/property.js";
4
4
  import UDExTableCellBase from "./TableCellBase.js";
5
5
  import TableCellTemplate from "./TableCellTemplate.js";
6
+ import { UDExTableCellVerticalAlign } from "./types/Table.js";
6
7
 
7
8
  // Styles
8
9
  import TableCellCss from "./generated/themes/TableCell.css.js";
@@ -50,18 +51,14 @@ class UDExTableCell extends UDExTableCellBase {
50
51
  @property({ type: Boolean })
51
52
  _highlighted?: boolean;
52
53
 
53
- onBeforeRendering() {
54
- super.onBeforeRendering();
55
- this.setJustifyContent();
56
- }
57
-
58
- setJustifyContent(): void {
59
- if (this.horizontalAlign) {
60
- this.style.justifyContent = this.horizontalAlign;
61
- } else {
62
- this.style.justifyContent = `var(--horizontal-align-${(this)._individualSlot})`;
63
- }
64
- }
54
+ /**
55
+ * Determines the vertical alignment of the cell content.
56
+ *
57
+ * @default "Center"
58
+ * @public
59
+ */
60
+ @property()
61
+ verticalAlign: `${UDExTableCellVerticalAlign}` = UDExTableCellVerticalAlign.Center;
65
62
  }
66
63
 
67
64
  UDExTableCell.define();
@@ -4,7 +4,7 @@ import customElement from "@ui5/webcomponents-base/dist/decorators/customElement
4
4
  import slot from "@ui5/webcomponents-base/dist/decorators/slot-strict.js";
5
5
  import property from "@ui5/webcomponents-base/dist/decorators/property.js";
6
6
  import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
7
- import type UDExTableCellHorizontalAlign from "./types/Table.js";
7
+ import type { UDExTableCellHorizontalAlign } from "./types/Table.js";
8
8
 
9
9
  // Styles
10
10
  import TableCellBaseCss from "./generated/themes/TableCellBase.css.js";
@@ -62,6 +62,15 @@ abstract class UDExTableCellBase extends UI5Element {
62
62
 
63
63
  onBeforeRendering() {
64
64
  this.setAttribute("role", this.ariaRole);
65
+ this.setJustifyContent();
66
+ }
67
+
68
+ setJustifyContent(): void {
69
+ if (this.horizontalAlign) {
70
+ this.style.justifyContent = this.horizontalAlign;
71
+ } else {
72
+ this.style.justifyContent = `var(--horizontal-align-${this._individualSlot})`;
73
+ }
65
74
  }
66
75
  }
67
76
 
@@ -61,11 +61,6 @@ class UDExTableHeaderCell extends UDExTableCellBase {
61
61
 
62
62
  protected ariaRole: string = "columnheader";
63
63
 
64
- onBeforeRendering() {
65
- super.onBeforeRendering();
66
- this.style.justifyContent = `var(--horizontal-align-${this._individualSlot})`;
67
- }
68
-
69
64
  get _hasIcons(): boolean {
70
65
  return this.iconStart.length > 0 || this.iconEnd.length > 0;
71
66
  }
package/src/TableRow.ts CHANGED
@@ -4,6 +4,7 @@ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
4
4
  import UDExTableRowBase from "./TableRowBase.js";
5
5
  import type UDExTableCell from "./TableCell.js";
6
6
  import TableRowTemplate from "./TableRowTemplate.js";
7
+ import { UDExTableCellVerticalAlign } from "./types/Table.js";
7
8
 
8
9
  /**
9
10
  * @class
@@ -48,10 +49,21 @@ class UDExTableRow extends UDExTableRowBase {
48
49
  @property({ type: Boolean })
49
50
  highlighted?: boolean;
50
51
 
52
+ /**
53
+ * Determines the vertical alignment of all cells in the row.
54
+ * Applies to every cell that does not define its own verticalAlign.
55
+ *
56
+ * @default "Center"
57
+ * @public
58
+ */
59
+ @property()
60
+ verticalAlign: `${UDExTableCellVerticalAlign}` = UDExTableCellVerticalAlign.Center;
61
+
51
62
  onBeforeRendering(): void {
52
63
  if (this.highlighted) {
53
64
  this._setHighlightToCells();
54
65
  }
66
+ this._setVerticalAlignToCells();
55
67
  }
56
68
 
57
69
  _setHighlightToCells(): void {
@@ -60,6 +72,14 @@ class UDExTableRow extends UDExTableRowBase {
60
72
  });
61
73
  }
62
74
 
75
+ _setVerticalAlignToCells(): void {
76
+ this.cellsInRow.forEach(cell => {
77
+ if (cell.verticalAlign === UDExTableCellVerticalAlign.Center) {
78
+ cell.verticalAlign = this.verticalAlign;
79
+ }
80
+ });
81
+ }
82
+
63
83
  get isGroup(): boolean {
64
84
  return false;
65
85
  }