Reisen · Neue Ressource

Kiwi Orbit Designsystem.

Ein auf Reisen ausgerichteter Orbit-Leitfaden mit echten Produktfarben und Abständen, nativen Gepäckoptionen, einer einheitlichen Preisübersicht und einem vollständigen lokalen Prüfablauf.

OpenDesign-Leitfaden8 Kapitel38 ReferenzeinträgeOriginaler Anwendungsleitfaden
01

Kiwi Orbit Designsystem: Interface-Vorschau

Ändere die Anzahl der Reisenden und die Extras. Prüfe die Aufschlüsselung und entferne eine veraltete Überprüfung, indem du eine Auswahl änderst.

Gepäck auswählen und einen Beispielgesamtpreis prüfenVollständiges Beispiel öffnen
Native Orbit-Komponenten React 27.7.0 mit defaultTheme und kompiliertem Tailwind CSS; Token-Referenz 11.0.0. · Implementierungsreferenz
02

Kiwi Orbit Designsystem: Designreferenz

Native Orbit-Komponenten React 27.7.0 mit defaultTheme und kompiliertem Tailwind CSS; Token-Referenz 11.0.0.

Produktaktionsfarben

Quelle
Name / RegelWert / KonfigurationVerwendung
buttonPrimaryBackground#008F7B Referenz für den Status der primären Aktion. Hover-, Aktiv- und Fokusrollen klar voneinander unterscheiden.
buttonPrimaryBackgroundHover#007565 Referenz für den Status der primären Aktion. Hover-, Aktiv- und Fokusrollen klar voneinander unterscheiden.
buttonPrimaryBackgroundActive#006153 Referenz für den Status der primären Aktion. Hover-, Aktiv- und Fokusrollen klar voneinander unterscheiden.
buttonPrimaryForeground#FFFFFF Referenz für den Status der primären Aktion. Hover-, Aktiv- und Fokusrollen klar voneinander unterscheiden.
buttonPrimaryForegroundHover#FFFFFF Referenz für den Status der primären Aktion. Hover-, Aktiv- und Fokusrollen klar voneinander unterscheiden.
buttonPrimaryForegroundActive#FFFFFF Referenz für den Status der primären Aktion. Hover-, Aktiv- und Fokusrollen klar voneinander unterscheiden.
buttonPrimaryBorderColorFocusrgba(0, 143, 123, 0.5)Referenz für den Status der primären Aktion. Hover-, Aktiv- und Fokusrollen klar voneinander unterscheiden.

Komponentenabstände

Quelle
Name / RegelWert / KonfigurationVerwendung
space502pxTatsächliche Pixelabstände aus dem veröffentlichten Token-Paket.
space1004pxTatsächliche Pixelabstände aus dem veröffentlichten Token-Paket.
space1506pxTatsächliche Pixelabstände aus dem veröffentlichten Token-Paket.
space2008pxTatsächliche Pixelabstände aus dem veröffentlichten Token-Paket.
space30012pxTatsächliche Pixelabstände aus dem veröffentlichten Token-Paket.
space40016pxTatsächliche Pixelabstände aus dem veröffentlichten Token-Paket.
space50020pxTatsächliche Pixelabstände aus dem veröffentlichten Token-Paket.
space60024pxTatsächliche Pixelabstände aus dem veröffentlichten Token-Paket.
space80032pxTatsächliche Pixelabstände aus dem veröffentlichten Token-Paket.
space100040pxTatsächliche Pixelabstände aus dem veröffentlichten Token-Paket.
space120048pxTatsächliche Pixelabstände aus dem veröffentlichten Token-Paket.

Eckenradien

Quelle
Name / RegelWert / KonfigurationVerwendung
borderRadius502pxUnterschiedliche Radiusrollen eignen sich für Bedienelemente und größere Reiseoberflächen.
borderRadius1004pxUnterschiedliche Radiusrollen eignen sich für Bedienelemente und größere Reiseoberflächen.
borderRadius1506pxUnterschiedliche Radiusrollen eignen sich für Bedienelemente und größere Reiseoberflächen.
borderRadius2008pxUnterschiedliche Radiusrollen eignen sich für Bedienelemente und größere Reiseoberflächen.
borderRadius30012pxUnterschiedliche Radiusrollen eignen sich für Bedienelemente und größere Reiseoberflächen.
borderRadius40016pxUnterschiedliche Radiusrollen eignen sich für Bedienelemente und größere Reiseoberflächen.
borderRadiusNone0Unterschiedliche Radiusrollen eignen sich für Bedienelemente und größere Reiseoberflächen.
borderRadiusFull9999pxUnterschiedliche Radiusrollen eignen sich für Bedienelemente und größere Reiseoberflächen.

Fließtext

Quelle
Name / RegelWert / KonfigurationVerwendung
fontSizeTextSmall13pxVeröffentlichte Fließtextrollen; individuelle Seitenüberschriften werden in der Anwendung zusammengesetzt.
fontSizeTextNormal15pxVeröffentlichte Fließtextrollen; individuelle Seitenüberschriften werden in der Anwendung zusammengesetzt.
fontSizeTextLarge16pxVeröffentlichte Fließtextrollen; individuelle Seitenüberschriften werden in der Anwendung zusammengesetzt.
fontSizeTextExtraLarge18pxVeröffentlichte Fließtextrollen; individuelle Seitenüberschriften werden in der Anwendung zusammengesetzt.

Produkt- und neutrale Oberflächen

Quelle
Name / RegelWert / KonfigurationVerwendung
paletteCloudLight#F5F7F9 Verwende ruhige Oberflächen und gut lesbaren Text rund um die Produktaktionsfarbe.
paletteCloudNormal#E8EDF1 Verwende ruhige Oberflächen und gut lesbaren Text rund um die Produktaktionsfarbe.
paletteInkDark#252A31 Verwende ruhige Oberflächen und gut lesbaren Text rund um die Produktaktionsfarbe.
paletteInkLight#657890 Verwende ruhige Oberflächen und gut lesbaren Text rund um die Produktaktionsfarbe.
paletteInkNormal#4F5E71 Verwende ruhige Oberflächen und gut lesbaren Text rund um die Produktaktionsfarbe.
paletteProductLight#E1F4F3 Verwende ruhige Oberflächen und gut lesbaren Text rund um die Produktaktionsfarbe.
paletteProductNormal#008F7B Verwende ruhige Oberflächen und gut lesbaren Text rund um die Produktaktionsfarbe.
paletteProductDark#007061 Verwende ruhige Oberflächen und gut lesbaren Text rund um die Produktaktionsfarbe.
03

Kiwi Orbit Designsystem: Vollständiger Leitfaden

Ein praktischer Leitfaden zur Auswahl, Anwendung und Überprüfung dieses Systems für ein echtes Interface.

DESIGN-kiwi-orbit.md

Umfassende Anleitung, Einstieg in die Implementierung und Links zu den Quellen.

Leitfaden herunterladen

Kiwi Orbit Designsystem: Layout zur Auswahl von Reiseoptionen

Die Route vor den Extras anzeigen

Die Routenübersicht zeigt vor den Gepäckoptionen die beiden Flughafencodes, die Städtenamen und eine fiktive Reisedauer. So bleibt der Kaufkontext sichtbar, während die Nutzerinnen und Nutzer Extras vergleichen. Die gestrichelte Verbindung ist eine originale Illustration von CSS, keine Routengrafik eines Anbieters und kein Versprechen für einen realen Dienst.

Aus diesem OpenDesign-Leitfaden

Auswahl und Gesamtpreis getrennt darstellen

Reisende und Gepäck stehen auf einer Seite, daneben die Preisaufschlüsselung. Derselbe Zustand bestimmt sowohl die ausgewählten Steuerelemente als auch die Beträge. Auf dem Smartphone folgt die Übersicht in der Dokumentreihenfolge auf die Auswahl. So bleibt klar, welche Eingaben den Gesamtpreis bestimmen.

Kiwi Orbit Designsystem: Produktfarben und Feedback

Für die Hauptaktion die Produktfarbfamilie verwenden

Das Token-Paket bietet eine grüne Produktaktionsfarbe mit eigenen Hover- und Aktivtönen. Die Referenz führt die exakten Werte für die Buttonrolle auf, statt auf ein vermutetes Marken-Grün zurückzugreifen. Neutrale, wolkenfarbene Oberflächen rahmen die auswählbaren Extras ein, ohne dass jedes Panel mit der Überprüfungsaktion konkurriert.

Feedback konkret auf das Ergebnis beziehen

Die native Erfolgsmeldung lautet „Auswahl lokal überprüft“ und nennt die Anzahl der Reisenden sowie den Gesamtpreis. Sie wird gelöscht, sobald sich eine Auswahl ändert. Eine frühere grüne Bestätigung bleibt somit nicht sichtbar, als würde sie auch eine neu bearbeitete Auswahl von Extras bestätigen.

Kiwi Orbit Designsystem: Typografie und Preishierarchie

Für erklärende Texte native Textrollen verwenden

Orbit bietet kleine Textrollen mit 13 px und normale mit 15 px sowie größere Varianten. Das Beispiel verwendet native Text- und Heading-Komponenten; die Routencodes und der Gesamtpreis werden eigens hervorgehoben. Der Browser verwendet hier eine dokumentierte Fallback-Schriftfamilie; es wird nicht unbemerkt eine Markenschrift von Kiwi.com geladen.

Einheiten direkt bei den Beträgen anzeigen

Bei jedem Gepäckpreis steht „pro Reisende:r“. In der Aufschlüsselung wird jedes ausgewählte Extra mit der Anzahl der Reisenden multipliziert, und der Gesamtpreis ist stärker hervorgehoben als die einzelnen Positionen. Die Einheit darf auf Mobilgeräten nicht verschwinden, denn eine große, attraktive Zahl ohne Angabe ihres Bezugs lässt sich leicht falsch verstehen.

Kiwi Orbit Designsystem: Radien und Abstandsskalen

Steuerelemente von größeren Oberflächen abheben

Die aktuelle Radius-Skala umfasst die Stufen 2, 4, 6, 8, 12 und 16 px sowie none und full. Für die selbst gestalteten Routen- und Übersichtsbereiche werden abgerundete Ecken mit 12 px verwendet, während native Steuerelemente ihre eigenen Theme-Regeln beibehalten. Würde auf jedes verschachtelte Element der größte Radius angewendet, ginge die Hierarchie des Formulars verloren.

Die Optionszeile beim Umbruch zusammenhalten

Kiwi Orbit Designsystem: Kontrollkästchen und Auswahlfeld

Komponentenbeschriftungen und Informationsfelder verwenden

Das Kontrollkästchen erhält seine sichtbare Beschriftung und Zusatzinformationen über öffentliche Props. Das Auswahlfeld erhält eine Beschriftung und explizite Optionen für eine bis vier reisende Personen. Diese nativen Kompositionen behalten ihr Interaktions- und Beschriftungsverhalten bei, ohne ein anklickbares div als Gepäckauswahl auszugeben.

Jede Zusatzoption unabhängig modellieren

Kabinen- und Aufgabegepäck werden als separate boolesche Werte behandelt. Die Anwendung unterstellt nicht, dass die Auswahl der einen Option die andere automatisch abwählt. Dies ist eine bewusst einfache Beispielregel. Bei einer echten Fluggesellschaft kann es gegenseitig ausschließende Pakete oder passagierspezifische Freigepäckmengen geben, für die ein anderes Modell erforderlich ist.

Kiwi Orbit Designsystem: Berechnung und Überprüfung der Auswahl

Gesamtbetrag aus einer einzigen Formel ableiten

Im Beispiel werden die Anzahl der Reisenden mit dem Grundtarif zuzüglich der ausgewählten Zusatzoptionen pro Person multipliziert. Es wird kein separat bearbeitbarer Gesamtbetrag gespeichert, der von den sichtbaren Optionen abweichen könnte. Alle Preise und Freigepäckmengen sind ausdrücklich fiktiv und keine aktuellen Angebote von Kiwi.com.

Eine Momentaufnahme zur Überprüfung erfassen

Bei der Überprüfung werden Anzahl der Reisenden, Gepäckoptionen und Gesamtbetrag gemeinsam gespeichert. Wird eine beliebige Einstellung geändert, wird diese Momentaufnahme gelöscht. So veranschaulicht das Beispiel einen konsistenten Status, ohne einen lokalen Klick als Reservierung, Zahlung, Live-Verfügbarkeitsprüfung oder verbindliches Angebot darzustellen.

Kiwi Orbit Designsystem: Zugängliche Rückmeldung zur Auswahl

Beschriftungen und Neuberechnung gemeinsam prüfen

Mit Tastatur oder Zeigegerät können Reisende über die nativen Steuerelemente ausgewählt und beide Gepäckoptionen aktiviert oder deaktiviert werden. Das Ergebnis der Überprüfung erscheint in einem Statusbereich. Für optionales Gepäck wird keine Validierung vorgetäuscht: Wenn keine der beiden Zusatzoptionen ausgewählt ist, entspricht das einem gültigen Zustand dieses fiktiven Tarifs.

  1. Wähle zwei Reisende aus und füge Kabinengepäck hinzu.
  2. Füge Aufgabegepäck hinzu und prüfe alle drei aufgeschlüsselten Beträge.
  3. Überprüfe die Auswahl lokal, ändere eine Option und bestätige, dass die vorherige Erfolgsmeldung verschwindet.

Unerwartete Folgen vermeiden

Der fiktive Rahmen wird oberhalb des Formulars und neben dem Gesamtbetrag erläutert. Die Aktion lautet „Auswahl lokal überprüfen“, nicht „Kaufen“ oder „Buchen“. Alle Änderungen bleiben auf der Seite. Für eine Demonstration, die keine persönlichen Passagierdaten benötigt, werden diese auch nicht abgefragt.

Kiwi Orbit Designsystem: Provider und kompilierte Styles

Die passende stabile Version verwenden

Dieses Beispiel verwendet die Komponenten von React in Version 27.7.0 und Token-Referenzen in Version 11.0.0. Es importiert OrbitProvider, das defaultTheme des Pakets und das kompilierte lib/tailwind.css. Ohne dieses Stylesheet wäre das Styling der Utility-basierten Komponenten unvollständig, selbst wenn der React-Baum gerendert wird.

  • OrbitProvider und defaultTheme des Pakets.
  • Kompilierte lib/tailwind.css aus components 27.7.0.
  • Node.js 22 oder neuer für die Build-Umgebung des Pakets.

Bereitstellungsanforderungen klar angeben

Kiwi Orbit Designsystem: Komponentenbeispiele

main.jsx — vollständiges, funktionsfähiges Beispiel

Wähle Gepäckoptionen aus und überprüfe einen beispielhaften Gesamtbetrag. Der folgende Quellcode enthält den vollständigen React-Einstiegspunkt einschließlich sämtlicher Zustände und Validierungen.

jsx
import React, { useState } from "react";
import { createRoot } from "react-dom/client";
import {
  OrbitProvider,
  Button,
  Checkbox,
  Select,
  Alert,
  Heading,
  Text,
} from "@kiwicom/orbit-components";
import defaultTheme from "@kiwicom/orbit-components/lib/defaultTheme";
import "@kiwicom/orbit-components/lib/tailwind.css";
import "./orbit.css";
function App() {
  const [travellers, setTravellers] = useState("1"),
    [cabin, setCabin] = useState(false),
    [checked, setChecked] = useState(false),
    [saved, setSaved] = useState(null);
  const count = Number(travellers),
    extras = (cabin ? 18 : 0) + (checked ? 32 : 0),
    total = count * (96 + extras);
  function update(fn) {
    fn();
    setSaved(null);
  }
  return (
    <OrbitProvider theme={defaultTheme}>
      <main className="trip">
        <header>
          <Text size="small">ORIGINAL TRAVEL SPECIMEN</Text>
          <Heading as="h1" type="title1">Choose what travels with you</Heading>
          <Text>
            Fictional one-way fare. Prices illustrate the interface, not a
            bookable flight.
          </Text>
        </header>
        <div className="trip-grid">
          <section>
            <div className="route">
              <div>
                <strong>PRG</strong>
                <span>Prague</span>
              </div>
              <div className="route-line">
                <span>1h 45m · direct</span>
                <i></i>
              </div>
              <div>
                <strong>AMS</strong>
                <span>Amsterdam</span>
              </div>
            </div>
            <div className="options">
              <Heading as="h2" type="title3">Travellers and baggage</Heading>
              <Select
                label="Travellers"
                ariaLabel="Travellers"
                value={travellers}
                options={[1, 2, 3, 4].map((n) => ({
                  value: String(n),
                  label: n + " adult" + (n === 1 ? "" : "s"),
                }))}
                onChange={(e) => update(() => setTravellers(e.target.value))}
              />
              <div className="bag-option">
                <div>
                  <Heading as="h3" type="title4">Personal item</Heading>
                  <Text size="small">
                    Fits under the seat · included in this example fare
                  </Text>
                </div>
                <strong>Included</strong>
              </div>
              <div className="bag-option">
                <Checkbox
                  label="Add cabin baggage"
                  info="One 10 kg bag per traveller · fictional allowance"
                  checked={cabin}
                  onChange={(e) => update(() => setCabin(e.target.checked))}
                />
                <strong>
                  €18<span>/ traveller</span>
                </strong>
              </div>
              <div className="bag-option">
                <Checkbox
                  label="Add checked baggage"
                  info="One 20 kg bag per traveller · fictional allowance"
                  checked={checked}
                  onChange={(e) => update(() => setChecked(e.target.checked))}
                />
                <strong>
                  €32<span>/ traveller</span>
                </strong>
              </div>
            </div>
          </section>
          <aside>
            <Heading as="h2" type="title3">Your example selection</Heading>
            <dl>
              <dt>Base fare × {count}</dt>
              <dd>€{96 * count}</dd>
              {cabin && (
                <>
                  <dt>Cabin baggage × {count}</dt>
                  <dd>€{18 * count}</dd>
                </>
              )}
              {checked && (
                <>
                  <dt>Checked baggage × {count}</dt>
                  <dd>€{32 * count}</dd>
                </>
              )}
            </dl>
            <div className="trip-total">
              <span>Total</span>
              <strong>€{total}</strong>
            </div>
            <Text size="small">
              All amounts are illustrative. No payment or reservation will be
              created.
            </Text>
            <Button
              fullWidth
              onClick={() => setSaved({ count, cabin, checked, total })}
            >
              Review local selection
            </Button>
            {saved && (
              <div role="status" className="trip-confirm">
                <Alert type="success" title="Selection reviewed locally">
                  {saved.count} traveller{saved.count === 1 ? "" : "s"} · €
                  {saved.total}. No booking created.
                </Alert>
              </div>
            )}
          </aside>
        </div>
        <footer>
          Native Orbit 27.7.0 components and compiled package styles. Original
          layout and fictional pricing logic by OpenDesign.
        </footer>
      </main>
    </OrbitProvider>
  );
}
createRoot(document.getElementById("root")).render(<App />);

Code-Referenz

  • Erstellen Sie ein Vite-Projekt React, behalten Sie <div id="root"></div> bei und laden Sie diese Datei als src/main.jsx.

orbit.css — ursprüngliches responsives Layout

Anwendungslayout, das um die nativen Komponenten herum aufgebaut ist.

css
* {
  box-sizing: border-box;
}
body {
  margin: 0;
  background: #f5f7f9;
  color: #252a31;
  font:
    16px/1.5 Arial,
    sans-serif;
}
.trip {
  padding: 32px;
}
.trip header {
  max-width: 760px;
  margin-bottom: 28px;
}
.trip header h1 {
  margin: 8px 0 12px;
}
.trip-grid {
  display: grid;
  grid-template-columns: minmax(0, 1.5fr) minmax(280px, 1fr);
  gap: 24px;
}
.route,
.options,
.trip aside {
  background: #fff;
  border-radius: 12px;
  border: 1px solid #e8edf1;
  padding: 24px;
}
.route {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  margin-bottom: 20px;
}
.route strong {
  font-size: 32px;
  display: block;
}
.route span {
  font-size: 14px;
  display: block;
  color: #4f5e71;
}
.route-line {
  flex: 1;
  text-align: center;
}
.route-line i {
  display: block;
  border-top: 2px dashed #bac7d5;
  margin-top: 12px;
}
.options > h3 {
  margin-bottom: 20px;
}
.options > div:first-of-type {
  margin-bottom: 12px;
}
.bag-option {
  display: flex;
  gap: 20px;
  align-items: center;
  justify-content: space-between;
  padding: 24px 0;
  border-top: 1px solid #e8edf1;
}
.bag-option:last-child {
  padding-bottom: 0;
}
.bag-option > strong {
  white-space: nowrap;
  font-size: 18px;
}
.bag-option > strong span {
  display: block;
  font-size: 12px;
  font-weight: 400;
  color: #657890;
}
.trip aside {
  align-self: start;
}
.trip dl {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 16px;
  margin: 24px 0;
}
.trip dd {
  margin: 0;
  text-align: right;
  font-weight: 600;
}
.trip-total {
  display: flex;
  justify-content: space-between;
  align-items: center;
  border-top: 1px solid #bac7d5;
  padding: 20px 0;
}
.trip-total strong {
  font-size: 32px;
}
.trip aside > button {
  margin-top: 24px;
}
.trip-confirm {
  margin-top: 20px;
}
.trip footer {
  font-size: 12px;
  color: #657890;
  margin-top: 24px;
}
@media (max-width: 900px) {
  .trip-grid {
    grid-template-columns: 1fr;
  }
}
@media (max-width: 550px) {
  .trip {
    padding: 16px;
  }
  .route,
  .options,
  .trip aside {
    padding: 20px;
  }
  .route {
    gap: 12px;
  }
  .route strong {
    font-size: 28px;
  }
  .route-line span {
    font-size: 12px;
  }
  .bag-option {
    align-items: flex-start;
    gap: 12px;
  }
}

Code-Referenz

  • Speichern Sie die Datei neben main.jsx. Diese benutzerdefinierten Layoutregeln sind von der Token-Referenz der Bibliothek getrennt.
04

Kiwi Orbit Designsystem: Einrichtung des Agenten

Ausgangspunkt für die Implementierung

Das Beispiel mit den festgelegten nativen Komponenten wurde gebündelt und lokal im Browser geprüft. Das Beispiel verwendet ausschließlich den lokalen Anwendungszustand.

sh
npm create vite@latest orbit-trip -- --template react
cd orbit-trip
npm install
npm install [email protected] [email protected] @kiwicom/[email protected]
# Use Node.js >=22. Replace src/main.jsx and add src/orbit.css.
npm run dev

Ein Prompt für dein Projekt

Agenten-Prompt
Erstelle mit nativen Orbit-Komponenten und kompilierten Styles eine Auswahl für Reiseoptionen. Halte Routenkontext, Preise pro Person, ausgewählte Zusatzoptionen und Gesamtbetrag konsistent. Kennzeichne fiktive Preise und die lokale Überprüfung eindeutig, lösche veraltete Prüfergebnisse bei Änderungen und erwecke nicht den Eindruck, dass Buchungs- oder Zahlungsfunktionen verfügbar sind.
05

Kiwi Orbit Designsystem: Quellen und Geltungsbereich

OpenDesign-Anwendungsleitfaden. Route, Dauer, Preise und Freigepäckmengen sind fiktiv. Native Orbit-Steuerelemente funktionieren lokal; es erfolgen weder Flugsuche noch Buchung oder Zahlung.