From f3f0112d62f332fcd6b7d3e030ac96a769e7c60e Mon Sep 17 00:00:00 2001 From: hfcRed Date: Wed, 4 Mar 2026 17:49:41 +0100 Subject: [PATCH] Add chat name color --- app/components/CustomThemeSelector.tsx | 11 +++ app/db/tables.ts | 1 + app/features/chat/chat-types.ts | 2 +- app/features/chat/components/Chat.module.css | 2 +- app/features/chat/components/Chat.tsx | 4 +- .../sendouq-match/SQMatchRepository.server.ts | 4 +- .../sendouq/SQGroupRepository.server.ts | 6 +- .../components/GroupCard.browser.test.tsx | 4 +- .../tournament-bracket/core/tests/mocks-li.ts | 66 +++++++++--------- .../core/tests/mocks-sos.ts | 68 +++++++++---------- .../core/tests/mocks-zones-weekly.ts | 10 +-- .../tournament-bracket/core/tests/mocks.ts | 26 +++---- .../core/tests/test-utils.ts | 2 +- .../queries/findMatchById.server.ts | 4 +- .../tournament/TournamentRepository.server.ts | 8 +-- .../user-page/UserRepository.server.ts | 4 +- app/utils/kysely.server.ts | 8 +-- app/utils/oklch-gamut.ts | 1 + app/utils/zod.ts | 4 ++ locales/en/common.json | 1 + 20 files changed, 126 insertions(+), 110 deletions(-) diff --git a/app/components/CustomThemeSelector.tsx b/app/components/CustomThemeSelector.tsx index a26940b25..b34924d0b 100644 --- a/app/components/CustomThemeSelector.tsx +++ b/app/components/CustomThemeSelector.tsx @@ -54,6 +54,15 @@ const COLOR_SLIDERS = [ labelKey: "accentChroma", isHue: false, }, + { + id: "chat-hue", + inputKey: "chatHue", + min: THEME_INPUT_LIMITS.BASE_HUE_MIN, + max: THEME_INPUT_LIMITS.BASE_HUE_MAX, + step: 1, + labelKey: "chatHue", + isHue: true, + }, ] as const; const RADIUS_SLIDERS = [ @@ -132,6 +141,7 @@ export const DEFAULT_THEME_INPUT: ThemeInput = { baseChroma: 0.012, accentHue: 270, accentChroma: 0.24, + chatHue: 0, radiusBox: 3, radiusField: 2, radiusSelector: 2, @@ -153,6 +163,7 @@ export function themeInputFromCustomTheme( accentChroma: (customTheme["--_acc-c-1"] ?? 0) / ACCENT_CHROMA_MULTIPLIERS[1] || DEFAULT_THEME_INPUT.accentChroma, + chatHue: customTheme["--_chat-h"] ?? DEFAULT_THEME_INPUT.chatHue, radiusBox: customTheme["--_radius-box"] ?? DEFAULT_THEME_INPUT.radiusBox, radiusField: customTheme["--_radius-field"] ?? DEFAULT_THEME_INPUT.radiusField, diff --git a/app/db/tables.ts b/app/db/tables.ts index 7131e27dd..427290c88 100644 --- a/app/db/tables.ts +++ b/app/db/tables.ts @@ -60,6 +60,7 @@ export const CUSTOM_THEME_VARS = [ "--_second-c-3", "--_second-c-4", "--_second-c-5", + "--_chat-h", "--_radius-box", "--_radius-field", "--_radius-selector", diff --git a/app/features/chat/chat-types.ts b/app/features/chat/chat-types.ts index 1c2a4c976..67361a101 100644 --- a/app/features/chat/chat-types.ts +++ b/app/features/chat/chat-types.ts @@ -32,7 +32,7 @@ export type ChatUser = Pick< Tables["User"], "username" | "discordId" | "discordAvatar" | "pronouns" > & { - chatNameColor: string | null; + chatNameHue: string | null; title?: string; }; diff --git a/app/features/chat/components/Chat.module.css b/app/features/chat/components/Chat.module.css index 951eab235..e475d56ea 100644 --- a/app/features/chat/components/Chat.module.css +++ b/app/features/chat/components/Chat.module.css @@ -63,7 +63,7 @@ .messageUser { font-weight: var(--weight-semi); font-size: var(--font-sm); - color: var(--chat-user-color); + color: oklch(from var(--color-accent) l c var(--chat-hue)); max-width: 110px; overflow: hidden; text-overflow: ellipsis; diff --git a/app/features/chat/components/Chat.tsx b/app/features/chat/components/Chat.tsx index 87923d0a2..4230a328c 100644 --- a/app/features/chat/components/Chat.tsx +++ b/app/features/chat/components/Chat.tsx @@ -238,9 +238,7 @@ function Message({
{user?.username ?? missingUserName} diff --git a/app/features/sendouq-match/SQMatchRepository.server.ts b/app/features/sendouq-match/SQMatchRepository.server.ts index 76f20ac9b..4714f9e4e 100644 --- a/app/features/sendouq-match/SQMatchRepository.server.ts +++ b/app/features/sendouq-match/SQMatchRepository.server.ts @@ -15,7 +15,7 @@ import { COMMON_USER_FIELDS, concatUserSubmittedImagePrefix, tournamentLogoWithDefault, - userChatNameColor, + userChatNameHue, } from "~/utils/kysely.server"; import type { Unpacked } from "~/utils/types"; import { FULL_GROUP_SIZE } from "../sendouq/q-constants"; @@ -130,7 +130,7 @@ function groupWithTeamAndMembers( .orderBy("UserFriendCode.createdAt", "desc") .limit(1) .as("friendCode"), - userChatNameColor, + userChatNameHue, ]) .whereRef("GroupMember.groupId", "=", groupIdRef) .orderBy("GroupMember.userId", "asc"), diff --git a/app/features/sendouq/SQGroupRepository.server.ts b/app/features/sendouq/SQGroupRepository.server.ts index 9677f0852..9ebf3b702 100644 --- a/app/features/sendouq/SQGroupRepository.server.ts +++ b/app/features/sendouq/SQGroupRepository.server.ts @@ -8,7 +8,7 @@ import { shortNanoid } from "~/utils/id"; import invariant from "~/utils/invariant"; import { COMMON_USER_FIELDS, - userChatNameColorForJson, + userChatNameHueForJson, } from "~/utils/kysely.server"; import { errorIsSqliteForeignKeyConstraintFailure } from "~/utils/sql"; import { userIsBanned } from "../ban/core/banned.server"; @@ -41,7 +41,7 @@ export async function findCurrentGroups() { role: Tables["GroupMember"]["role"]; note: Tables["GroupMember"]["note"]; weapons: Tables["User"]["qWeaponPool"]; - chatNameColor: string | null; + chatNameHue: string | null; plusTier: Tables["PlusTier"]["tier"] | null; }; @@ -83,7 +83,7 @@ export async function findCurrentGroups() { languages: eb.ref("User.languages"), plusTier: eb.ref("PlusTier.tier"), vc: eb.ref("User.vc"), - chatNameColor: userChatNameColorForJson, + chatNameHue: userChatNameHueForJson, }), ]) .$castTo() diff --git a/app/features/sendouq/components/GroupCard.browser.test.tsx b/app/features/sendouq/components/GroupCard.browser.test.tsx index 84f1ec0bb..5e56e0055 100644 --- a/app/features/sendouq/components/GroupCard.browser.test.tsx +++ b/app/features/sendouq/components/GroupCard.browser.test.tsx @@ -36,7 +36,7 @@ function createMember(overrides: Partial = {}): SQGroupMember { pronouns: null, skillDifference: undefined, noScreen: undefined, - chatNameColor: null, + chatNameHue: null, mapModePreferences: undefined, ...overrides, }; @@ -89,7 +89,7 @@ function createOwnGroupMember( pronouns: null, skillDifference: undefined, noScreen: undefined, - chatNameColor: null, + chatNameHue: null, mapModePreferences: undefined, ...overrides, } satisfies OwnGroupMember; diff --git a/app/features/tournament-bracket/core/tests/mocks-li.ts b/app/features/tournament-bracket/core/tests/mocks-li.ts index 36f9d5997..a9437e435 100644 --- a/app/features/tournament-bracket/core/tests/mocks-li.ts +++ b/app/features/tournament-bracket/core/tests/mocks-li.ts @@ -6936,7 +6936,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "260999523806085120", discordAvatar: "4f15f20946fbd992ee9d694a539e6317", customUrl: "elemental", - chatNameColor: null, + chatNameHue: null, }, { userId: 622, @@ -6947,7 +6947,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "201922904781357057", discordAvatar: "7fa46b7dc27fa589d3d278ba4b60224f", customUrl: "dotjpg", - chatNameColor: null, + chatNameHue: null, }, { userId: 680, @@ -6958,7 +6958,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "87494390724964352", discordAvatar: "3b82ee3101ba39120b6a65c042a04a37", customUrl: "inkfarer", - chatNameColor: null, + chatNameHue: null, }, { userId: 936, @@ -6969,7 +6969,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "119620026767507456", discordAvatar: "aa1ff5b8eefd5a26657c411138a160b8", customUrl: null, - chatNameColor: null, + chatNameHue: null, }, { userId: 1402, @@ -6980,7 +6980,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "216335108037148673", discordAvatar: "458f1e233a3b590a62f6b867b95a6241", customUrl: "grace", - chatNameColor: null, + chatNameHue: null, }, { userId: 1755, @@ -6991,7 +6991,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "200777324520538113", discordAvatar: "a_d71ac2f474ce422ce711e8e74d657b2f", customUrl: "brushstrokes", - chatNameColor: null, + chatNameHue: null, }, { userId: 2908, @@ -7002,7 +7002,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "112254088992792576", discordAvatar: "711e8d48f316687faa4fdb41ab9298f0", customUrl: "kitsunekeira", - chatNameColor: null, + chatNameHue: null, }, { userId: 3742, @@ -7013,7 +7013,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "124007565758693376", discordAvatar: "ca9e37c9b31dfa39f88b2a2da2d4af21", customUrl: "thoma", - chatNameColor: "#bde5ff", + chatNameHue: "40", }, { userId: 3806, @@ -7024,7 +7024,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "113026708071821312", discordAvatar: "4b3f0da55a834acc0beb258edd9c7e34", customUrl: null, - chatNameColor: null, + chatNameHue: null, }, { userId: 4941, @@ -7035,7 +7035,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "236292964052107264", discordAvatar: "c95b9a8cfb9164f3a66267a5e8cfe8b1", customUrl: "hoeenhero", - chatNameColor: null, + chatNameHue: null, }, { userId: 5036, @@ -7046,7 +7046,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "248232091005747201", discordAvatar: "40a21a204f8fae6ae2e7e8c5de70de83", customUrl: "toasty", - chatNameColor: null, + chatNameHue: null, }, { userId: 8098, @@ -7057,7 +7057,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "442431978269310987", discordAvatar: "e0fd0fed98a4d3c3bfd56332678d4e6c", customUrl: "popgun", - chatNameColor: null, + chatNameHue: null, }, { userId: 8750, @@ -7068,7 +7068,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "273188925189914628", discordAvatar: "c62afa020e24ead92cc043ffa809ffdc", customUrl: "liberowolf", - chatNameColor: null, + chatNameHue: null, }, { userId: 9222, @@ -7079,7 +7079,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "298241282550267906", discordAvatar: "f69bb5af745eca4e9b7f55504c641f78", customUrl: "jardonian", - chatNameColor: null, + chatNameHue: null, }, { userId: 9719, @@ -7090,7 +7090,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "184478601171828737", discordAvatar: "75dedb3527b73d9571151f0a00d1c365", customUrl: "scepidilionz", - chatNameColor: "#00fa2a", + chatNameHue: "180", }, { userId: 18720, @@ -7101,7 +7101,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "103988435785650176", discordAvatar: "df9936bea9dcbd250daf8e2ef2d7c04a", customUrl: "tulip", - chatNameColor: null, + chatNameHue: null, }, ], }, @@ -7113,7 +7113,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "236292964052107264", discordAvatar: "c95b9a8cfb9164f3a66267a5e8cfe8b1", customUrl: "hoeenhero", - chatNameColor: null, + chatNameHue: null, }, staff: [ { @@ -7123,7 +7123,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "260999523806085120", discordAvatar: "4f15f20946fbd992ee9d694a539e6317", customUrl: "elemental", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -7133,7 +7133,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "176095582534762496", discordAvatar: "89e15b6e74f5abdef1183c9416434dde", customUrl: "pock", - chatNameColor: "#165bfc", + chatNameHue: "220", role: "ORGANIZER", }, { @@ -7143,7 +7143,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "87494390724964352", discordAvatar: "3b82ee3101ba39120b6a65c042a04a37", customUrl: "inkfarer", - chatNameColor: null, + chatNameHue: null, role: "STREAMER", }, { @@ -7153,7 +7153,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "334504066405367808", discordAvatar: "0d31f0d52ebfeaa0216fcacb86eb140a", customUrl: "shads", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -7163,7 +7163,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "112254088992792576", discordAvatar: "711e8d48f316687faa4fdb41ab9298f0", customUrl: "kitsunekeira", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -7173,7 +7173,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "412316772637736981", discordAvatar: "1408d204fa8a128efd2d2625476468c2", customUrl: null, - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -7183,7 +7183,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "578038263433134080", discordAvatar: "f552df977e0165e7fb93d1ce2a7512d4", customUrl: "bars", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -7193,7 +7193,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "230161540299489280", discordAvatar: "a_3ca2a0737b2c1e2b5e82ddc98fe79c8b", customUrl: "bowen", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -7203,7 +7203,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "678892046534311936", discordAvatar: "11490e6c0ace327ebc32a117b9e0510c", customUrl: "toes", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -7213,7 +7213,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "512418782933811221", discordAvatar: "c3afd465b53dedbb97fb9dd504d01305", customUrl: "neato", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -7223,7 +7223,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "182994907907096585", discordAvatar: "31da63dcb6dd1dbe4c3f135c105f07e7", customUrl: "strings", - chatNameColor: "#3f88fd", + chatNameHue: "220", role: "ORGANIZER", }, { @@ -7233,7 +7233,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "725416982681223259", discordAvatar: "cb9bf51b05f22c763a2b4812bdd574cc", customUrl: "michi", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -7243,7 +7243,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "367803257717784599", discordAvatar: "b8ad30de9487a9699093b728098e01d0", customUrl: "glumbaron", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -7253,7 +7253,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "1058063829973618698", discordAvatar: "dc110c2d77ea84e470c87a18ac0b7e5d", customUrl: "lemon7890", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -7263,7 +7263,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "1132918323697418310", discordAvatar: "48089383c5d666ae7ef8417d205bfa1f", customUrl: "eemeee", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -7273,7 +7273,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ discordId: "689577992430944281", discordAvatar: "911c0ac66f9489406ea4ae970e7ed5b0", customUrl: "pin-eye", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, ], diff --git a/app/features/tournament-bracket/core/tests/mocks-sos.ts b/app/features/tournament-bracket/core/tests/mocks-sos.ts index 7397010e9..b761f2816 100644 --- a/app/features/tournament-bracket/core/tests/mocks-sos.ts +++ b/app/features/tournament-bracket/core/tests/mocks-sos.ts @@ -2039,7 +2039,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "260999523806085120", discordAvatar: "a_71a6a4b4f76bd79bc9d7743e322a879d", customUrl: "elemental", - chatNameColor: null, + chatNameHue: null, }, { userId: 622, @@ -2050,7 +2050,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "201922904781357057", discordAvatar: "7fa46b7dc27fa589d3d278ba4b60224f", customUrl: "dotjpg", - chatNameColor: null, + chatNameHue: null, }, { userId: 680, @@ -2061,7 +2061,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "87494390724964352", discordAvatar: "3b82ee3101ba39120b6a65c042a04a37", customUrl: "inkfarer", - chatNameColor: null, + chatNameHue: null, }, { userId: 936, @@ -2072,7 +2072,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "119620026767507456", discordAvatar: "aa1ff5b8eefd5a26657c411138a160b8", customUrl: null, - chatNameColor: null, + chatNameHue: null, }, { userId: 1402, @@ -2083,7 +2083,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "216335108037148673", discordAvatar: "458f1e233a3b590a62f6b867b95a6241", customUrl: "grace", - chatNameColor: null, + chatNameHue: null, }, { userId: 1755, @@ -2094,7 +2094,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "200777324520538113", discordAvatar: "a_d71ac2f474ce422ce711e8e74d657b2f", customUrl: "brushstrokes", - chatNameColor: null, + chatNameHue: null, }, { userId: 2908, @@ -2105,7 +2105,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "112254088992792576", discordAvatar: "711e8d48f316687faa4fdb41ab9298f0", customUrl: "kitsunekeira", - chatNameColor: null, + chatNameHue: null, }, { userId: 3742, @@ -2116,7 +2116,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "124007565758693376", discordAvatar: "702429723f31a57326f87d11063139f7", customUrl: "thoma", - chatNameColor: "#bde5ff", + chatNameHue: "180", }, { userId: 3806, @@ -2127,7 +2127,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "113026708071821312", discordAvatar: "4b3f0da55a834acc0beb258edd9c7e34", customUrl: null, - chatNameColor: null, + chatNameHue: null, }, { userId: 4941, @@ -2138,7 +2138,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "236292964052107264", discordAvatar: "c95b9a8cfb9164f3a66267a5e8cfe8b1", customUrl: "hoeenhero", - chatNameColor: null, + chatNameHue: null, }, { userId: 5036, @@ -2149,7 +2149,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "248232091005747201", discordAvatar: "40a21a204f8fae6ae2e7e8c5de70de83", customUrl: "toasty", - chatNameColor: null, + chatNameHue: null, }, { userId: 8098, @@ -2160,7 +2160,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "442431978269310987", discordAvatar: "e0fd0fed98a4d3c3bfd56332678d4e6c", customUrl: "popgun", - chatNameColor: null, + chatNameHue: null, }, { userId: 8750, @@ -2171,7 +2171,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "273188925189914628", discordAvatar: "c62afa020e24ead92cc043ffa809ffdc", customUrl: "liberowolf", - chatNameColor: null, + chatNameHue: null, }, { userId: 9222, @@ -2182,7 +2182,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "298241282550267906", discordAvatar: "f69bb5af745eca4e9b7f55504c641f78", customUrl: "jardonian", - chatNameColor: null, + chatNameHue: null, }, { userId: 9719, @@ -2193,7 +2193,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "184478601171828737", discordAvatar: "75dedb3527b73d9571151f0a00d1c365", customUrl: "scepidilionz", - chatNameColor: "#00fa2a", + chatNameHue: "120", }, { userId: 18720, @@ -2204,7 +2204,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "103988435785650176", discordAvatar: "5fef4bf0c1b8a6a76fe2f43b956bfc3d", customUrl: "tulip", - chatNameColor: null, + chatNameHue: null, }, ], }, @@ -2216,7 +2216,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "216335108037148673", discordAvatar: "458f1e233a3b590a62f6b867b95a6241", customUrl: "grace", - chatNameColor: null, + chatNameHue: null, }, staff: [ { @@ -2226,7 +2226,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "333766288969302018", discordAvatar: "42d40d5ae6ff7081ae57bc02b6e2f717", customUrl: null, - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -2236,7 +2236,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "260999523806085120", discordAvatar: "a_71a6a4b4f76bd79bc9d7743e322a879d", customUrl: "elemental", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -2246,7 +2246,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "468596581357060097", discordAvatar: "940589e5c6793a5cbbab2adebd84fe0b", customUrl: null, - chatNameColor: "#ff6a00", + chatNameHue: "30", role: "ORGANIZER", }, { @@ -2256,7 +2256,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "418176537561661441", discordAvatar: "bab3e7a9cdb2071de7f2ae29256fc83b", customUrl: null, - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -2266,7 +2266,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "302160815132246016", discordAvatar: "da7cfcd1a5b8bee37cfa5d308b0898eb", customUrl: "mashimashi", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -2276,7 +2276,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "183025242266927104", discordAvatar: "a9475b488962953152c60f4f138b1618", customUrl: "tux", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -2286,7 +2286,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "343219263655510021", discordAvatar: "f30c675fc07203ca112d93fd03b5cc96", customUrl: "tbob408", - chatNameColor: "#3ac200", + chatNameHue: "120", role: "ORGANIZER", }, { @@ -2296,7 +2296,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "390444783425945602", discordAvatar: "e821ac7a457033d6c990bcaf518287e5", customUrl: null, - chatNameColor: null, + chatNameHue: null, role: "STREAMER", }, { @@ -2306,7 +2306,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "422790410566500352", discordAvatar: "77b479e49ec0d09edb8f9b975bff04ce", customUrl: "reefsixes", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -2316,7 +2316,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "360259023389327361", discordAvatar: "c5a2506e46e135b2568ef48242f669e8", customUrl: "kloud", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -2326,7 +2326,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "247504664378081280", discordAvatar: "a_a60bcc9c76d4baa9814287fdc5c28fe9", customUrl: "pipedreamdx", - chatNameColor: null, + chatNameHue: null, role: "STREAMER", }, { @@ -2336,7 +2336,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "184478601171828737", discordAvatar: "75dedb3527b73d9571151f0a00d1c365", customUrl: "scepidilionz", - chatNameColor: "#00fa2a", + chatNameHue: "120", role: "ORGANIZER", }, { @@ -2346,7 +2346,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "565712290020589569", discordAvatar: "498b21d6f64dcd56d06e61c2ec39e571", customUrl: "rooster", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -2356,7 +2356,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "103988435785650176", discordAvatar: "5fef4bf0c1b8a6a76fe2f43b956bfc3d", customUrl: "tulip", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -2366,7 +2366,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "221418644297482250", discordAvatar: "6b7156dcd0582ee160564bfa0c5cdc0e", customUrl: "fusionboltzgx", - chatNameColor: "#6d8283", + chatNameHue: "180", role: "ORGANIZER", }, { @@ -2376,7 +2376,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "458714559855722497", discordAvatar: "b815bb6090c2b32fec23f1336fae5663", customUrl: null, - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -2386,7 +2386,7 @@ export const SWIM_OR_SINK_167 = ( discordId: "599633578648928307", discordAvatar: "f5139304fb364bca35634a8e5cd11c0f", customUrl: "phantom_spl", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, ], diff --git a/app/features/tournament-bracket/core/tests/mocks-zones-weekly.ts b/app/features/tournament-bracket/core/tests/mocks-zones-weekly.ts index 1ee611b7f..d13ba51a9 100644 --- a/app/features/tournament-bracket/core/tests/mocks-zones-weekly.ts +++ b/app/features/tournament-bracket/core/tests/mocks-zones-weekly.ts @@ -338,7 +338,7 @@ export const ZONES_WEEKLY_38 = (): TournamentData => ({ discordId: "308483655515373570", discordAvatar: "a5fff2b4706d99364e646cab28c8085b", customUrl: "puma", - chatNameColor: null, + chatNameHue: null, }, staff: [ { @@ -348,7 +348,7 @@ export const ZONES_WEEKLY_38 = (): TournamentData => ({ discordId: "395757059922198548", discordAvatar: "2a569302e9545c6a07f8f8aa337d139d", customUrl: "penis", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -358,7 +358,7 @@ export const ZONES_WEEKLY_38 = (): TournamentData => ({ discordId: "267963609924108288", discordAvatar: "85090cfe2e0da693355bcec9740c1eaa", customUrl: "cookie", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -368,7 +368,7 @@ export const ZONES_WEEKLY_38 = (): TournamentData => ({ discordId: "507102073427460098", discordAvatar: "bd634c91f7d0475f3671956fa9a2110a", customUrl: null, - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -378,7 +378,7 @@ export const ZONES_WEEKLY_38 = (): TournamentData => ({ discordId: "111682034056835072", discordAvatar: "f1191c94b1da5396a06b620408017c1f", customUrl: "weizihao", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, ], diff --git a/app/features/tournament-bracket/core/tests/mocks.ts b/app/features/tournament-bracket/core/tests/mocks.ts index 5564cb1ff..9ff42f3b2 100644 --- a/app/features/tournament-bracket/core/tests/mocks.ts +++ b/app/features/tournament-bracket/core/tests/mocks.ts @@ -1469,7 +1469,7 @@ export const PADDLING_POOL_257 = () => discordId: "163771047068303360", discordAvatar: "b33d8f230218d6a92705a63fdf803851", customUrl: "alicetheto", - chatNameColor: "#ff0000", + chatNameHue: "180", }, staff: [ { @@ -1479,7 +1479,7 @@ export const PADDLING_POOL_257 = () => discordId: "178489224192851969", discordAvatar: "8b8c1d85cc525ea366f3ce2a6a594c05", customUrl: "pinky", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -1489,7 +1489,7 @@ export const PADDLING_POOL_257 = () => discordId: "275213752025088000", discordAvatar: "25bf68c5aa4e622ceb5a241c34841c6d", customUrl: null, - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -1499,7 +1499,7 @@ export const PADDLING_POOL_257 = () => discordId: "195618756800675841", discordAvatar: "a_03ec4bbcb2a4ab000237c9f3e9e71508", customUrl: "sdomi19", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -1509,7 +1509,7 @@ export const PADDLING_POOL_257 = () => discordId: "413759870333091884", discordAvatar: "a_b55f70ada809a600e73c5088b910e659", customUrl: "brufnie", - chatNameColor: null, + chatNameHue: null, role: "STREAMER", }, ], @@ -8068,7 +8068,7 @@ export const PADDLING_POOL_255 = () => discordId: "163771047068303360", discordAvatar: "b33d8f230218d6a92705a63fdf803851", customUrl: "alicetheto", - chatNameColor: "#ff0000", + chatNameHue: "0", }, staff: [ { @@ -8078,7 +8078,7 @@ export const PADDLING_POOL_255 = () => discordId: "178489224192851969", discordAvatar: "8b8c1d85cc525ea366f3ce2a6a594c05", customUrl: "pinky", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -8088,7 +8088,7 @@ export const PADDLING_POOL_255 = () => discordId: "275213752025088000", discordAvatar: "25bf68c5aa4e622ceb5a241c34841c6d", customUrl: null, - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -8098,7 +8098,7 @@ export const PADDLING_POOL_255 = () => discordId: "195618756800675841", discordAvatar: "a_03ec4bbcb2a4ab000237c9f3e9e71508", customUrl: "sdomi19", - chatNameColor: null, + chatNameHue: null, role: "ORGANIZER", }, { @@ -8108,7 +8108,7 @@ export const PADDLING_POOL_255 = () => discordId: "413759870333091884", discordAvatar: "a_b55f70ada809a600e73c5088b910e659", customUrl: "brufnie", - chatNameColor: null, + chatNameHue: null, role: "STREAMER", }, ], @@ -14993,7 +14993,7 @@ export const IN_THE_ZONE_32 = ({ discordId: "79237403620945920", discordAvatar: "6fc41a44b069a0d2152ac06d1e496c6c", customUrl: "sendou", - chatNameColor: null, + chatNameHue: null, }, staff: [ { @@ -15003,7 +15003,7 @@ export const IN_THE_ZONE_32 = ({ discordId: "163771047068303360", discordAvatar: "b33d8f230218d6a92705a63fdf803851", customUrl: "alicetheto", - chatNameColor: "#ff0000", + chatNameHue: "0", role: "STREAMER", }, { @@ -15013,7 +15013,7 @@ export const IN_THE_ZONE_32 = ({ discordId: "413759870333091884", discordAvatar: "a_b55f70ada809a600e73c5088b910e659", customUrl: "brufnie", - chatNameColor: null, + chatNameHue: null, role: "STREAMER", }, ], diff --git a/app/features/tournament-bracket/core/tests/test-utils.ts b/app/features/tournament-bracket/core/tests/test-utils.ts index 33ac413d4..59cdfbd85 100644 --- a/app/features/tournament-bracket/core/tests/test-utils.ts +++ b/app/features/tournament-bracket/core/tests/test-utils.ts @@ -95,7 +95,7 @@ export const testTournament = ({ seedingSnapshot: null, teams: nTeams(participant.length, Math.min(...participant)), author: { - chatNameColor: null, + chatNameHue: null, customUrl: null, discordAvatar: null, discordId: "123", diff --git a/app/features/tournament-bracket/queries/findMatchById.server.ts b/app/features/tournament-bracket/queries/findMatchById.server.ts index 23fa4e22b..8dd4bc3ed 100644 --- a/app/features/tournament-bracket/queries/findMatchById.server.ts +++ b/app/features/tournament-bracket/queries/findMatchById.server.ts @@ -31,7 +31,7 @@ const stm = sql.prepare(/* sql */ ` "User"."customUrl", 'discordAvatar', "User"."discordAvatar", - 'chatNameColor', IIF(COALESCE("User"."patronTier", 0) >= 2, "User"."customTheme" ->> 'chat', null), + 'chatNameHue', IIF(COALESCE("User"."patronTier", 0) >= 2, "User"."customTheme" ->> '--_chat-h', null), 'pronouns', json("User"."pronouns") ) ) as "players" @@ -85,7 +85,7 @@ export const findMatchById = (id: number) => { discordId: Tables["User"]["discordId"]; customUrl: Tables["User"]["customUrl"]; discordAvatar: Tables["User"]["discordAvatar"]; - chatNameColor: string | null; + chatNameHue: string | null; pronouns: Tables["User"]["pronouns"]; }> ).filter((player) => player.id), diff --git a/app/features/tournament/TournamentRepository.server.ts b/app/features/tournament/TournamentRepository.server.ts index c3c6d73cc..0b5971acc 100644 --- a/app/features/tournament/TournamentRepository.server.ts +++ b/app/features/tournament/TournamentRepository.server.ts @@ -20,7 +20,7 @@ import { COMMON_USER_FIELDS, concatUserSubmittedImagePrefix, tournamentLogoWithDefault, - userChatNameColor, + userChatNameHue, } from "~/utils/kysely.server"; import type { Unwrapped } from "~/utils/types"; import type { TournamentTierNumber } from "./core/tiering"; @@ -86,7 +86,7 @@ export async function findById(id: number) { "TournamentOrganizationMember.userId", "TournamentOrganizationMember.role", ...COMMON_USER_FIELDS, - userChatNameColor, + userChatNameHue, "User.pronouns", ]) .whereRef( @@ -106,7 +106,7 @@ export async function findById(id: number) { jsonObjectFrom( eb .selectFrom("User") - .select([...COMMON_USER_FIELDS, userChatNameColor, "User.pronouns"]) + .select([...COMMON_USER_FIELDS, userChatNameHue, "User.pronouns"]) .whereRef("User.id", "=", "CalendarEvent.authorId"), ).as("author"), jsonArrayFrom( @@ -115,7 +115,7 @@ export async function findById(id: number) { .innerJoin("User", "TournamentStaff.userId", "User.id") .select([ ...COMMON_USER_FIELDS, - userChatNameColor, + userChatNameHue, "User.pronouns", "TournamentStaff.role", ]) diff --git a/app/features/user-page/UserRepository.server.ts b/app/features/user-page/UserRepository.server.ts index e8936de32..dca6f5e36 100644 --- a/app/features/user-page/UserRepository.server.ts +++ b/app/features/user-page/UserRepository.server.ts @@ -20,7 +20,7 @@ import { COMMON_USER_FIELDS, concatUserSubmittedImagePrefix, tournamentLogoOrNull, - userChatNameColor, + userChatNameHue, } from "~/utils/kysely.server"; import { logger } from "~/utils/logger"; import { safeNumberParse } from "~/utils/number"; @@ -522,7 +522,7 @@ export async function findChatUsersByUserIds(userIds: number[]) { "User.discordAvatar", "User.username", "User.pronouns", - userChatNameColor, + userChatNameHue, ]) .where("User.id", "in", userIds) .execute(); diff --git a/app/utils/kysely.server.ts b/app/utils/kysely.server.ts index e88ec1dd4..0b8405f0a 100644 --- a/app/utils/kysely.server.ts +++ b/app/utils/kysely.server.ts @@ -22,13 +22,13 @@ export type CommonUser = Pick< "id" | "username" | "discordId" | "discordAvatar" | "customUrl" >; -const userChatNameColorRaw = sql< +const userChatNameHueRaw = sql< string | null ->`IIF(COALESCE("User"."patronTier", 0) >= 2, "User"."customTheme" ->> 'chat', null)`; +>`IIF(COALESCE("User"."patronTier", 0) >= 2, "User"."customTheme" ->> '--_chat-h', null)`; -export const userChatNameColor = userChatNameColorRaw.as("chatNameColor"); +export const userChatNameHue = userChatNameHueRaw.as("chatNameHue"); -export const userChatNameColorForJson = userChatNameColorRaw; +export const userChatNameHueForJson = userChatNameHueRaw; export function commonUserJsonObject(eb: ExpressionBuilder) { return jsonBuildObject({ diff --git a/app/utils/oklch-gamut.ts b/app/utils/oklch-gamut.ts index 38ed2fb95..dd006373e 100644 --- a/app/utils/oklch-gamut.ts +++ b/app/utils/oklch-gamut.ts @@ -327,6 +327,7 @@ export function clampThemeToGamut(input: ThemeInput): CustomTheme { "--_second-c-3": clampedSecondaryChromas[3], "--_second-c-4": clampedSecondaryChromas[4], "--_second-c-5": clampedSecondaryChromas[5], + "--_chat-h": input.chatHue, "--_radius-box": input.radiusBox, "--_radius-field": input.radiusField, "--_radius-selector": input.radiusSelector, diff --git a/app/utils/zod.ts b/app/utils/zod.ts index 2f7899c8e..32817fded 100644 --- a/app/utils/zod.ts +++ b/app/utils/zod.ts @@ -78,6 +78,10 @@ export const themeInputSchema = z.object({ .number() .min(THEME_INPUT_LIMITS.ACCENT_CHROMA_MIN) .max(THEME_INPUT_LIMITS.ACCENT_CHROMA_MAX), + chatHue: z + .number() + .min(THEME_INPUT_LIMITS.BASE_HUE_MIN) + .max(THEME_INPUT_LIMITS.BASE_HUE_MAX), radiusBox: z .number() .int() diff --git a/locales/en/common.json b/locales/en/common.json index 74bf47af3..059cec3eb 100644 --- a/locales/en/common.json +++ b/locales/en/common.json @@ -332,6 +332,7 @@ "settings.customTheme.baseChroma": "Base chroma", "settings.customTheme.accentHue": "Accent hue", "settings.customTheme.accentChroma": "Accent chroma", + "settings.customTheme.chatHue": "Chat name color", "settings.customTheme.boxes": "Boxes", "settings.customTheme.fields": "Fields", "settings.customTheme.selectors": "Selectors",