Discord

Discord's iOS app is a dark-first community UI built around one load-bearing color: Blurple (#5865F2).

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

21tokens
5type steps
1radius steps
4pxspacing base

Discord, in one page

Discord's iOS app is a dark-first community UI built around one load-bearing color: Blurple (#5865F2). Open the app and you're dropped into a three-pane architecture — a leftmost server rail of rounded-square server icons, a channel list in the middle, and a message thread on the right — compressed into a mobile form factor via horizontal swipe navigation. The canvas is a near-black gradient of grays: the server rail at #1E1F22, the channel list at #2B2D31, the chat area at #313338. These three adjacent grays are so carefully tuned that they read as sibling surfaces rather than competing panels. The whole app feels like a gaming tool: purpose-built, dense, slightly nerdy, unapologetically dark.

The mood is community clubhouse, not broadcast platform. Presence is everywhere — a green (#23A55A) dot next to online users, yellow (#F0B232) for idle, red (#F23F43) for do-not-disturb, gray for offline. Role colors tint usernames throughout chat (admins in red, mods in green, VIPs in hot pink — whatever the server owner configures). Nitro-subscribed users get gradient avatars and animated badges. Custom emoji reactions flood threads during peak moments. The density of visual signals — per-user color, per-role hue, per-channel pings, per-user presence — means the UI has to stay chromatically restrained in its own chrome so server content can scream.

Typography is gg sans (Discord's proprietary font, replacing Whitney in 2023) for titles and UI, with SF Pro Text as the iOS fallback when gg sans isn't loaded. The type scale is compact — 14-20pt working range — because Discord expects many messages per screen. The single moment of chromatic excess is the Nitro Gradient: a purple-to-pink gradient (#5865F2 → #EB459E) used on Nitro badges, Boost badges, and the occasional promo banner. Everything else stays in the gray-and-blurple lane.

Key Characteristics:

Do's and don'ts

Do

  • Use the three-gray surface system (#1E1F22 rail → #2B2D31 list → #313338 chat) — the adjacency is the brand
  • Use Blurple #5865F2 ONLY as primary accent (CTAs, mentions, active states) — not decoratively
  • Render server icons as 48pt rounded squares with 16pt corner radius default, 12pt on active
  • Show the 4pt × 40pt white active-indicator bar on the leading edge of the selected server
  • Use presence dots (green/yellow/red/gray) on every user avatar — always visible
  • Apply role colors to usernames in chat — this is core to Discord's community identity
  • Support full Markdown inline: bold, italic, underline, strikethrough, code, spoiler, quote
  • Use gg sans (or SF Pro fallback) — compact 14-16pt working range
  • Implement horizontal-swipe navigation between server rail / channel list / chat on mobile
  • Show mention pings as red #F23F43 badges with count — priority over plain unread dots

Don't

  • Don't use pure black canvas — Discord's dark is a specific gray system, not #000000
  • Don't exaggerate the contrast between the three grays — they should feel sibling
  • Don't add decorative shadows on messages or server icons — the app is flat
  • Don't use Blurple as a body text color — it's structural, not typographic
  • Don't use SF Symbols for channel icons — Discord has proprietary # / 🔊 / 📢 glyphs
  • Don't use tab-bar style navigation for channels — Discord uses a side rail + list, not a tab bar
  • Don't round server icons to full circles — the SQUARE with rounded corners is the brand
  • Don't skip the presence dot — status visibility is core
  • Don't use heavy-weight body text — 400 for body, 500 for labels, 600 for active
  • Don't forget the squircle morph (16pt → 12pt) when a server icon becomes active

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 Discord design language. Follow the measured tokens below — do not substitute your own palette.

Colors:
- Blurple: #5865f2
- Blurple Hover: #4752c4
- Blurple Light: #7289da
- Nitro Gradient: #5865f2
- Light Canvas: #ffffff
- Light Surface 1: #f2f3f5
- Light Surface 2: #ebedef
- Light Divider: #e3e5e8
- Text Primary: #f2f3f5
- Text Secondary: #b5bac1

Type:
- families: Whitney, Consolas, Monospace, Fallback Stack
- scale: 10, 12, 14, 16, 20
- weights: 400, 500, 600, 700

Shape:
- radius: 8
- elevation: Background: `#2B2D31`, 8pt corner radius, 12pt blur shadow

Spacing: 4, 8, 10, 12

Rules:
- Use the three-gray surface system (`#1E1F22` rail → `#2B2D31` list → `#313338` chat) — the adjacency is the brand
- Use Blurple `#5865F2` ONLY as primary accent (CTAs, mentions, active states) — not decoratively
- Render server icons as 48pt rounded squares with 16pt corner radius default, 12pt on active
- Show the 4pt × 40pt white active-indicator bar on the leading edge of the selected server
- Use presence dots (green/yellow/red/gray) on every user avatar — always visible
- Apply role colors to usernames in chat — this is core to Discord's community identity

Avoid:
- Don't use pure black canvas — Discord's dark is a specific gray system, not `#000000`
- Don't exaggerate the contrast between the three grays — they should feel sibling
- Don't add decorative shadows on messages or server icons — the app is flat
- Don't use Blurple as a body text color — it's structural, not typographic
- Don't use SF Symbols for channel icons — Discord has proprietary `#` / `🔊` / `📢` glyphs
- Don't use tab-bar style navigation for channels — Discord uses a side rail + list, not a tab bar

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

The specification

Colour paletteRead the full spec

Primary

  • Blurple (#5865F2): THE brand color — primary CTAs, active send button, active tab indicator, mention highlight, link color, online-user voice-channel bubble.
  • Blurple Hover (#4752C4): Pressed / hovered state for blurple CTAs.
  • Blurple Light (#7289DA): Legacy brand blurple (pre-2021), still seen on occasional assets.
  • Nitro Gradient (#5865F2 → #EB459E): Diagonal gradient used on Nitro badges, Boost icons, promo ribbons.

Canvas & Surfaces (Dark — Default)

The three-pane gray system is Discord's signature surface language.

  • Server Rail (#1E1F22): The leftmost darkest pane — holds the rounded-square server icons.
  • Channel List Pane (#2B2D31): The middle pane — server name + channel list + member list preview.
  • Chat Canvas (#313338): The right pane where messages live. Slightly lighter so it reads as "the document".
  • Input Bar / Surface 2 (#383A40): Compose bar background, hovered channel row.
  • Elevated Modal (#2B2D31): Modal and popover surfaces match the channel-list pane tone.
  • Divider (#3F4147): Hairline separators.

Canvas & Surfaces (Light — Rarely Used)

Discord does ship a light mode but ~80% of users stay on dark. Light mode is a straightforward inversion:

  • Light Canvas (#FFFFFF)
  • Light Surface 1 (#F2F3F5)
  • Light Surface 2 (#EBEDEF)
  • Light Divider (#E3E5E8)

Text

  • Text Primary (#F2F3F5): Message text, usernames (default, unroled), titles.
  • Text Secondary (#B5BAC1): Usernames in member list, metadata, small labels.
  • Text Muted (#949BA4): Timestamps, "was typing", inactive labels.
  • Text Link (#00A8FC): Hyperlinks inside messages (distinct blue from Blurple).
  • Text Disabled (#5D6069): Disabled labels, section subtitles.

Status (Presence Dots)

  • Online Green (#23A55A): Active users, successful actions.
  • Idle Yellow (#F0B232): Away / idle status.
  • DND Red (#F23F43): Do Not Disturb, error states, @mention pings.
  • Offline Gray (#80848E): Offline or invisible users.
  • Streaming Purple (#593695): Currently streaming / Go-Live active.

Role Colors

Server admins define per-role hex colors — any value is valid. Common defaults in Discord's template system:

  • Admin Red (#ED4245), Mod Green (#57F287), Booster Pink (#EB459E), VIP Gold (#FEE75C), Bot Aqua (#23C1D2).

Role color applies to the username in chat and in the right-side member list.

Semantic

  • Success (#23A55A): Successful actions, check states.
  • Warning (#F0B232): Warning banners, voice-disconnect notice.
  • Danger (#F23F43): Destructive actions, kick, ban, mention ping.
  • Nitro (Nitro Gradient): Premium-only features, Nitro badge.
  • Boost (Boost Pink #EB459E): Server Boost badge, Level 2/3 indicators.
Type scaleRead the full spec

Font Family

  • Primary (2023+): gg sans (proprietary, released 2023 to replace Whitney) — geometric sans with generous apertures, optimized for long-form chat scanning.
  • Previous (2017-2023): Whitney (Hoefler & Co.) — still seen on some legacy assets.
  • Monospace: gg mono (2023+) for code blocks; formerly Consolas.
  • Fallback Stack: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Helvetica Neue', Helvetica, Arial, sans-serif
  • CJK: Falls back to iOS system CJK fonts.

Hierarchy

RoleFontSizeWeightLine HeightLetter SpacingNotes
Screen Titlegg sans20pt7001.2-0.2pt"General", server name at top of channel
Channel Name (Active)gg sans16pt6001.25-0.1pt"#general" in channel list
Channel Name (Inactive)gg sans16pt5001.25-0.1ptUnselected channels
Usernamegg sans16pt6001.2-0.1ptSender name above message, tinted with role color
Message Bodygg sans16pt4001.375-0.1ptThe actual message text
Timestamp (Inline)gg sans12pt5001.20ptNext to username in chat
Reply Contextgg sans14pt4001.25-0.1ptThe replied-to message preview
System Messagegg sans14pt5001.30pt"Welcome @user to the server!" joins
Section Labelgg sans12pt7001.20.5pt"ANNOUNCEMENTS" — uppercase tracked
Member List Namegg sans14pt5001.2-0.1ptRight-side member list
Button (Primary)gg sans14pt5001.00pt"Join", "Continue"
Tab Labelgg sans10pt6001.00.1ptBottom tab labels
Code Blockgg mono14pt4001.40ptTriple-backtick code block
Inline Codegg mono14pt4001.00ptBacktick-wrapped inline code
Blockquotegg sans16pt4001.4-0.1pt> quote rendered with leading bar

Principles

  • Compact working range: Most UI sits at 14-16pt. 20pt is the largest non-display size.
  • Role colors on usernames: Per-server username coloring from role assignments — applies in chat and member list.
  • Weight used sparingly: 400 for body, 500 for labels, 600 for active states, 700 only on screen titles and section labels.
  • Markdown inline rendering: bold, *italic*, __underline__, ~~strikethrough~~, ` code , ||spoiler||, > quote` — all rendered inline by default.
  • gg mono for code: Monospace shifts to gg mono inside code blocks, inheriting the 14pt / 1.4 line-height.
Components and layoutRead the full spec

Buttons

Primary Blurple Button

  • Shape: Rectangle, 8pt corner radius (or 4pt for compact inline)
  • Background: #5865F2
  • Text: white, gg sans 14pt weight 500
  • Padding: 10pt vertical, 16pt horizontal (standard); 8pt / 12pt compact
  • Pressed: #4752C4 + scale 0.97
  • Used for: "Continue", "Send Friend Request", "Join Voice"

Secondary Button

  • Background: #4E5058 (dark gray)
  • Text: white, gg sans 14pt weight 500
  • Pressed: #6D6F78
  • Used for: "Cancel", "Maybe Later"

Destructive Button

  • Background: #DA373C
  • Text: white, same typography as primary
  • Used for: "Leave Server", "Delete Message", "Kick User"

Tertiary / Ghost Button

  • Background: transparent
  • Text: #5865F2 (Blurple) for affirmative, #F23F43 for destructive
  • No border, no fill — text link style

Icon Actions (Pin, Thread, Reply, Reaction, Share)

  • Size: 20pt glyph, 36pt hit area
  • Default: #B5BAC1
  • Hover/active: #F2F3F5
  • Active role (e.g. pinned): #5865F2

Send Button (Compose Bar)

  • Shape: Icon only (no container) when message short; becomes a #5865F2 circle 32pt when focused
  • Paper-plane icon 20pt #5865F2 or white (on filled circle)

Cards & Containers

Server Icon (Left Rail)

  • Shape: Rounded square, 16pt corner radius default; transitions to 12pt corner radius on hover/active (the "squircle-to-squircle-er" effect)
  • Size: 48pt × 48pt
  • Padding between icons: 8pt vertical
  • Active indicator: 4pt × 40pt vertical bar on the leading edge, white fill, 2pt from icon
  • Unread indicator: 8pt × 8pt white dot on leading edge (shorter than active bar)
  • Mention indicator: same position as unread dot, #F23F43 red, with white digit count
  • Custom server image OR initials (first 1-2 letters of server name) on Blurple gradient default background
  • Folder grouping: servers can nest inside folders — folder icon is a 2x2 mini-grid of server icons

Channel List Row

  • Height: 36pt
  • Structure: leading # (text channel), 🔊 (voice), 📢 (announcement), or custom icon → channel name → trailing pin icon + member count (voice only)
  • Background: transparent default, #404249 on hover, #35373C on active
  • Active channel: background #404249 + white name + vertical leading accent bar #5865F2 3pt
  • Unread: channel name in white + a small white dot at the far-left
  • Mentioned: channel name in white + red "@" pill with count trailing

Message Row

  • Layout: 40pt avatar (leading, 16pt inset) → 12pt gap → (username + timestamp inline on first line; message body below)
  • Grouping: sequential messages from same user within 5 min skip the avatar + username and just indent
  • Padding: 4pt vertical (grouped) / 16pt vertical (first of group)
  • Background: transparent default, #2E3035 on hover (desktop — mobile long-press instead)
  • Reply quote: nested above message, with leading vertical bar in that sender's role color

Voice Channel (Active)

  • Channel row expands to show active participants
  • Each participant: 24pt avatar + name in role color + speaking ring
  • Speaking ring: 2pt green #23A55A ring around avatar, pulses scale 1.0 → 1.1 when mic is active
  • Join button: "Join Voice" pill with #23A55A background, white text
  • Already joined: green #23A55A phone icon indicator

Member List Row (Right Pane)

  • Height: 44pt
  • Structure: 32pt avatar with presence dot (8pt, position bottom-right) → username in role color → status text 12pt muted below
  • Presence dot: bottom-right overlay, 2pt border matching canvas color

Navigation

Bottom Tab Bar (Mobile)

  • Height: 50pt + safe area
  • Tabs: Servers (default), Messages (DMs), Notifications, You (profile)
  • Icon size: 22pt
  • Active color: #F2F3F5 (white)
  • Inactive: #949BA4
  • Labels: gg sans 10pt weight 600
  • Background: #1E1F22 (matches server rail)

Server Rail Navigation (Mobile) On mobile, the "server rail" is a left-edge drawer — swipe right from any chat to reveal the rail + channel list. Swipe left to close.

  • Drawer width: ~75% of screen
  • Left edge: 72pt server rail with vertical scroll
  • Right side of drawer: 250pt channel list
  • Tap a server icon: channel list re-populates for that server
  • Tap a channel: drawer closes, chat loads

Chat Top Nav

  • Height: 48pt + safe area
  • Leading: hamburger / server-rail toggle + channel icon + channel name
  • Trailing: pinned-messages icon + member-list icon + search icon
  • Background: #1E1F22 with 1pt bottom divider #3F4147

Input Fields

Compose Bar

  • Height: ~52pt min, grows multiline
  • Background: #383A40 (Surface 2) — intentionally 1 step lighter than chat canvas
  • Corner radius: 8pt
  • Leading + icon (attach file / media — 24pt #B5BAC1)
  • Trailing: gift icon + GIF picker + sticker picker + emoji picker (each 22pt)
  • Send icon: paper-plane 20pt #5865F2 when text present, gray when empty
  • Placeholder: "Message #general", #949BA4
  • Focus: subtle #5865F2 glow ring (2pt)

Search Bar

  • Background: #1E1F22
  • Corner radius: 8pt
  • Height: 36pt
  • Leading magnifyingglass #B5BAC1
  • Placeholder: "Search", #949BA4

Distinctive Components

Server Rail (The Defining Discord Component) The leftmost pane of rounded-square server icons is THE visual signature of Discord.

Responsive behaviourRead the full spec

Device Sizes

DeviceWidthKey Changes
iPhone SE (3rd gen)375ptServer rail drawer takes 85% of width; member list hidden
iPhone 13/14/15390ptStandard drawer at 75% width
iPhone 15/16 Pro393ptDynamic Island accommodated in nav
iPhone 15/16 Pro Max430ptDrawer at 70% width
iPad768pt+Three panes visible in landscape: rail 72pt, channel list 240pt, chat flex-1

Dynamic Type

  • Message body, username, channel name: respect Dynamic Type scaling
  • Timestamps, tab labels, presence dot size: fixed
  • Code blocks: respect Dynamic Type but capped at 18pt

Orientation

  • Mobile portrait: single pane visible; swipe to switch
  • Mobile landscape: two panes visible (channel list + chat)
  • iPad: all orientations supported; three panes in landscape

Touch Targets

  • Server icon: 48pt × 48pt — generous enough
  • Channel row: 36pt height
  • Send icon: 36pt hit area
  • Avatar tap in chat: 40pt + 8pt hitSlop = 48pt effective
  • Reaction chip: 36pt hit area

Safe Area Handling

  • Top: safe area honored; Dynamic Island fits into the #1E1F22 nav bar
  • Bottom: tab bar and compose bar respect home indicator
  • Side: server-rail drawer starts beyond safe area, slides in over content

Drop-in CSS variables

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

body.theme-discord {--page-bg: #ffffff;
  --page-bg-gradient: none;
  --text-color: #4a5262;
  --heading-color: #4a5262;
  --link-color: #0072ac;
  --link-hover-color: #005079;
  --border-color: #dee0e3;
  --card-bg: #ffffff;
  --card-shadow: 0 1px 2px rgba(74,82,98,0.06);
  --card-hover-shadow: 0 6px 18px rgba(74,82,98,0.12);
  --header-bg: #4a5262;
  --header-text-color: #ffffff;
  --header-shadow: none;
  --footer-bg: #ffffff;
  --footer-text-color: #6a717b;
  --button-bg: #00a8fc;
  --button-text-color: #000000;
  --button-hover-bg: #0086c9;
  --button-border: none;
  --button-border-radius: 8px;
  --button-secondary-bg: #f4f5f6;
  --button-secondary-text-color: #4a5262;
  --button-secondary-hover-bg: #e9eaec;
  --button-secondary-border: 1px solid #dee0e3;
  --prompt-bg: #f6f6f7;
  --prompt-text-color: #4a5262;
  --base-font: var(--font-mono);
  --heading-font: var(--font-mono);
  --card-border-radius: 8px;
}

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/discord/DESIGN.md · 26.5 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.