Viaggi e turismo · Nuova risorsa

Sistema di progettazione Kiwi Orbit.

Una guida Orbit dedicata ai viaggi, con colori e spaziature effettivi del prodotto, opzioni native per i bagagli, un riepilogo dei prezzi coerente e un flusso completo di revisione locale.

Guida OpenDesign8 capitoli38 voci di riferimentoGuida applicativa originale
01

Anteprima dell’interfaccia del sistema di progettazione sistema di design Kiwi Orbit

Modifica il numero di viaggiatori e gli extra; consulta il dettaglio dei costi e aggiorna una revisione non più valida modificando una scelta.

Scegli il bagaglio e consulta un esempio di totaleApri l’esempio completo
Componenti Orbit nativi React 27.7.0 con defaultTheme e Tailwind CSS compilato; riferimento dei token 11.0.0. · Riferimento per l’implementazione
02

Riferimento di progettazione del sistema sistema di design Kiwi Orbit

Componenti Orbit nativi React 27.7.0 con defaultTheme e Tailwind CSS compilato; riferimento dei token 11.0.0.

Colori delle azioni del prodotto

Fonte
Nome / regolaValore / configurazioneUtilizzo
buttonPrimaryBackground#008F7B Riferimento agli stati dell’azione primaria. Distingui i ruoli di hover, active e focus.
buttonPrimaryBackgroundHover#007565 Riferimento agli stati dell’azione primaria. Distingui i ruoli di hover, active e focus.
buttonPrimaryBackgroundActive#006153 Riferimento agli stati dell’azione primaria. Distingui i ruoli di hover, active e focus.
buttonPrimaryForeground#FFFFFF Riferimento agli stati dell’azione primaria. Distingui i ruoli di hover, active e focus.
buttonPrimaryForegroundHover#FFFFFF Riferimento agli stati dell’azione primaria. Distingui i ruoli di hover, active e focus.
buttonPrimaryForegroundActive#FFFFFF Riferimento agli stati dell’azione primaria. Distingui i ruoli di hover, active e focus.
buttonPrimaryBorderColorFocusrgba(0, 143, 123, 0.5)Riferimento agli stati dell’azione primaria. Distingui i ruoli di hover, active e focus.

Spaziatura dei componenti

Fonte
Nome / regolaValore / configurazioneUtilizzo
space502pxValori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato.
space1004pxValori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato.
space1506pxValori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato.
space2008pxValori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato.
space30012pxValori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato.
space40016pxValori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato.
space50020pxValori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato.
space60024pxValori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato.
space80032pxValori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato.
space100040pxValori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato.
space120048pxValori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato.

Raggi degli angoli

Fonte
Nome / regolaValore / configurazioneUtilizzo
borderRadius502pxI diversi raggi distinguono i controlli dalle superfici di viaggio più ampie.
borderRadius1004pxI diversi raggi distinguono i controlli dalle superfici di viaggio più ampie.
borderRadius1506pxI diversi raggi distinguono i controlli dalle superfici di viaggio più ampie.
borderRadius2008pxI diversi raggi distinguono i controlli dalle superfici di viaggio più ampie.
borderRadius30012pxI diversi raggi distinguono i controlli dalle superfici di viaggio più ampie.
borderRadius40016pxI diversi raggi distinguono i controlli dalle superfici di viaggio più ampie.
borderRadiusNone0I diversi raggi distinguono i controlli dalle superfici di viaggio più ampie.
borderRadiusFull9999pxI diversi raggi distinguono i controlli dalle superfici di viaggio più ampie.

Testo del corpo

Fonte
Nome / regolaValore / configurazioneUtilizzo
fontSizeTextSmall13pxRuoli tipografici pubblicati per il corpo del testo; i titoli personalizzati della pagina fanno parte della composizione dell’applicazione.
fontSizeTextNormal15pxRuoli tipografici pubblicati per il corpo del testo; i titoli personalizzati della pagina fanno parte della composizione dell’applicazione.
fontSizeTextLarge16pxRuoli tipografici pubblicati per il corpo del testo; i titoli personalizzati della pagina fanno parte della composizione dell’applicazione.
fontSizeTextExtraLarge18pxRuoli tipografici pubblicati per il corpo del testo; i titoli personalizzati della pagina fanno parte della composizione dell’applicazione.

Superfici del prodotto e neutre

Fonte
Nome / regolaValore / configurazioneUtilizzo
paletteCloudLight#F5F7F9 Usa superfici sobrie e testo leggibile attorno al colore delle azioni del prodotto.
paletteCloudNormal#E8EDF1 Usa superfici sobrie e testo leggibile attorno al colore delle azioni del prodotto.
paletteInkDark#252A31 Usa superfici sobrie e testo leggibile attorno al colore delle azioni del prodotto.
paletteInkLight#657890 Usa superfici sobrie e testo leggibile attorno al colore delle azioni del prodotto.
paletteInkNormal#4F5E71 Usa superfici sobrie e testo leggibile attorno al colore delle azioni del prodotto.
paletteProductLight#E1F4F3 Usa superfici sobrie e testo leggibile attorno al colore delle azioni del prodotto.
paletteProductNormal#008F7B Usa superfici sobrie e testo leggibile attorno al colore delle azioni del prodotto.
paletteProductDark#007061 Usa superfici sobrie e testo leggibile attorno al colore delle azioni del prodotto.
03

Guida completa al sistema di progettazione sistema di design Kiwi Orbit

Una guida pratica per scegliere, applicare e valutare questo sistema in un’interfaccia reale.

DESIGN-kiwi-orbit.md

Indicazioni complete, un punto di partenza per l’implementazione e link alle fonti.

Scarica la guida

Layout di selezione viaggi del sistema di progettazione sistema di design Kiwi Orbit

Mostra l’itinerario prima degli extra

Il riepilogo dell’itinerario mostra i codici dei due aeroporti, i nomi delle città e una durata fittizia prima delle opzioni per il bagaglio. In questo modo il contesto dell’acquisto resta visibile mentre l’utente confronta gli extra. Il tratteggio è un’illustrazione originale CSS, non una grafica del percorso di un vettore né una promessa relativa a un servizio reale.

Da questa guida su OpenDesign

Tieni separate le scelte dal totale

I viaggiatori e i bagagli sono da un lato, mentre il dettaglio dei prezzi è accanto. Lo stesso stato determina sia i controlli selezionati sia gli importi. Sul telefono, il riepilogo segue le scelte nell’ordine del documento, così è chiaro quali opzioni determinano il totale.

Colori del prodotto e feedback nel sistema di progettazione sistema di design Kiwi Orbit

Usa la palette del prodotto per l’azione principale

Il pacchetto di token fornisce un’azione del prodotto verde, con tonalità distinte per hover e active. Il riferimento elenca i valori esatti del ruolo del pulsante, anziché basarsi su un verde del brand ipotizzato. Le superfici neutre color nuvola incorniciano gli extra selezionabili senza fare concorrenza all’azione di revisione.

Fai in modo che il feedback rispecchi il risultato

L’avviso di successo nativo dice «Selezione esaminata in locale» e indica il numero di viaggiatori e il totale. Viene cancellato ogni volta che cambia una scelta. Una conferma verde precedente non può quindi restare visibile come se convalidasse un nuovo insieme di extra modificato.

Tipografia e gerarchia dei prezzi nel sistema di progettazione sistema di design Kiwi Orbit

Usa gli stili di testo nativi per i contenuti esplicativi

Orbit offre stili nativi per il corpo del testo da 13px (piccolo) e 15px (normale), oltre ad altri formati più grandi. L’esempio usa i componenti nativi Text e Heading, mentre i codici dell’itinerario e il totale sono messi in risalto appositamente. Qui il browser usa uno stack di font di fallback documentato; il font del brand Kiwi.com non viene caricato di nascosto.

Mantieni le unità accanto agli importi

Il prezzo di ogni bagaglio è indicato per viaggiatore. Il dettaglio moltiplica ogni extra selezionato per il numero di viaggiatori e il totale risalta più delle singole voci. L’unità non deve scomparire su mobile: senza indicarne l’ambito, un numero grande e accattivante può essere facilmente interpretato male.

Scale di raggi e spaziature del sistema di progettazione sistema di design Kiwi Orbit

Distingui i controlli dalle superfici più ampie

La scala attuale dei raggi comprende valori di 2, 4, 6, 8, 12 e 16px, oltre a none e full. I pannelli dell’itinerario e del riepilogo creati appositamente usano angoli da 12px, mentre i controlli nativi mantengono le regole del proprio tema. Applicare il raggio più ampio a ogni elemento annidato farebbe perdere gerarchia al modulo.

Mantieni integra la riga dell’opzione anche quando va a capo

Checkbox e Select controllati nel sistema di progettazione sistema di design Kiwi Orbit

Usa le etichette dei componenti e i campi informativi

Checkbox riceve l’etichetta visibile e le informazioni di supporto tramite le props pubbliche. Select riceve un’etichetta e opzioni esplicite per scegliere da uno a quattro viaggiatori. Queste composizioni native mantengono il comportamento di interazione e di etichettatura senza ricorrere a un div cliccabile che finge di essere un controllo per il bagaglio.

Gestisci ogni extra in modo indipendente

Il bagaglio a mano e quello da stiva sono booleani separati. L’applicazione non presume che selezionarne uno deselezioni automaticamente l’altro. È una regola volutamente semplice per questo esempio; una compagnia aerea reale potrebbe avere pacchetti incompatibili o franchigie specifiche per passeggero, che richiederebbero un modello diverso.

Calcolo e revisione della selezione nel sistema di progettazione sistema di design Kiwi Orbit

Calcola il totale con un’unica formula

L’esempio calcola il numero di viaggiatori moltiplicato per la tariffa base più gli extra selezionati per persona. Non memorizza un totale modificabile a parte, che potrebbe non corrispondere alle opzioni visibili. Tutti i prezzi e le franchigie sono dichiaratamente fittizi e non rappresentano offerte Kiwi.com attuali.

Salva un’istantanea della revisione

La revisione salva insieme il numero di viaggiatori, le scelte sui bagagli e il totale. Se si modifica un controllo, l’istantanea viene cancellata. L’esempio illustra quindi la coerenza dello stato senza presentare un clic locale come prenotazione, pagamento, verifica della disponibilità in tempo reale o preventivo definitivo.

Feedback accessibile sulle scelte nel sistema di progettazione sistema di design Kiwi Orbit

Verifica insieme le etichette e il ricalcolo

Chi usa la tastiera o il puntatore può selezionare i viaggiatori e attivare una delle due opzioni per il bagaglio con i controlli nativi. L’esito della revisione appare in un’area di stato. Non vengono inventati errori di convalida per il bagaglio facoltativo: lasciare deselezionati entrambi gli extra è una scelta valida per questa tariffa fittizia.

  1. Seleziona due viaggiatori e aggiungi il bagaglio a mano.
  2. Aggiungi il bagaglio da stiva e verifica tutti e tre gli importi del dettaglio.
  3. Esamina la selezione in locale, modifica una scelta e verifica che il messaggio di successo precedente scompaia.

Evita conseguenze nascoste

La pagina chiarisce che si tratta di un esempio fittizio sia prima del modulo sia accanto al totale. L’azione è «Esamina la selezione in locale», non «Acquista» o «Prenota». Tutte le modifiche restano nella pagina e, per una dimostrazione che non ne ha bisogno, non vengono richiesti dati personali dei passeggeri.

Provider e stili compilati nel sistema di progettazione sistema di design Kiwi Orbit

Usa la versione stabile corrispondente

Questo esempio usa React components 27.7.0 e i riferimenti ai token 11.0.0. Importa OrbitProvider, il defaultTheme del pacchetto e il file compilato lib/tailwind.css. Senza questo foglio di stile, gli stili dei componenti basati su utility resterebbero incompleti, anche se l’albero React venisse renderizzato.

  • OrbitProvider e defaultTheme del pacchetto.
  • lib/tailwind.css compilato da components 27.7.0.
  • Node.js 22 o versione successiva per l’ambiente di build del pacchetto.

Specifica chiaramente i requisiti di distribuzione

Esempi di componenti del sistema di progettazione sistema di design Kiwi Orbit

main.jsx — esempio completo funzionante

Scegli il bagaglio e consulta un esempio di totale. Il codice seguente è la voce React completa, con tutto lo stato e la convalida.

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 />);

Riferimento del codice

  • Crea un progetto React con Vite, mantieni <div id="root"></div> e salva questo codice come src/main.jsx.

orbit.css — composizione originale adattabile

Impaginazione dell’applicazione costruita intorno ai componenti nativi.

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;
  }
}

Riferimento del codice

  • Salva il file accanto a main.jsx. Queste regole di composizione personalizzate sono distinte dal riferimento ai token della libreria.
04

Configurazione dell’agente per il sistema di progettazione sistema di design Kiwi Orbit

Punto di partenza per l’implementazione

L’esempio nativo bloccato è stato incluso nel bundle e verificato localmente nel browser. L’esempio usa solo lo stato locale dell’applicazione.

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

Un prompt per il tuo progetto

Prompt per l’agente
Crea un selettore di extra per il viaggio con i componenti nativi Orbit e gli stili compilati. Mantieni coerenti il contesto dell’itinerario, i prezzi per viaggiatore, gli extra scelti e il totale. Indica chiaramente che i prezzi sono fittizi e che la revisione avviene in locale; cancella le revisioni non più valide dopo una modifica e non suggerire funzionalità di prenotazione o pagamento.
05

Fonti e ambito del sistema di progettazione sistema di design Kiwi Orbit

Guida per l’applicazione OpenDesign. L’itinerario, la durata, i prezzi e le franchigie bagaglio sono fittizi. I controlli nativi Orbit funzionano in locale; non vengono effettuati ricerche di voli, prenotazioni o pagamenti.