solitare/style.css
2025-08-31 18:16:50 -04:00

482 lines
14 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;
}
.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); }
}
/* ADDED: Styles for the new modal */
.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;
position: relative;
overflow: hidden;
}
.back-option .card-face--back { border: none; }
.back-option.active, .back-option:hover { border-color: var(--glow); }
/* Highlight the selected card back */
.back-option.active {
border: 3px solid var(--glow);
box-shadow: 0 0 14px 4px var(--glow);
transform: scale(1.08);
z-index: 2;
}
/* Still allow hover effect, but don't override active */
.back-option:hover {
border-color: var(--glow);
box-shadow: 0 0 10px 2px var(--glow);
transform: scale(1.05);
}
/* --- 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;
}
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 Screens (anything below 600px wide) */
@media (max-width: 600px) {
.foundations {
/* This brings the four foundation piles closer together */
gap: 5px;
}
}
/* For Tablets (screens 768px and wider) */
@media (min-width: 768px) {
:root {
/* Increase the minimum card size for tablets */
--card-width: max(7vmin, 75px);
}
}
/* For Laptops & Desktops (screens 1024px and wider) */
@media (min-width: 1024px) {
:root {
/* Further increase the minimum card size for large screens */
--card-width: max(7.5vmin, 90px);
}
}