Polish README with modern layout, emojis, and tables
This commit is contained in:
370
README.md
370
README.md
@@ -1,104 +1,129 @@
|
|||||||
# Vesper
|
<div align="center">
|
||||||
|
|
||||||
<p align="center">
|
# ✦ Vesper
|
||||||
<img src="https://img.shields.io/badge/version-1.0.0-blue" alt="Version">
|
|
||||||
<img src="https://img.shields.io/badge/platform-Windows-blue" alt="Platform">
|
|
||||||
<img src="https://img.shields.io/badge/framework-Tauri 2.0-black" alt="Framework">
|
|
||||||
<img src="https://img.shields.io/badge/license-CC0-green" alt="License">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
A beautiful, distraction-free markdown reader for Windows. Vesper renders your markdown files with premium editorial typography and a refined dark aesthetic, giving you the ultimate reading experience.
|
**A beautiful, distraction-free markdown reader for Windows**
|
||||||
|
|
||||||
---
|
Premium editorial typography · Refined dark aesthetic · Fully portable
|
||||||
|
|
||||||
## Features
|
<br>
|
||||||
|
|
||||||
### Markdown Rendering
|
<img src="https://img.shields.io/badge/version-1.0.0-6B8AFF?style=flat-square&labelColor=282C33" alt="Version">
|
||||||
|
<img src="https://img.shields.io/badge/platform-Windows-6B8AFF?style=flat-square&labelColor=282C33" alt="Platform">
|
||||||
|
<img src="https://img.shields.io/badge/Tauri-v2-6B8AFF?style=flat-square&labelColor=282C33" alt="Tauri">
|
||||||
|
<img src="https://img.shields.io/badge/license-CC0-6B8AFF?style=flat-square&labelColor=282C33" alt="License">
|
||||||
|
|
||||||
- Full CommonMark support via **markdown-it** with extensions:
|
</div>
|
||||||
- Syntax highlighting for 190+ languages (highlight.js)
|
|
||||||
- Task lists (checkboxes)
|
|
||||||
- Superscript and subscript (`^text^`, `~text~`)
|
|
||||||
- ==Highlighted text== via `mark`
|
|
||||||
- Smart quotes, em-dashes, and ellipses (typographer)
|
|
||||||
- Line break preservation
|
|
||||||
- Auto-linking of URLs
|
|
||||||
- HTML passthrough
|
|
||||||
- Premium dark-mode typography tuned for long-form reading:
|
|
||||||
- Inter Variable at 17px with 1.7 line-height
|
|
||||||
- ~65 character measure (680px max-width) for optimal readability
|
|
||||||
- Progressive heading color cascade (H1 near-white through H6 muted)
|
|
||||||
- Accent-colored list markers
|
|
||||||
- Gradient-fade horizontal rules
|
|
||||||
- Subtle persistent link underlines that intensify on hover
|
|
||||||
- Refined blockquote, table, and code block styling
|
|
||||||
- JetBrains Mono Variable for code at 14px with ligature support
|
|
||||||
|
|
||||||
### Tabbed Interface
|
<br>
|
||||||
|
|
||||||
- Open multiple documents in tabs
|
## 📖 Overview
|
||||||
- Duplicate detection: re-opening an already-open file switches to its existing tab instead of creating a duplicate
|
|
||||||
- Animated tab enter/exit with layout transitions
|
|
||||||
- Scroll arrows appear when tabs overflow the bar, with hold-to-scroll
|
|
||||||
- Mouse wheel scrolling over the tab bar
|
|
||||||
- New tabs automatically scroll into view
|
|
||||||
- Close individual tabs with the X button or `Ctrl+W`
|
|
||||||
|
|
||||||
### Navigation
|
Vesper renders your markdown with carefully tuned typography and a refined dark interface, giving you the ultimate reading experience. No installation, no AppData, no registry — just drop the exe and go.
|
||||||
|
|
||||||
- **Table of Contents sidebar** auto-generated from document headings (H1-H6), with indentation by level
|
<br>
|
||||||
- Click any heading in the sidebar to smooth-scroll to that section
|
|
||||||
- Sidebar opens even when a document has no headings (shows "No headings" message)
|
|
||||||
- Resizable sidebar via drag handle
|
|
||||||
- **Full-text search** (`Ctrl+F`) with real-time DOM highlighting, match counter, and Enter to cycle through matches
|
|
||||||
|
|
||||||
### Reading Experience
|
## ✨ Features
|
||||||
|
|
||||||
- **Focus Mode** (`F11`) hides the title bar and menu bar for immersive reading
|
### 🔤 Markdown Rendering
|
||||||
- **Content zoom** via `Ctrl+Scroll` (50%--200%)
|
|
||||||
- **Content width** adjustment via `Shift+Scroll` (400px--1200px)
|
|
||||||
- **UI scale** (50%--200%) with a spinner in the View menu, persisted across sessions via localStorage
|
|
||||||
- **Kinetic scrolling** on right-mouse-button drag with iOS-style rubber band overscroll and damped spring snapback
|
|
||||||
- **Custom scrollbars** via OverlayScrollbars -- thin, auto-hiding after 800ms, accent-colored on hover
|
|
||||||
- Window state (size, position, maximized) remembered between sessions
|
|
||||||
|
|
||||||
### File Handling
|
Full CommonMark support via **markdown-it** with extensions:
|
||||||
|
|
||||||
- Open files via the File menu, `Ctrl+O` dialog, or drag-and-drop from Explorer
|
| Extension | Description |
|
||||||
- Supports `.md`, `.markdown`, and `.txt` files
|
|:--|:--|
|
||||||
- Native Tauri drag-and-drop integration (receives real file system paths)
|
| 🎨 Syntax Highlighting | 190+ languages via highlight.js with a curated dark palette |
|
||||||
|
| ☑️ Task Lists | Interactive checkboxes in lists |
|
||||||
|
| ᴬᵇ Superscript / Subscript | `^text^` and `~text~` notation |
|
||||||
|
| 🖍️ Highlight | `==marked text==` rendered with accent background |
|
||||||
|
| 💬 Typographer | Smart quotes, em-dashes, and ellipses |
|
||||||
|
| 🔗 Linkify | Bare URLs auto-converted to clickable links |
|
||||||
|
| 📄 HTML | Inline HTML passthrough |
|
||||||
|
| ↵ Breaks | Newlines preserved as line breaks |
|
||||||
|
|
||||||
### UI Details
|
**Premium dark-mode typography** tuned for long-form reading:
|
||||||
|
|
||||||
- Custom frameless title bar with minimize, maximize/restore, and close buttons
|
> - **Inter Variable** at 17px with 1.7 line-height
|
||||||
- Draggable title area for window repositioning
|
> - ~65 character measure for optimal readability
|
||||||
- Menu bar with File, View, and Help menus
|
> - Progressive heading color cascade — H1 near-white through H6 muted
|
||||||
- Right-click context menu with: Copy (when text is selected), Open File, Toggle Search, Toggle Sidebar, Focus Mode, Keyboard Shortcuts, About, Exit
|
> - Accent-colored list markers on both ordered and unordered lists
|
||||||
- Text selection preserved visually on right-click via overlay rendering
|
> - Gradient-fade horizontal rules
|
||||||
- Context menu stays within window bounds and respects UI zoom
|
> - Subtle persistent link underlines that intensify on hover
|
||||||
- All panels, modals, tabs, and menus animate with Framer Motion (slide, fade, scale)
|
> - **JetBrains Mono Variable** for code at 14px with ligature support
|
||||||
- Subtle noise texture overlay on the app background
|
|
||||||
- Keyboard shortcuts modal listing all bindings
|
|
||||||
|
|
||||||
---
|
<br>
|
||||||
|
|
||||||
## Keyboard Shortcuts
|
### 📑 Tabbed Interface
|
||||||
|
|
||||||
|
- Open **multiple documents** simultaneously in tabs
|
||||||
|
- 🔁 **Duplicate detection** — re-opening an already-open file switches to its tab
|
||||||
|
- ✨ Animated tab enter/exit with layout transitions
|
||||||
|
- ◀ ▶ **Scroll arrows** appear on overflow with hold-to-scroll
|
||||||
|
- 🖱️ **Mouse wheel** scrolling over the tab bar
|
||||||
|
- 📌 New tabs **auto-scroll** into view
|
||||||
|
- ✕ Close tabs with the button or `Ctrl+W`
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
### 🧭 Navigation
|
||||||
|
|
||||||
|
- 📋 **Table of Contents** sidebar auto-generated from headings (H1–H6) with indentation
|
||||||
|
- Click any heading to **smooth-scroll** to that section
|
||||||
|
- Sidebar opens even with no headings (shows "No headings" message)
|
||||||
|
- ↔️ **Resizable** sidebar via drag handle
|
||||||
|
- 🔍 **Full-text search** with real-time highlighting, match counter, and `Enter` to cycle
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
### 👁️ Reading Experience
|
||||||
|
|
||||||
|
| Feature | Details |
|
||||||
|
|:--|:--|
|
||||||
|
| 🖥️ Focus Mode | `F11` hides title bar and menu for immersive reading |
|
||||||
|
| 🔎 Content Zoom | `Ctrl+Scroll` — 50% to 200% |
|
||||||
|
| ↔️ Content Width | `Shift+Scroll` — 400px to 1200px |
|
||||||
|
| 🔲 UI Scale | 50%–200% via View menu spinner, persisted across sessions |
|
||||||
|
| 🏀 Kinetic Scroll | Right-mouse drag with iOS-style rubber band overscroll |
|
||||||
|
| 📜 Custom Scrollbars | Thin, auto-hiding, accent-colored on hover |
|
||||||
|
| 💾 Window Memory | Position, size, and maximized state remembered between sessions |
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
### 📂 File Handling
|
||||||
|
|
||||||
|
- Open via **File menu**, **`Ctrl+O`**, or **drag-and-drop** from Explorer
|
||||||
|
- Supports `.md` · `.markdown` · `.txt`
|
||||||
|
- Native Tauri drag-and-drop integration with real file system paths
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
### 🎨 UI Details
|
||||||
|
|
||||||
|
- Custom **frameless title bar** with minimize, maximize/restore, and close
|
||||||
|
- **Right-click context menu** — Copy, Open File, Toggle Search, Toggle Sidebar, Focus Mode, Keyboard Shortcuts, About, Exit
|
||||||
|
- 🖊️ **Text selection preserved** visually on right-click via overlay rendering
|
||||||
|
- Context menu **stays within bounds** and respects UI zoom
|
||||||
|
- All panels, modals, tabs, and menus **animate** with Framer Motion
|
||||||
|
- Subtle **noise texture overlay** on the app background
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## ⌨️ Keyboard Shortcuts
|
||||||
|
|
||||||
| Shortcut | Action |
|
| Shortcut | Action |
|
||||||
|---|---|
|
|:--|:--|
|
||||||
| `Ctrl+O` | Open file |
|
| `Ctrl+O` | 📂 Open file |
|
||||||
| `Ctrl+W` | Close current tab |
|
| `Ctrl+W` | ✕ Close current tab |
|
||||||
| `Ctrl+Q` | Exit application |
|
| `Ctrl+Q` | 🚪 Exit application |
|
||||||
| `Ctrl+F` | Toggle search |
|
| `Ctrl+F` | 🔍 Toggle search |
|
||||||
| `Ctrl+Shift+S` | Toggle sidebar |
|
| `Ctrl+Shift+S` | 📋 Toggle sidebar |
|
||||||
| `F11` | Toggle focus mode |
|
| `F11` | 🖥️ Toggle focus mode |
|
||||||
| `Escape` | Close search / sidebar |
|
| `Escape` | ← Close search / sidebar |
|
||||||
| `Ctrl+Scroll` | Zoom content in / out |
|
| `Ctrl+Scroll` | 🔎 Zoom content in / out |
|
||||||
| `Shift+Scroll` | Adjust content width |
|
| `Shift+Scroll` | ↔️ Adjust content width |
|
||||||
|
|
||||||
---
|
<br>
|
||||||
|
|
||||||
## Installation
|
## 📦 Installation
|
||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
|
|
||||||
@@ -107,125 +132,128 @@ A beautiful, distraction-free markdown reader for Windows. Vesper renders your m
|
|||||||
|
|
||||||
### Download
|
### Download
|
||||||
|
|
||||||
Download the latest `vesper.exe` from the [Releases](https://github.com/yourusername/vesper/releases) page. No installation required -- Vesper is fully portable.
|
Download the latest **`vesper.exe`** from the [Releases](https://github.com/yourusername/vesper/releases) page.
|
||||||
|
No installation required — Vesper is fully portable.
|
||||||
|
|
||||||
### Build from Source
|
### Build from Source
|
||||||
|
|
||||||
**Prerequisites:**
|
> **Requires:** [Node.js](https://nodejs.org/) v18+ · [Rust](https://www.rust-lang.org/tools/install) stable · [Tauri v2 prerequisites](https://v2.tauri.app/start/prerequisites/)
|
||||||
- [Node.js](https://nodejs.org/) v18+
|
|
||||||
- [Rust](https://www.rust-lang.org/tools/install) (stable toolchain)
|
|
||||||
- [Tauri v2 prerequisites](https://v2.tauri.app/start/prerequisites/)
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Clone the repository
|
|
||||||
git clone https://github.com/yourusername/vesper.git
|
git clone https://github.com/yourusername/vesper.git
|
||||||
cd vesper
|
cd vesper
|
||||||
|
|
||||||
# Install dependencies
|
|
||||||
npm install
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
# Run in development mode (hot-reload on localhost:1420)
|
```bash
|
||||||
|
# Development (hot-reload on localhost:1420)
|
||||||
npm run tauri dev
|
npm run tauri dev
|
||||||
|
|
||||||
# Build for production
|
# Production build
|
||||||
npm run tauri build
|
npm run tauri build
|
||||||
|
# → src-tauri/target/release/vesper.exe
|
||||||
```
|
```
|
||||||
|
|
||||||
Build output: `src-tauri/target/release/vesper.exe`
|
<br>
|
||||||
|
|
||||||
---
|
## 🔧 Technology Stack
|
||||||
|
|
||||||
## Technology Stack
|
| | Layer | Technology |
|
||||||
|
|:--|:--|:--|
|
||||||
|
| ⚙️ | Runtime | [Tauri v2](https://tauri.app/) — Rust + WebView2 |
|
||||||
|
| ⚛️ | Frontend | React 19 · TypeScript · Vite 7 |
|
||||||
|
| 🎨 | Styling | Tailwind CSS 4 · DaisyUI 5 · Custom CSS |
|
||||||
|
| 📝 | Markdown | [markdown-it](https://github.com/markdown-it/markdown-it) + plugins |
|
||||||
|
| 🌈 | Syntax | [highlight.js](https://highlightjs.org/) |
|
||||||
|
| 🎬 | Animation | [Framer Motion](https://www.framer.com/motion/) |
|
||||||
|
| 🔤 | Fonts | [Inter Variable](https://rsms.me/inter/) · [JetBrains Mono](https://www.jetbrains.com/lp/mono/) |
|
||||||
|
| 🖼️ | Icons | [Lucide React](https://lucide.dev/) |
|
||||||
|
| 📜 | Scrollbars | [OverlayScrollbars](https://kingsora.github.io/OverlayScrollbars/) |
|
||||||
|
|
||||||
| Layer | Technology |
|
**Tauri Plugins:** `dialog` · `fs` · `opener`
|
||||||
|---|---|
|
|
||||||
| Runtime | [Tauri v2](https://tauri.app/) (Rust + WebView2) |
|
|
||||||
| Frontend | React 19, TypeScript, Vite 7 |
|
|
||||||
| Styling | Tailwind CSS 4, DaisyUI 5, custom CSS |
|
|
||||||
| Markdown | [markdown-it](https://github.com/markdown-it/markdown-it) with plugins (task-lists, sup, sub, mark) |
|
|
||||||
| Syntax Highlighting | [highlight.js](https://highlightjs.org/) |
|
|
||||||
| Animation | [Framer Motion](https://www.framer.com/motion/) |
|
|
||||||
| Fonts | [Inter Variable](https://rsms.me/inter/), [JetBrains Mono Variable](https://www.jetbrains.com/lp/mono/) |
|
|
||||||
| Icons | [Lucide React](https://lucide.dev/) |
|
|
||||||
| Scrollbars | [OverlayScrollbars](https://kingsora.github.io/OverlayScrollbars/) |
|
|
||||||
|
|
||||||
### Tauri Plugins
|
<br>
|
||||||
|
|
||||||
- `tauri-plugin-dialog` -- native file open dialog
|
## 💼 Portable
|
||||||
- `tauri-plugin-fs` -- file system read access
|
|
||||||
- `tauri-plugin-opener` -- system default app launcher
|
|
||||||
|
|
||||||
---
|
Vesper is **fully portable** — zero installation, zero system footprint.
|
||||||
|
|
||||||
## Portable
|
All data lives in a `data/` folder next to the executable:
|
||||||
|
|
||||||
Vesper is fully portable. It stores all data in a `data/` folder next to the executable:
|
|
||||||
|
|
||||||
- `data/window-state.json` -- window position, size, and maximized state
|
|
||||||
- `data/EBWebView/` -- WebView2 data including localStorage (UI zoom preference)
|
|
||||||
|
|
||||||
Nothing is written to AppData, the registry, or any other system location. To move Vesper to another machine, just copy the exe (and optionally the `data/` folder to preserve settings).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Design Philosophy
|
|
||||||
|
|
||||||
1. **Content First** -- the reader is the primary focus; all UI chrome can be hidden
|
|
||||||
2. **Typography Matters** -- Inter Variable at 17px, 1.7 line-height, ~65 character measure, generous whitespace
|
|
||||||
3. **Dark by Default** -- deep onyx base color (#282C33) reduces eye strain
|
|
||||||
4. **Keyboard Driven** -- every feature accessible via keyboard shortcuts
|
|
||||||
5. **Minimalist Chrome** -- the interface gets out of your way
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Color Palette
|
|
||||||
|
|
||||||
| Color | Hex | Usage |
|
|
||||||
|---|---|---|
|
|
||||||
| Base | `#282C33` | Main window background |
|
|
||||||
| Surface | `#252A31` | Title bar, sidebar |
|
|
||||||
| Elevated | `#2D333C` | Active tab, modals |
|
|
||||||
| Overlay | `#333942` | Dropdowns, context menu |
|
|
||||||
| Text Primary | `#E4E6EB` | Main content |
|
|
||||||
| Text Secondary | `#ABB0B8` | UI labels, muted text |
|
|
||||||
| Text Tertiary | `#6B7280` | Placeholders, hints |
|
|
||||||
| Accent | `#6B8AFF` | Interactive elements, highlights |
|
|
||||||
| Link | `#7CA9F7` | Hyperlinks |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Project Structure
|
|
||||||
|
|
||||||
```
|
```
|
||||||
md-reader/
|
vesper.exe
|
||||||
src/
|
data/
|
||||||
App.tsx # Main application component (all UI logic)
|
├── window-state.json ← window position, size, maximized
|
||||||
main.tsx # React entry point
|
└── EBWebView/ ← WebView2 data (localStorage, cache)
|
||||||
styles.css # All styles -- variables, UI components, markdown typography
|
|
||||||
src-tauri/
|
|
||||||
src/
|
|
||||||
main.rs # Rust entry point
|
|
||||||
lib.rs # Tauri builder and plugin registration
|
|
||||||
tauri.conf.json # Tauri window, bundle, and build configuration
|
|
||||||
Cargo.toml # Rust dependencies
|
|
||||||
icons/ # App icons (ICO, PNG, ICNS)
|
|
||||||
index.html
|
|
||||||
package.json
|
|
||||||
vite.config.ts
|
|
||||||
tsconfig.json
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
> Nothing is written to AppData, the registry, or any other system location.
|
||||||
|
> To move Vesper, just copy the exe and optionally the `data/` folder.
|
||||||
|
|
||||||
## License
|
<br>
|
||||||
|
|
||||||
This project is dedicated to the public domain under the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication -- see the [LICENSE](LICENSE) file for details.
|
## 🧠 Design Philosophy
|
||||||
|
|
||||||
---
|
| | Principle |
|
||||||
|
|:--|:--|
|
||||||
|
| 📖 | **Content First** — all UI chrome can be hidden; the reader is the focus |
|
||||||
|
| 🔤 | **Typography Matters** — Inter at 17px, 1.7 line-height, ~65 char measure |
|
||||||
|
| 🌙 | **Dark by Default** — deep onyx base `#282C33` reduces eye strain |
|
||||||
|
| ⌨️ | **Keyboard Driven** — every feature accessible via shortcuts |
|
||||||
|
| ✨ | **Minimalist Chrome** — the interface gets out of your way |
|
||||||
|
|
||||||
## Acknowledgments
|
<br>
|
||||||
|
|
||||||
- [iA Writer](https://ia.net/writer) for design inspiration
|
## 🎨 Color Palette
|
||||||
- [Tauri](https://tauri.app/) for the excellent desktop framework
|
|
||||||
- [markdown-it](https://github.com/markdown-it/markdown-it) for robust markdown parsing
|
| Swatch | Name | Hex | Usage |
|
||||||
- [highlight.js](https://highlightjs.org/) for syntax highlighting
|
|:--|:--|:--|:--|
|
||||||
|
| 🟫 | Base | `#282C33` | Window background |
|
||||||
|
| ⬛ | Surface | `#252A31` | Title bar, sidebar |
|
||||||
|
| 🔲 | Elevated | `#2D333C` | Active tab, modals |
|
||||||
|
| ◾ | Overlay | `#333942` | Dropdowns, context menu |
|
||||||
|
| ⬜ | Text Primary | `#E4E6EB` | Main content |
|
||||||
|
| 🔘 | Text Secondary | `#ABB0B8` | UI labels |
|
||||||
|
| 🩶 | Text Tertiary | `#6B7280` | Placeholders, hints |
|
||||||
|
| 🔵 | Accent | `#6B8AFF` | Interactive elements |
|
||||||
|
| 🔷 | Link | `#7CA9F7` | Hyperlinks |
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## 🗂️ Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
vesper/
|
||||||
|
├── src/
|
||||||
|
│ ├── App.tsx Main application component
|
||||||
|
│ ├── main.tsx React entry point
|
||||||
|
│ └── styles.css Variables, UI, markdown typography
|
||||||
|
├── src-tauri/
|
||||||
|
│ ├── src/
|
||||||
|
│ │ ├── main.rs Rust entry point
|
||||||
|
│ │ └── lib.rs Tauri builder, portable data, window state
|
||||||
|
│ ├── capabilities/
|
||||||
|
│ │ └── default.json Permission declarations
|
||||||
|
│ ├── tauri.conf.json Window, bundle, and build config
|
||||||
|
│ ├── Cargo.toml Rust dependencies
|
||||||
|
│ └── icons/ App icons (ICO, PNG, ICNS)
|
||||||
|
├── index.html
|
||||||
|
├── package.json
|
||||||
|
├── vite.config.ts
|
||||||
|
└── tsconfig.json
|
||||||
|
```
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## 📜 License
|
||||||
|
|
||||||
|
This project is dedicated to the public domain under **CC0 1.0 Universal** — see the [LICENSE](LICENSE) file for details.
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## 🙏 Acknowledgments
|
||||||
|
|
||||||
|
- [iA Writer](https://ia.net/writer) — design inspiration
|
||||||
|
- [Tauri](https://tauri.app/) — desktop framework
|
||||||
|
- [markdown-it](https://github.com/markdown-it/markdown-it) — markdown parsing
|
||||||
|
- [highlight.js](https://highlightjs.org/) — syntax highlighting
|
||||||
|
|||||||
Reference in New Issue
Block a user