Theme Builder
Enter your brand colours once and download matching themes for Power BI, PowerPoint, Excel, Word, matplotlib, plotly, Vega-Lite and CSS. A live report page and slide show the result, and the checks tell you which colours clash before your readers do. Source on GitHub (MIT).
- 1Pick or enter colours
Start from one of 16 report looks, paste the hex codes from your brand guide, or drop a theme file you already use.
- 2Check
The preview redraws as you type. The checks flag text that is hard to read and series that colour-blind readers cannot tell apart.
- 3Download
One zip with every file, or one file at a time, each with the exact clicks to apply it.
1Start from a look, your hex codes or a file
Each card shows the look on its own background: title in its ink colour, data colours in series order.
White and near-black greys in the list become the background and the text colour. The rest become data colours, in the order you pasted them.
Drop a file here, or
brand.json from this page, a Power BI theme .json, an Office .thmx, or any .pptx, .potx, .xlsx or .docx: the tool reads the theme inside it.
2Adjust and check
Series 1 takes colour 1 in every chart, in every tool. Office keeps the first 6.
Used for KPI arrows, variance and conditional formatting.
Pick a font installed on every machine that opens the file. Segoe UI, Aptos, Calibri, Arial and Georgia are safe on Windows and Office.
Mock data. Every colour, font and line comes from your theme.
What the checks found
Text contrast WCAG 2: 4.5:1 for body text, 3:1 for large text
Data colours on the background 3:1 or more keeps lines and small marks visible
Can every reader tell the series apart? closest pair per type of vision, CIEDE2000 distance, below 10 is a warning
3Download
How to apply each file
View tab, Themes, Browse for themes, pick . Every visual takes the data colours, fonts, axis and gridline colours at once.
Design tab, the More arrow at the bottom right of the Themes gallery, Browse for Themes, pick . To keep it: same arrow, Save Current Theme. To make it the default: right-click it in the gallery, Set as Default Theme.
Page Layout tab, Themes, Browse for Themes, pick . Charts, tables, cell styles and the colour picker switch to your colours and fonts.
Design tab, Themes, Browse for Themes, pick . Headings take your heading font, charts and SmartArt take your colours.
import matplotlib.pyplot as plt
plt.style.use("")import json, plotly.io as pio, plotly.graph_objects as go
with open("") as f:
pio.templates["brand"] = go.layout.Template(json.load(f))
pio.templates.default = "brand"const config = await (await fetch("")).json();
vegaEmbed("#chart", spec, { config });<link rel="stylesheet" href="">
.card { background: var(--theme-panel); color: var(--theme-ink); }
.bar-1 { fill: var(--theme-series-1); }powerbi/<name>.json is a Power BI report theme: data colours, text classes for titles, labels and callouts, the page and visual background, axis and gridline colours, good, bad and neutral for KPIs and conditional formatting, and the table accent. office/<name>.thmx is an Office theme with a 16:9 slide master: dark and light text colours, six accents, heading and body fonts, read by PowerPoint, Excel, Word and Outlook. office/theme1.xml is the same theme as a raw part, for anyone who swaps it inside a .pptx or .xlsx by hand. python/<name>.mplstyle sets the matplotlib colour cycle, background, text, grid and spines. python/plotly-<name>.json is a plotly template with the colourway and a sequential and diverging scale. web/vega-lite-<name>.json is a Vega-Lite config object. web/<name>.css holds CSS custom properties, --theme-series-1 onwards. brand.json holds your inputs: drop it back on this page next year and you edit the same theme instead of starting again.