feat(themes): swap Moonlit Bloom for Crystal Nocturne, sort built-ins by colour family

Crystal Nocturne (royal sapphire + electric magenta on obsidian, by
CRYSTALLITE) replaces Moonlit Bloom in the built-in roster. The same
chat-channel tinting convention applies: sapphire-blue identity on
party/team channels, accent-magenta on tells, and an alternating
mint/yellow/peach palette across the eight linkshell slots so each
LS stays individually distinguishable on the dark obsidian background.

Users who had Moonlit Bloom selected fall back to the default Hellion
Arctic on the first plugin load. A custom JSON copy of Moonlit Bloom
dropped into pluginConfigs/HellionChat/themes/ keeps working as a
user theme.

Plus a cosmetic re-sort of the registry: insertion order now drives a
deliberate Theme-Picker grid layout (3 columns) — blue family in row 1,
purple to magenta in row 2, green/warm/classic in row 3, Synthwave
Sunset alone in row 4 as a retro bonus.
This commit is contained in:
2026-05-12 21:28:16 +02:00
parent b46d3ad0a8
commit c5fe69f0d3
9 changed files with 102 additions and 87 deletions
+4
View File
@@ -65,6 +65,10 @@ changelog: |-
Dalamud.Utility.Util surface routed through an IPlatformUtil
indirection (MessageStore IsWine probe is now testable in
isolation)
- Built-in themes: Crystal Nocturne (sapphire and electric
magenta over obsidian, by CRYSTALLITE) replaces Moonlit Bloom.
Users with Moonlit Bloom selected fall back to Hellion Arctic
on first load
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
@@ -0,0 +1,82 @@
using HellionChat.Util;
namespace HellionChat.Themes.Builtin;
internal static class CrystalNocturne
{
public const string Slug = "crystal-nocturne";
public static Theme Build() =>
new(
Slug: Slug,
Name: "Crystal Nocturne",
Author: "CRYSTALLITE",
Description: "Royal sapphire and electric magenta over obsidian — a nocturne for the crystal-lit dance floor.",
Colors: new ThemeColors(
PrimaryDark: ColourUtil.HexToRgba("#1D4ED8"),
Primary: ColourUtil.HexToRgba("#3B82F6"),
PrimaryLight: ColourUtil.HexToRgba("#93C5FD"),
PrimaryGlow: ColourUtil.HexToRgba("#3B82F699"),
AccentDark: ColourUtil.HexToRgba("#A21CAF"),
Accent: ColourUtil.HexToRgba("#D946EF"),
AccentLight: ColourUtil.HexToRgba("#F0ABFC"),
Identity: ColourUtil.HexToRgba("#3B82F6"),
WindowBg: ColourUtil.HexToRgba("#08070F"),
ChildBg: ColourUtil.HexToRgba("#11101F"),
FrameBg: ColourUtil.HexToRgba("#1C1A33"),
Surface: ColourUtil.HexToRgba("#262340"),
SurfaceHover: ColourUtil.HexToRgba("#332D55"),
Border: ColourUtil.HexToRgba("#D946EF55"),
TextPrimary: ColourUtil.HexToRgba("#F5F3FF"),
TextMuted: ColourUtil.HexToRgba("#A5A0C0"),
TextDim: ColourUtil.HexToRgba("#4B4763"),
StatusSuccess: ColourUtil.HexToRgba("#10B981"),
StatusDanger: ColourUtil.HexToRgba("#F43F5E"),
StatusWarning: ColourUtil.HexToRgba("#FACC15"),
StatusInfo: ColourUtil.HexToRgba("#3B82F6")
),
Layout: new ThemeLayout(
WindowRounding: 2f,
ChildRounding: 1f,
PopupRounding: 2f,
FrameRounding: 1f,
GrabRounding: 1f,
TabRounding: 1f,
ScrollbarRounding: 2f,
WindowBorderSize: 1f,
FrameBorderSize: 1f
),
Typography: new ThemeTypography(),
IsBuiltIn: true,
ChatColors: new ThemeChatColors(
new Dictionary<HellionChat.Code.ChatType, uint>
{
// Crystal Nocturne — sapphire-blue identity for party/team channels,
// accent-magenta for tells, with mint/peach accents on linkshells
// so the eight LS slots stay individually distinguishable on the
// dark obsidian background.
[HellionChat.Code.ChatType.Say] = ColourUtil.HexToRgba("#F5F3FF"),
[HellionChat.Code.ChatType.Yell] = ColourUtil.HexToRgba("#FACC15"),
[HellionChat.Code.ChatType.Shout] = ColourUtil.HexToRgba("#F0B090"),
[HellionChat.Code.ChatType.TellIncoming] = ColourUtil.HexToRgba("#F0ABFC"),
[HellionChat.Code.ChatType.TellOutgoing] = ColourUtil.HexToRgba("#F0ABFC"),
[HellionChat.Code.ChatType.Party] = ColourUtil.HexToRgba("#93C5FD"),
[HellionChat.Code.ChatType.Alliance] = ColourUtil.HexToRgba("#F0B090"),
[HellionChat.Code.ChatType.FreeCompany] = ColourUtil.HexToRgba("#A8C8E8"),
[HellionChat.Code.ChatType.NoviceNetwork] = ColourUtil.HexToRgba("#10B981"),
[HellionChat.Code.ChatType.CrossParty] = ColourUtil.HexToRgba("#93C5FD"),
[HellionChat.Code.ChatType.Linkshell1] = ColourUtil.HexToRgba("#10B981"),
[HellionChat.Code.ChatType.Linkshell2] = ColourUtil.HexToRgba("#FACC15"),
[HellionChat.Code.ChatType.Linkshell3] = ColourUtil.HexToRgba("#F0ABFC"),
[HellionChat.Code.ChatType.Linkshell4] = ColourUtil.HexToRgba("#93C5FD"),
[HellionChat.Code.ChatType.Linkshell5] = ColourUtil.HexToRgba("#F0B090"),
[HellionChat.Code.ChatType.Linkshell6] = ColourUtil.HexToRgba("#A5A0C0"),
[HellionChat.Code.ChatType.Linkshell7] = ColourUtil.HexToRgba("#D946EF"),
[HellionChat.Code.ChatType.Linkshell8] = ColourUtil.HexToRgba("#3B82F6"),
[HellionChat.Code.ChatType.CustomEmote] = ColourUtil.HexToRgba("#F0B090"),
[HellionChat.Code.ChatType.StandardEmote] = ColourUtil.HexToRgba("#F0B090"),
[HellionChat.Code.ChatType.Echo] = ColourUtil.HexToRgba("#A5A0C0"),
}
)
);
}
@@ -1,80 +0,0 @@
using HellionChat.Util;
namespace HellionChat.Themes.Builtin;
internal static class MoonlitBloom
{
public const string Slug = "moonlit-bloom";
public static Theme Build() =>
new(
Slug: Slug,
Name: "Moonlit Bloom",
Author: "Hellion Forge",
Description: "Bloom Magenta + Soft Sage auf Deep Violet Night.",
Colors: new ThemeColors(
PrimaryDark: ColourUtil.HexToRgba("#C957D0"),
Primary: ColourUtil.HexToRgba("#E374E8"),
PrimaryLight: ColourUtil.HexToRgba("#EF8AF4"),
PrimaryGlow: ColourUtil.HexToRgba("#E374E899"),
AccentDark: ColourUtil.HexToRgba("#7AAC5C"),
Accent: ColourUtil.HexToRgba("#9CCB7C"),
AccentLight: ColourUtil.HexToRgba("#B6E297"),
Identity: ColourUtil.HexToRgba("#E374E8"),
WindowBg: ColourUtil.HexToRgba("#0E0C1F"),
ChildBg: ColourUtil.HexToRgba("#15122B"),
FrameBg: ColourUtil.HexToRgba("#1F1A38"),
Surface: ColourUtil.HexToRgba("#28224A"),
SurfaceHover: ColourUtil.HexToRgba("#332B5B"),
Border: ColourUtil.HexToRgba("#E374E844"),
TextPrimary: ColourUtil.HexToRgba("#ECE6F5"),
TextMuted: ColourUtil.HexToRgba("#9A8BB0"),
TextDim: ColourUtil.HexToRgba("#554B6E"),
StatusSuccess: ColourUtil.HexToRgba("#7AAC5C"),
StatusDanger: ColourUtil.HexToRgba("#E85C6A"),
StatusWarning: ColourUtil.HexToRgba("#E8B590"),
StatusInfo: ColourUtil.HexToRgba("#6278FF")
),
Layout: new ThemeLayout(
WindowRounding: 6f,
ChildRounding: 5f,
PopupRounding: 5f,
FrameRounding: 4f,
GrabRounding: 4f,
TabRounding: 4f,
ScrollbarRounding: 4f,
WindowBorderSize: 1f,
FrameBorderSize: 1f
),
Typography: new ThemeTypography(),
IsBuiltIn: true,
ChatColors: new ThemeChatColors(
new Dictionary<HellionChat.Code.ChatType, uint>
{
// Moonlit Bloom — Bloom-Magenta-Tönung. Sage-Drift in NoviceNetwork
// und Linkshell4. Tell-Pink-Identität bleibt sichtbar.
[HellionChat.Code.ChatType.Say] = ColourUtil.HexToRgba("#ECE6F5"),
[HellionChat.Code.ChatType.Yell] = ColourUtil.HexToRgba("#F0D080"),
[HellionChat.Code.ChatType.Shout] = ColourUtil.HexToRgba("#F09A60"),
[HellionChat.Code.ChatType.TellIncoming] = ColourUtil.HexToRgba("#EF8AF4"),
[HellionChat.Code.ChatType.TellOutgoing] = ColourUtil.HexToRgba("#EF8AF4"),
[HellionChat.Code.ChatType.Party] = ColourUtil.HexToRgba("#A0B0F0"),
[HellionChat.Code.ChatType.Alliance] = ColourUtil.HexToRgba("#F0B090"),
[HellionChat.Code.ChatType.FreeCompany] = ColourUtil.HexToRgba("#A8C8E8"),
[HellionChat.Code.ChatType.NoviceNetwork] = ColourUtil.HexToRgba("#9CCB7C"),
[HellionChat.Code.ChatType.CrossParty] = ColourUtil.HexToRgba("#A0B0F0"),
[HellionChat.Code.ChatType.Linkshell1] = ColourUtil.HexToRgba("#9CCB7C"),
[HellionChat.Code.ChatType.Linkshell2] = ColourUtil.HexToRgba("#F0BC92"),
[HellionChat.Code.ChatType.Linkshell3] = ColourUtil.HexToRgba("#F0D080"),
[HellionChat.Code.ChatType.Linkshell4] = ColourUtil.HexToRgba("#B6E297"),
[HellionChat.Code.ChatType.Linkshell5] = ColourUtil.HexToRgba("#A0B0F0"),
[HellionChat.Code.ChatType.Linkshell6] = ColourUtil.HexToRgba("#C098D8"),
[HellionChat.Code.ChatType.Linkshell7] = ColourUtil.HexToRgba("#EF8AF4"),
[HellionChat.Code.ChatType.Linkshell8] = ColourUtil.HexToRgba("#E8B0E8"),
[HellionChat.Code.ChatType.CustomEmote] = ColourUtil.HexToRgba("#E8B590"),
[HellionChat.Code.ChatType.StandardEmote] = ColourUtil.HexToRgba("#E8B590"),
[HellionChat.Code.ChatType.Echo] = ColourUtil.HexToRgba("#9A8BB0"),
}
)
);
}
+8 -4
View File
@@ -15,17 +15,21 @@ public sealed class ThemeRegistry
public ThemeRegistry(string? customThemesDir = null)
{
// Insertion order drives the Theme-Picker grid layout (3 columns).
// Row 1: blue family. Row 2: purple to magenta family.
// Row 3: green / warm / classic. Row 4: Synthwave Sunset as a
// retro bonus on its own line.
_builtIns = new Dictionary<string, Theme>(StringComparer.OrdinalIgnoreCase)
{
{ HellionArctic.Slug, HellionArctic.Build() },
{ HellionSpectrum.Slug, HellionSpectrum.Build() },
{ Chat2Classic.Slug, Chat2Classic.Build() },
{ EventHorizon.Slug, EventHorizon.Build() },
{ MoonlitBloom.Slug, MoonlitBloom.Build() },
{ NightBlue.Slug, NightBlue.Build() },
{ EventHorizon.Slug, EventHorizon.Build() },
{ IndigoViolet.Slug, IndigoViolet.Build() },
{ ForgeMerchantman.Slug, ForgeMerchantman.Build() },
{ CrystalNocturne.Slug, CrystalNocturne.Build() },
{ MintGrove.Slug, MintGrove.Build() },
{ ForgeMerchantman.Slug, ForgeMerchantman.Build() },
{ Chat2Classic.Slug, Chat2Classic.Build() },
{ SynthwaveSunset.Slug, SynthwaveSunset.Build() },
};