godseed / web /style.css
AndresCarreon's picture
Town Mode: close town view by default, build_district + place_road, bank/market/house, grow-one-town steering, behold-the-world reveal, tamed needle
b0d758d verified
Raw
History Blame Contribute Delete
14.2 kB
/* GODSEED — liturgical-modern. Deep-space black, ivory text, gold + violet
accents. Hairlines, letterspace, restraint. Like a Kinfolk issue about a
small god — never the generic AI-gradient card. */
:root {
--bg: #040508;
--ivory: #ece5d8;
--ivory-dim: rgba(236, 229, 216, 0.55);
--ivory-faint: rgba(236, 229, 216, 0.34);
--gold: #d9b36c;
--gold-bright: #f0cd8e;
--violet: #9d86e8;
--hairline: rgba(217, 179, 108, 0.28);
--hairline-dim: rgba(217, 179, 108, 0.14);
--panel: rgba(7, 8, 14, 0.55);
--serif: "Cormorant Garamond", Georgia, serif;
--sans: "Inter", -apple-system, system-ui, sans-serif;
--mono: "JetBrains Mono", ui-monospace, "SF Mono", monospace;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
html, body {
height: 100%;
overflow: hidden;
background: var(--bg);
color: var(--ivory);
font-family: var(--sans);
-webkit-font-smoothing: antialiased;
}
#scene {
position: fixed;
inset: 0;
width: 100%;
height: 100%;
display: block;
cursor: grab;
}
#scene:active { cursor: grabbing; }
/* ---------- cinematic overlays ---------- */
.vignette {
position: fixed; inset: 0; pointer-events: none; z-index: 2;
background:
radial-gradient(120% 95% at 50% 42%, transparent 55%, rgba(2, 3, 6, 0.5) 100%),
linear-gradient(to bottom, rgba(2, 3, 6, 0.35), transparent 18%, transparent 80%, rgba(2, 3, 6, 0.45));
}
.grain {
position: fixed; inset: -50%; pointer-events: none; z-index: 3; opacity: 0.05;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2'/%3E%3C/filter%3E%3Crect width='240' height='240' filter='url(%23n)' opacity='0.9'/%3E%3C/svg%3E");
animation: grain 1.6s steps(4) infinite;
}
@keyframes grain {
0% { transform: translate(0, 0); }
25% { transform: translate(-2%, 1.4%); }
50% { transform: translate(1.6%, -1%); }
75% { transform: translate(-1%, -1.8%); }
100% { transform: translate(0, 0); }
}
/* ---------- wordmark ---------- */
.brand {
position: fixed; top: 34px; left: 0; right: 0; z-index: 10;
text-align: center; pointer-events: none;
}
.brand__mark {
font-family: var(--serif);
font-weight: 500;
font-size: clamp(26px, 3.2vw, 40px);
letter-spacing: 0.46em;
text-indent: 0.46em; /* optically center the letterspacing */
color: var(--ivory);
text-shadow: 0 0 28px rgba(217, 179, 108, 0.35);
}
.brand__tag {
margin-top: 9px;
font-size: 10px;
font-weight: 400;
letter-spacing: 0.34em;
text-indent: 0.34em;
text-transform: uppercase;
color: var(--ivory-faint);
}
/* ---------- epoch + log link ---------- */
.almanac {
position: fixed; top: 38px; right: 42px; z-index: 11;
display: flex; flex-direction: column; align-items: flex-end;
text-align: right;
}
.almanac__epoch {
font-size: 11px;
letter-spacing: 0.22em;
text-transform: uppercase;
color: var(--ivory-dim);
}
.almanac__log {
display: inline-block;
margin-top: 10px;
font-family: var(--serif);
font-style: italic;
font-size: 16px;
color: var(--gold);
text-decoration: none;
border-bottom: 1px solid var(--hairline);
padding-bottom: 2px;
transition: color 0.25s, border-color 0.25s;
}
.almanac__log:hover { color: var(--gold-bright); border-color: var(--gold); }
/* behold the world ↕ — the close-town ⇄ whole-planet toggle */
.behold {
display: inline-flex; align-items: center; gap: 9px;
margin-top: 14px;
padding: 7px 15px;
font-family: var(--sans);
font-size: 9.5px; letter-spacing: 0.26em; text-transform: uppercase;
color: var(--ivory-dim);
background: var(--panel);
border: 1px solid var(--hairline);
border-radius: 999px;
cursor: pointer;
pointer-events: auto;
-webkit-backdrop-filter: blur(8px);
backdrop-filter: blur(8px);
transition: color 0.25s, border-color 0.25s, box-shadow 0.25s;
}
.behold:hover {
color: var(--gold-bright);
border-color: var(--gold);
box-shadow: 0 0 24px rgba(217, 179, 108, 0.14);
}
.behold__label { line-height: 1; }
.behold__sigil {
font-size: 12px; line-height: 1; color: var(--gold);
transition: transform 0.4s ease;
}
/* while beholding the world the control offers the way back — flip the sigil */
.behold.is-world {
color: var(--gold);
border-color: var(--gold);
}
.behold.is-world .behold__sigil { transform: rotate(180deg); }
/* ---------- the god speaks ---------- */
.voice {
position: fixed; left: 42px; bottom: 42px; z-index: 10;
width: min(440px, calc(100vw - 84px));
border-left: 1px solid var(--hairline);
padding: 16px 20px 16px 20px;
pointer-events: none;
/* a subtle dark scrim so the god's voice reads over the bright planet rim —
the ticker is the second-largest text while granting and must not wash out */
background: linear-gradient(105deg, rgba(4, 5, 9, 0.72), rgba(4, 5, 9, 0.32) 72%, transparent);
border-radius: 2px;
-webkit-backdrop-filter: blur(3px);
backdrop-filter: blur(3px);
}
.voice__head {
display: flex; align-items: baseline; gap: 10px;
font-size: 10px; letter-spacing: 0.3em; text-transform: uppercase;
color: var(--ivory-faint);
margin-bottom: 10px;
}
.voice__dot {
width: 5px; height: 5px; border-radius: 50%;
background: var(--violet); align-self: center;
box-shadow: 0 0 8px var(--violet);
opacity: 0.4;
transition: opacity 0.4s;
}
.voice__dot.is-live { opacity: 1; animation: pulse 1.8s ease-in-out infinite; }
@keyframes pulse { 50% { box-shadow: 0 0 14px var(--violet); } }
.voice__wish {
font-family: var(--serif); font-style: italic; text-transform: none;
letter-spacing: 0.02em; font-size: 14px; color: var(--ivory-dim);
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
max-width: 230px;
}
.voice__stream {
font-family: var(--mono);
/* second-largest text while granting — readable on the live screenshots */
font-size: 18px;
line-height: 1.62;
letter-spacing: 0.01em;
color: rgba(236, 229, 216, 0.78);
max-height: 232px;
overflow: hidden;
display: flex;
flex-direction: column;
justify-content: flex-end;
white-space: pre-wrap;
word-break: break-word;
text-shadow: 0 1px 10px rgba(2, 3, 6, 0.65);
mask-image: linear-gradient(to bottom, transparent, black 28%);
-webkit-mask-image: linear-gradient(to bottom, transparent, black 28%);
}
.voice__innertext { display: inline-block; white-space: pre-wrap; }
.voice__stream .tone-reading { color: var(--ivory); }
.voice__stream .tone-call { color: var(--gold-bright); font-weight: 400; }
.voice__stream .tone-obs { color: var(--violet); opacity: 0.92; }
.voice__caret {
display: inline-block; width: 8px; height: 17px;
background: var(--gold); vertical-align: -3px; margin-left: 2px;
animation: caret 1.1s steps(2) infinite;
}
@keyframes caret { 50% { opacity: 0; } }
/* ---------- epitaph flourish ---------- */
.epitaph {
position: fixed; left: 50%; top: 26%; z-index: 12;
transform: translateX(-50%) translateY(8px);
width: min(620px, 86vw);
text-align: center;
opacity: 0;
pointer-events: none;
transition: opacity 1.1s ease, transform 1.1s ease;
}
.epitaph.is-shown { opacity: 1; transform: translateX(-50%) translateY(0); }
.epitaph__rule {
width: 56px; height: 1px; margin: 0 auto 18px;
background: linear-gradient(to right, transparent, var(--gold), transparent);
}
.epitaph__text {
font-family: var(--serif);
font-style: italic;
font-weight: 500;
font-size: clamp(22px, 3vw, 32px);
line-height: 1.35;
color: var(--ivory);
text-shadow: 0 0 34px rgba(217, 179, 108, 0.4);
}
.epitaph__label {
margin-top: 16px;
font-size: 10px; letter-spacing: 0.34em; text-transform: uppercase;
color: var(--gold);
}
.epitaph__descend[hidden] { display: none; }
.epitaph__descend {
display: inline-block;
margin-top: 20px;
padding: 8px 22px;
font-family: var(--serif);
font-style: italic;
font-size: 17px;
letter-spacing: 0.05em;
color: var(--gold);
background: rgba(7, 8, 14, 0.5);
border: 1px solid var(--hairline);
border-radius: 999px;
cursor: pointer;
pointer-events: auto;
-webkit-backdrop-filter: blur(6px);
backdrop-filter: blur(6px);
transition: color 0.25s, border-color 0.25s, box-shadow 0.25s, transform 0.25s;
}
.epitaph__descend:hover {
color: var(--gold-bright);
border-color: var(--gold);
box-shadow: 0 0 28px rgba(217, 179, 108, 0.18);
transform: translateY(-1px);
}
/* ---------- altar (wish input) ---------- */
.altar {
position: fixed; left: 50%; bottom: 40px; z-index: 11;
transform: translateX(-50%);
width: min(460px, calc(100vw - 48px));
text-align: center;
}
.altar__chip[hidden] { display: none; }
.altar__chip {
display: inline-block;
margin-bottom: 12px;
padding: 6px 16px;
font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase;
color: var(--gold);
border: 1px solid var(--hairline);
border-radius: 999px;
background: var(--panel);
backdrop-filter: blur(8px);
}
.altar__form {
display: flex; align-items: stretch;
border: 1px solid var(--hairline);
border-radius: 999px;
background: var(--panel);
backdrop-filter: blur(10px);
transition: border-color 0.3s, box-shadow 0.3s;
}
.altar__form:focus-within {
border-color: var(--gold);
box-shadow: 0 0 30px rgba(217, 179, 108, 0.14);
}
.altar__input {
flex: 1;
background: none; border: none; outline: none;
padding: 15px 8px 15px 24px;
font-family: var(--serif);
font-size: 18px;
font-style: italic;
color: var(--ivory);
caret-color: var(--gold);
}
.altar__input::placeholder { color: var(--ivory-faint); }
.altar__send {
background: none; border: none; cursor: pointer;
padding: 0 20px;
color: var(--gold);
font-size: 16px;
transition: color 0.25s, transform 0.25s;
}
.altar__send:hover { color: var(--gold-bright); }
.altar__send:disabled { color: var(--ivory-faint); cursor: default; }
.altar__sigil { display: inline-block; transition: transform 0.4s; }
.altar__send:hover .altar__sigil { transform: rotate(90deg) scale(1.15); }
.altar__hint {
margin-top: 11px;
font-size: 10px; letter-spacing: 0.26em; text-transform: uppercase;
color: var(--ivory-faint);
}
.altar__hint.is-warn { color: #d98a7a; }
/* ---------- status ---------- */
.status {
position: fixed; right: 42px; bottom: 42px; z-index: 10;
font-family: var(--mono); font-size: 10px;
letter-spacing: 0.1em;
color: rgba(236, 229, 216, 0.22);
text-align: right;
}
/* =====================================================================
GENESIS LOG (book.html)
===================================================================== */
.book-brand {
position: fixed; top: 34px; left: 42px; z-index: 10; pointer-events: auto;
}
.book-brand__mark {
font-family: var(--serif); font-weight: 500;
font-size: 17px; letter-spacing: 0.42em;
color: var(--ivory-dim);
text-decoration: none;
}
.book-brand__mark:hover { color: var(--ivory); }
.book-brand__title {
margin-top: 14px;
font-family: var(--serif);
font-weight: 500;
font-size: clamp(28px, 3.4vw, 44px);
letter-spacing: 0.18em;
color: var(--ivory);
text-shadow: 0 0 28px rgba(217, 179, 108, 0.3);
}
.book-brand__sub {
margin-top: 8px;
font-size: 10px; letter-spacing: 0.3em; text-transform: uppercase;
color: var(--ivory-faint);
}
/* a left-side dark gradient scrim so the log column reads over the bright
planet rim + gold trail — sits behind the entries, fades to clear on the
right so the planet still breathes. */
.ledger-scrim {
position: fixed; left: 0; top: 0; bottom: 0; z-index: 9;
width: min(560px, 56vw);
pointer-events: none;
background: linear-gradient(to right,
rgba(3, 4, 8, 0.82) 0%,
rgba(3, 4, 8, 0.66) 34%,
rgba(3, 4, 8, 0.34) 62%,
transparent 100%);
}
.ledger {
position: fixed; top: 168px; bottom: 36px; left: 42px; z-index: 10;
width: min(360px, calc(100vw - 64px));
overflow-y: auto;
padding-right: 14px;
scrollbar-width: thin;
scrollbar-color: var(--hairline-dim) transparent;
mask-image: linear-gradient(to bottom, black 92%, transparent);
-webkit-mask-image: linear-gradient(to bottom, black 92%, transparent);
}
.ledger__entry {
display: block; width: 100%; text-align: left;
background: none; border: none; cursor: pointer;
border-top: 1px solid var(--hairline-dim);
padding: 16px 10px 16px 4px;
color: inherit;
font-family: inherit;
transition: background 0.25s, border-color 0.25s;
}
.ledger__entry:hover { background: rgba(217, 179, 108, 0.05); }
.ledger__entry.is-active {
background: rgba(217, 179, 108, 0.08);
border-top-color: var(--hairline);
}
.ledger__epoch {
font-size: 9.5px; letter-spacing: 0.3em; text-transform: uppercase;
color: var(--gold);
}
.ledger__wish {
margin-top: 6px;
font-family: var(--serif);
font-size: 19px;
line-height: 1.3;
color: var(--ivory);
}
.ledger__epitaph {
margin-top: 5px;
font-family: var(--serif);
font-style: italic;
font-size: 14px;
color: var(--ivory-dim);
}
.ledger__empty {
padding: 22px 4px;
font-family: var(--serif); font-style: italic; font-size: 16px;
color: var(--ivory-dim);
border-top: 1px solid var(--hairline-dim);
}
.book-voice { left: auto; right: 42px; bottom: 42px; border-left: none; border-right: 1px solid var(--hairline); padding-left: 0; padding-right: 20px; text-align: right; }
.book-voice .voice__head { justify-content: flex-end; }
.replay-hint {
position: fixed; right: 42px; top: 38px; z-index: 10;
font-size: 10px; letter-spacing: 0.26em; text-transform: uppercase;
color: var(--ivory-faint);
text-align: right;
}
.replay-hint a { color: var(--gold); text-decoration: none; }
/* ---------- responsive ---------- */
@media (max-width: 760px) {
.almanac { right: 20px; top: 28px; }
.voice { left: 20px; bottom: 130px; width: calc(100vw - 40px); max-width: none; }
.voice__stream { max-height: 118px; font-size: 15px; line-height: 1.5; }
.ledger-scrim { width: 100vw; }
.altar { bottom: 18px; }
.status { display: none; }
.brand { top: 22px; }
.ledger { top: 150px; width: calc(100vw - 56px); }
.book-brand { left: 20px; }
.book-voice { right: 20px; }
.replay-hint { display: none; }
}