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

490 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 Styles
Font: General Sans (Fontshare)
Last updated: 2026-02-20
═══════════════════════════════════════════════════════════════ */
/* ── Reset & Base ──────────────────────────────────────────── */
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html, body {
width: 100%;
height: 100%;
background: #000;
color: #fff;
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: #000;
display: flex;
flex-direction: column;
overflow: hidden;
}
/* ── Background Video ──────────────────────────────────────── */
.hero__video-wrap {
position: absolute;
inset: 0;
z-index: 0;
}
.hero__video {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
/* 50% black overlay */
.hero__overlay {
position: absolute;
inset: 0;
background: rgba(0, 0, 0, 0.50);
}
/* ── 3D Layer ─────────────────────────────────────────────────
Sits above video (z:1), below UI content (z:10+).
pointer-events: none by default so clicks pass through to UI.
Call enableSplinePointerEvents() from main.js when your
Spline scene needs mouse/touch input.
──────────────────────────────────────────────────────────────── */
.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 ───────────────────────────────────────────
Animated orbs simulate depth until real Spline assets arrive.
Remove .hero__3d-placeholder entirely when adding spline-viewer.
──────────────────────────────────────────────────────────────── */
.hero__3d-placeholder {
position: relative;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.placeholder-label {
position: absolute;
bottom: 36px;
left: 50%;
transform: translateX(-50%);
font-size: 11px;
font-weight: 500;
letter-spacing: 0.09em;
text-transform: uppercase;
color: rgba(255, 255, 255, 0.22);
white-space: nowrap;
border: 1px solid rgba(255, 255, 255, 0.08);
padding: 6px 16px;
border-radius: 100px;
backdrop-filter: blur(4px);
pointer-events: none;
}
/* Floating orbs */
.placeholder-orb {
position: absolute;
border-radius: 50%;
filter: blur(72px);
opacity: 0.16;
animation: orbFloat 9s ease-in-out infinite;
}
.placeholder-orb--1 {
width: 480px;
height: 480px;
background: radial-gradient(circle, #7c3aed 0%, #4f46e5 60%, transparent 100%);
top: 12%;
right: 8%;
animation-duration: 10s;
animation-delay: 0s;
}
.placeholder-orb--2 {
width: 320px;
height: 320px;
background: radial-gradient(circle, #06b6d4 0%, #3b82f6 60%, transparent 100%);
bottom: 18%;
left: 6%;
animation-duration: 12s;
animation-delay: -4s;
}
.placeholder-orb--3 {
width: 240px;
height: 240px;
background: radial-gradient(circle, #f0abfc 0%, #818cf8 60%, transparent 100%);
top: 48%;
left: 50%;
transform: translate(-50%, -50%);
animation-duration: 8s;
animation-delay: -7s;
}
@keyframes orbFloat {
0%, 100% { transform: translateY(0px) scale(1); }
33% { transform: translateY(-28px) scale(1.05); }
66% { transform: translateY(18px) scale(0.96); }
}
/* Fix: orb-3 uses its own transform baseline */
.placeholder-orb--3 {
animation-name: orbFloat3;
}
@keyframes orbFloat3 {
0%, 100% { transform: translate(-50%, -50%) translateY(0px) scale(1); }
33% { transform: translate(-50%, -50%) translateY(-28px) scale(1.05); }
66% { transform: translate(-50%, -50%) translateY(18px) scale(0.96); }
}
/* ═══════════════════════════════════════════════════════════════
NAVBAR
═══════════════════════════════════════════════════════════════ */
.navbar {
position: relative;
z-index: 10;
width: 100%;
padding: 20px 120px;
transition: background 0.3s ease, backdrop-filter 0.3s ease;
}
.navbar__inner {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
/* Left side: logo + links */
.navbar__left {
display: flex;
align-items: center;
gap: 48px;
}
/* Logo */
.navbar__logo {
display: flex;
align-items: center;
flex-shrink: 0;
}
.navbar__logo-svg {
width: 187px;
height: 25px;
display: block;
}
/* Nav Links */
.navbar__links {
display: flex;
align-items: center;
gap: 30px;
}
.navbar__link {
display: inline-flex;
align-items: center;
gap: 6px;
font-size: 14px;
font-weight: 500;
color: #fff;
white-space: nowrap;
transition: opacity 0.2s ease;
}
.navbar__link:hover {
opacity: 0.75;
}
.navbar__chevron {
flex-shrink: 0;
display: block;
}
/* ═══════════════════════════════════════════════════════════════
PILL BUTTON — shared base
Two variants:
.btn-pill--dark → black bg, white text (navbar)
.btn-pill--light → white bg, black text (CTA)
═══════════════════════════════════════════════════════════════ */
.btn-pill {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 9999px;
/* Outer border: 0.6px solid white */
border: 0.6px solid rgba(255, 255, 255, 1);
padding: 2px; /* space between outer border and inner pill */
cursor: pointer;
background: transparent;
font-family: 'General Sans', system-ui, sans-serif;
overflow: hidden;
transition: opacity 0.2s ease, transform 0.15s ease;
}
.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: 0;
left: 50%;
transform: translateX(-50%);
width: 70%;
height: 10px;
border-radius: 50%;
background: radial-gradient(ellipse at center top, rgba(255,255,255,0.55) 0%, transparent 80%);
filter: blur(5px);
pointer-events: none;
z-index: 2;
}
/* Inner pill */
.btn-pill__inner {
position: relative;
z-index: 1;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 9999px;
padding: 11px 29px;
font-size: 14px;
font-weight: 500;
line-height: 1;
white-space: nowrap;
width: 100%;
}
/* ── Dark variant (navbar) ── */
.btn-pill--dark .btn-pill__inner {
background: #000;
color: #fff;
}
/* ── Light variant (hero CTA) ── */
.btn-pill--light {
border-color: rgba(255, 255, 255, 0.85);
}
.btn-pill--light .btn-pill__inner {
background: #fff;
color: #000;
}
.btn-pill--light .btn-pill__glow {
background: radial-gradient(ellipse at center top, rgba(255,255,255,0.7) 0%, transparent 80%);
}
/* ═══════════════════════════════════════════════════════════════
HERO CONTENT
═══════════════════════════════════════════════════════════════ */
.hero__content {
position: relative;
z-index: 10;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
gap: 40px;
padding-top: 280px;
padding-bottom: 102px;
padding-left: 24px;
padding-right: 24px;
}
/* ── Badge / Pill ──────────────────────────────────────────── */
.hero__badge {
display: inline-flex;
align-items: center;
gap: 8px;
background: rgba(255, 255, 255, 0.10);
border: 1px solid rgba(255, 255, 255, 0.20);
border-radius: 20px;
padding: 7px 14px;
font-size: 13px;
font-weight: 500;
line-height: 1;
}
.hero__badge-dot {
display: inline-block;
width: 4px;
height: 4px;
border-radius: 50%;
background: #fff;
flex-shrink: 0;
}
.hero__badge-muted {
color: rgba(255, 255, 255, 0.60);
}
.hero__badge-date {
color: #fff;
}
/* ── Heading ───────────────────────────────────────────────── */
.hero__heading {
max-width: 613px;
font-size: 56px;
font-weight: 500;
line-height: 1.28;
letter-spacing: -0.01em;
/*
Gradient text effect:
144.5deg — solid white at 28% → transparent black at 115%
Applied via background-clip: text
*/
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;
}
/* Force line break on desktop for visual balance */
.hero__heading-br {
display: block;
}
/* ── Subtitle ──────────────────────────────────────────────── */
.hero__subtitle {
max-width: 680px;
font-size: 15px;
font-weight: 400;
line-height: 1.65;
color: rgba(255, 255, 255, 0.70);
margin-top: -16px; /* tighten the 40px gap to ~24px from heading */
}
/* ═══════════════════════════════════════════════════════════════
RESPONSIVE — Mobile / Tablet
═══════════════════════════════════════════════════════════════ */
/* Tablet: 768px1199px */
@media (max-width: 1199px) {
.navbar {
padding: 20px 48px;
}
}
/* Mobile: <768px */
@media (max-width: 767px) {
/* Navbar */
.navbar {
padding: 20px 24px;
}
/* Hide nav links on mobile */
.navbar__links {
display: none;
}
/* Collapse logo gap */
.navbar__left {
gap: 0;
}
/* Hero content */
.hero__content {
padding-top: 200px;
padding-bottom: 80px;
gap: 32px;
}
/* Heading scales down */
.hero__heading {
font-size: 36px;
max-width: 100%;
}
/* Hide the manual line break on mobile — let text reflow naturally */
.hero__heading-br {
display: none;
}
/* Subtitle */
.hero__subtitle {
font-size: 14px;
margin-top: -8px;
}
/* Badge */
.hero__badge {
font-size: 12px;
}
}
/* Very small screens */
@media (max-width: 400px) {
.navbar {
padding: 18px 16px;
}
.hero__content {
padding-top: 160px;
gap: 28px;
}
.hero__heading {
font-size: 30px;
}
}