Apple's web presence is a masterclass in reverent product photography framed by near-invisible UI. Every page is a stack of edge-to-edge product "tiles" — alternating light and dark canvases, each centered on a hero headline, a one-line tagline, two tiny blue pill CTAs, and an impossibly crisp product render. Nothing competes with the product. Typography is confident but quiet; color is either pure white, an off-white parchment, or a near-black tile; interactive elements are a single, quiet blue.
Density is unusually low even by contemporary SaaS standards. Each tile occupies roughly one viewport, and there is no decorative chrome — no borders, no gradients, no decorative frames, no shadows on headlines. Elevation appears only when a product image rests on a surface (a single soft rgba(0, 0, 0, 0.22) 3px 5px 30px drop for visual weight). The result is a catalog that feels more like a museum gallery: the wall disappears and the artifact takes over.
Store and shop surfaces retain the same chassis but switch modes. The product configurator (iPhone 17 Pro, accessories grid) introduces a tight grid of white utility cards at {rounded.lg} (18px) radius with a thin border, paired with a persistent thin sub-nav strip. The environment page leans darker and more editorial. Across all five surfaces the typographic system, spacing rhythm, and the single blue accent are consistent — this is one design language expressed at different volumes.
Key Characteristics:
{colors.primary} — #0066cc) carries every interactive element. No second brand color exists.{rounded.pill}) and compact utility rects ({rounded.sm}).{component.global-nav} + product-specific {component.sub-nav-frosted} with persistent right-aligned primary CTA.Source pages analyzed: homepage, environment, store, iPhone 17 Pro buy page, accessories index. The color system is identical across all five surfaces; only the surface-mode mix differs.
{colors.primary} — #0066cc): The single brand-level interactive color. All text links, all blue pill CTAs ("Learn more", "Buy"), and the focus ring root. This is Apple's quiet but universal "click me" signal. Press state shifts to a slightly darker variant via the active scale transform rather than a hex change.{colors.primary-focus} — #0071e3): A marginally brighter sibling of Action Blue, reserved for the keyboard focus ring on buttons (outline: 2px solid).{colors.primary-on-dark} — #2997ff): A brighter blue used on dark surfaces for in-copy links and inline callouts, where Action Blue would disappear against the tile background.{colors.canvas} — #ffffff): The dominant canvas. Content, utility cards, store tiles, configurator grids.{colors.canvas-parchment} — #f5f5f7): The signature Apple off-white. Used for alternating light tiles, footer region, and the default page canvas in store utility sections. Just different enough from white to create rhythm.{colors.surface-pearl} — #fafafc): A near-white used as the fill for secondary "ghost" buttons — lighter than the parchment canvas so the button still reads as a button against {colors.canvas-parchment}.{colors.surface-tile-1} — #272729): The primary dark-tile surface on the homepage product grid.{colors.surface-tile-2} — #2a2a2c): A micro-step lighter — used where a dark tile sits directly above or below Tile 1 to create the faintest separation.{colors.surface-tile-3} — #252527): A micro-step darker — used at the bottom of the stack and in embedded video/player frames.{colors.surface-black} — #000000): Reserved for true void — video player backgrounds, edge-to-edge photographic overlays, the global nav bar background.{colors.surface-chip-translucent} — #d2d2d7): The base hex of the translucent gray chip used over photography for circular control buttons. In production, applied at ~64% alpha as rgba(210, 210, 215, 0.64).{colors.ink} — #1d1d1f): The voice of every headline, every body paragraph, and the dark utility button's fill. Chosen instead of pure black to keep the page feeling photographic rather than printed.{colors.body} — #1d1d1f): Same hex as ink — Apple uses one near-black tone for all text on light surfaces.{colors.body-on-dark} — #ffffff): All text on dark tiles and on the global nav bar.{colors.body-muted} — #cccccc): Secondary copy on dark tiles where pure white would be too loud.{colors.ink-muted-80} — #333333): Body text on the white Pearl Button surface — slightly softer than pure black.{colors.ink-muted-48} — #7a7a7a): Disabled button text and legal fine-print.{colors.divider-soft} — #f0f0f0): The "border" tone on secondary buttons — functions as a ring shadow rather than a hard line. In production, often applied as rgba(0, 0, 0, 0.04).{colors.hairline} — #e0e0e0): The 1px hairline border on store utility cards and configurator chips.No decorative gradients. Atmospheric depth on product photography (the iPhone 17 Pro camera plate, the Apple Watch bands, AirPods reflections) is inherent to the imagery, not a CSS gradient overlay. The environment page's hero uses photographic atmosphere (mountain vista at dawn) but no gradient tokens are defined. Apple is the rare luxury-brand site with zero gradient-based design tokens.
SF Pro Display, system-ui, -apple-system, sans-serif — Apple's proprietary display face, optimized for sizes ≥ 19px. Defines the voice of every headline.SF Pro Text, system-ui, -apple-system, sans-serif — the text-optimized variant used for body copy, captions, buttons, and links below 20px.font-variant-numeric: numerator is enabled on numeric links (pricing tables, spec sheets). Display sizes rely on tight tracking rather than contextual ligatures.| Token | Size | Weight | Line Height | Letter Spacing | Use |
|---|---|---|---|---|---|
{typography.hero-display} |
56px | 600 | 1.07 | -0.28px | Hero headline; the signature "Apple tight" tracking |
{typography.display-lg} |
40px | 600 | 1.10 | 0 | Tile headlines atop every product tile |
{typography.display-md} |
34px | 600 | 1.47 | -0.374px | Section heads (SF Pro Text at display proportions) |
{typography.lead} |
28px | 400 | 1.14 | 0.196px | Product tile subcopy |
{typography.lead-airy} |
24px | 300 | 1.5 | 0 | Environment-page lead paragraphs (the rare weight 300) |
{typography.tagline} |
21px | 600 | 1.19 | 0.231px | Sub-tile tagline; sub-nav category name |
{typography.body-strong} |
17px | 600 | 1.24 | -0.374px | Inline strong emphasis |
{typography.body} |
17px | 400 | 1.47 | -0.374px | Default paragraph |
{typography.dense-link} |
17px | 400 | 2.41 | 0 | Footer / store utility link lists (relaxed leading) |
{typography.caption} |
14px | 400 | 1.43 | -0.224px | Secondary captions, button text |
{typography.caption-strong} |
14px | 600 | 1.29 | -0.224px | Emphasized captions |
{typography.button-large} |
18px | 300 | 1.0 | 0 | Store hero CTAs (the rare weight 300) |
{typography.button-utility} |
14px | 400 | 1.29 | -0.224px | Utility/nav button labels |
{typography.fine-print} |
12px | 400 | 1.0 | -0.12px | Fine-print, footer body |
{typography.micro-legal} |
10px | 400 | 1.3 | -0.08px | Micro legal disclaimers |
{typography.nav-link} |
12px | 400 | 1.0 | -0.12px | Global nav menu items |
-0.12 → -0.374px). This produces the iconic "Apple tight" headline cadence. Never used at 12px or below.{typography.button-large} at 18px/300 and {typography.lead-airy} at 24px/300). It's not an accident — it's a light-atmosphere cue reserved for moments where the content should feel airy.{typography.tagline} (21px) when a touch more assertion is needed.{typography.dense-link}). The 2.41 is not a bug — it's how the footer's dense link columns breathe.SF Pro is Apple's proprietary system font. When building off-system:
system-ui, -apple-system, BlinkMacSystemFont as the first stack entry — on macOS/iOS/Safari this resolves to the real SF Pro.font-feature-settings: "ss03" approximates SF Pro's rounded "a" character.letter-spacing down by -0.01em on display sizes to re-create the Apple tight feel; Inter's default tracking runs slightly wider than SF Pro.0.03 (from 1.47 → 1.44) when substituting Inter — Inter's taller x-height needs less leading.{spacing.xxs} 4px · {spacing.xs} 8px · {spacing.sm} 12px · {spacing.md} 17px · {spacing.lg} 24px · {spacing.xl} 32px · {spacing.xxl} 48px · {spacing.section} 80px.{spacing.section} (80px) inside a product tile; tiles stack edge-to-edge with 0 gap (the color change provides the break).{spacing.lg} (24px) inside utility grid cards.Apple's whitespace is the product's pedestal. Every tile begins with at least 64px of air above its headline and 48–64px below. Product renders are never crowded; the nearest content to a product image is at least 40px away. The footer is the only area that breaks this — there, Apple goes deliberately dense to make the full information architecture visible at a glance.
| Level | Treatment | Use |
|---|---|---|
| Flat | No shadow, no border | Full-bleed tiles, global nav, footer, body sections |
| Soft hairline | 1px rgba(0, 0, 0, 0.08) border |
Utility cards, sub-nav frosted-glass separator |
| Backdrop blur | backdrop-filter: blur(N) on Parchment 80% |
Sub-nav and the iPhone buy floating sticky bar |
| Product shadow | rgba(0, 0, 0, 0.22) 3px 5px 30px 0 |
Product renders resting on a surface (the only true "shadow" in the system) |
Shadow philosophy. Apple uses exactly one drop-shadow, and it is applied to photographic product imagery — never to cards, never to buttons, never to text. Elevation in the UI comes from (a) surface-color change (light tile ↔ dark tile) and (b) backdrop-blur on sticky bars. The single shadow is about giving the product weight, not about UI hierarchy.
{component.sub-nav-frosted} and {component.floating-sticky-bar} creates a "floating over content" effect that's functional, not decorative.| Token | Value | Use |
|---|---|---|
{rounded.none} |
0px | Full-bleed product tiles (no corner rounding) |
{rounded.xs} |
5px | Inline links when styled as subtle chips (rare) |
{rounded.sm} |
8px | Dark utility buttons (Sign In, Bag), inline card imagery |
{rounded.md} |
11px | White Pearl Button capsules |
{rounded.lg} |
18px | Store utility cards, accessories grid cards |
{rounded.pill} |
9999px | Primary blue pill CTAs, sub-nav buy button, configurator option chips, search input — the signature Apple pill |
{rounded.full} |
9999px / 50% | Circular control chips floating over photography |
{rounded.lg} (18px) radius, light neutral backgrounds, product centered with 20–40px internal padding.{rounded.sm}, {rounded.lg}) appears only on inline card imagery.srcset and sizes across all breakpoints; CDN-optimized WebP.global-nav — Persistent, ultra-thin black nav bar pinned to the top of every page. Background {colors.surface-black}, height 44px, text {colors.on-dark} in {typography.nav-link} (12px / 400 / -0.12px tracking). Links are quiet, spaced ~20px apart, running edge-to-edge across the top. Right-aligned cluster: Search, Bag icons — always visible. On mobile, collapses to hamburger at ~834px and the Apple logo centers.
sub-nav-frosted — Surface-specific nav that sticks below the global nav. Background {colors.canvas-parchment} at 80% opacity with backdrop-filter blur, creating a frosted-glass effect. Height 52px. Content on left: product category name ("iPhone", "Store", "Accessories") in {typography.tagline} (21px / 600). Content right: inline nav links in {typography.button-utility} (14px), ending in a persistent {component.button-primary} ("Buy") or a utility link.
button-primary — The signature Apple action. Background {colors.primary} (Action Blue #0066cc), text {colors.on-primary} in {typography.body} (SF Pro Text 17px / 400), rounded {rounded.pill} (full pill — capsule-shaped), padding 11px × 22px. The full-pill radius IS the brand action signal.
{component.button-primary-active} — transform: scale(0.95) (the system-wide micro-interaction).{component.button-primary-focus} — 2px solid {colors.primary-focus} outline.button-secondary-pill — Used as the second CTA when two blue pills appear together ("Learn more" / "Buy"). Background transparent, text {colors.primary}, 1px solid {colors.primary} border, rounded {rounded.pill}, padding 11px × 22px. Reads as a "ghost pill."
button-dark-utility — Global nav actions (Sign In, Bag, language selector). Background {colors.ink} (#1d1d1f), text {colors.on-dark} in {typography.button-utility} (14px / 400 / -0.224px tracking), rounded {rounded.sm} (8px), padding 8px × 15px. Active state shrinks via transform: scale(0.95).
button-pearl-capsule — Product-card secondary button. Background {colors.surface-pearl} (#fafafc), text {colors.ink-muted-80} in {typography.caption} (14px), 3px solid {colors.divider-soft} border (functions as a soft ring rather than a visible line), rounded {rounded.md} (11px), padding 8px × 14px.
button-store-hero — A larger primary CTA used on store hero surfaces. Same Action Blue + Paper White as {component.button-primary}, but with {typography.button-large} (18px / 300 — note the rare weight 300) and slightly more padding (14px × 28px). Used sparingly on the store landing.
button-icon-circular — Floats over photography. 44 × 44px, background {colors.surface-chip-translucent} at ~64% alpha, icon in {colors.ink}, rounded {rounded.full}. Used for carousel controls, close buttons, and in-image controls (product image thumbnails on the iPhone buy page).
text-link — Inline body links in {colors.primary} (Action Blue). Underlined or non-underlined per context.
text-link-on-dark — Inline body links on dark tiles in {colors.primary-on-dark} (Sky Link Blue #2997ff) — Action Blue would disappear against {colors.surface-tile-1}.
product-tile-light — Full-bleed light tile. Background {colors.canvas} (white), text {colors.ink}, rounded {rounded.none} (0 — tiles touch edges), vertical padding {spacing.section} (80px). Centered stack: product name in {typography.display-lg} (40px / 600) → one-line tagline in {typography.lead} (28px / 400) → two {component.button-primary} CTAs ("Learn more" / "Buy") → product render resting on the surface with the system shadow.
product-tile-parchment — Same as {component.product-tile-light} but on {colors.canvas-parchment} (#f5f5f7). Used to break two consecutive white tiles.
product-tile-dark — Full-bleed dark tile. Background {colors.surface-tile-1} (#272729), text {colors.on-dark}, rounded {rounded.none}, vertical padding {spacing.section} (80px). Same content stack as the light tile but with {component.text-link-on-dark} for inline copy and {component.button-primary} (Action Blue still works on the dark surface). Used on the homepage product grid as the alternating dark band.
product-tile-dark-2 — Variant on {colors.surface-tile-2} (#2a2a2c). Used where a dark tile sits directly above or below {component.product-tile-dark} to create the faintest separation through micro-step lightness change.
product-tile-dark-3 — Variant on {colors.surface-tile-3} (#252527). Used at the bottom of the stack and in embedded video/player frames.
store-utility-card — Used in store grid and accessories grid. Background {colors.canvas} (white), 1px solid {colors.hairline} border, rounded {rounded.lg} (18px), padding {spacing.lg} (24px). Top: product image (1:1 crop with {rounded.sm} (8px) inner image radius). Below: product name in {typography.body-strong} (17px / 600), price in {typography.body} (17px / 400), and a {component.text-link} ("Buy" or "Learn more"). No shadow by default; product render itself carries the system product-shadow.
configurator-option-chip — Pill-shaped tappable cell used in the iPhone 17 Pro buy page. Background {colors.canvas}, text {colors.ink} in {typography.caption}, rounded {rounded.pill}, padding 12px × 16px. Contains a small product thumbnail + label + price delta. Arranged in a grid of 4–5 options per row.
configurator-option-chip-selected — Selected state. Border upgrades to 2px solid {colors.primary-focus}. Same shape, same content.
environment-quote-card — A photographic-canvas hero specific to the environment page. Dark photographic backdrop (mountain vista at dawn) with {colors.surface-tile-1} as the fallback color, centered white-text headline in {typography.display-lg} (40px), small green "Apple 2030" pictographic logo above the headline, single {component.button-primary} below. Padding {spacing.section} (80px).
floating-sticky-bar — Floats at the bottom of the viewport on the iPhone 17 Pro buy page during scroll. Background {colors.canvas-parchment} at 80% opacity with backdrop-filter: blur(N), height 64px, padding 12px × 32px. Left: running price total in {typography.body}. Right: {component.button-primary} ("Add to Bag").
search-input — The accessories search input. Background {colors.canvas}, text {colors.ink} in {typography.body} (17px), 1px solid rgba(0, 0, 0, 0.08) border, rounded {rounded.pill} (full pill — search is also pill-shaped, matching the CTA grammar), padding 12px × 20px, height 44px. Leading icon: search glyph at 14px, muted tint.
Error and validation states were not surfaced in the analyzed pages.
footer — Background {colors.canvas-parchment} (#f5f5f7), text {colors.ink-muted-80}. Link columns in {typography.dense-link} (17px / 400 / 2.41 line-height — the relaxed leading is what makes the dense columns scannable). Column headings in {typography.caption-strong} (14px / 600). Legal row at the very bottom in {typography.fine-print} (12px / 400) with {colors.ink-muted-48} text. Vertical padding 64px.
{colors.primary} (Action Blue #0066cc) for every interactive element — links, pill CTAs, focus signals — and nothing else. The single accent is non-negotiable.{typography.hero-display} or {typography.display-lg} with negative letter-spacing (-0.28 → -0.374px) to get the signature "Apple tight" cadence.{typography.body} (17px / 400 / 1.47 / -0.374px) — not 16px. The extra pixel defines the brand's reading pace.{component.product-tile-light} (or parchment) and {component.product-tile-dark} for full-bleed section rhythm. The color change IS the divider.{rounded.pill} for the primary blue CTA and any other element that should read as an "action" (configurator chips, search input, sticky bar CTA).rgba(0, 0, 0, 0.22) 3px 5px 30px) only to product renders resting on a surface — never on cards, buttons, or text.transform: scale(0.95) as the active/press state on every button — it's the system-wide micro-interaction.{colors.surface-black} (true black) — it's the only place pure black appears on most pages.{colors.primary} (Action Blue).{rounded.sm} for compact utility, {rounded.lg} for utility cards, {rounded.pill} for pills, and nothing in between (except the rare {rounded.md} Pearl Button).{colors.primary-on-dark} (Sky Link Blue) on light surfaces — it's the dark-tile-only variant. Action Blue is for light surfaces.| Name | Width | Key Changes |
|---|---|---|
| Small phone | ≤ 419px | Single-column tiles; sub-nav collapses to category name + primary CTA only; hero typography drops to 28px |
| Phone | 420–640px | Single-column stack; product renders scale to 80% of tile width; hero h1 drops to 34px |
| Large phone | 641–735px | Tiles transition to tighter padding (48px vertical vs 80px); fine-print wraps |
| Tablet portrait | 736–833px | Global nav collapses to hamburger; sub-nav hides category chips, keeps primary CTA |
| Tablet landscape | 834–1023px | Global nav returns fully expanded; 3-column utility grids become 2-column |
| Small desktop | 1024–1068px | Product tiles use 2/3 width with margin gutters; hero h1 stays at 40px |
| Desktop | 1069–1440px | Full layout; 4–5 column store grids; 1440px content max |
| Wide desktop | ≥ 1441px | Content locks at 1440px, margins absorb extra width |
The structural breakpoints that matter for agents: 1440px (content lock), 1068px (small-desktop), 833px (tablet landscape switch), 734px (tablet portrait), 640px (phone), 480px (small phone).
{component.button-primary} lands at ~44 × 100px (with the full-pill radius making the visible hit area more generous than the label suggests).{component.button-icon-circular} is exactly 44 × 44px.{typography.hero-display} (56px) → {typography.display-lg} (40px) at 1068px → 34px at 640px → 28px at 419px.srcset with breakpoint-matched crops.{component.product-tile-dark}, {component.search-input}).-active, -focus, -2, -3) live as separate entries in components:.{token.refs} everywhere — never inline hex.rgba(0, 0, 0, 0.22) 3px 5px 30px) is reserved for product photography only.{colors.surface-black}; interior player controls are not documented (they're a platform widget, not a web-design token).{component.environment-quote-card} describes the structural surface only.{component.sub-nav-frosted} and {component.floating-sticky-bar} is platform-dependent; production CSS uses saturate(180%) blur(20px) as a typical baseline but the value isn't formalized as a token.