npx claudepluginhub danielraffel/generous-corp-marketplace --plugin juce-devThis skill uses the workspace's default tool permissions.
1. Open `Tools/theme-designer.html` in a browser (works via `file://`, no server needed)
Provides Makepad 2.0 theme system for consistent UI styling with colors, typography, spacing via theme.* variables in Splash scripts. Supports dark, light, skeleton themes and switching.
Designs token-based theming systems for multi-brand design systems supporting light/dark/high-contrast modes, density variants, and runtime switching.
Generates complete design systems from brand colors, including shade scales, semantic tokens, CSS variables, and Tailwind config. Use when starting new projects or standardizing colors.
Share bugs, ideas, or general feedback.
Tools/theme-designer.html in a browser (works via file://, no server needed)<script id="theme-data"> JSON block in the HTMLpython3 scripts/generate_theme.py Tools/themes/my-theme.json --mode both --output Source/ThemeSource/Theme.h and call initThemePalette(palette) at plugin startupThe theme JSON has these sections:
colors — Standard Visage widget tokens (Button, Toggle, TextEditor, PopupMenu, ScrollBar)values — Visage value tokens (rounding, margins, sizes) as floats with min/max hintscustom — Project-specific tokens (knobs, meters, waveform, panels, cards, accents, etc.)juce — JUCE LookAndFeel ColourId mappings keyed as "ClassName::colourIdName"meta — Theme name, version, base (for inheritance)overrides — Per-OverrideId Visage color overrides (advanced)Color format: "value": "#RRGGBB" (web-standard hex) + "alpha": 0.0-1.0 (separate float).
The codegen converts to Visage 0xAARRGGBB format automatically.
Visage uses 0xAARRGGBB — alpha in the most-significant byte. This differs from CSS rgba.
0xFFFF0000 // Fully opaque red
0x800000FF // 50% transparent blue
0x00000000 // Fully transparent
Conversion: alpha_byte = round(alpha_0_to_1 * 255), shifted left 24 bits.
# Visage header (VISAGE_THEME_COLOR / VISAGE_THEME_VALUE macros)
python3 scripts/generate_theme.py theme.json --output Source/Theme.h
# JUCE LookAndFeel class
python3 scripts/generate_theme.py theme.json --mode juce --output Source/ThemeLookAndFeel.h
# Both at once
python3 scripts/generate_theme.py theme.json --mode both --output Source/Theme
# Validate only
python3 scripts/generate_theme.py theme.json --validate-only
visage::Palette palette;
palette.initWithDefaults(); // Load all registered token defaults
// Apply theme colors
palette.setColor(theme::KnobArc, visage::Color(0xFF00FFD4));
// Apply theme values
palette.setValue(theme::TextEditorRounding, 6.0f);
// Propagate to frame tree
rootFrame->setPalette(&palette);
For per-component theme regions (e.g., a dark header in a light app):
VISAGE_THEME_PALETTE_OVERRIDE(HeaderRegion);
// Set override colors
palette.setColor(HeaderRegion, theme::PanelBackground, visage::Color(0xFF1A1A2E));
// Apply to a frame subtree
headerFrame->setPaletteOverride(HeaderRegion, true);
The codegen produces a LookAndFeel_V4 subclass with all ColourIds set:
#include "ThemeLookAndFeel.h"
// In editor constructor:
static DefaultDarkLookAndFeel themeLAF;
setLookAndFeel(&themeLAF);
#RRGGBBAA order — Visage is 0xAARRGGBB (alpha FIRST)palette.initWithDefaults() before applying custom colorssetPalette() after modifying the palette| File | Purpose |
|---|---|
Tools/theme-designer.html | Visual preview + editing tool |
Tools/themes/default.json | Default theme with all tokens |
scripts/generate_theme.py | JSON to C++ codegen |
See references/token-catalog.md for all known Visage tokens with defaults.