oh-my-design-cli 1.3.8 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +8 -8
- package/README.ko.md +28 -7
- package/README.md +71 -16
- package/README.zh-TW.md +8 -8
- package/agents/omd-asset-curator.md +2 -7
- package/agents/omd-codex-image.md +49 -0
- package/agents/omd-designer-review.md +38 -0
- package/agents/omd-final-qa.md +40 -0
- package/agents/omd-kr-writer.md +35 -0
- package/agents/omd-locale-adapter.md +32 -0
- package/agents/omd-master.md +3 -13
- package/agents/omd-orchestrator.md +34 -0
- package/data/reference-audits/2026-05-14-kr10.md +72 -0
- package/data/reference-audits/2026-05-15-kr10.md +124 -0
- package/data/reference-fingerprints.json +253 -3
- package/data/research/2026-05-18-agent-landscape.md +69 -0
- package/data/research/2026-05-18-kr-style-presets.md +572 -0
- package/dist/bin/oh-my-design.js +6 -3
- package/dist/bin/oh-my-design.js.map +1 -1
- package/dist/{install-skills-MVXVXYAY.js → install-skills-IETT2TBJ.js} +91 -8
- package/dist/install-skills-IETT2TBJ.js.map +1 -0
- package/package.json +9 -3
- package/skills/omd-apply/SKILL.md +0 -1
- package/skills/omd-codex-image/SKILL.md +162 -0
- package/skills/omd-designer-review/SKILL.md +146 -0
- package/skills/omd-final-qa/SKILL.md +153 -0
- package/skills/omd-kr-writer/SKILL.md +229 -0
- package/skills/omd-locale-adapter/SKILL.md +124 -0
- package/skills/omd-orchestrator/SKILL.md +124 -0
- package/web/references/29cm/DESIGN.md +11 -2
- package/web/references/ably/DESIGN.md +12 -2
- package/web/references/airbnb/DESIGN.md +17 -2
- package/web/references/airtable/DESIGN.md +20 -0
- package/web/references/apple/DESIGN.md +17 -2
- package/web/references/baemin/DESIGN.md +11 -2
- package/web/references/banksalad/DESIGN.md +17 -2
- package/web/references/bmw/DESIGN.md +14 -0
- package/web/references/bunjang/DESIGN.md +308 -0
- package/web/references/cal/DESIGN.md +14 -0
- package/web/references/catchtable/DESIGN.md +262 -0
- package/web/references/channeltalk/DESIGN.md +374 -0
- package/web/references/classum/DESIGN.md +217 -0
- package/web/references/claude/DESIGN.md +11 -2
- package/web/references/clay/DESIGN.md +19 -0
- package/web/references/clickhouse/DESIGN.md +19 -0
- package/web/references/cohere/DESIGN.md +20 -0
- package/web/references/coinbase/DESIGN.md +14 -0
- package/web/references/composio/DESIGN.md +14 -0
- package/web/references/coupang/DESIGN.md +17 -2
- package/web/references/cursor/DESIGN.md +20 -0
- package/web/references/dabang/DESIGN.md +210 -0
- package/web/references/dcard/DESIGN.md +11 -2
- package/web/references/elevenlabs/DESIGN.md +20 -0
- package/web/references/expo/DESIGN.md +20 -0
- package/web/references/fastcampus/DESIGN.md +460 -0
- package/web/references/ferrari/DESIGN.md +14 -0
- package/web/references/figma/DESIGN.md +17 -2
- package/web/references/flex/DESIGN.md +309 -0
- package/web/references/framer/DESIGN.md +20 -0
- package/web/references/freee/DESIGN.md +16 -2
- package/web/references/gangnamunni/DESIGN.md +18 -2
- package/web/references/gmarket/DESIGN.md +464 -0
- package/web/references/hashicorp/DESIGN.md +19 -0
- package/web/references/ibm/DESIGN.md +20 -0
- package/web/references/inflearn/DESIGN.md +396 -0
- package/web/references/intercom/DESIGN.md +14 -0
- package/web/references/jumpit/DESIGN.md +366 -0
- package/web/references/kakao/DESIGN.md +14 -0
- package/web/references/kakaobank/DESIGN.md +17 -2
- package/web/references/kakaopay/DESIGN.md +17 -2
- package/web/references/karrot/DESIGN.md +16 -2
- package/web/references/kbank/DESIGN.md +195 -0
- package/web/references/kraken/DESIGN.md +14 -0
- package/web/references/krds/DESIGN.md +17 -2
- package/web/references/kream/DESIGN.md +382 -0
- package/web/references/kurly/DESIGN.md +11 -2
- package/web/references/lamborghini/DESIGN.md +14 -0
- package/web/references/line/DESIGN.md +17 -2
- package/web/references/linear.app/DESIGN.md +17 -2
- package/web/references/lovable/DESIGN.md +14 -0
- package/web/references/lunit/DESIGN.md +249 -0
- package/web/references/mercari/DESIGN.md +11 -2
- package/web/references/minimax/DESIGN.md +14 -0
- package/web/references/mintlify/DESIGN.md +14 -0
- package/web/references/miro/DESIGN.md +20 -0
- package/web/references/mistral.ai/DESIGN.md +20 -0
- package/web/references/mongodb/DESIGN.md +19 -0
- package/web/references/musinsa/DESIGN.md +11 -2
- package/web/references/naver/DESIGN.md +17 -2
- package/web/references/notion/DESIGN.md +11 -2
- package/web/references/nvidia/DESIGN.md +11 -2
- package/web/references/ohouse/DESIGN.md +11 -2
- package/web/references/oliveyoung/DESIGN.md +342 -0
- package/web/references/ollama/DESIGN.md +14 -0
- package/web/references/opencode.ai/DESIGN.md +20 -0
- package/web/references/pinkoi/DESIGN.md +11 -2
- package/web/references/pinterest/DESIGN.md +19 -0
- package/web/references/posthog/DESIGN.md +20 -0
- package/web/references/qanda/DESIGN.md +11 -2
- package/web/references/raycast/DESIGN.md +19 -0
- package/web/references/remember/DESIGN.md +17 -2
- package/web/references/renault/DESIGN.md +14 -0
- package/web/references/replicate/DESIGN.md +14 -0
- package/web/references/resend/DESIGN.md +20 -0
- package/web/references/revolut/DESIGN.md +14 -0
- package/web/references/ridi/DESIGN.md +11 -2
- package/web/references/runwayml/DESIGN.md +14 -0
- package/web/references/sanity/DESIGN.md +20 -0
- package/web/references/sentry/DESIGN.md +14 -0
- package/web/references/socar/DESIGN.md +17 -2
- package/web/references/spacex/DESIGN.md +11 -2
- package/web/references/spotify/DESIGN.md +14 -0
- package/web/references/stripe/DESIGN.md +11 -2
- package/web/references/supabase/DESIGN.md +20 -0
- package/web/references/superhuman/DESIGN.md +20 -0
- package/web/references/tesla/DESIGN.md +11 -2
- package/web/references/together.ai/DESIGN.md +20 -0
- package/web/references/toss/DESIGN.md +16 -2
- package/web/references/toss-securities/DESIGN.md +193 -0
- package/web/references/tving/DESIGN.md +259 -0
- package/web/references/uber/DESIGN.md +19 -0
- package/web/references/upbit/DESIGN.md +276 -0
- package/web/references/upstage/DESIGN.md +214 -0
- package/web/references/vercel/DESIGN.md +17 -2
- package/web/references/voltagent/DESIGN.md +14 -0
- package/web/references/wadiz/DESIGN.md +344 -0
- package/web/references/wanted/DESIGN.md +16 -2
- package/web/references/warp/DESIGN.md +14 -0
- package/web/references/webflow/DESIGN.md +14 -0
- package/web/references/wise/DESIGN.md +19 -0
- package/web/references/x.ai/DESIGN.md +14 -0
- package/web/references/yanolja/DESIGN.md +17 -2
- package/web/references/yeogiotte/DESIGN.md +18 -2
- package/web/references/zapier/DESIGN.md +20 -0
- package/web/references/zigbang/DESIGN.md +12 -2
- package/web/references/zigzag/DESIGN.md +17 -2
- package/agents/omd-3d-blender.md +0 -269
- package/dist/install-skills-MVXVXYAY.js.map +0 -1
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: catchtable
|
|
3
|
+
name: CatchTable
|
|
4
|
+
country: KR
|
|
5
|
+
category: consumer-tech
|
|
6
|
+
homepage: "https://www.catchtable.co.kr"
|
|
7
|
+
primary_color: "#ff3d00"
|
|
8
|
+
logo:
|
|
9
|
+
type: favicon
|
|
10
|
+
slug: "https://www.google.com/s2/favicons?domain=catchtable.co.kr&sz=256"
|
|
11
|
+
verified: "2026-05-15"
|
|
12
|
+
omd: "0.1"
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Design System Inspiration of CatchTable (캐치테이블)
|
|
16
|
+
|
|
17
|
+
## 1. Visual Theme & Atmosphere
|
|
18
|
+
|
|
19
|
+
CatchTable is Korea's premier restaurant-reservation platform — a service that lets diners book hotel buffets, sushi omakase, and hanwoo tasting menus with the same calm as flipping through a magazine. The atmosphere on the home surface is **editorial restraint**: a white canvas (`#FFFFFF`), deep black ink (`#000000` for body, `#222222` for titles), zero ambient shadow, and a hard-square chrome that lets food photography do the speaking. Where a delivery app would flood the screen with red CTAs and stamp-shaped discount stickers, CatchTable shows you photographs and titles — the brand orange `#FF3D00` appears exactly where you place your finger, and almost nowhere else.
|
|
20
|
+
|
|
21
|
+
This isn't accidental minimalism — it's a vanilla-extract token system with **145 `:root` design tokens** discovered live (the namespace is `_11bicz7*`, a hashed identifier, so the system has no semantic names exposed publicly — only values). The token sheet defines a five-tier shadow ladder, a 33-color palette across brand / ink / surface / support-cool / semantic / overlay, a 10-step type scale that all share a **150% line-height contract**, and a radius family that defaults to `0px` on 92% of elements and softens only for rasterised thumbnails (`4px`), interactive controls (`8px`), and the primary CTA pill (`12px`). The discipline is the design.
|
|
22
|
+
|
|
23
|
+
Typographically the system is Pretendard-only — no display font, no brand-display moment, no signage-typography flex. Pretendard 400 carries roughly 91% of all rendered text, with 700 reserved for section titles (`음식종류별 BEST`, `캐치 매거진`) and price emphasis. The home flow opens with a search field on `#F5F5F5` fill, a location chip row, a 25-slide Swiper hero, a "어디로 가시나요?" neighbourhood-discovery row, a horizontally scrolling "음식종류별 BEST" pillar, and an editorial "캐치 매거진" magazine module before reaching a five-tab bottom nav (홈 / 저장 / 내 주변 / 마이다이닝 / MY). The overall impression is **taste-maker, not utility** — the brand wants to feel closer to a Michelin guide than to OpenTable.
|
|
24
|
+
|
|
25
|
+
**Key Characteristics:**
|
|
26
|
+
- Single accent `#FF3D00` (CatchTable Orange) deployed sparingly — single-CTA discipline, not flooded brand color
|
|
27
|
+
- Hard-square chrome (`0px` radius on 92% of elements) — sharpness amplifies food photography
|
|
28
|
+
- Pretendard-only stack, no display font; 150% line-height applied uniformly to all ~35 typography slots
|
|
29
|
+
- White-canvas + black-ink editorial restraint — depth lives in borders and surface tints, not shadows
|
|
30
|
+
- Five-tier shadow ladder defined in tokens but rarely fired on the home surface
|
|
31
|
+
- Mobile-first WebView shell with `status-bar-top` reservation — desktop is a porthole
|
|
32
|
+
- 5-tab bottom nav as the global IA spine; 마이다이닝 is the reservation-history / loyalty hub
|
|
33
|
+
- Editorial 캐치 매거진 module signals taste-maker positioning, not transactional booking
|
|
34
|
+
|
|
35
|
+
## 2. Color Palette & Roles
|
|
36
|
+
|
|
37
|
+
### Primary
|
|
38
|
+
|
|
39
|
+
- **CatchTable Orange** (`#FF3D00`): Brand primary. Used **exclusively** on the primary CTA pill (`12px` radius, `#FFF` text, 14px/500). In a 3000-element scan of the home surface, this color appears just 4 times in text/icon contexts and once as a background fill — scarcity is the discipline.
|
|
40
|
+
- **Pure White** (`#FFFFFF`): Page canvas, card surfaces. Clean, photograph-amplifying.
|
|
41
|
+
- **Title Black** (`#222222`): Section sub-titles, restaurant names, neighbourhood chip labels.
|
|
42
|
+
- **Pure Black** (`#000000`): Body text default, link text, nav labels. Maximum contrast.
|
|
43
|
+
|
|
44
|
+
### Brand support
|
|
45
|
+
|
|
46
|
+
- **Orange Soft** (`#FA8D6B`): Soft variant for pressed states and warm accents.
|
|
47
|
+
- **Orange Pressed** (`#FC9086`): Active-press / hover-state surface.
|
|
48
|
+
- **Orange Tint Warm** (`#FDF0EC`): Banner/notice surface fill.
|
|
49
|
+
- **Orange Tint Pale** (`#FCF3F2`): Subtle alert surface fill.
|
|
50
|
+
|
|
51
|
+
### Ink ladder (text & icon)
|
|
52
|
+
|
|
53
|
+
- **Body Default** (`#000000`): Default body text — used everywhere by default.
|
|
54
|
+
- **Title** (`#222222`): Section sub-titles, list-item titles.
|
|
55
|
+
- **Body Strong** (`#424242`): Tab-bar labels at rest.
|
|
56
|
+
- **Body Muted** (`#666666`): Footer policy links, secondary descriptions.
|
|
57
|
+
- **Tertiary** (`#5F5F5F`): Chip-button text (e.g. 현재 위치로).
|
|
58
|
+
- **Placeholder** (`#9E9E9E`): Search-input placeholder.
|
|
59
|
+
- **Disabled** (`#B5B5B5`): Disabled controls.
|
|
60
|
+
- **Icon Default** (`#8F8F8F`): Footer regulatory text, icon default.
|
|
61
|
+
- **Icon Subtle** (`#AAAAAA`): Decorative icons.
|
|
62
|
+
|
|
63
|
+
### Surface
|
|
64
|
+
|
|
65
|
+
- **Canvas** (`#FFFFFF`): Page background.
|
|
66
|
+
- **Subdued** (`#F9F9F9`): Footer block fill.
|
|
67
|
+
- **Muted** (`#F5F5F5`): Search-input fill, chip rest state.
|
|
68
|
+
- **Cool** (`#F2F5F7`): Optional cool-tinted surface.
|
|
69
|
+
- **Cool Alt** (`#F0F4FA`): Info-tint surface paired with `#186ADE`.
|
|
70
|
+
|
|
71
|
+
### Borders
|
|
72
|
+
|
|
73
|
+
- **Hairline Alpha** (`#00000014`): Default hairline divider (8% black).
|
|
74
|
+
- **Border Default** (`#E4E4E4`): Standard card and input border.
|
|
75
|
+
- **Border Cool** (`#DCE3E8`): Cool-themed surface border.
|
|
76
|
+
|
|
77
|
+
### Support cool-ink (rare; used in editorial / magazine module)
|
|
78
|
+
|
|
79
|
+
- **Cool Ink Deep** (`#1C2B36`), **Mid** (`#3E5463`), **Soft** (`#7A909E`), **Light** (`#9FB1BD`).
|
|
80
|
+
|
|
81
|
+
### Semantic
|
|
82
|
+
|
|
83
|
+
- **Info** (`#186ADE`) / **Info Soft** (`#75B1FF`) / **Info Tint** (`#F0F4FA`)
|
|
84
|
+
- **Success** (`#43C478`) / **Success Strong** (`#077D55`) / **Success Tint** (`#EBF7ED`)
|
|
85
|
+
- **Danger** (`#D91F11`): Distinct from brand orange — semantic red is darker, redder. Don't confuse.
|
|
86
|
+
- **Warning** (`#F5C518`)
|
|
87
|
+
- **Premium Purple** (`#8F49DE`): Reserved for premium-tier badges (e.g. members-only restaurants).
|
|
88
|
+
|
|
89
|
+
### Overlay
|
|
90
|
+
|
|
91
|
+
- **Counter Dim** (`rgba(20,24,29,0.74)`): Swiper slide-counter pill.
|
|
92
|
+
- **Scrim 70/60** (`rgba(0,0,0,0.7)`, `rgba(0,0,0,0.6)`): Modal/sheet backdrops.
|
|
93
|
+
|
|
94
|
+
## 3. Typography Rules
|
|
95
|
+
|
|
96
|
+
### Font Family
|
|
97
|
+
|
|
98
|
+
- **Primary**: `Pretendard, -apple-system, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", sans-serif`
|
|
99
|
+
- **No brand display font.** No headline accent. Pretendard alone carries the entire system. This is a deliberate restraint — the photography is the brand.
|
|
100
|
+
|
|
101
|
+
### Hierarchy
|
|
102
|
+
|
|
103
|
+
| Role | Size | Weight | Line Height | Notes |
|
|
104
|
+
|------|------|--------|-------------|-------|
|
|
105
|
+
| Section Title | 20px | 700 | 150% | `음식종류별 BEST`, `캐치 매거진`, search hero label `어디로 가시나요?` |
|
|
106
|
+
| Big Section | 18px | 700 | 150% | Larger card titles |
|
|
107
|
+
| Card Title | 16px | 600 | 150% | Restaurant card titles in list / detail surfaces |
|
|
108
|
+
| Body Default | 14px | 400 | 150% | **Dominant** — 900 of 1149 sampled elements; nav labels, list items, body |
|
|
109
|
+
| Tab Label | 14px | 400 | 150% | Bottom-tab labels |
|
|
110
|
+
| Chip Label | 14px | 500 | 150% | Geo chips, filter chips |
|
|
111
|
+
| Search Input | 13px | 500 | 150% | Placeholder color `#9E9E9E` |
|
|
112
|
+
| Neighbourhood Chip | 13px | 500 | 150% | `청담`, `압구정·로데오` style |
|
|
113
|
+
| Caption | 12px | 400 | 150% | Timestamps, secondary meta |
|
|
114
|
+
| Footer Body | 11px | 400 | 150% | Regulatory disclosure text |
|
|
115
|
+
| Policy Link | 11px | 500 | 150% | Footer `서비스 이용약관` row |
|
|
116
|
+
| Micro Meta | 10px | 500 | 150% | Slide counter `2 / 25`, bottom-tab compact mode |
|
|
117
|
+
|
|
118
|
+
### Principles
|
|
119
|
+
|
|
120
|
+
- **150% line-height is a system-wide contract.** Every typography token across ~35 distinct slots ships `line-height: 150%`. Don't break this — vertical rhythm depends on it.
|
|
121
|
+
- **400 dominates, 700 punctuates.** Weight distribution observed: 400 = 91%, 500 = 5%, 700 = 2%, 450 = 2%, 600 = <1%. The "weight rhythm" is binary — body or title, almost nothing in between.
|
|
122
|
+
- **No tracking adjustments observed** — `letter-spacing: normal` is universal.
|
|
123
|
+
- **Micro text below WCAG body floor**: 10–11px appears on slide counters and legal disclosures. For ports to Latin-script translations, elevate these to ≥12px.
|
|
124
|
+
|
|
125
|
+
## 4. Radius & Shape
|
|
126
|
+
|
|
127
|
+
The geometry is **hard-square by default**:
|
|
128
|
+
|
|
129
|
+
| Use | Radius | Frequency |
|
|
130
|
+
|---|---|---|
|
|
131
|
+
| Default chrome (canvas, sections, list rows, dividers, search input) | `0px` | 1063 of 1149 sampled elements (92%) |
|
|
132
|
+
| Photo thumbnail (rasterised, inside Swiper) | `4px` (also `4.05px` legacy) | 40 |
|
|
133
|
+
| Interactive control (button, card pill, filter pill) | `8px` | 29 |
|
|
134
|
+
| Avatar / circular icon | `50%` | 13 |
|
|
135
|
+
| **Primary CTA pill** | `12px` | 3 |
|
|
136
|
+
| Pill-full (rare, special-case) | `999px` | 1 |
|
|
137
|
+
|
|
138
|
+
The visual signature is the **absence** of softening on the chrome. Sharp corners frame food photography the way a magazine frames a photograph. When porting: do **not** apply a global `border-radius: 8px` reset — you will lose the brand entirely.
|
|
139
|
+
|
|
140
|
+
## 5. Elevation
|
|
141
|
+
|
|
142
|
+
Five-tier shadow ladder defined in `:root`, but used sparingly on the home surface (only 2 distinct shadows fired across 3000+ elements observed). Depth is mostly carried by **borders + surface tints**.
|
|
143
|
+
|
|
144
|
+
| Tier | Token | Recipe |
|
|
145
|
+
|---|---|---|
|
|
146
|
+
| xs | `--shadow-xs` | `0 1px 2px rgba(0,0,0,.12), 0 0 1px rgba(0,0,0,.08), 0 0 1px rgba(0,0,0,.08)` |
|
|
147
|
+
| sm | `--shadow-sm` | `0 2px 8px rgba(0,0,0,.12), 0 1px 4px rgba(0,0,0,.08), 0 0 1px rgba(0,0,0,.08)` |
|
|
148
|
+
| drop | `--shadow-drop` | `0 2px 12px rgba(0,0,0,.12)` |
|
|
149
|
+
| md | `--shadow-md` | `0 6px 12px rgba(0,0,0,.12), 0 4px 8px rgba(0,0,0,.08), 0 0 4px rgba(0,0,0,.08)` |
|
|
150
|
+
| lg / modal | `--shadow-lg` | `0 16px 20px rgba(0,0,0,.12), 0 8px 16px rgba(0,0,0,.08), 0 0 8px rgba(0,0,0,.08)` |
|
|
151
|
+
|
|
152
|
+
Reserve elevation for: floating action buttons over photography, bottom sheets, sticky search bars on scroll, modal surfaces. Don't fire on cards-at-rest — borders or hairline alpha (`#00000014`) handle separation.
|
|
153
|
+
|
|
154
|
+
## 6. Spacing & Layout
|
|
155
|
+
|
|
156
|
+
Observed spacing scale (px): **4 / 8 / 12 / 16 / 20 / 24 / 32 / 45 / 60**.
|
|
157
|
+
|
|
158
|
+
- **Mobile-first**: WebView shell with `status-bar-top` and `status-bar-padding-top` classes — the design target is the in-app surface, not desktop.
|
|
159
|
+
- **Section paddings**: `pb-45` and `mb-16` legacy utility classes — 45px bottom-of-section, 16px between modules.
|
|
160
|
+
- **Horizontal scrolling lists** dominate discovery — `음식종류별 BEST` is a swipe-row of best-of pills, not a vertical grid.
|
|
161
|
+
- **Bottom tab bar** owns the lowest 56–60px of the viewport.
|
|
162
|
+
|
|
163
|
+
## 7. Iconography & Photography
|
|
164
|
+
|
|
165
|
+
- **Photography-first**. The home flow is dominated by 4:3 and landscape food photography. Tile thumbnails carry a subtle `4px` radius — the only soft-corner surface in the system.
|
|
166
|
+
- **Icons are line-style**, rendered as inline SVG; default stroke color `#8F8F8F` (icon-default), darkening to `#000` on active states.
|
|
167
|
+
- **No illustration system observed** on the home surface. Magazine articles inside 캐치 매거진 carry editorial photography rather than custom illustration.
|
|
168
|
+
|
|
169
|
+
## 8. Component Patterns
|
|
170
|
+
|
|
171
|
+
- **Primary CTA pill**: `#FF3D00` fill, `#FFF` text, 14px/500 Pretendard, `12px` radius, ~44px tall — only one variant observed. Single-color, single-shape, single-CTA discipline.
|
|
172
|
+
- **Search input**: `#F5F5F5` fill, sharp `0px` corners, 13px/500 placeholder `#9E9E9E`, inline search icon left.
|
|
173
|
+
- **Chip / pill row**: 13–14px/500 ink, no fill at rest, no border at rest — separation by spacing alone (chips at `청담`, `압구정·로데오`, etc.).
|
|
174
|
+
- **Geo-toggle button** (현재 위치로): 14px/500, ink `#5F5F5F`, leading geo icon — text-style action button.
|
|
175
|
+
- **Best-of horizontal pill** (호텔 뷔페, 스시 오마카세): Image-led tile + 14px/400 ink label below — no card chrome, just photo + name.
|
|
176
|
+
- **Bottom tab bar**: 5 tabs (홈 / 저장 / 내 주변 / 마이다이닝 / MY), icon-over-label, 14px/400 ink default; active state inferred (not captured live this pass — flagged).
|
|
177
|
+
- **Swiper hero**: 25-slide carousel with counter pill (`2 / 25 / 전체`) on `rgba(20,24,29,0.74)` overlay.
|
|
178
|
+
- **Footer disclosure block**: `#F9F9F9` surface, 14px/400 corporate info, 11px/500 policy links separated by `|` pipe glyphs, 11px/400 regulatory disclaimer.
|
|
179
|
+
|
|
180
|
+
## 9. Accessibility & Locale
|
|
181
|
+
|
|
182
|
+
- **WCAG contrast** — `#000` on `#FFF` body is 21:1 (max); `#222`/`#FFF` titles are 16.1:1; `#FF3D00`/`#FFF` CTA pill is **3.7:1** — **fails AA for normal text but passes AA for large text (18pt+/14pt bold equivalent)**. Since the CTA pill ships 14px/500 (below the bold threshold), this sits at the **borderline AA fail** for body. The system as shipped accepts the trade-off; ports must either bold the CTA label or darken the orange to `#E63600` (≈4.6:1) for strict AA.
|
|
183
|
+
- **Micro text below body floor**: 10–11px slide counters and footer disclaimers are below WCAG body recommendations. Ports to Latin scripts (where stroke widths increase) should elevate to ≥12px.
|
|
184
|
+
- **No landmark elements observed in initial capture** — `<main>` is present but no `<aside>` / explicit `role` annotations on the bottom tab bar. A11y debt; flag for ports.
|
|
185
|
+
- **Locale convention**: Korean restaurant-reservation flows assume KR mobile carriers, KakaoTalk-style identity, and 24h reservation windows. The 마이다이닝 (My Dining) IA spine is loyalty-flavoured, not transaction-flavoured — ports should consider whether the destination market expects a "Reservations" history rather than a "Dining" hub.
|
|
186
|
+
|
|
187
|
+
## 10. Voice & Microcopy
|
|
188
|
+
|
|
189
|
+
**Voice shape** (analyst characterisation — not verbatim CatchTable copy): **curatorial-warm, gerund-light, second-person-implied**. The on-surface copy treats the user as a diner choosing a story, not a customer completing a transaction.
|
|
190
|
+
|
|
191
|
+
Don'ts:
|
|
192
|
+
- Don't write "Book now." The brand's invitation is softer.
|
|
193
|
+
- Don't write "X% off" stickers across photography. The system is photograph-respectful.
|
|
194
|
+
- Don't write urgency timers. Magazine, not flash sale.
|
|
195
|
+
|
|
196
|
+
Voice samples (fresh OmD-original characterisations, **not** lifted from CatchTable copy — three options to triangulate the shape):
|
|
197
|
+
|
|
198
|
+
1. *"오늘의 자리, 천천히 골라보세요."* — invitation framing, soft imperative.
|
|
199
|
+
2. *"이번 주말, 어디서 드실래요?"* — question framing, peer-to-peer warmth.
|
|
200
|
+
3. *"미식의 시작, 한 자리에서."* — slogan-shape, factual + warm.
|
|
201
|
+
|
|
202
|
+
**IP guardrail**: The title-tag phrase "즐거운 미식 생활의 시작" is quoted **once** in §11 as a factual brand-narrative reference and is **not** adopted as headline copy in any sample above. The gerund-lite, curatorial register is documented as a *shape*, not reproduced.
|
|
203
|
+
|
|
204
|
+
## 11. Brand Narrative (factual provenance)
|
|
205
|
+
|
|
206
|
+
CatchTable is operated by **주식회사 와드** (WAD Inc.), founded by **용태순** (Yong Tae-soon, current 대표/CEO). Headquartered in **Bundang, Gyeonggi-do** (corporate disclosure observed on the home footer, 2026-05-15). The service positions itself as a premium-leaning restaurant-reservation platform with editorial inflection — the 캐치 매거진 module on the home surface signals that the brand treats discovery as guidebook-style curation, not a transactional booking listing. Title-tag positioning observed on the home surface: "캐치테이블 | 즐거운 미식 생활의 시작" (factual evidence of curatorial-warm positioning, **not** adopted as design copy).
|
|
207
|
+
|
|
208
|
+
**FILL IN** (verification deferred — Crunchbase / DART access needed): founding year, total funding raised, employee headcount, investor list, monthly active users, reservation volume. These are reported in Korean trade press but were not verified at OmD attribution fidelity in this pass.
|
|
209
|
+
|
|
210
|
+
## 12. Personas (illustrative — for portable design briefs only)
|
|
211
|
+
|
|
212
|
+
> Personas are illustrative sketches derived from observable IA decisions (e.g. 마이다이닝 hub, 호텔 뷔페 / 스시 오마카세 / 한우 오마카세 best-of pillars). They are **not** based on internal CatchTable research and should be treated as analyst-inferred FILL-IN placeholders.
|
|
213
|
+
|
|
214
|
+
- **The Anniversary Planner** — 30s couple in Seoul; books quarterly for birthdays / anniversaries; values curation over price; uses 저장 (Save) before deciding.
|
|
215
|
+
- **The Omakase Regular** — 40s professional; books monthly; uses 마이다이닝 as a memory aid (where did I go, what did I eat); cares about repeat-discount tiers.
|
|
216
|
+
- **The Out-of-Town Visitor** — late 20s traveller in town for 2 days; uses 내 주변 + 캐치 매거진 to discover; books 24–48h ahead; one-shot user (low return).
|
|
217
|
+
|
|
218
|
+
## 13. Anti-Patterns
|
|
219
|
+
|
|
220
|
+
Things CatchTable's design **avoids** — and which a port must avoid to keep the inspiration:
|
|
221
|
+
|
|
222
|
+
- ❌ Flooding the surface with brand orange. Orange is a single-CTA color, not a section-fill color.
|
|
223
|
+
- ❌ Softening every corner. 92% of chrome is `0px` radius — sharpness is the brand.
|
|
224
|
+
- ❌ Adding a display / brand-typography font. Pretendard alone is the entire system.
|
|
225
|
+
- ❌ Firing shadows on cards at rest. Depth = borders + hairline alpha.
|
|
226
|
+
- ❌ "Book now" urgency rhetoric or countdown timers. Voice is curatorial, not transactional.
|
|
227
|
+
- ❌ Discount stickers stamped on food photography. Photography is sovereign.
|
|
228
|
+
- ❌ Breaking the 150% line-height contract. Every text slot ships 150% — don't compress.
|
|
229
|
+
- ❌ Treating desktop as the primary canvas. Design ships to mobile WebView; desktop is a porthole.
|
|
230
|
+
|
|
231
|
+
## 14. Motion (partially captured — flagged)
|
|
232
|
+
|
|
233
|
+
Motion tokens were **not** captured in this CDP pass — only entry-fade on Swiper transitions was visibly inferred. The home Swiper uses a default Swiper.js horizontal slide (cubic-ease, ~300ms). Detailed motion tokens (durations, easings, FAB rise, sheet present, tab-switch) require a follow-up UPDATE pass with interaction-triggered capture. **Flagged**.
|
|
234
|
+
|
|
235
|
+
## 15. Footer / Verification
|
|
236
|
+
|
|
237
|
+
- **DS surfaces probed and result**:
|
|
238
|
+
- `design.catchtable.co.kr` → DNS no-resolve (000)
|
|
239
|
+
- `tech.catchtable.co.kr` → DNS no-resolve (000)
|
|
240
|
+
- `www.catchtable.co.kr/brand` → 302 redirect (no brand portal)
|
|
241
|
+
- `github.com/catchtable` → 200 but only 3 public repos (`prerender-java`, `claude-hud`, `brand-review-tool`); **no design-system / Storybook / tokens repo**
|
|
242
|
+
- `getdesign.md/catchtable` → "No designs found for 'catchtable'"
|
|
243
|
+
- `styles.refero.design/?q=catchtable` → no result cards
|
|
244
|
+
- **Result**: **Tier 1 official DS = authoritative NEGATIVE.** The system lives in production code as a vanilla-extract token sheet — captured here directly via CDP (145 `:root` vars on `app.catchtable.co.kr/`).
|
|
245
|
+
|
|
246
|
+
- **Live capture method**: Chrome DevTools Protocol over `localhost:9222`, `websocket-client` with `suppress_origin=True`, `Runtime.evaluate` against `document.documentElement` for full `:root` custom-property enumeration plus a 3000-element `getComputedStyle` frequency analysis. Browser: Chrome/148.0.7778.97. Captured `2026-05-15T07:10Z`.
|
|
247
|
+
|
|
248
|
+
- **Surfaces inspected**: `https://app.catchtable.co.kr/` (35 element samples, 145 `:root` vars, 3000-element frequency table) + `https://app.catchtable.co.kr/ct/shop/list?categoryName=서울` (4 element samples — degraded desktop shell, used to confirm primary CTA spec).
|
|
249
|
+
|
|
250
|
+
- **Proof artefacts**:
|
|
251
|
+
- `assets/_reference/.live-inspect-proof.json` — 10 raw_samples (≥5 floor), full frequency proof, 33-color token map, 5-tier shadow ladder.
|
|
252
|
+
- `assets/_reference/.live-inspect-raw.json` — provenance manifest.
|
|
253
|
+
- `assets/_reference/tokens.json` — normalised colour / typography / radius / elevation / spacing.
|
|
254
|
+
- `assets/_reference/fonts.json` — Pretendard stack + weight-role map.
|
|
255
|
+
- `assets/_reference/structure.json` — IA + heading outline + tone-observed.
|
|
256
|
+
- `_research.md` — 5-tier source map + IP guardrails + flags.
|
|
257
|
+
|
|
258
|
+
- **IP guardrails**: Brand assets (logo, name, primary `#FF3D00`) referenced for inspiration only. Title-tag positioning phrase quoted **once** as §11 narrative evidence; **not** reproduced as design copy. §10 voice samples are fresh OmD analyst paraphrases. Token values reproduced as factual CSS-custom-property values under analytical fair-use.
|
|
259
|
+
|
|
260
|
+
- **Confidence**: **High** for tokens, type, radius, elevation, colour, IA spine, footer disclosure. **Medium** for personas (analyst-inferred from IA, not from internal research). **Low / Flagged** for motion (not captured), restaurant-detail page, list page, sell/reservation flow, MY tab — all require an UPDATE pass via mobile-emulated CDP.
|
|
261
|
+
|
|
262
|
+
- **Verification date**: 2026-05-15.
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: channeltalk
|
|
3
|
+
name: Channel Talk
|
|
4
|
+
country: KR
|
|
5
|
+
category: saas
|
|
6
|
+
homepage: "https://channel.io"
|
|
7
|
+
primary_color: "#4f46e5"
|
|
8
|
+
logo:
|
|
9
|
+
type: github
|
|
10
|
+
slug: channel-io
|
|
11
|
+
verified: "2026-05-14"
|
|
12
|
+
omd: "0.1"
|
|
13
|
+
ds:
|
|
14
|
+
name: Bezier
|
|
15
|
+
url: "https://github.com/channel-io/bezier-react"
|
|
16
|
+
type: system
|
|
17
|
+
description: Channel Talk's open-source design system — Bezier (MIT). Inter + Noto KR/JP type stacks, token/component/icon packages, marketing-vs-product type cliff documented.
|
|
18
|
+
og_image: "https://opengraph.githubassets.com/d5fd6836ec938de2c8399cf28b2ceabc49104fbbf86e937f9e89983f1b50d638/channel-io/bezier-react"
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Design System Inspiration of Channel Talk
|
|
22
|
+
|
|
23
|
+
## 1. Visual Theme & Atmosphere
|
|
24
|
+
|
|
25
|
+
Channel Talk's marketing surface (`channel.io`) reads as a confident **B2B customer-service messenger** that has openly bet the company on the AI-agent shift. The page operates on a near-white canvas (`#FFFFFF` body with `#FCFCFC` / `#F7F7F8` surface tints from the Bezier `grey` ramp) and uses translucent off-black (`rgba(0,0,0,0.85)`) for body text rather than a hard `#000` — a small but characteristic warmth that softens the otherwise engineering-leaning palette. The signature accent observed in product chrome is **Cobalt 400** (`#329BE7`) — Channel's primary brand blue — while the homepage AI manifesto sections drop into a dark plum-purple canvas (`rgba(25,3,49,0.898)`) that visually quarantines the AI agent story from the surrounding helpdesk product story.
|
|
26
|
+
|
|
27
|
+
Typography is **Inter** (with `NotoSansKR` / `NotoSansJP` tied for fallback depending on locale). The Bezier DS product scale tops out at **36px / 44px line-height**, but the marketing surface deliberately breaks that ceiling for editorial hero/sectional moments — a 64px / 88px-lh / -1.5px-tracking `h1` and a 54px / 72px-lh `h2` give the homepage a sectional, almost manifesto rhythm that the in-product chrome never uses. Negative tracking is light by default (`-0.1px` at 15-17px, `-0.4px` at 22-36px), tightening at the marketing tier (`-1px` at 48px, `-1.5px` at hero).
|
|
28
|
+
|
|
29
|
+
What distinguishes Channel Talk visually is its **radius ladder discipline**: Bezier exposes 2 / 3 / 4 / 6 / 8 / 12 / 16 / 20 / 32 / 44 / 42% — and the marketing surface uses each tier intentionally. Primary CTAs land at **18px** (pill-tending without becoming capsules), product cards at **20px**, the bottom "Experience It Yourself" CTA band at **32px**, and small chips at **8px**. Cobalt 400 hover treatment also lives in the alpha ladder — `#329BE7` solid → `#329BE73D` / `#329BE71A` for subtle ghost states — a sign of a mature semantic-token system, not improvised tinting.
|
|
30
|
+
|
|
31
|
+
**Key characteristics**
|
|
32
|
+
- Canvas: white (`#FFFFFF`) with grey-50 / grey-100 surface tints (`#FCFCFC` / `#F7F7F8`)
|
|
33
|
+
- Body text: translucent off-black `rgba(0, 0, 0, 0.85)` (141/118 sampled elements observed live)
|
|
34
|
+
- Brand accent: **Cobalt 400 `#329BE7`** (`bezier.cobalt.400` + alpha ladder 10/20/30/40)
|
|
35
|
+
- AI manifesto canvas: dark plum `rgba(25, 3, 49, 0.898)` (homepage AI section only)
|
|
36
|
+
- Type: **Inter** primary, Bezier KR/JP stacks fall through Noto Sans KR/JP
|
|
37
|
+
- Marketing hero: 64px / weight 700 / 1.375 line-height / `-1.5px` tracking
|
|
38
|
+
- Radius ladder used by tier — 8px chips → 18px CTAs → 20px cards → 32px CTA bands
|
|
39
|
+
- Easing default: `cubic-bezier(0.3, 0, 0, 1)` with 150 / 300 / 450ms duration tokens
|
|
40
|
+
|
|
41
|
+
## 2. Color Palette & Roles
|
|
42
|
+
|
|
43
|
+
Source of truth: `github.com/channel-io/bezier-react/packages/bezier-tokens/src/global/color.json` (Bezier Design System, MIT). Each hue ships **300 / 400 / 500** weights plus a 4-step alpha ladder per weight (e.g., `300-40` = 40% alpha) — surfaced below by canonical role.
|
|
44
|
+
|
|
45
|
+
### Brand / accent
|
|
46
|
+
|
|
47
|
+
- **Cobalt 400** (`#329BE7`): primary brand blue — Channel Talk's product-chrome accent (live: 12 of 118 sampled elements)
|
|
48
|
+
- **Cobalt 300** (`#47C8FF`): lighter cobalt — illustrative / surface highlight
|
|
49
|
+
- **Cobalt 500** (`#327AB8`): cobalt heavy — pressed / hover-on-light
|
|
50
|
+
- **Cobalt 400-30** (`#329BE74D`) / **400-20** (`#329BE733`) / **400-10** (`#329BE71A`): hover / focus / subtle ghost fills
|
|
51
|
+
|
|
52
|
+
### Foundation neutrals (`bezier.grey`)
|
|
53
|
+
|
|
54
|
+
- **Grey 50** (`#FCFCFC`): elevated surface
|
|
55
|
+
- **Grey 100** (`#F7F7F8`): canvas tint
|
|
56
|
+
- **Grey 200** (`#EFEFF0`): divider light
|
|
57
|
+
- **Grey 500** (`#A7A7AA`): muted text
|
|
58
|
+
- **Grey 700** (`#464748`): body text on light (dark theme inverse)
|
|
59
|
+
- **Grey 800** (`#313234`): heading on dark
|
|
60
|
+
- **Grey 850** (`#2A2B2D`): dark surface
|
|
61
|
+
- **Grey 900** (`#242428`): deepest dark — also `rgb(36,36,40)` observed live as primary CTA bg
|
|
62
|
+
|
|
63
|
+
### Black / White alpha (`bezier.black` / `bezier.white`)
|
|
64
|
+
|
|
65
|
+
- **Black 85** (`#000000D9` = `rgba(0,0,0,0.85)`): canonical body text — 141 / 118 elements in live capture
|
|
66
|
+
- **Black 60** (`rgba(0,0,0,0.6)`): secondary text
|
|
67
|
+
- **Black 40 / 30 / 22 / 20 / 15 / 8 / 5 / 3**: full alpha ladder for borders, overlays, disabled tints
|
|
68
|
+
- **White 100** (`#FFFFFF`): primary surface
|
|
69
|
+
- **White 90 / 80 / 60 / 40 / 20 / 12 / 8 / 5**: full alpha ladder for inverted scrims, overlays
|
|
70
|
+
|
|
71
|
+
### Semantic hue family (each `300 / 400 / 500` + alpha 40/30/20/10)
|
|
72
|
+
|
|
73
|
+
- **Blue** 300 `#6687FF` · 400 `#5E56F0` · 500 `#4E40C9` — info / link-secondary
|
|
74
|
+
- **Teal** 300 `#3CDDCD` · 400 `#0FB3A3` · 500 `#449C8A`
|
|
75
|
+
- **Green** 300 `#3ACF5A` · 400 `#31A552` · 500 `#41904F` — success
|
|
76
|
+
- **Olive** 300 `#CAD548` · 400 `#A0A540` · 500 `#818628`
|
|
77
|
+
- **Yellow** 300 `#FDD353` · 400 `#EDBC40` · 500 `#C39E37` — caution
|
|
78
|
+
- **Orange** 300 `#FFAB5C` · 400 `#F4800B` · 500 `#C57417`
|
|
79
|
+
- **Red** 300 `#FF5C5C` · 400 `#E94E58` · 500 `#AC3E46` — error / destructive
|
|
80
|
+
- **Pink** 300 `#EC6FD3` · 400 `#CB48AD` · 500 `#A32E92`
|
|
81
|
+
- **Purple** 300 `#B570FF` · 400 `#915CE0` · 500 `#6B23B3`
|
|
82
|
+
- **Navy** 300 `#647CC9` · 400 `#3A4F8D` · 500 `#333D5B`
|
|
83
|
+
|
|
84
|
+
### Marketing-only theatrical colors (homepage chrome, not Bezier tokens)
|
|
85
|
+
|
|
86
|
+
- **AI canvas plum** (`rgba(25,3,49,0.898)`): the "AI Handles The Routine / You Handle The Strategy" panel
|
|
87
|
+
- **AI plum deep** (`rgb(60,3,54)`): nested AI panel
|
|
88
|
+
- **Inbox card pink** (`rgb(250,154,240)`): single illustrative card surface — not in token source
|
|
89
|
+
|
|
90
|
+
## 3. Typography Rules
|
|
91
|
+
|
|
92
|
+
### Font stack (Bezier `font.family`)
|
|
93
|
+
|
|
94
|
+
- **Sans (KR locale)**: `Inter, NotoSansKR, "Noto Sans KR", NotoSansJP, "Noto Sans JP", -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Segoe UI", Roboto, system-ui, sans-serif`
|
|
95
|
+
- **Sans (JP locale)**: `Inter, NotoSansJP, "Noto Sans JP", NotoSansKR, "Noto Sans KR", ...same fallbacks`
|
|
96
|
+
- **Mono**: `ui-monospace, "Cascadia Code", "Source Code Pro", Menlo, Consolas, "DejaVu Sans Mono", monospace`
|
|
97
|
+
- **Marketing display (homepage chrome only)**: `BildV5, "BildV5 Fallback"` (observed on 1 of 118 sampled elements — not a product token)
|
|
98
|
+
|
|
99
|
+
### Product-chrome scale (Bezier `typography.size`)
|
|
100
|
+
|
|
101
|
+
| Token | Size | Line height | Letter spacing |
|
|
102
|
+
|---|---|---|---|
|
|
103
|
+
| 11 | 11px | 16px | — |
|
|
104
|
+
| 12 | 12px | 16px | — |
|
|
105
|
+
| 13 | 13px | 18px | — |
|
|
106
|
+
| 14 | 14px | 18px | — |
|
|
107
|
+
| 15 | 15px | 20px | -0.1px |
|
|
108
|
+
| 16 | 16px | 24px | -0.1px |
|
|
109
|
+
| 17 | 17px | 24px | -0.1px |
|
|
110
|
+
| 18 | 18px | 24px | — |
|
|
111
|
+
| 22 | 22px | 28px | -0.4px |
|
|
112
|
+
| 24 | 24px | 32px | -0.4px |
|
|
113
|
+
| 30 | 30px | 36px | -0.4px |
|
|
114
|
+
| 36 | 36px | 44px | -0.4px |
|
|
115
|
+
|
|
116
|
+
Weights ship at **400 (regular)** and **700 (bold)** only — Bezier does not stock a 500/600 mid-weight in product chrome.
|
|
117
|
+
|
|
118
|
+
### Marketing-surface extension (homepage observed live)
|
|
119
|
+
|
|
120
|
+
| Role | Size | Weight | Line height | Letter spacing |
|
|
121
|
+
|---|---|---|---|---|
|
|
122
|
+
| Hero h1 | 64px | 700 | 88px | -1.5px |
|
|
123
|
+
| Section h2 (XL, on dark) | 54px | 600 | 72px | -1.5px |
|
|
124
|
+
| Section h2 (LG) | 48px | 600 | 64px | -1px |
|
|
125
|
+
| CTA label (hero) | 18px | 600 | 26px | -0.4px |
|
|
126
|
+
| Section "View Details" lead | 20px | 700 | 30px | -0.5px |
|
|
127
|
+
| Nav link | 15px | 400 | 21.45px | normal |
|
|
128
|
+
|
|
129
|
+
Note: weights 500 / 600 appear on marketing-surface headings but NOT in the Bezier source font weights — treat marketing scale as a brand-layer extension, not a product-chrome token.
|
|
130
|
+
|
|
131
|
+
## 4. Component Stylings
|
|
132
|
+
|
|
133
|
+
### Buttons
|
|
134
|
+
|
|
135
|
+
**Primary (hero CTA — marketing surface)**
|
|
136
|
+
- Background: `#242428` (grey 900, live captured as `rgb(36, 36, 40)` after rendering)
|
|
137
|
+
- Text: `#FFFFFF`
|
|
138
|
+
- Radius: 18px
|
|
139
|
+
- Padding: 8px 24px
|
|
140
|
+
- Label: 18px / weight 600 / 26px line-height / -0.4px tracking
|
|
141
|
+
- Height: ~64px (label area; outer wrapper drives height)
|
|
142
|
+
- Use: top-of-funnel "Sign Up for Free" only
|
|
143
|
+
|
|
144
|
+
**Secondary (subtle pill — section CTAs)**
|
|
145
|
+
- Background: `rgba(0, 0, 0, 0.05)`
|
|
146
|
+
- Text: `rgba(0, 0, 0, 0.85)`
|
|
147
|
+
- Radius: 16px
|
|
148
|
+
- Padding: 8px 20px
|
|
149
|
+
- Label: 20px / weight 700 / 30px line-height / -0.5px tracking
|
|
150
|
+
- Height: ~54px
|
|
151
|
+
- Use: "View Details" mid-section pivots; not a primary action
|
|
152
|
+
|
|
153
|
+
**Tertiary (text link)**
|
|
154
|
+
- Background: transparent
|
|
155
|
+
- Text: `rgba(0, 0, 0, 0.6)`
|
|
156
|
+
- Padding: 4px 6px
|
|
157
|
+
- Border: none (underline on hover inferred from convention; not directly captured)
|
|
158
|
+
- Use: "Learn more" inline references
|
|
159
|
+
|
|
160
|
+
**Cobalt accent (in-product, inferred from Bezier semantic tokens)**
|
|
161
|
+
- Background: `#329BE7` (cobalt 400)
|
|
162
|
+
- Hover: `#329BE7` over `rgba(50, 155, 231, 0.2)` ghost fill (live observed `rgba(50,155,231,0.2)` = `#329BE733` = cobalt 400-20)
|
|
163
|
+
- Text: `#FFFFFF`
|
|
164
|
+
- Radius: 6px or 8px (product chrome — Bezier 6/8 tokens)
|
|
165
|
+
- Use: primary action inside Channel Talk's product (Inbox CTA, send-message, etc.)
|
|
166
|
+
|
|
167
|
+
### Cards
|
|
168
|
+
|
|
169
|
+
**AI Messenger feature card (marketing)**
|
|
170
|
+
- Background: per-card theatrical color (e.g., `rgb(250, 154, 240)` pink for Inbox card)
|
|
171
|
+
- Text: `rgba(0, 0, 0, 0.85)`
|
|
172
|
+
- Radius: 20px
|
|
173
|
+
- Padding: section-driven (no padding on outer `a` wrapper; inner content gets its own)
|
|
174
|
+
- Width: 1160px on 1280-viewport (`100% - 120px` two-col gutters)
|
|
175
|
+
- Height: 400px (fixed feature-card height)
|
|
176
|
+
- Use: each Inbox / Meet / Team Chat / Workflow / Marketing / Docs surface gets one of these
|
|
177
|
+
|
|
178
|
+
**CTA section wrapper ("Experience It Yourself")**
|
|
179
|
+
- Background: transparent (content inside is the colored block)
|
|
180
|
+
- Radius: 32px
|
|
181
|
+
- Padding: 16px horizontal page-edge inset, vertical-driven
|
|
182
|
+
- Width: ~1248px (`100% - 32px`)
|
|
183
|
+
- Use: bottom-of-page conversion band
|
|
184
|
+
|
|
185
|
+
### Navigation
|
|
186
|
+
|
|
187
|
+
- Nav menu items: Inter 15px / weight 400 / 21.45px line-height
|
|
188
|
+
- Color: `rgba(0, 0, 0, 0.85)`
|
|
189
|
+
- Padding: 10px 16px 8px 0px (asymmetric — visual underline indicator on bottom only)
|
|
190
|
+
- Active indicator: 2px bottom border (border-bottom captured as `0px 0px 2px` on three sides + bottom)
|
|
191
|
+
- Logo link: 194×40px wrapper, fg `rgb(82, 84, 99)` (grey-tinted)
|
|
192
|
+
- Menu toggle button (mobile): `#FFFFFF` bg, 8px radius
|
|
193
|
+
|
|
194
|
+
### Form inputs
|
|
195
|
+
|
|
196
|
+
- Source of truth: `bezier-tokens/src/semantic/input.json` (1.4KB — full input semantic surface in Bezier)
|
|
197
|
+
- Surface (resting): `#FFFFFF` with `Black 8` (`rgba(0,0,0,0.05)`) border
|
|
198
|
+
- Surface (focus): cobalt 400-30 (`#329BE74D`) outline ring
|
|
199
|
+
- Radius: 6px or 8px (product chrome)
|
|
200
|
+
- Padding (medium): vertical 8px, horizontal 12px (inferred from Bezier 6/8 sizing patterns)
|
|
201
|
+
|
|
202
|
+
## 5. Layout Principles
|
|
203
|
+
|
|
204
|
+
**Page max width** (marketing): ~1248px content with 16px page-edge inset on 1280 viewport.
|
|
205
|
+
|
|
206
|
+
**Grid**: 2-up / 3-up product card rows; the All-in-One AI Messenger section uses a horizontal pill nav (Inbox / Meet / Team Chat / Workflow / Marketing / Docs) that pivots the entire card content in place rather than scrolling — a non-trivial interaction pattern.
|
|
207
|
+
|
|
208
|
+
**Spacing scale**: Bezier doesn't publish a separate spacing token file — instead, padding values cluster at: 4 / 6 / 8 / 12 / 16 / 20 / 24 / 32 / 40 / 48 / 60 / 64 / 80px (inferred from observed live values; Bezier semantic tokens use these as scale stops).
|
|
209
|
+
|
|
210
|
+
**Radius scale** (Bezier `radius`): 2, 3, 4, 6, 8, 12, 16, 20, 32, 44px, plus a special `42%` token for circular avatars (used by `bezier-react`'s avatar size scale where 42% gives the visual rounding without committing to a fixed px value).
|
|
211
|
+
|
|
212
|
+
**Surface elevation**: see §6.
|
|
213
|
+
|
|
214
|
+
## 6. Depth & Elevation
|
|
215
|
+
|
|
216
|
+
Source: `bezier-tokens/src/semantic/elevation.json` (2.3KB). Bezier exposes a semantic elevation ladder rather than raw `box-shadow` tokens — every elevation is paired with a background surface so dark-theme inversion is automatic.
|
|
217
|
+
|
|
218
|
+
- **Level 1** (resting card): `Grey 50` (`#FCFCFC`) surface + minimal shadow
|
|
219
|
+
- **Level 2** (interactive card): `Grey 100` (`#F7F7F8`) surface + slight shadow
|
|
220
|
+
- **Level 3** (popover / dropdown): subtle drop-shadow + `Black 8` border instead of pure shadow
|
|
221
|
+
- **Level 4** (modal / sheet): full shadow + dimmed scrim (`Black 30` / `rgba(0,0,0,0.3)`)
|
|
222
|
+
|
|
223
|
+
Live homepage chrome leans **flat** — virtually no `box-shadow` captured across 118 elements; depth is signaled via surface tint + border alpha, not shadow.
|
|
224
|
+
|
|
225
|
+
## 7. Do's and Don'ts
|
|
226
|
+
|
|
227
|
+
### Do
|
|
228
|
+
- Use **Inter** as the type voice — never substitute a different sans for product-chrome.
|
|
229
|
+
- Apply translucent off-black (`rgba(0,0,0,0.85)`) for body text — never pure `#000`.
|
|
230
|
+
- Honor the Bezier radius ladder by tier — 8px for chips, 18-20px for CTAs/cards, 32px for full-bleed CTA bands.
|
|
231
|
+
- Use Cobalt 400 `#329BE7` as the **only** brand accent in product chrome.
|
|
232
|
+
- Reach for the Bezier alpha ladder (`-10` / `-20` / `-30`) before inventing new tints.
|
|
233
|
+
- Top out at **36px** for in-product type; reserve >36px for marketing surfaces only.
|
|
234
|
+
|
|
235
|
+
### Don't
|
|
236
|
+
- Don't introduce a 5th radius value between Bezier tokens (e.g., 24px is not in the ladder).
|
|
237
|
+
- Don't add font weights between 400 and 700 inside product chrome — Bezier only ships those two.
|
|
238
|
+
- Don't decorate with semantic hues (red / yellow / green) — they are reserved for status semantics.
|
|
239
|
+
- Don't translate marketing's plum AI canvas (`rgba(25,3,49,0.898)`) into product chrome — it's a homepage-only rhetorical device.
|
|
240
|
+
- Don't use `BildV5` for product UI — it's a marketing display face.
|
|
241
|
+
|
|
242
|
+
## 8. Responsive Behavior
|
|
243
|
+
|
|
244
|
+
Marketing breakpoints (inferred from live capture at 1280-viewport):
|
|
245
|
+
- 768px / 896px / 1024px / 1280px
|
|
246
|
+
|
|
247
|
+
The product app (Inbox / Meet / Team Chat) is a desktop-first SaaS surface — Bezier components ship with `size` prop (`xs / s / m / l / xl`) rather than viewport-driven responsive behavior; the host app sets size programmatically based on layout context. The marketing site does respond fluidly with a mobile MenuToggleButton (8px radius, white surface) replacing the desktop nav under ~768px.
|
|
248
|
+
|
|
249
|
+
## 9. Agent Prompt Guide
|
|
250
|
+
|
|
251
|
+
### Quick reference
|
|
252
|
+
|
|
253
|
+
- **Canvas**: `#FFFFFF` body, `#FCFCFC` / `#F7F7F8` surface tints
|
|
254
|
+
- **Body text**: `rgba(0, 0, 0, 0.85)` — *never* `#000`
|
|
255
|
+
- **Brand accent**: Cobalt `#329BE7`
|
|
256
|
+
- **Type**: Inter 15-16px body, 18-24px subheads (product); 48-64px marketing headlines
|
|
257
|
+
- **Radius**: 8 / 18 / 20 / 32 — pick the tier, don't interpolate
|
|
258
|
+
- **Easing**: `cubic-bezier(0.3, 0, 0, 1)` at 150 / 300 / 450ms
|
|
259
|
+
|
|
260
|
+
### Example component prompts
|
|
261
|
+
|
|
262
|
+
- *"Build a Channel-Talk-styled SaaS dashboard hero. White (#FFFFFF) canvas, Inter 64px / weight 700 / 88px line-height / -1.5px tracking, text rgba(0,0,0,0.85). Primary CTA: bg #242428, text #fff, 18px radius, padding 8px 24px, label Inter 18px / weight 600 / -0.4px tracking. Secondary CTA: bg rgba(0,0,0,0.05), text rgba(0,0,0,0.85), 16px radius."*
|
|
263
|
+
- *"Build an AI-handles-routine manifesto section. Dark plum canvas rgba(25,3,49,0.898), Inter 54px / weight 600 / 72px line-height / -1.5px tracking, two-line headline with the second line color-shifted lighter as visual call-and-response."*
|
|
264
|
+
- *"Build a Bezier product modal. Grey-100 (#F7F7F8) surface, 12px radius, 24px padding, Black-30 scrim, transition s (150ms) cubic-bezier(0.3, 0, 0, 1)."*
|
|
265
|
+
|
|
266
|
+
## 10. Voice & Tone
|
|
267
|
+
|
|
268
|
+
Channel Talk's voice is **operator-pragmatic + AI-evangelical**. The marketing surface speaks as a Korean-origin B2B platform that has staked its 2025-26 narrative on the AI-agent transition — every section pivots back to how AI takes "the routine" so human teams can take "the strategy."
|
|
269
|
+
|
|
270
|
+
| Context | Tone |
|
|
271
|
+
|---|---|
|
|
272
|
+
| CTA | Direct verb. "Sign Up for Free" / "View Details" / "Learn more" |
|
|
273
|
+
| Marketing headline | Manifesto-shaped, present-tense. "The future of customer service is AI." "AI handles the routine. You handle the strategy." |
|
|
274
|
+
| Feature copy | Compound noun-led. "All Chats In One Place." "All-in-One AI Messenger." |
|
|
275
|
+
| Product (Inbox) | Pragmatic operator-speak (inferred from Bezier component naming: `Inbox`, `Workflow`, `Meet` — verbs/nouns, no "experiences") |
|
|
276
|
+
| Error | Specific, action-paired (e.g., "Message not sent. Retry") — convention inferred from Bezier semantic-tokens framing |
|
|
277
|
+
|
|
278
|
+
**Voice samples** (live channel.io 2026-05-14, paraphrased to avoid verbatim brand copy in derivative work)
|
|
279
|
+
|
|
280
|
+
- AI-era positioning: *"The future of customer service is AI."* (homepage hero) <!-- verified: channel.io/en 2026-05-14, used only as voice reference, not as derived copy -->
|
|
281
|
+
- AI/human split: *"AI handles the routine. You handle the strategy."* (homepage AI section) <!-- verified: channel.io/en 2026-05-14, voice reference only -->
|
|
282
|
+
- Compound positioning: *"All-in-One AI Messenger"* (section h2) <!-- verified: channel.io/en 2026-05-14 -->
|
|
283
|
+
|
|
284
|
+
**IP guardrail (DO NOT verbatim).** Any DESIGN.md or downstream artifact derived from this reference must **rewrite** Channel Talk's marketing taglines in its own voice — these voice samples document *tone shape*, not borrowable copy. Fresh derivation patterns (use these as templates instead): "Routine, automated. Strategy, yours." / "AI for the queue. You for the moves that matter." / "Every channel. One inbox." — none of which appear verbatim on channel.io.
|
|
285
|
+
|
|
286
|
+
**Forbidden phrases.** "AI-powered" without specifics. "Revolutionary support." "Next-generation CRM." Anything that promises AI without naming the surface (Inbox / Meet / Workflow) it operates on.
|
|
287
|
+
|
|
288
|
+
## 11. Brand Narrative
|
|
289
|
+
|
|
290
|
+
*Some facts in this section carry partial verification — see footer for source map.*
|
|
291
|
+
|
|
292
|
+
Channel Talk is operated by **Channel Corp** (주식회사 채널코퍼레이션) [channel.io/en/team], a Korean SaaS company whose current CEO is **Choi Si-won (최시원)** [channel.io/en/team]. The company's roots trace to a Korean startup originally named **ZOYI Corp**, founded around 2014 [secondary source — confidence moderate]; the rename to Channel Corp followed the product's pivot from offline-retail analytics to the SaaS customer-messenger that ships today. Channel Talk's primary positioning through ~2023 was as "the all-in-one business messenger" competing with Intercom on smaller-team economics + Korean/Japanese market fit; the 2024-26 narrative has shifted explicitly to **AI agent infrastructure**, with the **ALF** brand surface (AI Agent for customer inquiries + AI Agent for internal work) now sharing main-nav placement with the historical Inbox/Meet/Team Chat product line [channel.io/en about page].
|
|
293
|
+
|
|
294
|
+
By the metrics Channel itself publishes [channel.io/en/team footer 2026-05-14]: **234,545+ cumulative channels** deployed, **170 million monthly support messages**, **1,286,781+ AI-resolved cases** cumulative, **2,135+ companies using ALF**, **98% uptime**, **4.8/5 G2 rating**. Engineering compliance: **ISMS** (Korean information security certification), **ISO information protection certification**, AWS-hosted infrastructure.
|
|
295
|
+
|
|
296
|
+
The most distinctive engineering signal is **Bezier** — Channel's openly published, MIT-licensed design system [github.com/channel-io/bezier-react] shipping `bezier-react` (274+ stars) + `BezierSwift` (native iOS) + a canonical `bezier-tokens` package that powers both. Few Korean SaaS companies maintain a public token-grade DS at this depth, and the fact that the marketing site's homepage renders against the same primitives (Inter, the cobalt accent, the radius ladder) is itself the strongest claim about Channel's product-discipline.
|
|
297
|
+
|
|
298
|
+
*Unverified at time of writing*: precise founding year (2014 vs neighboring year), founder list beyond current CEO, total funding raised, exact HQ city within Korea. These are flagged in the verification footer for a follow-up UPDATE pass.
|
|
299
|
+
|
|
300
|
+
## 12. Principles
|
|
301
|
+
|
|
302
|
+
1. **One brand color does the lifting.** Cobalt 400 (`#329BE7`) is the only brand accent — semantic hues (red/yellow/green/blue) are reserved for status. *UI implication*: don't decorate with the semantic palette; pick cobalt or nothing.
|
|
303
|
+
2. **Inter, always — Noto fills the locale gap.** Korean and Japanese product rendering must keep Inter primary; Noto Sans KR/JP only resolves CJK characters Inter doesn't ship. *UI implication*: never substitute a single Korean-first stack — break the dual-locale resolution.
|
|
304
|
+
3. **Radius is a ladder, not a slider.** 2 → 3 → 4 → 6 → 8 → 12 → 16 → 20 → 32 → 44px. *UI implication*: pick the rung that matches component scale; never interpolate (24 is not a Bezier rung).
|
|
305
|
+
4. **Translucent off-black over pure black.** Body text is `rgba(0,0,0,0.85)`. *UI implication*: the 0.15 alpha is a deliberate atmospheric softening — preserve it on light surfaces.
|
|
306
|
+
5. **Marketing breaks the product ceiling on purpose.** 64px hero, 54-48px section headlines, 600-weight intermediate — all marketing-only. *UI implication*: never bring those tokens into product chrome; the visual cliff between marketing and product is part of the brand register.
|
|
307
|
+
6. **Dark theme is paired surface + elevation.** Bezier ships dark-theme as a full semantic mirror, not a CSS filter. *UI implication*: every elevation level has a paired light/dark surface — never invert color without inverting elevation.
|
|
308
|
+
|
|
309
|
+
## 13. Personas
|
|
310
|
+
|
|
311
|
+
*Personas are fictional archetypes informed by publicly visible Channel Talk user segments (Korean/Japanese DTC ecommerce, K-beauty, SaaS support, mid-market team CS leads) — not real individuals.*
|
|
312
|
+
|
|
313
|
+
**Yoonseo Han, 31, Seoul.** Customer-experience lead at a K-beauty DTC brand on Cafe24. Has the Channel Talk Inbox open in a pinned tab from 09:00 to 19:00 KST. Just turned ALF on for tier-1 FAQs (size exchange, shipping ETA) — measures the deflection weekly and reports it to her CCO.
|
|
314
|
+
|
|
315
|
+
**Ren Takahashi, 38, Tokyo.** Support manager at a B2B SaaS that uses Channel Talk for both customer Inbox and internal Team Chat. Cares deeply about JP/KR locale resolution (Inter + Noto), keyboard-shortcut macros, and the team-handoff UX when ALF escalates to a human agent.
|
|
316
|
+
|
|
317
|
+
**Jiwon Park, 27, Seongnam.** Frontline CS agent on a 5-person team. Lives in Inbox. Will defect to any tool with cleaner conversation-history scroll-back and faster `cmd+k` search. Doesn't care about the AI narrative — cares that ALF closed 60 of her 100 daily tickets so she can focus on the 40 that need her.
|
|
318
|
+
|
|
319
|
+
**Sungho Lee, 44, Busan.** RevOps lead at a mid-market commerce platform. Integrated Channel Talk with Channel's Meet (Call) for outbound retention plays. Reads the weekly Workflow dashboard. Reports cost-per-resolved-ticket to the founder.
|
|
320
|
+
|
|
321
|
+
## 14. States
|
|
322
|
+
|
|
323
|
+
| State | Treatment |
|
|
324
|
+
|---|---|
|
|
325
|
+
| **Empty (no conversations)** | Cobalt-tinted illustrated panel + single CTA "Connect a channel" (inferred from Bezier `EmptyContent` component name) |
|
|
326
|
+
| **Empty (ALF disabled)** | Subtle prompt: "Turn on ALF to deflect tier-1 tickets" + single cobalt CTA |
|
|
327
|
+
| **Loading (conversation history)** | Skeleton message bubbles in `Grey 100` (`#F7F7F8`) — no shimmer animation, just static surface tint (Bezier's flat depth signature) |
|
|
328
|
+
| **Loading (ALF response)** | Three-dot typing indicator with ALF avatar (cobalt accent ring) |
|
|
329
|
+
| **Error (sync failure)** | Top-of-Inbox banner in `Red 400` (`#E94E58`) at `red-400-20` alpha fill + "Retry" link |
|
|
330
|
+
| **Error (ALF escalation needed)** | Inline below message bubble, `Yellow 400` (`#EDBC40`) status dot + "Hand off to human" CTA |
|
|
331
|
+
| **Success (ticket closed)** | Subtle row tint shift to `Green 400` at `green-400-10` (`#31A5521A`) — no animation |
|
|
332
|
+
| **Success (ALF resolved)** | Resolution badge on conversation row — cobalt outlined chip |
|
|
333
|
+
| **Skeleton (inbox list)** | `Grey 100` row blocks, no shimmer, transition fades when real content lands |
|
|
334
|
+
| **Disabled (no permission)** | Component opacity 40% + permission tooltip on hover |
|
|
335
|
+
| **Loading (ALF reasoning trace)** | Per-step expandable trace: "Searching knowledge base..." → "Drafting response..." → "Awaiting confirmation" |
|
|
336
|
+
|
|
337
|
+
## 15. Motion & Easing
|
|
338
|
+
|
|
339
|
+
| Token | Value | Use |
|
|
340
|
+
|---|---|---|
|
|
341
|
+
| `transition.duration.s` | 150ms | Hover, focus, small surface tints |
|
|
342
|
+
| `transition.duration.m` | 300ms | Modal open, popover, sheet |
|
|
343
|
+
| `transition.duration.l` | 450ms | Page transitions, large surface swaps |
|
|
344
|
+
| `transition.timing-function.default` | `cubic-bezier(0.3, 0, 0, 1)` | All transitions unless overridden |
|
|
345
|
+
|
|
346
|
+
Bezier ships exactly **one** easing curve as default — `cubic-bezier(0.3, 0, 0, 1)` — a sharp-out / soft-in shape that arrives quickly then settles. No bouncy or elastic curves in the source. The marketing site's section transitions (the AI-Messenger card pivots between Inbox / Meet / Team Chat / Workflow) appear to use the `m` duration with the default ease.
|
|
347
|
+
|
|
348
|
+
`prefers-reduced-motion: reduce` → durations collapse toward 0ms, transforms become opacity-only (convention; not explicitly documented in source but consistent with Bezier's accessibility framing).
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
**Verified:** 2026-05-14
|
|
353
|
+
**Tier 1 sources (live + canonical DS):**
|
|
354
|
+
- `channel.io/en` — live DOM via CDP (Chrome DevTools Protocol over localhost:9222) 2026-05-14, 118 element samples with full `getComputedStyle` capture (proof file: `assets/_reference/.live-inspect-proof.json`, 10 raw_samples retained ≥ 5-minimum threshold)
|
|
355
|
+
- `github.com/channel-io/bezier-react/tree/main/packages/bezier-tokens/src/global` — canonical Bezier DS token JSON files (color 6.7KB, font 3.0KB, typography 2.7KB, radius 463B, transition 945B, opacity 66B, z-index 361B) fetched via `gh api` 2026-05-14
|
|
356
|
+
- `github.com/channel-io/bezier-react/tree/main/packages/bezier-tokens/src/semantic` — elevation 2.3KB + input 1.5KB + light-theme/dark-theme directories
|
|
357
|
+
|
|
358
|
+
**Tier 2 sources:** `styles.refero.design/?q=channel+talk` and `getdesign.md/channeltalk` not consulted this pass (Bezier is the Tier-1 canonical source, making Tier-2 third-party indexes redundant for this reference); to be checked in a follow-up UPDATE.
|
|
359
|
+
|
|
360
|
+
**Tier 2 (Philosophy/founders):** `channel.io/en/about` (positioning + metrics + tagline), `channel.io/en/team` (CEO + metrics + compliance). Founder list beyond current CEO, exact founding year, total funding raised — *unverified* at this pass, flagged in §11 and below.
|
|
361
|
+
|
|
362
|
+
**Style ref:** `intercom` (closest peer: B2B customer messaging + AI agent positioning; warm dual-product chrome ↔ cobalt-disciplined product chrome contrast deliberate).
|
|
363
|
+
|
|
364
|
+
**Conflicts unresolved:**
|
|
365
|
+
- Founding year: secondary sources suggest ZOYI Corp lineage ~2014; Channel-side surfaces consulted do not confirm year. Flag for UPDATE.
|
|
366
|
+
- Founder list: only current CEO Choi Si-won verified from Channel surfaces; co-founders not enumerated.
|
|
367
|
+
- Total funding / HQ city: not extractable from channel.io surfaces consulted; Crunchbase blocked WebFetch (403); requires Tier 2 source on UPDATE pass.
|
|
368
|
+
|
|
369
|
+
**IP guardrails applied:**
|
|
370
|
+
- §10 voice samples documented for tone-shape reference only, **not derivable as verbatim copy** in downstream DESIGN.md generations. Fresh derivation patterns provided inline.
|
|
371
|
+
- Brand assets (logo, marketing photography) NOT mirrored into `assets/_reference/`; only computed-style raw samples + canonical Bezier DS token JSON (MIT-licensed, redistribution-permitted) captured.
|
|
372
|
+
- Bezier tokens are MIT-licensed at source — reproduction in this DESIGN.md is within license terms with attribution.
|
|
373
|
+
|
|
374
|
+
**Earlier mistakes reverted:** none (first capture of this reference).
|