@sapudex/web-components 2.10.0 → 2.12.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 (241) hide show
  1. package/bundle.esm.js +1 -0
  2. package/cypress/fixtures/profile-menu.ts +75 -0
  3. package/cypress/specs/Accordion.cy.tsx +19 -0
  4. package/cypress/specs/AccordionItem.cy.tsx +9 -0
  5. package/cypress/specs/Footer.cy.tsx +48 -11
  6. package/cypress/specs/ListItem.cy.tsx +66 -52
  7. package/cypress/specs/MastheadProfileMenu.cy.tsx +174 -0
  8. package/cypress/specs/PromoTile.cy.tsx +124 -0
  9. package/cypress/specs/Quote.cy.tsx +65 -0
  10. package/cypress/specs/SelectBox.cy.tsx +134 -66
  11. package/cypress/support/component-imports.instrumented.ts +8 -0
  12. package/cypress/support/component-imports.src.ts +9 -1
  13. package/dist/Accordion.d.ts +15 -0
  14. package/dist/Accordion.js +19 -0
  15. package/dist/Accordion.js.map +1 -1
  16. package/dist/AccordionItem.d.ts +19 -0
  17. package/dist/AccordionItem.js +23 -0
  18. package/dist/AccordionItem.js.map +1 -1
  19. package/dist/AccordionItemTemplate.js +7 -2
  20. package/dist/AccordionItemTemplate.js.map +1 -1
  21. package/dist/AccordionTemplate.js +21 -1
  22. package/dist/AccordionTemplate.js.map +1 -1
  23. package/dist/Button.d.ts +8 -0
  24. package/dist/Button.js +11 -0
  25. package/dist/Button.js.map +1 -1
  26. package/dist/Footer.d.ts +45 -3
  27. package/dist/Footer.js +41 -17
  28. package/dist/Footer.js.map +1 -1
  29. package/dist/List.d.ts +9 -2
  30. package/dist/List.js +19 -8
  31. package/dist/List.js.map +1 -1
  32. package/dist/ListGroupHeader.d.ts +2 -1
  33. package/dist/ListGroupHeader.js.map +1 -1
  34. package/dist/ListItem.d.ts +12 -1
  35. package/dist/ListItem.js +15 -1
  36. package/dist/ListItem.js.map +1 -1
  37. package/dist/ListItemBase.d.ts +10 -0
  38. package/dist/ListItemBase.js +31 -0
  39. package/dist/ListItemBase.js.map +1 -1
  40. package/dist/ListSelectAll.d.ts +2 -1
  41. package/dist/ListSelectAll.js.map +1 -1
  42. package/dist/MastheadItem.d.ts +2 -0
  43. package/dist/MastheadItem.js +6 -0
  44. package/dist/MastheadItem.js.map +1 -1
  45. package/dist/MastheadProfileMenu.d.ts +67 -3
  46. package/dist/MastheadProfileMenu.js +164 -10
  47. package/dist/MastheadProfileMenu.js.map +1 -1
  48. package/dist/MastheadShell.d.ts +1 -0
  49. package/dist/MastheadShell.js +6 -1
  50. package/dist/MastheadShell.js.map +1 -1
  51. package/dist/PromoTile.d.ts +143 -0
  52. package/dist/PromoTile.js +198 -0
  53. package/dist/PromoTile.js.map +1 -0
  54. package/dist/PromoTileTemplate.d.ts +2 -0
  55. package/dist/PromoTileTemplate.js +22 -0
  56. package/dist/PromoTileTemplate.js.map +1 -0
  57. package/dist/Quote.d.ts +11 -0
  58. package/dist/Quote.js +18 -3
  59. package/dist/Quote.js.map +1 -1
  60. package/dist/Search.d.ts +3 -1
  61. package/dist/Search.js +1 -0
  62. package/dist/Search.js.map +1 -1
  63. package/dist/SearchableListBase.d.ts +16 -0
  64. package/dist/SearchableListBase.js +31 -1
  65. package/dist/SearchableListBase.js.map +1 -1
  66. package/dist/SelectBox.js +10 -0
  67. package/dist/SelectBox.js.map +1 -1
  68. package/dist/SelectBoxItem.d.ts +29 -0
  69. package/dist/SelectBoxItem.js +26 -0
  70. package/dist/SelectBoxItem.js.map +1 -1
  71. package/dist/StatusBadge.d.ts +1 -7
  72. package/dist/StatusBadge.js +1 -8
  73. package/dist/StatusBadge.js.map +1 -1
  74. package/dist/StepInputTemplate.js +1 -1
  75. package/dist/StepInputTemplate.js.map +1 -1
  76. package/dist/assets/{InputSuggestions-xcV7PZDf.js → InputSuggestions-DtUQULbo.js} +1 -1
  77. package/dist/assets/{ListItemStandardExpandableTextTemplate-RYCr4pVL.js → ListItemStandardExpandableTextTemplate-B62PaSFk.js} +1 -1
  78. package/dist/assets/{bundle.esm-bg-64miJ.js → bundle.esm-Ba8g4ech.js} +211 -210
  79. package/dist/assets/messagebundle_en-PmkE-Vht.js +1 -0
  80. package/dist/css/themes/AccordionItem.css +1 -1
  81. package/dist/css/themes/BreadcrumbsPopover.css +1 -1
  82. package/dist/css/themes/Button.css +1 -1
  83. package/dist/css/themes/CountrySelector.css +1 -1
  84. package/dist/css/themes/Divider.css +1 -1
  85. package/dist/css/themes/Footer.css +1 -1
  86. package/dist/css/themes/HeroBanner.css +1 -1
  87. package/dist/css/themes/ListItem.css +1 -1
  88. package/dist/css/themes/MastheadProfileMenu.css +1 -1
  89. package/dist/css/themes/PromoTile.css +1 -0
  90. package/dist/css/themes/Quote.css +1 -1
  91. package/dist/css/themes/RatingIndicator.css +1 -1
  92. package/dist/css/themes/Slider.css +1 -1
  93. package/dist/css/themes/StepInput.css +1 -1
  94. package/dist/css/themes/Tag.css +1 -1
  95. package/dist/custom-elements-internal.json +1515 -277
  96. package/dist/custom-elements.json +1220 -146
  97. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  98. package/dist/generated/i18n/i18n-defaults.d.ts +7 -1
  99. package/dist/generated/i18n/i18n-defaults.js +7 -1
  100. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  101. package/dist/generated/templates/FooterTemplate.lit.js +33 -32
  102. package/dist/generated/templates/FooterTemplate.lit.js.map +1 -1
  103. package/dist/generated/templates/HeroBannerTemplate.lit.js +1 -1
  104. package/dist/generated/templates/HeroBannerTemplate.lit.js.map +1 -1
  105. package/dist/generated/templates/ListItemTemplate.lit.js +31 -23
  106. package/dist/generated/templates/ListItemTemplate.lit.js.map +1 -1
  107. package/dist/generated/templates/ListTemplate.lit.js +2 -2
  108. package/dist/generated/templates/ListTemplate.lit.js.map +1 -1
  109. package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js +11 -6
  110. package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js.map +1 -1
  111. package/dist/generated/templates/SearchableListBaseTemplate.lit.js +6 -6
  112. package/dist/generated/templates/SearchableListBaseTemplate.lit.js.map +1 -1
  113. package/dist/generated/themes/AccordionItem.css.d.ts +1 -1
  114. package/dist/generated/themes/AccordionItem.css.js +1 -1
  115. package/dist/generated/themes/AccordionItem.css.js.map +1 -1
  116. package/dist/generated/themes/BreadcrumbsPopover.css.d.ts +1 -1
  117. package/dist/generated/themes/BreadcrumbsPopover.css.js +1 -1
  118. package/dist/generated/themes/BreadcrumbsPopover.css.js.map +1 -1
  119. package/dist/generated/themes/Button.css.d.ts +1 -1
  120. package/dist/generated/themes/Button.css.js +1 -1
  121. package/dist/generated/themes/Button.css.js.map +1 -1
  122. package/dist/generated/themes/CountrySelector.css.d.ts +1 -1
  123. package/dist/generated/themes/CountrySelector.css.js +1 -1
  124. package/dist/generated/themes/CountrySelector.css.js.map +1 -1
  125. package/dist/generated/themes/Divider.css.d.ts +1 -1
  126. package/dist/generated/themes/Divider.css.js +1 -1
  127. package/dist/generated/themes/Divider.css.js.map +1 -1
  128. package/dist/generated/themes/Footer.css.d.ts +1 -1
  129. package/dist/generated/themes/Footer.css.js +1 -1
  130. package/dist/generated/themes/Footer.css.js.map +1 -1
  131. package/dist/generated/themes/HeroBanner.css.d.ts +1 -1
  132. package/dist/generated/themes/HeroBanner.css.js +1 -1
  133. package/dist/generated/themes/HeroBanner.css.js.map +1 -1
  134. package/dist/generated/themes/ListItem.css.d.ts +1 -1
  135. package/dist/generated/themes/ListItem.css.js +1 -1
  136. package/dist/generated/themes/ListItem.css.js.map +1 -1
  137. package/dist/generated/themes/MastheadProfileMenu.css.d.ts +1 -1
  138. package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
  139. package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
  140. package/dist/generated/themes/PromoTile.css.d.ts +2 -0
  141. package/dist/generated/themes/PromoTile.css.js +8 -0
  142. package/dist/generated/themes/PromoTile.css.js.map +1 -0
  143. package/dist/generated/themes/Quote.css.d.ts +1 -1
  144. package/dist/generated/themes/Quote.css.js +1 -1
  145. package/dist/generated/themes/Quote.css.js.map +1 -1
  146. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  147. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  148. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  149. package/dist/generated/themes/Slider.css.d.ts +1 -1
  150. package/dist/generated/themes/Slider.css.js +1 -1
  151. package/dist/generated/themes/Slider.css.js.map +1 -1
  152. package/dist/generated/themes/StepInput.css.d.ts +1 -1
  153. package/dist/generated/themes/StepInput.css.js +1 -1
  154. package/dist/generated/themes/StepInput.css.js.map +1 -1
  155. package/dist/generated/themes/Tag.css.d.ts +1 -1
  156. package/dist/generated/themes/Tag.css.js +1 -1
  157. package/dist/generated/themes/Tag.css.js.map +1 -1
  158. package/dist/messagebundle.properties +10 -0
  159. package/dist/messagebundle_en.properties +6 -0
  160. package/dist/types/PromoTile.d.ts +60 -0
  161. package/dist/types/PromoTile.js +63 -0
  162. package/dist/types/PromoTile.js.map +1 -0
  163. package/dist/types/StatusBadgeValueState.d.ts +8 -0
  164. package/dist/types/StatusBadgeValueState.js +10 -0
  165. package/dist/types/StatusBadgeValueState.js.map +1 -0
  166. package/dist/utils/debounce.d.ts +3 -1
  167. package/dist/utils/debounce.js +16 -4
  168. package/dist/utils/debounce.js.map +1 -1
  169. package/dist/vscode.html-custom-data.json +185 -16
  170. package/dist/web-types.json +603 -34
  171. package/package.json +1 -1
  172. package/src/Accordion.ts +19 -0
  173. package/src/AccordionItem.ts +28 -0
  174. package/src/AccordionItemTemplate.tsx +25 -10
  175. package/src/AccordionTemplate.tsx +22 -1
  176. package/src/Button.ts +10 -0
  177. package/src/Footer.hbs +39 -36
  178. package/src/Footer.ts +81 -6
  179. package/src/HeroBanner.hbs +0 -1
  180. package/src/List.hbs +0 -2
  181. package/src/List.ts +27 -8
  182. package/src/ListGroupHeader.ts +2 -1
  183. package/src/ListItem.hbs +16 -2
  184. package/src/ListItem.ts +29 -2
  185. package/src/ListItemBase.ts +42 -0
  186. package/src/ListSelectAll.ts +2 -1
  187. package/src/MastheadItem.ts +9 -0
  188. package/src/MastheadProfileMenu.hbs +79 -15
  189. package/src/MastheadProfileMenu.ts +228 -13
  190. package/src/MastheadShell.ts +7 -1
  191. package/src/PromoTile.ts +290 -0
  192. package/src/PromoTileTemplate.tsx +68 -0
  193. package/src/Quote.ts +17 -3
  194. package/src/Search.ts +1 -0
  195. package/src/SearchableListBase.hbs +18 -1
  196. package/src/SearchableListBase.ts +47 -1
  197. package/src/SelectBox.ts +11 -0
  198. package/src/SelectBoxItem.ts +39 -0
  199. package/src/StatusBadge.ts +1 -8
  200. package/src/StepInputTemplate.tsx +1 -1
  201. package/src/generated/i18n/i18n-defaults.ts +2 -2
  202. package/src/generated/templates/FooterTemplate.lit.ts +33 -32
  203. package/src/generated/templates/HeroBannerTemplate.lit.ts +1 -1
  204. package/src/generated/templates/ListItemTemplate.lit.ts +31 -23
  205. package/src/generated/templates/ListTemplate.lit.ts +2 -2
  206. package/src/generated/templates/MastheadProfileMenuTemplate.lit.ts +10 -5
  207. package/src/generated/templates/SearchableListBaseTemplate.lit.ts +6 -6
  208. package/src/generated/themes/AccordionItem.css.ts +1 -1
  209. package/src/generated/themes/BreadcrumbsPopover.css.ts +1 -1
  210. package/src/generated/themes/Button.css.ts +1 -1
  211. package/src/generated/themes/CountrySelector.css.ts +1 -1
  212. package/src/generated/themes/Divider.css.ts +1 -1
  213. package/src/generated/themes/Footer.css.ts +1 -1
  214. package/src/generated/themes/HeroBanner.css.ts +1 -1
  215. package/src/generated/themes/ListItem.css.ts +1 -1
  216. package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
  217. package/src/generated/themes/PromoTile.css.ts +9 -0
  218. package/src/generated/themes/Quote.css.ts +1 -1
  219. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  220. package/src/generated/themes/Slider.css.ts +1 -1
  221. package/src/generated/themes/StepInput.css.ts +1 -1
  222. package/src/generated/themes/Tag.css.ts +1 -1
  223. package/src/i18n/messagebundle.properties +10 -0
  224. package/src/i18n/messagebundle_en.properties +6 -0
  225. package/src/themes/AccordionItem.css +61 -22
  226. package/src/themes/BreadcrumbsPopover.css +2 -1
  227. package/src/themes/Button.css +13 -0
  228. package/src/themes/CountrySelector.css +4 -0
  229. package/src/themes/Divider.css +2 -1
  230. package/src/themes/Footer.css +44 -9
  231. package/src/themes/HeroBanner.css +34 -32
  232. package/src/themes/ListItem.css +4 -9
  233. package/src/themes/MastheadProfileMenu.css +87 -3
  234. package/src/themes/PromoTile.css +152 -0
  235. package/src/themes/Quote.css +21 -24
  236. package/src/themes/StepInput.css +10 -0
  237. package/src/themes/Tag.css +18 -24
  238. package/src/types/PromoTile.ts +61 -0
  239. package/src/types/StatusBadgeValueState.ts +9 -0
  240. package/src/utils/debounce.ts +19 -4
  241. package/dist/assets/messagebundle_en-BHfPJk-2.js +0 -1
@@ -0,0 +1,290 @@
1
+ import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
2
+ import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
3
+ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
4
+ import slot from "@ui5/webcomponents-base/dist/decorators/slot.js";
5
+ import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
6
+ import type { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
7
+ import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
8
+ import { isDesktop } from "@ui5/webcomponents-base/dist/Device.js";
9
+ import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
10
+ import PromoTileTemplate from "./PromoTileTemplate.js";
11
+ import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
12
+ import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
13
+ import { PROMO_TILE, PROMO_TILE_ICON } from "./generated/i18n/i18n-defaults.js";
14
+ import { BreakpointUtils } from "./utils/Breakpoints.js";
15
+ import type UDExButton from "./Button.js";
16
+ import UDExButtonSize from "./types/ButtonSize.js";
17
+ import UDExButtonDesign from "./types/ButtonDesign.js";
18
+ import { UDExPromoTileColorSheme, UDExPromoTileMode } from "./types/PromoTile.js";
19
+
20
+ // Styles
21
+ import PromoTileCss from "./generated/themes/PromoTile.css.js";
22
+
23
+ export enum UDExOrientation {
24
+ Vertical = "Vertical",
25
+ Horizontal = "Horizontal",
26
+ }
27
+
28
+ /**
29
+ * @class
30
+ *
31
+ * <h3 class="comment-api-title">Overview</h3>
32
+ *
33
+ *
34
+ * <h3>Usage</h3>
35
+ *
36
+ * For the <code>udex-promo-tile</code>
37
+ * <h3>ES6 Module Import</h3>
38
+ *
39
+ * <code>import "@sapudex/web-components/dist/PromoTile.js";</code>
40
+ *
41
+ * @constructor
42
+ * @extends UI5Element
43
+ * @tagname udex-promo-tile
44
+ * @public
45
+ */
46
+ @customElement({
47
+ tag: "udex-promo-tile",
48
+ renderer: jsxRenderer,
49
+ styles: PromoTileCss,
50
+ template: PromoTileTemplate,
51
+ })
52
+
53
+ /**
54
+ * Triggered when the user clicks on the CTA button
55
+ *
56
+ * @public
57
+ */
58
+ @event("button-click", { cancelable: true, bubbles: true })
59
+
60
+ class UDExPromoTile extends UI5Element {
61
+ eventDetails!: {
62
+ "button-click": void,
63
+ };
64
+
65
+ /**
66
+ * Defines the text content of the Promo Tile.
67
+ *
68
+ * @slot content
69
+ * @public
70
+ */
71
+ @slot({ type: HTMLElement, "default": true })
72
+ content!: Array<HTMLElement>;
73
+
74
+ /**
75
+ * Defines the orientation of the Promo Tile component.
76
+ *
77
+ * @type {string}
78
+ * @defaultvalue "Vertical"
79
+ * @public
80
+ */
81
+ @property({ type: String })
82
+ orientation: `${UDExOrientation}` = UDExOrientation.Vertical;
83
+
84
+ /**
85
+ * Defines the UI5 icon name in the pictogram section.
86
+ *
87
+ * @type {string}
88
+ * @defaultvalue ""
89
+ * @public
90
+ */
91
+ @property({ type: String })
92
+ icon?: string;
93
+
94
+ /**
95
+ * Defines the image aria label and alt in the pictogram section.
96
+ *
97
+ * @type {string}
98
+ * @defaultvalue ""
99
+ * @public
100
+ */
101
+ @property({ type: String })
102
+ imageLabel?: string;
103
+
104
+ /**
105
+ * Defines the logo URL in the pictogram section.
106
+ *
107
+ * @type {string}
108
+ * @defaultvalue ""
109
+ * @public
110
+ */
111
+ @property({ type: String })
112
+ logoUrl?: string;
113
+
114
+ /**
115
+ * Defines the header text of the promo tile.
116
+ *
117
+ * @type {string}
118
+ * @defaultvalue ""
119
+ * @public
120
+ */
121
+ @property({ type: String })
122
+ header?: string;
123
+
124
+ /**
125
+ * Defines the eyebrow text of the promo tile.
126
+ *
127
+ * @type {string}
128
+ * @defaultvalue ""
129
+ * @public
130
+ */
131
+ @property({ type: String })
132
+ eyebrow?: string;
133
+
134
+ /**
135
+ * Defines the CTA button label
136
+ *
137
+ * @type {string}
138
+ * @defaultvalue ""
139
+ * @public
140
+ */
141
+ @property({ type: String })
142
+ button?: string;
143
+
144
+ /**
145
+ * Defines the CTA button design
146
+ *
147
+ * @type {string}
148
+ * @defaultvalue ""
149
+ * @public
150
+ */
151
+ @property({ type: String })
152
+ buttonDesign?: UDExButtonDesign;
153
+
154
+ /**
155
+ * Defines the color scheme of the Promo Tile.
156
+ *
157
+ * @type {string}
158
+ * @defaultvalue ""
159
+ * @public
160
+ */
161
+ @property({ type: String })
162
+ colorScheme?: UDExPromoTileColorSheme;
163
+
164
+ /**
165
+ * Defines the accessible name of the component.
166
+ *
167
+ * @type {string}
168
+ * @defaultvalue ""
169
+ * @public
170
+ */
171
+ @property({ type: String })
172
+ accessibleName?: string;
173
+
174
+ @i18n("@sapudex/web-components")
175
+ static i18nBundle: I18nBundle;
176
+
177
+ _handleResizeBound: ResizeObserverCallback;
178
+ _button: UDExButton | undefined;
179
+ _colorMode: UDExPromoTileMode = UDExPromoTileMode.light;
180
+ _lightModeColors: Array<number> = [1, 2];
181
+ _darkModeColors: Array<number> = [7, 8, 9, 10];
182
+
183
+ constructor() {
184
+ super();
185
+ this._handleResizeBound = this._handleResize.bind(this);
186
+ }
187
+
188
+ onEnterDOM(): void {
189
+ if (isDesktop()) {
190
+ this.setAttribute("desktop", "");
191
+ }
192
+ ResizeHandler.register(this, this._handleResizeBound);
193
+ }
194
+
195
+ onExitDOM(): void {
196
+ ResizeHandler.deregister(this, this._handleResizeBound);
197
+ }
198
+
199
+ onAfterRendering() {
200
+ this._button = this.getButton();
201
+ this.applyColorScheme();
202
+ }
203
+
204
+ _handleResize(): void {
205
+ if (this._button) {
206
+ this._button.size = this.isMobile ? UDExButtonSize.Medium : UDExButtonSize.Large;
207
+ }
208
+ }
209
+
210
+ getButton(): UDExButton | undefined {
211
+ return this.shadowRoot!.querySelector<UDExButton>(
212
+ "[udex-button]",
213
+ )!;
214
+ }
215
+
216
+ applyColorScheme(): void {
217
+ if (!this.colorScheme) {
218
+ return;
219
+ }
220
+
221
+ this._colorMode = this.checkColorMode(this.colorScheme);
222
+ const eyebrowColor = this.checkEyebrowColor(this.colorScheme);
223
+
224
+ if (this._colorMode === UDExPromoTileMode.dark) {
225
+ if (this._button) {
226
+ this._button.design = this.buttonDesign || UDExButtonDesign.Secondary;
227
+ }
228
+ this.style.setProperty("--udex-promo-tile-icon-fill-color", `var(--udexCoreTextLight)`);
229
+ }
230
+ this.style.setProperty("--udex-promo-tile-background", `var(--udexColor${this.colorScheme})`);
231
+ this.style.setProperty("--udex-promo-tile-eyebrow-color", `var(--udexColor${eyebrowColor})`);
232
+ }
233
+
234
+ getColorNumber(colorScheme: string): number {
235
+ const match = colorScheme.match(/\d+/);
236
+ return match ? parseInt(match[0]) : 0;
237
+ }
238
+
239
+ checkColorMode(colorScheme: string): UDExPromoTileMode {
240
+ const number = this.getColorNumber(colorScheme);
241
+
242
+ if (number && this._darkModeColors.includes(number)) {
243
+ return UDExPromoTileMode.dark;
244
+ }
245
+ return UDExPromoTileMode.light;
246
+ }
247
+
248
+ checkEyebrowColor(colorScheme: string): string {
249
+ const number = this.getColorNumber(colorScheme);
250
+ let color: string = UDExPromoTileColorSheme.Blue8;
251
+
252
+ if (number === 7) {
253
+ color = "NeutralWhite";
254
+ } else if (this._darkModeColors.includes(number)) {
255
+ color = colorScheme.replace(`${number}`, `${number - 7}`);
256
+ } else if (this._lightModeColors.includes(number)) {
257
+ color = colorScheme.replace(`${number}`, `${number + 7}`);
258
+ }
259
+ return color;
260
+ }
261
+
262
+ get isMobile(): boolean {
263
+ return BreakpointUtils.isAtMost("S");
264
+ }
265
+
266
+ get promoTileContainerText(): string {
267
+ return this.accessibleName || this.header || UDExPromoTile.i18nBundle.getText(PROMO_TILE);
268
+ }
269
+
270
+ get _showPictogram(): boolean {
271
+ return !!this.icon || !!this.logoUrl;
272
+ }
273
+
274
+ get _showLogo(): boolean {
275
+ return !this.icon && !!this.logoUrl;
276
+ }
277
+
278
+ get _imageLabel(): string {
279
+ return this.imageLabel || UDExPromoTile.i18nBundle.getText(PROMO_TILE_ICON);
280
+ }
281
+
282
+ handleCTAButtonClick(e: Event) {
283
+ e.preventDefault();
284
+ this.fireDecoratorEvent("button-click");
285
+ }
286
+ }
287
+
288
+ UDExPromoTile.define();
289
+
290
+ export default UDExPromoTile;
@@ -0,0 +1,68 @@
1
+ import type UDExPromoTile from "./PromoTile.js";
2
+ import UI5Icon from "@ui5/webcomponents/dist/Icon.js";
3
+ import IconMode from "@ui5/webcomponents/dist/types/IconMode.js";
4
+ import UDExButton from "./Button.js";
5
+ import UDExButtonSize from "./types/ButtonSize.js";
6
+ import UDExButtonAccessibleRole from "./types/ButtonAccessibleRole.js";
7
+
8
+ export default function PromoTileTemplate(this: UDExPromoTile) {
9
+ const rootClass = "udex-promo-tile";
10
+
11
+ return (
12
+ <div
13
+ role="region"
14
+ class={`${rootClass}__container ${rootClass}--${this.orientation?.toLowerCase()} ${rootClass}--${this._colorMode}`}
15
+ aria-label={this.promoTileContainerText}>
16
+ {this._showPictogram &&
17
+ <div
18
+ part="image"
19
+ class={{
20
+ "udex-promo-tile__pictogram": true,
21
+ "udex-promo-tile__pictogram--logo": this.logoUrl
22
+ }}
23
+ title={this._imageLabel}>
24
+ {this.icon &&
25
+ <UI5Icon
26
+ class={`${rootClass}__icon`}
27
+ name={this.icon?.toLowerCase()}
28
+ mode={IconMode.Decorative}
29
+ accessibleName={this._imageLabel}>
30
+ </UI5Icon>}
31
+ {this._showLogo &&
32
+ <img
33
+ src={this.logoUrl}
34
+ class={`${rootClass}__icon`}
35
+ aria-label={this._imageLabel}
36
+ alt={this._imageLabel} />}
37
+ </div>
38
+ }
39
+ <div part="content" class={`${rootClass}__content`}>
40
+ <div class={`${rootClass}__text`}>
41
+ {this.eyebrow &&
42
+ <div class={`${rootClass}__eyebrow eyebrow--l`}>{this.eyebrow}</div>
43
+ }
44
+ {this.header &&
45
+ <div part="header" class={`${rootClass}__header`}>{this.header}</div>
46
+ }
47
+ <slot></slot>
48
+ </div>
49
+ {!!this.button && footerSection.call(this, rootClass)}
50
+ </div>
51
+ </div>
52
+ );
53
+ }
54
+ function footerSection(this: UDExPromoTile, rootClass: string) {
55
+ return (
56
+ <>
57
+ <div part="footer" class={`${rootClass}__footer`}>
58
+ <UDExButton class={`${rootClass}__btn`}
59
+ size={UDExButtonSize.Large}
60
+ design={this.buttonDesign}
61
+ onClick={this.handleCTAButtonClick}
62
+ accessibleRole={UDExButtonAccessibleRole.Button}>
63
+ {this.button}
64
+ </UDExButton>
65
+ </div>
66
+ </>
67
+ );
68
+ }
package/src/Quote.ts CHANGED
@@ -20,6 +20,11 @@ export enum UDExMaskType {
20
20
  rectangle = "rectangle"
21
21
  }
22
22
 
23
+ export enum UDExImagePlacement {
24
+ left = "left",
25
+ right = "right"
26
+ }
27
+
23
28
  /**
24
29
  * @class
25
30
  *
@@ -82,7 +87,7 @@ class UDExQuote extends UI5Element {
82
87
  * @default "large"
83
88
  */
84
89
  @property()
85
- imageSize: `${UDExSizeType}` = "large";
90
+ imageSize: `${UDExSizeType}` = UDExSizeType.large;
86
91
 
87
92
  /**
88
93
  * Defines text size
@@ -91,7 +96,7 @@ class UDExQuote extends UI5Element {
91
96
  * @default "large"
92
97
  */
93
98
  @property()
94
- textSize: `${UDExSizeType}` = "large";
99
+ textSize: `${UDExSizeType}` = UDExSizeType.large;
95
100
 
96
101
  /**
97
102
  * Defines image mask
@@ -100,7 +105,16 @@ class UDExQuote extends UI5Element {
100
105
  * @default "avatar"
101
106
  */
102
107
  @property()
103
- mask: `${UDExMaskType}` = "avatar";
108
+ mask: `${UDExMaskType}` = UDExMaskType.avatar;
109
+
110
+ /**
111
+ * Defines image placement
112
+ *
113
+ * @public
114
+ * @default "left"
115
+ */
116
+ @property()
117
+ imagePlacement: `${UDExImagePlacement}` = UDExImagePlacement.left;
104
118
  }
105
119
 
106
120
  UDExQuote.define();
package/src/Search.ts CHANGED
@@ -801,6 +801,7 @@ class UDExSearch extends UI5Element {
801
801
  }
802
802
 
803
803
  handleSubmitValue(): void {
804
+ this.handleDebounce.cancel();
804
805
  this.onClosePopover();
805
806
  this.fireDecoratorEvent("submit-search-value", { value: this.value });
806
807
  }
@@ -30,6 +30,7 @@
30
30
  role="{{roleForGroupList}}"
31
31
  accessible-role="{{accessibleRoleForList}}"
32
32
  class="udex-filter-menu__list"
33
+ ?tab-navigation-enabled="{{tabNavigationEnabled}}"
33
34
  ?controlled="{{isControlled}}"
34
35
  mode="{{mode}}">
35
36
  {{#each _filteredItems}}
@@ -43,7 +44,9 @@
43
44
  supporting-text="{{this.item.supportingText}}"
44
45
  ?disabled="{{this.item.disabled}}"
45
46
  ?selected="{{this.item.selected}}"
46
- ?indeterminate="{{this.item.indeterminate}}">
47
+ ?indeterminate="{{this.item.indeterminate}}"
48
+ @ui5-first-icon-click="{{../fireFirstIconClickEvent}}"
49
+ @ui5-second-icon-click="{{../fireSecondIconClickEvent}}">
47
50
  {{#each this.groupItems}}
48
51
  <udex-list-item
49
52
  role="{{../listItemRole}}"
@@ -51,7 +54,11 @@
51
54
  data-token-id="{{this._id}}"
52
55
  ?controlled="{{this.controlled}}"
53
56
  mode="{{this.mode}}"
57
+ @ui5-first-icon-click="{{../fireFirstIconClickEvent}}"
58
+ @ui5-second-icon-click="{{../fireSecondIconClickEvent}}"
54
59
  supporting-text="{{this.supportingText}}"
60
+ additional-text="{{this.additionalText}}"
61
+ additional-text-state="{{this.additionalTextState}}"
55
62
  ?divider="{{this.divider}}"
56
63
  ?disabled="{{this.disabled}}"
57
64
  ?selected="{{this.selected}}"
@@ -72,6 +79,8 @@
72
79
  ?controlled="{{this.item.controlled}}"
73
80
  ?disabled="{{this.item.disabled}}"
74
81
  ?selected="{{this.item.selected}}"
82
+ @ui5-first-icon-click="{{../fireFirstIconClickEvent}}"
83
+ @ui5-second-icon-click="{{../fireSecondIconClickEvent}}"
75
84
  ?indeterminate="{{this.item.indeterminate}}">
76
85
  {{#each this.groupItems}}
77
86
  <udex-list-item
@@ -80,6 +89,10 @@
80
89
  ?controlled="{{this.controlled}}"
81
90
  mode="{{this.mode}}"
82
91
  supporting-text="{{this.supportingText}}"
92
+ additional-text="{{this.additionalText}}"
93
+ additional-text-state="{{this.additionalTextState}}"
94
+ @ui5-first-icon-click="{{../fireFirstIconClickEvent}}"
95
+ @ui5-second-icon-click="{{../fireSecondIconClickEvent}}"
83
96
  ?divider="{{this.divider}}"
84
97
  ?disabled="{{this.disabled}}"
85
98
  ?selected="{{this.selected}}"
@@ -92,8 +105,12 @@
92
105
  {{else}}
93
106
  <udex-list-item
94
107
  role="none"
108
+ @ui5-first-icon-click="{{../fireFirstIconClickEvent}}"
109
+ @ui5-second-icon-click="{{../fireSecondIconClickEvent}}"
95
110
  data-token-id="{{this.item._id}}"
96
111
  supporting-text="{{this.item.supportingText}}"
112
+ additional-text="{{this.item.additionalText}}"
113
+ additional-text-state="{{this.item.additionalTextState}}"
97
114
  ?disabled="{{this.item.disabled}}"
98
115
  ?controlled="{{this.controlled}}"
99
116
  ?divider="{{this.divider}}"
@@ -36,6 +36,13 @@ export type UDExSearchableListBaseEvents = {
36
36
  "submit-search": UDExSearchableListBaseSubmitSearchEventDetail,
37
37
  "reset-search": void,
38
38
  "change-search": UDExSearchableListBaseChangeSearchEventDetail,
39
+ "first-icon-click": UDExSelectBoxIconClickEventDetail,
40
+ "second-icon-click": UDExSelectBoxIconClickEventDetail,
41
+ }
42
+
43
+ type UDExSelectBoxIconClickEventDetail = {
44
+ originalEvent: PointerEvent,
45
+ item: UDExItemFromList,
39
46
  }
40
47
 
41
48
  /**
@@ -85,8 +92,31 @@ export type UDExSearchableListBaseEvents = {
85
92
  */
86
93
  @event("change-search", { bubbles: true })
87
94
 
95
+ /**
96
+ * Fired event when the user clicks on the first icon.
97
+ *
98
+ * @public
99
+ */
100
+ @event("first-icon-click", { bubbles: true })
101
+
102
+ /**
103
+ * Fired event when the user clicks on the second icon.
104
+ *
105
+ * @public
106
+ */
107
+ @event("second-icon-click", { bubbles: true })
108
+
88
109
  class UDExSearchableListBase extends UI5Element {
89
110
  eventDetails!: UDExSearchableListBaseEvents;
111
+ /**
112
+ * Enables tab navigation for the list.
113
+ *
114
+ * @default ""
115
+ * @public
116
+ */
117
+ @property({ type: Boolean })
118
+ tabNavigationEnabled?: boolean;
119
+
90
120
  /**
91
121
  * Allows control over the height.
92
122
  * @public
@@ -215,7 +245,7 @@ class UDExSearchableListBase extends UI5Element {
215
245
  }
216
246
 
217
247
  onItemPress(e:CustomEvent) {
218
- const dropdownItemId: string = e.detail.item.getAttribute("data-token-id");
248
+ const dropdownItemId: string = this.getDataTokenId(e);
219
249
  this.handleDropdownItemPress(dropdownItemId);
220
250
  this.fireSelectionChange(dropdownItemId);
221
251
  }
@@ -458,6 +488,22 @@ class UDExSearchableListBase extends UI5Element {
458
488
  }
459
489
  }
460
490
 
491
+ fireFirstIconClickEvent(e: CustomEvent): void {
492
+ this._fireIconClickEvent("first-icon-click", e);
493
+ }
494
+
495
+ fireSecondIconClickEvent(e: CustomEvent): void {
496
+ this._fireIconClickEvent("second-icon-click", e);
497
+ }
498
+
499
+ private _fireIconClickEvent(eventName: "first-icon-click" | "second-icon-click", e: CustomEvent): void {
500
+ const id = this.getDataTokenId(e);
501
+ this.fireDecoratorEvent(eventName, {
502
+ originalEvent: e.detail.originalEvent,
503
+ item: this.getItemFromList(id),
504
+ });
505
+ }
506
+
461
507
  getFlattenItemsArray(array: Array<UDExProcessedItem>): (UDExProcessedItem | UDExListItemBase)[] {
462
508
  return array.flatMap(item => {
463
509
  if (item.isGroup) {
package/src/SelectBox.ts CHANGED
@@ -123,6 +123,13 @@ type UDExSelectBoxRemoveEventDetail = {
123
123
  */
124
124
  @event("show-more", { bubbles: true })
125
125
 
126
+ /**
127
+ * Fired before the dropdown pane is opened.
128
+ *
129
+ * @public
130
+ */
131
+ @event("before-open", { bubbles: true })
132
+
126
133
  class UDExSelectBox extends UDExSearchableListBase {
127
134
  eventDetails!: {
128
135
  "remove": UDExSelectBoxRemoveEventDetail,
@@ -480,6 +487,10 @@ class UDExSelectBox extends UDExSearchableListBase {
480
487
  }
481
488
 
482
489
  handleKeyDownDropdown(e: KeyboardEvent) {
490
+ if (this.tabNavigationEnabled) {
491
+ return;
492
+ }
493
+
483
494
  const isTabPrevPress = isTabPrevious(e) && !this._search;
484
495
  const isTabNextPress = isTabNext(e);
485
496
  const isEscapePress = isEscape(e);
@@ -2,6 +2,9 @@ import customElement from "@ui5/webcomponents-base/dist/decorators/customElement
2
2
  import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
3
3
  import slot from "@ui5/webcomponents-base/dist/decorators/slot.js";
4
4
  import UDExListItemBase from "./ListItemBase.js";
5
+ import property from "@ui5/webcomponents-base/decorators/property.js";
6
+ import { UDExAdditionalTextState } from "./types/List.js";
7
+ import UDExButton from "./Button.js";
5
8
 
6
9
  /**
7
10
  * @class
@@ -25,9 +28,45 @@ import UDExListItemBase from "./ListItemBase.js";
25
28
  @customElement({
26
29
  tag: "udex-select-box-item",
27
30
  renderer: litRender,
31
+ dependencies: [UDExButton],
28
32
  })
29
33
 
30
34
  class UDExSelectBoxItem extends UDExListItemBase {
35
+ /**
36
+ * Defines the additionalText, displayed at the end of the list item.
37
+ *
38
+ * @public
39
+ */
40
+ @property({ type: String })
41
+ additionalText?: string;
42
+
43
+ /**
44
+ * Defines the state of the additionalText.
45
+ *
46
+ * @default "None"
47
+ * @public
48
+ */
49
+ @property()
50
+ additionalTextState: `${UDExAdditionalTextState}` = UDExAdditionalTextState.None;
51
+
52
+ /**
53
+ * Slot for first icon.
54
+ *
55
+ * @slot
56
+ * @public
57
+ */
58
+ @slot({ type: UDExButton })
59
+ firstIcon!: Array<UDExButton>;
60
+
61
+ /**
62
+ * Slot for second icon.
63
+ *
64
+ * @slot
65
+ * @public
66
+ */
67
+ @slot({ type: UDExButton })
68
+ secondIcon!: Array<UDExButton>;
69
+
31
70
  /**
32
71
  * Slot for item content.
33
72
  *
@@ -10,6 +10,7 @@ import "@ui5/webcomponents-icons/dist/edit.js";
10
10
  import "@ui5/webcomponents-icons/dist/information.js";
11
11
  import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
12
12
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
13
+ import UDExStatusBadgeValueState from "./types/StatusBadgeValueState.js";
13
14
  import {
14
15
  STATUS_BADGE_TEXT,
15
16
  STATUS_BADGE_EDIT_TITLE,
@@ -40,14 +41,6 @@ export enum BadgeSize {
40
41
  XL = "XL",
41
42
  }
42
43
 
43
- export enum UDExStatusBadgeValueState {
44
- Warning = "Warning",
45
- Error = "Error",
46
- Success = "Success",
47
- Information = "Information",
48
- Edit = "Edit"
49
- }
50
-
51
44
  /**
52
45
  * @class
53
46
  *
@@ -56,6 +56,6 @@ export default function StepInputTemplate(this: UDExStepInput) {
56
56
  ></UDExControlButton>
57
57
  </>)
58
58
  }
59
-
59
+ <div class="hidden" aria-live="polite">{this._valuePrecisioned}</div>
60
60
  </div>);
61
61
  }