mittwald Flow Logo

Components

SegmentedControl

Ein SegmentedControl bietet dem User eine Einfachauswahl von 2 bis 5 kurzen Optionen. Je nach Einsatzzweck kann die Auswahl des Users den Inhalt unter dem Segmented Control verändern.GitHub
Zahlungsart

Playground

Verwende <SegmentedControl />, um ein SegmentedControl anzuzeigen.

Authentifizierungsart
import {
  Label,
  Segment,
  SegmentedControl,
} from "@mittwald/flow-react-components";

<SegmentedControl defaultValue="ssh-key">
  <Label>Authentifizierungsart</Label>
  <Segment value="ssh-key">SSH-Key</Segment>
  <Segment value="passwort">Passwort</Segment>
</SegmentedControl>

Mit Inhaltsänderung

Unterhalb des SegmentedControls kann sich der Inhalt je nach Bedarf ändern.

Zahlungsart
import {
  ColumnLayout,
  FieldDescription,
  Label,
  Section,
  Segment,
  SegmentedControl,
  TextField,
} from "@mittwald/flow-react-components";
import { useState } from "react";

export default () => {
  const [showContent, setShowContent] =
    useState<boolean>(false);

  return (
    <Section>
      <SegmentedControl
        defaultValue="lastschrift"
        onChange={() => setShowContent(!showContent)}
      >
        <Label>Zahlungsart</Label>
        <Segment value="lastschrift">Lastschrift</Segment>
        <Segment value="Rechnung">Rechnung</Segment>
        {showContent && (
          <FieldDescription>
            Wähle bitte eine Bankverbindung für die
            Bezahlung mit SEPA-Lastschrift aus.
          </FieldDescription>
        )}
      </SegmentedControl>
      {showContent && (
        <ColumnLayout>
          <TextField isRequired>
            <Label>Kontoinhaber</Label>
          </TextField>
          <TextField isRequired>
            <Label>IBAN</Label>
          </TextField>
        </ColumnLayout>
      )}
    </Section>
  );
}

Mit FieldDescription

Innerhalb der <SegmentedControl /> kann eine hilfreiche <FieldDescription /> eingebaut werden.

Speicherplatz
Speicherplatz kann jederzeit geändert werden
import {
  FieldDescription,
  Label,
  Segment,
  SegmentedControl,
} from "@mittwald/flow-react-components";

<SegmentedControl defaultValue="cloud">
  <Label>Speicherplatz</Label>
  <Segment value="cloud">Cloud</Segment>
  <Segment value="lokal">Lokal</Segment>
  <FieldDescription>
    Speicherplatz kann jederzeit geändert werden
  </FieldDescription>
</SegmentedControl>

States

Eine SegmentedControl hat 2 States: Default und Disabled. Die Optionen verfügen über die States Default, Hover, Pressed, Disabled, Focused und Selected.

Rolle
Rolle
import {
  Label,
  Section,
  Segment,
  SegmentedControl,
} from "@mittwald/flow-react-components";

<Section>
  <SegmentedControl defaultValue="dev">
    <Label>Rolle</Label>
    <Segment value="entwickler">Entwickler</Segment>
    <Segment value="designer">Designer</Segment>
    <Segment value="geschäftsführer">
      Geschäftsführer
    </Segment>
    <Segment value="andere">Andere</Segment>
  </SegmentedControl>
  <SegmentedControl defaultValue="dev" isDisabled>
    <Label>Rolle</Label>
    <Segment value="entwickler">Entwickler</Segment>
    <Segment value="designer">Designer</Segment>
    <Segment value="geschäftsführer">
      Geschäftsführer
    </Segment>
    <Segment value="andere">Andere</Segment>
  </SegmentedControl>
</Section>
  • Selected: Wird eine Option vom User ausgewählt, so erhält er den Zustand Selected. Es kann immer nur eine Option diesen Status haben. Zu Beginn ist immer die erste Option vorausgewählt.

  • Disabled: Einzelne Optionen oder die gesamte SegmentedControl können den State Disabled haben. Wenn die SegmentedControl den State Disabled erhält, erhalten automatisch auch alle Optionen ebenfalls diesen State, sodass sie vom User nicht ausgewählt werden können.


Container Breakpoint Size

Das SegmentedControl springt in eine kompakte Variante um, sobald der Container kleiner als der gesetzte Breakpoint ist. Im Default passiert das bei 550px, was der containerBreakpointSize=”m” entspricht. Über diese Property kann die Größe mit Werten zwischen xs und xl überschrieben werden.

Rolle
Rolle
import {
  ColumnLayout,
  Label,
  Segment,
  SegmentedControl,
} from "@mittwald/flow-react-components";

<ColumnLayout m={[1, 1]}>
  <SegmentedControl
    defaultValue="entwickler"
    containerBreakpointSize="xl"
  >
    <Label>Rolle</Label>
    <Segment value="entwickler">Entwickler</Segment>
    <Segment value="geschäftsführer">
      Geschäftsführer
    </Segment>
    <Segment value="andere">Andere</Segment>
  </SegmentedControl>

  <SegmentedControl
    defaultValue="entwickler"
    containerBreakpointSize="xs"
  >
    <Label>Rolle</Label>
    <Segment value="entwickler">Entwickler</Segment>
    <Segment value="geschäftsführer">
      Geschäftsführer
    </Segment>
    <Segment value="andere">Andere</Segment>
  </SegmentedControl>
</ColumnLayout>

Kombiniere mit ...

ContextualHelp

Benutze die ContextualHelp Komponente, wenn du weitere Informationen bereitstellen möchtest, und diese zu lang für die FieldDescription sind.

Zahlungsart
import {
  Button,
  ContextualHelp,
  ContextualHelpTrigger,
  Heading,
  Label,
  Segment,
  SegmentedControl,
  Text,
} from "@mittwald/flow-react-components";

<SegmentedControl defaultValue="lastschrift">
  <Label>
    Zahlungsart
    <ContextualHelpTrigger>
      <Button />
      <ContextualHelp>
        <Heading>Weitere Informationen</Heading>
        <Text>
          Hier gibt es weitere Informationen, die zu lang
          für die FieldDescription sind.
        </Text>
      </ContextualHelp>
    </ContextualHelpTrigger>
  </Label>
  <Segment value="lastschrift">Lastschrift</Segment>
  <Segment value="Rechnung">Rechnung</Segment>
</SegmentedControl>

Properties

PropertyTypeDefaultDescription
classNamestring | ((values: RadioGroupRenderProps & { defaultClassName: string; }) => string)-

The CSS className for the element. A function may be provided to compute the class based on component state.

styleCSSProperties | ((values: RadioGroupRenderProps & { defaultStyle: CSSProperties; }) => CSSProperties)-

The inline style for the element. A function may be provided to compute the style based on component state.

validationBehavior"native" | "aria"'native'

Whether to use native HTML form validation to prevent form submission when the value is missing or invalid, or mark the field as required or invalid via ARIA.

isDisabledboolean-

Whether the input is disabled.

isReadOnlyboolean-

Whether the input can be selected but not changed by the user.

isRequiredboolean-

Whether user input is required on the input before form submission.

isInvalidboolean-

Whether the input value is invalid.

validate((value: string) => true | ValidationError)-

A function that returns an error message if a given value is invalid. Validation errors are displayed to the user when the form is submitted if validationBehavior="native". For realtime validation, use the isInvalid prop instead.

valuestring-

The current value (controlled).

defaultValuestring-

The default value (uncontrolled).

idstring-

The element's unique identifier. See MDN.

namestring-

The name of the input element, used when submitting an HTML form. See MDN.

slotstring-

A slot name for the component. Slots allow the component to receive props from a parent component. An explicit null value indicates that the local props completely override all props received from a parent.

orientationOrientation'vertical'

The axis the Radio Button(s) should align with.

childrenReactNode-
wrapWithReactElement<unknown, string | JSXElementConstructor<any>>-
containerBreakpointSizeContainerBreakpointSize-
refRef<HTMLDivElement>-

Allows getting a ref to the component instance. Once the component unmounts, React will set ref.current to null (or call the ref with null if you passed a callback ref). @see React Docs

keyKey-

Grundlagen

Best practices

Achte bei der Verwendung eines SegmentedControl darauf, dass...

  • maximal 5 Optionen angezeigt werden.
  • die Optionen so kurz wie möglich benannt werden. 1 bis 3 Wörter sollten ausreichen.
  • ein Label verwendet wird, falls die Optionen im Zusammenhang nicht verstanden werden. Falls kein Label verwendet wird, muss ein AriaLabel gesetzt werden.
  • eine logische Reihenfolge gewählt wird. Häufig sollte die wichtigste Option an erster Stelle stehen.

Verwendung

Verwende einen SegmentedControl, um...

  • eine platzsparende Einfachauswahlmöglichkeit anzubieten.
  • einen Teil des Contents unterhalb zu ändern oder zu filtern. Ein SegmentedControl ist kein Ersatz für Tabs, welche den gesamten Content einer Seite ändern.

SegmentedControl vs. RadioGroup

Flow bietet verschiedene Auswahl-Components an. Das SegmentedControl und die RadioGroup haben viele Gemeinsamkeiten. Die Cards unter dem Text geben hilfreiche Anhaltspunkte zur Unterscheidung.

Verwende ein SegmentedControl, um z. B. ...

  • eine Einfachauswahl von 2 bis 5 Optionen anzuzeigen. - Optionen anzuzeigen, die aus 1 bis 2 Wörtern bestehen.
  • Optionen anzuzeigen, die den darunterliegenden Inhalt verändern.

Verwende eine RadioGroup, um z. B. ...

  • eine Einfachauswahl von 2 bis ungefähr 7 Optionen anzuzeigen.
  • Optionen mit unterschiedlicher Textlänge darzustellen.

Anwendung

Position

Das SegmentedControl wird häufig in Formularen oder als Ansichtsfilter verwendet. Bei der Positionierung ist Folgendes zu beachten:

  • In der Regel nimmt das SegmentedControl die gesamte Breite des Content-Bereiches ein. In Ausnahmefällen kann das SegmentedControl auch schmaler dargestellt werden, z. B. wenn es nicht in Formularen, sondern nur als Ansichtsfilter über Diagrammen verwendet wird.
  • Wenn Inhalte mithilfe des SegmentedControls geändert werden sollen, muss das SegmentedControl direkt über dem zu ändernden Inhaltsbereich stehen.

Do

Das SegmentedControl steht über dem angepassten Inhalt.

Hierarchie

Ein SegmentedControl darf maximal 5 Optionen enthalten. Bei der Reihenfolge der Optionen ist folgendes zu beachten:

  • Die wichtigste Option sollte an erster Stelle stehen und wird automatisch vorselektiert.
  • Nicht nur das gesamte SegmentedControl kann disabled sein, sondern auch einzelne Optionen. Wenn eine Option disabled ist, sollte es von der Ausgangssituation für den User logisch sein, warum er diese Option nicht auswählen kann.

Feedback

Der selektierte Zustand einer Option ist an der geänderten Farbe und dem Häkchensymbol zu erkennen. Aus diesem Grund sollte das Icon nicht verändert werden. In der aktuellen Version des SegmentedControls sind keine dekorativen oder alleinstehenden Icons vorgesehen.


Writing guidelines

Text

Das SegmentedControl hat Text in den Optionen und im Label. Dabei ist Folgendes zu beachten:

  • Wenn ein Label verwendet wird, sollte es so kurz wie möglich ausformuliert sein. Der Text des Labels sollte nie mehr als 1-3 Wörter umfassen. Ein Label kann ausgelassen werden, wenn die Optionen auch ohne Label ausreichend verständlich sind.
  • Im besten Fall sollte eine Option aus einem selbsterklärenden Wort bestehen. Wenn nötig, können auch 2-3 Wörter verwendet werden. Es ist jedoch darauf zu achten, dass der Text nicht zweizeilig wird und zusammen mit dem Icon genügend Platz zur Verfügung steht.
Einstellung

Do

Das Label und die Antwortmöglichkeiten sind prägnant und verständlich.

Wähle deine Einstellungsart aus:

Don't

Kürzer ist oft besser. Versuche, so wenig Wörter wie möglich im Label und in den Optionen zu verwenden.


Behavior

Responsive layout

Sobald die Breite des Containers kleiner als 551px ist, werden alle Optionen im SegmentedControl untereinander dargestellt. Dieser Wert kann mit containerBreakpointSize angepasst werden. Auch bei schmaleren Containerns sollte vermieden werden, dass der Text zweizeilig wird oder nicht mehr lesbar ist.

Authentifizierungsart

Mobile Variante


Accessibility

Falls SegmentedControl ohne Label verwendet wird, muss ein AriaLabel gepflegt werden.

Feedback geben