diff --git a/.github/actions/mergeReleaseChangelog.mjs b/.github/actions/mergeReleaseChangelog.mjs
new file mode 100644
index 000000000000..017ef61d04e2
--- /dev/null
+++ b/.github/actions/mergeReleaseChangelog.mjs
@@ -0,0 +1,113 @@
+import { promises as fs } from 'node:fs';
+
+const extractChangelogSections = (releaseBody) => {
+ const fixes = [];
+ const features = [];
+ const fixesMatch = releaseBody.match(/## Bug Fixes([\s\S]*?)(?=##|$)/);
+ const featuresMatch = releaseBody.match(/## Features([\s\S]*?)(?=##|$)/);
+
+ if (fixesMatch) {
+ // Split lines, trim whitespace, and remove any leading bullet point (like "*" or "-")
+ const fixEntries = fixesMatch[1].trim().split('\n').map(line => line.replace(/^[*-]\s*/, '').trim());
+ fixes.push(...fixEntries);
+ }
+ if (featuresMatch) {
+ const featureEntries = featuresMatch[1].trim().split('\n').map(line => line.replace(/^[*-]\s*/, '').trim());
+ features.push(...featureEntries);
+ }
+
+ return { fixes, features };
+};
+
+const mergeReleaseChangelogs = (minorRelease, rcReleases) => {
+ // Extract the existing changes from the minor release body
+ const { fixes: minorFixes, features: minorFeatures } = extractChangelogSections(minorRelease.body);
+ const fixes = [...minorFixes];
+ const features = [...minorFeatures];
+
+ // Add changes from each RC release
+ rcReleases.forEach((release) => {
+ const { fixes: rcFixes, features: rcFeatures } = extractChangelogSections(release.body);
+ fixes.push(...rcFixes);
+ features.push(...rcFeatures);
+ })
+
+ // Sort fixes and features alphabetically
+ const sortedFixes = fixes.sort((a, b) => {
+ const contentA = a.match(/\*\*(.*?)\*\*/)?.[1] || '';
+ const contentB = b.match(/\*\*(.*?)\*\*/)?.[1] || '';
+ return contentA.localeCompare(contentB);
+ });
+
+ const sortedFeatures = features.sort((a, b) => {
+ const contentA = a.match(/\*\*(.*?)\*\*/)?.[1] || '';
+ const contentB = b.match(/\*\*(.*?)\*\*/)?.[1] || '';
+ return contentA.localeCompare(contentB);
+ });
+
+ return { fixes: sortedFixes, features: sortedFeatures };
+}
+
+const updateRelease = async (releaseContext) => {
+ const releaseId = releaseContext.minorRelease.id;
+ const releaseHeaderMatch = releaseContext.minorRelease.body.match(/^#\s\[.*?\]\(.*?\)\s\([\d-]+\)/);
+ const releaseHeader = releaseHeaderMatch ? `${releaseHeaderMatch[0]}\n\n` : '';
+ const formattedFixes = releaseContext.fixes.length ? `### Fixes\n- ${releaseContext.fixes.join('\n- ')}` : '';
+ const formattedFeatures = releaseContext.features.length ? `### Features\n- ${releaseContext.features.join('\n- ')}` : '';
+ const body = `${releaseHeader}${formattedFixes}\n\n${formattedFeatures}`.trim();
+
+ try {
+ await releaseContext.github.request('PATCH /repos/{owner}/{repo}/releases/{releaseId}', {
+ owner: releaseContext.owner,
+ repo: releaseContext.repo,
+ body,
+ releaseId,
+ });
+
+ console.log(`Release ${releaseContext.version} updated successfully:`, releaseContext);
+ } catch (error) {
+ console.error(`Error updating release ${releaseContext.version}:`, error );
+ }
+};
+
+/**
+ * Publishes comments to issues that are fixed and released.
+ * @param options {object}
+ * @param options.github {import("@octokit/rest/dist-types/index.d.ts").Octokit}
+ * @param options.context
+ */
+export default async function run({ github, context }) {
+ const lerna = await fs.readFile(new URL('../../lerna.json', import.meta.url), 'utf8');
+ const { version } = JSON.parse(lerna);
+
+ if (!version.startsWith("2")) {
+ console.warn('Skip: the task is relevant for version 2');
+ return;
+ }
+
+ try {
+ const { owner, repo } = context.repo;
+ const allReleases = (await github.request('GET /repos/{owner}/{repo}/releases', { owner, repo })).data;
+ const rcReleases = allReleases.filter((release) => release.tag_name.includes(`v${version}-rc`));
+ const minorRelease = allReleases.find((release) => release.tag_name === `v${version}`);
+
+ // Merge RC changelogs
+ const { fixes, features } = await mergeReleaseChangelogs(minorRelease, rcReleases);
+
+ const minorReleaseContext = {
+ github,
+ version,
+ owner,
+ repo,
+ minorRelease,
+ fixes,
+ features
+ }
+
+ // Update the minor release with aggregated changelog
+ await updateRelease(minorReleaseContext);
+
+ } catch (error) {
+ console.error('Error:', error);
+ }
+}
diff --git a/.github/workflows/merge-release-changelog.yaml b/.github/workflows/merge-release-changelog.yaml
new file mode 100644
index 000000000000..4593cff18673
--- /dev/null
+++ b/.github/workflows/merge-release-changelog.yaml
@@ -0,0 +1,34 @@
+name: Merge Release Changelog
+
+on: workflow_dispatch
+
+jobs:
+ merge-release-changelog:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ id-token: write
+ issues: write
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ token: ${{ secrets.UI5_WEBCOMP_BOT_GH_TOKEN }}
+ fetch-depth: 0
+ - uses: actions/setup-node@v4.1.0
+ with:
+ node-version: 20
+ cache: 'yarn'
+
+ - name: Install
+ run: yarn --frozen-lockfile
+
+ - name: Merge Release Changelog
+ uses: actions/github-script@v7
+ env:
+ GH_TOKEN: ${{ secrets.UI5_WEBCOMP_BOT_GH_TOKEN }}
+ with:
+ github-token: ${{ secrets.UI5_WEBCOMP_BOT_GH_TOKEN }}
+ script: |
+ const mergeReleaseChangelog = (await import('${{ github.workspace }}/.github/actions/mergeReleaseChangelog.mjs')).default;
+
+ await mergeReleaseChangelog({ github , context });
\ No newline at end of file
diff --git a/.github/workflows/release-stable.yaml b/.github/workflows/release-stable.yaml
index deda1c46e230..7f75fe0cb3b6 100644
--- a/.github/workflows/release-stable.yaml
+++ b/.github/workflows/release-stable.yaml
@@ -68,4 +68,15 @@ jobs:
script: |
const commentOnFixedIssues = (await import('${{ github.workspace }}/.github/actions/commentOnFixedIssues.mjs')).default;
- await commentOnFixedIssues({ github, context });
\ No newline at end of file
+ await commentOnFixedIssues({ github, context });
+
+ - name: Merge Release Changelog
+ uses: actions/github-script@v7
+ env:
+ GH_TOKEN: ${{ secrets.UI5_WEBCOMP_BOT_GH_TOKEN }}
+ with:
+ github-token: ${{ secrets.UI5_WEBCOMP_BOT_GH_TOKEN }}
+ script: |
+ const mergeReleaseChangelog = (await import('${{ github.workspace }}/.github/actions/mergeReleaseChangelog.mjs')).default;
+
+ await mergeReleaseChangelog({ github , context });
diff --git a/CHANGELOG.md b/CHANGELOG.md
index aaf093bc110e..8776c80c6cb4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,98 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [2.5.0-rc.2](https://github.com/SAP/ui5-webcomponents/compare/v2.5.0-rc.1...v2.5.0-rc.2) (2024-11-28)
+
+
+### Bug Fixes
+
+* **ui5-input:** set value after preventDefault of input event ([#10196](https://github.com/SAP/ui5-webcomponents/issues/10196)) ([e2a6c94](https://github.com/SAP/ui5-webcomponents/commit/e2a6c94d6b4d88db61d85313f2776a092152478d)), closes [#9988](https://github.com/SAP/ui5-webcomponents/issues/9988)
+* **ui5-radio-button:** fix aria-disabled and focus of the read-only radio buttons ([#10111](https://github.com/SAP/ui5-webcomponents/issues/10111)) ([3bcfd1d](https://github.com/SAP/ui5-webcomponents/commit/3bcfd1d26b8520b73be336558f590e1b89c4d0c3)), closes [#10025](https://github.com/SAP/ui5-webcomponents/issues/10025)
+* **ui5-tokenizer:** adjust touch area for cozy and compact ([#10215](https://github.com/SAP/ui5-webcomponents/issues/10215)) ([ee90aea](https://github.com/SAP/ui5-webcomponents/commit/ee90aeaae00a3a888a8dafae73cb7dba1bf8e51f))
+* **ui5-wizard:** stacked Wizard Steps are aligned properly ([#10250](https://github.com/SAP/ui5-webcomponents/issues/10250)) ([3473fbf](https://github.com/SAP/ui5-webcomponents/commit/3473fbf7dd6f97d0de70a540d412c36901455926)), closes [#9779](https://github.com/SAP/ui5-webcomponents/issues/9779)
+
+
+### Features
+
+* **ui5-combobox:** adjust arrow-down behavior ([#10166](https://github.com/SAP/ui5-webcomponents/issues/10166)) ([74616dc](https://github.com/SAP/ui5-webcomponents/commit/74616dc7ea533ecbd18265878c90339e10eb9d1b))
+* **ui5-form:** add new `emptySpan` property ([#10194](https://github.com/SAP/ui5-webcomponents/issues/10194)) ([48b0cc8](https://github.com/SAP/ui5-webcomponents/commit/48b0cc89b36dd859dd07c17021eedf7a99375150)), closes [#9963](https://github.com/SAP/ui5-webcomponents/issues/9963)
+* **ui5-list:** add Home and End key handling for Load More button ([#10206](https://github.com/SAP/ui5-webcomponents/issues/10206)) ([7059e09](https://github.com/SAP/ui5-webcomponents/commit/7059e0987960f62cd5b8740594b907fa98e1f11c))
+
+
+
+
+
+# [2.5.0-rc.1](https://github.com/SAP/ui5-webcomponents/compare/v2.5.0-rc.0...v2.5.0-rc.1) (2024-11-21)
+
+
+### Bug Fixes
+
+* **ui5-dialog:** width on mobile is not bigger than the phone width ([#10199](https://github.com/SAP/ui5-webcomponents/issues/10199)) ([77af592](https://github.com/SAP/ui5-webcomponents/commit/77af592c238ad53502c09f142d33f7c66c6b0715)), closes [#10000](https://github.com/SAP/ui5-webcomponents/issues/10000)
+* **ui5-table:** text cut due to column overflow ([#10193](https://github.com/SAP/ui5-webcomponents/issues/10193)) ([b59d718](https://github.com/SAP/ui5-webcomponents/commit/b59d718dca80bd9a8ee65993ddc2358ecd127024)), closes [#10168](https://github.com/SAP/ui5-webcomponents/issues/10168)
+
+
+### Features
+
+* **ui5-form:** enable vertical alignment of form items ([#10165](https://github.com/SAP/ui5-webcomponents/issues/10165)) ([13b571b](https://github.com/SAP/ui5-webcomponents/commit/13b571baf0b225dfabc4739be64dd64a34cc5506))
+* **ui5-toolbar:** fixed spacer behavior ([#10177](https://github.com/SAP/ui5-webcomponents/issues/10177)) ([b3625ac](https://github.com/SAP/ui5-webcomponents/commit/b3625ac7426aa592b80f50e15147c18ccc7d2abd)), closes [#10104](https://github.com/SAP/ui5-webcomponents/issues/10104)
+
+
+
+
+
+# [2.5.0-rc.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.1-rc.0...v2.5.0-rc.0) (2024-11-14)
+
+
+### Bug Fixes
+
+* **ui5-card-header:** update interactive property documentation ([#10143](https://github.com/SAP/ui5-webcomponents/issues/10143)) ([23289d4](https://github.com/SAP/ui5-webcomponents/commit/23289d4d1696d0441823d98f71b5e21b617777c3))
+* **ui5-dynamic-page:** move subheading slot outside the title wrapper ([#10163](https://github.com/SAP/ui5-webcomponents/issues/10163)) ([6466b8a](https://github.com/SAP/ui5-webcomponents/commit/6466b8ad7f73c85a5c105dea3c196f6bfb78f27a))
+* **ui5-table-growing:** button is shown despite scroll type ([#10142](https://github.com/SAP/ui5-webcomponents/issues/10142)) ([950441b](https://github.com/SAP/ui5-webcomponents/commit/950441b7d272e8cd20499461f4cfa05ad3ac7510)), closes [#10045](https://github.com/SAP/ui5-webcomponents/issues/10045)
+
+
+### Features
+
+* **ui5-color-picker:** add simplified display mode ([#10153](https://github.com/SAP/ui5-webcomponents/issues/10153)) ([bf9c0d6](https://github.com/SAP/ui5-webcomponents/commit/bf9c0d653be5af5473a7b616f2c91803db46beb3)), closes [#9979](https://github.com/SAP/ui5-webcomponents/issues/9979)
+* **ui5-combobox/multi-combobox:** physical items ([#10051](https://github.com/SAP/ui5-webcomponents/issues/10051)) ([73f82ab](https://github.com/SAP/ui5-webcomponents/commit/73f82abe5e9a61d88919f4c45df9435be850eb2f))
+* **ui5-form:** update to latest accessibility spec ([#10152](https://github.com/SAP/ui5-webcomponents/issues/10152)) ([4382d4e](https://github.com/SAP/ui5-webcomponents/commit/4382d4e280ffcf01a924163b9b719887c17f529a)), closes [#9952](https://github.com/SAP/ui5-webcomponents/issues/9952)
+* **ui5-list, ui5-tree:** support accessible description ([#10131](https://github.com/SAP/ui5-webcomponents/issues/10131)) ([45f0ffe](https://github.com/SAP/ui5-webcomponents/commit/45f0ffeafb2da0ffcaf425649c7440b604e359a3)), closes [#6445](https://github.com/SAP/ui5-webcomponents/issues/6445)
+* **ui5-tokenizer:** enable multiline mode ([#9964](https://github.com/SAP/ui5-webcomponents/issues/9964)) ([1071746](https://github.com/SAP/ui5-webcomponents/commit/107174616b5b3b96c174160488eba18b9cdb9cae))
+
+
+
+
+
+## [2.4.1-rc.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0...v2.4.1-rc.0) (2024-11-07)
+
+
+### Bug Fixes
+
+* **ui5-menu:** make close event non-bubbling ([#10133](https://github.com/SAP/ui5-webcomponents/issues/10133)) ([e7ccce9](https://github.com/SAP/ui5-webcomponents/commit/e7ccce968cab25a07837c41f36d94603c31e007e)), closes [#10041](https://github.com/SAP/ui5-webcomponents/issues/10041)
+* **ui5-select:** add support for Vue.js v-model ([#10149](https://github.com/SAP/ui5-webcomponents/issues/10149)) ([14947a7](https://github.com/SAP/ui5-webcomponents/commit/14947a7bbcf3272f56888bb466696784095b574f)), closes [#9971](https://github.com/SAP/ui5-webcomponents/issues/9971)
+
+
+
+
+
+# [2.4.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0-rc.4...v2.4.0) (2024-11-03)
+
+
+### Bug Fixes
+
+* **ui5-dynamic-page:** improve scrolling smoothness ([#10093](https://github.com/SAP/ui5-webcomponents/issues/10093)) ([d1420b0](https://github.com/SAP/ui5-webcomponents/commit/d1420b0be2c40ca649503cca0715e4c529929f8f)), closes [#10011](https://github.com/SAP/ui5-webcomponents/issues/10011)
+* **ui5-dynamic-page:** prevent unwanted header toggle from scroll ([#10007](https://github.com/SAP/ui5-webcomponents/issues/10007)) ([7a7d00c](https://github.com/SAP/ui5-webcomponents/commit/7a7d00c0d615283d1a86d775b6c51db7feadfb42))
+* **ui5-media-gallery:** clear selected thumbnail on item removal ([#10087](https://github.com/SAP/ui5-webcomponents/issues/10087)) ([af4cadb](https://github.com/SAP/ui5-webcomponents/commit/af4cadbfb637c1a6440aa0bd1fc516629ae332ae))
+* **ui5-toolbar-*:** ensure getDomRef() returns the actual DOM reference ([#10009](https://github.com/SAP/ui5-webcomponents/issues/10009)) ([747244d](https://github.com/SAP/ui5-webcomponents/commit/747244d93fee5ee0d1ac54863de5e3573f4d6248))
+
+
+### Features
+
+* **ui5-date-picker:** introduce open and close events ([#10118](https://github.com/SAP/ui5-webcomponents/issues/10118)) ([819730a](https://github.com/SAP/ui5-webcomponents/commit/819730afbec336ad04e1207b8fee24bcd69f7c2d))
+
+
+
+
+
# [2.4.0-rc.4](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0-rc.3...v2.4.0-rc.4) (2024-10-31)
diff --git a/docs/08-Releases.md b/docs/08-Releases.md
index 37016593ac3c..94310d789f5d 100644
--- a/docs/08-Releases.md
+++ b/docs/08-Releases.md
@@ -9,12 +9,12 @@ and produce the following type of releases:
- **Patch releases**
-Includes backward compatible bug fixes and increments the third digit, e.g. 1.0.1.
+Includes backward compatible bug fixes and increments the third digit, e.g. 2.0.1.
- **Minor releases**
-Includes backward compatible new features and increments the middle digit and resets the last digit to zero, e.g. 1.1.0.
+Includes backward compatible new features and increments the middle digit and resets the last digit to zero, e.g. 2.1.0, 2.2.0, 2.3.0, etc.
- **Major releases**
@@ -26,20 +26,30 @@ Includes changes that break backward compatibility and increments the first digi
Here is the established release process of UI5 Web Components:
-- **Monthly Stable Releases** - 1.11.0, 1.12.0....1.18.0
+### Version 2
-Every start of the month, a new minor version is released, which we consider stable and recommended for consumers.
-Check the [Release Timelines](https://github.com/SAP/ui5-webcomponents/projects?type=classic) for up-to-date information (the related content is at the bottom of the page).
+The UI5 Web Components version 2 is the latest major and recommended for usage.
-- **Weekly Preview Releases** - 1.13.0-rc.0, 1.13.0-rc.1, 1.13.0-rc.2 (preview of 1.13)
+- **Monthly Stable Releases** - 2.1.0, 2.2.0....2.x.0.
+
+Every start of the month, a new minor version is released - stable and recommended for consumers.
+Check the [Release Timelines](https://github.com/orgs/SAP/projects/91?pane=info) for up-to-date information (the related content is at the bottom of the page).
+
+- **Weekly Preview Releases** - 2.x.0-rc.0, 2.x.0-rc.1....2.x.0-rc.z.
Every week on Thursday, a new release candidate version is released, considered a preview of the upcoming minor version.
It's more up-to-date with the latest development and it's useful for consumers that would like to get frequent updates and test upcoming features in the minor version.
-
-- **On-demand Patch Releases** - 1.13.1, 1.13.2, 1.13.3
+- **On-demand Patch Releases** - 2.x.1, 2.x.2....2.x.y.
Patches are released on-demand for high-priority issues.
+### Version 1
+
+The UI5 Web Components version 1 is in maintenance until 30 June 2025.
+
+- **Monthly Patch Releases** - 1.24.1, 1.24.2....1.24.y.
+
+Every start of the month, a new patch of 1.24 version is released - stable and recommended for consumers that still rely on version 1.
**Note:** The changelog of all releases can be found on the [GitHub Release](https://github.com/SAP/ui5-webcomponents/releases) page.
diff --git a/docs/1-getting-started/01-first-steps.md b/docs/1-getting-started/01-first-steps.md
index 1098a1d3e634..58b6bbb638c0 100644
--- a/docs/1-getting-started/01-first-steps.md
+++ b/docs/1-getting-started/01-first-steps.md
@@ -108,3 +108,38 @@ dist/assets/vendor.c05c7785.js 114.92kb / brotli: 24.30kb
The content of the `dist` folder is ready to be deployed for productive usage. The hashes in the file names make them safe for caching and the produced bundle is optimized for production.
#### 4. Enjoy UI5 Web Components.
+
+### Code Completion
+
+#### Visual Studio Code (VS Code)
+
+UI5 Web Components packages include a vscode.html-custom-data.json file that describes their custom elements. This enables advanced code completion features, such as “code hinting” or “IntelliSense,” in Visual Studio Code.
+
+Steps to Enable Code Completion in VS Code:
+
+1. Install UI5 Web Components locally
+ Use your package manager to add the required UI5 Web Components packages to your project.
+
+2. Create or update `.vscode/settings.json`:
+ - Ensure a folder named `.vscode` exists at the root of your project.
+ - Inside `.vscode`, create or update a file named `settings.json`.
+
+3. Configure the Settings File:
+ Add the following configuration to `settings.json`:
+
+ ```json
+ {
+ "html.customData": [
+ "./node_modules/@ui5/webcomponents/dist/vscode.html-custom-data.json"
+ // Add entries for other installed @ui5/webcomponents packages as needed
+ ]
+ }
+ ```
+
+ If `settings.json` already exists, append the `html.customData` property to the root object.
+
+4. Restart VS Code:
+ Restart the editor to apply the changes.
+
+#### JetBrains IDEs
+For JetBrains IDEs, such as WebStorm or IntelliJ IDEA, no additional setup is required when using UI5 Web Components installed from your package manager. The IDE will automatically detect the `web-types.json` file provided by the packages, enabling code completion and displaying relevant component information without further configuration.
diff --git a/docs/2-advanced/09-accessibility.md b/docs/2-advanced/09-accessibility.md
index b77b078dc379..59923bb3c2bf 100644
--- a/docs/2-advanced/09-accessibility.md
+++ b/docs/2-advanced/09-accessibility.md
@@ -141,6 +141,8 @@ The mapping of the accessibility APIs to ARIA attributes is described in the fol
| ------------------------------ | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `accessibleName` | `aria-label` | Defines the text alternative of the component. If not provided, a default text alternative is set, if present. |
| `accessibleNameRef` | `aria-label` | Alternative for `aria-labelledby`. Receives ID (or many IDs) of the elements that serve as labels of the component. Those labels are passed as a concatenated string to the `aria-label` attribute. |
+| `accessibleDescription` | `aria-description` | Defines the description of the component. |
+| `accessibleDescriptionRef` | `aria-description` | Alternative for `aria-describedby`. Receives ID (or many IDs) of the elements that serve as descriptions of the component. Those descriptions are passed as a concatenated string to the `aria-describedby` attribute. |
| `accessibleRole` | `role` | Sets the accessible aria role of the component. |
| `accessibilityAttributes` | `aria-expanded`, `aria-haspopup`, `aria-controls`, etc. | An object of strings that defines several additional accessibility attribute values for customization depending on the use case. For composite components the object provides a way to enrich the accessibility of the different elements inside the component (for example in the `ui5-shellbar`). | |
| `required` | `aria-required` | Defines whether the component is required. |
@@ -187,6 +189,53 @@ The `accessibleNameRef` property is currently supported in most of the available
---
+### accessibleDescription
+
+Setting the property on the custom element as:
+```html
+
+ Item 1
+ Item 2
+
+```
+
+Will result in the shadow DOM as:
+```html
+
+ ...
+
+```
+
+The `accessibleDescription` property is currently supported in:
+* [List](https://sap.github.io/ui5-webcomponents/nightly/components/List/)
+* [Tree](https://sap.github.io/ui5-webcomponents/nightly/components/Tree/)
+
+---
+
+### accessibleDescriptionRef
+
+Setting the property on the custom element as:
+```html
+
List of items
+
+ Item 1
+ Item 2
+
+```
+
+Will result in the shadow DOM as:
+```html
+
+ ...
+
+```
+
+The `accessibleDescriptionRef` property is currently supported in:
+* [List](https://sap.github.io/ui5-webcomponents/nightly/components/List/)
+* [Tree](https://sap.github.io/ui5-webcomponents/nightly/components/Tree/)
+
+---
+
### accessibleRole
Setting the property on the custom element as:
diff --git a/lerna.json b/lerna.json
index 7f5008c88492..6dd06cfea728 100644
--- a/lerna.json
+++ b/lerna.json
@@ -14,7 +14,7 @@
"packages/create-package",
"packages/compat"
],
- "version": "2.4.0-rc.4",
+ "version": "2.5.0-rc.2",
"command": {
"publish": {
"allowBranch": "*",
diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md
index a2d4c5f82946..f5e169d4a5b5 100644
--- a/packages/ai/CHANGELOG.md
+++ b/packages/ai/CHANGELOG.md
@@ -3,6 +3,46 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [2.5.0-rc.2](https://github.com/SAP/ui5-webcomponents/compare/v2.5.0-rc.1...v2.5.0-rc.2) (2024-11-28)
+
+**Note:** Version bump only for package @ui5/webcomponents-ai
+
+
+
+
+
+# [2.5.0-rc.1](https://github.com/SAP/ui5-webcomponents/compare/v2.5.0-rc.0...v2.5.0-rc.1) (2024-11-21)
+
+**Note:** Version bump only for package @ui5/webcomponents-ai
+
+
+
+
+
+# [2.5.0-rc.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.1-rc.0...v2.5.0-rc.0) (2024-11-14)
+
+**Note:** Version bump only for package @ui5/webcomponents-ai
+
+
+
+
+
+## [2.4.1-rc.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0...v2.4.1-rc.0) (2024-11-07)
+
+**Note:** Version bump only for package @ui5/webcomponents-ai
+
+
+
+
+
+# [2.4.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0-rc.4...v2.4.0) (2024-11-03)
+
+**Note:** Version bump only for package @ui5/webcomponents-ai
+
+
+
+
+
# [2.4.0-rc.4](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0-rc.3...v2.4.0-rc.4) (2024-10-31)
**Note:** Version bump only for package @ui5/webcomponents-ai
diff --git a/packages/ai/README.md b/packages/ai/README.md
index 157e124d5d41..2459ecdbf61a 100644
--- a/packages/ai/README.md
+++ b/packages/ai/README.md
@@ -10,9 +10,10 @@ Provides web components implementing AI-related visual and interaction.
## Provided components
-| Web Component | Tag name | Module import |
-|--------------------------|-----------------------------|------------------------------------------------------------|
-
+| Web Component | Tag name | Module import |
+|--------------------------|--------------------------------|---------------------------------------------------------|
+| Button | `ui5-ai-button` | `import "@ui5/webcomponents-ai/dist/Button.js";` |
+| PromptInput | `ui5-ai-prompt-input` | `import "@ui5/webcomponents-ai/dist/PromptInput.js";` |
## Provided assets
diff --git a/packages/ai/package.json b/packages/ai/package.json
index a7d16f3c27b1..2f0a9b2395db 100644
--- a/packages/ai/package.json
+++ b/packages/ai/package.json
@@ -1,6 +1,6 @@
{
"name": "@ui5/webcomponents-ai",
- "version": "2.4.0-rc.4",
+ "version": "2.5.0-rc.2",
"description": "UI5 Web Components: webcomponents.ai",
"ui5": {
"webComponentsPackage": true
@@ -45,13 +45,13 @@
"directory": "packages/ai"
},
"dependencies": {
- "@ui5/webcomponents": "2.4.0-rc.4",
- "@ui5/webcomponents-base": "2.4.0-rc.4",
- "@ui5/webcomponents-icons": "2.4.0-rc.4",
- "@ui5/webcomponents-theming": "2.4.0-rc.4"
+ "@ui5/webcomponents": "2.5.0-rc.2",
+ "@ui5/webcomponents-base": "2.5.0-rc.2",
+ "@ui5/webcomponents-icons": "2.5.0-rc.2",
+ "@ui5/webcomponents-theming": "2.5.0-rc.2"
},
"devDependencies": {
- "@ui5/webcomponents-tools": "2.4.0-rc.4",
- "chromedriver": "^129.0.0"
+ "@ui5/webcomponents-tools": "2.5.0-rc.2",
+ "chromedriver": "^131.0.0"
}
}
diff --git a/packages/ai/test/pages/Button.html b/packages/ai/test/pages/Button.html
index eb6bf48fa1ec..d4ada3f6c79b 100644
--- a/packages/ai/test/pages/Button.html
+++ b/packages/ai/test/pages/Button.html
@@ -100,7 +100,7 @@
-
+
@@ -266,7 +266,7 @@
case "Rephrase":
startTextGeneration(button, "reviseGenerating", predefinedTextsRephrased);
break;
- case "Summarise":
+ case "Summarize":
startTextGeneration(button, "reviseGenerating", predefinedTextsSummarized);
break;
case "Bulgarian":
diff --git a/packages/base/CHANGELOG.md b/packages/base/CHANGELOG.md
index 164090effc12..8fec5c49844a 100644
--- a/packages/base/CHANGELOG.md
+++ b/packages/base/CHANGELOG.md
@@ -3,6 +3,50 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [2.5.0-rc.2](https://github.com/SAP/ui5-webcomponents/compare/v2.5.0-rc.1...v2.5.0-rc.2) (2024-11-28)
+
+**Note:** Version bump only for package @ui5/webcomponents-base
+
+
+
+
+
+# [2.5.0-rc.1](https://github.com/SAP/ui5-webcomponents/compare/v2.5.0-rc.0...v2.5.0-rc.1) (2024-11-21)
+
+**Note:** Version bump only for package @ui5/webcomponents-base
+
+
+
+
+
+# [2.5.0-rc.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.1-rc.0...v2.5.0-rc.0) (2024-11-14)
+
+
+### Features
+
+* **ui5-form:** update to latest accessibility spec ([#10152](https://github.com/SAP/ui5-webcomponents/issues/10152)) ([4382d4e](https://github.com/SAP/ui5-webcomponents/commit/4382d4e280ffcf01a924163b9b719887c17f529a)), closes [#9952](https://github.com/SAP/ui5-webcomponents/issues/9952)
+* **ui5-list, ui5-tree:** support accessible description ([#10131](https://github.com/SAP/ui5-webcomponents/issues/10131)) ([45f0ffe](https://github.com/SAP/ui5-webcomponents/commit/45f0ffeafb2da0ffcaf425649c7440b604e359a3)), closes [#6445](https://github.com/SAP/ui5-webcomponents/issues/6445)
+
+
+
+
+
+## [2.4.1-rc.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0...v2.4.1-rc.0) (2024-11-07)
+
+**Note:** Version bump only for package @ui5/webcomponents-base
+
+
+
+
+
+# [2.4.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0-rc.4...v2.4.0) (2024-11-03)
+
+**Note:** Version bump only for package @ui5/webcomponents-base
+
+
+
+
+
# [2.4.0-rc.4](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0-rc.3...v2.4.0-rc.4) (2024-10-31)
**Note:** Version bump only for package @ui5/webcomponents-base
diff --git a/packages/base/package.json b/packages/base/package.json
index 3b06dfaa4d2c..2b8df043cf77 100644
--- a/packages/base/package.json
+++ b/packages/base/package.json
@@ -1,6 +1,6 @@
{
"name": "@ui5/webcomponents-base",
- "version": "2.4.0-rc.4",
+ "version": "2.5.0-rc.2",
"description": "UI5 Web Components: webcomponents.base",
"author": "SAP SE (https://www.sap.com)",
"license": "Apache-2.0",
@@ -52,8 +52,8 @@
},
"devDependencies": {
"@openui5/sap.ui.core": "1.120.17",
- "@ui5/webcomponents-tools": "2.4.0-rc.4",
- "chromedriver": "^129.0.0",
+ "@ui5/webcomponents-tools": "2.5.0-rc.2",
+ "chromedriver": "^131.0.0",
"clean-css": "^5.2.2",
"copy-and-watch": "^0.1.5",
"cross-env": "^7.0.3",
diff --git a/packages/base/src/MarkedEvents.ts b/packages/base/src/MarkedEvents.ts
deleted file mode 100644
index 7c4e2e7eb26b..000000000000
--- a/packages/base/src/MarkedEvents.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-const markedEvents = new WeakMap();
-
-/**
- * Marks the given event with random marker.
- */
-const markEvent = (event: Event, value: string) => {
- markedEvents.set(event, value);
-};
-
-/**
- * Returns the marker for the given event.
- */
-const getEventMark = (event: Event): string | undefined => {
- return markedEvents.get(event);
-};
-
-export {
- markEvent,
- getEventMark,
-};
diff --git a/packages/base/src/features/F6Navigation.ts b/packages/base/src/features/F6Navigation.ts
index a67b65eb95c2..0d9ccd1bf0aa 100644
--- a/packages/base/src/features/F6Navigation.ts
+++ b/packages/base/src/features/F6Navigation.ts
@@ -39,7 +39,11 @@ class F6Navigation {
}
async groupElementToFocus(nextElement: HTMLElement) {
- const nextElementDomRef = instanceOfUI5Element(nextElement) ? nextElement.getDomRef() : nextElement;
+ let nextElementDomRef = nextElement;
+
+ if (instanceOfUI5Element(nextElement)) {
+ nextElementDomRef = nextElement.getDomRef() || nextElement.firstElementChild as HTMLElement;
+ }
if (nextElementDomRef) {
if (isElementClickable(nextElementDomRef)) {
diff --git a/packages/base/src/util/AriaLabelHelper.ts b/packages/base/src/util/AccessibilityTextsHelper.ts
similarity index 79%
rename from packages/base/src/util/AriaLabelHelper.ts
rename to packages/base/src/util/AccessibilityTextsHelper.ts
index dbf687fa4113..89e11d9e0cba 100644
--- a/packages/base/src/util/AriaLabelHelper.ts
+++ b/packages/base/src/util/AccessibilityTextsHelper.ts
@@ -20,6 +20,8 @@ const registeredElements = new WeakMap();
type AccessibleElement = HTMLElement & {
accessibleNameRef?: string;
accessibleName?: string;
+ accessibleDescriptionRef?: string;
+ accessibleDescription?: string;
};
const observerOptions = {
@@ -49,11 +51,10 @@ const getEffectiveAriaLabelText = (el: HTMLElement) => {
*/
const getAllAccessibleNameRefTexts = (el: HTMLElement) => {
const ids = (el as AccessibleElement).accessibleNameRef?.split(" ") ?? [];
- const owner = el.getRootNode() as HTMLElement;
let result = "";
ids.forEach((elementId: string, index: number) => {
- const element = owner.querySelector(`[id='${elementId}']`);
+ const element = _getReferencedElementById(el, elementId);
const text = `${element && element.textContent ? element.textContent : ""}`;
if (text) {
result += text;
@@ -74,8 +75,12 @@ const _getAllAssociatedElementsFromDOM = (el: UI5Element): Array =>
set.add(itm);
});
// adding other elements that id is the same as accessibleNameRef value
- const value = el["accessibleNameRef" as keyof typeof el] as string;
- const ids = value?.split(" ") ?? [];
+ const ariaLabelledBy = el["accessibleNameRef" as keyof typeof el] as string;
+ const ariaDescribedBy = el["accessibleDescriptionRef" as keyof typeof el] as string;
+
+ const value = [ariaLabelledBy, ariaDescribedBy].filter(Boolean).join(" ");
+
+ const ids = value ? value.split(" ") : [];
ids.forEach(id => {
const refEl = _getReferencedElementById(el, id);
if (refEl) {
@@ -91,7 +96,7 @@ const _getAssociatedLabels = (el: HTMLElement): Array => {
};
const _getReferencedElementById = (el: HTMLElement, elementId: string): HTMLElement | null => {
- return (el.getRootNode() as HTMLElement).querySelector(`[id='${elementId}']`);
+ return (el.getRootNode() as HTMLElement).querySelector(`[id='${elementId}']`) || document.getElementById(elementId);
};
/**
@@ -115,7 +120,9 @@ const getAssociatedLabelForTexts = (el: HTMLElement) => {
const _createInvalidationCallback = (el: UI5Element) => {
const invalidationCallback = (changeInfo: ChangeInfo) => {
- if (!(changeInfo && changeInfo.type === "property" && changeInfo.name === "accessibleNameRef")) {
+ const isAccessibleNameRefChange = changeInfo && changeInfo.type === "property" && changeInfo.name === "accessibleNameRef";
+ const isAccessibleDescriptionRefChange = changeInfo && changeInfo.type === "property" && changeInfo.name === "accessibleDescriptionRef";
+ if (!isAccessibleNameRefChange && !isAccessibleDescriptionRefChange) {
return;
}
const registeredElement = registeredElements.get(el);
@@ -210,10 +217,44 @@ const deregisterUI5Element = (el: UI5Element) => {
registeredElements.delete(el);
};
+const getEffectiveAriaDescriptionText = (el: HTMLElement) => {
+ const accessibleEl = el as AccessibleElement;
+
+ if (!accessibleEl.accessibleDescriptionRef) {
+ if (accessibleEl.accessibleDescription) {
+ return accessibleEl.accessibleDescription;
+ }
+
+ return undefined;
+ }
+
+ return getAllAccessibleDescriptionRefTexts(el);
+};
+
+const getAllAccessibleDescriptionRefTexts = (el: HTMLElement) => {
+ const ids = (el as AccessibleElement).accessibleDescriptionRef?.split(" ") ?? [];
+ let result = "";
+
+ ids.forEach((elementId: string, index: number) => {
+ const element = _getReferencedElementById(el, elementId);
+ const text = `${element && element.textContent ? element.textContent : ""}`;
+ if (text) {
+ result += text;
+ if (index < ids.length - 1) {
+ result += " ";
+ }
+ }
+ });
+
+ return result;
+};
+
export {
getEffectiveAriaLabelText,
getAssociatedLabelForTexts,
registerUI5Element,
deregisterUI5Element,
getAllAccessibleNameRefTexts,
+ getEffectiveAriaDescriptionText,
+ getAllAccessibleDescriptionRefTexts,
};
diff --git a/packages/compat/CHANGELOG.md b/packages/compat/CHANGELOG.md
index 1a67ffda08af..03ce12491566 100644
--- a/packages/compat/CHANGELOG.md
+++ b/packages/compat/CHANGELOG.md
@@ -3,6 +3,52 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [2.5.0-rc.2](https://github.com/SAP/ui5-webcomponents/compare/v2.5.0-rc.1...v2.5.0-rc.2) (2024-11-28)
+
+**Note:** Version bump only for package @ui5/webcomponents-compat
+
+
+
+
+
+# [2.5.0-rc.1](https://github.com/SAP/ui5-webcomponents/compare/v2.5.0-rc.0...v2.5.0-rc.1) (2024-11-21)
+
+
+### Bug Fixes
+
+* **ui5-table:** text cut due to column overflow ([#10193](https://github.com/SAP/ui5-webcomponents/issues/10193)) ([b59d718](https://github.com/SAP/ui5-webcomponents/commit/b59d718dca80bd9a8ee65993ddc2358ecd127024)), closes [#10168](https://github.com/SAP/ui5-webcomponents/issues/10168)
+
+
+
+
+
+# [2.5.0-rc.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.1-rc.0...v2.5.0-rc.0) (2024-11-14)
+
+
+### Features
+
+* **ui5-list, ui5-tree:** support accessible description ([#10131](https://github.com/SAP/ui5-webcomponents/issues/10131)) ([45f0ffe](https://github.com/SAP/ui5-webcomponents/commit/45f0ffeafb2da0ffcaf425649c7440b604e359a3)), closes [#6445](https://github.com/SAP/ui5-webcomponents/issues/6445)
+
+
+
+
+
+## [2.4.1-rc.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0...v2.4.1-rc.0) (2024-11-07)
+
+**Note:** Version bump only for package @ui5/webcomponents-compat
+
+
+
+
+
+# [2.4.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0-rc.4...v2.4.0) (2024-11-03)
+
+**Note:** Version bump only for package @ui5/webcomponents-compat
+
+
+
+
+
# [2.4.0-rc.4](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0-rc.3...v2.4.0-rc.4) (2024-10-31)
**Note:** Version bump only for package @ui5/webcomponents-compat
diff --git a/packages/compat/package.json b/packages/compat/package.json
index 0c032574fe15..dc6ce65c2401 100644
--- a/packages/compat/package.json
+++ b/packages/compat/package.json
@@ -1,6 +1,6 @@
{
"name": "@ui5/webcomponents-compat",
- "version": "2.4.0-rc.4",
+ "version": "2.5.0-rc.2",
"description": "UI5 Web Components: webcomponents.compat",
"ui5": {
"webComponentsPackage": true
@@ -45,13 +45,13 @@
"directory": "packages/compat"
},
"dependencies": {
- "@ui5/webcomponents": "2.4.0-rc.4",
- "@ui5/webcomponents-base": "2.4.0-rc.4",
- "@ui5/webcomponents-icons": "2.4.0-rc.4",
- "@ui5/webcomponents-theming": "2.4.0-rc.4"
+ "@ui5/webcomponents": "2.5.0-rc.2",
+ "@ui5/webcomponents-base": "2.5.0-rc.2",
+ "@ui5/webcomponents-icons": "2.5.0-rc.2",
+ "@ui5/webcomponents-theming": "2.5.0-rc.2"
},
"devDependencies": {
- "@ui5/webcomponents-tools": "2.4.0-rc.4",
- "chromedriver": "^129.0.0"
+ "@ui5/webcomponents-tools": "2.5.0-rc.2",
+ "chromedriver": "^131.0.0"
}
}
diff --git a/packages/compat/src/Table.ts b/packages/compat/src/Table.ts
index 163000ca07b8..81f57ef019d2 100644
--- a/packages/compat/src/Table.ts
+++ b/packages/compat/src/Table.ts
@@ -30,7 +30,7 @@ import {
import getNormalizedTarget from "@ui5/webcomponents-base/dist/util/getNormalizedTarget.js";
import getActiveElement from "@ui5/webcomponents-base/dist/util/getActiveElement.js";
import { getLastTabbableElement, getTabbableElements } from "@ui5/webcomponents-base/dist/util/TabbableElements.js";
-import { getEffectiveAriaLabelText } from "@ui5/webcomponents-base/dist/util/AriaLabelHelper.js";
+import { getEffectiveAriaLabelText } from "@ui5/webcomponents-base/dist/util/AccessibilityTextsHelper.js";
import debounce from "@ui5/webcomponents-base/dist/util/debounce.js";
import BusyIndicator from "@ui5/webcomponents/dist/BusyIndicator.js";
import CheckBox from "@ui5/webcomponents/dist/CheckBox.js";
diff --git a/packages/compat/src/themes/Table.css b/packages/compat/src/themes/Table.css
index edeae057af64..1c17ab63aa21 100644
--- a/packages/compat/src/themes/Table.css
+++ b/packages/compat/src/themes/Table.css
@@ -10,13 +10,17 @@
border-bottom: var(--ui5_table_bottom_border);
}
-.ui5-table-root,
-.ui5-table-busy-indicator {
+.ui5-table-root {
width: 100%;
height: 100%;
+ display: flex;
box-sizing: border-box;
}
+.ui5-table-busy-indicator {
+ flex-grow: 1;
+}
+
table {
width: 100%;
border-spacing: 0;
diff --git a/packages/create-package/CHANGELOG.md b/packages/create-package/CHANGELOG.md
index 32bc61e45a5d..3b679f8be867 100644
--- a/packages/create-package/CHANGELOG.md
+++ b/packages/create-package/CHANGELOG.md
@@ -3,6 +3,46 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [2.5.0-rc.2](https://github.com/SAP/ui5-webcomponents/compare/v2.5.0-rc.1...v2.5.0-rc.2) (2024-11-28)
+
+**Note:** Version bump only for package @ui5/create-webcomponents-package
+
+
+
+
+
+# [2.5.0-rc.1](https://github.com/SAP/ui5-webcomponents/compare/v2.5.0-rc.0...v2.5.0-rc.1) (2024-11-21)
+
+**Note:** Version bump only for package @ui5/create-webcomponents-package
+
+
+
+
+
+# [2.5.0-rc.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.1-rc.0...v2.5.0-rc.0) (2024-11-14)
+
+**Note:** Version bump only for package @ui5/create-webcomponents-package
+
+
+
+
+
+## [2.4.1-rc.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0...v2.4.1-rc.0) (2024-11-07)
+
+**Note:** Version bump only for package @ui5/create-webcomponents-package
+
+
+
+
+
+# [2.4.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0-rc.4...v2.4.0) (2024-11-03)
+
+**Note:** Version bump only for package @ui5/create-webcomponents-package
+
+
+
+
+
# [2.4.0-rc.4](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0-rc.3...v2.4.0-rc.4) (2024-10-31)
**Note:** Version bump only for package @ui5/create-webcomponents-package
diff --git a/packages/create-package/package.json b/packages/create-package/package.json
index 7d5ab1f41de0..12c6e4ebe1d5 100644
--- a/packages/create-package/package.json
+++ b/packages/create-package/package.json
@@ -1,6 +1,6 @@
{
"name": "@ui5/create-webcomponents-package",
- "version": "2.4.0-rc.4",
+ "version": "2.5.0-rc.2",
"description": "UI5 Web Components: create package",
"author": "SAP SE (https://www.sap.com)",
"license": "Apache-2.0",
diff --git a/packages/fiori/CHANGELOG.md b/packages/fiori/CHANGELOG.md
index 9dfa63508b4f..5853739908fa 100644
--- a/packages/fiori/CHANGELOG.md
+++ b/packages/fiori/CHANGELOG.md
@@ -3,6 +3,62 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [2.5.0-rc.2](https://github.com/SAP/ui5-webcomponents/compare/v2.5.0-rc.1...v2.5.0-rc.2) (2024-11-28)
+
+
+### Bug Fixes
+
+* **ui5-wizard:** stacked Wizard Steps are aligned properly ([#10250](https://github.com/SAP/ui5-webcomponents/issues/10250)) ([3473fbf](https://github.com/SAP/ui5-webcomponents/commit/3473fbf7dd6f97d0de70a540d412c36901455926)), closes [#9779](https://github.com/SAP/ui5-webcomponents/issues/9779)
+
+
+
+
+
+# [2.5.0-rc.1](https://github.com/SAP/ui5-webcomponents/compare/v2.5.0-rc.0...v2.5.0-rc.1) (2024-11-21)
+
+**Note:** Version bump only for package @ui5/webcomponents-fiori
+
+
+
+
+
+# [2.5.0-rc.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.1-rc.0...v2.5.0-rc.0) (2024-11-14)
+
+
+### Bug Fixes
+
+* **ui5-dynamic-page:** move subheading slot outside the title wrapper ([#10163](https://github.com/SAP/ui5-webcomponents/issues/10163)) ([6466b8a](https://github.com/SAP/ui5-webcomponents/commit/6466b8ad7f73c85a5c105dea3c196f6bfb78f27a))
+
+
+### Features
+
+* **ui5-list, ui5-tree:** support accessible description ([#10131](https://github.com/SAP/ui5-webcomponents/issues/10131)) ([45f0ffe](https://github.com/SAP/ui5-webcomponents/commit/45f0ffeafb2da0ffcaf425649c7440b604e359a3)), closes [#6445](https://github.com/SAP/ui5-webcomponents/issues/6445)
+
+
+
+
+
+## [2.4.1-rc.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0...v2.4.1-rc.0) (2024-11-07)
+
+**Note:** Version bump only for package @ui5/webcomponents-fiori
+
+
+
+
+
+# [2.4.0](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0-rc.4...v2.4.0) (2024-11-03)
+
+
+### Bug Fixes
+
+* **ui5-dynamic-page:** improve scrolling smoothness ([#10093](https://github.com/SAP/ui5-webcomponents/issues/10093)) ([d1420b0](https://github.com/SAP/ui5-webcomponents/commit/d1420b0be2c40ca649503cca0715e4c529929f8f)), closes [#10011](https://github.com/SAP/ui5-webcomponents/issues/10011)
+* **ui5-dynamic-page:** prevent unwanted header toggle from scroll ([#10007](https://github.com/SAP/ui5-webcomponents/issues/10007)) ([7a7d00c](https://github.com/SAP/ui5-webcomponents/commit/7a7d00c0d615283d1a86d775b6c51db7feadfb42))
+* **ui5-media-gallery:** clear selected thumbnail on item removal ([#10087](https://github.com/SAP/ui5-webcomponents/issues/10087)) ([af4cadb](https://github.com/SAP/ui5-webcomponents/commit/af4cadbfb637c1a6440aa0bd1fc516629ae332ae))
+
+
+
+
+
# [2.4.0-rc.4](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0-rc.3...v2.4.0-rc.4) (2024-10-31)
diff --git a/packages/fiori/global.d.ts b/packages/fiori/global.d.ts
index 086bbcda9800..28c472a4133f 100644
--- a/packages/fiori/global.d.ts
+++ b/packages/fiori/global.d.ts
@@ -1,5 +1,4 @@
-// eslint-disable-next-line
-import type { BrowserMultiFormatReader, NotFoundException } from "@zxing/library/esm5/index.js";
+import type { BrowserMultiFormatReader, NotFoundException } from "@zxing/library";
export {};
diff --git a/packages/fiori/package.json b/packages/fiori/package.json
index d6331774b73d..c3fd2eb9eb38 100644
--- a/packages/fiori/package.json
+++ b/packages/fiori/package.json
@@ -1,6 +1,6 @@
{
"name": "@ui5/webcomponents-fiori",
- "version": "2.4.0-rc.4",
+ "version": "2.5.0-rc.2",
"description": "UI5 Web Components: webcomponents.fiori",
"ui5": {
"webComponentsPackage": true
@@ -53,15 +53,15 @@
"directory": "packages/fiori"
},
"dependencies": {
- "@ui5/webcomponents": "2.4.0-rc.4",
- "@ui5/webcomponents-base": "2.4.0-rc.4",
- "@ui5/webcomponents-icons": "2.4.0-rc.4",
- "@ui5/webcomponents-theming": "2.4.0-rc.4",
- "@zxing/library": "^0.17.1"
+ "@ui5/webcomponents": "2.5.0-rc.2",
+ "@ui5/webcomponents-base": "2.5.0-rc.2",
+ "@ui5/webcomponents-icons": "2.5.0-rc.2",
+ "@ui5/webcomponents-theming": "2.5.0-rc.2",
+ "@zxing/library": "^0.21.3"
},
"devDependencies": {
- "@ui5/webcomponents-tools": "2.4.0-rc.4",
- "chromedriver": "^129.0.0",
+ "@ui5/webcomponents-tools": "2.5.0-rc.2",
+ "chromedriver": "^131.0.0",
"lit": "^2.0.0"
}
}
diff --git a/packages/fiori/src/BarcodeScannerDialog-zxing.d.ts b/packages/fiori/src/BarcodeScannerDialog-zxing.d.ts
index 9c36669472f9..25f3cb9a4a9b 100644
--- a/packages/fiori/src/BarcodeScannerDialog-zxing.d.ts
+++ b/packages/fiori/src/BarcodeScannerDialog-zxing.d.ts
@@ -1,5 +1,5 @@
declare module "@zxing/library/umd/index.min.js" {
- import type { BrowserMultiFormatReader as BrowserMultiFormatReaderT, NotFoundException as NotFoundExceptionT } from "@zxing/library/esm5/index.js";
+ import type { BrowserMultiFormatReader as BrowserMultiFormatReaderT, NotFoundException as NotFoundExceptionT } from "@zxing/library";
export const BrowserMultiFormatReader: typeof BrowserMultiFormatReaderT;
export const NotFoundException: typeof NotFoundExceptionT;
diff --git a/packages/fiori/src/BarcodeScannerDialog.ts b/packages/fiori/src/BarcodeScannerDialog.ts
index 63253391eef6..db1610138b64 100644
--- a/packages/fiori/src/BarcodeScannerDialog.ts
+++ b/packages/fiori/src/BarcodeScannerDialog.ts
@@ -10,7 +10,7 @@ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
import event from "@ui5/webcomponents-base/dist/decorators/event.js";
import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
import { getI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js";
-import type { Result, Exception } from "@zxing/library/esm5/index.js";
+import type { Result, Exception } from "@zxing/library";
import type { Interval } from "@ui5/webcomponents-base/dist/types.js";
// eslint-disable-next-line import/no-extraneous-dependencies
import ZXing from "@ui5/webcomponents-fiori/dist/ssr-zxing.js";
diff --git a/packages/fiori/src/DynamicPage.ts b/packages/fiori/src/DynamicPage.ts
index 44b71c969420..2c536f9f09e7 100644
--- a/packages/fiori/src/DynamicPage.ts
+++ b/packages/fiori/src/DynamicPage.ts
@@ -195,6 +195,7 @@ class DynamicPage extends UI5Element {
skipSnapOnScroll = false;
showHeaderInStickArea = false;
+ isToggled = false;
@property({ type: Boolean })
_headerSnapped = false;
@@ -226,6 +227,7 @@ class DynamicPage extends UI5Element {
this.dynamicPageTitle.snapped = this._headerSnapped;
this.dynamicPageTitle.interactive = this.hasHeading;
this.dynamicPageTitle.hasSnappedTitleOnMobile = !!this.hasSnappedTitleOnMobile;
+ this.dynamicPageTitle.removeAttribute("hovered");
}
}
@@ -246,7 +248,7 @@ class DynamicPage extends UI5Element {
}
get headerInContent(): boolean {
- return !this.showHeaderInStickArea && !this.headerInTitle;
+ return !this.showHeaderInStickArea && !this.headerInTitle && !this.hasSnappedTitleOnMobile;
}
get _headerLabel() {
@@ -307,29 +309,48 @@ class DynamicPage extends UI5Element {
return;
}
- const scrollTop = this.scrollContainer!.scrollTop;
- const lastHeaderSnapped = this._headerSnapped;
+ if (this.isToggled) {
+ this.isToggled = false;
+ return;
+ }
if (this.skipSnapOnScroll) {
this.skipSnapOnScroll = false;
return;
}
- if (scrollTop > this.dynamicPageHeader.getBoundingClientRect().height) {
+ const scrollTop = this.scrollContainer!.scrollTop;
+ const headerHeight = this.dynamicPageHeader.getBoundingClientRect().height;
+ const lastHeaderSnapped = this._headerSnapped;
+
+ const shouldSnap = !this._headerSnapped && scrollTop > headerHeight + SCROLL_THRESHOLD;
+ const shouldExpand = this._headerSnapped && (scrollTop < headerHeight - SCROLL_THRESHOLD
+ || (!scrollTop && !headerHeight));
+
+ if (shouldSnap) {
this.showHeaderInStickArea = false;
this._headerSnapped = true;
- } else {
+
+ //* snappedTitleOnMobile
+ // If the header is snapped and the scroll is at the top, scroll down a bit
+ // to avoid ending in an endless loop of snapping and unsnapping
+ requestAnimationFrame(() => {
+ if (this.scrollContainer!.scrollTop === 0) {
+ this.scrollContainer!.scrollTop = SCROLL_THRESHOLD;
+ }
+ });
+ } else if (shouldExpand) {
this._headerSnapped = false;
}
+ // Fire event if snapped state changed
if (lastHeaderSnapped !== this._headerSnapped) {
this.fireDecoratorEvent("title-toggle");
}
-
- this.dynamicPageTitle.snapped = this._headerSnapped;
}
async onExpandClick() {
+ this.isToggled = true;
this._toggleHeader();
this.fireDecoratorEvent("title-toggle");
await renderFinished();
@@ -353,6 +374,7 @@ class DynamicPage extends UI5Element {
if (!this.hasHeading) {
return;
}
+ this.isToggled = true;
this._toggleHeader();
this.fireDecoratorEvent("title-toggle");
await renderFinished();
@@ -360,6 +382,21 @@ class DynamicPage extends UI5Element {
}
async _toggleHeader() {
+ const headerHeight = this.dynamicPageHeader?.getBoundingClientRect().height || 0;
+ const currentScrollTop = this.scrollContainer!.scrollTop;
+
+ if (currentScrollTop > SCROLL_THRESHOLD && currentScrollTop < headerHeight) {
+ if (!this._headerSnapped) {
+ this._headerSnapped = true;
+ this.showHeaderInStickArea = true;
+ this.scrollContainer!.scrollTop = 0;
+ } else {
+ this.showHeaderInStickArea = false;
+ this._headerSnapped = false;
+ }
+ return;
+ }
+
if (this.scrollContainer!.scrollTop === SCROLL_THRESHOLD) {
this.scrollContainer!.scrollTop = 0;
}
diff --git a/packages/fiori/src/DynamicPageTitle.hbs b/packages/fiori/src/DynamicPageTitle.hbs
index 1eb5cb334f2a..7ff15ce277ea 100644
--- a/packages/fiori/src/DynamicPageTitle.hbs
+++ b/packages/fiori/src/DynamicPageTitle.hbs
@@ -28,7 +28,6 @@
@ui5-_min-content-width-change={{onMinContentWidthChange}}>
-
{{#if hasContent}}
@@ -49,7 +48,7 @@
{{/unless}}
-
+
{{/if}}
{{_ariaDescribedbyText}}
diff --git a/packages/fiori/src/IllustratedMessage.ts b/packages/fiori/src/IllustratedMessage.ts
index 0e51b6e9c2eb..20a5fa04f6f4 100644
--- a/packages/fiori/src/IllustratedMessage.ts
+++ b/packages/fiori/src/IllustratedMessage.ts
@@ -6,7 +6,7 @@ import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
import type { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
import { getIllustrationDataSync, getIllustrationData } from "@ui5/webcomponents-base/dist/asset-registries/Illustrations.js";
-import { getEffectiveAriaLabelText } from "@ui5/webcomponents-base/dist/util/AriaLabelHelper.js";
+import { getEffectiveAriaLabelText } from "@ui5/webcomponents-base/dist/util/AccessibilityTextsHelper.js";
import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
import Title from "@ui5/webcomponents/dist/Title.js";
import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
diff --git a/packages/fiori/src/NotificationListGroupList.ts b/packages/fiori/src/NotificationListGroupList.ts
index 96822f360f6e..49d2d555a390 100644
--- a/packages/fiori/src/NotificationListGroupList.ts
+++ b/packages/fiori/src/NotificationListGroupList.ts
@@ -31,6 +31,10 @@ class NotificationListGroupList extends List {
onItemFocused() {
}
+ _onfocusin(e: FocusEvent) {
+ e.stopImmediatePropagation();
+ }
+
focusItem(item: ListItemBase) {
item.focus();
}
diff --git a/packages/fiori/src/SideNavigation.ts b/packages/fiori/src/SideNavigation.ts
index c5c88e399805..09e5c1391dd2 100644
--- a/packages/fiori/src/SideNavigation.ts
+++ b/packages/fiori/src/SideNavigation.ts
@@ -82,6 +82,10 @@ type NavigationMenuClickEventDetail = MenuItemClickEventDetail & {
* The items can consist of text only or an icon with text. The use or non-use of icons must be consistent for all items on one level.
* You must not combine entries with and without icons on the same level. We strongly recommend that you do not use icons on the second level.
*
+ * The `ui5-side-navigation` component is intended for use within an `ui5-navigation-layout` component.
+ * While it can function independently, it is recommended to use it with
+ * the `ui5-navigation-layout` for optimal user experience.
+ *
* ### Keyboard Handling
*
* ### Fast Navigation
@@ -146,25 +150,22 @@ class SideNavigation extends UI5Element {
collapsed = false;
/**
- * Defines the main items of the `ui5-side-navigation`. Use the `ui5-side-navigation-item` component
- * for the top-level items, and the `ui5-side-navigation-sub-item` component for second-level items, nested
- * inside the items.
+ * Defines the main items of the component.
*
* @public
*/
@slot({ type: HTMLElement, invalidateOnChildChange: true, "default": true })
- items!: Array;
+ items!: Array;
/**
- * Defines the fixed items at the bottom of the `ui5-side-navigation`. Use the `ui5-side-navigation-item` component
- * for the fixed items, and optionally the `ui5-side-navigation-sub-item` component to provide second-level items inside them.
+ * Defines the fixed items at the bottom of the component.
*
* **Note:** In order to achieve the best user experience, it is recommended that you keep the fixed items "flat" (do not pass sub-items)
*
* @public
*/
@slot({ type: HTMLElement, invalidateOnChildChange: true })
- fixedItems!: Array;
+ fixedItems!: Array;
/**
* Defines the header of the `ui5-side-navigation`.
@@ -226,7 +227,7 @@ class SideNavigation extends UI5Element {
onBeforeRendering() {
super.onBeforeRendering();
- this._getAllItems(this.items as Array).concat(this._getAllItems(this.fixedItems as Array)).forEach(item => {
+ this._getAllItems(this.items).concat(this._getAllItems(this.fixedItems)).forEach(item => {
item.sideNavCollapsed = this.collapsed;
item.inPopover = this.inPopover;
item.sideNavigation = this;
@@ -238,7 +239,7 @@ class SideNavigation extends UI5Element {
// item navigation index should be managed, because items are
// dynamically recreated and tabIndexes are not updated
const tree = this.getPickerTree();
- const selectedItem = tree._findSelectedItem(tree.items as Array);
+ const selectedItem = tree._findSelectedItem(tree.items);
if (selectedItem) {
selectedItem.focus();
} else {
@@ -386,11 +387,11 @@ class SideNavigation extends UI5Element {
}
getEnabledFixedItems() : Array {
- return this.getEnabledItems(this.fixedItems as Array);
+ return this.getEnabledItems(this.fixedItems);
}
getEnabledFlexibleItems() : Array {
- const items = this.getEnabledItems(this.items as Array);
+ const items = this.getEnabledItems(this.items);
if (this._overflowItem) {
items.push(this._overflowItem);
@@ -425,12 +426,12 @@ class SideNavigation extends UI5Element {
onAfterRendering() {
if (!this.getDomRef()?.matches(":focus-within")) {
- let selectedItem = this._findSelectedItem(this.items as Array);
+ let selectedItem = this._findSelectedItem(this.items);
if (selectedItem) {
this._flexibleItemNavigation.setCurrentItem(selectedItem);
}
- selectedItem = this._findSelectedItem(this.fixedItems as Array);
+ selectedItem = this._findSelectedItem(this.fixedItems);
if (selectedItem) {
this._fixedItemNavigation.setCurrentItem(selectedItem);
}
@@ -549,7 +550,7 @@ class SideNavigation extends UI5Element {
}
get overflowItems() : Array {
- return (this.items as Array).reduce((result, item) => {
+ return (this.items).reduce((result, item) => {
return result.concat(item.overflowItems);
}, new Array());
}
@@ -609,8 +610,8 @@ class SideNavigation extends UI5Element {
return;
}
- let items = this._getSelectableItems(this.items as Array);
- items = items.concat(this._getSelectableItems(this.fixedItems as Array));
+ let items = this._getSelectableItems(this.items);
+ items = items.concat(this._getSelectableItems(this.fixedItems));
items.forEach(current => {
current.selected = false;
diff --git a/packages/fiori/src/WizardTab.hbs b/packages/fiori/src/WizardTab.hbs
index a944fd611b87..d523590c48d7 100644
--- a/packages/fiori/src/WizardTab.hbs
+++ b/packages/fiori/src/WizardTab.hbs
@@ -20,7 +20,9 @@
{{#if hasTexts}}
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+
+
+
Item 1
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+
+
+
Item 2
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+
+
+
Item 3
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+
+
+
Item 4
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+
+
+
Item 5
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+
+
+
Item 6
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+
+
+
Item 7
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+
+
+
Sub Item 1
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+
+
+
Sub Item 2
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+ Sed fermentum, mi et tristique ullamcorper, sapien sapien faucibus
+ sem, quis pretium nibh lorem malesuada diam. Nulla quis arcu aliquet,
+ feugiat massa semper, volutpat diam. Nam vitae ante posuere, molestie
+ neque sit amet, dapibus velit. Maecenas eleifend tempor lorem. Mauris
+ vitae elementum mi, sed eleifend ligula. Nulla tempor vulputate dolor,
+ nec dignissim quam convallis ut. Praesent vitae commodo felis, ut
+ iaculis felis. Fusce quis eleifend sapien, eget facilisis nibh.
+ Suspendisse est velit, scelerisque ut commodo eget, dignissim quis
+ metus. Cras faucibus consequat gravida. Curabitur vitae quam felis.
+ Phasellus ac leo eleifend, commodo tortor et, varius quam. Aliquam
+ erat volutpat.
+
+
+
+
Content for Overview step.
+
+
+
+
Content for Details step.
+
+
+
+
Content for Specifications and Requirements step.
+
+
+
+
+ Content for User Instructions and Guidelines for Installation step.
+
+
+
+
+
Content for Testing step.
+
+
+
+
Content for Validation step.
+
+
+
+
Content for Deployment Plan step.
+
+
+
+
Content for Maintenance and Support Overview step.
+
+
+
+
Content for Feedback and Improvements step.
+
+
+
+
+ Content for Final Review and Conclusion for the Entire Process step.
+