Files
3d-homepage-zozomu/styles.css
2026-02-20 21:08:02 +00:00

468 lines
13 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
═══════════════════════════════════════════════════════════════════
LUMEREL — 3D Hero Page
Font : General Sans (Fontshare)
Theme : Pure black · Web3 · Spline-ready
═══════════════════════════════════════════════════════════════════
*/
/* ── Reset & Base ──────────────────────────────────────────────────── */
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html, body {
width: 100%;
height: 100%;
background: #000000;
color: #ffffff;
font-family: 'General Sans', system-ui, -apple-system, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
overflow-x: hidden;
}
a {
text-decoration: none;
color: inherit;
}
ul {
list-style: none;
}
button {
cursor: pointer;
border: none;
background: none;
font-family: inherit;
}
/*
═══════════════════════════════════════════════════════════════════
HERO SECTION
Full-screen · layers: video → 3D → navbar → content
═══════════════════════════════════════════════════════════════════
*/
.hero {
position: relative;
width: 100%;
min-height: 100dvh;
background: #000000;
overflow: hidden;
}
/* ── Layer 0 · Background Video ────────────────────────────────────── */
.hero__video-wrap {
position: absolute;
inset: 0;
z-index: 0;
}
.hero__video {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
/* Exactly 50% black overlay */
.hero__overlay {
position: absolute;
inset: 0;
background: rgba(0, 0, 0, 0.50);
}
/* ── Layer 1 · 3D / Spline ─────────────────────────────────────────────
Above video (z-index: 1), below all UI (z-index: 2+).
pointer-events: none keeps buttons & links fully clickable.
Call window.Lumerel.enableSpline() for interactive scenes.
─────────────────────────────────────────────────────────────────────── */
.hero__3d-layer {
position: absolute;
inset: 0;
z-index: 1;
pointer-events: none;
}
/* Spline viewer fills the full layer */
.hero__3d-layer spline-viewer {
width: 100%;
height: 100%;
display: block;
}
/* ── 3D Placeholder Orbs ───────────────────────────────────────────────
Animated ambient orbs simulate depth until Spline assets arrive.
Delete .spline-placeholder when adding <spline-viewer>.
─────────────────────────────────────────────────────────────────────── */
.spline-placeholder {
position: relative;
width: 100%;
height: 100%;
}
.orb {
position: absolute;
border-radius: 50%;
filter: blur(80px);
opacity: 0.18;
}
.orb--violet {
width: 520px;
height: 520px;
background: radial-gradient(circle, #7c3aed 0%, #4f46e5 55%, transparent 100%);
top: 8%;
right: 5%;
animation: orbDrift 11s ease-in-out infinite;
}
.orb--cyan {
width: 360px;
height: 360px;
background: radial-gradient(circle, #06b6d4 0%, #3b82f6 55%, transparent 100%);
bottom: 14%;
left: 4%;
animation: orbDrift 13s ease-in-out infinite reverse;
animation-delay: -5s;
}
.orb--pink {
width: 260px;
height: 260px;
background: radial-gradient(circle, #f0abfc 0%, #a78bfa 55%, transparent 100%);
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
animation: orbDriftCenter 9s ease-in-out infinite;
animation-delay: -3s;
}
@keyframes orbDrift {
0%, 100% { transform: translate(0, 0) scale(1); }
33% { transform: translate(-20px, -30px) scale(1.06); }
66% { transform: translate(16px, 22px) scale(0.95); }
}
@keyframes orbDriftCenter {
0%, 100% { transform: translate(-50%, -50%) scale(1); }
40% { transform: translate(-50%, -60%) scale(1.08); }
75% { transform: translate(-50%, -44%) scale(0.94); }
}
/* Placeholder label */
.spline-placeholder__label {
position: absolute;
bottom: 32px;
left: 50%;
transform: translateX(-50%);
font-size: 11px;
font-weight: 500;
letter-spacing: 0.10em;
text-transform: uppercase;
color: rgba(255, 255, 255, 0.20);
white-space: nowrap;
border: 1px solid rgba(255, 255, 255, 0.08);
padding: 6px 14px;
border-radius: 100px;
}
/*
═══════════════════════════════════════════════════════════════════
NAVBAR
z-index: 10 · fixed to top · transparent → frosted on scroll
═══════════════════════════════════════════════════════════════════
*/
.navbar {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 10;
background: transparent;
transition: background 0.3s ease, backdrop-filter 0.3s ease;
}
.navbar__inner {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20px 120px;
}
/* Left cluster: logo + links */
.navbar__left {
display: flex;
align-items: center;
gap: 40px;
}
/* Logo — exactly 187×25px */
.navbar__logo {
display: flex;
align-items: center;
flex-shrink: 0;
width: 187px;
height: 25px;
}
.navbar__logo svg {
width: 187px;
height: 25px;
overflow: visible;
}
/* Nav links list */
.navbar__links {
display: flex;
align-items: center;
gap: 30px;
}
/* Each nav link */
.navbar__link {
display: inline-flex;
align-items: center;
gap: 6px; /* 6px gap between label and chevron (fits within 14px spec) */
font-size: 14px;
font-weight: 500;
color: #ffffff;
white-space: nowrap;
transition: opacity 0.2s ease;
}
.navbar__link:hover {
opacity: 0.75;
}
.navbar__chevron {
flex-shrink: 0;
width: 14px;
height: 14px;
}
/* Right cluster */
.navbar__right {
display: flex;
align-items: center;
}
/*
═══════════════════════════════════════════════════════════════════
PILL BUTTON — Layered Construction
─────────────────────────────────────────────────────────────────
Outer ring : box-shadow 0 0 0 0.6px #fff (exact 0.6px border)
Glow streak : .btn-pill__glow — blurred radial-gradient at top
Inner pill : background + text
Padding : 11px 29px
═══════════════════════════════════════════════════════════════════
*/
.btn-pill {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 100px;
padding: 11px 29px;
font-family: 'General Sans', system-ui, sans-serif;
font-size: 14px;
font-weight: 500;
line-height: 1;
overflow: hidden;
cursor: pointer;
transition: opacity 0.2s ease, transform 0.15s ease;
/* 0.6px outer white border via box-shadow */
box-shadow: 0 0 0 0.6px rgba(255, 255, 255, 1);
}
.btn-pill:hover {
opacity: 0.88;
transform: translateY(-1px);
}
.btn-pill:active {
transform: translateY(0);
opacity: 1;
}
/* Glow streak — blurred white gradient along the top edge */
.btn-pill__glow {
position: absolute;
top: -6px;
left: 50%;
transform: translateX(-50%);
width: 70%;
height: 18px;
background: radial-gradient(ellipse at 50% 0%, rgba(255,255,255,0.70) 0%, rgba(255,255,255,0) 80%);
filter: blur(4px);
border-radius: 50%;
pointer-events: none;
z-index: 1;
}
/* Label sits above the glow */
.btn-pill__label {
position: relative;
z-index: 2;
}
/* ── Dark variant (navbar) — black bg, white text ── */
.btn-pill--dark {
background: #000000;
color: #ffffff;
}
/* ── Light variant (CTA) — white bg, black text ── */
.btn-pill--light {
background: #ffffff;
color: #000000;
}
/* Light variant glow is slightly more visible against white */
.btn-pill--light .btn-pill__glow {
background: radial-gradient(ellipse at 50% 0%, rgba(255,255,255,0.90) 0%, rgba(255,255,255,0) 80%);
}
/*
═══════════════════════════════════════════════════════════════════
HERO CONTENT
z-index: 3 · centered · stacked with 40px gaps
═══════════════════════════════════════════════════════════════════
*/
.hero__content {
position: relative;
z-index: 3;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
gap: 40px;
/* Desktop: 280px top, 102px bottom */
padding: 280px 24px 102px;
}
/* ── Badge / early-access pill ─────────────────────────────────────── */
.hero__badge {
display: inline-flex;
align-items: center;
gap: 10px;
border-radius: 20px;
background: rgba(255, 255, 255, 0.10);
border: 1px solid rgba(255, 255, 255, 0.20);
padding: 7px 14px;
}
/* 4px white dot */
.hero__badge-dot {
display: inline-block;
width: 4px;
height: 4px;
border-radius: 50%;
background: #ffffff;
flex-shrink: 0;
}
.hero__badge-text {
font-size: 13px;
font-weight: 500;
line-height: 1;
}
.hero__badge-muted {
color: rgba(255, 255, 255, 0.60);
}
.hero__badge-date {
color: #ffffff;
}
/* ── Main Heading ───────────────────────────────────────────────────── */
.hero__heading {
max-width: 613px;
font-size: 56px;
font-weight: 500;
line-height: 1.28;
letter-spacing: -0.02em;
/* Gradient text: 144.5deg, white at 28% → transparent black at 115% */
background: linear-gradient(144.5deg, #ffffff 28%, rgba(0, 0, 0, 0) 115%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
color: transparent;
}
/* ── Subtitle ───────────────────────────────────────────────────────── */
.hero__subtitle {
/* 24px gap from heading — gap is 40px globally, so pull up by 16px */
margin-top: -16px;
max-width: 680px;
font-size: 15px;
font-weight: 400;
line-height: 1.65;
color: rgba(255, 255, 255, 0.70);
}
/*
═══════════════════════════════════════════════════════════════════
RESPONSIVE
═══════════════════════════════════════════════════════════════════
*/
/* ── Tablet (≤1024px) ── */
@media (max-width: 1024px) {
.navbar__inner {
padding: 20px 48px;
}
}
/* ── Mobile (≤767px) ── */
@media (max-width: 767px) {
/* Navbar */
.navbar__inner {
padding: 20px 24px;
}
/* Hide nav links on mobile */
.navbar__links {
display: none;
}
/* Shrink left gap without nav links */
.navbar__left {
gap: 0;
}
/* Hero content */
.hero__content {
padding-top: 200px;
gap: 32px;
}
/* Heading scales down */
.hero__heading {
font-size: 36px;
letter-spacing: -0.01em;
}
/* Subtitle gap adjusts */
.hero__subtitle {
margin-top: -8px;
font-size: 14px;
}
}
/* ── Small mobile (≤480px) ── */
@media (max-width: 480px) {
.navbar__inner {
padding: 18px 20px;
}
.hero__heading {
font-size: 32px;
}
}