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

471 lines
12 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 ──────────────────────────────────────────────── */
.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;
}
/* ── Layer 2 · Navbar ───────────────────────────────────────────── */
.navbar {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 10;
transition: background 0.25s ease, backdrop-filter 0.25s ease;
}
.navbar__inner {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20px 120px;
}
.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;
overflow: visible;
}
.navbar__logo svg {
width: 187px;
height: 25px;
}
/* Nav links list */
.navbar__links {
display: flex;
align-items: center;
gap: 30px;
}
.navbar__link {
display: flex;
align-items: center;
gap: 6px;
font-size: 14px;
font-weight: 500;
color: #ffffff;
white-space: nowrap;
transition: opacity 0.18s ease;
}
.navbar__link:hover {
opacity: 0.75;
}
.navbar__chevron {
flex-shrink: 0;
width: 14px;
height: 14px;
}
.navbar__right {
display: flex;
align-items: center;
}
/* ── Pill Button — Layered Construction ─────────────────────────
Outer ring : box-shadow 0.6px white
Glow streak : radial-gradient ellipse at top, blurred
Inner label : 11px 29px padding, 14px / 500 weight
--dark variant: black bg, white text (navbar)
--light variant: white bg, black text (CTA)
────────────────────────────────────────────────────────────────── */
.pill-btn {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 100px;
padding: 11px 29px;
font-size: 14px;
font-weight: 500;
font-family: 'General Sans', system-ui, -apple-system, sans-serif;
line-height: 1;
cursor: pointer;
border: none;
outline: none;
overflow: hidden;
transition: opacity 0.18s ease, transform 0.18s ease;
}
.pill-btn:hover {
opacity: 0.88;
transform: translateY(-1px);
}
.pill-btn:active {
transform: translateY(0);
}
/* 0.6px white outer border via box-shadow */
.pill-btn--dark {
background: #000000;
color: #ffffff;
box-shadow: 0 0 0 0.6px rgba(255, 255, 255, 1);
}
.pill-btn--light {
background: #ffffff;
color: #000000;
box-shadow: 0 0 0 0.6px rgba(255, 255, 255, 1);
}
/* Glow streak — white-to-transparent gradient blob at the top edge */
.pill-btn__glow {
position: absolute;
top: -4px;
left: 50%;
transform: translateX(-50%);
width: 70%;
height: 14px;
background: radial-gradient(
ellipse 60% 100% at 50% 0%,
rgba(255, 255, 255, 0.55) 0%,
rgba(255, 255, 255, 0.0) 100%
);
filter: blur(4px);
border-radius: 100px;
pointer-events: none;
z-index: 1;
}
/* Label sits above the glow */
.pill-btn__label {
position: relative;
z-index: 2;
}
/* ── Layer 3 · Hero Content ─────────────────────────────────────── */
.hero__content {
position: relative;
z-index: 3;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
gap: 40px;
/* 280px top on desktop, 102px bottom */
padding: 280px 24px 102px;
}
/* ── Badge / Pill ───────────────────────────────────────────────── */
.hero__badge {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 7px 14px;
border-radius: 20px;
background: rgba(255, 255, 255, 0.10);
border: 1px solid rgba(255, 255, 255, 0.20);
}
/* 4px white dot */
.hero__badge-dot {
display: 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;
white-space: nowrap;
}
.hero__badge-dim {
color: rgba(255, 255, 255, 0.60);
}
.hero__badge-bright {
color: #ffffff;
}
/* ── Heading ────────────────────────────────────────────────────── */
.hero__heading {
max-width: 613px;
font-size: 56px;
font-weight: 500;
line-height: 1.28;
letter-spacing: -0.01em;
/* Gradient fill: 144.5deg, solid white at 28% → transparent at 115% */
background: linear-gradient(
144.5deg,
#ffffff 28%,
rgba(0, 0, 0, 0) 115%
);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
color: transparent;
}
/* ── Subtitle ───────────────────────────────────────────────────── */
.hero__subtitle {
max-width: 680px;
font-size: 15px;
font-weight: 400;
line-height: 1.65;
color: rgba(255, 255, 255, 0.70);
/* Override the 40px gap to get exactly 24px from heading */
margin-top: -16px;
}
/* ── CTA Button Wrapper ─────────────────────────────────────────── */
.hero__cta {
display: flex;
justify-content: center;
}
/* ═══════════════════════════════════════════════════════════════════
RESPONSIVE
md breakpoint = 768px
lg breakpoint = 1024px
xl breakpoint = 1280px
═══════════════════════════════════════════════════════════════════ */
/* ≤ 1280px — reduce navbar horizontal padding */
@media (max-width: 1280px) {
.navbar__inner {
padding: 20px 80px;
}
}
/* ≤ 1024px */
@media (max-width: 1024px) {
.navbar__inner {
padding: 20px 48px;
}
}
/* ≤ 767px — mobile */
@media (max-width: 767px) {
/* Navbar */
.navbar__inner {
padding: 20px 24px;
}
/* Hide nav links on mobile */
.navbar__links {
display: none;
}
/* Hero content — 200px top on mobile */
.hero__content {
padding-top: 200px;
gap: 32px;
}
/* Heading scales down */
.hero__heading {
font-size: 36px;
}
/* Badge wraps gracefully */
.hero__badge-text {
white-space: normal;
}
/* Orbs scale down on mobile */
.orb--violet {
width: 300px;
height: 300px;
}
.orb--cyan {
width: 220px;
height: 220px;
}
.orb--pink {
width: 160px;
height: 160px;
}
}
/* ≤ 480px — small phones */
@media (max-width: 480px) {
.hero__heading {
font-size: 32px;
}
.hero__subtitle {
font-size: 14px;
}
}