Skip to content

Grubhub Design System

Grubhub's marketing design system: near-black pill CTAs on white-and-cream canvas, Bagoss bold 42px display, aggressively rounded 24–48px card surfaces. Tokens for React, Next.js, and AI coding tools.

Add shadcn.io to your AI agent. · Pro It installs blocks, icons and templates in your design system from a prompt, with Pro.

Set up MCP
Primary
#000000
Typeface
Bagoss Standard
Shape
Soft
Base radius
16px
Colors
8
Type tokens
13
Components
16
Spacing values
8

About

About Grubhub DESIGN.md

Curated by Dov Azencot · Updated May 19, 2026 · Source grubhub.com (opens in a new tab)

Grubhub's marketing page presents a deliberate tension: a brand that built its identity on red-orange energy delivers its homepage on a near-black-and-white structural palette, with food photography doing the chromatic work. The primary CTA ("See what's nearby") uses #1a1a19 — a near-black with the faintest warm undertone — as its fill color. The nav carries no structural accent. Grubhub's familiar red-orange appears in the logo mark at the top left but nowhere else in the captured CSS token system. Where DoorDash runs a saturated red hero and Uber Eats relies on green-tinged brand touches in its app, Grubhub's marketing surface reads as a neutral, photography-led canvas with a near-black ink system.

The DESIGN.md file packages the system into 8 colors tokens drawn from a near-black, white, warm-gray, and warm-cream palette; 13 typography tokens spanning Bagoss across four named weight variants at 12–42px; 6 radius tokens anchored on a 24px default with a 48px half-pill for interactive chips; and 16 components covering the hero search layout, the feature card grid, the restaurant promotion strip, the footer dark band, and the text input with its border-heavy form field treatment.

Feed this file to Claude or Cursor and it reproduces Grubhub's specific moves: near-black pill CTAs rather than a colored fill, generous 24–48px rounding on all card and chip surfaces, a warm-cream section separator (#f8f4f1) that functions like a subtle brand signal without being a declared accent color, and Bagoss medium as the primary interface weight with Bagoss bold reserved for headings only. The one move worth noting before borrowing: the Bagoss family is proprietary to Grubhub; Fira Sans (the fallback in the font stack) or Inter Medium provides the closest open-source substitute at the 14–16px interface sizes.

What makes it distinct

5

  1. Near-black ink over brand colorthe captured CTA and heading system uses #1a1a19, not Grubhub's familiar red-orange; the brand color is present in the logo but absent from the page's structural token system
  2. Bagoss across four named weightsstandard, regular, medium, and bold are distinct font-file variants, not just numeric weight values; the system has more typographic granularity than most food-delivery peers
  3. 24–48px aggressively rounded cardscard surfaces and interactive chips use 24px and 48px rounding, giving the page a soft, approachable character that contrasts with the stark dark CTAs
  4. Warm cream surfacethe below-fold content area uses #f8f4f1, a warm off-white that signals warmth without photography
  5. Address-search as hero primarylike Uber Eats, Grubhub gates restaurant browsing behind a location typeahead, making the search input the above-fold primary interaction

grubhub.com

Live at grubhub.com

A snapshot of the brand in production. Scroll the frame to see the whole page.

Grubhub's website at grubhub.com

Colors

8 colors

Grubhub's system runs on #000000 as its primary voltage, used in 2 of 16 components. Type is set in Bagoss Standard across 13 tokens from 12px to 42px, weights 400–700. Shape language is soft — components average 17px corner radius, with no sharp interactive edges.

Surface

Page and card backgrounds · 2

Text

Headlines, body, captions · 4

Borders & Hairlines

Dividers, outlines, rules · 1

Other

Specialty colors · 1

Typography

13 type tokens

Set in Bagoss Standard across 13 tokens, from 12px to 42px, weights 400–700. Shown in its own stack: where the font isn't installed, the fallback the file names stands in.

  • display-xl42px · weight 700 · lh 48pxThe quick brown fox jumps over the lazy dog
  • display-sm28px · weight 700 · lh 36pxThe quick brown fox jumps over the lazy dog
  • heading-lg24px · weight 400 · lh 32pxThe quick brown fox jumps over the lazy dog
  • heading-md22px · weight 500 · lh 28pxThe quick brown fox jumps over the lazy dog
  • heading-sm20px · weight 500 · lh 24pxThe quick brown fox jumps over the lazy dog
  • subheading16px · weight 500 · lh 19pxThe quick brown fox jumps over the lazy dog
  • body-md14px · weight 400 · lh 20pxThe quick brown fox jumps over the lazy dog
  • body-md-medium14px · weight 500 · lh 20pxThe quick brown fox jumps over the lazy dog
  • button-md16px · weight 500 · lh 22pxThe quick brown fox jumps over the lazy dog
  • label-md16px · weight 500 · lh 22pxThe quick brown fox jumps over the lazy dog
  • caption12px · weight 500 · lh 16pxThe quick brown fox jumps over the lazy dog
  • caption-sm12px · weight 400 · lh 16px · tracking 0.18pxThe quick brown fox jumps over the lazy dog
  • nav-link14px · weight 400 · lh 20pxThe quick brown fox jumps over the lazy dog

Layout

Radii and spacing

7 corner radii and 8 spacing values. Shape language: soft.

Radii

  • none0px
  • xs4px
  • md16px
  • lg24px
  • xl28px
  • pill42px
  • full100px

Spacing

  • xs5px
  • sm8px
  • md12px
  • base16px
  • lg24px
  • xl32px
  • 2xl64px
  • section96px

Components

16 components

Each rendered from its tokens (color, type, radius, padding) on Grubhub's own canvas.

  • Button Primary
    button-primaryButton Primary
  • Button Secondary
    button-secondaryButton Secondary
  • Top Nav
    top-navTop Nav
  • Nav Link
    nav-linkNav Link
  • Hero Heading
    hero-headingHero Heading
  • Section Heading
    section-headingSection Heading
  • Body Paragraph
    body-paragraphBody Paragraph
  • Type here…
    text-inputText Input
  • Search Wrapper
    search-wrapperSearch Wrapper
  • Card
    cardCard
  • Feature Card
    feature-cardFeature Card
  • Editorial Card
    editorial-cardEditorial Card
  • Footer Dark
    footer-darkFooter Dark
  • Footer Link
    footer-linkFooter Link
  • Section Warm
    section-warmSection Warm
  • Form Label
    form-labelForm Label

In use

The system, in use

Grubhub's tokens on the kind of product it builds.

Build something people actually use.

A short paragraph of marketing copy that previews how the brand's display tier and body tier read together. Two sentences is usually enough.

Get startedLearn more
Marketing heroHeadline, sub-copy, primary CTA — the universal homepage opener.
Order summary
Pro plan, annual$290.00
Add-on: SSO$60.00
Tax$24.50
Total$374.50
Payment
Card number
Expiry · CVC
Name on card
Pay $374.50
CheckoutOrder summary + card form — the payment archetype.

FAQ

Grubhub design system FAQ

Common questions about Grubhub's tokens, components, and how to use this DESIGN.md in your project.

Read next

Specs, directories, and component libraries that pair with this design system.

Use it

Use Grubhub in your project

One machine-readable file. Drop it into Claude, Cursor, or any AI tool that reads DESIGN.md.

Download DESIGN.md
  1. Download the DESIGN.md

    One machine-readable file: every color, type, radius, spacing, and component token of Grubhub.

  2. Feed it to your AI tool

    Drop it into Claude, Cursor, or GitHub Copilot. The agent writes React components and Tailwind classes that match Grubhub's visual language.

  3. Reference the tokens directly

    Or paste the values into your Tailwind config, CSS variables, or component library: every color, size and radius is a quoted, ready-to-copy value.

Read the full DESIGN.md: overview, rationale, do’s and don’ts

Overview

Grubhub's marketing site operates under a brand inversion. Ink-over-identity: the red-orange color that defines Grubhub's logos, app icons, and brand advertising is structurally absent from the page's token system — the primary CTA, heading color, input borders, and nav text all use a near-black (#1a1a19, a barely-warm black with a +67° hue nudge). Where most food-delivery brands commit their brand voltage to at least one above-fold CTA fill, Grubhub's marketing surface treats ink black as the primary action color and lets food photography carry the chromatic energy above the fold. The result reads quieter and more content-forward than the brand's advertising identity suggests.

The shape language compensates with maximally soft geometry. Cards use 24px rounding — a value more common in consumer mobile apps than in marketing web pages. The primary CTA pill uses 28px rounding on a 48px-tall button, producing a surface that reads as bubbly rather than sharp. The text input is the system's only sharp element at 4px, creating a deliberate contrast: interactive affordances are soft-rounded while data-entry surfaces are tight. Unlike the binary pill-or-none approach Uber Eats uses, Grubhub holds a graduated scale with distinct stops at 4px, 16px, 24px, 28px, and 42px.

Key Characteristics:

  • Near-black {colors.ink} (#1a1a19) at frequency 177 — not pure black — carries every heading, CTA fill, input border, and nav link. The faint warm undertone at L=0.22 distinguishes it from a true zero-lightness black.
  • 24px as the default card radius and 28px on the primary CTA — the system's most distinctive geometric signal against delivery-category peers that use 8–12px rounding.
  • Bagoss in four named weight variants (standard, regular, medium, bold) — a richer typographic tool than most delivery platforms, which typically run a single weight of a neutral sans.
  • Warm cream {colors.surface-warm} (#f8f4f1) as a section separator — not a declared brand accent but a structural warmth signal used once on an editorial sub-section.
  • Dark footer band: the system's only dark-on-dark surface, using {colors.ink} as the background with white link text in a dense city/cuisine directory grid.
  • Food photography carries the hero's warmth — the page's amber and orange tones come from fried chicken imagery, not CSS color declarations.

Colors

Structural

  • Ink ({colors.ink} — #1a1a19): frequency 177. Used as text (89), border (87), background (1). The dominant color across the entire system — CTA fills, heading text, form input borders, and most link text. A near-black with the faintest warm-green undertone rather than a pure zero-lightness black.
  • Ink Deep ({colors.ink-deep} — #000000): frequency 21. Used as text (11), border (10). A true black that appears in nav links and select border contexts, distinct from the dominant near-black ink.
  • Canvas ({colors.canvas} — #ffffff): frequency 694. Used as text (339), border (337), background (18). The page floor and dominant border tone — the massive border count reflects the form field and card outline system.
  • Shadow ({colors.shadow} — #262626): frequency 16, all as shadow ink. A dark charcoal used exclusively for card box-shadow values — the system's elevation signal.
  • Ink Mid ({colors.ink-mid} — #575655): frequency 15. Used as text (6), background (3), border (6). Secondary text color for labels, captions, and form helper text. A warm mid-gray rather than a neutral.
  • Hairline ({colors.hairline} — #dbd9d7): frequency 5, all as border. Card borders and divider lines — a warm light gray rather than a cool neutral, consistent with the system's warm-canvas approach.
  • Ink Muted ({colors.ink-muted} — #93918f): frequency 1, as border. The lightest ink tone — a warm light gray appearing on tertiary borders.
  • Surface Warm ({colors.surface-warm} — #f8f4f1): frequency 1, as background. A warm off-white used on a single editorial section, the closest thing to a declared brand warmth token in the structural palette.

Typography

Font Families

The system runs Bagoss as its proprietary typeface across all surfaces, with four named font-file variants that go beyond numeric weight declarations: "Bagoss Standard" (the base family at weights 400 and 700), bagoss-medium (the 500-weight interface voice), bagoss-bold (the 700-weight display voice, declared as a separate font file), and bagoss-regular (the 400-weight label context, also a separate file). This four-variant structure provides more granular typographic control than systems that rely on a single variable-weight font. The fallback stack is "Fira Sans", Helvetica, Arial, sans-serif — Fira Sans is the closest openly-licensed substitute.

Hierarchy

TokenSizeWeightLine HeightUse
{typography.display-xl}42px70048pxHero h1 display headline
{typography.display-sm}28px70036pxSection h1 subheadings
{typography.heading-lg}24px40032pxFeature section spans
{typography.heading-md}22px50028pxEditorial section titles
{typography.heading-sm}20px50024pxh5-level card titles
{typography.subheading}16px50019pxh6 feature card titles
{typography.button-md}16px50022pxPrimary button and interactive labels
{typography.body-md}14px40020pxDefault body copy and links
{typography.body-md-medium}14px50020pxEmphasized body copy
{typography.label-md}16px50022pxForm labels
{typography.caption}12px50016pxSmall label chips
{typography.caption-sm}12px40016pxFooter metadata and letter-spaced annotations
{typography.nav-link}14px40020pxTop-nav link text

Note on Font Substitutes

Bagoss is proprietary to Grubhub. Fira Sans (the declared fallback) at weights 400 and 500 is the most direct substitute and transfers well at the 14–16px interface sizes; it shares Bagoss's humanist grotesk structure. Inter at the same weights is a wider-available alternative. For the 42px display tier, Fira Sans Bold approximates the weight confidence of Bagoss Bold.

Layout

Spacing System

  • Base unit: 8px, with 16px as the primary module.
  • Tokens: {spacing.xs} 5px · {spacing.sm} 8px · {spacing.md} 12px · {spacing.base} 16px · {spacing.lg} 24px · {spacing.xl} 32px · {spacing.2xl} 64px · {spacing.section} 96px.
  • Footer padding: 96px top, 64px horizontal — the most generous internal padding interval in the system.
  • Feature card internal padding: 24px — consistent across the 2x2 card grid.
  • CTA padding: 12px vertical, 20px horizontal — producing a 48px-tall button that reads substantial without oversizing.

Grid & Container

  • Hero: split layout with the headline, subtext, and search input on the left and food photography on the right, approximately 50/50 at desktop widths.
  • Feature grid: 2x2 card grid for the four value-proposition panels (Lowest Fees, Dine, Ordering Control, Fast Service), transitioning to full-width editorial cards below.
  • Footer: multi-column dense link grid covering restaurant categories, cuisine types, and cities — the page's highest-information-density surface.

Rhythm

The page moves from an editorial-photo hero into an information grid (2x2 features), then into larger editorial cards (restaurant/courier sign-up), and finally into a full-dark footer. The rhythm is denser and more utilitarian than the hero suggests — the below-fold sections read as category pages within a marketplace rather than brand marketing panels.

Elevation

The system uses box-shadow for card elevation, wired through {colors.shadow} (#262626) at low opacity — 16 shadow occurrences captured, all on card surfaces. Unlike Uber Eats, which uses no meaningful shadow tier, Grubhub explicitly lifts the feature cards above the white canvas with soft black-with-opacity shadows. The dark footer achieves depth through surface-color contrast — the shift from white to near-black ink creates the page's most dramatic tonal transition, with no shadow layer needed.

  • Flat (no shadow): hero, nav, editorial image panels, section bands.
  • Tonal shadow: {colors.shadow} (#262626 at opacity) on feature cards — the 24px-rounded card surfaces sit visibly above the canvas.
  • Surface contrast: the {colors.surface-warm} (#f8f4f1) section and the dark footer band create depth through color shift rather than shadow.

Shapes

The radius scale is graduated-soft, anchored on 24px with distinct stops at every tier:

  • {rounded.none} 0px — not observed in the extraction; structural resets only.
  • {rounded.xs} 4px — applied to the text input field only; the single tight-rounding element in the system.
  • {rounded.md} 16px — secondary card surfaces and inner containers.
  • {rounded.lg} 24px — the dominant card radius (10 occurrences); every feature card, search wrapper, and category chip uses this value.
  • {rounded.xl} 28px — the primary CTA button. At 48px height, this produces a visually pill-like button without reaching the full-circle pill geometry.
  • {rounded.pill} 42px — the largest chip-style elements and modal containers.
  • {rounded.full} 100px — fully circular elements.

The 4px-to-24px gap is the system's sharpest contrast: form inputs are tight while all card and interactive surfaces are generously soft. This creates an implicit hierarchy — data-entry surfaces (inputs) feel precise; browse surfaces (cards, chips) feel inviting.

Components

button-primary — Near-black {colors.ink} fill, white text, {rounded.xl} 28px radius, 12x20px padding, 48px height. "See what's nearby" is the canonical hero instance — the system's primary conversion action.

button-secondary — White {colors.canvas} fill, ink text, 1px ink border, same {rounded.xl} 28px radius. Used for secondary CTAs at equal weight to the primary.

top-nav — White canvas, 56px height, 24px horizontal padding. Houses the Grubhub wordmark and a right-aligned navigation cluster. No visible background tint or border in the capture.

nav-link — Transparent background, ink-deep text at {typography.nav-link} (14px / 400), no padding — the nav links appear tight and minimal without hover backgrounds.

hero-heading — Near-black {colors.ink} text, Bagoss Bold 42px / 700, transparent background. The above-fold h1 ("No delivery or service fees on $50+ restaurant orders").

body-paragraph — Ink text at {typography.body-md} (14px / 400). The workhorse paragraph style.

text-input — White fill, 1px ink-deep border, {rounded.xs} 4px radius, 8x12px padding, 40px height. The system's single tight-cornered interactive element.

search-wrapper — White canvas, {rounded.lg} 24px radius, 12px horizontal padding, 56px height. The outer container for the address typeahead — sits inside the hero as the primary action surface.

card — White canvas, 1px {colors.hairline} border, {rounded.lg} 24px radius, 16px internal padding. The base card surface.

feature-card — White canvas, 1px hairline border, {rounded.lg} 24px radius, 24px padding. The 2x2 value-proposition cards below the hero.

editorial-card — White canvas, 24px rounding, 24px padding. Full-width editorial cards for the restaurant-partner and courier sign-up sections.

footer-dark — Near-black {colors.ink} background, white text, 96x64px padding. Holds the dense multi-column directory grid of categories, cuisines, and city links.

footer-link — Transparent, white text at {typography.body-md}, 3px vertical padding. The individual link in the footer directory grid — top and bottom spacing comes from the 3px 0px padding pattern that appears 115 times in the extraction.

section-warm — Warm cream {colors.surface-warm} background, 32px padding. The single mid-page editorial divider that introduces warmth without photography.

form-label — Transparent background, ink text at {typography.label-md} (Bagoss Bold 16px / 500). Form field labels.

Do's and Don'ts

Do keep the primary CTA background at {colors.ink} (#1a1a19), not the red-orange brand color. The marketing surface has established a near-black CTA system — introducing a colored button fill invents a token that doesn't exist in the extracted page and conflicts with the current visual identity.

Do use 24px as the default radius for any card or chip surface. The system's radius signature is dramatically softer than delivery-category defaults; dropping to 8px or 12px card rounding would make the components read as belonging to a different brand.

Do respect the Bagoss weight hierarchy: Bagoss Bold exclusively for h1/h2 headings and form labels; bagoss-medium for buttons, subheadings, and h5/h6; Bagoss Standard for body copy and nav links. Crossing weight tiers (e.g., using Bagoss Bold for body paragraphs) would break the system's four-variant discipline.

Do use {colors.shadow} (#262626 at low opacity) for card elevation rather than a tinted or colored shadow. The system's 16 shadow occurrences are all neutral dark — no warm or chromatic tinting appears.

Don't use {colors.hairline} (#dbd9d7) as a background fill — it appears only 5 times, all as border-color on cards and dividers. For a warm-tinted background surface, use {colors.surface-warm} (#f8f4f1) instead.

Don't apply the 28px CTA radius to card containers. The {rounded.xl} 28px value is reserved for the primary interactive CTA; card surfaces use {rounded.lg} 24px. Mixing the two radii removes the implicit distinction between "container" and "action."

Don't use {colors.ink-mid} (#575655) for heading or display text — it appears in secondary body contexts and label annotations only. Heading text requires {colors.ink} (#1a1a19) or {colors.ink-deep} (#000000) for sufficient contrast.

Don't introduce a chromatic section band using the brand red-orange as a background fill. The captured system uses only {colors.surface-warm} (one occurrence) for a warm section separator — a saturated color band would contradict the page's deliberate restraint and conflict with the ink-primary CTA system.

Known Gaps

  • Brand red-orange: Grubhub's historical red-orange brand accent is visible in the logo but absent from the marketing page's structural token system. Any red-orange implementation should reference the company's brand guidelines rather than these extracted tokens.
  • Mobile breakpoints: the 2x2 feature grid, hero split, and footer directory are captured at 1440px desktop width. The layout behavior at 375px and 768px would require separate inspection.
  • Hover and focus states: the extraction captures resting states only. Button hover, input focus rings, and link hover treatments are not represented.
  • Restaurant browse surface: the card system for restaurant listings, menu items, ratings, and price indicators belongs to the authenticated delivery UX and is not captured on the marketing landing page.
  • Dark mode: the marketing site is light-only. No dark-mode token variants are exposed on the captured surfaces.
  • Animation and transition: the hero subtext and feature card appear to load with subtle entrance animations. Easing curves and duration values are not captured.
  • Accessibility states: focus rings, aria-selected chip states, and disabled form field styling are not represented in the marketing page capture.

Food & Delivery

More systems like this

More DESIGN.md files in Food & Delivery.

Pricing

Build it with Pro

The DESIGN.md files are free. Pro adds 6,000+ blocks, premium templates and the MCP server, so your AI editor builds in your system for you.

4.9/5 out of 5 · 150+ reviewsfrom 150+ founders and developers.

Billed once a year in USD. Cancel anytime.

Individual

For personal projects & open source

$32instead of $49/mo

$389 billed yearly

  • How many people can use the license.Seats: 1 seat
  • Client work, SaaS products and anything you charge for.Commercial use: Personal & open source only
  • Production-ready React sections: hero, pricing, features, dashboards and more.Pro blocks: 6,000+ blocks
  • Complete multi-page sites you can ship as they are.Templates: All 14 templates
  • React icons from every major library, installable with one command.React icons: 294k+ icons
  • Presets that restyle every block, in light and dark.Themes: All 59 themes
  • Lets your AI editor search, preview and install blocks for you.MCP server: Basic usage
  • Priority requests are answered first.Support: Standard

Team

Most popular

For freelancers, agencies & startups

$66instead of $99/mo

$789 billed yearly · ≈ $13/dev/mo

Everything in Individual, plus

  • How many people can use the license.Seats: Up to 5 seats
  • Client work, SaaS products and anything you charge for.Commercial use: Included
  • Lets your AI editor search, preview and install blocks for you.MCP server: High usage
  • Priority requests are answered first.Support: Priority

Organization

For companies with larger teams

$132instead of $199/mo

$1,589 billed yearly

Everything in Team, plus

  • How many people can use the license.Seats: Unlimited seats
  • Lets your AI editor search, preview and install blocks for you.MCP server: Unlimited usage
  • Secure checkout via Stripe
  • Code lives in your repo
  • Keep what you've shipped if you cancel
  • License terms

Your system, built for you

Every block, template and icon, installed by your AI agent in your design system. The DESIGN.md files stay free.

Get Pro