portable-agent-layer 0.28.1 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/skills/presentation/README.md +21 -0
- package/assets/skills/presentation/SKILL.md +172 -0
- package/assets/skills/presentation/demo/slides/001-title.md +5 -0
- package/assets/skills/presentation/demo/slides/002-agenda.md +13 -0
- package/assets/skills/presentation/demo/slides/003-section-text-heavy.md +3 -0
- package/assets/skills/presentation/demo/slides/004-content.md +12 -0
- package/assets/skills/presentation/demo/slides/005-two-column.md +22 -0
- package/assets/skills/presentation/demo/slides/006-quote.md +4 -0
- package/assets/skills/presentation/demo/slides/007-section-structured.md +3 -0
- package/assets/skills/presentation/demo/slides/008-table.md +11 -0
- package/assets/skills/presentation/demo/slides/009-comparison.md +25 -0
- package/assets/skills/presentation/demo/slides/010-image-text.md +20 -0
- package/assets/skills/presentation/demo/slides/011-code.md +19 -0
- package/assets/skills/presentation/demo/slides/012-closing.md +5 -0
- package/assets/skills/presentation/template/README.md +15 -0
- package/assets/skills/presentation/template/slides/001-title.md +5 -0
- package/assets/skills/presentation/template/slides/002-content.md +6 -0
- package/assets/skills/presentation/template/slides/003-closing.md +3 -0
- package/assets/skills/presentation/theme-base/base.css +167 -0
- package/assets/skills/presentation/theme-base/layouts.css +216 -0
- package/assets/skills/presentation/theme-base/skeleton.html +53 -0
- package/assets/skills/presentation/tools/build.ts +160 -0
- package/assets/skills/presentation/tools/lib/inline.ts +35 -0
- package/assets/skills/presentation/tools/lib/paths.ts +16 -0
- package/assets/skills/presentation/tools/lib/registry.ts +59 -0
- package/assets/skills/presentation/tools/list-templates.ts +21 -0
- package/assets/skills/presentation/tools/new-deck.ts +101 -0
- package/assets/skills/presentation/tools/present.ts +70 -0
- package/assets/skills/presentation/tools/setup-template.ts +351 -0
- package/assets/skills/presentation/vendor/reveal/plugin/highlight/highlight.js +5 -0
- package/assets/skills/presentation/vendor/reveal/plugin/highlight/monokai.css +71 -0
- package/assets/skills/presentation/vendor/reveal/plugin/markdown/markdown.js +7 -0
- package/assets/skills/presentation/vendor/reveal/plugin/notes/notes.js +1 -0
- package/assets/skills/presentation/vendor/reveal/reveal.css +8 -0
- package/assets/skills/presentation/vendor/reveal/reveal.js +9 -0
- package/assets/templates/settings.claude.json +20 -0
- package/package.json +1 -1
- package/src/hooks/CompactRecover.ts +105 -0
- package/src/hooks/PreCompactPersist.ts +86 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# presentation
|
|
2
|
+
|
|
3
|
+
PAL skill for building branded HTML presentations from markdown using Reveal.js. Multi-template (one user can register multiple brands), single self-contained HTML output, brand-neutral engine.
|
|
4
|
+
|
|
5
|
+
See `SKILL.md` for the full workflow. TL;DR:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# one-time per brand
|
|
9
|
+
bun ~/.pal/skills/presentation/tools/setup-template.ts
|
|
10
|
+
|
|
11
|
+
# per deck
|
|
12
|
+
bun ~/.pal/skills/presentation/tools/new-deck.ts ~/decks/my-talk --template my-brand
|
|
13
|
+
$EDITOR ~/decks/my-talk/content.md
|
|
14
|
+
bun ~/.pal/skills/presentation/tools/present.ts ~/decks/my-talk
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Layouts: title, section, content, two-column, image-text, quote, closing, agenda, table, comparison, code.
|
|
18
|
+
|
|
19
|
+
PDF export (v1.1): use the browser's print-to-PDF (`Cmd+P` in the open deck) — Reveal supports `?print-pdf` query mode for clean page breaks. Standalone PDF tooling (decktape) deferred until requested.
|
|
20
|
+
|
|
21
|
+
PPTX import (v2): not yet supported.
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: presentation
|
|
3
|
+
description: Build branded HTML presentations from markdown using Reveal.js. Multi-template registry per user (each template = brand color, logo, fonts, footer, aspect). Per-deck workflow: scaffold → edit one markdown file per slide in slides/ → build → present. Output: single self-contained HTML. Use when creating slide decks, talks, workshop slides, lectures, or pitch decks.
|
|
4
|
+
argument-hint: <deck-dir> to build, OR `setup-template` to add a brand template, OR `new <deck-dir> --template <name>` to scaffold a deck, OR `list-templates`, OR `present <deck-dir>`
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Renders a deck folder (markdown + config) to a single self-contained HTML presentation using Reveal.js, themed by one of the user's registered brand templates. Decks stay in plain markdown for git-friendliness; templates own brand identity (color, logo, fonts, footer); the skill itself is brand-neutral.
|
|
10
|
+
|
|
11
|
+
**Three-layer separation:**
|
|
12
|
+
|
|
13
|
+
1. **Skill** (this folder) — brand-neutral engine: Reveal.js vendored offline, base CSS, 11 layout components, build pipeline.
|
|
14
|
+
2. **Templates** — user-owned brand assets at `~/.pal-data/presentation-templates/<name>/` (override-able). Registered in `~/.pal-data/presentation-templates/registry.json`. Multi-template — one user can have several brands.
|
|
15
|
+
3. **Decks** — one folder per presentation, anywhere in user's filesystem. Contains `slides.config.yml`, a `slides/` folder of one-markdown-file-per-slide, `assets/`.
|
|
16
|
+
|
|
17
|
+
## Workflow
|
|
18
|
+
|
|
19
|
+
### Step 0 (one-time per brand): Set up a template
|
|
20
|
+
|
|
21
|
+
Interactive:
|
|
22
|
+
```bash
|
|
23
|
+
bun ~/.pal/skills/presentation/tools/setup-template.ts
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Walks through 9 fields: name, storage path, logo file, primary color, accent color, footer text, logo placement, fonts, aspect ratio. Optional: generate a showcase deck demonstrating every layout.
|
|
27
|
+
|
|
28
|
+
Non-interactive (Claude can drive it):
|
|
29
|
+
```bash
|
|
30
|
+
bun ~/.pal/skills/presentation/tools/setup-template.ts \
|
|
31
|
+
--name <slug> \
|
|
32
|
+
--logo <abs-path-to-logo.svg> \
|
|
33
|
+
--primary "#0E1335" \
|
|
34
|
+
[--accent "#FFB84D"] \
|
|
35
|
+
[--footer "Konvert7 · 2026"] \
|
|
36
|
+
[--logo-placement "footer"] \
|
|
37
|
+
[--fonts "system"] \
|
|
38
|
+
[--aspect "16:9"] \
|
|
39
|
+
[--showcase] \
|
|
40
|
+
[--yes]
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Defaults if omitted: accent = derived complementary of primary; logo-placement = footer; fonts = system; aspect = 16:9.
|
|
44
|
+
|
|
45
|
+
### Step 1: Scaffold a deck
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
bun ~/.pal/skills/presentation/tools/new-deck.ts <deck-dir> --template <name> [--title "Deck title"]
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
If `--template` is omitted and only one template is registered, that one is used. If multiple are registered, the command lists them and exits. Adds `--showcase` to scaffold a demo deck with every layout exercised.
|
|
52
|
+
|
|
53
|
+
### Step 2: Author content
|
|
54
|
+
|
|
55
|
+
Each slide is its own markdown file under `<deck-dir>/slides/`. Files are concatenated at build time in filename order (`001.md`, `002.md`, `003-foo.md`, …) — use leading zeros so sort order is stable. **Do not put `---` separators inside slide files** — the separator is added between files at build time.
|
|
56
|
+
|
|
57
|
+
Authoring this way means: a malformed edit only takes down its own slide, slides can be reordered by renaming, and parallel writes don't conflict.
|
|
58
|
+
|
|
59
|
+
Per-slide conventions (inside each file):
|
|
60
|
+
- Speaker notes: lines starting with `Note:`.
|
|
61
|
+
- Layout directive: `<!-- .slide: data-layout="..." -->` at the top.
|
|
62
|
+
- See "Layouts" below for the available layout names.
|
|
63
|
+
|
|
64
|
+
Backwards compatible: if `slides/` doesn't exist, the build falls back to a single `<deck-dir>/content.md` with `---` separators between slides.
|
|
65
|
+
|
|
66
|
+
### Step 3: Build
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
bun ~/.pal/skills/presentation/tools/build.ts <deck-dir>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Produces `<deck-dir>/dist/index.html` — a single self-contained HTML file (CSS, JS, fonts, logo all inlined). Email it, USB-stick it, host it anywhere.
|
|
73
|
+
|
|
74
|
+
### Step 4: Present
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
bun ~/.pal/skills/presentation/tools/present.ts <deck-dir>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Builds (if missing or stale) and opens in the default browser. `F` = fullscreen, `S` = speaker notes window, `?` = keyboard shortcuts.
|
|
81
|
+
|
|
82
|
+
## Deck folder layout
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
<deck-dir>/
|
|
86
|
+
├── slides.config.yml # template name, deck title, language, aspect override
|
|
87
|
+
├── slides/ # one markdown file per slide; concatenated at build time
|
|
88
|
+
│ ├── 001.md
|
|
89
|
+
│ ├── 002.md
|
|
90
|
+
│ └── …
|
|
91
|
+
├── overrides.css # optional — per-deck CSS overrides
|
|
92
|
+
├── assets/ # images / videos referenced from slides/*.md
|
|
93
|
+
└── dist/ # build output (gitignored automatically)
|
|
94
|
+
└── index.html
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
(Legacy: a single `content.md` at the deck root still works — see Step 2.)
|
|
98
|
+
|
|
99
|
+
## Content conventions
|
|
100
|
+
|
|
101
|
+
```markdown
|
|
102
|
+
<!-- .slide: data-layout="title" -->
|
|
103
|
+
# Deck title
|
|
104
|
+
## Subtitle line
|
|
105
|
+
|
|
106
|
+
Note: Speaker note for the title slide.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
<!-- .slide: data-layout="content" -->
|
|
111
|
+
## Today's three points
|
|
112
|
+
- First
|
|
113
|
+
- Second
|
|
114
|
+
- Third
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
<!-- .slide: data-layout="two-column" -->
|
|
119
|
+
## Title
|
|
120
|
+
|
|
121
|
+
<div class="col-left">
|
|
122
|
+
|
|
123
|
+
Left content here, can include **markdown**.
|
|
124
|
+
|
|
125
|
+
</div>
|
|
126
|
+
|
|
127
|
+
<div class="col-right">
|
|
128
|
+
|
|
129
|
+
Right content.
|
|
130
|
+
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
<!-- .slide: data-layout="closing" -->
|
|
136
|
+
# Thank you
|
|
137
|
+
## Questions?
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Layouts (v1)
|
|
141
|
+
|
|
142
|
+
| Layout | When | Notes |
|
|
143
|
+
|---|---|---|
|
|
144
|
+
| `title` | Cover slide | Big title, optional subtitle, brand logo prominent |
|
|
145
|
+
| `section` | Section divider | Full-bleed accent background, large white title |
|
|
146
|
+
| `content` | Default | Title + bullets / paragraphs |
|
|
147
|
+
| `two-column` | Side-by-side content | Use `<div class="col-left">` / `<div class="col-right">` |
|
|
148
|
+
| `image-text` | Image + text combo | Use `<div class="image">` / `<div class="text">` |
|
|
149
|
+
| `quote` | Big italic blockquote | Use markdown `>` syntax |
|
|
150
|
+
| `closing` | Thank-you / Q&A | Mirrors title styling on accent BG |
|
|
151
|
+
| `agenda` | Numbered list | Numbered ol, large type, generous whitespace |
|
|
152
|
+
| `table` | Tabular data | Markdown tables, styled with zebra rows + accent header |
|
|
153
|
+
| `comparison` | 2–3 option boxes side-by-side | Use `<div class="compare">` with `<div class="option">` children |
|
|
154
|
+
| `code` | Code-focused | Triple-backtick fenced blocks with language tag |
|
|
155
|
+
|
|
156
|
+
## Other commands
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
bun ~/.pal/skills/presentation/tools/list-templates.ts
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Prints all registered templates with their primary color and storage path.
|
|
163
|
+
|
|
164
|
+
## When to use this skill
|
|
165
|
+
|
|
166
|
+
- Building a workshop deck, internal presentation, conference talk, sales pitch, lecture
|
|
167
|
+
- A user mentioning a deck / slides / talk / lecture / "prezentáció" / equivalent in their language
|
|
168
|
+
- The user already has a template registered and wants to make a new deck
|
|
169
|
+
|
|
170
|
+
Do NOT use when:
|
|
171
|
+
- A static one-pager / handout PDF is needed → use `consulting-report` or `create-pdf`
|
|
172
|
+
- The user wants editable PowerPoint specifically (v1 doesn't export pptx; deferred to v2)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!-- .slide: data-layout="agenda" -->
|
|
2
|
+
## Agenda
|
|
3
|
+
|
|
4
|
+
1. Title — cover slides
|
|
5
|
+
2. Section — full-bleed dividers
|
|
6
|
+
3. Content — the default
|
|
7
|
+
4. Two-column — side-by-side
|
|
8
|
+
5. Image + text — visuals plus narrative
|
|
9
|
+
6. Quote — pull quotes
|
|
10
|
+
7. Table — tabular data
|
|
11
|
+
8. Comparison — option boxes
|
|
12
|
+
9. Code — fenced code blocks
|
|
13
|
+
10. Closing — thank-you slide
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<!-- .slide: data-layout="content" -->
|
|
2
|
+
## Content layout
|
|
3
|
+
|
|
4
|
+
The default. Title at top, body below.
|
|
5
|
+
|
|
6
|
+
- Bullets work as you'd expect
|
|
7
|
+
- Sub-bullets too
|
|
8
|
+
- Like this
|
|
9
|
+
- And this
|
|
10
|
+
- **Bold**, *italic*, `inline code`, [links](https://example.com)
|
|
11
|
+
|
|
12
|
+
Note: If you don't add a `data-layout` directive, this is what you get.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<!-- .slide: data-layout="two-column" -->
|
|
2
|
+
## Two-column layout
|
|
3
|
+
|
|
4
|
+
<div class="col-left">
|
|
5
|
+
|
|
6
|
+
**Left side**
|
|
7
|
+
|
|
8
|
+
- Use for comparisons
|
|
9
|
+
- Or before/after
|
|
10
|
+
- Or feature/benefit
|
|
11
|
+
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
<div class="col-right">
|
|
15
|
+
|
|
16
|
+
**Right side**
|
|
17
|
+
|
|
18
|
+
- Mirrors the left
|
|
19
|
+
- Same width
|
|
20
|
+
- Vertical divider between
|
|
21
|
+
|
|
22
|
+
</div>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<!-- .slide: data-layout="table" -->
|
|
2
|
+
## Table layout
|
|
3
|
+
|
|
4
|
+
| Phase | Duration | Output | Owner |
|
|
5
|
+
|-----------|----------|------------------|----------|
|
|
6
|
+
| Discovery | 2 weeks | Findings deck | Lead PM |
|
|
7
|
+
| Design | 4 weeks | Component specs | Designer |
|
|
8
|
+
| Build | 6 weeks | Working software | Eng team |
|
|
9
|
+
| Launch | 1 week | Release notes | Lead PM |
|
|
10
|
+
|
|
11
|
+
Note: Markdown tables — header row gets the brand-primary background, even rows get a subtle surface tint.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<!-- .slide: data-layout="comparison" -->
|
|
2
|
+
## Comparison layout
|
|
3
|
+
|
|
4
|
+
<div class="compare">
|
|
5
|
+
<div class="option">
|
|
6
|
+
|
|
7
|
+
**Option A — Build in-house**
|
|
8
|
+
|
|
9
|
+
- Full control over the roadmap
|
|
10
|
+
- Higher up-front investment
|
|
11
|
+
- 6+ months to v1
|
|
12
|
+
- Owned IP, no vendor lock-in
|
|
13
|
+
|
|
14
|
+
</div>
|
|
15
|
+
<div class="option">
|
|
16
|
+
|
|
17
|
+
**Option B — Buy & integrate**
|
|
18
|
+
|
|
19
|
+
- 4–6 weeks to deployment
|
|
20
|
+
- Per-seat licensing cost
|
|
21
|
+
- Vendor roadmap dependency
|
|
22
|
+
- Faster time-to-value
|
|
23
|
+
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<!-- .slide: data-layout="image-text" -->
|
|
2
|
+
## Image + text layout
|
|
3
|
+
|
|
4
|
+
<div class="image">
|
|
5
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300" preserveAspectRatio="xMidYMid meet">
|
|
6
|
+
<rect width="400" height="300" fill="#E5E7EB"/>
|
|
7
|
+
<text x="200" y="160" font-family="sans-serif" font-size="22" fill="#6B7280" text-anchor="middle">your image here</text>
|
|
8
|
+
</svg>
|
|
9
|
+
</div>
|
|
10
|
+
<div class="text">
|
|
11
|
+
|
|
12
|
+
Drop an image into your deck's `assets/` folder, then reference it from markdown:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+

|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
The image is left-aligned, the text gets the right column. Both vertically centered.
|
|
19
|
+
|
|
20
|
+
</div>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<!-- .slide: data-layout="code" -->
|
|
2
|
+
## Code layout
|
|
3
|
+
|
|
4
|
+
```python
|
|
5
|
+
def fibonacci(n: int) -> int:
|
|
6
|
+
"""Iterative — O(n) time, O(1) space."""
|
|
7
|
+
if n < 2:
|
|
8
|
+
return n
|
|
9
|
+
a, b = 0, 1
|
|
10
|
+
for _ in range(n - 1):
|
|
11
|
+
a, b = b, a + b
|
|
12
|
+
return b
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
print([fibonacci(i) for i in range(10)])
|
|
16
|
+
# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Note: Syntax highlighting via the bundled highlight.js — supports 30+ languages out of the box.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<!-- .slide: data-layout="closing" -->
|
|
2
|
+
# That's the lot
|
|
3
|
+
## All 11 layouts, one place
|
|
4
|
+
|
|
5
|
+
Note: If you saw all 11 distinct slide styles, the build pipeline is working. Edit theme-base/layouts.css to tune any of them brand-wide; edit your template's template.css to override colors per brand; edit overrides.css in a deck folder for one-off tweaks.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Deck folder
|
|
2
|
+
|
|
3
|
+
Edit `content.md` — slides separated by `---` on its own line.
|
|
4
|
+
|
|
5
|
+
Build: `bun ~/.pal/skills/presentation/tools/build.ts .`
|
|
6
|
+
Present: `bun ~/.pal/skills/presentation/tools/present.ts .`
|
|
7
|
+
|
|
8
|
+
Layout per slide:
|
|
9
|
+
```markdown
|
|
10
|
+
<!-- .slide: data-layout="content" -->
|
|
11
|
+
## Slide title
|
|
12
|
+
- bullet
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Available layouts: title, section, content, two-column, image-text, quote, closing, agenda, table, comparison, code. See the skill's SKILL.md for details on each.
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/* presentation skill — theme-base/base.css
|
|
2
|
+
* Brand-neutral base. Templates override the --brand-* custom properties.
|
|
3
|
+
* Do not put brand colours here — only neutral defaults. */
|
|
4
|
+
|
|
5
|
+
:root {
|
|
6
|
+
--brand-primary: #0E1335;
|
|
7
|
+
--brand-accent: #2563EB;
|
|
8
|
+
--brand-bg: #FFFFFF;
|
|
9
|
+
--brand-fg: #111827;
|
|
10
|
+
--brand-muted: #6B7280;
|
|
11
|
+
--brand-surface: #F9FAFB;
|
|
12
|
+
--brand-divider: #E5E7EB;
|
|
13
|
+
|
|
14
|
+
--brand-logo: none;
|
|
15
|
+
|
|
16
|
+
--font-display: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
|
|
17
|
+
--font-body: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
|
|
18
|
+
--font-mono: "JetBrains Mono", "Menlo", "Consolas", monospace;
|
|
19
|
+
|
|
20
|
+
--space-1: 0.5rem;
|
|
21
|
+
--space-2: 1rem;
|
|
22
|
+
--space-3: 1.5rem;
|
|
23
|
+
--space-4: 2.5rem;
|
|
24
|
+
--space-5: 4rem;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.reveal {
|
|
28
|
+
font-family: var(--font-body);
|
|
29
|
+
font-size: 48px;
|
|
30
|
+
font-weight: 400;
|
|
31
|
+
color: var(--brand-fg);
|
|
32
|
+
}
|
|
33
|
+
.reveal-viewport { background: var(--brand-bg); }
|
|
34
|
+
|
|
35
|
+
/* Default content padding inside every slide. Distinct from Reveal's `margin` config:
|
|
36
|
+
* `margin` (Reveal) = letterbox between canvas and viewport
|
|
37
|
+
* this padding = inset between section content and canvas edge
|
|
38
|
+
* Bottom reserve protects the chrome (logo + slide-number) anchored at canvas-bottom.
|
|
39
|
+
* Special layouts (title/section/quote/closing) override below in layouts.css. */
|
|
40
|
+
.reveal .slides > section {
|
|
41
|
+
padding: 2.5rem 5rem 4.5rem;
|
|
42
|
+
box-sizing: border-box;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 {
|
|
47
|
+
font-family: var(--font-display);
|
|
48
|
+
color: var(--brand-fg);
|
|
49
|
+
letter-spacing: -0.015em;
|
|
50
|
+
line-height: 1.15;
|
|
51
|
+
margin: 0 0 var(--space-3) 0;
|
|
52
|
+
text-transform: none;
|
|
53
|
+
}
|
|
54
|
+
.reveal h1 { font-size: 2.6em; font-weight: 700; }
|
|
55
|
+
.reveal h2 { font-size: 2.0em; font-weight: 600; }
|
|
56
|
+
.reveal h3 { font-size: 1.5em; font-weight: 600; }
|
|
57
|
+
.reveal h4 { font-size: 1.2em; font-weight: 600; }
|
|
58
|
+
|
|
59
|
+
.reveal p { line-height: 1.5; margin: 0 0 var(--space-2) 0; }
|
|
60
|
+
|
|
61
|
+
.reveal ul, .reveal ol {
|
|
62
|
+
margin: 0 0 var(--space-2) 1.4em;
|
|
63
|
+
line-height: 1.5;
|
|
64
|
+
}
|
|
65
|
+
.reveal li { margin-bottom: var(--space-1); }
|
|
66
|
+
.reveal li > ul, .reveal li > ol { margin-top: var(--space-1); margin-bottom: 0; }
|
|
67
|
+
|
|
68
|
+
.reveal a {
|
|
69
|
+
color: var(--brand-accent);
|
|
70
|
+
text-decoration: none;
|
|
71
|
+
border-bottom: 1px solid currentColor;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.reveal blockquote {
|
|
75
|
+
border-left: 4px solid var(--brand-accent);
|
|
76
|
+
margin: 0;
|
|
77
|
+
padding: var(--space-2) var(--space-3);
|
|
78
|
+
background: var(--brand-surface);
|
|
79
|
+
font-style: italic;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.reveal pre {
|
|
83
|
+
background: #1E1E1E;
|
|
84
|
+
border-radius: 4px;
|
|
85
|
+
font-size: 0.7em;
|
|
86
|
+
line-height: 1.5;
|
|
87
|
+
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
|
|
88
|
+
}
|
|
89
|
+
.reveal pre code {
|
|
90
|
+
padding: var(--space-2);
|
|
91
|
+
display: block;
|
|
92
|
+
font-family: var(--font-mono);
|
|
93
|
+
}
|
|
94
|
+
.reveal :not(pre) > code {
|
|
95
|
+
background: var(--brand-surface);
|
|
96
|
+
padding: 0.1em 0.4em;
|
|
97
|
+
border-radius: 3px;
|
|
98
|
+
font-family: var(--font-mono);
|
|
99
|
+
font-size: 0.85em;
|
|
100
|
+
color: var(--brand-primary);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.reveal table {
|
|
104
|
+
width: 100%;
|
|
105
|
+
border-collapse: collapse;
|
|
106
|
+
margin: var(--space-2) 0;
|
|
107
|
+
font-size: 0.8em;
|
|
108
|
+
}
|
|
109
|
+
.reveal th {
|
|
110
|
+
background: var(--brand-primary);
|
|
111
|
+
color: #fff;
|
|
112
|
+
text-align: left;
|
|
113
|
+
padding: var(--space-1) var(--space-2);
|
|
114
|
+
font-weight: 600;
|
|
115
|
+
}
|
|
116
|
+
.reveal td {
|
|
117
|
+
padding: var(--space-1) var(--space-2);
|
|
118
|
+
border-bottom: 1px solid var(--brand-divider);
|
|
119
|
+
}
|
|
120
|
+
.reveal tr:nth-child(even) td { background: var(--brand-surface); }
|
|
121
|
+
|
|
122
|
+
/* Footer logo — pseudo on .slides (the canvas) so it inherits Reveal's scale+translate
|
|
123
|
+
* transforms and stays at canvas-bottom-right regardless of the configured `margin`. */
|
|
124
|
+
.reveal .slides::after {
|
|
125
|
+
content: '';
|
|
126
|
+
position: absolute;
|
|
127
|
+
bottom: 1.5rem;
|
|
128
|
+
right: 1.5rem;
|
|
129
|
+
width: 90px;
|
|
130
|
+
height: 28px;
|
|
131
|
+
background: var(--brand-logo) no-repeat right bottom / contain;
|
|
132
|
+
opacity: 0.55;
|
|
133
|
+
pointer-events: none;
|
|
134
|
+
z-index: 10;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/* Slide number — JS hook in skeleton.html re-parents Reveal's .slide-number into .slides,
|
|
138
|
+
* so it shares the same canvas coordinate system as the logo. */
|
|
139
|
+
.reveal .slides > .slide-number {
|
|
140
|
+
position: absolute;
|
|
141
|
+
bottom: 1.5rem;
|
|
142
|
+
left: 1.5rem;
|
|
143
|
+
right: auto;
|
|
144
|
+
top: auto;
|
|
145
|
+
background: transparent;
|
|
146
|
+
color: var(--brand-muted);
|
|
147
|
+
font-family: var(--font-body);
|
|
148
|
+
font-size: 0.55em;
|
|
149
|
+
font-weight: 400;
|
|
150
|
+
line-height: 28px;
|
|
151
|
+
letter-spacing: 0.05em;
|
|
152
|
+
padding: 0;
|
|
153
|
+
pointer-events: none;
|
|
154
|
+
z-index: 10;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/* Hide both chrome elements on cover, divider, and closing layouts.
|
|
158
|
+
* !important is required because Reveal sets style="display: block" inline on .slide-number
|
|
159
|
+
* via JS — only !important beats inline styles. */
|
|
160
|
+
.reveal .slides:has(> section.present[data-layout="title"])::after,
|
|
161
|
+
.reveal .slides:has(> section.present[data-layout="title"]) > .slide-number,
|
|
162
|
+
.reveal .slides:has(> section.present[data-layout="section"])::after,
|
|
163
|
+
.reveal .slides:has(> section.present[data-layout="section"]) > .slide-number,
|
|
164
|
+
.reveal .slides:has(> section.present[data-layout="closing"])::after,
|
|
165
|
+
.reveal .slides:has(> section.present[data-layout="closing"]) > .slide-number {
|
|
166
|
+
display: none !important;
|
|
167
|
+
}
|