Pass any THEME_* constant to any template and it renders correctly. Override individual colors with a BrandKit without touching theme files. All 1638 compositions share the same system.
Each theme is a complete visual identity - backgrounds, text hierarchy, accent gradient, card styles, and font weights. Import from _shared/themes.ts.
Extended themes
European themes
Flat/Material themes
Every theme implements the same Theme interface. All 15 tokens are used by every template - nothing is template-specific.
bg bgSecondary bgGlasstextPrimary textSecondary textMutedaccent accentSecondary accentGradientcardBorder cardShadowfontFamily headingWeight bodyWeight// Use any template with any theme import { THEME_DARK, THEME_NEON } from "../_shared/themes"; // Pass as an explicit prop <Testimonial spec={mySpec} theme={THEME_NEON} layout="centered" /> // Or use the THEMES registry by string const theme = THEMES["dark"] ?? THEMES.dark; // Or create your own theme export const THEME_MYBRAND: Theme = { name: "mybrand", bg: "#0d0d0d", accent: "#ff6b35", // ... all 15 tokens };
Don't want to create a full custom theme? Pass a BrandKit to override specific colors on top of any existing theme. applyBrandKit(theme, brandKit) returns a new theme with your overrides applied - the base theme is unchanged.
primaryColor
overrides accent, rebuilds accentGradient and cardBorderaccentColor
overrides accentSecondarybgColor
overrides bgtextColor
overrides textPrimaryfontFamily
overrides fontFamilylogoUrl
passed through to compositions that render a logoimport { applyBrandKit, THEME_DARK } from "../_shared/themes"; // Override only what you need const brandKit = { primaryColor: "#ff6b35", bgColor: "#0d0d0d", }; // Returns a new theme - original unchanged const themed = applyBrandKit(THEME_DARK, brandKit); // Pass to any template <Testimonial spec={spec} theme={themed} /> // Or pass brandKit directly (all showcase components accept it) <TestimonialDarkCentered brandKit={brandKit} />
All font sizes come from TYPE in _shared/layouts.ts. Edit once, updates every composition. Minimum TYPE.caption (24px) enforces broadcast legibility at 1280x720.
TYPE.hero
72px
Hero headlines, stat numbers
AaTYPE.title
52px
Section titles, card headers
AaTYPE.subtitle
38px
Sub-headings, labels
AaTYPE.body
32px
Body text, descriptions
AaTYPE.small
28px
Secondary text, meta
AaTYPE.caption
24px
Captions, badges - minimum size
Aa1638 compositions across 101 templates. Every template supports every theme above. Click to see all variants.








































































































Use the interactive player to switch between themes, apply your brand colors, and generate the CLI command for any composition.