SLIDEDOWN
____ _ ___ ____ _____ ____ _____ ___ _
/ ___|| | |_ _| _ \| ____| _ \ / _ \ \ / / \ | |
\___ \| | | || | | | _| | | | | | | \ \ /\ / /| \| |
___) | |___ | || |_| | |___| |_| | |_| |\ V V / | |\ |
|____/|_____|___|____/|_____|____/ \___/ \_/\_/ |_| \_|
Text-first presentation compiler with behavioral markup.
View as Interactive Presentation: https://fnndsc.github.io/slidedown/readme-presentation/
Documentation: docs/
Examples: examples/
What is slidedown?
Write presentations like you write code —
plain text in, browser slideshow out.
Text-first authoring — diffable, scriptable, version-controlled
Behavioral markup — .directive\{content\} syntax
Interactive effects — typewriter animations, progressive reveals
Single-file workflow — one .sd source → standalone HTML
Themes
Five built-in themes — same source, different compile:
conventional-light → https://fnndsc.github.io/slidedown/themes/conventional-light/
default → https://fnndsc.github.io/slidedown/themes/default/
lcars-lower-decks → https://fnndsc.github.io/slidedown/themes/lcars-lower-decks/
retro-terminal → https://fnndsc.github.io/slidedown/themes/retro-terminal/
terminal → https://fnndsc.github.io/slidedown/themes/terminal/
Select with
--theme at compile time.
Quick Start
git clone https://github.com/FNNDSC/slidedown
cd slidedown
make dev
Then compile and serve an example:
make presentation SOURCE=examples/minimal/minimal.sd
# Open http://localhost:8000
Quick Start — no make
Without
make, use the
slideshow script directly:
./slideshow examples/minimal/minimal.sd --theme conventional-light
Or the raw CLI:
python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"
slidedown examples/minimal/ output/ --inputFile minimal.sd
cd output/ && python3 -m http.server 8000
Directive Syntax
The core syntax is simple:
.directive{content}
.directive{\.modifier{value} content}
.directive{nested \.directives{work} too}
Structure: .slide{} — defines a slide
.title{} — slide title
.body{} — slide content
Formatting & Effects
Formatting directives: .bf{} — bold
.em{} — italic
.tt{} — monospace
.code{} — syntax-highlighted code block
Behavioral directives: .typewriter{} — typing animation
.o{} — progressive reveal bullet
.font-standard{} / .font-slant{} — ASCII art titles
A Minimal Example
.slide{
\.title{My First Slide}
\.body{
\.typewriter{> Initializing...}
\.bf{Features:}
\.o{\.em{Text-first} authoring}
\.o{\.tt{Behavioral} markup}
\.o{Interactive \.bf{effects}}
}
}
Usage — Makefile
# Compile and serve
make presentation SOURCE=examples/minimal/minimal.sd
# Change theme or port
make presentation SOURCE=deck.sd THEME=retro-terminal PORT=9000
# Compile only (no server)
make compile SOURCE=deck.sd
# Serve an already-compiled deck
make serve SOURCE=deck.sd
Usage — slideshow & CLI
Via slideshow script: ./slideshow path/to/deck.sd --theme lcars-lower-decks
./slideshow path/to/deck.sd --no-serve --outputdir /tmp/out
Direct CLI: slidedown inputdir/ outputdir/ --inputFile deck.sd --theme terminal
See all Makefile targets:
Project Structure
slidedown/
├── src/
│ ├── lib/
│ │ ├── parser.py # .sd syntax parser
│ │ ├── compiler.py # AST → HTML compiler
│ │ ├── directives.py # Directive implementations
│ │ ├── theme.py # Theme loader
│ │ └── theme_base.py # Theme hook system
│ └── models/ # Type definitions
├── themes/ # 5 built-in themes
├── assets/ # CSS, JS, HTML templates
├── docs/ # Docs + hosted presentations
├── examples/ # Example .sd decks
└── tests/ # 97 tests
Testing
# Run all tests
make test
# Specific file
pytest tests/test_parser_basic.py -v
# With coverage
make coverage
97 tests across 5 files: test_parser_basic — directive parsing
test_parser_modifiers — .style{} and .class{} extraction
test_parser_nesting — recursive structure
test_parser_escaping — escape sequences
test_e2e_compilation — full pipeline
Architecture
Functional pipeline:
.sd source → Parser → AST → Compiler → HTML
↓ ↓ ↓
ProgramState → → → → → →
State Bus — ProgramState dataclass carries pipeline state
Inside-Out Compilation — children compiled before parents
Theme Hook System — themes subclass ThemeHooks for custom layouts
Directive Registry — extensible, add new directives easily
LCARS Theme
The
lcars-lower-decks theme brings a Star Trek LCARS
interface to your presentations.
Dynamic topbar scaling: [ / ] keys or TB button
Dynamic gutter scaling: \{} / \ keys or GW button
Four stops: 100% → 75% → 50% → 25%
Scale state persists across reloads via localStorage
HIDEDETAIL / SHOWDETAIL collapses the full topbar
Live demo: https://fnndsc.github.io/slidedown/themes/lcars-lower-decks/
Features
Parser — recursive directive parsing
Compiler — AST to HTML, 97 tests passing
5 themes — extensible hook system
Typewriter animations and progressive reveal bullets
Custom CSS via .meta{css: ...}
Navbar customization
Per-slide density classes (hero, roomy, dense, compact)
Watermarks with percentage sizing
ASCII art (Figlet) and cowsay
Contributing
Developed with
test-driven development:
Write tests first
Implement to pass
Refactor for clarity
Code conventions: RPN naming: object_verb
Type hints everywhere
Google-style docstrings (Args / Returns)
Functional over imperative
Get Involved
Report issues on GitHub
Add new directive implementations
Create and share example presentations
Build new themes via the hook system
Improve documentation
Repository: https://github.com/FNNDSC/slidedown
License & Contact
__ _____________
/ |/ / _/_ __/
/ /|_/ // / / /
/ / / // / / /
/_/ /_/___/ /_/
Licensed under the MIT License. See
LICENSE file for details.
Author: Rudolph Pienaar
Issues: github.com/FNNDSC/slidedown/issues