:root { --slate: #1c2830; --slate-deep: #121a20; --slate-raised: #24333d; --bone: #e9e2d2; --bone-dim: #98a4ab; --bone-faint: #5d6b73; --ember: #f0a53a; --frost: #8cc8e0; --blood: #e0655c; --rule: rgba(233, 226, 210, 0.14); --rule-strong: rgba(233, 226, 210, 0.32); --font: 'Fraunces', 'Iowan Old Style', Georgia, serif; --gutter: clamp(16px, 3vw, 40px); } * { box-sizing: border-box; } html { background: var(--slate-deep); } body { margin: 0; background: var(--slate-deep); color: var(--bone); font-family: var(--font); font-size: 17px; line-height: 1.55; font-variation-settings: 'opsz' 14; -webkit-font-smoothing: antialiased; } h1, h2, h3 { font-weight: 500; line-height: 1.15; margin: 0; } p { margin: 0; } button, select, input { font: inherit; color: inherit; } button { cursor: pointer; } button:focus-visible, select:focus-visible, input:focus-visible, summary:focus-visible { outline: 2px solid var(--frost); outline-offset: 2px; } select, input[type='text'] { background: var(--slate-deep); border: 1px solid var(--rule-strong); border-radius: 4px; padding: 0.25rem 0.5rem; max-width: 100%; } input[type='text'] { color: var(--bone); padding: 0.3rem 0.6rem; } button:disabled { opacity: 0.35; cursor: not-allowed; } /* An action written as a word in running text. */ .link { background: none; border: 0; padding: 0; font-size: inherit; color: var(--frost); text-decoration: underline; } /* The one button that commits a turn. */ .reveal { background: var(--bone); color: var(--slate-deep); border: 0; border-radius: 4px; padding: 0.6rem 1.4rem; font-size: 1.05rem; font-weight: 500; } .reveal:hover:not(:disabled) { background: #fff; } /* The smaller reveal used in forms and slips. Qualified with the element so it outranks a component's scoped `.small` text rule on the same button. */ button.reveal.small { padding: 0.4rem 0.9rem; font-size: 1rem; } /* A secondary action: an outlined button or link. */ .quiet { background: none; border: 1px solid var(--rule-strong); border-radius: 4px; padding: 0.4rem 0.9rem; white-space: nowrap; color: var(--bone); text-decoration: none; line-height: 1.55; } .quiet:hover:not(:disabled) { border-color: var(--bone); } /* The page head on the play and join pages: title and standfirst on the left, actions on the right. */ .masthead { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; padding: 1rem var(--gutter) 0.6rem; max-width: 1280px; margin: 0 auto; } .masthead h1 { font-size: clamp(2rem, 4vw, 2.7rem); font-weight: 300; font-variation-settings: 'opsz' 144; letter-spacing: -0.01em; } .standfirst { max-width: 38em; color: var(--bone-dim); margin-top: 0.4rem; } .standfirst em { color: var(--bone); } .masthead .actions { display: flex; flex-wrap: wrap; gap: 0.5rem; flex-shrink: 0; min-width: 0; max-width: 100%; } .colophon { max-width: 1280px; margin: 0 auto; padding: 2rem var(--gutter) 3rem; color: var(--bone-faint); font-size: 0.85rem; } .colophon a { color: var(--frost); } /* Must match COMPACT_QUERY in duel.svelte.ts. The extra foot padding clears MobileBar. */ @media (max-width: 860px) { .masthead { flex-direction: column; } .colophon { padding-bottom: 6rem; } } /* A modal backdrop that centres its dialog. */ .scrim { position: fixed; inset: 0; z-index: 20; background: rgba(0, 0, 0, 0.55); display: grid; place-items: center; padding: 16px; } /* An italic prompt beside a control, e.g. "at" before a target list. */ .field { display: inline-flex; gap: 0.4rem; align-items: baseline; } .field > span { color: var(--bone-dim); font-style: italic; } .letter { font-weight: 600; font-variation-settings: 'opsz' 144; letter-spacing: 0.02em; } .muted { color: var(--bone-dim); } .visually-hidden { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation: none !important; transition: none !important; } }