Telegram Web DESIGN.md

Brands

The official design system for building Telegram's web product UI. Rooted in clarity, speed, and privacy-first interaction — a minimal but expressive communication platform.

Raw DESIGN.md

At a glance

Group
Brands
Main color
#26a5e4Blue design systems
Font
Monaco

Colors in this file

  • #ffffff

    White

  • #26a5e4

    Telegram Blue

  • #2481cc

    Deep Blue

  • #179cde

    Sky Blue

  • #000000

    Text Default

  • #e8e8e8

    Border Subtle

  • #0088cc

    Link Color

  • #1c93e3

    Dark Blue

  • #ecf3f8

    Background Surface

  • #ff3b30

    Error

The official design system for building Telegram's web product UI. Rooted in clarity, speed, and privacy-first interaction — a minimal but expressive communication platform.

Design Philosophy: Clean, fast, and frictionless. Telegram's UI prioritizes content over chrome. Every component is lightweight, responsive, and optimized for cross-platform consistency. The interface stays out of the user's way.

1. Color Palette

Primary Brand Colors

Color NameHex CodeRGBCSS VariableUsage
Telegram Blue#26A5E4rgb(38, 165, 228)--tg-color-brandPrimary actions, CTAs, links
Deep Blue#2481CCrgb(36, 129, 204)--tg-color-accentButton hover, active states
Sky Blue#179CDErgb(23, 156, 222)--tg-color-highlightIndicators, underlines, borders
Dark Blue#1C93E3rgb(28, 147, 227)--tg-color-accent-darkDark mode primary actions
White#FFFFFFrgb(255, 255, 255)--tg-color-whiteBackgrounds, icon fills on brand

Light Mode Colors

ElementHex CodeRGBCSS Variable
Background Default#FFFFFFrgb(255, 255, 255)--tg-bg-default
Background Muted#F7F7F7rgb(247, 247, 247)--tg-bg-muted
Background Surface#ECF3F8rgb(236, 243, 248)--tg-bg-surface
Background Accent Tint#E5F1FArgb(229, 241, 250)--tg-bg-accent-tint
Text Default#000000rgb(0, 0, 0)--tg-text-default
Text Muted#7D7F81rgb(125, 127, 129)--tg-text-muted
Text Secondary#808080rgb(128, 128, 128)--tg-text-secondary
Text Disabled#AAAAAArgb(170, 170, 170)--tg-text-disabled
Border Default#E6E6E6rgb(230, 230, 230)--tg-border-default
Border Subtle#E8E8E8rgb(232, 232, 232)--tg-border-subtle
Link Color#0088CCrgb(0, 136, 204)--tg-link-color

Dark Mode Colors

ElementHex CodeRGBCSS Variable
Background Default#000000rgb(0, 0, 0)--tg-bg-default
Background Surface#1E1E1Ergb(30, 30, 30)--tg-bg-surface
Background Muted#212429rgb(33, 36, 41)--tg-bg-muted
Background Blurred#222222D6rgba(34, 34, 34, 0.84)--tg-bg-blurred
Text Default#FFFFFFrgb(255, 255, 255)--tg-text-default
Text Muted#84888Crgb(132, 136, 140)--tg-text-muted
Border Default#33373Drgb(51, 55, 61)--tg-border-default
Table Head#262A2Ergb(38, 42, 46)--tg-table-head
Accent Link#3CA1EBrgb(60, 161, 235)--tg-link-color
Accent Button#1C93E3rgb(28, 147, 227)--tg-accent-btn
Highlight#30AAFDrgb(48, 170, 253)--tg-color-highlight

Message Bubble Colors

TypeBackgroundTextUsage
Incoming (Light)#FFFFFF#000000Messages from others
Outgoing (Light)#EFFDDE#000000User's sent messages
Incoming (Dark)#212121#FFFFFFMessages from others
Outgoing (Dark)#2B5278#FFFFFFUser's sent messages
Service Message#00000033#FFFFFFSystem / date dividers

Status & Semantic Colors

StateBackgroundTextCSS VariableUsage
Online#26A5E4#FFFFFF--tg-color-onlineUser online indicator
Unread badge#26A5E4#FFFFFF--tg-color-badgeUnread message count
Muted badge#A8A8A8#FFFFFF--tg-color-muted-badgeMuted chat badge
Error#FF3B30#FFFFFF--tg-color-errorFailed message, error state
Success#34C759#FFFFFF--tg-color-successDelivered, verified
Premium Gold#F5AE3E#FFFFFF--tg-color-premiumPremium/Stars features

Data Visualization Colors

Color NameEmphasisMutedUsage
Blue#2481CC#D6EAF8Primary chart series
Green#34C759#D5F5E3Growth, positive trends
Red#FF3B30#FDEDECDecline, negative states
Orange#FF9500#FEF9E7Warnings, attention
Purple#AF52DE#F4ECF7Tertiary data
Gray#8E8E93#F2F3F4Neutral, inactive

2. Typography

Font Stacks

css/* Primary — System San-Serif */
--tg-font-primary: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
                   Helvetica, Arial, sans-serif,
                   "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";

/* Legacy / Alternate */
--tg-font-legacy: "Lucida Grande", "Lucida Sans Unicode",
                  Arial, Helvetica, Verdana, sans-serif;

/* Light / Display (landing headings) */
--tg-font-light: "HelveticaNeue-Light", "Helvetica Neue Light",
                 "Helvetica Light", Helvetica, Arial, Verdana, sans-serif;

/* Monospace (code, technical content) */
--tg-font-mono: Monaco, Menlo, Consolas, "Courier New", monospace;

Type Scale

StyleSizeWeightLine HeightUsage
Display Hero34px400 (Normal)1.2Landing page main title
Heading Large23px500 (Medium)1.3Section titles
Heading Medium20px700 (Bold)1.4Page-level headings (h1–h3)
Heading Small16px700 (Bold)1.5Sub-section headings (h4–h5)
Body Large16px300 (Light)1.6Lead descriptions, mission text
Body Default15px400 (Normal)1.58Standard body copy
Body Medium14px400 (Normal)1.5Secondary body, card content
Body Small13px400 (Normal)1.5Captions, metadata, code blocks
Label / Caption12px400 (Normal)1.25Timestamps, small labels
Nav / UI15px400 (Normal)1.33Navigation items, menu links

Font Weights

WeightValueUsage
Light300Lead text, landing descriptions
Normal400Body, nav, standard UI text
Medium500Display headings, feature card titles
Bold700Section headings, emphasis

Typography Guidelines

  • Line length: Max 800px content width for readable prose; 65ch for long-form articles
  • Alignment: Left-aligned text as default; center only for hero headlines and short taglines
  • Letter spacing: -1px to -2px for large display headings; default tracking for body
  • Hierarchy: Weight and size define hierarchy — color used sparingly for emphasis
  • RTL support: Full right-to-left (direction: rtl) support for Arabic, Persian, Hebrew
  • Code: Always use --tg-font-mono for API references, code snippets, and technical strings

3. Spacing & Layout

Base Spacing Scale

TokenValuePixelsCSS Variable
20.125rem2px--tg-space-2
40.25rem4px--tg-space-4
60.375rem6px--tg-space-6
80.5rem8px--tg-space-8
100.625rem10px--tg-space-10
120.75rem12px--tg-space-12
150.9375rem15px--tg-space-15
161rem16px--tg-space-16
171.0625rem17px--tg-space-17
181.125rem18px--tg-space-18
201.25rem20px--tg-space-20
241.5rem24px--tg-space-24
281.75rem28px--tg-space-28
322rem32px--tg-space-32
402.5rem40px--tg-space-40
503.125rem50px--tg-space-50
603.75rem60px--tg-space-60

Content Width Containers

ContainerMax WidthUsage
Narrow640pxFocused prose, single-column forms
Content800pxStandard page content, developer docs
Default970pxGeneral content pages
Wide1170pxFull-page marketing layouts
Card Grid950pxFeature card grids (telegram.org)

Breakpoints

NameValueUsage
Mobile320pxMinimum supported width
Small640pxStacked card layouts
Medium768px2-column card grid activates
Large992px3-column card grid activates
X-Large1200pxFull desktop layout

Layout Grid

  • 4px baseline grid: All spacing and sizing aligns to 4px increments
  • Flexible columns: CSS Grid or Flexbox for responsive layouts
  • Mobile-first: Progressive enhancement from 320px baseline
  • Navigation offset: Content starts at margin-top: 50px to clear fixed navbar

4. Borders & Shadows

Border Width

StyleValueCSS VariableUsage
Thin (Default)1px--tg-border-width-thinCards, nav borders, dividers
Active Indicator3px--tg-border-width-activeNav active state bottom underline
Focus Ring2px--tg-border-width-focusKeyboard focus states

Border Radius

SizeValueCSS VariableUsage
None0px--tg-radius-noneButtons (square by default), forms
Small2px--tg-radius-smallNav indicator bar, subtle rounding
Medium4px--tg-radius-mediumDownload buttons, cards
Large6px--tg-radius-largeDropdowns, popovers
Full50%--tg-radius-fullAvatars, online dots, badges
Pill16px--tg-radius-pillSocial share buttons

Shadows

ShadowValueUsage
Navbarnone (border-bottom instead)Navigation bar elevation
Dropdown0 1px 1px rgba(20, 60, 83, 0.1)Dropdown menus
Card Hover0 2px 4px rgba(0,0,0,0.08)Elevated hover state on cards
Blurred Surfacebackdrop-filter: blur(25px)Translucent navbar (supports clause)

Focus States

css--tg-focus-color: #2481CC;
--tg-focus-width: 2px;
--tg-focus-style: solid;

5. Iconography

Icon System

Telegram uses a custom SVG icon set designed for the messaging and product interface. No public icon library name — icons are internally maintained and rendered inline or via CSS background-image.

Icon Sizes

SizeDimensionsUsage
16px16 × 16Inline indicators, UI micro-icons
25px25 × 27Platform badges (iOS, Android)
26px26 × 26Verified badge
30px30 × 30App platform icons in download lists
128px128 × 128App logo on landing pages
144px144 × 144Animated logo variant

Icon Categories

CategoryExamplesUsage
Messagingsend, reply, forward, pin, deleteCore messaging actions
PlatformiOS, Android, macOS, Windows, LinuxDownload / platform selection
Statusread tick (✓✓), delivered, clockMessage delivery states
Navigationback arrow, chevron, more (⋮)UI navigation
Verificationverified badge (blue check)Channel/user verification
Mediaphoto, video, file, audio, stickerMedia type indicators
Reactionsemoji panel, like, thumbsMessage reactions

Key UI Icons

send            — Paper plane (outgoing message)
verified        — Blue circle with white checkmark
double-check    — Two checkmarks (message read)
single-check    — One checkmark (message delivered)
mute            — Bell with slash
pin             — Pushpin
forward         — Curved arrow right
reply           — Curved arrow left
menu-dots       — Three dots horizontal (more actions)
search          — Magnifying glass
close           — × mark
back            — ← chevron
premium-star    — Star shape (Telegram Stars / Premium)

Icon Guidelines

  • Stroke width: 1–1.5px for small icons; filled for status indicators
  • Color: Inherits from parent, or uses --tg-color-brand for branded icons
  • Verification badge: Always rendered in Telegram Blue (#1C93E3) with white fill
  • Accessibility: Pair all icons with text labels or aria-label attributes

6. Component Patterns

Buttons

Button Variants

VariantBackgroundBorderTextUsage
Primary#318FD3none#FFFFFFMain download CTAs
Brand#26A5E4none#FFFFFFHeader CTAs, Sign In
Platform Download#A19481none#FFFFFFPlatform-specific download
Platform Hover#A99D8Bnone#FFFFFFHover state
Platform Active#998E7Enone#FFFFFFPressed state
Nav Active#1E98D4none#FFFFFFSelected nav pill
Ghost / Linktransparentnone#0088CCInline actions, nav links

Button Sizes

SizeHeightPaddingFont SizeBorder Radius
Small32px7px 17px14px16px (pill)
Default45px10px 15px16px4px
Nav Itemauto8px 17px15px0

Button States

css/* Platform Download Button */
--tg-btn-download-rest:   #A19481;
--tg-btn-download-hover:  #A99D8B;
--tg-btn-download-active: #998E7E;

/* Primary Brand Button */
--tg-btn-primary-rest:    #318FD3;
--tg-btn-primary-hover:   #2481CC;
--tg-btn-primary-active:  #1A6AAE;

/* Nav Link */
--tg-btn-nav-rest:        transparent;
--tg-btn-nav-hover:       #F0F6FA;
--tg-btn-nav-active-bg:   #1E98D4;
--tg-btn-nav-active-text: #FFFFFF;

Navigation

css/* Fixed top navbar */
position: fixed;
top: 0;
left: 0;
right: 0;
background: #FFFFFF;         /* or rgba(255,255,255,0.84) + backdrop-filter */
border-bottom: 1px solid #E8E8E8;
height: 50px;

/* Active nav indicator underline */
height: 3px;
background: #179CDE;
border-radius: 2px 2px 0 0;
bottom: -1px;
transition: opacity 0.2s ease-in-out, transform 0.2s ease-in-out;
transform-origin: bottom;
transform: scaleX(0.3) scaleY(0);   /* resting */
/* → scaleX(1) scaleY(1) on hover/active */

Form Controls

Text Input

StateBorderBackgroundShadow
Rest#CCCCCC#FFFFFFinset 0 1px 1px rgba(0,0,0,0.075)
Focusrgba(82,168,236,0.8)#FFFFFFinset 0 1px 1px rgba(0,0,0,0.075), 0 0 8px rgba(82,168,236,0.6)
Error#FF3B30#FFFFFFnone
Disabled#CCCCCC#F5F5F5none

Dropdown Menu

cssmin-width: 177px;
padding: 0;
background-color: #FFFFFF;
border: 1px solid rgba(29, 92, 123, 0.3);
box-shadow: 0 1px 1px rgba(20, 60, 83, 0.1);

/* Item */
padding: 8px 18px;
font-size: 13px;
color: #0088CC;

/* Item Hover */
background-color: #1E98D4;
color: #FFFFFF;

Message Bubbles

css/* Incoming message */
background: #FFFFFF;
border-radius: 0 12px 12px 12px;
padding: 8px 12px;
max-width: 320px;

/* Outgoing message */
background: #EFFDDE;
border-radius: 12px 0 12px 12px;
padding: 8px 12px;
max-width: 320px;
margin-left: auto;

/* Timestamp inside bubble */
font-size: 11px;
color: #A0ADB5;
float: right;
margin-top: 4px;
margin-left: 8px;

Cards (Feature Cards)

css/* telegram.org feature card */
max-width: 260px;
margin: 0 auto;
padding: 20px 0 9px;
text-align: center;

/* Card image */
width: 160px;
height: 160px;
margin: 0 auto;

/* Card header */
color: #A19679;         /* neutral variant */
/* or */
color: #0088CC;         /* brand variant */
font-size: 26px;
font-weight: normal;
letter-spacing: -1px;
margin: 15px 0 6px;

/* Card lead */
font-size: 15px;
line-height: 158%;
text-align: center;

Code Blocks

css/* Code block container */
background: #ECF3F8;
color: #546172;
border-radius: 4px;
padding: 9.5px;
font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
font-size: 13px;
line-height: 20px;
overflow-x: auto;

/* Inline code */
background: #FEE AE4;
color: #C61717;
padding: 3px 5px;
border-radius: 0;

/* Blockquote */
border-left: 4px solid #179CDE;
padding: 5px 17px;
color: inherit;

Avatars

SizeDimensionsBorder RadiusUsage
Mini20px50%Inline mentions
Small32px50%Chat list, compact views
Medium48px50%Chat header, profile previews
Large64px50%Profile page
Team120px50%Team / about pages

Badges & Labels

TypeBackgroundTextUsage
Unread count#26A5E4#FFFFFFUnread message counter
Muted count#A8A8A8#FFFFFFMuted chat counter
Premium#F5AE3E#FFFFFFPremium / Stars badge
Verified#1C93E3#FFFFFFVerified channel/user
Online dot#26A5E4—User online indicator (8px circle)

7. Motion & Animation

Duration Tokens

SpeedDurationUsage
Instant100msMicro-state changes (check marks)
Fast150msHover states, button presses
Normal200msNav transitions, dropdown open
Slow300msPage-level transitions
Logo animation500msTelegram logo sprite animation

Easing Functions

css--tg-ease-in-out: ease-in-out;
--tg-ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
--tg-ease-out: cubic-bezier(0, 0, 0.2, 1);
--tg-ease-in: cubic-bezier(0.4, 0, 1, 1);

Animation Patterns

PatternDurationEasingUsage
Nav underline slide200msease-in-outActive nav indicator
Dropdown open200msease-outMenu appearing
Button press scale150msease-in-outTactile button feedback
Logo sprite play500mssteps(30)Animated Telegram logo
Image fade in100msease-in-outLazy-loaded images
Back-to-top200msease-in-outScroll utility fade

Nav Underline Transition

css/* Resting */
opacity: 0;
transform: scaleX(0.3) scaleY(0);
transform-origin: bottom;

/* Active / Hover */
opacity: 1;
transform: scaleX(1) scaleY(1);
transition: opacity 0.2s ease-in-out, transform 0.2s ease-in-out;

Logo Animation

css/* Telegram sprite-based logo animation */
animation: t-logo-play 500ms steps(30) both;
background-size: cover;

@keyframes t-logo-play {
  from { background-position: 0% 0%; }
  to   { background-position: 100% 0%; }
}

Reduced Motion

css@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

8. Accessibility Standards

Color Contrast Requirements

ElementMinimum RatioStandard
Body text (default)4.5:1WCAG AA
Large text (>18px or >14px bold)3:1WCAG AA
UI components (borders, icons)3:1WCAG AA
Placeholder text3:1WCAG AA
Disabled textNo requirementDecorative

Focus States

  • All interactive elements must show visible focus indicators
  • Focus outline: 2px solid #2481CC
  • Never suppress :focus-visible without providing a visible alternative
  • Nav links: focus background #F0F6FA

Keyboard Navigation

KeyAction
TabMove to next focusable element
Shift + TabMove to previous focusable element
Enter / SpaceActivate buttons and links
Arrow KeysNavigate within components (nav, dropdowns)
EscapeClose overlay, dismiss dropdown

ARIA Patterns

html<!-- Nav with active state -->
<nav role="navigation" aria-label="Main navigation">
  <a href="/" aria-current="page">Home</a>
</nav>

<!-- Loading state button -->
<button aria-busy="true" aria-live="polite">
  <span class="sr-only">Loading...</span>
  Sending
</button>

<!-- Icon-only action -->
<button aria-label="Send message">
  <svg aria-hidden="true">...</svg>
</button>

<!-- Verified badge -->
<span role="img" aria-label="Verified account">
  <svg aria-hidden="true">...</svg>
</span>

Screen Reader Considerations

  • Use semantic HTML (<nav>, <main>, <article>, <section>, <footer>)
  • Provide text alternatives for all platform/status icons
  • Announce message delivery state changes (aria-live="polite")
  • Maintain a logical heading hierarchy: h1 → h2 → h3
  • Label all form inputs with visible <label> or aria-label
  • RTL content: set dir="rtl" on container elements for Arabic/Persian/Hebrew

9. Platform-Specific Guidelines

Web Application Layout Structure

┌──────────────────────────────────────────────────────────────┐
│ Navbar (fixed, 50px height, white + bottom border)           │
│  Logo | Nav Links | Language Selector | [Sign In]            │
├────────────────┬─────────────────────────────────────────────┤
│                │                                             │
│  Sidebar Nav   │   Main Content Area                        │
│  (dev docs)    │   max-width: 800px, margin: 0 auto         │
│                │                                             │
│                │  ┌─────────────────────────────────────┐   │
│                │  │ Page / Hero Section                 │   │
│                │  ├─────────────────────────────────────┤   │
│                │  │ Content (cards, text, API docs)     │   │
│                │  └─────────────────────────────────────┘   │
│                │                                             │
└────────────────┴─────────────────────────────────────────────┘
│ Footer (max-width: 925px, flex row, border-top: #E8E8E8)     │
└──────────────────────────────────────────────────────────────┘

Landing Page Pattern (telegram.org)

Navbar (fixed)
  ├── Logo (128×128 animated)
  ├── App Title (34px, letter-spacing: -2px)
  ├── Tagline (20px, light weight, muted color)
  └── Download Buttons (platform-specific)

Feature Card Grid (max-width: 950px)
  ├── 1-col mobile → 2-col @768px → 3-col @992px
  ├── 160×160px animated GIF illustrations
  └── Card header + short lead text

Blog / Recent News Section
  ├── 2-col card grid (50% each, max-width: 800px)
  ├── Card: image + title + lead + date
  └── Single-column below 640px

Footer (flex row, 5 columns, max-width: 925px)

Developer Documentation Pattern

Sidebar Nav (right-positioned, 200px)
  ├── position: absolute → fixed (affix on scroll)
  ├── Active item: border-left: 2px solid #179CDE
  └── Nested items: smaller font, indent

Content Area (max-width: 800px)
  ├── Breadcrumb
  ├── Page title
  ├── Rich markdown content
  │    ├── Code blocks (ECF3F8 bg, 546172 text)
  │    ├── Inline code (FEEAE4 bg, C61717 text)
  │    └── Blockquotes (left border: 4px #179CDE)
  └── Edit form (for maintainers)

Overlay / Dialog Sizes

TypeMax WidthUsage
Dropdown177pxNav dropdowns, context menus
Tooltip200pxShort inline hints
Small Dialog320pxConfirmations, short prompts
Medium Dialog480pxForms, settings panels
Large Dialog640pxMedia viewer, full settings

Markdown Rendering

Heading Styles

LevelSizeWeightExtra
H120pxBoldmargin-top: 32px
H220pxBoldmargin-top: 32px
H320pxBoldmargin-top: 32px
H416pxBoldmargin-top: 29px
H516pxBoldmargin-top: 29px

Block Elements

css/* Blockquote */
border-left: 4px solid #179CDE;
padding: 5px 17px;
font-size: 14px;
line-height: 20px;

/* Inline code */
background: #FEEAE4;
color: #C61717;
padding: 3px 5px;

/* Code block */
background: #ECF3F8;
color: #546172;
font-size: 13px;
line-height: 20px;
overflow-x: auto;

/* Table cell */
border: 1px solid #D5D5D5;

/* Horizontal rule */
border-top: 1px solid #E8E8E8;
margin: 24px 0;

Quick Reference

Essential CSS Variables

css/* Brand */
--tg-color-brand:      #26A5E4;
--tg-color-accent:     #2481CC;
--tg-color-highlight:  #179CDE;
--tg-link-color:       #0088CC;

/* Light mode surfaces */
--tg-bg-default:       #FFFFFF;
--tg-bg-muted:         #F7F7F7;
--tg-bg-surface:       #ECF3F8;
--tg-bg-accent-tint:   #E5F1FA;

/* Dark mode surfaces */
--tg-bg-dark-default:  #000000;
--tg-bg-dark-surface:  #1E1E1E;
--tg-bg-dark-muted:    #212429;

/* Text */
--tg-text-default:     #000000;
--tg-text-muted:       #7D7F81;
--tg-text-secondary:   #808080;

/* Borders */
--tg-border-default:   #E6E6E6;
--tg-border-subtle:    #E8E8E8;

/* Typography */
--tg-font-primary: -apple-system, BlinkMacSystemFont, "Segoe UI",
                   Roboto, Helvetica, Arial, sans-serif;
--tg-font-mono:    Monaco, Menlo, Consolas, "Courier New", monospace;

/* Spacing */
--tg-space-8:  0.5rem;
--tg-space-16: 1rem;
--tg-space-24: 1.5rem;

/* Radius */
--tg-radius-medium: 4px;
--tg-radius-full:   50%;
--tg-radius-pill:   16px;

/* Focus */
--tg-focus-color:  #2481CC;
--tg-focus-width:  2px;

Resources

Based on Telegram's publicly observable web design patterns, telegram.org CSS, and official brand color references. For the most current specifications, refer to telegram.org and core.telegram.org.

Use it with your agent

Save the file as DESIGN.md in your project root, then ask your agent to follow it for UI work. Or let the agent fetch it over MCP.

Download

curl -o DESIGN.md https://www.uiskillbook.com/design-md/telegram.md

MCP server

https://www.uiskillbook.com/mcp

MCP tool call

get_design_md({ "slug": "telegram" })