Руководство по настройке Cloudscape с реальными токенами визуального обновления, плотностью адаптивных отступов, API управляемых форм и работающим двухэтапным мастером настройки ресурса.
Нативный Cloudscape 3.0.1390 с React 18.3.1; оригинальная композиция Wizard, состояние хранится только локально. · Справочник по реализации
02
Справочник по дизайну-системе дизайн-система AWS Cloudscape
Компоненты Cloudscape 3.0.1390 и design-tokens 3.0.114, тема visual-refresh. Значения считываются из опубликованного JSON с токенами. Цветовые режимы и плотность контента — отдельные параметры. Здесь показан выбранный пример реализации, а не полный экспорт токенов.
Семантические цветовые роли в светлом и тёмном режимах
Используйте именованную роль в предусмотренном для неё контексте; в паре показаны значения для светлого и тёмного режимов, а не взаимозаменяемые образцы цвета.
color-background-container-content
light: #ffffff; dark: #161d26
Используйте именованную роль в предусмотренном для неё контексте; в паре показаны значения для светлого и тёмного режимов, а не взаимозаменяемые образцы цвета.
color-text-body-default
light: #0f141a; dark: #c6c6cd
Используйте именованную роль в предусмотренном для неё контексте; в паре показаны значения для светлого и тёмного режимов, а не взаимозаменяемые образцы цвета.
color-text-body-secondary
light: #424650; dark: #c6c6cd
Используйте именованную роль в предусмотренном для неё контексте; в паре показаны значения для светлого и тёмного режимов, а не взаимозаменяемые образцы цвета.
color-text-interactive-default
light: #424650; dark: #dedee3
Используйте именованную роль в предусмотренном для неё контексте; в паре показаны значения для светлого и тёмного режимов, а не взаимозаменяемые образцы цвета.
color-text-link-default
light: #006ce0; dark: #42b4ff
Используйте именованную роль в предусмотренном для неё контексте; в паре показаны значения для светлого и тёмного режимов, а не взаимозаменяемые образцы цвета.
color-text-status-error
light: #db0000; dark: #ff7a7a
Используйте именованную роль в предусмотренном для неё контексте; в паре показаны значения для светлого и тёмного режимов, а не взаимозаменяемые образцы цвета.
color-text-status-success
light: #00802f; dark: #2bb534
Используйте именованную роль в предусмотренном для неё контексте; в паре показаны значения для светлого и тёмного режимов, а не взаимозаменяемые образцы цвета.
color-border-input-default
light: #8c8c94; dark: #656871
Используйте именованную роль в предусмотренном для неё контексте; в паре показаны значения для светлого и тёмного режимов, а не взаимозаменяемые образцы цвета.
color-background-button-primary-default
light: #006ce0; dark: #42b4ff
Используйте именованную роль в предусмотренном для неё контексте; в паре показаны значения для светлого и тёмного режимов, а не взаимозаменяемые образцы цвета.
В зависимости от активной плотности используйте значение для комфортного или компактного режима. Не масштабируйте текст вместе с этими изменениями интервалов.
space-scaled-xxs
comfortable: 4px; compact: 2px
В зависимости от активной плотности используйте значение для комфортного или компактного режима. Не масштабируйте текст вместе с этими изменениями интервалов.
space-scaled-xs
comfortable: 8px; compact: 4px
В зависимости от активной плотности используйте значение для комфортного или компактного режима. Не масштабируйте текст вместе с этими изменениями интервалов.
space-scaled-s
comfortable: 12px; compact: 8px
В зависимости от активной плотности используйте значение для комфортного или компактного режима. Не масштабируйте текст вместе с этими изменениями интервалов.
space-scaled-m
comfortable: 16px; compact: 12px
В зависимости от активной плотности используйте значение для комфортного или компактного режима. Не масштабируйте текст вместе с этими изменениями интервалов.
space-scaled-l
comfortable: 20px; compact: 16px
В зависимости от активной плотности используйте значение для комфортного или компактного режима. Не масштабируйте текст вместе с этими изменениями интервалов.
space-scaled-xl
comfortable: 24px; compact: 20px
В зависимости от активной плотности используйте значение для комфортного или компактного режима. Не масштабируйте текст вместе с этими изменениями интервалов.
space-scaled-xxl
comfortable: 32px; compact: 24px
В зависимости от активной плотности используйте значение для комфортного или компактного режима. Не масштабируйте текст вместе с этими изменениями интервалов.
space-scaled-xxxl
comfortable: 40px; compact: 32px
В зависимости от активной плотности используйте значение для комфортного или компактного режима. Не масштабируйте текст вместе с этими изменениями интервалов.
Архитектура настройки в дизайн-системе AWS Cloudscape
Выберите Wizard для этого рабочего процесса
В этом примере настройка отделена от проверки. Wizard предоставляет навигацию по шагам и действия, а приложение — текущий индекс, значения полей, правило проверки и окончательное подтверждение. Читатель может вернуться к настройке, не перестраивая форму и не теряя выбранный профиль ресурсов. Это решение лучше, чем скрывать весь многошаговый процесс в одной универсальной Card.
Используйте нативные контейнеры
Container, Header и SpaceBetween формируют секцию формы. Заголовок h1 обозначает действие, а h2 — группу настроек. Пояснения размещаются рядом с полем или шагом, к которому относятся. Максимальная ширина 1200px и отступы страницы заданы явно на уровне приложения CSS и не являются экспортируемыми токенами компоновки Cloudscape.
Семантические токены и визуальные режимы дизайн-системы AWS Cloudscape
Сначала выберите роль, затем значение
В справочнике отдельно указаны фон макета, содержимое контейнеров, основной текст, интерактивный текст и обратная связь о состоянии. Это не единая палитра. Для пользовательского интерфейса импортируйте именованный токен из @cloudscape-design/design-tokens, а не копируйте светлое шестнадцатеричное значение для каждого состояния. Токен фиксирует назначение цвета, а само значение может меняться.
Переключайте режимы через библиотеку
В примере applyMode вызывается с Mode.Light или Mode.Dark из global-styles. Это меняет режим, используемый компонентами, а не подменяет произвольные цвета CSS. На тёмном экране проверки остаются неизменными подписи, выбранный профиль ресурсов и состояние навигации. В исходном JSON записаны значения для обоих режимов, поэтому эту разницу можно проверить.
Типографика и иерархия заголовков дизайн-системы AWS Cloudscape
Сочетайте роли шрифта и межстрочного интервала
В теме visual-refresh для основного текста размера m задан размер 14px и межстрочный интервал 20px. Для heading-xl указаны 24px и 30px, для heading-l — 20px и 24px, а для heading-m — 18px и 22px. Эти роли задают компактную иерархию формы и не предназначены для крупных рекламных заголовков.
Используйте семантические варианты компонентов
Вариант Header h1 задаёт заголовок «Создание рабочей области». Для заголовков контейнеров используйте h2, а вариант Box awsui-key-label придаёт подписям в блоке проверки единообразное вторичное оформление. Значения в блоке проверки остаются обычным читаемым текстом. Не превращайте каждую подпись поля в заголовок, чтобы просто усилить визуальный акцент.
Поля с управляемым состоянием и композиция проверки в дизайн-системе AWS Cloudscape
Разберитесь в контракте detail-событий
Input отправляет событие, в котором новое значение текста содержится в detail.value. Select отправляет detail.selectedOption — объект опции, а не обычную строку. В полном примере сохраняется этот объект, а при проверке отображается его label. Так можно избежать распространённой ошибки интеграции, из-за которой Select оказывается пустым, когда в selectedOption передаётся только идентификатор.
Размещайте инструкции рядом с полем
Правило формата поля действует только в этом демонстрационном приложении.
Профили ресурсов не являются сведениями о продукте или ценах.
За представление отвечают нативные компоненты, а за конфигурацию — состояние React.
Плотность и адаптивный макет в дизайн-системе AWS Cloudscape
Не считайте компактный режим масштабированием
В опубликованных масштабированных значениях интервалов предусмотрены разные значения для каждой плотности. Например, space-scaled-m составляет 16px в комфортном режиме и 12px в компактном, а space-scaled-l — 20px и 16px соответственно. Такие различия сжимают вертикальный ритм, не меняя содержимое и не уменьшая произвольно размер текста. Нативные компоненты применяют собственные правила плотности.
Адаптируйте структуру шагов и проверки
Wizard меняет представление навигации в зависимости от доступной ширины, а ColumnLayout адаптивно размещает сведения для проверки. При ширине менее 600px приложение CSS уменьшает внешние отступы. В примере не задана жёстко ширина навигации для настольного представления; в мобильном варианте кнопки «Далее», «Назад» и «Подтвердить локально» остаются видимыми.
Проверка и подтверждение в Wizard дизайн-системы AWS Cloudscape
Проверяйте данные до перехода
onNavigate получает requestedStepIndex. Перед переходом к проверке приложение проверяет текущее имя и остаётся на том же шаге, если оно недопустимо. При редактировании ошибка сбрасывается, чтобы при следующей отправке данные проверялись заново. При возврате к настройкам имя и выбранная опция сохраняются.
Введите недопустимое имя и убедитесь, что приложение остаётся на шаге настройки.
Исправьте имя и выберите другой профиль ресурсов.
Перейдите к проверке и подтвердите оба значения.
Нажмите «Изменить настройки», чтобы вернуться, не теряя ни одного значения.
Подтвердите локально и перезапустите пример.
Не путайте сохранение конфигурации с созданием ресурса
После последнего действия отображаются локальное уведомление Alert об успешном выполнении и сводка конфигурации. Это не имитирует создание настоящего ресурса. В реальном приложении во время подготовки ресурса сохраняйте состояние отправки, различайте принятые запросы и созданные ресурсы, а также предусмотрите восстановление после ошибки без потери конфигурации.
Доступность форм в дизайн-системе AWS Cloudscape
Сохраняйте подписи и названия навигации
Для Wizard заданы navigationAriaLabel и переведённые строки действий. Каждый Input и Select заключён в FormField с подписью. Alert сообщает о недопустимом вводе или успешном выполнении с помощью нативной семантики компонента. Видимые ограничения дополняют подпись поля, а не заменяют её.
Проверьте весь процесс с клавиатуры
С помощью клавиатуры перейдите к полю имени, откройте список Select, перейдите дальше, вернитесь, внесите изменения и подтвердите их. Нативное управление фокусом упрощает взаимодействие, но правило проверки шага и смысл подтверждения по-прежнему определяет приложение. Сама библиотека компонентов не может проверить отсутствующее бизнес-правило.
Установка и границы пользовательской настройки в дизайн-системе AWS Cloudscape
Устанавливайте связанные пакеты вместе
В реализации компоненты импортируются из отдельных подпутей пакетов, а global-styles подключается один раз. В custom-style используется справочник design-tokens. Предоставленный входной файл React и компактный файл CSS позволяют запустить интерактивный пример в приложении Vite React. Используйте совместимые версии пакетов Cloudscape.
Используйте пример как основу для реального проекта
Примеры компонентов дизайн-системы AWS Cloudscape
main.jsx — мастер настройки целиком
Нативные Wizard, FormField, Select и метаданные проверки с управляемой навигацией и локальным подтверждением.
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 />);
Не переопределяйте имена классов нативных компонентов в таблице стилей приложения.
04
Настройка AI-агента для дизайн-системы AWS Cloudscape
Отправная точка для реализации
Показанный нативный пример собран с React 18.3.1. Используйте версию Node.js, поддерживаемую установленной версией Vite; сохраняйте версии, зафиксированные в lock-файле приложения.
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
Запрос для вашего проекта
Промпт для AI-агента
Создайте рабочий процесс настройки ресурсов с Cloudscape. Используйте предоставленный код нативных компонентов Wizard/Container/FormField/Input/Select и роли токенов визуального обновления. Сохраняйте значения полей при переходе между шагами, проверяйте их перед навигацией и показывайте полную сводку. Считайте примеры профилей мощности условными данными приложения, а не реальными облачными продуктами. Подключайте подготовку ресурсов только после предоставления API; различайте ожидающие, неудачные и подтверждённые результаты.
05
Источники и область применения дизайн-системы AWS Cloudscape
Руководство OpenDesign и исходный пример настройки локального рабочего пространства с нативными компонентами Cloudscape 3.0.1390. Профили мощности — вымышленные данные приложения. Учётная запись облака, API для подготовки ресурсов и фактические цены на услуги не задействованы.