Skip to content

Commit 13a7fcb

Browse files
committed
Pipeline strip: 10 blue shades, hover to expand, links to docs
1 parent 9e99432 commit 13a7fcb

File tree

2 files changed

+168
-0
lines changed

2 files changed

+168
-0
lines changed

src/pages/index.module.css

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,120 @@
323323
font-variant-numeric: tabular-nums;
324324
}
325325

326+
/* ── PIPELINE ────────────────────────────────────────────────── */
327+
328+
.pipeline {
329+
padding: 6rem 0 4rem;
330+
background: #000;
331+
}
332+
333+
.pipeInner {
334+
max-width: 1100px;
335+
margin: 0 auto;
336+
padding: 0 2rem;
337+
}
338+
339+
.pipeTitle {
340+
font-size: clamp(1.8rem, 4vw, 2.5rem);
341+
font-weight: 700;
342+
letter-spacing: -0.03em;
343+
margin: 0 0 0.5rem;
344+
}
345+
346+
.pipeSub {
347+
font-size: 0.95rem;
348+
color: rgba(255, 255, 255, 0.35);
349+
margin: 0 0 3rem;
350+
}
351+
352+
.strip {
353+
display: flex;
354+
width: 100%;
355+
height: 80px;
356+
}
357+
358+
.cell {
359+
flex: 1;
360+
display: flex;
361+
align-items: center;
362+
justify-content: center;
363+
transition: all 0.3s ease;
364+
text-decoration: none;
365+
color: #fff;
366+
position: relative;
367+
cursor: pointer;
368+
overflow: hidden;
369+
}
370+
371+
.cell:first-child {
372+
border-radius: 0;
373+
}
374+
375+
.cell:last-child {
376+
border-radius: 0;
377+
}
378+
379+
.cell:hover {
380+
text-decoration: none;
381+
color: #fff;
382+
}
383+
384+
.cellLabel {
385+
font-size: 0.65rem;
386+
font-weight: 600;
387+
letter-spacing: 0.08em;
388+
text-transform: uppercase;
389+
opacity: 0;
390+
transition: opacity 0.2s;
391+
white-space: nowrap;
392+
}
393+
394+
.cell:hover .cellLabel,
395+
.cellActive .cellLabel {
396+
opacity: 1;
397+
}
398+
399+
.cellActive {
400+
flex: 3;
401+
}
402+
403+
.pipeDetail {
404+
max-width: 1100px;
405+
margin: 0 auto;
406+
padding: 2rem 2rem 0;
407+
min-height: 80px;
408+
display: flex;
409+
align-items: center;
410+
gap: 1.5rem;
411+
}
412+
413+
.pipeDetailNum {
414+
font-size: 2.5rem;
415+
font-weight: 800;
416+
color: rgba(255, 255, 255, 0.06);
417+
letter-spacing: -0.03em;
418+
font-variant-numeric: tabular-nums;
419+
line-height: 1;
420+
}
421+
422+
.pipeDetail h3 {
423+
font-size: 1.1rem;
424+
font-weight: 700;
425+
margin: 0 0 0.2rem;
426+
}
427+
428+
.pipeDetail p {
429+
font-size: 0.88rem;
430+
color: rgba(255, 255, 255, 0.4);
431+
margin: 0;
432+
}
433+
434+
.pipeHint {
435+
font-size: 0.82rem;
436+
color: rgba(255, 255, 255, 0.15);
437+
margin: 0;
438+
}
439+
326440
/* ── DOCS ────────────────────────────────────────────────────── */
327441

328442
.docs {

src/pages/index.tsx

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,59 @@ function Docs() {
145145
);
146146
}
147147

148+
/* ── PIPELINE ─────────────────────────────────────────────────── */
149+
150+
const pipeline = [
151+
{ color: '#0a1628', label: 'Network', detail: 'TCP connect, mux framing, handshake v13/v14', link: '/docs/architecture/network' },
152+
{ color: '#0c1f3d', label: 'ChainSync', detail: 'Header streaming, intersection, rollback handling', link: '/docs/spec/networking' },
153+
{ color: '#0e2854', label: 'BlockFetch', detail: 'Range requests, batch retrieval, era-tagged blocks', link: '/docs/spec/networking' },
154+
{ color: '#10326b', label: 'Decode', detail: 'CBOR schema, byte-preserving walk, ConwayBlock', link: '/docs/architecture/codec' },
155+
{ color: '#133d82', label: 'Consensus', detail: 'VRF proof, KES sig, leader check, nonce evolution', link: '/docs/spec/consensus' },
156+
{ color: '#164899', label: 'Validate', detail: '19 UTxO rules, witness sigs, script data hash', link: '/docs/spec/transactions' },
157+
{ color: '#1953b0', label: 'Plutus', detail: 'V1/V2/V3 CEK eval, ScriptContext, cost models', link: '/docs/spec/scripts' },
158+
{ color: '#1c5ec7', label: 'Apply', detail: 'Consume inputs, add outputs, collect fees, certs', link: '/docs/spec/ledger-state' },
159+
{ color: '#2069de', label: 'Epoch', detail: 'Rewards, pool retirement, snapshot rotation', link: '/docs/spec/epoch' },
160+
{ color: '#2575f5', label: 'Storage', detail: 'VolatileDB, ImmutableDB, LedgerDB checkpoints', link: '/docs/spec/storage' },
161+
];
162+
163+
function Pipeline() {
164+
const [active, setActive] = React.useState<number | null>(null);
165+
return (
166+
<section className={styles.pipeline}>
167+
<div className={styles.pipeInner}>
168+
<p className={styles.tag}>BLOCK PIPELINE</p>
169+
<h2 className={styles.pipeTitle}>From TCP byte to ledger state.</h2>
170+
<p className={styles.pipeSub}>Every block flows through 10 stages. Hover to explore each module.</p>
171+
</div>
172+
<div className={styles.strip}>
173+
{pipeline.map((p, i) => (
174+
<Link
175+
key={p.label}
176+
to={useBaseUrl(p.link)}
177+
className={`${styles.cell} ${active === i ? styles.cellActive : ''}`}
178+
style={{ background: p.color }}
179+
onMouseEnter={() => setActive(i)}
180+
onMouseLeave={() => setActive(null)}
181+
>
182+
<span className={styles.cellLabel}>{p.label}</span>
183+
</Link>
184+
))}
185+
</div>
186+
<div className={styles.pipeDetail}>
187+
{active !== null ? (
188+
<>
189+
<span className={styles.pipeDetailNum}>0{active + 1}</span>
190+
<h3>{pipeline[active].label}</h3>
191+
<p>{pipeline[active].detail}</p>
192+
</>
193+
) : (
194+
<p className={styles.pipeHint}>Hover a stage above</p>
195+
)}
196+
</div>
197+
</section>
198+
);
199+
}
200+
148201
/* ── FOOTER ───────────────────────────────────────────────────── */
149202

150203
function Footer() {
@@ -199,6 +252,7 @@ export default function Home(): React.ReactNode {
199252
<main>
200253
<Hero />
201254
<Stack />
255+
<Pipeline />
202256
<Docs />
203257
</main>
204258
<Footer />

0 commit comments

Comments
 (0)