From c7253bdf02fbf8952693c1254a1beddbd302e6fa Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Sun, 3 May 2026 13:19:01 +0200 Subject: [PATCH] presets: add Night Blue and Indigo Violet bonus presets from KAZAMA themes --- ChatTwo/HellionChat.yaml | 7 +- ChatTwo/Resources/ChatColourPresets.cs | 101 +++++++++++++++++++ ChatTwo/Resources/HellionStrings.Designer.cs | 2 + ChatTwo/Resources/HellionStrings.de.resx | 6 ++ ChatTwo/Resources/HellionStrings.resx | 6 ++ repo.json | 2 +- 6 files changed, 120 insertions(+), 4 deletions(-) diff --git a/ChatTwo/HellionChat.yaml b/ChatTwo/HellionChat.yaml index 587c3dc..c43f346 100755 --- a/ChatTwo/HellionChat.yaml +++ b/ChatTwo/HellionChat.yaml @@ -68,11 +68,12 @@ changelog: |- Chat colour presets: - - Five built-in presets above the per-channel colour list in + - Seven built-in presets above the per-channel colour list in Settings → Appearance → Colours: ChatTwo Default, High-Contrast, - Pastell, Dark-Mode-Tuned, and Hellion (brand-coloured, blue/orange + Pastell, Dark-Mode-Tuned, Hellion (brand-coloured, blue/orange Arctic Cyan + Ember Glow palette from the Hellion Online Media - branding spec) + branding spec), plus two bonus mood presets — Night Blue (royal + blue, classic-cool) and Indigo Violet (royal violet, glitter-mystic) - Apply is immediate and overwrites the channels covered by the preset; battle-channel colours are left alone so combat tuning stays intact diff --git a/ChatTwo/Resources/ChatColourPresets.cs b/ChatTwo/Resources/ChatColourPresets.cs index f2b3e84..78b454d 100644 --- a/ChatTwo/Resources/ChatColourPresets.cs +++ b/ChatTwo/Resources/ChatColourPresets.cs @@ -48,6 +48,16 @@ public static class ChatColourPresets LocalizationKey: "ChatColourPresets_Hellion", IsBrandPreset: true, Colours: BuildHellion()), + ["NightBlue"] = new( + DisplayName: "Night Blue", + LocalizationKey: "ChatColourPresets_NightBlue", + IsBrandPreset: false, + Colours: BuildNightBlue()), + ["IndigoViolet"] = new( + DisplayName: "Indigo Violet", + LocalizationKey: "ChatColourPresets_IndigoViolet", + IsBrandPreset: false, + Colours: BuildIndigoViolet()), }; } @@ -212,4 +222,95 @@ public static class ChatColourPresets [ChatType.CrossLinkshell8] = ColourUtil.ComponentsToRgba(170, 60, 60), // Danger-dark }; } + + // Bonus preset — Night Blue, KAZAMA-Stimmungs-Theme aus + // /mnt/HDD-Data1/Obsidian/Vault/Systeme/KAZAMA/Theming/Night Blue + Indigo Violet Themes.md + // Klassisch, kühl, technisch — Marineblau-Tiefe ohne Lila-Anteil. + // Bewusst NICHT als Brand-Preset markiert (Vault-Boundary): die KAZAMA-Themes + // sind persönliche Stimmungs-Themes, nicht Teil des Hellion-Brand-Systems. + private static IReadOnlyDictionary BuildNightBlue() + { + return new Dictionary + { + // Standard / Tell — Royal Blue Akzent-Familie + [ChatType.Say] = ColourUtil.ComponentsToRgba(230, 237, 247), // text-primary + [ChatType.TellIncoming] = ColourUtil.ComponentsToRgba(106, 176, 255),// akzent-hot + [ChatType.TellOutgoing] = ColourUtil.ComponentsToRgba(74, 144, 226), // akzent-primary + + // Laute Channels — Warning/Danger Status-Töne + [ChatType.Yell] = ColourUtil.ComponentsToRgba(255, 184, 74), // warning + [ChatType.Shout] = ColourUtil.ComponentsToRgba(255, 92, 122), // danger + + // Gruppen — Success/Akzent-Variations + [ChatType.Party] = ColourUtil.ComponentsToRgba(61, 220, 151), // success + [ChatType.Alliance] = ColourUtil.ComponentsToRgba(255, 144, 100), // warm-orange-light + [ChatType.FreeCompany] = ColourUtil.ComponentsToRgba(74, 144, 226), // akzent-primary + [ChatType.NoviceNetwork] = ColourUtil.ComponentsToRgba(140, 160, 191),// text-dim + + // Linkshells 1-8 — über Spektrum verteilt + [ChatType.Linkshell1] = ColourUtil.ComponentsToRgba(255, 184, 74), + [ChatType.Linkshell2] = ColourUtil.ComponentsToRgba(255, 144, 100), + [ChatType.Linkshell3] = ColourUtil.ComponentsToRgba(255, 220, 130), + [ChatType.Linkshell4] = ColourUtil.ComponentsToRgba(130, 220, 100), + [ChatType.Linkshell5] = ColourUtil.ComponentsToRgba(61, 220, 151), + [ChatType.Linkshell6] = ColourUtil.ComponentsToRgba(100, 200, 220), + [ChatType.Linkshell7] = ColourUtil.ComponentsToRgba(106, 176, 255), + [ChatType.Linkshell8] = ColourUtil.ComponentsToRgba(140, 160, 191), + + // CrossWorld-Linkshells — gedämpfte Variants + [ChatType.CrossLinkshell1] = ColourUtil.ComponentsToRgba(200, 130, 50), + [ChatType.CrossLinkshell2] = ColourUtil.ComponentsToRgba(220, 110, 80), + [ChatType.CrossLinkshell3] = ColourUtil.ComponentsToRgba(200, 180, 60), + [ChatType.CrossLinkshell4] = ColourUtil.ComponentsToRgba(90, 180, 80), + [ChatType.CrossLinkshell5] = ColourUtil.ComponentsToRgba(30, 170, 110), + [ChatType.CrossLinkshell6] = ColourUtil.ComponentsToRgba(50, 130, 170), + [ChatType.CrossLinkshell7] = ColourUtil.ComponentsToRgba(50, 110, 180), + [ChatType.CrossLinkshell8] = ColourUtil.ComponentsToRgba(90, 100, 130), + }; + } + + // Bonus preset — Indigo Violet, KAZAMA-Stimmungs-Theme aus demselben + // Vault-Doc. Warm-mystisch, "Galaxy/Glitter/Nordlicht" — tiefes Indigo + // mit kräftigem Violet-Akzent. Persönlicher Favorit (siehe Vault). + // Auch nicht als Brand-Preset (siehe NightBlue-Note oben). + private static IReadOnlyDictionary BuildIndigoViolet() + { + return new Dictionary + { + // Standard / Tell — Royal Violet Akzent-Familie + [ChatType.Say] = ColourUtil.ComponentsToRgba(240, 230, 255), // text-primary (light lavender) + [ChatType.TellIncoming] = ColourUtil.ComponentsToRgba(176, 124, 255),// akzent-hot + [ChatType.TellOutgoing] = ColourUtil.ComponentsToRgba(139, 77, 222), // akzent-primary + + // Laute Channels — geteilt mit Night Blue (Status-Farben) + [ChatType.Yell] = ColourUtil.ComponentsToRgba(255, 184, 74), + [ChatType.Shout] = ColourUtil.ComponentsToRgba(255, 92, 122), + + // Gruppen + [ChatType.Party] = ColourUtil.ComponentsToRgba(61, 220, 151), + [ChatType.Alliance] = ColourUtil.ComponentsToRgba(255, 144, 100), + [ChatType.FreeCompany] = ColourUtil.ComponentsToRgba(139, 77, 222), // akzent-primary + [ChatType.NoviceNetwork] = ColourUtil.ComponentsToRgba(168, 144, 208),// text-dim + + // Linkshells 1-8 + [ChatType.Linkshell1] = ColourUtil.ComponentsToRgba(255, 184, 74), + [ChatType.Linkshell2] = ColourUtil.ComponentsToRgba(255, 144, 100), + [ChatType.Linkshell3] = ColourUtil.ComponentsToRgba(255, 220, 130), + [ChatType.Linkshell4] = ColourUtil.ComponentsToRgba(200, 124, 255), + [ChatType.Linkshell5] = ColourUtil.ComponentsToRgba(176, 124, 255), + [ChatType.Linkshell6] = ColourUtil.ComponentsToRgba(139, 77, 222), + [ChatType.Linkshell7] = ColourUtil.ComponentsToRgba(130, 90, 200), + [ChatType.Linkshell8] = ColourUtil.ComponentsToRgba(168, 144, 208), + + // CrossWorld-Linkshells + [ChatType.CrossLinkshell1] = ColourUtil.ComponentsToRgba(200, 130, 50), + [ChatType.CrossLinkshell2] = ColourUtil.ComponentsToRgba(220, 110, 80), + [ChatType.CrossLinkshell3] = ColourUtil.ComponentsToRgba(200, 180, 60), + [ChatType.CrossLinkshell4] = ColourUtil.ComponentsToRgba(130, 80, 180), + [ChatType.CrossLinkshell5] = ColourUtil.ComponentsToRgba(100, 60, 160), + [ChatType.CrossLinkshell6] = ColourUtil.ComponentsToRgba(91, 42, 154), + [ChatType.CrossLinkshell7] = ColourUtil.ComponentsToRgba(80, 50, 130), + [ChatType.CrossLinkshell8] = ColourUtil.ComponentsToRgba(117, 96, 160), + }; + } } diff --git a/ChatTwo/Resources/HellionStrings.Designer.cs b/ChatTwo/Resources/HellionStrings.Designer.cs index 35939a3..8a31150 100644 --- a/ChatTwo/Resources/HellionStrings.Designer.cs +++ b/ChatTwo/Resources/HellionStrings.Designer.cs @@ -249,6 +249,8 @@ internal class HellionStrings internal static string ChatColourPresets_Pastell => Get(nameof(ChatColourPresets_Pastell)); internal static string ChatColourPresets_DarkModeTuned => Get(nameof(ChatColourPresets_DarkModeTuned)); internal static string ChatColourPresets_Hellion => Get(nameof(ChatColourPresets_Hellion)); + internal static string ChatColourPresets_NightBlue => Get(nameof(ChatColourPresets_NightBlue)); + internal static string ChatColourPresets_IndigoViolet => Get(nameof(ChatColourPresets_IndigoViolet)); // Hellion Chat — v0.6.0 chat colour presets section copy internal static string Settings_Appearance_Colours_PresetsHint => Get(nameof(Settings_Appearance_Colours_PresetsHint)); diff --git a/ChatTwo/Resources/HellionStrings.de.resx b/ChatTwo/Resources/HellionStrings.de.resx index 944324b..dda1718 100644 --- a/ChatTwo/Resources/HellionStrings.de.resx +++ b/ChatTwo/Resources/HellionStrings.de.resx @@ -570,6 +570,12 @@ Hellion + + Night Blue + + + Indigo Violet + Tipp: Presets überschreiben deine aktuellen Channel-Farben sofort. diff --git a/ChatTwo/Resources/HellionStrings.resx b/ChatTwo/Resources/HellionStrings.resx index e4f70bc..c964166 100644 --- a/ChatTwo/Resources/HellionStrings.resx +++ b/ChatTwo/Resources/HellionStrings.resx @@ -570,6 +570,12 @@ Hellion + + Night Blue + + + Indigo Violet + Tip: presets overwrite your current channel colours immediately. diff --git a/repo.json b/repo.json index e2932f4..a203f58 100644 --- a/repo.json +++ b/repo.json @@ -20,7 +20,7 @@ "CanUnloadAsync": false, "LoadPriority": 0, "Punchline": "Chat 2 with privacy controls aligned to EU, US and JP rules", - "Changelog": "**Hellion Chat 0.6.0 — UX Polish: Pop-Out Input + Colour Presets**\n\nTwo opt-in UX features land in the same release. Existing users see\nno change unless they enable the new toggles.\n\nPop-out input bar:\n\n- New global master switch in Settings → Window → Frame: \"Enable input\n in pop-outs\". Default OFF so existing behaviour is preserved\n- When enabled, every pop-out window grows a compact input bar at the\n bottom (channel-coloured icon button left, text input right). The\n auto-translate picker is intentionally not part of the compact bar\n in v0.6.0 — typical pop-out workflows (FC greeter, club hostess)\n rarely need it there\n- Each pop-out keeps an independent text buffer and history cursor;\n channel changes still apply globally because that is how the FFXIV\n channel API works\n- Up/Down navigates a shared input history singleton across the main\n window and every open pop-out\n- First pop-out opening after the upgrade shows a one-time hint\n banner pointing users to the new toggle\n\nChat colour presets:\n\n- Five built-in presets above the per-channel colour list in\n Settings → Appearance → Colours: ChatTwo Default, High-Contrast,\n Pastell, Dark-Mode-Tuned, and Hellion (brand-coloured, blue/orange\n Arctic Cyan + Ember Glow palette from the Hellion Online Media\n branding spec)\n- Apply is immediate and overwrites the channels covered by the\n preset; battle-channel colours are left alone so combat tuning\n stays intact\n\nConfiguration migrates from v10 to v11 with a diagnostic log entry;\nno data is reset. Bilingual (English/German) for both new sections.\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n**Hellion Chat 0.5.4 — WrapText hardening**\n\nReplaces the unsafe pointer-arithmetic in ImGuiUtil.WrapText with\nSpan- and index-based control flow. Closes the persistent CodeQL\nCritical alert \"unvalidated local pointer arithmetic\" that kept\nre-firing on every shape of the previous fix.\n\nHardening:\n\n- WrapText now allocates a buffer sized by Encoding.UTF8.GetMaxByteCount\n via ArrayPool, validates the actual encoded length against that\n ceiling, and threads the rest of the algorithm through int offsets\n instead of raw byte pointers\n- Pointer arithmetic only happens inside two small private helpers\n (CalcWordWrap and DrawText) that take the pinned base pointer plus\n int offsets sourced from the plugin's own logic, not from any\n virtual-method return\n- Added a 16 KiB upper bound on the buffer rent to prevent a\n pathological input from triggering an unbounded ArrayPool allocation\n\nNo user-visible behaviour change. Word-wrap output is byte-identical\nto v0.5.3.\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n**Hellion Chat 0.5.3 — Pointer arithmetic hardening**\n\nClosed CodeQL Critical alert in ImGuiUtil.WrapText by validating the\nencoded byte buffer length via GetByteCount before pointer\narithmetic. Single-fix patch on top of v0.5.2.\n\n**Hellion Chat 0.5.2 — Bugfix patch**\n\nAuto-Tell-Tabs history-separator landed below the live tell instead\nof above (preload now excludes the trigger message). Plugin icon\npackaging fixed by removing a stale DalamudPackager.targets override\nthat conflicted with the SDK 15 default. Default config aligned to\nthe maintainer's daily driver: HellionThemeWindowOpacity 0.5,\nUse24HourClock true, Gruppe tab no longer auto-routes /party. Two\nearlier CodeQL findings closed (workflow permissions, empty-input\npointer arithmetic).\n\n**Hellion Chat 0.5.1 — Backlog Sweep**\n\nPure hardening and polish. Eight backlog items from the v0.5.0\ncodebase review collected into one patch: cleanup-preview-stale\ndetection, greeted-tab dim background, Performance HelpMarker\nconsistency, Tabs/Database tab names from HellionStrings,\nFontChooser framework-thread marshalling, async-void on\nEmoteCache.LoadData, parameterised SQL via BindIntList helper.\n\n---\n\nEarlier history at https://github.com/JonKazama-Hellion/HellionChat/releases.", + "Changelog": "**Hellion Chat 0.6.0 — UX Polish: Pop-Out Input + Colour Presets**\n\nTwo opt-in UX features land in the same release. Existing users see\nno change unless they enable the new toggles.\n\nPop-out input bar:\n\n- New global master switch in Settings → Window → Frame: \"Enable input\n in pop-outs\". Default OFF so existing behaviour is preserved\n- When enabled, every pop-out window grows a compact input bar at the\n bottom (channel-coloured icon button left, text input right). The\n auto-translate picker is intentionally not part of the compact bar\n in v0.6.0 — typical pop-out workflows (FC greeter, club hostess)\n rarely need it there\n- Each pop-out keeps an independent text buffer and history cursor;\n channel changes still apply globally because that is how the FFXIV\n channel API works\n- Up/Down navigates a shared input history singleton across the main\n window and every open pop-out\n- First pop-out opening after the upgrade shows a one-time hint\n banner pointing users to the new toggle\n\nChat colour presets:\n\n- Seven built-in presets above the per-channel colour list in\n Settings → Appearance → Colours: ChatTwo Default, High-Contrast,\n Pastell, Dark-Mode-Tuned, Hellion (brand-coloured, blue/orange\n Arctic Cyan + Ember Glow palette from the Hellion Online Media\n branding spec), plus two bonus mood presets — Night Blue (royal\n blue, classic-cool) and Indigo Violet (royal violet, glitter-mystic)\n- Apply is immediate and overwrites the channels covered by the\n preset; battle-channel colours are left alone so combat tuning\n stays intact\n\nConfiguration migrates from v10 to v11 with a diagnostic log entry;\nno data is reset. Bilingual (English/German) for both new sections.\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n**Hellion Chat 0.5.4 — WrapText hardening**\n\nReplaces the unsafe pointer-arithmetic in ImGuiUtil.WrapText with\nSpan- and index-based control flow. Closes the persistent CodeQL\nCritical alert \"unvalidated local pointer arithmetic\" that kept\nre-firing on every shape of the previous fix.\n\nHardening:\n\n- WrapText now allocates a buffer sized by Encoding.UTF8.GetMaxByteCount\n via ArrayPool, validates the actual encoded length against that\n ceiling, and threads the rest of the algorithm through int offsets\n instead of raw byte pointers\n- Pointer arithmetic only happens inside two small private helpers\n (CalcWordWrap and DrawText) that take the pinned base pointer plus\n int offsets sourced from the plugin's own logic, not from any\n virtual-method return\n- Added a 16 KiB upper bound on the buffer rent to prevent a\n pathological input from triggering an unbounded ArrayPool allocation\n\nNo user-visible behaviour change. Word-wrap output is byte-identical\nto v0.5.3.\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n**Hellion Chat 0.5.3 — Pointer arithmetic hardening**\n\nClosed CodeQL Critical alert in ImGuiUtil.WrapText by validating the\nencoded byte buffer length via GetByteCount before pointer\narithmetic. Single-fix patch on top of v0.5.2.\n\n**Hellion Chat 0.5.2 — Bugfix patch**\n\nAuto-Tell-Tabs history-separator landed below the live tell instead\nof above (preload now excludes the trigger message). Plugin icon\npackaging fixed by removing a stale DalamudPackager.targets override\nthat conflicted with the SDK 15 default. Default config aligned to\nthe maintainer's daily driver: HellionThemeWindowOpacity 0.5,\nUse24HourClock true, Gruppe tab no longer auto-routes /party. Two\nearlier CodeQL findings closed (workflow permissions, empty-input\npointer arithmetic).\n\n**Hellion Chat 0.5.1 — Backlog Sweep**\n\nPure hardening and polish. Eight backlog items from the v0.5.0\ncodebase review collected into one patch: cleanup-preview-stale\ndetection, greeted-tab dim background, Performance HelpMarker\nconsistency, Tabs/Database tab names from HellionStrings,\nFontChooser framework-thread marshalling, async-void on\nEmoteCache.LoadData, parameterised SQL via BindIntList helper.\n\n---\n\nEarlier history at https://github.com/JonKazama-Hellion/HellionChat/releases.", "AcceptsFeedback": true, "DownloadLinkInstall": "https://github.com/JonKazama-Hellion/HellionChat/releases/download/v0.6.0/latest.zip", "DownloadLinkUpdate": "https://github.com/JonKazama-Hellion/HellionChat/releases/download/v0.6.0/latest.zip",