Skip to main content Skip to docs navigation

Color system

One source of truth for colors — full stepped scales, CSS variables for every shade, and utilities auto-wired to those shades.

The magic transformation

Define one color, get a complete design system:

You write:
$custom-colors: ("brand": #5e3896)
25
50
100
200
300
400
500
600
700
800
900
950
975
Complete 13-shade spectrum: --bravo-brand-25 through --bravo-brand-975

Result: Complete CSS variables + utilities for theming, components, and dark mode — no manual shade calculation needed.

Extended range beyond Bootstrap

Bootstrap gives you 9 shades (100-900). Bravo generates 13 shades (25-975) with extra-light and extra-dark variations perfect for modern interfaces:

Bootstrap (9 shades)
100
200
300
400
500
600
700
800
900
Bravo (13 shades)
25
50
100
200
300
400
500
600
700
800
900
950
975

Smart override system

Simple approach: Just provide your brand color and get the full spectrum:

$custom-colors: (
  "brand": #5e3896
);

Advanced approach: Define key anchor points and Bravo calculates the gaps:

$custom-colors: (
  "brand": (
    300: #8a64c2,  // lighter accent
    500: #5e3896,  // main brand color  
    700: #4a2a7a,  // darker variant
  )
);

Smart interpolation: Bravo generates the missing shades (25, 50, 100, 200, 400, 600, 800, 900, 950, 975) by intelligently calculating between your defined anchor points.

Perfect for: Brand systems where you need specific shades but want the full spectrum generated automatically.

CSS variables you actually get

All Bootstrap defaults (blue, indigo, purple, pink, red, orange, yellow, green, teal, cyan, gray…) plus your custom colors are exported to CSS:

:root {
  /* examples (pattern repeats for every color) */
  --bs-blue-25:;
  --bs-blue-50:;--bs-blue-500:; /* true blue */--bs-blue-975:;

  --bs-brand-25:;--bs-brand-500: #5e3896;--bs-brand-975:;
}

Use them anywhere:

.card {
  background: var(--bs-gray-50);
  border-color: var(--bs-gray-200);
  color: var(--bs-gray-900);
}

Utilities from the same source (no hand-wiring)

All shade utilities are generated from the same map:

<!-- text -->
<p class="text-blue-300">Light text</p>
<p class="text-blue-500">Base text</p>
<p class="text-blue-900">Dark text</p>

<!-- backgrounds -->
<div class="bg-brand-100">Brand subtle</div>
<div class="bg-brand-500 text-white">Brand solid</div>

<!-- borders -->
<div class="border border-green-700">Strong border</div>

Because the variables and utilities share one source, utilities always line up with the CSS vars you'd use in components.

About dark mode

Bravo doesn't ship a dark-mode algorithm. If you use Bootstrap's [data-bs-theme="dark"], pick the shade numbers you want for dark contexts (e.g. 100 vs 900) and set them in your theme or component CSS. The point: the right shades exist without you hand-crafting them.

Why this matters (dev POV)

🎨
Complete design system

13 usable shades per color instead of Bootstrap's 9. Perfect granularity for modern interfaces.

Zero manual work

CSS variables and utilities auto-generated. No more hand-calculating shade variations.

🎯
Brand-first theming

Drop in your brand colors, get a complete theme. Override only what needs tweaking.

🔄
Consistent naming

Same naming pattern for CSS variables and utilities. --bravo-brand-300.text-brand-300

What changed vs Bootstrap

AspectBootstrapBravo
Color steps9 (100-900)13 (25-975)
Extra extremesNone25/50 + 950/975
CSS variablesLimited coverageEvery shade exported
UtilitiesLimited shadesAll shades for text/bg/border
Custom colorsManual wiringAuto ladder + optional overrides