Plateforme de données · Nouvelle ressource

Système de design Segment Evergreen.

Une référence Evergreen avec les valeurs de thème réelles, la saisie contrôlée de tags, la correspondance des règles en temps réel, un parcours de récupération depuis un état vide et une boîte de dialogue de révision native.

Guide OpenDesign8 chapitres36 entrées de référenceGuide de l’application d’origine
01

Aperçu de l’interface du système de design Segment Evergreen

Combinez une formule et les étiquettes requises, consultez les enregistrements correspondants, gérez l’absence de correspondance et examinez un instantané local.

Créez et examinez une audience localeOuvrir l’exemple complet
Composants natifs Evergreen 7.1.9 React et defaultTheme ; règles d’audience locales originales. · Référence de mise en œuvre
02

Référence de conception du système de design Segment Evergreen

Composants natifs Evergreen 7.1.9 React et defaultTheme ; règles d’audience locales originales.

Rayons des angles

Source
Nom / règleValeur / configurationUtilisation
radii.00pxRayons indexés du thème ; choisissez un rôle plutôt que d’arrondir de plus en plus chaque boîte imbriquée.
radii.14pxRayons indexés du thème ; choisissez un rôle plutôt que d’arrondir de plus en plus chaque boîte imbriquée.
radii.28pxRayons indexés du thème ; choisissez un rôle plutôt que d’arrondir de plus en plus chaque boîte imbriquée.

Tailles de texte

Source
Nom / règleValeur / configurationUtilisation
fontSizes.010pxValeurs indexées de font-size dans le thème default publié.
fontSizes.112pxValeurs indexées de font-size dans le thème default publié.
fontSizes.214pxValeurs indexées de font-size dans le thème default publié.
fontSizes.316pxValeurs indexées de font-size dans le thème default publié.
fontSizes.418pxValeurs indexées de font-size dans le thème default publié.
fontSizes.520pxValeurs indexées de font-size dans le thème default publié.
fontSizes.624pxValeurs indexées de font-size dans le thème default publié.
fontSizes.732pxValeurs indexées de font-size dans le thème default publié.

Hauteurs de ligne

Source
Nom / règleValeur / configurationUtilisation
lineHeights.016pxAssociez-les au rôle de texte visé plutôt que d’appliquer à chaque paragraphe le rythme des titres.
lineHeights.118pxAssociez-les au rôle de texte visé plutôt que d’appliquer à chaque paragraphe le rythme des titres.
lineHeights.220pxAssociez-les au rôle de texte visé plutôt que d’appliquer à chaque paragraphe le rythme des titres.
lineHeights.324pxAssociez-les au rôle de texte visé plutôt que d’appliquer à chaque paragraphe le rythme des titres.
lineHeights.428pxAssociez-les au rôle de texte visé plutôt que d’appliquer à chaque paragraphe le rythme des titres.
lineHeights.532pxAssociez-les au rôle de texte visé plutôt que d’appliquer à chaque paragraphe le rythme des titres.
lineHeights.640pxAssociez-les au rôle de texte visé plutôt que d’appliquer à chaque paragraphe le rythme des titres.

Graisses de police

Source
Nom / règleValeur / configurationUtilisation
fontWeights.light300Dans ce thème, Evergreen définit semibold comme 500 et bold comme 600 ; ne les remplacez pas silencieusement par les valeurs par défaut des mots-clés du navigateur.
fontWeights.normal400Dans ce thème, Evergreen définit semibold comme 500 et bold comme 600 ; ne les remplacez pas silencieusement par les valeurs par défaut des mots-clés du navigateur.
fontWeights.semibold500Dans ce thème, Evergreen définit semibold comme 500 et bold comme 600 ; ne les remplacez pas silencieusement par les valeurs par défaut des mots-clés du navigateur.
fontWeights.bold600Dans ce thème, Evergreen définit semibold comme 500 et bold comme 600 ; ne les remplacez pas silencieusement par les valeurs par défaut des mots-clés du navigateur.

Références de la palette par défaut

Source
Nom / règleValeur / configurationUtilisation
colors.gray900#101840 Texte principal foncé.
colors.gray700#696f8c Texte d’accompagnement.
colors.gray400#d8dae5 Limite définie.
colors.gray200#edeff5 Séparateur discret.
colors.gray100#F4F5F9 Arrière-plan discret.
colors.blue500#3366FF Référence de bleu principal.
colors.blue600#2952CC Référence de bleu plus soutenu pour les interactions.
colors.red500#D14343 Référence critique/d’erreur.
colors.green500#52BD95 Référence de réussite.

Fonctions de mise en page et saisie contrôlée API

Source
Nom / règleValeur / configurationUtilisation
majorScale(3)24pxÉchelle principale de huit pixels pour l’espacement des sections.
minorScale(3)12pxÉchelle secondaire de quatre pixels pour les espacements plus réduits.
TagInput.valuescontrolled arrayL’application gère les étiquettes acceptées.
TagInput.onChangenew array; return false to retain inputValidez les ajouts avant de les accepter.
TagInput.separatorcomma and new line by defaultAutorisez plusieurs étiquettes sans analyseur personnalisé.
03

Guide complet du système de design Segment Evergreen

Un guide pratique pour choisir, appliquer et évaluer ce système dans une interface réelle.

DESIGN-segment-evergreen.md

Des conseils complets, un point de départ pour la mise en œuvre et des liens vers les sources.

Télécharger le guide

Structure du générateur d’audience du système de design Segment Evergreen

Associez les règles aux conséquences qu’elles entraînent

L’exemple associe un panneau de règles à des enregistrements fictifs correspondants. Le menu de sélection de formule et les étiquettes requises restent visibles en même temps que le nombre de résultats, afin que l’effet d’une modification soit facile à comprendre. Il n’est pas nécessaire d’enregistrer quoi que ce soit ni d’ouvrir une boîte de dialogue pour savoir si la combinaison actuelle correspond à des personnes.

Extrait de ce guide OpenDesign

Utilisez un jeu de données fini et transparent

Cinq exemples nommés présentent leur forfait et leurs étiquettes. La page ne prétend pas interroger un entrepôt de données clients ni estimer la taille réelle d’une audience. Un résultat nul est utile dans cet exemple, avec une action permettant de rétablir le jeu de données complet.

Valeurs et sémantique du thème du système de design Segment Evergreen

Consultez le thème par défaut réel

Evergreen 7.1.9 fournit des rayons, des tailles de police et des hauteurs de ligne indexés, ainsi que des couleurs nommées et des styles de composants. Le tableau conserve ces valeurs exportées telles quelles. Les noms des graisses de police méritent une attention particulière : semibold et bold correspondent respectivement à 500 et 600, contrairement aux idées courantes.

Harmonisez la composition personnalisée

ThemeProvider fournit les composants natifs de saisie, les étiquettes, les badges, les boutons et la boîte de dialogue. Les panneaux personnalisés reprennent la même association sobre de gris froid et de bleu. L’exemple ne remplace pas les styles internes des composants natifs par des sélecteurs CSS trop généraux, afin de préserver les styles d’interaction fournis.

Typographie du système de design Segment Evergreen pour la modification de règles

Hiérarchisez clairement les informations de la tâche

Les niveaux de titre distinguent le titre de l’audience des titres de panneaux et des noms de résultats individuels. Le texte complémentaire explique la saisie des étiquettes et la portée des données fictives. Un badge de décompte est placé à côté du titre des résultats plutôt que de le remplacer : l’utilisateur peut ainsi repérer la zone avant d’interpréter le nombre.

Veillez à la lisibilité des métadonnées

Les informations sur les forfaits et les étiquettes étayent l’explication des correspondances : elles ne sont pas purement décoratives. La mise en page permet aux étiquettes de passer à la ligne et empile le texte et les badges d’un enregistrement sur un téléphone étroit. Réduire toutes les étiquettes à un texte minuscule masquerait les éléments dont l’utilisateur a besoin pour comprendre les règles.

Échelles majeures et mineures du système de design Segment Evergreen

Utilisez des fonctions pour un espacement cohérent

majorScale et minorScale définissent des intervalles de huit et quatre pixels. Dans l’exemple de composant, majorScale(3) définit un espacement de 24px autour du titre du panneau, tandis que la feuille de style personnalisée gère la composition adaptative. Gardez cette distinction à l’esprit : un point de rupture de grille relève d’une décision de l’application, pas d’une fonction d’espacement.

Préservez les relations entre les champs sur mobile

Étiquettes contrôlées et correspondances dans le système de design Segment Evergreen

Normalisez les valeurs avant de les accepter

Le gestionnaire onChange supprime les espaces de début et de fin, convertit les chaînes en minuscules, élimine les doublons et refuse plus de quatre étiquettes distinctes. Renvoyer false conserve la valeur saisie lorsqu’un ajout est refusé. Cette règle relève de l’application d’audience ; TagInput fournit une interaction contrôlée, sans imposer de limite métier.

Appliquez délibérément la correspondance avec toutes les étiquettes

Un enregistrement doit correspondre au forfait sélectionné et à chacune des étiquettes requises. Effacer les étiquettes supprime cette contrainte ; choisir « Tous » supprime la contrainte liée au forfait. Le nombre de résultats affiché est calculé à partir du même tableau filtré que celui utilisé pour afficher les fiches, afin que le décompte corresponde toujours aux éléments visibles.

Boîte de dialogue de vérification et instantané local dans le système de design Segment Evergreen

Vérifiez les règles actuelles avant l’enregistrement

Un nom d’audience non vide est requis pour ouvrir la boîte de dialogue. Celle-ci récapitule le nom, le nombre, le forfait et les étiquettes, puis propose « Enregistrer localement ». Cette étape supplémentaire montre une superposition native présentant un instantané concret, plutôt qu’une confirmation vide qui se contente de demander « Êtes-vous sûr ? ».

Invalidez l’ancien message de réussite lorsque les règles changent

Toute modification du nom, du forfait ou des étiquettes efface l’indicateur d’instantané enregistré. Une réussite locale antérieure ne peut donc pas être confondue avec la confirmation de règles modifiées depuis. L’application ne présente jamais l’instantané comme une audience Segment et n’envoie aucune requête à une plateforme client.

Saisie au clavier et rétablissement de la boîte de dialogue dans le système de design Segment Evergreen

Testez les étiquettes, les résultats et la vérification dans un même parcours

Les étiquettes peuvent être ajoutées à l’aide des touches de saisie documentées, et l’identifiant du champ lui associe un libellé visible. Le dépassement de la limite d’étiquettes déclenche une alerte native de niveau danger. La vérification utilise le comportement natif de gestion du focus de Dialog plutôt qu’une superposition créée manuellement sans gestion du focus.

  1. Ajoutez newsletter aux étiquettes actives initiales et comparez le décompte.
  2. Ajoutez une étiquette sans correspondance, puis effacez les règles pour rétablir les cinq enregistrements.
  3. Vérifiez les règles et enregistrez localement, puis modifiez une règle et vérifiez que l’ancien message de réussite disparaît.

Gardez le rétablissement depuis l’état vide dans le parcours en cours

Effacer les règles supprime les restrictions de forfait et d’étiquettes, et masque un ancien état d’enregistrement. La zone de résultats affiche alors de nouveau les cinq enregistrements. L’utilisateur peut reprendre immédiatement ses modifications : aucune navigation masquée ni aucun rechargement de page n’est nécessaire.

Intégration du système de design Segment Evergreen React

Utilisez un exemple complet et contrôlé

L’entrée native importe ThemeProvider, defaultTheme et les composants qu’elle affiche. L’état contient les règles, les erreurs, la visibilité de la boîte de dialogue et l’instantané enregistré localement. Le JSX complet et CSS ci-dessous comprennent le jeu de données fictif ; le calcul des résultats peut donc être reproduit sans API externe.

  • ThemeProvider utilise defaultTheme, dont la version est figée.
  • Les valeurs de TagInput sont contrôlées par l’application.
  • Dialog vérifie les mêmes règles que celles utilisées pour la liste des résultats.

Ajoutez l’accès aux données dans une couche applicative distincte

Exemples de composants du système de design Segment Evergreen

main.jsx — exemple complet fonctionnel

Créez et vérifiez une audience locale. Le code source ci-dessous constitue l’entrée complète de React, avec tout l’état et la validation.

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

Référence du code

  • Créez un projet Vite React, conservez <div id="root"></div> et chargez ce fichier comme src/main.jsx.

evergreen.css — composition adaptative d’origine

Mise en page de l’application construite autour des composants natifs.

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

Référence du code

  • Enregistrez ce fichier à côté de main.jsx. Ces règles de composition personnalisées se distinguent de la référence des jetons de la bibliothèque.
04

Configuration d’agent pour le système de design Segment Evergreen

Point de départ de l’implémentation

L’exemple natif épinglé a été assemblé et vérifié localement dans un navigateur. Cet exemple utilise uniquement l’état local de l’application.

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 pour votre projet

Prompt pour l’agent IA
Créez un éditeur d’audience Evergreen utilisant le thème réel et TagInput contrôlé. Normalisez et dédupliquez les étiquettes, explicitez la correspondance avec toutes les étiquettes, assurez la cohérence entre les résultats et leur décompte, effectuez la vérification dans une boîte de dialogue native et effacez tout ancien message de réussite lorsque les règles changent. Ne prétendez pas être connecté à un service Segment.
05

Sources et périmètre du système de design Segment Evergreen

OpenDesign Guide d’application d’Evergreen 7.1.9. Cinq enregistrements fictifs illustrent le filtrage local et l’examen d’un instantané. Aucune donnée client ni audience Segment API n’est connectée.