:root { --bg: oklch(97% 0.018 70); --surface: oklch(99% 0.008 70); --fg: oklch(22% 0.02 50); --muted: oklch(50% 0.018 50); --border: oklch(90% 0.014 70); --accent: oklch(64% 0.13 28); --font-display: 'Tiempos Headline', 'Newsreader', 'Iowan Old Style', Georgia, serif; --font-body: 'Söhne', -apple-system, BlinkMacSystemFont, system-ui, sans-serif; --correct: oklch(59% 0.12 145); --present: oklch(73% 0.12 82); --absent: oklch(47% 0.018 50); --tile: oklch(99% 0.008 70); --key: oklch(91% 0.018 70); --shadow: 0 24px 80px oklch(22% 0.02 50 / 0.12); } *, *::before, *::after { box-sizing: border-box; } html { min-height: 100%; } body { min-height: 100vh; margin: 0; background: radial-gradient(circle at 12% 0%, oklch(88% 0.065 45 / 0.35), transparent 34rem), var(--bg); color: var(--fg); font-family: var(--font-body); text-align: center; } body.dark-theme { --bg: oklch(18% 0.018 50); --surface: oklch(24% 0.018 50); --fg: oklch(96% 0.014 70); --muted: oklch(76% 0.014 70); --border: oklch(33% 0.018 50); --tile: oklch(26% 0.018 50); --key: oklch(34% 0.018 50); --shadow: 0 24px 80px oklch(8% 0.01 50 / 0.38); } button, a { font: inherit; } .app-shell { width: min(1120px, calc(100% - 32px)); min-height: 100vh; margin: 0 auto; padding: 24px 0 32px; } .topbar, .game-card, .stats-card { border: 1px solid var(--border); background: color-mix(in oklch, var(--surface) 90%, transparent); box-shadow: 0 0 0 1px color-mix(in oklch, var(--surface) 70%, transparent); } .topbar { display: flex; align-items: center; justify-content: space-between; gap: 16px; min-height: 68px; padding: 10px 12px; border-radius: 20px; backdrop-filter: blur(18px); } .brand, .actions { display: flex; align-items: center; } .brand { gap: 12px; color: inherit; text-align: start; text-decoration: none; } .brand-mark { display: grid; width: 44px; height: 44px; place-items: center; border-radius: 14px; background: var(--fg); color: var(--surface); font-family: var(--font-display); font-size: 1.35rem; } .brand strong { display: block; font-family: var(--font-display); font-size: 1.15rem; font-weight: 500; } .brand small, .deck, .status-row, .alert, .definition-alert { color: var(--muted); } .actions { gap: 8px; } .icon-button, .button { min-width: 44px; min-height: 44px; border: 1px solid var(--border); border-radius: 14px; background: var(--surface); color: var(--fg); cursor: pointer; text-decoration: none; transition: transform 160ms ease, border-color 160ms ease, background-color 160ms ease; } .icon-button { display: inline-grid; place-items: center; font-size: 1.25rem; } .icon-button:hover, .button:hover { transform: translateY(-1px); border-color: color-mix(in oklch, var(--accent), var(--border) 45%); } .game-card { display: grid; grid-template-columns: minmax(280px, 0.9fr) minmax(320px, 1.1fr); gap: clamp(20px, 4vw, 56px); margin-top: 18px; padding: clamp(20px, 4vw, 48px); border-radius: 32px; box-shadow: var(--shadow); } .hero-panel { display: flex; flex-direction: column; justify-content: center; text-align: start; } .eyebrow { margin: 0 0 12px; color: var(--accent); font-size: 0.75rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; } h1, h2 { margin: 0; font-family: var(--font-display); font-weight: 500; line-height: 1.05; } h1 { max-width: 9ch; font-size: clamp(3rem, 7vw, 5.9rem); } h2 { font-size: clamp(2rem, 4vw, 3rem); } .deck { max-width: 34rem; margin: 22px 0 0; font-size: clamp(1rem, 1.4vw, 1.2rem); line-height: 1.65; } .board-panel { position: relative; display: grid; justify-items: center; gap: 18px; min-width: 0; } .status-row { display: flex; width: min(100%, 430px); align-items: center; justify-content: space-between; gap: 12px; font-size: 0.9rem; } .pill { padding: 6px 10px; border: 1px solid var(--border); border-radius: 999px; color: var(--fg); font-variant-numeric: tabular-nums; } .guess-grid { display: grid; grid-template-columns: repeat(5, minmax(44px, 68px)); grid-template-rows: repeat(6, minmax(44px, 68px)); gap: 8px; inline-size: min(100%, 372px); aspect-ratio: 5 / 6; } .tile { display: grid; place-items: center; border: 1px solid var(--border); border-radius: 14px; background: var(--tile); color: var(--fg); font-size: clamp(1.35rem, 5vw, 2rem); font-weight: 800; text-transform: uppercase; user-select: none; transition: transform 250ms ease, background-color 160ms ease, color 160ms ease, border-color 160ms ease; } .tile[data-state="active"] { border-color: color-mix(in oklch, var(--accent), var(--fg) 25%); box-shadow: inset 0 0 0 1px color-mix(in oklch, var(--accent), transparent 60%); } .tile[data-state="wrong"], .key.wrong { background: var(--absent); border-color: var(--absent); color: white; } .tile[data-state="wrong-position"], .key.wrong-position { background: var(--present); border-color: var(--present); color: var(--fg); } .tile[data-state="correct"], .key.correct { background: var(--correct); border-color: var(--correct); color: white; } .tile.flip { transform: rotateX(90deg); } .tile.shake { animation: shake 250ms ease-in-out; } .tile.dance { animation: dance 500ms ease-in-out; } .keyboard { display: grid; grid-template-columns: repeat(20, minmax(0, 1fr)); gap: 6px; width: min(100%, 560px); touch-action: manipulation; } .key { grid-column: span 2; min-height: 48px; padding: 0; border: 1px solid color-mix(in oklch, var(--border), var(--fg) 5%); border-radius: 12px; background: var(--key); color: var(--fg); font-size: clamp(0.8rem, 2vw, 1rem); font-weight: 800; cursor: pointer; user-select: none; } .key.large { grid-column: span 3; font-size: 0.78rem; } .key.space { grid-column: span 1; visibility: hidden; } .key svg { width: 1.35rem; height: 1.35rem; fill: currentColor; } .key:hover, .key:focus-visible { outline: none; transform: translateY(-1px); border-color: var(--accent); } .alert-container { position: fixed; inset-block-start: 96px; inset-inline: 16px; z-index: 10; display: grid; justify-items: center; gap: 8px; pointer-events: none; } .alert { max-width: min(440px, calc(100vw - 32px)); padding: 12px 16px; border: 1px solid var(--border); border-radius: 14px; background: var(--surface); box-shadow: var(--shadow); color: var(--fg); line-height: 1.45; opacity: 1; transition: opacity 400ms ease, transform 400ms ease; } .alert.hide { opacity: 0; transform: translateY(-6px); } .definition-alert { pointer-events: auto; width: min(440px, calc(100vw - 32px)); text-align: start; } .definition-alert strong { display: block; margin-bottom: 6px; color: var(--fg); font-family: var(--font-display); font-size: 1.2rem; font-weight: 500; } .definition-alert::after { display: block; margin-top: 10px; color: var(--muted); content: "Click to dismiss"; font-size: 0.8rem; } .stats-modal { width: min(520px, calc(100vw - 32px)); padding: 0; border: 0; border-radius: 24px; background: transparent; color: var(--fg); } .stats-modal::backdrop { background: oklch(18% 0.018 50 / 0.45); backdrop-filter: blur(4px); } .stats-card { padding: 22px; border-radius: 24px; text-align: start; } .modal-head, .modal-actions, .stat-item, .guess-bar { display: flex; align-items: center; } .modal-head, .modal-actions { justify-content: space-between; gap: 16px; } .close-button { flex: 0 0 auto; } .stats-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin: 22px 0; } .stat-item { min-height: 82px; flex-direction: column; justify-content: center; border: 1px solid var(--border); border-radius: 16px; background: var(--bg); } .stat-item strong { font-family: var(--font-display); font-size: 2rem; font-weight: 500; } .stat-item span { color: var(--muted); font-size: 0.78rem; } .guess-bars { display: grid; gap: 8px; margin-bottom: 22px; } .guess-bar { gap: 10px; } .guess-bar-label { width: 1.5rem; color: var(--muted); font-variant-numeric: tabular-nums; } .guess-bar-fill { min-width: 28px; height: 26px; padding-inline-end: 8px; border-radius: 8px; background: color-mix(in oklch, var(--accent), var(--border) 40%); color: white; text-align: end; font-size: 0.8rem; font-weight: 800; line-height: 26px; } .button { padding: 0 16px; font-weight: 700; } .button.primary { background: var(--accent); color: white; } .button.secondary { background: var(--key); } @keyframes shake { 10%, 90% { transform: translateX(-4%); } 30%, 70% { transform: translateX(5%); } 50% { transform: translateX(-7%); } } @keyframes dance { 20% { transform: translateY(-45%); } 40% { transform: translateY(4%); } 60% { transform: translateY(-20%); } 80% { transform: translateY(2%); } 100% { transform: translateY(0); } } @media (max-width: 780px) { .app-shell { width: min(100% - 20px, 600px); padding-top: 10px; } .game-card { grid-template-columns: 1fr; padding: 18px; border-radius: 24px; } .hero-panel { text-align: center; } h1, .deck { margin-inline: auto; } .deck { margin-top: 12px; } } @media (max-width: 460px) { .brand small { display: none; } .topbar { padding: 8px; } .actions { gap: 4px; } .icon-button { min-width: 40px; min-height: 40px; } .guess-grid { gap: 6px; } .tile { border-radius: 10px; } .keyboard { gap: 4px; } .key { min-height: 44px; border-radius: 9px; } .stats-grid { grid-template-columns: repeat(2, 1fr); } }