Skip to content

Commit 156dd36

Browse files
Merge branch 'main' into breadcrumbs-click-event
2 parents 92e45de + 52b408a commit 156dd36

133 files changed

Lines changed: 10045 additions & 432 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,65 @@
33
All notable changes to this project will be documented in this file.
44
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
55

6+
# [2.22.0-rc.0](https://github.com/UI5/webcomponents/compare/v2.21.0...v2.22.0-rc.0) (2026-04-09)
7+
8+
9+
### Bug Fixes
10+
11+
* **ui5-carousel:** prevent negative values in visibleItemsIndices ([#13371](https://github.com/UI5/webcomponents/issues/13371)) ([34c5537](https://github.com/UI5/webcomponents/commit/34c5537fa53d61b7fe4790d69560276fb43a0a88)), closes [#13289](https://github.com/UI5/webcomponents/issues/13289)
12+
* **ui5-datetime-picker:** prevent first keystroke from resetting caret position ([#13369](https://github.com/UI5/webcomponents/issues/13369)) ([b8bc822](https://github.com/UI5/webcomponents/commit/b8bc822c473ce2876ca82fada49bc40da0cf9954))
13+
* **ui5-dialog:** fix unwanted animation when opening with large content ([#13121](https://github.com/UI5/webcomponents/issues/13121)) ([56f8f24](https://github.com/UI5/webcomponents/commit/56f8f2455859d965bfaed08ca4db8dc46b2412d2))
14+
* **ui5-slider:** remove disabled attribute from handle ([#13372](https://github.com/UI5/webcomponents/issues/13372)) ([f35ce97](https://github.com/UI5/webcomponents/commit/f35ce97e616633fa8e3c8a77736cccf36c0d794e))
15+
* **ui5-textarea:** set textarea wrapper padding in base theme file ([#13345](https://github.com/UI5/webcomponents/issues/13345)) ([3fb9b5c](https://github.com/UI5/webcomponents/commit/3fb9b5c53a055f42e4b29375599136c1ba9ace7a))
16+
17+
18+
### Features
19+
20+
* **ui5-daterange-picker:** two months mode is implemented ([#13196](https://github.com/UI5/webcomponents/issues/13196)) ([743a7fe](https://github.com/UI5/webcomponents/commit/743a7feac690c2f6d630932ce393fc9bb4fc709c))
21+
22+
23+
24+
25+
26+
# [2.21.0](https://github.com/UI5/webcomponents/compare/v2.21.0-rc.4...v2.21.0) (2026-04-07)
27+
28+
29+
### Bug Fixes
30+
31+
* **framework:** improve themeRoot validation ([#13354](https://github.com/UI5/webcomponents/issues/13354)) ([ba4a08b](https://github.com/UI5/webcomponents/commit/ba4a08bd516f1e0dbefe2dfc734a684c6af50bd8))
32+
* **ui5-breadcrumbs:** correct overflow icon alignment and styling ([#13341](https://github.com/UI5/webcomponents/issues/13341)) ([24a0abf](https://github.com/UI5/webcomponents/commit/24a0abfa73cb1fbccc4e54b2f73592a759b007bf)), closes [#13301](https://github.com/UI5/webcomponents/issues/13301)
33+
* **ui5-toolbar:** restore item spacing in Horizon High Contrast themes ([#13363](https://github.com/UI5/webcomponents/issues/13363)) ([ce59da4](https://github.com/UI5/webcomponents/commit/ce59da47eca7de6841e24de35bf7c4fdd7b06f10)), closes [#13361](https://github.com/UI5/webcomponents/issues/13361)
34+
35+
36+
### Features
37+
38+
* **ui5-button:** introduce support for form attribute ([#13321](https://github.com/UI5/webcomponents/issues/13321)) ([c9d8f2a](https://github.com/UI5/webcomponents/commit/c9d8f2ac91d5b5320e37aeee5e60b571ff3ee07c)), closes [#7459](https://github.com/UI5/webcomponents/issues/7459)
39+
40+
41+
42+
43+
44+
# [2.21.0-rc.4](https://github.com/UI5/webcomponents/compare/v2.21.0-rc.3...v2.21.0-rc.4) (2026-04-02)
45+
46+
47+
### Bug Fixes
48+
49+
* **ui5-avatar:** fix accessibilityInfo for decorative mode ([#13324](https://github.com/UI5/webcomponents/issues/13324)) ([0352ff0](https://github.com/UI5/webcomponents/commit/0352ff0cbd304ebdd355b470bdcfbc6b8776a5ba))
50+
* **ui5-datetime-picker:** ensure value state header spans full popover width ([#13294](https://github.com/UI5/webcomponents/issues/13294)) ([49f5afc](https://github.com/UI5/webcomponents/commit/49f5afc84fc54e81fa90d017420cece33c434a02))
51+
* **ui5-dynamic-page:** hide pin button on mobile devices ([#13335](https://github.com/UI5/webcomponents/issues/13335)) ([359fe49](https://github.com/UI5/webcomponents/commit/359fe492d8f42a1403edcbe22c79f76c5c55ccb1)), closes [#13320](https://github.com/UI5/webcomponents/issues/13320)
52+
* **ui5-dynamic-page:** prevent flickering when content is updated ([#13336](https://github.com/UI5/webcomponents/issues/13336)) ([31e5f0a](https://github.com/UI5/webcomponents/commit/31e5f0a5322dbf05535ecda71fd6541fa752fe4d))
53+
* **ui5-tokenizer, ui5-multi-input,ui5-multi-combobox:** Improve stylisation ([#13314](https://github.com/UI5/webcomponents/issues/13314)) ([f9ff5ee](https://github.com/UI5/webcomponents/commit/f9ff5ee11510a1da15bd296bc025032af82eb7e9))
54+
55+
56+
### Features
57+
58+
* **ui5-table-cell:** merged property added ([#13297](https://github.com/UI5/webcomponents/issues/13297)) ([c5ec5f3](https://github.com/UI5/webcomponents/commit/c5ec5f33855aa712ed10bdd6331faf271a7652c1)), closes [#7238](https://github.com/UI5/webcomponents/issues/7238) [#7238](https://github.com/UI5/webcomponents/issues/7238) [#7238](https://github.com/UI5/webcomponents/issues/7238)
59+
* update sap/icons to v5.12 & 4.24 ([#13319](https://github.com/UI5/webcomponents/issues/13319)) ([0b16434](https://github.com/UI5/webcomponents/commit/0b164348069b96f5464eaea3425a4876097dc44d))
60+
61+
62+
63+
64+
665
# [2.21.0-rc.3](https://github.com/UI5/webcomponents/compare/v2.21.0-rc.2...v2.21.0-rc.3) (2026-03-26)
766

867

lerna.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"packages/create-package",
1515
"packages/compat"
1616
],
17-
"version": "2.21.0-rc.3",
17+
"version": "2.22.0-rc.0",
1818
"command": {
1919
"publish": {
2020
"allowBranch": "*",

packages/ai/CHANGELOG.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,33 @@
33
All notable changes to this project will be documented in this file.
44
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
55

6+
# [2.22.0-rc.0](https://github.com/UI5/webcomponents/compare/v2.21.0...v2.22.0-rc.0) (2026-04-09)
7+
8+
**Note:** Version bump only for package @ui5/webcomponents-ai
9+
10+
11+
12+
13+
14+
# [2.21.0](https://github.com/UI5/webcomponents/compare/v2.21.0-rc.4...v2.21.0) (2026-04-07)
15+
16+
**Note:** Version bump only for package @ui5/webcomponents-ai
17+
18+
19+
20+
21+
22+
# [2.21.0-rc.4](https://github.com/UI5/webcomponents/compare/v2.21.0-rc.3...v2.21.0-rc.4) (2026-04-02)
23+
24+
25+
### Bug Fixes
26+
27+
* **ui5-tokenizer, ui5-multi-input,ui5-multi-combobox:** Improve stylisation ([#13314](https://github.com/UI5/webcomponents/issues/13314)) ([f9ff5ee](https://github.com/UI5/webcomponents/commit/f9ff5ee11510a1da15bd296bc025032af82eb7e9))
28+
29+
30+
31+
32+
633
# [2.21.0-rc.3](https://github.com/UI5/webcomponents/compare/v2.21.0-rc.2...v2.21.0-rc.3) (2026-03-26)
734

835
**Note:** Version bump only for package @ui5/webcomponents-ai

packages/ai/package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@ui5/webcomponents-ai",
3-
"version": "2.21.0-rc.3",
3+
"version": "2.22.0-rc.0",
44
"description": "UI5 Web Components: webcomponents.ai",
55
"ui5": {
66
"webComponentsPackage": true
@@ -48,15 +48,15 @@
4848
"directory": "packages/ai"
4949
},
5050
"dependencies": {
51-
"@ui5/webcomponents": "2.21.0-rc.3",
52-
"@ui5/webcomponents-base": "2.21.0-rc.3",
53-
"@ui5/webcomponents-icons": "2.21.0-rc.3",
54-
"@ui5/webcomponents-theming": "2.21.0-rc.3"
51+
"@ui5/webcomponents": "2.22.0-rc.0",
52+
"@ui5/webcomponents-base": "2.22.0-rc.0",
53+
"@ui5/webcomponents-icons": "2.22.0-rc.0",
54+
"@ui5/webcomponents-theming": "2.22.0-rc.0"
5555
},
5656
"devDependencies": {
5757
"@custom-elements-manifest/analyzer": "^0.10.10",
5858
"@ui5/cypress-internal": "0.1.0",
59-
"@ui5/webcomponents-tools": "2.21.0-rc.3",
59+
"@ui5/webcomponents-tools": "2.22.0-rc.0",
6060
"cypress": "15.9.0",
6161
"vite": "5.4.21"
6262
}

packages/base/CHANGELOG.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,41 @@
33
All notable changes to this project will be documented in this file.
44
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
55

6+
# [2.22.0-rc.0](https://github.com/UI5/webcomponents/compare/v2.21.0...v2.22.0-rc.0) (2026-04-09)
7+
8+
**Note:** Version bump only for package @ui5/webcomponents-base
9+
10+
11+
12+
13+
14+
# [2.21.0](https://github.com/UI5/webcomponents/compare/v2.21.0-rc.4...v2.21.0) (2026-04-07)
15+
16+
17+
### Bug Fixes
18+
19+
* **framework:** improve themeRoot validation ([#13354](https://github.com/UI5/webcomponents/issues/13354)) ([ba4a08b](https://github.com/UI5/webcomponents/commit/ba4a08bd516f1e0dbefe2dfc734a684c6af50bd8))
20+
21+
22+
### Features
23+
24+
* **ui5-button:** introduce support for form attribute ([#13321](https://github.com/UI5/webcomponents/issues/13321)) ([c9d8f2a](https://github.com/UI5/webcomponents/commit/c9d8f2ac91d5b5320e37aeee5e60b571ff3ee07c)), closes [#7459](https://github.com/UI5/webcomponents/issues/7459)
25+
26+
27+
28+
29+
30+
# [2.21.0-rc.4](https://github.com/UI5/webcomponents/compare/v2.21.0-rc.3...v2.21.0-rc.4) (2026-04-02)
31+
32+
33+
### Features
34+
35+
* update sap/icons to v5.12 & 4.24 ([#13319](https://github.com/UI5/webcomponents/issues/13319)) ([0b16434](https://github.com/UI5/webcomponents/commit/0b164348069b96f5464eaea3425a4876097dc44d))
36+
37+
38+
39+
40+
641
# [2.21.0-rc.3](https://github.com/UI5/webcomponents/compare/v2.21.0-rc.2...v2.21.0-rc.3) (2026-03-26)
742

843

packages/base/cypress/specs/ConfigurationChange.cy.tsx

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,202 @@ describe("Some configuration options can be changed at runtime", () => {
3939
.should("deep.equal", newThemeRoot);
4040
});
4141
});
42+
43+
describe("ThemeRoot validation at runtime", () => {
44+
describe("Valid themeRoot with allowed origin", () => {
45+
before(() => {
46+
cy.window()
47+
.then($el => {
48+
const metaTag = document.createElement("meta");
49+
metaTag.name = "sap-allowed-theme-origins";
50+
metaTag.content = "https://runtime-example.com";
51+
$el.document.head.append(metaTag);
52+
});
53+
});
54+
55+
after(() => {
56+
cy.window()
57+
.then($el => {
58+
const metaTag = $el.document.head.querySelector("[name='sap-allowed-theme-origins']");
59+
metaTag?.remove();
60+
const link = $el.document.head.querySelector("link[sap-ui-webcomponents-theme]");
61+
link?.remove();
62+
});
63+
});
64+
65+
it("should set raw themeRoot", () => {
66+
cy.wrap({ setThemeRoot })
67+
.invoke("setThemeRoot", "https://runtime-example.com/themes");
68+
69+
cy.wrap({ getThemeRoot })
70+
.invoke("getThemeRoot")
71+
.should("equal", "https://runtime-example.com/themes");
72+
73+
// Verify link is created in DOM
74+
cy.wrap({ getTheme })
75+
.invoke("getTheme")
76+
.then(theme => {
77+
cy.get(`link[sap-ui-webcomponents-theme="${theme}"]`)
78+
.should("exist")
79+
.and("have.attr", "href")
80+
.then(href => {
81+
return href.includes("https://runtime-example.com/themes/UI5/Base/baseLib/");
82+
})
83+
.should("be.true");
84+
});
85+
});
86+
});
87+
88+
describe("Invalid themeRoot without meta tag", () => {
89+
after(() => {
90+
cy.window()
91+
.then($el => {
92+
const link = $el.document.head.querySelector("link[sap-ui-webcomponents-theme]");
93+
link?.remove();
94+
});
95+
});
96+
97+
it("should set themeRoot but log warning", () => {
98+
const consoleWarnStub = cy.stub().as("consoleWarn");
99+
100+
cy.window().then(win => {
101+
cy.stub(win.console, "warn").callsFake(consoleWarnStub);
102+
});
103+
104+
cy.wrap({ setThemeRoot })
105+
.invoke("setThemeRoot", "https://unauthorized-runtime.com/themes");
106+
107+
// The themeRoot should be set in the internal state
108+
cy.wrap({ getThemeRoot })
109+
.invoke("getThemeRoot")
110+
.should("equal", "https://unauthorized-runtime.com/themes");
111+
112+
// But validation should fail and log a warning
113+
cy.get("@consoleWarn").should("have.been.called");
114+
115+
// Verify link is NOT created in DOM
116+
cy.get("link[sap-ui-webcomponents-theme]")
117+
.should("not.exist");
118+
});
119+
});
120+
121+
describe("Relative themeRoot at runtime", () => {
122+
before(() => {
123+
cy.window()
124+
.then($el => {
125+
const metaTag = document.createElement("meta");
126+
metaTag.name = "sap-allowed-theme-origins";
127+
metaTag.content = "*";
128+
$el.document.head.append(metaTag);
129+
});
130+
});
131+
132+
after(() => {
133+
cy.window()
134+
.then($el => {
135+
const metaTag = $el.document.head.querySelector("[name='sap-allowed-theme-origins']");
136+
metaTag?.remove();
137+
const link = $el.document.head.querySelector("link[sap-ui-webcomponents-theme]");
138+
link?.remove();
139+
});
140+
});
141+
142+
it("should set raw relative path", () => {
143+
cy.wrap({ setThemeRoot })
144+
.invoke("setThemeRoot", "./custom-themes");
145+
146+
cy.wrap({ getThemeRoot })
147+
.invoke("getThemeRoot")
148+
.should("equal", "./custom-themes");
149+
150+
// Verify link is created with resolved URL
151+
cy.wrap({ getTheme })
152+
.invoke("getTheme")
153+
.then(theme => {
154+
cy.get(`link[sap-ui-webcomponents-theme="${theme}"]`)
155+
.should("exist")
156+
.and("have.attr", "href")
157+
.then(href => {
158+
return href.includes("/custom-themes/UI5/Base/baseLib/");
159+
})
160+
.should("be.true");
161+
});
162+
});
163+
});
164+
165+
describe("Same themeRoot not re-applied", () => {
166+
before(() => {
167+
cy.window()
168+
.then($el => {
169+
const metaTag = document.createElement("meta");
170+
metaTag.name = "sap-allowed-theme-origins";
171+
metaTag.content = "https://same-root.com";
172+
$el.document.head.append(metaTag);
173+
});
174+
});
175+
176+
after(() => {
177+
cy.window()
178+
.then($el => {
179+
const metaTag = $el.document.head.querySelector("[name='sap-allowed-theme-origins']");
180+
metaTag?.remove();
181+
const link = $el.document.head.querySelector("link[sap-ui-webcomponents-theme]");
182+
link?.remove();
183+
});
184+
});
185+
186+
it("should not reprocess when setting the same themeRoot", () => {
187+
const themeRoot = "https://same-root.com/themes";
188+
189+
cy.wrap({ setThemeRoot })
190+
.invoke("setThemeRoot", themeRoot)
191+
.should("not.equal", undefined);
192+
193+
// Setting again should return undefined (no-op)
194+
cy.wrap({ setThemeRoot })
195+
.invoke("setThemeRoot", themeRoot)
196+
.should("equal", undefined);
197+
});
198+
});
199+
200+
describe("ThemeRoot with wildcard origin", () => {
201+
before(() => {
202+
cy.window()
203+
.then($el => {
204+
const metaTag = document.createElement("meta");
205+
metaTag.name = "sap-allowed-theme-origins";
206+
metaTag.content = "*";
207+
$el.document.head.append(metaTag);
208+
});
209+
});
210+
211+
after(() => {
212+
cy.window()
213+
.then($el => {
214+
const metaTag = $el.document.head.querySelector("[name='sap-allowed-theme-origins']");
215+
metaTag?.remove();
216+
const link = $el.document.head.querySelector("link[sap-ui-webcomponents-theme]");
217+
link?.remove();
218+
});
219+
});
220+
221+
it("should allow any origin with wildcard", () => {
222+
cy.wrap({ setThemeRoot })
223+
.invoke("setThemeRoot", "https://any-wildcard-domain.com/themes");
224+
225+
cy.wrap({ getThemeRoot })
226+
.invoke("getThemeRoot")
227+
.should("equal", "https://any-wildcard-domain.com/themes");
228+
229+
// Verify link is created with wildcard-allowed origin
230+
cy.wrap({ getTheme })
231+
.invoke("getTheme")
232+
.then(theme => {
233+
cy.get(`link[sap-ui-webcomponents-theme="${theme}"]`)
234+
.should("exist")
235+
.and("have.attr", "href")
236+
.and("include", "https://any-wildcard-domain.com/themes/UI5/Base/baseLib/");
237+
});
238+
});
239+
});
240+
});

0 commit comments

Comments
 (0)