feat(maps): add Stadia dark + tactical tile providers with API key support

- Add offline.stadia_key to OFFLINE_DEFAULTS in routes/offline.py
- Add stadia_dark and tactical tile providers to Settings.tileProviders
- Update getTileConfig() to inject Stadia API key or fall back to CartoDB dark
- Add setStadiaKey() method for saving and applying the API key
- Show/hide Stadia key row in setTileProvider() and _updateUI()
- Add Stadia options to tile provider select in settings modal
- Add Stadia API key input row to settings modal
- Add TDD tests for stadia_key backend

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
James Smith
2026-04-13 22:04:07 +01:00
parent 16b95e4804
commit e4df3eaecb
4 changed files with 165 additions and 68 deletions

View File

@@ -77,6 +77,8 @@
<option value="openstreetmap">OpenStreetMap</option>
<option value="cartodb_light">CartoDB Positron</option>
<option value="esri_world">ESRI World Imagery</option>
<option value="stadia_dark">Stadia Alidade Dark</option>
<option value="tactical">Stadia Tactical (minimal)</option>
<option value="custom">Custom URL</option>
</select>
</div>
@@ -90,6 +92,15 @@
onchange="Settings.setCustomTileUrl(this.value)">
</div>
</div>
<div class="settings-row" id="stadiaKeyRow" style="display: none;">
<div class="settings-label" style="width: 100%;">
<span class="settings-label-text">Stadia API Key</span>
<span class="settings-label-desc">Free at <a href="https://client.stadiamaps.com/signup/" target="_blank" style="color: var(--accent-cyan);">stadiamaps.com</a></span>
<input type="text" id="stadiaKeyInput" class="settings-input"
placeholder="your-api-key-here"
onchange="Settings.setStadiaKey(this.value)">
</div>
</div>
</div>
<div class="settings-group">