438 lines
12 KiB
CSS
438 lines
12 KiB
CSS
/* Import a modern, clean font */
|
|
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap');
|
|
|
|
:root {
|
|
/* UI Dimensions */
|
|
--card-width: max(7vmin, 65px);
|
|
--card-height: calc(var(--card-width) * 1.4);
|
|
--card-radius: clamp(6px, 1.5vmin, 10px);
|
|
--gap: clamp(10px, 2vmin, 18px);
|
|
|
|
/* New Color Palette */
|
|
--felt: #1a5632;
|
|
--felt-dark: #113821;
|
|
--line: #ffffff2a;
|
|
--glow: #64ffda;
|
|
--shadow-color: rgba(0, 0, 0, 0.3);
|
|
|
|
/* UI Element Colors */
|
|
--control-bg: #ffffff11;
|
|
--control-hover-bg: #ffffff22;
|
|
--accent-color: #58cc93;
|
|
--accent-hover-color: #4ab881;
|
|
--text-color: #f0f0f0;
|
|
}
|
|
|
|
* { box-sizing: border-box; }
|
|
|
|
html, body {
|
|
height: 100%;
|
|
margin: 0;
|
|
}
|
|
|
|
body {
|
|
background: radial-gradient(circle at 50% 0%, var(--felt) 0%, var(--felt-dark) 90%);
|
|
color: var(--text-color);
|
|
font-family: 'Inter', system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;
|
|
display: flex;
|
|
flex-direction: column;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.topbar {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
flex-wrap: wrap;
|
|
padding: 12px clamp(12px, 3vw, 28px);
|
|
gap: 12px;
|
|
background: rgba(0,0,0,0.1);
|
|
border-bottom: 1px solid var(--line);
|
|
}
|
|
|
|
h1 {
|
|
margin: 0;
|
|
font-size: clamp(18px, 3.2vmin, 28px);
|
|
font-weight: 700;
|
|
}
|
|
|
|
.scores {
|
|
display: flex;
|
|
gap: 16px;
|
|
font-weight: 600;
|
|
margin: 0 auto 0 24px;
|
|
}
|
|
|
|
.score-display span {
|
|
color: var(--accent-color);
|
|
font-weight: 700;
|
|
}
|
|
|
|
.controls {
|
|
display: flex;
|
|
gap: 8px;
|
|
align-items: center;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.btn {
|
|
background: var(--control-bg);
|
|
color: var(--text-color);
|
|
border: 1px solid var(--line);
|
|
padding: 8px 14px;
|
|
border-radius: 8px;
|
|
cursor: pointer;
|
|
font-weight: 600;
|
|
transition: transform .12s ease, background-color .15s ease, box-shadow .15s ease;
|
|
}
|
|
|
|
.btn:hover {
|
|
background: var(--control-hover-bg);
|
|
box-shadow: 0 4px 12px rgba(0,0,0,0.2);
|
|
}
|
|
|
|
.btn:active {
|
|
transform: translateY(1px) scale(.99);
|
|
}
|
|
|
|
.btn-accent {
|
|
background: var(--accent-color);
|
|
border-color: transparent;
|
|
color: #113821;
|
|
}
|
|
|
|
.btn-accent:hover {
|
|
background: var(--accent-hover-color);
|
|
border-color: transparent;
|
|
}
|
|
|
|
.draw-toggle {
|
|
display: flex;
|
|
gap: 6px;
|
|
align-items: center;
|
|
background: var(--control-bg);
|
|
padding: 6px 10px;
|
|
border-radius: 8px;
|
|
border: 1px solid var(--line);
|
|
}
|
|
|
|
.draw-toggle select {
|
|
appearance: none;
|
|
background: transparent;
|
|
color: var(--text-color);
|
|
border: none;
|
|
outline: none;
|
|
font-weight: 600;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.game-board {
|
|
position: relative;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: calc(var(--gap) * 1.5);
|
|
width: min(1100px, 96vw);
|
|
margin: 0 auto;
|
|
padding: 0 clamp(10px, 2vw, 20px) clamp(10px, 2vw, 20px);
|
|
flex: 1;
|
|
min-height: 0;
|
|
}
|
|
|
|
.top-piles, .tableau {
|
|
display: flex;
|
|
gap: var(--gap);
|
|
justify-content: space-between;
|
|
}
|
|
.tableau { flex: 1; min-height: 0; }
|
|
.stock-waste, .foundations { display: flex; gap: var(--gap); }
|
|
.foundations { margin-left: auto; }
|
|
|
|
.pile {
|
|
width: var(--card-width);
|
|
height: var(--card-height);
|
|
border-radius: var(--card-radius);
|
|
position: relative;
|
|
border: 2px dashed var(--line);
|
|
outline: none;
|
|
transition: box-shadow 0.2s ease;
|
|
}
|
|
.pile:focus-visible { box-shadow: 0 0 0 3px #fff6; }
|
|
.tableau-pile { height: 100%; border: none; }
|
|
.tableau-pile::before {
|
|
content: "";
|
|
position: absolute;
|
|
inset: 0 auto auto 0;
|
|
width: var(--card-width);
|
|
height: var(--card-height);
|
|
border-radius: var(--card-radius);
|
|
border: 2px dashed var(--line);
|
|
}
|
|
|
|
.card {
|
|
width: var(--card-width);
|
|
height: var(--card-height);
|
|
position: absolute;
|
|
user-select: none;
|
|
touch-action: none;
|
|
transition: top .18s ease, left .18s ease, transform .18s ease, filter .2s ease;
|
|
will-change: top, left, transform;
|
|
filter: drop-shadow(0 2px 5px var(--shadow-color));
|
|
}
|
|
.card.is-stacked { filter: none; }
|
|
.card-inner {
|
|
position: relative;
|
|
width: 100%;
|
|
height: 100%;
|
|
transform-style: preserve-3d;
|
|
transition: transform .24s ease;
|
|
}
|
|
.card.is-flipped .card-inner { transform: rotateY(180deg); }
|
|
.card-face {
|
|
position: absolute;
|
|
inset: 0;
|
|
border-radius: var(--card-radius);
|
|
backface-visibility: hidden;
|
|
}
|
|
.card-face--front {
|
|
background: linear-gradient(160deg, #ffffff, #f4f4f4);
|
|
transform: rotateY(180deg);
|
|
padding: 8px;
|
|
cursor: grab;
|
|
border: 1px solid #d0d0d0;
|
|
}
|
|
|
|
.red { color: #D90429; }
|
|
.black { color: #2B2D42; }
|
|
|
|
.card-value-display--top {
|
|
position: absolute;
|
|
top: 8px;
|
|
left: 8px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
line-height: .9;
|
|
}
|
|
.card-value-display--bottom {
|
|
position: absolute;
|
|
bottom: 8px;
|
|
right: 8px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
line-height: .9;
|
|
transform: rotate(180deg);
|
|
}
|
|
|
|
.card-rank { font-size: 1.24em; font-weight: 800; }
|
|
.card-suit { font-size: .9em; }
|
|
|
|
.card-watermark {
|
|
position: absolute;
|
|
inset: auto 0 0 0;
|
|
top: 50%;
|
|
transform: translateY(-50%);
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 3.6em;
|
|
opacity: .10;
|
|
pointer-events: none;
|
|
}
|
|
.card.dragging {
|
|
opacity: .95;
|
|
transform: rotate(-1.5deg) scale(1.06);
|
|
z-index: 900;
|
|
filter: drop-shadow(0 10px 22px rgba(0, 0, 0, .45));
|
|
outline: 2px solid var(--glow);
|
|
border-radius: var(--card-radius);
|
|
}
|
|
.pile.drag-over::before, .pile.drag-over {
|
|
box-shadow: 0 0 14px 4px var(--glow);
|
|
border-color: var(--glow);
|
|
border-style: solid;
|
|
}
|
|
.card.selected {
|
|
outline: 3px solid #ffd54d;
|
|
border-radius: var(--card-radius);
|
|
filter: drop-shadow(0 0 0 var(--shadow-color)) drop-shadow(0 8px 16px rgba(0,0,0,0.45));
|
|
}
|
|
#win-message.hidden { display: none; }
|
|
#win-message {
|
|
position: fixed;
|
|
inset: auto 0 14% 0;
|
|
margin: auto;
|
|
width: fit-content;
|
|
font-size: clamp(28px, 5vmin, 48px);
|
|
font-weight: 900;
|
|
text-shadow: 0 8px 20px rgba(0, 0, 0, .4);
|
|
animation: win-bounce 1.2s ease-in-out infinite;
|
|
padding: 10px 16px;
|
|
background: rgba(0, 0, 0, 0.2);
|
|
border-radius: 14px;
|
|
border: 1px solid var(--line);
|
|
backdrop-filter: blur(8px);
|
|
}
|
|
@keyframes win-bounce {
|
|
0%, 100% { transform: translateY(0); }
|
|
50% { transform: translateY(-12px); }
|
|
}
|
|
|
|
.modal {
|
|
position: fixed;
|
|
inset: 0;
|
|
z-index: 1000;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
transition: opacity 0.2s ease, visibility 0.2s ease;
|
|
}
|
|
.modal.hidden {
|
|
opacity: 0;
|
|
visibility: hidden;
|
|
}
|
|
.modal-overlay {
|
|
position: absolute;
|
|
inset: 0;
|
|
background: rgba(0,0,0,0.6);
|
|
backdrop-filter: blur(5px);
|
|
}
|
|
.modal-content {
|
|
position: relative;
|
|
background: var(--felt-dark);
|
|
border: 1px solid var(--line);
|
|
border-radius: 16px;
|
|
padding: 24px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 20px;
|
|
align-items: center;
|
|
box-shadow: 0 10px 30px rgba(0,0,0,0.3);
|
|
animation: modal-enter 0.3s ease forwards;
|
|
}
|
|
.modal.hidden .modal-content {
|
|
animation: modal-exit 0.3s ease forwards;
|
|
}
|
|
@keyframes modal-enter {
|
|
from { transform: translateY(20px) scale(0.95); opacity: 0; }
|
|
to { transform: translateY(0) scale(1); opacity: 1; }
|
|
}
|
|
@keyframes modal-exit {
|
|
from { transform: translateY(0) scale(1); opacity: 1; }
|
|
to { transform: translateY(20px) scale(0.95); opacity: 0; }
|
|
}
|
|
.modal-content h2 {
|
|
margin: 0;
|
|
font-weight: 700;
|
|
}
|
|
|
|
.card-back-options { display: flex; flex-wrap: wrap; justify-content: center; gap: 16px; }
|
|
.back-option {
|
|
width: 64px;
|
|
height: 90px;
|
|
border-radius: 8px;
|
|
cursor: pointer;
|
|
border: 3px solid transparent;
|
|
transition: border-color 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease;
|
|
position: relative;
|
|
overflow: hidden;
|
|
}
|
|
.back-option .card-face--back { border: none; }
|
|
.back-option:hover {
|
|
border-color: var(--glow);
|
|
transform: scale(1.05);
|
|
z-index: 1;
|
|
}
|
|
.back-option.active {
|
|
border-color: var(--glow);
|
|
transform: scale(1.08);
|
|
box-shadow: 0 0 12px 2px var(--glow);
|
|
z-index: 2;
|
|
}
|
|
|
|
/* --- CSS Card Backs --- */
|
|
.card-face--back { border: 1px solid #444; }
|
|
body.card-back-waves .card .card-face--back,
|
|
.back-option.card-back-waves .card-face--back {
|
|
background-color: #a2d2ff; background-image: radial-gradient(circle at 50% 0, #bde0fe 25%, transparent 25.5%), radial-gradient(circle at 0 50%, #bde0fe 25%, transparent 25.5%), radial-gradient(circle at 100% 50%, #bde0fe 25%, transparent 25.5%), radial-gradient(circle at 50% 100%, #bde0fe 25%, transparent 25.5%); background-size: 40px 40px; border-color: #6c9dbd;
|
|
}
|
|
body.card-back-herringbone .card .card-face--back,
|
|
.back-option.card-back-herringbone .card-face--back {
|
|
background-color: #3d405b; background-image: linear-gradient(135deg, #81b29a 25%, transparent 25%), linear-gradient(225deg, #81b29a 25%, transparent 25%), linear-gradient(45deg, #81b29a 25%, transparent 25%), linear-gradient(315deg, #81b29a 25%, #3d405b 25%); background-position: 10px 0, 10px 0, 0 0, 0 0; background-size: 20px 20px; background-repeat: repeat; border-color: #2c2e40;
|
|
}
|
|
body.card-back-sunset .card .card-face--back,
|
|
.back-option.card-back-sunset .card-face--back {
|
|
background: linear-gradient(160deg, #f28482, #f6bd60, #84a59d); border-color: #6a847e;
|
|
}
|
|
body.card-back-linen .card .card-face--back,
|
|
.back-option.card-back-linen .card-face--back {
|
|
background-color: #fcf4e2; background-image: linear-gradient(45deg, #e3d5b8 25%, transparent 25%, transparent 75%, #e3d5b8 75%, #e3d5b8), linear-gradient(45deg, #e3d5b8 25%, transparent 25%, transparent 75%, #e3d5b8 75%, #e3d5b8); background-size: 20px 20px; background-position: 0 0, 10px 10px; border-color: #c9bba4;
|
|
}
|
|
body.card-back-nordic .card .card-face--back,
|
|
.back-option.card-back-nordic .card-face--back {
|
|
background-color: #2b2d42; background-image: linear-gradient(white 2px, transparent 2px), linear-gradient(90deg, white 2px, transparent 2px), linear-gradient(hsla(0,0%,100%,.3) 1px, transparent 1px), linear-gradient(90deg, hsla(0,0%,100%,.3) 1px, transparent 1px); background-size: 50px 50px, 50px 50px, 10px 10px, 10px 10px; background-position: -2px -2px, -2px -2px, -1px -1px, -1px -1px; border-color: #1e1f2e;
|
|
}
|
|
body.card-back-midnight .card .card-face--back,
|
|
.back-option.card-back-midnight .card-face--back {
|
|
background-color: #121212; background-image: linear-gradient(#ffffff20 1px, transparent 1px), linear-gradient(90deg, #ffffff20 1px, transparent 1px); background-size: 22px 22px; border-color: #1e1e1e;
|
|
}
|
|
body.card-back-diamond .card .card-face--back,
|
|
.back-option.card-back-diamond .card-face--back {
|
|
background-color: #f8f8f8; background-image: linear-gradient(45deg, #ddd 25%, transparent 25%), linear-gradient(-45deg, #ddd 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #ddd 75%), linear-gradient(-45deg, transparent 75%, #ddd 75%); background-size: 28px 28px; background-position: 0 0, 0 14px, 14px -14px, -14px 0px; border-color: #c2c2c2;
|
|
}
|
|
body.card-back-royal .card .card-face--back,
|
|
.back-option.card-back-royal .card-face--back {
|
|
background: repeating-linear-gradient(45deg, #224488, #224488 12px, #2c5ab0 12px, #2c5ab0 24px); border-color: #1b3561;
|
|
}
|
|
body.card-back-fade .card .card-face--back,
|
|
.back-option.card-back-fade .card-face--back {
|
|
background: linear-gradient(160deg, #2c3e50, #34495e, #2c3e50); border: 1px solid #1a242f;
|
|
}
|
|
|
|
/* =================================== */
|
|
/* ======= RESPONSIVE STYLES ======= */
|
|
/* =================================== */
|
|
|
|
/* For Mobile Top Bar (anything below 768px wide) */
|
|
@media (max-width: 768px) {
|
|
.topbar {
|
|
justify-content: center; /* Center the items that wrap */
|
|
padding-bottom: 16px;
|
|
}
|
|
.topbar h1 {
|
|
width: 100%;
|
|
text-align: center;
|
|
margin-bottom: 8px; /* Add space below title */
|
|
}
|
|
.scores {
|
|
order: 3; /* Move scores below controls */
|
|
width: 100%;
|
|
justify-content: center;
|
|
margin: 8px 0 0 0; /* Center it with top margin */
|
|
}
|
|
.controls {
|
|
order: 2; /* Keep controls above scores */
|
|
justify-content: center;
|
|
}
|
|
}
|
|
|
|
/* For Mobile Screens (anything below 600px wide) */
|
|
@media (max-width: 600px) {
|
|
.foundations {
|
|
gap: 5px;
|
|
}
|
|
}
|
|
|
|
/* For Tablets (screens 768px and wider) */
|
|
@media (min-width: 768px) {
|
|
:root {
|
|
--card-width: max(7vmin, 75px);
|
|
}
|
|
}
|
|
|
|
/* For Laptops & Desktops (screens 1024px and wider) */
|
|
@media (min-width: 1024px) {
|
|
:root {
|
|
--card-width: max(7.5vmin, 90px);
|
|
}
|
|
} |