Files
ferrix/slides/theme.css
T
Rayhaan JaufeerallyandClaude Fable 5.1 106edd1df0 slides: reveal.js deck template for the BGP lecture
Structured like Matt Godbolt's newer talks (hrt-theme.css in
what-happens-beneath-accu-2026): reveal.js with no stock theme but a custom
dark one, every slide on a rounded panel, IBM Plex Sans and Mono, monokai
code with glowing stepped lines, 16:9 with fade transitions, and the
content in one Markdown file per section.

Made our own: the palette is a handful of variables (with ?accent= presets
for comparing), and his ring-and-thread corner motif became a chain of
nodes and links, an AS path, which also opens the title slide. A wordmark
sits where his decks carry the employer logo.

Also: a small `bird` syntax highlighter for router config on slides, a
bytes component in the four groups of the /statusz bytes view, columns,
boxes, and a `bare` slide class. reveal.js 6 loads from a vendored copy
when slides/vendor-reveal.sh has been run (works offline, ignored by git)
and from the CDN otherwise. Section files carry a starter outline for the
lab that doubles as a tour of the slide types.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-20 21:30:41 +02:00

430 lines
10 KiB
CSS

/*
* The look of the deck. Structure borrowed from Matt Godbolt's newer talks
* (hrt-theme.css in github.com/mattgodbolt/what-happens-beneath-accu-2026):
* near-black navy ground, every slide on a rounded panel, IBM Plex Sans with
* thin white h1 and bold accent h2, IBM Plex Mono code, accent-coloured list
* markers, links and progress bar, glowing highlighted code lines.
*
* Made our own: the palette is ours (change it in :root below), and his
* "thread" motif becomes a chain of nodes and links, an AS path.
*
* Try accents without editing: index.html?accent=green (blue, green,
* amber, magenta). Make one permanent by copying its values into :root.
*/
@import url("https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,500;1,700&family=IBM+Plex+Mono:ital,wght@0,400;0,500;1,400&display=swap");
:root {
--ground: #11131f; /* behind the panels */
--panel: #1b1e33; /* the slide itself */
--panel-edge: rgba(94, 177, 255, 0.14);
--ink: #eceff9; /* body text */
--ink-strong: #ffffff; /* h1, h3 */
--muted: #7d7f99; /* h4, captions */
--rule: #4f526b; /* table rules, borders */
--accent: #5eb1ff; /* h2, markers, links, motif */
--accent-soft: #b7dcff; /* inline code, emphasis */
--accent-rgb: 94, 177, 255;
--r-code-font: "IBM Plex Mono", "SF Mono", Menlo, Consolas, monospace;
--r-heading-text-shadow: none;
}
:root[data-accent="green"] {
--accent: #4fd98a;
--accent-soft: #b5f0cf;
--accent-rgb: 79, 217, 138;
--panel-edge: rgba(79, 217, 138, 0.14);
}
:root[data-accent="amber"] {
--accent: #ffb020;
--accent-soft: #ffdc99;
--accent-rgb: 255, 176, 32;
--panel-edge: rgba(255, 176, 32, 0.14);
}
:root[data-accent="magenta"] {
--accent: #ff6ac1;
--accent-soft: #ffc2e6;
--accent-rgb: 255, 106, 193;
--panel-edge: rgba(255, 106, 193, 0.14);
}
/* ---- ground and panels ---------------------------------------------------- */
.reveal-viewport {
background: var(--ground);
}
.reveal {
font-family: "IBM Plex Sans", "Helvetica Neue", Arial, sans-serif;
font-size: 40px;
font-weight: 400;
color: var(--ink);
}
.reveal .slides section:not(.stack):not(.title-slide):not(.bare) {
background-color: var(--panel);
border-radius: 12px;
box-shadow: 0 4px 30px rgba(0, 0, 0, 0.3);
border: 1px solid var(--panel-edge);
padding: 1em 0.8em;
box-sizing: border-box;
}
/* ---- type ------------------------------------------------------------------ */
.reveal h1,
.reveal h2,
.reveal h3,
.reveal h4 {
font-family: inherit;
text-transform: none;
text-shadow: none;
margin: 0 0 20px 0;
line-height: 1.25;
}
.reveal h1 {
font-weight: 300;
color: var(--ink-strong);
font-size: 2.2em;
line-height: 1.15;
}
.reveal h2 {
font-weight: 700;
color: var(--accent);
font-size: 1.5em;
}
.reveal h3 {
font-weight: 500;
color: var(--ink-strong);
font-size: 1.2em;
}
.reveal h4 {
font-weight: 500;
color: var(--muted);
font-size: 1em;
}
.reveal p {
margin: 20px 0;
line-height: 1.5;
}
.reveal strong,
.reveal b {
font-weight: 700;
color: var(--ink-strong);
}
.reveal em {
font-style: italic;
color: var(--accent-soft);
}
.reveal a {
color: var(--accent);
text-decoration: none;
transition: color 0.15s ease;
}
.reveal a:hover {
color: var(--accent-soft);
}
.reveal ul,
.reveal ol {
display: inline-block;
text-align: left;
margin: 0 0 0 1em;
}
.reveal ul {
list-style-type: square;
}
.reveal ul li,
.reveal ol li {
margin-bottom: 0.4em;
}
.reveal li::marker {
color: var(--accent);
}
.reveal blockquote {
background: var(--ground);
border-left: 4px solid var(--accent);
padding: 20px 30px;
font-style: italic;
width: 85%;
margin: 20px auto;
text-align: left;
}
.reveal img,
.reveal video,
.reveal iframe {
max-width: 95%;
max-height: 95%;
}
.reveal kbd {
font-family: var(--r-code-font);
font-size: 80%;
border: 1px solid var(--rule);
border-bottom-width: 3px;
border-radius: 5px;
padding: 0 0.35em;
}
/* ---- code ------------------------------------------------------------------ */
.reveal pre {
width: 100%;
margin: 20px auto;
box-shadow: none;
text-align: left;
position: relative;
font-size: 0.55em;
line-height: 1.4;
}
.reveal code {
font-family: var(--r-code-font);
color: var(--accent-soft);
}
.reveal :not(pre) > code {
white-space: nowrap;
font-size: 92%;
}
.reveal pre code {
display: block;
color: var(--ink);
background: rgba(8, 9, 20, 0.65);
border-radius: 6px;
padding: 15px 20px;
max-height: 560px;
overflow: auto;
}
/* The lines being talked about glow; the rest dim (reveal handles the dim). */
.reveal .hljs.has-highlights tr.highlight-line {
text-shadow:
0 0 6px currentColor,
0 0 12px currentColor;
transition: text-shadow 0.4s ease;
}
/* ---- tables ---------------------------------------------------------------- */
.reveal table {
border-collapse: collapse;
border-spacing: 0;
margin: 20px auto;
font-size: 75%;
}
.reveal table th {
font-weight: 700;
color: var(--ink-strong);
}
.reveal table th,
.reveal table td {
text-align: left;
border-bottom: 1px solid var(--rule);
padding: 0.25em 0.6em;
}
.reveal table tr:last-child td {
border-bottom: none;
}
/* ---- reveal chrome ---------------------------------------------------------- */
.reveal .controls {
color: var(--accent);
bottom: 40px;
}
.reveal .progress {
background: var(--panel);
height: 4px;
}
.reveal .progress span {
background: var(--accent);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
}
.reveal .slide-number {
color: var(--ground);
font-family: var(--r-code-font);
font-size: 18px;
font-weight: 500;
background: rgba(var(--accent-rgb), 0.9);
padding: 3px 9px;
border-radius: 4px;
right: 16px;
bottom: 16px;
}
::selection {
color: var(--ground);
background: var(--accent);
}
/* ---- the path motif ---------------------------------------------------------
* Matt's decks carry a ring with a line running off the edge. Ours is a short
* AS path: nodes joined by links, heading off the top-right corner, mirrored
* running up from the bottom-left. Drawn in the accent colour via a mask, so
* it follows --accent. Hidden on the title slide and on "bare" slides.
*/
.reveal::before,
.reveal-viewport::before {
content: "";
position: fixed;
background: var(--accent);
z-index: 0;
pointer-events: none;
opacity: 0.9;
}
.reveal::before {
top: 26px;
right: 0;
width: 38vw;
height: 22px;
-webkit-mask:
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 190 22'><g fill='none' stroke='black' stroke-width='3'><circle cx='11' cy='11' r='8'/><line x1='19' y1='11' x2='67' y2='11'/><circle cx='75' cy='11' r='8'/><line x1='83' y1='11' x2='131' y2='11'/><circle cx='139' cy='11' r='8'/><line x1='147' y1='11' x2='190' y2='11'/></g></svg>")
left center / 190px 22px no-repeat,
linear-gradient(black, black) 189px center / calc(100% - 189px) 3px no-repeat;
mask:
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 190 22'><g fill='none' stroke='black' stroke-width='3'><circle cx='11' cy='11' r='8'/><line x1='19' y1='11' x2='67' y2='11'/><circle cx='75' cy='11' r='8'/><line x1='83' y1='11' x2='131' y2='11'/><circle cx='139' cy='11' r='8'/><line x1='147' y1='11' x2='190' y2='11'/></g></svg>")
left center / 190px 22px no-repeat,
linear-gradient(black, black) 189px center / calc(100% - 189px) 3px no-repeat;
}
.reveal-viewport::before {
bottom: 64px;
left: 40px;
width: 22px;
height: 36vh;
-webkit-mask:
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 22 126'><g fill='none' stroke='black' stroke-width='3'><circle cx='11' cy='115' r='8'/><line x1='11' y1='107' x2='11' y2='59'/><circle cx='11' cy='51' r='8'/><line x1='11' y1='43' x2='11' y2='0'/></g></svg>")
center bottom / 22px 126px no-repeat,
linear-gradient(black, black) center top / 3px calc(100% - 125px) no-repeat;
mask:
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 22 126'><g fill='none' stroke='black' stroke-width='3'><circle cx='11' cy='115' r='8'/><line x1='11' y1='107' x2='11' y2='59'/><circle cx='11' cy='51' r='8'/><line x1='11' y1='43' x2='11' y2='0'/></g></svg>")
center bottom / 22px 126px no-repeat,
linear-gradient(black, black) center top / 3px calc(100% - 125px) no-repeat;
}
.reveal:has(> .slides > section.title-slide.present)::before,
.reveal:has(> .slides section.bare.present)::before {
display: none;
}
.reveal-viewport:has(.reveal > .slides > section.title-slide.present)::before,
.reveal-viewport:has(.reveal > .slides section.bare.present)::before {
display: none;
}
.reveal:has(section.title-slide.present) .controls {
display: none !important;
}
/* ---- wordmark, where his logo sits ------------------------------------------ */
.wordmark {
position: fixed;
left: 22px;
bottom: 18px;
z-index: 10;
font-family: var(--r-code-font);
font-size: 15px;
letter-spacing: 0.04em;
color: var(--muted);
pointer-events: none;
}
.wordmark b {
color: var(--accent);
font-weight: 500;
}
.reveal:has(section.title-slide.present) ~ .wordmark,
.reveal:has(section.bare.present) ~ .wordmark {
display: none;
}
/* ---- title slide -------------------------------------------------------------- */
.reveal section.title-slide {
text-align: left;
padding: 0 1.5em;
}
.reveal section.title-slide h1 {
font-size: 2.6em;
margin-bottom: 0.15em;
}
.reveal section.title-slide h3 {
font-weight: 400;
color: var(--accent);
margin-bottom: 1.6em;
}
.reveal section.title-slide .byline {
font-size: 60%;
color: var(--muted);
margin: 0;
}
.reveal section.title-slide .as-path {
display: block;
width: 100%;
max-width: none;
height: 90px;
margin: 0 0 1em;
}
.as-path circle {
fill: var(--ground);
stroke: var(--accent);
stroke-width: 3;
}
.as-path line {
stroke: var(--accent);
stroke-width: 3;
}
.as-path text {
font-family: "IBM Plex Mono", monospace;
font-size: 15px;
fill: var(--muted);
}
.as-path .you circle {
fill: var(--accent);
}
.as-path .you text {
fill: var(--ink-strong);
}
/* ---- print ------------------------------------------------------------------ */
html.print-pdf .wordmark,
html.reveal-print .wordmark {
display: none;
}