Adobe Spectrum
Spectrum Blue와 적응형 색상 스케일이 만드는 정밀한 상태 위계
Brand DNA
브랜드 DNA
- 브랜드명: Adobe Spectrum Design System
- 한 줄 정체성: Adobe 제품 전반에 일관성과 접근성을 제공하는 적응형 디자인 시스템
- 공식 디자인 철학: "An evolving, adaptive design system that empowers creativity"
- 시그니처 요소 1개: Spectrum Blue(#2680EB)를 중심으로 테마와 상태에 맞춰 변하는 적응형 색상 스케일
Tone & Mood
톤 & 무드
- 핵심 키워드 3개: 크리에이티브, 정밀, 도구적
- 무드 설명: 콘텐츠와 작업 흐름을 방해하지 않는 중립 표면 위에, 핵심 행동과 상태만 Spectrum Blue로 선명하게 표시한다. 라이트와 다크 환경 모두에서 같은 정보 위계와 접근성을 유지한다.
- 비주얼 스타일: 모던 미니멀 (적응형 도구 인터페이스)
- 밀도(Density): Compact / Comfortable 양립 (4 scale: small / medium / large / extra-large)
- 모서리 성향: Soft (4px 기본)
- 평면성: Flat — 그림자보다 표면색, 테두리, 상태색으로 위계를 구분
Color System
컬러 시스템 (CSS 변수)
:root {
/* Primary - Spectrum Blue */
--color-primary-50: #E0F2FF; /* blue-100 */
--color-primary-100: #CAE8FF; /* blue-200 */
--color-primary-200: #B5DEFF;
--color-primary-300: #78BBFA; /* blue-500 */
--color-primary-400: #4B9CF5;
--color-primary-500: #2680EB; /* blue-700 — 기본 accent */
--color-primary-600: #1473E6; /* hover */
--color-primary-700: #0D66D0;
--color-primary-800: #095ABA;
--color-primary-900: #064F8C;
/* Secondary - Spectrum Indigo */
--color-secondary-500: #6767EC;
/* Neutral - Spectrum gray */
--color-neutral-0: #FFFFFF; /* gray-50 light */
--color-neutral-50: #F5F5F5; /* gray-100 */
--color-neutral-100: #E1E1E1; /* gray-200 */
--color-neutral-200: #CACACA; /* gray-300 */
--color-neutral-300: #B3B3B3; /* gray-400 */
--color-neutral-500: #8E8E8E; /* gray-500 */
--color-neutral-700: #6E6E6E; /* gray-600 */
--color-neutral-800: #4B4B4B; /* gray-700 */
--color-neutral-900: #2C2C2C; /* gray-800 */
--color-neutral-1000: #1A1A1A; /* gray-900 */
/* Semantic */
--color-success-bg: #DCF7E3;
--color-success-fg: #268E6C;
--color-warning-bg: #FFF4E6;
--color-warning-fg: #E68619;
--color-error-bg: #FFEBE7;
--color-error-fg: #D7373F;
--color-info-bg: #E0F2FF;
--color-info-fg: #2680EB;
/* Surface (Spectrum Light) */
--bg-base: #FFFFFF;
--bg-subtle: #F5F5F5;
--bg-elevated: #FFFFFF;
--bg-overlay: rgba(0,0,0,0.40); /* scrim */
/* Text */
--text-primary: #2C2C2C;
--text-secondary: #6E6E6E;
--text-tertiary: #8E8E8E;
--text-on-primary: #FFFFFF;
--text-disabled: #B3B3B3;
/* Border */
--border-default: #CACACA;
--border-subtle: #E1E1E1;
--border-strong: #8E8E8E;
--border-focus: #2680EB;
}
[data-theme="dark"] {
/* Spectrum Dark — 동일한 상태 위계를 유지하는 공식 다크 변형 */
--color-primary-50: #082A52;
--color-primary-100: #0B3A70;
--color-primary-200: #0D4D94;
--color-primary-300: #1473E6;
--color-primary-400: #2680EB;
--color-primary-500: #378EF0;
--color-primary-600: #4B9CF5;
--color-primary-700: #78BBFA;
--color-primary-800: #B5DEFF;
--color-primary-900: #E0F2FF;
--color-secondary-500: #8A8AF0;
--color-neutral-0: #1A1A1A;
--color-neutral-50: #1F1F1F;
--color-neutral-100: #2C2C2C;
--color-neutral-200: #393939;
--color-neutral-300: #4B4B4B;
--color-neutral-500: #6E6E6E;
--color-neutral-700: #909090;
--color-neutral-800: #B3B3B3;
--color-neutral-900: #D5D5D5;
--color-neutral-1000: #EFEFEF;
--color-success-bg: #11341F;
--color-success-fg: #5BD9A0;
--color-warning-bg: #3A2A0D;
--color-warning-fg: #F5A623;
--color-error-bg: #3A1714;
--color-error-fg: #EC7B73;
--color-info-bg: #0E2C4D;
--color-info-fg: #378EF0;
--bg-base: #1F1F1F;
--bg-subtle: #2C2C2C;
--bg-elevated: #393939;
--bg-overlay: rgba(0,0,0,0.50);
--text-primary: #EFEFEF;
--text-secondary: #C8C8C8;
--text-tertiary: #909090;
--text-on-primary: #FFFFFF;
--text-disabled: #6E6E6E;
--border-default: #4B4B4B;
--border-subtle: #393939;
--border-strong: #6E6E6E;
--border-focus: #378EF0;
}
[data-theme="darkest"] {
/* Photoshop 등 풀 다크 */
--bg-base: #080808;
--bg-subtle: #1A1A1A;
--bg-elevated: #252525;
}
Typography
타이포그래피
- 폰트 페어링:
- 영문: Adobe Clean (Adobe 라이선스, 웹 폴백 -apple-system)
- 한글: Adobe Clean Han KR (한국어 가족) / 폴백 Apple SD Gothic Neo
- 위계 (Spectrum scale, medium):
- Display (Heading XXL): 36px / 700 / 1.2 / 0
- H1 (Heading XL): 28px / 700 / 1.25 / 0
- H2 (Heading L): 22px / 700 / 1.27 / 0
- H3 (Heading M): 18px / 700 / 1.33 / 0
- Body Large: 16px / 400 / 1.5 / 0
- Body: 14px / 400 / 1.43 / 0
- Body Small: 12px / 400 / 1.33 / 0
- Caption: 11px / 400 / 1.27 / 0.06em
Spacing
스페이싱
- Base unit: 4px (Spectrum size-100 = 8px)
- 토큰: ``
css --space-xs: 4px; --space-sm: 8px; --space-md: 16px; --space-lg: 24px; --space-xl: 32px; --space-2xl: 40px; --space-3xl: 64px;`` - Container: max-width 1280px, 좌우 패딩 24px
Border Radius
Border Radius
--radius-none: 0;
--radius-sm: 2px;
--radius-md: 4px; /* 기본 */
--radius-lg: 8px;
--radius-xl: 16px;
--radius-full: 9999px;
Shadow / Elevation
Shadow / Elevation
--shadow-none: none;
--shadow-sm: 0 1px 4px rgba(0,0,0,0.10);
--shadow-md: 0 4px 8px rgba(0,0,0,0.12); /* popover */
--shadow-lg: 0 8px 24px rgba(0,0,0,0.16); /* dialog */
--shadow-xl: 0 12px 32px rgba(0,0,0,0.20);
Iconography
Iconography
- 스타일: Outline + Filled (Spectrum workflow 18px / UI 16px / illustrative 큰 사이즈)
- Stroke 굵기: 2px (workflow 18px)
- 모서리 처리: Round
- 추천 라이브러리: @adobe/react-spectrum + @spectrum-icons (Apache 2.0)
Component Guide
컴포넌트 가이드
Button (Spectrum: cta / primary / secondary / negative + fill / outline / quiet)
.btn {
font: 700 14px/1.286 "Adobe Clean", "Adobe Clean Han KR", -apple-system, sans-serif;
border-radius: var(--radius-full); /* Spectrum 기본은 pill */
padding: 0 18px;
height: 32px;
display: inline-flex; align-items: center; gap: 6px;
border: 2px solid transparent;
transition: background 130ms ease, border 130ms ease;
}
.btn-primary { background: var(--text-primary); color: #fff; border-color: var(--text-primary); }
.btn-primary:hover { background: #1A1A1A; border-color: #1A1A1A; }
.btn-primary:active { background: #000; }
.btn-cta { background: var(--color-primary-500); color: #fff; border-color: var(--color-primary-500); }
.btn-cta:hover { background: var(--color-primary-600); border-color: var(--color-primary-600); }
.btn-secondary { background: transparent; color: var(--text-primary); border-color: var(--text-primary); }
.btn-secondary:hover { background: var(--text-primary); color: #fff; }
.btn-ghost { background: transparent; color: var(--text-primary); border-color: transparent; }
.btn-ghost:hover { background: var(--bg-subtle); }
.btn-danger { background: var(--color-error-fg); color: #fff; border-color: var(--color-error-fg); }
Input (Spectrum Text Field)
.input {
background: var(--bg-elevated);
border: 1px solid var(--border-default);
border-radius: var(--radius-md);
padding: 0 12px;
height: 32px;
font-size: 14px;
}
.input:hover { border-color: var(--border-strong); }
.input:focus {
outline: none;
border-color: var(--border-focus);
box-shadow: 0 0 0 1px var(--border-focus);
}
.input[aria-invalid="true"] { border-color: var(--color-error-fg); box-shadow: 0 0 0 1px var(--color-error-fg); }
Card
.card { background: var(--bg-elevated); border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: 16px; }
.card-elevated { box-shadow: var(--shadow-md); border-color: transparent; }
.card-outlined { box-shadow: none; }
Badge / Tag
.tag { padding: 0 10px; height: 22px; border-radius: var(--radius-full); font-size: 12px; font-weight: 400; line-height: 22px; display: inline-flex; align-items: center; }
.tag-solid { background: var(--color-primary-500); color: #fff; }
.tag-subtle { background: var(--bg-subtle); color: var(--text-primary); border: 1px solid var(--border-default); }
.tag-outline { background: transparent; border: 1px solid var(--border-default); color: var(--text-primary); }
Navigation (Global Header — Spectrum 문서형)
.spectrum-nav { height: 64px; padding: 0 24px; background: var(--bg-base); border-bottom: 1px solid var(--border-subtle); display: flex; align-items: center; gap: 28px; }
.spectrum-nav__brand { display: inline-flex; align-items: center; gap: 10px; color: var(--text-primary); font-weight: 700; }
.spectrum-nav__links { display: flex; align-items: center; gap: 24px; margin-left: auto; }
.spectrum-nav__link { color: var(--text-secondary); font-size: 14px; text-decoration: none; }
.spectrum-nav__link:hover, .spectrum-nav__link[aria-current="page"] { color: var(--text-primary); }
.spectrum-nav__link[aria-current="page"] { box-shadow: inset 0 -2px var(--color-primary-500); }
Motion
Motion
--duration-fast: 130ms;
--duration-base: 250ms;
--duration-slow: 400ms;
--ease-out: cubic-bezier(0, 0, 0.40, 1);
--ease-in-out: cubic-bezier(0.45, 0, 0.40, 1);
Anti-patterns
Anti-patterns
1. Spectrum Blue를 장식용 대면적 배경으로 남용 금지 — 핵심 행동과 상태 표시에 집중 2. 라이트 토큰의 hex를 다크 표면에 그대로 복사 금지 — 테마별 색상 스케일과 대비 사용 3. workflow icon과 UI icon을 한 toolbar에서 혼용 금지 — 크기와 역할 위계 충돌 4. CTA·Primary·Negative 버튼의 의미를 색만으로 구분 금지 — 라벨과 상태를 함께 제공 5. 임의의 radius·spacing을 컴포넌트마다 추가 금지 — Spectrum 크기 스케일에서 선택