diff --git a/src/client/AccountModal.ts b/src/client/AccountModal.ts index a1375f12d..6992a47e4 100644 --- a/src/client/AccountModal.ts +++ b/src/client/AccountModal.ts @@ -241,12 +241,12 @@ export class AccountModal extends BaseModal { private renderLogoutButton(): TemplateResult { return html` - - ${translateText("account_modal.log_out")} - + `; } @@ -318,19 +318,20 @@ export class AccountModal extends BaseModal { name="email" .value="${this.email}" @input="${this.handleEmailInput}" - class="w-full pl-4 pr-12 py-3 bg-white/5 border border-white/10 rounded-xl text-white placeholder-white/20 focus:outline-none focus:ring-2 focus:ring-blue-500/50 focus:border-blue-500/50 transition-all font-medium hover:bg-white/10" + class="w-full pl-4 pr-12 py-3 bg-white/5 border border-white/10 rounded-xl text-white placeholder-white/20 focus:outline-none focus:ring-2 focus:ring-malibu-blue/50 focus:border-malibu-blue/50 transition-all font-medium hover:bg-white/10" placeholder="${translateText( "account_modal.email_placeholder", )}" required /> - - ${translateText("account_modal.get_magic_link")} - + diff --git a/src/client/FlagInput.ts b/src/client/FlagInput.ts index c156dbc53..423c8608a 100644 --- a/src/client/FlagInput.ts +++ b/src/client/FlagInput.ts @@ -73,7 +73,7 @@ export class FlagInput extends LitElement { return html` diff --git a/src/client/FlagInputModal.ts b/src/client/FlagInputModal.ts index 9da509207..7d33a2240 100644 --- a/src/client/FlagInputModal.ts +++ b/src/client/FlagInputModal.ts @@ -149,15 +149,16 @@ export class FlagInputModal extends BaseModal { - { this.close(); window.showPage?.("page-item-store"); }} - > - ${translateText("main.store")} - + > @@ -128,19 +128,19 @@ export class GameModeSelector extends LitElement { ${this.renderSmallActionCard( translateText("main.create"), this.openHostLobby, - "bg-slate-600 hover:bg-slate-500 active:bg-slate-700", + "bg-surface hover:brightness-[1.08] active:brightness-[0.95] hover:scale-105", )} ${!crazyGamesSDK.isOnCrazyGames() ? this.renderSmallActionCard( translateText("mode_selector.ranked_title"), this.openRankedMenu, - "bg-slate-600 hover:bg-slate-500 active:bg-slate-700", + "bg-surface hover:brightness-[1.08] active:brightness-[0.95] hover:scale-105", ) : html``} ${this.renderSmallActionCard( translateText("main.join"), this.openJoinLobby, - "bg-slate-600 hover:bg-slate-500 active:bg-slate-700", + "bg-surface hover:brightness-[1.08] active:brightness-[0.95] hover:scale-105", )} @@ -192,7 +192,7 @@ export class GameModeSelector extends LitElement { ${this.renderSmallActionCard( translateText("main.solo"), this.openSinglePlayerModal, - "bg-[#0073b7] hover:bg-sky-500 active:bg-sky-700", + "bg-malibu-blue hover:bg-aquarius active:bg-malibu-blue/80", )} @@ -200,19 +200,19 @@ export class GameModeSelector extends LitElement { ${this.renderSmallActionCard( translateText("main.create"), this.openHostLobby, - "bg-slate-600 hover:bg-slate-500 active:bg-slate-700", + "bg-surface hover:brightness-[1.08] active:brightness-[0.95] hover:scale-105", )} ${!crazyGamesSDK.isOnCrazyGames() ? this.renderSmallActionCard( translateText("mode_selector.ranked_title"), this.openRankedMenu, - "bg-slate-600 hover:bg-slate-500 active:bg-slate-700", + "bg-surface hover:brightness-[1.08] active:brightness-[0.95] hover:scale-105", ) : html``} ${this.renderSmallActionCard( translateText("main.join"), this.openJoinLobby, - "bg-slate-600 hover:bg-slate-500 active:bg-slate-700", + "bg-surface hover:brightness-[1.08] active:brightness-[0.95] hover:scale-105", )} @@ -253,7 +253,7 @@ export class GameModeSelector extends LitElement { return html` ${title} @@ -299,7 +299,7 @@ export class GameModeSelector extends LitElement { return html` this.validateAndJoin(lobby)} - class="group relative w-full h-44 sm:h-full text-white uppercase rounded-2xl transition-transform duration-200 hover:scale-[1.02] active:scale-[0.98] bg-sky-950" + class="group relative w-full h-44 sm:h-full text-white uppercase rounded-2xl transition-transform duration-200 hover:scale-[1.02] active:scale-[0.98] bg-surface" > html`${label}`, )} @@ -335,7 +335,7 @@ export class GameModeSelector extends LitElement { ${timeDisplay} diff --git a/src/client/GameStartingModal.ts b/src/client/GameStartingModal.ts index feff2ab03..2c64f377f 100644 --- a/src/client/GameStartingModal.ts +++ b/src/client/GameStartingModal.ts @@ -33,7 +33,7 @@ export class GameStartingModal extends LitElement { href="https://github.com/openfrontio/OpenFrontIO/blob/main/CREDITS.md" target="_blank" rel="noopener noreferrer" - class="block mb-4 text-lg font-medium tracking-wider uppercase text-sky-400 no-underline transition-colors duration-200 hover:text-sky-300" + class="block mb-4 text-lg font-medium tracking-wider uppercase text-malibu-blue no-underline transition-colors duration-200 hover:text-aquarius" >${translateText("game_starting_modal.credits")} diff --git a/src/client/HelpModal.ts b/src/client/HelpModal.ts index c58a588fd..ab2e0d943 100644 --- a/src/client/HelpModal.ts +++ b/src/client/HelpModal.ts @@ -155,7 +155,7 @@ export class HelpModal extends BaseModal { - - ${this.clients.length === 1 + + ?disable=${this.clients.length < 2} + @click=${this.startGame} + > `; diff --git a/src/client/JoinLobbyModal.ts b/src/client/JoinLobbyModal.ts index 5e06fd959..dea832b87 100644 --- a/src/client/JoinLobbyModal.ts +++ b/src/client/JoinLobbyModal.ts @@ -160,7 +160,7 @@ export class JoinLobbyModal extends BaseModal { class="p-6 lg:p-6 border-t border-white/10 bg-black/20 shrink-0" > ${translateText("private_lobby.joined_waiting")} @@ -240,13 +240,12 @@ export class JoinLobbyModal extends BaseModal { @keyup=${this.handleChange} class="flex-1 px-4 py-3 bg-white/5 border border-white/10 rounded-xl text-white placeholder-white/40 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all font-mono text-sm tracking-wider" /> - - - - + `} + @click=${this.pasteFromClipboard} + > diff --git a/src/client/LanguageModal.ts b/src/client/LanguageModal.ts index 4fd2651e4..1bc9b3da0 100644 --- a/src/client/LanguageModal.ts +++ b/src/client/LanguageModal.ts @@ -58,7 +58,7 @@ export class LanguageModal extends BaseModal { buttonClasses += " animate-pulse font-bold text-white border-2 border-dashed border-cyan-400 shadow-[0_0_15px_rgba(34,211,238,0.2)] bg-gradient-to-r from-red-600 via-yellow-600 via-green-600 via-blue-600 to-purple-600"; } else if (isActive) { - buttonClasses += " bg-blue-500/20 border-blue-500/50"; + buttonClasses += " bg-malibu-blue/20 border-malibu-blue/50"; } else { buttonClasses += " bg-white/5 border-white/10 hover:bg-white/10 hover:border-white/20"; diff --git a/src/client/PatternInput.ts b/src/client/PatternInput.ts index 398158eb8..d36cf6a8e 100644 --- a/src/client/PatternInput.ts +++ b/src/client/PatternInput.ts @@ -111,7 +111,7 @@ export class PatternInput extends LitElement { return html` diff --git a/src/client/SinglePlayerModal.ts b/src/client/SinglePlayerModal.ts index 038d8b52e..682be4d04 100644 --- a/src/client/SinglePlayerModal.ts +++ b/src/client/SinglePlayerModal.ts @@ -348,12 +348,13 @@ export class SinglePlayerModal extends BaseModal { ${translateText("single_modal.options_changed_no_achievements")} ` : null} - - ${translateText("single_modal.start")} - + > `; diff --git a/src/client/Store.ts b/src/client/Store.ts index 39ee0dc03..f4e80b444 100644 --- a/src/client/Store.ts +++ b/src/client/Store.ts @@ -52,7 +52,7 @@ export class StoreModal extends BaseModal { (this.activeTab = "packs")} > @@ -61,7 +61,7 @@ export class StoreModal extends BaseModal { (this.activeTab = "patterns")} > @@ -70,7 +70,7 @@ export class StoreModal extends BaseModal { (this.activeTab = "flags")} > diff --git a/src/client/TerritoryPatternsModal.ts b/src/client/TerritoryPatternsModal.ts index 4c87c1f5f..605b24013 100644 --- a/src/client/TerritoryPatternsModal.ts +++ b/src/client/TerritoryPatternsModal.ts @@ -149,15 +149,16 @@ export class TerritoryPatternsModal extends BaseModal { - { this.close(); window.showPage?.("page-item-store"); }} - > - ${translateText("main.store")} - + > / ${translateText("troubleshooting.title")} - - ${translateText("common.copy")} - + > `, onBack: () => this.close(), ariaLabel: translateText("common.back"), diff --git a/src/client/UserSettingModal.ts b/src/client/UserSettingModal.ts index 30da04355..1d599ad0d 100644 --- a/src/client/UserSettingModal.ts +++ b/src/client/UserSettingModal.ts @@ -335,7 +335,7 @@ export class UserSettingModal extends BaseModal { (this.activeTab = "basic")} > @@ -344,7 +344,7 @@ export class UserSettingModal extends BaseModal { (this.activeTab = "keybinds")} > diff --git a/src/client/components/DesktopNavBar.ts b/src/client/components/DesktopNavBar.ts index c9d0a32c5..af220e04c 100644 --- a/src/client/components/DesktopNavBar.ts +++ b/src/client/components/DesktopNavBar.ts @@ -53,12 +53,17 @@ export class DesktopNavBar extends LitElement { class="hidden lg:flex w-full bg-zinc-900/90 backdrop-blur-md items-center justify-center gap-8 py-4 shrink-0 z-50 relative" > - - + + @@ -77,7 +82,7 @@ export class DesktopNavBar extends LitElement { diff --git a/src/client/components/GameConfigSettings.ts b/src/client/components/GameConfigSettings.ts index bd34dea83..39184d267 100644 --- a/src/client/components/GameConfigSettings.ts +++ b/src/client/components/GameConfigSettings.ts @@ -24,7 +24,7 @@ import "./FluentSlider"; import "./map/MapPicker"; const ACTIVE_CARD = - "bg-blue-500/20 border-blue-500/50 shadow-[0_0_15px_rgba(59,130,246,0.2)]"; + "bg-malibu-blue/20 border-malibu-blue/50 shadow-[var(--shadow-malibu-blue)]"; const INACTIVE_CARD = "bg-white/5 border-white/10 hover:bg-white/10 hover:border-white/20"; @@ -317,8 +317,8 @@ export class GameConfigSettings extends LitElement { ${renderSection( MAP_ICON, - "text-blue-400", - "bg-blue-500/20", + "text-aquarius", + "bg-malibu-blue/20", "map.map", html` 1 ${translateText("ios_banner.step_share")} 2 3 ${translateText("ios_banner.step_open")} @@ -125,7 +125,7 @@ export class IOSAddToHomeScreenBanner extends LitElement { ${translateText("ios_banner.got_it")} @@ -154,7 +154,7 @@ export class IOSAddToHomeScreenBanner extends LitElement { ${translateText("ios_banner.how")} diff --git a/src/client/components/LobbyPlayerView.ts b/src/client/components/LobbyPlayerView.ts index e7208c3ee..5dcd3eef0 100644 --- a/src/client/components/LobbyPlayerView.ts +++ b/src/client/components/LobbyPlayerView.ts @@ -126,7 +126,7 @@ export class LobbyTeamView extends LitElement { return html` ${displayName} @@ -242,7 +242,7 @@ export class LobbyTeamView extends LitElement { return html` ${displayName} diff --git a/src/client/components/MobileNavBar.ts b/src/client/components/MobileNavBar.ts index 110be7e8a..5a6217478 100644 --- a/src/client/components/MobileNavBar.ts +++ b/src/client/components/MobileNavBar.ts @@ -73,7 +73,7 @@ export class MobileNavBar extends LitElement { > { - return { - [OButton.BASE_CLASS]: true, - "w-full block": this.block, - "h-full w-full flex items-center justify-center": this.fill, - "lg:w-auto lg:inline-block": - !this.block && !this.blockDesktop && !this.fill, - "lg:w-1/2 lg:mx-auto lg:block": this.blockDesktop, - "bg-gray-700 text-gray-100 hover:bg-gray-600": this.secondary, - "disabled:opacity-70 disabled:cursor-not-allowed disabled:transform-none disabled:bg-gray-600": - this.disable, - }; + private readonly BASE = + "font-bold uppercase tracking-wider rounded-xl border border-transparent " + + "transition-all duration-300 transform hover:-translate-y-px " + + "outline-none text-center whitespace-normal break-words leading-tight overflow-hidden relative " + + "disabled:cursor-not-allowed disabled:hover:translate-y-0 disabled:opacity-70"; + + private variantClasses(): string { + switch (this.variant) { + case "primary": + return "bg-malibu-blue hover:bg-aquarius text-white disabled:bg-gray-600 disabled:text-gray-300"; + case "secondary": + return "bg-gray-700 hover:bg-gray-600 text-white disabled:bg-gray-800 disabled:text-gray-400"; + case "danger": + return "bg-red-600 hover:bg-red-500 text-white disabled:bg-red-900 disabled:text-gray-300"; + case "ghost": + return "bg-transparent hover:bg-white/10 text-malibu-blue disabled:text-gray-500 disabled:hover:bg-transparent"; + } + } + + private sizeClasses(): string { + if (this.iconPosition === "only") { + switch (this.size) { + case "sm": + return "w-8 h-8 text-sm"; + case "md": + return "w-10 h-10 text-base"; + case "lg": + return "w-12 h-12 text-lg"; + } + } + switch (this.size) { + case "sm": + return "py-1.5 px-3 text-sm"; + case "md": + return "py-3 px-4 text-base lg:text-lg"; + case "lg": + return "py-4 px-6 text-lg lg:text-xl"; + } + } + + private widthClasses(): string { + switch (this.width) { + case "auto": + return "inline-flex items-center justify-center gap-2"; + case "block": + return "flex w-full items-center justify-center gap-2"; + case "blockDesktop": + return "flex w-full items-center justify-center gap-2 lg:w-1/2 lg:mx-auto"; + case "fill": + return "flex w-full h-full items-center justify-center gap-2"; + } } render() { + const label = + this.translationKey === "" + ? this.title + : translateText(this.translationKey); + const iconOnly = this.iconPosition === "only"; + const classes = `${this.BASE} ${this.variantClasses()} ${this.sizeClasses()} ${this.widthClasses()}`; + return html` - - ${this.translationKey === "" - ? this.title - : translateText(this.translationKey)} - + ${this.icon && this.iconPosition !== "right" ? this.icon : nothing} + ${iconOnly ? nothing : html`${label}`} + ${this.icon && this.iconPosition === "right" ? this.icon : nothing} `; } diff --git a/src/client/components/baseComponents/ranking/PlayerRow.ts b/src/client/components/baseComponents/ranking/PlayerRow.ts index b954de0e3..9276defe2 100644 --- a/src/client/components/baseComponents/ranking/PlayerRow.ts +++ b/src/client/components/baseComponents/ranking/PlayerRow.ts @@ -240,7 +240,7 @@ export class PlayerRow extends LitElement { private renderTag(tag: string) { return html` ${tag} diff --git a/src/client/components/baseComponents/ranking/RankingControls.ts b/src/client/components/baseComponents/ranking/RankingControls.ts index 527681c7f..13cd7f33a 100644 --- a/src/client/components/baseComponents/ranking/RankingControls.ts +++ b/src/client/components/baseComponents/ranking/RankingControls.ts @@ -64,7 +64,7 @@ export class RankingControls extends LitElement { return html` this.onSort(type)} > diff --git a/src/client/components/baseComponents/setting/SettingSlider.ts b/src/client/components/baseComponents/setting/SettingSlider.ts index 17f7434a5..071cdc2d4 100644 --- a/src/client/components/baseComponents/setting/SettingSlider.ts +++ b/src/client/components/baseComponents/setting/SettingSlider.ts @@ -70,11 +70,11 @@ export class SettingSlider extends LitElement { this.onViewGame?.(game.gameId)} > ${this.isLoading diff --git a/src/client/components/map/MapPicker.ts b/src/client/components/map/MapPicker.ts index 2ad8da146..ea1105337 100644 --- a/src/client/components/map/MapPicker.ts +++ b/src/client/components/map/MapPicker.ts @@ -125,7 +125,7 @@ export class MapPicker extends LitElement { class="px-3 py-2 rounded-lg text-xs font-bold uppercase tracking-wider transition-all active:scale-95 ${this .showAllMaps ? "text-white/60 hover:text-white" - : "bg-blue-500/20 text-blue-100 shadow-[0_0_12px_rgba(59,130,246,0.2)]"}" + : "bg-malibu-blue/20 text-white shadow-[var(--shadow-malibu-blue-soft)]"}" @click=${() => (this.showAllMaps = false)} > ${translateText("map.featured")} @@ -136,7 +136,7 @@ export class MapPicker extends LitElement { aria-selected=${this.showAllMaps} class="px-3 py-2 rounded-lg text-xs font-bold uppercase tracking-wider transition-all active:scale-95 ${this .showAllMaps - ? "bg-blue-500/20 text-blue-100 shadow-[0_0_12px_rgba(59,130,246,0.2)]" + ? "bg-malibu-blue/20 text-white shadow-[var(--shadow-malibu-blue-soft)]" : "text-white/60 hover:text-white"}" @click=${() => (this.showAllMaps = true)} > @@ -160,7 +160,7 @@ export class MapPicker extends LitElement { type="button" class="w-full h-full p-3 flex flex-col items-center justify-between rounded-xl border cursor-pointer transition-all duration-200 active:scale-95 gap-3 group ${this .useRandomMap - ? "bg-blue-500/20 border-blue-500/50 shadow-[0_0_15px_rgba(59,130,246,0.3)]" + ? "bg-malibu-blue/20 border-malibu-blue/50 shadow-[var(--shadow-malibu-blue-strong)]" : "bg-white/5 border-white/10 hover:bg-white/10 hover:border-white/20 hover:-translate-y-1"}" @click=${this.handleSelectRandomMap} > diff --git a/src/client/graphics/layers/AttacksDisplay.ts b/src/client/graphics/layers/AttacksDisplay.ts index 3fe621226..d745b6bd6 100644 --- a/src/client/graphics/layers/AttacksDisplay.ts +++ b/src/client/graphics/layers/AttacksDisplay.ts @@ -283,7 +283,7 @@ export class AttacksDisplay extends LitElement implements Layer { > `, onClick: async () => this.attackWarningOnClick(attack), className: - "text-left text-sky-400 inline-flex items-center gap-0.5 lg:gap-1 min-w-0", + "text-left text-aquarius inline-flex items-center gap-0.5 lg:gap-1 min-w-0", translate: false, })} ${!attack.retreating @@ -293,7 +293,7 @@ export class AttacksDisplay extends LitElement implements Layer { className: "ml-auto text-left shrink-0", disabled: attack.retreating, }) - : html`(${translateText("events_display.retreating")}...)`} @@ -319,7 +319,7 @@ export class AttacksDisplay extends LitElement implements Layer { >${renderTroops(landAttack.troops)} ${translateText("help_modal.ui_wilderness")}`, className: - "text-left text-sky-400 inline-flex items-center gap-0.5 lg:gap-1 min-w-0", + "text-left text-aquarius inline-flex items-center gap-0.5 lg:gap-1 min-w-0", translate: false, })} ${!landAttack.retreating @@ -329,7 +329,7 @@ export class AttacksDisplay extends LitElement implements Layer { className: "ml-auto text-left shrink-0", disabled: landAttack.retreating, }) - : html`(${translateText("events_display.retreating")}...)`} @@ -374,7 +374,7 @@ export class AttacksDisplay extends LitElement implements Layer { >`, onClick: () => this.eventBus.emit(new GoToUnitEvent(boat)), className: - "text-left text-blue-400 inline-flex items-center gap-0.5 lg:gap-1 min-w-0", + "text-left text-aquarius inline-flex items-center gap-0.5 lg:gap-1 min-w-0", translate: false, })} ${!boat.retreating() @@ -384,7 +384,7 @@ export class AttacksDisplay extends LitElement implements Layer { className: "ml-auto text-left shrink-0", disabled: boat.retreating(), }) - : html`(${translateText("events_display.retreating")}...)`} diff --git a/src/client/graphics/layers/ControlPanel.ts b/src/client/graphics/layers/ControlPanel.ts index f5ae86a93..1bc72d3f5 100644 --- a/src/client/graphics/layers/ControlPanel.ts +++ b/src/client/graphics/layers/ControlPanel.ts @@ -158,13 +158,13 @@ export class ControlPanel extends LitElement implements Layer { ${greenPercent > 0 ? html`` : ""} ${orangePercent > 0 ? html`` : ""} @@ -213,13 +213,13 @@ export class ControlPanel extends LitElement implements Layer { ${greenPercent > 0 ? html`` : ""} ${orangePercent > 0 ? html`` : ""} @@ -326,7 +326,7 @@ export class ControlPanel extends LitElement implements Layer { .value=${String(Math.round(this.attackRatio * 100))} @input=${(e: Event) => this.handleRatioSliderInput(e)} @pointerup=${(e: Event) => this.handleRatioSliderPointerUp(e)} - class="flex-1 h-1.5 accent-blue-500 cursor-pointer" + class="flex-1 h-1.5 accent-aquarius cursor-pointer" /> `; @@ -373,7 +373,7 @@ export class ControlPanel extends LitElement implements Layer { .value=${String(Math.round(this.attackRatio * 100))} @input=${(e: Event) => this.handleRatioSliderInput(e)} @pointerup=${(e: Event) => this.handleRatioSliderPointerUp(e)} - class="w-full h-1.5 accent-blue-500 cursor-pointer" + class="w-full h-1.5 accent-aquarius cursor-pointer" /> diff --git a/src/client/graphics/layers/PlayerInfoOverlay.ts b/src/client/graphics/layers/PlayerInfoOverlay.ts index 3d5e55ad0..515ad5edb 100644 --- a/src/client/graphics/layers/PlayerInfoOverlay.ts +++ b/src/client/graphics/layers/PlayerInfoOverlay.ts @@ -322,18 +322,18 @@ export class PlayerInfoOverlay extends LitElement implements Layer { ↑↑ ${renderTroops(attackingTroops)} 0 ? html`` : ""} diff --git a/src/client/graphics/layers/ReplayPanel.ts b/src/client/graphics/layers/ReplayPanel.ts index fdef51510..ea48bbb60 100644 --- a/src/client/graphics/layers/ReplayPanel.ts +++ b/src/client/graphics/layers/ReplayPanel.ts @@ -98,7 +98,7 @@ export class ReplayPanel extends LitElement implements Layer { private renderSpeedButton(value: ReplaySpeedMultiplier, label: string) { const backgroundColor = - this._replaySpeedMultiplier === value ? "bg-blue-400" : ""; + this._replaySpeedMultiplier === value ? "bg-malibu-blue" : ""; return html` - - ${translateText("win_modal.exit")} - + > ${this.isRankedGame ? html` - - ${translateText("win_modal.requeue")} - + > ` : null} - - ${this.game?.myPlayer()?.isAlive() + + @click=${this.hide} + > `; diff --git a/src/client/styles.css b/src/client/styles.css index 08bbc3ba6..3e1db2116 100644 --- a/src/client/styles.css +++ b/src/client/styles.css @@ -5,7 +5,32 @@ @theme { --default-ring-width: 3px; - --default-ring-color: var(text-[#0073b7]); + --default-ring-color: var(--color-malibu-blue); + + /* Openfront.io brand palette — see Openfront_Brand_Guidelines.pdf §4 */ + --color-malibu-blue: #0084d1; + --color-aquarius: #3fa9f5; + --color-dawn-blue: #cccccc; + --color-bright-white: #ffffff; + + /* Openfront Masters sub-brand */ + --color-cyber-yellow: #ffd700; + --color-limestone: #999999; + + /* Background & decorative — not for standalone UI use */ + --color-deep-navy: #0a1628; + --color-hex-cyan: #00c8ff; + --color-frame-orange: #f97316; + + /* App-specific surface colors */ + --color-surface: #0a1628; + + --shadow-malibu-blue: 0 0 15px rgba(0, 132, 209, 0.2); + --shadow-malibu-blue-soft: 0 0 12px rgba(0, 132, 209, 0.2); + --shadow-malibu-blue-strong: 0 0 15px rgba(0, 132, 209, 0.3); + --shadow-malibu-blue-pill: 0 0 6px rgba(0, 132, 209, 0.35); + --shadow-malibu-blue-ring-sm: 0 0 0 4px rgba(0, 132, 209, 0.2); + --shadow-malibu-blue-ring-lg: 0 0 0 6px rgba(0, 132, 209, 0.3); } @layer base { @@ -113,7 +138,7 @@ body { padding: 15px 20px; font-size: 16px; cursor: pointer; - background-color: #0073b7; + background-color: var(--color-malibu-blue); color: white; border: none; border-radius: 8px; @@ -123,7 +148,7 @@ body { } .start-game-button:not(:disabled):hover { - background-color: #0073b7; + background-color: var(--color-aquarius); } .start-game-button:disabled { @@ -580,7 +605,7 @@ label.option-card:hover { /* News Button Notification */ news-button .active button { position: relative; - border-color: #0073b7 !important; + border-color: var(--color-malibu-blue) !important; border-width: 2px !important; box-shadow: 0 0 0 1px rgba(37, 99, 235, 0.5), diff --git a/src/client/styles/components/button.css b/src/client/styles/components/button.css deleted file mode 100644 index 5ee0eb2a1..000000000 --- a/src/client/styles/components/button.css +++ /dev/null @@ -1,88 +0,0 @@ -.c-button { - background: var(--primaryColor); - color: #fff; - cursor: pointer; - outline: none; - display: inline-block; - font-size: 16px; - font-weight: 700; - text-transform: uppercase; - letter-spacing: 0.05em; - border: 1px solid transparent; - text-align: center; - padding: 0.8rem 1rem; - border-radius: 0.75rem; - transition: var(--transition); - - @media (min-width: 1024px) { - font-size: 18px; - } -} - -.c-button:hover, -.c-button:active, -.c-button:focus { - background: var(--primaryColorHover); - transition: var(--transition); - transform: translateY(-1px); -} - -.c-button:disabled { - background: var(--primaryColorDisabled); - opacity: 0.7; - cursor: not-allowed; - transition: var(--transition); -} - -.c-button--secondary { - background: var(--secondaryColor); - color: var(--fontColor); -} - -.c-button--secondary:hover, -.c-button--secondary:active, -.c-button--secondary:focus { - background: var(--secondaryColorHover); -} - -.c-button--block { - display: block; - width: 100%; -} - -.c-button--blockDesktop { - display: block; - width: 100%; - - @media (min-width: 1024px) { - width: auto; - margin: 0 auto; - } -} - -.dark .c-button { - background: var(--primaryColorDark); - color: var(--fontColorLight); -} - -.dark .c-button:hover, -.dark .c-button:active, -.dark .c-button:focus { - background: var(--primaryColorHoverDark); -} - -.dark .c-button:disabled { - background: var(--primaryColorDisabledDark); - opacity: 0.7; -} - -.dark .c-button--secondary { - background: var(--secondaryColorDark); - color: var(--fontColorDark); -} - -.dark .c-button--secondary:hover, -.dark .c-button--secondary:active, -.dark .c-button--secondary:focus { - background: var(--secondaryColorHoverDark); -} diff --git a/src/client/styles/core/variables.css b/src/client/styles/core/variables.css index 6ed17b5d6..eb803871b 100644 --- a/src/client/styles/core/variables.css +++ b/src/client/styles/core/variables.css @@ -7,33 +7,26 @@ --fontColor: #202020; --fontColorLight: #fff; - /* Palette: Deep French Blue / Muted Cyan / Black / Forest Teal */ - --frenchBlue: #1f3a70; /* Deeper French Blue */ - --cyanBlue: #0f6ca3; /* Muted Cyan secondary */ - --tealAccent: #1f6c5a; /* Darker Teal accent */ - - --primaryColor: var(--frenchBlue); - --primaryColorHover: var(--tealAccent); + --primaryColorHover: var(--color-malibu-blue); --primaryColorDisabled: linear-gradient( to right, rgb(74, 74, 74), rgb(61, 61, 61) ); - --secondaryColor: var(--cyanBlue); - --secondaryColorHover: var(--cyanBlue); + --secondaryColor: var(--color-malibu-blue); + --secondaryColorHover: var(--color-aquarius); --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); - --primaryColorDark: var(--frenchBlue); - --primaryColorHoverDark: var(--tealAccent); + --primaryColorHoverDark: var(--color-malibu-blue); --primaryColorDisabledDark: #4b5563; - --secondaryColorDark: var(--tealAccent); - --secondaryColorHoverDark: var(--frenchBlue); + --secondaryColorDark: var(--color-malibu-blue); + --secondaryColorHoverDark: var(--color-aquarius); --fontColorDark: #f3f4f6; /* Achievements */ --medal-easy: #cd7f32; --medal-medium: #c0c0c0; - --medal-hard: #ffd700; + --medal-hard: var(--color-cyber-yellow); --medal-impossible: #d32f2f; --medal-custom: #2196f3; } diff --git a/src/client/styles/layout/header.css b/src/client/styles/layout/header.css index e753d12ec..5d2ada7c5 100644 --- a/src/client/styles/layout/header.css +++ b/src/client/styles/layout/header.css @@ -30,6 +30,6 @@ } .l-header__highlightText { - color: #0073b7; + color: var(--color-malibu-blue); font-weight: 700; }
diff --git a/src/client/HelpModal.ts b/src/client/HelpModal.ts index c58a588fd..ab2e0d943 100644 --- a/src/client/HelpModal.ts +++ b/src/client/HelpModal.ts @@ -155,7 +155,7 @@ export class HelpModal extends BaseModal {