Zum Hauptinhalt springen
Version: latest
Universell einsetzbar

Button funktioniert sowohl auf dem Server als auch im Browser. Nutze immer den Standard-Import (z. B. @prokodo/ui/button) — die Library erkennt die Umgebung automatisch.

Button

Die Button-Komponente ist das zentrale interaktive Element in @prokodo/ui. Sie unterstützt drei gleich große visuelle Varianten, sieben semantische Farben, Icons vor oder nach dem Label, Icon-only, Ladezustände, volle Breite und SSR-sichere Redirect-Links.


Übersicht

import { Button } from "@prokodo/ui/button"
;<Button
title="Click Me"
color="primary"
variant="contained"
onClick={handleClick}
/>

Import

import { Button } from "@prokodo/ui/button"

CSS (import once at app root):

import "@prokodo/ui/button.css"

Props

ButtonProps ist eine Discriminated Union aus ButtonDefaultProps (Button mit Label) und ButtonIconProps (Icon-only).

ButtonDefaultProps

PropTypStandardPflichtBeschreibung
titlestringSichtbares Label und Fallback für aria-label.
variant"contained" | "outlined" | "text""contained"Visual style variant.
color"primary" | "secondary" | "success" | "error" | "info" | "warning" | "inherit""primary"Semantische Farbe.
prioritybooleanfalseHydriert die interaktive Island sofort; ohne visuellen Effekt.
fullWidthbooleanfalseStreckt den Button auf 100 % der Elternbreite.
loadingbooleanfalseZeigt den Spinner und sperrt Interaktionen.
disabledbooleanfalseDeaktiviert alle Interaktionen.
iconPropsIconPropsBestehendes Icon neben dem Label.
iconPosition"start" | "end""start"Positioniert das Icon vor oder nach dem Label.
redirectLinkPropsRendert einen geometrisch identischen SSR-sicheren Link.
aria-labelstringtitleÜberschreibt den zugänglichen Namen.
refButtonRefRef auf das zugrunde liegende <button>-Element.
contentClassNamestringCSS-Klasse auf dem inneren Content-Wrapper.
classNamestringCSS-Klasse am Root-Element.
onClickMouseEventHandlerClick-Handler.
imageImagePropsInline-Bild als Alternative zu iconProps.

ButtonIconProps

Die Icon-only-Variante benötigt entweder aria-label (interaktiv) oder inert (dekorativ).

PropTypStandardPflichtBeschreibung
iconPropsIconPropsZu renderndes Icon.
aria-labelstring✅*Zugänglicher Name für Screenreader.
inertboolean✅*Markiert das Element als dekorativ.

* Entweder aria-label oder inert angeben, nicht beides.


Design-Tokens

Passe Button über CSS Custom Properties auf :root oder einem übergeordneten Element an.

Layout und Typografie

TokenStandardBeschreibung
--pk-button-bgvar(--pk-color-surface-raised)Standard-Oberfläche als Fallback.
--pk-button-fgvar(--pk-color-fg)Standard-Text-/Icon-Farbe als Fallback.
--pk-button-font-weight600Schriftgewicht des Labels.
--pk-button-shadowvar(--pk-shadow-sm)Basis-Schatten als Fallback.
--pk-button-radiusvar(--pk-radius-pill)Gemeinsamer Radius aller Varianten.
--pk-button-padding-xvar(--pk-space-xl)Horizontales Padding.
--pk-button-padding-y1remVertikales Padding für Contained, Outlined und Text.
--pk-button-min-height3.25remGemeinsame Höhe; Icon-only nutzt sie auf beiden Achsen.

Material und Bewegung

TokenStandardBeschreibung
--pk-button-hover-lift-2pxVertikale Hover-Bewegung.
--pk-button-press-scale0.985Kompression im Active-State.
--pk-button-motion-duration240msDauer der Haupttransition.
--pk-button-motion-easingcubic-bezier(0.22, 1, 0.36, 1)Easing der Haupttransition.
--pk-button-sheen-duration560msDauer des Contained-Sheen.
--pk-button-sheen-opacity0.32Stärke des Contained-Sheen.
--pk-button-contained-bottom-glowrgb(255 255 255 / 58%)Weicher innerer Bloom in der unteren Hälfte.
--pk-button-contained-shadow-strength22% (30% bei Primary)Semantische Elevation im Ruhezustand.
--pk-button-contained-hover-shadow-strength30% (38% bei Primary)Semantische Elevation beim Hover.

Semantische Token-Familien

Token-FamilieBeschreibung
--pk-button-contained-background-{color}Oberflächen der Contained-Buttons.
--pk-button-contained-foreground-{color}Solide Icon- und Fallback-Farbe.
--pk-button-contained-ink-{color}Label-Verlauf für Contained.
--pk-button-content-{color}Label-/Icon-Verlauf für Outlined und Text.
--pk-button-content-fallback-{color}Solider Fallback, falls Gradient-Text nicht verfügbar ist.

{color} steht für inherit, primary, secondary, success, info, warning oder error. Light und Dark Mode tauschen die relevanten Werte automatisch. Contained verwendet im Dark Mode ein weicheres Charcoal statt reinem Schwarz.

app/globals.css
.checkoutCta {
--pk-button-contained-background-primary: linear-gradient(
112deg,
#4aa8ff,
#43ecff
);
--pk-button-contained-bottom-glow: rgb(255 255 255 / 64%);
}

Deaktivierter Zustand: opacity: 0.5, reduzierte Sättigung und pointer-events: none. Ladezustand: setzt aria-busy="true", hält das Label zur Größenstabilität sichtbar und ergänzt einen Spinner mit currentColor.


Varianten und Icons

<Button title="Primäre Aktion" color="primary" variant="contained" />
<Button title="Sekundäre Aktion" color="primary" variant="outlined" />
<Button title="Leise Aktion" color="primary" variant="text" />

<Button
title="Weiter"
iconProps={{ name: "ArrowRight01Icon" }}
iconPosition="end"
/>

<Button
aria-label="Weiter"
iconProps={{ name: "ArrowRight01Icon" }}
/>

Contained, Outlined und Text besitzen dieselbe Mindesthöhe. Icon-only verwendet denselben Wert als quadratische Touch-Fläche.

Redirect-Verhalten

Mit redirect wird das Root-Element zu einem BaseLink-Anchor. Klassen, Content-Wrapper, Maße, Theme und Interaktionszustände bleiben identisch zum nativen Button.

<Button
title="Report öffnen"
iconProps={{ name: "ArrowRight01Icon" }}
iconPosition="end"
redirect={{ href: "/report", target: "_self" }}
/>

AIC-Hinweis

Verwende im Anwendungscode immer den Standard-Importpfad:

import { Button } from "@prokodo/ui/button"

Eine separate Auswahl von /client oder /lazy ist im Consumer-Code nicht erforderlich.

priority hydriert die Button-Island sofort, statt auf Sichtbarkeit zu warten. Farbe, Elevation, Größe und andere visuelle Eigenschaften ändern sich dadurch nicht.


WCAG-2.2-Status

KriteriumBezeichnungStatusHinweis
1.3.1Info und Beziehungen (A)✅ ErfülltSemantische Struktur (Überschriften, Listen, Labels, Landmarks) muss programmatisch via HTML oder ARIA vermittelt werden.
2.1.1Tastatur (A)🔍 Manuell prüfenAlle Funktionalität muss allein über Tastatur bedienbar sein, ohne Timing-Anforderungen.
2.4.3Fokusreihenfolge (A)🔍 Manuell prüfenDie Tastaturfokus-Reihenfolge muss im vollständigen seitenseitigen Integrationskontext Bedeutung und Bedienbarkeit erhalten.
2.4.7Fokus sichtbar (AA)🔍 Manuell prüfenAuf jedem interaktiven Element muss ein sichtbarer Tastaturfokus-Indikator vorhanden sein. Prüfung gegen das angewendete Produkt-Theme erforderlich.
2.4.11Fokus nicht verdeckt (Min.) (AA)🔍 Manuell prüfenDie fokussierte Komponente darf nicht vollständig durch Sticky-Header, Overlays oder andere positionierte Seitenelemente verdeckt sein.
2.5.3Label im Namen (A)✅ ErfülltBei Komponenten mit sichtbarem Label muss der zugängliche Name den sichtbaren Labeltext enthalten oder diesem entsprechen.
2.5.8Zielgröße (Minimum) (AA)🔍 Manuell prüfenInteraktive Zielbereiche müssen mindestens 24 × 24 CSS-Pixel groß sein. Prüfung in der integrierten Produkt-UI erforderlich.
4.1.2Name, Rolle, Wert (A)✅ ErfülltName, Rolle und Zustand aller interaktiven UI-Komponenten müssen via nativer HTML-Semantik oder ARIA programmatisch bestimmbar sein.

Testabdeckung: 5 jest-axe-Assertions in der Button-Testsuite sowie Redirect- und Icon-only-Tests für zugängliche Namen. Kriterien mit 🔍 erfordern manuelle Prüfung im finalen Integrations- und Theme-Kontext.

Storybook

Alle Button-Varianten, Controls und A11y-Hinweise live ansehen:

👉 Button in Storybook öffnen


Quellcode

TypeScript-Typen: src/components/button/Button.model.ts