Channel Talk (채널톡)
블루바이올렛 #5E56F0 말풍선과 42% 스무스 코너 아바타가 만드는 대화형 상담 톤
Brand DNA
브랜드 DNA
- 브랜드명: Channel Talk (채널톡, 채널코퍼레이션)
- 한 줄 정체성: 상담 채팅·마케팅 메시지·팀 메신저를 한 인박스로 묶은 올인원 고객 대화 플랫폼
- 공식 디자인 철학: 오픈소스 디자인 시스템 「Bezier」 — "제품 전반에 걸쳐 일관된 룩앤필을 갖도록 돕는다". 이름 그대로 부드러운 베지어 곡선(
cubic-bezier(0.3, 0, 0, 1))이 모션과 모서리 감각의 기준이다. - 시그니처 요소 1개: 블루바이올렛
#5E56F0말풍선 + 42% 스무스 코너(스퀴클) 아바타 — 고객이 보는 채팅 위젯과 상담원이 보는 데스크가 같은 대화형 톤을 공유한다.
Tone & Mood
톤 & 무드
- 핵심 키워드 3개: 친근함, 산뜻함, 대화형
- 무드 설명: 흰 캔버스와 아주 옅은 회색 면(
#F7F7F8) 위에 블루바이올렛 한 가지만 강조색으로 쓴다. 선 대신 1px 퍼짐 그림자로 요소를 띄워 메신저처럼 가볍고 말랑한 인상을 만들고, 아바타·런처·앱 아이콘은 원이 아닌 스퀴클로 통일한다. - 비주얼 스타일: 모던 미니멀 + 휴머니즘 (이모지·일러스트 친화적인 메신저 감성)
- 밀도(Density): Comfortable — 상담원이 하루 종일 대화 목록을 훑는 도구라 정보량은 많되 13~15px 본문으로 숨 쉴 틈을 둔다.
- 모서리 성향: Soft (6~8px 기본, 말풍선·입력창은 12~20px, 아바타는 42% 스무스 코너)
- 평면성: Subtle — 테두리 대신
0 0 2px 1px기본 그림자 링 + 짧은 드롭 그림자
Color System
컬러 시스템 (CSS 변수)
Bezier 토큰(bezier-tokens global/functional light-theme) 기준. 9단계 중 공식 원색은 500(blue.400)·600(blue.500)이고, 50~200은 공식 알파 토큰(blue.400-10/20/30)을 흰 바탕에 합성한 값, 나머지는 (추정) 보간이다.
:root {
/* Primary - Bezier Blue (라이트 기본) */
--color-primary-50: #EFEEFE; /* bg-blue-lightest (400 10%) — 선택 행 배경 */
--color-primary-100: #DFDDFC; /* bg-blue-lighter (400 20%) — 칩 호버 */
--color-primary-200: #CFCCFA; /* bg-blue-light (400 30%) — 포커스 링 면 */
--color-primary-300: #A6A1F7; /* (추정) 보간 */
--color-primary-400: #7E77F3; /* (추정) 보간 — 다크 대비 링크 */
--color-primary-500: #5E56F0; /* bgtxt-blue-normal — 기본 버튼·내 말풍선 */
--color-primary-600: #4E40C9; /* bgtxt-blue-dark — hover/pressed */
--color-primary-700: #3F34A3; /* (추정) 보간 */
--color-primary-800: #2F277A; /* (추정) 보간 */
--color-primary-900: #201A52; /* (추정) 보간 */
/* Secondary - 브랜드 마크 바이올렛(로고) + Cobalt(accent 시맨틱) */
--color-secondary-500: #572DFF; /* 로고 스퀴클 실측 (channel.io) */
--color-accent-500: #329BE7; /* bgtxt-cobalt-normal — accent 시맨틱 */
/* Neutral - Bezier grey */
--color-neutral-0: #FFFFFF; /* surface-normal */
--color-neutral-50: #FCFCFC; /* grey.50 — surface-lower */
--color-neutral-100: #F7F7F8; /* grey.100 — surface-lowest, 위젯 채팅 배경 */
--color-neutral-200: #EFEFF0; /* grey.200 — 입력 비활성 면 */
--color-neutral-300: #E2E2E4; /* grey.300 */
--color-neutral-500: #A7A7AA; /* grey.500 — 아이콘 비활성 */
--color-neutral-700: #464748; /* grey.700 */
--color-neutral-900: #242428; /* grey.900 — 제목·로고타입 */
--color-neutral-1000: #000000;
/* Semantic - success=green, warning=orange, critical=red, accent=cobalt */
--color-success-bg: #EAF6EE; /* green.400 10% */
--color-success-fg: #31A552; /* green.400 */
--color-warning-bg: #FEF2E7; /* orange.400 10% */
--color-warning-fg: #F4800B; /* orange.400 */
--color-error-bg: #FDEDEE; /* red.400 10% */
--color-error-fg: #E94E58; /* red.400 */
--color-info-bg: #EBF5FD; /* cobalt.400 10% */
--color-info-fg: #329BE7; /* cobalt.400 */
/* Surface (배경 위계) */
--bg-base: #FFFFFF; /* bg-white-normal — 데스크 본문 */
--bg-subtle: #F7F7F8; /* surface-lowest — 사이드바·위젯 대화 영역 */
--bg-elevated: #FFFFFF; /* bg-white-high — 카드·말풍선 */
--bg-overlay: rgba(0, 0, 0, 0.40); /* dim-black-normal — 모달 딤 */
/* Text 위계 (fg-black 알파를 흰 바탕에 합성) */
--text-primary: #262626; /* txt-black-darkest (black 85%) — 본문 */
--text-secondary: #666666; /* txt-black-darker (black 60%) — 보조 */
--text-tertiary: #999999; /* txt-black-dark (black 40%) — 시간·캡션 */
--text-on-primary: #FFFFFF; /* bgtxt-absolute-white */
--text-disabled: #D9D9D9; /* txt-black-light (black 15%) */
/* Border */
--border-default: #EBEBEB; /* bg-black-light (black 8%) */
--border-subtle: #F2F2F2; /* bg-black-lighter (black 5%) */
--border-strong: #D9D9D9; /* bg-black-dark (black 15%) */
--border-focus: #5E56F0; /* bgtxt-blue-normal */
}
Typography
타이포그래피
- 폰트 페어링:
- 한글: Noto Sans KR (SIL OFL) — Bezier
font.family.sans.kr폴백 순서 2번째 - 영문: Inter (SIL OFL) — 스택 첫 번째. 일본어는 Noto Sans JP 가 앞으로 온다
- 한글: Noto Sans KR (SIL OFL) — Bezier
- 위계 (Bezier global font 토큰. 크기·행간 쌍 매핑 일부 (추정)):
- Display: 36px / 700 / 44px / 0
- H1: 30px / 700 / 36px / 0
- H2: 24px / 700 / 32px / 0
- H3: 18px / 700 / 24px / -0.1px
- Body Large: 16px / 400 / 22px / -0.1px (추정)
- Body: 14px / 400 / 18px / -0.1px
- Body Small: 13px / 400 / 18px / -0.1px
- Caption: 12px / 400 / 16px / 0 (11px/16px 는 배지·타임스탬프)
- Message(채팅 전용): 15.5px / 400 / 23px / -0.4px — 말풍선 본문만 쓰는 전용 스타일
- 굵기: 400·700 두 가지만 쓴다(중간 굵기 없음).
Spacing
스페이싱
- Base unit: 4px (데스크 상세 여백은 2px 단위 보정 (추정))
- 토큰: ``
css --space-xs: 4px; --space-sm: 8px; --space-md: 16px; --space-lg: 24px; --space-xl: 32px; --space-2xl: 48px; --space-3xl: 64px;`` - Container: 데스크는 화면 전체 폭(3단 레이아웃: 내비 64px + 목록 320~360px + 대화), 채팅 위젯 390px 폭 고정, 마케팅 랜딩 max-width 1200px / 좌우 24px (추정)
Border Radius
Border Radius
--radius-none: 0;
--radius-sm: 4px; /* 체크박스·태그 */
--radius-md: 8px; /* 버튼 M·입력창·드롭다운 */
--radius-lg: 12px; /* 카드·말풍선·모달 */
--radius-xl: 20px; /* 위젯 패널·큰 입력 */
--radius-smooth: 42%; /* 아바타·런처·앱 아이콘 (스무스 코너 근사) */
--radius-full: 9999px;
Shadow / Elevation
Shadow / Elevation
Bezier shadow.1~6 은 공통으로 "안쪽 흰 광택 + 1px 퍼짐 링 + 드롭"의 3겹 구조다. 테두리 대신 이 링이 경계선 역할을 한다.
--shadow-none: none;
--shadow-sm: inset 0 0 2px rgba(255,255,255,0.12), 0 0 2px 1px rgba(0,0,0,0.05), 0 1px 2px rgba(0,0,0,0.08); /* ev1 — 말풍선·리스트 카드 */
--shadow-md: inset 0 0 2px rgba(255,255,255,0.12), 0 0 2px 1px rgba(0,0,0,0.05), 0 2px 6px rgba(0,0,0,0.08); /* ev2 — 카드 hover·툴팁 */
--shadow-lg: inset 0 0 2px rgba(255,255,255,0.12), 0 0 2px 1px rgba(0,0,0,0.05), 0 4px 16px rgba(0,0,0,0.15); /* ev3 — 드롭다운·팝오버 */
--shadow-xl: inset 0 0 2px rgba(255,255,255,0.12), 0 0 2px 1px rgba(0,0,0,0.05), 0 6px 40px rgba(0,0,0,0.30); /* ev5 — 모달·채팅 위젯 패널 */
Iconography
Iconography
- 스타일: Filled 중심 (단색 면 아이콘, 활성·비활성을 색으로 구분) (추정)
- Stroke 굵기: 면 아이콘이라 선 두께 개념이 약함. 외곽선형을 쓸 경우 1.75~2px (추정)
- 모서리 처리: Round
- 추천 라이브러리: 공식
@channel.io/bezier-icons(24px 그리드). 대체로는 Phosphor Fill 또는 Tabler Filled
Component Guide
컴포넌트 가이드 (상태별 CSS)
Button (Primary / Secondary / Ghost / Danger)
.ct-btn { height: 36px; padding: 0 14px; border: 0; border-radius: var(--radius-md); font: 700 14px/18px Inter, 'Noto Sans KR', sans-serif; letter-spacing: -0.1px; display: inline-flex; align-items: center; gap: 6px; cursor: pointer; transition: background var(--duration-fast) var(--ease-out); }
.ct-btn--primary { background: var(--color-primary-500); color: var(--text-on-primary); }
.ct-btn--primary:hover { background: var(--color-primary-600); }
.ct-btn--primary:active { background: var(--color-primary-700); }
.ct-btn--secondary { background: var(--color-primary-50); color: var(--color-primary-500); }
.ct-btn--secondary:hover { background: var(--color-primary-100); }
.ct-btn--ghost { background: transparent; color: var(--text-secondary); }
.ct-btn--ghost:hover { background: var(--border-subtle); color: var(--text-primary); }
.ct-btn--danger { background: var(--color-error-fg); color: var(--text-on-primary); }
.ct-btn--danger:hover { filter: brightness(0.92); }
.ct-btn:disabled { opacity: 0.4; cursor: not-allowed; } /* Bezier opacity disabled 0.4 */
.ct-btn.is-loading { color: transparent; position: relative; pointer-events: none; }
.ct-btn.is-loading::after { content: ""; position: absolute; left: 50%; top: 50%; width: 16px; height: 16px; margin: -8px 0 0 -8px; border: 2px solid rgba(255,255,255,0.4); border-top-color: #fff; border-radius: 50%; animation: ct-spin 0.8s linear infinite; }
@keyframes ct-spin { to { transform: rotate(360deg); } }
Input
.ct-input { height: 36px; padding: 0 12px; border: 0; border-radius: var(--radius-md); background: var(--bg-elevated); color: var(--text-primary); box-shadow: inset 0 0 0 1px var(--border-default); font: 400 14px/18px Inter, 'Noto Sans KR', sans-serif; }
.ct-input:focus { outline: none; box-shadow: inset 0 0 0 1px var(--border-focus), 0 0 0 3px var(--color-primary-100); }
.ct-input.is-error { box-shadow: inset 0 0 0 1px var(--color-error-fg), 0 0 0 3px var(--color-error-bg); }
.ct-input:disabled { background: var(--bg-subtle); color: var(--text-disabled); }
Card
.ct-card { background: var(--bg-elevated); border-radius: var(--radius-lg); padding: 16px; box-shadow: var(--shadow-sm); }
.ct-card:hover { box-shadow: var(--shadow-md); }
.ct-card--accent { background: var(--color-primary-50); box-shadow: none; }
.ct-card--outlined { box-shadow: inset 0 0 0 1px var(--border-default); }
Badge / Tag
.ct-badge { display: inline-flex; align-items: center; height: 20px; padding: 0 6px; border-radius: var(--radius-sm); font: 700 11px/16px Inter, sans-serif; }
.ct-badge--solid { background: var(--color-primary-500); color: #fff; }
.ct-badge--subtle { background: var(--color-primary-50); color: var(--color-primary-500); }
.ct-badge--outline { box-shadow: inset 0 0 0 1px var(--border-strong); color: var(--text-secondary); }
.ct-unread { min-width: 18px; height: 18px; padding: 0 5px; border-radius: 9px; background: var(--color-error-fg); color: #fff; font: 700 11px/18px Inter, sans-serif; text-align: center; } /* 안 읽은 상담 수 */
Navigation (데스크 좌측 내비 레일)
.ct-rail { width: 64px; background: var(--bg-subtle); display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 12px 0; box-shadow: 1px 0 0 var(--border-default); }
.ct-rail__item { width: 40px; height: 40px; border-radius: var(--radius-md); display: grid; place-items: center; color: var(--text-tertiary); }
.ct-rail__item:hover { background: var(--border-subtle); color: var(--text-secondary); }
.ct-rail__item.is-active { background: var(--color-primary-50); color: var(--color-primary-500); }
.ct-avatar { width: 32px; height: 32px; border-radius: var(--radius-smooth); object-fit: cover; }
Motion
Motion
Bezier transition 토큰 그대로. 이징 곡선 하나만 쓴다.
--duration-fast: 150ms; /* transition.s — 호버·토글 */
--duration-base: 300ms; /* transition.m — 패널·드롭다운 */
--duration-slow: 450ms; /* transition.l — 위젯 열림·모달 */
--ease-out: cubic-bezier(0.3, 0, 0, 1); /* timing-function.default */
--ease-in-out: cubic-bezier(0.3, 0, 0, 1); /* 별도 in-out 없음 — 같은 곡선 재사용 */
Anti-patterns
Anti-patterns
1. 아바타·런처를 완전한 원이나 날카로운 사각형으로 그리지 않는다 — 스퀴클(42%)이 브랜드 식별자다. 2. 카드·말풍선에 진한 1px 회색 테두리를 두르지 않는다 — 경계는 퍼짐 그림자 링(ev1)이나 8% 알파 선으로 처리한다. 3. 블루바이올렛 외에 두 번째 강조색을 버튼에 쓰지 않는다 — 초록·주황·빨강은 상태(성공·경고·위험) 표시 전용이다. 4. 400·700 외의 중간 굵기(500·600)를 섞지 않는다 — Bezier 는 400·700 두 굵기만 쓴다. 5. 상담 대화 영역에 그라디언트·사진 배경을 깔지 않는다 — 메시지 가독성을 위해 흰 바탕 또는 #F7F7F8 단색만 쓴다.
Sources
출처
- https://github.com/channel-io/bezier-react
- https://github.com/channel-io/bezier-react/tree/main/packages/bezier-tokens/src
- https://main--62bead1508281287d3c94d25.chromatic.com
- https://channel.io/ko
- https://velog.io/@wns450/bezier-react-%EB%94%94%EC%9E%90%EC%9D%B8-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%B1%84%EB%84%90%ED%86%A1-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0