Premium components

Live docs, props and variants for the premium component library.

KpiCard

Compact KPI tile with optional sparkline, delta badge and a hero (dark) variant. Use inside grid/flex rows.

import { KpiCard, KpiCardSkeleton } from "@/components/premium/KpiCard";

Tones

primary · indigo · emerald · amber · dark (hero)

Active RFPs
24
+8%
Booked
12
48h
At risk
3
+22%
YTD savings
€184k

With sparkline

Pass a `spark` array (numeric) to render a 7-day trend.

Pipeline value
€1.2M
+4pp
Conversion
38%

Loading skeleton

Pass `loading` (or render `KpiCardSkeleton` directly). Shape-matched, zero layout shift.

Clickable

Pass `onClick` to make the whole card a button.

Open hotels
104k
PropTypeDefaultDescription
labelstringUppercase label above the value.
valuestringBig tabular-nums display value.
iconLucideIconLucide icon shown in the rounded badge.
tone"primary" | "indigo" | "emerald" | "amber" | "dark""primary"Color treatment. `dark` produces the hero variant with glow.
deltastringOptional success-tinted trend pill (e.g. `+8%`).
captionstringNeutral caption shown when `delta` is absent.
sparknumber[]Sparkline data; needs at least 2 points.
onClick() => voidMakes the card behave as a button.
loadingbooleanfalseRender a shape-matched skeleton during fetch.

ExpandableCard

Animated reveal card. Pairs with SectionHeading and a row of KpiCards. Supports controlled or uncontrolled state.

import { ExpandableCard, ExpandableCardSkeleton } from "@/components/premium/ExpandableCard";

Default (uncontrolled)

Click the header to expand. `defaultOpen` controls initial state.

New

Hidden details only render when expanded.

Body uses muted background and border-top divider automatically.

Accent + controlled

`accent` adds a left rail (any bg-* class). `open` + `onOpenChange` make it controlled.

  • Hilton Berlin — BAFO due Friday
  • Marriott Lisbon — awaiting CFO sign-off
  • NH Madrid — chase scheduled tomorrow

Loading skeleton

Pass `loading` or render `ExpandableCardSkeleton`. Matches the collapsed shape exactly.

PropTypeDefaultDescription
headerReactNodeAlways-visible header content.
childrenReactNodeHidden content revealed on expand.
accentstringTailwind `bg-*` class for the left accent bar.
actionsReactNodeTrailing actions to the right of the chevron.
defaultOpenbooleanfalseInitial expanded state (uncontrolled).
openbooleanControlled open state.
onOpenChange(open: boolean) => voidFires whenever expansion toggles.
classNamestringExtra classes on the root card.
loadingbooleanfalseRender skeleton matching the collapsed shape.

SectionHeading

Consistent header for cards, sections and panels. Three sizes: small caps title, eyebrow, or large gradient display.

import { SectionHeading } from "@/components/premium/SectionHeading";

Small caps title (default)

The primary form. Use as the standard panel header.

Today's actions

Quick wins to clear before end of day

3 / 7

Eyebrow + small title

Use when you need a colored kicker above the title.

Premium

Pipeline value

Deals scheduled to close this quarter

Display title (gradient)

Use sparingly — page or hero-section level.

Q1 recap

Sourcing performance

Multi-year savings and adoption trends

Tones

primary · success · warning · urgent — recolors the icon badge.

Tone: primary

Tone: success

Tone: warning

Tone: urgent

PropTypeDefaultDescription
titlestringRequired uppercase small-caps title.
eyebrowstringOptional gradient kicker rendered above the title.
displaystringReplaces `title` with a large gradient display heading.
iconLucideIconLucide icon shown in a rounded tinted badge on the left.
tone"primary" | "success" | "warning" | "urgent""primary"Color treatment for the icon badge.
trailingReactNodeRight-aligned slot for badges, buttons or links.
descriptionstringOne-line subtitle below the title.
classNamestringExtra classes on the root flex container.

StatusPill

Tone-coded short-label indicator. Single source for stage chips, urgency badges, semantic states.

import { StatusPill } from "@/components/StatusPill";

Tones

success · primary · warning · destructive · muted

BAFOReceivingSentStalledDraft

Sizes

xs · sm · md — same tone, different vertical rhythm

xssmmd

TopsisScoreBadge

Composite score 0-100 badge. Tone thresholds match vanilla v56: ≥75 green · 60-74 purple · 45-59 amber · <45 red.

import { TopsisScoreBadge } from "@/components/TopsisScoreBadge";

Tone progression

Same component, different composite values

90/10065/10050/10030/100

Brand-voiced SVG illustrations

Purpose-built per moment. Use as the illustration prop on EmptyState/ErrorState.

import { NoProposalsIllustration, AllDoneIllustration, CompassLostIllustration, AwaitingResponsesIllustration } from "@/components/illustrations";

All five

Each is purpose-built for a specific empty/error moment.

NoProposals
AllDone
CompassLost
AwaitingResponses
ScoreUnavailable