Merge pull request 'Make the default theme near-neutral and tone down the presets' (#15) from neutral-themes into master

Reviewed-on: #15
This commit was merged in pull request #15.
This commit is contained in:
2026-10-03 04:12:16 +00:00
3 changed files with 26 additions and 17 deletions
@@ -10,26 +10,27 @@ import org.saturnclient.config.property.SelectProperty;
public class Theme {
public static ConfigManager config;
// Main UI background (slightly warm dark to match Saturn tone), translucent over the world
public static final ColorProperty BACKGROUND = Property.color(0xD112100D);
// Main UI background (a near-neutral dark, so the warm world showing through
// doesn't muddy it), translucent over the world
public static final ColorProperty BACKGROUND = Property.color(0xD1131417);
// Default text color
public static final ColorProperty FOREGROUND = Property.color(0xFFF2E6D2);
public static final ColorProperty FOREGROUND = Property.color(0xFFECEFF3);
// Widget default background (normal state), translucent over the world
public static final ColorProperty PRIMARY = Property.color(0xB81C1915);
public static final ColorProperty PRIMARY = Property.color(0xB81E2025);
// Widget text color
public static final ColorProperty PRIMARY_FG = Property.color(0xFFEAD9B8);
public static final ColorProperty PRIMARY_FG = Property.color(0xFFD5DAE1);
// Saturn brand color (hovered / enabled / selected)
public static final ColorProperty ACCENT = Property.color(0xFFE2BF7D);
// Saturn brand color, a pale frost (hovered / enabled / selected)
public static final ColorProperty ACCENT = Property.color(0xFFD3DCE6);
// Text/icons shown on accent background
public static final ColorProperty ACCENT_FG = Property.color(0xFF1A140A);
public static final ColorProperty ACCENT_FG = Property.color(0xFF15181C);
// Misc colors
public static final ColorProperty SCROLL = Property.color(0xFFE2BF7D);
// Misc colors: the one warm touch, Saturn's butterscotch
public static final ColorProperty SCROLL = Property.color(0xFFD9B98A);
// UI metrics
public static final IntProperty BG_RADIUS = Property.integer(12).range(0, 24);
@@ -62,10 +63,11 @@ public class Theme {
}
public static final List<Preset> PRESETS = List.of(
new Preset("Saturn", 0xD112100D, 0xFFF2E6D2, 0xB81C1915, 0xFFEAD9B8, 0xFFE2BF7D, 0xFF1A140A, 0xFFE2BF7D),
new Preset("Midnight", 0xD10E1117, 0xFFE4EAF5, 0xB8171C26, 0xFFC9D4E8, 0xFF8FB3FF, 0xFF0A1224, 0xFF8FB3FF),
new Preset("Amethyst", 0xD1120F17, 0xFFEDE4F7, 0xB81C1724, 0xFFD8C9EB, 0xFFC79BFF, 0xFF1A0F2A, 0xFFC79BFF),
new Preset("Emerald", 0xD10D1210, 0xFFE2F2EA, 0xB816201B, 0xFFC4E0D2, 0xFF7FD1A8, 0xFF0A1F15, 0xFF7FD1A8));
new Preset("Saturn", 0xD1131417, 0xFFECEFF3, 0xB81E2025, 0xFFD5DAE1, 0xFFD3DCE6, 0xFF15181C, 0xFFD9B98A),
new Preset("Saturn Gold", 0xD112100D, 0xFFF2E6D2, 0xB81C1915, 0xFFEAD9B8, 0xFFE2BF7D, 0xFF1A140A, 0xFFE2BF7D),
new Preset("Mono", 0xD1121212, 0xFFF0F0F0, 0xB81C1C1C, 0xFFDADADA, 0xFFF0F0F0, 0xFF121212, 0xFFF0F0F0),
new Preset("Midnight", 0xD1121418, 0xFFE5E9F0, 0xB81C2027, 0xFFD8DEE9, 0xFF8FAFCF, 0xFF10151D, 0xFF8FAFCF),
new Preset("Amethyst", 0xD1141317, 0xFFECE8F1, 0xB81F1D24, 0xFFDAD3E3, 0xFFB49CCB, 0xFF19131F, 0xFFB49CCB));
public static void init(ConfigManager parent) {
config = new ConfigManager(parent, "UI Style");
@@ -12,6 +12,8 @@ import org.saturnclient.ui.resources.Fonts;
*/
public class ThemePresetCard extends Element {
public static final int HEIGHT = 92;
/** The narrowest card that still fits its preview's widgets */
public static final int MIN_WIDTH = 100;
private static final int PADDING = 10;
private static final int PREVIEW_HEIGHT = 44;
@@ -102,15 +102,20 @@ public class ClientSettings extends PanelScreen {
Map<String, Property> properties = Theme.config.getProperties();
int y = PropertyList.drawSection(scroll, "Presets", 0) + 10;
int cardWidth = (width - PRESET_GAP * (Theme.PRESETS.size() - 1)) / Theme.PRESETS.size();
// One row when the cards fit, otherwise as many rows as they need
int columns = Math.max(1, Math.min(Theme.PRESETS.size(),
(width + PRESET_GAP) / (ThemePresetCard.MIN_WIDTH + PRESET_GAP)));
int rows = (Theme.PRESETS.size() + columns - 1) / columns;
int cardWidth = (width - PRESET_GAP * (columns - 1)) / columns;
for (int i = 0; i < Theme.PRESETS.size(); i++) {
// Rebuild so the color inputs show the preset's colors
scroll.draw(new ThemePresetCard(Theme.PRESETS.get(i), cardWidth, this::init)
.position(i * (cardWidth + PRESET_GAP), y));
.position(i % columns * (cardWidth + PRESET_GAP),
y + i / columns * (ThemePresetCard.HEIGHT + PRESET_GAP)));
}
y += ThemePresetCard.HEIGHT + SECTION_GAP;
y += rows * ThemePresetCard.HEIGHT + (rows - 1) * PRESET_GAP + SECTION_GAP;
y = PropertyList.drawSection(scroll, "Colors", y) + 10;
y = ColorGrid.draw(scroll, properties, width, y) + SECTION_GAP;