Illustrations

Scenes for empty states, feature icons for cards and steps, and card art. All follow the theme.

Illustrations add tone where plain UI would read as empty or flat. BDS has three kinds, grouped by the job they do. Pick by role, then by size.

RoleForSizeMotionImport from
ScenesEmpty, first-run, and upload statesIntrinsicStaticillustrations/<name>
Feature iconsCards, feature rows, and numbered steps28–64pxHover, loop, or pulsebrand/illustrations/feature-icons
Card artThe top of a cardFills its parentLoops while in viewbrand/illustrations/asset-tokenization-illo

When to use

Use an illustration when a surface would otherwise be blank, or when a card or feature row needs a visual anchor next to its copy.

Use something else when:

  • The UI needs a functional icon, such as a close button or a status. Use the icon set.
  • The view is dense with data. An illustration competes with the content there; leave it out.

Scenes

Fixed compositions for the moments that plain UI reads as empty or unfinished: a blank feed, an upload step, a prompt to review. Each is a single component that carries its own light and dark artwork.

import { FeedIllustration } from '@base-org/bds-web/illustrations/feed';

<FeedIllustration />;
app-reviews
feed
link-appcoin
upload-screenshots
upload-thumbnail

Each scene renders at its own intrinsic size. Constrain it with a wrapper rather than stretching the component, and pass className for layout; it forwards to the container element.

Feature icons

Small animated icons for cards, feature rows, and the badge of a numbered step. Import any of them from one place:

import { GenerateRevenueIcon, DifferenceIcon } from '@base-org/bds-web/brand/illustrations/feature-icons';

Hover icons

All but two feature icons are 64px and spring into an active state. Drive them with isHovered, from the hover state of the card they sit in. A Card passes its hover state for you. Hover a tile, or play them all.

GenerateRevenueIcon
ProductLineIcon
KeepFundsIcon
ServiceDesignIcon
ServiceBuildIcon
ServiceLaunchIcon
ServiceGrowIcon
CoinbaseTrustIcon
LiquidityIcon
EcosystemIcon
BorrowLiquidityIcon
const [hovered, setHovered] = useState(false);

<div onMouseEnter={() => setHovered(true)} onMouseLeave={() => setHovered(false)}>
<GenerateRevenueIcon isHovered={hovered} className="size-16" />
</div>

Looping and pulsing icons

DifferenceIcon draws at 52px (64px from sm) and suits a row of cards; a row starts in a left-to-right wave. StepIcon draws at 28px (32px from md) and sits in the round badge of a step, with a gentle pulse.

liquidations
tradingFlow
topOfBlock
dexs
assets
integration
withdraw
<DifferenceIcon icon="liquidations" />

<span className="flex size-12 items-center justify-center rounded-full bg-bds-gray-5 md:size-14">
<StepIcon icon="assets" />
</span>

Card art

Wide illustrations for the top of a card, drawn at 327×182. Each fills its positioned parent, loops a short sequence while in view, and pauses offscreen.

tokenizedStocks
fxCommodities
cryptoMajors
emergingCrypto
<div className="relative aspect-327/182 overflow-hidden rounded-3">
<AssetTokenizationIllo illo="cryptoMajors" />
</div>

Motion

TriggerIllustrationsHow to drive itUnder reduced motion
HoverThe 64px feature iconsisHovered, from the card's hover stateSwitches state instantly
In viewDifferenceIcon, card artAutomatic; pauses offscreenStays on the first frame
IdleStepIconAutomaticThe pulse stops

Every animated illustration renders the still design on the server, so a page never depends on it moving.

Theming

Scenes ship light and dark artwork together and switch with CSS (dark:), so they follow the active theme without a hook or a prop. The feature icons and card art draw their grays and blue from theme tokens. The 64px icons also take color props (ringColor, inkColor, and so on) to repaint parts of the drawing for an unusual background; the defaults fit both themes.

Usage

Do

Put one illustration per card or empty state, next to copy that says the same thing.

Don't

Scatter illustrations through a view, or rely on one to carry meaning the copy doesn't.

Do

Drive a hover icon on hover and when its card scrolls into view, so touch devices see the motion too.

Don't

Stretch an illustration past its size. Constrain it with a wrapper instead.

Accessibility

Scenes render role="img" with no name. Pass aria-label when the scene adds meaning, or aria-hidden when the copy next to it already says it. Feature icons and card art are always aria-hidden, so say what they show in the surrounding text.

Props

Scenes take every div prop and forward them to the container. The feature icons and card art take the props below.

GenerateRevenueIcon

PropTypeDefault
blueColorTypestringDefaultvar(--color-brand-accent)
bodyColorTypestringDefaultvar(--bds-gray-0)
classNameTypestringDefault—
cornerGrayColorTypestringDefaultvar(--bds-gray-10)
innerRingColorTypestringDefaultvar(--bds-gray-10)
isHovered

Plays the icon's active state. Inside a Brand section card the card sets it on hover and in view; pass it to drive the icon yourself.

TypebooleanDefault—
ringColorTypestringDefaultvar(--bds-gray-100)

ProductLineIcon

PropTypeDefault
blueColorTypestringDefaultvar(--color-brand-accent)
bodyColorTypestringDefaultvar(--bds-gray-0)
classNameTypestringDefault—
inkColorTypestringDefaultvar(--bds-gray-100)
isHovered

Plays the icon's active state. Inside a Brand section card the card sets it on hover and in view; pass it to drive the icon yourself.

TypebooleanDefault—
ringColorTypestringDefaultvar(--bds-gray-10)

KeepFundsIcon

PropTypeDefault
blueColorTypestringDefaultvar(--color-brand-accent)
bodyColorTypestringDefaultvar(--bds-gray-0)
classNameTypestringDefault—
inkColorTypestringDefaultvar(--bds-gray-100)
isHovered

Plays the icon's active state. Inside a Brand section card the card sets it on hover and in view; pass it to drive the icon yourself.

TypebooleanDefault—
pinStrokeColorTypestringDefaultvar(--bds-gray-0)
ringColorTypestringDefaultvar(--bds-gray-10)

ServiceDesignIcon

PropTypeDefault
blueColor

Brand accent.

TypestringDefaultvar(--color-brand-accent)
bodyColor

White fills and white tile outlines.

TypestringDefault—
classNameTypestringDefault—
grayColor

Rules, frames, gray tiles/corners.

TypestringDefaultvar(--color-brand-illustration-rule)
inkColor

Black strokes/fills.

TypestringDefault—
isHovered

Plays the icon's active state. Inside a Brand section card the card sets it on hover and in view; pass it to drive the icon yourself.

TypebooleanDefault—

ServiceBuildIcon

PropTypeDefault
blueColor

Brand accent.

TypestringDefaultvar(--color-brand-accent)
bodyColor

White fills and white tile outlines.

TypestringDefaultvar(--bds-gray-0)
classNameTypestringDefault—
grayColor

Rules, frames, gray tiles/corners.

TypestringDefaultvar(--color-brand-illustration-rule)
inkColor

Black strokes/fills.

TypestringDefault—
isHovered

Plays the icon's active state. Inside a Brand section card the card sets it on hover and in view; pass it to drive the icon yourself.

TypebooleanDefault—

ServiceLaunchIcon

PropTypeDefault
blueColor

Brand accent.

TypestringDefaultvar(--color-brand-accent)
bodyColor

White fills and white tile outlines.

TypestringDefaultvar(--bds-gray-0)
classNameTypestringDefault—
grayColor

Rules, frames, gray tiles/corners.

TypestringDefaultvar(--color-brand-illustration-rule)
inkColor

Black strokes/fills.

TypestringDefault—
isHovered

Plays the icon's active state. Inside a Brand section card the card sets it on hover and in view; pass it to drive the icon yourself.

TypebooleanDefault—
showTrendTypebooleanDefaulttrue

ServiceGrowIcon

PropTypeDefault
blueColor

Brand accent.

TypestringDefaultvar(--color-brand-accent)
bodyColor

White fills and white tile outlines.

TypestringDefaultvar(--bds-gray-0)
classNameTypestringDefault—
grayColor

Rules, frames, gray tiles/corners.

TypestringDefaultvar(--color-brand-illustration-rule)
inkColor

Black strokes/fills.

TypestringDefault—
isHovered

Plays the icon's active state. Inside a Brand section card the card sets it on hover and in view; pass it to drive the icon yourself.

TypebooleanDefault—

CoinbaseTrustIcon

PropTypeDefault
blueColor

Brand accent.

TypestringDefault—
bodyColor

White fills.

TypestringDefault—
classNameTypestringDefault—
grayColor

Rules, outer arcs, frame strokes, meridians.

TypestringDefault—
inkColor

Dark outlines.

TypestringDefault—
isHovered

Plays the icon's active state. Inside a Brand section card the card sets it on hover and in view; pass it to drive the icon yourself.

TypebooleanDefault—
markerStroke

Outline of the left/right pink ring markers.

TypestringDefault—
markerStrokeTB

Outline of the top/bottom ring markers, when it differs from left/right .

TypestringDefault—
panelColor

Panel fills.

TypestringDefault—
panelStrokeColor

Outline around small blue/pink squares that sit on a panel.

TypestringDefault—

LiquidityIcon

PropTypeDefault
classNameTypestringDefault—
isHovered

Plays the icon's active state. Inside a Brand section card the card sets it on hover and in view; pass it to drive the icon yourself.

TypebooleanDefault—

EcosystemIcon

PropTypeDefault
blueColor

Brand accent.

TypestringDefault—
bodyColor

White fills.

TypestringDefault—
centerGlyph

Center mark: a check or a `$`.

Type"check" | "dollar"Defaultcheck
classNameTypestringDefault—
grayColor

Rules, outer arcs, frame strokes, meridians.

TypestringDefault—
inkColor

Dark outlines.

TypestringDefault—
isHovered

Plays the icon's active state. Inside a Brand section card the card sets it on hover and in view; pass it to drive the icon yourself.

TypebooleanDefault—
panelColor

Panel fills.

TypestringDefault—
panelStrokeColor

Outline around small blue/pink squares that sit on a panel.

TypestringDefault—

BorrowLiquidityIcon

PropTypeDefault
classNameTypestringDefault—
isHovered

Plays the icon's active state. Inside a Brand section card the card sets it on hover and in view; pass it to drive the icon yourself.

TypebooleanDefault—

AssetTokenizationIllo

PropTypeDefault
illorequired

Which asset class to draw.

Type"tokenizedStocks" | "fxCommodities" | "cryptoMajors" | "emergingCrypto"Default—
classNameTypestringDefault—

DifferenceIcon

PropTypeDefault
iconrequired

Which icon to draw.

Type"liquidations" | "tradingFlow" | "topOfBlock" | "dexs"Default—
classNameTypestringDefault—

StepIcon

PropTypeDefault
iconrequired

Which step icon to draw.

Type"assets" | "integration" | "withdraw"Default—
classNameTypestringDefault—