···11+# Generated by Cargo
22+# will have compiled files and executables
33+debug
44+target
55+66+# These are backup files generated by rustfmt
77+**/*.rs.bk
88+99+# MSVC Windows builds of rustc generate these, which store debugging information
1010+*.pdb
1111+1212+# Generated by cargo mutants
1313+# Contains mutation testing data
1414+**/mutants.out*/
1515+1616+# RustRover
1717+# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
1818+# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
1919+# and can be added to the global gitignore or merged into this file. For a more nuclear
2020+# option (not recommended) you can uncomment the following to ignore the entire idea folder.
2121+#.idea/
···11+# slides.rs
22+33+> A modern, fast, terminal presentation tool inspired by [`maaslalani/slides`](https://github.com/maaslalani/slides), built with Rust.
44+55+## Design Principles
66+77+__Color as Data:__
88+All color use flows through typed wrappers using `owo-colors`. No ad-hoc ANSI escapes.
99+1010+__Themeable:__
1111+Themes unify visual (Syntect) and terminal (owo) layers.
1212+1313+__Reproducible:__
1414+Everything is reproducible in plain text — decks can render without TUI (using `slides print`).
1515+1616+__Composable:__
1717+Parser → Model → Renderer are independent modules with tests and traits.
1818+1919+__Portable:__
2020+Runs on any terminal supporting UTF-8; dependencies limited to core crates.
+82
ROADMAP.md
···11+# Slides
22+33+## Plumbing
44+55+__Objective:__ Establish a clean, testable core with `clap` and a minimal `ratatui` loop.
66+77+| Task | Description | Key Crates |
88+| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
99+| __Project Scaffolding__ | Initialize workspace with `slides-core`, `slides-cli`, and `slides-tui` crates. Use `cargo-generate` and a `justfile` for scripts. | `cargo`, `just`, `clap` |
1010+| __CLI Definition__ | Implement root command `slides` with subcommands:<br>• `present` (TUI)<br>• `print` (stdout)<br>• `init` (scaffold deck)<br>• `check` (lint slides). | [`clap`](https://docs.rs/clap/latest/clap/) |
1111+| __Logging and Colors__ | Integrate structured logs via `tracing`.<br>Use __owo-colors__ for color abstraction (no dynamic dispatch). | [`owo-colors`](https://docs.rs/owo-colors/latest/owo_colors/), `tracing` |
1212+| __Terminal & Event Setup__ | Configure alternate screen, raw mode, input loop, resize handler. | [`crossterm`](https://docs.rs/crossterm/latest/crossterm/), `ratatui` |
1313+| __CI/CD + Tooling__ | Setup `cargo fmt`, `clippy`, `test`, and `cross` matrix CI. | GitHub Actions |
1414+1515+## Data Model (Parser & Slides)
1616+1717+__Objective:__ Parse markdown documents into a rich `Slide` struct.
1818+1919+| Task | Description | Key Crates |
2020+| ---------------------- | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
2121+| __Parser Core__ | Split files on `---` separators.<br>Detect title blocks, lists, and code fences.<br>Represent as `Vec<Slide>`. | [`pulldown-cmark`](https://docs.rs/pulldown-cmark/latest/pulldown_cmark/) |
2222+| __Slide Model__ | Define structs: `Slide`, `Block`, `TextSpan`, `CodeBlock`, etc. | Internal |
2323+| __Metadata Parsing__ | Optional front matter (YAML/TOML) for theme, author, etc. | [`serde_yaml`](https://docs.rs/serde_yaml) |
2424+| __Error & Validation__ | Provide friendly parser errors with file/line info. | [`thiserror`](https://docs.rs/thiserror) |
2525+| __Basic CLI UX__ | `slides present file.md` runs full TUI.<br>`slides print` renders to stdout with width constraint. | `clap` |
2626+2727+---
2828+2929+## Rendering & Navigation
3030+3131+__Objective:__ Build the interactive slide renderer with navigation.
3232+3333+| Task | Description | Key Crates |
3434+| ----------------------- | --------------------------------------------------------------------------------------------------- | ---------------------------------------------------- |
3535+| __Ratatui Integration__ | Build basic slide viewer using layout, blocks, paragraphs. | [`ratatui`](https://docs.rs/ratatui/latest/ratatui/) |
3636+| __Input & State__ | Support `←/→`, `j/k`, `q`, numeric jumps, and window resize. | `crossterm`, `ratatui` |
3737+| __Status Bar__ | Display slide count, filename, clock, and theme name. | `ratatui` |
3838+| __Color Styling__ | Apply consistent color palette via `owo-colors`. Define traits like `ThemeColor` for strong typing. | `owo-colors` |
3939+| __Configurable Themes__ | Support themes via TOML files mapping semantic roles (`heading`, `body`, `accent`) → color pairs. | `toml`, `serde` |
4040+4141+## Code Highlighting via Syntect
4242+4343+__Objective:__ Add first-class syntax highlighting using Syntect.
4444+4545+| Task | Description | Key Crates |
4646+| --------------- | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------- |
4747+| __Syntect__ | Load `.tmTheme` / `.sublime-syntax` definitions on startup.<br>Cache `SyntaxSet` + `ThemeSet`. | [`syntect`](https://docs.rs/syntect/latest/syntect/) |
4848+| __Code Blocks__ | Detect fenced code blocks with language tags.<br>Render syntax-highlighted text with color spans mapped to `owo-colors`. | `syntect`, `owo-colors` |
4949+| __Theming__ | Map terminal theme choice to Syntect theme (e.g., `"OneDark"`, `"SolarizedDark"`, `"Monokai"`). | `syntect` |
5050+| __Performance__ | Lazy-load themes and syntaxes; use `once_cell` for caching. | `once_cell` |
5151+| __Mode__ | Render to ANSI-colored plain text output (for `slides print`). | `owo-colors` |
5252+5353+## Presenter
5454+5555+__Objective:__ Introduce features for live presentations and authoring convenience.
5656+5757+| Task | Description | Key Crates |
5858+| -------------------- | ------------------------------------------------------------- | ------------------------------------------------- |
5959+| __Speaker Notes__ | `n` toggles speaker notes (parsed via `::: notes`). | `ratatui` |
6060+| __Timer & Progress__ | Session timer + per-slide progress bar. | `ratatui`, `chrono` |
6161+| __Live Reload__ | File watcher auto-refreshes content. | [`notify`](https://docs.rs/notify/latest/notify/) |
6262+| __Search__. | Fuzzy find slide titles via `ctrl+f`. | [`fuzzy-matcher`](https://docs.rs/fuzzy-matcher) |
6363+| __Theme Commands__ | CLI flag `--theme <name>` switches both Syntect + owo themes. | `clap`, internal `ThemeRegistry` |
6464+6565+## Markdown Extension
6666+6767+__Objective:__ Add richness and visual polish to text and layout.
6868+6969+| Task | Description | Key Crates |
7070+| -------------------- | ------------------------------------------------------------ | ----------------------------- |
7171+| __Tables & Lists__ | Render GitHub-style tables, bullets, and task lists. | `pulldown-cmark`, `ratatui` |
7272+| __Admonitions__ | Highlighted boxes with icons | `owo-colors`, internal glyphs |
7373+| __Horizontal Rules__ | Use box-drawing (`─`, `═`) and shading (`░`, `▓`). | Unicode constants |
7474+| __Generators__. | `slides init` scaffolds an example deck with code and notes. | `include_str!`, `fs` |
7575+7676+## RC
7777+7878+| Task | Description | Key Crates |
7979+| -------------------- | ------------------------------------------------------------------ | ---------------------------- |
8080+| __Config Discovery__ | Read from `$XDG_CONFIG_HOME/slides/config.toml` for defaults. | `dirs`, `serde` |
8181+| __Theme Registry__ | Built-in theme manifest (e.g., `onedark`, `solarized`, `plain`). | Internal |
8282+| __Release__ | Tag `v1.0.0-rc.1` with changelog and binaries for major platforms. | `cargo-dist`, GitHub Actions |