From 0a89ba221346125eda6623370c75897362b105ef Mon Sep 17 00:00:00 2001 From: Deeman Date: Wed, 4 Mar 2026 15:33:35 +0100 Subject: [PATCH] docs: update CHANGELOG with interactive maps feature Co-Authored-By: Claude Opus 4.6 --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e14aeff..cb07563 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ## [Unreleased] ### Added +- **Interactive Leaflet maps** — geographic visualization across 4 key placements using self-hosted Leaflet 1.9.4 (GDPR-safe, no CDN): + - **Markets hub** (`/markets`): country bubble map with circles sized by total venues, colored by avg market score (green ≥ 60, amber 30-60, red < 30). Click navigates to country overview. + - **Country overview articles**: city bubble map loads after article render, auto-fits bounds, click navigates to city page. Bubbles colored by market score. + - **City cost articles**: venue dot map centered on city lat/lon (zoom 13), navy dots per venue with tooltip showing name + court breakdown (indoor/outdoor). + - **Opportunity map** (`//opportunity-map`): standalone full-width page with country selector. Circles sized by population, colored by opportunity score (green ≥ 70, amber 40-70, blue < 40). Existing venues shown as gray reference dots. + - New `/api` blueprint with 4 JSON endpoints (`/api/markets/countries.json`, `/api/markets//cities.json`, `/api/markets///venues.json`, `/api/opportunity/.json`) — 1-hour public cache headers, all queries against `analytics.duckdb` via `fetch_analytics`. + - New SQLMesh serving model `city_venue_locations` exposing venue lat/lon + court counts per city. + - `pseo_city_costs_de` serving model: added `lat`/`lon` columns for city map data attributes in baked articles. + - Leaflet CSS included on all article pages (5KB, cached). JS loaded dynamically only when a map container is present. - **Bulk actions for articles and leads** — checkbox selection + floating action bar on admin articles and leads pages (same pattern as suppliers). Articles: publish, unpublish, toggle noindex, rebuild, delete. Leads: set status, set heat. Re-renders results via HTMX after each action. - **Stripe payment provider** — second payment provider alongside Paddle, switchable via `PAYMENT_PROVIDER=stripe` env var. Existing Paddle subscribers keep working regardless of toggle — both webhook endpoints stay active. - `billing/stripe.py`: full Stripe implementation (Checkout Sessions, Billing Portal, subscription cancel, webhook verification + parsing)