@sapudex/web-components 2.32.1 → 2.34.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 (159) hide show
  1. package/cypress/fixtures/masthead-shell.ts +281 -0
  2. package/cypress/specs/Breadcrumbs.cy.tsx +196 -1
  3. package/cypress/specs/FilterMenu.cy.tsx +53 -0
  4. package/cypress/specs/ListItem.cy.tsx +48 -0
  5. package/cypress/specs/MastheadMenu.cy.tsx +564 -0
  6. package/cypress/specs/MastheadMobileMenu.cy.tsx +573 -0
  7. package/cypress/specs/MastheadShell.cy.tsx +645 -0
  8. package/cypress/specs/SecondaryNavigationDesktop.cy.tsx +289 -95
  9. package/cypress/specs/SecondaryNavigationMobile.cy.tsx +42 -0
  10. package/cypress/specs/SelectBox.cy.tsx +63 -0
  11. package/cypress/specs/TabNavigation.cy.tsx +431 -10
  12. package/cypress/support/component-imports.instrumented.ts +14 -0
  13. package/cypress/support/component-imports.src.ts +10 -0
  14. package/dist/Breadcrumbs.d.ts +12 -0
  15. package/dist/Breadcrumbs.js +30 -6
  16. package/dist/Breadcrumbs.js.map +1 -1
  17. package/dist/BreadcrumbsPopoverTemplate.js +10 -1
  18. package/dist/BreadcrumbsPopoverTemplate.js.map +1 -1
  19. package/dist/BreadcrumbsTemplate.js +1 -1
  20. package/dist/BreadcrumbsTemplate.js.map +1 -1
  21. package/dist/ListItem.d.ts +3 -0
  22. package/dist/ListItem.js +10 -1
  23. package/dist/ListItem.js.map +1 -1
  24. package/dist/ListItemBase.d.ts +29 -0
  25. package/dist/ListItemBase.js +22 -0
  26. package/dist/ListItemBase.js.map +1 -1
  27. package/dist/MastheadItem.d.ts +2 -1
  28. package/dist/MastheadItem.js.map +1 -1
  29. package/dist/MastheadMenu.d.ts +2 -1
  30. package/dist/MastheadMenu.js.map +1 -1
  31. package/dist/SearchableListBase.d.ts +3 -1
  32. package/dist/SearchableListBase.js +7 -1
  33. package/dist/SearchableListBase.js.map +1 -1
  34. package/dist/SecondaryNavigation.d.ts +1 -6
  35. package/dist/SecondaryNavigation.js +6 -59
  36. package/dist/SecondaryNavigation.js.map +1 -1
  37. package/dist/SecondaryNavigationItem.d.ts +5 -12
  38. package/dist/SecondaryNavigationItem.js +34 -65
  39. package/dist/SecondaryNavigationItem.js.map +1 -1
  40. package/dist/SecondaryNavigationItemBase.d.ts +0 -1
  41. package/dist/SecondaryNavigationItemBase.js +0 -4
  42. package/dist/SecondaryNavigationItemBase.js.map +1 -1
  43. package/dist/SelectBase.js +4 -2
  44. package/dist/SelectBase.js.map +1 -1
  45. package/dist/Tab.d.ts +19 -0
  46. package/dist/Tab.js +22 -0
  47. package/dist/Tab.js.map +1 -1
  48. package/dist/TabNavigation.d.ts +9 -1
  49. package/dist/TabNavigation.js +25 -7
  50. package/dist/TabNavigation.js.map +1 -1
  51. package/dist/assets/{InputSuggestions-DeXhpK0F.js → InputSuggestions-Bz7HZXUc.js} +1 -1
  52. package/dist/assets/{ListItemStandardExpandableTextTemplate-jMEdrC07.js → ListItemStandardExpandableTextTemplate-CjE7hAvu.js} +1 -1
  53. package/dist/assets/{bundle-S1uYREqT.css → bundle-JYo3bV8v.css} +1 -1
  54. package/dist/assets/{bundle.esm-CwJAt93x.js → bundle.esm-mAR7ytdB.js} +217 -217
  55. package/dist/css/themes/Breadcrumbs.css +1 -1
  56. package/dist/css/themes/BreadcrumbsPopover.css +1 -1
  57. package/dist/css/themes/ListItem.css +1 -1
  58. package/dist/css/themes/MastheadMenu.css +1 -1
  59. package/dist/css/themes/MastheadMobileMenu.css +1 -1
  60. package/dist/css/themes/RatingIndicator.css +1 -1
  61. package/dist/css/themes/Slider.css +1 -1
  62. package/dist/css/themes/TabNavigation.css +1 -1
  63. package/dist/custom-elements-internal.json +1357 -212
  64. package/dist/custom-elements.json +1342 -197
  65. package/dist/generated/templates/ListItemTemplate.lit.js +32 -28
  66. package/dist/generated/templates/ListItemTemplate.lit.js.map +1 -1
  67. package/dist/generated/templates/MastheadMenuTemplate.lit.js +8 -1
  68. package/dist/generated/templates/MastheadMenuTemplate.lit.js.map +1 -1
  69. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js +10 -4
  70. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js.map +1 -1
  71. package/dist/generated/templates/SearchableListBaseTemplate.lit.js +3 -3
  72. package/dist/generated/templates/SearchableListBaseTemplate.lit.js.map +1 -1
  73. package/dist/generated/templates/SecondaryNavigationItemTemplate.lit.js +4 -4
  74. package/dist/generated/templates/SecondaryNavigationItemTemplate.lit.js.map +1 -1
  75. package/dist/generated/templates/SecondaryNavigationSubItemTemplate.lit.js +3 -3
  76. package/dist/generated/templates/SecondaryNavigationSubItemTemplate.lit.js.map +1 -1
  77. package/dist/generated/templates/SecondaryNavigationTemplate.lit.js +5 -5
  78. package/dist/generated/templates/SecondaryNavigationTemplate.lit.js.map +1 -1
  79. package/dist/generated/templates/SelectBoxTemplate.lit.js +12 -10
  80. package/dist/generated/templates/SelectBoxTemplate.lit.js.map +1 -1
  81. package/dist/generated/templates/TabHeaderTemplate.lit.js +40 -24
  82. package/dist/generated/templates/TabHeaderTemplate.lit.js.map +1 -1
  83. package/dist/generated/templates/TabNavigationTemplate.lit.js +1 -1
  84. package/dist/generated/templates/TabNavigationTemplate.lit.js.map +1 -1
  85. package/dist/generated/themes/Breadcrumbs.css.d.ts +1 -1
  86. package/dist/generated/themes/Breadcrumbs.css.js +1 -1
  87. package/dist/generated/themes/Breadcrumbs.css.js.map +1 -1
  88. package/dist/generated/themes/BreadcrumbsPopover.css.d.ts +1 -1
  89. package/dist/generated/themes/BreadcrumbsPopover.css.js +1 -1
  90. package/dist/generated/themes/BreadcrumbsPopover.css.js.map +1 -1
  91. package/dist/generated/themes/ListItem.css.d.ts +1 -1
  92. package/dist/generated/themes/ListItem.css.js +1 -1
  93. package/dist/generated/themes/ListItem.css.js.map +1 -1
  94. package/dist/generated/themes/MastheadMenu.css.d.ts +1 -1
  95. package/dist/generated/themes/MastheadMenu.css.js +1 -1
  96. package/dist/generated/themes/MastheadMenu.css.js.map +1 -1
  97. package/dist/generated/themes/MastheadMobileMenu.css.d.ts +1 -1
  98. package/dist/generated/themes/MastheadMobileMenu.css.js +1 -1
  99. package/dist/generated/themes/MastheadMobileMenu.css.js.map +1 -1
  100. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  101. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  102. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  103. package/dist/generated/themes/Slider.css.d.ts +1 -1
  104. package/dist/generated/themes/Slider.css.js +1 -1
  105. package/dist/generated/themes/Slider.css.js.map +1 -1
  106. package/dist/generated/themes/TabNavigation.css.d.ts +1 -1
  107. package/dist/generated/themes/TabNavigation.css.js +1 -1
  108. package/dist/generated/themes/TabNavigation.css.js.map +1 -1
  109. package/dist/vscode.html-custom-data.json +236 -1
  110. package/dist/web-types.json +393 -3
  111. package/package.json +1 -1
  112. package/src/Breadcrumbs.ts +26 -7
  113. package/src/BreadcrumbsPopoverTemplate.tsx +53 -41
  114. package/src/BreadcrumbsTemplate.tsx +35 -21
  115. package/src/ListItem.hbs +42 -14
  116. package/src/ListItem.ts +12 -1
  117. package/src/ListItemBase.ts +40 -0
  118. package/src/MastheadItem.ts +2 -1
  119. package/src/MastheadMenu.hbs +35 -0
  120. package/src/MastheadMenu.ts +2 -1
  121. package/src/MastheadMobileMenu.hbs +40 -9
  122. package/src/SearchableListBase.hbs +12 -0
  123. package/src/SearchableListBase.ts +11 -2
  124. package/src/SecondaryNavigation.hbs +6 -6
  125. package/src/SecondaryNavigation.ts +7 -66
  126. package/src/SecondaryNavigationItem.hbs +4 -6
  127. package/src/SecondaryNavigationItem.ts +40 -83
  128. package/src/SecondaryNavigationItemBase.ts +0 -3
  129. package/src/SecondaryNavigationSubItem.hbs +3 -7
  130. package/src/SelectBase.ts +4 -2
  131. package/src/SelectBox.hbs +13 -5
  132. package/src/Tab.ts +32 -0
  133. package/src/TabHeader.hbs +40 -19
  134. package/src/TabNavigation.hbs +5 -9
  135. package/src/TabNavigation.ts +25 -8
  136. package/src/generated/templates/ListItemTemplate.lit.ts +32 -28
  137. package/src/generated/templates/MastheadMenuTemplate.lit.ts +8 -1
  138. package/src/generated/templates/MastheadMobileMenuTemplate.lit.ts +10 -4
  139. package/src/generated/templates/SearchableListBaseTemplate.lit.ts +3 -3
  140. package/src/generated/templates/SecondaryNavigationItemTemplate.lit.ts +4 -4
  141. package/src/generated/templates/SecondaryNavigationSubItemTemplate.lit.ts +3 -3
  142. package/src/generated/templates/SecondaryNavigationTemplate.lit.ts +5 -5
  143. package/src/generated/templates/SelectBoxTemplate.lit.ts +12 -10
  144. package/src/generated/templates/TabHeaderTemplate.lit.ts +40 -24
  145. package/src/generated/templates/TabNavigationTemplate.lit.ts +1 -1
  146. package/src/generated/themes/Breadcrumbs.css.ts +1 -1
  147. package/src/generated/themes/BreadcrumbsPopover.css.ts +1 -1
  148. package/src/generated/themes/ListItem.css.ts +1 -1
  149. package/src/generated/themes/MastheadMenu.css.ts +1 -1
  150. package/src/generated/themes/MastheadMobileMenu.css.ts +1 -1
  151. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  152. package/src/generated/themes/Slider.css.ts +1 -1
  153. package/src/generated/themes/TabNavigation.css.ts +1 -1
  154. package/src/themes/Breadcrumbs.css +6 -0
  155. package/src/themes/BreadcrumbsPopover.css +12 -2
  156. package/src/themes/ListItem.css +12 -5
  157. package/src/themes/MastheadMenu.css +45 -0
  158. package/src/themes/MastheadMobileMenu.css +45 -0
  159. package/src/themes/TabNavigation.css +58 -73
@@ -4,6 +4,10 @@ import UDExLink from "./Link.js";
4
4
  import { Placement, HorizontalAlign } from "./types/Dropdown.js";
5
5
 
6
6
  export default function BreadcrumbsPopoverTemplate(this: Breadcrumbs) {
7
+ const focusableCount = this._dropdownItems.filter(i => !i._isCurrentPageItem).length;
8
+ const ofText = this._ofText;
9
+ let focusablePos = 0;
10
+
7
11
  return (
8
12
  <UDExDropdown
9
13
  id={`udex-${this._id}-breadcrumbs__popover`}
@@ -15,47 +19,55 @@ export default function BreadcrumbsPopoverTemplate(this: Breadcrumbs) {
15
19
  onKeyDown={this._handleKeydown}
16
20
  onClose={this._afterDropdownClose}
17
21
  onOpen={this._afterDropdownOpen}>
18
- <div className={`${this._rootClass}__popover-content`}>
19
- {this._dropdownItems.map((item, index) => (
20
- item.icon ? (
21
- <UDExLink
22
- key={index}
23
- data-index={index}
24
- id={`${item._id}-li`}
25
- onClick={this._onDropdownLinkPress}
26
- href={item.href}
27
- target={item.target}
28
- class={`${this._rootClass}__item ${this._rootClass}__item--with-icon ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}
29
- icon={item.icon}
30
- accessibleName={item.textContent ?? undefined}
31
- data-ui5-stable={item.stableDomRef}>
32
- {item.textContent}
33
- </UDExLink>
34
- ) : item._isCurrentPageItem ? (
35
- <span
36
- key={index}
37
- id={`${item._id}-li`}
38
- className={`${this._rootClass}__item ${this._rootClass}__item--current ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}
39
- accessible-name={item.accessibleName}
40
- data-ui5-stable={item.stableDomRef}>
41
- {item.textContent}
42
- </span>
43
- ) : (
44
- <UDExLink
45
- key={index}
46
- data-index={index}
47
- id={`${item._id}-li`}
48
- onClick={this._onDropdownLinkPress}
49
- href={item.href}
50
- target={item.target}
51
- class={`${this._rootClass}__item ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}
52
- accessibleName={item.accessibleName}
53
- data-ui5-stable={item.stableDomRef}>
54
- {item.textContent}
55
- </UDExLink>
56
- )
57
- ))}
58
- </div>
22
+ <nav className={`${this._rootClass}__popover-content`} aria-label={this._breadcrumbsAccessibleNameText}>
23
+ <ol>
24
+ {this._dropdownItems.map((item, index) => {
25
+ if (!item._isCurrentPageItem) { focusablePos++; }
26
+ const posLabel = `${item.accessibleName || item.textContent || ""}, ${focusablePos} ${ofText} ${focusableCount}`;
27
+ return item._isCurrentPageItem ? (
28
+ <li key={index} aria-hidden="true">
29
+ <span
30
+ id={`${item._id}-li`}
31
+ className={`${this._rootClass}__item ${this._rootClass}__item--current ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}
32
+ aria-current="page"
33
+ accessible-name={item.accessibleName}
34
+ data-ui5-stable={item.stableDomRef}>
35
+ {item.textContent}
36
+ </span>
37
+ </li>
38
+ ) : (
39
+ <li key={index}>
40
+ {item.icon ? (
41
+ <UDExLink
42
+ data-index={index}
43
+ id={`${item._id}-li`}
44
+ onClick={this._onDropdownLinkPress}
45
+ href={item.href}
46
+ target={item.target}
47
+ class={`${this._rootClass}__item ${this._rootClass}__item--with-icon ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}
48
+ icon={item.icon}
49
+ accessibleName={posLabel}
50
+ data-ui5-stable={item.stableDomRef}>
51
+ {item.textContent}
52
+ </UDExLink>
53
+ ) : (
54
+ <UDExLink
55
+ data-index={index}
56
+ id={`${item._id}-li`}
57
+ onClick={this._onDropdownLinkPress}
58
+ href={item.href}
59
+ target={item.target}
60
+ class={`${this._rootClass}__item ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}
61
+ accessibleName={posLabel}
62
+ data-ui5-stable={item.stableDomRef}>
63
+ {item.textContent}
64
+ </UDExLink>
65
+ )}
66
+ </li>
67
+ );
68
+ })}
69
+ </ol>
70
+ </nav>
59
71
  </UDExDropdown>
60
72
  );
61
73
  }
@@ -20,30 +20,44 @@ export default function BreadcrumbsTemplate(this: Breadcrumbs) {
20
20
  onClick={this._toggleDropdown}
21
21
  accessibleName={this._dropdownArrowAccessibleNameText}
22
22
  accessibleRole={UDExButtonAccessibleRole.Button}
23
- icon={slimArrowDown}
24
- aria-haspopup="true">
23
+ accessibilityAttributes={this._triggerAccessibilityAttributes}
24
+ icon={slimArrowDown}>
25
25
  </UDExLink>
26
26
  </li>
27
27
  {this._linksData.map(linkData =>
28
- <li
29
- class={`${this._rootClass}__link-wrapper ui5-breadcrumbs-link-wrapper`}
30
- id={`${linkData._id}-link-wrapper`}>
31
- {!linkData._isCurrentPageItem && (
32
- <>
33
- <span className={`${this._rootClass}__separator`} aria-hidden="true"></span>
34
- <UDExLink
35
- onClick={this._onLinkPress}
36
- id={`${linkData._id}-link`}
37
- class={`${rootClass}__item ${this._rootClass}__item--visible`}
38
- href={linkData.href}
39
- target={linkData.target}
40
- accessibleName={linkData._accessibleNameText}
41
- data-ui5-stable={linkData.stableDomRef}>
42
- {linkData.innerText}
43
- </UDExLink>
44
- </>
45
- )}
46
- </li>
28
+ (linkData._isCurrentPageItem && !this.showCurrentPage ? null : (
29
+ <li
30
+ role={linkData._isCurrentPageItem ? "presentation" : undefined}
31
+ class={`${this._rootClass}__link-wrapper ui5-breadcrumbs-link-wrapper`}
32
+ id={`${linkData._id}-link-wrapper`}>
33
+ {linkData._isCurrentPageItem ? (
34
+ <>
35
+ <span className={`${this._rootClass}__separator`} aria-hidden="true"></span>
36
+ <span
37
+ id={`${linkData._id}-link`}
38
+ class={`${rootClass}__item ${this._rootClass}__item--visible ${this._rootClass}__item--current-page`}
39
+ aria-current="page"
40
+ data-ui5-stable={linkData.stableDomRef}>
41
+ {linkData.textContent}
42
+ </span>
43
+ </>
44
+ ) : (
45
+ <>
46
+ <span className={`${this._rootClass}__separator`} aria-hidden="true"></span>
47
+ <UDExLink
48
+ onClick={this._onLinkPress}
49
+ id={`${linkData._id}-link`}
50
+ class={`${rootClass}__item ${this._rootClass}__item--visible`}
51
+ href={linkData.href}
52
+ target={linkData.target}
53
+ accessibleName={linkData._accessibleNameText}
54
+ data-ui5-stable={linkData.stableDomRef}>
55
+ {linkData.textContent}
56
+ </UDExLink>
57
+ </>
58
+ )}
59
+ </li>
60
+ ))
47
61
  )}
48
62
  </ol>
49
63
  </nav>
package/src/ListItem.hbs CHANGED
@@ -89,26 +89,54 @@
89
89
  <span class="udex-list__supporting-text" part="supporting">{{supportingText}}</span>
90
90
  {{/if}}
91
91
  <slot part="content"></slot>
92
+ {{#if hasRating}}
93
+ <udex-rating-indicator
94
+ aria-label="{{ratingAriaLabel}}"
95
+ value="{{rating}}"
96
+ rating-count="{{ratingCount}}"
97
+ total-count="{{totalCount}}"
98
+ max="{{ratingMax}}"
99
+ display="{{_displayRating}}"
100
+ disabled
101
+ readonly>
102
+ </udex-rating-indicator>
103
+ {{/if}}
92
104
  </div>
93
105
  {{#if additionalText}}<div class="udex-list__add-text" part="additional-text">{{additionalText}}</div>{{/if}}
94
- {{#if hasFirstIcon}}
95
- <slot name="firstIcon" @click={{_fireIconClickEvent}}></slot>
96
- {{/if}}
97
- {{#if hasSecondIcon}}
98
- <slot name="secondIcon" @click={{_fireIconClickEvent}}></slot>
99
- {{/if}}
106
+ <div class="udex-list__btn-wrap">
107
+ {{#if hasFirstIcon}}
108
+ <slot name="firstIcon" @click={{_fireIconClickEvent}}></slot>
109
+ {{/if}}
110
+ {{#if hasSecondIcon}}
111
+ <slot name="secondIcon" @click={{_fireIconClickEvent}}></slot>
112
+ {{/if}}
113
+ </div>
100
114
  {{else}}
101
115
  <div class="udex-list__text-holder">
102
116
  <slot part="content"></slot>
103
117
  {{#if supportingText}}<span class="udex-list__supporting-text" part="supporting">{{supportingText}}</span>{{/if}}
118
+ {{#if hasRating}}
119
+ <udex-rating-indicator
120
+ aria-label="{{ratingAriaLabel}}"
121
+ value="{{rating}}"
122
+ rating-count="{{ratingCount}}"
123
+ total-count="{{totalCount}}"
124
+ max="{{ratingMax}}"
125
+ display="{{_displayRating}}"
126
+ disabled
127
+ readonly>
128
+ </udex-rating-indicator>
129
+ {{/if}}
104
130
  </div>
105
131
  {{#if additionalText}}<div class="udex-list__add-text" part="additional-text">{{additionalText}}</div>{{/if}}
106
- {{#if hasFirstIcon}}
107
- <slot name="firstIcon" @click={{_fireIconClickEvent}}></slot>
108
- {{/if}}
109
- {{#if hasSecondIcon}}
110
- <slot name="secondIcon" @click={{_fireIconClickEvent}}></slot>
111
- {{/if}}
132
+ <div class="udex-list__btn-wrap">
133
+ {{#if hasFirstIcon}}
134
+ <slot name="firstIcon" @click={{_fireIconClickEvent}}></slot>
135
+ {{/if}}
136
+ {{#if hasSecondIcon}}
137
+ <slot name="secondIcon" @click={{_fireIconClickEvent}}></slot>
138
+ {{/if}}
139
+ </div>
112
140
  {{/if}}
113
141
  {{#if collapsible}}
114
142
  <div class="udex-list__group-heading__icon-wrapper">
@@ -126,7 +154,7 @@
126
154
  </div>
127
155
  {{/if}}
128
156
  </div>
129
- <div class="hidden" id="{{this._id}}-invisibleText">{{accessibleListItemName}}</div>
130
- <div class="hidden" id="{{this._id}}-invisibleText-describedby">{{itemState}}</div>
157
+ <div class="hidden" id="{{this._id}}-invisibleText">{{accessibleListItemName}}</div>
158
+ <div class="hidden" id="{{this._id}}-invisibleText-describedby">{{itemState}}</div>
131
159
  </div>
132
160
  {{/inline}}
package/src/ListItem.ts CHANGED
@@ -13,13 +13,14 @@ import type UDExListGroupHeaderBase from "./ListGroupHeaderBase.js";
13
13
  import UDExAvatar, { UDExAvatarShape, UDExAvatarSize } from "./Avatar.js";
14
14
  import UDExButton from "./Button.js";
15
15
  import UDExStatusBadge from "./StatusBadge.js";
16
+ import UDExRatingIndicator, { UDExDisplayType } from "./RatingIndicator.js";
16
17
  import type UDExStatusBadgeValueState from "./types/StatusBadgeValueState.js";
17
18
  import { UDExListItemSize, UDExListMode, UDExAdditionalTextState } from "./types/List.js";
18
19
  import UDExRadioButton from "./RadioButton.js";
19
20
  import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
20
21
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
21
22
  import {
22
- INDETERMINATE, SELECTED, UNSELECTED,
23
+ INDETERMINATE, SELECTED, UNSELECTED, RATING_INDICATOR_TEXT, RATING_COUNT_TITLE, TOTAL,
23
24
  } from "./generated/i18n/i18n-defaults.js";
24
25
  import translate from "./utils/translate.js";
25
26
 
@@ -71,6 +72,7 @@ type UDExListItemItemPressEventDetail = {
71
72
  UDExRadioButton,
72
73
  UDExCheckbox,
73
74
  UDExStatusBadge,
75
+ UDExRatingIndicator,
74
76
  Icon,
75
77
  ],
76
78
  })
@@ -235,6 +237,8 @@ class UDExListItem extends UDExListItemBase {
235
237
  @property({ type: String })
236
238
  _additionalClassName!: string;
237
239
 
240
+ _displayRating: UDExDisplayType = UDExDisplayType.Desktop;
241
+
238
242
  deactivate: () => void;
239
243
 
240
244
  @i18n("@sapudex/web-components")
@@ -402,6 +406,13 @@ class UDExListItem extends UDExListItemBase {
402
406
  get itemState(): string {
403
407
  return this.selected ? "Selected" : "Not selected";
404
408
  }
409
+
410
+ get ratingAriaLabel(): string {
411
+ const ratingText = this.ratingCount ? `${translate(UDExListItem, RATING_COUNT_TITLE)} ${this.ratingCount}` : "";
412
+ const totalText = this.totalCount ? `${translate(UDExListItem, TOTAL)} ${this.totalCount}` : "";
413
+ const ratingTitleText = translate(UDExListItem, RATING_INDICATOR_TEXT);
414
+ return [...[ratingText, totalText].filter(Boolean), `${ratingTitleText} ${this.rating} of ${this.ratingMax}`].join(", ");
415
+ }
405
416
  }
406
417
 
407
418
  UDExListItem.define();
@@ -70,6 +70,42 @@ type UDExListItemBaseAccordionClickEventDetail = {
70
70
  class UDExListItemBase extends UI5Element {
71
71
  eventDetails!: UDExListItemBaseEvents;
72
72
 
73
+ /**
74
+ * Defines the number of displayed rating symbols.
75
+ *
76
+ * @default 5
77
+ * @public
78
+ */
79
+ @property({ type: Number })
80
+ ratingMax: number = 5;
81
+
82
+ /**
83
+ * Defines the value of the rating.
84
+ * Use for rating indicator to represent aggregated review scores within list items
85
+ *
86
+ * @public
87
+ */
88
+ @property({ type: String })
89
+ rating?: string;
90
+
91
+ /**
92
+ * Defines the number of the rating.
93
+ * Use for the rating indicator
94
+ *
95
+ * @public
96
+ */
97
+ @property({ type: String })
98
+ ratingCount?: string;
99
+
100
+ /**
101
+ * The number of total votes.
102
+ * Use for the rating indicator
103
+ *
104
+ * @public
105
+ */
106
+ @property({ type: String })
107
+ totalCount?: string;
108
+
73
109
  /**
74
110
  * Defines the <code>label</code> for the item.
75
111
  *
@@ -313,6 +349,10 @@ class UDExListItemBase extends UI5Element {
313
349
  get expanded(): boolean {
314
350
  return !this.collapsed;
315
351
  }
352
+
353
+ get hasRating(): boolean {
354
+ return !!this.rating;
355
+ }
316
356
  }
317
357
 
318
358
  export default UDExListItemBase;
@@ -44,8 +44,9 @@ export interface IMastheadItem {
44
44
 
45
45
  export type CategoryItem = {
46
46
  title: string;
47
- url: string;
47
+ url?: string;
48
48
  externalLink: boolean;
49
+ subItems?: CategoryItem[];
49
50
  };
50
51
 
51
52
  export type SubMenuLinkItem = {
@@ -77,6 +77,41 @@
77
77
  <li>
78
78
  {{#if this.isDivider}}
79
79
  <udex-divider class="udex-masthead-menu__item-divider"></udex-divider>
80
+ {{else if this.subItems}}
81
+ {{#if this.url}}
82
+ <udex-masthead-menu-item
83
+ part="menu-item"
84
+ accessible-role="link"
85
+ exportparts="menu-item"
86
+ @click="{{../../../handleMenuItemClick}}"
87
+ url="{{this.url}}"
88
+ label="{{this.title}}"
89
+ class="udex-masthead-menu__sub-category">
90
+ </udex-masthead-menu-item>
91
+ {{else}}
92
+ <span class="udex-masthead-menu__sub-category">{{this.title}}</span>
93
+ {{/if}}
94
+ <ul class="udex-masthead-menu__sub-list" aria-label="{{this.title}}">
95
+ {{#each this.subItems}}
96
+ <li>
97
+ {{#if this.isDivider}}
98
+ <udex-divider class="udex-masthead-menu__item-divider"></udex-divider>
99
+ {{else}}
100
+ <udex-masthead-menu-item
101
+ part="menu-item"
102
+ accessible-role="link"
103
+ exportparts="menu-item"
104
+ exportparts="badge"
105
+ @click="{{../../../../handleMenuItemClick}}"
106
+ badge="{{this.badge}}"
107
+ ?external-link="{{this.externalLink}}"
108
+ url="{{this.url}}"
109
+ label="{{this.title}}">
110
+ </udex-masthead-menu-item>
111
+ {{/if}}
112
+ </li>
113
+ {{/each}}
114
+ </ul>
80
115
  {{else}}
81
116
  <udex-masthead-menu-item
82
117
  part="menu-item"
@@ -29,9 +29,10 @@ const rowClass = "udex-masthead-menu_with-one-column";
29
29
 
30
30
  export type Item = {
31
31
  title: string;
32
- url: string;
32
+ url?: string;
33
33
  externalLink: boolean;
34
34
  isDivider?: boolean;
35
+ subItems?: Item[];
35
36
  };
36
37
 
37
38
  export type SubMenuLinkItem = {
@@ -205,17 +205,48 @@
205
205
  </li>
206
206
  {{/if}}
207
207
  {{#each _category.items}}
208
- {{#if this.url}}
208
+ {{#if this.subItems}}
209
209
  <li class="udex-masthead-mobile-menu__list-item" role="none">
210
- <udex-masthead-menu-item
211
- part="menu-item"
212
- @click="{{../handleMobileCategoryItemEvent}}"
213
- label="{{this.title}}"
214
- url="{{this.url}}"
215
- third-level
216
- has-border>
217
- </udex-masthead-menu-item>
210
+ {{#if this.url}}
211
+ <udex-masthead-menu-item
212
+ part="menu-item"
213
+ @click="{{../handleMobileCategoryItemEvent}}"
214
+ label="{{this.title}}"
215
+ url="{{this.url}}"
216
+ class="udex-masthead-mobile-menu__sub-category"
217
+ third-level>
218
+ </udex-masthead-menu-item>
219
+ {{else}}
220
+ <span class="udex-masthead-mobile-menu__sub-category">{{this.title}}</span>
221
+ {{/if}}
222
+ <ul class="udex-masthead-mobile-menu__sub-list" aria-label="{{this.title}}">
223
+ {{#each this.subItems}}
224
+ {{#if this.url}}
225
+ <li class="udex-masthead-mobile-menu__list-item" role="none">
226
+ <udex-masthead-menu-item
227
+ part="menu-item"
228
+ @click="{{../../handleMobileCategoryItemEvent}}"
229
+ label="{{this.title}}"
230
+ url="{{this.url}}"
231
+ third-level>
232
+ </udex-masthead-menu-item>
233
+ </li>
234
+ {{/if}}
235
+ {{/each}}
236
+ </ul>
218
237
  </li>
238
+ {{else}}
239
+ {{#if this.url}}
240
+ <li class="udex-masthead-mobile-menu__list-item" role="none">
241
+ <udex-masthead-menu-item
242
+ part="menu-item"
243
+ @click="{{../handleMobileCategoryItemEvent}}"
244
+ label="{{this.title}}"
245
+ url="{{this.url}}"
246
+ third-level>
247
+ </udex-masthead-menu-item>
248
+ </li>
249
+ {{/if}}
219
250
  {{/if}}
220
251
  {{/each}}
221
252
  {{/inline}}
@@ -62,6 +62,10 @@
62
62
  ?divider="{{this.divider}}"
63
63
  ?disabled="{{this.disabled}}"
64
64
  ?selected="{{this.selected}}"
65
+ rating="{{this.rating}}"
66
+ total-count="{{this.totalCount}}"
67
+ rating-count="{{this.ratingCount}}"
68
+ rating-max="{{this.ratingMax}}"
65
69
  label="{{this.label}}">
66
70
  {{{this.innerHTML}}}
67
71
  </udex-list-item>
@@ -99,6 +103,10 @@
99
103
  ?divider="{{this.divider}}"
100
104
  ?disabled="{{this.disabled}}"
101
105
  ?selected="{{this.selected}}"
106
+ rating="{{this.rating}}"
107
+ total-count="{{this.totalCount}}"
108
+ rating-count="{{this.ratingCount}}"
109
+ rating-max="{{this.ratingMax}}"
102
110
  label="{{this.label}}">
103
111
  {{{this.innerHTML}}}
104
112
  </udex-list-item>
@@ -118,6 +126,10 @@
118
126
  ?controlled="{{this.controlled}}"
119
127
  ?divider="{{this.divider}}"
120
128
  ?selected="{{this.item.selected}}"
129
+ rating="{{this.item.rating}}"
130
+ total-count="{{this.item.totalCount}}"
131
+ rating-count="{{this.item.ratingCount}}"
132
+ rating-max="{{this.item.ratingMax}}"
121
133
  label="{{this.item.label}}"
122
134
  accessible-role="{{../listItemRole}}">
123
135
  {{{this.item.innerHTML}}}
@@ -14,8 +14,9 @@ import type UDExListGroupHeaderBase from "./ListGroupHeaderBase.js";
14
14
  import type UDExList from "./List.js";
15
15
  import type UDExListItem from "./ListItem.js";
16
16
  import type UDExFilterMenuItem from "./FilterMenuItem.js";
17
+ import type UDExSelectBoxItem from "./SelectBoxItem.js";
17
18
  import { SHOW_SEARCH_AFTER_COUNT, UDExPopoverPart } from "./types/SearchableListBase.js";
18
- import { NO_MATCHES_FOUND, RESULT_RETURNED } from "./generated/i18n/i18n-defaults.js";
19
+ import { NO_MATCHES_FOUND, RESULT_RETURNED, STARS } from "./generated/i18n/i18n-defaults.js";
19
20
  import translate from "./utils/translate.js";
20
21
 
21
22
  export type UDExItemFromList = UDExListItemBase | UDExListGroupHeaderBase | null | undefined;
@@ -403,6 +404,10 @@ class UDExSearchableListBase extends UI5Element {
403
404
  }
404
405
 
405
406
  checkAndUpdateLabel(item: UDExListItemBase | UDExListGroupHeaderBase, str: string): boolean {
407
+ if (item.ratingCount) {
408
+ return this.isIncludes(item.ratingCount, str);
409
+ }
410
+
406
411
  if (!item.label) {
407
412
  console.warn("A label property is required for the item");
408
413
  return false;
@@ -597,7 +602,7 @@ class UDExSearchableListBase extends UI5Element {
597
602
  content.style.maxHeight = this.height || "";
598
603
  }
599
604
 
600
- _setItemsModeAndControl(items: Array<UDExFilterMenuItem>) {
605
+ _setItemsModeAndControl(items: Array<UDExFilterMenuItem | UDExSelectBoxItem>) {
601
606
  items.forEach(item => {
602
607
  item.mode = this.mode;
603
608
  item.controlled = this.isControlled;
@@ -617,6 +622,10 @@ class UDExSearchableListBase extends UI5Element {
617
622
  return translate(UDExSearchableListBase, RESULT_RETURNED);
618
623
  }
619
624
 
625
+ get startsText(): string {
626
+ return translate(UDExSearchableListBase, STARS);
627
+ }
628
+
620
629
  get isListEmpty(): boolean {
621
630
  return this._filteredItems.length === 0;
622
631
  }
@@ -10,6 +10,7 @@
10
10
  {{#if headingHref.length}}
11
11
  <a
12
12
  class="udex-secondary-navigation__title"
13
+ tabindex="0"
13
14
  @click="{{handleHeadingClick}}"
14
15
  href="{{headingHref}}">
15
16
  {{heading}}
@@ -19,14 +20,12 @@
19
20
  {{/if}}
20
21
  </div>
21
22
  {{/if}}
22
- <div class="udex-secondary-navigation__wrap">
23
+ <nav class="udex-secondary-navigation__wrap">
23
24
  <ul
24
- role="menubar"
25
25
  class="udex-secondary-navigation__list"
26
26
  @keydown="{{handleKeyDown}}">
27
27
  {{#each visibleItems}}
28
28
  <li
29
- role="none"
30
29
  class="udex-secondary-navigation__list-item">
31
30
  <udex-secondary-navigation-item
32
31
  index="{{@index}}"
@@ -44,7 +43,6 @@
44
43
  {{/each}}
45
44
  {{#if _showMoreButton}}
46
45
  <li
47
- role="none"
48
46
  class="udex-secondary-navigation__list-item">
49
47
  <udex-secondary-navigation-item
50
48
  _nav-items-length="{{visibleItems.length}}"
@@ -60,7 +58,7 @@
60
58
  {{#if hasDesktopButtonsSlot}}
61
59
  {{>buttons}}
62
60
  {{/if}}
63
- </div>
61
+ </nav>
64
62
  </div>
65
63
  <udex-secondary-navigation-item
66
64
  @keydown="{{handleKeyDown}}"
@@ -75,7 +73,9 @@
75
73
  _is-mobile-menu-opener
76
74
  .subItems="{{this.parsedItems}}">
77
75
  {{#if hasMobileButtonsSlot}}
78
- {{>buttons}}
76
+ <div class="udex-secondary-navigation__buttons" @click="{{handleMobileButtonsClick}}">
77
+ <slot name="buttons"></slot>
78
+ </div>
79
79
  {{/if}}
80
80
  </udex-secondary-navigation-item>
81
81
  </div>