1193 lines
42 KiB
HTML
1193 lines
42 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<title>Long Table — Slide Template</title>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<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=Bricolage+Grotesque:opsz,wght@12..96,400;12..96,600;12..96,700;12..96,800&family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,500;0,9..144,600;1,9..144,400;1,9..144,500;1,9..144,600&display=swap" rel="stylesheet" />
|
|
<style>
|
|
:root {
|
|
--paper: #FAF1E2; /* warm buttery cream paper */
|
|
--paper-d: #F2E5CF; /* slightly darker cream */
|
|
--paper-vd: #E8D7B6; /* deeper cream for accents */
|
|
--ink: #B53D2A; /* warm rust / terracotta red — the only ink colour */
|
|
--ink-dp: #8E2D1F; /* deeper red for emphasis */
|
|
--rule: #B53D2A;
|
|
}
|
|
* { box-sizing: border-box; }
|
|
html, body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; }
|
|
body {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
color: var(--ink);
|
|
overflow: hidden;
|
|
}
|
|
|
|
/* Deck wrapper */
|
|
.deck { position: fixed; inset: 0; display: grid; place-items: center; }
|
|
.stage {
|
|
position: relative;
|
|
width: 100vw; height: 100vh;
|
|
overflow: hidden;
|
|
background: var(--paper);
|
|
}
|
|
|
|
/* Subtle paper texture */
|
|
.stage::before {
|
|
content: '';
|
|
position: absolute; inset: 0;
|
|
pointer-events: none;
|
|
opacity: 0.10;
|
|
background-image: radial-gradient(circle at 1px 1px, rgba(181,61,42,0.5) 0.5px, transparent 1px);
|
|
background-size: 4px 4px;
|
|
z-index: 1;
|
|
}
|
|
|
|
.slide {
|
|
position: absolute; inset: 0;
|
|
opacity: 0; pointer-events: none;
|
|
transition: opacity 280ms ease;
|
|
z-index: 2;
|
|
}
|
|
.slide.active { opacity: 1; pointer-events: auto; }
|
|
|
|
/* ─── TYPE SYSTEM ──────────────────────────────────────────── */
|
|
.disp {
|
|
font-family: 'Bricolage Grotesque', sans-serif;
|
|
font-weight: 800;
|
|
line-height: 0.92;
|
|
letter-spacing: -0.01em;
|
|
text-transform: uppercase;
|
|
color: var(--ink);
|
|
}
|
|
.body-it {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-weight: 400;
|
|
line-height: 1.45;
|
|
color: var(--ink);
|
|
}
|
|
.body-ro {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
line-height: 1.5;
|
|
color: var(--ink);
|
|
}
|
|
|
|
/* Page-number marker — italic Fraunces */
|
|
.pagenum {
|
|
position: absolute;
|
|
right: clamp(36px, 3.6vw, 80px);
|
|
bottom: clamp(40px, 4vh, 64px);
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(14px, 0.95vw, 16px);
|
|
color: var(--ink);
|
|
letter-spacing: 0.02em;
|
|
z-index: 9;
|
|
}
|
|
.nav-hint {
|
|
position: fixed;
|
|
left: clamp(36px, 3.6vw, 80px);
|
|
bottom: clamp(40px, 4vh, 64px);
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(11px, 0.78vw, 13px);
|
|
color: var(--ink);
|
|
letter-spacing: 0.02em;
|
|
opacity: 0.45;
|
|
z-index: 12;
|
|
pointer-events: none;
|
|
}
|
|
|
|
/* ─── REUSABLE: pill button (outlined rounded rectangle) ────── */
|
|
.pill {
|
|
display: inline-flex;
|
|
align-items: center; justify-content: center;
|
|
padding: clamp(8px, 1vh, 14px) clamp(20px, 2vw, 32px);
|
|
border: 1.5px solid var(--ink);
|
|
border-radius: 999px;
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(15px, 1.1vw, 20px);
|
|
color: var(--ink);
|
|
line-height: 1;
|
|
white-space: nowrap;
|
|
}
|
|
.pill-divider {
|
|
color: var(--ink);
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(18px, 1.4vw, 24px);
|
|
line-height: 1;
|
|
align-self: center;
|
|
opacity: 0.7;
|
|
}
|
|
|
|
/* ─── REUSABLE: numbered edition badge (circle outline) ─────── */
|
|
.ed-badge {
|
|
display: inline-flex;
|
|
align-items: center; justify-content: center;
|
|
width: clamp(34px, 2.6vw, 44px);
|
|
height: clamp(34px, 2.6vw, 44px);
|
|
border: 1.5px solid var(--ink);
|
|
border-radius: 50%;
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(15px, 1.05vw, 18px);
|
|
color: var(--ink);
|
|
line-height: 1;
|
|
}
|
|
|
|
/* ─── REUSABLE: outlined rectangle tag ──────────────────────── */
|
|
.rect-tag {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
padding: clamp(7px, 0.9vh, 12px) clamp(14px, 1.4vw, 22px);
|
|
border: 1.5px solid var(--ink);
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(15px, 1.1vw, 20px);
|
|
color: var(--ink);
|
|
line-height: 1.1;
|
|
}
|
|
|
|
/* ──────────────────────────────────────────────────────────────
|
|
SLIDE 1 — COVER (echo of supper-club poster, left text + right illustration)
|
|
────────────────────────────────────────────────────────────── */
|
|
.s-cover { background: var(--paper); }
|
|
|
|
.s-cover .grid {
|
|
position: absolute;
|
|
inset: clamp(60px, 6vh, 100px) clamp(60px, 5vw, 110px) clamp(110px, 11vh, 170px);
|
|
display: grid;
|
|
grid-template-columns: 1.05fr 1fr;
|
|
gap: clamp(40px, 4vw, 80px);
|
|
z-index: 5;
|
|
}
|
|
.s-cover .left {
|
|
display: flex; flex-direction: column;
|
|
gap: clamp(18px, 2vh, 30px);
|
|
}
|
|
.s-cover .ed-row {
|
|
display: flex; align-items: center; gap: clamp(12px, 1.2vw, 18px);
|
|
}
|
|
.s-cover .ed-row .ed-label {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(20px, 1.6vw, 30px);
|
|
color: var(--ink);
|
|
line-height: 1;
|
|
}
|
|
.s-cover .title {
|
|
font-family: 'Bricolage Grotesque', sans-serif;
|
|
font-weight: 800;
|
|
text-transform: uppercase;
|
|
font-size: clamp(82px, min(8.8vw, 15vh), 180px);
|
|
line-height: 0.92;
|
|
letter-spacing: -0.012em;
|
|
color: var(--ink);
|
|
}
|
|
.s-cover .actions {
|
|
display: flex; gap: clamp(8px, 0.8vw, 14px); align-items: center;
|
|
flex-wrap: wrap;
|
|
}
|
|
.s-cover .stats {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(17px, 1.2vw, 22px);
|
|
line-height: 1.4;
|
|
color: var(--ink);
|
|
}
|
|
.s-cover .stats .num {
|
|
font-style: normal;
|
|
font-weight: 600;
|
|
}
|
|
.s-cover .left .bottom-block {
|
|
margin-top: auto;
|
|
display: flex; flex-direction: column;
|
|
gap: clamp(12px, 1.4vh, 22px);
|
|
align-items: flex-start;
|
|
}
|
|
.s-cover .tagline {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(18px, 1.4vw, 26px);
|
|
line-height: 1.35;
|
|
color: var(--ink);
|
|
max-width: 40ch;
|
|
}
|
|
|
|
/* Right side of cover — big italic edition numeral as a typographic anchor,
|
|
replacing the hand-drawn illustration. */
|
|
.s-cover .right {
|
|
display: flex; flex-direction: column;
|
|
justify-content: center; align-items: flex-end;
|
|
color: var(--ink);
|
|
text-align: right;
|
|
}
|
|
.s-cover .big-edition {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-weight: 400;
|
|
font-size: clamp(180px, min(22vw, 38vh), 480px);
|
|
line-height: 0.86;
|
|
letter-spacing: -0.02em;
|
|
color: var(--ink);
|
|
}
|
|
.s-cover .big-edition-lab {
|
|
margin-top: clamp(8px, 1vh, 16px);
|
|
font-family: 'Bricolage Grotesque', sans-serif;
|
|
font-weight: 700;
|
|
text-transform: uppercase;
|
|
font-size: clamp(15px, 1.1vw, 18px);
|
|
letter-spacing: 0.18em;
|
|
color: var(--ink);
|
|
}
|
|
.s-cover .big-edition-meta {
|
|
margin-top: clamp(20px, 2.4vh, 36px);
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(17px, 1.2vw, 22px);
|
|
line-height: 1.4;
|
|
color: var(--ink);
|
|
max-width: 30ch;
|
|
text-align: right;
|
|
}
|
|
|
|
/* ──────────────────────────────────────────────────────────────
|
|
SLIDE 2 — MANIFESTO / LETTER FROM THE TABLE
|
|
────────────────────────────────────────────────────────────── */
|
|
.s-manifesto { background: var(--paper); }
|
|
.s-manifesto .frame {
|
|
position: absolute;
|
|
inset: clamp(96px, 10vh, 160px) clamp(80px, 8vw, 200px) clamp(110px, 11vh, 170px);
|
|
display: grid;
|
|
grid-template-columns: 0.85fr 1fr;
|
|
gap: clamp(50px, 5vw, 100px);
|
|
align-items: center;
|
|
z-index: 5;
|
|
}
|
|
.s-manifesto .left .ed-row {
|
|
display: flex; align-items: center; gap: 14px;
|
|
margin-bottom: clamp(20px, 2.4vh, 36px);
|
|
}
|
|
.s-manifesto .left .ed-row .ed-label {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(18px, 1.4vw, 24px);
|
|
color: var(--ink);
|
|
}
|
|
.s-manifesto .left .h {
|
|
font-family: 'Bricolage Grotesque', sans-serif;
|
|
font-weight: 800;
|
|
text-transform: uppercase;
|
|
font-size: clamp(72px, min(7.6vw, 13vh), 160px);
|
|
line-height: 0.9;
|
|
letter-spacing: -0.012em;
|
|
color: var(--ink);
|
|
}
|
|
.s-manifesto .right p {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(20px, 1.5vw, 28px);
|
|
line-height: 1.45;
|
|
color: var(--ink);
|
|
margin: 0 0 clamp(16px, 1.6vh, 24px);
|
|
}
|
|
.s-manifesto .right p .empha {
|
|
font-style: normal;
|
|
font-weight: 600;
|
|
}
|
|
.s-manifesto .right .sig {
|
|
margin-top: clamp(18px, 2vh, 30px);
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(16px, 1.2vw, 20px);
|
|
color: var(--ink);
|
|
display: flex; flex-direction: column; gap: 4px;
|
|
}
|
|
.s-manifesto .right .sig .who-tag {
|
|
font-style: normal;
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* ──────────────────────────────────────────────────────────────
|
|
SLIDE 3 — INDEX OF EDITIONS
|
|
────────────────────────────────────────────────────────────── */
|
|
.s-index { background: var(--paper); }
|
|
.s-index .frame {
|
|
position: absolute;
|
|
inset: clamp(96px, 10vh, 160px) clamp(60px, 5vw, 110px) clamp(110px, 11vh, 170px);
|
|
display: grid;
|
|
grid-template-rows: auto 1fr;
|
|
gap: clamp(28px, 3vh, 50px);
|
|
z-index: 5;
|
|
}
|
|
.s-index .topbar {
|
|
display: flex; align-items: end; justify-content: space-between;
|
|
border-bottom: 1.5px solid var(--ink);
|
|
padding-bottom: clamp(14px, 1.6vh, 24px);
|
|
gap: 30px;
|
|
}
|
|
.s-index .topbar .h {
|
|
font-family: 'Bricolage Grotesque', sans-serif;
|
|
font-weight: 800;
|
|
text-transform: uppercase;
|
|
font-size: clamp(56px, min(6vw, 10vh), 120px);
|
|
line-height: 0.9;
|
|
letter-spacing: -0.012em;
|
|
color: var(--ink);
|
|
}
|
|
.s-index .topbar .lab-tag {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(15px, 1.05vw, 18px);
|
|
color: var(--ink);
|
|
text-align: right;
|
|
line-height: 1.4;
|
|
}
|
|
.s-index .grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(3, 1fr);
|
|
grid-template-rows: auto;
|
|
gap: clamp(20px, 2.4vw, 36px);
|
|
align-self: center;
|
|
align-items: start;
|
|
}
|
|
.s-index .card {
|
|
border: 1.5px solid var(--ink);
|
|
padding: clamp(20px, 2vh, 32px) clamp(20px, 1.8vw, 30px);
|
|
display: flex; flex-direction: column; gap: clamp(10px, 1.2vh, 18px);
|
|
}
|
|
.s-index .card .card-top {
|
|
display: flex; align-items: center; gap: clamp(10px, 1vw, 16px);
|
|
border-bottom: 1px solid rgba(181, 61, 42, 0.32);
|
|
padding-bottom: clamp(10px, 1.2vh, 16px);
|
|
}
|
|
.s-index .card .card-top .num-tag {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(15px, 1.05vw, 18px);
|
|
color: var(--ink);
|
|
}
|
|
.s-index .card .card-top .city-tag {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(15px, 1.05vw, 18px);
|
|
color: var(--ink);
|
|
margin-left: auto;
|
|
}
|
|
.s-index .card .nm {
|
|
font-family: 'Bricolage Grotesque', sans-serif;
|
|
font-weight: 800;
|
|
text-transform: uppercase;
|
|
font-size: clamp(28px, 2.4vw, 44px);
|
|
line-height: 0.95;
|
|
color: var(--ink);
|
|
letter-spacing: -0.008em;
|
|
}
|
|
.s-index .card .desc {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(15px, 1vw, 17px);
|
|
line-height: 1.45;
|
|
color: var(--ink);
|
|
flex: 1;
|
|
}
|
|
.s-index .card .meta-row {
|
|
display: flex; align-items: center; gap: clamp(10px, 1vw, 16px);
|
|
margin-top: auto;
|
|
border-top: 1px dashed rgba(181, 61, 42, 0.32);
|
|
padding-top: clamp(10px, 1.2vh, 16px);
|
|
}
|
|
.s-index .card .meta-row .seats-tag,
|
|
.s-index .card .meta-row .date-tag {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(14px, 0.95vw, 16px);
|
|
color: var(--ink);
|
|
}
|
|
.s-index .card .meta-row .seats-tag { margin-right: auto; }
|
|
|
|
/* ──────────────────────────────────────────────────────────────
|
|
SLIDE 4 — FEATURED EDITION
|
|
────────────────────────────────────────────────────────────── */
|
|
.s-featured { background: var(--paper); }
|
|
.s-featured .frame {
|
|
/* Bottom inset enlarged so content can never run into the page-num /
|
|
nav-hint chrome at the bottom of the slide. */
|
|
position: absolute;
|
|
inset: clamp(96px, 10vh, 160px) clamp(80px, 7vw, 160px) clamp(150px, 14vh, 220px);
|
|
display: grid;
|
|
grid-template-columns: 1.1fr 1fr;
|
|
gap: clamp(40px, 4vw, 80px);
|
|
align-items: center;
|
|
z-index: 5;
|
|
}
|
|
.s-featured .left { display: flex; flex-direction: column; gap: clamp(18px, 2vh, 32px); }
|
|
.s-featured .left .ed-row {
|
|
display: flex; align-items: center; gap: 14px;
|
|
}
|
|
.s-featured .left .ed-row .ed-label {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(18px, 1.3vw, 22px);
|
|
color: var(--ink);
|
|
}
|
|
.s-featured .left .ttl {
|
|
font-family: 'Bricolage Grotesque', sans-serif;
|
|
font-weight: 800;
|
|
text-transform: uppercase;
|
|
font-size: clamp(60px, min(6.4vw, 10.5vh), 140px);
|
|
line-height: 0.9;
|
|
letter-spacing: -0.012em;
|
|
color: var(--ink);
|
|
}
|
|
.s-featured .left .lede {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(17px, 1.2vw, 22px);
|
|
line-height: 1.5;
|
|
color: var(--ink);
|
|
max-width: 44ch;
|
|
}
|
|
.s-featured .left .stats-line {
|
|
display: flex; gap: clamp(20px, 2vw, 36px); align-items: center;
|
|
flex-wrap: wrap;
|
|
}
|
|
/* Right side of featured edition — text info card replacing the illustration. */
|
|
.s-featured .right {
|
|
display: flex; flex-direction: column;
|
|
justify-content: center;
|
|
color: var(--ink);
|
|
border: 1.5px solid var(--ink);
|
|
padding: clamp(28px, 3vw, 56px) clamp(28px, 2.4vw, 48px);
|
|
gap: clamp(16px, 2vh, 28px);
|
|
}
|
|
.s-featured .right .info-row {
|
|
display: grid;
|
|
grid-template-columns: auto 1fr;
|
|
gap: clamp(20px, 2vw, 36px);
|
|
align-items: baseline;
|
|
border-bottom: 1px dashed rgba(181, 61, 42, 0.32);
|
|
padding-bottom: clamp(12px, 1.4vh, 20px);
|
|
}
|
|
.s-featured .right .info-row:last-child { border-bottom: none; padding-bottom: 0; }
|
|
.s-featured .right .info-row .k {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(14px, 0.95vw, 16px);
|
|
color: var(--ink);
|
|
letter-spacing: 0.02em;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.16em;
|
|
}
|
|
.s-featured .right .info-row .v {
|
|
font-family: 'Bricolage Grotesque', sans-serif;
|
|
font-weight: 700;
|
|
text-transform: uppercase;
|
|
font-size: clamp(20px, 1.6vw, 28px);
|
|
line-height: 1.1;
|
|
color: var(--ink);
|
|
letter-spacing: -0.005em;
|
|
text-align: right;
|
|
}
|
|
.s-featured .right .info-row .v.it {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-weight: 400;
|
|
text-transform: none;
|
|
letter-spacing: 0;
|
|
font-size: clamp(20px, 1.5vw, 26px);
|
|
}
|
|
|
|
/* ──────────────────────────────────────────────────────────────
|
|
SLIDE 5 — MENU / PROGRAMME
|
|
────────────────────────────────────────────────────────────── */
|
|
.s-menu { background: var(--paper); }
|
|
.s-menu .frame {
|
|
/* Stack content from the top with natural spacing — no flex-stretch on
|
|
course rows, so the menu sits up against the title instead of the
|
|
rows being pushed apart by space-between distribution. */
|
|
position: absolute;
|
|
inset: clamp(40px, 4vh, 70px) clamp(120px, 12vw, 280px) clamp(110px, 11vh, 170px);
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: clamp(14px, 1.6vh, 24px);
|
|
z-index: 5;
|
|
}
|
|
.s-menu .top-row {
|
|
text-align: center;
|
|
display: flex; flex-direction: column; align-items: center;
|
|
gap: clamp(8px, 1vh, 14px);
|
|
}
|
|
.s-menu .top-row .kicker {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(16px, 1.2vw, 20px);
|
|
color: var(--ink);
|
|
}
|
|
.s-menu .top-row .h {
|
|
font-family: 'Bricolage Grotesque', sans-serif;
|
|
font-weight: 800;
|
|
text-transform: uppercase;
|
|
font-size: clamp(48px, min(5vw, 8.4vh), 100px);
|
|
line-height: 0.92;
|
|
letter-spacing: -0.012em;
|
|
color: var(--ink);
|
|
}
|
|
.s-menu .courses {
|
|
display: flex; flex-direction: column;
|
|
gap: 0;
|
|
}
|
|
.s-menu .course {
|
|
display: grid;
|
|
grid-template-columns: 64px 1fr auto;
|
|
gap: clamp(14px, 1.4vw, 28px);
|
|
align-items: center;
|
|
padding: clamp(14px, 1.6vh, 24px) 0;
|
|
border-bottom: 1px solid rgba(181, 61, 42, 0.32);
|
|
}
|
|
.s-menu .course .num-tag {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(16px, 1.1vw, 20px);
|
|
color: var(--ink);
|
|
line-height: 1;
|
|
}
|
|
.s-menu .course .item {
|
|
display: flex; flex-direction: column; gap: 4px;
|
|
}
|
|
.s-menu .course .item .nm {
|
|
font-family: 'Bricolage Grotesque', sans-serif;
|
|
font-weight: 700;
|
|
text-transform: uppercase;
|
|
font-size: clamp(20px, 1.5vw, 28px);
|
|
line-height: 1.05;
|
|
letter-spacing: -0.005em;
|
|
color: var(--ink);
|
|
}
|
|
.s-menu .course .item .desc {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(15px, 1vw, 17px);
|
|
line-height: 1.4;
|
|
color: var(--ink);
|
|
max-width: 60ch;
|
|
}
|
|
.s-menu .course .pair-tag {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(14px, 0.95vw, 16px);
|
|
color: var(--ink);
|
|
text-align: right;
|
|
white-space: nowrap;
|
|
opacity: 0.78;
|
|
}
|
|
|
|
/* ──────────────────────────────────────────────────────────────
|
|
SLIDE 6 — QUOTE / TESTIMONIAL
|
|
────────────────────────────────────────────────────────────── */
|
|
.s-quote { background: var(--paper); }
|
|
.s-quote .frame {
|
|
/* Single centred quote — no illustration. */
|
|
position: absolute;
|
|
inset: clamp(96px, 10vh, 160px) clamp(120px, 12vw, 280px) clamp(150px, 14vh, 220px);
|
|
display: flex; flex-direction: column;
|
|
justify-content: center;
|
|
align-items: center;
|
|
text-align: center;
|
|
z-index: 5;
|
|
}
|
|
.s-quote .right {
|
|
display: flex; flex-direction: column;
|
|
gap: clamp(18px, 2vh, 32px);
|
|
align-items: center;
|
|
width: 100%;
|
|
}
|
|
.s-quote .right .kicker {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(16px, 1.2vw, 20px);
|
|
color: var(--ink);
|
|
}
|
|
.s-quote .right .qbody {
|
|
font-family: 'Bricolage Grotesque', sans-serif;
|
|
font-weight: 700;
|
|
text-transform: uppercase;
|
|
font-size: clamp(40px, min(4.4vw, 7.4vh), 96px);
|
|
line-height: 0.95;
|
|
letter-spacing: -0.012em;
|
|
color: var(--ink);
|
|
}
|
|
.s-quote .right .qbody .it-emph {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-weight: 500;
|
|
text-transform: none;
|
|
letter-spacing: -0.005em;
|
|
line-height: 1;
|
|
}
|
|
.s-quote .right .who-row {
|
|
display: flex; flex-direction: column; gap: 4px;
|
|
border-top: 1.5px solid var(--ink);
|
|
padding-top: clamp(12px, 1.4vh, 20px);
|
|
align-items: center;
|
|
}
|
|
.s-quote .right .who-row .who-tag {
|
|
font-family: 'Bricolage Grotesque', sans-serif;
|
|
font-weight: 700;
|
|
text-transform: uppercase;
|
|
font-size: clamp(15px, 1.05vw, 18px);
|
|
color: var(--ink);
|
|
letter-spacing: -0.005em;
|
|
}
|
|
.s-quote .right .who-row .meta-tag {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(14px, 0.95vw, 16px);
|
|
color: var(--ink);
|
|
opacity: 0.78;
|
|
}
|
|
|
|
/* ──────────────────────────────────────────────────────────────
|
|
SLIDE 7 — UPCOMING SCHEDULE
|
|
────────────────────────────────────────────────────────────── */
|
|
.s-cal { background: var(--paper); }
|
|
.s-cal .frame {
|
|
position: absolute;
|
|
inset: clamp(96px, 10vh, 160px) clamp(80px, 7vw, 160px) clamp(110px, 11vh, 170px);
|
|
display: flex; flex-direction: column;
|
|
z-index: 5;
|
|
}
|
|
.s-cal .topbar {
|
|
display: flex; align-items: end; justify-content: space-between;
|
|
border-bottom: 1.5px solid var(--ink);
|
|
padding-bottom: clamp(14px, 1.6vh, 24px);
|
|
margin-bottom: clamp(20px, 2.4vh, 32px);
|
|
gap: 30px;
|
|
}
|
|
.s-cal .topbar .h {
|
|
font-family: 'Bricolage Grotesque', sans-serif;
|
|
font-weight: 800;
|
|
text-transform: uppercase;
|
|
font-size: clamp(56px, min(6vw, 10vh), 120px);
|
|
line-height: 0.9;
|
|
letter-spacing: -0.012em;
|
|
color: var(--ink);
|
|
}
|
|
.s-cal .topbar .lab-tag {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(15px, 1.05vw, 18px);
|
|
color: var(--ink);
|
|
text-align: right;
|
|
line-height: 1.4;
|
|
}
|
|
.s-cal .ledger {
|
|
flex: 1;
|
|
display: flex; flex-direction: column;
|
|
}
|
|
.s-cal .row {
|
|
display: grid;
|
|
grid-template-columns: 80px 130px 1.6fr 0.9fr auto;
|
|
gap: clamp(14px, 1.4vw, 28px);
|
|
align-items: center;
|
|
padding: clamp(11px, 1.3vh, 18px) 0;
|
|
border-bottom: 1px solid rgba(181, 61, 42, 0.30);
|
|
flex: 1 1 0;
|
|
min-height: clamp(56px, 7vh, 90px);
|
|
}
|
|
.s-cal .row.headrow {
|
|
flex: 0 0 auto;
|
|
min-height: 0;
|
|
border-bottom: 1.5px solid var(--ink);
|
|
padding: 6px 0;
|
|
}
|
|
.s-cal .row.headrow > div {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(13px, 0.92vw, 15px);
|
|
color: var(--ink);
|
|
letter-spacing: 0.04em;
|
|
}
|
|
.s-cal .row .num-tag {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(15px, 1.05vw, 18px);
|
|
color: var(--ink);
|
|
}
|
|
.s-cal .row .city-tag {
|
|
font-family: 'Bricolage Grotesque', sans-serif;
|
|
font-weight: 700;
|
|
text-transform: uppercase;
|
|
font-size: clamp(18px, 1.3vw, 24px);
|
|
color: var(--ink);
|
|
letter-spacing: -0.005em;
|
|
}
|
|
.s-cal .row .theme {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(17px, 1.2vw, 22px);
|
|
color: var(--ink);
|
|
line-height: 1.3;
|
|
}
|
|
.s-cal .row .date-tag {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(15px, 1.05vw, 17px);
|
|
color: var(--ink);
|
|
}
|
|
.s-cal .row .seats-pill {
|
|
border: 1.5px solid var(--ink);
|
|
border-radius: 999px;
|
|
padding: 6px 16px;
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(13px, 0.95vw, 16px);
|
|
color: var(--ink);
|
|
line-height: 1;
|
|
white-space: nowrap;
|
|
}
|
|
.s-cal .row .seats-pill.sold-out {
|
|
background: var(--ink);
|
|
color: var(--paper);
|
|
font-style: normal;
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* ──────────────────────────────────────────────────────────────
|
|
SLIDE 8 — CLOSING / RSVP
|
|
────────────────────────────────────────────────────────────── */
|
|
.s-closing { background: var(--paper); }
|
|
/* Frame ends well above the footer-line; footer-line ends well above the
|
|
page-num chrome. Three discrete bands, no overlap zones. */
|
|
.s-closing .frame {
|
|
position: absolute;
|
|
left: clamp(80px, 7vw, 160px);
|
|
right: clamp(80px, 7vw, 160px);
|
|
top: clamp(96px, 10vh, 160px);
|
|
bottom: clamp(280px, 28vh, 400px);
|
|
display: flex; flex-direction: column;
|
|
justify-content: center;
|
|
z-index: 5;
|
|
}
|
|
.s-closing .left { display: flex; flex-direction: column; gap: clamp(20px, 2.4vh, 38px); max-width: 60ch; }
|
|
.s-closing .left .ed-row {
|
|
display: flex; align-items: center; gap: 14px;
|
|
}
|
|
.s-closing .left .ed-row .ed-label {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(18px, 1.3vw, 22px);
|
|
color: var(--ink);
|
|
}
|
|
.s-closing .left .h {
|
|
font-family: 'Bricolage Grotesque', sans-serif;
|
|
font-weight: 800;
|
|
text-transform: uppercase;
|
|
font-size: clamp(60px, min(6.4vw, 10vh), 130px);
|
|
line-height: 0.92;
|
|
letter-spacing: -0.012em;
|
|
color: var(--ink);
|
|
}
|
|
/* No right-side illustration — closing is a single text band. */
|
|
.s-closing .left .desc-it {
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(17px, 1.2vw, 22px);
|
|
line-height: 1.5;
|
|
color: var(--ink);
|
|
max-width: 42ch;
|
|
}
|
|
.s-closing .left .actions {
|
|
display: flex; gap: clamp(12px, 1.2vw, 20px); align-items: center;
|
|
flex-wrap: wrap;
|
|
}
|
|
.s-closing .right {
|
|
display: grid; place-items: center;
|
|
color: var(--ink);
|
|
}
|
|
.s-closing .right svg { width: 100%; height: auto; max-height: 100%; }
|
|
.s-closing .footer-line {
|
|
/* Footer band sits above the page-num chrome; clear gap below. */
|
|
position: absolute;
|
|
left: clamp(80px, 7vw, 160px);
|
|
right: clamp(80px, 7vw, 160px);
|
|
bottom: clamp(110px, 11vh, 160px);
|
|
display: flex; gap: clamp(40px, 4vw, 70px);
|
|
z-index: 5;
|
|
}
|
|
.s-closing .footer-line .colf {
|
|
border-top: 1px solid var(--ink);
|
|
padding-top: clamp(8px, 1vh, 14px);
|
|
font-family: 'Fraunces', Georgia, serif;
|
|
font-style: italic;
|
|
font-size: clamp(14px, 0.95vw, 16px);
|
|
color: var(--ink);
|
|
line-height: 1.4;
|
|
flex: 1;
|
|
}
|
|
.s-closing .footer-line .colf .ftag {
|
|
font-style: normal;
|
|
font-weight: 600;
|
|
margin-bottom: 2px;
|
|
display: block;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<div class="deck">
|
|
<div class="stage">
|
|
|
|
<!-- 1. COVER ─────────────────────────────────────────────── -->
|
|
<section class="slide s-cover active">
|
|
<div class="grid">
|
|
<div class="left">
|
|
<div class="ed-row">
|
|
<div class="ed-badge caption">5</div>
|
|
<div class="ed-label caption">december edition</div>
|
|
</div>
|
|
<h1 class="title">Long Table</h1>
|
|
<div class="actions">
|
|
<span class="pill caption">Lisbon</span>
|
|
<span class="pill-divider caption">|</span>
|
|
<span class="pill caption">Apply now</span>
|
|
</div>
|
|
<div class="stats body-it">
|
|
<span class="num">22 seats only</span><br/>
|
|
More than dinner, it's a long evening.
|
|
</div>
|
|
<div class="bottom-block">
|
|
<span class="rect-tag caption">Not a meal, an evening</span>
|
|
<p class="tagline">Where ten strangers, one cook, and a long evening meet under low light. Twice a month, by application.</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="right">
|
|
<div class="big-edition">No. 05</div>
|
|
<div class="big-edition-lab caption">December · Lisbon · Edition</div>
|
|
<div class="big-edition-meta">Twice a month, ten strangers, one cook, one long table. By application.</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="pagenum">01 / 08</div>
|
|
</section>
|
|
|
|
<!-- 2. MANIFESTO ─────────────────────────────────────────── -->
|
|
<section class="slide s-manifesto">
|
|
<div class="frame">
|
|
<div class="left">
|
|
<div class="ed-row">
|
|
<div class="ed-badge caption">·</div>
|
|
<div class="ed-label caption">a letter from the table</div>
|
|
</div>
|
|
<h2 class="h">A note<br/>before<br/>we sit.</h2>
|
|
</div>
|
|
<div class="right">
|
|
<p>We started Long Table in a borrowed kitchen, with <span class="empha">six chairs we'd carried up the stairs</span>, and the conviction that an evening is more than the food on the plates.</p>
|
|
<p>Three years on we've seated almost <span class="empha">two thousand strangers</span> across nine cities, and we've learned that the chairs are sometimes the most important part.</p>
|
|
<p>This deck is the small handbook we send our hosts before each edition. It is also, quietly, an invitation.</p>
|
|
<div class="sig">
|
|
<div class="who-tag">Iris & Theo</div>
|
|
<div>founders · written from a kitchen in Lisbon, November 2025</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="pagenum">02 / 08</div>
|
|
</section>
|
|
|
|
<!-- 3. INDEX OF EDITIONS ────────────────────────────────── -->
|
|
<section class="slide s-index">
|
|
<div class="frame">
|
|
<div class="topbar">
|
|
<div class="h">Three recent editions</div>
|
|
<div class="lab-tag caption">Long Table · 2025 · selected</div>
|
|
</div>
|
|
<div class="grid">
|
|
<div class="card">
|
|
<div class="card-top">
|
|
<div class="num-tag caption">No. 03</div>
|
|
<div class="city-tag caption">Mexico City</div>
|
|
</div>
|
|
<div class="nm">A Plate<br/>of Quiet</div>
|
|
<div class="desc body-it">Eight courses cooked entirely on a single induction ring. The room agreed not to use phones for the entire evening, and almost kept the agreement.</div>
|
|
<div class="meta-row">
|
|
<div class="seats-tag caption">22 seats</div>
|
|
<div class="date-tag caption">14 March 2025</div>
|
|
</div>
|
|
</div>
|
|
<div class="card">
|
|
<div class="card-top">
|
|
<div class="num-tag caption">No. 04</div>
|
|
<div class="city-tag caption">Tokyo</div>
|
|
</div>
|
|
<div class="nm">A Soup<br/>of Letters</div>
|
|
<div class="desc body-it">A reading evening, with a single course served slowly. Four guest writers, one bowl per person, and the longest pause we have ever held between courses.</div>
|
|
<div class="meta-row">
|
|
<div class="seats-tag caption">18 seats</div>
|
|
<div class="date-tag caption">06 July 2025</div>
|
|
</div>
|
|
</div>
|
|
<div class="card">
|
|
<div class="card-top">
|
|
<div class="num-tag caption">No. 05</div>
|
|
<div class="city-tag caption">Lisbon</div>
|
|
</div>
|
|
<div class="nm">December<br/>Edition</div>
|
|
<div class="desc body-it">A long winter dinner. Twenty-two seats, one shared roast, and a quiet bookshop next door we'll wander to between courses, when the rain agrees.</div>
|
|
<div class="meta-row">
|
|
<div class="seats-tag caption">22 seats</div>
|
|
<div class="date-tag caption">11 December 2025</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="pagenum">03 / 08</div>
|
|
</section>
|
|
|
|
<!-- 4. FEATURED EDITION ────────────────────────────────── -->
|
|
<section class="slide s-featured">
|
|
<div class="frame">
|
|
<div class="left">
|
|
<div class="ed-row">
|
|
<div class="ed-badge caption">5</div>
|
|
<div class="ed-label caption">december · the featured edition</div>
|
|
</div>
|
|
<h2 class="ttl">An evening<br/>for the rain.</h2>
|
|
<p class="lede">A long winter dinner in a converted printing room above a bookshop. One shared roast, an unhurried wine list, and a single intermission that may, if the weather agrees, become a walk to the harbour and back.</p>
|
|
<div class="stats-line">
|
|
<span class="pill caption">Apply by 28 November</span>
|
|
<span class="pill caption">Twelve seats left</span>
|
|
</div>
|
|
</div>
|
|
<div class="right">
|
|
<div class="info-row">
|
|
<div class="k caption">When</div>
|
|
<div class="v it">11 December 2025</div>
|
|
</div>
|
|
<div class="info-row">
|
|
<div class="k caption">Where</div>
|
|
<div class="v it">A printing room, Bairro Alto · Lisbon</div>
|
|
</div>
|
|
<div class="info-row">
|
|
<div class="k caption">Who</div>
|
|
<div class="v it">Twenty-two seats, by application</div>
|
|
</div>
|
|
<div class="info-row">
|
|
<div class="k caption">How long</div>
|
|
<div class="v it">From eight, well into the evening</div>
|
|
</div>
|
|
<div class="info-row">
|
|
<div class="k caption">Seat</div>
|
|
<div class="v">€84</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="pagenum">04 / 08</div>
|
|
</section>
|
|
|
|
<!-- 5. MENU ─────────────────────────────────────────────── -->
|
|
<section class="slide s-menu">
|
|
<div class="frame">
|
|
<div class="top-row">
|
|
<div class="kicker caption">A Menu, in Five Slow Movements</div>
|
|
<h2 class="h">December · Lisbon</h2>
|
|
</div>
|
|
<div class="courses">
|
|
<div class="course">
|
|
<div class="num-tag caption">i.</div>
|
|
<div class="item">
|
|
<div class="nm">Roasted chestnut soup</div>
|
|
<div class="desc body-it">with brown butter, sage, and a single thin disc of pear</div>
|
|
</div>
|
|
<div class="pair-tag caption">unoaked white</div>
|
|
</div>
|
|
<div class="course">
|
|
<div class="num-tag caption">ii.</div>
|
|
<div class="item">
|
|
<div class="nm">A small bread, hot</div>
|
|
<div class="desc body-it">made the morning of, with cultured butter and a coarse salt</div>
|
|
</div>
|
|
<div class="pair-tag caption">water, lemon</div>
|
|
</div>
|
|
<div class="course">
|
|
<div class="num-tag caption">iii.</div>
|
|
<div class="item">
|
|
<div class="nm">Mackerel, lightly cured</div>
|
|
<div class="desc body-it">on toasted rye, with parsley oil and pickled celery</div>
|
|
</div>
|
|
<div class="pair-tag caption">vinho verde</div>
|
|
</div>
|
|
<div class="course">
|
|
<div class="num-tag caption">iv.</div>
|
|
<div class="item">
|
|
<div class="nm">A long roast, the centre course</div>
|
|
<div class="desc body-it">slow lamb shoulder, root vegetables under it, served family-style</div>
|
|
</div>
|
|
<div class="pair-tag caption">douro red</div>
|
|
</div>
|
|
<div class="course">
|
|
<div class="num-tag caption">v.</div>
|
|
<div class="item">
|
|
<div class="nm">Cheese, two only</div>
|
|
<div class="desc body-it">a soft, a hard, both local; quince paste and walnuts in the half-shell</div>
|
|
</div>
|
|
<div class="pair-tag caption">port, late bottled</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="pagenum">05 / 08</div>
|
|
</section>
|
|
|
|
<!-- 6. QUOTE ──────────────────────────────────────────── -->
|
|
<section class="slide s-quote">
|
|
<div class="frame">
|
|
<div class="right">
|
|
<div class="kicker caption">A guest writes</div>
|
|
<p class="qbody">An evening I keep <span class="it-emph">describing,</span> badly, to people who weren't there.</p>
|
|
<div class="who-row">
|
|
<div class="who-tag">Hana Brennan</div>
|
|
<div class="meta-tag caption">long-table guest · Edition No. 04 · Tokyo</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="pagenum">06 / 08</div>
|
|
</section>
|
|
|
|
<!-- 7. UPCOMING SCHEDULE ───────────────────────────────── -->
|
|
<section class="slide s-cal">
|
|
<div class="frame">
|
|
<div class="topbar">
|
|
<div class="h">What's coming up</div>
|
|
<div class="lab-tag caption">2026 calendar · subject to weather</div>
|
|
</div>
|
|
<div class="ledger">
|
|
<div class="row headrow">
|
|
<div class="caption">No.</div>
|
|
<div class="caption">City</div>
|
|
<div class="caption">Theme</div>
|
|
<div class="caption">Date</div>
|
|
<div class="caption">Status</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="num-tag caption">06</div>
|
|
<div class="city-tag">Lisbon</div>
|
|
<div class="theme">A long winter dinner, with a roast and a walk</div>
|
|
<div class="date-tag caption">11 December 2025</div>
|
|
<div><span class="seats-pill sold-out caption">Sold out</span></div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="num-tag caption">07</div>
|
|
<div class="city-tag">Brooklyn</div>
|
|
<div class="theme">A reading evening, with one quiet course</div>
|
|
<div class="date-tag caption">17 January 2026</div>
|
|
<div><span class="seats-pill caption">12 seats left</span></div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="num-tag caption">08</div>
|
|
<div class="city-tag">Mexico City</div>
|
|
<div class="theme">A small breakfast, taken slowly</div>
|
|
<div class="date-tag caption">22 February 2026</div>
|
|
<div><span class="seats-pill caption">Apply now</span></div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="num-tag caption">09</div>
|
|
<div class="city-tag">Athens</div>
|
|
<div class="theme">A spring supper, on a roof, with wind</div>
|
|
<div class="date-tag caption">14 March 2026</div>
|
|
<div><span class="seats-pill caption">Apply now</span></div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="num-tag caption">10</div>
|
|
<div class="city-tag">Seoul</div>
|
|
<div class="theme">A small soup of late letters</div>
|
|
<div class="date-tag caption">06 May 2026</div>
|
|
<div><span class="seats-pill caption">Apply soon</span></div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="num-tag caption">11</div>
|
|
<div class="city-tag">Paris</div>
|
|
<div class="theme">An afternoon, mostly cheese and wind</div>
|
|
<div class="date-tag caption">18 June 2026</div>
|
|
<div><span class="seats-pill caption">Wait list</span></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="pagenum">07 / 08</div>
|
|
</section>
|
|
|
|
<!-- 8. CLOSING / RSVP ─────────────────────────────────── -->
|
|
<section class="slide s-closing">
|
|
<div class="frame">
|
|
<div class="left">
|
|
<div class="ed-row">
|
|
<div class="ed-badge caption">·</div>
|
|
<div class="ed-label caption">come and sit with us</div>
|
|
</div>
|
|
<h2 class="h">See you<br/>at the table.</h2>
|
|
<p class="desc-it">Every Long Table evening is by application. We read each one, and we usually answer within a week. The next room opens for Brooklyn on the seventeenth of January.</p>
|
|
<div class="actions">
|
|
<span class="pill caption">long-table.co</span>
|
|
<span class="pill caption">Apply for Brooklyn</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="footer-line">
|
|
<div class="colf">
|
|
<span class="ftag caption">Founded</span>
|
|
By Iris & Theo, 2022, in a borrowed kitchen in Lisbon.
|
|
</div>
|
|
<div class="colf">
|
|
<span class="ftag caption">Set</span>
|
|
In Bricolage Grotesque & Fraunces, with one rust-red ink.
|
|
</div>
|
|
<div class="colf">
|
|
<span class="ftag caption">Until then</span>
|
|
Dress for the rain. Bring a hand-written question.
|
|
</div>
|
|
</div>
|
|
|
|
<div class="pagenum">08 / 08</div>
|
|
</section>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div class="caption nav-hint">← / → · space</div>
|
|
|
|
<script>
|
|
// Plain vanilla navigation: arrows, space, home/end, swipe.
|
|
const slides = Array.from(document.querySelectorAll('.slide'));
|
|
let current = 0;
|
|
function show(i) {
|
|
if (i < 0) i = 0;
|
|
if (i > slides.length - 1) i = slides.length - 1;
|
|
slides[current].classList.remove('active');
|
|
slides[i].classList.add('active');
|
|
current = i;
|
|
}
|
|
document.addEventListener('keydown', (e) => {
|
|
if (e.key === 'ArrowRight' || e.key === 'PageDown' || e.key === ' ') { e.preventDefault(); show(current + 1); }
|
|
else if (e.key === 'ArrowLeft' || e.key === 'PageUp') { e.preventDefault(); show(current - 1); }
|
|
else if (e.key === 'Home') { e.preventDefault(); show(0); }
|
|
else if (e.key === 'End') { e.preventDefault(); show(slides.length - 1); }
|
|
});
|
|
let tx = null;
|
|
document.addEventListener('touchstart', (e) => { tx = e.touches[0].clientX; }, { passive: true });
|
|
document.addEventListener('touchend', (e) => {
|
|
if (tx == null) return;
|
|
const dx = e.changedTouches[0].clientX - tx;
|
|
if (Math.abs(dx) > 40) show(current + (dx < 0 ? 1 : -1));
|
|
tx = null;
|
|
});
|
|
</script>
|
|
|
|
</body>
|
|
</html>
|