Design system & HTML standards

This guide documents the design system used across the Brandkit codebase and sets the HTML standards for building portal pages. It is intended as a working reference: an overview of how the component classes fit together, the markup patterns to follow, and the colours, badges, banners, and buttons available to use.

Use the examples as copy-paste starting points, and prefer the documented classes over ad-hoc styling so portal themes stay consistent and predictable.

How the class system works

Every component in this design system is built from up to three layers of class: a base class, a variant class, and optionally one or more modifier classes.

Base class
Sets the structural foundation — layout, spacing, transitions, and interactive states like hover and disabled.
Variant class
Defines the visual intent — colour, fill, and border. For example .button-outline gives a transparent background with a primary-coloured border, while .button-danger gives a semantic red fill.
Modifier class
Changes the shape or layout without affecting colour. .button-pill rounds a button into a pill shape and can be combined with any variant. .button-full-width stretches a button to fill its container.

Buttons have two base classes:

The pattern is always base + variant (+ optional modifier):

<!-- base + variant -->
<a href="#" class="bk-button button-outline">Share</a>

<!-- base + variant + modifier -->
<a href="#" class="bk-button button-outline button-pill">Edit profile</a>
<a href="#" class="bk-button button-danger button-pill">Remove</a>

The same base/variant/modifier pattern applies to badges: .badge is the base, .badge-danger is the variant, and .badge-pill or .badge-filled are modifiers.

Colours

The colour system is exposed as CSS custom properties on :root. Eight semantic families map to the status meanings used across badges, banners, and buttons, each with a base colour plus lighter, mid, and darker steps. The base step is the default; -light suits fills and backgrounds, -mid suits borders and muted accents, and -dark suits text and hover states. Reference them in theme CSS as var(--success), var(--success-light), and so on.

Success

Positive outcome, confirmation, completed states.

SwatchVariableHex
--success-light#eaf6ee
--success-mid#28a745
--success#198754
--success-dark#0f5132

Warning

Caution, pending attention, non-blocking issues.

SwatchVariableHex
--warning-light#fff3eb
--warning-mid#fea362
--warning#e56910
--warning-dark#a54800

Danger

Errors, destructive actions, expired or failed states.

SwatchVariableHex
--danger-light#ffeceb
--danger-mid#f4a8a5
--danger#c9372c
--danger-dark#ae2e24

Info

Informational messages and neutral highlights.

SwatchVariableHex
--info-light#e9f2ff
--info-mid#8ebeff
--info#0969da
--info-dark#0055cc

Neutral

Default UI text, borders, and muted backgrounds.

SwatchVariableHex
--neutral-light#f1f2f4
--neutral-mid#bdc3c7
--neutral#44546f
--neutral-dark#374151

Primary

Brand primary (Brandkit black) for key actions and emphasis.

SwatchVariableHex
--primary-light#f8f8f8
--primary-mid#646464
--primary#000000
--primary-dark#212121

Secondary

Brand secondary (Brandkit purple) for accents and secondary actions.

SwatchVariableHex
--secondary-light#eee7f4
--secondary-mid#b388d1
--secondary#8246af
--secondary-dark#5c2d82

Accent

Brand accent (Brandkit yellow) for highlights and call-outs.

SwatchVariableHex
--accent-light#fff8dc
--accent#ffd100
--accent-dark#7a5c00

Badges

Inline status labels. Every badge uses the base badge class plus one colour class. Add modifier classes to change the shape (badge-pill) or fill style (badge-filled). Badges scale with their surrounding text size, so they sit naturally inside headings and body copy.

Colour variants

Eight colour variants are available. Each carries a semantic meaning — match the colour to the status you're communicating.

VariantMeaning
badge-neutralDefault / no particular status
badge-successPositive outcome, active, complete
badge-warningCaution, needs attention
badge-dangerError, expired, destructive state
badge-infoInformational note
badge-primaryBrand primary colour
badge-secondaryBrand secondary colour
badge-accentBrand accent colour

Outline (default)

The eight colour variants in their default outline style.

Neutral Success Warning Danger Info Primary Secondary Accent
<span class="badge badge-neutral">Neutral</span>
<span class="badge badge-success">Success</span>
<span class="badge badge-warning">Warning</span>
<span class="badge badge-danger">Danger</span>
<span class="badge badge-info">Info</span>
<span class="badge badge-primary">Primary</span>
<span class="badge badge-secondary">Secondary</span>
<span class="badge badge-accent">Accent</span>

Pill

Add badge-pill for fully rounded corners.

Neutral Success Warning Danger Info Primary Secondary Accent
<span class="badge badge-success badge-pill">Success</span>

Filled

Add badge-filled for a solid background instead of an outline. Combine with badge-pill for filled pills.

Neutral Success Warning Danger Info Primary Secondary Accent
Neutral Success Warning Danger Info Primary Secondary Accent
<span class="badge badge-success badge-filled">Success</span>
<span class="badge badge-success badge-filled badge-pill">Success</span>

Scaling with text size

Badges inherit the font size of their context, so they pair cleanly with headings and body text.

Heading 1 New

Heading 2 Draft

Heading 3 Active

Paragraph Expired

Small text Info
<h1>Heading 1 <span class="badge badge-primary badge-pill">New</span></h1>
<p>Paragraph <span class="badge badge-danger">Expired</span></p>

Dot badges

A minimal status indicator — a coloured dot with no label. Use badge-dot plus a colour class, which can be followed by descriptive text.

Neutral Success Warning Danger Info Primary Secondary Accent
<span class="badge-dot badge-success"></span> Success
<span class="badge-dot badge-danger"></span> Danger

Banners

Full-width message blocks for page-level feedback or notices. Apply the colour class directly to a <div>. Use <strong> inside to emphasise the message type.

Text banners

This is an info message. Something to be aware of.
This is a success message. Everything went well.
This is a warning message. Proceed with caution.
This is a danger message. Action required.
This is a neutral message. Something to note.
This is a primary message. Brandkit black.
This is a secondary message. Brandkit purple.
This is an accent message. Brandkit yellow.
<div class="info">This is an <strong>info</strong> message. Something to be aware of.</div>
<div class="success">This is a <strong>success</strong> message. Everything went well.</div>
<div class="warning">This is a <strong>warning</strong> message. Proceed with caution.</div>
<div class="danger">This is a <strong>danger</strong> message. Action required.</div>
<div class="neutral">This is a <strong>neutral</strong> message. Something to note.</div>
<div class="primary">This is a <strong>primary</strong> message. Brandkit black.</div>
<div class="secondary">This is a <strong>secondary</strong> message. Brandkit purple.</div>
<div class="accent">This is an <strong>accent</strong> message. Brandkit yellow.</div>

Text colours

Utility classes for colouring inline or block text to match status meaning.

text-success

text-info

text-warning

text-danger

<p class="text-success">text-success</p>
<p class="text-info">text-info</p>
<p class="text-warning">text-warning</p>
<p class="text-danger">text-danger</p>

These can be combined with banners — for example, in these trial banner examples.

Your trial ends in 7 days. Upgrade now
Your trial has expired. Upgrade now
<div class="info trial-banner text-info">Your trial ends in 7 days. <a href="#">Upgrade now</a></div>
<div class="danger trial-banner text-danger">Your trial has expired. <a href="#">Upgrade now</a></div>

Buttons

Buttons share a common base class plus one variant class. Primary actions use .button as their base; all other variants use .bk-button. To render a button as a link, use an <a href> element with the same classes.

All variants

The full set of button styles shown together. Pick the variant that matches the action's importance and intent.

<!-- legacy -->
<button class="button normal-button">Normal</button>
<button class="bk-button button-primary">Primary</button>
<button class="bk-button button-outline">Outline</button>
<button class="bk-button button-secondary">Secondary</button>
<button class="bk-button button-cancel">Cancel</button>
<button class="bk-button button-danger">Danger</button>
<button class="bk-button button-link">Link</button>

When to use each variant

VariantUse forExamples
normal-button or button-primaryThe single most important action on a page or sectionDownload, Add to basket
button-outlineSecondary actions alongside a primary actionShare, Save, Back to search
button-pillStandalone actions that suit a softer, rounded lookEdit profile
button-secondaryBrand-coloured secondary actions
button-cancelDismissing or backing out of a flowCancel, Skip, Back
button-dangerIrreversible or destructive actions, often with a confirmation dialogDelete, Remove, Disconnect
button-linkLow-emphasis actions inline with text

Disabled

Add the disabled attribute to any button.

<button class="button normal-button" disabled>Normal</button>
<button class="bk-button button-outline" disabled>Outline</button>

Full width

Add the button-full-width modifier to stretch a button to its container's width.

<button class="button normal-button button-full-width">Full width</button>
<button class="bk-button button-outline button-full-width">Full width outline</button>

Pill buttons

The button-pill modifier combines with any base + variant pairing. The pattern is always bk-button + variant class + button-pill.

Edit profile Remove Download
<!-- Outline pill (most common) -->
<a href="#" class="bk-button button-outline button-pill">Edit profile</a>

<!-- Danger pill -->
<a href="#" class="bk-button button-danger button-pill">Remove</a>

<!-- Primary pill -->
<a href="#" class="bk-button button-primary button-pill">Download</a>

GET STARTED TODAY

Your brand deserves
a better home.

Trusted by brands since 1994 - Free trial available.

Book a demo