@ui5/webcomponents-fiori 2.23.0-rc.2 → 2.24.0-rc.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 (143) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/DynamicPage.d.ts +59 -0
  4. package/dist/DynamicPage.js +39 -1
  5. package/dist/DynamicPage.js.map +1 -1
  6. package/dist/DynamicPageHeader.d.ts +8 -0
  7. package/dist/DynamicPageHeader.js +6 -0
  8. package/dist/DynamicPageHeader.js.map +1 -1
  9. package/dist/DynamicPageTemplate.js +3 -3
  10. package/dist/DynamicPageTemplate.js.map +1 -1
  11. package/dist/HeroBanner.d.ts +147 -0
  12. package/dist/HeroBanner.js +165 -0
  13. package/dist/HeroBanner.js.map +1 -0
  14. package/dist/HeroBannerTemplate.d.ts +2 -0
  15. package/dist/HeroBannerTemplate.js +17 -0
  16. package/dist/HeroBannerTemplate.js.map +1 -0
  17. package/dist/NotificationListItem.d.ts +0 -1
  18. package/dist/NotificationListItem.js +2 -3
  19. package/dist/NotificationListItem.js.map +1 -1
  20. package/dist/ShellBar.d.ts +0 -1
  21. package/dist/ShellBar.js +2 -11
  22. package/dist/ShellBar.js.map +1 -1
  23. package/dist/ShellBarTemplate.js +1 -1
  24. package/dist/ShellBarTemplate.js.map +1 -1
  25. package/dist/Timeline.d.ts +52 -1
  26. package/dist/Timeline.js +66 -0
  27. package/dist/Timeline.js.map +1 -1
  28. package/dist/TimelineTemplate.js +4 -1
  29. package/dist/TimelineTemplate.js.map +1 -1
  30. package/dist/bundle.esm.js +1 -0
  31. package/dist/bundle.esm.js.map +1 -1
  32. package/dist/css/themes/HeroBanner.css +1 -0
  33. package/dist/css/themes/Timeline.css +1 -1
  34. package/dist/css/themes/sap_fiori_3/parameters-bundle.css +1 -1
  35. package/dist/css/themes/sap_fiori_3_dark/parameters-bundle.css +1 -1
  36. package/dist/css/themes/sap_fiori_3_hcb/parameters-bundle.css +1 -1
  37. package/dist/css/themes/sap_fiori_3_hcw/parameters-bundle.css +1 -1
  38. package/dist/css/themes/sap_horizon/parameters-bundle.css +1 -1
  39. package/dist/css/themes/sap_horizon_auto/parameters-bundle.css +6 -0
  40. package/dist/css/themes/sap_horizon_dark/parameters-bundle.css +6 -0
  41. package/dist/css/themes/sap_horizon_dark_exp/parameters-bundle.css +6 -0
  42. package/dist/css/themes/sap_horizon_exp/parameters-bundle.css +6 -0
  43. package/dist/css/themes/sap_horizon_hc_auto/parameters-bundle.css +6 -0
  44. package/dist/css/themes/sap_horizon_hcb/parameters-bundle.css +6 -0
  45. package/dist/css/themes/sap_horizon_hcb_exp/parameters-bundle.css +6 -0
  46. package/dist/css/themes/sap_horizon_hcw/parameters-bundle.css +6 -0
  47. package/dist/css/themes/sap_horizon_hcw_exp/parameters-bundle.css +6 -0
  48. package/dist/custom-elements-internal.json +471 -137
  49. package/dist/custom-elements.json +346 -5
  50. package/dist/generated/assets/themes/sap_fiori_3/parameters-bundle.css.json +1 -1
  51. package/dist/generated/assets/themes/sap_fiori_3_dark/parameters-bundle.css.json +1 -1
  52. package/dist/generated/assets/themes/sap_fiori_3_hcb/parameters-bundle.css.json +1 -1
  53. package/dist/generated/assets/themes/sap_fiori_3_hcw/parameters-bundle.css.json +1 -1
  54. package/dist/generated/assets/themes/sap_horizon/parameters-bundle.css.json +1 -1
  55. package/dist/generated/assets/themes/sap_horizon_auto/parameters-bundle.css.json +1 -1
  56. package/dist/generated/assets/themes/sap_horizon_dark/parameters-bundle.css.json +1 -1
  57. package/dist/generated/assets/themes/sap_horizon_dark_exp/parameters-bundle.css.json +1 -1
  58. package/dist/generated/assets/themes/sap_horizon_exp/parameters-bundle.css.json +1 -1
  59. package/dist/generated/assets/themes/sap_horizon_hc_auto/parameters-bundle.css.json +1 -1
  60. package/dist/generated/assets/themes/sap_horizon_hcb/parameters-bundle.css.json +1 -1
  61. package/dist/generated/assets/themes/sap_horizon_hcb_exp/parameters-bundle.css.json +1 -1
  62. package/dist/generated/assets/themes/sap_horizon_hcw/parameters-bundle.css.json +1 -1
  63. package/dist/generated/assets/themes/sap_horizon_hcw_exp/parameters-bundle.css.json +1 -1
  64. package/dist/generated/themes/HeroBanner.css.d.ts +2 -0
  65. package/dist/generated/themes/HeroBanner.css.js +8 -0
  66. package/dist/generated/themes/HeroBanner.css.js.map +1 -0
  67. package/dist/generated/themes/Timeline.css.d.ts +1 -1
  68. package/dist/generated/themes/Timeline.css.js +1 -1
  69. package/dist/generated/themes/Timeline.css.js.map +1 -1
  70. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.d.ts +1 -1
  71. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.js +1 -1
  72. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.js.map +1 -1
  73. package/dist/generated/themes/sap_fiori_3_dark/parameters-bundle.css.d.ts +1 -1
  74. package/dist/generated/themes/sap_fiori_3_dark/parameters-bundle.css.js +1 -1
  75. package/dist/generated/themes/sap_fiori_3_dark/parameters-bundle.css.js.map +1 -1
  76. package/dist/generated/themes/sap_fiori_3_hcb/parameters-bundle.css.d.ts +1 -1
  77. package/dist/generated/themes/sap_fiori_3_hcb/parameters-bundle.css.js +1 -1
  78. package/dist/generated/themes/sap_fiori_3_hcb/parameters-bundle.css.js.map +1 -1
  79. package/dist/generated/themes/sap_fiori_3_hcw/parameters-bundle.css.d.ts +1 -1
  80. package/dist/generated/themes/sap_fiori_3_hcw/parameters-bundle.css.js +1 -1
  81. package/dist/generated/themes/sap_fiori_3_hcw/parameters-bundle.css.js.map +1 -1
  82. package/dist/generated/themes/sap_horizon/parameters-bundle.css.d.ts +1 -1
  83. package/dist/generated/themes/sap_horizon/parameters-bundle.css.js +1 -1
  84. package/dist/generated/themes/sap_horizon/parameters-bundle.css.js.map +1 -1
  85. package/dist/generated/themes/sap_horizon_auto/parameters-bundle.css.d.ts +1 -1
  86. package/dist/generated/themes/sap_horizon_auto/parameters-bundle.css.js +6 -0
  87. package/dist/generated/themes/sap_horizon_auto/parameters-bundle.css.js.map +1 -1
  88. package/dist/generated/themes/sap_horizon_dark/parameters-bundle.css.d.ts +1 -1
  89. package/dist/generated/themes/sap_horizon_dark/parameters-bundle.css.js +6 -0
  90. package/dist/generated/themes/sap_horizon_dark/parameters-bundle.css.js.map +1 -1
  91. package/dist/generated/themes/sap_horizon_dark_exp/parameters-bundle.css.d.ts +1 -1
  92. package/dist/generated/themes/sap_horizon_dark_exp/parameters-bundle.css.js +6 -0
  93. package/dist/generated/themes/sap_horizon_dark_exp/parameters-bundle.css.js.map +1 -1
  94. package/dist/generated/themes/sap_horizon_exp/parameters-bundle.css.d.ts +1 -1
  95. package/dist/generated/themes/sap_horizon_exp/parameters-bundle.css.js +6 -0
  96. package/dist/generated/themes/sap_horizon_exp/parameters-bundle.css.js.map +1 -1
  97. package/dist/generated/themes/sap_horizon_hc_auto/parameters-bundle.css.d.ts +1 -1
  98. package/dist/generated/themes/sap_horizon_hc_auto/parameters-bundle.css.js +6 -0
  99. package/dist/generated/themes/sap_horizon_hc_auto/parameters-bundle.css.js.map +1 -1
  100. package/dist/generated/themes/sap_horizon_hcb/parameters-bundle.css.d.ts +1 -1
  101. package/dist/generated/themes/sap_horizon_hcb/parameters-bundle.css.js +6 -0
  102. package/dist/generated/themes/sap_horizon_hcb/parameters-bundle.css.js.map +1 -1
  103. package/dist/generated/themes/sap_horizon_hcb_exp/parameters-bundle.css.d.ts +1 -1
  104. package/dist/generated/themes/sap_horizon_hcb_exp/parameters-bundle.css.js +6 -0
  105. package/dist/generated/themes/sap_horizon_hcb_exp/parameters-bundle.css.js.map +1 -1
  106. package/dist/generated/themes/sap_horizon_hcw/parameters-bundle.css.d.ts +1 -1
  107. package/dist/generated/themes/sap_horizon_hcw/parameters-bundle.css.js +6 -0
  108. package/dist/generated/themes/sap_horizon_hcw/parameters-bundle.css.js.map +1 -1
  109. package/dist/generated/themes/sap_horizon_hcw_exp/parameters-bundle.css.d.ts +1 -1
  110. package/dist/generated/themes/sap_horizon_hcw_exp/parameters-bundle.css.js +6 -0
  111. package/dist/generated/themes/sap_horizon_hcw_exp/parameters-bundle.css.js.map +1 -1
  112. package/dist/types/HeroBannerActionsPlacement.d.ts +20 -0
  113. package/dist/types/HeroBannerActionsPlacement.js +22 -0
  114. package/dist/types/HeroBannerActionsPlacement.js.map +1 -0
  115. package/dist/types/HeroBannerColumnsRatio.d.ts +21 -0
  116. package/dist/types/HeroBannerColumnsRatio.js +23 -0
  117. package/dist/types/HeroBannerColumnsRatio.js.map +1 -0
  118. package/dist/types/HeroBannerHeaderBlockPlacement.d.ts +20 -0
  119. package/dist/types/HeroBannerHeaderBlockPlacement.js +22 -0
  120. package/dist/types/HeroBannerHeaderBlockPlacement.js.map +1 -0
  121. package/dist/vscode.html-custom-data.json +50 -2
  122. package/dist/web-types.json +153 -4
  123. package/package.json +7 -7
  124. package/src/DynamicPageTemplate.tsx +7 -5
  125. package/src/HeroBannerTemplate.tsx +65 -0
  126. package/src/ShellBarTemplate.tsx +1 -1
  127. package/src/TimelineTemplate.tsx +15 -1
  128. package/src/themes/HeroBanner.css +359 -0
  129. package/src/themes/Timeline.css +36 -7
  130. package/src/themes/base/HeroBanner-parameters.css +8 -0
  131. package/src/themes/sap_fiori_3/parameters-bundle.css +1 -0
  132. package/src/themes/sap_fiori_3_dark/parameters-bundle.css +1 -0
  133. package/src/themes/sap_fiori_3_hcb/parameters-bundle.css +1 -0
  134. package/src/themes/sap_fiori_3_hcw/parameters-bundle.css +1 -0
  135. package/src/themes/sap_horizon/HeroBanner-parameters.css +4 -0
  136. package/src/themes/sap_horizon/parameters-bundle.css +2 -0
  137. package/src/themes/sap_horizon_dark/parameters-bundle.css +1 -0
  138. package/src/themes/sap_horizon_dark_exp/parameters-bundle.css +1 -0
  139. package/src/themes/sap_horizon_exp/parameters-bundle.css +2 -0
  140. package/src/themes/sap_horizon_hcb/parameters-bundle.css +1 -0
  141. package/src/themes/sap_horizon_hcb_exp/parameters-bundle.css +1 -0
  142. package/src/themes/sap_horizon_hcw/parameters-bundle.css +1 -0
  143. package/src/themes/sap_horizon_hcw_exp/parameters-bundle.css +1 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ui5/webcomponents-fiori",
3
- "version": "2.23.0-rc.2",
3
+ "version": "2.24.0-rc.0",
4
4
  "description": "UI5 Web Components: webcomponents.fiori",
5
5
  "ui5": {
6
6
  "webComponentsPackage": true
@@ -54,20 +54,20 @@
54
54
  "directory": "packages/fiori"
55
55
  },
56
56
  "dependencies": {
57
- "@ui5/webcomponents": "2.23.0-rc.2",
58
- "@ui5/webcomponents-base": "2.23.0-rc.2",
59
- "@ui5/webcomponents-icons": "2.23.0-rc.2",
60
- "@ui5/webcomponents-theming": "2.23.0-rc.2",
57
+ "@ui5/webcomponents": "2.24.0-rc.0",
58
+ "@ui5/webcomponents-base": "2.24.0-rc.0",
59
+ "@ui5/webcomponents-icons": "2.24.0-rc.0",
60
+ "@ui5/webcomponents-theming": "2.24.0-rc.0",
61
61
  "@zxing/library": "^0.21.3"
62
62
  },
63
63
  "devDependencies": {
64
64
  "@custom-elements-manifest/analyzer": "^0.10.10",
65
65
  "@ui5/cypress-internal": "0.1.0",
66
- "@ui5/webcomponents-tools": "2.23.0-rc.2",
66
+ "@ui5/webcomponents-tools": "2.24.0-rc.0",
67
67
  "cypress": "15.9.0",
68
68
  "lit": "^2.0.0",
69
69
  "vite": "5.4.21",
70
70
  "yarn": "^1.22.22"
71
71
  },
72
- "gitHead": "8e2484d13f3aeac61195cd83eff7bba26df1b1bc"
72
+ "gitHead": "55834d96ca1b888b08c8b8d4387f9662b8e66bb2"
73
73
  }
@@ -3,13 +3,14 @@ import DynamicPageHeaderActions from "./DynamicPageHeaderActions.js";
3
3
 
4
4
  export default function DynamicPageTemplate(this: DynamicPage) {
5
5
  return (
6
- <div class="ui5-dynamic-page-root">
6
+ <div class="ui5-dynamic-page-root" role={this._rootRole} aria-label={this._rootAriaLabel}>
7
7
  <div class="ui5-dynamic-page-scroll-container"
8
8
  onScroll={this.snapOnScroll}
9
9
  >
10
- <header
10
+ <div
11
11
  class="ui5-dynamic-page-title-header-wrapper"
12
12
  id={`${this._id}-header`}
13
+ role={this._headerRole || "banner"}
13
14
  aria-label={this.headerAriaLabel}
14
15
  onui5-toggle-title={this.onToggleTitle}
15
16
  >
@@ -20,9 +21,8 @@ export default function DynamicPageTemplate(this: DynamicPage) {
20
21
  name="headerArea"
21
22
  ></slot>
22
23
  }
23
-
24
24
  {this.actionsInTitle && headerActions.call(this)}
25
- </header>
25
+ </div>
26
26
 
27
27
  {this.headerInContent &&
28
28
  <slot tabIndex={this.headerTabIndex}
@@ -36,6 +36,8 @@ export default function DynamicPageTemplate(this: DynamicPage) {
36
36
  <div
37
37
  part="content"
38
38
  class="ui5-dynamic-page-content"
39
+ role={this._contentRole}
40
+ aria-label={this._contentAriaLabel}
39
41
  onFocusIn={this.onContentFocusIn}
40
42
  onFocusOut={this.onContentFocusOut}
41
43
  >
@@ -48,7 +50,7 @@ export default function DynamicPageTemplate(this: DynamicPage) {
48
50
  </div>
49
51
  </div>
50
52
 
51
- <div class="ui5-dynamic-page-footer" part="footer">
53
+ <div class="ui5-dynamic-page-footer" part="footer" role={this._footerRole} aria-label={this._footerAriaLabel}>
52
54
  <slot name="footerArea"></slot>
53
55
  </div>
54
56
  </div>
@@ -0,0 +1,65 @@
1
+ import type HeroBanner from "./HeroBanner.js";
2
+
3
+ export default function HeroBannerTemplate(this: HeroBanner) {
4
+ const actionsBottomStart = this.actionsPlacement === "BottomStart";
5
+
6
+ return (
7
+ <div
8
+ class="ui5-banner-root"
9
+ role="banner"
10
+ part="canvas"
11
+ >
12
+ <div class={{
13
+ "ui5-banner-content": true,
14
+ "ui5-banner-columns-equal": this.columnsRatio === "Equal" && this._hasEndContent,
15
+ "ui5-banner-columns-first-wider": this.columnsRatio === "FirstWider" && this._hasEndContent,
16
+ }} part="content">
17
+ <div class="ui5-banner-header" part="header">
18
+ <div class="ui5-banner-header-text">
19
+ {this.overlineText &&
20
+ <div class="ui5-banner-overline">
21
+ {this.overlineText}
22
+ </div>
23
+ }
24
+
25
+ {this.headerText &&
26
+ <h2 class="ui5-banner-heading">
27
+ {this.headerText}
28
+ </h2>
29
+ }
30
+
31
+ {actionsBottomStart && this._hasActions &&
32
+ <div class="ui5-banner-actions ui5-banner-actions-bottom-start">
33
+ <slot name="actions"></slot>
34
+ </div>
35
+ }
36
+ </div>
37
+
38
+ {!actionsBottomStart && !this._actionsAsGridItem && this._hasActions &&
39
+ <div class="ui5-banner-actions">
40
+ <slot name="actions"></slot>
41
+ </div>
42
+ }
43
+ </div>
44
+
45
+ {this._hasStartContent &&
46
+ <div class="ui5-banner-block ui5-banner-block-start" part="startContent">
47
+ <slot></slot>
48
+ </div>
49
+ }
50
+
51
+ {this._hasEndContent &&
52
+ <div class="ui5-banner-block ui5-banner-block-end" part="endContent">
53
+ <slot name="endContent"></slot>
54
+ </div>
55
+ }
56
+
57
+ {this._actionsAsGridItem &&
58
+ <div class="ui5-banner-actions ui5-banner-actions-grid-item">
59
+ <slot name="actions"></slot>
60
+ </div>
61
+ }
62
+ </div>
63
+ </div>
64
+ );
65
+ }
@@ -153,7 +153,7 @@ export default function ShellBarTemplate(this: ShellBar) {
153
153
  )}
154
154
 
155
155
  {/* Custom Items */}
156
- {this.sortItems(this.items).map(item => (
156
+ {this.items.map(item => (
157
157
  <div
158
158
  key={item._id}
159
159
  class={{
@@ -13,6 +13,7 @@ export default function TimelineTemplate(this: Timeline) {
13
13
  aria-label={this.ariaLabel}
14
14
  onFocusIn={this._onfocusin}
15
15
  onKeyDown={this._onkeydown}
16
+ onWheel={this._onwheel}
16
17
  >
17
18
  <BusyIndicator
18
19
  id={`${this._id}-busyIndicator`}
@@ -21,7 +22,20 @@ export default function TimelineTemplate(this: Timeline) {
21
22
  class="ui5-timeline-busy-indicator"
22
23
  >
23
24
  <div class="ui5-timeline-scroll-container">
24
-
25
+ {(this._hasHeader || this._hasInfoBar) &&
26
+ <div class="ui5-timeline-header-area">
27
+ {this._hasHeader &&
28
+ <div class="ui5-timeline-header">
29
+ <slot name="header"></slot>
30
+ </div>
31
+ }
32
+ {this._hasInfoBar &&
33
+ <div class="ui5-timeline-info-bar">
34
+ <slot name="infoBar"></slot>
35
+ </div>
36
+ }
37
+ </div>
38
+ }
25
39
  <div class="ui5-timeline-list"
26
40
  role={listRole}
27
41
  aria-live="polite"
@@ -0,0 +1,359 @@
1
+ /* HeroBanner Component Styles */
2
+
3
+ :host(:not([hidden])) {
4
+ display: block;
5
+ width: 100%;
6
+ container-type: inline-size;
7
+ border-radius: var(--_ui5_banner_border_radius);
8
+ background-color: var(--_ui5_banner_background);
9
+ background-image: var(--_ui5_banner_background_image);
10
+ background-repeat: no-repeat;
11
+ background-position: top;
12
+ background-size: cover;
13
+ }
14
+
15
+ /* Banner Canvas */
16
+ .ui5-banner-root {
17
+ box-sizing: border-box;
18
+ min-height: 5.75rem;
19
+ max-height: 24rem;
20
+ border-radius: inherit;
21
+ background-color: inherit;
22
+ background-image: inherit;
23
+ background-size: inherit;
24
+ box-shadow: var(--_ui5_banner_box_shadow);
25
+ border: var(--_ui5_banner_border);
26
+ overflow: hidden;
27
+ position: relative;
28
+ }
29
+
30
+ /* Content area — flex column by default, header first */
31
+ .ui5-banner-content {
32
+ display: flex;
33
+ flex-direction: column;
34
+ gap: 1rem;
35
+ box-sizing: border-box;
36
+ padding: 1.5rem;
37
+ color: var(--_ui5_banner_text_color);
38
+ font-family: var(--sapFontFamily);
39
+ font-size: var(--sapFontSize);
40
+ }
41
+
42
+ /* Header row: overline + heading on the left, actions on the right */
43
+ .ui5-banner-header {
44
+ display: flex;
45
+ flex-direction: row;
46
+ flex-wrap: wrap;
47
+ align-items: center;
48
+ justify-content: space-between;
49
+ gap: 1rem;
50
+ }
51
+
52
+ .ui5-banner-header-text {
53
+ display: flex;
54
+ flex-direction: column;
55
+ gap: 0.5rem;
56
+ flex: 1 1 auto;
57
+ min-width: 0;
58
+ }
59
+
60
+ .ui5-banner-actions {
61
+ display: flex;
62
+ align-items: center;
63
+ gap: 0.5rem;
64
+ flex: 0 0 auto;
65
+ --sapButton_Lite_TextColor: var(--_ui5_banner_text_color);
66
+ --sapButton_Lite_Hover_TextColor: var(--_ui5_banner_text_color);
67
+ --sapButton_Lite_Active_TextColor: var(--_ui5_banner_text_color);
68
+ --sapButton_Lite_Hover_Background: color-mix(in srgb, var(--_ui5_banner_text_color) 15%, transparent);
69
+ --sapButton_Lite_Active_Background: color-mix(in srgb, var(--_ui5_banner_text_color) 25%, transparent);
70
+ --sapButton_IconColor: var(--_ui5_banner_text_color);
71
+ }
72
+
73
+ /* actionsPlacement="BottomStart": actions sit below header-text, left-aligned */
74
+ .ui5-banner-actions-bottom-start {
75
+ align-self: flex-start;
76
+ margin-top: 0.5rem;
77
+ }
78
+
79
+ .ui5-banner-heading {
80
+ font-family: var(--sapFontHeaderFamily);
81
+ font-size: var(--sapFontHeader3Size);
82
+ font-weight: normal;
83
+ text-align: start;
84
+ color: var(--_ui5_banner_text_color);
85
+ line-height: 1.4;
86
+ margin: 0;
87
+ padding: 0;
88
+ }
89
+
90
+ .ui5-banner-overline {
91
+ font-family: var(--sapFontFamily);
92
+ font-size: var(--sapFontSize);
93
+ text-align: start;
94
+ color: var(--_ui5_banner_text_color);
95
+ line-height: 1.4;
96
+ }
97
+
98
+ /* Free content blocks */
99
+ .ui5-banner-block {
100
+ box-sizing: border-box;
101
+ min-width: 0;
102
+ }
103
+
104
+ /* Only endContent present (no startContent) — expand to full width */
105
+ .ui5-banner-content:not(:has(.ui5-banner-block-start)) .ui5-banner-block-end {
106
+ display: flex;
107
+ flex-direction: column;
108
+ width: 100%;
109
+ }
110
+
111
+ /* ============================================================
112
+ columnsRatio="Equal" — 2-column grid, header spans full width
113
+ ============================================================ */
114
+ .ui5-banner-content.ui5-banner-columns-equal {
115
+ display: grid;
116
+ grid-template-columns: 1fr 1fr;
117
+ grid-template-rows: auto 1fr;
118
+ }
119
+
120
+ .ui5-banner-columns-equal .ui5-banner-header {
121
+ grid-column: 1 / -1;
122
+ grid-row: 1;
123
+ }
124
+
125
+ .ui5-banner-columns-equal .ui5-banner-block-start {
126
+ grid-column: 1;
127
+ grid-row: 2;
128
+ }
129
+
130
+ /* Without endContent, start content spans full width */
131
+ .ui5-banner-columns-equal:not(:has(.ui5-banner-block-end)) .ui5-banner-block-start {
132
+ grid-column: 1 / -1;
133
+ }
134
+
135
+ .ui5-banner-columns-equal .ui5-banner-block-end {
136
+ grid-column: 2;
137
+ grid-row: 2;
138
+ }
139
+
140
+ /* ============================================================
141
+ columnsRatio="FirstWider" — 2/3 + 1/3 grid
142
+ ============================================================ */
143
+ .ui5-banner-content.ui5-banner-columns-first-wider {
144
+ display: grid;
145
+ grid-template-columns: 2fr 1fr;
146
+ grid-template-rows: auto 1fr;
147
+ }
148
+
149
+ .ui5-banner-columns-first-wider .ui5-banner-header {
150
+ grid-column: 1 / -1;
151
+ grid-row: 1;
152
+ }
153
+
154
+ .ui5-banner-columns-first-wider .ui5-banner-block-start {
155
+ grid-column: 1;
156
+ grid-row: 2;
157
+ }
158
+
159
+ /* Without endContent, start content spans full width */
160
+ .ui5-banner-columns-first-wider:not(:has(.ui5-banner-block-end)) .ui5-banner-block-start {
161
+ grid-column: 1 / -1;
162
+ }
163
+
164
+ .ui5-banner-columns-first-wider .ui5-banner-block-end {
165
+ grid-column: 2;
166
+ grid-row: 2;
167
+ }
168
+
169
+ /* ============================================================
170
+ actionsPlacement="BottomStart" modifiers
171
+ (must come after base grid rules to override them)
172
+ ============================================================ */
173
+
174
+ /* BottomStart + only endContent: make root a flex column so content stretches to fill it */
175
+ :host([actions-placement="BottomStart"]) .ui5-banner-root:has(.ui5-banner-block-end):not(:has(.ui5-banner-block-start)) {
176
+ display: flex;
177
+ flex-direction: column;
178
+ }
179
+
180
+ :host([actions-placement="BottomStart"]) .ui5-banner-root:has(.ui5-banner-block-end):not(:has(.ui5-banner-block-start)) .ui5-banner-content {
181
+ flex: 1;
182
+ }
183
+
184
+ /* No columnsRatio + only endContent: switch to 2-col grid so endContent fills full height */
185
+ :host([actions-placement="BottomStart"]) .ui5-banner-content:has(.ui5-banner-block-end):not(:has(.ui5-banner-block-start)):not(.ui5-banner-columns-equal):not(.ui5-banner-columns-first-wider) {
186
+ display: grid;
187
+ grid-template-columns: 1fr 1fr;
188
+ grid-template-rows: 1fr;
189
+ align-items: stretch;
190
+ }
191
+
192
+ :host([actions-placement="BottomStart"]) .ui5-banner-content:has(.ui5-banner-block-end):not(:has(.ui5-banner-block-start)):not(.ui5-banner-columns-equal):not(.ui5-banner-columns-first-wider) .ui5-banner-header {
193
+ grid-column: 1;
194
+ grid-row: 1;
195
+ align-self: stretch;
196
+ display: flex;
197
+ flex-direction: column;
198
+ justify-content: flex-start;
199
+ align-items: flex-start;
200
+ }
201
+
202
+ :host([actions-placement="BottomStart"]) .ui5-banner-content:has(.ui5-banner-block-end):not(:has(.ui5-banner-block-start)):not(.ui5-banner-columns-equal):not(.ui5-banner-columns-first-wider) .ui5-banner-block-end {
203
+ grid-column: 2;
204
+ grid-row: 1;
205
+ height: 100%;
206
+ display: flex;
207
+ flex-direction: column;
208
+ align-items: flex-end;
209
+ justify-content: center;
210
+ }
211
+
212
+ /* Split layouts + BottomStart + has startContent:
213
+ header becomes flex-column so actions flow below heading */
214
+ :host([actions-placement="BottomStart"]) .ui5-banner-columns-equal:has(.ui5-banner-block-start) .ui5-banner-header,
215
+ :host([actions-placement="BottomStart"]) .ui5-banner-columns-first-wider:has(.ui5-banner-block-start) .ui5-banner-header {
216
+ display: flex;
217
+ flex-direction: column;
218
+ align-items: flex-start;
219
+ justify-content: flex-start;
220
+ }
221
+
222
+ /* Split layouts + BottomStart + no startContent:
223
+ single-row grid, header col 1 full height, endContent col 2 full height */
224
+ :host([actions-placement="BottomStart"]) .ui5-banner-columns-equal:not(:has(.ui5-banner-block-start)),
225
+ :host([actions-placement="BottomStart"]) .ui5-banner-columns-first-wider:not(:has(.ui5-banner-block-start)) {
226
+ grid-template-rows: 1fr;
227
+ align-items: stretch;
228
+ }
229
+
230
+ :host([actions-placement="BottomStart"]) .ui5-banner-columns-equal:not(:has(.ui5-banner-block-start)) .ui5-banner-header,
231
+ :host([actions-placement="BottomStart"]) .ui5-banner-columns-first-wider:not(:has(.ui5-banner-block-start)) .ui5-banner-header {
232
+ grid-column: 1;
233
+ grid-row: 1;
234
+ align-self: stretch;
235
+ display: flex;
236
+ flex-direction: column;
237
+ justify-content: flex-start;
238
+ align-items: flex-start;
239
+ }
240
+
241
+ :host([actions-placement="BottomStart"]) .ui5-banner-columns-equal:not(:has(.ui5-banner-block-start)) .ui5-banner-block-end,
242
+ :host([actions-placement="BottomStart"]) .ui5-banner-columns-first-wider:not(:has(.ui5-banner-block-start)) .ui5-banner-block-end {
243
+ grid-column: 2;
244
+ grid-row: 1;
245
+ align-self: stretch;
246
+ height: 100%;
247
+ display: flex;
248
+ flex-direction: column;
249
+ justify-content: center;
250
+ }
251
+
252
+ /* ============================================================
253
+ headerBlockPlacement="Bottom" modifiers
254
+ Only active when columnsRatio is set and only endContent is present.
255
+ (must come after BottomStart rules to override them when both are set)
256
+ ============================================================ */
257
+
258
+ /* Flex layout (no columnsRatio): push header to bottom with margin-top auto */
259
+ :host([header-block-placement="Bottom"]) .ui5-banner-content:not(.ui5-banner-columns-equal):not(.ui5-banner-columns-first-wider) .ui5-banner-header {
260
+ margin-top: auto;
261
+ }
262
+
263
+ /* Split grid layouts + only endContent:
264
+ single-row grid, header at bottom of col 1, endContent fills col 2 */
265
+ :host([header-block-placement="Bottom"]) .ui5-banner-columns-equal:not(:has(.ui5-banner-block-start)),
266
+ :host([header-block-placement="Bottom"]) .ui5-banner-columns-first-wider:not(:has(.ui5-banner-block-start)) {
267
+ grid-template-rows: 1fr;
268
+ align-items: stretch;
269
+ min-height: 12rem;
270
+ }
271
+
272
+ /* When TopEnd actions are present: 2-row grid so actions sit above endContent in col 2 */
273
+ :host([header-block-placement="Bottom"]) .ui5-banner-columns-equal:not(:has(.ui5-banner-block-start)):has(.ui5-banner-actions-grid-item),
274
+ :host([header-block-placement="Bottom"]) .ui5-banner-columns-first-wider:not(:has(.ui5-banner-block-start)):has(.ui5-banner-actions-grid-item) {
275
+ grid-template-rows: auto 1fr;
276
+ }
277
+
278
+ :host([header-block-placement="Bottom"]) .ui5-banner-columns-equal:not(:has(.ui5-banner-block-start)) .ui5-banner-header,
279
+ :host([header-block-placement="Bottom"]) .ui5-banner-columns-first-wider:not(:has(.ui5-banner-block-start)) .ui5-banner-header {
280
+ grid-column: 1;
281
+ grid-row: 1;
282
+ align-self: end;
283
+ }
284
+
285
+ /* With actions: header still fills col 1, aligned to bottom */
286
+ :host([header-block-placement="Bottom"]) .ui5-banner-columns-equal:not(:has(.ui5-banner-block-start)):has(.ui5-banner-actions-grid-item) .ui5-banner-header,
287
+ :host([header-block-placement="Bottom"]) .ui5-banner-columns-first-wider:not(:has(.ui5-banner-block-start)):has(.ui5-banner-actions-grid-item) .ui5-banner-header {
288
+ grid-row: 1 / 3;
289
+ align-self: end;
290
+ }
291
+
292
+ /* TopEnd actions in col 2 row 1 — above endContent */
293
+ :host([header-block-placement="Bottom"]) .ui5-banner-columns-equal:not(:has(.ui5-banner-block-start)) .ui5-banner-actions-grid-item,
294
+ :host([header-block-placement="Bottom"]) .ui5-banner-columns-first-wider:not(:has(.ui5-banner-block-start)) .ui5-banner-actions-grid-item {
295
+ grid-column: 2;
296
+ grid-row: 1;
297
+ align-self: start;
298
+ justify-self: end;
299
+ min-width: 0;
300
+ }
301
+
302
+ :host([header-block-placement="Bottom"]) .ui5-banner-columns-equal:not(:has(.ui5-banner-block-start)) .ui5-banner-block-end,
303
+ :host([header-block-placement="Bottom"]) .ui5-banner-columns-first-wider:not(:has(.ui5-banner-block-start)) .ui5-banner-block-end {
304
+ grid-column: 2;
305
+ grid-row: 1;
306
+ align-self: stretch;
307
+ height: 100%;
308
+ }
309
+
310
+ /* With actions: endContent moves to row 2 so actions occupy row 1 */
311
+ :host([header-block-placement="Bottom"]) .ui5-banner-columns-equal:not(:has(.ui5-banner-block-start)):has(.ui5-banner-actions-grid-item) .ui5-banner-block-end,
312
+ :host([header-block-placement="Bottom"]) .ui5-banner-columns-first-wider:not(:has(.ui5-banner-block-start)):has(.ui5-banner-actions-grid-item) .ui5-banner-block-end {
313
+ grid-row: 2;
314
+ }
315
+
316
+ /* L → XS (≤1024px): Heading max 3 lines */
317
+ @container (max-width: 1024px) {
318
+ .ui5-banner-heading {
319
+ display: -webkit-box;
320
+ -webkit-line-clamp: 3;
321
+ line-clamp: 3;
322
+ -webkit-box-orient: vertical;
323
+ overflow: hidden;
324
+ text-overflow: ellipsis;
325
+ }
326
+ }
327
+
328
+ /* XS (≤599px): collapse split layouts to stacked column */
329
+ @container (max-width: 599px) {
330
+ .ui5-banner-content.ui5-banner-columns-equal,
331
+ .ui5-banner-content.ui5-banner-columns-first-wider {
332
+ display: flex;
333
+ flex-direction: column;
334
+ }
335
+
336
+ .ui5-banner-block-start {
337
+ order: 1;
338
+ }
339
+
340
+ .ui5-banner-block-end {
341
+ order: 2;
342
+ }
343
+
344
+ /* BottomStart no-columnsRatio grid collapses to column */
345
+ :host([actions-placement="BottomStart"]) .ui5-banner-content:has(.ui5-banner-block-end):not(:has(.ui5-banner-block-start)):not(.ui5-banner-columns-equal):not(.ui5-banner-columns-first-wider) {
346
+ display: flex;
347
+ flex-direction: column;
348
+ }
349
+
350
+ :host([actions-placement="BottomStart"]) .ui5-banner-content:has(.ui5-banner-block-end):not(:has(.ui5-banner-block-start)):not(.ui5-banner-columns-equal):not(.ui5-banner-columns-first-wider) .ui5-banner-block-end {
351
+ justify-content: center;
352
+ }
353
+
354
+ /* Only endContent present: expand to full width and center children */
355
+ .ui5-banner-content:not(:has(.ui5-banner-block-start)) .ui5-banner-block-end {
356
+ justify-content: center;
357
+ width: 100%;
358
+ }
359
+ }
@@ -59,12 +59,25 @@
59
59
  margin-inline-start: var(--_ui5_tl_li_margin_bottom);
60
60
  }
61
61
 
62
+ /* Scroll container */
62
63
  :host([layout="Horizontal"]) .ui5-timeline-scroll-container {
63
- overflow: auto;
64
+ overflow-x: auto;
65
+ overflow-y: hidden;
64
66
  /* The padding values of the parent container are added to the size of scroll container */
65
67
  width: calc(100% + var(--_ui5_timeline_scroll_container_offset));
66
68
  }
67
69
 
70
+ :host([layout="Vertical"]) .ui5-timeline-scroll-container {
71
+ height: 100%;
72
+ width: 100%;
73
+ overflow: auto;
74
+ }
75
+
76
+ .ui5-timeline-scroll-container {
77
+ display: flex;
78
+ flex-direction: column;
79
+ }
80
+
68
81
  :host([loading]) .ui5-timeline-growing-button-busy-indicator:not([_is-busy]) {
69
82
  display: none;
70
83
  }
@@ -77,12 +90,28 @@
77
90
  box-sizing: border-box;
78
91
  }
79
92
 
80
- :host([layout="Vertical"]) .ui5-timeline-scroll-container {
81
- height: 100%;
82
- width: 100%;
83
- }
84
-
85
93
  :host([growing="Scroll"]) .ui5-timeline-end-marker {
86
94
  /* Ensure the list-end-marker has a block property to always be stretched and "visible" on the screen */
87
95
  display: inline-block;
88
- }
96
+ }
97
+
98
+ /* Header area — wraps header + info-bar slots above the items */
99
+ .ui5-timeline-header-area {
100
+ flex-shrink: 0;
101
+ width: 100%;
102
+ background: var(--sapBackgroundColor);
103
+ margin-block-end: 1rem;
104
+ }
105
+
106
+ .ui5-timeline-header,
107
+ .ui5-timeline-info-bar {
108
+ flex-shrink: 0;
109
+ }
110
+
111
+ /* Sticky header — pins to the top in vertical layout and to the inline-start in horizontal layout */
112
+ :host([sticky-header]) .ui5-timeline-header-area {
113
+ position: sticky;
114
+ top: 0;
115
+ inset-inline-start: 0;
116
+ z-index: 2;
117
+ }
@@ -0,0 +1,8 @@
1
+ :host {
2
+ --_ui5_banner_background: var(--sapShell_HeroBanner_Background);
3
+ --_ui5_banner_text_color: var(--sapShell_HeroBanner_TextColor);
4
+ --_ui5_banner_border_radius: var(--sapTile_BorderCornerRadius);
5
+ --_ui5_banner_border: 0.0625rem solid var(--sapTile_BorderColor);
6
+ --_ui5_banner_box_shadow: var(--sapContent_Shadow0);
7
+ --_ui5_banner_background_image: var(--sapShell_HeroBanner_BackgroundImage);
8
+ }
@@ -1,3 +1,4 @@
1
+ @import "../base/HeroBanner-parameters.css";
1
2
  @import "../base/FlexibleColumnLayout-parameters.css";
2
3
  @import "../base/IllustratedMessage-parameters.css";
3
4
  @import "../base/MediaGallery-parameters.css";
@@ -1,3 +1,4 @@
1
+ @import "../base/HeroBanner-parameters.css";
1
2
  @import "../base/FlexibleColumnLayout-parameters.css";
2
3
  @import "../base/IllustratedMessage-parameters.css";
3
4
  @import "../base/MediaGallery-parameters.css";
@@ -1,3 +1,4 @@
1
+ @import "../base/HeroBanner-parameters.css";
1
2
  @import "./FlexibleColumnLayout-parameters.css";
2
3
  @import "../base/IllustratedMessage-parameters.css";
3
4
  @import "./MediaGallery-parameters.css";
@@ -1,3 +1,4 @@
1
+ @import "../base/HeroBanner-parameters.css";
1
2
  @import "./FlexibleColumnLayout-parameters.css";
2
3
  @import "../base/IllustratedMessage-parameters.css";
3
4
  @import "./MediaGallery-parameters.css";
@@ -0,0 +1,4 @@
1
+ :host {
2
+ --_ui5_banner_background: var(--sapShell_Banner_Background, var(--sapHighlightColor));
3
+ --_ui5_banner_text_color: var(--sapShell_Banner_TextColor, var(--sapContent_ContrastTextColor));
4
+ }
@@ -1,3 +1,5 @@
1
+ @import "../base/HeroBanner-parameters.css";
2
+ @import "./HeroBanner-parameters.css";
1
3
  @import "../base/rtl-parameters.css";
2
4
  @import "../base/FlexibleColumnLayout-parameters.css";
3
5
  @import "../base/IllustratedMessage-parameters.css";
@@ -1,3 +1,4 @@
1
+ @import "../base/HeroBanner-parameters.css";
1
2
  @import "../base/FlexibleColumnLayout-parameters.css";
2
3
  @import "../base/IllustratedMessage-parameters.css";
3
4
  @import "../base/MediaGallery-parameters.css";
@@ -1,3 +1,4 @@
1
+ @import "../base/HeroBanner-parameters.css";
1
2
  @import "../base/FlexibleColumnLayout-parameters.css";
2
3
  @import "../base/IllustratedMessage-parameters.css";
3
4
  @import "../base/MediaGallery-parameters.css";
@@ -1,3 +1,5 @@
1
+ @import "../base/HeroBanner-parameters.css";
2
+ @import "../sap_horizon/HeroBanner-parameters.css";
1
3
  @import "../base/FlexibleColumnLayout-parameters.css";
2
4
  @import "../base/IllustratedMessage-parameters.css";
3
5
  @import "../base/MediaGallery-parameters.css";
@@ -1,3 +1,4 @@
1
+ @import "../base/HeroBanner-parameters.css";
1
2
  @import "./FlexibleColumnLayout-parameters.css";
2
3
  @import "../base/IllustratedMessage-parameters.css";
3
4
  @import "./MediaGallery-parameters.css";