Design de produits d’entreprise · Nouvelle ressource

Système de design REI Cedar.

Créez un sélecteur de commandes Cedar concret avec des vignettes Vue natives, les véritables valeurs des tokens, une navigation complète au clavier et une composition de produits adaptative.

Guide OpenDesign7 chapitres37 entrées de référenceGuide de l’application d’origine
01

Aperçu de l’interface du système de design REI Cedar

Utilisez les tuiles Cedar natives pour choisir la livraison ou le retrait, avec navigation au clavier et une option indisponible.

Choisir un mode de traitement de commandeOuvrir l’exemple complet
Cedar natif 17.1.0 / Vue 3 avec composition originale. · Référence de mise en œuvre
02

Référence de conception du système de design REI Cedar

Valeurs extraites du thème REI de @rei/cdr-tokens 14.0.1 ; comportement des composants natifs vérifié avec @rei/cedar 17.1.0.

Rôles des couleurs du thème REI

Source
Nom / règleValeur / configurationUtilisation
cdr-color-background-button-primary-rest#1f513f Fond du bouton principal.
cdr-color-background-button-primary-hover#c7dfd1 Couleur de fond au survol pour l’action principale.
cdr-color-background-primary#ffffff Surface de contenu par défaut.
cdr-color-background-secondary#F4F2ED Surface secondaire.
cdr-color-text-button-primary#fafbf9 Libellé du bouton principal.
cdr-color-text-primary#4b4a48 Rôle du texte principal.
cdr-color-text-secondary#736e65 Texte d’accompagnement.
cdr-color-text-error#811823 Texte du message d’erreur.
cdr-color-border-primary#d5cfc3 Limite de la surface principale.
cdr-color-border-secondary#958e83 Rôle de bordure secondaire.

Espacement et rayon selon une racine de 10 px

Source
Nom / règleValeur / configurationUtilisation
cdr-space-zero0À la racine Cedar, 1rem équivaut à 10px ; ne réutilisez pas ces valeurs telles quelles avec une racine de 16px.
cdr-space-sixteenth-x0.1remÀ la racine Cedar, 1rem équivaut à 10px ; ne réutilisez pas ces valeurs telles quelles avec une racine de 16px.
cdr-space-eighth-x0.2remÀ la racine Cedar, 1rem équivaut à 10px ; ne réutilisez pas ces valeurs telles quelles avec une racine de 16px.
cdr-space-three-sixteenth-x0.3remÀ la racine Cedar, 1rem équivaut à 10px ; ne réutilisez pas ces valeurs telles quelles avec une racine de 16px.
cdr-space-quarter-x0.4remÀ la racine Cedar, 1rem équivaut à 10px ; ne réutilisez pas ces valeurs telles quelles avec une racine de 16px.
cdr-space-three-eighth-x0.6remÀ la racine Cedar, 1rem équivaut à 10px ; ne réutilisez pas ces valeurs telles quelles avec une racine de 16px.
cdr-space-half-x0.8remÀ la racine Cedar, 1rem équivaut à 10px ; ne réutilisez pas ces valeurs telles quelles avec une racine de 16px.
cdr-space-three-quarter-x1.2remÀ la racine Cedar, 1rem équivaut à 10px ; ne réutilisez pas ces valeurs telles quelles avec une racine de 16px.
cdr-space-one-x1.6remÀ la racine Cedar, 1rem équivaut à 10px ; ne réutilisez pas ces valeurs telles quelles avec une racine de 16px.
cdr-space-one-and-a-half-x2.4remÀ la racine Cedar, 1rem équivaut à 10px ; ne réutilisez pas ces valeurs telles quelles avec une racine de 16px.
cdr-space-two-x3.2remÀ la racine Cedar, 1rem équivaut à 10px ; ne réutilisez pas ces valeurs telles quelles avec une racine de 16px.
cdr-space-three-x4.8remÀ la racine Cedar, 1rem équivaut à 10px ; ne réutilisez pas ces valeurs telles quelles avec une racine de 16px.
cdr-space-four-x6.4remÀ la racine Cedar, 1rem équivaut à 10px ; ne réutilisez pas ces valeurs telles quelles avec une racine de 16px.
cdr-radius-sharp0Forme des angles issue du paquet de jetons épinglé.
cdr-radius-soft0.2remForme des angles issue du paquet de jetons épinglé.
cdr-radius-softer0.4remForme des angles issue du paquet de jetons épinglé.
cdr-radius-softest0.6remForme des angles issue du paquet de jetons épinglé.
cdr-radius-round999.9remForme des angles issue du paquet de jetons épinglé.

Tuile de traitement de commande API

Source
Nom / règleValeur / configurationUtilisation
checkedbooleanReflète le mode sélectionné.
disabledbooleanOption indisponible ; ne permettez pas de changer son état.
roleradio | checkboxUtilisez des boutons radio pour choisir un seul mode de traitement de commande.
tabindex0 / -1L’application gère un seul arrêt de tabulation et la navigation avec les touches fléchées.
header slotmethod labelNom de l’option facile à comprendre.
body slotsupporting detailsDélai de livraison ou lieu de retrait.
footer slotprominent detailCoût ou disponibilité.
icon-right slotselection indicatorL’exemple ajoute une coche au mode sélectionné.
loadingbooleanMasque le corps et le pied de page tout en conservant l’en-tête et les dimensions.
03

Guide complet du système de design REI Cedar

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

DESIGN-rei-cedar.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

Dépendances d’exécution Vue du système de design REI Cedar

Épinglez ensemble les composants et les jetons

L’exemple fonctionnel utilise @rei/cedar 17.1.0 avec @rei/cdr-tokens 14.0.1 et Vue 3. Le paquet de composants propose des points d’entrée modulaires. Cet exemple importe uniquement CdrButton et CdrFulfillmentTile, ainsi que CSS nécessaire à leurs composants imbriqués de surface, de mise en page et de texte. Le code source répertorie chaque importation, car le comportement de JavaScript ne garantit pas à lui seul un rendu avec styles.

Extrait de ce guide OpenDesign

N’incluez pas de polices propriétaires dans l’exemple

Les instructions d’installation de Cedar distinguent l’utilisation des composants des droits d’utilisation des polices REI. L’exemple n’importe ni cdr-fonts.css ni la feuille de style globale contenant les déclarations de polices. Il utilise une police sans empattement système pour le texte de l’interface et Georgia pour le titre éditorial original. Ces polices de substitution relèvent de choix de l’application ; elles ne correspondent pas à la typographie de la marque REI.

Unités des jetons et couleurs des surfaces du système de design REI Cedar

Utilisez l’échelle de racine Cedar

Les jetons Cedar expriment un espacement de 16px par 1.6rem, car la taille de racine attendue est de 10px. Avec une racine de 16px, cette même valeur passerait à 25.6px. L’exemple isolé définit html à 62.5 % et utilise une taille de corps de 1.6rem. Un produit hôte dont la racine est différente nécessite une frontière d’intégration réfléchie, plutôt qu’une réinitialisation globale ajoutée telle quelle à un site existant.

Associez les jetons aux rôles des composants

Le bouton principal utilise un fond vert foncé au repos et un fond vert pâle au survol. Les surfaces de contenu et les bordures adoptent des tons neutres chauds. Le tableau présente les valeurs sémantiques du thème REI, et non celles du site de documentation. Le sac illustré utilise des couleurs décoratives originales, qui ne sont pas présentées comme des jetons Cedar officiels.

Composition de la tuile de traitement de commande du système de design REI Cedar

Présentez une seule option à choisir par tuile

Une tuile de traitement de commande regroupe le nom d’un mode, son délai et son coût ou sa disponibilité. Elle ne doit pas contenir de second lien ou bouton interactif. Dans l’exemple, l’action de révision se trouve en dehors du groupe de boutons radio, et l’option express indisponible est accompagnée d’une explication lisible. Les emplacements d’en-tête, de corps et de pied de page rendent la hiérarchie explicite.

Ne vous limitez pas à la bordure pour signaler la sélection

Le mode sélectionné reçoit checked=true et une coche dans l’emplacement icon-right. Le choix actuel reste ainsi visible même lorsque les bordures discrètes sont difficiles à distinguer. Cliquer sur une option disponible ne met à jour que la sélection ; l’étape de révision distincte confirme le choix local. Les modes désactivés ne modifient jamais le modèle.

Contexte produit et mise en page adaptative du système de design REI Cedar

Gardez l’article à côté des options

Sur les écrans plus larges, une illustration originale de sac à dos CSS et un résumé du produit sont placés à côté des options de traitement de commande. Le produit est fictif et les délais de livraison sont indiqués comme des exemples. La composition met en valeur les surfaces chaleureuses de Cedar sans reprendre des photos de produits REI ni inventer des informations de stock en temps réel.

Réorganisez plutôt que de réduire les commandes

Sélection, clavier et retours d’information du système de design REI Cedar

Implémentez le comportement des boutons radio au niveau de l’application

Les tuiles exposent la sémantique des boutons radio, mais c’est à l’application de gérer le libellé du groupe, la valeur sélectionnée et le modèle de focus. Seule l’option disponible sélectionnée figure dans l’ordre de tabulation. Les touches fléchées parcourent les options disponibles, Home et End sélectionnent respectivement la première et la dernière, et la livraison express indisponible est ignorée. Ce comportement figure dans le code source complet : il n’est pas laissé en suspens comme une tâche d’accessibilité.

Effacez les anciens retours de révision

La révision de la sélection affiche un état local honnête sans prétendre qu’une commande a été passée. La modification de la tuile sélectionnée efface le résultat précédent. La région d’état est distincte de la description du mode, ce qui permet aux technologies d’assistance d’annoncer le retour sans modifier le nom accessible du bouton radio.

Implémentation Vue complète du système de design REI Cedar

Reproduisez le même écran natif

Créez un projet Vue avec Vite, installez les paquets épinglés et utilisez les exemples complets de main.js et cedar.css ci-dessous. Conservez le nom root pour l’élément racine ou adaptez le sélecteur de montage au modèle Vite. L’exemple utilise les fonctions de rendu Vue : aucun prétraitement SFC n’est ainsi dissimulé au lecteur.

  1. Installez les paquets de composants et de jetons épinglés.
  2. Conservez chaque importation CSS de main.js.
  3. Montez l’application dans l’élément root.
  4. Utilisez les touches fléchées pour changer de mode de livraison ou de retrait et vérifier le résultat local.

Vérifiez les styles avant de déboguer la mise en page

La première vérification de l’intégration consiste à s’assurer que les tuiles ont un fond, des bordures et un espacement intérieur, et que le bouton utilise le style Cedar. Si l’interface fonctionne, mais ressemble à du texte brut, vérifiez les imports du composant CSS et des jetons CSS. Si les espacements sont trop grands, examinez la taille de police de l’élément racine. Ces problèmes ont des causes distinctes et nécessitent des correctifs différents.

REI Cedar Transfert et critères d’acceptation du système de design pour un agent IA

Définissez les limites de l’intégration

Demandez à l’agent IA de créer un sélecteur des modes de livraison et de retrait en Vue 3, à l’aide des composants Cedar et du package de jetons épinglés, sans polices propriétaires. Indiquez précisément les états des tuiles et le comportement au clavier. Pour un vrai produit, remplacez les délais fictifs par un contrat avec le backend et gérez le chargement et les erreurs avant d’activer une action de commande.

Examinez ensemble le comportement et le code source

La vérification locale couvre la sélection avec les touches fléchées, l’état sélectionné visible, la confirmation locale, l’effacement des résultats obsolètes et les mises en page étroites. Le guide téléchargeable contient le même code d’application que l’aperçu. La vérification dans l’environnement d’exécution natif ne rend pas réelles les promesses de livraison de l’exemple et n’autorise pas la réutilisation de la marque REI.

  • Les méthodes indisponibles ne peuvent pas être sélectionnées.
  • Changer de choix efface l’ancienne confirmation.
  • Aucun fichier de police ni appel de service n’est nécessaire.

REI Cedar Exemples de composants du système de design

main.js — code complet du sélecteur des modes de livraison et de retrait en Vue

Composants natifs, état local, gestion du focus itinérant des boutons radio et tous les imports de styles requis.

js
import { createApp, h, ref } from "vue";
import CdrButton from "@rei/cedar/CdrButton";
import CdrFulfillmentTile from "@rei/cedar/CdrFulfillmentTile";
import "@rei/cedar/dist/cdr-reset.css";
import "@rei/cedar/dist/style/cdr-button.css";
import "@rei/cedar/dist/style/cdr-fulfillment-title.css";
import "@rei/cedar/dist/style/cdr-surface-selection.css";
import "@rei/cedar/dist/style/cdr-layout.css";

import "@rei/cdr-tokens/css";
import "@rei/cedar/dist/style/cdr-surface.css";
import "@rei/cedar/dist/style/cdr-body.css";
import "@rei/cedar/dist/style/cdr-subheading-sans.css";
import "./cedar.css";
const choices = [
  {
    id: "ship",
    label: "Ship to home",
    detail: "Sample delivery: 3–5 days",
    price: "No delivery charge",
    available: true,
  },
  {
    id: "pickup",
    label: "Pick up nearby",
    detail: "Sample location: North Trail",
    price: "Ready tomorrow",
    available: true,
  },
  {
    id: "express",
    label: "Express delivery",
    detail: "Unavailable for this sample item",
    price: "Choose another method",
    available: false,
  },
];
createApp({
  setup() {
    const selected = ref("ship"),
      result = ref("");
    function choose(id) {
      selected.value = id;
      result.value = "";
    }
    function keyboard(e, id) {
      if (
        [
          "ArrowRight",
          "ArrowDown",
          "ArrowLeft",
          "ArrowUp",
          "Home",
          "End",
        ].includes(e.key)
      ) {
        e.preventDefault();
        const ids = choices.filter((x) => x.available).map((x) => x.id);
        let next =
          e.key === "Home"
            ? ids[0]
            : e.key === "End"
              ? ids.at(-1)
              : ids[
                  (ids.indexOf(id) +
                    (e.key === "ArrowRight" || e.key === "ArrowDown"
                      ? 1
                      : ids.length - 1)) %
                    ids.length
                ];
        choose(next);
        document.getElementById("choice-" + next).focus();
      }
    }
    return () =>
      h("main", [
        h("header", [
          h("p", { class: "eyebrow" }, "OUTDOOR GEAR / ORIGINAL SPECIMEN"),
          h("h1", "Ready for the next trail"),
          h("p", "Choose a fulfillment method for this fictional daypack."),
        ]),
        h("div", { class: "composition" }, [
          h("section", { class: "product", "aria-label": "Sample product" }, [
            h("div", { class: "art", "aria-hidden": "true" }, [
              h("div", { class: "pack" }, [h("i"), h("span"), h("b")]),
            ]),
            h("div", [
              h("h2", "Ridge daypack · 24 L"),
              h("p", "A lightweight everyday pack for short outings."),
              h(
                "p",
                { class: "note" },
                "Illustrated sample product · no inventory or purchase connection",
              ),
            ]),
          ]),
          h("section", { class: "options" }, [
            h(
              "h2",
              { id: "fulfillment-label" },
              "How would you like to receive it?",
            ),
            h(
              "div",
              {
                class: "tiles",
                role: "radiogroup",
                "aria-labelledby": "fulfillment-label",
              },
              choices.map((c) =>
                h(
                  CdrFulfillmentTile,
                  {
                    id: "choice-" + c.id,
                    role: "radio",
                    tabindex: c.available && selected.value === c.id ? 0 : -1,
                    checked: selected.value === c.id,
                    disabled: !c.available,
                    "aria-label": c.label,
                    onClick: () => c.available && choose(c.id),
                    onKeydown: (e) => keyboard(e, c.id),
                  },
                  {
                    header: () => c.label,
                    "icon-right": () =>
                      selected.value === c.id
                        ? h(
                            "span",
                            {
                              "aria-hidden": "true",
                              style: "font-size:2rem;color:#1f513f",
                            },
                            "✓",
                          )
                        : null,
                    body: () => c.detail,
                    footer: () => c.price,
                  },
                ),
              ),
            ),
            h("div", { class: "review" }, [
              h(
                CdrButton,
                {
                  onClick: () => {
                    result.value = `Local selection: ${choices.find((c) => c.id === selected.value).label}. No order has been placed.`;
                  },
                },
                () => "Review selection",
              ),
              h("p", { role: "status", class: "result" }, result.value),
            ]),
          ]),
        ]),
        h(
          "footer",
          "Native Cedar 17.1.0 fulfillment tiles and button. Original composition with system-font fallback; no REI proprietary fonts or photography.",
        ),
      ]);
  },
}).mount("#root");

Référence du code

  • Utilisez <div id="root"></div> dans index.html.

cedar.css — composition produit originale

Mise en page adaptative, illustration CSS et polices de remplacement explicites.

css
html {
  font-size: 62.5%;
}
body {
  margin: 0;
  color: #2e2e2b;
  background: #fafbf9;
  font:
    1.6rem/1.5 system-ui,
    sans-serif;
}
* {
  box-sizing: border-box;
}
main {
  padding: 3.2rem;
}
header {
  border-bottom: 1px solid #dcd6cb;
  margin-bottom: 3.2rem;
  padding-bottom: 2.4rem;
}
h1 {
  font:
    700 3.6rem/1.1 Georgia,
    serif;
  margin: 1.2rem 0;
}
h2 {
  font:
    700 2.2rem/1.25 system-ui,
    sans-serif;
  margin: 0 0 1.6rem;
}
p {
  margin: 0.8rem 0;
}
.eyebrow,
footer,
.note {
  font-size: 1.4rem;
  color: #4b4a48;
}
.composition {
  display: grid;
  grid-template-columns: 1fr 1.2fr;
  gap: 4.8rem;
}
.product {
  display: grid;
  gap: 2.4rem;
  align-content: start;
}
.art {
  height: 25rem;
  background: #edeae3;
  border-radius: 0.4rem;
  display: grid;
  place-items: center;
}
.pack {
  position: relative;
  width: 12rem;
  height: 17rem;
  border-radius: 4rem 4rem 2rem 2rem;
  background: #48633c;
  border: 0.6rem solid #34492c;
  box-shadow: 2rem 1rem 0 -1.2rem #b3ad9f;
}
.pack i {
  position: absolute;
  top: -2.2rem;
  left: 3.2rem;
  width: 4.4rem;
  height: 2.4rem;
  border: 0.7rem solid #34492c;
  border-bottom: 0;
  border-radius: 1.4rem 1.4rem 0 0;
}
.pack span {
  position: absolute;
  left: 1.2rem;
  right: 1.2rem;
  bottom: 1.2rem;
  height: 7rem;
  border-radius: 1rem;
  background: #607b52;
  border-top: 0.5rem solid #34492c;
}
.pack b {
  position: absolute;
  left: 4.4rem;
  top: 4rem;
  width: 2rem;
  height: 2rem;
  background: #edeae3;
  border-radius: 50%;
}
.tiles {
  display: grid;
  gap: 1.6rem;
}
.tiles > * {
  font-family: system-ui, sans-serif !important;
}
.review {
  margin-top: 2.4rem;
}
.result {
  color: #355e28;
  font-size: 1.4rem;
  margin-top: 1.6rem;
}
footer {
  margin-top: 3.2rem;
  padding-top: 1.6rem;
  border-top: 1px solid #dcd6cb;
}
:focus-visible {
  outline: 3px solid #406eb5;
  outline-offset: 3px;
}
@media (max-width: 700px) {
  main {
    padding: 2rem;
  }
  .composition {
    grid-template-columns: 1fr;
    gap: 3.2rem;
  }
  .product {
    grid-template-columns: 12rem 1fr;
    gap: 1.6rem;
  }
  .art {
    height: 17rem;
  }
  .pack {
    transform: scale(0.7);
  }
  h1 {
    font-size: 2.8rem;
  }
  .product h2 {
    font-size: 1.8rem;
  }
}

Référence du code

  • Aucun fichier de police propriétaire de REI n’est importé.
04

REI Cedar Configuration d’un agent IA pour le système de design

Point de départ de l’implémentation

L’aperçu regroupe ces modules natifs localement. Les polices utilisent celles du système en remplacement.

sh
npm create vite@latest cedar-study -- --template vue
cd cedar-study
npm install
npm install @rei/[email protected] @rei/[email protected]
# Replace src/main.js and add src/cedar.css with the complete examples.
# Change the index.html mount element to id="root".
npm run dev

Un prompt pour votre projet

Prompt pour l’agent IA
Créez un sélecteur des modes de livraison et de retrait en Vue 3 avec Cedar 17.1.0 et tokens 14.0.1 en utilisant ce code source complet. Gardez l’échelle de 10px de l’élément racine isolée, importez le composant requis et CSS de jetons, évitez les polices propriétaires et préservez la gestion du focus itinérant des boutons radio ainsi que les choix désactivés. Utilisez des disponibilités fictives jusqu’à la fourniture d’un véritable contrat d’inventaire.
05

REI Cedar Sources et portée du système de design

Un guide OpenDesign pour REI Cedar. L’exemple utilise Cedar 17.1.0 et tokens 14.0.1. Le produit, l’illustration, le magasin et les informations de livraison sont fictifs ; les polices et les photos propriétaires de REI ne sont pas incluses.