Diseño de productos empresariales · Nuevo recurso

Sistema de diseño REI Cedar.

Crea un selector de preparación de pedidos concreto con Cedar, mosaicos nativos de Vue, valores reales de tokens, navegación completa con teclado y una composición adaptable de productos.

Guía de OpenDesign7 capítulos37 entradas de referenciaGuía de aplicación original
01

Vista previa de la interfaz del sistema de diseño REI Cedar

Usa mosaicos nativos de Cedar para elegir envío o recogida, incluida la navegación por teclado y una opción no disponible.

Elige un método de entregaAbrir ejemplo completo
Composición nativa con Cedar 17.1.0 / Vue 3. · Referencia de implementación
02

Referencia de diseño del sistema de diseño REI Cedar

Valores extraídos del tema REI de @rei/cdr-tokens 14.0.1; comportamiento de los componentes nativos verificado con @rei/cedar 17.1.0.

Roles de color del tema REI

Fuente
Nombre / ReglaValor / ConfiguraciónUso
cdr-color-background-button-primary-rest#1f513f Relleno del botón primario.
cdr-color-background-button-primary-hover#c7dfd1 Relleno al pasar el cursor del elemento principal.
cdr-color-background-primary#ffffff Superficie de contenido predeterminada.
cdr-color-background-secondary#F4F2ED Superficie secundaria.
cdr-color-text-button-primary#fafbf9 Etiqueta del botón principal.
cdr-color-text-primary#4b4a48 Rol del texto principal.
cdr-color-text-secondary#736e65 Texto complementario.
cdr-color-text-error#811823 Texto del mensaje de error.
cdr-color-border-primary#d5cfc3 Límite de la superficie principal.
cdr-color-border-secondary#958e83 Rol del borde secundario.

Espaciado y radio con una raíz de 10px

Fuente
Nombre / ReglaValor / ConfiguraciónUso
cdr-space-zero0En la raíz de Cedar, 1rem equivale a 10px; no apliques estos valores sin cambios a una raíz de 16px.
cdr-space-sixteenth-x0.1remEn la raíz de Cedar, 1rem equivale a 10px; no apliques estos valores sin cambios a una raíz de 16px.
cdr-space-eighth-x0.2remEn la raíz de Cedar, 1rem equivale a 10px; no apliques estos valores sin cambios a una raíz de 16px.
cdr-space-three-sixteenth-x0.3remEn la raíz de Cedar, 1rem equivale a 10px; no apliques estos valores sin cambios a una raíz de 16px.
cdr-space-quarter-x0.4remEn la raíz de Cedar, 1rem equivale a 10px; no apliques estos valores sin cambios a una raíz de 16px.
cdr-space-three-eighth-x0.6remEn la raíz de Cedar, 1rem equivale a 10px; no apliques estos valores sin cambios a una raíz de 16px.
cdr-space-half-x0.8remEn la raíz de Cedar, 1rem equivale a 10px; no apliques estos valores sin cambios a una raíz de 16px.
cdr-space-three-quarter-x1.2remEn la raíz de Cedar, 1rem equivale a 10px; no apliques estos valores sin cambios a una raíz de 16px.
cdr-space-one-x1.6remEn la raíz de Cedar, 1rem equivale a 10px; no apliques estos valores sin cambios a una raíz de 16px.
cdr-space-one-and-a-half-x2.4remEn la raíz de Cedar, 1rem equivale a 10px; no apliques estos valores sin cambios a una raíz de 16px.
cdr-space-two-x3.2remEn la raíz de Cedar, 1rem equivale a 10px; no apliques estos valores sin cambios a una raíz de 16px.
cdr-space-three-x4.8remEn la raíz de Cedar, 1rem equivale a 10px; no apliques estos valores sin cambios a una raíz de 16px.
cdr-space-four-x6.4remEn la raíz de Cedar, 1rem equivale a 10px; no apliques estos valores sin cambios a una raíz de 16px.
cdr-radius-sharp0Forma de las esquinas definida por el paquete de tokens fijado.
cdr-radius-soft0.2remForma de las esquinas definida por el paquete de tokens fijado.
cdr-radius-softer0.4remForma de las esquinas definida por el paquete de tokens fijado.
cdr-radius-softest0.6remForma de las esquinas definida por el paquete de tokens fijado.
cdr-radius-round999.9remForma de las esquinas definida por el paquete de tokens fijado.

Mosaico de opción de entrega API

Fuente
Nombre / ReglaValor / ConfiguraciónUso
checkedbooleanRefleja el método seleccionado.
disabledbooleanOpción no disponible; no permitas cambios de estado.
roleradio | checkboxUsa radio para elegir un único método de entrega.
tabindex0 / -1La aplicación gestiona una única parada de tabulación y la navegación con las teclas de flecha.
header slotmethod labelNombre de opción fácil de entender.
body slotsupporting detailsPlazo de entrega o lugar de recogida.
footer slotprominent detailCosto o disponibilidad.
icon-right slotselection indicatorEl ejemplo añade una marca de verificación al método seleccionado.
loadingbooleanEnmascara el cuerpo y el pie de página, y conserva el encabezado y las dimensiones.
03

Guía completa del sistema de diseño REI Cedar

Una guía práctica para elegir, aplicar y revisar este sistema en una interfaz real.

DESIGN-rei-cedar.md

Orientación completa, un punto de partida para la implementación y enlaces al código fuente.

Descargar la guía

Dependencias de Vue para el entorno de ejecución y los estilos del sistema de diseño REI Cedar

Fija conjuntamente los componentes y los tokens

El ejemplo funcional usa @rei/cedar 17.1.0 con @rei/cdr-tokens 14.0.1 y Vue 3. El paquete de componentes ofrece puntos de entrada modulares. Este ejemplo importa solo CdrButton y CdrFulfillmentTile, además de CSS, que necesitan sus componentes anidados de superficie, diseño y texto. El código fuente enumera todas las importaciones, porque el comportamiento de JavaScript por sí solo no garantiza que se apliquen los estilos.

De esta guía de OpenDesign

No incluyas fuentes propietarias en el ejemplo

Las instrucciones de instalación de Cedar distinguen entre el uso de componentes y los derechos de uso de las fuentes de REI. El ejemplo no importa cdr-fonts.css ni la hoja de estilos agregada que contiene las declaraciones de fuentes. Usa sans serif del sistema para el texto de la interfaz y Georgia para el encabezado editorial original. Estas alternativas tipográficas son decisiones de la aplicación, no la tipografía de marca de REI.

Unidades de los tokens y colores de superficie del sistema de diseño REI Cedar

Usa la escala raíz de Cedar

Los tokens de Cedar expresan un espaciado de 16px como 1.6rem porque el tamaño raíz previsto es 10px. Si se establece una raíz de 16px, el mismo valor pasa a ser 25.6px. El ejemplo aislado establece html en 62.5% y usa un tamaño de texto de 1.6rem para el body. Un producto anfitrión con otro valor raíz necesita un límite de integración deliberado, no un restablecimiento global pegado a un sitio existente.

Asigna los tokens a las funciones de los componentes

El botón principal usa un relleno verde oscuro en reposo y un relleno verde claro al pasar el cursor. Las superficies de contenido y los bordes usan tonos neutros cálidos. La tabla registra valores semánticos del tema de REI, no del tema del sitio de documentación. La bolsa ilustrada usa colores decorativos originales, que no se presentan como exportaciones oficiales de tokens de Cedar.

Composición de la tarjeta de entrega del sistema de diseño REI Cedar

Presenta una opción variable por tarjeta

Una tarjeta de entrega reúne el nombre del método, el plazo y el costo o la disponibilidad. No debe contener otro enlace o botón interactivo. En el ejemplo, la acción de revisión queda fuera del grupo de botones de opción, y la opción de entrega exprés no disponible incluye una explicación que sigue siendo legible. Las ranuras de encabezado, cuerpo y pie hacen explícita la jerarquía.

Indica la selección más allá del borde

El método seleccionado recibe checked=true y una marca de verificación en la ranura icon-right. Así, la opción actual se distingue incluso cuando cuesta diferenciar los bordes sutiles. Al hacer clic en una opción disponible, solo se actualiza la selección; el paso de revisión independiente confirma la elección local. Los métodos deshabilitados nunca actualizan el modelo.

Contexto del producto y diseño adaptable del sistema de diseño REI Cedar

Mantén el artículo junto a sus opciones

En pantallas más anchas, una ilustración original de una mochila de CSS y el resumen del producto aparecen junto a las opciones de entrega. El producto es ficticio y los plazos de entrega se identifican como ejemplos. La composición demuestra las superficies cálidas de Cedar sin copiar fotografías de productos de REI ni inventar información de existencias en tiempo real.

Reorganiza los controles en lugar de reducirlos

Selección, teclado y comentarios del sistema de diseño REI Cedar

Implementa el comportamiento de botones de opción a nivel de aplicación

Las tarjetas exponen semántica de botones de opción, pero la aplicación controla la etiqueta del grupo, el valor seleccionado y el modelo de foco. Solo la opción disponible seleccionada forma parte del orden de tabulación. Las teclas de flecha recorren las opciones disponibles, Inicio y Fin seleccionan los extremos, y se omite la opción de entrega exprés no disponible. Esta lógica está incluida en el código fuente completo, no queda pendiente como tarea de accesibilidad.

Invalida los comentarios de revisión obsoletos

La revisión de la selección escribe un estado local veraz, sin afirmar que se haya realizado un pedido. Al cambiar la tarjeta seleccionada, se borra el resultado anterior. La región de estado está separada de la descripción del método, para que la tecnología de asistencia pueda anunciar los comentarios sin modificar el nombre accesible del botón de opción.

Implementación completa en Vue del sistema de diseño REI Cedar

Reproduce la misma pantalla de forma nativa

Crea un proyecto Vue con Vite, instala los paquetes fijados y usa los ejemplos completos de main.js y cedar.css que aparecen a continuación. Mantén root como nombre del elemento raíz o actualiza el selector de montaje para que coincida con la plantilla de Vite. El ejemplo usa funciones de renderizado de Vue para que no haya procesamiento oculto de componentes de archivo único (SFC).

  1. Instala los paquetes fijados de componentes y tokens.
  2. Conserva todas las importaciones de CSS de main.js.
  3. Monta la aplicación en el elemento root.
  4. Usa las teclas de flecha para cambiar el método de entrega y revisar el resultado local.

Comprueba los estilos antes de depurar el diseño

La primera comprobación de integración es que las tarjetas tengan superficies, bordes y relleno, y que el botón tenga los estilos de Cedar. Si la interfaz funciona, pero parece texto sin estilos, verifica las importaciones de componentes CSS y de tokens CSS. Si el espaciado es excesivo, revisa el tamaño de fuente raíz. Son causas distintas que requieren soluciones diferentes.

Traspaso al agente y criterios de aceptación del sistema de diseño REI Cedar

Especifica el límite de integración

Pide al agente de IA un selector de métodos de entrega en Vue 3 que use los componentes Cedar fijados y el paquete de tokens, sin fuentes propietarias. Indica exactamente los estados de las tarjetas y el comportamiento del teclado. Para un producto real, sustituye los plazos ficticios por un contrato de backend y gestiona los estados de carga y error antes de habilitar una acción para realizar pedidos.

Revisa el comportamiento y el código fuente en conjunto

La verificación local cubre la selección con las teclas de flecha, el estado seleccionado visible, la confirmación local, la eliminación de resultados obsoletos y los diseños para pantallas estrechas. La guía descargable incluye el mismo código de la aplicación que la vista previa. La verificación en tiempo de ejecución no convierte en reales los plazos de entrega de ejemplo ni concede permiso para reutilizar la marca de REI.

  • Los métodos no disponibles no se pueden seleccionar.
  • Al cambiar una opción, se borra la confirmación anterior.
  • No se necesitan recursos de fuentes ni llamadas a servicios.

Ejemplos de componentes del sistema de diseño REI Cedar

main.js — selector de métodos de entrega completo en Vue

Componentes nativos, estado local, foco itinerante para los botones de opción y todas las importaciones de estilos necesarias.

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

Referencia de código

  • Usa <div id="root"></div> en index.html.

cedar.css — composición original del producto

Diseño adaptable, una ilustración de CSS y alternativas tipográficas explícitas.

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

Referencia de código

  • No se importan archivos de fuentes propietarias de REI.
04

Configuración del agente del sistema de diseño REI Cedar

Punto de partida para la implementación

La vista previa empaqueta estos módulos nativos localmente. Las fuentes usan alternativas del sistema.

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

Una instrucción para tu proyecto

Instrucción para el agente
Crea un selector de opciones de entrega en Vue 3 con Cedar 17.1.0 y tokens 14.0.1 usando este código fuente completo. Mantén aislada la escala raíz de 10px, importa el componente y el token requeridos CSS, evita las fuentes propietarias y conserva el foco secuencial de las opciones de radio y las opciones deshabilitadas. Usa datos ficticios de disponibilidad hasta que se proporcione un contrato de inventario real.
05

Fuentes y alcance del sistema de diseño REI Cedar

Una guía de OpenDesign para REI Cedar. El ejemplo ejecuta Cedar 17.1.0 con tokens 14.0.1. Los detalles del producto, las ilustraciones, las tiendas y las entregas son ficticios; no se incluyen fotografías ni fuentes propietarias de REI.