# Esprit

A minimal terminal-based spreadsheet editor built with Python and Textual. Create, edit, and manage structured data tables with typed columns directly in your terminal.

Sometimes you want to take notes in a table.

## Features

- **Terminal UI**: Fast, keyboard-driven interface
- **Typed Columns**: String, Number, Boolean, and URL column types
- **Row Operations**: Insert, delete, and move rows with keyboard shortcuts
- **JSON Storage**: Simple, readable JSON file format


## Installation

Install esprit from PyPI:

```bash
pip install esprit
```

Or install from source:

```bash
git clone https://github.com/mkaz/esprit.git
cd esprit
pip install .
```

## Requirements

- Python 3.10 or higher


## Usage

### Starting Esprit

Launch with a new or existing file:

```bash
# Create or open a spreadsheet
esprit mydata.json

# Start with default empty spreadsheet
esprit
```

On first launch with a new file, you'll see the initialization dialog where you can:
- Set the spreadsheet title
- Define columns with names and types
- Add or remove columns as needed

### Column Types

- **String**: Plain text values
- **Number**: Numeric values with comma formatting
- **Boolean**: True/False values displayed as ✓/✗
- **URL**: Links with title and URL (format: `Title | https://example.com`)

### Keyboard Shortcuts

#### Navigation
- **Arrow Keys**: Move between cells
- **Shift+Arrow Keys**: Select multiple cells (shows sum in status bar)

#### Editing
- **Enter**: Edit current cell
- **Escape**: Cancel editing

#### Row Operations
- **Ctrl+I**: Insert empty row above current
- **Ctrl+K**: Delete current row
- **Alt+Up**: Move current row up
- **Alt+Down**: Move current row down

#### File Operations
- **Ctrl+S**: Save spreadsheet
- **Ctrl+Q**: Quit (prompts to save if unsaved changes)

#### Special
- **Ctrl+Enter**: Open URL in browser (when on URL column cell)


## File Format

Esprit saves spreadsheets as JSON files:

```json
{
  "metadata": {
    "title": "My Spreadsheet",
    "columns": [
      {"name": "Name", "type": "string"},
      {"name": "Amount", "type": "number"},
      {"name": "Active", "type": "boolean"},
      {"name": "Website", "type": "url"}
    ]
  },
  "rows": 20,
  "cols": 4,
  "cells": {
    "0,0": "Alice",
    "0,1": 1500,
    "0,2": true,
    "0,3": {"title": "Example", "url": "https://example.com"}
  }
}
```

## License

MIT License - see LICENSE file for details

## Contributing

Contributions welcome! Please open an issue or pull request on GitHub.

## Links

- **GitHub**: https://github.com/mkaz/esprit
- **PyPI**: https://pypi.org/project/esprit/
- **Issues**: https://github.com/mkaz/esprit/issues

