portable-agent-layer 0.28.0 → 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.
Files changed (39) hide show
  1. package/assets/skills/presentation/README.md +21 -0
  2. package/assets/skills/presentation/SKILL.md +172 -0
  3. package/assets/skills/presentation/demo/slides/001-title.md +5 -0
  4. package/assets/skills/presentation/demo/slides/002-agenda.md +13 -0
  5. package/assets/skills/presentation/demo/slides/003-section-text-heavy.md +3 -0
  6. package/assets/skills/presentation/demo/slides/004-content.md +12 -0
  7. package/assets/skills/presentation/demo/slides/005-two-column.md +22 -0
  8. package/assets/skills/presentation/demo/slides/006-quote.md +4 -0
  9. package/assets/skills/presentation/demo/slides/007-section-structured.md +3 -0
  10. package/assets/skills/presentation/demo/slides/008-table.md +11 -0
  11. package/assets/skills/presentation/demo/slides/009-comparison.md +25 -0
  12. package/assets/skills/presentation/demo/slides/010-image-text.md +20 -0
  13. package/assets/skills/presentation/demo/slides/011-code.md +19 -0
  14. package/assets/skills/presentation/demo/slides/012-closing.md +5 -0
  15. package/assets/skills/presentation/template/README.md +15 -0
  16. package/assets/skills/presentation/template/slides/001-title.md +5 -0
  17. package/assets/skills/presentation/template/slides/002-content.md +6 -0
  18. package/assets/skills/presentation/template/slides/003-closing.md +3 -0
  19. package/assets/skills/presentation/theme-base/base.css +167 -0
  20. package/assets/skills/presentation/theme-base/layouts.css +216 -0
  21. package/assets/skills/presentation/theme-base/skeleton.html +53 -0
  22. package/assets/skills/presentation/tools/build.ts +160 -0
  23. package/assets/skills/presentation/tools/lib/inline.ts +35 -0
  24. package/assets/skills/presentation/tools/lib/paths.ts +16 -0
  25. package/assets/skills/presentation/tools/lib/registry.ts +59 -0
  26. package/assets/skills/presentation/tools/list-templates.ts +21 -0
  27. package/assets/skills/presentation/tools/new-deck.ts +101 -0
  28. package/assets/skills/presentation/tools/present.ts +70 -0
  29. package/assets/skills/presentation/tools/setup-template.ts +351 -0
  30. package/assets/skills/presentation/vendor/reveal/plugin/highlight/highlight.js +5 -0
  31. package/assets/skills/presentation/vendor/reveal/plugin/highlight/monokai.css +71 -0
  32. package/assets/skills/presentation/vendor/reveal/plugin/markdown/markdown.js +7 -0
  33. package/assets/skills/presentation/vendor/reveal/plugin/notes/notes.js +1 -0
  34. package/assets/skills/presentation/vendor/reveal/reveal.css +8 -0
  35. package/assets/skills/presentation/vendor/reveal/reveal.js +9 -0
  36. package/assets/templates/settings.claude.json +20 -0
  37. package/package.json +2 -2
  38. package/src/hooks/CompactRecover.ts +105 -0
  39. 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,5 @@
1
+ <!-- .slide: data-layout="title" -->
2
+ # Layout showcase
3
+ ## Every layout in this skill, one slide each
4
+
5
+ Note: This deck is the smoke-test for the presentation skill. Every layout the skill ships should render correctly here.
@@ -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,3 @@
1
+ <!-- .slide: data-layout="section" -->
2
+ # Text-heavy layouts
3
+ ## Title, section, content, two-column, quote
@@ -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,4 @@
1
+ <!-- .slide: data-layout="quote" -->
2
+ > Make everything as simple as possible, but not simpler.
3
+ >
4
+ > — Albert Einstein
@@ -0,0 +1,3 @@
1
+ <!-- .slide: data-layout="section" -->
2
+ # Structured layouts
3
+ ## Table, comparison, image+text, code
@@ -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
+ ![alt](assets/diagram.png)
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,5 @@
1
+ <!-- .slide: data-layout="title" -->
2
+ # New deck
3
+ ## Subtitle here
4
+
5
+ Note: Speaker note — only visible in speaker view.
@@ -0,0 +1,6 @@
1
+ <!-- .slide: data-layout="content" -->
2
+ ## What's inside
3
+
4
+ - Point one
5
+ - Point two
6
+ - Point three
@@ -0,0 +1,3 @@
1
+ <!-- .slide: data-layout="closing" -->
2
+ # Thank you
3
+ ## Questions?
@@ -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
+ }