diff --git a/src/client/graphics/GameRenderer.ts b/src/client/graphics/GameRenderer.ts index b962ab4e8..579de4a00 100644 --- a/src/client/graphics/GameRenderer.ts +++ b/src/client/graphics/GameRenderer.ts @@ -32,6 +32,7 @@ export function createRenderer(canvas: HTMLCanvasElement, game: Game, eventBus: } buildMenu.game = game buildMenu.eventBus = eventBus + buildMenu.init() const leaderboard = document.querySelector('leader-board') as Leaderboard; if (!emojiTable || !(leaderboard instanceof Leaderboard)) { diff --git a/src/client/graphics/layers/ControlPanel.ts b/src/client/graphics/layers/ControlPanel.ts index 9bd4a4da2..ebb6c6aef 100644 --- a/src/client/graphics/layers/ControlPanel.ts +++ b/src/client/graphics/layers/ControlPanel.ts @@ -110,158 +110,223 @@ export class ControlPanel extends LitElement implements Layer { return d; } + static styles = css` - :host { - display: block; - } - - .control-panel { - position: fixed; - bottom: 10px; - left: 10px; - z-index: 9999; - background-color: rgba(30, 30, 30, 0.7); - padding: 15px; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.5); - border-radius: 10px; - width: 250px; - backdrop-filter: blur(5px); - transition: opacity 0.3s ease-in-out, visibility 0.3s ease-in-out; - } - - .hidden { - opacity: 0; - visibility: hidden; - } - - .slider-container { - position: relative; - margin-bottom: 15px; - height: 48px; - } - - .slider-track { - position: absolute; - width: 100%; - height: 8px; - background: rgba(255, 255, 255, 0.2); - border-radius: 4px; - top: 20px; - } - - .slider-fill { - position: absolute; - height: 8px; - background: rgba(0, 150, 255, 0.6); - border-radius: 4px; - top: 20px; - transition: width 0.3s ease-out; - } - - .slider-thumb { - position: absolute; - width: 16px; - height: 16px; - background: white; - border: 2px solid rgb(0, 150, 255); - border-radius: 50%; - top: 16px; - transform: translateX(-50%); - cursor: pointer; - transition: transform 0.1s ease; - } - - .slider-thumb:hover { - transform: translateX(-50%) scale(1.1); - } - - input[type="range"] { - position: absolute; - width: 100%; - top: 12px; - margin: 0; - opacity: 0; - cursor: pointer; - } - - .control-panel-info { - color: white; - margin-bottom: 15px; - padding: 10px; - background-color: rgba(0, 0, 0, 0.3); - border-radius: 5px; - } - - .info-row { - display: flex; - justify-content: space-between; - margin-bottom: 5px; - } - - .info-label { - font-weight: bold; - } - - label { - display: block; - color: white; - margin-bottom: 5px; - } - - .slider-value { - color: white; - text-align: right; - } - - .attack-slider { - position: relative; - margin-bottom: 15px; - height: 48px; - } - - .attack-slider .slider-track { - position: absolute; - width: 100%; - height: 8px; - background: rgba(255, 255, 255, 0.2); - border-radius: 4px; - top: 20px; - } - - .attack-slider .slider-fill { - position: absolute; - height: 8px; - background: rgba(255, 0, 0, 0.6); - border-radius: 4px; - top: 20px; - transition: width 0.3s ease-out; - } - - .attack-slider .slider-thumb { - position: absolute; - width: 16px; - height: 16px; - background: white; - border: 2px solid rgb(255, 0, 0); - border-radius: 50%; - top: 16px; - transform: translateX(-50%); - cursor: pointer; - transition: transform 0.1s ease; - } - - .attack-slider .slider-thumb:hover { - transform: translateX(-50%) scale(1.1); - } - - .attack-slider input[type="range"] { - position: absolute; - width: 100%; - top: 12px; - margin: 0; - opacity: 0; - cursor: pointer; - } + :host { + display: block; +} + +.control-panel { + position: fixed; + bottom: 10px; + left: 10px; + z-index: 9999; + background-color: rgba(30, 30, 30, 0.7); + padding: 15px; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.5); + border-radius: 10px; + width: 250px; + backdrop-filter: blur(5px); + transition: opacity 0.3s ease-in-out, visibility 0.3s ease-in-out; + box-sizing: border-box; +} + +.hidden { + opacity: 0; + visibility: hidden; +} + +.slider-container { + position: relative; + margin-bottom: 15px; + height: 48px; +} + +.slider-track { + position: absolute; + width: 100%; + height: 8px; + background: rgba(255, 255, 255, 0.2); + border-radius: 4px; + top: 20px; +} + +.slider-fill { + position: absolute; + height: 8px; + background: rgba(0, 150, 255, 0.6); + border-radius: 4px; + top: 20px; + transition: width 0.3s ease-out; +} + +.slider-thumb { + position: absolute; + width: 16px; + height: 16px; + background: white; + border: 2px solid rgb(0, 150, 255); + border-radius: 50%; + top: 16px; + transform: translateX(-50%); + cursor: pointer; + transition: transform 0.1s ease; +} + +.slider-thumb:hover { + transform: translateX(-50%) scale(1.1); +} + +input[type="range"] { + position: absolute; + width: 100%; + top: 12px; + margin: 0; + opacity: 0; + cursor: pointer; +} + +.control-panel-info { + color: white; + margin-bottom: 15px; + padding: 10px; + background-color: rgba(0, 0, 0, 0.3); + border-radius: 5px; +} + +.info-row { + display: flex; + justify-content: space-between; + margin-bottom: 5px; +} + +.info-label { + font-weight: bold; +} + +label { + display: block; + color: white; + margin-bottom: 5px; +} + +.slider-value { + color: white; + text-align: right; +} + +.attack-slider { + position: relative; + margin-bottom: 15px; + height: 48px; +} + +.attack-slider .slider-track { + position: absolute; + width: 100%; + height: 8px; + background: rgba(255, 255, 255, 0.2); + border-radius: 4px; + top: 20px; +} + +.attack-slider .slider-fill { + position: absolute; + height: 8px; + background: rgba(255, 0, 0, 0.6); + border-radius: 4px; + top: 20px; + transition: width 0.3s ease-out; +} + +.attack-slider .slider-thumb { + position: absolute; + width: 16px; + height: 16px; + background: white; + border: 2px solid rgb(255, 0, 0); + border-radius: 50%; + top: 16px; + transform: translateX(-50%); + cursor: pointer; + transition: transform 0.1s ease; +} + +.attack-slider .slider-thumb:hover { + transform: translateX(-50%) scale(1.1); +} + +.attack-slider input[type="range"] { + position: absolute; + width: 100%; + top: 12px; + margin: 0; + opacity: 0; + cursor: pointer; +} + +@media (max-width: 768px) { + .control-panel { + bottom: 0; + left: 0; + right: 0; + width: 100%; + max-width: 100%; + padding: 8px; + border-radius: 0; + box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.5); + margin: 0; + box-sizing: border-box; + overflow-x: hidden; + } + + .control-panel > * { + max-width: 100%; + } + + .slider-container { + margin-bottom: 8px; + height: 40px; + } + + .slider-track, .attack-slider .slider-track { + height: 6px; + top: 18px; + } + + .slider-fill, .attack-slider .slider-fill { + height: 6px; + top: 18px; + } + + .slider-thumb, .attack-slider .slider-thumb { + width: 14px; + height: 14px; + top: 14px; + } + + .control-panel-info { + margin-bottom: 8px; + padding: 6px; + } + + .info-row { + margin-bottom: 2px; + } + + label { + margin-bottom: 2px; + font-size: 0.9em; + } + + .info-label { + font-size: 0.9em; + } + + input[type="range"], .attack-slider input[type="range"] { + top: 10px; + } +} `; render() { @@ -269,20 +334,12 @@ export class ControlPanel extends LitElement implements Layer {