Redis
Redis Red 데이터 스택 + 상단 워크스페이스 내비게이션 + 실시간 키 브라우저
Brand DNA
브랜드 DNA
- 브랜드명: Redis
- 한 줄 정체성: 초고속 인메모리 키-값 데이터 스토어 — 캐시·세션·큐·랭킹의 사실상 표준
- 공식 디자인 철학: "Real-time data" — 빠름의 시각화: 큐브 로고 + 명령형 CLI 톤
- 시그니처 요소 1개: 빨강 6각 큐브(데이터 블록을 쌓은 형상) 로고 + Redis Red(#FF4438) + 짙은 네이비 CLI 콘솔(#0B1B26)의 GET/SET 명령어. PostgreSQL 코끼리, MongoDB 잎과 정반대의 명령행 톤
Tone & Mood
톤 & 무드
- 핵심 키워드 3개: 빠름, 인메모리, 큐브
- 무드 설명: 라이트·다크 베이스 모두에서 Redis Red를 단일 강조로 사용한다. 데이터 브라우저와 짙은 네이비 CLI 패널, 모노스페이스 명령어, 얇은 상단 워크스페이스 내비게이션이 빠르고 기술적인 인상을 만든다.
- 비주얼 스타일: 모던 미니멀
- 밀도(Density): Comfortable
- 모서리 성향: Soft (4~6px)
- 평면성: Flat
Color System
컬러 시스템 (CSS 변수)
:root {
/* Primary - Redis Red */
--color-primary-50: #FFE3E0;
--color-primary-100: #FFB6AE;
--color-primary-200: #FF8A7D;
--color-primary-300: #FF6555;
--color-primary-400: #FF5345;
--color-primary-500: #FF4438; /* Redis Red */
--color-primary-600: #DB2C20;
--color-primary-700: #A81E14;
--color-primary-800: #75130C;
--color-primary-900: #460804;
/* Secondary - Hyper Yellow (브랜드 보조) */
--color-secondary-500: #DCFF1E;
/* Neutral */
--color-neutral-0: #FFFFFF;
--color-neutral-50: #F6F8FA;
--color-neutral-100: #ECF0F3;
--color-neutral-200: #DDE3E9;
--color-neutral-300: #B5C0CB;
--color-neutral-500: #8898A4;
--color-neutral-700: #5C707A;
--color-neutral-800: #2F4350;
--color-neutral-900: #091A23;
--color-neutral-1000: #0B1B26; /* CLI bg */
/* Semantic */
--color-success-bg: #E1F4EA;
--color-success-fg: #0FA567;
--color-warning-bg: #FFF3DA;
--color-warning-fg: #A67000;
--color-error-bg: #FFE0DC;
--color-error-fg: #DB2C20;
--color-info-bg: #E0EEFD;
--color-info-fg: #0072CE;
/* Code (CLI dark) */
--cli-prompt: #FF8A7D;
--cli-str: #7CDCC9;
--cli-num: #FFD479;
--cli-key: #B7E0FF;
--cli-cmt: #5C707A;
/* Surface */
--bg-base: #FFFFFF;
--bg-subtle: #F6F8FA;
--bg-elevated: #FFFFFF;
--bg-cli: #0B1B26;
--bg-overlay: rgba(9,26,35,0.50);
/* Text */
--text-primary: #091A23;
--text-secondary: #2F4350;
--text-tertiary: #5C707A;
--text-on-primary: #FFFFFF;
--text-link: #DB2C20;
--text-disabled: #B5C0CB;
/* Border */
--border-default: #DDE3E9;
--border-subtle: #ECF0F3;
--border-strong: #B5C0CB;
--border-focus: #FF4438;
}
[data-theme="dark"] {
--bg-base: #0B1B26;
--bg-subtle: #122735;
--bg-elevated: #1A3243;
--text-primary: #FFFFFF;
--text-secondary: #DDE3E9;
--border-default: #2F4350;
}
Typography
타이포그래피
- 폰트 페어링:
- 영문: Space Grotesk (브랜드) / Inter / Helvetica
- 코드/CLI: Space Mono / JetBrains Mono / SF Mono
- 한글: Pretendard / Noto Sans KR
- 위계:
- Display: 36px / 700 / 1.15
- H1: 28px / 700 / 1.2
- H2: 22px / 600 / 1.3
- H3: 17px / 600 / 1.35
- Body Large: 16px / 400 / 1.55
- Body: 14px / 400 / 1.5
- Body Small: 12px / 500 / 1.4
- Code: 13px / 400 / 1.65 mono
- Caption: 11px / 600 / 1.3
Spacing
스페이싱
- Base unit: 4px
- 토큰: ``
css --space-xs: 4px; --space-sm: 8px; --space-md: 12px; --space-lg: 16px; --space-xl: 24px; --space-2xl: 32px; --space-3xl: 48px;``
Border Radius
Border Radius
--radius-none: 0;
--radius-sm: 3px;
--radius-md: 4px;
--radius-lg: 6px;
--radius-xl: 10px;
--radius-full: 9999px;
Shadow / Elevation
Shadow / Elevation
--shadow-none: none;
--shadow-sm: 0 1px 2px rgba(9,26,35,0.06);
--shadow-md: 0 4px 12px rgba(9,26,35,0.08);
--shadow-lg: 0 12px 32px rgba(9,26,35,0.16);
--shadow-red: 0 6px 18px rgba(255,68,56,0.30);
Iconography
Iconography
- 스타일: Outline (2px)
- Stroke 굵기: 2px
- 모서리 처리: Sharp / Soft
- 추천 라이브러리: Phosphor / Tabler
Component Guide
컴포넌트 가이드
Button
.btn { font: 700 13px/1 'Space Grotesk', Inter, sans-serif; border-radius: 4px; padding: 9px 18px; border: 0; cursor: pointer; letter-spacing: -0.005em; }
.btn-primary { background: var(--color-primary-500); color: var(--text-on-primary); }
.btn-primary:hover { background: var(--color-primary-600); }
.btn-secondary { background: var(--bg-elevated); color: var(--text-primary); border: 1px solid var(--border-strong); }
.btn-cta { background: var(--color-primary-500); color: #fff; padding: 14px 28px; border-radius: 6px; font: 700 16px/1 inherit; box-shadow: var(--shadow-red); }
.btn-cli { background: var(--color-neutral-1000); color: var(--cli-str); padding: 7px 14px; font: 600 12px/1 'Space Mono', monospace; }
Input / CLI
.input { background: var(--bg-elevated); border: 1px solid var(--border-strong); border-radius: 4px; padding: 8px 12px; font: 400 14px/1.4 inherit; color: var(--text-primary); }
.input:focus { border-color: var(--color-primary-500); outline: 2px solid rgba(255,68,56,0.18); }
.cli { background: var(--bg-cli); color: #E1E8EE; padding: 14px 16px; border-radius: 6px; font: 400 13px/1.7 'Space Mono', monospace; }
.cli .prompt { color: var(--cli-prompt); }
.cli .str { color: var(--cli-str); }
.cli .num { color: var(--cli-num); }
.cli .cmt { color: var(--cli-cmt); font-style: italic; }
.cli .out { color: #E1E8EE; }
.cli input { all: unset; flex: 1; color: #E1E8EE; }
Card (Key item)
.key-list { background: var(--bg-subtle); border: 1px solid var(--border-default); border-radius: 6px; padding: 6px; }
.key-item { display: flex; align-items: center; gap: 8px; padding: 5px 10px; border-radius: 4px; font: 500 12px/1.4 inherit; color: var(--text-primary); cursor: pointer; }
.key-item:hover { background: var(--bg-elevated); }
.key-item.active { background: var(--bg-elevated); border: 1px solid var(--color-primary-500); color: var(--text-primary); }
.key-item .type { color: var(--color-primary-500); font-weight: 800; font-family: 'Space Mono', monospace; }
.key-card { background: var(--bg-elevated); border: 1px solid var(--border-default); border-radius: 6px; padding: 14px 16px; }
.key-card .meta { display: flex; gap: 14px; font: 500 12px/1 inherit; color: var(--text-tertiary); margin-top: 6px; }
Badge / Tag
.badge-type-string { background: rgba(255,68,56,0.12); color: var(--color-primary-700); border-radius: 3px; padding: 2px 7px; font: 700 11px/1.3 'Space Mono', monospace; }
.badge-type-hash { background: rgba(0,114,206,0.12); color: var(--color-info-fg); border-radius: 3px; padding: 2px 7px; font: 700 11px/1.3 'Space Mono', monospace; }
.badge-type-list { background: rgba(15,165,103,0.12); color: var(--color-success-fg); border-radius: 3px; padding: 2px 7px; font: 700 11px/1.3 'Space Mono', monospace; }
.badge-type-zset { background: rgba(166,112,0,0.15); color: var(--color-warning-fg); border-radius: 3px; padding: 2px 7px; font: 700 11px/1.3 'Space Mono', monospace; }
.tag-ttl { background: var(--bg-subtle); color: var(--text-secondary); border: 1px solid var(--border-default); border-radius: 9999px; padding: 2px 8px; font: 700 11px/1.3 'Space Mono', monospace; }
Navigation (Top-level workspace bar)
.workspace-bar { min-height: 52px; display: flex; align-items: center; gap: 24px; padding: 0 20px; background: var(--bg-elevated); border-bottom: 1px solid var(--border-default); }
.workspace-bar .brand { display: inline-flex; align-items: center; gap: 9px; font-weight: 700; white-space: nowrap; }
.workspace-bar .brand svg { width: 28px; height: 26px; color: var(--color-primary-500); }
.workspace-nav { align-self: stretch; display: flex; align-items: stretch; gap: 24px; }
.workspace-nav .item { display: grid; place-items: center; color: var(--text-secondary); border-bottom: 2px solid transparent; font: 650 13px/1 inherit; cursor: pointer; }
.workspace-nav .item:hover { color: var(--text-primary); }
.workspace-nav .item.active { color: var(--text-primary); border-bottom-color: var(--color-primary-500); }
.database-switcher { margin-left: auto; padding: 7px 10px; background: var(--bg-subtle); border: 1px solid var(--border-default); border-radius: 4px; color: var(--text-primary); font: 600 12px/1 'Space Mono', monospace; }
Motion
Motion
--duration-fast: 80ms;
--duration-base: 160ms;
--duration-slow: 260ms;
--ease-out: cubic-bezier(0.25, 0.46, 0.45, 0.94);
Anti-patterns
Anti-patterns
1. 회사 컬러를 #C00 등 어두운 적색으로 표현 금지 — Redis Red(#FF4438) 채도 유지 2. CLI 패널 없이 폼 위주 UI 금지 — 짙은 네이비 콘솔 패널이 정체성 3. 키 타입(String/Hash/List/ZSet) 색 칩 없이 모두 회색 표기 금지 4. 큐브 외 둥근 마스코트 사용 금지 — 6각 큐브 로고가 정체성 5. 본문에 Space Mono 사용 금지 — 본문은 Space Grotesk, 코드/키 이름만 Space Mono