blob: 8c293bb84c537727bec8b981619dc91c51ae6bcb [file] [edit]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ page.title | default: site.title }}</title>
<meta name="description" content="{{ site.description }}">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;1,9..40,400&family=DM+Mono:wght@400;500&display=swap" rel="stylesheet">
<link rel="stylesheet" href="{{ site.baseurl }}/assets/css/base.css">
{% if page.page_css %}<link rel="stylesheet" href="{{ site.baseurl }}/assets/css/{{ page.page_css }}.css">{% endif %}
<style>
/* ===== NAV ===== */
#main-nav {
position: fixed;
top: 0; left: 0; right: 0;
z-index: 200;
height: var(--nav-h);
display: flex;
align-items: center;
padding: 0 32px;
transition: background 0.4s ease, border-color 0.4s ease, backdrop-filter 0.4s ease;
border-bottom: 1px solid transparent;
}
#main-nav.scrolled {
background: rgba(7, 9, 15, 0.88);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border-color: var(--border);
}
/* ===== HERO ===== */
.hero {
position: relative;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
padding: calc(var(--nav-h) + 60px) 24px 100px;
overflow: hidden;
}
/* Animated perspective grid */
.hero-grid {
position: absolute;
inset: 0;
background-image:
linear-gradient(rgba(249,115,22,0.06) 1px, transparent 1px),
linear-gradient(90deg, rgba(249,115,22,0.06) 1px, transparent 1px);
background-size: 56px 56px;
mask-image: radial-gradient(ellipse 90% 70% at 50% 50%, black 30%, transparent 80%);
-webkit-mask-image: radial-gradient(ellipse 90% 70% at 50% 50%, black 30%, transparent 80%);
animation: grid-drift 25s linear infinite;
}
@keyframes grid-drift {
from { background-position: 0 0; }
to { background-position: 56px 56px; }
}
/* Ambient glow */
.hero-glow {
position: absolute;
top: 42%;
left: 50%;
transform: translate(-50%, -50%);
width: 700px;
height: 350px;
background: radial-gradient(ellipse, rgba(249,115,22,0.08) 0%, rgba(249,115,22,0.06) 50%, transparent 70%);
pointer-events: none;
animation: glow-pulse 4s ease-in-out infinite alternate;
}
@keyframes glow-pulse {
from { opacity: 0.7; transform: translate(-50%, -50%) scale(1); }
to { opacity: 1; transform: translate(-50%, -50%) scale(1.1); }
}
.hero-inner {
position: relative;
z-index: 1;
max-width: 820px;
}
.hero-logo {
width: min(700px, 92vw);
height: auto;
margin-bottom: 24px;
opacity: 0;
animation: fade-up 0.65s ease forwards 0.15s;
}
.hero-sub {
font-size: 17px;
color: var(--text-muted);
font-weight: 500;
margin-bottom: 52px;
letter-spacing: 0.2px;
opacity: 0;
animation: fade-up 0.55s ease forwards 0.55s;
}
.hero-sub .dot { margin: 0 10px; color: var(--text-dim); }
/* Countdown */
#countdown {
display: flex;
align-items: flex-end;
justify-content: center;
gap: 6px;
margin-bottom: 52px;
opacity: 0;
animation: fade-up 0.55s ease forwards 0.75s;
}
.count-block {
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
min-width: 80px;
}
.count-num {
font-family: "DM Sans", sans-serif;
font-weight: 800;
font-size: clamp(40px, 7vw, 72px);
color: var(--text);
letter-spacing: -3px;
line-height: 1;
display: block;
transition: transform 0.12s cubic-bezier(.34,1.56,.64,1);
will-change: transform;
}
.count-num.tick { transform: scale(1.12); }
.count-label {
font-family: "DM Mono", monospace;
font-size: 10px;
letter-spacing: 2.5px;
text-transform: uppercase;
color: var(--text-dim);
}
.count-sep {
font-family: "DM Sans", sans-serif;
font-weight: 800;
font-size: clamp(36px, 6vw, 60px);
color: var(--accent);
opacity: 0.7;
line-height: 1;
padding-bottom: 22px;
user-select: none;
}
/* CTA buttons */
.hero-ctas {
display: flex;
gap: 14px;
justify-content: center;
flex-wrap: wrap;
opacity: 0;
animation: fade-up 0.55s ease forwards 0.95s;
}
.btn-primary {
background: var(--accent);
color: #fff;
text-decoration: none;
padding: 14px 34px;
border-radius: 8px;
font-weight: 600;
font-size: 15px;
transition: transform 0.15s, box-shadow 0.2s;
box-shadow: 0 2px 0 rgba(0,0,0,0.4);
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 10px 36px var(--accent-glow);
}
.btn-outline {
background: transparent;
color: var(--text);
text-decoration: none;
padding: 14px 34px;
border-radius: 8px;
font-weight: 600;
font-size: 15px;
border: 1px solid var(--border);
transition: border-color 0.2s, background 0.2s, color 0.2s;
}
.btn-outline:hover {
border-color: rgba(249,115,22,0.4);
background: var(--accent-dim);
color: var(--text);
}
/* Scroll hint */
.hero-scroll-hint {
position: absolute;
bottom: 36px;
left: 50%;
transform: translateX(-50%);
z-index: 1;
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
color: var(--text-dim);
font-family: "DM Mono", monospace;
font-size: 10px;
letter-spacing: 2px;
text-transform: uppercase;
opacity: 0;
animation: fade-up 0.5s ease forwards 1.4s;
}
.scroll-line {
width: 1px;
height: 40px;
background: linear-gradient(to bottom, rgba(249,115,22,0.6), transparent);
animation: scroll-line 2s ease-in-out infinite 2s;
}
@keyframes scroll-line {
0% { transform: scaleY(1) translateY(0); opacity: 1; }
100% { transform: scaleY(0.3) translateY(10px); opacity: 0; }
}
@keyframes fade-up {
from { opacity: 0; transform: translateY(22px); }
to { opacity: 1; transform: translateY(0); }
}
/* ===== HOME CONTENT ===== */
.home-main {
max-width: 900px;
margin: 0 auto;
padding: 80px 32px 120px;
}
/* hide the redundant H1 from markdown (shown in hero already) */
.home-main > h1:first-child { display: none; }
.home-main h2 {
font-family: "DM Sans", sans-serif;
font-weight: 800;
font-size: 26px;
color: var(--text);
margin: 72px 0 18px;
letter-spacing: -0.5px;
display: flex;
align-items: center;
gap: 14px;
}
.home-main h2::before {
content: '';
display: block;
width: 4px;
height: 24px;
background: var(--accent);
border-radius: 2px;
flex-shrink: 0;
}
.home-main p {
color: var(--text-muted);
margin: 0 0 16px;
line-height: 1.8;
}
.home-main strong { color: var(--text); font-weight: 600; }
.home-main a { color: var(--accent); text-decoration: none; }
.home-main a:hover { text-decoration: underline; }
.home-main ul, .home-main ol {
margin: 0 0 16px 0;
padding: 0;
list-style: none;
}
.home-main li {
color: var(--text-muted);
padding: 4px 0 4px 22px;
position: relative;
}
.home-main li::before {
content: '→';
position: absolute;
left: 0;
color: var(--accent);
font-size: 13px;
font-family: "DM Mono", monospace;
}
/* Scroll reveal */
.reveal-wrap {
opacity: 0;
transform: translateY(28px);
transition: opacity 0.65s ease, transform 0.65s ease;
}
.reveal-wrap.visible {
opacity: 1;
transform: none;
}
/* ===== RESPONSIVE ===== */
@media (max-width: 680px) {
.hero { padding-top: 120px; padding-bottom: 80px; }
.count-block { min-width: 60px; }
.home-main { padding: 48px 20px 80px; }
footer { gap: 10px; }
}
</style>
</head>
<body>
{% include nav.html %}
<section class="hero">
<div class="hero-grid"></div>
<div class="hero-glow"></div>
<div class="hero-inner">
<h1><img src="{{ site.baseurl }}/assets/img/gus-logo.png" alt="Gerrit User Summit 2026" class="hero-logo"></h1>
<p class="hero-sub">
November 9–10<span class="dot">·</span>Google Sunnyvale, CA
</p>
<div id="countdown">
<div class="count-block">
<span class="count-num" id="cd-days">--</span>
<span class="count-label">days</span>
</div>
<div class="count-sep">:</div>
<div class="count-block">
<span class="count-num" id="cd-hours">--</span>
<span class="count-label">hours</span>
</div>
<div class="count-sep">:</div>
<div class="count-block">
<span class="count-num" id="cd-mins">--</span>
<span class="count-label">mins</span>
</div>
<div class="count-sep">:</div>
<div class="count-block">
<span class="count-num" id="cd-secs">--</span>
<span class="count-label">secs</span>
</div>
</div>
<div class="hero-ctas">
<a href="{{ site.luma_url }}" target="_blank" rel="noopener" class="btn-primary">Register — it&rsquo;s free</a>
<a href="{{ site.sessionize_url }}" target="_blank" rel="noopener" class="btn-outline">Call for Papers</a>
</div>
</div>
<div class="hero-scroll-hint">
scroll
<div class="scroll-line"></div>
</div>
</section>
<main class="home-main">
{{ content }}
</main>
<footer>
<div class="footer-brand">Gerrit User Summit <span>2026</span></div>
<div class="footer-links">
<a href="https://www.gerritcodereview.com">gerritcodereview.com</a>
<a href="https://policies.google.com/privacy" target="_blank" rel="noopener">Privacy</a>
<a href="https://policies.google.com/terms" target="_blank" rel="noopener">Terms</a>
</div>
</footer>
<script>
// ── Nav scroll glass effect ──────────────────────────────
const nav = document.getElementById('main-nav');
window.addEventListener('scroll', () => {
nav.classList.toggle('scrolled', window.scrollY > 40);
}, { passive: true });
// ── Mobile hamburger ─────────────────────────────────────
const hamburger = document.getElementById('nav-hamburger');
const mobileMenu = document.getElementById('nav-mobile-menu');
if (hamburger) {
hamburger.addEventListener('click', () => {
mobileMenu.classList.toggle('open');
});
}
// ── Countdown timer ──────────────────────────────────────
function pad(n) { return String(n).padStart(2, '0'); }
function updateCountdown() {
const target = new Date('2026-11-09T09:00:00-08:00').getTime();
const diff = target - Date.now();
if (diff <= 0) {
document.getElementById('countdown').innerHTML =
'<p style="font-family:DM Sans,sans-serif;font-size:28px;color:var(--accent);letter-spacing:-1px">Happening now!</p>';
return;
}
const vals = {
'cd-days': pad(Math.floor(diff / 86400000)),
'cd-hours': pad(Math.floor((diff % 86400000) / 3600000)),
'cd-mins': pad(Math.floor((diff % 3600000) / 60000)),
'cd-secs': pad(Math.floor((diff % 60000) / 1000))
};
for (const [id, val] of Object.entries(vals)) {
const el = document.getElementById(id);
if (!el) continue;
if (el.textContent !== val) {
el.textContent = val;
el.classList.remove('tick');
void el.offsetWidth; // reflow
el.classList.add('tick');
setTimeout(() => el.classList.remove('tick'), 150);
}
}
}
updateCountdown();
setInterval(updateCountdown, 1000);
// ── Scroll reveal ────────────────────────────────────────
const revealObserver = new IntersectionObserver((entries) => {
entries.forEach(e => {
if (e.isIntersecting) {
e.target.classList.add('visible');
revealObserver.unobserve(e.target);
}
});
}, { threshold: 0.06, rootMargin: '0px 0px -40px 0px' });
// Wrap each h2 + its following siblings (until next h2) into a reveal block
const homeMain = document.querySelector('.home-main');
if (homeMain) {
const children = Array.from(homeMain.childNodes);
let wrap = null;
children.forEach(node => {
if (node.nodeType === 1 && node.tagName === 'H2') {
wrap = document.createElement('div');
wrap.className = 'reveal-wrap';
node.parentNode.insertBefore(wrap, node);
}
if (wrap) wrap.appendChild(node);
});
document.querySelectorAll('.reveal-wrap').forEach(el => revealObserver.observe(el));
}
</script>
</body>
</html>