Gebaut auf Vercels UI SDK 0.1.0-beta.2. Die API kann sich ändern.
Segmented control
Ein Segmented Control auf Vercels UI SDK mit gleitender Markierung, drei Größen, reinen Symbol-Elementen, voller Breite, vertikalem Layout und Radiogruppen-Tastatur.
- Formularkomponenten
- 2 Teilen
- 10 Beispielen
@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-segmented-control.jsonFügt die Komponente, die HextaUI-Theme-Tokens und alle HextaUI-Komponenten hinzu, von denen sie abhängt.
Füge die Theme-Tokens zu deinem globalen CSS hinzu, falls du das noch nicht getan hast.
Installiere die Abhängigkeiten.
pnpm add @ui-sdk/react@0.1.0-beta.2 @ui-sdk/core@0.1.0-beta.2 cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/ui-sdk-segmented-control.tsx Passe die Importpfade an dein Projekt-Setup an.
UI SDK bringt etwas eigenes CSS in einem Cascade Layer namens ui-sdk mit. Deklariere diesen Layer ganz oben im globalen Stylesheet, über dem Tailwind-Import, damit deine Klassen gewinnen.
Ein Segmented Control wechselt zwischen wenigen Ansichten oder Einstellungen. Es funktioniert wie eine Radiogruppe mit einem Wert und einem Tab-Stopp, und die Markierung hinter dem gewählten Element gleitet zur neuen Wahl. Benenne es mit aria-label oder aria-labelledby. UI SDK markiert es in 0.1.0-beta.2 als experimentell.
Das Control zeichnet seine Markierung selbst, du fügst nur Elemente hinzu.
size ist sm, default oder lg. Auf Touchscreens werden die Elemente größer.
Ein Element mit nur einem Symbol wird quadratisch. Benenne es mit aria-label.
Gib dem Control w-full, und die Elemente teilen sich seine Breite.
orientation="vertical" stapelt die Elemente. Pfeiltasten beider Achsen wechseln weiter zwischen ihnen.
disabled am Control schaltet alles ab und sendet nichts. An einem Element überspringen es die Pfeiltasten.
Übergib value und aktualisiere es in onValueChange. Ein Controller aus createSegmentedControlController() wählt ein Element von überall.
Jedes Element enthält ein verstecktes natives Radio, daher sendet name den gewählten Wert, required wartet auf eine Wahl, und ein Zurücksetzen stellt den Standard her.
Ein schreibgeschütztes Control behält seinen Wert und wird trotzdem gesendet. Pfeiltasten bewegen den Fokus, ohne etwas zu wählen.
Die Elemente laufen von rechts, und die Markierung folgt ihnen.
| Taste | Aktion |
|---|---|
| Tab | Springt in das Control, auf das gewählte oder das erste aktive Element. |
| ←→↑↓ | Wechseln zum nächsten oder vorherigen Element und wählen es, deaktivierte werden übersprungen. Sie laufen im Kreis, außer loop ist false. |
| Space | Wählt das fokussierte Element. |
| Enter | Sendet sein Formular ab. |
Das Control ist eine Radiogruppe und jedes Element ein Radio, daher sagen Screenreader die Wahl und ihre Position an. Die Markierung ist rein visuell und wird von Screenreadern übersprungen.
Die Markierung gleitet erst, wenn die Seite interaktiv ist, animiert also nie beim Laden, und bei reduzierter Bewegung gar nicht. In erzwungenen Farben behält das gewählte Element einen sichtbaren Rahmen.
Jeder Teil umhüllt den gleichnamigen UI-SDK-Teil und nimmt alle seine Props an, auch render und einen className, der eine Funktion des Zustands sein kann.
| Prop | Typ | Standard |
|---|---|---|
value | T | null | – |
defaultValue | T | null | – |
onValueChange | (value: T | null, details) => void | – |
size | "sm" | "default" | "lg" | "default" |
orientation | "horizontal" | "vertical" | "horizontal" |
loop | boolean | true |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
name | string | – |
form | string | – |
controllerAus createSegmentedControlController(). | SegmentedControlController | – |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Beschreibung |
|---|---|
data-slot="segmented-control" | Zum Ansprechen des Segmented Controls in CSS. |
data-size | Die Größe: sm, default oder lg. |
data-orientation | horizontal oder vertical. |
data-disabled | Vorhanden, wenn deaktiviert. |
data-readonly | Vorhanden, wenn schreibgeschützt. |
data-required | Vorhanden, wenn erforderlich. |
| Prop | Typ | Standard |
|---|---|---|
value | string | – |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Beschreibung |
|---|---|
data-slot="segmented-control-item" | Zum Ansprechen eines Elements in CSS. |
data-checked | Am gewählten Element vorhanden. |
data-unchecked | Vorhanden an den anderen Einträgen. |
data-icon-only | Vorhanden, wenn das Element nur ein Symbol enthält. |
data-disabled | Vorhanden, wenn deaktiviert. |
- CalendarEin Datumsraster für Einzel-, Bereichs- und Mehrfachauswahl, mit gleitenden Monaten, Bereichsvorschau und Tagen in Touch-Größe.
- CheckboxEine Checkbox, deren Häkchen sich einzeichnet, mit unbestimmten übergeordneten Elementen, Gruppen und Labels, die ihren Hover teilen.
- ComboboxEin filterbares Select mit Chips, Gruppen und asynchronen Ergebnissen, in einem Popup, das sich beim Tippen anpasst.
- Date pickerEin Button, der einen Kalender in einem Popover öffnet, auf Smartphones als Bottom Sheet, für einzelne Daten und Zeiträume.
- FieldLabels, Beschreibungen und Fehler, mit ihrem Steuerelement verbunden, mit Validierungszuständen und Layouts für Formulare.
- InputEin Texteingabefeld mit drei Größen, ungültigen und schreibgeschützten Zuständen, nativem Validierungsstyling und einer 16-px-Schrift für Touch, damit Smartphones nie hineinzoomen.