From 0c543a1a01bc50fb2f36c0e37059d63dd587649f Mon Sep 17 00:00:00 2001 From: Mathias Wagner Date: Wed, 14 May 2025 21:10:26 +0200 Subject: [PATCH] Add player name visibility toggle and enhance display logic in lobby and results screens --- .../styles/components/lobby-screen.sass | 14 +++++ .../styles/components/results-screen.sass | 8 +++ client/src/common/styles/forms.sass | 54 +++++++++++++++---- client/src/components/HomeScreen.jsx | 2 +- client/src/components/LobbyScreen.jsx | 24 +++++++-- client/src/components/ResultsScreen.jsx | 34 +++++++++++- .../src/components/SongSubmissionScreen.jsx | 5 +- client/src/components/VotingScreen.jsx | 3 +- client/src/utils/playerUtils.js | 45 ++++++++++++++++ server/game.js | 8 ++- 10 files changed, 178 insertions(+), 19 deletions(-) create mode 100644 client/src/utils/playerUtils.js diff --git a/client/src/common/styles/components/lobby-screen.sass b/client/src/common/styles/components/lobby-screen.sass index 8b23d75..40803a6 100644 --- a/client/src/common/styles/components/lobby-screen.sass +++ b/client/src/common/styles/components/lobby-screen.sass @@ -179,13 +179,27 @@ padding: 2rem width: 90% max-width: 500px + border: 6px solid #000 + box-shadow: 10px 10px 0 rgba(0, 0, 0, 0.5) + animation: modal-appear 0.3s ease-out h2 margin-top: 0 color: $primary + font-family: 'Press Start 2P', monospace + font-size: 1.4rem + margin-bottom: 1.5rem .modal-actions display: flex justify-content: flex-end gap: 1rem margin-top: 2rem + + @keyframes modal-appear + 0% + transform: scale(0.8) + opacity: 0 + 100% + transform: scale(1) + opacity: 1 diff --git a/client/src/common/styles/components/results-screen.sass b/client/src/common/styles/components/results-screen.sass index a334a0b..bc9c844 100644 --- a/client/src/common/styles/components/results-screen.sass +++ b/client/src/common/styles/components/results-screen.sass @@ -243,6 +243,14 @@ padding: 0.25rem 0.5rem border-radius: 1rem background-color: rgba(255, 255, 255, 0.1) + margin-right: 0.5rem + + .submitter + display: block + font-size: 0.8rem + color: $text-muted + margin-top: 0.5rem + font-style: italic .versus font-family: 'Bangers', cursive diff --git a/client/src/common/styles/forms.sass b/client/src/common/styles/forms.sass index 92adc47..bc89437 100644 --- a/client/src/common/styles/forms.sass +++ b/client/src/common/styles/forms.sass @@ -53,17 +53,26 @@ border: 3px solid #000 position: relative cursor: pointer + box-shadow: 3px 3px 0 rgba(0, 0, 0, 0.2) + transition: all 0.2s ease - &:checked:after - content: '' - position: absolute - left: 6px - top: 2px - width: 6px - height: 12px - border: solid $primary - border-width: 0 3px 3px 0 - transform: rotate(45deg) + &:hover + border-color: $secondary + + &:checked + background-color: rgba($primary, 0.2) + border-color: $primary + + &:after + content: '' + position: absolute + left: 6px + top: 2px + width: 6px + height: 12px + border: solid $primary + border-width: 0 3px 3px 0 + transform: rotate(45deg) &.checkbox display: flex @@ -86,6 +95,31 @@ gap: 1rem margin-top: 1.5rem +// Checkbox group with helper text +.checkbox-group + display: flex + flex-direction: column + margin-bottom: 1.5rem + + .checkbox-container + display: flex + align-items: center + margin-bottom: 0.5rem + + input[type="checkbox"] + margin-right: 0.75rem + min-width: 24px + height: 24px + + label + margin-bottom: 0 + margin-top: 0 + cursor: pointer + font-family: 'Press Start 2P', monospace + font-size: 0.8rem + text-transform: uppercase + color: $secondary + // Buttons .btn display: inline-flex diff --git a/client/src/components/HomeScreen.jsx b/client/src/components/HomeScreen.jsx index 42b2af3..4b4b7d7 100644 --- a/client/src/components/HomeScreen.jsx +++ b/client/src/components/HomeScreen.jsx @@ -89,7 +89,7 @@ const HomeScreen = () => { ); diff --git a/client/src/components/LobbyScreen.jsx b/client/src/components/LobbyScreen.jsx index c1f3a78..181dc73 100644 --- a/client/src/components/LobbyScreen.jsx +++ b/client/src/components/LobbyScreen.jsx @@ -2,13 +2,15 @@ import { useState, useEffect } from 'react'; import { useGame } from '../context/GameContext'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faUsers, faGear, faPlay, faCopy, faSignOutAlt } from '@fortawesome/free-solid-svg-icons'; +import { getDisplayName } from '../utils/playerUtils'; const LobbyScreen = () => { const { lobby, currentPlayer, isHost, updateSettings, startGame, leaveLobby } = useGame(); const [showSettings, setShowSettings] = useState(false); const [settings, setSettings] = useState({ songsPerPlayer: 4, - maxPlayers: 10 + maxPlayers: 10, + hidePlayerNames: false }); const [copied, setCopied] = useState(false); @@ -64,9 +66,11 @@ const LobbyScreen = () => {

Spieler ({lobby.players.length})

+
+
+ + +
+
+
) : ( diff --git a/client/src/components/SongSubmissionScreen.jsx b/client/src/components/SongSubmissionScreen.jsx index 052618d..5570356 100644 --- a/client/src/components/SongSubmissionScreen.jsx +++ b/client/src/components/SongSubmissionScreen.jsx @@ -2,6 +2,7 @@ import { useState, useEffect, useRef } from 'react'; import { useGame } from '../context/GameContext'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faPlus, faTrash, faCheck, faMusic, faVideoCamera, faSearch, faSpinner, faExternalLinkAlt, faTimes } from '@fortawesome/free-solid-svg-icons'; +import { getDisplayName } from '../utils/playerUtils'; const SongSubmissionScreen = () => { const { lobby, currentPlayer, addSong, removeSong, setPlayerReady, searchYouTube, getYouTubeMetadata } = useGame(); @@ -502,9 +503,9 @@ const SongSubmissionScreen = () => {

Spieler bereit