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>
430 lines
10 KiB
CSS
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;
|
|
}
|