클라우드 플랫폼 · 새 리소스

AWS Cloudscape 디자인 시스템.

실제 시각적 새로 고침 토큰, 밀도에 따른 간격, 제어형 폼 API, 작동하는 2단계 리소스 마법사를 다루는 Cloudscape 구성 가이드입니다.

OpenDesign 가이드8개 챕터참조 항목 50개독자적 적용 가이드
01

AWS Cloudscape 디자인 시스템 인터페이스 미리보기

잘못된 이름을 입력해 보고, 용량 프로필을 선택한 다음, 구성과 검토 화면을 오가며 표시 모드를 변경하고 로컬에서 설정을 확정해 보세요.

워크스페이스 구성 및 검토전체 예시 열기
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-layout-mainlight: #ffffff; dark: #161d26지정된 역할은 의도된 맥락에서 사용하세요. 한 쌍으로 표시된 값은 밝은 모드와 어두운 모드에서의 색상이며, 서로 바꿔 쓸 수 있는 색상 견본이 아닙니다.
color-background-container-contentlight: #ffffff; dark: #161d26지정된 역할은 의도된 맥락에서 사용하세요. 한 쌍으로 표시된 값은 밝은 모드와 어두운 모드에서의 색상이며, 서로 바꿔 쓸 수 있는 색상 견본이 아닙니다.
color-text-body-defaultlight: #0f141a; dark: #c6c6cd지정된 역할은 의도된 맥락에서 사용하세요. 한 쌍으로 표시된 값은 밝은 모드와 어두운 모드에서의 색상이며, 서로 바꿔 쓸 수 있는 색상 견본이 아닙니다.
color-text-body-secondarylight: #424650; dark: #c6c6cd지정된 역할은 의도된 맥락에서 사용하세요. 한 쌍으로 표시된 값은 밝은 모드와 어두운 모드에서의 색상이며, 서로 바꿔 쓸 수 있는 색상 견본이 아닙니다.
color-text-interactive-defaultlight: #424650; dark: #dedee3지정된 역할은 의도된 맥락에서 사용하세요. 한 쌍으로 표시된 값은 밝은 모드와 어두운 모드에서의 색상이며, 서로 바꿔 쓸 수 있는 색상 견본이 아닙니다.
color-text-link-defaultlight: #006ce0; dark: #42b4ff지정된 역할은 의도된 맥락에서 사용하세요. 한 쌍으로 표시된 값은 밝은 모드와 어두운 모드에서의 색상이며, 서로 바꿔 쓸 수 있는 색상 견본이 아닙니다.
color-text-status-errorlight: #db0000; dark: #ff7a7a지정된 역할은 의도된 맥락에서 사용하세요. 한 쌍으로 표시된 값은 밝은 모드와 어두운 모드에서의 색상이며, 서로 바꿔 쓸 수 있는 색상 견본이 아닙니다.
color-text-status-successlight: #00802f; dark: #2bb534지정된 역할은 의도된 맥락에서 사용하세요. 한 쌍으로 표시된 값은 밝은 모드와 어두운 모드에서의 색상이며, 서로 바꿔 쓸 수 있는 색상 견본이 아닙니다.
color-border-input-defaultlight: #8c8c94; dark: #656871지정된 역할은 의도된 맥락에서 사용하세요. 한 쌍으로 표시된 값은 밝은 모드와 어두운 모드에서의 색상이며, 서로 바꿔 쓸 수 있는 색상 견본이 아닙니다.
color-background-button-primary-defaultlight: #006ce0; dark: #42b4ff지정된 역할은 의도된 맥락에서 사용하세요. 한 쌍으로 표시된 값은 밝은 모드와 어두운 모드에서의 색상이며, 서로 바꿔 쓸 수 있는 색상 견본이 아닙니다.

본문 및 제목 타이포그래피

출처
이름 / 규칙값 / 구성용도
font-size-body-m14px같은 역할의 글꼴 크기와 줄 높이를 짝지어 사용하세요. Header와 Box의 변형은 구성 요소 계층을 적용합니다.
font-size-body-s12px같은 역할의 글꼴 크기와 줄 높이를 짝지어 사용하세요. Header와 Box의 변형은 구성 요소 계층을 적용합니다.
font-size-heading-l20px같은 역할의 글꼴 크기와 줄 높이를 짝지어 사용하세요. Header와 Box의 변형은 구성 요소 계층을 적용합니다.
font-size-heading-m18px같은 역할의 글꼴 크기와 줄 높이를 짝지어 사용하세요. Header와 Box의 변형은 구성 요소 계층을 적용합니다.
font-size-heading-s16px같은 역할의 글꼴 크기와 줄 높이를 짝지어 사용하세요. Header와 Box의 변형은 구성 요소 계층을 적용합니다.
font-size-heading-xl24px같은 역할의 글꼴 크기와 줄 높이를 짝지어 사용하세요. Header와 Box의 변형은 구성 요소 계층을 적용합니다.
font-size-heading-xs14px같은 역할의 글꼴 크기와 줄 높이를 짝지어 사용하세요. Header와 Box의 변형은 구성 요소 계층을 적용합니다.
line-height-body-m20px같은 역할의 글꼴 크기와 줄 높이를 짝지어 사용하세요. Header와 Box의 변형은 구성 요소 계층을 적용합니다.
line-height-body-s16px같은 역할의 글꼴 크기와 줄 높이를 짝지어 사용하세요. Header와 Box의 변형은 구성 요소 계층을 적용합니다.
line-height-heading-l24px같은 역할의 글꼴 크기와 줄 높이를 짝지어 사용하세요. Header와 Box의 변형은 구성 요소 계층을 적용합니다.
line-height-heading-m22px같은 역할의 글꼴 크기와 줄 높이를 짝지어 사용하세요. Header와 Box의 변형은 구성 요소 계층을 적용합니다.
line-height-heading-s20px같은 역할의 글꼴 크기와 줄 높이를 짝지어 사용하세요. Header와 Box의 변형은 구성 요소 계층을 적용합니다.
line-height-heading-xl30px같은 역할의 글꼴 크기와 줄 높이를 짝지어 사용하세요. Header와 Box의 변형은 구성 요소 계층을 적용합니다.
line-height-heading-xs18px같은 역할의 글꼴 크기와 줄 높이를 짝지어 사용하세요. Header와 Box의 변형은 구성 요소 계층을 적용합니다.

밀도에 맞는 간격

출처
이름 / 규칙값 / 구성용도
space-scaled-xxxscomfortable: 2px; compact: 0px활성화된 밀도에 따라 편안함 또는 조밀함에 해당하는 값을 사용하세요. 간격이 바뀌어도 텍스트 크기는 조정하지 마세요.
space-scaled-xxscomfortable: 4px; compact: 2px활성화된 밀도에 따라 편안함 또는 조밀함에 해당하는 값을 사용하세요. 간격이 바뀌어도 텍스트 크기는 조정하지 마세요.
space-scaled-xscomfortable: 8px; compact: 4px활성화된 밀도에 따라 편안함 또는 조밀함에 해당하는 값을 사용하세요. 간격이 바뀌어도 텍스트 크기는 조정하지 마세요.
space-scaled-scomfortable: 12px; compact: 8px활성화된 밀도에 따라 편안함 또는 조밀함에 해당하는 값을 사용하세요. 간격이 바뀌어도 텍스트 크기는 조정하지 마세요.
space-scaled-mcomfortable: 16px; compact: 12px활성화된 밀도에 따라 편안함 또는 조밀함에 해당하는 값을 사용하세요. 간격이 바뀌어도 텍스트 크기는 조정하지 마세요.
space-scaled-lcomfortable: 20px; compact: 16px활성화된 밀도에 따라 편안함 또는 조밀함에 해당하는 값을 사용하세요. 간격이 바뀌어도 텍스트 크기는 조정하지 마세요.
space-scaled-xlcomfortable: 24px; compact: 20px활성화된 밀도에 따라 편안함 또는 조밀함에 해당하는 값을 사용하세요. 간격이 바뀌어도 텍스트 크기는 조정하지 마세요.
space-scaled-xxlcomfortable: 32px; compact: 24px활성화된 밀도에 따라 편안함 또는 조밀함에 해당하는 값을 사용하세요. 간격이 바뀌어도 텍스트 크기는 조정하지 마세요.
space-scaled-xxxlcomfortable: 40px; compact: 32px활성화된 밀도에 따라 편안함 또는 조밀함에 해당하는 값을 사용하세요. 간격이 바뀌어도 텍스트 크기는 조정하지 마세요.

구성 요소 모양

출처
이름 / 규칙값 / 구성용도
border-radius-container16px지정된 구성 요소의 형태를 유지하세요. 버튼의 모서리 반경을 컨테이너에 보편적으로 적용할 수 있는 반경으로 간주하지 마세요.
border-radius-button20px지정된 구성 요소의 형태를 유지하세요. 버튼의 모서리 반경을 컨테이너에 보편적으로 적용할 수 있는 반경으로 간주하지 마세요.
border-radius-input8px지정된 구성 요소의 형태를 유지하세요. 버튼의 모서리 반경을 컨테이너에 보편적으로 적용할 수 있는 반경으로 간주하지 마세요.
border-radius-alert12px지정된 구성 요소의 형태를 유지하세요. 버튼의 모서리 반경을 컨테이너에 보편적으로 적용할 수 있는 반경으로 간주하지 마세요.
border-radius-dropdown8px지정된 구성 요소의 형태를 유지하세요. 버튼의 모서리 반경을 컨테이너에 보편적으로 적용할 수 있는 반경으로 간주하지 마세요.
border-radius-card-embedded8px지정된 구성 요소의 형태를 유지하세요. 버튼의 모서리 반경을 컨테이너에 보편적으로 적용할 수 있는 반경으로 간주하지 마세요.

인터랙션 타이밍

출처
이름 / 규칙값 / 구성용도
motion-duration-responsivedefault: 115ms; disabled: 0ms모션 비활성화 모드에서는 네이티브 모션이 0으로 설정됩니다. 같은 인터랙션에 무관한 전환 효과를 추가하지 마세요.
motion-duration-expressivedefault: 165ms; disabled: 0ms모션 비활성화 모드에서는 네이티브 모션이 0으로 설정됩니다. 같은 인터랙션에 무관한 전환 효과를 추가하지 마세요.
motion-duration-complexdefault: 250ms; disabled: 0ms모션 비활성화 모드에서는 네이티브 모션이 0으로 설정됩니다. 같은 인터랙션에 무관한 전환 효과를 추가하지 마세요.

네이티브 구성 API

출처
이름 / 규칙값 / 구성용도
WizardactiveStepIndex · onNavigate · onSubmitReact에서 현재 단계를 관리하고, 요청된 다음 인덱스를 수락하기 전에 유효성을 검사하세요.
FormFieldlabel · constraintText · errorText형식 규칙과 오류 피드백을 이름 입력란과 함께 표시하세요.
Inputvalue · onChange({ detail })DOM 이벤트 대상이 아니라 detail.value를 읽으세요.
SelectselectedOption · options · onChangelabel과 value를 포함한 선택된 옵션 객체를 유지하세요.
Containerheader={<Header variant="h2" />}새로운 카드 시스템을 만들지 않고 관련 구성 필드를 그룹화하세요.
ColumnLayoutcolumns={2} · variant="text-grid"라이브러리의 반응형 열을 사용해 간결한 검토 메타데이터를 표시하세요.
SpaceBetweensize="l"라이브러리의 간격 척도를 사용해 필드와 검토 영역을 구분하세요.
applyModeMode.Light / Mode.Dark네이티브 구성 요소와 시맨틱 토큰의 전역 시각 모드를 전환하세요.
03

AWS Cloudscape 디자인 시스템 전체 가이드

실제 인터페이스를 위해 이 시스템을 선택하고 적용하고 검토하는 실용 가이드.

DESIGN-aws-cloudscape.md

완전한 안내와 구현 시작점, 소스 링크.

가이드 다운로드

AWS Cloudscape 디자인 시스템 구성 아키텍처

워크플로에 Wizard 적용하기

이 예제는 구성 단계와 검토 단계를 분리합니다. Wizard는 단계 탐색과 작업을 제공하고, 애플리케이션은 현재 인덱스, 필드 값, 유효성 검사 규칙, 최종 확인을 관리합니다. 사용자는 양식을 다시 작성하거나 선택한 용량을 잃지 않고 구성 단계로 돌아갈 수 있습니다. 전체 다단계 워크플로를 범용 Card 하나에 감추는 것보다 적합한 방식입니다.

이 OpenDesign 가이드에서

네이티브 컨테이너로 구성하기

Container, Header, SpaceBetween으로 양식 섹션을 구성합니다. h1은 작업을 소개하고 h2는 설정 그룹의 이름을 지정합니다. 설명 텍스트는 설명 대상인 필드나 단계 옆에 표시합니다. 주변의 최대 너비 1200px와 페이지 여백은 명시적으로 지정한 애플리케이션 CSS 값이며, 내보낸 Cloudscape 레이아웃 토큰이 아닙니다.

AWS Cloudscape 디자인 시스템 시맨틱 토큰 및 시각 모드

값보다 역할을 먼저 선택하세요

이 참고 자료는 레이아웃 배경, 컨테이너 콘텐츠, 본문 텍스트, 인터랙티브 텍스트, 상태 피드백을 구분합니다. 각 값은 단순한 색상 팔레트가 아닙니다. 맞춤 UI를 만들 때 밝은 모드의 16진수 색상값을 상태마다 복사하는 대신 @cloudscape-design/design-tokens에서 이름이 지정된 토큰을 가져오세요. 토큰은 용도를 명시하며, 값은 변경될 수 있습니다.

라이브러리에서 모드 전환하기

미리보기에서는 global-styles의 Mode.Light 또는 Mode.Dark를 사용해 applyMode를 호출합니다. 이렇게 하면 임의의 CSS 색상을 대체하는 대신 구성 요소가 사용하는 모드가 업데이트됩니다. 어두운 검토 화면에서도 레이블, 선택된 용량, 탐색 상태는 그대로 유지됩니다. 원본 JSON에는 밝은 모드와 어두운 모드의 값이 모두 기록되어 있어 차이를 확인할 수 있습니다.

AWS Cloudscape 디자인 시스템 타이포그래피 및 Header 계층

글꼴 역할과 줄 높이 역할을 짝지어 사용하세요

visual-refresh의 본문 m 기준값은 14px 크기와 20px 줄 높이입니다. heading-xl은 24px 크기와 30px 줄 높이, heading-l은 20px 크기와 24px 줄 높이, heading-m은 18px 크기와 22px 줄 높이를 사용합니다. 이러한 역할은 간결한 양식의 계층 구조를 설명하며, 서로 바꿔 쓸 수 있는 마케팅용 대형 텍스트 크기가 아닙니다.

시맨틱 구성 요소 변형을 사용하세요

Header의 h1 변형은 Create a workspace라는 이름을 표시합니다. 컨테이너 헤더에는 h2를 사용하고, Box의 awsui-key-label 변형은 검토 레이블에 일관된 보조 스타일을 적용합니다. 검토 값은 일반 텍스트로 읽기 쉽게 표시합니다. 시각적 강조를 높이기 위해 모든 필드 레이블을 제목으로 바꾸지 마세요.

AWS Cloudscape 디자인 시스템 제어 필드 및 검토 구성

detail 이벤트 계약 이해하기

Input은 새 텍스트를 담은 detail.value가 포함된 이벤트를 발생시킵니다. Select는 문자열이 아니라 옵션 객체인 detail.selectedOption을 발생시킵니다. 전체 예제에서는 해당 객체를 저장하고 검토 화면에 레이블을 표시합니다. 이렇게 하면 selectedOption에 식별자만 전달해 Select가 비어 보이는 흔한 통합 오류를 방지할 수 있습니다.

필드 안내를 해당 필드와 함께 표시하세요

  • 필드 형식 정책은 이 예제 애플리케이션에만 적용됩니다.
  • 용량 옵션은 제품 또는 가격에 관한 주장이 아닙니다.
  • 표시는 네이티브 구성 요소가 처리하고, 구성은 React 상태가 관리합니다.

AWS Cloudscape 디자인 시스템 밀도 및 반응형 레이아웃

조밀 모드를 확대/축소 수준처럼 취급하지 마세요

공개된 간격 조정 값은 밀도에 따라 다릅니다. 예를 들어 space-scaled-m은 편안한 모드에서 16px, 조밀 모드에서 12px이며, space-scaled-l은 각각 20px와 16px입니다. 이러한 차이는 콘텐츠를 바꾸거나 텍스트 크기를 임의로 줄이지 않고 세로 간격을 좁힙니다. 네이티브 구성 요소는 자체 밀도 규칙을 적용합니다.

단계와 검토 레이아웃이 화면에 맞게 조정되도록 하세요

Wizard는 사용 가능한 너비에 따라 탐색 표시 방식을 변경하고, ColumnLayout은 검토 메타데이터를 반응형으로 배치합니다. 애플리케이션 CSS은 600px 미만에서 바깥쪽 여백을 줄입니다. 이 예제는 데스크톱 단계 탐색 너비를 고정하지 않으며, 모바일에서도 로컬 작업인 Next, Previous, Confirm을 계속 표시합니다.

AWS Cloudscape 디자인 시스템 Wizard 유효성 검사 및 확인

탐색을 수락하기 전에 유효성을 검사하세요

onNavigate은 requestedStepIndex을 받습니다. 애플리케이션은 검토 단계로 이동하기 전에 현재 이름을 확인하고, 이름이 유효하지 않으면 단계를 그대로 둡니다. 편집하면 오류가 지워져 다음 제출 시 새로 유효성을 검사할 수 있습니다. 설정으로 돌아가도 이름과 선택한 옵션은 유지됩니다.

  1. 유효하지 않은 이름을 제출하고 설정 단계에 머무릅니다.
  2. 이름을 수정하고 다른 용량 프로필을 선택합니다.
  3. 검토 단계로 이동해 두 값을 모두 확인합니다.
  4. 두 값 모두 유지한 채 돌아가려면 설정 편집을 사용합니다.
  5. 로컬에서 확인하고 예제를 다시 시작합니다.

구성 예제와 실제 프로비저닝 구분하기

마지막 작업은 로컬 성공 Alert와 구성 요약을 표시합니다. 실제 리소스를 생성하는 것처럼 가장하지 않습니다. 실제 애플리케이션에서는 프로비저닝이 진행되는 동안 제출 작업을 대기 상태로 유지하고, 요청이 접수된 상태와 리소스 생성이 완료된 상태를 구분하며, 구성을 버리지 않고 실패를 복구할 방법을 제공하세요.

AWS Cloudscape 디자인 시스템 양식 접근성

레이블과 탐색 이름 유지하기

Wizard에는 navigationAriaLabel과 번역된 작업 문자열을 전달합니다. 각 Input과 Select는 레이블이 지정된 FormField 안에 배치됩니다. Alert는 네이티브 구성 요소의 시맨틱을 사용해 유효성 오류나 성공 결과를 전달합니다. 화면에 표시되는 제약 조건은 필드 레이블을 보완하며 대체하지 않습니다.

전체 작업의 키보드 탐색 경로 검토하기

키보드로 이름 필드에 포커스를 맞추고 용량 선택기를 연 다음, 다음 단계로 이동하고 돌아와 수정한 뒤 확인합니다. 네이티브 포커스 동작을 활용할 수 있지만, 단계 유효성 검사 규칙과 확인의 의미는 여전히 애플리케이션에서 정의해야 합니다. 구성 요소 라이브러리만으로는 누락된 비즈니스 규칙을 검증할 수 없습니다.

AWS Cloudscape 디자인 시스템 설치 및 사용자 지정 경계

관련 패키지를 함께 설치하기

구현에서는 개별 패키지 하위 경로를 통해 구성 요소를 가져오고, global-styles를 한 번 로드합니다. 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 />);

코드 참조

  • 이 내용을 src/main.jsx로 저장하세요. 다음 코드 블록은 가져와 사용하는 src/cloudscape.css입니다.

cloudscape.css — 예제 페이지 셸

네이티브 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;
  }
}

코드 참조

  • 이 애플리케이션 스타일시트에서 네이티브 구성 요소의 클래스 이름을 재정의하지 마세요.
04

AWS Cloudscape 디자인 시스템 에이전트 설정

구현 시작점

표시된 네이티브 예제는 React 18.3.1과 함께 번들로 제공되었습니다. 설치할 Vite 릴리스에서 지원하는 Node.js 버전을 사용하고, 애플리케이션 잠금 파일에 지정된 버전을 유지하세요.

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

프로젝트를 위한 프롬프트

에이전트 프롬프트
Cloudscape를 사용해 리소스 구성 워크플로를 구축하세요. 제공된 네이티브 Wizard/Container/FormField/Input/Select 코드와 visual-refresh 토큰 역할을 사용하세요. 단계 간 필드 값을 유지하고, 탐색 전에 유효성을 검사하며, 완전한 검토 화면을 표시하세요. 예시 용량 프로필은 실제 클라우드 제품이 아니라 내 도메인 모델을 위한 자리표시자로 취급하세요. API가 제공된 후에만 프로비저닝을 통합하고, 대기·실패·확정 결과를 구분하세요.
05

AWS Cloudscape 디자인 시스템 출처 및 범위

OpenDesign 가이드와 네이티브 Cloudscape 구성 요소 3.0.1390을 사용한 원본 로컬 작업 공간 구성 예제입니다. 용량 프로필은 가상의 애플리케이션 데이터입니다. 클라우드 계정, 프로비저닝 API 또는 실제 서비스 요금은 포함되지 않습니다.