云平台 · Nuevo recurso

Sistema de diseño AWS Cloudscape.

Una guía de configuración de Cloudscape con tokens reales de actualización visual, espaciado que se adapta a la densidad, API controladas para formularios y un asistente funcional de dos pasos para crear recursos.

Guía de OpenDesign8 capítulos50 entradas de referenciaGuía de aplicación original
01

Vista previa de la interfaz del sistema de diseño AWS Cloudscape

Prueba nombres no válidos, elige un perfil de capacidad, alterna entre la configuración y la revisión, cambia la apariencia y confirma la receta localmente.

Configurar y revisar un espacio de trabajoAbrir ejemplo completo
Cloudscape nativo 3.0.1390 con React 18.3.1; composición original de Wizard y estado solo local. · Referencia de implementación
02

Referencia de diseño del sistema de diseño AWS Cloudscape

Componentes de Cloudscape 3.0.1390 y design-tokens 3.0.114, tema visual-refresh. Los valores se leen del JSON de tokens publicado. Los modos de color y las densidades de contenido son dimensiones independientes. Esta es una referencia de implementación seleccionada, no la exportación completa de tokens.

Roles de color semánticos en modos claro y oscuro

Fuente
Nombre / ReglaValor / ConfiguraciónUso
color-background-layout-mainlight: #ffffff; dark: #161d26Usa este rol con nombre en el contexto previsto; el par muestra los valores para los modos claro y oscuro, no muestras de color intercambiables.
color-background-container-contentlight: #ffffff; dark: #161d26Usa este rol con nombre en el contexto previsto; el par muestra los valores para los modos claro y oscuro, no muestras de color intercambiables.
color-text-body-defaultlight: #0f141a; dark: #c6c6cdUsa este rol con nombre en el contexto previsto; el par muestra los valores para los modos claro y oscuro, no muestras de color intercambiables.
color-text-body-secondarylight: #424650; dark: #c6c6cdUsa este rol con nombre en el contexto previsto; el par muestra los valores para los modos claro y oscuro, no muestras de color intercambiables.
color-text-interactive-defaultlight: #424650; dark: #dedee3Usa este rol con nombre en el contexto previsto; el par muestra los valores para los modos claro y oscuro, no muestras de color intercambiables.
color-text-link-defaultlight: #006ce0; dark: #42b4ffUsa este rol con nombre en el contexto previsto; el par muestra los valores para los modos claro y oscuro, no muestras de color intercambiables.
color-text-status-errorlight: #db0000; dark: #ff7a7aUsa este rol con nombre en el contexto previsto; el par muestra los valores para los modos claro y oscuro, no muestras de color intercambiables.
color-text-status-successlight: #00802f; dark: #2bb534Usa este rol con nombre en el contexto previsto; el par muestra los valores para los modos claro y oscuro, no muestras de color intercambiables.
color-border-input-defaultlight: #8c8c94; dark: #656871Usa este rol con nombre en el contexto previsto; el par muestra los valores para los modos claro y oscuro, no muestras de color intercambiables.
color-background-button-primary-defaultlight: #006ce0; dark: #42b4ffUsa este rol con nombre en el contexto previsto; el par muestra los valores para los modos claro y oscuro, no muestras de color intercambiables.

Tipografía para el cuerpo y los encabezados

Fuente
Nombre / ReglaValor / ConfiguraciónUso
font-size-body-m14pxCombina el tamaño de fuente y la altura de línea del mismo rol. Las variantes Header y Box aplican la jerarquía de componentes.
font-size-body-s12pxCombina el tamaño de fuente y la altura de línea del mismo rol. Las variantes Header y Box aplican la jerarquía de componentes.
font-size-heading-l20pxCombina el tamaño de fuente y la altura de línea del mismo rol. Las variantes Header y Box aplican la jerarquía de componentes.
font-size-heading-m18pxCombina el tamaño de fuente y la altura de línea del mismo rol. Las variantes Header y Box aplican la jerarquía de componentes.
font-size-heading-s16pxCombina el tamaño de fuente y la altura de línea del mismo rol. Las variantes Header y Box aplican la jerarquía de componentes.
font-size-heading-xl24pxCombina el tamaño de fuente y la altura de línea del mismo rol. Las variantes Header y Box aplican la jerarquía de componentes.
font-size-heading-xs14pxCombina el tamaño de fuente y la altura de línea del mismo rol. Las variantes Header y Box aplican la jerarquía de componentes.
line-height-body-m20pxCombina el tamaño de fuente y la altura de línea del mismo rol. Las variantes Header y Box aplican la jerarquía de componentes.
line-height-body-s16pxCombina el tamaño de fuente y la altura de línea del mismo rol. Las variantes Header y Box aplican la jerarquía de componentes.
line-height-heading-l24pxCombina el tamaño de fuente y la altura de línea del mismo rol. Las variantes Header y Box aplican la jerarquía de componentes.
line-height-heading-m22pxCombina el tamaño de fuente y la altura de línea del mismo rol. Las variantes Header y Box aplican la jerarquía de componentes.
line-height-heading-s20pxCombina el tamaño de fuente y la altura de línea del mismo rol. Las variantes Header y Box aplican la jerarquía de componentes.
line-height-heading-xl30pxCombina el tamaño de fuente y la altura de línea del mismo rol. Las variantes Header y Box aplican la jerarquía de componentes.
line-height-heading-xs18pxCombina el tamaño de fuente y la altura de línea del mismo rol. Las variantes Header y Box aplican la jerarquía de componentes.

Espaciado adaptado a la densidad

Fuente
Nombre / ReglaValor / ConfiguraciónUso
space-scaled-xxxscomfortable: 2px; compact: 0pxUsa el valor de cómodo o compacto según la densidad activa. No escales el texto con estos cambios de espaciado.
space-scaled-xxscomfortable: 4px; compact: 2pxUsa el valor de cómodo o compacto según la densidad activa. No escales el texto con estos cambios de espaciado.
space-scaled-xscomfortable: 8px; compact: 4pxUsa el valor de cómodo o compacto según la densidad activa. No escales el texto con estos cambios de espaciado.
space-scaled-scomfortable: 12px; compact: 8pxUsa el valor de cómodo o compacto según la densidad activa. No escales el texto con estos cambios de espaciado.
space-scaled-mcomfortable: 16px; compact: 12pxUsa el valor de cómodo o compacto según la densidad activa. No escales el texto con estos cambios de espaciado.
space-scaled-lcomfortable: 20px; compact: 16pxUsa el valor de cómodo o compacto según la densidad activa. No escales el texto con estos cambios de espaciado.
space-scaled-xlcomfortable: 24px; compact: 20pxUsa el valor de cómodo o compacto según la densidad activa. No escales el texto con estos cambios de espaciado.
space-scaled-xxlcomfortable: 32px; compact: 24pxUsa el valor de cómodo o compacto según la densidad activa. No escales el texto con estos cambios de espaciado.
space-scaled-xxxlcomfortable: 40px; compact: 32pxUsa el valor de cómodo o compacto según la densidad activa. No escales el texto con estos cambios de espaciado.

Forma de los componentes

Fuente
Nombre / ReglaValor / ConfiguraciónUso
border-radius-container16pxConserva la forma del componente indicado. El radio de un botón no es un radio universal para los contenedores.
border-radius-button20pxConserva la forma del componente indicado. El radio de un botón no es un radio universal para los contenedores.
border-radius-input8pxConserva la forma del componente indicado. El radio de un botón no es un radio universal para los contenedores.
border-radius-alert12pxConserva la forma del componente indicado. El radio de un botón no es un radio universal para los contenedores.
border-radius-dropdown8pxConserva la forma del componente indicado. El radio de un botón no es un radio universal para los contenedores.
border-radius-card-embedded8pxConserva la forma del componente indicado. El radio de un botón no es un radio universal para los contenedores.

Temporización de las interacciones

Fuente
Nombre / ReglaValor / ConfiguraciónUso
motion-duration-responsivedefault: 115ms; disabled: 0msEl movimiento nativo se reduce a cero en el modo de movimiento desactivado. Evita añadir una transición no relacionada a la misma interacción.
motion-duration-expressivedefault: 165ms; disabled: 0msEl movimiento nativo se reduce a cero en el modo de movimiento desactivado. Evita añadir una transición no relacionada a la misma interacción.
motion-duration-complexdefault: 250ms; disabled: 0msEl movimiento nativo se reduce a cero en el modo de movimiento desactivado. Evita añadir una transición no relacionada a la misma interacción.

Composición nativa API

Fuente
Nombre / ReglaValor / ConfiguraciónUso
WizardactiveStepIndex · onNavigate · onSubmitControla el paso actual en React; valida antes de aceptar el índice siguiente solicitado.
FormFieldlabel · constraintText · errorTextColoca la regla de formato y el mensaje de error junto al campo del nombre.
Inputvalue · onChange({ detail })Lee detail.value en lugar del destino de un evento del DOM.
SelectselectedOption · options · onChangeConserva el objeto de opción seleccionado, incluidos label y value.
Containerheader={<Header variant="h2" />}Agrupa los campos de configuración relacionados sin inventar un nuevo sistema de tarjetas.
ColumnLayoutcolumns={2} · variant="text-grid"Muestra metadatos de revisión compactos con columnas adaptables a la biblioteca.
SpaceBetweensize="l"Usa la escala de separación de la biblioteca para separar los campos y los módulos de revisión.
applyModeMode.Light / Mode.DarkCambia el modo visual global para los componentes nativos y los tokens semánticos.
03

Guía completa del sistema de diseño AWS Cloudscape

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

DESIGN-aws-cloudscape.md

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

Descargar la guía

Arquitectura de configuración del sistema de diseño AWS Cloudscape

Adapta el flujo de trabajo a Wizard

El ejemplo separa la configuración de la revisión. Wizard proporciona la navegación entre pasos y las acciones; la aplicación proporciona el índice actual, los valores de los campos, la regla de validación y la confirmación final. El lector puede volver a la configuración sin reconstruir el formulario ni perder la capacidad seleccionada. Es una opción más adecuada que ocultar todo un flujo de varios pasos dentro de una única Card genérica.

De esta guía de OpenDesign

Construye con contenedores nativos

Container, Header y SpaceBetween definen la sección del formulario. El h1 presenta la operación; el h2 nombra el grupo de ajustes. El texto explicativo aparece junto al campo o al paso que describe. El ancho máximo de 1200px y el relleno de página que rodean el contenido son opciones explícitas de la aplicación CSS, no tokens de diseño de Cloudscape exportados.

Tokens semánticos y modos visuales del sistema de diseño AWS Cloudscape

Elige un rol antes que un valor

La referencia distingue entre el fondo de disposición, el contenido de los contenedores, el texto del cuerpo, el texto interactivo y los mensajes de estado. Sus valores no forman una paleta plana. Para una interfaz personalizada, importa el token con nombre desde @cloudscape-design/design-tokens en lugar de copiar un valor hexadecimal del modo claro en cada estado. El token establece un propósito, mientras que su valor puede evolucionar.

Cambiar de modo desde la biblioteca

La vista previa llama a applyMode con Mode.Light o Mode.Dark desde global-styles. Esto actualiza el modo que usan los componentes, en lugar de reemplazar colores CSS arbitrarios. Una pantalla de revisión en modo oscuro conserva las mismas etiquetas, la capacidad seleccionada y el estado de navegación. El JSON de origen registra los valores de los modos claro y oscuro, por lo que se pueden examinar por separado.

Tipografía y jerarquía de encabezados del sistema de diseño AWS Cloudscape

Combina los roles de fuente y altura de línea

La referencia body-m de visual-refresh es de 14px con una altura de línea de 20px. heading-xl es de 24px con una altura de línea de 30px; heading-l, de 20px con 24px; y heading-m, de 18px con 22px. Estos roles definen la jerarquía compacta del formulario; no son tamaños intercambiables para titulares de marketing.

Usa variantes semánticas de componentes

La variante h1 de Header se titula Crear un espacio de trabajo. Los encabezados de Container usan h2, y la variante awsui-key-label de Box da a las etiquetas de revisión un tratamiento secundario uniforme. Los valores de la revisión siguen siendo texto normal y legible. No conviertas todas las etiquetas de campo en encabezados solo para darles más peso visual.

Campos controlados y composición de revisión del sistema de diseño AWS Cloudscape

Comprende el contrato del evento detail

Input emite un evento cuyo detail.value contiene el nuevo texto. Select emite detail.selectedOption, que es un objeto de opción, no una cadena simple. El ejemplo completo almacena ese objeto y muestra su label en la revisión. Así se evita un error común de integración en el que Select aparece vacío porque se proporciona solo un identificador a selectedOption.

Mantén las instrucciones junto al campo

  • La política de formato del campo corresponde a esta aplicación de ejemplo.
  • Las opciones de capacidad no son afirmaciones sobre productos ni precios.
  • Los componentes nativos se encargan de la presentación; el estado de React mantiene la configuración.

Densidad y diseño adaptable del sistema de diseño AWS Cloudscape

No trates el modo compacto como un nivel de zoom

Los valores de espaciado escalados publicados varían según la densidad. Por ejemplo, space-scaled-m es de 16px en modo cómodo y de 12px en modo compacto, mientras que space-scaled-l es de 20px y 16px, respectivamente. Estas diferencias comprimen el ritmo vertical sin redefinir el contenido ni reducir el texto arbitrariamente. Los componentes nativos aplican sus propias reglas de densidad.

Adapta las estructuras de pasos y revisión

Wizard cambia la presentación de la navegación según el espacio disponible; ColumnLayout distribuye los metadatos de revisión de forma adaptable. La aplicación CSS reduce el relleno exterior por debajo de 600px. El ejemplo no fija de forma rígida el ancho de la navegación de pasos para escritorio y, en la versión móvil, mantiene visibles las acciones Next, Previous y Confirm.

Validación y confirmación de Wizard de sistema de diseño AWS Cloudscape

Valida antes de aceptar la navegación

onNavigate recibe requestedStepIndex. La aplicación comprueba el nombre actual antes de avanzar a la revisión y mantiene el paso actual si el nombre no es válido. Al editarlo, se borra el error para que el siguiente envío se pueda evaluar desde cero. Al volver a la configuración, se conservan el nombre y la opción seleccionada.

  1. Envía un nombre no válido y permanece en la configuración.
  2. Corrige el nombre y elige otro perfil de capacidad.
  3. Avanza a la revisión y confirma ambos valores.
  4. Usa Edit settings para volver sin perder ninguno de los valores.
  5. Confirma localmente y reinicia el ejemplo.

Distingue una configuración de la provisión

La acción final muestra un Alert de éxito local y un resumen de la configuración. No da a entender que se haya creado un recurso real. En una aplicación real, mantén pendiente la acción de envío mientras se ejecuta la provisión, distingue las solicitudes aceptadas de los recursos completados y ofrece una forma de recuperarse de los errores sin descartar la configuración.

Accesibilidad de formularios de sistema de diseño AWS Cloudscape

Conserva las etiquetas y los nombres de navegación

Wizard recibe navigationAriaLabel y las cadenas traducidas de las acciones. Cada Input y Select está dentro de un FormField etiquetado. Alert comunica los resultados no válidos o satisfactorios mediante la semántica nativa del componente. Las restricciones visibles complementan la etiqueta del campo, no la sustituyen.

Revisa el recorrido con teclado en toda la operación

Usa el teclado para ir al campo del nombre, abrir el selector de capacidad, avanzar, volver, editar y confirmar. El comportamiento de foco nativo ayuda, pero la aplicación sigue siendo responsable de la regla de validación del paso y del significado de la confirmación. Una biblioteca de componentes no puede validar por sí sola una regla de negocio que no se haya definido.

Instalación y límites personalizados de sistema de diseño AWS Cloudscape

Instala juntos los paquetes relacionados

La implementación importa los componentes mediante sus subrutas de paquete individuales y carga global-styles una sola vez. design-tokens proporciona la referencia para los estilos personalizados. El archivo de entrada React y el archivo compacto CSS incluidos reproducen el ejemplo interactivo en una aplicación Vite React. Mantén juntas las versiones compatibles de los paquetes de Cloudscape.

Usa el ejemplo proporcionado como punto de partida real

Ejemplos de componentes de sistema de diseño AWS Cloudscape

main.jsx — asistente de configuración completo

Wizard, FormField, Select y metadatos de revisión nativos, con navegación controlada y confirmación local.

jsx
import React, { useState } from "react";
import { createRoot } from "react-dom/client";
import Wizard from "@cloudscape-design/components/wizard";
import Container from "@cloudscape-design/components/container";
import Header from "@cloudscape-design/components/header";
import FormField from "@cloudscape-design/components/form-field";
import Input from "@cloudscape-design/components/input";
import Select from "@cloudscape-design/components/select";
import SpaceBetween from "@cloudscape-design/components/space-between";
import ColumnLayout from "@cloudscape-design/components/column-layout";
import Box from "@cloudscape-design/components/box";
import Button from "@cloudscape-design/components/button";
import Alert from "@cloudscape-design/components/alert";
import Toggle from "@cloudscape-design/components/toggle";
import { applyMode, Mode } from "@cloudscape-design/global-styles";
import "@cloudscape-design/global-styles/index.css";
import "./cloudscape.css";
const sizes = [
  { label: "Development · 2 vCPU / 4 GiB", value: "dev" },
  { label: "Standard · 4 vCPU / 8 GiB", value: "standard" },
  { label: "Compute · 8 vCPU / 16 GiB", value: "compute" },
];
function App() {
  const [name, setName] = useState("analytics-sandbox"),
    [size, setSize] = useState(sizes[0]),
    [step, setStep] = useState(0),
    [error, setError] = useState(""),
    [complete, setComplete] = useState(false),
    [dark, setDark] = useState(false);
  function next(index) {
    if (index > 0 && !/^[a-z][a-z0-9-]{2,29}$/.test(name)) {
      setError(
        "Use 3–30 lowercase letters, numbers or hyphens, starting with a letter.",
      );
      return;
    }
    setError("");
    setStep(index);
  }
  function reset() {
    setStep(0);
    setComplete(false);
    setError("");
    setName("analytics-sandbox");
    setSize(sizes[0]);
  }
  return (
    <main className="awsui-typography cloudscape-example">
      <div className="appearance">
        <span>CLOUDSCAPE · RESOURCE CONFIGURATION</span>
        <Toggle
          checked={dark}
          onChange={({ detail }) => {
            setDark(detail.checked);
            applyMode(detail.checked ? Mode.Dark : Mode.Light);
          }}
        >
          Dark mode
        </Toggle>
      </div>
      <Header
        variant="h1"
        description="Configure a fictional compute workspace. This example does not create a cloud resource."
      >
        Create a workspace
      </Header>
      <div className="wizard-content">
        {complete ? (
          <SpaceBetween size="l">
            <Alert type="success" header="Configuration confirmed locally">
              The {name} recipe is ready for review. No cloud API was called and
              no resource was provisioned.
            </Alert>
            <Container header={<Header variant="h2">Workspace recipe</Header>}>
              <ColumnLayout columns={2} variant="text-grid">
                <div>
                  <Box variant="awsui-key-label">Name</Box>
                  {name}
                </div>
                <div>
                  <Box variant="awsui-key-label">Capacity</Box>
                  {size.label}
                </div>
              </ColumnLayout>
            </Container>
            <Button onClick={reset}>Start another example</Button>
          </SpaceBetween>
        ) : (
          <Wizard
            activeStepIndex={step}
            onNavigate={({ detail }) => next(detail.requestedStepIndex)}
            onCancel={reset}
            onSubmit={() => setComplete(true)}
            i18nStrings={{
              stepNumberLabel: (stepNumber) => `Step ${stepNumber}`,
              collapsedStepsLabel: (stepNumber, stepsCount) =>
                `Step ${stepNumber} of ${stepsCount}`,
              skipToButtonLabel: (step) => `Skip to ${step.title}`,
              navigationAriaLabel: "Configuration steps",
              cancelButton: "Reset",
              previousButton: "Previous",
              nextButton: "Next",
              submitButton: "Confirm locally",
              optional: "optional",
            }}
            steps={[
              {
                title: "Configure workspace",
                description: "Choose the identity and capacity.",
                content: (
                  <Container
                    header={<Header variant="h2">Workspace settings</Header>}
                  >
                    <SpaceBetween size="l">
                      <FormField
                        label="Workspace name"
                        constraintText="3–30 characters; lowercase letters, numbers and hyphens."
                        errorText={error}
                      >
                        <Input
                          value={name}
                          onChange={({ detail }) => {
                            setName(detail.value);
                            setError("");
                          }}
                        />
                      </FormField>
                      <FormField
                        label="Capacity profile"
                        description="These profiles are sample application data, not real cloud products or prices."
                      >
                        <Select
                          selectedOption={size}
                          onChange={({ detail }) =>
                            setSize(detail.selectedOption)
                          }
                          options={sizes}
                        />
                      </FormField>
                    </SpaceBetween>
                  </Container>
                ),
              },
              {
                title: "Review configuration",
                description:
                  "Check the values before confirming the local example.",
                content: (
                  <SpaceBetween size="l">
                    <Container
                      header={
                        <Header
                          variant="h2"
                          actions={
                            <Button onClick={() => setStep(0)}>
                              Edit settings
                            </Button>
                          }
                        >
                          Workspace settings
                        </Header>
                      }
                    >
                      <ColumnLayout columns={2} variant="text-grid">
                        <div>
                          <Box variant="awsui-key-label">Workspace name</Box>
                          {name}
                        </div>
                        <div>
                          <Box variant="awsui-key-label">Capacity profile</Box>
                          {size.label}
                        </div>
                      </ColumnLayout>
                    </Container>
                    <Alert type="info">
                      Confirmation changes the preview only. Production
                      provisioning would require a real service, permissions and
                      a verified response.
                    </Alert>
                  </SpaceBetween>
                ),
              },
            ]}
          />
        )}
      </div>
      <footer>
        Native Cloudscape components 3.0.1390 · configuration, validation,
        review and local confirmation.
      </footer>
    </main>
  );
}
createRoot(document.getElementById("root")).render(<App />);

Referencia de código

  • Guárdalo como src/main.jsx. El siguiente bloque de código es el archivo importado src/cloudscape.css.

cloudscape.css — estructura de la página del ejemplo

Ancho y relleno de la aplicación alrededor de los componentes nativos de Cloudscape.

css
body {
  margin: 0;
}
.cloudscape-example {
  padding: 24px;
  max-width: 1200px;
  margin: auto;
}
.appearance {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  margin-bottom: 24px;
}
.appearance > span {
  font-size: 11px;
  letter-spacing: 0.06em;
  font-weight: 700;
}
.wizard-content {
  margin-top: 32px;
}
.cloudscape-example footer {
  font-size: 12px;
  margin-top: 32px;
  color: #5f6b7a;
}
@media (max-width: 600px) {
  .cloudscape-example {
    padding: 16px;
  }
  .appearance {
    align-items: start;
  }
  .appearance > span {
    max-width: 180px;
  }
  .wizard-content {
    margin-top: 24px;
  }
}

Referencia de código

  • No sobrescribas los nombres de clase de los componentes nativos con esta hoja de estilos de la aplicación.
04

Configuración del agente de sistema de diseño AWS Cloudscape

Punto de partida para la implementación

El ejemplo nativo mostrado se compiló con React 18.3.1. Usa una versión de Node.js compatible con la versión de Vite que instales; conserva las versiones que utiliza el archivo de bloqueo de tu aplicación.

sh
npm create vite@latest cloudscape-workspace -- --template react
cd cloudscape-workspace
npm install
npm install [email protected] [email protected] @cloudscape-design/[email protected] @cloudscape-design/[email protected] @cloudscape-design/global-styles
# Replace src/main.jsx and add src/cloudscape.css from the full examples.
npm run dev

Una instrucción para tu proyecto

Instrucción para el agente
Crea un flujo de configuración de recursos con Cloudscape. Usa el código nativo proporcionado de Wizard/Container/FormField/Input/Select y los roles de tokens de visual-refresh. Conserva los valores de los campos entre pasos, valida antes de navegar y muestra una revisión completa. Trata los perfiles de capacidad de ejemplo como marcadores de posición para mi modelo de dominio, no como productos reales de la nube. Integra la provisión solo después de que se proporcione un API; distingue los resultados pendientes, fallidos y confirmados.
05

Fuentes y alcance de sistema de diseño AWS Cloudscape

Guía de OpenDesign y ejemplo original de configuración de un espacio de trabajo local, creado con componentes nativos de Cloudscape 3.0.1390. Los perfiles de capacidad son datos ficticios de la aplicación. No se utiliza ninguna cuenta en la nube, API de provisión ni precio de servicio real.