diff --git a/src/elements/button/button-link/__snapshots__/button-link.snapshot.spec.snap.js b/src/elements/button/button-link/__snapshots__/button-link.snapshot.spec.snap.js
index a6285e81c8..86c17e6626 100644
--- a/src/elements/button/button-link/__snapshots__/button-link.snapshot.spec.snap.js
+++ b/src/elements/button/button-link/__snapshots__/button-link.snapshot.spec.snap.js
@@ -67,6 +67,7 @@ snapshots["sbb-button-link renders a disabled sbb-button-link with slotted icon
aria-disabled="true"
class="sbb-action-base sbb-button-link"
href="https://www.sbb.ch"
+ tabindex="-1"
>
diff --git a/src/elements/button/button-link/button-link.ts b/src/elements/button/button-link/button-link.ts
index 37a1b5d487..714f34ee34 100644
--- a/src/elements/button/button-link/button-link.ts
+++ b/src/elements/button/button-link/button-link.ts
@@ -2,7 +2,7 @@ import type { CSSResultGroup } from 'lit';
import { customElement } from 'lit/decorators.js';
import { SbbLinkBaseElement } from '../../core/base-elements.js';
-import { SbbDisabledMixin } from '../../core/mixins.js';
+import { SbbDisabledInteractiveMixin, SbbDisabledMixin } from '../../core/mixins.js';
import { buttonCommonStyle, buttonPrimaryStyle, SbbButtonCommonElementMixin } from '../common.js';
/**
@@ -13,7 +13,7 @@ import { buttonCommonStyle, buttonPrimaryStyle, SbbButtonCommonElementMixin } fr
*/
@customElement('sbb-button-link')
export class SbbButtonLinkElement extends SbbButtonCommonElementMixin(
- SbbDisabledMixin(SbbLinkBaseElement),
+ SbbDisabledInteractiveMixin(SbbDisabledMixin(SbbLinkBaseElement)),
) {
public static override styles: CSSResultGroup = [buttonCommonStyle, buttonPrimaryStyle];
}
diff --git a/src/elements/button/button-link/readme.md b/src/elements/button/button-link/readme.md
index fa8d4295d5..ab5728e234 100644
--- a/src/elements/button/button-link/readme.md
+++ b/src/elements/button/button-link/readme.md
@@ -72,17 +72,18 @@ Use the accessibility properties in case of an icon-only button to describe the
## Properties
-| Name | Attribute | Privacy | Type | Default | Description |
-| -------------------- | --------------------- | ------- | --------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- |
-| `accessibilityLabel` | `accessibility-label` | public | `string \| undefined` | | This will be forwarded as aria-label to the inner anchor element. |
-| `disabled` | `disabled` | public | `boolean` | `false` | Whether the component is disabled. |
-| `download` | `download` | public | `boolean \| undefined` | | Whether the browser will show the download dialog on click. |
-| `href` | `href` | public | `string \| undefined` | | The href value you want to link to. |
-| `iconName` | `icon-name` | public | `string \| undefined` | | The icon name we want to use, choose from the small icon variants from the ui-icons category from here https://icons.app.sbb.ch. |
-| `negative` | `negative` | public | `boolean` | `false` | Negative coloring variant flag. |
-| `rel` | `rel` | public | `string \| undefined` | | The relationship of the linked URL as space-separated link types. |
-| `size` | `size` | public | `SbbButtonSize \| undefined` | `'l'` | Size variant, either l or m. |
-| `target` | `target` | public | `LinkTargetType \| string \| undefined` | | Where to display the linked URL. |
+| Name | Attribute | Privacy | Type | Default | Description |
+| --------------------- | ---------------------- | ------- | --------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- |
+| `accessibilityLabel` | `accessibility-label` | public | `string \| undefined` | | This will be forwarded as aria-label to the inner anchor element. |
+| `disabled` | `disabled` | public | `boolean` | `false` | Whether the component is disabled. |
+| `disabledInteractive` | `disabled-interactive` | public | `boolean` | `false` | Whether disabled buttons should be interactive. |
+| `download` | `download` | public | `boolean \| undefined` | | Whether the browser will show the download dialog on click. |
+| `href` | `href` | public | `string \| undefined` | | The href value you want to link to. |
+| `iconName` | `icon-name` | public | `string \| undefined` | | The icon name we want to use, choose from the small icon variants from the ui-icons category from here https://icons.app.sbb.ch. |
+| `negative` | `negative` | public | `boolean` | `false` | Negative coloring variant flag. |
+| `rel` | `rel` | public | `string \| undefined` | | The relationship of the linked URL as space-separated link types. |
+| `size` | `size` | public | `SbbButtonSize \| undefined` | `'l'` | Size variant, either l or m. |
+| `target` | `target` | public | `LinkTargetType \| string \| undefined` | | Where to display the linked URL. |
## Slots
diff --git a/src/elements/button/button/__snapshots__/button.snapshot.spec.snap.js b/src/elements/button/button/__snapshots__/button.snapshot.spec.snap.js
index 619bc0bef5..7a6679a059 100644
--- a/src/elements/button/button/__snapshots__/button.snapshot.spec.snap.js
+++ b/src/elements/button/button/__snapshots__/button.snapshot.spec.snap.js
@@ -14,7 +14,6 @@ snapshots["sbb-button renders a sbb-button without icon DOM"] =
negative=""
role="button"
size="m"
- tabindex="0"
type="button"
value="value"
>
diff --git a/src/elements/button/button/button.ts b/src/elements/button/button/button.ts
index f28717e1a1..f956f86828 100644
--- a/src/elements/button/button/button.ts
+++ b/src/elements/button/button/button.ts
@@ -2,7 +2,7 @@ import type { CSSResultGroup } from 'lit';
import { customElement } from 'lit/decorators.js';
import { SbbButtonBaseElement } from '../../core/base-elements.js';
-import { SbbFocusableDisabledActionMixin } from '../../core/mixins.js';
+import { SbbDisabledTabIndexActionMixin } from '../../core/mixins.js';
import { buttonCommonStyle, buttonPrimaryStyle, SbbButtonCommonElementMixin } from '../common.js';
/**
@@ -13,7 +13,7 @@ import { buttonCommonStyle, buttonPrimaryStyle, SbbButtonCommonElementMixin } fr
*/
@customElement('sbb-button')
export class SbbButtonElement extends SbbButtonCommonElementMixin(
- SbbFocusableDisabledActionMixin(SbbButtonBaseElement),
+ SbbDisabledTabIndexActionMixin(SbbButtonBaseElement),
) {
public static override styles: CSSResultGroup = [buttonCommonStyle, buttonPrimaryStyle];
}
diff --git a/src/elements/button/button/readme.md b/src/elements/button/button/readme.md
index ee6fbec01e..f1894686c5 100644
--- a/src/elements/button/button/readme.md
+++ b/src/elements/button/button/readme.md
@@ -62,28 +62,34 @@ sbb-button {
Use the accessibility properties in case of an icon-only button to describe the purpose of the `sbb-button` for screen-reader users.
-### Disabled buttons
+### Interactive disabled buttons
-Generally speaking, `disabled` elements are considered a bad pattern for accessibility. They are invisible to assistive
-technology and do not provide the reason for which they are disabled.
-To partially address the problem, disabled elements are kept focusable (other interactions are still prevented).
-However, it is still the consumers responsibility to provide a reason for the element being disabled.
+Native disabled elements cannot receive focus and do not dispatch any events. This can
+be problematic in some cases because it can prevent the app from telling the user why the button is
+disabled. Consumers can use the `disabledInteractive` property to style the button as disabled but allow for
+it to receive focus and dispatch events. The button will have `aria-disabled="true"` for assistive
+technology. It is the consumers responsibility to provide a reason for the element being disabled.
This can be achieved by adding an `aria-label`, `aria-labelledby` or `aria-describedby` attribute.
+**Note:** Using the `disabledInteractive` property can result in buttons that previously prevented
+actions to no longer do so, for example a submit button in a form. When using this input, you should
+guard against such cases in your component.
+
## Properties
-| Name | Attribute | Privacy | Type | Default | Description |
-| ---------- | ----------- | ------- | ---------------------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------- |
-| `disabled` | `disabled` | public | `boolean` | `false` | Whether the component is disabled. |
-| `form` | `form` | public | `string \| undefined` | | The