This chapter documents the Claude colors and the rest of the design tokens found in the Claude Desktop 1.x front-end build: the color palette with exact hex values, surfaces, border radius, borders and shadows, the font stack, the type scale and motion curves. It is a translation of the Chinese handbook chapter; every value is copied from it unchanged.
Claude's interface stands out among today's AI products. Its core tone comes down to three points:
Editorial Warmth:
It drops cold, highly saturated cyberpunk blue and purple entirely. The main brand color is a warm clay (#d97757), on soft off-white / dark gray backgrounds (#fcfcfb / #151515).
Low-contrast Surface Layering:
The interface almost never uses hard 1px black borders. Depth comes from tiny lightness differences between the Surface 0 - 3 layers and from semi-transparent outer-ring shadows built with color-mix().
Lightweight Organic Motion:
Streaming text uses a GPU-accelerated blur dissolve, complex expansions use CSS Grid 0fr to avoid height jitter, and gesture interactions use real damped springs.
According to a full AST audit of the production bundle c6a992d55-sXiDGMFQ.css with REA (Reverse Engineer Anything) v6.5.0, Claude does not use isolated, scattered color values. Its colors sit on a precise system built from a complete 35-step gray scale (--cds-gray-0 to --cds-gray-900) and a 35-step orange scale (--cds-orange-0 to --cds-orange-900).
In Claude, a card's outer curvature is tied to the inner --cds-radius plus .25rem * --cds-rem-scale, so inner and outer corners stay concentric when the user zooms the page or turns on larger accessibility text.
In many Claude look-alike products, the "cheap" look comes almost 100% from borders that are too thick and too hard and from single-layer, pure-black shadows. Claude Desktop uses precise rules to avoid this:
On Retina screens (MacBook Retina @2x/@3x), a standard 1px border actually covers 2 to 3 physical pixels and looks heavy. Claude uses media queries and inset-shadow outlines to get real, dynamic hairlines:
[!TIP]
Why does Claude rarely use CSS border: 1px solid ...?
A regular CSS border counts toward the element's box size, so toggling between active and inactive states can cause a small "1px size jitter and reflow". Claude uses box-shadow: inset 0 0 0 1px ... or box-shadow: 0 0 0 1px ... instead. Shadows sit outside box-model layout, so transitions are jitter-free.
Claude drops single-layer blur shadows entirely and uses a two-layer formula everywhere: [close-range Ambient Occlusion] + [long-range Elevation Diffusion]:
Pay close attention to how --cds-shadow-popover differs between light and dark mode:
Light mode: the outer ring is 0 0 0 1px var(--cds-border), a fine outline around the edge, combined with a soft diffuse shadow that drops 8px.
Dark mode (the bevel highlight flips!): the outer ring becomes 0px (no harsh white frame on a black background), and an inner inset 0 0 0 1px rgba(255, 255, 255, 0.10) is added. Like a beveled edge catching faint light from above, it outlines the popover without looking like a border.
When a control is activated by keyboard or click, Claude never uses the operating system's default blue outline. It renders its own three-layer clay ring:
--cds-focus-shadow: inset 0 0 0 1px var(--cds-surface-1), /* layer 1: 1px spacer between the control and the glow */ 0 0 0 1.5px var(--cds-clay), /* layer 2: 1.5px clay brand focus ring */ 0 0 6px 1px rgba(217, 119, 87, 0.25); /* layer 3: soft outer clay glow */
Claude's interaction feedback is smooth and restrained, following a "noticeable but never distracting" principle:
Ghost button hover and press (Ghost Button Feedback):
Resting: fully transparent background, secondary gray text (var(--cds-text-secondary)).
Hover: within 150ms on a Bézier curve (cubic-bezier(0.16, 1, 0.3, 1)) the background fades to a 5% gray fill (var(--cds-fill-ghost-hover)) and the text lights up to the primary color.
Active Press: a light scale(0.98) press, and the fill deepens to 10% gray (var(--cds-fill-ghost-selected)).
Card Elevation Y-Lift:
Resting: flat on the canvas with --cds-panel-shadow.
Hover: lifts by transform: translateY(-1.5px), the shadow transitions smoothly to --cds-panel-shadow-hover, and the border darkens to --cds-border-strong.
Leave: settles smoothly back into place with no hard bounce.
Dropdown Row Highlight:
When the pointer moves over a menu item, the background instantly lights up as a light highlight pill with a 4px radius (var(--radius-sm)); the row's icon and shortcut light up with it.
Drag & Drop Target Glow:
When a dragged file approaches the composer, the composer shows an inner clay glow inset 0 0 24px -2px rgba(217, 119, 87, 0.20) together with an inset 0 0 0 2px var(--cds-clay) snap ring.
In modern web front-ends and LLM-generated UI, "Russian-doll borders" are the most common cause of bloated, heavy, amateur-looking interfaces. Many models treat "visual grouping" in a product brief as CSS border border-neutral-200, producing cards inside cards, framed messages, framed toolbars, and a frame around every button inside the input. The eye is cut up by countless gray lines.
Claude Desktop's airy, editorial look comes from a strict minimal-border, low-contrast-surface architecture:
Depth of sight: along any line of sight from the main canvas inward, you may cross at most 1 closed rectangular border.
Automatic downgrade inside containers: once an outer container is already a bordered object (such as the Chat Composer, a Modal, or a Code Block), none of its child controls (buttons, input areas, tags, toolbars) may use a closed border again:
Secondary buttons: never border border-neutral-300; use a soft fill based on Surface-2 (bg-neutral-100 hover:bg-neutral-200/80 dark:bg-neutral-800 border-0).
Toolbar buttons and inline actions: must be downgraded to the Ghost variant (fully transparent at rest, bg-transparent border-0, with only a faint background on hover, hover:bg-neutral-100/70).
Inner input field: the text field inside the Composer has no native border or highlight ring at all (border-0 outline-none ring-0 bg-transparent).
Group with whitespace, text hierarchy or plain background color; no outlines that interrupt reading
• AI assistant reply text• User message bubble (#f0f4f8)• All secondary action buttons inside containers• Sidebar / navigation items• Reaction bar under messages• Expanded thinking text
border-0bg-transparent or bg-[#f0f4f8] rounded-[18px]
📦 Mandatory Closed Border
Self-contained objects with their own interaction sandbox, physical objects, or overlays on the Z axis
border border-neutral-200/90 dark:border-neutral-800with a diffuse two-layer shadow
➖ Hairline Divider
For structure inside a container; never nested closed boxes, always a 1px one-sided line
• Seam between a code block's language bar and code area (border-b)• Separation between groups in dropdown and context menus (border-t)• Seam between left and right desktop panes (border-r)• Seam between the Composer input and its bottom toolbar (border-t)
When conversations and code blocks scroll, a typical front-end just overlays a plain opacity gradient, so text is cut off abruptly at the top and bottom. REA v6.5.0 extracted Claude's complete scroll-timeline-driven mask (Scroll-Driven Fade) specification from the production bundle:
Core width: --cds-scroll-fade-size: 28px; (defined as exactly 28px, not an approximate 24px or 32px).
4-Stop Relative Color Fade:
The mask is not a solid color. It uses modern CSS color-mix() and rgb(from ...) to take the current background color and fade it in 4 non-linear steps:
/* Extracted from the real production definition in c6a992d55-sXiDGMFQ.css */--cds-scroll-fade-mask: linear-gradient( to bottom, var(--cds-scroll-fade-strip-color, var(--cds-surface-1)) 0%, rgb(from var(--cds-scroll-fade-strip-color, var(--cds-surface-1)) r g b / .85) 13%, rgb(from var(--cds-scroll-fade-strip-color, var(--cds-surface-1)) r g b / .50) 40%, rgb(from var(--cds-scroll-fade-strip-color, var(--cds-surface-1)) r g b / .15) 70%, transparent 100%);
Combined with the native scroll timeline (scroll-timeline), the mask collapses to zero (0px) when the list is at the top and opens up to 28px once it scrolls away from the top. It runs entirely on the GPU compositor with zero main-thread cost.
Claude Desktop has a 7-step type scale designed for dense information, and uses the desktop optical scale factor --cds-rem-scale: calc(16 / 17) (≈ 0.941176) to scale the web default 17px base smoothly down to an exact 16px on native Retina screens.
Tier (Token)
CSS expression (Rem Scale)
Pixels (Desktop)
Line height (Leading)
Ratio
Main content
caption
calc(0.6875rem * var(--cds-rem-scale))
10.35px (about 11px)
1rem (16px)
1.55
Shortcut badges (Kbd), message timestamps, model version labels, token usage counts
In optics and human perception, bright white text on a black background appears to spread outward (the Irradiation Phenomenon), so text of the same weight looks 10% - 15% heavier in dark mode than in light mode, with swollen, blurry edges.
Claude compensates through its proprietary variable font axis: in dark mode it lowers the weight value by 30 - 40 units, so text looks exactly as thin and sharp to the eye as it does in light mode.
Semantic weight
Light mode weight
Reduced dark mode weight
Compensation and amount
Regular (body text)
font-weight: 400 / "wght" 400
--cds-font-axis-wght: "wght" 360
Thinned by 40 units, removing the glow of pure-white body text
Medium (actions / emphasis)
font-weight: 500 / "wght" 500
--cds-font-axis-wght: "wght" 460
Thinned by 40 units, keeping medium weight crisp
Semibold (titles / identity)
font-weight: 580 / "wght" 580
--cds-font-axis-wght: "wght" 550
Thinned by 30 units, so bold text doesn't smear on dark backgrounds
To stop font sizes and weights from being invented ad hoc or stacked arbitrarily, the table below lists the standard font parameters for every core module of Claude Desktop:
Module
Content element
Font family
Tier / size
Line height
Weight (Light / Dark)
Notes
Conversation (Chat)
Assistant name ("Claude")
Sans
12px
16px
580 / 550 (Semibold)
Stable identity label at the top
Model version badge ("3.7 Sonnet")
Mono
10.5px (Caption)
14px
500 / 460 (Medium)
Pill badge, monospace letters
Message timestamp ("09:42")
Mono
11px (Footnote)
14px
400 / 360 (Regular)
tabular-nums, low-contrast text
Assistant reply (Paragraph)
Sans
14px (Body)
20px (1.428)
400 / 360 (Regular)
text-wrap: pretty; removes orphaned single words
Text in user bubbles
Sans
14px (Body)
20px (1.428)
400 / 360 (Regular)
Tight wrapping, natural line breaks
Message action bar (copy / regenerate buttons)
Sans
12px
16px
500 / 460 (Medium)
Secondary buttons that fade in on hover
Thinking
Thinking toggle ("Thought for 5.2s")
Sans
12px
16px
500 / 460 (Medium)
Includes an inline rotating arrow and live timer
Raw reasoning log (Raw Thought)
Mono
11.5px (Code)
16px (1.39)
400 / 360 (Regular)
Thin monospace stream, no background, muted gray text
Input area (Composer)
Multi-line text input (Textarea)
Sans
14px (Body)
20px (1.428)
400 / 360 (Regular)
Mobile minimum max(16px, 14px)
Placeholder text (Placeholder)
Sans
14px (Body)
20px (1.428)
400 / 360 (Regular)
45% opacity color
Bottom helper action ("+ Add content")
Sans
12px
16px
500 / 460 (Medium)
Compact toolbar button
Model selector dropdown ("Claude 3.7 Sonnet")
Sans
12px
16px
500 / 460 (Medium)
Pill-shaped control
Send button ("Send" / icon)
Sans
12px
16px
580 / 550 (Semibold)
Visual focal weight
Code and Artifacts
Syntax-highlighted code (Code block)
Mono
12px (Code)
17.5px (1.46)
400 / 360 (Regular)
tabular-nums; smooth horizontal scrolling
Inline code (inline code)
Mono
12px (Code)
14px
500 / 460 (Medium)
1px fine border, 3px radius, 1px 4px padding
Artifact card title (Artifact Title)
Sans
13px (Heading)
18px
580 / 550 (Semibold)
Click to open the full-screen artifact drawer
Artifact language tag ("REACT", "HTML")
Mono
10.5px (Caption)
12px
500 / 460 (Medium)
Uppercase monospace, letter spacing letter-spacing: 0.05em
On the web, inline SVGs and icons sit on vertical-align: baseline by default, so the icon's visual center sits noticeably above the x-height of lowercase letters and the cap height of capitals, and the icon looks like it is floating.
Claude enforces dedicated negative-offset utility classes:
.align-[-0.125em] (vertical-align: -0.125em;): for 14px - 16px Body and Heading text. It drops the icon by exactly 1/8em (about 1.75px - 2px), so the icon's center lines up 100% with the letters' visual center.
.align-[-0.075em] (vertical-align: -0.075em;): for 11px - 12px Caption and helper text.
.align-[-1px] / .align-[-2px]: for inline badges in fixed-height (32px/46px) toolbars and title bars.
Balanced heading lines (text-wrap: balance):
All :is(h1, h2, h3, h4) and card titles get text-wrap: balance;, which distributes words across lines so the last line never holds a single lonely word.
No orphans in body text (text-wrap: pretty):
Body paragraphs :is(p, li, dd, blockquote) get text-wrap: pretty;, which prevents a single word being left on the last line (Typographic Runts).
Safe wrapping for long strings and tokens (overflow-wrap: anywhere):
Tooltips that contain very long model IDs (such as claude-3-7-sonnet-20250219-thinking-exp), Git commit hashes or code variable names strictly use:
overflow-wrap: anywhere;word-break: normal;
Normal English and Chinese words stay intact (no forced breaks inside regular words), while overlong strings still wrap safely and never overflow the container.
Claude defines atomic classes bound to each semantic UI role, with a base font size, proportional line height and variable font optical tuning built in:
Semantic class
Size (font-size)
Line height (line-height)
Default weight (font-weight)
Optical tuning (font-variation-settings)
Use
.text-caption-regular
calc(0.6875rem * scale) (about 11px)
calc(1.0625rem * scale) (about 17px)
Regular (400)
"GRAD" 0
Timestamps, small footnotes, tiny badges
.text-caption-medium
calc(0.6875rem * scale) (about 11px)
calc(1.0625rem * scale) (about 17px)
Medium (470 / 460)
"wght" 460 (Dark)
Compact status tags, count badges
.text-caption-bold
calc(0.6875rem * scale) (about 11px)
calc(1.0625rem * scale) (about 17px)
Bold (700 / 660)
"wght" 660 (Dark)
Emphasized small tags, shortcut hints
.text-footnote-medium
calc(0.8125rem * scale) (about 13px)
calc(1.0625rem * scale) (about 17px)
Medium (470 / 460)
"wght" 460 (Dark)
List item subtitles, secondary sidebar text
.text-footnote-semibold
calc(0.8125rem * scale) (about 13px)
calc(1.0625rem * scale) (about 17px)
Semibold (600 / 560)
"wght" 560 (Dark)
Sidebar headers for active conversation groups
.text-body-regular
calc(0.875rem * scale) (about 14px)
calc(1.25rem * scale) (about 20px)
Regular (400)
"GRAD" 0
Standard chat text, settings form text
.text-body-medium
calc(0.875rem * scale) (about 14px)
calc(1.25rem * scale) (about 20px)
Medium (470 / 460)
"wght" 460 (Dark)
Button text, regular interactive links
.text-body-bold
calc(0.875rem * scale) (about 14px)
calc(1.25rem * scale) (about 20px)
Bold (700 / 660)
"wght" 660 (Dark)
Emphasized body text (<b>, <strong>)
.text-heading-regular
calc(0.9375rem * scale) (about 15px)
calc(1.25rem * scale) (about 20px)
Regular (400)
"opsz" 20
Conversation turn headers, small card titles
.text-heading-semibold
calc(0.9375rem * scale) (about 15px)
calc(1.25rem * scale) (about 20px)
Semibold (600 / 560)
"opsz" 20, "wght" 560
Card titles, dialog panel group names
.text-title-medium
calc(1.25rem * scale) (about 20px)
calc(1.75rem * scale) (about 28px)
Medium (500 / 460)
"opsz" 28, "wght" 460
Page-level titles, large settings sections
.text-title-bold
calc(1.25rem * scale) (about 20px)
calc(1.75rem * scale) (about 28px)
Bold (700 / 660)
"opsz" 28, "wght" 660
Primary modal titles
.font-display
2.375rem (38px)
1.2 (45.6px)
Light (wght: 330)
"opsz" 48 (Serif axis)
Large greeting headline on the first screen (Serif Greeting)
Claude uses a specific -webkit-line-clamp scale for cards and bubbles, together with overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical;:
REA's full CSS scan of the official production bundle shows that Claude does not have just 3 generic curves. It tunes a dedicated damping constant for each interaction scenario:
Curve token / expression
Official components
Physical character and visual effect
--cds-ease-swiftcubic-bezier(.16, 1, .3, 1)
Ghost buttons, card hover lift (Ghost/Card Hover)
iOS-style nimble micro-interaction: arrives quickly in 150ms and stops sharply with no trailing motion
--cds-ease-expandcubic-bezier(.19, 1, .22, 1)
Thinking collapse drawer (.timeline-expand)
Smooth expansion for CSS Grid: removes any height step or reflow when expanding from 0fr to 1fr
--cds-ease-entercubic-bezier(.22, 1, .36, 1)
Message entrance dissolve (timeline-block-enter)
From translateY(5px) scale(0.9) blur(4px) to fully sharp and flat