Tubi

Tubi's iOS app is built around a single, unmistakable idea: free movies and TV, paid for by ads, presented like a premium streamer.

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

20tokens
10type steps
3radius steps
14pxspacing base

Tubi, in one page

Tubi's iOS app is built around a single, unmistakable idea: free movies and TV, paid for by ads, presented like a premium streamer. The canvas is a deep indigo-black (#0A0A2A) — not the neutral near-black of Netflix or the warm charcoal of Apple TV, but a cool, slightly violet darkness that exists specifically so Tubi's signature purple→magenta gradient (#7408FF → #FF00FF) can glow against it. That gradient is the entire brand. It runs through the lowercase tubi wordmark, the focus and selection states, the active bottom-tab icon, continue-watching progress bars, and the secondary CTAs. Where most streaming apps pick one accent color, Tubi picks a *spectrum*, and the whole UI is engineered to make that spectrum sing.

The signature screen is the Home feed: a near-full-width featured hero at the top (a single big title with a gradient/photo backdrop, a "Tubi Original" or genre badge, title, metadata line, and a white Play Free button), followed by a vertical stack of horizontally-scrolling poster rows — "Continue Watching", "Trending Now", "Free Movies You'll Love", "Leaving Soon", genre rails, and so on. Posters are tall 2:3 cards, densely packed (3.4 visible per row on a 390pt screen), each carrying a small yellow "FREE" tag in the corner. This density is deliberate: Tubi's entire pitch is *catalog breadth at zero cost*, so the UI shows as many titles as possible per screen. The other signature surface is the Title Detail page — a full-bleed backdrop, a giant title, a prominent white Play button, "+ My List", a synopsis, cast, and "More Like This" rails — and the Live TV guide, an EPG-style channel grid for Tubi's free linear channels.

The atmosphere is energetic, youthful, and unapologetically commercial. Tubi leans into the fact that it's ad-supported rather than hiding it: the yellow "FREE" badge is a *feature*, not an apology. Motion is punchy — posters scale slightly on focus, the hero cross-dissolves between featured titles, and the gradient shimmers subtly behind the wordmark on launch. Typography is a tight geometric grotesque (Inter is the closest free analog to Tubi's custom face): heavy weights (800–900) for titles, clean 400 body, all-caps tracked labels for badges. The result reads like a neon-lit movie marquee rebuilt for a phone — bold, saturated, and proudly free.

Key Characteristics:

Do's and don'ts

Do

  • Use the deep indigo-black canvas (#0A0A2A) — cool and slightly violet, NOT neutral black
  • Make the purple→magenta gradient (#7408FF → #FF00FF) the brand signature — wordmark, focus, active tab, progress, secondary CTA
  • Keep the primary Play button pure white (#FFFFFF) with indigo-black text — it must out-contrast everything
  • Put the yellow #FFD400 "FREE" tag on posters — it's a feature, lean into "free"
  • Pack poster rows densely (3+ visible, 10pt gutters) — catalog breadth is the pitch
  • Use heavy title weights (800–900) with tight negative tracking — marquee feel
  • Bleed poster rows off the right edge — signals "keep scrolling, there's more"
  • Use ALL-CAPS tracked labels for badges/tags only (FREE, TUBI ORIGINAL, NEW)
  • Render the Live TV EPG with sticky time header + gradient-marked "On Now" blocks
  • Give focused posters a gradient ring + 1.04 scale (lit-by-brand)
  • Use cool lavender-grey (#B9B9D6) for metadata, not neutral grey

Don't

  • Don't add a light mode — Tubi is dark-only; defer to OS for system sheets
  • Don't use a neutral or warm dark canvas — the indigo-violet base is what makes the gradient glow
  • Don't replace the gradient with a single flat purple for brand moments — the spectrum *is* the identity
  • Don't hide or shrink the "FREE" tag — it's core messaging, never an apology
  • Don't make poster rows sparse/airy — density communicates the value prop
  • Don't set titles below 700 weight — heavy display weight is the brand
  • Don't tint the primary Play button — it stays white for max contrast
  • Don't use the gradient as body text or large fills behind reading copy — it's for marks, accents, focus
  • Don't add positive tracking to titles/body — only badges are tracked/uppercased
  • Don't use light shadows — they vanish on the dark canvas; go deep (0.45–0.6) or use the gradient glow
  • Don't animate aggressively in content rows — motion is punchy but brief (120–400ms)

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

Colors:
- Tubi Purple: #7408ff
- Tubi Magenta: #ff00ff
- Tubi Violet: #a12bff
- Tubi Pink: #ff4fd8
- Play White: #ffffff
- Play White Pressed: #e6e6f2
- Canvas Indigo-Black: #0a0a2a
- Surface 1: #15153d
- Surface 2: #1e1e52
- Surface 3: #262666

Type:
- families: Inter, Archivo, Archivo Black, Display Alternative
- scale: 10, 11, 12, 13, 15, 16, 18, 22, 28
- weights: 400, 500, 600, 700, 800, 900

Shape:
- radius: 8, 10, 18
- elevation: Shadow: `0 6px 16px rgba(0,0,0,0.45)`

Spacing: 14

Rules:
- Use the deep indigo-black canvas (`#0A0A2A`) — cool and slightly violet, NOT neutral black
- Make the purple→magenta gradient (`#7408FF` → `#FF00FF`) the brand signature — wordmark, focus, active tab, progress, secondary CTA
- Keep the primary Play button pure white (`#FFFFFF`) with indigo-black text — it must out-contrast everything
- Put the yellow `#FFD400` "FREE" tag on posters — it's a feature, lean into "free"
- Pack poster rows densely (3+ visible, 10pt gutters) — catalog breadth is the pitch
- Use heavy title weights (800–900) with tight negative tracking — marquee feel

Avoid:
- Don't add a light mode — Tubi is dark-only; defer to OS for system sheets
- Don't use a neutral or warm dark canvas — the indigo-violet base is what makes the gradient glow
- Don't replace the gradient with a single flat purple for brand moments — the spectrum *is* the identity
- Don't hide or shrink the "FREE" tag — it's core messaging, never an apology
- Don't make poster rows sparse/airy — density communicates the value prop
- Don't set titles below 700 weight — heavy display weight is the brand

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

The specification

Colour paletteRead the full spec

Primary (Brand Gradient & Interactive)

  • Tubi Purple (#7408FF): Gradient start — wordmark, focus rings, active states, progress fill start.
  • Tubi Magenta (#FF00FF): Gradient end — wordmark, active tab icon, progress fill end.
  • Tubi Violet (#A12BFF): Mid-gradient stop / solid violet for single-color uses (chips, links on light press).
  • Tubi Pink (#FF4FD8): Tappable text links, "More Like This", inline actions.
  • Play White (#FFFFFF): Primary Play / Play Free button background — the highest-priority CTA.
  • Play White Pressed (#E6E6F2): Pressed state of the white play button.

Canvas & Surfaces (Dark — the only mode)

  • Canvas Indigo-Black (#0A0A2A): Primary app background.
  • Surface 1 (#15153D): Cards, sheets, the title-detail panel, settings rows.
  • Surface 2 (#1E1E52): Elevated surfaces, pressed rows, search field, chips.
  • Surface 3 (#262666): Highest elevation — modals, popovers, focused poster lift.
  • Divider (#2A2A5C): Hairline separators between sections and list rows.
  • Overlay Scrim (rgba(10,10,42,0.95)): Bottom gradient over the hero backdrop for text legibility.

Text

  • Text Primary (#FFFFFF): Titles, body, primary content.
  • Text Secondary (#B9B9D6): Metadata lines, synopsis, secondary labels — a cool lavender-grey.
  • Text Tertiary (#7A7AA0): Disabled, timestamps, very low-emphasis captions.
  • Text On-White (#0A0A2A): Text on the white Play button (the indigo-black canvas color).

Semantic & Accent

  • Free Tag Yellow (#FFD400): The "FREE" badge on posters and the hero — Tubi's signature warm accent. Text on it is #1A0A2A.
  • Success Green (#1FD17B): "Added to My List" confirmation, download-complete.
  • Error Red (#FF4A6E): Playback errors, failed sign-in, destructive confirms.
  • Live Red (#FF3B5C): "LIVE" indicator dot on Live TV channels.
  • Rating Amber (#FFB020): Star ratings / IMDb-style score chips.

Gradient Tokens

TokenDefinitionUse
gradient/brandlinear-gradient(135deg, #7408FF 0%, #FF00FF 100%)Wordmark, secondary CTA, active tab, "Tubi Original" badge
gradient/progresslinear-gradient(90deg, #7408FF 0%, #FF00FF 100%)Continue-watching progress fill
gradient/focuslinear-gradient(135deg, #7408FF, #FF00FF) as 2pt ringFocused / selected poster outline
gradient/hero-scrimlinear-gradient(180deg, transparent 40%, rgba(10,10,42,0.95) 100%)Bottom fade on hero & detail backdrops

Note on Theme

Tubi ships dark-only. There is no light mode toggle; the indigo-black canvas is the brand environment. Do not invent a light palette — if a light surface is ever needed (e.g., a system share sheet), defer to the OS, not a Tubi-themed light scheme.

Type scaleRead the full spec

Font Family

  • Primary: Inter (by Rasmus Andersson, SIL OFL) — the closest free analog to Tubi's custom geometric grotesque. Tubi's brand face is a tight, slightly condensed sans with heavy display weights; Inter at weights 800–900 reproduces the marquee feel.
  • Display Alternative: Archivo or Archivo Black (Google Fonts, SIL OFL) — for extra-punchy hero titles if a more condensed display face is wanted.
  • Fallback Stack: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'SF Pro Text', 'Segoe UI', Roboto, Helvetica, Arial, sans-serif
  • Numerals: Tabular figures for runtime/metadata (1h 52m), proportional elsewhere.

Hierarchy

RoleFontSizeWeightLine HeightLetter SpacingNotes
Hero TitleInter32pt9001.0-0.6ptFeatured title on Home hero — heaviest weight
Detail TitleInter28pt8001.05-0.5ptTitle on the Title Detail page
Row HeaderInter22pt8001.1-0.3pt"Trending Now", "Continue Watching" rail headers
Section TitleInter18pt7001.2-0.2ptSub-section headers, settings group titles
BodyInter16pt4001.50ptSynopsis, descriptions, body copy
Card TitleInter15pt6001.150ptPoster captions, list-row titles
Button LabelInter15pt8001.00ptPlay / Register / CTA text
MetaInter13pt5001.30pt"2024 · Thriller · 1h 52m · TV-MA"
CaptionInter12pt5001.30ptTimestamps, fine print, episode counts
Badge / TagInter11pt7001.00.4pt"TUBI ORIGINAL", "FREE", "NEW" — ALL CAPS
Tab LabelInter10pt6001.00.1ptBottom tab labels

Principles

  • Weight is the brand: Tubi titles are *heavy* (800–900). The contrast between a 900 hero title and 400 body is the primary hierarchy signal — never set titles below 700.
  • ALL CAPS for badges only: Genre/Original/FREE badges and tags are uppercase with positive tracking (+0.4pt). Body and titles are sentence case, never tracked positive.
  • Tight display tracking: Hero and detail titles use negative letter-spacing (-0.5 to -0.6pt) for a dense, condensed marquee look.
  • Cool lavender secondary: Metadata uses #B9B9D6 (a cool lavender-grey), not neutral grey — it harmonizes with the indigo canvas.
  • Tabular numerals for time: Runtimes, "min left", and clock times use tabular figures so rows don't jitter.
  • Dynamic Type: Titles, body, synopsis scale; badge text, tab labels, and progress labels stay fixed (layout-sensitive).
Components and layoutRead the full spec

Buttons

Primary Button (Play / Play Free)

  • Shape: Rounded rectangle, 8pt corner radius
  • Background: #FFFFFF (Play White) — the single highest-contrast CTA
  • Text + leading play glyph: #0A0A2A (canvas indigo-black), Inter 15pt weight 800
  • Height: 48pt; padding 14pt vertical, 30pt horizontal; leading SF play.fill 13pt
  • Pressed: background #E6E6F2 + scale 0.98
  • Full-width variant on Title Detail; inline width on hero

Secondary Button (Register / Sign Up / Upgrade)

  • Background: gradient/brand (linear-gradient(135deg, #7408FF, #FF00FF))
  • Text: #FFFFFF, Inter 15pt weight 800
  • Corner radius: 8pt; height 48pt
  • Pressed: filter: brightness(0.92) + scale 0.98

Tertiary Button (+ My List / Share / Download)

  • Background: rgba(255,255,255,0.10)
  • Border: 1pt rgba(255,255,255,0.25)
  • Text + icon: #FFFFFF, Inter 14pt weight 700
  • Corner radius: 8pt; height 44pt; on-detail often icon-over-label stacked (icon 22pt, label 11pt)
  • Pressed: background rgba(255,255,255,0.18)

Text Button (More Like This / See All / Cast & Crew)

  • Font: Inter 14pt weight 700
  • Color: #FF4FD8 (Tubi Pink)
  • No background, no underline
  • Pressed: opacity 0.7

Icon Button (top bar: download, search, profile)

  • 24pt glyph in 44pt hit area
  • Default #FFFFFF; no background
  • Active/selected tints to magenta #FF00FF

Core Atoms

Poster Card (the core content unit)

  • Aspect ratio: 2:3 (e.g., 100×150pt on a 390pt screen, ~3.4 visible per row)
  • Corner radius: 10pt
  • Shadow: 0 6px 16px rgba(0,0,0,0.45)
  • Leading-top FREE tag: #FFD400 bg, #1A0A2A text, 8pt, weight 900, 2×5pt padding, 3pt radius
  • Optional bottom caption overlay: title 11pt weight 700 #FFFFFF with text-shadow: 0 1px 4px rgba(0,0,0,0.8)
  • In-progress variant: 4pt gradient/progress bar pinned to the card's bottom edge
  • Focused/selected: 2pt gradient/focus ring + scale 1.04 (150ms)

Featured Hero

  • Height: ~230–300pt (≈ 60% of viewport width tall)
  • Full-bleed backdrop image/gradient, corner radius 18pt (inset 14pt from screen edges) or full-bleed on Detail
  • gradient/hero-scrim bottom fade for text legibility
  • Top-left badge: "TUBI ORIGINAL" / genre — gradient/brand pill, 9pt weight 800 caps
  • Stacked: title (32pt/900) → meta line (11pt/500 #B9B9D6) → button row (white Play Free + circular + add)
  • Auto cross-dissolves between 4–6 featured titles every ~6s (400ms fade)

Row Header

  • Title 22pt weight 800; optional trailing "See All ›" in #FF4FD8 13pt weight 700
  • 16pt horizontal inset, 10pt bottom gap before the poster strip

Free Tag / Badge Chip

  • "FREE": #FFD400 fill, #1A0A2A text — the signature
  • "TUBI ORIGINAL": gradient/brand fill, white text
  • "NEW" / "LEAVING SOON": #1E1E52 fill, #FF4FD8 text
  • All: 11pt weight 700 caps, +0.4pt tracking, 3pt radius, 2×6pt padding

Navigation

Bottom Tab Bar

  • Height: 56pt + safe-area home indicator
  • Background: rgba(10,10,42,0.96) with backdrop-filter: blur(20px) saturate(180%), 0.5pt top border #2A2A5C
  • Tabs (5): Home, Search, Live TV, My List, Account
  • Icon size: 22pt; label Inter 10pt weight 600
  • Active: icon + label in #FF00FF (magenta), icon filled
  • Inactive: #7A7AA0
  • No pill indicator — color + fill change only

Top Bar (Home)

  • Height: 44pt + safe area
  • Leading: tubi gradient wordmark (≈22pt cap height)
  • Trailing: download, search, profile icons (24pt, #FFFFFF, 16pt gap)
  • Transparent over hero; gains #0A0A2A background after scroll-past-hero

Title Detail Nav

  • Transparent over backdrop; back chevron top-left (#FFFFFF, 24pt, in a 32pt circular rgba(0,0,0,0.4) scrim)
  • Trailing: cast / share icons

Input Fields

Search Bar

  • Height: 44pt
  • Background: #1E1E52
  • Corner radius: 10pt
  • Leading magnifyingglass 16pt #7A7AA0
  • Placeholder "Search movies, shows, channels" 14pt #7A7AA0
  • Text: #FFFFFF 15pt
  • Focus: 1.5pt #7408FF border

Search Results Grid

  • 3-column poster grid, 10pt gutter, 16pt screen inset, FREE tag on each

Distinctive Components

Live TV EPG Guide

  • Vertical list of channel rows; each row: leading 56pt channel logo tile (#15153D bg, 10pt radius) + channel name (15pt/600) + a horizontally-scrolling timeline of program blocks
  • Program block: #1E1E52 fill, 10pt radius, 8pt padding, program title 13pt/600 + time range 11pt/500 #B9B9D6
  • "On Now" block: gradient/brand left border (3pt) + faint gradient wash; leading #FF3B5C "LIVE" dot
  • Sticky time-header strip across the top (every 30 min), #7A7AA0 11pt
  • Tapping "On Now" → full-screen player; tapping future block → reminder/detail sheet

Continue-Watching Card

  • Poster with a 4pt gradient/progress bar at the bottom edge (width = % watched)
  • Below caption: "41 min left" or "S2:E4" in 12pt #B9B9D6
  • Long-press → "Remove from Continue Watching" context sheet

Tubi Original Badge

  • Pill: gradient/brand fill, white "TUBI ORIGINAL" text 9pt weight 800 caps, top-left of hero/poster

Ad Marker (player)

Responsive behaviourRead the full spec

Device Sizes

DeviceWidthKey Changes
iPhone SE (3rd gen)375ptHero ~210pt tall; ~3.2 posters/row; tab labels stay 10pt
iPhone 13/14/15390ptStandard layout; hero ~230pt; ~3.4 posters/row
iPhone 15/16 Pro393ptDynamic Island accommodated; top bar respects it
iPhone 15/16 Pro Max430ptHero ~260pt; ~3.8 posters/row; larger hero title (34pt)
iPad (portrait)768ptFull-width hero (title 36pt); 5-column poster grids; 2-up rows
iPad (landscape)1024pt+Cinematic full-width hero (title 40pt); 6-column grids; Live TV guide shows more channels

Dynamic Type

  • Hero/detail titles, row headers, body, synopsis: full scale
  • Badge text, tab labels, progress labels, ad-marker chip, EPG time header: FIXED (layout-sensitive)
  • Poster captions: scale to L only, then truncate with ellipsis

Orientation

  • Phone: portrait-locked for browse; player rotates to landscape (and supports fullscreen landscape)
  • iPad: all orientations; landscape gets the cinematic wide hero
  • Live TV player: landscape fullscreen with overlaid guide drawer

Touch Targets

  • Poster card: full card tappable (min 100×150pt)
  • Tab bar icons: 22pt glyph, 56pt row height, full-segment tap
  • Play button: 48pt tall
  • Top-bar icons: 24pt glyph, 44pt hit
  • EPG program block: min 44pt tall, full block tappable

Safe Area Handling

  • Top: top bar + hero respect safe area and Dynamic Island; backdrop bleeds *under* the status bar
  • Bottom: tab bar respects home indicator; player chrome insets controls above it
  • Sides: 16pt content inset; hero backdrop bleeds to screen edges (Detail) or 14pt inset (Home)
  • Player: controls avoid notch in landscape

Drop-in CSS variables

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

body.theme-tubi {--page-bg: #0a0a2a;
  --page-bg-gradient: none;
  --text-color: #ffffff;
  --heading-color: #ffffff;
  --link-color: #a158ff;
  --link-hover-color: #8425ff;
  --border-color: #363650;
  --card-bg: #0a0a2a;
  --card-shadow: 0 1px 2px rgba(255,255,255,0.06);
  --card-hover-shadow: 0 6px 18px rgba(255,255,255,0.12);
  --header-bg: #1e1e3b;
  --header-text-color: #ffffff;
  --header-shadow: none;
  --footer-bg: #0a0a2a;
  --footer-text-color: #a9a9b4;
  --button-bg: #7408ff;
  --button-text-color: #ffffff;
  --button-hover-bg: #5d00d4;
  --button-border: none;
  --button-border-radius: 10px;
  --button-secondary-bg: #191937;
  --button-secondary-text-color: #ffffff;
  --button-secondary-hover-bg: #272744;
  --button-secondary-border: 1px solid #363650;
  --prompt-bg: #161635;
  --prompt-text-color: #ffffff;
  --base-font: var(--font-inter);
  --heading-font: var(--font-inter);
  --card-border-radius: 10px;
}

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/video/tubi/DESIGN.md · 26.0 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.