termitype 0.0.11

Terminal-based typing test inspired by a certain typing test you might know.
Documentation
<div align="center">

# 馃 termitype

[![Crates.io](https://img.shields.io/crates/v/termitype.svg)](https://crates.io/crates/termitype)
[![Build Status](https://github.com/emanuel2718/termitype/workflows/CI/badge.svg)](https://github.com/emanuel2718/termitype/actions)
[![License: GPL-3](https://img.shields.io/badge/License-GPL3-blue.svg)](https://opensource.org/license/GPL-3.0)

**Feature-rich terminal typing test**

<p align="center">
    Heavily inspired by a certain typing test you might know.
    <br />
    <a href="#installation">Installation</a><a href="#usage">Usage</a><a href="#mappings">Mappings</a><a href="#options">Options</a><a href="#development">Development</a><a href="#contributing">Contributing</a><a href="#roadmap">Roadmap</a><a href="#acknowledgments">Acknowledgments</a>
  </p>

</div>

<br />
<p align="center">
  <img src="https://raw.githubusercontent.com/emanuel2718/termitype/main/assets/demo.gif" alt="Termitype demo" width="600">
</p>

## Installation

### Quick Install

Install the latest pre-built binary for your platform (recommended):

```sh
curl -sSL https://raw.githubusercontent.com/emanuel2718/termitype/main/scripts/install.sh | bash
```

Binaries are available on the [GitHub releases page](https://github.com/emanuel2718/termitype/releases).

### Homebrew

```sh
brew tap emanuel2718/termitype
brew install termitype
```

### Arch Linux (AUR)

```sh
yay -S termitype
```

### From Crates.io

```sh
cargo install termitype
```

### From Source

```sh
cargo install --git https://github.com/emanuel2718/termitype.git termitype
```

## Usage

### Basic Usage

```sh
# Start typing
termitype

# See available CLI arg options (all options can also be configured via the in-game menu)
termitype --help
```

## Mappings

| Mapping        | Mode      | Action                              |
| -------------- | --------- | ----------------------------------- |
| `<C-Space>`    | `Global`  | Toggle Menu                         |
| `<C-c>`        | `Global`  | Quit Application                    |
| `<C-z>`        | `Global`  | Quit Application                    |
| `<C-o>`        | `Global`  | Toggle Command Palette              |
| `<C-l>`        | `Global`  | Toggle Leaderboard Screen           |
| `<C-t>`        | `Global`  | Randomize Theme                     |
| `<Esc>`        | `Global`  | Toggle Menu                         |
| `<S-N>`        | `Results` | Restart                             |
| `<S-R>`        | `Results` | Redo last test                      |
| `q`            | `Results` | Quit Application                    |
| `m`            | `Results` | Switch to `Minimal` Variant         |
| `n`            | `Results` | Switch to `Neofetch` Variant        |
| `g`            | `Results` | Switch to `Graph` Variant           |
| `<Up>`         | `Results` | Cycle to next ASCII Art             |
| `<Down>`       | `Results` | Cycle to previous ASCII Art         |
| `<Esc>`        | `Menu`    | Go back                             |
| `/`            | `Menu`    | Start Search                        |
| `<C-y>/<CR>`   | `Menu`    | Confirm selection                   |
| `<Space>`      | `Menu`    | Toggle selection (if toggable item) |
| `<C-n>/<Down>` | `Menu`    | Next item                           |
| `<C-p>/<Up>`   | `Menu`    | Previous item                       |
| `j/k`          | `Menu`    | Next/previous (in normal mode)      |

## Options

| Option                       | Description                                                                                     |
| :--------------------------- | :---------------------------------------------------------------------------------------------- |
| `-t`, `--time <SECONDS>`     | Test duration in seconds. Enforces Time mode                                                    |
| `-w`, `--words <"WORD1 ..">` | Custom words for the test. Enforces Word mode                                                   |
| `-c`, `--count <COUNT>`      | Number (count) of words to type                                                                 |
| `-n`, `--use-numbers`        | Include numbers in the test word pool                                                           |
| `-s`, `--use-symbols`        | Include symbols in the test word pool                                                           |
| `-p`, `--use-punctuation`    | Include punctuation in the test word pool                                                       |
| `-l`, `--language <LANG>`    | Language dictionary the test will use                                                           |
| `--theme <THEME>`            | The theme of the application                                                                    |
| `--ascii <ASCII>`            | The ASCII art used in the `Neofetch` results                                                    |
| `--cursor <STYLE>`           | Cursor style variant: beam, block, underline, blinking-beam, blinking-block, blinking-underline |
| `--results <STYLE>`          | Results style variant: minimal, neofetch, graph                                                 |
| `--lines <COUNT>`            | Number of visible text lines [default: 3]                                                       |
| `--hide-live-wpm`            | Hide live WPM counter                                                                           |
| `--hide-notifications`       | Hide notifications                                                                              |
| `--no-save`                  | Do not save tests results                                                                       |
| `--reset`                    | Resets everything back to default state                                                         |

### Examples

```sh
# All of the options below can also be changed at runtime via the menu.
termitype -t 60                        # Run a 60-second typing test
termitype -c 100                       # Test will contain exactly 100 random words
termitype --theme "catppuccin-mocha"   # Use catppuccin-mocha theme
termitype -l spanish                   # Use Spanish test words
termitype -spn                         # Enable symbols, punctuation, and numbers
termitype --results neofetch           # Use neofetch inspired results
termitype --no-save                    # Do not save tests results
termitype --hide-notifications         # Do not show notifications
```

## Development

### Prerequisites

- Rust 1.87+
- Cargo

### Quick Start

1. **Clone the repository**:

```sh
git clone https://github.com/emanuel2718/termitype.git
cd termitype
```

2. **Run the application**:

```sh
# Development build
cargo run

# Release build
cargo run --release
```

## Themes

Termitype includes a curated collection of themes sourced from the [iTerm2 Ghostty Color Schemes Repo](https://github.com/mbadolato/iTerm2-Color-Schemes/tree/master/ghostty) repository. Themes can be previewed and changed in real-time.

## Contributing

> [!Warning]
> TODO: write out the contribution guideline just in the case there's one person interested in this.

## Roadmap

### Upcoming Features

- [ ] **Package Distribution**: Release on Homebrew, AUR, nixpkgs, etc.
- [ ] **User config file**: Have a user editable config file in `$XDG_CONFIG_HOME/termitype/config.toml`
- [ ] **Configurable Mappings**: Custom mappings
- [ ] **Custom ASCII arts**: Allow usage of custom ASCII arts
- [ ] **Custom theme**: Allow setting custom themes with names
- [ ] **Wordlist Improvements**: Improve the quality and distribution of words
- [ ] **Multiplayer**: Race other people in realtime with private rooms of sort (will use websockets for this)
- [x] **Local Results Tracking**: Track test results over time (best use case is to track highest WPM on specific modes) with opt-out option

## License

This project is licensed under the GPL-3.0 license - see [LICENSE](LICENSE) for details.

## Acknowledgments

- [Monkeytype]https://github.com/monkeytypegame/monkeytype for the inspiration.
- [Ratatui]https://github.com/ratatui-org/ratatui for the amazing TUI framework.
- [iTerm2 Ghostty Color Schemes]https://github.com/mbadolato/iTerm2-Color-Schemes/tree/master/ghostty for the themes.