Skip to content

Commit fa0b62a

Browse files
authored
Merge branch 'main' into header-banner-poc
2 parents 24c46bb + c597536 commit fa0b62a

133 files changed

Lines changed: 4074 additions & 3209 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: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,30 @@
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.3](https://github.com/UI5/webcomponents/compare/v2.22.0-rc.2...v2.22.0-rc.3) (2026-04-30)
7+
8+
9+
### Bug Fixes
10+
11+
* **ui5-card:** remove max-height constraint from subtitle to prevent text clipping for tall-character languages ([#13413](https://github.com/UI5/webcomponents/issues/13413)) ([1bfa9ee](https://github.com/UI5/webcomponents/commit/1bfa9ee96057d4e949924ed23986cf267f83309a)), closes [#13379](https://github.com/UI5/webcomponents/issues/13379)
12+
* **ui5-date-range-picker:** remove relative date handling ([#13365](https://github.com/UI5/webcomponents/issues/13365)) ([5694559](https://github.com/UI5/webcomponents/commit/5694559838482defe6d3b66e04b2e97154b54e7e))
13+
* **ui5-date-range-picker:** stabilize tests ([#13432](https://github.com/UI5/webcomponents/issues/13432)) ([6d2f572](https://github.com/UI5/webcomponents/commit/6d2f57218848a3bf24d60eb2b918c1af06216230))
14+
* **ui5-select:** fix active state of select when opened ([#13407](https://github.com/UI5/webcomponents/issues/13407)) ([58f2f58](https://github.com/UI5/webcomponents/commit/58f2f58af8ca22fa557eee00fecda8b2c8882e59))
15+
* **ui5-suggestion-item-custom:** improve accessibility of custom sugg… ([#13436](https://github.com/UI5/webcomponents/issues/13436)) ([a923725](https://github.com/UI5/webcomponents/commit/a92372594c1e4675740477bc7fbfd7b3e5bb2055))
16+
17+
18+
### Features
19+
20+
* **ui5-color-palette-item:** introduce semantic click ([#13409](https://github.com/UI5/webcomponents/issues/13409)) ([6055d6c](https://github.com/UI5/webcomponents/commit/6055d6c1136d5ecc1ad07cfcb34e8923115b18e2))
21+
* **ui5-input:** announce expanded/collapsed state for suggestions ([#13431](https://github.com/UI5/webcomponents/issues/13431)) ([9c0d1c3](https://github.com/UI5/webcomponents/commit/9c0d1c3727cc43c5646e7f62da7a86f5a4da566d))
22+
* **ui5-input:** show associated label as mobile dialog header title ([#13412](https://github.com/UI5/webcomponents/issues/13412)) ([a904c5e](https://github.com/UI5/webcomponents/commit/a904c5e0cd9f61bce5caac3f9c55e9d3c37be893))
23+
* **ui5-segmented-button-item:** introduce semantic click event ([#13396](https://github.com/UI5/webcomponents/issues/13396)) ([f47c28e](https://github.com/UI5/webcomponents/commit/f47c28e6690defce89d115855ab85f0911f473f6))
24+
* **ui5-textarea:** implement composition handling ([#13422](https://github.com/UI5/webcomponents/issues/13422)) ([fec44d7](https://github.com/UI5/webcomponents/commit/fec44d74d724b0dadc513d04701252f3aad23890))
25+
26+
27+
28+
29+
630
# [2.22.0-rc.2](https://github.com/UI5/webcomponents/compare/v2.22.0-rc.1...v2.22.0-rc.2) (2026-04-23)
731

832

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.22.0-rc.2",
17+
"version": "2.22.0-rc.3",
1818
"command": {
1919
"publish": {
2020
"allowBranch": "*",

packages/ai/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@
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.3](https://github.com/UI5/webcomponents/compare/v2.22.0-rc.2...v2.22.0-rc.3) (2026-04-30)
7+
8+
**Note:** Version bump only for package @ui5/webcomponents-ai
9+
10+
11+
12+
13+
614
# [2.22.0-rc.2](https://github.com/UI5/webcomponents/compare/v2.22.0-rc.1...v2.22.0-rc.2) (2026-04-23)
715

816
**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.22.0-rc.2",
3+
"version": "2.22.0-rc.3",
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.22.0-rc.2",
52-
"@ui5/webcomponents-base": "2.22.0-rc.2",
53-
"@ui5/webcomponents-icons": "2.22.0-rc.2",
54-
"@ui5/webcomponents-theming": "2.22.0-rc.2"
51+
"@ui5/webcomponents": "2.22.0-rc.3",
52+
"@ui5/webcomponents-base": "2.22.0-rc.3",
53+
"@ui5/webcomponents-icons": "2.22.0-rc.3",
54+
"@ui5/webcomponents-theming": "2.22.0-rc.3"
5555
},
5656
"devDependencies": {
5757
"@custom-elements-manifest/analyzer": "^0.10.10",
5858
"@ui5/cypress-internal": "0.1.0",
59-
"@ui5/webcomponents-tools": "2.22.0-rc.2",
59+
"@ui5/webcomponents-tools": "2.22.0-rc.3",
6060
"cypress": "15.9.0",
6161
"vite": "5.4.21"
6262
}

packages/base/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@
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.3](https://github.com/UI5/webcomponents/compare/v2.22.0-rc.2...v2.22.0-rc.3) (2026-04-30)
7+
8+
**Note:** Version bump only for package @ui5/webcomponents-base
9+
10+
11+
12+
13+
614
# [2.22.0-rc.2](https://github.com/UI5/webcomponents/compare/v2.22.0-rc.1...v2.22.0-rc.2) (2026-04-23)
715

816
**Note:** Version bump only for package @ui5/webcomponents-base

packages/base/bundle.esm.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import applyDirection from "./dist/locale/applyDirection.js";
3131
import { getCurrentRuntimeIndex } from "./dist/Runtimes.js";
3232
import { startMultipleDrag } from "./dist/DragAndDrop.js";
3333
import LegacyDateFormats from "./dist/features/LegacyDateFormats.js";
34+
import { boot } from "./dist/Boot.js";
3435

3536
window["sap-ui-webcomponents-bundle"] = {
3637
configuration : {
@@ -54,6 +55,7 @@ window["sap-ui-webcomponents-bundle"] = {
5455
parseProperties,
5556
registerI18nLoader,
5657
getI18nBundle,
58+
boot,
5759
renderFinished,
5860
applyDirection,
5961
EventProvider,
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
import { internals } from "../../src/Location.js";
2+
import TestGeneric from "../../test/test-elements/Generic.js";
3+
import { resetConfiguration } from "../../src/InitialConfiguration.js";
4+
import { getTheme } from "../../src/config/Theme.js";
5+
import { getThemeRoot } from "../../src/config/ThemeRoot.js";
6+
import applyTheme from "../../src/theming/applyTheme.js";
7+
8+
const THEME = "sap_horizon";
9+
10+
const addMetaTag = (content: string) => {
11+
cy.window().then($win => {
12+
const metaTag = $win.document.createElement("meta");
13+
metaTag.name = "sap-allowed-theme-origins";
14+
metaTag.content = content;
15+
$win.document.head.append(metaTag);
16+
});
17+
};
18+
19+
const removeMetaTag = () => {
20+
cy.window().then($win => {
21+
$win.document.head.querySelector("[name='sap-allowed-theme-origins']")?.remove();
22+
});
23+
};
24+
25+
const removeThemeLink = () => {
26+
cy.window().then($win => {
27+
$win.document.head.querySelector("link[sap-ui-webcomponents-theme]")?.remove();
28+
});
29+
};
30+
31+
const applyAndCheckLink = (theme: string) => {
32+
cy.wrap({ applyTheme, getTheme })
33+
.invoke("getTheme")
34+
.then(() => {
35+
return cy.wrap({ applyTheme }).invoke("applyTheme", theme);
36+
});
37+
};
38+
39+
// ─── Without meta tag ────────────────────────────────────────────────────────
40+
41+
describe("ThemeRoot via URL param — without meta tag", () => {
42+
afterEach(() => {
43+
removeThemeLink();
44+
});
45+
46+
[
47+
{ label: "absolute URL (different origin)", themeRoot: "http://example2.com/themes/", blocked: true },
48+
{ label: "absolute URL (different protocol)", themeRoot: "https://example.com/themes/", blocked: true },
49+
{ label: "absolute URL (different port)", themeRoot: "http://example:9090.com/themes/", blocked: true },
50+
{ label: "absolute URL (same host, no meta tag)", themeRoot: "http://example.com/themes/", blocked: true },
51+
{ label: "protocol-relative (different origin)", themeRoot: "//example2.com/themes/", blocked: true },
52+
{ label: "protocol-relative (different port)", themeRoot: "//example:9090.com/themes/", blocked: true },
53+
{ label: "protocol-relative (same host, no meta tag)", themeRoot: "//example.com/themes/", blocked: true },
54+
{ label: "root-relative", themeRoot: "/themes/", blocked: false },
55+
{ label: "relative (current dir)", themeRoot: "./themes/", blocked: false },
56+
{ label: "relative (parent dir)", themeRoot: "../themes/", blocked: false },
57+
].forEach(({ label, themeRoot, blocked }) => {
58+
describe(`${label}: ${themeRoot}`, () => {
59+
before(() => {
60+
cy.stub(internals, "search").callsFake(() => {
61+
return `sap-ui-theme=${THEME}@${themeRoot}`;
62+
});
63+
64+
cy.wrap({ resetConfiguration }).invoke("resetConfiguration", true);
65+
cy.mount(<TestGeneric />);
66+
});
67+
68+
it(blocked ? "should not create a link element" : "should create a link element (same-origin, no meta tag needed)", () => {
69+
applyAndCheckLink(THEME);
70+
if (blocked) {
71+
cy.get(`link[sap-ui-webcomponents-theme='${THEME}']`).should("not.exist");
72+
} else {
73+
cy.get(`link[sap-ui-webcomponents-theme='${THEME}']`)
74+
.should("exist")
75+
.and("have.attr", "href")
76+
.and("include", `UI5/Base/baseLib/${THEME}/css_variables.css`);
77+
}
78+
});
79+
});
80+
});
81+
});
82+
83+
// ─── With meta tag ────────────────────────────────────────────────────────────
84+
85+
describe("ThemeRoot via URL param — with meta tag (allowed: http://example.com)", () => {
86+
afterEach(() => {
87+
removeThemeLink();
88+
});
89+
90+
after(() => {
91+
removeMetaTag();
92+
});
93+
94+
before(() => {
95+
addMetaTag("http://example.com");
96+
});
97+
98+
const blocked = [
99+
{ label: "absolute URL (different origin)", themeRoot: "http://example2.com/themes/" },
100+
{ label: "absolute URL (different protocol)", themeRoot: "https://example.com/themes/" },
101+
{ label: "absolute URL (different port)", themeRoot: "http://example:9090.com/themes/" },
102+
{ label: "protocol-relative (different origin)", themeRoot: "//example2.com/themes/" },
103+
{ label: "protocol-relative (different port)", themeRoot: "//example:9090.com/themes/" },
104+
];
105+
106+
const allowed = [
107+
{
108+
label: "absolute URL (matches allowed origin)",
109+
themeRoot: "http://example.com/themes/",
110+
expectedHref: "http://example.com/themes/UI5/Base/baseLib/sap_horizon/css_variables.css",
111+
},
112+
{
113+
label: "protocol-relative (resolves to allowed origin)",
114+
themeRoot: "//example.com/themes/",
115+
expectedHref: "http://example.com/themes/UI5/Base/baseLib/sap_horizon/css_variables.css",
116+
},
117+
];
118+
119+
const sameOriginAllowed = [
120+
{ label: "root-relative", themeRoot: "/themes/" },
121+
{ label: "relative (current dir)", themeRoot: "./themes/" },
122+
{ label: "relative (parent dir)", themeRoot: "../themes/" },
123+
];
124+
125+
blocked.forEach(({ label, themeRoot }) => {
126+
describe(`blocked — ${label}: ${themeRoot}`, () => {
127+
before(() => {
128+
cy.stub(internals, "search").callsFake(() => {
129+
return `sap-ui-theme=${THEME}@${themeRoot}`;
130+
});
131+
cy.wrap({ resetConfiguration }).invoke("resetConfiguration", true);
132+
cy.mount(<TestGeneric />);
133+
});
134+
135+
it("should not create a link element", () => {
136+
applyAndCheckLink(THEME);
137+
cy.get(`link[sap-ui-webcomponents-theme='${THEME}']`).should("not.exist");
138+
});
139+
});
140+
});
141+
142+
allowed.forEach(({ label, themeRoot, expectedHref }) => {
143+
describe(`allowed — ${label}: ${themeRoot}`, () => {
144+
before(() => {
145+
cy.stub(internals, "search").callsFake(() => {
146+
return `sap-ui-theme=${THEME}@${themeRoot}`;
147+
});
148+
cy.wrap({ resetConfiguration }).invoke("resetConfiguration", true);
149+
cy.mount(<TestGeneric />);
150+
});
151+
152+
it("should create a link element with correct href", () => {
153+
applyAndCheckLink(THEME);
154+
cy.get(`link[sap-ui-webcomponents-theme='${THEME}']`)
155+
.should("exist")
156+
.and("have.attr", "href", expectedHref);
157+
});
158+
});
159+
});
160+
161+
sameOriginAllowed.forEach(({ label, themeRoot }) => {
162+
describe(`allowed (same-origin) — ${label}: ${themeRoot}`, () => {
163+
before(() => {
164+
cy.stub(internals, "search").callsFake(() => {
165+
return `sap-ui-theme=${THEME}@${themeRoot}`;
166+
});
167+
cy.wrap({ resetConfiguration }).invoke("resetConfiguration", true);
168+
cy.mount(<TestGeneric />);
169+
});
170+
171+
it("should create a link element", () => {
172+
applyAndCheckLink(THEME);
173+
cy.get(`link[sap-ui-webcomponents-theme='${THEME}']`)
174+
.should("exist")
175+
.and("have.attr", "href")
176+
.and("include", `UI5/Base/baseLib/${THEME}/css_variables.css`);
177+
});
178+
});
179+
});
180+
});

0 commit comments

Comments
 (0)