Replace Pico CSS CDN with Tailwind v4 standalone CLI (no Node.js). Brand theme with navy/electric/accent palette, component classes, self-hosted Commit Mono font. Docker multi-stage CSS build. Logo links to dashboard when logged in. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
58 lines
4.2 KiB
Markdown
58 lines
4.2 KiB
Markdown
# Changelog
|
|
|
|
All notable changes to this project will be documented in this file.
|
|
|
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
|
## [Unreleased]
|
|
|
|
### Changed
|
|
- **Pico CSS → Tailwind CSS v4** — full design system migration across all templates (except planner, which keeps its own CSS)
|
|
- Standalone Tailwind CLI binary (no Node.js) with `make css-build` / `make css-watch`
|
|
- Court Tech brand theme: navy/charcoal/electric/accent color palette
|
|
- Component classes (`.btn`, `.card`, `.form-input`, `.table`, `.badge`, `.flash`, etc.) in `input.css` for consistent styling
|
|
- Self-hosted Commit Mono font (replaces JetBrains Mono) for monospace data display
|
|
- Docker multi-stage build: CSS compiled in dedicated stage before Python build
|
|
- Landing page teaser calculator restyled with Tailwind utilities and brand colors
|
|
|
|
### Removed
|
|
- Pico CSS CDN dependency
|
|
- `custom.css` (replaced by Tailwind `input.css` with `@layer components`)
|
|
- JetBrains Mono font (replaced by self-hosted Commit Mono)
|
|
|
|
### Fixed
|
|
- Empty env vars (e.g. `SECRET_KEY=`) now fall back to defaults instead of silently using `""` — fixes 500 on every request when `.env` has blank values
|
|
|
|
### Added
|
|
- Comprehensive migration test suite (`tests/test_migrations.py` — 20 tests) covering fresh DB, existing DB, up-to-date DB, idempotent migration, version discovery, `_is_fresh_db`, migration 0001 correctness, and ordering
|
|
- Expanded `migrate.py` module docstring documenting the 8-step algorithm, protocol for adding migrations, and design decisions
|
|
- Sequential migration system (`migrations/migrate.py`) — tracks applied versions in `_migrations` table, auto-detects fresh vs existing DBs, runs pending migrations in order
|
|
- `migrations/versions/0001_rename_ls_to_paddle.py` — first versioned migration (absorbed from `scripts/migrate_to_paddle.py`)
|
|
- Server-side financial calculator (`planner/calculator.py`) — ported JS `calc()`, `pmt()`, `calcIRR()` to Python so the full financial model is no longer exposed in client-side JavaScript
|
|
- `POST /planner/calculate` endpoint for server-side computation
|
|
- Pre-computed initial data (`window.__PADELNOMICS_INITIAL_D__`) injected on page load for instant first render
|
|
- Debounced API fetch pattern in `planner.js` with `AbortController` for in-flight request cancellation
|
|
- Computing indicator CSS (`.planner-app--computing`) with subtle "computing..." text
|
|
- Comprehensive test suite for calculator (`tests/test_calculator.py` — 227 tests) covering all 4 venue/ownership combos, edge cases, and Hypothesis property-based fuzzing
|
|
- Comprehensive billing test suite (371 tests total):
|
|
- `tests/conftest.py` — shared fixtures (DB, app, clients, subscriptions, webhook helpers)
|
|
- `tests/test_billing_helpers.py` — unit tests for SQL helpers, feature/limit access, plan determination (60+ tests + parameterized + Hypothesis)
|
|
- `tests/test_billing_webhooks.py` — integration tests for LemonSqueezy webhooks (signature verification, all lifecycle events, Hypothesis fuzzing)
|
|
- `tests/test_billing_routes.py` — route tests (pricing, checkout, manage, cancel, resume, subscription_required decorator)
|
|
- Added `hypothesis>=6.100.0` and `respx>=0.22.0` to dev dependencies for property-based testing and httpx mocking
|
|
- **Factored into Copier template** — all billing tests now generate as `.jinja` templates with provider-specific conditionals for Stripe, Paddle, and LemonSqueezy
|
|
- GitLab CI/CD pipeline (`.gitlab-ci.yml`) — runs pytest + ruff on master/MRs, auto-deploys on master
|
|
- Blue-green deployment with Docker Compose profiles (`docker-compose.prod.yml`, `deploy.sh`)
|
|
- nginx router on port 5000 proxies to active blue/green slot
|
|
- Zero-downtime: new slot health-checked before traffic switch
|
|
- Automatic rollback on failed health check
|
|
|
|
### Removed
|
|
- `scripts/migrate_to_paddle.py` — superseded by `versions/0001_rename_ls_to_paddle.py`
|
|
|
|
### Changed
|
|
- `planner.js` no longer contains `calc()`, `pmt()`, or `calcIRR()` functions — computation moved server-side
|
|
- `render()` split into `render()` (tab switching + schedule calc) and `renderWith(d)` (DOM updates from data)
|
|
- Tab switching now renders from `_lastD` cache (instant, no API call)
|
|
- Slider input triggers 200ms debounced server call instead of synchronous client-side calc
|