KKUONIDesign System

Components

Resort Card

Beta

A ski or walking resort overview card with a 16:9 image, key stats row (piste km, altitude, difficulty), price from per person, and a CTA. Used in resort listing pages, destination browse, and search results.

advanced

Verbier

Valais, Switzerland

piste km
412
altitude
1500–3300m
level
advanced

from £1,899 pp

View resort
intermediate

Courchevel 1850

Savoie, France

piste km
600
altitude
1300–2738m
level
intermediate

from £2,299 pp

View resort

Purpose

The ResortCard surfaces the key decision signals for a ski or walking resort in a compact, scannable format. It follows the Inghams.co.uk results page pattern adapted to Kuoni tokens and visual language.

It is used in:

  • Resort listing pages — the main grid of ski or walking resort results
  • Destination browse — featured resorts within a destination overview
  • Search results — when the user has searched for ski holidays

The card intentionally surfaces only the most-used data points: piste or trail distance, altitude range, and difficulty level. Additional detail is reserved for the resort's own page.

Usage

Reach for ResortCard specifically for ski and walking/trekking resorts, where piste km, altitude, and difficulty are the primary decision signals — for a general bookable holiday, use Trip Card instead, and for a browsable destination overview use Destination Card. ResortCard sits between those two: more commercial than a destination card, but organised around resort-specific stats rather than a single hotel offer.

It typically appears in grids on resort listing pages, as featured items within a destination browse page, and in ski/walking-specific search results.

Anatomy

advanced

Zermatt

Valais, Switzerland

piste km
360
altitude
1620–3883m
level
advanced

from £2,499 pp

View resort
  1. 1
    16:9 imageResort hero photo that scales from 16:9 aspect ratio. Falls back to a Mountain icon placeholder.
  2. 2
    Difficulty badgePill in top-right of image. Beginner=success green, Intermediate=warning amber, Advanced=danger red.
  3. 3
    Resort name16px semibold. The primary identifying text.
  4. 4
    LocationMapPin icon + region, country in 12px grey-400.
  5. 5
    Stats rowThree-column grey-50 panel with piste km / trail km, altitude, and level.
  6. 6
    Price"from £N,NNN pp" in the footer row.
  7. 7
    CTAWow Yellow "View resort" button linking to the resort detail page.

Variants

Beginner resort

beginner

Les Gets

Haute-Savoie, France

piste km
120
altitude
1172–1852m
level
beginner

from £1,299 pp

View resort

Walking / trekking resort (trail km)

Use trailKm instead of pisteKm for walking and trekking destinations.

intermediate

Chamonix

Haute-Savoie, France

trail km
310
altitude
1035–3842m
level
intermediate

from £1,599 pp

View resort

Without price

When price is unavailable or shown elsewhere, omit priceFrom — the CTA then fills the full card width.

intermediate

Morzine

Haute-Savoie, France

piste km
650
altitude
1000–2460m
level
intermediate

States

ElementStateAppearance
CardDefaultshadow-kuoni-sm, border-grey-200
CardHovershadow-kuoni-md
ImageHoverscale-105 zoom
CTADefaultWow Yellow bg, dark text
CTAHoveryellow500 bg
CTAFocusTeal focus ring

Best practices

Do

Use pisteKm for ski resorts and trailKm for walking / trekking resorts. Do not mix them.

Piste km (412) is a universal ski resort metric — the primary decision factor for experienced skiers.

Don't

Use piste km and trail km interchangeably based on which produces a larger number.

Using trail km for a ski resort and piste km for a walking resort confuses users who rely on these as comparable figures.

Do

Provide descriptive alt text for every resort image via image.alt.

Image alt text 'Verbier resort village in the Swiss Alps with snow-covered rooftops' describes the scene for screen reader users.

Don't

Use the image filename or a generic 'resort photo' as alt text.

'verbier-resort-photo-01.jpg' is a filename, not a description of the image content.

Do

Rely on the Mountain placeholder — do not hide the card when no image is available.

The Mountain icon placeholder maintains card layout and visual consistency while the image loads or is unavailable.

Don't

Leave the image area completely empty when no src is provided.

An empty white 16:9 box with no placeholder is visually broken and suggests a loading error.

Props

PropTypeDefaultDescription
name*stringResort name displayed as the card heading.
countrystringCountry name shown in the location row.
regionstringRegion or canton name shown before country in the location row.
image{ src: string; alt?: string }Resort hero image. Falls back to a Mountain icon placeholder when omitted.
pisteKmnumberTotal piste kilometres. Use for ski resorts. Shows "piste km" label in the stats row.
trailKmnumberTotal trail kilometres. Use for walking / trekking destinations. Shows "trail km" label.
altitudestringAltitude range as a formatted string, e.g. "1500–3300m". Shown in the stats row.
difficulty'beginner' | 'intermediate' | 'advanced''intermediate'Skill level badge. Beginner=green, intermediate=amber, advanced=red.
priceFromnumberLowest price per person. When omitted, the CTA fills the full card width.
currencystring'£'Currency symbol prepended to the price.
hrefstring'#'Destination URL for the "View resort" CTA link.
classNamestringAdditional Tailwind classes on the root article element.

Accessibility

Semantic HTML

The ResortCard renders as <article> — a self-contained piece of content that makes sense independently. The resort name is an <h3> and the stats use <dl>/<dt>/<dd> pairs so screen readers can announce "piste km — 412".

The "View resort" CTA is a native <a> with the href prop. It is fully keyboard-accessible and right-click opens a browser context menu for "open in new tab".

Consider adding an aria-label via className override for the CTA if the resort name is not announced alongside it:

<a aria-label={`View ${name} resort`} href={href}>View resort</a>

Difficulty badge

The difficulty badge is a visual indicator positioned over the image. Ensure the difficulty value is also present in the stats row (which it is — the "level" stat reads beginner / intermediate / advanced) so the information is available to screen readers even if the image overlay is skipped.

  • Trip Card — the general-purpose commercial holiday card; use it for non-resort-specific offers.
  • Destination Card — for browsable destination overviews rather than a specific resort's stats.
  • Room Type Card — for selecting a specific room within a resort's accommodation, once a resort has been chosen.