Netlify
Electric Teal Netlify Spark와 즉시 배포 피드백
Brand DNA
브랜드 DNA
- 브랜드명: Netlify
- 한 줄 정체성: git push 한 번으로 글로벌 엣지에 자동 배포되는, 프론트엔드 클라우드 플랫폼
- 공식 디자인 철학: 하나의 입력이 여러 결과로 확장되는 빛의 분산, 수렴, 속도, 성장을 Netlify Spark에 담아 웹을 만드는 사람들의 흐름을 연결한다.
- 시그니처 요소 1개: Electric Teal(#32E6E2) 액션과 짙은 Ink 위에서 빛나는 방사형 Netlify Spark
Tone & Mood
톤 & 무드
- 핵심 키워드 3개: 친근함, 자동화, 빠른 배포
- 무드 설명: 밝은 제품 캔버스와 짙은 Ink 밴드가 선명하게 교차하고, Electric Teal은 배포 같은 핵심 액션에 집중된다. 인디고 링크와 즉각적인 상태 피드백이 복잡한 인프라 작업을 친근하고 빠르게 느끼게 한다.
- 비주얼 스타일: 모던 미니멀
- 밀도(Density): Comfortable — 빌드 메트릭, 배포 로그
- 모서리 성향: Soft (4~8px)
- 평면성: Subtle
Color System
컬러 시스템 (CSS 변수)
:root {
/* Primary - Netlify Electric Teal */
--color-primary-50: #E6FFFE;
--color-primary-100: #CFFFFD;
--color-primary-200: #9FF8F5;
--color-primary-300: #6CF0EC;
--color-primary-400: #45EBE6;
--color-primary-500: #32E6E2; /* 핵심 액션 */
--color-primary-600: #23D4D0;
--color-primary-700: #05BDBA; /* Spark 광선 */
--color-primary-800: #047977;
--color-primary-900: #014847; /* Spark 중심 */
/* Secondary - Link Indigo */
--color-secondary-100: #E8E6F0;
--color-secondary-500: #5653ED;
--color-secondary-700: #403FC9;
/* Neutral - Ink / Slate */
--color-neutral-0: #FFFFFF;
--color-neutral-50: #F7F9FA;
--color-neutral-100: #F3F6F7;
--color-neutral-200: #E3E9EC;
--color-neutral-300: #CFD9DE;
--color-neutral-500: #AAB6BD;
--color-neutral-700: #66737B;
--color-neutral-800: #45455F;
--color-neutral-900: #181A1C;
--color-neutral-1000: #0A0A0C;
/* Semantic */
--color-success-bg: rgba(26,161,121,0.12);
--color-success-fg: #1AA179;
--color-warning-bg: rgba(217,139,0,0.12);
--color-warning-fg: #B97000;
--color-error-bg: rgba(229,72,77,0.12);
--color-error-fg: #D9363E;
--color-info-bg: rgba(86,83,237,0.10);
--color-info-fg: #5653ED;
/* Surface */
--bg-base: #FFFFFF;
--bg-subtle: #F3F6F7;
--bg-elevated: #FFFFFF;
--bg-overlay: rgba(10,10,12,0.50);
/* Text */
--text-primary: #181A1C;
--text-secondary: #45455F;
--text-tertiary: #66737B;
--text-on-primary: #181A1C; /* Teal 위에는 Ink */
--text-disabled: #AAB6BD;
/* Border */
--border-default: #CFD9DE;
--border-subtle: #E3E9EC;
--border-strong: #AAB6BD;
--border-focus: #5653ED;
}
[data-theme="dark"] {
--bg-base: #181A1C;
--bg-subtle: #222629;
--bg-elevated: #2A2F33;
--text-primary: #F4F7F8;
--text-secondary: #CFD9DE;
--text-tertiary: #AAB6BD;
--border-default: #3A4248;
--border-subtle: #30363A;
--border-strong: #66737B;
}
Typography
타이포그래피
- 폰트 페어링:
- 영문 Display: Figtree (OFL) — 친근하고 묵직한 제목
- 영문 UI/Body: Instrument Sans (OFL) — 열린 형태의 제품 본문
- 한글: Pretendard (OFL) / Apple SD Gothic Neo
- 모노: ui-monospace / SFMono-Regular
- 위계:
- Display: 56px / 800 / 1.02 / -0.03em
- H1: 36px / 750 / 1.12 / -0.02em
- H2: 24px / 700 / 1.2 / -0.01em
- H3: 18px / 650 / 1.3 / 0
- Body Large: 18px / 400 / 1.55 / 0
- Body: 14px / 400 / 1.43 / 0
- Body Small: 12px / 400 / 1.33 / 0
- Caption: 11px / 600 / 1.27 / 0.04em
Spacing
스페이싱
- Base unit: 4px
- 토큰: ``
css --space-xs: 4px; --space-sm: 8px; --space-md: 12px; --space-lg: 16px; --space-xl: 24px; --space-2xl: 40px; --space-3xl: 64px;`` - Container: max-width 1280px, 좌우 패딩 24px
Border Radius
Border Radius
--radius-none: 0;
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-xl: 16px;
--radius-full: 9999px;
Shadow / Elevation
Shadow / Elevation
--shadow-none: none;
--shadow-sm: 0 1px 3px rgba(24,26,28,0.04);
--shadow-md: 0 4px 16px -4px rgba(24,26,28,0.06);
--shadow-lg: 0 8px 28px -8px rgba(24,26,28,0.10);
--shadow-xl: 0 16px 40px -12px rgba(24,26,28,0.16);
Iconography
Iconography
- 스타일: Outline (Netlify 자체 + Lucide 호환)
- Stroke 굵기: 1.5~2px
- 모서리 처리: Round
- 추천 라이브러리: Lucide / Phosphor
Component Guide
컴포넌트 가이드
Button
.btn {
font: 650 14px/1 'Instrument Sans', 'Pretendard', sans-serif;
border-radius: var(--radius-full);
padding: 0 18px;
height: 40px;
display: inline-flex; align-items: center; gap: 6px;
border: 0;
cursor: pointer;
transition: transform var(--duration-fast) var(--ease-out), background var(--duration-base) var(--ease-out);
}
.btn-primary { background: var(--color-primary-500); color: var(--text-on-primary); }
.btn-primary:hover { background: var(--color-primary-600); }
.btn-primary:active { background: var(--color-primary-700); transform: translateY(1px); }
.btn:disabled { background: var(--color-neutral-100); color: var(--text-disabled); cursor: not-allowed; transform: none; }
.btn.is-loading::before { content: ""; width: 12px; height: 12px; border: 2px solid currentColor; border-right-color: transparent; border-radius: 50%; animation: nf-spin .7s linear infinite; }
.btn-secondary { background: var(--bg-base); color: var(--text-primary); border: 1px solid var(--border-default); }
.btn-secondary:hover { border-color: var(--border-strong); }
.btn-ghost { background: transparent; color: var(--color-secondary-500); }
.btn-ghost:hover { background: var(--color-info-bg); }
.btn-danger { background: var(--color-error-fg); color: #FFFFFF; }
@keyframes nf-spin { to { transform: rotate(360deg); } }
Input
.input {
background: var(--bg-base);
color: var(--text-primary);
border: 1px solid var(--border-default);
border-radius: var(--radius-md);
min-height: 40px;
padding: 9px 12px;
font-size: 14px;
}
.input:focus { outline: none; border-color: var(--border-focus); box-shadow: 0 0 0 3px rgba(86,83,237,0.18); }
.input[aria-invalid="true"] { border-color: var(--color-error-fg); }
.input:disabled { background: var(--bg-subtle); color: var(--text-disabled); cursor: not-allowed; }
Card
.card { background: var(--bg-elevated); border: 1px solid var(--border-default); border-radius: var(--radius-lg); padding: 20px; }
.card-elevated { box-shadow: var(--shadow-md); border-color: transparent; }
.card-outlined { box-shadow: none; }
.card-accent { background: linear-gradient(135deg, var(--color-primary-50), var(--color-secondary-100)); border-color: transparent; }
Badge / Deploy status
.tag { padding: 3px 8px; border-radius: var(--radius-full); font-size: 11px; font-weight: 650; line-height: 16px; display: inline-flex; align-items: center; gap: 5px; }
.tag-solid { background: var(--color-primary-500); color: var(--text-on-primary); }
.tag-subtle { background: var(--color-info-bg); color: var(--color-info-fg); }
.tag-outline { border: 1px solid var(--border-default); color: var(--text-primary); }
.tag-published { background: var(--color-success-bg); color: var(--color-success-fg); }
.tag-published::before { content:""; width: 6px; height: 6px; border-radius: 50%; background: var(--color-success-fg); }
.tag-building { background: var(--color-info-bg); color: var(--color-info-fg); }
.tag-failed { background: var(--color-error-bg); color: var(--color-error-fg); }
Navigation (Top + Side)
.topnav { height: 56px; background: var(--bg-base); color: var(--text-primary); border-bottom: 1px solid var(--border-default); display: flex; align-items: center; padding: 0 20px; gap: 12px; }
.sidebar { width: 232px; background: var(--bg-subtle); border-right: 1px solid var(--border-default); padding: 16px 12px; min-height: 100vh; }
.sidebar .item { display: flex; align-items: center; gap: 10px; padding: 9px 12px; border-radius: var(--radius-md); font-size: 13px; color: var(--text-secondary); cursor: pointer; }
.sidebar .item:hover { background: var(--bg-base); color: var(--text-primary); }
.sidebar .item.active { background: var(--color-info-bg); color: var(--color-secondary-500); font-weight: 650; }
Motion
Motion
--duration-fast: 100ms;
--duration-base: 200ms;
--duration-slow: 350ms;
--ease-out: cubic-bezier(0.4, 0, 0.2, 1);
--ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
Anti-patterns
Anti-patterns
1. Electric Teal 위에 흰 텍스트 배치 금지 — Ink(#181A1C) 사용 2. 2023년 이전 Gem/다이아몬드 로고를 Spark 대신 사용하거나 Spark 광선을 회전·변형하지 않기 3. Teal과 Indigo 역할 혼합 금지 — Teal은 핵심 액션, Indigo는 링크·선택·포커스에 사용 4. 배포 상태를 브랜드 Teal로 표현하지 않기 — success/warning/error 시맨틱 컬러로 구분 5. 흰 캔버스와 Ink 밴드의 강한 명도 대비를 저채도 회색 그라데이션으로 흐리지 않기