Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
7e69f2e
fix(core/content-header): Fix responsive content-header behavior
dmytro-halimov Aug 6, 2026
6da019f
fix(core/content-header): Update snapshots
dmytro-halimov Aug 6, 2026
f5f7a05
fix(core/content-header): Apply CSS token instea of a hardcoded value
dmytro-halimov Aug 7, 2026
f0f363b
test(core/content-header): restore and align test layouts
nuke-ellington Aug 13, 2026
ddc4e7a
Merge branch 'main' into fix/content-header-responsive-fix
nuke-ellington Aug 13, 2026
6239554
refactor(core/content-header): rename property value
nuke-ellington Aug 13, 2026
6984ca0
docs(core/content-header): rename to match property name
nuke-ellington Aug 13, 2026
fb3f42f
docs(core/content-header): udpate example text and add story
nuke-ellington Aug 13, 2026
80741de
refactor(core-content-header): Improvements after review
dmytro-halimov Aug 13, 2026
ae28d01
Merge branch 'main' into fix/content-header-responsive-fix
dmytro-halimov Aug 14, 2026
7da3680
chore(core/content-header): Adjust changes for V6
dmytro-halimov Aug 14, 2026
37da7cb
docs(core/content-header): restore basic example text
dmytro-halimov Aug 14, 2026
28205fc
test(content-header): align accessibility snapshot with basic example
dmytro-halimov Aug 14, 2026
501e135
Merge branch 'main' into fix/content-header-responsive-fix
dmytro-halimov Aug 14, 2026
b6b4a25
refactor(core/content-header): Improvements after review
dmytro-halimov Aug 17, 2026
a34ecd0
Merge branch 'main' into fix/content-header-responsive-fix
dmytro-halimov Aug 17, 2026
7ff6d27
chore(core/content-header): Update build
dmytro-halimov Aug 18, 2026
c02a692
docs(core): fix lint issues in V5 migration guide
dmytro-halimov Aug 18, 2026
94e7b58
test(core/content-header): use safe bounding box checks
dmytro-halimov Aug 18, 2026
9abf6f0
Merge branch 'main' into fix/content-header-responsive-fix
alexkaduk Aug 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .changeset/content-header-responsive-text.md

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have come to the conclusion, that this can be considered a visual breaking change.
Therefore we should push this to V6. Please adapt PR accordingly.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@siemens/ix': major
'@siemens/ix-angular': major
'@siemens/ix-react': major
'@siemens/ix-vue': major
---

**Breaking change:** `ix-content-header` titles and subtitles now wrap by default. Set `textOverflow="ellipsis"` to preserve the previous single-line ellipsis behavior without native tooltips.
1 change: 1 addition & 0 deletions BREAKING_CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ This document aims to provide a clear and detailed overview of all significant m

Please select your target version

- [Version v6.0.0](./BREAKING_CHANGES/v6.md)
- [Version v5.0.0](./BREAKING_CHANGES/v5.md)
- [Version v4.0.0](./BREAKING_CHANGES/v4.md)
- [Version v3.0.0](./BREAKING_CHANGES/v3.md)
Expand Down
54 changes: 27 additions & 27 deletions BREAKING_CHANGES/v5.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ The following previously deprecated components, properties, and overloads are re
| Removed | Replacement |
| ----------------------- | ---------------------------------------- |
| `ix-input-group` | `ix-input` (or another form-ready input) |
| `ix-validation-tooltip` | `ix-input` / `ix-select` validation text |
| `ix-validation-tooltip` | `ix-input` / `ix-select` validation text |
| `ix-drawer` | `ix-pane` |

### Migrate from `ix-input-group`
Expand Down Expand Up @@ -188,12 +188,12 @@ Invalid messages are rendered through `ix-field-wrapper` (icon + message below t

### Removed properties

| Component | Removed property | Replacement |
| ----------------------- | -------------------------------- | ------------------------------------------------------------------------- |
| `ix-application-header` | `ariaLabelMenuExpandIconButton` | Not needed (menu expand control is not exposed to assistive technologies) |
| `ix-avatar` | `a11yLabel` | Host `aria-label` |
| `ix-breadcrumb-item` | `ariaLabelButton` | Host `aria-label` |
| `ix-select` | `ariaLabelChevronDownIconButton` | Not needed (chevron control is not in the accessibility tree) |
| Component | Removed property | Replacement |
| ----------------------- | -------------------------------- | ------------------------------------------------------------------------------------ |
| `ix-application-header` | `ariaLabelMenuExpandIconButton` | Not needed (menu expand control is not exposed to assistive technologies) |
| `ix-avatar` | `a11yLabel` | Host `aria-label` |
| `ix-breadcrumb-item` | `ariaLabelButton` | Host `aria-label` |
| `ix-select` | `ariaLabelChevronDownIconButton` | Not needed (chevron control is not in the accessibility tree) |
| `ix-slider` | `error` | `class="ix-invalid"` and `invalid-text` (invalid message uses field-wrapper styling) |

### Removed util overload
Expand All @@ -220,7 +220,7 @@ Breadcrumb items now require a stable `breadcrumbKey`. Breadcrumb click events u
| `nextItems = ['Next item']` | `nextItems = [{ label: 'Next item', breadcrumbKey: 'next-item' }]` |
| Click events emitted a label string | Click events emit `{ breadcrumbKey, label }` |

### Before
### `ix-breadcrumb` before

```html
<ix-breadcrumb>
Expand All @@ -233,7 +233,7 @@ Breadcrumb items now require a stable `breadcrumbKey`. Breadcrumb click events u
breadcrumb.nextItems = ['Next item'];
```

### After
### `ix-breadcrumb` after

```html
<ix-breadcrumb>
Expand All @@ -249,7 +249,7 @@ breadcrumb.nextItems = [{ label: 'Next item', breadcrumbKey: 'next-item' }];
TypeScript consumers can use the exported `BreadcrumbClick` type for breadcrumb
click payloads and `nextItems` entries.

### Migration rules
### `ix-breadcrumb` migration rules

1. Add a unique `breadcrumbKey`/`breadcrumb-key` value to every `ix-breadcrumb-item`.
2. Replace every string entry in `nextItems` with an object containing `label` and `breadcrumbKey`.
Expand All @@ -261,15 +261,15 @@ The show-all button and show-more card now reveal all hidden cards by default in

If your application handled `showAllClick` or `showMoreCardClick` to implement custom behavior and expects IX to leave card visibility unchanged, call `preventDefault()` on the event.

### Before
### `ix-card-list` before

```ts
cardList.addEventListener('showAllClick', (event) => {
openCustomListView(event.detail.nativeEvent);
});
```

### After
### `ix-card-list` after

```ts
cardList.addEventListener('showAllClick', (event) => {
Expand Down Expand Up @@ -317,9 +317,9 @@ Use this section as the single source of truth for all V5 theming updates.
1. Remove all theme classes in the form `theme-<theme>-<schema>` from `<html>` and `<body>`.
2. Convert each legacy class `theme-<theme>-<schema>` to:

```html
<html data-ix-theme="<theme>" data-ix-color-schema="<schema>"></html>
```
```html
<html data-ix-theme="<theme>" data-ix-color-schema="<schema>"></html>
```

3. Never set only one of `data-ix-theme` or `data-ix-color-schema`. Set both together.
4. Treat `theme`, `colorSchema`, and `mode` as separate concepts:
Expand Down Expand Up @@ -487,7 +487,7 @@ The JavaScript **`showModal(config)`** API (and framework helpers built on it) u
| `keyboard` | Remove from config. Escape / dismiss behavior is not controlled by this flag; use **`beforeDismiss`** on **`ix-modal`** / config when you need to veto dismissal. |
| `title` | Remove from config. Set a title in your modal **content** (e.g. **`ix-modal-header`** and slotted markup) instead. |

### Before
### `ModalConfig` before

```ts
import { showModal } from '@siemens/ix';
Expand All @@ -500,7 +500,7 @@ await showModal({
});
```

### After
### `ModalConfig` after

```ts
import { showModal } from '@siemens/ix';
Expand All @@ -510,7 +510,7 @@ await showModal({
});
```

### Migration rules
### `ModalConfig` migration rules

1. Delete **`container`**, **`keyboard`**, and **`title`** from every **`showModal`** / **`ModalConfig`** object.
2. Rely on modal **content** (and **`ix-modal-header`**) for titles.
Expand All @@ -522,7 +522,7 @@ await showModal({

For Angular consumers only, `LoadingService.showModalLoading()` has the same return type change.

### Before
### `showModalLoading()` before

```ts
const loading = showModalLoading({ message: 'Loading...' });
Expand All @@ -531,7 +531,7 @@ loading.update('Still loading...');
loading.finish('Done');
```

### After
### `showModalLoading()` after

```ts
const loading = await showModalLoading({ message: 'Loading...' });
Expand All @@ -546,7 +546,7 @@ The same migration applies to `showModalLoading()` from `@siemens/ix-react` and

`@siemens/ix-aggrid` now declares `@siemens/ix` as a peer dependency instead of installing it transitively. Applications that use the AG Grid theme must add `@siemens/ix` to their own dependencies so IX CSS imports and related assets resolve explicitly from the app.

### Before
### `ix-aggrid` before

```json
{
Expand All @@ -556,7 +556,7 @@ The same migration applies to `showModalLoading()` from `@siemens/ix-react` and
}
```

### After
### `ix-aggrid` after

```json
{
Expand All @@ -567,7 +567,7 @@ The same migration applies to `showModalLoading()` from `@siemens/ix-react` and
}
```

### Migration rules
### `ix-aggrid` migration rules

1. Add `@siemens/ix` to the application package that consumes `@siemens/ix-aggrid`.
2. Keep the installed `@siemens/ix` version within the peer dependency range required by `@siemens/ix-aggrid`.
Expand Down Expand Up @@ -670,7 +670,7 @@ tabs.addEventListener('selectedChange', (e) => handleTab(e.detail)); // index: 0
tabs.addEventListener('tabChange', (e) => handleTab(e.detail)); // key: 'tab-1', 'tab-2'
```

### Validation checklist
### `ix-tabs` validation checklist

1. No remaining `selected` prop usage on `ix-tabs`.
2. Every `ix-tab-item` has a unique `tab-key` attribute.
Expand All @@ -694,7 +694,7 @@ tabs.addEventListener('tabChange', (e) => handleTab(e.detail)); // key: 'tab-1',
| `ix-menu-about` | `suppressLegacyTabs` | Opts into the slotted `ix-tabs` integration path |
| `ix-menu-settings` | `suppressLegacyTabs` | Opts into the slotted `ix-tabs` integration path |

### New required props
### New required menu props

| Component | Prop | Description |
| ----------------------- | -------- | ------------------------------------- |
Expand All @@ -711,7 +711,7 @@ tabs.addEventListener('tabChange', (e) => handleTab(e.detail)); // key: 'tab-1',

`ix-menu-about-item` changed from `shadow: true` to `shadow: false`. If you targeted internal elements via `::part()` or shadow DOM queries, update to plain CSS selectors.

### Migration
### Menu tabs migration

```html
<!-- Before -->
Expand Down Expand Up @@ -780,7 +780,7 @@ tabs.addEventListener('tabChange', (e) => handleTab(e.detail)); // key: 'tab-1',
<ix-menu-about-news active-about-tab-key="tab-1"> News content </ix-menu-about-news>
```

### Validation checklist
### Menu tabs validation checklist

1. No remaining `active-tab-label` usage on `ix-menu-about` โ€” use `active-tab-key`.
2. Slotted `ix-tabs` integrations set `suppress-legacy-tabs` on the parent menu component.
Expand Down
19 changes: 19 additions & 0 deletions BREAKING_CHANGES/v6.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Breaking Changes V6

This document lists breaking changes introduced in Siemens Industrial Experience V6.

## Content header text wraps by default

`ix-content-header` titles and subtitles now wrap when horizontal space is limited. Previously, they remained on a single line and used an ellipsis for overflowing text.

To preserve the previous single-line behavior, set `text-overflow="ellipsis"`:

```html
<ix-content-header header-title="Content title" header-subtitle="Supporting context" text-overflow="ellipsis"></ix-content-header>
```

Ellipsis visually truncates the text without adding a tooltip. Keep the default wrapping behavior when the complete text must remain visible.

### Validation checklist

1. Every `ix-content-header` that must remain single-line uses `text-overflow="ellipsis"`.
4 changes: 4 additions & 0 deletions packages/angular-standalone-test-app/src/app/app.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,10 @@ export const routePaths: IxPreviewRoutes = {
import('../preview-examples/content-header').then((m) => m.default),
'preview/content-header-no-back': () =>
import('../preview-examples/content-header-no-back').then((m) => m.default),
'preview/content-header-text-overflow': () =>
import('../preview-examples/content-header-text-overflow').then(
(m) => m.default
),
'preview/content-header-with-slot': () =>
import('../preview-examples/content-header-with-slot').then(
(m) => m.default
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<!--
SPDX-FileCopyrightText: 2026 Siemens AG

SPDX-License-Identifier: MIT

This source code is licensed under the MIT license found in the
LICENSE file in the root directory of this source tree.
-->

<ix-content-header
hasBackButton
headerTitle="Content title that remains compact when horizontal space is limited"
headerSubtitle="Supporting context is truncated independently when space is limited"
textOverflow="ellipsis"
>
<ix-button variant="tertiary">Button1</ix-button>
<ix-button variant="tertiary">Button2</ix-button>
<ix-button variant="tertiary">Button3</ix-button>
</ix-content-header>
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: 2026 Siemens AG
*
* SPDX-License-Identifier: MIT
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

import { Component } from '@angular/core';
import { IxButton, IxContentHeader } from '@siemens/ix-angular/standalone';

@Component({
selector: 'app-example',
imports: [IxContentHeader, IxButton],
templateUrl: './content-header-text-overflow.html',
})
export default class ContentHeaderTextOverflow {}
5 changes: 5 additions & 0 deletions packages/angular-test-app/src/app/app-routing.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ import Chip from '../preview-examples/chip';
import ContentExample from '../preview-examples/content';
import ContentHeader from '../preview-examples/content-header';
import ContentHeaderNoBack from '../preview-examples/content-header-no-back';
import ContentHeaderTextOverflow from '../preview-examples/content-header-text-overflow';
import ContentHeaderWithSlot from '../preview-examples/content-header-with-slot';
import CustomField from '../preview-examples/custom-field';
import CustomFieldValidation from '../preview-examples/custom-field-validation';
Expand Down Expand Up @@ -552,6 +553,10 @@ const routes: Routes = [
path: 'content-header',
component: ContentHeader,
},
{
path: 'content-header-text-overflow',
component: ContentHeaderTextOverflow,
},
{
path: 'content-header-with-slot',
component: ContentHeaderWithSlot,
Expand Down
2 changes: 2 additions & 0 deletions packages/angular-test-app/src/app/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ import Chip from '../preview-examples/chip';
import ContentExample from '../preview-examples/content';
import ContentHeader from '../preview-examples/content-header';
import ContentHeaderNoBack from '../preview-examples/content-header-no-back';
import ContentHeaderTextOverflow from '../preview-examples/content-header-text-overflow';
import ContentHeaderWithSlot from '../preview-examples/content-header-with-slot';
import CustomField from '../preview-examples/custom-field';
import CustomFieldValidation from '../preview-examples/custom-field-validation';
Expand Down Expand Up @@ -350,6 +351,7 @@ import WorkflowVertical from '../preview-examples/workflow-vertical';
ContentExample,
ContentHeader,
ContentHeaderNoBack,
ContentHeaderTextOverflow,
ContentHeaderWithSlot,
DatepickerRange,
Datepicker,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<!--
SPDX-FileCopyrightText: 2026 Siemens AG

SPDX-License-Identifier: MIT

This source code is licensed under the MIT license found in the
LICENSE file in the root directory of this source tree.
-->

<ix-content-header
hasBackButton
headerTitle="Content title that remains compact when horizontal space is limited"
headerSubtitle="Supporting context is truncated independently when space is limited"
textOverflow="ellipsis"
>
<ix-button variant="tertiary">Button1</ix-button>
<ix-button variant="tertiary">Button2</ix-button>
<ix-button variant="tertiary">Button3</ix-button>
</ix-content-header>
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*
* SPDX-FileCopyrightText: 2026 Siemens AG
*
* SPDX-License-Identifier: MIT
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

import { Component } from '@angular/core';

@Component({
standalone: false,
selector: 'app-example',
templateUrl: './content-header-text-overflow.html',
})
export default class ContentHeaderTextOverflow {}
4 changes: 2 additions & 2 deletions packages/angular/src/components.ts
Original file line number Diff line number Diff line change
Expand Up @@ -712,14 +712,14 @@ export declare interface IxContent extends Components.IxContent {}


@ProxyCmp({
inputs: ['hasBackButton', 'headerSubtitle', 'headerTitle', 'variant']
inputs: ['hasBackButton', 'headerSubtitle', 'headerTitle', 'textOverflow', 'variant']
})
@Component({
selector: 'ix-content-header',
changeDetection: ChangeDetectionStrategy.OnPush,
template: '<ng-content></ng-content>',
// eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
inputs: ['hasBackButton', 'headerSubtitle', 'headerTitle', 'variant'],
inputs: ['hasBackButton', 'headerSubtitle', 'headerTitle', 'textOverflow', 'variant'],
outputs: ['backButtonClick'],
standalone: false
})
Expand Down
4 changes: 2 additions & 2 deletions packages/angular/standalone/src/components.ts
Original file line number Diff line number Diff line change
Expand Up @@ -823,14 +823,14 @@ export declare interface IxContent extends Components.IxContent {}

@ProxyCmp({
defineCustomElementFn: defineIxContentHeader,
inputs: ['hasBackButton', 'headerSubtitle', 'headerTitle', 'variant']
inputs: ['hasBackButton', 'headerSubtitle', 'headerTitle', 'textOverflow', 'variant']
})
@Component({
selector: 'ix-content-header',
changeDetection: ChangeDetectionStrategy.OnPush,
template: '<ng-content></ng-content>',
// eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
inputs: ['hasBackButton', 'headerSubtitle', 'headerTitle', 'variant'],
inputs: ['hasBackButton', 'headerSubtitle', 'headerTitle', 'textOverflow', 'variant'],
outputs: ['backButtonClick'],
})
export class IxContentHeader {
Expand Down
Loading
Loading