# PruTAN — Presentations & Docs Design System

Drop-in design system for Reveal.js decks and long-form HTML docs at
**presentations.prutan.com**. One set of tokens, two output formats, zero
CSS to edit once it's set up.

---

## TL;DR for authors

> "I want to make a new deck."

1. Copy `presentations/_template/` to `presentations/<your-deck-name>/`.
2. Open `index.html`. Edit **only** what's between `<body>` and `</body>`.
3. Add one entry to `_manifest.json` at the repo root so the deck shows
   up in the navigator. That's it.
4. Open the file in a browser. Done.

> "I want to publish."

Push the repo. The host (Vercel / Netlify / GitHub Pages / S3) serves it as
static files. No build step.

> "I want a PDF."

Open the deck in Chrome, append `?print-pdf` to the URL, then **Print → Save
as PDF** at A4 landscape. (This is Reveal.js's built-in export.)

---

## Folder structure

```
prutan-presentations/
├── shared/                          ← LOCKED. Don't touch.
│   ├── styles/
│   │   ├── prutan-tokens.css        ← brand source of truth (colors, fonts)
│   │   ├── prutan-deck.css          ← Reveal.js theme + slide patterns
│   │   ├── prutan-deck-nav.css      ← slide-navigator dropdown
│   │   └── prutan-docs.css          ← long-form doc theme
│   ├── scripts/
│   │   └── prutan-deck.js           ← Reveal init + dropdown + logo
│   └── assets/
│       ├── prutan-logo.svg          ← full wordmark
│       └── prutan-mark.svg          ← icon only (watermark)
├── presentations/
│   ├── _template/index.html         ← starter — copy this
│   └── sample/index.html            ← full demo of every pattern
├── docs/sample/index.html           ← doc example
├── index.html                       ← landing page
└── README.md
```

---

## Slide cookbook

Every pattern is in `presentations/sample/index.html`. Open that file and
copy the section you need. Below is the quick reference.

### Title slide

```html
<section class="deck-title-slide">
  <h1>Presentation title</h1>
  <p class="deck-subtitle">One-line framing of the talk</p>
  <div class="deck-meta">Your name · Team · Date</div>
</section>
```

### Section divider (chapter break)

```html
<section class="deck-section-slide">
  <div class="deck-section-number">Part 01</div>
  <h2>Section heading</h2>
  <div class="deck-section-sub">Optional one-liner explaining the section.</div>
</section>
```

### Standard content slide

```html
<section data-eyebrow="Section name">
  <h2>A clear, scannable title</h2>
  <ul>
    <li>One idea per bullet</li>
    <li>Keep it short</li>
    <li>Use <strong>bold</strong> for emphasis sparingly</li>
  </ul>
</section>
```

The `data-eyebrow` attribute renders the small uppercase label above the
heading. No class needed — just the attribute.

### Two-column layout

```html
<section data-eyebrow="Compare">
  <h2>Two-up</h2>
  <div class="deck-grid">
    <div class="deck-card accent">
      <div class="card-title">Option A</div>
      <div class="card-body">…</div>
    </div>
    <div class="deck-card accent-amber">
      <div class="card-title">Option B</div>
      <div class="card-body">…</div>
    </div>
  </div>
</section>
```

### Three-column grid (use `.deck-grid-3` or `.deck-grid-4`)

```html
<div class="deck-grid-3">
  <div class="deck-card accent-teal"><div class="card-title">…</div><div class="card-body">…</div></div>
  <div class="deck-card accent-teal"><div class="card-title">…</div><div class="card-body">…</div></div>
  <div class="deck-card accent-teal"><div class="card-title">…</div><div class="card-body">…</div></div>
</div>
```

### Card accents available

`accent`, `accent-blue`, `accent-teal`, `accent-amber`, `accent-rose`,
`accent-violet`, plus `filled-indigo` (filled background, brand emphasis).

Each accent is a triplet — a stroke color, a pale background tint, and a
deep ink. Add a `<span class="card-tag">…</span>` inside the card to get a
matching colored tag:

```html
<div class="deck-card accent-teal">
  <div class="card-title">…</div>
  <div class="card-body">…</div>
  <span class="card-tag">Read</span>      <!-- teal-tinted tag -->
</div>
```

Use this when slides need to **category-code** content (e.g. all "Read"
operations are teal, all "Write" are amber, all "Diagnose" are rose).
The eye reads stroke + bg + tag as one unit instead of three.

### Focus mode (opt-in)

For complex slides with many cards — landscape diagrams, ecosystem maps,
comparison grids — add `data-deck-focus="hover"` to the grid container.
Hovering one card dims the others.

```html
<div class="deck-grid-3" data-deck-focus="hover">
  <div class="deck-card accent-teal">…</div>
  <div class="deck-card accent-amber">…</div>
  <div class="deck-card accent-rose">…</div>
</div>
```

**When to use:** the deck will be viewed self-paced (shared as URL, read
on a laptop, complex slide that rewards scanning).
**When NOT to use:** live presenter mode with a speaker on stage — the
speaker shouldn't have to avoid hovering the deck. Default is off for
exactly this reason.

The same pattern works in docs — add `data-focus="hover"` to a `.tiles`
or `.flow-grid`.

### Stats / KPIs

```html
<div class="deck-stats">
  <div class="deck-stat">
    <div class="stat-value">6h → 3min</div>
    <div class="stat-label">Cert failure diagnosis</div>
    <div class="stat-sub">Per incident, real data</div>
  </div>
  <!-- repeat -->
</div>
```

### Callouts (four flavors)

```html
<div class="deck-callout"><strong>Note:</strong> …</div>
<div class="deck-callout success"><strong>Win:</strong> …</div>
<div class="deck-callout warning"><strong>Caveat:</strong> …</div>
<div class="deck-callout danger"><strong>Blocker:</strong> …</div>
```

### Code

```html
<pre><code class="language-python">def hello():
    return "world"
</code></pre>
```

Syntax highlighting is automatic via the Reveal highlight plugin
(Monokai theme).

### Quote slide

```html
<section class="deck-quote-slide">
  <div class="deck-quote">
    The quote text in its own voice.
    <span class="quote-attr">Attribution</span>
  </div>
</section>
```

### Vertical sub-slides (drill-down)

```html
<section data-nav-title="Architecture overview">
  <section data-eyebrow="Architecture · Overview"><h2>Three layers</h2>…</section>
  <section data-eyebrow="Architecture · Intelligence"><h2>Intelligence layer</h2>…</section>
  <section data-eyebrow="Architecture · Tenant"><h2>Tenant layer</h2>…</section>
</section>
```

Press **↓** during the deck to drill in. The slide navigator shows them
indented under the parent.

### End / thank-you slide

```html
<section class="deck-end-slide">
  <h1>Thank you</h1>
  <p>Questions?</p>
</section>
```

---

## Slide navigator (the dropdown)

The pill at the **bottom-left** shows `current / total · current slide title`.
Click it to open a panel with two tabs: **Slides** (jump within this deck)
and **Decks** (jump to a different deck in the repo).

**Switch sides** — change the attribute on `.reveal`:

```html
<div class="reveal" data-deck-nav="right">  <!-- bottom-right -->
<div class="reveal" data-deck-nav="left">   <!-- bottom-left (default) -->
<div class="reveal" data-deck-nav="none">   <!-- hide -->
```

**Override what shows in the navigator** for a specific slide:

```html
<section data-nav-title="A shorter title for the nav">
  <h2>The full title that's too long for the nav pill</h2>
</section>
```

If `data-nav-title` isn't set, the navigator falls back to the first
`<h1>/<h2>/<h3>` in the slide.

---

## The presentations manifest

The **Decks** tab in the slide navigator lists every other deck in the
repo. That list comes from `/_manifest.json` at the repo root. **This is
the only file you edit when you add a new deck.**

```json
{
  "presentations": [
    {
      "title": "Q1 Architecture Review",
      "description": "Read-out to the platform team",
      "url": "presentations/q1-arch-review/index.html"
    },
    {
      "title": "Customer Onboarding",
      "description": "Used for design-partner kickoffs",
      "url": "presentations/customer-onboarding/index.html"
    }
  ]
}
```

Each entry needs `title` and `url`. `description` is optional but
recommended. The currently-open deck is marked with a "Here" tag and
isn't clickable.

By default each deck looks for `../../_manifest.json` (which resolves to
the repo root). Override per-deck with `data-deck-manifest="…"` on
`.reveal` if you need a non-standard path.

---

## Logo placement

```html
<div class="reveal" data-deck-logo="right">  <!-- top-right (default) -->
<div class="reveal" data-deck-logo="left">   <!-- top-left -->
<div class="reveal" data-deck-logo="none">   <!-- hide entirely -->
```

The logo auto-swaps to white on dark slides (title, section divider, end).

---

## Brand changes

Open `shared/styles/prutan-tokens.css`. Every value lives there. Change
`--prutan-indigo` and every accent in every deck and doc updates on next
load.

```css
--prutan-navy:        #05387F;
--prutan-indigo:      #6366f1;
--prutan-indigo-deep: #312e81;
```

---

## Long-form docs

For docs (architecture pages, RFCs, internal write-ups), use
`shared/styles/prutan-docs.css` instead of the deck CSS. See
`docs/sample/index.html` for the full pattern set. It's a drop-in
replacement for your existing `style.css` — same classes, now token-driven.

---

## PDF export

1. Open the deck in Chrome.
2. Append `?print-pdf` to the URL: `…/index.html?print-pdf`.
3. **Print → Destination: Save as PDF**.
4. **Layout: Landscape**, **Margins: None**, **Background graphics: ✓**.

---

## Keyboard shortcuts (Reveal.js defaults)

| Key       | Action                          |
| --------- | ------------------------------- |
| `→` / `↓` | Next slide                      |
| `←` / `↑` | Previous slide                  |
| `Space`   | Next                            |
| `F`       | Fullscreen                      |
| `S`       | Open speaker notes window       |
| `Esc`     | Slide overview (Reveal's grid)  |
| `B`       | Black-out screen                |
| `?`       | Show all shortcuts              |

The PruTAN slide navigator (the dropdown) is a labelled alternative to
Reveal's grid overview — easier for non-technical viewers.

---

## Speaker notes

```html
<section>
  <h2>The slide</h2>
  <aside class="notes">
    These notes show in the speaker view (press <strong>S</strong> while presenting).
    Audience never sees them.
  </aside>
</section>
```

---

## Don't touch list

These files are the design system. Edits go through PR review:

- `shared/styles/prutan-tokens.css`
- `shared/styles/prutan-deck.css`
- `shared/styles/prutan-deck-nav.css`
- `shared/styles/prutan-docs.css`
- `shared/scripts/prutan-deck.js`

Everything else (your deck's HTML content) is yours to edit freely.

---

## License

Internal use. PruTAN.
