Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
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/ix-3943-badge.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@siemens/ix': minor
'@siemens/ix-angular': minor
'@siemens/ix-react': minor
'@siemens/ix-vue': minor
---

Introduces `ix-badge` for overlay count and status indicators on anchors or as standalone badges, with semantic variants, outline mode, position/offset, optional attention animation, and standalone `tooltipText` support.
4 changes: 3 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ Targeted commands:
- Use core component tests for component behavior, interaction, keyboard handling, accessibility, slots, events, and state changes.
- Include accessibility coverage (`makeAxeBuilder`) and a basic hydration/render test in component test files.
- Add or update unit tests for pure logic changes, component tests for interaction/accessibility changes, and visual tests only for meaningful UI or theme changes.
- Prefer Playwright locators, user-visible assertions, and deterministic waits over implementation-detail selectors and timeouts.
- Prefer Playwright **accessibility locators** (`getByRole`, `getByLabel`, `getByText`, accessible name/description assertions) for user-facing contracts. Fall back to tag/CSS selectors for custom elements without roles and for decorative chrome outside the a11y tree.
- Prefer deterministic waits over implementation-detail selectors and timeouts.

## Visual regression testing

Expand Down Expand Up @@ -130,6 +131,7 @@ Targeted commands:
## Component-test conventions (core)

- Use `regressionTest` from `@utils/test` (not plain Playwright `test`).
- Prefer accessibility locators (`getByRole`, `getByLabel`, `getByText`) when elements expose roles/names; use tag/CSS selectors for host state and decorative/`aria-hidden` chrome. See `.github/instructions/component-tests.instructions.md`.
- Use Playwright locators (including for Shadow DOM assertions).
- Avoid arbitrary timeouts (`waitForTimeout`).
- Register icons via mount config; do not fetch static SVG files directly in tests.
Expand Down
10 changes: 10 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 @@ -52,6 +52,16 @@ export const routePaths: IxPreviewRoutes = {
import('../preview-examples/avatar-image').then((m) => m.default),
'preview/avatar-initials': () =>
import('../preview-examples/avatar-initials').then((m) => m.default),
'preview/badge': () =>
import('../preview-examples/badge').then((m) => m.default),
'preview/badge-counter': () =>
import('../preview-examples/badge-counter').then((m) => m.default),
'preview/badge-dot': () =>
import('../preview-examples/badge-dot').then((m) => m.default),
'preview/badge-label': () =>
import('../preview-examples/badge-label').then((m) => m.default),
'preview/badge-status-icon': () =>
import('../preview-examples/badge-status-icon').then((m) => m.default),
'preview/blind': () =>
import('../preview-examples/blind').then((m) => m.default),
'preview/blind-header-actions': () =>
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.
*/

.container {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
column-gap: 2rem;
row-gap: 1.5rem;
align-items: center;
/* Room for attached overlays and pulse rings above the content. */
padding-top: 1rem;
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<div class="container">
<ix-badge type="counter" label="8" variant="primary"></ix-badge>
<ix-badge type="counter" label="8" variant="primary" outline></ix-badge>
<ix-badge type="counter" label="8" variant="primary" enable-animation></ix-badge>
<ix-badge type="counter" label="8" variant="primary" outline enable-animation></ix-badge>

<ix-badge type="counter" label="8" variant="alarm"></ix-badge>
<ix-badge type="counter" label="8" variant="alarm" outline></ix-badge>
<ix-badge type="counter" label="8" variant="alarm" enable-animation></ix-badge>
<ix-badge type="counter" label="8" variant="alarm" outline enable-animation></ix-badge>

<ix-badge type="counter" label="8" variant="critical"></ix-badge>
<ix-badge type="counter" label="8" variant="critical" outline></ix-badge>
<ix-badge type="counter" label="8" variant="critical" enable-animation></ix-badge>
<ix-badge type="counter" label="8" variant="critical" outline enable-animation></ix-badge>

<ix-badge type="counter" label="8" variant="warning"></ix-badge>
<ix-badge type="counter" label="8" variant="warning" outline></ix-badge>
<ix-badge type="counter" label="8" variant="warning" enable-animation></ix-badge>
<ix-badge type="counter" label="8" variant="warning" outline enable-animation></ix-badge>

<ix-badge type="counter" label="8" variant="info"></ix-badge>
<ix-badge type="counter" label="8" variant="info" outline></ix-badge>
<ix-badge type="counter" label="8" variant="info" enable-animation></ix-badge>
<ix-badge type="counter" label="8" variant="info" outline enable-animation></ix-badge>

<ix-badge type="counter" label="8" variant="neutral"></ix-badge>
<ix-badge type="counter" label="8" variant="neutral" outline></ix-badge>
<ix-badge type="counter" label="8" variant="neutral" enable-animation></ix-badge>
<ix-badge type="counter" label="8" variant="neutral" outline enable-animation></ix-badge>

<ix-badge type="counter" label="8" variant="success"></ix-badge>
<ix-badge type="counter" label="8" variant="success" outline></ix-badge>
<ix-badge type="counter" label="8" variant="success" enable-animation></ix-badge>
<ix-badge type="counter" label="8" variant="success" outline enable-animation></ix-badge>

<ix-badge type="counter" label="8" variant="custom" background="var(--theme-chart-11)" badge-color="var(--theme-color-inv-std-text)"></ix-badge>
<ix-badge type="counter" label="8" variant="custom" outline background="var(--theme-chart-11)" badge-color="var(--theme-chip-outline--color)"></ix-badge>
<ix-badge type="counter" label="8" variant="custom" enable-animation background="var(--theme-chart-11)" badge-color="var(--theme-color-inv-std-text)"></ix-badge>
<ix-badge type="counter" label="8" variant="custom" outline enable-animation background="var(--theme-chart-11)" badge-color="var(--theme-chip-outline--color)"></ix-badge>

</div>
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.
*/

import { Component } from '@angular/core';
import { IxBadge } from '@siemens/ix-angular/standalone';

@Component({
selector: 'app-example',
imports: [IxBadge],
templateUrl: './badge-counter.html',
styleUrls: ['./badge-counter.css'],
})
export default class BadgeCounter {}
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.
*/

.container {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
column-gap: 2rem;
row-gap: 1.5rem;
align-items: center;
/* Room for attached overlays and pulse rings above the content. */
padding-top: 1rem;
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<div class="container">
<ix-badge type="dot" variant="primary" role="img" aria-label="Primary"></ix-badge>
<ix-badge type="dot" variant="primary" outline role="img" aria-label="Primary outline"></ix-badge>
<ix-badge type="dot" variant="primary" enable-animation role="img" aria-label="Primary pulse"></ix-badge>
<ix-badge type="dot" variant="primary" outline enable-animation role="img" aria-label="Primary pulse outline"></ix-badge>

<ix-badge type="dot" variant="alarm" role="img" aria-label="Alarm"></ix-badge>
<ix-badge type="dot" variant="alarm" outline role="img" aria-label="Alarm outline"></ix-badge>
<ix-badge type="dot" variant="alarm" enable-animation role="img" aria-label="Alarm pulse"></ix-badge>
<ix-badge type="dot" variant="alarm" outline enable-animation role="img" aria-label="Alarm pulse outline"></ix-badge>

<ix-badge type="dot" variant="critical" role="img" aria-label="Critical"></ix-badge>
<ix-badge type="dot" variant="critical" outline role="img" aria-label="Critical outline"></ix-badge>
<ix-badge type="dot" variant="critical" enable-animation role="img" aria-label="Critical pulse"></ix-badge>
<ix-badge type="dot" variant="critical" outline enable-animation role="img" aria-label="Critical pulse outline"></ix-badge>

<ix-badge type="dot" variant="warning" role="img" aria-label="Warning"></ix-badge>
<ix-badge type="dot" variant="warning" outline role="img" aria-label="Warning outline"></ix-badge>
<ix-badge type="dot" variant="warning" enable-animation role="img" aria-label="Warning pulse"></ix-badge>
<ix-badge type="dot" variant="warning" outline enable-animation role="img" aria-label="Warning pulse outline"></ix-badge>

<ix-badge type="dot" variant="info" role="img" aria-label="Info"></ix-badge>
<ix-badge type="dot" variant="info" outline role="img" aria-label="Info outline"></ix-badge>
<ix-badge type="dot" variant="info" enable-animation role="img" aria-label="Info pulse"></ix-badge>
<ix-badge type="dot" variant="info" outline enable-animation role="img" aria-label="Info pulse outline"></ix-badge>

<ix-badge type="dot" variant="neutral" role="img" aria-label="Neutral"></ix-badge>
<ix-badge type="dot" variant="neutral" outline role="img" aria-label="Neutral outline"></ix-badge>
<ix-badge type="dot" variant="neutral" enable-animation role="img" aria-label="Neutral pulse"></ix-badge>
<ix-badge type="dot" variant="neutral" outline enable-animation role="img" aria-label="Neutral pulse outline"></ix-badge>

<ix-badge type="dot" variant="success" role="img" aria-label="Success"></ix-badge>
<ix-badge type="dot" variant="success" outline role="img" aria-label="Success outline"></ix-badge>
<ix-badge type="dot" variant="success" enable-animation role="img" aria-label="Success pulse"></ix-badge>
<ix-badge type="dot" variant="success" outline enable-animation role="img" aria-label="Success pulse outline"></ix-badge>

<ix-badge type="dot" variant="custom" role="img" aria-label="Custom" background="var(--theme-chart-11)" badge-color="var(--theme-color-inv-std-text)"></ix-badge>
<ix-badge type="dot" variant="custom" outline role="img" aria-label="Custom outline" background="var(--theme-chart-11)" badge-color="var(--theme-chip-outline--color)"></ix-badge>
<ix-badge type="dot" variant="custom" enable-animation role="img" aria-label="Custom pulse" background="var(--theme-chart-11)" badge-color="var(--theme-color-inv-std-text)"></ix-badge>
<ix-badge type="dot" variant="custom" outline enable-animation role="img" aria-label="Custom pulse outline" background="var(--theme-chart-11)" badge-color="var(--theme-chip-outline--color)"></ix-badge>

</div>
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.
*/

import { Component } from '@angular/core';
import { IxBadge } from '@siemens/ix-angular/standalone';

@Component({
selector: 'app-example',
imports: [IxBadge],
templateUrl: './badge-dot.html',
styleUrls: ['./badge-dot.css'],
})
export default class BadgeDot {}
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.
*/

.container {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
column-gap: 2rem;
row-gap: 1.5rem;
align-items: center;
/* Room for attached overlays and pulse rings above the content. */
padding-top: 1rem;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<div class="container">
<ix-badge type="label" label="Primary" variant="primary" icon="info"></ix-badge>
<ix-badge type="label" label="Primary" variant="primary" icon="info" outline></ix-badge>
<ix-badge type="label" label="Primary" variant="primary" icon="info" enable-animation></ix-badge>
<ix-badge type="label" label="Primary" variant="primary" icon="info" outline enable-animation></ix-badge>
<ix-badge type="label" label="Alarm" variant="alarm" icon="info"></ix-badge>
<ix-badge type="label" label="Alarm" variant="alarm" icon="info" outline></ix-badge>
<ix-badge type="label" label="Alarm" variant="alarm" icon="info" enable-animation></ix-badge>
<ix-badge type="label" label="Alarm" variant="alarm" icon="info" outline enable-animation></ix-badge>
<ix-badge type="label" label="Critical" variant="critical" icon="info"></ix-badge>
<ix-badge type="label" label="Critical" variant="critical" icon="info" outline></ix-badge>
<ix-badge type="label" label="Critical" variant="critical" icon="info" enable-animation></ix-badge>
<ix-badge type="label" label="Critical" variant="critical" icon="info" outline enable-animation></ix-badge>
<ix-badge type="label" label="Warning" variant="warning" icon="info"></ix-badge>
<ix-badge type="label" label="Warning" variant="warning" icon="info" outline></ix-badge>
<ix-badge type="label" label="Warning" variant="warning" icon="info" enable-animation></ix-badge>
<ix-badge type="label" label="Warning" variant="warning" icon="info" outline enable-animation></ix-badge>
<ix-badge type="label" label="Info" variant="info" icon="info"></ix-badge>
<ix-badge type="label" label="Info" variant="info" icon="info" outline></ix-badge>
<ix-badge type="label" label="Info" variant="info" icon="info" enable-animation></ix-badge>
<ix-badge type="label" label="Info" variant="info" icon="info" outline enable-animation></ix-badge>
<ix-badge type="label" label="Neutral" variant="neutral" icon="info"></ix-badge>
<ix-badge type="label" label="Neutral" variant="neutral" icon="info" outline></ix-badge>
<ix-badge type="label" label="Neutral" variant="neutral" icon="info" enable-animation></ix-badge>
<ix-badge type="label" label="Neutral" variant="neutral" icon="info" outline enable-animation></ix-badge>
<ix-badge type="label" label="Success" variant="success" icon="info"></ix-badge>
<ix-badge type="label" label="Success" variant="success" icon="info" outline></ix-badge>
<ix-badge type="label" label="Success" variant="success" icon="info" enable-animation></ix-badge>
<ix-badge type="label" label="Success" variant="success" icon="info" outline enable-animation></ix-badge>
<ix-badge type="label" label="Custom" variant="custom" icon="info" background="var(--theme-chart-11)" badge-color="var(--theme-color-inv-std-text)"></ix-badge>
<ix-badge type="label" label="Custom" variant="custom" icon="info" background="var(--theme-chart-11)" badge-color="var(--theme-chip-outline--color)" outline></ix-badge>
<ix-badge type="label" label="Custom" variant="custom" icon="info" background="var(--theme-chart-11)" badge-color="var(--theme-color-inv-std-text)" enable-animation></ix-badge>
<ix-badge type="label" label="Custom" variant="custom" icon="info" background="var(--theme-chart-11)" badge-color="var(--theme-chip-outline--color)" outline enable-animation></ix-badge>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* 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 { IxBadge } from '@siemens/ix-angular/standalone';
import { addIcons } from '@siemens/ix-icons';
import { iconInfo } from '@siemens/ix-icons/icons';

@Component({
selector: 'app-example',
imports: [IxBadge],
templateUrl: './badge-label.html',
styleUrls: ['./badge-label.css'],
})
export default class BadgeLabel {
constructor() {
addIcons({ iconInfo });
}
}
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.
*/

.container {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
column-gap: 2rem;
row-gap: 1.5rem;
align-items: center;
/* Room for attached overlays and pulse rings above the content. */
padding-top: 1rem;
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<div class="container">
<ix-badge type="status-icon" variant="alarm" role="img" aria-label="Alarm"></ix-badge>
<ix-badge type="status-icon" variant="alarm" outline role="img" aria-label="Alarm outline"></ix-badge>
<ix-badge type="status-icon" variant="alarm" enable-animation role="img" aria-label="Alarm pulse"></ix-badge>
<ix-badge type="status-icon" variant="alarm" outline enable-animation role="img" aria-label="Alarm pulse outline"></ix-badge>

<ix-badge type="status-icon" variant="error" role="img" aria-label="Error"></ix-badge>
<ix-badge type="status-icon" variant="error" outline role="img" aria-label="Error outline"></ix-badge>
<ix-badge type="status-icon" variant="error" enable-animation role="img" aria-label="Error pulse"></ix-badge>
<ix-badge type="status-icon" variant="error" outline enable-animation role="img" aria-label="Error pulse outline"></ix-badge>

<ix-badge type="status-icon" variant="critical" role="img" aria-label="Critical"></ix-badge>
<ix-badge type="status-icon" variant="critical" outline role="img" aria-label="Critical outline"></ix-badge>
<ix-badge type="status-icon" variant="critical" enable-animation role="img" aria-label="Critical pulse"></ix-badge>
<ix-badge type="status-icon" variant="critical" outline enable-animation role="img" aria-label="Critical pulse outline"></ix-badge>

<ix-badge type="status-icon" variant="warning" role="img" aria-label="Warning"></ix-badge>
<ix-badge type="status-icon" variant="warning" outline role="img" aria-label="Warning outline"></ix-badge>
<ix-badge type="status-icon" variant="warning" enable-animation role="img" aria-label="Warning pulse"></ix-badge>
<ix-badge type="status-icon" variant="warning" outline enable-animation role="img" aria-label="Warning pulse outline"></ix-badge>

<ix-badge type="status-icon" variant="success" role="img" aria-label="Success"></ix-badge>
<ix-badge type="status-icon" variant="success" outline role="img" aria-label="Success outline"></ix-badge>
<ix-badge type="status-icon" variant="success" enable-animation role="img" aria-label="Success pulse"></ix-badge>
<ix-badge type="status-icon" variant="success" outline enable-animation role="img" aria-label="Success pulse outline"></ix-badge>

<ix-badge type="status-icon" variant="info" role="img" aria-label="Info"></ix-badge>
<ix-badge type="status-icon" variant="info" outline role="img" aria-label="Info outline"></ix-badge>
<ix-badge type="status-icon" variant="info" enable-animation role="img" aria-label="Info pulse"></ix-badge>
<ix-badge type="status-icon" variant="info" outline enable-animation role="img" aria-label="Info pulse outline"></ix-badge>

</div>
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.
*/

import { Component } from '@angular/core';
import { IxBadge } from '@siemens/ix-angular/standalone';

@Component({
selector: 'app-example',
imports: [IxBadge],
templateUrl: './badge-status-icon.html',
styleUrls: ['./badge-status-icon.css'],
})
export default class BadgeStatusIcon {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* 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.
*/

.row {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 2rem;
margin-bottom: 1.5rem;
/* Room for attached overlays and pulse rings above the content. */
padding-top: 1.5rem;
}

.styled {
width: 7rem;
--ix-badge-max-width: 7rem;
}

.styled-ellipsis-4 {
width: 4rem;
--ix-badge-max-width: 4rem;
}
Loading
Loading