From c53d109c41e64bc19d2ea0ca644422289dd26964 Mon Sep 17 00:00:00 2001 From: zv Date: Tue, 23 Jun 2026 20:35:45 +0200 Subject: [PATCH] feat: add settings modal for map display --- src/app/App.tsx | 227 ++++++++++++++++++++++++++-------- src/features/map/MapView.tsx | 51 +++++++- src/features/map/mapStyles.ts | 57 +++++++++ src/styles.css | 163 ++++++++++++++++++++++++ 4 files changed, 441 insertions(+), 57 deletions(-) create mode 100644 src/features/map/mapStyles.ts diff --git a/src/app/App.tsx b/src/app/App.tsx index f8dfeef..e9b2fb5 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -1,5 +1,10 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { MapView } from '../features/map/MapView'; +import { + getMapTileStyle, + mapTileStyles, + type MapStyleId, +} from '../features/map/mapStyles'; import { ResultsList } from '../features/results/ResultsList'; import { buildOverpassQuery, @@ -75,6 +80,12 @@ export function App() { const [namedArea, setNamedArea] = useState(namedAreas[0]); const [results, setResults] = useState([]); const [selectedResultId, setSelectedResultId] = useState(null); + const [isSettingsOpen, setIsSettingsOpen] = useState(false); + const [mapStyleId, setMapStyleId] = useState('osm-standard'); + const [showAdvanced, setShowAdvanced] = useState(true); + const [showResultLabels, setShowResultLabels] = useState(false); + const [fitMapToResults, setFitMapToResults] = useState(false); + const [dimMapWhileLoading, setDimMapWhileLoading] = useState(true); const [queryMode, setQueryMode] = useState('generated'); const [customQuery, setCustomQuery] = useState(''); const [status, setStatus] = useState('idle'); @@ -93,6 +104,7 @@ export function App() { ); const commonFilters = selectedPreset?.commonFilters ?? []; + const mapTileStyle = useMemo(() => getMapTileStyle(mapStyleId), [mapStyleId]); const nearbyOptionGroups = useMemo(() => { const suggestedPresetIds = selectedPreset?.usefulNearbyPresetIds ?? []; @@ -227,7 +239,7 @@ export function App() { const response = await fetchOverpass(activeQuery); const parsedResults = parseOverpassResponse(response); setResults(parsedResults); - setSelectedResultId(parsedResults[0]?.id ?? null); + setSelectedResultId(fitMapToResults ? null : parsedResults[0]?.id ?? null); setStatus('success'); setMessage( parsedResults.length === 0 @@ -332,6 +344,14 @@ export function App() { } } + function handleShowAdvancedChange(isVisible: boolean) { + setShowAdvanced(isVisible); + + if (!isVisible) { + setQueryMode('generated'); + } + } + return (
+
@@ -600,61 +627,63 @@ export function App() { -
-
-
-

Query Preview

-

Advanced output generated from the current search.

+ {showAdvanced ? ( +
+
+
+

Query Preview

+

Advanced output generated from the current search.

+
-
-
- - -
-
-