/* Per-deck overrides. Add deck-specific styles here.
   Theme defaults live in themes/<theme>/<theme>.css.

   ============================================================================
   PROVENANCE: copied wholesale from the WeAreDevelopers deck, 2026-07-09
   ("7 Ways to Fail at Building a Platform"), which is the most evolved blueboy
   deck. Image paths were flattened from slides/images/bio/ to images/ because
   this deck's directory is already called slides/.

   Blocks that belong upstream in blueboy but were never folded back - see that
   deck's BLUEBOY-CHANGES.md: .big-image canvas/svg, .fill-two-col, .on-white,
   the bio slide, and the .auto-fit-y runtime (here in theme-extras.js).

   INHERITED BUT UNUSED - these are DIY-platform-talk layouts, safe to delete
   once this deck's needs are known, kept for now as worked examples of one-off
   slide layouts:
     .ratios-slide       three progressively-indented text groups
     .maturity-slide     alternating dark/light table with auto-fit
     .mb-quote-slide     big pull-quote with a photo bottom-right
     .want-need-slide    two-column want/need list
   ============================================================================ */

/* -----------------------------------------------
   Chart canvases inside .big-image sections. The
   theme rules only target > img; canvases need
   equivalent flex + sizing to fill the slide.
   Footer clearance is handled inside Chart.js via
   layout.padding.bottom so we don't squish the
   title.
   ----------------------------------------------- */
.reveal .slides section.big-image > canvas {
  flex: 1 1 auto;
  min-height: 0;
  max-width: 100%;
  max-height: 100%;
  width: 100%;
  height: 100%;
  display: block;
  margin: 0 auto;
}
/* Inline SVGs in .big-image behave like images. */
.reveal .slides section.big-image > svg {
  flex: 1 1 auto;
  min-height: 0;
  max-width: 100%;
  max-height: 100%;
  width: auto;
  height: auto;
  display: block;
  margin: 0 auto;
}

/* -----------------------------------------------
   Ratios slide (3.5). One-off text layout with
   three progressively-indented groups. Coté's
   source at 960x540; values below scaled x1.333
   to the reveal 1280x720 stage.
   ----------------------------------------------- */
.reveal .slides section.ratios-slide {
  color: #fff;
  font-family: 'Cartridge Bold', 'Cartridge', sans-serif;
  padding: 48px 0 0 69px;
  text-align: left;
  height: 100%;
}
.reveal .slides section.ratios-slide .ratios {
  font-size: 46px;
  font-weight: bold;
  line-height: 1.4;
}
.reveal .slides section.ratios-slide .ratios > div {
  margin-bottom: 35px;
}
.reveal .slides section.ratios-slide .ratios .indent-1 { margin-left: 260px; }
.reveal .slides section.ratios-slide .ratios .indent-2 { margin-left: 540px; }

/* -----------------------------------------------
   .fill-two-col template. Section becomes a flex
   column: title at top, .two-col grows to fill
   remaining vertical space, .slide-footer stays
   pinned at bottom (native theme behavior). Wrap
   the .two-col in .auto-fit-y if content might be
   too tall - the runtime in charts.js will scale
   it down to fit.

   Belongs upstream in blueboy; see
   ../BLUEBOY-CHANGES.md #1.
   ----------------------------------------------- */
.reveal .slides section.fill-two-col {
  display: flex !important;
  flex-direction: column;
  justify-content: flex-start;
  height: 100%;
  padding: 0.2em 0.4em 1.8em;
}
.reveal .slides section.fill-two-col h2 {
  flex: 0 0 auto;
  margin: 0 0 0.4em;
}
.reveal .slides section.fill-two-col .two-col {
  flex: 1 1 auto;
  align-items: flex-start;
  gap: 1em;
  min-height: 0;
  overflow: hidden;
}
.reveal .slides section.fill-two-col .two-col .col {
  flex: 1;
  min-height: 0;
}
.reveal .slides section.fill-two-col .two-col ul {
  font-size: 0.85em;   /* JS shrinks this to fit; see fitFillTwoCol() in charts.js */
  line-height: 1.35;
  margin: 0;
}


/* -----------------------------------------------
   Maturity model table (slide 4.4). Alternating
   dark/light columns, thin white borders, source
   line in the last cell (colspan 3 in the AI row).
   Ported from Coté's slide-12.html; Arial swapped
   to Cartridge Bold per deck-wide font rule.
   Sizes scaled from 960x540 source to 1280x720.
   ----------------------------------------------- */
.reveal .slides section.maturity-slide {
  padding: 12px 16px;
  height: 100%;
  overflow: hidden;
}
.reveal .slides section.maturity-slide .maturity-fit {
  transform-origin: top left;
  width: 100%;
}
.reveal .slides section.maturity-slide .maturity {
  border-collapse: collapse;
  font-family: 'Cartridge Bold', 'Cartridge', sans-serif;
  font-size: 16px;
  color: #fff;
  width: 100%;
  line-height: 1.2;
}
.reveal .slides section.maturity-slide .maturity th,
.reveal .slides section.maturity-slide .maturity td {
  border: 1px solid #fff;
  background: #0091DA;
  padding: 5px 8px;
  text-align: left;
  vertical-align: top;
}
.reveal .slides section.maturity-slide .maturity th {
  font-weight: bold;
}
.reveal .slides section.maturity-slide .maturity .dark {
  background: #006CA3;
}
.reveal .slides section.maturity-slide .maturity .rowlabel {
  border: none;
  background: transparent;
  font-weight: bold;
  width: 14%;
  padding-left: 0;
}
.reveal .slides section.maturity-slide .maturity a {
  color: #fff;
  text-decoration: underline;
}
.reveal .slides section.maturity-slide .maturity .source {
  font-size: 14px;
}

/* -----------------------------------------------
   Mercedes-Benz quote slide (6.2). Big curly quote
   top-left, body quote left-aligned, underlined
   attribution below, Thomas Muller photo bottom-
   right. Positions scaled from the source pptx
   (12,188,825 x 6,858,000 EMU) to the reveal
   1280 x 720 stage.
   ----------------------------------------------- */
.reveal .slides section.mb-quote-slide {
  position: relative;
  height: 100%;
  padding: 0;
  color: #fff;
  text-align: left;
  font-family: 'Cartridge Bold', 'Cartridge', sans-serif;
}
.reveal .slides section.mb-quote-slide .mb-open-quote {
  position: absolute;
  left: 20px;
  top: 40px;
  font-size: 170px;
  line-height: 1;
  color: #fff;
  font-family: 'Cartridge Bold', 'Cartridge', sans-serif;
}
.reveal .slides section.mb-quote-slide .mb-quote {
  position: absolute;
  left: 97px;
  top: 90px;
  width: 700px;
  font-size: 60px;
  line-height: 1.15;
  font-weight: bold;
  color: #fff;
  margin: 0;
}
.reveal .slides section.mb-quote-slide .mb-attrib {
  position: absolute;
  left: 97px;
  bottom: 130px;
  font-size: 28px;
  color: #fff;
  margin: 0;
}
.reveal .slides section.mb-quote-slide .mb-photo {
  position: absolute;
  right: 40px;
  bottom: 0;
  height: 60%;
  width: auto;
  object-fit: contain;
  margin: 0;
  border: 0;
  box-shadow: none;
  background: transparent;
}

/* .on-white marks a slide whose background flips to white. Force text
   (including the .slide-footer citation and any link inside it) to black
   so it stays legible over the white background. */
.reveal .slides section.on-white,
.reveal .slides section.on-white h1,
.reveal .slides section.on-white h2,
.reveal .slides section.on-white h3,
.reveal .slides section.on-white .slide-footer,
.reveal .slides section.on-white .slide-footer a,
.reveal .slides section.on-white .slide-footer em {
  color: #000;
}
.reveal .slides section.on-white .slide-footer a {
  text-decoration: underline;
}

/* -----------------------------------------------
   Bio slide (pptx slide 7, rebuilt).
   Layout ported from Cot&eacute;'s 960x540 design, scaled x1.333 to
   the reveal stage (1280x720).
   ----------------------------------------------- */
.reveal #bio { padding: 0 !important; }
.reveal #bio .slide {
  position: relative;
  width: 1280px;
  height: 720px;
  background: #fff;
  overflow: hidden;
  margin: 0 auto;
  font-family: 'Cartridge', sans-serif;
}
.reveal #bio .slide .photo {
  position: absolute;
  left: 0;
  top: 0;
  width: 411px;
  height: 720px;
  object-fit: cover;
  object-position: top center;
  margin: 0;
  border: 0;
  box-shadow: none;
  background: transparent;
}
.reveal #bio .slide .content {
  position: absolute;
  left: 411px;
  top: 0;
  width: 869px;
  height: 100%;
  padding-top: 157px;
  text-align: center;
}
.reveal #bio .slide h1 {
  font-size: 77px;
  font-weight: 800;
  color: #000;
  font-family: 'Cartridge Bold', 'Cartridge', sans-serif;
  margin: 0;
  text-transform: none;
  text-align: center;
}
.reveal #bio .slide .contact {
  font-size: 33px;
  font-weight: 700;
  margin-top: 11px;
  color: #000;
}
.reveal #bio .slide .contact a { color: #000; text-decoration: none; }
.reveal #bio .slide a { text-decoration: none; color: #000; }
.reveal #bio .slide a:hover,
.reveal #bio .slide a:focus { text-decoration: none; color: #000; }
.reveal #bio .slide .works {
  display: flex;
  align-items: flex-start;
  justify-content: center;
  gap: 17px;
  margin-top: 32px;
}
.reveal #bio .slide .works > * { flex-shrink: 0; }
.reveal #bio .slide .works img.book {
  height: 240px;
  width: auto;
  margin: 0;
  border: 0;
  box-shadow: none;
  background: transparent;
}
.reveal #bio .slide .pods {
  display: flex;
  flex-direction: column;
  gap: 0;
}
.reveal #bio .slide .pods img {
  height: 122px;
  width: 122px;
  margin: 0;
  border: 0;
  box-shadow: none;
  background: transparent;
}
.reveal #bio .slide .catsup {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.reveal #bio .slide .catsup img {
  height: 180px;
  width: 180px;
  margin: 0;
  border: 0;
  box-shadow: none;
  background: transparent;
}
.reveal #bio .slide .catsup span {
  font-size: 21px;
  margin-top: 3px;
  line-height: 1.3;
  color: #000;
  font-family: Arial, Helvetica, sans-serif;
}
.reveal #bio .slide .logos {
  position: absolute;
  left: 411px;
  right: 0;
  bottom: 24px;
  padding: 0 40px;
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.reveal #bio .slide .logos img {
  width: auto;
  margin: 0;
  border: 0;
  box-shadow: none;
  background: transparent;
}
.reveal #bio .slide .logos .lg-redmonk { height: 29px; }
.reveal #bio .slide .logos .lg-dell    { height: 53px; }
.reveal #bio .slide .logos .lg-451     { height: 45px; }
.reveal #bio .slide .logos .lg-sp      { height: 19px; }
.reveal #bio .slide .logos .lg-pivotal { height: 20px; }
.reveal #bio .slide .logos .lg-vmware  { height: 32px; }
.reveal #bio .slide .logos .lg-tanzu   { height: 37px; }
.reveal #bio .slide .lockup-451 {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 3px;
}

/* -----------------------------------------------
   Want / Need slide (6.4). Same .fill-two-col
   template as 6.3, plus per-column h3 label
   ("Want" / "Need (...that you impose)") and a
   subtitle line under the h2.
   ----------------------------------------------- */
.reveal .slides section.fill-two-col.want-need-slide .want-need-sub {
  font-size: 0.5em;
  font-style: italic;
  margin: -0.3em 0 0.4em;
  opacity: 0.9;
}
.reveal .slides section.fill-two-col.want-need-slide .col-label {
  font-size: 0.85em;
  margin: 0 0 0.4em;
  padding: 0.1em 0.5em;
  border-bottom: 2px solid #fff;
  display: inline-block;
}
.reveal .slides section.fill-two-col.want-need-slide .col-label-sub {
  font-size: 0.55em;
  font-weight: normal;
  opacity: 0.9;
  margin-left: 0.25em;
}
.reveal .slides section.fill-two-col.want-need-slide .two-col ul {
  font-size: 0.6em;
  line-height: 1.45;
}
.reveal .slides section.fill-two-col.want-need-slide .two-col ul li {
  margin-bottom: 0.25em;
}

/* ============================================================================
   RIGA-SPECIFIC - new for this talk.
   ============================================================================ */

/* The Goblin Test scorecard. The recurring device: five criteria down the
   side, one column per run (2023 GPT-3.5 / 2025 GPT-4o / 2026 ?). Shown once
   in §1 and again at the close with the third column filled in.
   Wrap in .auto-fit-y if it ever outgrows the slide. */

.reveal .slides section.goblin-test-slide table {
  width: 100%;
  border-collapse: collapse;
  font-family: 'Cartridge Bold', 'Cartridge', sans-serif;
  font-size: 0.62em;
  line-height: 1.3;
  color: #fff;
}
.reveal .slides section.goblin-test-slide th,
.reveal .slides section.goblin-test-slide td {
  border: 1px solid #fff;
  background: #0091DA;
  padding: 0.4em 0.6em;
  text-align: left;
  vertical-align: middle;
}
.reveal .slides section.goblin-test-slide th {
  font-weight: bold;
  white-space: nowrap;
}
.reveal .slides section.goblin-test-slide .dark {
  background: #006CA3;
}
.reveal .slides section.goblin-test-slide .criterion {
  width: 44%;
}
.reveal .slides section.goblin-test-slide .verdict {
  text-align: center;
  font-size: 1.25em;
  white-space: nowrap;
}
/* The unrun column - dim it until the 2026 run happens. */
.reveal .slides section.goblin-test-slide .pending {
  opacity: 0.45;
}

/* ---------------------------------------------------------------
   Code slides. Added 2026-08-17 with the highlight plugin, so the
   NpcPrompt walkthrough is live code rather than a screenshot.
   --------------------------------------------------------------- */
.reveal .slides section.code-slide pre {
  width: 100%;
  margin: 0.4em 0 0.3em;
  box-shadow: none;
  font-size: 0.52em;
}
.reveal .slides section.code-slide pre code {
  padding: 0.9em 1.1em;
  border-radius: 4px;
  max-height: none;
  line-height: 1.35;
  background: #12303f;
}
/* Dim the un-highlighted lines harder than the default so the
   DM branch / player branch contrast reads from the back row. */
.reveal .slides section.code-slide .hljs-ln-line:not(.highlight-line) {
  opacity: 0.35;
}
.reveal .slides section.code-slide .slide-footer {
  margin-top: 0.2em;
}

/* -----------------------------------------------
   Transcript slides (Riga v5, 2026-08-19).

   The two error stories are real ChatGPT transcript
   excerpts, set as type rather than screenshotted,
   so they are legible from the back of the room.
   Verbatim from 2025-03-26-goblin-encounter-in-forest,
   the session run the night before Monki Gras.

   .leak marks the span that is the error itself.
   ----------------------------------------------- */
.reveal .slides section.transcript-slide {
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
}
.reveal .slides section.transcript-slide .transcript {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
  gap: 0.8em;
  text-align: left;
  font-size: 0.88em;
  line-height: 1.44;
  max-width: 1150px;
  margin: 0 auto;
  width: 100%;
}
.reveal .slides section.transcript-slide .turn {
  border-left: 4px solid #c9d2dc;
  padding: 0.05em 0 0.05em 0.75em;
}
.reveal .slides section.transcript-slide .turn.human {
  border-left-color: #0091DA;
}
.reveal .slides section.transcript-slide .who {
  display: block;
  font-size: 0.62em;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  font-weight: 700;
  color: #6b7684;
  margin-bottom: 0.15em;
}
.reveal .slides section.transcript-slide .turn.human .who { color: #0091DA; }
.reveal .slides section.transcript-slide p { margin: 0 0 0.3em; }
.reveal .slides section.transcript-slide p:last-child { margin-bottom: 0; }
.reveal .slides section.transcript-slide .leak {
  background: #ffe2de;
  box-shadow: 0 0 0 3px #ffe2de;
  border-radius: 2px;
  font-weight: 600;
}
/* Monospace for the curly-brace out-of-character channel. Sized just
   above the prose so the two read as the same size on screen. */
.reveal .slides section.transcript-slide .brace {
  font-family: ui-monospace, "SF Mono", Menlo, monospace;
  font-size: 0.62em;
}

/* -----------------------------------------------
   Dice notation table (2.x, "write a skill").
   Deliberately dense - nobody reads it, they just
   see that it is not something you want a language
   model interpreting.
   ----------------------------------------------- */
.reveal .slides section .dice-notation {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.36em;
  line-height: 1.25;
  margin: 0;
}
.reveal .slides section .dice-notation td {
  padding: 0.22em 0.5em 0.22em 0;
  vertical-align: top;
  border-bottom: 1px solid rgba(255,255,255,0.18);
}
.reveal .slides section .dice-notation td:first-child {
  font-family: ui-monospace, "SF Mono", Menlo, monospace;
  font-weight: 700;
  white-space: nowrap;
  width: 42%;
}
.reveal .slides section .dice-notation td:last-child {
  opacity: 0.85;
}
.reveal .slides section p.dice-credit {
  font-size: 0.32em;
  opacity: 0.75;
  margin-top: 0.7em;
  line-height: 1.3;
}

/* A longer listing than the NpcPrompt one - 21 lines instead of 13. */
.reveal .slides section.code-slide.tall pre { font-size: 0.40em; }

/* A quotation set inside a .statement slide, under the sub-line. */
.reveal .slides section .pull-quote-inline {
  font-size: 0.5em;
  font-style: italic;
  opacity: 0.9;
  margin-top: 0.8em;
  line-height: 1.35;
}

/* -----------------------------------------------
   Ruling cards (4.x, the rules lawyer). Real
   entries from elderwood.jsonl, abridged.
   ----------------------------------------------- */
.reveal .slides section .ruling {
  text-align: left;
  border-left: 3px solid rgba(255,255,255,0.45);
  padding-left: 0.7em;
  margin-bottom: 0.85em;
}
.reveal .slides section .ruling span {
  display: block;
  line-height: 1.32;
}
.reveal .slides section .ruling .q {
  font-size: 0.36em;
  font-weight: 700;
  letter-spacing: 0.02em;
  margin-bottom: 0.15em;
}
.reveal .slides section .ruling .a {
  font-size: 0.33em;
  margin-bottom: 0.15em;
}
.reveal .slides section .ruling .why {
  font-size: 0.29em;
  opacity: 0.7;
  font-style: italic;
}

/* -----------------------------------------------
   Footer collision fix, 2026-08-19.

   The theme pins .slide-footer with position:absolute; bottom:0. With
   reveal's center:false the sections are auto-height, so "bottom" is the
   bottom of the CONTENT, not the bottom of the slide - and because the
   footer is out of flow, it lands on top of the last line of text.

   Giving every slide the full stage height makes bottom:0 mean what the
   theme meant by it, and reserving room at the foot keeps long content
   from running under the footer.
   ----------------------------------------------- */
.reveal .slides > section,
.reveal .slides > section > section {
  height: 100%;
  box-sizing: border-box;
}
.reveal .slides section:has(> .slide-footer) {
  padding-bottom: 2.2em;
}

/* -----------------------------------------------
   Column labels. These used to be marked up as
   .slide-footer, which pins to bottom:0 - so two
   of them in a two-col slide landed on top of each
   other and on the real footer. They are headings
   for their column, so they flow like headings.
   ----------------------------------------------- */
.reveal .slides section .col-label {
  font-size: 0.36em;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  opacity: 0.72;
  margin: 0 0 0.5em;
}

/* Images inside the theme's .three-col helper. The helper only sets the
   flex columns; it has no image rule, the way .four-up does. Same job as
   .four-up img - fill the column, cap the height, keep the aspect. */
.reveal .slides .three-col {
  width: 100%;
  gap: 1em;
  align-items: center;
}
.reveal .slides .three-col img {
  width: 100%;
  height: auto;
  max-height: 100%;
  object-fit: contain;
  display: block;
  margin: 0 auto;
}

/* Venue link on the cover. White in every state - a visited-purple link
   on the title slide would be a bad look. */
.reveal .slides section .venue-link,
.reveal .slides section .venue-link:link,
.reveal .slides section .venue-link:visited,
.reveal .slides section .venue-link:hover,
.reveal .slides section .venue-link:active {
  color: #fff;
  text-decoration: underline;
}

/* -----------------------------------------------
   The pointing hand on the tavern slide.

   The background is data-background-size:contain on a 1280x720 stage, and
   the engraving is 3:2 - so it fills the height and sits between x=100 and
   x=1180. The hooded figure is at roughly 78% across, 33% down, which is
   x=942, y=238 in stage coordinates. The hand is placed so its fingertip
   lands just short of him.

   It travels in from the left on the first fragment rather than fading,
   because the point is the gesture.
   ----------------------------------------------- */
.reveal .slides section img.tavern-hand {
  position: absolute;
  left: 574px;
  top: 204px;
  width: 360px;
  height: auto;
  margin: 0;
  border: none;
  box-shadow: none;
  background: none;
  max-width: none;
  max-height: none;
  pointer-events: none;
  transform: translate(-300px, -70px);
  transition: transform 900ms cubic-bezier(.22,.75,.3,1), opacity 300ms ease;
}
.reveal .slides section img.tavern-hand.visible {
  transform: translate(0, 0);
}

/* -----------------------------------------------
   Corner art: a figure pinned to the lower right
   of a slide with a generous margin, so the text
   column keeps the left two thirds to itself.
   ----------------------------------------------- */
.reveal .slides section.has-corner-art img.corner-art {
  position: absolute;
  right: 70px;
  bottom: 60px;
  width: 300px;
  height: auto;
  margin: 0;
  border: none;
  box-shadow: none;
  background: none;
  max-width: none;
  max-height: none;
}

/* -----------------------------------------------
   The prompt wall (5.3). Every word of the current
   setup, at a size nobody can read, in a box that
   scrolls so Cote can drag through it on stage.

   Not auto-fitted - auto-fit only ever scales DOWN,
   which fought the fill. The stage is always
   1280x720 and reveal scales it uniformly, so a
   fixed px size never reflows.

   Scroll with the trackpad or wheel over the text.
   Arrow keys still belong to reveal.
   ----------------------------------------------- */
.reveal .slides section.prompt-wall-slide.scroll {
  padding: 10px !important;
  height: 100%;
  display: flex !important;
  flex-direction: column;
  justify-content: flex-start;
}
.reveal .slides section.prompt-wall-slide.scroll .prompt-scroll {
  flex: 1 1 auto;
  width: 100%;
  min-height: 0;
  overflow-y: auto;
  overflow-x: hidden;
  scrollbar-width: thin;
  scrollbar-color: rgba(255,255,255,0.45) transparent;
}
.reveal .slides section.prompt-wall-slide.scroll .prompt-scroll::-webkit-scrollbar {
  width: 6px;
}
.reveal .slides section.prompt-wall-slide.scroll .prompt-scroll::-webkit-scrollbar-thumb {
  background: rgba(255,255,255,0.45);
  border-radius: 3px;
}
.reveal .slides section.prompt-wall-slide.scroll pre.prompt-wall {
  display: block;
  width: 100%;
  margin: 0;
  padding: 0;
  background: none;
  box-shadow: none;
  border: none;
  color: #fff;
  font-family: 'Cartridge', sans-serif;
  /* pre-wrap, so the markdown keeps its own line breaks and reads as a
     file rather than as one paragraph. It is far taller than the slide -
     that is what the scroll is for. */
  white-space: pre-wrap;
  word-break: break-word;
  font-size: 15px;
  line-height: 1.34;
  text-align: left;
  opacity: 0.95;
}
.reveal .slides section.prompt-wall-slide.scroll .pw-file {
  display: block;
  font-weight: 700;
  opacity: 0.75;
  margin: 1.2em 0 0.3em;
}
.reveal .slides section.prompt-wall-slide.scroll .pw-file:first-child {
  margin-top: 0;
}


/* Numbered problem list. The theme replaces list markers with hyphens
   globally, so an <ol> needs its numbers put back. */
.reveal .slides section ol.problems {
  list-style: decimal;
  padding-left: 1.4em;
  font-size: 0.62em;
  line-height: 1.5;
}
.reveal .slides section ol.problems li::before { content: '' !important; }
.reveal .slides section ol.problems li { margin-bottom: 0.45em; }

/* -----------------------------------------------
   RESTORED 2026-08-19. These three blocks were
   collateral damage when the prompt-wall rules were
   cut out by a too-greedy range delete. Verified
   against the slides that use them.
   ----------------------------------------------- */

/* A .corner-art wrapped in a link still pins to the corner. */
.reveal .slides section.has-corner-art a.corner-art-link {
  position: absolute;
  right: 70px;
  bottom: 60px;
  line-height: 0;
}
.reveal .slides section.has-corner-art a.corner-art-link img.corner-art {
  position: static;
  right: auto;
  bottom: auto;
  width: 220px;
}

/* Corner "logo" that is actually a filename. Same pin as .corner-art. */
.reveal .slides section.has-corner-art code.corner-string {
  position: absolute;
  right: 70px;
  bottom: 55px;
  width: auto;
  font-family: ui-monospace, "SF Mono", Menlo, monospace;
  font-size: 0.34em;
  color: #fff;
  background: rgba(0,0,0,0.22);
  border-radius: 4px;
  padding: 0.5em 0.8em;
  letter-spacing: 0.01em;
}

/* The requirements slide: one paragraph, big, with highlighter over the
   phrases that turn out to be an agent spec. From slide 12 of the Oct
   2025 deck. */
.reveal .slides section.requirements-slide {
  height: 100%;
  display: flex !important;
  flex-direction: column;
  justify-content: center;
}
.reveal .slides section.requirements-slide p {
  font-size: 0.9em;
  line-height: 1.95;
  text-align: left;
  margin: 0;
  width: 100%;
}
.reveal .slides section.requirements-slide mark {
  background: #FFE000;
  color: #000;
  font-weight: 700;
  padding: 0.06em 0.1em;
  box-decoration-break: clone;
  -webkit-box-decoration-break: clone;
}

/* The 404 Media mark sits a little larger than the MCP one. */
.reveal .slides section.quote-slide a.corner-art-link img.corner-art { width: 250px; }

/* Highlighter inside a quote slide, same yellow as the requirements
   slide but on a smaller face. */
.reveal .slides section.quote-slide blockquote mark {
  background: #FFE000;
  color: #000;
  font-weight: 700;
  padding: 0.04em 0.08em;
  box-decoration-break: clone;
  -webkit-box-decoration-break: clone;
}

/* Dagger footnote marker. */
.reveal .slides section sup.fn {
  font-size: 0.45em;
  vertical-align: super;
  opacity: 0.85;
}

/* -----------------------------------------------
   Quote slide, restored 2026-08-19. The layout half
   of this block was lost in the same greedy range
   delete that took .corner-art-link; only the mark
   and logo-width rules survived, so the blockquote
   was falling back to reveal's default box and
   sitting at the top of the slide.

   Vertically centred, per Cote.
   ----------------------------------------------- */
.reveal .slides section.quote-slide {
  height: 100%;
  display: flex !important;
  flex-direction: column;
  justify-content: center;
  align-items: flex-start;
}
.reveal .slides section.quote-slide blockquote {
  width: 88%;
  margin: 0 0 0.7em;
  padding: 0 0 0 0.7em;
  border-left: 5px solid rgba(255,255,255,0.5);
  background: none;
  box-shadow: none;
  font-size: 0.6em;
  line-height: 1.5;
  text-align: left;
  font-style: normal;
  quotes: none;
}
.reveal .slides section.quote-slide .attribution {
  font-size: 0.42em;
  opacity: 0.9;
  text-align: left;
  margin: 0;
}
.reveal .slides section.quote-slide .attribution a {
  color: #fff;
  text-decoration: underline;
}


/* -----------------------------------------------
   Untitled fill slides centre vertically (6.2, 8.3).

   .fill-two-col is justify-content: flex-start so a
   heading pins to the top and the columns grow under
   it. On a slide with no <h2> there is nothing to pin,
   so the content sat high with dead space beneath.
   .fill-one-col had no rules at all and fell back to
   the theme default, same symptom.

   Scoped with :not(:has(h2)) so this touches ONLY the
   untitled ones - the ten titled fill slides keep the
   top-aligned behaviour they were designed for.
   ----------------------------------------------- */
.reveal .slides section.fill-two-col:not(:has(h2)),
.reveal .slides section.fill-one-col:not(:has(h2)) {
  display: flex !important;
  flex-direction: column;
  justify-content: center;
  height: 100%;
}
.reveal .slides section.fill-one-col:not(:has(h2)) > ul {
  margin: 0;
}


/* -----------------------------------------------
   Fill-slide headings match .statement headings.

   blueboy sets .statement h2 to 2em; everything else
   falls through to the theme default of 1.1em, so a
   .fill-one-col / .fill-two-col title came out about
   half the size of "The cobbler" next door.

   Same wrapping properties as .statement, so a long
   title breaks onto two lines instead of overflowing.
   Loaded after blueboy.css, so equal specificity wins.
   ----------------------------------------------- */
.reveal .slides section.fill-one-col h2,
.reveal .slides section.fill-two-col h2 {
  font-size: 2em;
  margin: 0 0 0.3em;
  white-space: normal;
  word-wrap: break-word;
  overflow-wrap: break-word;
  max-width: 95%;
}


/* -----------------------------------------------
   Good / bad build lists (8.4, 8.5).

   One <ul class="pro-con fragment"> so the whole
   list arrives on a single press, not item by item.
   ----------------------------------------------- */
.reveal .slides section ul.pro-con {
  list-style: none;
  padding-left: 0;
  margin: 0.2em 0 0;
  font-size: 0.62em;
  line-height: 1.5;
}
.reveal .slides section ul.pro-con li {
  margin-bottom: 0.3em;
}
.reveal .slides section ul.pro-con li::before { content: '' !important; }
.reveal .slides section ul.pro-con .pro,
.reveal .slides section ul.pro-con .con {
  display: inline-block;
  min-width: 3.4em;
  margin-right: 0.5em;
  font-weight: 700;
}
.reveal .slides section ul.pro-con .pro { color: #7ee08a; }
.reveal .slides section ul.pro-con .con { color: #ffb3a7; }

/* The .zip filename as a slide title (8.5). */
.reveal .slides section h2 code.zip-title {
  font-family: 'Courier New', Courier, monospace;
  font-size: 0.62em;
  background: none;
  padding: 0;
  color: inherit;
  word-break: break-all;
}
.reveal .slides section p.zip-subtitle {
  margin: -0.2em 0 0.5em;
  opacity: 0.8;
}

/* -----------------------------------------------
   ol.problems was sized 0.62em for the old two-column
   slide. On a full-width fill slide (8.2) that made it
   noticeably smaller than the identical list on slide 6,
   so match the plain <ul> scale there.
   ----------------------------------------------- */
.reveal .slides section.fill-one-col > ol.problems {
  /* No font-size here: this selector outranks the fill-one-col template rule,
     so setting one silently pins the slide at the old size. Padding only. */
  padding-left: 1.2em;
}


/* -----------------------------------------------
   Slide 8.3, the Sophie's Dice notation on its own
   slide. Base .dice-notation is 0.36em at full width
   because it used to share a two-column slide. Alone
   it can be twice the size and two-thirds the width,
   which also keeps it clear of the dice corner art.
   ----------------------------------------------- */
.reveal .slides section.fill-one-col > table.dice-notation {
  font-size: 0.72em;
  width: 66%;
}
.reveal .slides section.fill-one-col > table.dice-notation td:first-child {
  width: 38%;
}
.reveal .slides section.fill-one-col > p.dice-credit {
  font-size: 0.42em;
}


/* -----------------------------------------------
   A secondary line under a .statement's point (8.6).
   Referenced by an older comment in this file but
   never actually defined, so it rendered as a plain
   paragraph.
   ----------------------------------------------- */
.reveal .slides section.statement p.sub-line {
  margin-top: 0.6em;
  opacity: 0.85;
  max-width: 92%;
}


/* -----------------------------------------------
   A tall corner figure (the suited goblin, 9.2).
   The base .corner-art is width-constrained at 300px,
   which on a 1600x3500 portrait image would be 656px
   tall. Constrain the height instead.
   ----------------------------------------------- */
.reveal .slides section.has-corner-art img.corner-art.figure {
  width: auto;
  height: 470px;
  right: 60px;
  bottom: 40px;
}

/* Parenthetical gloss inside a list item, e.g. "(memories)". */
.reveal .slides section .aside-note {
  opacity: 0.7;
}

/* -----------------------------------------------
   Left-align the good/bad lists with the heading.

   reveal's stock rule is
     .reveal ul { display: inline-block; margin: 0 0 0 1em; }
   so a list sits an em to the right of the h2 above it
   and, being inline-block, can centre inside its parent.
   Kill both so the first character lines up with the
   first character of the title.
   ----------------------------------------------- */
.reveal .slides section ul.pro-con {
  display: block;
  margin-left: 0;
  padding-left: 0;
  text-align: left;
}
.reveal .slides section.statement ul.pro-con,
.reveal .slides section.fill-one-col ul.pro-con {
  align-self: flex-start;
}


/* -----------------------------------------------
   Two-option decision list (8.6, "MCP or Skill?").
   Term on its own line, definition indented under it.
   ----------------------------------------------- */
.reveal .slides section dl.choice {
  margin: 0.3em 0 0;
  text-align: left;
  font-size: 0.62em;
  line-height: 1.45;
}
.reveal .slides section dl.choice dt {
  font-weight: 700;
  margin-top: 0.9em;
}
.reveal .slides section dl.choice dt:first-child {
  margin-top: 0;
}
.reveal .slides section dl.choice dd {
  margin: 0.15em 0 0;
  padding-left: 0;
  opacity: 0.9;
}


/* -----------------------------------------------
   Body text default, raised to match the dice table
   on 8.3.

   blueboy sets `section p { font-size: 0.6em }` and the
   lists inherit the theme's own small sizes, which reads
   too small from the back of a room. 0.72em is the size
   the 8.3 notation table was set to and it is the right
   floor for everything.

   Set on the block elements only - p, ul, ol, dl - never
   on li, or a nested list would compound to 0.52em.
   ----------------------------------------------- */
.reveal .slides section p,
.reveal .slides section ul,
.reveal .slides section ol,
.reveal .slides section dl {
  font-size: 0.72em;
}

/* The custom lists carried their own smaller sizes; fold
   them into the new default so nothing is out of step. */
.reveal .slides section ul.pro-con,
.reveal .slides section dl.choice,
.reveal .slides section ol.problems {
  font-size: 0.72em;
}

/* Deliberately still small: credits, footers, attributions. */
.reveal .slides section p.slide-footer,
.reveal .slides section p.dice-credit,
.reveal .slides section p.attribution,
.reveal .slides section p.zip-subtitle {
  font-size: 0.42em;
}


/* -----------------------------------------------
   Kill the theme's hanging-hyphen indent on the
   good/bad and choice lists.

   blueboy does:
     .reveal ul li { padding-left: 0.7em; text-indent: -0.7em; }
     .reveal ul li::before { content: '- '; }
   which hangs the hyphen into the margin. These lists
   have no hyphen (::before is blanked), so the leftover
   padding and negative indent just push the first
   character off the heading's left edge.
   ----------------------------------------------- */
.reveal .slides section ul.pro-con li,
.reveal .slides section dl.choice dt,
.reveal .slides section dl.choice dd {
  padding-left: 0;
  text-indent: 0;
  margin-left: 0;
}


/* The verbatim cobbler line on 9.1. */
.reveal .slides section blockquote.cobbler-quote {
  font-size: 0.62em;
  line-height: 1.4;
  font-style: normal;
  /* Clear of the 300px corner art bottom-right. */
  width: 66%;
  margin: 0.4em 0 0;
  padding: 0;
  background: none;
  box-shadow: none;
  text-align: left;
}


/* -----------------------------------------------
   The Accenture quote (slide 2, straight after the cover).

   Base .quote-slide blockquote is 0.6em. 1em is about
   as large as 348 characters can go on a 1280x720 stage
   - roughly seven lines. 3x (1.8em) needed twelve lines
   and about double the slide height.

   The markup is wrapped in .auto-fit-y, so the runtime
   in theme-extras.js scales it down if it ever does
   overflow - a longer quote, a different projector
   aspect, a bigger base font.
   ----------------------------------------------- */
.reveal .slides section.quote-slide blockquote {
  font-size: 1em;
}
.reveal .slides section.quote-slide .auto-fit-y {
  width: 100%;
}


/* -----------------------------------------------
   Diagram slide titles align left (9.3, 10.5, 10.6, 11.4).

   .big-image is a centred flex column, so the h2 was
   centring with the image. Only the heading moves -
   the image stays centred.
   ----------------------------------------------- */
.reveal .slides section.big-image > h2 {
  align-self: flex-start;
  text-align: left;
  margin-left: 0;
}


/* The coding gnome on 10.2 reads too small at the standard 300px. */
.reveal .slides section.fill-one-col img.corner-art[src$="gnome-coding.png"] {
  width: 450px;
}


/* -----------------------------------------------
   6.2 - the charging gnome, alone and centred.
   .big-image already centres its child; without a
   title the image can take most of the slide.
   ----------------------------------------------- */
.reveal .slides section.big-image > img[src$="gnome-adventurer.png"] {
  max-height: 88%;
  max-width: 88%;
}


/* -----------------------------------------------
   10.4 - ten requirements beside the gnome.
   Wide text column, narrow image column.
   ----------------------------------------------- */
.reveal .slides section.req-slide .two-col {
  align-items: stretch;
  gap: 1.2em;
}
.reveal .slides section.req-slide .col.wide  { flex: 5 1 0; min-width: 0; }
/* Anchor him into the bottom-right corner instead of centring him in the
   column - that frees the upper right for the second list column and lets
   the type grow. */
.reveal .slides section.req-slide .col.narrow{ flex: 1 1 0; min-width: 0; display: flex;
                                               align-items: flex-end; justify-content: flex-end; }
.reveal .slides section.req-slide .col.narrow img {
  max-width: 130%;
  max-height: 100%;
  width: auto;
  height: auto;
  object-fit: contain;
  margin: 0;
  border: none;
  box-shadow: none;
  background: none;
}
.reveal .slides section.req-slide ol.reqs {
  font-size: 1em;
  line-height: 1.4;
  margin: 0;
  /* Markers were rendering in the padding box and clipping off the left edge
     of the slide. Inside positioning puts them in the content flow, where
     nothing can crop them - and it is also what lets the list break into
     columns without the numbers hanging into the gutter. */
  list-style: decimal inside;
  padding-left: 0.2em;
  column-count: 2;
  column-gap: 1.6em;
}
.reveal .slides section.req-slide ol.reqs li {
  break-inside: avoid;
  -webkit-column-break-inside: avoid;
}
.reveal .slides section.req-slide ol.reqs li {
  margin-bottom: 0.18em;
  padding-left: 0;
  text-indent: 0;
}
.reveal .slides section.req-slide ol.reqs li::before { content: '' !important; }


/* -----------------------------------------------
   Title slide typography, moved out of inline
   style= attributes on the markup.
   ----------------------------------------------- */
.reveal .slides section.title-slide h2.rough-title {
  /* Same size as a .statement heading, so the cover lands with the same
     weight as the statements it sets up. */
  font-size: 2em;
  line-height: 1.12;
  margin-bottom: 0.1em;
}
.reveal .slides section.title-slide p.subtitle {
  /* Same effective size as the .quote-slide blockquote (1em). */
  font-size: 1em;
  color: #fff;
  margin-top: 0.1em;
}
.reveal .slides section.title-slide p.presenter {
  font-size: 1em;
}
.reveal .slides section.title-slide p.venue {
  font-size: 0.38em;
  color: #fff;
}


/* -----------------------------------------------
   8.6 - each point on its own line under its term.
   ----------------------------------------------- */
.reveal .slides section dl.choice dd ul {
  display: block;
  margin: 0.1em 0 0;
  padding-left: 0;
  font-size: 1em;
  list-style: none;
}
.reveal .slides section dl.choice dd ul li {
  padding-left: 0.8em;
  text-indent: -0.8em;
  margin-bottom: 0.08em;
}
.reveal .slides section dl.choice dd ul li::before {
  content: '- ';
}


/* -----------------------------------------------
   8.6 - Skill and MCP side by side. The columns stop
   short of the signpost gnome bottom-right rather
   than running under him.
   ----------------------------------------------- */
.reveal .slides section.choice-slide .two-col {
  width: 80%;
  gap: 1.6em;
}
.reveal .slides section.choice-slide .col-label,
.reveal .slides section.choice-slide .col-qual {
  font-size: 0.8em;
  font-weight: 700;
  opacity: 1;
  color: #fff;
}
.reveal .slides section.choice-slide .col-label { margin: 0 0 0.15em; }
.reveal .slides section.choice-slide .col-qual  { margin: 0; opacity: 0.72; }
.reveal .slides section.choice-slide .two-col ul {
  font-size: 0.95em;
  line-height: 1.35;
  margin: 0;
}
.reveal .slides section.choice-slide .slide-footer {
  max-width: 68%;
}

/* -----------------------------------------------
   8.6 - the enterprise / human qualifier sits at the
   foot of each column. The columns stretch to equal
   height and the lists grow, so both qualifiers land
   on the same line however many bullets each has.
   ----------------------------------------------- */



/* -----------------------------------------------
   fill-one-col body text.

   These slides carry a heading and one short list, so
   the deck-wide 0.72em body size leaves them looking
   thin from the back of the room. 1.5em is roughly
   three quarters of the 2em heading.

   Add .dense to a fill-one-col section to opt out
   where the list is longer than a few short lines.
   ----------------------------------------------- */
.reveal .slides section.fill-one-col > ul,
.reveal .slides section.fill-one-col > ol {
  font-size: 1.5em;
  line-height: 1.35;
}
/* .dense opts a slide out - 8.5 carries seven longer good/bad lines and
   does not survive the larger size. */
.reveal .slides section.fill-one-col.dense > ul,
.reveal .slides section.fill-one-col.dense > ol {
  font-size: 0.72em;
  line-height: 1.5;
}


/* 8.6 - the signpost gnome gives way to the text. */
.reveal .slides section.choice-slide img.corner-art.figure {
  height: 300px;
  right: 30px;
  bottom: 24px;
}


/* -----------------------------------------------
   A .statement heading whose first line must not
   wrap (11.1). At 2em "AI ROI is defined by the
   human," runs past the 95% max-width and breaks in
   the wrong place, which fights the deliberate <br>.
   ----------------------------------------------- */
.reveal .slides section.statement h2.fit-line {
  font-size: 1.94em;
  max-width: 100%;
  line-height: 1.12;
  margin-top: -0.4em;
  /* Buy back the width the larger size needs, so the first line still fits
     on one line rather than breaking where the <br> did not ask it to. */
  letter-spacing: -0.012em;
}
.reveal .slides section.statement:has(h2.fit-line) {
  padding-left: 0;
  padding-right: 0;
}

/* -----------------------------------------------
   A multi-paragraph pull quote (2.1). The base
   blockquote holds raw text, so p needs its own
   spacing to read as separate statements.
   ----------------------------------------------- */
.reveal .slides section.quote-slide blockquote p {
  margin: 0 0 0.7em 0;
}
.reveal .slides section.quote-slide blockquote p:last-child {
  margin-bottom: 0;
}

/* -----------------------------------------------
   .quote-xl - a short pull quote set large enough
   to fill the slide. The base 1em is tuned for the
   ~350-character Accenture quote; a quote half that
   length at the same size looks stranded. auto-fit-y
   still catches it if it ever overflows.
   ----------------------------------------------- */
.reveal .slides section.quote-slide.quote-xl blockquote {
  font-size: 1.8em;
}
.reveal .slides section.quote-slide.quote-xl .attribution {
  font-size: 0.5em;
}

/* -----------------------------------------------
   A statement slide with supporting evidence under
   it (12.1). The h2 stays the thing you read; the
   quote is small enough to be obviously secondary
   but still legible from the back.
   ----------------------------------------------- */
.reveal .slides section.statement.has-under-quote blockquote.under-quote {
  width: 88%;
  margin: 0.5em 0 0.5em;
  padding: 0 0 0 0.6em;
  border-left: 5px solid rgba(255,255,255,0.5);
  background: none;
  box-shadow: none;
  font-size: 0.625em;
  line-height: 1.45;
  text-align: left;
  font-style: normal;
  quotes: none;
}
.reveal .slides section.statement.has-under-quote .under-attribution {
  font-size: 0.425em;
  opacity: 0.9;
  text-align: left;
  margin: 0;
  line-height: 1.4;
}
.reveal .slides section.statement.has-under-quote .under-attribution a {
  color: #fff;
  text-decoration: underline;
}
