@openui5/sap.ui.documentation 1.145.0 → 1.146.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 (22) hide show
  1. package/THIRDPARTY.txt +7 -7
  2. package/package.json +7 -7
  3. package/src/sap/ui/documentation/.library +1 -1
  4. package/src/sap/ui/documentation/LightTable.js +20 -46
  5. package/src/sap/ui/documentation/Row.js +146 -7
  6. package/src/sap/ui/documentation/library.js +2 -2
  7. package/src/sap/ui/documentation/messagebundle_de.properties +1 -1
  8. package/src/sap/ui/documentation/sdk/controller/App.controller.js +1 -1
  9. package/src/sap/ui/documentation/sdk/controller/Code.controller.js +1 -0
  10. package/src/sap/ui/documentation/sdk/controller/ErrorHandler.js +1 -0
  11. package/src/sap/ui/documentation/sdk/controller/Sample.controller.js +10 -5
  12. package/src/sap/ui/documentation/sdk/controller/SubApiDetail.controller.js +487 -17
  13. package/src/sap/ui/documentation/sdk/controller/util/ConfigUtil.js +1 -0
  14. package/src/sap/ui/documentation/sdk/controller/util/CookiesConsentManager.js +1 -0
  15. package/src/sap/ui/documentation/sdk/controller/util/UsageTracker.js +1 -0
  16. package/src/sap/ui/documentation/sdk/cookieSettingsDialog/controller/CookieSettingsDialog.controller.js +1 -0
  17. package/src/sap/ui/documentation/sdk/thirdparty/highlight.js/highlight.js +3 -3
  18. package/src/sap/ui/documentation/sdk/view/SubApiDetail.view.xml +3 -17
  19. package/src/sap/ui/documentation/themes/base/Documentation.less +4 -4
  20. package/src/sap/ui/documentation/themes/base/LightTable.less +29 -0
  21. package/src/sap/ui/documentation/themes/sap_belize_base/Documentation.less +4 -4
  22. package/src/sap/ui/documentation/themes/sap_horizon_dark/Documentation.less +1 -1
package/THIRDPARTY.txt CHANGED
@@ -6,31 +6,31 @@ The full text of all referenced licenses is appended at the end of this file.
6
6
 
7
7
  Library: sap.f:
8
8
 
9
- Component: UI5 Web Components, version: 2.15.0
9
+ Component: UI5 Web Components, version: 2.19.2
10
10
  Copyright: SAP
11
11
  License: Apache-2.0
12
12
  License Text: https://github.com/UI5/openui5/blob/master/LICENSES/Apache-2.0.txt
13
13
  Contained in: src/sap.f/src/sap/f/thirdparty/**
14
14
 
15
- Component: UI5 Web Components Fiori, version: 2.15.0
15
+ Component: UI5 Web Components Fiori, version: 2.19.2
16
16
  Copyright: SAP
17
17
  License: Apache-2.0
18
18
  License Text: https://github.com/UI5/openui5/blob/master/LICENSES/Apache-2.0.txt
19
19
  Contained in: src/sap.f/src/sap/f/thirdparty/**
20
20
 
21
- Component: UI5 Web Components Icons, version: 2.15.0
21
+ Component: UI5 Web Components Icons, version: 2.19.2
22
22
  Copyright: SAP
23
23
  License: Apache-2.0
24
24
  License Text: https://github.com/UI5/openui5/blob/master/LICENSES/Apache-2.0.txt
25
25
  Contained in: src/sap.f/src/sap/f/thirdparty/**
26
26
 
27
- Component: UI5 Web Components Icons Business Suite, version: 2.15.0
27
+ Component: UI5 Web Components Icons Business Suite, version: 2.19.2
28
28
  Copyright: SAP
29
29
  License: Apache-2.0
30
30
  License Text: https://github.com/UI5/openui5/blob/master/LICENSES/Apache-2.0.txt
31
31
  Contained in: src/sap.f/src/sap/f/thirdparty/**
32
32
 
33
- Component: UI5 Web Components Icons TNT, version: 2.15.0
33
+ Component: UI5 Web Components Icons TNT, version: 2.19.2
34
34
  Copyright: SAP
35
35
  License: Apache-2.0
36
36
  License Text: https://github.com/UI5/openui5/blob/master/LICENSES/Apache-2.0.txt
@@ -309,7 +309,7 @@ License: MIT
309
309
  License Text: https://github.com/UI5/openui5/blob/master/LICENSES/MIT.txt
310
310
  Contained in: src/sap.ui.core/src/sap/ui/thirdparty/bignumber.js
311
311
 
312
- Component: lodash, version: 4.17.21
312
+ Component: lodash, version: 4.17.23
313
313
  Copyright: OpenJS Foundation and other contributors
314
314
  License: MIT
315
315
  License Text: https://github.com/UI5/openui5/blob/master/LICENSES/MIT.txt
@@ -498,7 +498,7 @@ License: Apache-2.0
498
498
  License Text: https://github.com/UI5/openui5/blob/master/LICENSES/Apache-2.0.txt
499
499
  Contained in: lib/jsdoc/ui5/plugin.js
500
500
 
501
- Component: SAP Theming Base Content, version: 11.32.2-20250827135846+79bb30d311678435d61b21db26ecbe07d6b05079
501
+ Component: SAP Theming Base Content, version: 11.34.0
502
502
  Copyright: SAP SE or an SAP affiliate company and Theming Base Content contributors
503
503
  License: Apache-2.0
504
504
  License Text: https://github.com/UI5/openui5/blob/master/LICENSES/Apache-2.0.txt
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openui5/sap.ui.documentation",
3
- "version": "1.145.0",
3
+ "version": "1.146.0",
4
4
  "description": "OpenUI5 UI Library sap.ui.documentation",
5
5
  "author": "SAP SE (https://www.sap.com)",
6
6
  "license": "Apache-2.0",
@@ -14,11 +14,11 @@
14
14
  "url": "https://github.com/UI5/openui5.git"
15
15
  },
16
16
  "dependencies": {
17
- "@openui5/sap.m": "1.145.0",
18
- "@openui5/sap.ui.core": "1.145.0",
19
- "@openui5/sap.ui.layout": "1.145.0",
20
- "@openui5/themelib_sap_belize": "1.145.0",
21
- "@openui5/themelib_sap_fiori_3": "1.145.0",
22
- "@openui5/themelib_sap_horizon": "1.145.0"
17
+ "@openui5/sap.m": "1.146.0",
18
+ "@openui5/sap.ui.core": "1.146.0",
19
+ "@openui5/sap.ui.layout": "1.146.0",
20
+ "@openui5/themelib_sap_belize": "1.146.0",
21
+ "@openui5/themelib_sap_fiori_3": "1.146.0",
22
+ "@openui5/themelib_sap_horizon": "1.146.0"
23
23
  }
24
24
  }
@@ -6,7 +6,7 @@
6
6
  <copyright>OpenUI5
7
7
  * (c) Copyright 2026 SAP SE or an SAP affiliate company.
8
8
  * Licensed under the Apache License, Version 2.0 - see LICENSE.txt.</copyright>
9
- <version>1.145.0</version>
9
+ <version>1.146.0</version>
10
10
 
11
11
  <documentation>SAPUI5 library for the Demokit 2.0.</documentation>
12
12
 
@@ -37,68 +37,42 @@ sap.ui.define(['sap/ui/core/Control'],
37
37
  }
38
38
  },
39
39
  renderer: {
40
- apiVersion: 2,
40
+ apiVersion: 2,
41
41
 
42
- render: function(oRm, oControl) {
43
- var aRows = oControl.getRows(),
44
- aControls,
42
+ render: function(oRm, oControl) {
43
+ var aRows = oControl.getRows(),
45
44
  aColumnTitles = oControl.getColumnTitles(),
46
- aLen,
47
- a,
48
45
  iLen,
49
46
  i;
50
47
 
51
- oRm.openStart("div", oControl);
52
- oRm.class("sapUiDocLightTable");
53
- oRm.class("columns-" + oControl.getColumnCount());
54
- oRm.openEnd();
48
+ oRm.openStart("div", oControl);
49
+ oRm.class("sapUiDocLightTable");
50
+ oRm.class("columns-" + oControl.getColumnCount());
51
+ oRm.openEnd();
55
52
 
56
- // Column titles
57
- oRm.openStart("div")
58
- .class("head")
59
- .openEnd();
60
-
61
- for (i = 0, iLen = aColumnTitles.length; i < iLen; i++) {
62
- oRm.openStart("div")
63
- .class("cell")
64
- .openEnd();
65
-
66
- oRm.text(aColumnTitles[i])
67
- .close("div");
68
- }
69
-
70
- oRm.close("div");
71
-
72
- // Rows
73
- for (i = 0, iLen = aRows.length; i < iLen; i++) {
53
+ // Column titles
74
54
  oRm.openStart("div")
75
- .class("row")
55
+ .class("head")
76
56
  .openEnd();
77
57
 
78
- aControls = aRows[i].getContent();
79
- for (a = 0, aLen = aControls.length; a < aLen; a++) {
58
+ for (i = 0, iLen = aColumnTitles.length; i < iLen; i++) {
80
59
  oRm.openStart("div")
81
60
  .class("cell")
82
61
  .openEnd();
83
62
 
84
- // Handle inline title
85
- if (a > 0) {
86
- oRm.openStart("div")
87
- .class("inTitle")
88
- .openEnd()
89
- .text(aColumnTitles[a] + ":")
90
- .close("div");
91
- }
63
+ oRm.text(aColumnTitles[i])
64
+ .close("div");
65
+ }
66
+
67
+ oRm.close("div");
92
68
 
93
- oRm.renderControl(aControls[a]);
94
- oRm.close("div");
69
+ // Render rows (each row handles its own rendering including subRows)
70
+ for (i = 0, iLen = aRows.length; i < iLen; i++) {
71
+ oRm.renderControl(aRows[i]);
95
72
  }
96
73
 
97
74
  oRm.close("div");
98
75
  }
99
-
100
- oRm.close("div");
101
76
  }
102
- }});
103
-
104
- });
77
+ });
78
+ });
@@ -3,34 +3,173 @@
3
3
  * (c) Copyright 2026 SAP SE or an SAP affiliate company.
4
4
  * Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
5
5
  */
6
- sap.ui.define(['sap/ui/core/Element'],
7
- function(Element) {
6
+ sap.ui.define([
7
+ 'sap/ui/core/Control',
8
+ 'sap/ui/core/Icon'
9
+ ], function(Control, Icon) {
8
10
  "use strict";
9
11
 
10
12
  /**
11
13
  * @class
12
14
  * Provides a row element for the <code>LightTable</code>.
13
- * @extends sap.ui.core.Element
15
+ * @extends sap.ui.core.Control
14
16
  * @private
15
17
  * @ui5-restricted sdk
16
18
  */
17
- return Element.extend("sap.ui.documentation.Row", {
19
+ var Row = Control.extend("sap.ui.documentation.Row", {
18
20
  metadata : {
19
21
  library: "sap.ui.documentation",
20
22
  properties: {
21
23
  /**
22
24
  * Determines whether the row is visible.
23
25
  */
24
- visible: {type: "boolean"}
26
+ visible: {type: "boolean", defaultValue: true},
27
+ /**
28
+ * Determines whether the row is expanded (showing subRows).
29
+ */
30
+ expanded: {type: "boolean", defaultValue: false},
31
+ /**
32
+ * Determines whether the row can be expanded/collapsed (shows expand/collapse icon).
33
+ */
34
+ expandable: {type: "boolean", defaultValue: false},
35
+ /**
36
+ * The name of the typedef that this parameter refers to
37
+ */
38
+ typedefName: {type : "string", defaultValue : ""}
25
39
  },
26
40
  defaultAggregation : "content",
27
41
  aggregations: {
28
42
  /**
29
43
  * Controls to be displayed by the <code>LightTable</code>.
30
44
  */
31
- content: {type: "sap.ui.core.Control", multiple: true}
45
+ content: {type: "sap.ui.core.Control", multiple: true},
46
+ /**
47
+ * Sub-rows to be displayed when the row is expanded.
48
+ */
49
+ subRows: {type: "sap.ui.documentation.Row", multiple: true},
50
+ /**
51
+ * Internal Icon control for the expand/collapse functionality
52
+ */
53
+ _expandIcon: {type: "sap.ui.core.Icon", multiple: false, visibility: "hidden"}
54
+ },
55
+ events: {
56
+ /**
57
+ * Event is fired when the user clicks on the expand/collapse icon.
58
+ */
59
+ expandToggle: {}
60
+ }
61
+ },
62
+
63
+ /**
64
+ * Creates the expand/collapse icon
65
+ * @private
66
+ */
67
+ _getExpandCollapseIcon: function() {
68
+ if (!this.getAggregation("_expandIcon")) {
69
+ var oExpandIcon = new Icon({
70
+ press: function() {
71
+ this.fireExpandToggle();
72
+ }.bind(this)
73
+ });
74
+
75
+ // Add custom classes for styling
76
+ oExpandIcon.addStyleClass("sapUiTinyMarginEnd").addStyleClass("sapUiDocTypedefExpandIcon");
77
+
78
+ this.setAggregation("_expandIcon", oExpandIcon);
79
+
80
+ // Update the icon appearance based on the current expanded state
81
+ this._updateExpandIconState();
82
+ }
83
+
84
+ return this.getAggregation("_expandIcon");
85
+ },
86
+
87
+ /**
88
+ * Updates the expand icon state (src) based on the expanded property
89
+ * @private
90
+ */
91
+ _updateExpandIconState: function() {
92
+ var oExpandIcon = this.getAggregation("_expandIcon");
93
+
94
+ if (oExpandIcon) {
95
+ var bExpanded = this.getExpanded();
96
+ oExpandIcon.setSrc(bExpanded ? "sap-icon://slim-arrow-down" : "sap-icon://slim-arrow-right");
97
+ }
98
+ },
99
+
100
+ /**
101
+ * Updates the expand icon when the expanded property changes
102
+ */
103
+ setExpanded: function(bExpanded) {
104
+ this.setProperty("expanded", bExpanded, true); // Suppress rerendering
105
+ this._updateExpandIconState();
106
+ return this;
107
+ },
108
+ renderer: {
109
+ apiVersion: 2,
110
+
111
+ render: function(oRm, oControl) {
112
+ var aControls = oControl.getContent(),
113
+ aSubRows = oControl.getSubRows(),
114
+ bExpanded = oControl.getExpanded(),
115
+ bExpandable = oControl.getExpandable(),
116
+ bVisible = oControl.getVisible(),
117
+ aLen,
118
+ a;
119
+
120
+ // Don't render if not visible
121
+ if (!bVisible) {
122
+ return;
123
+ }
124
+
125
+ // Get column titles from parent LightTable
126
+ var oParent = oControl.getParent(),
127
+ aColumnTitles = oParent && oParent.getColumnTitles ? oParent.getColumnTitles() : [];
128
+
129
+ // Render the main row
130
+ oRm.openStart("div", oControl);
131
+ oRm.class("row");
132
+ if (bExpandable) {
133
+ oRm.class(bExpanded ? "expanded" : "collapsed");
134
+ }
135
+ oRm.openEnd();
136
+
137
+ // Render cells
138
+ for (a = 0, aLen = aControls.length; a < aLen; a++) {
139
+ oRm.openStart("div")
140
+ .class("cell")
141
+ .openEnd();
142
+
143
+ // Handle inline title (for responsive view)
144
+ if (a > 0 && aColumnTitles[a]) {
145
+ oRm.openStart("div")
146
+ .class("inTitle")
147
+ .openEnd()
148
+ .text(aColumnTitles[a] + ":")
149
+ .close("div");
150
+ }
151
+
152
+ // Render the expand/collapse icon in the first cell if expandable
153
+ if (a === 0 && bExpandable) {
154
+ oRm.renderControl(oControl._getExpandCollapseIcon());
155
+ }
156
+
157
+ oRm.renderControl(aControls[a]);
158
+ oRm.close("div");
159
+ }
160
+
161
+ oRm.close("div");
162
+
163
+ // Render sub-rows if expanded
164
+ if (bExpanded && aSubRows.length > 0) {
165
+ for (var i = 0; i < aSubRows.length; i++) {
166
+ oRm.renderControl(aSubRows[i]);
167
+ }
168
+ }
32
169
  }
33
170
  }
34
171
  });
35
172
 
36
- });
173
+ return Row;
174
+
175
+ });
@@ -25,14 +25,14 @@ sap.ui.define([
25
25
  * @namespace
26
26
  * @alias sap.ui.documentation
27
27
  * @author SAP SE
28
- * @version 1.145.0
28
+ * @version 1.146.0
29
29
  * @since 1.48
30
30
  * @public
31
31
  */
32
32
  var thisLibrary = Lib.init({
33
33
  apiVersion: 2,
34
34
  name : 'sap.ui.documentation',
35
- version: '1.145.0',
35
+ version: '1.146.0',
36
36
  dependencies : ['sap.ui.core','sap.m'],
37
37
  types: [],
38
38
  interfaces: [],
@@ -8,7 +8,7 @@ APP_TABHEADER_ITEM_API_REFERENCE=API-Referenz
8
8
  APP_TABHEADER_ITEM_SAMPLES=Beispiele
9
9
  APP_TABHEADER_ITEM_DEMO_APPS=Demo-Apps
10
10
  APP_TABHEADER_ITEM_RESOURCES=Ressourcen
11
- APP_TABHEADER_SUBITEM_FIORI_TOOLS=Fiori-Tools
11
+ APP_TABHEADER_SUBITEM_FIORI_TOOLS=SAP Fiori tools
12
12
  APP_TABHEADER_SUBITEM_ICON_EXPLORER=Symbolexplorer
13
13
  APP_TABHEADER_SUBITEM_UI5_INSPECTOR=UI5 Inspector
14
14
  APP_TABHEADER_SUBITEM_UI5_CLI=UI5 CLI
@@ -1477,7 +1477,7 @@ sap.ui.define([
1477
1477
  // Handle the case when the user deletes the query and the search picker is open
1478
1478
  // Only on desktop, because on mobile we don't want to close the picker
1479
1479
  if (!sQuery && Device.system.desktop) {
1480
- if (this.oPicker.isOpen()) {
1480
+ if (this.oPicker && this.oPicker.isOpen()) {
1481
1481
  this.oPicker.close();
1482
1482
  }
1483
1483
 
@@ -35,6 +35,7 @@ sap.ui.define(
35
35
 
36
36
  return SampleController.extend("sap.ui.documentation.sdk.controller.Code", {
37
37
  constructor: function () {
38
+ SampleController.apply(this, arguments);
38
39
  this.onFileEditorFileChangeDebounced = _debounce(this.onFileEditorFileChangeDebounced, 500);
39
40
  },
40
41
 
@@ -20,6 +20,7 @@ sap.ui.define([
20
20
  * @alias sap.ui.documentation.sdk.controller.ErrorHandler
21
21
  */
22
22
  constructor : function (oComponent) {
23
+ UI5Object.call(this);
23
24
  this._oComponent = oComponent;
24
25
  this._oModel = oComponent.getModel();
25
26
  this._bMessageOpen = false;
@@ -409,10 +409,13 @@ sap.ui.define([
409
409
  });
410
410
 
411
411
  var fnLoadSettings = function(eMessage) {
412
+ if (!this._isMessageFromSampleIframe(eMessage)) {
413
+ return;
414
+ }
412
415
  fnCallback(eMessage);
413
416
  window.removeEventListener("message", fnLoadSettings);
414
417
  resolve();
415
- };
418
+ }.bind(this);
416
419
 
417
420
  window.addEventListener("message", fnLoadSettings);
418
421
 
@@ -680,6 +683,11 @@ sap.ui.define([
680
683
  return this.byId("page");
681
684
  },
682
685
 
686
+ _isMessageFromSampleIframe: function(eMessage) {
687
+ return eMessage.origin === this.getOwnerComponent()._sSampleIframeOrigin &&
688
+ eMessage.source === this._oHtmlControl.getDomRef().contentWindow;
689
+ },
690
+
683
691
  onMessage: function(eMessage) {
684
692
  var oModelData = this.oModel.getData();
685
693
 
@@ -687,10 +695,7 @@ sap.ui.define([
687
695
  return;
688
696
  }
689
697
 
690
- if (eMessage.origin !== this.getOwnerComponent()._sSampleIframeOrigin) {
691
- return;
692
- }
693
- if (eMessage.source !== this._oHtmlControl.getDomRef().contentWindow) {
698
+ if (!this._isMessageFromSampleIframe(eMessage)) {
694
699
  return;
695
700
  }
696
701
 
@@ -6,10 +6,16 @@
6
6
 
7
7
  sap.ui.define([
8
8
  "sap/ui/thirdparty/jquery",
9
+ "sap/base/Log",
9
10
  "sap/ui/core/Fragment",
11
+ "sap/ui/documentation/sdk/controller/util/APIInfo",
10
12
  "sap/ui/documentation/sdk/controller/BaseController",
11
13
  "sap/ui/documentation/sdk/util/ToggleFullScreenHandler",
12
14
  "sap/ui/documentation/sdk/model/formatter",
15
+ "sap/ui/documentation/Row",
16
+ "sap/ui/documentation/ParamText",
17
+ "sap/ui/documentation/JSDocType",
18
+ "sap/ui/documentation/JSDocText",
13
19
  "sap/m/Image",
14
20
  "sap/m/Label",
15
21
  "sap/m/Link",
@@ -23,10 +29,14 @@ sap.ui.define([
23
29
  "sap/m/CustomListItem",
24
30
  "sap/m/List",
25
31
  "sap/ui/dom/includeStylesheet",
26
- "sap/ui/dom/includeScript"
27
- ], function (jQuery, Fragment, BaseController, ToggleFullScreenHandler,
28
- formatter, Image, Label, Link, Text, HBox, ObjectAttribute, ObjectStatus, Popover,
29
- library, coreLibrary, CustomListItem, List, includeStylesheet, includeScript) {
32
+ "sap/ui/dom/includeScript",
33
+ "sap/uxap/ObjectPageSection",
34
+ "sap/ui/documentation/ObjectPageSubSection",
35
+ "sap/ui/core/HTML"
36
+ ], function (jQuery, Log, Fragment, APIInfo, BaseController, ToggleFullScreenHandler,
37
+ formatter, Row, ParamText, JSDocType, JSDocText, Image, Label, Link, Text, HBox, ObjectAttribute, ObjectStatus, Popover,
38
+ library, coreLibrary, CustomListItem, List, includeStylesheet, includeScript,
39
+ ObjectPageSection, ObjectPageSubSection, HTML) {
30
40
  "use strict";
31
41
 
32
42
  // shortcut for sap.m.FlexWrap
@@ -122,21 +132,56 @@ sap.ui.define([
122
132
  this._oModel.setProperty("/ui5-metadata/associations", bHasSelfAssoc ? this._selfAssociations : this._allAssociations);
123
133
  }
124
134
 
125
- if (this._oModel.getProperty("/hasFAQ")) {
126
- var sLibName = this._oEntityData.lib,
127
- sLibPath = sLibName.replace(/\./g, '/'),
128
- sFile = this._oEntityData.name.replace(sLibName, "").replace(/^[.]/, "").replace(/\./g, '/') + ".html";
129
- jQuery.ajax({
130
- type: "GET",
131
- url: './docs/api/' + sLibPath +
132
- '/demokit/faq/' + sFile,
133
- success: function (data) {
134
- this._oModel.setProperty("/faqContent", data);
135
- }.bind(this)
135
+ var sLibName = this._oEntityData.lib,
136
+ sLibPath = sLibName.replace(/\./g, '/'),
137
+ sComponentPath = this._oEntityData.name.replace(sLibName, "").replace(/^[.]/, "").replace(/\./g, '/'),
138
+ aSectionTypes = (this._oControlData.customSections || []).map(function(section) {
139
+ var sType = typeof section === 'string' ? section : section.name;
140
+ return {
141
+ type: sType,
142
+ property: sType + "Content",
143
+ displayTitle: sType.charAt(0).toUpperCase() + sType.slice(1),
144
+ sectionId: sType.toLowerCase(),
145
+ hasSubsections: section.hasSubsections || false,
146
+ subsections: section.subsections || null
147
+ };
136
148
  });
137
- }
138
149
 
139
- // Attach the model to the view
150
+ var fnLoadContent = function(sUrl, sProperty) {
151
+ return new Promise(function(resolve) {
152
+ jQuery.ajax({
153
+ url: sUrl,
154
+ success: function(data) {
155
+ this._oModel.setProperty("/" + sProperty, data);
156
+ resolve(true);
157
+ }.bind(this),
158
+ error: function() { resolve(false); }
159
+ });
160
+ }.bind(this));
161
+ }.bind(this);
162
+
163
+ var aContentPromises = aSectionTypes.map(function(oSection) {
164
+ var aPromises = [];
165
+ var sBaseUrl = './docs/api/' + sLibPath + '/demokit/sections/' + sComponentPath + '/';
166
+
167
+ if (oSection.hasSubsections) {
168
+ // Load main + subsections
169
+ aPromises.push(fnLoadContent(sBaseUrl + oSection.type + '.html', oSection.type + "_mainContent"));
170
+ oSection.subsections.forEach(function(sub) {
171
+ aPromises.push(fnLoadContent(sBaseUrl + oSection.type + '/' + sub + '.html', oSection.type + "_" + sub + "Content"));
172
+ });
173
+ } else {
174
+ // Load single section
175
+ aPromises.push(fnLoadContent(sBaseUrl + oSection.type + '.html', oSection.property));
176
+ }
177
+
178
+ return Promise.all(aPromises).then(function() { return oSection; });
179
+ });
180
+
181
+ Promise.all(aContentPromises).then(function(aSections) {
182
+ aSections.forEach(this._createAndAddSection, this);
183
+ }.bind(this));
184
+
140
185
  this.setModel(this._oModel);
141
186
 
142
187
  // Build needed resources and pre-process data
@@ -305,6 +350,40 @@ sap.ui.define([
305
350
  }
306
351
  },
307
352
 
353
+ /**
354
+ * Applies syntax highlighting to a LightTable after it is re-rendered.
355
+ * Attaches an onAfterRendering delegate to the LightTable, applies highlighting,
356
+ * and then removes the delegate.
357
+ * @param {sap.ui.documentation.LightTable} oLightTable The LightTable control to apply highlighting to
358
+ * @private
359
+ */
360
+ _applyHljsToLightTable: function(oLightTable) {
361
+ if (!oLightTable || !window.hljs) {
362
+ return;
363
+ }
364
+
365
+ var oDelegate = {
366
+ onAfterRendering: function() {
367
+ // Find unprocessed pre elements within the LightTable's DOM
368
+ var oDomRef = oLightTable.getDomRef();
369
+ if (oDomRef) {
370
+ var aPreElements = oDomRef.querySelectorAll('pre:not(.hljs)');
371
+ if (aPreElements.length > 0) {
372
+ aPreElements.forEach(function(oElement) {
373
+ oElement.classList.add('hljs');
374
+ window.hljs.highlightElement(oElement);
375
+ });
376
+ }
377
+ }
378
+ // Remove the delegate after execution
379
+ oLightTable.removeEventDelegate(oDelegate);
380
+ }
381
+ };
382
+
383
+ // Attach the delegate to the LightTable
384
+ oLightTable.addEventDelegate(oDelegate);
385
+ },
386
+
308
387
  scrollToEntity: function (sSectionId, sEntityId) {
309
388
 
310
389
  var aFilteredSubSections,
@@ -657,6 +736,366 @@ sap.ui.define([
657
736
  return this._oPopover;
658
737
  },
659
738
 
739
+ /**
740
+ * Handles the typedef toggle event
741
+ * @param {sap.ui.base.Event} oEvent The event object
742
+ */
743
+ onTypedefToggle: function(oEvent) {
744
+ var oRow = oEvent.getSource(),
745
+ oLightTable = this._findParentLightTable(oRow),
746
+ sTypedefName = oRow?.getTypedefName();
747
+
748
+ if (!sTypedefName || !oLightTable) {
749
+ return;
750
+ }
751
+
752
+ if (oRow.getExpanded()) {
753
+ oRow.setExpanded(false);
754
+
755
+ oLightTable.invalidate();
756
+ this._applyHljsToLightTable(oLightTable);
757
+
758
+ return;
759
+ }
760
+
761
+ if (oRow.getSubRows().length > 0) {
762
+ // Already loaded typedef properties, just expand
763
+ oRow.setExpanded(true);
764
+
765
+ oLightTable.invalidate();
766
+ this._applyHljsToLightTable(oLightTable);
767
+
768
+ return;
769
+ }
770
+
771
+ // Find the typedef entity in the API index first
772
+ var oTypedefInfo = this._findTypedefInApiIndex(sTypedefName);
773
+
774
+ if (oTypedefInfo) {
775
+ // Fetch complete typedef data from API.json including inherited properties
776
+ this._collectTypedefPropertiesWithInheritance(oTypedefInfo)
777
+ .then(function(aTypedefProperties) {
778
+ // Add Row controls to the LightTable for each typedef property
779
+ if (aTypedefProperties && aTypedefProperties.length > 0) {
780
+ this._addTypedefSubRows(oRow, aTypedefProperties);
781
+
782
+ oRow.setExpanded(true);
783
+ oLightTable.invalidate();
784
+ this._applyHljsToLightTable(oLightTable);
785
+ }
786
+ }.bind(this))
787
+ .catch(function(oError) {
788
+ // Handle error silently
789
+ Log.error("Error loading typedef data: " + oError);
790
+ });
791
+ }
792
+ },
793
+
794
+ /**
795
+ * Collects typedef properties including inherited properties from base typedefs.
796
+ * Traverses the inheritance chain and concatenates all properties.
797
+ * @param {object} oTypedefInfo Initial typedef info from API index
798
+ * @returns {Promise} Promise that resolves with array of all typedef properties (own + inherited)
799
+ * @private
800
+ */
801
+ _collectTypedefPropertiesWithInheritance: function(oTypedefInfo) {
802
+ var aInheritanceChain = [],
803
+ aRequiredLibs = [];
804
+
805
+ // Build the inheritance chain by traversing the extends property
806
+ // Also collect all required libraries for loading
807
+ return this._buildTypedefInheritanceChain(oTypedefInfo)
808
+ .then(function(oChainResult) {
809
+ aInheritanceChain = oChainResult.chain;
810
+ aRequiredLibs = oChainResult.libs;
811
+
812
+ // Generate promises for all required libraries
813
+ var aPromises = aRequiredLibs.map(function(sLibName) {
814
+ return APIInfo.getLibraryElementsJSONPromise(sLibName);
815
+ });
816
+
817
+ return Promise.all(aPromises);
818
+ })
819
+ .then(function(aLibResults) {
820
+ // Combine all library elements into one array
821
+ var aAllLibraryElements = [];
822
+ aLibResults.forEach(function(aSingleLibraryElements) {
823
+ aAllLibraryElements = aAllLibraryElements.concat(aSingleLibraryElements);
824
+ });
825
+
826
+ // Collect properties from all typedefs in the inheritance chain
827
+ var aAllProperties = [],
828
+ aPropertyNames = []; // Track property names to handle overrides
829
+
830
+ // Process inheritance chain in order (current typedef first, then base typedefs)
831
+ aInheritanceChain.forEach(function(sTypedefName, iIndex) {
832
+ var oTypedefData = this._findEntityInLibraryData(aAllLibraryElements, sTypedefName);
833
+
834
+ if (oTypedefData?.properties) {
835
+ oTypedefData.properties.forEach(function(oProperty) {
836
+ // Only add property if it's not already defined (handle overrides)
837
+ if (aPropertyNames.indexOf(oProperty.name) === -1) {
838
+ // Clone the property to avoid modifying the original
839
+ var oClone = jQuery.extend(true, {}, oProperty);
840
+ oClone.depth = 1;
841
+
842
+ // Mark inherited properties (not from the first typedef in chain)
843
+ if (iIndex > 0) {
844
+ oClone.borrowedFrom = sTypedefName;
845
+ }
846
+
847
+ aAllProperties.push(oClone);
848
+ aPropertyNames.push(oProperty.name);
849
+ }
850
+ });
851
+ }
852
+ }.bind(this));
853
+
854
+ return aAllProperties;
855
+ }.bind(this));
856
+ },
857
+
858
+ /**
859
+ * Builds the inheritance chain for a typedef by following the extends property.
860
+ * @param {object} oTypedefInfo Initial typedef info from API index
861
+ * @returns {Promise} Promise that resolves with object containing chain array and libs array
862
+ * @private
863
+ */
864
+ _buildTypedefInheritanceChain: function(oTypedefInfo) {
865
+ var aInheritanceChain = [oTypedefInfo.name],
866
+ aRequiredLibs = [];
867
+
868
+ // Add the initial library
869
+ if (oTypedefInfo.lib && aRequiredLibs.indexOf(oTypedefInfo.lib) === -1) {
870
+ aRequiredLibs.push(oTypedefInfo.lib);
871
+ }
872
+
873
+ // Load the initial typedef to get its extends property
874
+ return this._loadCompleteTypedefData(oTypedefInfo)
875
+ .then(function(oFullTypedefData) {
876
+ // Check if typedef has a base typedef (extends property)
877
+ if (!oFullTypedefData.extends) {
878
+ return {
879
+ chain: aInheritanceChain,
880
+ libs: aRequiredLibs
881
+ };
882
+ }
883
+
884
+ // Build the rest of the inheritance chain
885
+ return this._traverseTypedefInheritanceChain(
886
+ oFullTypedefData.extends,
887
+ aInheritanceChain,
888
+ aRequiredLibs
889
+ );
890
+ }.bind(this));
891
+ },
892
+
893
+ /**
894
+ * Recursively traverses the typedef inheritance chain.
895
+ * @param {string} sBaseTypedefName Name of the base typedef to process
896
+ * @param {array} aInheritanceChain Current inheritance chain array
897
+ * @param {array} aRequiredLibs Current required libraries array
898
+ * @returns {Promise} Promise that resolves with object containing chain and libs arrays
899
+ * @private
900
+ */
901
+ _traverseTypedefInheritanceChain: function(sBaseTypedefName, aInheritanceChain, aRequiredLibs) {
902
+ // Find the base typedef in the API index
903
+ var oBaseTypedefInfo = this._findTypedefInApiIndex(sBaseTypedefName);
904
+
905
+ // If base typedef not found, stop traversal
906
+ if (!oBaseTypedefInfo) {
907
+ return Promise.resolve({
908
+ chain: aInheritanceChain,
909
+ libs: aRequiredLibs
910
+ });
911
+ }
912
+
913
+ // Add to inheritance chain
914
+ aInheritanceChain.push(sBaseTypedefName);
915
+
916
+ // Add library if not already included
917
+ if (oBaseTypedefInfo.lib && aRequiredLibs.indexOf(oBaseTypedefInfo.lib) === -1) {
918
+ aRequiredLibs.push(oBaseTypedefInfo.lib);
919
+ }
920
+
921
+ // Load the base typedef to check if it also has a parent
922
+ return this._loadCompleteTypedefData(oBaseTypedefInfo)
923
+ .then(function(oBaseTypedefData) {
924
+ // If this typedef also extends another, continue traversal
925
+ if (oBaseTypedefData.extends) {
926
+ return this._traverseTypedefInheritanceChain(
927
+ oBaseTypedefData.extends,
928
+ aInheritanceChain,
929
+ aRequiredLibs
930
+ );
931
+ }
932
+
933
+ // No more parents, return the complete chain
934
+ return {
935
+ chain: aInheritanceChain,
936
+ libs: aRequiredLibs
937
+ };
938
+ }.bind(this))
939
+ .catch(function() {
940
+ // If loading fails, return what we have so far
941
+ return {
942
+ chain: aInheritanceChain,
943
+ libs: aRequiredLibs
944
+ };
945
+ });
946
+ },
947
+
948
+ /**
949
+ * Adds Row controls to the LightTable for typedef properties
950
+ * @param {sap.ui.documentation.Row} oParentRow The parent row being expanded
951
+ * @param {array} aTypedefProperties Array of typedef properties to add as rows
952
+ * @private
953
+ */
954
+ _addTypedefSubRows: function(oParentRow, aTypedefProperties) {
955
+ // Create sub-row controls for typedef properties
956
+ var aSubRows = aTypedefProperties.map(function(oProperty) {
957
+ return new Row({
958
+ content: [
959
+ new ParamText({
960
+ text: oProperty.name,
961
+ phoneText: oProperty.phoneName,
962
+ depth: oProperty.depth || 1,
963
+ optional: oProperty.optional
964
+ }),
965
+ new JSDocType({
966
+ typeInfo: oProperty.typeInfo
967
+ }),
968
+ new Text({
969
+ text: oProperty.defaultValue || "",
970
+ wrapping: false
971
+ }),
972
+ new JSDocText({
973
+ sanitizeContent: false,
974
+ text: this.formatter.escapeSettingsValue(oProperty.description)
975
+ })
976
+ ]
977
+ }).addStyleClass("subrow");
978
+ }.bind(this));
979
+
980
+ // Add sub-rows to the parent row
981
+ aSubRows.forEach(function(oSubRow) {
982
+ oParentRow.addSubRow(oSubRow);
983
+ });
984
+ },
985
+
986
+ /**
987
+ * Finds the parent LightTable control of a given control
988
+ * @param {sap.ui.core.Control} oControl - The control to find the parent LightTable for
989
+ * @returns {sap.ui.documentation.LightTable|null} The parent LightTable control or null if not found
990
+ * @private
991
+ */
992
+ _findParentLightTable: function(oControl) {
993
+ var oParent = oControl?.getParent();
994
+
995
+ while (oParent) {
996
+ if (oParent.isA("sap.ui.documentation.LightTable")) {
997
+ return oParent;
998
+ }
999
+ oParent = oParent.getParent();
1000
+ }
1001
+
1002
+ return null;
1003
+ },
1004
+
1005
+ /**
1006
+ * Finds a typedef entity in the API index
1007
+ * @param {string} sTypedefName The name of the typedef to find
1008
+ * @returns {object} The typedef entity data or null if not found
1009
+ * @private
1010
+ */
1011
+ _findTypedefInApiIndex: function(sTypedefName) {
1012
+ var oTypedefData = null;
1013
+
1014
+ // Recursive function to find the typedef in the API index
1015
+ function findSymbol(aNodes) {
1016
+ if (!aNodes) {
1017
+ return false;
1018
+ }
1019
+
1020
+ return aNodes.some(function(oNode) {
1021
+ var bFound = oNode.name === sTypedefName;
1022
+ if (bFound) {
1023
+ oTypedefData = oNode;
1024
+ return true;
1025
+ } else if (oNode.nodes && sTypedefName.startsWith(oNode.name + ".")) {
1026
+ return findSymbol(oNode.nodes);
1027
+ }
1028
+ return false;
1029
+ });
1030
+ }
1031
+
1032
+ // Search in the API index
1033
+ if (this._aApiIndex) {
1034
+ findSymbol(this._aApiIndex);
1035
+ }
1036
+
1037
+ return oTypedefData;
1038
+ },
1039
+
1040
+ /**
1041
+ * Loads complete typedef data from API.json files
1042
+ * @param {object} oTypedefInfo Initial typedef info from API index
1043
+ * @returns {Promise} Promise that resolves with the complete typedef data
1044
+ * @private
1045
+ */
1046
+ _loadCompleteTypedefData: function(oTypedefInfo) {
1047
+ // Get the library name from the typedef info
1048
+ var sLibName = oTypedefInfo.lib;
1049
+
1050
+ if (!sLibName) {
1051
+ return Promise.reject("Library name not found for typedef");
1052
+ }
1053
+
1054
+ // Use APIInfo to load the library's API.json data
1055
+ return APIInfo.getLibraryElementsJSONPromise(sLibName)
1056
+ .then(function(aLibData) {
1057
+ try {
1058
+ // Find the complete typedef data in the library elements
1059
+ var oTypedefData = this._findEntityInLibraryData(aLibData, oTypedefInfo.name);
1060
+
1061
+ if (oTypedefData) {
1062
+ return oTypedefData;
1063
+ } else {
1064
+ return Promise.reject("Typedef not found in library data");
1065
+ }
1066
+ } catch (oProcessError) {
1067
+ return Promise.reject("Error processing typedef data: " + oProcessError);
1068
+ }
1069
+ }.bind(this))
1070
+ .catch(function(oError) {
1071
+ return Promise.reject("Error loading library data: " + oError);
1072
+ });
1073
+ },
1074
+
1075
+ /**
1076
+ * Finds an entity in library data loaded from API.json
1077
+ * @param {array} aLibraryData Array of library elements from API.json
1078
+ * @param {string} sEntityName Name of the entity to find
1079
+ * @returns {object} The entity data or null if not found
1080
+ * @private
1081
+ */
1082
+ _findEntityInLibraryData: function(aLibraryData, sEntityName) {
1083
+ // Find entity in loaded libs data
1084
+ for (var i = 0, iLen = aLibraryData.length; i < iLen; i++) {
1085
+ var oLibItem = aLibraryData[i];
1086
+ if (oLibItem.name === sEntityName) {
1087
+ // Check if we are allowed to display the requested symbol
1088
+ // BCP: 1870269087 item may not have visibility info at all. In this case we show the item
1089
+ if (oLibItem.visibility === undefined || this._aAllowedMembers.indexOf(oLibItem.visibility) >= 0) {
1090
+ return oLibItem;
1091
+ } else {
1092
+ return null;
1093
+ }
1094
+ }
1095
+ }
1096
+ return null;
1097
+ },
1098
+
660
1099
  /**
661
1100
  * Builds the header layout structure.
662
1101
  * The header displays the entity data in 3 columns
@@ -727,6 +1166,37 @@ sap.ui.define([
727
1166
  }, this);
728
1167
  },
729
1168
 
1169
+ /**
1170
+ * Creates and adds a dynamic section to the ObjectPageLayout
1171
+ * @param {object} oSectionConfig Section configuration object
1172
+ * @private
1173
+ */
1174
+ _createAndAddSection: function(oSectionConfig) {
1175
+ var fnCreateSubSection = function(sProperty, sTitle) {
1176
+ var oHTML = new HTML({content: "{/" + sProperty + "}"});
1177
+ oHTML.setModel(this._oModel);
1178
+ return new ObjectPageSubSection(sTitle ? {title: sTitle, blocks: [oHTML]} : {blocks: [oHTML]});
1179
+ }.bind(this);
1180
+
1181
+ var aSubSections = [];
1182
+ if (oSectionConfig.hasSubsections) {
1183
+ aSubSections.push(fnCreateSubSection(oSectionConfig.type + "_mainContent", "Overview"));
1184
+ oSectionConfig.subsections.forEach(function(sub) {
1185
+ aSubSections.push(fnCreateSubSection(oSectionConfig.type + "_" + sub + "Content", sub));
1186
+ });
1187
+ } else {
1188
+ aSubSections.push(fnCreateSubSection(oSectionConfig.property));
1189
+ }
1190
+
1191
+ var oPageSection = new ObjectPageSection({
1192
+ id: this.createId(oSectionConfig.sectionId),
1193
+ title: oSectionConfig.displayTitle,
1194
+ titleUppercase: false,
1195
+ subSections: aSubSections
1196
+ });
1197
+ oPageSection.addStyleClass("sectionContent");
1198
+ this._objectPage.addSection(oPageSection);
1199
+ },
730
1200
  onAnnotationsLinkPress: function () {
731
1201
  this.scrollToEntity("annotations", "Summary");
732
1202
  },
@@ -34,6 +34,7 @@ sap.ui.define([
34
34
  },
35
35
 
36
36
  constructor : function (oComponent) {
37
+ BaseObject.call(this);
37
38
  this._oComponent = oComponent;
38
39
  },
39
40
 
@@ -74,6 +74,7 @@ sap.ui.define(
74
74
  "sap.ui.documentation.sdk.controller.util.DefaultConsentManager",
75
75
  {
76
76
  constructor: function (oComponent, oConfig) {
77
+ BaseObject.call(this);
77
78
  this._oCmponent = oComponent;
78
79
  this._oConfigUtil = oComponent.getConfigUtil();
79
80
  this._sConsentDialogComponentId = oConfig.defaultConsentDialogComponentId;
@@ -69,6 +69,7 @@ sap.ui.define(
69
69
  "sap.ui.documentation.sdk.controller.util.UsageTracker",
70
70
  {
71
71
  constructor: function (oComponent) {
72
+ BaseObject.call(this);
72
73
  this._oComponent = oComponent;
73
74
  this._oRouter = oComponent.getRouter();
74
75
  this._oConfig = oComponent.getConfig();
@@ -16,6 +16,7 @@ sap.ui.define([
16
16
  return Controller.extend("sap.ui.documentation.sdk.cookieSettingsDialog.controller.CookieSettingsDialog", {
17
17
 
18
18
  constructor: function() {
19
+ Controller.call(this);
19
20
  this._oCookiesUtil = null;
20
21
  this._oRootView = null;
21
22
  this._oInitOptions = null;
@@ -998,10 +998,10 @@ var hljs = (function () {
998
998
  * @param {string} message
999
999
  */
1000
1000
  const deprecated = (version, message) => {
1001
- if (seenDeprecations[`1.145.0/${message}`]) return;
1001
+ if (seenDeprecations[`1.146.0/${message}`]) return;
1002
1002
 
1003
- console.log(`Deprecated as of 1.145.0. ${message}`);
1004
- seenDeprecations[`1.145.0/${message}`] = true;
1003
+ console.log(`Deprecated as of 1.146.0. ${message}`);
1004
+ seenDeprecations[`1.146.0/${message}`] = true;
1005
1005
  };
1006
1006
 
1007
1007
  /* eslint-disable no-throw-literal */
@@ -248,7 +248,7 @@
248
248
  columnTitles="Param,Type,Default Value,Description"
249
249
  columnCount="4"
250
250
  class="sapUiDocumentationParamsTable">
251
- <custom:Row>
251
+ <custom:Row expandable="{= ${typeInfo/refersToTypedef} === true}" typedefName="{= ${typeInfo/UI5Types} ? ${typeInfo/UI5Types/0} : ${typeInfo/type} }" expandToggle="onTypedefToggle">
252
252
  <custom:ParamText text="{name}" phoneText="{phoneName}" depth="{depth}" optional="{optional}"/>
253
253
  <custom:JSDocType typeInfo="{parts: ['typeInfo', 'types', 'type', 'linkEnabled'], formatter: '.formatter.formatJSDocType'}"/>
254
254
  <m:Text text="{defaultValue}" wrapping="false"/>
@@ -544,7 +544,7 @@
544
544
  <template:if test="{= !!${event>parameters} &amp;&amp; ${event>parameters}.length > 0}">
545
545
  <custom:LightTable columnTitles="Param,Type,Description" columnCount="3">
546
546
  <template:repeat list="{event>parameters}" var="parameter">
547
- <custom:Row>
547
+ <custom:Row expandable="{= ${parameter>typeInfo/refersToTypedef} === true}" typedefName="{= ${parameter>typeInfo/UI5Types} ? ${parameter>typeInfo/UI5Types/0} : ${parameter>typeInfo/type} }" expandToggle="onTypedefToggle">
548
548
  <custom:ParamText text="{parameter>name}" phoneText="{parameter>phoneName}" depth="{parameter>depth}" optional="{parameter>optional}"/>
549
549
  <custom:JSDocType typeInfo="{parts: ['parameter>typeInfo', 'parameter>types', 'parameter>type', 'parameter>linkEnabled'], formatter: '.formatter.stringifyJSDocType'}"/>
550
550
  <layout:VerticalLayout>
@@ -668,7 +668,7 @@
668
668
  columnTitles="Param,Type,Default Value,Description"
669
669
  class="sapUiDocumentationParamsTable">
670
670
  <template:repeat list="{method>parameters}" var="parameter">
671
- <custom:Row>
671
+ <custom:Row expandable="{= ${parameter>typeInfo/refersToTypedef} === true}" typedefName="{= ${parameter>typeInfo/UI5Types} ? ${parameter>typeInfo/UI5Types/0} : ${parameter>typeInfo/type} }" expandToggle="onTypedefToggle">
672
672
  <custom:ParamText text="{parameter>name}" phoneText="{parameter>phoneName}" depth="{parameter>depth}" optional="{parameter>optional}"/>
673
673
  <custom:JSDocType typeInfo="{parts: ['parameter>typeInfo','parameter>types'], formatter: '.formatter.stringifyJSDocType'}"/>
674
674
  <m:Text text="{parameter>defaultValue}" wrapping="false"/>
@@ -782,20 +782,6 @@
782
782
  </ObjectPageSection>
783
783
  </template:if>
784
784
 
785
- <template:if test="{data>/hasFAQ}">
786
- <ObjectPageSection id="faq" title="FAQ" class="faqContent">
787
- <subSections>
788
- <custom:ObjectPageSubSection>
789
- <custom:blocks>
790
- <core:HTML id="parserId" content="{/faqContent}"/>
791
- </custom:blocks>
792
- </custom:ObjectPageSubSection>
793
- </subSections>
794
- </ObjectPageSection>
795
- </template:if>
796
-
797
- <core:ExtensionPoint name="customSections" />
798
-
799
785
  </sections>
800
786
 
801
787
  </ObjectPageLayout>
@@ -42,7 +42,7 @@ html.sap-tablet:not(.sap-desktop) {
42
42
  }
43
43
  }
44
44
 
45
- .faqContent {
45
+ .sectionContent {
46
46
  details {
47
47
  margin: 0.8em;
48
48
  }
@@ -67,10 +67,10 @@ html.sap-tablet:not(.sap-desktop) {
67
67
  }
68
68
 
69
69
  #d4h5-main-container,
70
- .faqContent {
70
+ .sectionContent {
71
71
  font-size: 0.875em;
72
72
 
73
- &.faqContent pre > code {
73
+ &.sectionContent pre > code {
74
74
  font-family: monospace;
75
75
  }
76
76
 
@@ -157,7 +157,7 @@ html.sap-tablet:not(.sap-desktop) {
157
157
  }
158
158
  }
159
159
 
160
- &.faqContent h2,
160
+ &.sectionContent h2,
161
161
  .section.topic > .innerTitle > h2 {
162
162
  font-size: 2em;
163
163
  font-weight: 400;
@@ -144,6 +144,30 @@
144
144
  border-bottom: solid 1px #e5e5e5;
145
145
  border-left: solid 1px #e5e5e5;
146
146
  border-right: solid 1px #e5e5e5;
147
+
148
+ &.subrow,
149
+ &.expanded {
150
+ background-color: #f5f5f5;
151
+ }
152
+
153
+ /* Expandable rows - display icon and ParamText inline */
154
+ &.collapsed,
155
+ &.expanded {
156
+ > .cell:first-child {
157
+ display: flex;
158
+ align-items: flex-start;
159
+
160
+ .sapUiDocTypedefExpandIcon {
161
+ margin-top: 0.25rem;
162
+ flex-shrink: 0;
163
+ color: var(--sapButton_Lite_TextColor);
164
+ }
165
+
166
+ .sapUiParamText {
167
+ flex: 1;
168
+ }
169
+ }
170
+ }
147
171
  }
148
172
 
149
173
  .sapUiTheme-sap_belize_hcb .sapUiDocLightTable .head,
@@ -182,6 +206,11 @@
182
206
  .sapUiDocLightTable .row {
183
207
  background-color: @sapBaseColor;
184
208
  border-bottom: solid 1px @sapPageHeader_BorderColor;
209
+
210
+ &.subrow,
211
+ &.expanded {
212
+ background-color: #282c34;
213
+ }
185
214
  }
186
215
 
187
216
  .sapUiDocLightTable .head,
@@ -42,7 +42,7 @@ html.sap-tablet:not(.sap-desktop) {
42
42
  }
43
43
  }
44
44
 
45
- .faqContent {
45
+ .sectionContent {
46
46
  details {
47
47
  margin: 0.8em;
48
48
  }
@@ -67,10 +67,10 @@ html.sap-tablet:not(.sap-desktop) {
67
67
  }
68
68
 
69
69
  #d4h5-main-container,
70
- .faqContent {
70
+ .sectionContent {
71
71
  font-size: 0.875em;
72
72
 
73
- &.faqContent pre > code {
73
+ &.sectionContent pre > code {
74
74
  font-family: monospace;
75
75
  }
76
76
 
@@ -156,7 +156,7 @@ html.sap-tablet:not(.sap-desktop) {
156
156
  }
157
157
  }
158
158
 
159
- &.faqContent h2,
159
+ &.sectionContent h2,
160
160
  .section.topic > .innerTitle > h2 {
161
161
  font-size: 2em;
162
162
  font-weight: 400;
@@ -3,7 +3,7 @@
3
3
  @code-highlight-color: #24435e;
4
4
 
5
5
  #d4h5-main-container,
6
- .faqContent {
6
+ .sectionContent {
7
7
 
8
8
  .note,
9
9
  pre.codeblock,