<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ASTRYX TCG — Coming to Kickstarter</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Cinzel+Decorative:wght@400;700;900&family=Cinzel:wght@400;600;700&family=Crimson+Pro:ital,wght@0,300;0,400;1,300;1,400&display=swap" rel="stylesheet">
<style>
:root {
--gold: #c9a84c;
--gold-bright: #f0c85a;
--gold-dark: #7a5c1e;
--deep: #04070f;
--nebula-purple: #1a0b2e;
--nebula-teal: #071a1f;
--text: #e8dfc8;
--muted: #8a7d60;
--accent: #5db8c8;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
background: var(--deep);
color: var(--text);
font-family: 'Crimson Pro', Georgia, serif;
overflow-x: hidden;
cursor: default;
}
/* STAR FIELD */
.starfield {
position: fixed;
inset: 0;
z-index: 0;
overflow: hidden;
pointer-events: none;
}
.starfield::before, .starfield::after {
content: '';
position: absolute;
inset: -50%;
width: 200%;
height: 200%;
background-image:
radial-gradient(1px 1px at 10% 15%, rgba(255,255,255,0.8) 0%, transparent 100%),
radial-gradient(1px 1px at 23% 44%, rgba(255,255,255,0.5) 0%, transparent 100%),
radial-gradient(1.5px 1.5px at 37% 8%, rgba(255,255,255,0.9) 0%, transparent 100%),
radial-gradient(1px 1px at 52% 31%, rgba(255,255,255,0.6) 0%, transparent 100%),
radial-gradient(1px 1px at 67% 19%, rgba(255,255,255,0.7) 0%, transparent 100%),
radial-gradient(1.5px 1.5px at 78% 55%, rgba(255,255,255,0.8) 0%, transparent 100%),
radial-gradient(1px 1px at 88% 7%, rgba(255,255,255,0.5) 0%, transparent 100%),
radial-gradient(1px 1px at 94% 40%, rgba(255,255,255,0.6) 0%, transparent 100%),
radial-gradient(1px 1px at 5% 70%, rgba(255,255,255,0.7) 0%, transparent 100%),
radial-gradient(1px 1px at 18% 85%, rgba(255,255,255,0.4) 0%, transparent 100%),
radial-gradient(1.5px 1.5px at 30% 62%, rgba(255,255,255,0.8) 0%, transparent 100%),
radial-gradient(1px 1px at 45% 90%, rgba(255,255,255,0.5) 0%, transparent 100%),
radial-gradient(1px 1px at 60% 74%, rgba(255,255,255,0.6) 0%, transparent 100%),
radial-gradient(1px 1px at 72% 88%, rgba(255,255,255,0.4) 0%, transparent 100%),
radial-gradient(1.5px 1.5px at 83% 67%, rgba(255,255,255,0.7) 0%, transparent 100%),
radial-gradient(1px 1px at 91% 80%, rgba(255,255,255,0.5) 0%, transparent 100%),
radial-gradient(1px 1px at 14% 33%, rgba(200,220,255,0.6) 0%, transparent 100%),
radial-gradient(1px 1px at 56% 50%, rgba(200,220,255,0.5) 0%, transparent 100%),
radial-gradient(2px 2px at 75% 25%, rgba(255,240,200,0.6) 0%, transparent 100%),
radial-gradient(1px 1px at 40% 77%, rgba(180,200,255,0.5) 0%, transparent 100%);
animation: drift 120s linear infinite;
}
.starfield::after {
animation-duration: 180s;
animation-direction: reverse;
background-image:
radial-gradient(1px 1px at 8% 22%, rgba(255,255,255,0.6) 0%, transparent 100%),
radial-gradient(1px 1px at 19% 55%, rgba(255,255,255,0.4) 0%, transparent 100%),
radial-gradient(1.5px 1.5px at 33% 38%, rgba(255,255,255,0.7) 0%, transparent 100%),
radial-gradient(1px 1px at 48% 12%, rgba(255,255,255,0.5) 0%, transparent 100%),
radial-gradient(1px 1px at 63% 67%, rgba(255,255,255,0.8) 0%, transparent 100%),
radial-gradient(1px 1px at 77% 44%, rgba(255,255,255,0.4) 0%, transparent 100%),
radial-gradient(1.5px 1.5px at 85% 18%, rgba(255,255,255,0.7) 0%, transparent 100%),
radial-gradient(1px 1px at 96% 72%, rgba(255,255,255,0.5) 0%, transparent 100%),
radial-gradient(1px 1px at 25% 93%, rgba(255,255,255,0.6) 0%, transparent 100%),
radial-gradient(1px 1px at 55% 86%, rgba(200,180,255,0.5) 0%, transparent 100%),
radial-gradient(2px 2px at 70% 5%, rgba(255,240,180,0.7) 0%, transparent 100%),
radial-gradient(1px 1px at 42% 59%, rgba(180,220,255,0.4) 0%, transparent 100%);
}
@keyframes drift {
from { transform: translateY(0) translateX(0); }
to { transform: translateY(-25%) translateX(-10%); }
}
/* NEBULA BG */
.nebula-bg {
position: fixed;
inset: 0;
z-index: 0;
background:
radial-gradient(ellipse 80% 60% at 20% 30%, rgba(40,10,80,0.5) 0%, transparent 60%),
radial-gradient(ellipse 60% 80% at 80% 70%, rgba(5,40,50,0.5) 0%, transparent 60%),
radial-gradient(ellipse 100% 50% at 50% 100%, rgba(10,20,50,0.7) 0%, transparent 50%),
var(--deep);
pointer-events: none;
}
/* LAYOUT */
.page { position: relative; z-index: 1; }
/* ── HERO ── */
.hero {
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
padding: 2rem;
position: relative;
}
.hero-logo {
width: min(480px, 85vw);
margin-bottom: 2.5rem;
animation: floatLogo 6s ease-in-out infinite, fadeIn 1.2s ease forwards;
filter: drop-shadow(0 0 40px rgba(201,168,76,0.4));
}
@keyframes floatLogo {
0%, 100% { transform: translateY(0px); }
50% { transform: translateY(-12px); }
}
@keyframes fadeIn {
from { opacity: 0; transform: scale(0.92); }
to { opacity: 1; transform: scale(1); }
}
.hero-tagline {
font-family: 'Cinzel', serif;
font-size: clamp(0.7rem, 1.8vw, 0.95rem);
letter-spacing: 0.35em;
color: var(--gold);
text-transform: uppercase;
margin-bottom: 1.5rem;
opacity: 0;
animation: slideUp 0.8s ease 0.4s forwards;
}
.hero-headline {
font-family: 'Cinzel Decorative', serif;
font-size: clamp(2rem, 6vw, 4rem);
font-weight: 900;
line-height: 1.1;
background: linear-gradient(135deg, var(--gold-bright) 0%, var(--gold) 40%, #fff6cc 70%, var(--gold) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: 1.5rem;
opacity: 0;
animation: slideUp 0.8s ease 0.6s forwards;
}
.hero-sub {
font-size: clamp(1rem, 2.5vw, 1.3rem);
font-style: italic;
color: var(--text);
max-width: 600px;
line-height: 1.7;
opacity: 0;
animation: slideUp 0.8s ease 0.8s forwards;
margin-bottom: 3rem;
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
.cta-group {
display: flex;
flex-wrap: wrap;
gap: 1rem;
justify-content: center;
opacity: 0;
animation: slideUp 0.8s ease 1s forwards;
}
.btn-primary {
font-family: 'Cinzel', serif;
font-size: 0.85rem;
letter-spacing: 0.2em;
text-transform: uppercase;
padding: 1rem 2.5rem;
background: linear-gradient(135deg, var(--gold) 0%, var(--gold-bright) 50%, var(--gold) 100%);
color: var(--deep);
border: none;
cursor: pointer;
position: relative;
clip-path: polygon(8px 0%, 100% 0%, calc(100% - 8px) 100%, 0% 100%);
transition: all 0.3s ease;
font-weight: 700;
text-decoration: none;
display: inline-block;
}
.btn-primary:hover {
background: linear-gradient(135deg, var(--gold-bright) 0%, #fff5a0 50%, var(--gold-bright) 100%);
transform: translateY(-2px);
box-shadow: 0 8px 30px rgba(201,168,76,0.5);
}
.btn-secondary {
font-family: 'Cinzel', serif;
font-size: 0.85rem;
letter-spacing: 0.2em;
text-transform: uppercase;
padding: 1rem 2.5rem;
background: transparent;
color: var(--gold);
border: 1px solid var(--gold-dark);
cursor: pointer;
clip-path: polygon(8px 0%, 100% 0%, calc(100% - 8px) 100%, 0% 100%);
transition: all 0.3s ease;
text-decoration: none;
display: inline-block;
}
.btn-secondary:hover {
border-color: var(--gold);
background: rgba(201,168,76,0.1);
transform: translateY(-2px);
}
/* SCROLL INDICATOR */
.scroll-hint {
position: absolute;
bottom: 2rem;
left: 50%;
transform: translateX(-50%);
display: flex;
flex-direction: column;
align-items: center;
gap: 0.5rem;
opacity: 0.5;
animation: fadeIn 1s ease 2s forwards, bounce 2s ease 2s infinite;
}
.scroll-hint span {
font-family: 'Cinzel', serif;
font-size: 0.6rem;
letter-spacing: 0.3em;
color: var(--gold);
}
.scroll-arrow {
width: 20px;
height: 20px;
border-right: 1px solid var(--gold);
border-bottom: 1px solid var(--gold);
transform: rotate(45deg);
}
@keyframes bounce {
0%, 100% { transform: translateX(-50%) translateY(0); }
50% { transform: translateX(-50%) translateY(6px); }
}
/* DIVIDER */
.divider {
width: 100%;
height: 1px;
background: linear-gradient(90deg, transparent, var(--gold-dark), var(--gold), var(--gold-dark), transparent);
margin: 0;
position: relative;
}
.divider-diamond {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) rotate(45deg);
width: 8px;
height: 8px;
background: var(--gold);
box-shadow: 0 0 12px var(--gold);
}
/* SECTIONS */
section {
padding: 5rem 2rem;
max-width: 1000px;
margin: 0 auto;
}
.section-label {
font-family: 'Cinzel', serif;
font-size: 0.65rem;
letter-spacing: 0.4em;
color: var(--gold);
text-transform: uppercase;
display: block;
margin-bottom: 1rem;
}
.section-title {
font-family: 'Cinzel Decorative', serif;
font-size: clamp(1.4rem, 3.5vw, 2.2rem);
font-weight: 700;
color: var(--text);
margin-bottom: 2rem;
line-height: 1.2;
}
.section-title em {
font-style: normal;
background: linear-gradient(135deg, var(--gold-bright), var(--gold));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.section-body {
font-size: 1.15rem;
line-height: 1.85;
color: #c8bfa4;
max-width: 680px;
}
.section-body p + p { margin-top: 1.2rem; }
/* CARD SHOWCASE */
.card-showcase {
padding: 5rem 2rem;
max-width: 1000px;
margin: 0 auto;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4rem;
align-items: center;
}
.card-display {
position: relative;
display: flex;
justify-content: center;
}
.card-img {
width: min(320px, 80vw);
border-radius: 12px;
box-shadow:
0 0 60px rgba(201,168,76,0.25),
0 0 120px rgba(93,184,200,0.1),
0 30px 60px rgba(0,0,0,0.7);
animation: cardFloat 5s ease-in-out infinite;
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.card-img:hover {
transform: scale(1.04) rotate(1deg);
box-shadow:
0 0 80px rgba(201,168,76,0.4),
0 0 160px rgba(93,184,200,0.15),
0 40px 80px rgba(0,0,0,0.8);
}
@keyframes cardFloat {
0%, 100% { transform: translateY(0) rotate(-1deg); }
50% { transform: translateY(-10px) rotate(1deg); }
}
.card-glow {
position: absolute;
inset: -20px;
background: radial-gradient(ellipse at center, rgba(93,184,200,0.15) 0%, transparent 70%);
pointer-events: none;
animation: glowPulse 3s ease-in-out infinite;
}
@keyframes glowPulse {
0%, 100% { opacity: 0.6; }
50% { opacity: 1; }
}
/* PILLARS */
.pillars {
padding: 5rem 2rem;
max-width: 1000px;
margin: 0 auto;
}
.pillars-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 1.5rem;
margin-top: 3rem;
}
.pillar {
border: 1px solid rgba(201,168,76,0.15);
padding: 2rem 1.5rem;
position: relative;
background: linear-gradient(135deg, rgba(201,168,76,0.03) 0%, transparent 100%);
transition: border-color 0.3s ease, background 0.3s ease;
}
.pillar:hover {
border-color: rgba(201,168,76,0.4);
background: linear-gradient(135deg, rgba(201,168,76,0.07) 0%, transparent 100%);
}
.pillar::before {
content: '';
position: absolute;
top: -1px;
left: 20%;
width: 60%;
height: 1px;
background: linear-gradient(90deg, transparent, var(--gold), transparent);
}
.pillar-icon {
font-size: 1.6rem;
margin-bottom: 1rem;
display: block;
}
.pillar-title {
font-family: 'Cinzel', serif;
font-size: 0.8rem;
letter-spacing: 0.2em;
color: var(--gold);
text-transform: uppercase;
margin-bottom: 0.75rem;
}
.pillar-text {
font-size: 0.95rem;
line-height: 1.7;
color: #a09278;
}
/* FACTIONS */
.factions {
padding: 5rem 2rem;
max-width: 1000px;
margin: 0 auto;
}
.faction-list {
margin-top: 2.5rem;
display: flex;
flex-direction: column;
gap: 1px;
}
.faction-item {
display: grid;
grid-template-columns: 180px 1fr;
gap: 2rem;
padding: 1.4rem 0;
border-bottom: 1px solid rgba(201,168,76,0.08);
align-items: start;
transition: background 0.2s ease;
}
.faction-item:hover {
background: rgba(201,168,76,0.03);
padding-left: 0.5rem;
padding-right: 0.5rem;
margin: 0 -0.5rem;
}
.faction-name {
font-family: 'Cinzel', serif;
font-size: 0.8rem;
letter-spacing: 0.15em;
color: var(--gold);
text-transform: uppercase;
padding-top: 0.15rem;
}
.faction-desc {
font-size: 0.98rem;
line-height: 1.65;
color: #a09278;
}
/* NOTIFY FORM */
.notify-section {
padding: 5rem 2rem 7rem;
max-width: 700px;
margin: 0 auto;
text-align: center;
}
.notify-box {
border: 1px solid rgba(201,168,76,0.25);
padding: 3.5rem 3rem;
position: relative;
background: linear-gradient(135deg, rgba(10,5,25,0.8) 0%, rgba(5,15,20,0.8) 100%);
backdrop-filter: blur(10px);
}
.notify-box::before {
content: '';
position: absolute;
inset: -1px;
background: linear-gradient(135deg, rgba(201,168,76,0.3), transparent 40%, rgba(93,184,200,0.1), transparent 80%, rgba(201,168,76,0.2));
z-index: -1;
border-radius: 1px;
}
.notify-box .section-title {
font-size: clamp(1.2rem, 3vw, 1.8rem);
margin-bottom: 1rem;
}
.notify-box p {
font-size: 1.05rem;
line-height: 1.7;
color: #a09278;
margin-bottom: 2.5rem;
font-style: italic;
}
.notify-form {
display: flex;
gap: 0;
max-width: 460px;
margin: 0 auto 1.5rem;
}
.notify-input {
flex: 1;
padding: 0.9rem 1.2rem;
background: rgba(255,255,255,0.05);
border: 1px solid rgba(201,168,76,0.3);
border-right: none;
color: var(--text);
font-family: 'Crimson Pro', serif;
font-size: 1rem;
outline: none;
transition: border-color 0.3s ease;
clip-path: polygon(6px 0%, 100% 0%, 100% 100%, 0% 100%);
}
.notify-input::placeholder { color: var(--muted); }
.notify-input:focus { border-color: var(--gold); }
.notify-btn {
font-family: 'Cinzel', serif;
font-size: 0.75rem;
letter-spacing: 0.2em;
text-transform: uppercase;
padding: 0.9rem 1.5rem;
background: linear-gradient(135deg, var(--gold) 0%, var(--gold-bright) 100%);
color: var(--deep);
border: none;
cursor: pointer;
font-weight: 700;
transition: all 0.3s ease;
white-space: nowrap;
clip-path: polygon(0% 0%, calc(100% - 6px) 0%, 100% 100%, 0% 100%);
}
.notify-btn:hover {
background: linear-gradient(135deg, var(--gold-bright) 0%, #fff5a0 100%);
box-shadow: 0 4px 20px rgba(201,168,76,0.4);
}
.notify-note {
font-size: 0.78rem;
color: var(--muted);
letter-spacing: 0.05em;
}
.success-msg {
display: none;
font-family: 'Cinzel', serif;
font-size: 0.85rem;
letter-spacing: 0.15em;
color: var(--gold-bright);
padding: 1rem;
text-align: center;
}
/* FOOTER */
footer {
border-top: 1px solid rgba(201,168,76,0.1);
padding: 2rem;
text-align: center;
}
footer p {
font-size: 0.78rem;
color: var(--muted);
letter-spacing: 0.1em;
font-family: 'Cinzel', serif;
}
footer .footer-logo {
font-family: 'Cinzel Decorative', serif;
font-size: 0.9rem;
color: var(--gold);
letter-spacing: 0.3em;
margin-bottom: 0.5rem;
}
/* STAT BAR */
.stat-bar {
display: flex;
justify-content: center;
gap: 4rem;
padding: 3rem 2rem;
border-top: 1px solid rgba(201,168,76,0.1);
border-bottom: 1px solid rgba(201,168,76,0.1);
flex-wrap: wrap;
}
.stat { text-align: center; }
.stat-num {
font-family: 'Cinzel Decorative', serif;
font-size: clamp(1.6rem, 4vw, 2.4rem);
background: linear-gradient(135deg, var(--gold-bright), var(--gold));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
display: block;
}
.stat-label {
font-family: 'Cinzel', serif;
font-size: 0.6rem;
letter-spacing: 0.3em;
color: var(--muted);
text-transform: uppercase;
display: block;
margin-top: 0.3rem;
}
/* RESPONSIVE */
@media (max-width: 700px) {
.card-showcase {
grid-template-columns: 1fr;
gap: 2.5rem;
}
.card-showcase .card-display { order: -1; }
.notify-form { flex-direction: column; }
.notify-input, .notify-btn {
clip-path: none;
border-right: 1px solid rgba(201,168,76,0.3);
}
.notify-btn { width: 100%; padding: 1rem; }
.faction-item { grid-template-columns: 1fr; gap: 0.5rem; }
.stat-bar { gap: 2rem; }
}
</style>
</head>
<body>
<div class="nebula-bg"></div>
<div class="starfield"></div>
<div class="page">
<!-- HERO -->
<section class="hero">
<img class="hero-logo" src="/mnt/user-data/uploads/IMG_9405.png" alt="ASTRYX Trading Card Game Logo">
<span class="hero-tagline">A Space Opera Trading Card Game — Coming to Kickstarter</span>
<h1 class="hero-headline">The Expanse<br>Awaits</h1>
<p class="hero-sub">
256 cards. Six factions. One galaxy on the edge of total war.<br>
Ancient gods watch from a dimension you cannot see.
</p>
<div class="cta-group">
<a href="#notify" class="btn-primary">Notify Me at Launch</a>
<a href="#about" class="btn-secondary">Learn More</a>
</div>
<div class="scroll-hint">
<span>Explore</span>
<div class="scroll-arrow"></div>
</div>
</section>
<!-- STAT BAR -->
<div class="stat-bar">
<div class="stat">
<span class="stat-num">256</span>
<span class="stat-label">Cards in Set</span>
</div>
<div class="stat">
<span class="stat-num">6</span>
<span class="stat-label">Factions</span>
</div>
<div class="stat">
<span class="stat-num">8</span>
<span class="stat-label">Rarity Tiers</span>
</div>
<div class="stat">
<span class="stat-num">8</span>
<span class="stat-label">Species</span>
</div>
</div>
<div class="divider"><div class="divider-diamond"></div></div>
<!-- ABOUT -->
<section id="about">
<span class="section-label">The Premise</span>
<h2 class="section-title">Pirates. Warlords. <em>Ancient Gods.</em></h2>
<div class="section-body">
<p>
ASTRYX is a physical trading card game set in <em>The Expanse</em> — a galaxy four thousand years into its latest age, stretched between empire and rebellion, science and worship, the known and the terrifyingly ancient.
</p>
<p>
The Astryx themselves — the Forerunners — didn't die. They retired into a sub-dimensional resonance layer, watching everything, reachable only under very specific conditions. Their megastructures still drift through the galaxy. Some still work.
</p>
<p>
You are one spark away from waking them up.
</p>
</div>
</section>
<div class="divider"><div class="divider-diamond"></div></div>
<!-- CARD SHOWCASE -->
<div class="card-showcase" id="cards">
<div>
<span class="section-label">First Reveal</span>
<h2 class="section-title">Legendary Card <em>001</em></h2>
<div class="section-body">
<p>
The Stellar Cartographer is the first card officially unveiled for the ASTRYX TCG. A Legendary-tier COSMIC MAPPER, she lets you navigate your deck like Mirra Volesh navigates the Expanse — always one step ahead.
</p>
<p>
Every card in ASTRYX carries lore, faction identity, and strategic weight. Ships clash in orbit. Planets fall to bombardment. Fuel determines your reach. And sometimes — if you're reckless enough — you wake something ancient.
</p>
</div>
</div>
<div class="card-display">
<div class="card-glow"></div>
<img class="card-img" src="/mnt/user-data/uploads/IMG_9406.png" alt="Stellar Cartographer — Astryx Legendary Card 001">
</div>
</div>
<div class="divider"><div class="divider-diamond"></div></div>
<!-- PILLARS -->
<div class="pillars">
<span class="section-label">How It Plays</span>
<h2 class="section-title">Deep Space. <em>Deep Strategy.</em></h2>
<div class="pillars-grid">
<div class="pillar">
<span class="pillar-icon">⚔</span>
<div class="pillar-title">Fleet Combat</div>
<p class="pillar-text">Ships engage in direct or orbital combat. High maneuverability trades off against raw firepower. Tactics matter as much as deck construction.</p>
</div>
<div class="pillar">
<span class="pillar-icon">🪐</span>
<div class="pillar-title">Planet Control</div>
<p class="pillar-text">Planets deploy fleets and project power — but they're exposed to orbital bombardment. Control the skies, control the surface.</p>
</div>
<div class="pillar">
<span class="pillar-icon">⚡</span>
<div class="pillar-title">Fuel Economy</div>
<p class="pillar-text">Solar, Chemical, and Nuclear fuel types define your reach. E-115 Moscovium is the Exodia-tier resource — rare, devastating, coveted.</p>
</div>
<div class="pillar">
<span class="pillar-icon">👁</span>
<div class="pillar-title">Forerunner Triggers</div>
<p class="pillar-text">Four ways to wake the Astryx — intentional, accidental, destructive, or through genuine achievement. What you get back is never guaranteed.</p>
</div>
</div>
</div>
<div class="divider"><div class="divider-diamond"></div></div>
<!-- FACTIONS -->
<div class="factions">
<span class="section-label">Six Powers</span>
<h2 class="section-title">Choose Your <em>Allegiance</em></h2>
<div class="faction-list">
<div class="faction-item">
<div class="faction-name">Sovereign Compact</div>
<div class="faction-desc">The lawful empire of the core systems. Disciplined, resourced, and convinced that order is the only thing standing between civilization and the void.</div>
</div>
<div class="faction-item">
<div class="faction-name">Free Margin</div>
<div class="faction-desc">Pirates, mercenaries, and frontier colonies bound by loose alliance and a shared disdain for authority. Unpredictable. Adaptive. Dangerous.</div>
</div>
<div class="faction-item">
<div class="faction-name">Ecclesiast</div>
<div class="faction-desc">Forerunner worshippers who sail cathedral ships and believe the Astryx are gods in waiting. One of them already found an active Resonance Anchor.</div>
</div>
<div class="faction-item">
<div class="faction-name">Concord</div>
<div class="faction-desc">Scientists and diplomats operating from three neutral stations. They study everything. They trust no one. They are closer to the truth than anyone realizes.</div>
</div>
<div class="faction-item">
<div class="faction-name">Veldhari Dominion</div>
<div class="faction-desc">Humanoid reptilians and a fallen empire slowly rebuilding. They remember what the Expanse looked like before the current age. That memory is a weapon.</div>
</div>
<div class="faction-item">
<div class="faction-name">Mycelarch Collective</div>
<div class="faction-desc">A humanoid fungal hivemind that spreads through infiltration. Seventeen confirmed hosts. The identity of the seventeenth is unknown.</div>
</div>
</div>
</div>
<div class="divider"><div class="divider-diamond"></div></div>
<!-- NOTIFY -->
<div class="notify-section" id="notify">
<div class="notify-box">
<span class="section-label" style="display:block; margin-bottom:1rem;">Kickstarter Pre-Launch</span>
<h2 class="section-title">Be First Into <em>The Expanse</em></h2>
<p>
The campaign launches soon. Follow on Kickstarter now and be notified the moment it goes live — early backers unlock exclusive rewards.
</p>
<div class="notify-form" id="notifyForm">
<input class="notify-input" type="email" placeholder="your@email.com" id="emailInput">
<button class="notify-btn" onclick="handleNotify()">Follow</button>
</div>
<div class="success-msg" id="successMsg">✦ You're on the list. The Expanse will find you. ✦</div>
<p class="notify-note">No spam. One launch notification. Unsubscribe anytime.</p>
</div>
</div>
<!-- FOOTER -->
<footer>
<div class="footer-logo">A · S · T · R · Y · X</div>
<p>Trading Card Game · Physical Print Edition · Kickstarter Campaign Coming Soon</p>
</footer>
</div>
<script>
function handleNotify() {
const email = document.getElementById('emailInput').value;
if (!email || !email.includes('@')) {
document.getElementById('emailInput').style.borderColor = 'rgba(200,80,80,0.6)';
return;
}
document.getElementById('notifyForm').style.display = 'none';
document.getElementById('successMsg').style.display = 'block';
}
// Intersection observer for reveal animations
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = '1';
entry.target.style.transform = 'translateY(0)';
}
});
}, { threshold: 0.15 });
document.querySelectorAll('section, .card-showcase, .pillars, .factions, .notify-section').forEach(el => {
el.style.opacity = '0';
el.style.transform = 'translateY(30px)';
el.style.transition = 'opacity 0.8s ease, transform 0.8s ease';
observer.observe(el);
});
// Hero shouldn't fade on scroll
document.querySelector('.hero').style.opacity = '1';
document.querySelector('.hero').style.transform = 'none';
</script>
</body>
</html>