diff --git a/src/App.vue b/src/App.vue index 4180ff4..eb69cb8 100644 --- a/src/App.vue +++ b/src/App.vue @@ -186,7 +186,7 @@ onUnmounted(() => { .game-container { display: flex; flex-direction: column; - align-items: center; + align-items: stretch; /* was center */ gap: 20px; width: 100%; padding-bottom: 50px; @@ -202,7 +202,7 @@ onUnmounted(() => { align-items: center; width: 90%; max-width: 600px; - margin-bottom: 20px; + margin: 0 auto 20px auto; /* Center it manually */ box-shadow: var(--banner-shadow); } @@ -227,17 +227,24 @@ onUnmounted(() => { .game-layout { display: flex; flex-direction: column; - align-items: center; + align-items: stretch; gap: 20px; width: 100%; - max-width: 1200px; padding: 0 20px; } +/* Center children (except board section which handles itself) */ +.game-layout > *:not(.board-section) { + margin-left: auto; + margin-right: auto; + max-width: 1200px; /* Keep constraint for panels */ + width: 100%; +} + .board-section { - display: flex; - justify-content: center; + display: block; width: 100%; + overflow-x: visible; } .fade-enter-active, diff --git a/src/components/GameBoard.vue b/src/components/GameBoard.vue index 8f663ce..76054d1 100644 --- a/src/components/GameBoard.vue +++ b/src/components/GameBoard.vue @@ -118,6 +118,8 @@ const computeCellSize = () => { const gap = parseFloat(gapRaw); const gridPad = parseFloat(gridPadRaw); + const isDesktop = window.matchMedia('(min-width: 769px)').matches; + let containerWidth; if (scrollWrapper.value) { containerWidth = scrollWrapper.value.clientWidth; @@ -131,8 +133,15 @@ const computeCellSize = () => { const availableForGrid = Math.max(0, containerWidth - hintWidth); const size = Math.floor((availableForGrid - gridPad * 2 - (store.size - 1) * gap) / store.size); - // Keep min 18, max 36 - cellSize.value = Math.max(18, Math.min(36, size)); + + if (isDesktop) { + // Desktop: Allow overflow, use comfortable size + cellSize.value = 30; + } else { + // Mobile: Fit to screen + // Keep min 18, max 36 + cellSize.value = Math.max(18, Math.min(36, size)); + } }; const handleGlobalMouseUp = () => { @@ -258,8 +267,15 @@ watch(() => store.size, async () => { /* Desktop: Remove scroll behavior to ensure full grid visibility */ @media (min-width: 769px) { .game-board-wrapper { - overflow-x: auto; /* Allow scrolling if grid is too large (e.g. 80x80) */ - align-items: center; /* Center the grid on desktop */ + overflow: visible; + width: max-content; + min-width: 100%; + margin: 0 auto; /* Center the wrapper safely */ + align-items: flex-start; /* Prevent cropping when centered */ + } + + .game-container { + /* margin: 0 auto; - wrapper handles centering now */ } }