Ramp
Ramp Yellow 액센트와 굵은 숫자 위계로 설계한 라이트·다크 비용관리 워크스페이스
Brand DNA
브랜드 DNA
- 브랜드명: Ramp
- 한 줄 정체성: 미국 B2B 비용관리·법인카드 — 시간과 돈을 아끼는 금융 자동화
- 공식 디자인 철학: "Time is money. Save both." — 자동화로 시간과 비용을 함께 절약한다는 제품 약속
- 시그니처 요소 1개: Ramp Yellow(#FFE45E) 액센트 + 흰색/검정 캔버스 + 굵은 헤드라인 + 절제된 직각 카드. 컨슈머 핀테크의 과도한 라운드와 구분되는 B2B의 단단함
Tone & Mood
톤 & 무드
- 핵심 키워드 3개: B2B카드, 굵은산세리프, 옐로액센트
- 무드 설명: 흰 캔버스를 기본으로 검정 다크 테마까지 공식 지원하며, 강조는 선명한 옐로 하나로 제한한다. 4~10px의 절제된 카드와 굵은 산세리프, 촘촘한 숫자 위계가 B2B 금융 도구의 정확성을 만든다.
- 비주얼 스타일: 모던 미니멀 + 브루털리즘 (대담 헤드라인)
- 밀도(Density): Comfortable
- 모서리 성향: Sharp (4~8px)
- 평면성: Flat
Color System
컬러 시스템 (CSS 변수)
:root {
/* Primary - Ramp Yellow */
--color-primary-50: #FFFCDC;
--color-primary-100: #FFF7A8;
--color-primary-200: #FFEF7A;
--color-primary-300: #FFE94C;
--color-primary-400: #FFE45E;
--color-primary-500: #FFE45E; /* Ramp Yellow */
--color-primary-600: #E5C84A;
--color-primary-700: #B89E2F;
--color-primary-800: #80701F;
--color-primary-900: #4D420F;
/* Secondary - Cool Black (브랜드 다크) */
--color-secondary-500: #0E0E0E;
/* Neutral */
--color-neutral-0: #FFFFFF;
--color-neutral-50: #F7F7F7;
--color-neutral-100: #EFEFEF;
--color-neutral-200: #DCDCDC;
--color-neutral-300: #B5B5B5;
--color-neutral-500: #7A7A7A;
--color-neutral-700: #3A3A3A;
--color-neutral-800: #1F1F1F;
--color-neutral-900: #0E0E0E;
--color-neutral-1000: #000000;
/* Semantic */
--color-success-bg: #E0F4E2;
--color-success-fg: #1A8233;
--color-warning-bg: #FFF5DA;
--color-warning-fg: #8C6A00;
--color-error-bg: #FCE3E3;
--color-error-fg: #C72E1A;
--color-info-bg: #E8F0FB;
--color-info-fg: #2C70BE;
/* Surface (Light default) */
--bg-base: #FFFFFF;
--bg-subtle: #F7F7F7;
--bg-elevated: #FFFFFF;
--bg-overlay: rgba(14,14,14,0.50);
/* Text */
--text-primary: #0E0E0E;
--text-secondary: #3A3A3A;
--text-tertiary: #7A7A7A;
--text-on-primary: #0E0E0E; /* Yellow 위 검정 */
--text-disabled: #B5B5B5;
/* Border */
--border-default: #EFEFEF;
--border-subtle: #F7F7F7;
--border-strong: #DCDCDC;
--border-focus: #0E0E0E;
}
[data-theme="dark"] {
--bg-base: #0E0E0E;
--bg-subtle: #1A1A1A;
--bg-elevated: #1F1F1F;
--text-primary: #FFFFFF;
--text-secondary: rgba(255,255,255,0.78);
--text-tertiary: rgba(255,255,255,0.55);
--border-default: rgba(255,255,255,0.10);
}
Typography
타이포그래피
- 폰트 페어링:
- 영문: Aeonik (Cofo Type) / Inter 폴백
- 코드/숫자: IBM Plex Mono tabular-nums
- 한글: Pretendard / Noto Sans KR
- 위계:
- Display: 96px / 800 / 0.95 / -0.04em (랜딩 헤드라인)
- H1: 48px / 700 / 1.05 / -0.02em
- H2: 28px / 700 / 1.2 / -0.01em
- H3: 18px / 600 / 1.35 / 0
- Body Large: 18px / 400 / 1.55 / 0
- Body: 15px / 400 / 1.5 / 0
- Body Small: 13px / 500 / 1.4 / 0
- Caption: 11px / 700 / 1.3 / 0.08em uppercase
- Numeric: 17px / 700 tabular-nums
Spacing
스페이싱
- Base unit: 4px
- 토큰: ``
css --space-xs: 4px; --space-sm: 8px; --space-md: 16px; --space-lg: 24px; --space-xl: 36px; --space-2xl: 56px; --space-3xl: 96px;`` - Container: max-width 1280px, 좌우 패딩 24px
Border Radius
Border Radius
--radius-none: 0;
--radius-sm: 4px;
--radius-md: 6px;
--radius-lg: 10px;
--radius-xl: 14px;
--radius-full: 9999px;
Shadow / Elevation
Shadow / Elevation
--shadow-none: none;
--shadow-sm: 0 1px 2px rgba(14,14,14,0.06);
--shadow-md: 0 4px 12px rgba(14,14,14,0.08);
--shadow-lg: 0 12px 28px rgba(14,14,14,0.12);
Iconography
Iconography
- 스타일: Outline (얇은 선) — 데이터 시각화는 굵게
- Stroke 굵기: 1.5~2px
- 모서리 처리: Round
- 추천 라이브러리: Phosphor / Lucide
Component Guide
컴포넌트 가이드
Button
.btn { font: 700 14px/1 Aeonik, Inter, sans-serif; border-radius: 6px; padding: 13px 22px; border: 0; display: inline-flex; align-items: center; gap: 8px; cursor: pointer; transition: background 200ms ease, transform 120ms ease; }
.btn-primary { background: var(--color-primary-500); color: var(--text-on-primary); }
.btn-primary:hover { background: var(--color-primary-600); }
.btn-secondary { background: #0E0E0E; color: #fff; }
.btn-secondary:hover { background: #1F1F1F; }
.btn-outline { background: transparent; color: var(--text-primary); border: 1.5px solid var(--text-primary); }
.btn-ghost { background: transparent; color: var(--text-primary); text-decoration: underline; padding: 0; }
.btn-danger { background: var(--color-error-fg); color: #fff; }
.btn-yellow-cta { background: var(--color-primary-500); color: #0E0E0E; padding: 16px 26px; font-size: 15px; }
Input
.input { background: #fff; border: 1.5px solid var(--border-strong); border-radius: 6px; padding: 12px 14px; color: var(--text-primary); font: 400 15px/1.3 inherit; }
.input::placeholder { color: var(--text-tertiary); }
.input:focus { outline: none; border-color: var(--text-primary); box-shadow: 0 0 0 3px rgba(14,14,14,0.10); }
Card (Stat / Card)
.stat-card { background: #fff; border: 1px solid var(--border-default); border-radius: 10px; padding: 22px; }
.stat-card .label { font: 600 11px/1 inherit; letter-spacing: 0.12em; text-transform: uppercase; color: var(--text-tertiary); margin-bottom: 10px; }
.stat-card .value { font: 700 36px/1 inherit; letter-spacing: -0.01em; font-variant-numeric: tabular-nums; }
.stat-card .delta { font: 700 13px/1 inherit; color: var(--color-success-fg); margin-top: 8px; font-variant-numeric: tabular-nums; }
.card-cc { background: var(--color-primary-500); color: var(--text-on-primary); border-radius: 8px; padding: 22px; min-height: 200px; display: flex; flex-direction: column; justify-content: space-between; }
.card-cc .label { font: 800 11px/1 inherit; letter-spacing: 0.16em; text-transform: uppercase; }
.card-cc .row { display: flex; justify-content: space-between; align-items: flex-end; font: 700 13px/1 inherit; font-variant-numeric: tabular-nums; }
.tx-row { display: grid; grid-template-columns: 32px 1fr auto auto; gap: 14px; padding: 14px 18px; background: #fff; border: 1px solid var(--border-default); border-radius: 6px; align-items: center; cursor: pointer; }
.tx-row:hover { background: var(--bg-subtle); }
.tx-row .who { font: 600 14px/1.3 inherit; }
.tx-row .merchant { font: 500 12px/1.3 inherit; color: var(--text-tertiary); }
.tx-row .amount { font: 700 15px/1 inherit; font-variant-numeric: tabular-nums; }
.card { background: #fff; border: 1px solid var(--border-default); border-radius: 10px; padding: 22px; }
Badge / Tag
.tag { padding: 4px 10px; border-radius: 4px; font: 700 11px/1.4 inherit; letter-spacing: 0.04em; text-transform: uppercase; }
.tag-cashback { background: var(--color-primary-500); color: var(--text-on-primary); }
.tag-pending { background: var(--color-warning-bg); color: var(--color-warning-fg); }
.tag-approved { background: var(--color-success-bg); color: var(--color-success-fg); }
.tag-card-active{ background: #0E0E0E; color: var(--color-primary-500); }
.tag-policy { background: var(--color-info-bg); color: var(--color-info-fg); }
Navigation (Side rail)
.rail { width: 240px; background: var(--bg-subtle); padding: 20px 12px; height: 100vh; border-right: 1px solid var(--border-default); }
.rail .brand { display: flex; align-items: center; gap: 8px; font: 800 22px/1 inherit; padding: 8px 14px; margin-bottom: 24px; letter-spacing: -0.01em; }
.rail .brand .sq { width: 16px; height: 16px; background: var(--color-primary-500); border-radius: 3px; }
.rail .item { display: flex; align-items: center; gap: 12px; padding: 10px 14px; border-radius: 6px; font: 500 14px/1.3 inherit; color: var(--text-secondary); cursor: pointer; }
.rail .item:hover { background: #fff; color: var(--text-primary); }
.rail .item.active { background: var(--text-primary); color: #fff; }
Motion
Motion
--duration-fast: 120ms;
--duration-base: 200ms;
--duration-slow: 320ms;
--ease-out: cubic-bezier(0.25, 0.46, 0.45, 0.94);
--ease-in-out: cubic-bezier(0.42, 0, 0.58, 1);
Anti-patterns
Anti-patterns
1. 옐로 외 액센트 색 추가 금지 — single accent 2. 라운드 풀필 카드 사용 금지 — 4~10px sharp 3. 옐로 위에 흰색 텍스트 사용 금지 — 검정만 4. 헤드라인을 얇은 라이트 웨이트로 사용 금지 — 굵은 산세리프가 정체성 5. 잔액·숫자를 비례폰트로 표기 금지 — tabular-nums