Theme Creator
Pick a few seed colors and Shiny derives a full Material 3 token set — light and dark — for the
whole control suite. The output here is byte-identical to running the ShinyThemeGen tool in the
repo, so anything you design is reproducible.
Start from a built-in palette, tweak the seeds, watch the live preview, then copy any single file from the export tabs — or hit Download all for a zip containing every file for every platform.
my-themeAccents
Neutrals
Status
Accent roles
#0055D9#C2D6FF#565F6D#D9E3F3#6A4CAD#F7CFFFStatus roles
#81FB9A#C2D6FF#FFC862#FFB469#FFA78D#FFA78DSurfaces
#F7F9FC#F7F9FC#DBE3F2#FFFFFF#F1F4F8#EBEEF3#E4E8EE#DEE3E9#707785#BFC7D6Sample controls
Surface card
Body text uses on-surface-variant on a surface container.
The source of truth — everything else is generated from these seeds.
themes/my-theme.json{
"$schema": "./shiny-theme.schema.json",
"name": "My Theme",
"slug": "my-theme",
"description": "A custom Shiny Controls theme.",
"seeds": {
"primary": "#2563EB",
"secondary": "#5B6472",
"tertiary": "#7C5CBF",
"neutral": "#5F6368",
"neutralVariant": "#5C6370",
"error": "#DC2626",
"success": "#16A34A",
"info": "#2563EB",
"warning": "#D97706",
"caution": "#EA580C",
"critical": "#DC2626"
}
}
Drop into /themes/ and run the ShinyThemeGen tool to regenerate both platforms.
What to do with the output
Section titled “What to do with the output”The zip lays the files out per platform:
themes/<slug>.json— the source of truth. Drop it into/themes/in your fork of the controls repo and rundotnet run --project tools/ShinyThemeGento (re)generate both platforms.blazor/shiny-theme-<slug>.css— ship it as a static asset and<link>it after the coreshiny-theme.css. Toggle.shiny-theme-dark/.shiny-theme-lighton<html>to force a scheme; otherwise it follows the OS preference.maui/<Name>Theme.csplus the light/darkResourceDictionaryclasses — drop them into your MAUI project, thenUseShinyControls(cfg => cfg.UseTheme(new YourTheme())).README.md— the same wiring notes, bundled for later.
See the Theming overview for how the tokens are consumed by controls.


