Wechat

WeChat's iOS app is not really a messaging app — it's an operating system wearing a chat app's clothes, and the design reflects that.

Back to all styles

A live page in this style is not built yet — the CSS variables and the prompt below are enough to reproduce it.

At a glance

24tokens
8type steps
3radius steps
4pxspacing base

Wechat, in one page

WeChat's iOS app is not really a messaging app — it's an operating system wearing a chat app's clothes, and the design reflects that. The visual language is deliberately spare and utilitarian: a light gray system (#EDEDED chat backdrop, #FFFFFF cards), near-black text (#181818), and a single brand color, WeChat Green (#07C160), used with monastic discipline. There is almost no decoration. The reason is structural: WeChat must hold messaging, payments, Moments (social feed), Mini Programs (third-party apps), Channels (video), Scan, and an entire commerce stack inside one shell. A loud aesthetic would collapse under that weight. So the chrome recedes to gray neutrality and lets the *list* — the most scalable UI primitive ever made — carry everything.

The chat thread looks plain on purpose. Incoming bubbles are flat white (#FFFFFF); outgoing bubbles are a pale, slightly acidic green (#95EC69 — not the brand green, a lighter chat-tint) with black text. Bubbles have a small triangular tail and a modest 6pt radius — squarer and tighter than Western messengers, a distinctly WeChat silhouette. The energy of the app is not in the thread; it is in the Discover tab, the super-app hub. Discover is a grouped list of system rows — Moments, Channels, Scan, Mini Programs, Search, Nearby, Top Stories — each a 56pt row with a colored 28pt square icon, a title, and a chevron. This list is the gateway to WeChat's entire ecosystem, and its grouped-list pattern (white rows, gray gutters, hairline dividers) is the single most identifying structural component of the app.

Typography is PingFang SC / Noto Sans (deep CJK first, system fallback) at weights 400 / 600. Sizes are conservative: contact names 17pt, message bodies 17pt, list rows 17pt — WeChat uses one dominant body size across nearly everything for a calm, scannable rhythm. The red-dot badge (#FA5151) is the universal "attention" primitive, appearing on tabs, rows, and avatars. The four bottom tabs — Chats, Contacts, Discover, Me — are spare and unchanging. The overall feeling is "the quiet infrastructure of daily life in China": gray, list-driven, green-accented, ruthlessly utilitarian, and engineered to scale to a billion users without visual fatigue.

Key Characteristics:

Do's and don'ts

Do

  • Treat Discover as a grouped list of feature rows (Moments / Channels / Scan / Mini Programs / Search / Nearby) — the super-app hub is the identity
  • Use the gray system: chat backdrop #EDEDED, white cards/rows, near-black #181818 text
  • Make outgoing bubbles pale chat-green #95EC69, incoming white, text black — NOT the brand green for bubbles
  • Reserve WeChat Green #07C160 for "go": send, pay, primary buttons, active tab, toggles
  • Use rounded-square avatars (~8pt radius) everywhere — not circles
  • Keep bubbles tight and squarer (6pt radius + a triangular tail)
  • Use the red dot (#FA5151) as the universal attention primitive on tabs/rows/avatars
  • Hold to ONE dominant body size (17pt), two weights (400/600), CJK-friendly line-height

Don't

  • Don't make Discover a colorful dashboard — it's a calm grouped list; color lives only in the 28pt icons
  • Don't use circular avatars — WeChat's rounded square is a constant brand tell
  • Don't use the saturated brand green for the outgoing bubble — that's the pale #95EC69
  • Don't round bubbles like Western messengers — keep the 6pt squarer silhouette with a tail
  • Don't add a second accent or decorative gradients — gray + green + the red dot is the entire system
  • Don't put per-bubble timestamps — WeChat uses centered time separators between runs
  • Don't animate aggressively — WeChat's motion is near-absent (the red-packet open is the one flourish)
  • Don't introduce extra type sizes/weights — 17pt body + 400/600 keeps a billion-user app calm

Copy this into your AI builder

Paste it as-is. Every value below was measured from the original site, not guessed.

Assembled from the measured tokens — the source document has no prompt block.

Build a page in the Wechat design language. Follow the measured tokens below — do not substitute your own palette.

Colors:
- WeChat Green: #07c160
- WeChat Green Pressed: #06a050
- Outgoing Bubble Green: #95ec69
- Chat Backdrop: #ededed
- Canvas White: #ffffff
- Surface Gray: #f7f7f7
- Divider: #d9d9d9
- Text Primary: #181818
- Text Secondary: #888888
- Text Tertiary: #b2b2b2

Type:
- families: PingFang SC, Noto Sans, Fallback Stack, Weights
- scale: 10, 11, 12, 13, 14, 15, 16, 17
- weights: 400, 600

Shape:
- radius: 4, 6, 8

Spacing: 4, 9, 12

Rules:
- Treat Discover as a grouped list of feature rows (Moments / Channels / Scan / Mini Programs / Search / Nearby) — the super-app hub is the identity
- Use the gray system: chat backdrop `#EDEDED`, white cards/rows, near-black `#181818` text
- Make outgoing bubbles pale chat-green `#95EC69`, incoming white, text black — NOT the brand green for bubbles
- Reserve WeChat Green `#07C160` for "go": send, pay, primary buttons, active tab, toggles
- Use rounded-square avatars (~8pt radius) everywhere — not circles
- Keep bubbles tight and squarer (6pt radius + a triangular tail)

Avoid:
- Don't make Discover a colorful dashboard — it's a calm grouped list; color lives only in the 28pt icons
- Don't use circular avatars — WeChat's rounded square is a constant brand tell
- Don't use the saturated brand green for the outgoing bubble — that's the pale `#95EC69`
- Don't round bubbles like Western messengers — keep the 6pt squarer silhouette with a tail
- Don't add a second accent or decorative gradients — gray + green + the red dot is the entire system
- Don't put per-bubble timestamps — WeChat uses centered time separators between runs

Keep every value literal. If a token is given, use that exact value.

The specification

Colour paletteRead the full spec

Primary

  • WeChat Green (#07C160): Send-ready accent, primary buttons, active tab, confirmation, toggles, "Pay" action.
  • WeChat Green Pressed (#06A050): Pressed/active state for green buttons and toggles.
  • Outgoing Bubble Green (#95EC69): The pale chat-tint of your own message bubbles (NOT the brand green).

Canvas & Surface (Light)

  • Chat Backdrop (#EDEDED): The chat-room background and grouped-list base.
  • Canvas White (#FFFFFF): Cards, list rows, incoming bubbles, navigation bars, Discover rows.
  • Surface Gray (#F7F7F7): Search field, secondary fills, pressed-row tint base.
  • Divider (#D9D9D9): Hairline dividers between list rows and grouped sections.
  • Text Primary (#181818): Contact names, message text, list-row titles, primary labels.
  • Text Secondary (#888888): Previews, timestamps, captions, secondary labels.
  • Text Tertiary (#B2B2B2): Placeholders, disabled labels.

Canvas & Surface (Dark — Limited Use)

WeChat's iOS app is primarily a light surface; a dark variant exists for system-dark users.

  • Dark Canvas (#1A1A1A) (rows/cards)
  • Dark Backdrop (#111111) (chat/grouped base)
  • Dark Incoming Bubble (#2C2C2C)
  • Dark Outgoing Bubble (#3EB575) (muted green in dark)
  • Dark Text Primary (#E8E8E8)
  • Dark Text Secondary (#9A9A9A)

Message-Specific

  • Incoming Bubble (#FFFFFF): Left-aligned received bubble.
  • Outgoing Bubble (#95EC69): Right-aligned sent bubble (pale chat-green).
  • Bubble Text (#181818): Text in both incoming and outgoing bubbles.
  • Bubble Meta (#888888): System time separators (centered, not per-bubble in WeChat).

Discover / Icon Accents (per-row square icons)

  • Moments (#3F7DD5 blue), Scan (#2EA0F8 light blue), Channels (#FA9D3B orange), Mini Programs (#3CC51F green), Search (#5C7CFA indigo), Nearby (#F76F34 orange), Top Stories (#EB6F6F red). Each is a 28pt rounded-square glyph chip — color is data-driven, only here.

Semantic

  • Red Dot / Badge (#FA5151): Universal unread/attention badge on tabs, rows, avatars.
  • Red Packet (#FA5151 envelope / #FBE3B3 gold accent): The hóngbāo money card.
  • Link Blue (#576B95): Inline links / "official account" article links inside bubbles.
  • Error Red (#FA5151): Failed-to-send, destructive actions.
Type scaleRead the full spec

Font Family

  • Primary: PingFang SC (Apple's CJK system face on iOS) / Noto Sans for Latin
  • Fallback Stack: -apple-system, 'PingFang SC', 'Noto Sans', BlinkMacSystemFont, 'SF Pro Text', 'Hiragino Sans', sans-serif
  • Weights: 400 (regular), 600 (semibold) — WeChat's hierarchy is regular vs semibold only

Hierarchy

RoleFontSizeWeightLine HeightLetter SpacingNotes
Nav TitlePingFang SC17pt6001.30ptCentered title in the top bar
Contact NamePingFang SC17pt4001.30ptRow title in chat / contacts list
List Row TitlePingFang SC17pt4001.30ptDiscover / Me / settings row title
Message BodyPingFang SC17pt4001.40ptThe bubble text — the dominant size
Section HeaderPingFang SC14pt4001.20ptGrouped section caption ("A"–"Z" / labels)
Message PreviewPingFang SC14pt4001.30ptLast-message snippet in chat list
TimestampPingFang SC13pt4001.20ptTime on a chat row
Time SeparatorPingFang SC12pt4001.20ptCentered date/time chip in a thread
Button (Primary)PingFang SC17pt6001.00ptGreen primary button label
Button (Secondary)PingFang SC16pt4001.00ptOutline / cancel button label
Tab LabelPingFang SC10pt4001.00ptBottom tab bar labels
Badge CountPingFang SC11pt6001.00ptNumber in the red badge
Moments NamePingFang SC15pt6001.30ptAuthor name in the Moments feed (link blue)
Caption / MetaPingFang SC13pt4001.30ptMoments timestamp, footnotes

Principles

  • One dominant size (17pt): contact names, list rows, and message bodies all sit at 17pt for a calm, uniform scan rhythm
  • Two weights only: PingFang SC 400/600 — semibold means "title/primary", nothing else
  • CJK-first metrics: line-height kept generous (1.4 on body) so dense CJK never feels cramped
  • Color is rationed: text is #181818/#888888; the only colored text is Moments author names (link blue) and links
  • The red dot is the loudest element — a tiny #FA5151 badge outranks any typographic emphasis for "attention"
  • Dynamic Type respected on names/rows/bodies; tab labels, badge counts, time separators are layout-fixed
Components and layoutRead the full spec

Buttons

Primary Button ("Send", "Pay", "Confirm")

  • Background: #07C160
  • Text: #FFFFFF, PingFang SC 17pt weight 600
  • Padding: 12pt vertical, full-width (16pt horizontal inset) or compact for inline
  • Corner radius: 6pt (rectangular, tight — WeChat's button silhouette)
  • Pressed: #06A050, scale 0.99

Outline / Secondary Button ("Cancel")

  • Background: #FFFFFF
  • Text: #181818, PingFang SC 16pt weight 400
  • Border: 1pt solid #D9D9D9
  • Corner radius: 6pt
  • Pressed: background #F7F7F7

Send Button

  • When composer empty: a "+" (more) and a voice/sticker glyph cluster, no send
  • When text exists: a green #07C160 rectangular button, label "Send" (PingFang SC 16pt w600 white), corner radius 4pt, compact
  • Pressed: #06A050

Text Button ("Edit", inline actions)

  • PingFang SC 16pt weight 400, color #576B95 (WeChat's link blue) or #07C160 for confirming actions
  • No background; 44pt hit area; pressed opacity 0.5

Icon Action (Voice, Sticker, Plus)

  • Glyph 26pt, hit area 44pt, color #181818 (WeChat tints composer glyphs near-black, not gray)
  • The "+" opens the attachment grid (album, camera, video call, location, red packet, transfer…)

Cards & Containers

Chat / Contacts List Row

  • Height: 64pt (chat list) / 56pt (contacts)
  • Layout: rounded-square avatar 44–48pt (leading) → name (17pt w400) + last-message preview (14pt w400 #888888, 1-line) → trailing: timestamp (13pt) + red-dot/count badge
  • Avatar shape: WeChat avatars are rounded squares (≈8pt radius), not circles — a key brand tell
  • Background: #FFFFFF; pressed #ECECEC
  • Divider: hairline #D9D9D9 inset to text origin (not under avatar)

Message Bubble — Incoming

  • Background: #FFFFFF
  • Text: #181818, PingFang SC 17pt w400
  • Padding: 9pt vertical, 12pt horizontal
  • Corner radius: 6pt with a small solid triangular tail pointing toward the leading avatar
  • Sender avatar (40pt rounded square) shown leading on each message
  • Max width: 72% of chat width; left-aligned with 8pt inset after avatar

Message Bubble — Outgoing

  • Background: #95EC69 (pale chat-green)
  • Text: #181818, PingFang SC 17pt w400
  • Corner radius: 6pt with a triangular tail pointing toward the trailing avatar
  • Your avatar (40pt rounded square) shown trailing
  • Max width: 72%; right-aligned with 8pt trailing inset
  • Time is NOT per-bubble — WeChat shows a centered time chip between time-grouped runs

Discover Grouped Row (Signature — the super-app hub)

  • Height: 56pt, background #FFFFFF
  • Leading: a 28pt rounded-square colored icon chip (per-feature color, see §2)
  • Title: PingFang SC 17pt w400 #181818
  • Trailing: optional red-dot/badge, then a #B2B2B2 chevron
  • Grouped: rows sit on #FFFFFF, separated into clusters by #EDEDED gutters with hairline #D9D9D9 dividers between rows within a cluster
  • Order: [Moments] · [Channels, Scan, Top Stories] · [Search, Nearby] · [Mini Programs]
  • This grouped list IS WeChat's most identifying structural component

Moments Card

  • A near-card-less timeline on #FFFFFF: 40pt rounded-square avatar, author name (15pt w600 #576B95), post text (17pt #181818), a 1–9 image grid (square thumbs, 3pt gaps), timestamp (13pt #888888), and a light gray comment/like bar
  • Divider hairline between posts

Red Packet (Hóngbāo) Card (Signature)

  • A rich red (#FA5151 → deeper red gradient acceptable) card, ~260pt wide, corner radius 8pt
  • A circular gold (#FBE3B3) "open" coin/seal centered, white blessing text ("Best wishes!"), sender line
  • Appears inline in a thread as its own special bubble-card; tapping animates the seal opening

System Time Separator

  • Centered, full-width, PingFang SC 12pt #888888 on the #EDEDED backdrop (no plate), e.g. "2:14 PM" / "Yesterday"

Navigation

Bottom Tab Bar

  • Height: 50pt + safe area
  • Background: #F7F7F7 (very light, near-white), top hairline #D9D9D9
  • Tabs: Chats, Contacts, Discover, Me
  • Icon 26pt; active #07C160, inactive #999999
  • Labels: PingFang SC 10pt w400, always shown
  • Chats tab: aggregated unread red badge #FA5151; Discover: a red dot when there's new Moments/activity

Top Bar

  • Height: 44pt + safe area, background #EDEDED (matches backdrop) or #FFFFFF on white screens
  • Centered title (17pt w600 #181818)
  • Leading: back chevron 22pt #181818 (with chat name)
  • Trailing: a single "+" or "⋯" glyph 22pt #181818 (WeChat keeps the top bar minimal — one trailing action)

Thread Header

  • Height: 44pt + safe area, #EDEDED background, bottom hairline
  • Leading: back chevron + chat name (17pt w600)
  • Trailing: a "⋯" (more) glyph 22pt #181818 — opens chat info (members, mute, etc.)

Input Fields

Composer

  • Sits on the #EDEDED backdrop
  • Leading: a voice glyph 26pt #181818 (tap to switch to hold-to-talk)
  • Field: #FFFFFF, min height 36pt, corner radius 6pt (squarer than Western messengers)
  • Trailing on the backdrop: a sticker (smiley) glyph and a "+" glyph, 26pt #181818
  • When text exists: a compact green "Send" button replaces the "+"
  • Field text: PingFang SC 17pt w400

Search Field

Responsive behaviourRead the full spec

Device Sizes

DeviceWidthKey Changes
iPhone SE (3rd gen)375pt60pt chat rows, bubble max 76%, Discover row 52pt
iPhone 13/14/15390ptStandard — 64pt chat rows, Discover 56pt
iPhone 15/16 Pro393ptDynamic Island clears the header
iPhone 15/16 Pro Max430ptLarger avatars (50pt), wider thread
iPad768pt+Master-detail split: list (left, 360pt) + chat/Discover (right)

Dynamic Type

  • Contact names, list rows, message bodies: full scale (they share the 17pt base)
  • Message body caps at ~22pt; bubble grows with content
  • Tab labels, badge counts, time separators: layout-fixed (do not scale)
  • Discover icon chips: fixed 28pt (grid-sensitive)

Orientation

  • Lists / chat / Discover / Me: portrait-locked on iPhone (WeChat is portrait-first)
  • iPad: split view in both orientations
  • Image/video viewer & Channels video: rotate freely

Touch Targets

  • Compact "Send" button: ≥44pt effective hit
  • Discover rows: full 56pt row tappable
  • Chat rows: full 64pt row tappable
  • Composer glyphs (voice/sticker/+): 44pt hit
  • Tab items: 26pt icon, 49pt hit

Safe Area Handling

  • Top: header respects safe area / Dynamic Island
  • Bottom: composer + tab bar respect home indicator; attachment grid rises above it
  • Sides: 8pt chat insets, 12pt grouped-list gutters

Drop-in CSS variables

The same values as a theme block. Add the class to <body> and the site repaints.

body.theme-wechat {--page-bg: #ffffff;
  --page-bg-gradient: none;
  --text-color: #181818;
  --heading-color: #181818;
  --link-color: #b35f05;
  --link-hover-color: #814504;
  --border-color: #d5d5d5;
  --card-bg: #ffffff;
  --card-shadow: 0 1px 2px rgba(24,24,24,0.06);
  --card-hover-shadow: 0 6px 18px rgba(24,24,24,0.12);
  --header-bg: #181818;
  --header-text-color: #ffffff;
  --header-shadow: none;
  --footer-bg: #ffffff;
  --footer-text-color: #696969;
  --button-bg: #fa9d3b;
  --button-text-color: #000000;
  --button-hover-bg: #f98409;
  --button-border: none;
  --button-border-radius: 6px;
  --button-secondary-bg: #f1f1f1;
  --button-secondary-text-color: #181818;
  --button-secondary-hover-bg: #e3e3e3;
  --button-secondary-border: 1px solid #d5d5d5;
  --prompt-bg: #f3f3f3;
  --prompt-text-color: #181818;
  --base-font: var(--font-helvetica);
  --heading-font: var(--font-helvetica);
  --card-border-radius: 6px;
}

Download theme.css

Visually close to

Measured with a deterministic colour + geometry comparison across 958 styles. Not a hand-picked list.

Where this came from

Source document
ios/design-md/messaging/wechat/DESIGN.md · 23.4 KB
Repository
Meliwat/awesome-ios-design-md
Licence
MIT

Source text is reproduced under its original licence. Tokens, similarity scores and page structure are ours.