/* 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); } }