Piattaforma dati · Nuova risorsa

Sistema di design Segment Evergreen.

Un riferimento Evergreen con valori tema reali, inserimento controllato di tag, corrispondenza delle regole in tempo reale, un percorso di recupero per lo stato vuoto e un dialogo nativo di revisione.

Guida OpenDesign8 capitoli36 voci di riferimentoGuida applicativa originale
01

Sistema di design Segment Evergreen: anteprima dell’interfaccia

Combina un piano e i tag obbligatori, esamina i record corrispondenti, gestisci l’assenza di risultati e consulta un’istantanea locale.

Crea e verifica un pubblico localeApri l’esempio completo
Componenti Evergreen 7.1.9 React nativi e defaultTheme; regole originali per il pubblico locale. · Riferimento per l’implementazione
02

Sistema di design Segment Evergreen: riferimento di progettazione

Componenti Evergreen 7.1.9 React nativi e defaultTheme; regole originali per il pubblico locale.

Raggi degli angoli

Fonte
Nome / regolaValore / configurazioneUtilizzo
radii.00pxRaggio indicizzato del tema: scegli un ruolo invece di arrotondare progressivamente ogni contenitore annidato.
radii.14pxRaggio indicizzato del tema: scegli un ruolo invece di arrotondare progressivamente ogni contenitore annidato.
radii.28pxRaggio indicizzato del tema: scegli un ruolo invece di arrotondare progressivamente ogni contenitore annidato.

Dimensioni del testo

Fonte
Nome / regolaValore / configurazioneUtilizzo
fontSizes.010pxValori font-size indicizzati nel tema predefinito pubblicato.
fontSizes.112pxValori font-size indicizzati nel tema predefinito pubblicato.
fontSizes.214pxValori font-size indicizzati nel tema predefinito pubblicato.
fontSizes.316pxValori font-size indicizzati nel tema predefinito pubblicato.
fontSizes.418pxValori font-size indicizzati nel tema predefinito pubblicato.
fontSizes.520pxValori font-size indicizzati nel tema predefinito pubblicato.
fontSizes.624pxValori font-size indicizzati nel tema predefinito pubblicato.
fontSizes.732pxValori font-size indicizzati nel tema predefinito pubblicato.

Altezze di riga

Fonte
Nome / regolaValore / configurazioneUtilizzo
lineHeights.016pxAbbina il ruolo tipografico previsto invece di applicare a ogni paragrafo il ritmo delle intestazioni.
lineHeights.118pxAbbina il ruolo tipografico previsto invece di applicare a ogni paragrafo il ritmo delle intestazioni.
lineHeights.220pxAbbina il ruolo tipografico previsto invece di applicare a ogni paragrafo il ritmo delle intestazioni.
lineHeights.324pxAbbina il ruolo tipografico previsto invece di applicare a ogni paragrafo il ritmo delle intestazioni.
lineHeights.428pxAbbina il ruolo tipografico previsto invece di applicare a ogni paragrafo il ritmo delle intestazioni.
lineHeights.532pxAbbina il ruolo tipografico previsto invece di applicare a ogni paragrafo il ritmo delle intestazioni.
lineHeights.640pxAbbina il ruolo tipografico previsto invece di applicare a ogni paragrafo il ritmo delle intestazioni.

Pesi dei caratteri

Fonte
Nome / regolaValore / configurazioneUtilizzo
fontWeights.light300In questo tema Evergreen assegna a semibold il valore 500 e a bold il valore 600; non sostituirli senza avviso con i valori predefiniti delle parole chiave del browser.
fontWeights.normal400In questo tema Evergreen assegna a semibold il valore 500 e a bold il valore 600; non sostituirli senza avviso con i valori predefiniti delle parole chiave del browser.
fontWeights.semibold500In questo tema Evergreen assegna a semibold il valore 500 e a bold il valore 600; non sostituirli senza avviso con i valori predefiniti delle parole chiave del browser.
fontWeights.bold600In questo tema Evergreen assegna a semibold il valore 500 e a bold il valore 600; non sostituirli senza avviso con i valori predefiniti delle parole chiave del browser.

Riferimenti alla palette predefinita

Fonte
Nome / regolaValore / configurazioneUtilizzo
colors.gray900#101840 Testo scuro principale.
colors.gray700#696f8c Testo di supporto.
colors.gray400#d8dae5 Bordo definito.
colors.gray200#edeff5 Separatore discreto.
colors.gray100#F4F5F9 Sfondo sobrio.
colors.blue500#3366FF Riferimento al blu principale.
colors.blue600#2952CC Riferimento al blu per le interazioni più marcate.
colors.red500#D14343 Riferimento per errori e situazioni critiche.
colors.green500#52BD95 Riferimento per gli stati di successo.

Funzioni di layout e input controllato API

Fonte
Nome / regolaValore / configurazioneUtilizzo
majorScale(3)24pxScala principale di 8 pixel per la spaziatura tra sezioni.
minorScale(3)12pxScala secondaria di 4 pixel per relazioni più ravvicinate.
TagInput.valuescontrolled arrayL’applicazione gestisce i tag accettati.
TagInput.onChangenew array; return false to retain inputConvalida i tag aggiunti prima di accettarli.
TagInput.separatorcomma and new line by defaultConsenti più tag senza un parser personalizzato.
03

Guida completa al sistema di progettazione sistema di design Segment Evergreen

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

DESIGN-segment-evergreen.md

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

Scarica la guida

Struttura del generatore di pubblico del sistema di progettazione sistema di design Segment Evergreen

Mantieni le regole accanto alle loro conseguenze

L’esempio affianca un pannello delle regole ai record fittizi corrispondenti. Il selettore del piano e i tag richiesti sono visibili insieme al conteggio dei risultati, così è chiaro l’effetto di ogni modifica a una regola. Per scoprire se la combinazione attuale corrisponde a qualche record, non occorre salvare né aprire una finestra di dialogo.

Da questa guida su OpenDesign

Usa un insieme di dati finito e trasparente

Cinque record con nome mostrano il rispettivo piano e i relativi tag. La pagina non finge di interrogare un archivio clienti né di stimare le dimensioni di un pubblico reale. Anche un risultato pari a zero è utile nell’esempio; un’azione permette di ripristinare l’intero insieme di dati.

Valori e semantica del tema del sistema di progettazione sistema di design Segment Evergreen

Consulta il tema predefinito effettivo

Evergreen 7.1.9 fornisce raggi, dimensioni dei caratteri e interlinee indicizzati, oltre a colori con nome e stili dei componenti. La tabella mantiene invariati i valori esportati. Vale la pena soffermarsi in particolare sui nomi dei pesi: semibold e bold corrispondono rispettivamente a 500 e 600, valori diversi da quelli comunemente previsti.

Mantieni coerente la composizione personalizzata

ThemeProvider fornisce gli input nativi, i tag, i badge, i pulsanti e la finestra di dialogo. I pannelli personalizzati riprendono la stessa combinazione sobria di grigio freddo e blu. L’esempio non sovrascrive i dettagli interni dei componenti nativi con selettori CSS troppo generici, quindi gli stili di interazione forniti restano intatti.

Tipografia per modificare le regole nel sistema di progettazione sistema di design Segment Evergreen

Definisci una gerarchia chiara per l’attività

I ruoli delle intestazioni distinguono il titolo del pubblico dai titoli dei pannelli e dai nomi dei singoli risultati. Il testo di supporto spiega come inserire i tag e chiarisce che i dati sono fittizi. Un badge con il conteggio è accanto all’intestazione dei risultati, anziché sostituirla: così si può identificare la sezione prima di interpretare il numero.

Mantieni leggibili i metadati

Le informazioni su piani e tag aiutano a capire la corrispondenza e non sono puramente decorative. Il layout consente ai tag di andare a capo e, sugli schermi stretti dei telefoni, dispone su righe separate il testo e i badge di un record. Ridurre tutte le etichette a un testo minuscolo nasconderebbe gli elementi necessari per comprendere le regole.

Scale principali e secondarie del sistema di progettazione sistema di design Segment Evergreen

Usa funzioni per una spaziatura ripetibile

majorScale e minorScale esprimono incrementi rispettivamente di otto e quattro pixel. Nell’esempio del componente, majorScale(3) imposta uno spazio di 24px sotto l’intestazione del pannello, mentre il foglio di stile personalizzato gestisce la composizione adattiva. Mantieni chiara questa distinzione: il breakpoint della griglia è una scelta dell’applicazione, non il risultato di una funzione di spaziatura.

Mantieni le relazioni tra i campi sui dispositivi mobili

Tag controllati e corrispondenze nel sistema di progettazione sistema di design Segment Evergreen

Normalizza i valori prima di accettarli

Il gestore onChange rimuove gli spazi iniziali e finali, converte le stringhe in minuscolo, elimina i duplicati e rifiuta più di quattro tag distinti. Restituire false mantiene l’input quando un’aggiunta viene rifiutata. Questa regola appartiene all’applicazione del pubblico: TagInput gestisce l’interazione controllata, senza stabilire un limite di business.

Applica consapevolmente la corrispondenza con tutti i tag

Un record deve corrispondere al piano selezionato e a ogni tag richiesto. Se si cancellano i tag, il relativo vincolo viene rimosso; scegliendo Qualsiasi, viene rimosso il vincolo sul piano. Il conteggio attuale è calcolato sullo stesso array filtrato mostrato sullo schermo, così il numero corrisponde sempre alle schede visibili.

Finestra di revisione e istantanea locale nel sistema di progettazione sistema di design Segment Evergreen

Controlla le regole attuali prima di salvare

Per aprire la finestra di dialogo è necessario specificare un nome per il pubblico. La finestra mostra nuovamente il nome, il conteggio, il piano e i tag, quindi offre l’opzione Salva in locale. Questo passaggio aggiuntivo illustra un overlay nativo con un’istantanea concreta, invece di una conferma vuota che chiede soltanto «Confermi?».

Annulla il vecchio stato di successo quando cambiano le regole

Se cambiano il nome, il piano o i tag, l’indicatore dell’istantanea salvata viene cancellato. In questo modo, un precedente salvataggio locale non può essere scambiato per una conferma delle regole appena modificate. L’applicazione non presenta l’istantanea come un pubblico di Segment e non invia richieste a una piattaforma clienti.

Inserimento da tastiera e ripristino della finestra di dialogo nel sistema di progettazione sistema di design Segment Evergreen

Verifica tag, risultati e revisione con un unico flusso

I tag possono essere aggiunti usando i tasti previsti e l’input riceve un’etichetta visibile tramite il suo id. Se viene superato il limite dei tag, compare un avviso di errore nativo. La revisione usa il comportamento nativo di Dialog per la gestione del focus, anziché un overlay creato manualmente con il focus non gestito.

  1. Aggiungi newsletter al tag attivo iniziale e confronta il conteggio.
  2. Aggiungi un tag senza corrispondenze, poi cancella le regole per ripristinare i cinque record.
  3. Rivedi e salva in locale, poi modifica una regola e verifica che il vecchio stato di successo scompaia.

Consenti di recuperare dallo stato vuoto senza interrompere l’attività

Cancella regole rimuove i vincoli sul piano e sui tag e chiude uno stato di salvataggio ormai superato. La sezione dei risultati mostra quindi di nuovo tutti e cinque i record. L’utente può continuare subito a modificare le regole: non servono navigazione nascosta né ricaricamento della pagina.

Integrazione React del sistema di progettazione sistema di design Segment Evergreen

Usa un esempio completo e controllato

Il punto d’ingresso nativo importa ThemeProvider, defaultTheme e i componenti che visualizza. Lo stato contiene regole, errori, visibilità della finestra di dialogo e istantanea salvata in locale. Il JSX completo e CSS qui sotto includono l’insieme di dati fittizi, così il calcolo dei risultati è riproducibile senza un API esterno.

  • ThemeProvider usa defaultTheme, bloccato alla versione specificata.
  • I valori di TagInput sono controllati dall’applicazione.
  • Dialog rivede le stesse regole usate dall’elenco dei risultati.

Aggiungi l’accesso ai dati come livello applicativo separato

Esempi di componenti del sistema di progettazione sistema di design Segment Evergreen

main.jsx — esempio completo funzionante

Crea e rivedi un pubblico in locale. Il sorgente qui sotto è il punto d’ingresso completo di React, con tutto lo stato e la convalida.

jsx
import React, { useState } from "react";
import { createRoot } from "react-dom/client";
import {
  ThemeProvider,
  defaultTheme,
  Heading,
  Text,
  Paragraph,
  Button,
  TagInput,
  TextInputField,
  SelectField,
  Alert,
  Dialog,
  Badge,
  majorScale,
} from "evergreen-ui";
import "./evergreen.css";
const people = [
  { name: "Avery Stone", plan: "Pro", tags: ["active", "newsletter"] },
  { name: "Taylor Reed", plan: "Free", tags: ["newsletter"] },
  { name: "Jordan Park", plan: "Pro", tags: ["active"] },
  { name: "Morgan Lee", plan: "Team", tags: ["active", "newsletter"] },
  { name: "Casey Chen", plan: "Free", tags: ["trial"] },
];
function App() {
  const [tags, setTags] = useState(["active"]),
    [plan, setPlan] = useState("Any"),
    [name, setName] = useState("Active customers"),
    [error, setError] = useState(""),
    [open, setOpen] = useState(false),
    [saved, setSaved] = useState(null);
  const matches = people.filter(
    (p) =>
      (plan === "Any" || p.plan === plan) &&
      tags.every((t) => p.tags.includes(t)),
  );
  function changeTags(values) {
    const unique = [
      ...new Set(values.map((v) => v.trim().toLowerCase()).filter(Boolean)),
    ];
    if (unique.length > 4) {
      setError("Use at most four tags.");
      return false;
    }
    setTags(unique);
    setError("");
    setSaved(null);
  }
  return (
    <ThemeProvider value={defaultTheme}>
      <main className="audience">
        <header>
          <Text size={300}>WORKSPACE / AUDIENCES</Text>
          <Heading size={700} marginTop={8}>
            Build a focused audience
          </Heading>
          <Paragraph marginTop={8}>
            Combine a plan and tags against five fictional records. No customer
            data is loaded.
          </Paragraph>
        </header>
        <div className="audience-grid">
          <section className="rule-panel">
            <Heading size={500} marginBottom={majorScale(3)}>
              Audience rules
            </Heading>
            <TextInputField
              label="Audience name"
              value={name}
              onChange={(e) => {
                setName(e.target.value);
                setSaved(null);
              }}
            />
            <SelectField
              label="Plan"
              value={plan}
              onChange={(e) => {
                setPlan(e.target.value);
                setSaved(null);
              }}
            >
              <option>Any</option>
              <option>Free</option>
              <option>Pro</option>
              <option>Team</option>
            </SelectField>
            <label htmlFor="audience-tags">Required tags</label>
            <Paragraph size={300} marginBottom={8}>
              Press Enter or comma to add a tag. Every tag must match.
            </Paragraph>
            <TagInput
              values={tags}
              onChange={changeTags}
              width="100%"
              inputProps={{ id: "audience-tags", placeholder: "Add tag…" }}
            />
            <Paragraph size={300} marginTop={8}>
              Available sample tags: active, newsletter, trial.
            </Paragraph>
            {error && <Alert intent="danger" title={error} marginTop={16} />}
            <Button
              appearance="primary"
              marginTop={24}
              onClick={() => {
                if (!name.trim()) {
                  setError("Name the audience before reviewing.");
                  return;
                }
                setError("");
                setOpen(true);
              }}
            >
              Review audience
            </Button>
          </section>
          <section className="results-panel">
            <div className="results-title">
              <Heading size={500}>Matching sample records</Heading>
              <Badge color="blue">
                {matches.length} of {people.length}
              </Badge>
            </div>
            {matches.length ? (
              <div className="record-list">
                {matches.map((p) => (
                  <article key={p.name}>
                    <div>
                      <Heading size={400}>{p.name}</Heading>
                      <Text size={300}>{p.plan} plan</Text>
                    </div>
                    <div className="tag-list">
                      {p.tags.map((t) => (
                        <Badge key={t} color="neutral">
                          {t}
                        </Badge>
                      ))}
                    </div>
                  </article>
                ))}
              </div>
            ) : (
              <div className="empty">
                <Heading size={500}>No matching sample records</Heading>
                <Paragraph marginTop={8}>
                  Remove a tag or change the plan to broaden the selection.
                </Paragraph>
                <Button
                  marginTop={16}
                  onClick={() => {
                    setTags([]);
                    setPlan("Any");
                    setSaved(null);
                  }}
                >
                  Clear rules
                </Button>
              </div>
            )}
            {saved && (
              <Alert
                intent="success"
                title="Local audience saved"
                marginTop={20}
              >
                {saved.name} · {saved.count} sample records. Nothing was sent to
                Segment.
              </Alert>
            )}
          </section>
        </div>
        <Dialog
          isShown={open}
          title="Review local audience"
          onCloseComplete={() => setOpen(false)}
          confirmLabel="Save locally"
          onConfirm={() => {
            setSaved({ name: name.trim(), count: matches.length });
            setOpen(false);
          }}
          width={560}
        >
          <Paragraph>
            <strong>{name}</strong> matches {matches.length} of {people.length}{" "}
            fictional records.
          </Paragraph>
          <Paragraph marginTop={12}>
            Plan: {plan}. Required tags: {tags.join(", ") || "none"}.
          </Paragraph>
          <Paragraph marginTop={12}>
            This saves only a local snapshot; it does not create a Segment
            audience.
          </Paragraph>
        </Dialog>
        <footer>
          Native Evergreen 7.1.9 React components. Original audience logic; no
          analytics or customer service connection.
        </footer>
      </main>
    </ThemeProvider>
  );
}
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.

evergreen.css — composizione adattiva originale

Impaginazione dell’applicazione costruita intorno ai componenti nativi.

css
* {
  box-sizing: border-box;
}
body {
  margin: 0;
  background: #f4f5f9;
  color: #101840;
  font:
    14px/1.5 system-ui,
    sans-serif;
}
.audience {
  padding: 32px;
}
.audience header {
  max-width: 800px;
  margin-bottom: 28px;
}
.audience-grid {
  display: grid;
  grid-template-columns: minmax(260px, 0.85fr) minmax(0, 1.5fr);
  gap: 24px;
}
.rule-panel,
.results-panel {
  padding: 24px;
  background: white;
  border: 1px solid #d8dae5;
  border-radius: 8px;
  min-width: 0;
}
.rule-panel > label {
  font-weight: 600;
  display: block;
  margin-bottom: 8px;
}
.results-title {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 16px;
  margin-bottom: 24px;
}
.record-list article {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 20px 0;
  border-bottom: 1px solid #edeff5;
}
.record-list article:first-child {
  padding-top: 0;
}
.record-list article:last-child {
  border: 0;
}
.tag-list {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
}
.empty {
  padding: 36px 12px;
  text-align: center;
  background: #f4f5f9;
  border-radius: 4px;
}
.audience footer {
  margin-top: 24px;
  font-size: 12px;
  color: #696f8c;
}
.audience input {
  max-width: 100%;
}
[role="dialog"] {
  max-width: calc(100vw - 32px);
}
@media (max-width: 850px) {
  .audience-grid {
    grid-template-columns: 1fr;
  }
}
@media (max-width: 550px) {
  .audience {
    padding: 16px;
  }
  .rule-panel,
  .results-panel {
    padding: 20px;
  }
  .record-list article {
    align-items: flex-start;
    flex-direction: column;
  }
  .results-title {
    align-items: flex-start;
  }
}

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 del sistema di progettazione sistema di design Segment Evergreen

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 evergreen-audience -- --template react
cd evergreen-audience
npm install
npm install [email protected] [email protected] [email protected]
# Replace src/main.jsx and add src/evergreen.css.
npm run dev

Un prompt per il tuo progetto

Prompt per l’agente
Crea un editor di pubblici Evergreen usando il tema effettivo e TagInput controllato. Normalizza i tag ed elimina i duplicati, rendi esplicita la corrispondenza con tutti i tag, mantieni coerenti risultati e conteggi, consenti la revisione in un Dialog nativo e cancella gli stati di successo non più validi quando cambiano le regole. Non dichiarare che esiste una connessione al servizio Segment.
05

Fonti e ambito del sistema di progettazione sistema di design Segment Evergreen

OpenDesign guida applicativa per Evergreen 7.1.9. Cinque record fittizi illustrano il filtraggio locale e la revisione dell’istantanea. Non è collegato alcun dato cliente di Segment né alcun API di pubblico.