DCL Booking Experience

DCL Booking Experience

OUTCOME

Reimagined the Disney Cruise Line booking experience to help users make faster, more confident decisions through clearer filtering, comparison, and itinerary planning.

FEATURES

Active Filter Chips, Pin-to-Compare, Comparison Modal, Itinerary Decision Tool, Reusable Component Library, Semantic Token Theming, Desktop/Mobile Parity, Developer Handoff, Live Prototype

The Problem

The live Disney Cruise Line booking flow asks people to choose from 467 cruises with no clear hierarchy, so the journey starts in decision paralysis. There's no way to compare sailings side-by-side, itinerary details are buried at the exact moment people need them, and active filters disappear from view, so users lose their search context halfway through. Walking the flow end-to-end surfaced 22 friction points, each rated for severity.

The Solution

Decisions before pixels. I clustered the friction into five journey beats (discover, compare, decide, personalize, checkout) and wireframed the five highest-impact screens in greyscale before touching color. Then, instead of inventing a new look, I read the brand that already existed: I audited the live site for color, type, spacing, and imagery, and used AI to extract those into reusable components and tokens. That let me organize and build out the full system and screens far faster than a manual rebuild. The result is five redesigned screens running on one shared library.

Figma Components
Lofi Wireframes
Hifi Wireframes

The Product

The DCL Booking System is a complete, reusable design system plus five high-fidelity screens, all built from the live Disney Cruise Line brand. It turns a sprawling catalogue into a guided path toward one confident booking decision.

Underneath the screens sit 75 token primitives and 58 semantic aliases, so every fill, stroke, and radius points to a named variable with zero hardcoded values. Comparison, which the live site never offered, becomes a first-class moment through a new Comparison Modal. The same tokens and the same components power both desktop and mobile, so there's no second design system to maintain.

Key Features

Designing for better decisions

Live DCL site

The live Disney Cruise Line listing page
  • 467 cruises, no filter hierarchy — decision paralysis from the start
  • No way to compare options side by side
  • Itinerary details buried; key info missing at the decision point
  • Active filters invisible; users lose search context mid-browse

Redesigned system

The redesigned listing with filter chips and comparison tray
  • 467 results made scannable with filter chips
  • Persistent comparison tray across screens
  • Itinerary surfaced at listing level
  • Active filters always in context
primitives
75
semantic aliases
58
components
11
screens, desktop & mobile
5

Wireframes — decisions before pixels

Catalogue the pain

Walked the live booking flow end to end. 22 friction points, severity-rated low to high.

Friction log of the live DCL booking flow
  • 22 friction points logged
  • Low-to-high severity rating
  • Linked to evidence screenshots

Cluster, then route

Grouped friction into journey beats — discover, compare, decide, personalise, checkout. Each beat asks one question.

Information architecture for the redesigned flow
  • 5 journey beats from 17 frictions
  • One decision per screen
  • Comparison promoted to a first-class moment
  • Itinerary reframed as a decision tool

Sketch the answer

Wireframed the five high-impact screens in greyscale only, locking the IA before any colour.

Low-fidelity wireframes
  • Listing with persistent filters
  • Compare drawer and 3-up modal
  • Itinerary as a decision tool

Foundations — read what's there before you redraw it

Listen, don't draw

Scraped the live DCL site for colour, type, spacing and imagery. The brand has a voice; start as a listener, not a redrawer.

The live DCL listing page, audited for colour, type and spacing
  • Colour palette extraction
  • Display and body type sampling
  • Spacing and grid audit
  • Imagery library logged

75 primitives

Turned observations into a token graph: colour ramps, spacing scales, type ramp, radii. All primitives, all named.

The 75 primitive tokens
  • Colour ramps (navy / cyan / neutral / Halloween)
  • Spacing scale 4 → 96
  • Type ramp 12 → 32
  • Radii, strokes and feedback states

One swap, every screen

Layered 58 semantic aliases on top — color/action/primary, color/text/price-best, color/feedback/*. A brand swap becomes one variable.

Semantic token aliases
  • 58 semantic aliases on top of 75 primitives
  • color/text/price-best introduced as a first-class concept
  • Halloween theme pre-wired (a one-variable swap)

Components — 11 components, zero hardcoded values

Smallest reusable units

Single-purpose atoms. Every fill, stroke and radius bound to a semantic alias. Zero hardcoded hex.

The atom layer of the component library
  • Button · Input · FilterChip
  • Stepper · Switch · Checkbox
  • StatusPill · Tag · Badge
  • Divider · Icon · Image

Compose, don't redraw

Modules made from atoms. CruiseCard exposes its image as INSTANCE_SWAP, with 17 real DCL photos wired in.

The module layer, composed from atoms
  • TopNav · SearchBar
  • CruiseCard (INSTANCE_SWAP, 17 images)
  • DateCard · ItineraryDayCard
  • StateroomPicker · PromoBanner · Modal

Page-level scaffolds

Patterns that consume modules. ComparisonModal is a new pattern, introduced because comparison was a missing first-class moment.

Page-level patterns built from modules
  • HeroSearch · ListingResults
  • CruiseDetail · TravelParty
  • ComparisonDrawer and ComparisonModal (new)

Engineers can build this without asking a designer

Every component ships with annotated token specs. Tokens compile to CSS custom properties, Tailwind config and typed component usage — zero ambiguity at handoff.

Annotated token specs for handoff
  • Annotated specs: BG · BORDER · RADIUS · PAD · GAP
  • CSS: --color-action-primary, --radius-card…
  • Tailwind: extend.colors.action, borderRadius.card
  • Typed usage: Button variant=“primary”, Card padding=“lg”

Screens — five screens, one library

Find a cruise, fast

Persistent active-filter chips, no hidden metadata. Pinnable cards feed the comparison drawer.

Redesigned cruise listing screen
  • Active-filter chip rail, every chip removable
  • Pin-to-compare on every card
  • Best-value badge using color/text/price-best
  • Sticky filter sidebar

Decide between three

The ComparisonModal pattern: three sailings side by side. It exists because comparison was a missing first-class moment on the live site.

Three-up comparison modal
  • Three-up side-by-side comparison
  • Sticky decision rail
  • Mobile stacked layout with a tab-pill switcher
  • Pinned cards survive across pages

A decision tool, not a brochure

Map at roughly 60% of the viewport. Day cards redesigned for context. A sticky CTA rail keeps booking one tap away.

Itinerary screen as a decision tool
  • Map-led layout (roughly 60% of the viewport)
  • Contextual day cards
  • Sticky CTA rail
  • Travel-party screen documented on the same library

Same library, 375px

Mobile listing and comparison reflow using the same tokens and the same components. No parallel design system.

Mobile listing and comparison
  • 375px viewport
  • Stacked compare with a tab-pill switcher
  • The same component instances as desktop

What this proved

What changed

  • 5 friction points solved (S1–S3)
  • ComparisonModal established as a first-class pattern
  • 17 real DCL images wired via INSTANCE_SWAP
  • A best-value semantic token introduced

What's next

  • A Halloween theme already wired — a one-variable swap
  • Token JSON exports for CSS and Tailwind handoff
  • Redesigns mapped back to the friction log
  • Mobile parity with no parallel design system

Explore the live Figma file.