SSPACEAGEDOCUMENTATION/
Product and Design

SpaceAge Theme System

Updated Aug 27, 2026   |   2.1 KB   |   docs/Spaceage_Theme_System.md

SpaceAge Theme System

This is the first pass at making the GUI palette maintainable, themeable, and safe for future skins.

Current Artifact

The current color audit workbook is:

outputs/reports/SpaceAge_GUI_Color_Audit_Theme_System.xlsx

It contains:

  • Theme Tokens: human-readable color roles intended for Google Sheets editing.
  • Unique Colors: every unique hard-coded hex value found in the core source files, with occurrence counts.
  • Raw Code Audit: file, line, hex value, inferred usage, and source expression.
  • Google Sheet Workflow: the intended edit/export/generate process.

Intended Workflow

  1. Import the workbook into Google Sheets or edit it locally.
  2. Change only the Current hex values in Theme Tokens unless creating a new approved token.
  3. Export the Theme Tokens sheet as SpaceAgeThemeTokens.csv.
  4. Run a future palette generator that creates a C++ theme header from the CSV.
  5. Replace raw juce::Colour(...) literals with named theme tokens over time.

Design Rules

  • Token names should describe purpose, not visual taste. For example: space.play, not space.redButton.
  • Subscription theme packs should ship as signed theme files with version metadata, not as arbitrary loose art files.
  • The default SpaceAge palette remains the brand source of truth.
  • User-selectable skins should never break contrast, warning states, transport states, or selected/active states.

Current Visual Decisions

  • Redshift GUI rotary direction: use Option A, the current moon-gradient dial, as the first implementation target. Keep the deep dark face, subtle lunar highlight, thin orange pointer, and existing SpaceAge control language rather than introducing a new knob family yet.

Next Implementation Step

Create a small generator that reads SpaceAgeThemeTokens.csv and emits something like:

struct SpaceAgeTheme
{
    juce::Colour playTransport;
    juce::Colour appBackground;
    juce::Colour arrangementClip;
    // ...
};

Then begin replacing the most repeated color literals first: background, text, transport, active blue, muted/unmuted states, arrangement clips, and navigation bands.