# Sistema di progettazione Kiwi Orbit

## 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.

## 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

| Nome / regola | Valore / configurazione | Utilizzo |
| --- | --- | --- |
| 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. |
| buttonPrimaryBorderColorFocus | rgba(0, 143, 123, 0.5) | Riferimento agli stati dell’azione primaria. Distingui i ruoli di hover, active e focus. |
### Spaziatura dei componenti

| Nome / regola | Valore / configurazione | Utilizzo |
| --- | --- | --- |
| space50 | 2px | Valori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato. |
| space100 | 4px | Valori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato. |
| space150 | 6px | Valori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato. |
| space200 | 8px | Valori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato. |
| space300 | 12px | Valori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato. |
| space400 | 16px | Valori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato. |
| space500 | 20px | Valori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato. |
| space600 | 24px | Valori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato. |
| space800 | 32px | Valori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato. |
| space1000 | 40px | Valori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato. |
| space1200 | 48px | Valori di spaziatura effettivi in pixel, definiti dal pacchetto di token pubblicato. |
### Raggi degli angoli

| Nome / regola | Valore / configurazione | Utilizzo |
| --- | --- | --- |
| borderRadius50 | 2px | I diversi raggi distinguono i controlli dalle superfici di viaggio più ampie. |
| borderRadius100 | 4px | I diversi raggi distinguono i controlli dalle superfici di viaggio più ampie. |
| borderRadius150 | 6px | I diversi raggi distinguono i controlli dalle superfici di viaggio più ampie. |
| borderRadius200 | 8px | I diversi raggi distinguono i controlli dalle superfici di viaggio più ampie. |
| borderRadius300 | 12px | I diversi raggi distinguono i controlli dalle superfici di viaggio più ampie. |
| borderRadius400 | 16px | I diversi raggi distinguono i controlli dalle superfici di viaggio più ampie. |
| borderRadiusNone | 0 | I diversi raggi distinguono i controlli dalle superfici di viaggio più ampie. |
| borderRadiusFull | 9999px | I diversi raggi distinguono i controlli dalle superfici di viaggio più ampie. |
### Testo del corpo

| Nome / regola | Valore / configurazione | Utilizzo |
| --- | --- | --- |
| fontSizeTextSmall | 13px | Ruoli tipografici pubblicati per il corpo del testo; i titoli personalizzati della pagina fanno parte della composizione dell’applicazione. |
| fontSizeTextNormal | 15px | Ruoli tipografici pubblicati per il corpo del testo; i titoli personalizzati della pagina fanno parte della composizione dell’applicazione. |
| fontSizeTextLarge | 16px | Ruoli tipografici pubblicati per il corpo del testo; i titoli personalizzati della pagina fanno parte della composizione dell’applicazione. |
| fontSizeTextExtraLarge | 18px | Ruoli tipografici pubblicati per il corpo del testo; i titoli personalizzati della pagina fanno parte della composizione dell’applicazione. |
### Superfici del prodotto e neutre

| Nome / regola | Valore / configurazione | Utilizzo |
| --- | --- | --- |
| 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. |
## 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.

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

## 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.

### 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

Una riga del bagaglio raggruppa la casella di controllo nativa, il testo informativo sulla franchigia e il prezzo. La larghezza flessibile è assegnata al contenuto descrittivo, mentre il prezzo resta leggibile. La pagina passa a una colonna prima che una delle due aree principali diventi troppo stretta per consentire il confronto.

## 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

Il pacchetto richiede Node.js 22 o versione successiva. La voce Vite fornita può essere riprodotta con questo ambiente e la versione fissata del pacchetto dei componenti. L’originale CSS gestisce solo la composizione dell’itinerario; i controlli nativi mantengono gli stili pubblicati dei componenti e il comportamento del provider.

## 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.

```
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.

```
* {
  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.

## 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.

```
npm create vite@latest orbit-trip -- --template react
cd orbit-trip
npm install
npm install react@18.3.1 react-dom@18.3.1 @kiwicom/orbit-components@27.7.0
# Use Node.js >=22. Replace src/main.jsx and add src/orbit.css.
npm run dev
```

### Un prompt per il tuo progetto

```
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.
```

## 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.

- Guida introduttiva a Orbit Versioni attuali dei componenti e dei token, con risorse per l’implementazione.

- Codice sorgente dei componenti Orbit Props native, stili e requisiti del pacchetto.

- Esportazione dei token fissata Valori esatti dei colori del prodotto, della tipografia, della spaziatura e dei raggi.

## Risorse correlate al sistema di progettazione sistema di design Kiwi Orbit

### Maersk sistema di design

Esamina il linguaggio delle interfacce operative di Maersk attraverso i ruoli del tema chiaro, le scale per titoli e testo, i raggi annidati e la gestione degli identificativi. Un esempio di ricerca delle spedizioni mostra la corrispondenza esatta dei riferimenti e una cronologia degli eventi accessibile, senza dichiarare l’accesso ai dati logistici in tempo reale.

### Microsoft Fluent 2

Crea uno spazio di lavoro Fluent UI React v9 con token semantici effettivi, le scale web di tipografia e spaziatura, schede controllate e una finestra di dialogo per l’accesso con convalida. Confronta i valori del tema, esamina l’anatomia dei componenti e prova un’interazione locale prima di usare l’esempio completo React.

### Monday Vibe

Componi una bacheca di consegna funzionante con i token Vibe 4 e i controlli React. Scopri la differenza tra i colori semantici delle azioni e le etichette della bacheca, le spaziature nominali, le scorciatoie tipografiche e la configurazione esplicita di CSS necessaria per una nuova applicazione.


- [Riferimento per l’implementazione](https://orbit.kiwi/getting-started/)
- [Fonte](https://cdn.jsdelivr.net/npm/@kiwicom/orbit-design-tokens@11.0.0/dist/index.js)
- [Riferimento del codice](https://orbit.kiwi/getting-started/)
- [Guida introduttiva a Orbit Versioni attuali dei componenti e dei token, con risorse per l’implementazione.](https://orbit.kiwi/getting-started/)
- [Codice sorgente dei componenti Orbit Props native, stili e requisiti del pacchetto.](https://github.com/kiwicom/orbit)
- [Esportazione dei token fissata Valori esatti dei colori del prodotto, della tipografia, della spaziatura e dei raggi.](https://cdn.jsdelivr.net/npm/@kiwicom/orbit-design-tokens@11.0.0/dist/index.js)
