From b1a8d0018080ca253c4a4946899862b92589da12 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 25 Sep 2026 21:51:33 +0000 Subject: [PATCH 01/11] chore(web): remove unmounted Places panel, activity indicator and layer notices None of the three is imported anywhere since the shell redesign; PlacesPanel was the only reader of the old search-here pending flag. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01J3QFugXbaTxPuuP3q3rR16 --- apps/web/src/ui/LayerNotices.tsx | 36 ---- apps/web/src/ui/PlacesPanel.tsx | 187 ----------------- apps/web/src/ui/shell/ActivityIndicator.tsx | 219 -------------------- 3 files changed, 442 deletions(-) delete mode 100644 apps/web/src/ui/LayerNotices.tsx delete mode 100644 apps/web/src/ui/PlacesPanel.tsx delete mode 100644 apps/web/src/ui/shell/ActivityIndicator.tsx diff --git a/apps/web/src/ui/LayerNotices.tsx b/apps/web/src/ui/LayerNotices.tsx deleted file mode 100644 index cf9580c..0000000 --- a/apps/web/src/ui/LayerNotices.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { getLayerPlugin } from "../layers"; -import { useMapStoreSnapshot } from "../store/useMapStoreSnapshot"; - -/** - * Explains a layer that came back empty on purpose. - * - * Without this an upstream refusing the request ("zoom in", "missing key", "service down") and - * an area that genuinely has nothing in it are the same blank map, and the user is left to - * guess which one they're looking at. - */ -export function LayerNotices({ inline = false }: { inline?: boolean } = {}) { - const notices = useMapStoreSnapshot((s) => s.layerNotices); - const active = useMapStoreSnapshot((s) => s.activeLayers); - const inAreaControls = useMapStoreSnapshot( - (s) => s.mode !== "game" && (s.mode === "discover" || !!s.areaSelection) - ); - - const visible = Object.entries(notices).filter(([layerId]) => active[layerId]?.visible); - if (!visible.length || (!inline && inAreaControls)) return null; - - return ( -
- {visible.map(([layerId, message]) => { - const manifest = getLayerPlugin(layerId)?.manifest; - return ( -
- {manifest?.icon ?? "ℹ️"} - - {manifest?.name ?? layerId} {message} - -
- ); - })} -
- ); -} diff --git a/apps/web/src/ui/PlacesPanel.tsx b/apps/web/src/ui/PlacesPanel.tsx deleted file mode 100644 index 6832610..0000000 --- a/apps/web/src/ui/PlacesPanel.tsx +++ /dev/null @@ -1,187 +0,0 @@ -import { useEffect, useMemo, useState } from "react"; -import type { GeoFeature } from "@mapos/layer-sdk"; -import { distanceMeters, featureAnchor } from "@mapos/layer-sdk"; -import { getMapStore } from "../store/mapStore"; -import { emit } from "../lib/events"; -import { useMapStoreSnapshot } from "../store/useMapStoreSnapshot"; -import { PIN_STYLES, type PinStyle } from "./presets"; -import { preloadPlacePhotos, resolvePhotoUrl } from "./photoCache"; -import { PanelShell } from "./PanelShell"; -import { SourceStatus } from "./SourceStatus"; -import { formatDistance } from "../lib/units"; - -function PlacePhoto({ feature, style }: { feature: GeoFeature; style?: PinStyle }) { - const lowData = useMapStoreSnapshot((s) => s.preferences.lowData); - const directPhoto = - typeof feature.properties.photo === "string" ? (feature.properties.photo as string) : null; - const wikidata = - typeof feature.properties.wikidata === "string" - ? (feature.properties.wikidata as string) - : null; - const [resolved, setResolved] = useState(directPhoto); - - useEffect(() => { - if (lowData) { - setResolved(null); - return; - } - setResolved(directPhoto); - let cancelled = false; - void resolvePhotoUrl({ photo: directPhoto, wikidata }).then((url) => { - if (!cancelled) setResolved(url); - }); - return () => { - cancelled = true; - }; - }, [wikidata, directPhoto, lowData]); - - if (resolved && !lowData) { - return ; - } - return ( -
- {style?.icon ?? "📍"} -
- ); -} - -export function PlacesTab() { - const store = getMapStore(); - const active = useMapStoreSnapshot((s) => s.activeLayers); - const visibleFeatures = useMapStoreSnapshot((s) => s.visibleFeatures); - const loadingLayers = useMapStoreSnapshot((s) => s.loadingLayers); - const view = useMapStoreSnapshot((s) => s.view); - const searchPending = useMapStoreSnapshot((s) => s.searchHerePending); - const lowData = useMapStoreSnapshot((s) => s.preferences.lowData); - const units = useMapStoreSnapshot((s) => s.preferences.units); - - const places = useMemo(() => { - const all: { feature: GeoFeature; layerId: string; distance: number }[] = []; - for (const [layerId, state] of Object.entries(active)) { - if (!state.visible) continue; - for (const feature of visibleFeatures[layerId] ?? []) { - const [lng, lat] = featureAnchor(feature); - all.push({ feature, layerId, distance: distanceMeters(view, { lng, lat }) }); - } - } - return all.sort((a, b) => a.distance - b.distance).slice(0, 60); - }, [active, visibleFeatures, view]); - - useEffect(() => { - if (lowData) return; - preloadPlacePhotos( - places.slice(0, 4).map((p) => ({ - photo: typeof p.feature.properties.photo === "string" ? p.feature.properties.photo : null, - wikidata: - typeof p.feature.properties.wikidata === "string" ? p.feature.properties.wikidata : null - })) - ); - }, [places, lowData]); - - const isLoading = Object.keys(loadingLayers).length > 0; - const hasActiveLayers = Object.values(active).some((s) => s.visible); - - const openPlace = (p: { feature: GeoFeature; layerId: string }) => { - const [lng, lat] = featureAnchor(p.feature); - emit("fly-to", { lng, lat, zoom: 16 }); - store.selectPin({ feature: p.feature, layerId: p.layerId }); - if (window.innerWidth < 900) store.setSidebarOpen(false); - }; - - if (!hasActiveLayers) { - return ( -
-

Zapni vrstvu přes ikonu vrstev v horní liště.

-
- ); - } - - if (!places.length) { - return ( -
- {isLoading ? ( - <> - {[0, 1, 2].map((i) => ( -
- ))} - - ) : searchPending ? ( - <> -

Posunul jsi mapu. Načti místa v tomto výřezu.

- - - ) : ( -

- V tomto výřezu nic není. Zkus usecase Gastro / Město, nebo přibliž mapu a klepni Hledat - zde. -

- )} -
- ); - } - - return ( -
- {places.map((p) => { - const category = String(p.feature.properties.category ?? p.layerId); - const style = PIN_STYLES[category]; - const tags = Array.isArray(p.feature.properties.tags) - ? (p.feature.properties.tags as string[]) - : []; - return ( - - ); - })} -
- ); -} - -export function PlacesPanel() { - const open = useMapStoreSnapshot((s) => s.sidebarOpen); - const mode = useMapStoreSnapshot((s) => s.mode); - - if (!open || mode === "discover") return null; - - return ( - } - > - - - ); -} diff --git a/apps/web/src/ui/shell/ActivityIndicator.tsx b/apps/web/src/ui/shell/ActivityIndicator.tsx deleted file mode 100644 index 98a8a28..0000000 --- a/apps/web/src/ui/shell/ActivityIndicator.tsx +++ /dev/null @@ -1,219 +0,0 @@ -import { useEffect, useMemo, useRef, useState } from "react"; -import { t } from "../../i18n"; -import { getShellStore } from "../../store/shellStore"; -import { useShellStoreSnapshot } from "../../store/useShellStoreSnapshot"; -import { taskRegistry } from "../../tasks/TaskRegistry"; -import { useTaskRegistrySnapshot } from "../../tasks/useTaskRegistrySnapshot"; -import { Button, Icon, Popover } from "../kit"; -import { activityRows, activitySummary } from "./activityModel"; - -/** Nothing is shown for the first third of a second: most layer queries resolve inside it, and - * a pill that appears and vanishes again is worse than no pill. */ -const APPEAR_DELAY_MS = 300; -/** And nothing is taken away for a moment after the last row goes. A layer refresh retires its - * task before starting the replacement, so the list is empty for a tick in the middle of one - * piece of work; hiding on that tick unmounted the pill along with any popover open on it. */ -const LINGER_MS = 400; -/** How long a finished row keeps its tick before fading out. */ -const SUCCESS_HOLD_MS = 200; -/** Failures stay long enough to read and click. */ -const FAILURE_HOLD_MS = 5000; - -/** The one loading surface in the app (§4.12), bottom right above the zoom controls. - * - * It replaces both the letter strip of place sources and the expandable task centre: those - * told the user which of seven providers was slow, which is information for the layer drawer, - * not for someone watching the map. - */ -export function ActivityIndicator() { - const shell = getShellStore(); - const rightUtilityOpen = useShellStoreSnapshot((state) => state.rightUtility.type !== "closed"); - const footerActive = useShellStoreSnapshot((state) => state.footerContributions.length > 0); - const tasks = useTaskRegistrySnapshot((snapshot) => snapshot); - - // Ids of tasks that have finished but whose row is still on screen. Held here rather than in - // the registry because the hold time is a presentation choice. - const [settled, setSettled] = useState>(() => new Set()); - const [visible, setVisible] = useState(false); - const timersRef = useRef(new Map()); - // Tasks whose hold window has already been granted. A finished task stays in the registry, - // so without this the next registry change would grant it another one and its row would - // reappear for as long as anything else on the map keeps loading. - const heldRef = useRef(new Set()); - - useEffect(() => { - const timers = timersRef.current; - const held = heldRef.current; - const live = new Set(tasks.map((task) => task.id)); - for (const id of held) { - if (!live.has(id)) held.delete(id); - } - for (const task of tasks) { - if (task.status !== "succeeded" && task.status !== "failed") continue; - if (held.has(task.id)) continue; - held.add(task.id); - const hold = task.status === "failed" ? FAILURE_HOLD_MS : SUCCESS_HOLD_MS; - setSettled((current) => new Set(current).add(task.id)); - timers.set( - task.id, - window.setTimeout(() => { - timers.delete(task.id); - setSettled((current) => { - const next = new Set(current); - next.delete(task.id); - return next; - }); - }, hold) - ); - } - }, [tasks]); - - useEffect(() => { - const timers = timersRef.current; - return () => { - for (const timer of timers.values()) window.clearTimeout(timer); - timers.clear(); - }; - }, []); - - const rows = useMemo(() => activityRows(tasks, settled), [tasks, settled]); - const hasRows = rows.length > 0; - const lastRowsRef = useRef(rows); - - useEffect(() => { - const timer = window.setTimeout( - () => setVisible(hasRows), - hasRows ? APPEAR_DELAY_MS : LINGER_MS - ); - return () => window.clearTimeout(timer); - }, [hasRows]); - - // What the pill showed last, so it has something to show through the linger. - if (hasRows) lastRowsRef.current = rows; - const shownRows = hasRows ? rows : lastRowsRef.current; - - if (!visible || shownRows.length === 0) return null; - - const failed = shownRows.some((row) => row.tone === "error"); - // Everything the pill knows about, not just the three rows it would have drawn: "2/5" is only - // honest if the five is every source that was asked. - const known = tasks.filter( - (task) => task.status === "queued" || task.status === "running" || settled.has(task.id) - ).length; - const summary = activitySummary(shownRows, Math.max(known, shownRows.length)); - const lead = shownRows[0]!; - // A row here is "this layer needs you", not "this attempt failed". Every refresh retires the - // old task and starts one with a fresh id, so keying on the id tore the row down and built a - // new one mid-refresh — a user reaching for Zkusit znovu could have it vanish under the - // cursor. One row per layer, updated in place, and the newest attempt is the one it shows. - const actionable = [ - ...tasks - .filter( - (task) => - task.status === "failed" || - ((task.status === "queued" || task.status === "running") && task.cancellable) - ) - .reduce((byLayer, task) => { - byLayer.set(task.layerId ?? task.id, task); - return byLayer; - }, new Map()) - ]; - - return ( - - ); -} From a477ede12a0a80169d1a444b8077cb3fe37878ee Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 25 Sep 2026 21:51:33 +0000 Subject: [PATCH 02/11] feat(search): rank places near the map on screen first MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A search for "Náměstí Míru" over Brno found Prague's square first, because the geocoder never learned where the reader was looking. Search now sends the centre of the view as `near` (two decimals, only from region zoom), and `/geocode` passes it on as a bias, never a filter: Mapy `preferNear` for geocode and suggest, a Nominatim `viewbox` with `bounded=0`, and distance as the tie-breaker in the offline gazetteer. Planning stop search sends the same bias. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01J3QFugXbaTxPuuP3q3rR16 --- apps/api/src/data/offlineGazetteer.ts | 12 ++- apps/api/src/index.ts | 85 ++++++++++--------- apps/api/src/memory-server.ts | 9 +- .../src/services/geocodePresentation.test.ts | 11 +++ apps/api/src/services/geocodePresentation.ts | 28 ++++++ apps/api/src/services/mapyService.ts | 16 +++- apps/web/src/search/nearBias.test.ts | 10 +++ apps/web/src/search/nearBias.ts | 12 +++ apps/web/src/ui/CommandSearch.tsx | 7 +- .../web/src/ui/planning/StopLocationInput.tsx | 4 +- 10 files changed, 146 insertions(+), 48 deletions(-) create mode 100644 apps/web/src/search/nearBias.test.ts create mode 100644 apps/web/src/search/nearBias.ts diff --git a/apps/api/src/data/offlineGazetteer.ts b/apps/api/src/data/offlineGazetteer.ts index 16fc083..bcb757c 100644 --- a/apps/api/src/data/offlineGazetteer.ts +++ b/apps/api/src/data/offlineGazetteer.ts @@ -135,7 +135,13 @@ function fold(value: string): string { } /** Entries whose name the query starts, contains, or is contained in — never a blind default. */ -export function searchOfflineGazetteer(query: string, limit = 5): OfflineGazetteerEntry[] { +/** Matches by name; with `near`, equally good matches are ordered by distance from it, the way + * the live geocoders rank the place on screen first. */ +export function searchOfflineGazetteer( + query: string, + limit = 5, + near?: [number, number] | null +): OfflineGazetteerEntry[] { const needle = fold(query); if (needle.length < 2) return []; const scored = OFFLINE_GAZETTEER.map((entry) => { @@ -150,8 +156,10 @@ export function searchOfflineGazetteer(query: string, limit = 5): OfflineGazette : 0; return { entry, score }; }).filter(({ score }) => score > 0); + const distance = (entry: OfflineGazetteerEntry) => + near ? Math.hypot(entry.longitude - near[0], entry.latitude - near[1]) : 0; return scored - .sort((a, b) => b.score - a.score) + .sort((a, b) => b.score - a.score || distance(a.entry) - distance(b.entry)) .slice(0, limit) .map(({ entry }) => entry); } diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 767d3f3..522ecb3 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -71,6 +71,8 @@ import { } from "./services/socialService.js"; import { mapyGeocode, mapySuggest } from "./services/mapyService.js"; import { + nearViewbox, + parseNearPoint, presentMapyGeocodeResult, presentNominatimGeocodeResult, type NominatimGeocodeItem @@ -1554,48 +1556,55 @@ export async function buildApp(options: BuildAppOptions = {}) { return { url }; }); - app.get<{ Querystring: { q?: string; provider?: string; autocomplete?: string } }>( - "/geocode", - async (request, reply) => { - const q = (request.query.q ?? "").trim(); - if (q.length < 2) return { results: [] }; - - // Mapy geocoding is markedly better in CZ/SK; Nominatim stays the keyless default and the - // fallback whenever Mapy is unavailable, so search never goes dead. - if (request.query.provider !== "osm" && capabilities().mapy) { - try { - const items = - request.query.autocomplete === "true" - ? await mapySuggest({ query: q, limit: 5, type: "all" }) - : await mapyGeocode(q, "cs", 5); - if (items.length) { - return { - results: items.map(presentMapyGeocodeResult) - }; - } - } catch (err) { - app.log.warn(safeErrorLogFields(err), "mapy geocode failed, falling back to nominatim"); + app.get<{ + Querystring: { q?: string; provider?: string; autocomplete?: string; near?: string }; + }>("/geocode", async (request, reply) => { + const q = (request.query.q ?? "").trim(); + if (q.length < 2) return { results: [] }; + // The centre of the map on screen, so a search ranks places there first. A bias, never a + // filter: a place elsewhere is still found. + const near = parseNearPoint(request.query.near); + + // Mapy geocoding is markedly better in CZ/SK; Nominatim stays the keyless default and the + // fallback whenever Mapy is unavailable, so search never goes dead. + if (request.query.provider !== "osm" && capabilities().mapy) { + try { + const items = + request.query.autocomplete === "true" + ? await mapySuggest({ + query: q, + limit: 5, + type: "all", + ...(near ? { preferNear: near } : {}) + }) + : await mapyGeocode(q, "cs", 5, undefined, near ?? undefined); + if (items.length) { + return { + results: items.map(presentMapyGeocodeResult) + }; } + } catch (err) { + app.log.warn(safeErrorLogFields(err), "mapy geocode failed, falling back to nominatim"); } + } - if (request.query.autocomplete === "true") return { results: [] }; - try { - const url = `https://nominatim.openstreetmap.org/search?format=jsonv2&addressdetails=1&limit=5&q=${encodeURIComponent(q)}`; - const data = await fetchJson(url, { - providerId: "nominatim", - ttlMs: 24 * 60 * 60_000, - timeoutMs: 8_000, - minIntervalMs: 1_100, - maxResponseBytes: 512 * 1024 - }); - return { - results: data.map(presentNominatimGeocodeResult) - }; - } catch { - return reply.code(502).send({ results: [] }); - } + if (request.query.autocomplete === "true") return { results: [] }; + try { + const url = `https://nominatim.openstreetmap.org/search?format=jsonv2&addressdetails=1&limit=5&q=${encodeURIComponent(q)}${near ? `&viewbox=${nearViewbox(near)}&bounded=0` : ""}`; + const data = await fetchJson(url, { + providerId: "nominatim", + ttlMs: 24 * 60 * 60_000, + timeoutMs: 8_000, + minIntervalMs: 1_100, + maxResponseBytes: 512 * 1024 + }); + return { + results: data.map(presentNominatimGeocodeResult) + }; + } catch { + return reply.code(502).send({ results: [] }); } - ); + }); app.get<{ Querystring: { lat?: string; lng?: string } }>("/geocode/reverse", async (request) => { const lat = Number(request.query.lat); diff --git a/apps/api/src/memory-server.ts b/apps/api/src/memory-server.ts index 565e51c..73fc6cc 100644 --- a/apps/api/src/memory-server.ts +++ b/apps/api/src/memory-server.ts @@ -114,6 +114,7 @@ import { memoryPlanShareRepository } from "./services/planShareMemoryRepository. import { memoryPlanDiscussionRepository } from "./services/planDiscussionMemoryRepository.js"; import { createMemoryAdjacentRouteProvider } from "./services/adjacentRouteProvider.js"; import { searchOfflineGazetteer } from "./data/offlineGazetteer.js"; +import { parseNearPoint } from "./services/geocodePresentation.js"; import { dataSourceProviders } from "./services/dataSources/index.js"; import { withOfflinePlaces } from "./services/ai/offlinePlaces.js"; import { EventService } from "./services/events/eventService.js"; @@ -1628,8 +1629,12 @@ export async function buildMemoryApp(options: MemoryAppOptions = {}) { app.get("/photos/resolve", async () => ({ url: null })); - app.get<{ Querystring: { q?: string } }>("/geocode", async (request) => ({ - results: searchOfflineGazetteer(request.query.q ?? "").map((entry) => ({ + app.get<{ Querystring: { q?: string; near?: string } }>("/geocode", async (request) => ({ + results: searchOfflineGazetteer( + request.query.q ?? "", + 5, + parseNearPoint(request.query.near) + ).map((entry) => ({ display_name: `${entry.name}, Česko`, lat: String(entry.latitude), lon: String(entry.longitude), diff --git a/apps/api/src/services/geocodePresentation.test.ts b/apps/api/src/services/geocodePresentation.test.ts index d685411..914f6ba 100644 --- a/apps/api/src/services/geocodePresentation.test.ts +++ b/apps/api/src/services/geocodePresentation.test.ts @@ -2,6 +2,8 @@ import assert from "node:assert/strict"; import test from "node:test"; import { geocodeConfidence, + nearViewbox, + parseNearPoint, presentMapyGeocodeResult, presentNominatimGeocodeResult } from "./geocodePresentation.js"; @@ -52,3 +54,12 @@ test("confidence is explicitly ordinal instead of pretending to be a provider pr assert.equal(geocodeConfidence(2).level, "medium"); assert.equal(geocodeConfidence(20).level, "low"); }); + +test("the near-point search bias is coarse and ignores malformed input", () => { + assert.deepEqual(parseNearPoint("14.42076,50.08804"), [14.42, 50.09]); + assert.deepEqual(parseNearPoint(" -0.1276 , 51.5072 "), [-0.13, 51.51]); + for (const value of [undefined, "", "14.4", "a,b", "14,50,1", "200,50", "14,95", "1".repeat(80)]) + assert.equal(parseNearPoint(value), null, String(value)); + assert.equal(nearViewbox([14.42, 50.09]), "14.12,50.39,14.72,49.79"); + assert.equal(nearViewbox([179.9, 89.9]), "179.6,90,180,89.6"); +}); diff --git a/apps/api/src/services/geocodePresentation.ts b/apps/api/src/services/geocodePresentation.ts index 6c74570..1155c19 100644 --- a/apps/api/src/services/geocodePresentation.ts +++ b/apps/api/src/services/geocodePresentation.ts @@ -97,3 +97,31 @@ export function presentNominatimGeocodeResult( confidence: geocodeConfidence(index) }; } + +/** + * Reads the `near=lng,lat` search bias. Rounded to two decimals (about a kilometre): enough to + * rank the right town first, coarse enough that the provider never learns the exact view and + * repeated searches over one city share a cached answer. Anything malformed is simply no bias. + */ +export function parseNearPoint(value: string | undefined): [number, number] | null { + if (!value || value.length > 64) return null; + const parts = value.split(","); + if (parts.length !== 2) return null; + const [lng, lat] = parts.map((part) => Number(part.trim())) as [number, number]; + if (!Number.isFinite(lng) || !Number.isFinite(lat) || Math.abs(lng) > 180 || Math.abs(lat) > 90) + return null; + return [Math.round(lng * 100) / 100, Math.round(lat * 100) / 100]; +} + +/** A Nominatim `viewbox` (left,top,right,bottom) of roughly a city region around the point. */ +export function nearViewbox([lng, lat]: [number, number], span = 0.3): string { + const clamp = (value: number, limit: number) => Math.max(-limit, Math.min(limit, value)); + return [ + clamp(lng - span, 180), + clamp(lat + span, 90), + clamp(lng + span, 180), + clamp(lat - span, 90) + ] + .map((value) => Number(value.toFixed(2))) + .join(","); +} diff --git a/apps/api/src/services/mapyService.ts b/apps/api/src/services/mapyService.ts index b16e3f7..f43aafe 100644 --- a/apps/api/src/services/mapyService.ts +++ b/apps/api/src/services/mapyService.ts @@ -119,13 +119,25 @@ function normalizeItems(data: MapyItemsResponse): MapyGeocodeItem[] { })); } +/** `preferNear` ranks matches close to a point higher without excluding the rest — the same + * "Náměstí Míru" in the city on screen before the one across the country. */ export async function mapyGeocode( query: string, lang = "cs", limit = 8, - signal?: AbortSignal + signal?: AbortSignal, + preferNear?: [number, number] ): Promise { - const data = await mapyJson("/v1/geocode", { query, lang, limit }, signal); + const data = await mapyJson( + "/v1/geocode", + { + query, + lang, + limit, + preferNear: preferNear ? `${preferNear[0]},${preferNear[1]}` : undefined + }, + signal + ); return normalizeItems(data); } diff --git a/apps/web/src/search/nearBias.test.ts b/apps/web/src/search/nearBias.test.ts new file mode 100644 index 0000000..a72fb2d --- /dev/null +++ b/apps/web/src/search/nearBias.test.ts @@ -0,0 +1,10 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { geocodeNearParam } from "./nearBias"; + +test("a place search is biased to the region on screen, coarsely", () => { + assert.equal(geocodeNearParam({ lng: 16.60796, lat: 49.19522, zoom: 13 }), "&near=16.61,49.20"); + assert.equal(geocodeNearParam({ lng: 16.6, lat: 49.2, zoom: 3 }), "", "continent view"); + assert.equal(geocodeNearParam({ lng: Number.NaN, lat: 49.2, zoom: 12 }), ""); + assert.equal(geocodeNearParam(null), ""); +}); diff --git a/apps/web/src/search/nearBias.ts b/apps/web/src/search/nearBias.ts new file mode 100644 index 0000000..274d013 --- /dev/null +++ b/apps/web/src/search/nearBias.ts @@ -0,0 +1,12 @@ +/** + * The `near` bias a place search sends: the centre of the map on screen, so "Náměstí Míru" typed + * over Brno finds the one in Brno first. Coarse (two decimals, about a kilometre) and only once + * the map shows a region rather than a continent, where its centre means nothing. + */ +export function geocodeNearParam( + view: { lng: number; lat: number; zoom: number } | null | undefined +): string { + if (!view || !Number.isFinite(view.lng) || !Number.isFinite(view.lat) || !(view.zoom >= 5)) + return ""; + return `&near=${view.lng.toFixed(2)},${view.lat.toFixed(2)}`; +} diff --git a/apps/web/src/ui/CommandSearch.tsx b/apps/web/src/ui/CommandSearch.tsx index 6f655e4..cd56707 100644 --- a/apps/web/src/ui/CommandSearch.tsx +++ b/apps/web/src/ui/CommandSearch.tsx @@ -1,4 +1,5 @@ import { maptilerGeocode } from "../search/maptilerGeocoding"; +import { geocodeNearParam } from "../search/nearBias"; import { normalizeCatalogText } from "@mapos/layer-sdk"; import { SearchLayers } from "./layers/SearchLayers"; import { chatSession, useChatField } from "./ai/chatSession"; @@ -261,7 +262,7 @@ export function CommandSearch({ } try { const response = await fetch( - `${API_BASE}/geocode?q=${encodeURIComponent(intent.query)}&provider=auto&autocomplete=true`, + `${API_BASE}/geocode?q=${encodeURIComponent(intent.query)}&provider=auto&autocomplete=true${geocodeNearParam(getMapStore().view)}`, { signal } ); if (!response.ok) throw new Error(`HTTP ${response.status}`); @@ -385,7 +386,7 @@ export function CommandSearch({ if (store.capabilities?.maptilerGeocoding) { try { const response = await fetch( - `${API_BASE}/geocode?q=${encodeURIComponent(submitted)}&provider=auto&autocomplete=true`, + `${API_BASE}/geocode?q=${encodeURIComponent(submitted)}&provider=auto&autocomplete=true${geocodeNearParam(getMapStore().view)}`, { signal } ); if (response.ok) { @@ -400,7 +401,7 @@ export function CommandSearch({ } } const response = await fetch( - `${API_BASE}/geocode?q=${encodeURIComponent(submitted)}&provider=auto`, + `${API_BASE}/geocode?q=${encodeURIComponent(submitted)}&provider=auto${geocodeNearParam(getMapStore().view)}`, { signal } ); if (!response.ok) throw new Error("Hledání se nepodařilo dokončit."); diff --git a/apps/web/src/ui/planning/StopLocationInput.tsx b/apps/web/src/ui/planning/StopLocationInput.tsx index 76fb7ad..24e691a 100644 --- a/apps/web/src/ui/planning/StopLocationInput.tsx +++ b/apps/web/src/ui/planning/StopLocationInput.tsx @@ -1,5 +1,7 @@ import { useEffect, useMemo, useRef, useState } from "react"; import { API_BASE } from "../../lib/api"; +import { getMapStore } from "../../store/mapStore"; +import { geocodeNearParam } from "../../search/nearBias"; import { isValidCoordinates, LatestRequestRunner, @@ -105,7 +107,7 @@ export function StopLocationInput({ void runner .run(async (signal) => { const response = await fetch( - `${API_BASE}/geocode?q=${encodeURIComponent(intent.query)}&provider=${encodeURIComponent(provider)}`, + `${API_BASE}/geocode?q=${encodeURIComponent(intent.query)}&provider=${encodeURIComponent(provider)}${geocodeNearParam(getMapStore().view)}`, { signal } ); if (!response.ok) return []; From 6916220802a5cd65260a589386b3dafebd40df31 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 25 Sep 2026 21:51:33 +0000 Subject: [PATCH 03/11] feat(web): float "Search this area" over the map after a move MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After a long pan the pin layers deliberately wait to be asked, but the only button that asked lived inside the Map status popover, so the map simply seemed not to load. The button now floats over the map (above a phone's sheet, stacked with Discover's chip) whenever the view is waiting for it, and it means one thing: layers that wait for the button. Loading, partial and failed layers keep their own indicators; counting them, and every expensive layer during the debounce before an automatic load, made it flicker. - Pressing it brings only out-of-date layers up to date for the view (`LayerEngine.searchHere`); layers already loaded or loading for it cost nothing, fresh data is not refetched and tiles are not reattached. - With the assistant open, the last place search is offered again once the reader has moved the map (drag, wheel, keys — MapLibre's `originalEvent`), and pressing it asks that question for the new view. The answer's own camera fit does not count as a move. - Jumps that ask for data right after starting a flight (a search result, My location, a country) waited for nothing and loaded the view being left, so the destination then waited for the button. The request now waits for the camera to land. - Settings: the unused "Search this area" switch becomes "Load only on Search this area" (`manualRefresh`, off by default): the reader's own moves then load nothing until asked, while programmatic jumps still load. A move whose refresh waits for the basemap's idle keeps that flag. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01J3QFugXbaTxPuuP3q3rR16 --- apps/web/src/engine/LayerEngine.test.ts | 110 +++++++++++++++++ apps/web/src/engine/LayerEngine.ts | 73 ++++++++---- apps/web/src/i18n/cs.ts | 7 +- apps/web/src/i18n/en.ts | 5 +- apps/web/src/map/MapCore.tsx | 36 ++++-- apps/web/src/search/areaQuery.test.ts | 27 +++++ apps/web/src/search/areaQuery.ts | 63 ++++++++++ apps/web/src/settings/preferences.test.ts | 4 +- apps/web/src/settings/preferences.ts | 7 +- apps/web/src/styles/chrome.css | 12 +- apps/web/src/ui/AiPanel.tsx | 23 ++++ apps/web/src/ui/SearchHereButton.tsx | 67 ++++++----- apps/web/src/ui/SettingsSheet.tsx | 8 +- apps/web/src/ui/shell/AppShell.tsx | 5 + apps/web/src/ui/shell/MapStatus.tsx | 2 - apps/web/src/ui/shell/mapStatus.css | 5 - e2e/aiPanel.spec.ts | 32 +++++ e2e/viewportRefresh.spec.ts | 139 +++++++++++++++++++--- 18 files changed, 532 insertions(+), 93 deletions(-) create mode 100644 apps/web/src/search/areaQuery.test.ts create mode 100644 apps/web/src/search/areaQuery.ts diff --git a/apps/web/src/engine/LayerEngine.test.ts b/apps/web/src/engine/LayerEngine.test.ts index d9c9bdb..29a441d 100644 --- a/apps/web/src/engine/LayerEngine.test.ts +++ b/apps/web/src/engine/LayerEngine.test.ts @@ -947,3 +947,113 @@ test("progressive retries back off from the server hint and stay bounded", () => assert.equal(progressiveRetryDelay(2000, 20), 15000); assert.equal(progressiveRetryDelay(10, 1), 1000); }); + +function searchHereHarness( + t: { after(fn: () => void): void }, + viewportCost: "cheap" | "expensive", + preferences: { manualRefresh: boolean } = { manualRefresh: false } +) { + resetLayerRegistry(); + const events = new EventTarget(); + Object.defineProperty(globalThis, "window", { + configurable: true, + value: { + addEventListener: events.addEventListener.bind(events), + removeEventListener: events.removeEventListener.bind(events) + } + }); + const requested: Bbox[] = []; + const pending: boolean[] = []; + registerLayer({ + kind: "pins", + viewportCost, + manifest: { + id: "area", + name: "Area", + icon: "x", + color: "#000000", + description: "Area", + category: "user" + }, + create: () => ({ + async update(bbox) { + requested.push(bbox); + return collection("a"); + }, + setData() {}, + setVisible() {}, + setOpacity() {}, + detach() {} + }) + }); + const store = { + view: { zoom: 14 }, + preferences, + activeLayers: { area: { visible: true, opacity: 1, filters: {} } }, + session: null, + activeTag: null, + countryCode: null, + enabledPoiSources: [], + setVisibleFeatures() {}, + setLayerLoading() {}, + setLayerNotice() {}, + setSearchHerePending(value: boolean) { + pending.push(value); + }, + markSourcesLoading() {}, + applySourceMeta() {} + } as unknown as MapStore; + const engine = new LayerEngine({} as never, "/api", store, new TaskRegistry()); + t.after(() => engine.destroy()); + return { engine, requested, pending: () => pending.at(-1) ?? false }; +} + +const PLZEN: Bbox = [13.36, 49.74, 13.39, 49.755]; +const PRAHA: Bbox = [14.41, 50.08, 14.44, 50.095]; + +test("a long move leaves an expensive layer waiting, and Search this area loads only it", async (t) => { + const { engine, requested, pending } = searchHereHarness(t, "expensive"); + engine.refresh(PLZEN, true); + await waitFor(() => requested.length === 1); + assert.equal(pending(), false); + + engine.refresh(PRAHA); + await wait(400); + assert.equal(requested.length, 1, "a jump across the country waits to be asked"); + assert.equal(pending(), true, "and says so"); + + engine.searchHere(PRAHA); + await waitFor(() => requested.length === 2); + assert.deepEqual(requested[1], snapBboxToTileGrid(PRAHA, 14)); + await waitFor(() => pending() === false); + + engine.searchHere(PRAHA); + await wait(50); + assert.equal(requested.length, 2, "pressing it again for a loaded view costs nothing"); +}); + +test("while an expensive layer loads after a short pan it is not reported as waiting", async (t) => { + const { engine, requested, pending } = searchHereHarness(t, "expensive"); + engine.refresh(PLZEN, true); + await waitFor(() => requested.length === 1); + // Half a screen east: past the fetched tiles, well within the automatic refresh distance. + engine.refresh([13.375, 49.74, 13.405, 49.755]); + assert.equal(pending(), false, "the debounce before an automatic load is not a question"); + await waitFor(() => requested.length === 2); + assert.equal(pending(), false); +}); + +test("with manual refresh the reader's own move waits, a programmatic one still loads", async (t) => { + const { engine, requested, pending } = searchHereHarness(t, "cheap", { manualRefresh: true }); + engine.refresh(PLZEN, true); + await waitFor(() => requested.length === 1); + + engine.refresh([13.4, 49.74, 13.43, 49.755], false, { userMoved: true }); + await wait(400); + assert.equal(requested.length, 1, "a drag loads nothing"); + assert.equal(pending(), true); + + engine.refresh(PRAHA); + await waitFor(() => requested.length === 2); + await waitFor(() => pending() === false); +}); diff --git a/apps/web/src/engine/LayerEngine.ts b/apps/web/src/engine/LayerEngine.ts index 4a80e9f..56c5b0a 100644 --- a/apps/web/src/engine/LayerEngine.ts +++ b/apps/web/src/engine/LayerEngine.ts @@ -403,8 +403,10 @@ export class LayerEngine { this.refresh(bbox); } - /** Invalidate obsolete work immediately, including the debounce interval. */ - refresh(bbox: Bbox, force = false) { + /** Invalidate obsolete work immediately, including the debounce interval. `userMoved` marks a + * refresh caused by the reader's own pan or zoom, which the manual-refresh preference defers + * until "Search this area". */ + refresh(bbox: Bbox, force = false, { userMoved = false }: { userMoved?: boolean } = {}) { if (this.destroyed) return; this.lastBbox = bbox; if (this.refreshTimer) clearTimeout(this.refreshTimer); @@ -433,10 +435,40 @@ export class LayerEngine { } this.refreshTimer = setTimeout(() => { this.refreshTimer = null; - this.doRefresh(bbox, false); + this.doRefresh(bbox, false, userMoved); }, DEFAULT_REFRESH_DEBOUNCE_MS); } + /** + * "Search this area": brings every visible layer up to date for this view — the ones waiting + * for the button, failed or partial ones, and any whose answer covers a different area — and + * leaves alone the ones already loaded or loading for it. Unlike a forced refresh it does not + * refetch fresh data or reattach tiles, so pressing it twice costs nothing. + */ + searchHere(bbox: Bbox) { + if (this.destroyed) return; + this.lastBbox = bbox; + this.syncLayers(this.store.activeLayers); + for (const [id, managed] of this.managed) { + if (!this.store.activeLayers[id]?.visible) continue; + const query = this.query(id, managed, bbox); + const state = this.states.get(id); + if (this.controllers.has(id) && state?.key === query.key) continue; + const upToDate = + state?.status === "ready" && + state.filterKey === query.filterKey && + state.acceptedAt != null && + Date.now() - state.acceptedAt < (state.ttl ?? query.ttl) && + (query.global || + query.tiled || + query.manual || + state.key === query.key || + Boolean(state.bbox && containsBbox(state.bbox, bbox))); + if (!upToDate) this.refreshLayer(id, bbox); + } + this.updatePending(); + } + private invalidate(id: string) { this.tileObservers.get(id)?.(); this.tileObservers.delete(id); @@ -457,7 +489,8 @@ export class LayerEngine { this.store.setLayerLoading(id, false); } - private doRefresh(bbox: Bbox, force: boolean) { + private doRefresh(bbox: Bbox, force: boolean, userMoved = false) { + const manual = userMoved && !force && Boolean(this.store.preferences?.manualRefresh); this.syncLayers(this.store.activeLayers); for (const [id, managed] of this.managed) { if ( @@ -489,13 +522,16 @@ export class LayerEngine { (query.global || query.tiled || query.manual || (covered && managed.plugin.kind === "pins")) ) continue; + // A long move leaves an expensive layer waiting for "Search this area"; with the manual + // preference every viewport layer that already shows data waits after the reader's move. if ( !force && sameFilters && state?.bbox && - viewportCostOf(managed.plugin) === "expensive" && !query.global && - viewportDrift(state.viewport ?? state.bbox, bbox) > PIN_CONFIRM_DRIFT + ((viewportCostOf(managed.plugin) === "expensive" && + viewportDrift(state.viewport ?? state.bbox, bbox) > PIN_CONFIRM_DRIFT) || + (manual && !query.tiled && !query.manual)) ) { state.status = "pending"; layerActivity.state(id, "pending"); @@ -776,23 +812,18 @@ export class LayerEngine { } } + /** Only layers that deliberately wait for "Search this area" count. A layer that is loading, + * retrying a partial answer or showing a failure has its own indicator; counting those (and + * every expensive layer between a pan and its debounced load) made the button flicker. */ private updatePending() { - const bbox = this.lastBbox; this.store.setSearchHerePending( - [...this.managed].some(([id, managed]) => { - if ( - !this.store.activeLayers[id]?.visible || - (managed.plugin.minQueryZoom != null && - this.store.view.zoom < managed.plugin.minQueryZoom) - ) - return false; - const state = this.states.get(id); - if (state?.status === "partial" || state?.status === "error" || state?.status === "pending") - return true; - if (!bbox || !state?.bbox || viewportCostOf(managed.plugin) !== "expensive") return false; - const query = this.query(id, managed, bbox); - return !query.global && !query.tiled && !containsBbox(state.bbox, bbox); - }) + [...this.managed].some( + ([id, managed]) => + this.store.activeLayers[id]?.visible && + (managed.plugin.minQueryZoom == null || + this.store.view.zoom >= managed.plugin.minQueryZoom) && + this.states.get(id)?.status === "pending" + ) ); } diff --git a/apps/web/src/i18n/cs.ts b/apps/web/src/i18n/cs.ts index 2c748c4..f4444aa 100644 --- a/apps/web/src/i18n/cs.ts +++ b/apps/web/src/i18n/cs.ts @@ -399,7 +399,9 @@ export const cs = { "search.kind.poi": "Místo / POI", "search.kind.peak": "Vrchol", "search.kind.place": "Místo", - "search.searchHere": "Hledat v této oblasti", + "search.searchHere": "Hledat tady", + "search.searchingHere": "Hledám tady…", + "search.searchHere.again": "Hledat tady: znovu „{query}“ pro tento výřez", // ---- Panel chrome ---------------------------------------------------- "panel.close": "Zavřít", @@ -574,8 +576,9 @@ export const cs = { "Fotografie míst načítat až na vyžádání; paměť dlaždic omezit na 16 MiB.", "settings.loadMedia": "Načíst fotografie a média", "settings.flyAnimations": "Animace přeletů", + "settings.manualRefresh": "Načítat až po „Hledat tady“", "settings.searchHere.info": - "Po posunu mapy nabídne ruční obnovení dat, aby se během tažení neposílaly dotazy.", + "Posun mapy nic nenačítá; data pro nový výřez obnovíš tlačítkem Hledat tady. Šetří data i baterii.", "settings.account.guestInfo": "Anonymní profil je uložený v tomto prohlížeči. Uložením účtu ho přeneseš i jinam.", "settings.account.localInfo": diff --git a/apps/web/src/i18n/en.ts b/apps/web/src/i18n/en.ts index 407468e..47d0b65 100644 --- a/apps/web/src/i18n/en.ts +++ b/apps/web/src/i18n/en.ts @@ -397,6 +397,8 @@ export const en: Record = { "search.kind.peak": "Peak", "search.kind.place": "Place", "search.searchHere": "Search this area", + "search.searchingHere": "Searching this area…", + "search.searchHere.again": "Search this area: ask “{query}” again for this view", // ---- Panel chrome ---------------------------------------------------- "panel.close": "Close", @@ -569,8 +571,9 @@ export const en: Record = { "settings.lowData.info": "Load place photos on request; limit the tile cache to 16 MiB.", "settings.loadMedia": "Load photos and media", "settings.flyAnimations": "Fly-to animations", + "settings.manualRefresh": "Load only on “Search this area”", "settings.searchHere.info": - "After you move the map, data is refreshed on request, so dragging sends no queries.", + "Moving the map loads nothing; press Search this area to refresh the view. Saves data and battery.", "settings.account.guestInfo": "An anonymous profile lives in this browser. Save an account to take it elsewhere.", "settings.account.localInfo": "Progress is stored locally. Sign in to carry it between devices.", diff --git a/apps/web/src/map/MapCore.tsx b/apps/web/src/map/MapCore.tsx index 5c5497c..3b18423 100644 --- a/apps/web/src/map/MapCore.tsx +++ b/apps/web/src/map/MapCore.tsx @@ -23,6 +23,7 @@ import { chromeMapPadding, readChromeInsets } from "./chromePadding"; import { getMapStore, getMapBbox, type LayerMode } from "../store/mapStore"; import { getShellStore } from "../store/shellStore"; import { LayerEngine } from "../engine/LayerEngine"; +import { areaQuery } from "../search/areaQuery"; import { attachBoundaryOverlay } from "../discover/boundaryOverlay"; import { activeAttribution } from "../layers/attribution"; import { API_BASE } from "../lib/api"; @@ -116,6 +117,8 @@ export function MapCore() { let lastGameFollowAt = 0; let pendingViewportRefresh = false; let pendingWorldRefresh = false; + /** Whether the refresh waiting for `idle` answers a move the reader made. */ + let pendingUserMove = false; const applyGameFollow = () => { gameFollowTimer = null; @@ -268,8 +271,11 @@ export function MapCore() { recordPendingBasemap("success"); if (!pendingViewportRefresh) return; pendingViewportRefresh = false; - engineRef.current?.refresh(getMapBbox(map), pendingWorldRefresh); + engineRef.current?.refresh(getMapBbox(map), pendingWorldRefresh, { + userMoved: pendingUserMove + }); pendingWorldRefresh = false; + pendingUserMove = false; }); const resize = () => { @@ -288,10 +294,14 @@ export function MapCore() { emit("discover-viewport", { lng: center.lng, lat: center.lat, zoom, bbox: getMapBbox(map) }); }; - map.on("moveend", () => { + map.on("moveend", (event: { originalEvent?: Event }) => { const center = map.getCenter(); const zoom = map.getZoom(); if (!Number.isFinite(center.lng) || !Number.isFinite(center.lat) || zoom < 1) return; + // MapLibre passes the DOM event through for moves the reader made (drag, wheel, keys, + // inertia); programmatic camera moves have none. + const userMoved = Boolean(event.originalEvent); + if (userMoved) areaQuery.markMoved(); // Camera state belongs to the shell, not to the basemap lifecycle. On a slow connection the // style may still be loading when a user pans under the fixed map-picker pin; dropping that // move strands the picker on stale coordinates. Only data refresh needs a ready style. @@ -299,10 +309,14 @@ export function MapCore() { emit("map-view-changed", { lng: center.lng, lat: center.lat, zoom }); if (map.isStyleLoaded()) { pendingViewportRefresh = false; - engineRef.current?.refresh(getMapBbox(map), pendingWorldRefresh); + pendingUserMove = false; + engineRef.current?.refresh(getMapBbox(map), pendingWorldRefresh, { userMoved }); pendingWorldRefresh = false; } else { + // Tiles still loading after the move: the refresh runs on the next idle, and it is + // still the reader's move if the last one was. pendingViewportRefresh = true; + pendingUserMove = userMoved; } emitDiscoverViewport(); }); @@ -359,15 +373,21 @@ export function MapCore() { }) ); - // Search here is a request, not a hint: pressing it while the style is still settling after a - // long jump used to clear the button and fetch nothing, so the ask is deferred to the next - // idle instead of dropped. + // Search here is a request, not a hint. Callers that jump somewhere (a search result, "my + // location", a country) ask right after starting the flight; answering at once loaded the + // view being left and the destination then waited for the button, so the ask waits for the + // camera to land. Pressing it while the style is still settling after a long jump used to + // clear the button and fetch nothing, so that ask is deferred to the next idle. const onSearchHere = () => { + if (map.isMoving()) { + map.once("moveend", onSearchHere); + return; + } if (map.isStyleLoaded()) { - engineRef.current?.refresh(getMapBbox(map), true); + engineRef.current?.searchHere(getMapBbox(map)); return; } - map.once("idle", () => engineRef.current?.refresh(getMapBbox(map), true)); + map.once("idle", () => engineRef.current?.searchHere(getMapBbox(map))); }; offs.push(on("search-here", onSearchHere)); offs.push(on("layer-style-changed", () => engineRef.current?.syncLayers(store.activeLayers))); diff --git a/apps/web/src/search/areaQuery.test.ts b/apps/web/src/search/areaQuery.test.ts new file mode 100644 index 0000000..c2c184c --- /dev/null +++ b/apps/web/src/search/areaQuery.test.ts @@ -0,0 +1,27 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { areaQuery } from "./areaQuery"; + +test("an area question is offered again only after the reader moves the map", () => { + let reruns = 0; + let notified = 0; + const off = areaQuery.subscribe(() => notified++); + areaQuery.markMoved(); + assert.equal(areaQuery.moved(), false, "nothing to offer without a question"); + + areaQuery.set({ id: "turn-1", label: "kavárny", rerun: () => reruns++ }); + assert.equal(areaQuery.moved(), false, "the answer's own camera fit is not a move"); + areaQuery.markMoved(); + assert.equal(areaQuery.moved(), true); + areaQuery.get()?.rerun(); + assert.equal(reruns, 1); + + areaQuery.set({ id: "turn-2", label: "kavárny", rerun: () => reruns++ }); + assert.equal(areaQuery.moved(), false, "a new answer starts over"); + areaQuery.clear("turn-1"); + assert.equal(areaQuery.get()?.id, "turn-2", "a late cleanup never drops a newer question"); + areaQuery.clear("turn-2"); + assert.equal(areaQuery.get(), null); + assert.ok(notified >= 4); + off(); +}); diff --git a/apps/web/src/search/areaQuery.ts b/apps/web/src/search/areaQuery.ts new file mode 100644 index 0000000..232b0dd --- /dev/null +++ b/apps/web/src/search/areaQuery.ts @@ -0,0 +1,63 @@ +/** + * The question the map is currently answering for an area — today the assistant's last place + * search — so "Search this area" can ask it again after the reader moves the map, the way a + * map app re-runs "cafés" for the new view instead of only reloading layers. + * + * A module-level slot rather than store state: it holds a callback owned by whichever panel + * asked the question, and nothing about it belongs in a saved or shared view. + */ +export interface AreaQuery { + /** Stable for one question; a new id resets the "moved since" flag. */ + id: string; + label: string; + rerun(): void; +} + +let current: AreaQuery | null = null; +let movedSince = false; +let revision = 0; +const listeners = new Set<() => void>(); + +function changed() { + revision++; + for (const listener of listeners) listener(); +} + +export const areaQuery = { + get(): AreaQuery | null { + return current; + }, + /** True once the reader has moved the map after the current question was answered. */ + moved(): boolean { + return movedSince; + }, + set(next: AreaQuery) { + if (current?.id === next.id) { + current = next; + return; + } + current = next; + movedSince = false; + changed(); + }, + /** Clears the slot only if it still holds `id`, so a late cleanup never drops a newer query. */ + clear(id: string) { + if (current?.id !== id) return; + current = null; + movedSince = false; + changed(); + }, + /** Called for camera moves the reader made (drag, zoom, keys), not for programmatic ones. */ + markMoved() { + if (!current || movedSince) return; + movedSince = true; + changed(); + }, + subscribe(listener: () => void): () => void { + listeners.add(listener); + return () => listeners.delete(listener); + }, + revision(): number { + return revision; + } +}; diff --git a/apps/web/src/settings/preferences.test.ts b/apps/web/src/settings/preferences.test.ts index fb1d841..85a93b3 100644 --- a/apps/web/src/settings/preferences.test.ts +++ b/apps/web/src/settings/preferences.test.ts @@ -18,7 +18,7 @@ describe("typed user preferences", () => { locale: "en", units: "imperial", flyAnimations: false, - showSearchHere: false, + manualRefresh: true, aiEnabled: false, aiAutoSummary: true }), @@ -29,7 +29,7 @@ describe("typed user preferences", () => { locale: "en", units: "imperial", flyAnimations: false, - showSearchHere: false, + manualRefresh: true, aiEnabled: false, aiAutoSummary: true } diff --git a/apps/web/src/settings/preferences.ts b/apps/web/src/settings/preferences.ts index 5bb17ee..0f702b5 100644 --- a/apps/web/src/settings/preferences.ts +++ b/apps/web/src/settings/preferences.ts @@ -16,7 +16,8 @@ export interface UserPreferences { units: DistanceUnits; lowData: boolean; flyAnimations: boolean; - showSearchHere: boolean; + /** Moving the map loads nothing until "Search this area" is pressed. */ + manualRefresh: boolean; aiEnabled: boolean; aiAutoSummary: boolean; } @@ -29,7 +30,7 @@ export const DEFAULT_USER_PREFERENCES: Readonly = { units: "metric", lowData: false, flyAnimations: true, - showSearchHere: true, + manualRefresh: false, aiEnabled: true, aiAutoSummary: true }; @@ -73,7 +74,7 @@ export function parseUserPreferences(value: unknown): UserPreferences { : DEFAULT_USER_PREFERENCES.units, lowData: booleanOr(record.lowData, DEFAULT_USER_PREFERENCES.lowData), flyAnimations: booleanOr(record.flyAnimations, DEFAULT_USER_PREFERENCES.flyAnimations), - showSearchHere: booleanOr(record.showSearchHere, DEFAULT_USER_PREFERENCES.showSearchHere), + manualRefresh: booleanOr(record.manualRefresh, DEFAULT_USER_PREFERENCES.manualRefresh), aiEnabled: booleanOr(record.aiEnabled, DEFAULT_USER_PREFERENCES.aiEnabled), aiAutoSummary: booleanOr(record.aiAutoSummary, DEFAULT_USER_PREFERENCES.aiAutoSummary) }; diff --git a/apps/web/src/styles/chrome.css b/apps/web/src/styles/chrome.css index 97175b2..31c0132 100644 --- a/apps/web/src/styles/chrome.css +++ b/apps/web/src/styles/chrome.css @@ -1216,11 +1216,13 @@ "Search this area" sits directly above the mode switcher, centred over the map, and is the one accent-filled button floating over the map. It used to be a grey pill under the top bar, where it read as a status message rather than the offer of fresh data it is. */ + /* On a phone the open panel is a bottom sheet; the chip floats above its top edge + (`--sheet-h`, 0 on desktop) so a half-open sheet never covers it. */ .search-here-btn { position: fixed; bottom: calc( var(--footer-stack-h, 0px) + var(--modebar-bottom-h, 0px) + var(--map-filter-h, 0px) + - var(--bottom-nav-h) + var(--space-6) + var(--safe-bottom) + var(--bottom-nav-h) + var(--sheet-h, 0px) + var(--space-6) + var(--safe-bottom) ); left: calc(var(--sidebar-w-open) + var(--chrome-inset) + var(--safe-left)); right: calc(var(--drawer-w-open) + var(--chrome-inset) + var(--safe-right)); @@ -1256,6 +1258,11 @@ opacity: 0.7; } + /* A full-height sheet covers the map the chip would refresh. */ + html:has(.panel-left[data-snap="full"]) .search-here-btn { + display: none; + } + /* The discover mode's "What is here?" chip shares the Search-here slot and geometry, but stays a quiet surface button — it is a standing question, not a call to action, and the accent fill belongs to the button that pulls fresh data. */ @@ -1312,7 +1319,8 @@ html[data-discover-here] .search-here-btn { bottom: calc( var(--footer-stack-h, 0px) + var(--modebar-bottom-h, 0px) + var(--map-filter-h, 0px) + - var(--bottom-nav-h) + var(--tap-min) + var(--space-8) + var(--safe-bottom) + var(--bottom-nav-h) + var(--sheet-h, 0px) + var(--tap-min) + var(--space-8) + + var(--safe-bottom) ); } diff --git a/apps/web/src/ui/AiPanel.tsx b/apps/web/src/ui/AiPanel.tsx index a3ff87b..e012dfc 100644 --- a/apps/web/src/ui/AiPanel.tsx +++ b/apps/web/src/ui/AiPanel.tsx @@ -32,6 +32,7 @@ import { runChatTurn } from "./ai/runChatTurn"; import { AnswerText } from "./ai/AnswerText"; import { showStatisticAnswer } from "./ai/statisticAnswer"; import { chatSession, useChatField } from "./ai/chatSession"; +import { areaQuery } from "../search/areaQuery"; const PRIVACY_DISMISSED_KEY = "mapos:ai-privacy-ack"; @@ -129,6 +130,28 @@ export function AiPanel() { const ask = (question: string) => runChatTurn(question, featureRef); + // The last place search is what "Search this area" on the map asks again once the reader has + // moved elsewhere — the same as that turn's own "Refresh for this view" button. + const lastTurn = turns.at(-1); + const areaTurn = + !busy && + lastTurn?.done && + !lastTurn.error && + lastTurn.cards.some((card) => card.type === "places") + ? lastTurn + : null; + const areaTurnId = areaTurn?.id; + const areaQuestion = areaTurn?.question; + useEffect(() => { + if (!areaTurnId || !areaQuestion) return; + areaQuery.set({ + id: areaTurnId, + label: areaQuestion, + rerun: () => void runChatTurn(areaQuestion, featureRef) + }); + return () => areaQuery.clear(areaTurnId); + }, [areaTurnId, areaQuestion, featureRef]); + // A question typed into search opens this panel already asked, so the user does not have to // retype it here. useEffect(() => { diff --git a/apps/web/src/ui/SearchHereButton.tsx b/apps/web/src/ui/SearchHereButton.tsx index 31ada96..92f22fe 100644 --- a/apps/web/src/ui/SearchHereButton.tsx +++ b/apps/web/src/ui/SearchHereButton.tsx @@ -1,44 +1,55 @@ -import { useMapStoreSnapshot } from "../store/useMapStoreSnapshot"; +import { useEffect, useState, useSyncExternalStore } from "react"; import { emit } from "../lib/events"; -import { useSyncExternalStore, useState, useEffect } from "react"; -import { layerActivity } from "../tasks/layerActivity"; +import { t } from "../i18n"; +import { areaQuery } from "../search/areaQuery"; +import { useMapStoreSnapshot } from "../store/useMapStoreSnapshot"; +import { Icon } from "./kit"; -/** The engine owns per-layer pending state and deduplicates clicks during active requests. */ +/** + * "Search this area", floating over the map. + * + * Short pans refresh on their own; this appears only when the view is out of date in a way the + * map will not fix by itself — layers left waiting after a long move (or after any move of the + * reader's with the manual-refresh preference), or the assistant's last place search once the + * reader has moved elsewhere. One press brings the layers up to date for the current view and + * asks that search again here. It used to live only inside the Map status popover, so after a + * long pan the pins seemed not to load at all. + */ export function SearchHereButton() { - const [batch, setBatch] = useState([]); + const pending = useMapStoreSnapshot((s) => s.searchHerePending); const loading = useMapStoreSnapshot((s) => s.loadingLayers); - const active = useMapStoreSnapshot((s) => s.activeLayers); - useSyncExternalStore(layerActivity.subscribe, layerActivity.revision, layerActivity.revision); - const waiting = Object.keys(active).filter( - (id) => - active[id]?.visible && - layerActivity.get(id)?.phase && - ["pending", "error", "partial"].includes(layerActivity.get(id)!.phase) - ); - const busy = batch.some( - (id) => - active[id]?.visible && - (loading[id] || - ["queued", "loading", "rendering"].includes(layerActivity.get(id)?.phase ?? "")) - ); + const game = useMapStoreSnapshot((s) => s.mode === "game"); + useSyncExternalStore(areaQuery.subscribe, areaQuery.revision, areaQuery.revision); + const query = areaQuery.moved() ? areaQuery.get() : null; + const [searching, setSearching] = useState(false); + const busy = Object.values(loading).some(Boolean); + useEffect(() => { - if (batch.length && !busy) setBatch([]); - }, [batch, busy]); - if (!busy && !waiting.length) return null; + if (!searching || busy || pending) return; + // A short hold, so an answer served from cache does not blink the chip in and out. + const timer = window.setTimeout(() => setSearching(false), 300); + return () => window.clearTimeout(timer); + }, [searching, busy, pending]); + + if (game || (!searching && !pending && !query)) return null; + const label = searching ? t("search.searchingHere") : t("search.searchHere"); return ( ); } diff --git a/apps/web/src/ui/SettingsSheet.tsx b/apps/web/src/ui/SettingsSheet.tsx index 85d97cc..b9db03b 100644 --- a/apps/web/src/ui/SettingsSheet.tsx +++ b/apps/web/src/ui/SettingsSheet.tsx @@ -252,14 +252,14 @@ const registry = new SettingsUiRegistry() order: 30, render: ({ store, preferences }) => ( store.setPreference("showSearchHere", next)} + checked={preferences.manualRefresh} + label={t("settings.manualRefresh")} + onChange={(next) => store.setPreference("manualRefresh", next)} testId="search-here-toggle" /> } diff --git a/apps/web/src/ui/shell/AppShell.tsx b/apps/web/src/ui/shell/AppShell.tsx index 09044d8..0c652e7 100644 --- a/apps/web/src/ui/shell/AppShell.tsx +++ b/apps/web/src/ui/shell/AppShell.tsx @@ -32,6 +32,7 @@ import { ModuleErrorBoundary } from "../primitives/ModuleErrorBoundary"; import { Button } from "../kit"; import { DiscoverHereButton } from "../DiscoverHereButton"; +import { SearchHereButton } from "../SearchHereButton"; import { DesktopModeBar } from "./DesktopModeBar"; import { MapFooterStack } from "./MapFooterStack"; import { LegendStack } from "./LegendStack"; @@ -294,6 +295,10 @@ export function AppShell({ onFlyToMe }: AppChromeProps) { + {/* "Search this area": floats over the map whenever the view is waiting for it. */} + + + {/* The arcade HUD floats over the board: in game mode the map panel stays closed and the player gets vitals, zone clock and the three actions without opening anything. */} diff --git a/apps/web/src/ui/shell/MapStatus.tsx b/apps/web/src/ui/shell/MapStatus.tsx index 55e7046..537221d 100644 --- a/apps/web/src/ui/shell/MapStatus.tsx +++ b/apps/web/src/ui/shell/MapStatus.tsx @@ -7,7 +7,6 @@ import { useMapStoreSnapshot } from "../../store/useMapStoreSnapshot"; import { useTaskRegistrySnapshot } from "../../tasks/useTaskRegistrySnapshot"; import { taskRegistry } from "../../tasks/TaskRegistry"; import { getLayerPlugin } from "../../layers"; -import { SearchHereButton } from "../SearchHereButton"; import { emit } from "../../lib/events"; import { experienceRegistry, experienceById } from "../../product/registry"; import { Icon } from "../kit"; @@ -175,7 +174,6 @@ export function MapStatus({ compact = false }: { compact?: boolean }) {
))} - )} diff --git a/apps/web/src/ui/shell/mapStatus.css b/apps/web/src/ui/shell/mapStatus.css index 15d0508..9b729c0 100644 --- a/apps/web/src/ui/shell/mapStatus.css +++ b/apps/web/src/ui/shell/mapStatus.css @@ -64,11 +64,6 @@ border-color: color-mix(in srgb, var(--accent) 45%, var(--border)); background: var(--accent-soft); } -.map-status-popover .search-here-btn { - position: static; - transform: none; - margin-top: 10px; -} @keyframes mapos-loading { 50% { transform: translateY(-2px) rotate(-8deg); diff --git a/e2e/aiPanel.spec.ts b/e2e/aiPanel.spec.ts index 11bfdfd..0805e6f 100644 --- a/e2e/aiPanel.spec.ts +++ b/e2e/aiPanel.spec.ts @@ -477,6 +477,38 @@ test("AI V2 preserves streamed text on EOF and clears pending work on new thread await expect(page.getByTestId("ai-panel-empty")).toBeVisible(); }); +test("after the reader moves the map, Search this area asks the last place search there", async ({ + page +}) => { + const bodies: Array<{ message?: string; context?: { bbox?: number[] } }> = []; + page.on("request", (request) => { + if (request.url().endsWith("/v2/ai/chat")) bodies.push(request.postDataJSON()); + }); + await openPanel(page); + const asked = bodies.length; + // The answer's own camera fit is not a move of the reader's: nothing is offered yet. + await expect(page.getByTestId("search-here")).toHaveCount(0); + + const box = (await page.locator(".maplibregl-canvas").boundingBox())!; + const [x, y] = [box.x + box.width - 60, box.y + box.height / 2]; + await page.mouse.move(x, y); + await page.mouse.down(); + await page.mouse.move(x - 300, y + 40, { steps: 8 }); + await page.mouse.up(); + await page.mouse.move(x - 298, y + 42); + + const button = page.getByTestId("search-here"); + await expect(button).toBeVisible({ timeout: 20_000 }); + await expect(button).toHaveAttribute("title", new RegExp(QUESTION.replace("?", "\\?"))); + await button.click(); + await expect.poll(() => bodies.length, { timeout: 20_000 }).toBeGreaterThan(asked); + const [first, again] = [bodies[asked - 1]!, bodies.at(-1)!]; + expect(again.message).toBe(QUESTION); + expect(again.context?.bbox).toBeTruthy(); + expect(again.context?.bbox).not.toEqual(first.context?.bbox); + await expect(page.getByTestId("ai-panel-thread").locator(".ai-turn")).toHaveCount(2); +}); + test("AI V2 place excursion preserves the thread without another chat call", async ({ page }) => { let calls = 0; page.on("request", (request) => { diff --git a/e2e/viewportRefresh.spec.ts b/e2e/viewportRefresh.spec.ts index 863adda..e6fbb59 100644 --- a/e2e/viewportRefresh.spec.ts +++ b/e2e/viewportRefresh.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "./fixtures/offlineTest"; +import { expect, test, type Page } from "./fixtures/offlineTest"; const EMPTY = { type: "FeatureCollection", features: [] }; @@ -6,7 +6,7 @@ const EMPTY = { type: "FeatureCollection", features: [] }; * Layers used to load once and then sit still: panning to the next village kept showing the pins * of the village behind you, with a Search here button where the new places should have been. * An ordinary pan now refetches; only a jump far enough to be a different question waits to be - * asked. + * asked, and the question floats over the map instead of hiding in the Map status popover. */ test.describe("viewport refresh", () => { test("an ordinary pan refetches without asking", async ({ page }) => { @@ -32,14 +32,7 @@ test.describe("viewport refresh", () => { }); test("a jump across the country asks first, and asking refetches", async ({ page }) => { - const requested: string[] = []; - await page.route("**/layers/osm-poi/features**", async (route) => { - requested.push(route.request().url()); - // Without this the browser answers the identical follow-up URL from its memory cache and - // the refetch never reaches this handler. - await route.fulfill({ json: EMPTY, headers: { "cache-control": "no-store" } }); - }); - + const requested = await recordPoiRequests(page); await page.setViewportSize({ width: 1440, height: 900 }); await page.goto("/?layers=osm-poi&lng=13.3775&lat=49.7475&z=14"); await expect.poll(() => requested.length, { timeout: 30_000 }).toBeGreaterThan(0); @@ -48,20 +41,136 @@ test.describe("viewport refresh", () => { await page.evaluate(() => { window.__maposMap?.jumpTo({ center: [14.42, 50.08], zoom: 14 }); }); - await page.getByRole("button", { name: "Map status", exact: true }).click(); + // The question floats over the map; nothing has to be opened to find it. const button = page.getByTestId("search-here"); await expect(button).toBeVisible({ timeout: 20_000 }); - - // The button disables itself while the layer is in flight; asking again is only meaningful - // once the previous answer has landed. - await expect(button).toBeEnabled({ timeout: 20_000 }); + await expect(button).toHaveText(/Search this area/); const asked = requested.length; await button.click(); await expect.poll(() => requested.length, { timeout: 20_000 }).toBeGreaterThan(asked); + expect(centre(requested.at(-1)!)[0]).toBeCloseTo(14.42, 1); + await expect(button).toHaveCount(0); + }); + + test("a long drag offers Search this area and pressing it loads the new view", async ({ + page + }) => { + const requested = await recordPoiRequests(page); + await page.setViewportSize({ width: 1440, height: 900 }); + await page.goto("/?layers=osm-poi&lng=13.3775&lat=49.7475&z=14"); + await expect.poll(() => requested.length, { timeout: 30_000 }).toBeGreaterThan(0); + await settle(page, requested); + + const before = requested.length; + await dragMap(page, -1200, 0); + const button = page.getByTestId("search-here"); + await expect(button).toBeVisible({ timeout: 20_000 }); + expect(requested.length, "a move of more than a screen waits to be asked").toBe(before); + + await button.click(); + await expect.poll(() => requested.length, { timeout: 20_000 }).toBeGreaterThan(before); + const view = await page.evaluate(() => window.__maposMap!.getCenter().toArray()); + expect(centre(requested.at(-1)!)[0]).toBeCloseTo(view[0]!, 1); + await expect(button).toHaveCount(0); + }); + + test("a place picked in search loads at the destination without asking", async ({ page }) => { + const requested = await recordPoiRequests(page); + await page.setViewportSize({ width: 1440, height: 900 }); + await page.goto("/?layers=osm-poi&lng=13.3775&lat=49.7475&z=14"); + await expect.poll(() => requested.length, { timeout: 30_000 }).toBeGreaterThan(0); + + await page.getByTestId("place-search").fill("Praha"); + await page.getByRole("option", { name: /Praha/ }).first().click(); + // The request waits for the flight to land instead of reloading the view being left, so + // Prague's pins arrive by themselves. + await expect + .poll(() => requested.some((url) => Math.abs(centre(url)[0] - 14.42) < 0.1), { + timeout: 20_000 + }) + .toBe(true); + await settle(page, requested); + await expect(page.getByTestId("search-here")).toHaveCount(0); + }); + + test("with manual refresh a drag loads nothing until the reader asks", async ({ page }) => { + const requested = await recordPoiRequests(page); + await page.setViewportSize({ width: 1440, height: 900 }); + await page.goto("/?layers=osm-poi&lng=13.3775&lat=49.7475&z=14"); + await expect.poll(() => requested.length, { timeout: 30_000 }).toBeGreaterThan(0); + + await page.getByTestId("settings-btn").click(); + const toggle = page.getByTestId("search-here-toggle"); + await toggle.click(); + await expect(toggle).toBeChecked(); + await page.keyboard.press("Escape"); + await settle(page, requested); + + const before = requested.length; + // Past the fetched tiles but under a screen: the automatic mode would refetch this by itself. + await dragMap(page, -700, 0); + const button = page.getByTestId("search-here"); + await expect(button).toBeVisible({ timeout: 20_000 }); + await page.waitForTimeout(800); + expect(requested.length).toBe(before); + + await button.click(); + await expect.poll(() => requested.length, { timeout: 20_000 }).toBeGreaterThan(before); await expect(button).toHaveCount(0); }); }); +async function recordPoiRequests(page: Page): Promise { + const requested: string[] = []; + await page.route("**/layers/osm-poi/features**", async (route) => { + requested.push(route.request().url()); + // Without this the browser answers the identical follow-up URL from its memory cache and + // the refetch never reaches this handler. + await route.fulfill({ json: EMPTY, headers: { "cache-control": "no-store" } }); + }); + return requested; +} + +/** Centre of the bbox a layer request asked for. */ +function centre(url: string): [number, number] { + const [w, s, e, n] = new URL(url).searchParams.get("bbox")!.split(",").map(Number); + return [(w! + e!) / 2, (s! + n!) / 2]; +} + +/** Waits until requests stop and the map is idle, so a count taken next means something. */ +async function settle(page: Page, requested: string[]) { + await expect + .poll( + async () => { + const count = requested.length; + await page.waitForTimeout(800); + return ( + requested.length === count && + (await page.evaluate(() => !window.__maposMap!.isMoving() && window.__maposMap!.loaded())) + ); + }, + { timeout: 30_000 } + ) + .toBe(true); +} + +/** A real pointer drag, which is what marks a move as the reader's own. */ +async function dragMap(page: Page, dx: number, dy: number) { + const box = (await page.locator(".maplibregl-canvas").boundingBox())!; + // Start near the edge the drag moves away from, so the whole gesture stays on screen. + const x = dx < 0 ? box.x + box.width - 40 : box.x + 40; + const y = box.y + box.height / 2; + await page.mouse.move(x, y); + await page.mouse.down(); + await page.mouse.move(x + dx, y + dy, { steps: 12 }); + // Stop before releasing so the drag ends without inertia carrying the map further. + await page.waitForTimeout(150); + await page.mouse.up(); + // Released over the side panel, MapLibre ends the drag on the next pointer move (as it does + // for a real mouse, which never stands perfectly still). + await page.mouse.move(x + dx + 2, y + dy + 2); +} + test("partial POI results render immediately and later sources appear without moving the map", async ({ page }) => { From c120f035db56e7870aa042b62800c07d2d338fc0 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 25 Sep 2026 22:01:54 +0000 Subject: [PATCH 04/11] perf(api): cache theme coverage by zoom band and snapped view `/v2/themes` ran a PostGIS join over every territory for each exact bbox, cached for 60 s, and the drawer asks on every pan: the live median was 3.8 s. Coverage is a property of the imports, so requests now share one computation per zoom band (the zooms at which the dataset choice changes) and per view snapped outward to that band's grid, for 15 minutes, with concurrent requests for one key waiting on a single query. The join reads only theme datasets. The list answer is marked cacheable for five minutes. The theme inventory (two queries per detail request) is cached for two minutes, and the Discover boundary manifest keeps its coverage for as long as the published revision is unchanged; only the cheap manifest lookup repeats each minute. The API computes both catalogues once after it starts listening, so the first visitor after a restart no longer waits ~8 s. A small `TtlCache` (bounded, LRU on hit, in-flight sharing, failures not cached) backs the new caches. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01J3QFugXbaTxPuuP3q3rR16 --- apps/api/src/index.ts | 7 ++ apps/api/src/routes/discoverBoundaryRoutes.ts | 9 +- apps/api/src/routes/themeRoutes.ts | 2 + .../src/themes/themeExplorerService.test.ts | 17 ++++ apps/api/src/themes/themeExplorerService.ts | 85 ++++++++++++++++--- apps/api/src/utils/ttlCache.test.ts | 36 ++++++++ apps/api/src/utils/ttlCache.ts | 58 +++++++++++++ 7 files changed, 201 insertions(+), 13 deletions(-) create mode 100644 apps/api/src/themes/themeExplorerService.test.ts create mode 100644 apps/api/src/utils/ttlCache.test.ts create mode 100644 apps/api/src/utils/ttlCache.ts diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 522ecb3..277dd47 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -1721,6 +1721,13 @@ async function main() { const port = Number(process.env.PORT ?? 4033); await app.listen({ port, host: "0.0.0.0" }); console.log(`MapOS API listening on :${port}`); + // The first visitor after a restart used to wait ~8 s while the boundary manifest and the + // theme catalogue were computed cold. Compute them once now, in the background; a failure + // here only means the first real request does the work. + void (async () => { + for (const url of ["/v2/discover/boundaries", "/v2/themes?zoom=0"]) + await app.inject({ method: "GET", url }).catch(() => undefined); + })(); } // Keep imports side-effect free so route/schema tests can build the app without starting a diff --git a/apps/api/src/routes/discoverBoundaryRoutes.ts b/apps/api/src/routes/discoverBoundaryRoutes.ts index 70983e4..62bead1 100644 --- a/apps/api/src/routes/discoverBoundaryRoutes.ts +++ b/apps/api/src/routes/discoverBoundaryRoutes.ts @@ -35,12 +35,19 @@ export function registerDiscoverBoundaryRoutes( ); let metadata: { value: unknown; expires: number } | undefined; let metadataFlight: Promise | undefined; + // Coverage is a pure function of the published revision and the expensive half of this + // answer; only the cheap manifest lookup repeats every minute. + let revisionCoverage: { revision: string; coverage: unknown[] } | undefined; async function boundaryMetadata() { if (metadata && Date.now() < metadata.expires) return metadata.value; if (metadataFlight) return metadataFlight; metadataFlight = (async () => { const revision = await repository.manifest?.(); - const coverage = await repository.coverage(revision ?? undefined); + const coverage = + revision && revisionCoverage?.revision === revision + ? revisionCoverage.coverage + : await repository.coverage(revision ?? undefined); + if (revision) revisionCoverage = { revision, coverage }; const value = { coverage, ready: coverage.length > 0, diff --git a/apps/api/src/routes/themeRoutes.ts b/apps/api/src/routes/themeRoutes.ts index fda5c7f..5c0187e 100644 --- a/apps/api/src/routes/themeRoutes.ts +++ b/apps/api/src/routes/themeRoutes.ts @@ -113,6 +113,8 @@ export function registerThemeRoutes( ? {} : await catalogCoverage(bbox, (request.query as { zoom?: number }).zoom); const locale = localeFrom(request.query); + // The same for every reader; the client snaps its bbox, so a pan back hits the browser. + reply.header("Cache-Control", "public, max-age=300"); return { themes: listThemes().map((entry) => { const text = themeText(entry, locale); diff --git a/apps/api/src/themes/themeExplorerService.test.ts b/apps/api/src/themes/themeExplorerService.test.ts new file mode 100644 index 0000000..6fbc710 --- /dev/null +++ b/apps/api/src/themes/themeExplorerService.test.ts @@ -0,0 +1,17 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { coverageRequest } from "./themeExplorerService.js"; + +test("catalogue coverage is shared by neighbouring views in one zoom band", () => { + const prague = coverageRequest([14.31, 50.02, 14.55, 50.13], 11.4); + const pannedPrague = coverageRequest([14.36, 50.04, 14.6, 50.15], 10.2); + assert.deepEqual(prague, { bbox: [14.25, 50, 14.75, 50.25], zoom: 8 }); + assert.deepEqual(pannedPrague, prague, "a short pan reuses the computation"); + + // The band edges are the zooms at which the dataset choice changes. + assert.equal(coverageRequest(null, 7.99).zoom, 6); + assert.equal(coverageRequest(null, 4).zoom, 4); + assert.equal(coverageRequest(null, 2).zoom, 0); + assert.deepEqual(coverageRequest([-179.5, -89, 179.5, 89], 1).bbox, [-180, -90, 180, 90]); + assert.deepEqual(coverageRequest([12.1, 48.6, 18.9, 51.1], 6.5).bbox, [12, 48, 19, 52]); +}); diff --git a/apps/api/src/themes/themeExplorerService.ts b/apps/api/src/themes/themeExplorerService.ts index 127beeb..c19b89d 100644 --- a/apps/api/src/themes/themeExplorerService.ts +++ b/apps/api/src/themes/themeExplorerService.ts @@ -4,19 +4,66 @@ import { theme, THEMES } from "./themeRegistry.js"; import { statDataset } from "@mapos/adapter-sdk"; import { databaseQueries } from "./themeService.js"; import { createHash } from "node:crypto"; +import { TtlCache } from "../utils/ttlCache.js"; type Coverage = { available: boolean; coverageStatus: "none" | "partial" | "full" | "unknown"; geoLevels: string[]; }; -const catalogueCache = new Map }>(); +type Bbox = [number, number, number, number]; + +/** The dataset choice changes only at these zooms (see `selectDataset`), and each band snaps the + * view to a grid about a sixth of a typical screen at that zoom. */ +const ZOOM_BANDS = [ + { min: 8, grid: 0.25 }, + { min: 6, grid: 1 }, + { min: 4, grid: 2.5 }, + { min: 0, grid: 10 } +] as const; + +/** + * Coverage is a property of the imports, not of each pan: requests are grouped by the zoom band + * the dataset choice follows and by the view snapped outward to that band's grid, so the next + * few pans reuse one computation instead of each costing a PostGIS join over every territory. + * The snapped area can be slightly larger than the view, which only makes the dot conservative. + */ +export function coverageRequest(bbox: Bbox | null, zoom = 0): { bbox: Bbox | null; zoom: number } { + const band = ZOOM_BANDS.find((entry) => zoom >= entry.min) ?? ZOOM_BANDS[ZOOM_BANDS.length - 1]; + if (!bbox) return { bbox: null, zoom: band.min }; + const snap = (value: number, round: (value: number) => number) => + Number((round(value / band.grid) * band.grid).toFixed(6)); + const [w, s, e, n] = bbox; + return { + bbox: [ + Math.max(-180, snap(w, Math.floor)), + Math.max(-90, snap(s, Math.floor)), + Math.min(180, snap(e, Math.ceil)), + Math.min(90, snap(n, Math.ceil)) + ], + zoom: band.min + }; +} + +const THEME_DATASET_IDS = [...new Set(THEMES.flatMap((t) => t.sources.map((s) => s.datasetId)))]; +const catalogueCache = new TtlCache>({ + ttlMs: 15 * 60_000, + maxEntries: 256 +}); + /** One compact request for the drawer. No geometry or individual observations reach the client. * Coverage counts matching land territories, so coastlines don't turn complete data yellow. */ -export async function catalogCoverage(bbox: [number, number, number, number] | null, zoom = 0) { - const key = JSON.stringify([bbox, Math.floor(zoom), process.env.MAPOS_ALLOW_NONCOMMERCIAL_DATA]); - const cached = catalogueCache.get(key); - if (cached && cached.until > Date.now()) return cached.value; +export function catalogCoverage(bbox: Bbox | null, zoom = 0) { + const request = coverageRequest(bbox, zoom); + const key = JSON.stringify([ + request.bbox, + request.zoom, + process.env.MAPOS_ALLOW_NONCOMMERCIAL_DATA + ]); + return catalogueCache.getOrLoad(key, () => computeCoverage(request.bbox, request.zoom)); +} + +async function computeCoverage(bbox: Bbox | null, zoom: number) { const [w, s, e, n] = bbox ?? [-180, -85, 180, 85]; const rows = await sql`WITH geography AS MATERIALIZED ( SELECT level,code,edition FROM geo_units g @@ -28,11 +75,10 @@ export async function catalogCoverage(bbox: [number, number, number, number] | n SELECT ss.dataset_id,ss.geo_level,COUNT(DISTINCT ss.geo_code)::integer AS matched,MAX(t.total)::integer AS total FROM stat_series ss JOIN geography g ON g.level=ss.geo_level AND g.code=ss.geo_code AND (ss.boundary_edition IS NULL OR ss.boundary_edition=g.edition) - JOIN totals t ON t.level=ss.geo_level WHERE ss.value IS NOT NULL + JOIN totals t ON t.level=ss.geo_level + WHERE ss.value IS NOT NULL AND ss.dataset_id=ANY(${THEME_DATASET_IDS}) GROUP BY ss.dataset_id,ss.geo_level`; - const available = await databaseQueries.available!([ - ...new Set(THEMES.flatMap((t) => t.sources.map((s) => s.datasetId))) - ]); + const available = await databaseQueries.available!(THEME_DATASET_IDS); const result: Record = {}; for (const entry of THEMES) { const sources = entry.sources.filter((s) => available.includes(s.datasetId)); @@ -57,12 +103,27 @@ export async function catalogCoverage(bbox: [number, number, number, number] | n ] }; } - if (catalogueCache.size >= 64) catalogueCache.delete(catalogueCache.keys().next().value!); - catalogueCache.set(key, { until: Date.now() + 60000, value: result }); return result; } -export async function explorerInventory(id: string, excluded: string[] = [], period = "latest") { +/** Import runs change a few times a day; two minutes keeps a published import visible soon + * while a burst of detail requests for one theme runs its two queries once. */ +const inventoryCache = new TtlCache>>({ + ttlMs: 2 * 60_000, + maxEntries: 128 +}); + +export function explorerInventory(id: string, excluded: string[] = [], period = "latest") { + const key = JSON.stringify([ + id, + [...excluded].sort(), + period, + process.env.MAPOS_ALLOW_NONCOMMERCIAL_DATA + ]); + return inventoryCache.getOrLoad(key, () => loadExplorerInventory(id, excluded, period)); +} + +async function loadExplorerInventory(id: string, excluded: string[], period: string) { const ids = theme(id) ?.sources.map((s) => s.datasetId) diff --git a/apps/api/src/utils/ttlCache.test.ts b/apps/api/src/utils/ttlCache.test.ts new file mode 100644 index 0000000..e373554 --- /dev/null +++ b/apps/api/src/utils/ttlCache.test.ts @@ -0,0 +1,36 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { TtlCache } from "./ttlCache.js"; + +test("concurrent reads of one key share a single load and later reads hit the cache", async () => { + let loads = 0; + let release!: (value: string) => void; + const cache = new TtlCache({ ttlMs: 1_000, maxEntries: 4 }); + const load = () => { + loads++; + return new Promise((resolve) => (release = resolve)); + }; + const first = cache.getOrLoad("a", load); + const second = cache.getOrLoad("a", load); + release("value"); + assert.deepEqual(await Promise.all([first, second]), ["value", "value"]); + assert.equal(await cache.getOrLoad("a", load), "value"); + assert.equal(loads, 1); +}); + +test("entries expire, failures are not cached and the bound drops the least recent key", async () => { + let now = 0; + const cache = new TtlCache({ ttlMs: 100, maxEntries: 2, now: () => now }); + await assert.rejects(cache.getOrLoad("x", () => Promise.reject(new Error("db down")))); + assert.equal(await cache.getOrLoad("x", async () => 1), 1, "a failure is retried"); + + cache.set("y", 2); + assert.equal(cache.get("x"), 1, "a hit refreshes recency"); + cache.set("z", 3); + assert.equal(cache.get("y"), undefined, "the least recently used key made room"); + assert.equal(cache.get("x"), 1); + + now = 150; + assert.equal(cache.get("x"), undefined, "expired"); + assert.equal(cache.size, 1); +}); diff --git a/apps/api/src/utils/ttlCache.ts b/apps/api/src/utils/ttlCache.ts new file mode 100644 index 0000000..d35259e --- /dev/null +++ b/apps/api/src/utils/ttlCache.ts @@ -0,0 +1,58 @@ +/** + * A small bounded cache for expensive, idempotent reads (catalogue coverage, inventories). + * + * Concurrent callers of one key share a single load instead of each running the same query, a + * failed load is not cached, and the oldest entry makes room once `maxEntries` is reached (a hit + * moves its key to the young end, so the bound behaves like an LRU). + */ +export class TtlCache { + private readonly entries = new Map(); + private readonly inflight = new Map>(); + private readonly now: () => number; + + constructor(private readonly options: { ttlMs: number; maxEntries: number; now?: () => number }) { + this.now = options.now ?? Date.now; + } + + get(key: string): V | undefined { + const hit = this.entries.get(key); + if (!hit) return undefined; + if (hit.until <= this.now()) { + this.entries.delete(key); + return undefined; + } + this.entries.delete(key); + this.entries.set(key, hit); + return hit.value; + } + + set(key: string, value: V, ttlMs = this.options.ttlMs) { + this.entries.delete(key); + while (this.entries.size >= this.options.maxEntries) + this.entries.delete(this.entries.keys().next().value!); + this.entries.set(key, { until: this.now() + ttlMs, value }); + } + + async getOrLoad(key: string, load: () => Promise): Promise { + const cached = this.get(key); + if (cached !== undefined) return cached; + const running = this.inflight.get(key); + if (running) return running; + const promise = load() + .then((value) => { + this.set(key, value); + return value; + }) + .finally(() => this.inflight.delete(key)); + this.inflight.set(key, promise); + return promise; + } + + clear() { + this.entries.clear(); + } + + get size() { + return this.entries.size; + } +} From 0f40931f8cbea1344bd789d1bbcffe7a21a37789 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 25 Sep 2026 22:02:20 +0000 Subject: [PATCH 05/11] perf(db): tune PostgreSQL, analyse after imports, prune old releases The image defaults (128 MB shared buffers, 4 MB work_mem, JIT on) and tables that were bulk-imported but never analysed made the heavy catalogue queries plan, compile and spill more than they read: JIT alone cost 1.8 s of a 4.2 s coverage query, and the planner guessed 139 rows for a 242 000-row join. - Compose starts PostgreSQL with JIT off, 512 MB shared buffers, 32 MB work_mem, 256 MB maintenance memory, SSD page costs and a 256 MB /dev/shm, each sized for the shared 8 GiB host and overridable per host. The API also sets JIT off and work_mem on its own connections, which helps before the server settings apply. - The deploy recreates PostgreSQL only when those settings change, inside the rollback boundary; a failed rollout brings the previous settings back. - Imports (statistics, boundaries, LAU correspondences, staged boundary publication) analyse the tables they rewrote; a failed ANALYZE never fails the import. After a healthy rollout the deploy analyses tables that were never analysed or changed by more than a tenth. - After a healthy rollout the deploy keeps the three newest releases and backups (never the live or previous release), six rollback image tags per service, and prunes dangling images and week-old build cache. None of it can fail the release. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01J3QFugXbaTxPuuP3q3rR16 --- apps/api/src/db/analyze.ts | 21 +++++++++ apps/api/src/db/index.ts | 6 ++- apps/api/src/geo/importGeoUnits.ts | 5 +++ apps/api/src/geo/importLauCorrespondence.ts | 6 ++- apps/api/src/themes/importStatSeries.ts | 2 + docs/environment.md | 13 ++++++ docs/operations/backup-restore.md | 11 +++++ infra/.env.production.example | 5 +++ infra/compose.production.yml | 19 ++++++++ infra/docker-compose.yml | 14 ++++++ scripts/deploy-vps.sh | 49 +++++++++++++++++++++ scripts/publish-staged-boundaries.mjs | 5 +++ 12 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 apps/api/src/db/analyze.ts diff --git a/apps/api/src/db/analyze.ts b/apps/api/src/db/analyze.ts new file mode 100644 index 0000000..01a5ba8 --- /dev/null +++ b/apps/api/src/db/analyze.ts @@ -0,0 +1,21 @@ +import { sql } from "./index.js"; +import { safeErrorLogFields } from "../utils/clientError.js"; + +const TABLE = /^[a-z_][a-z0-9_]*$/; + +/** + * Refreshes planner statistics for tables an import just rewrote. Autovacuum gets there + * eventually, but until it does the planner works from the empty table it last saw — it guessed + * 139 rows for a 242 000-row join and picked nested loops. Never fails the import: slow queries + * are better than a lost import. + */ +export async function analyzeTables(tables: readonly string[], run: typeof sql = sql) { + for (const table of tables) { + if (!TABLE.test(table)) throw new Error(`Not a table name: ${table}`); + try { + await run.unsafe(`ANALYZE ${table}`); + } catch (error) { + console.warn(`ANALYZE ${table} failed`, safeErrorLogFields(error)); + } + } +} diff --git a/apps/api/src/db/index.ts b/apps/api/src/db/index.ts index 76d8355..6ed3633 100644 --- a/apps/api/src/db/index.ts +++ b/apps/api/src/db/index.ts @@ -35,7 +35,11 @@ import { const connectionString = process.env.DATABASE_URL ?? "postgres://mapos:mapos@localhost:5434/mapos"; -export const sql = postgres(connectionString); +/** JIT and a 4 MB sort budget cost the heavy catalogue joins more than they saved; set per + * connection as well, so a database whose server settings were never tuned still benefits. */ +export const sql = postgres(connectionString, { + connection: { jit: "off", work_mem: process.env.MAPOS_PG_WORK_MEM ?? "32MB" } +}); export const db = drizzle(sql, { schema }); const BASELINE_STATEMENTS = [ diff --git a/apps/api/src/geo/importGeoUnits.ts b/apps/api/src/geo/importGeoUnits.ts index 3a63f6f..3eca9a4 100644 --- a/apps/api/src/geo/importGeoUnits.ts +++ b/apps/api/src/geo/importGeoUnits.ts @@ -11,12 +11,16 @@ import { defaultGeoUnitSourceIds, GEO_UNIT_SOURCES } from "./geoUnitSources.js"; import { importAllGeoUnits } from "./geoUnitsImport.js"; import { safeErrorLogFields } from "../utils/clientError.js"; import { publishGeoUnitRelease } from "./geoUnitReleases.js"; +import { analyzeTables } from "../db/analyze.js"; + +const GEO_UNIT_TABLES = ["geo_units", "geo_unit_versions", "geo_unit_releases"]; if (process.argv[2] === "--publish-release") { const id = process.argv[3]; if (!id || !/^[a-f0-9-]{36}$/i.test(id)) throw new Error("A boundary release UUID is required"); await publishGeoUnitRelease(id); console.log(`Zveřejněno vydání hranic ${id}`); + await analyzeTables(GEO_UNIT_TABLES); process.exit(0); } @@ -39,6 +43,7 @@ try { (result.duplicates ? `, ${result.duplicates} duplicitních kódů` : "") ); } + await analyzeTables(GEO_UNIT_TABLES); process.exit(0); } catch (error) { console.error("Import území se nepodařil", safeErrorLogFields(error)); diff --git a/apps/api/src/geo/importLauCorrespondence.ts b/apps/api/src/geo/importLauCorrespondence.ts index ba51228..e0979d6 100644 --- a/apps/api/src/geo/importLauCorrespondence.ts +++ b/apps/api/src/geo/importLauCorrespondence.ts @@ -1,6 +1,7 @@ import { readFile } from "node:fs/promises"; import { pathToFileURL } from "node:url"; import { sql } from "../db/index.js"; +import { analyzeTables } from "../db/analyze.js"; const officialUrl = "https://ec.europa.eu/eurostat/documents/345175/501971/EU-27-LAU-2024-NUTS-2024.xlsx/12971f56-c035-dbab-4d9f-ff1dcc617bb3"; export function validateLauCorrespondence(data: unknown): { @@ -79,7 +80,10 @@ export async function importLauCorrespondence(path: string) { } if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) { importLauCorrespondence(process.argv[2] ?? "") - .then((result) => console.log(JSON.stringify(result))) + .then(async (result) => { + console.log(JSON.stringify(result)); + await analyzeTables(["geo_unit_correspondences"]); + }) .catch((e) => { console.error(e.message); process.exitCode = 1; diff --git a/apps/api/src/themes/importStatSeries.ts b/apps/api/src/themes/importStatSeries.ts index 5157a4b..35bd12f 100644 --- a/apps/api/src/themes/importStatSeries.ts +++ b/apps/api/src/themes/importStatSeries.ts @@ -8,6 +8,7 @@ import { STAT_DATASETS } from "@mapos/adapter-sdk"; import { importAllStatDatasets } from "./statSeriesImport.js"; import { safeErrorLogFields } from "../utils/clientError.js"; +import { analyzeTables } from "../db/analyze.js"; const requested = process.argv.slice(2).filter((argument) => !argument.startsWith("-")); const unknown = requested.filter((id) => !STAT_DATASETS.some((dataset) => dataset.id === id)); @@ -36,6 +37,7 @@ try { : "bez období"; console.log(`${result.datasetId}: ${result.written} hodnot, ${range}`); } + await analyzeTables(["stat_series", "stat_datasets", "stat_import_runs", "theme_coverage"]); process.exit(process.exitCode ?? 0); } catch (error) { console.error("Import statistik se nepodařil", safeErrorLogFields(error)); diff --git a/docs/environment.md b/docs/environment.md index 6622f59..6c37dfb 100644 --- a/docs/environment.md +++ b/docs/environment.md @@ -16,6 +16,19 @@ Copy `.env.example` → `.env` for local dev, or `infra/.env.production.example` | `OVERPASS_URLS` | no | three public mirrors | OSM POI fetching | | `MAPOS_CONTACT` | recommended | — | `User-Agent` sent to Nominatim, Overpass, Wikimedia | +### PostgreSQL sizing (production compose) + +`infra/compose.production.yml` starts PostgreSQL with JIT off and sizes for a small shared VPS. +Raise them per host in `infra/.env.production`; a change restarts the database once. + +| Variable | Default | Setting | +| ------------------------------- | ------- | ------------------------------------------------ | +| `POSTGRES_SHARED_BUFFERS` | `512MB` | `shared_buffers` (about a quarter of free RAM) | +| `POSTGRES_EFFECTIVE_CACHE_SIZE` | `2GB` | `effective_cache_size` (planner hint, no memory) | +| `POSTGRES_WORK_MEM` | `32MB` | `work_mem` per sort/hash | +| `POSTGRES_MAINTENANCE_WORK_MEM` | `256MB` | `maintenance_work_mem` (index builds, ANALYZE) | +| `MAPOS_PG_WORK_MEM` (API) | `32MB` | `work_mem` the API sets on its own connections | + `MAPOS_CONTACT` is worth setting on anything beyond a laptop. Nominatim and the Overpass mirrors require a `User-Agent` that identifies the deployment and offers a way to make contact; without one your traffic is indistinguishable from every other MapOS clone and gets rate-limited as a diff --git a/docs/operations/backup-restore.md b/docs/operations/backup-restore.md index 94fb785..e45ce78 100644 --- a/docs/operations/backup-restore.md +++ b/docs/operations/backup-restore.md @@ -35,6 +35,17 @@ it never drops or rewrites `mapos`. critical startup logs. 5. On failure restore the previous symlink and immutable image IDs. Additive schema remains compatible; repair forward rather than dropping new columns/tables during the same release. + A release that changes the PostgreSQL settings in `infra/compose.production.yml` recreates the + database container once, inside this rollback boundary; a failed rollout recreates it with the + previous settings. +6. After a healthy rollout the deploy analyses tables that were never analysed or have changed + by more than a tenth, keeps the three newest releases and backups (never the live or the + previous release) and six rollback image tags per service, and prunes dangling images and + week-old build cache. None of this can fail the release. + +A restored database has no planner statistics: `pg_restore` does not carry them, and until the +next analyse the planner can misjudge joins by three orders of magnitude. After any manual +restore into a database that serves traffic, run `ANALYZE;` (or the next deploy does it). Backups contain user data and production environment metadata. Directories are mode 0700/files 0600 and must follow the hosting retention/encryption policy. Provider secrets are restored from diff --git a/infra/.env.production.example b/infra/.env.production.example index 7994ff0..175b11a 100644 --- a/infra/.env.production.example +++ b/infra/.env.production.example @@ -1,4 +1,9 @@ POSTGRES_PASSWORD=change-me-in-production +# PostgreSQL sizing (docs/environment.md); defaults fit a small shared VPS. +# POSTGRES_SHARED_BUFFERS=512MB +# POSTGRES_EFFECTIVE_CACHE_SIZE=2GB +# POSTGRES_WORK_MEM=32MB +# POSTGRES_MAINTENANCE_WORK_MEM=256MB IMAGE_TAG=latest # The deploy script replaces this with the immutable release tag before startup. MAPOS_RELEASE=local-production diff --git a/infra/compose.production.yml b/infra/compose.production.yml index 9b38dc6..404f0e1 100644 --- a/infra/compose.production.yml +++ b/infra/compose.production.yml @@ -8,6 +8,25 @@ services: POSTGRES_DB: mapos POSTGRES_USER: mapos POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD} + # The image defaults (128 MB shared buffers, 4 MB work_mem, JIT on) made the catalogue and + # boundary queries spend more time planning, compiling and spilling than reading: JIT alone + # cost 1.8 s of a 4.2 s coverage query. Sizes are for a small shared VPS and can be raised + # per host; changing them restarts PostgreSQL once. + command: + - postgres + - -c + - jit=off + - -c + - shared_buffers=${POSTGRES_SHARED_BUFFERS:-512MB} + - -c + - effective_cache_size=${POSTGRES_EFFECTIVE_CACHE_SIZE:-2GB} + - -c + - work_mem=${POSTGRES_WORK_MEM:-32MB} + - -c + - maintenance_work_mem=${POSTGRES_MAINTENANCE_WORK_MEM:-256MB} + - -c + - random_page_cost=1.1 + shm_size: 256mb volumes: - mapos-v3-postgres:/var/lib/postgresql/data healthcheck: diff --git a/infra/docker-compose.yml b/infra/docker-compose.yml index 3ce9e70..f59eae0 100644 --- a/infra/docker-compose.yml +++ b/infra/docker-compose.yml @@ -6,6 +6,20 @@ services: POSTGRES_DB: mapos POSTGRES_USER: mapos POSTGRES_PASSWORD: mapos + # Same planner settings as production, so a slow query shows up here first. + command: + [ + "postgres", + "-c", + "jit=off", + "-c", + "work_mem=32MB", + "-c", + "maintenance_work_mem=256MB", + "-c", + "random_page_cost=1.1" + ] + shm_size: 256mb ports: - "5434:5432" volumes: diff --git a/scripts/deploy-vps.sh b/scripts/deploy-vps.sh index 7ff1fc2..b8569ce 100755 --- a/scripts/deploy-vps.sh +++ b/scripts/deploy-vps.sh @@ -209,6 +209,8 @@ mapos_rollback() { set +e mapos_release_compose logs --since "${MAPOS_VERIFY_SINCE:-5m}" --tail 120 --no-color api web >&2 mapos_atomic_current "${MAPOS_PREVIOUS_TARGET}" || MAPOS_ROLLBACK_STATUS=1 + # A no-op unless this release changed the database settings; then the previous ones return. + mapos_current_compose up -d --no-build --wait --wait-timeout 180 postgres || MAPOS_ROLLBACK_STATUS=1 docker image tag "${MAPOS_OLD_API_IMAGE}" "${MAPOS_API_IMAGE}" || MAPOS_ROLLBACK_STATUS=1 docker image tag "${MAPOS_OLD_WEB_IMAGE}" "${MAPOS_WEB_IMAGE}" || MAPOS_ROLLBACK_STATUS=1 mapos_current_compose up -d --no-build --force-recreate --wait --wait-timeout 180 api web || @@ -497,6 +499,10 @@ MAPOS_VERIFY_SINCE="$(date -u +%Y-%m-%dT%H:%M:%SZ)" set +e ( set -Eeuo pipefail + # PostgreSQL is recreated only when this release changes its settings (command, shared + # memory); otherwise Compose leaves the running container alone. Inside the rollback boundary, + # so a database that does not come back healthy restores the previous release. + mapos_release_compose up -d --no-build --wait --wait-timeout 180 postgres mapos_release_compose up -d --no-build --force-recreate --wait --wait-timeout 180 api web MAPOS_API_HEALTH="$(curl -fsS --max-time 10 "http://127.0.0.1:${MAPOS_API_PORT}/health")" @@ -560,6 +566,49 @@ if [[ "${MAPOS_ROLLOUT_STATUS}" -ne 0 ]]; then exit "${MAPOS_ROLLOUT_STATUS}" fi +# Housekeeping after a healthy rollout; none of it can fail the deploy. +set +e +# Bulk imports and restores leave tables without planner statistics (pg_restore carries none), +# and the planner then guessed 139 rows for a 242 000-row join. Analyse only tables that were +# never analysed or changed by more than a tenth since. +mapos_release_compose exec -T postgres psql -U mapos -d mapos -v ON_ERROR_STOP=1 -qc \ + "DO \$\$ DECLARE t record; BEGIN + FOR t IN SELECT schemaname, relname FROM pg_stat_user_tables + WHERE COALESCE(last_analyze, last_autoanalyze) IS NULL + OR n_mod_since_analyze > 0.1 * GREATEST(n_live_tup, 1000) + LOOP EXECUTE format('ANALYZE %I.%I', t.schemaname, t.relname); END LOOP; + END \$\$" &2 + +# A full disk broke releases on this shared host before. Keep the three newest releases and +# backups (never the live or the previous release), six rollback image tags per service, and +# drop dangling images and week-old build cache. +mapos_prune_dir() { + local MAPOS_PRUNE_ROOT="$1" MAPOS_PRUNE_ENTRY MAPOS_PRUNE_INDEX=0 + while IFS= read -r MAPOS_PRUNE_ENTRY; do + MAPOS_PRUNE_INDEX=$((MAPOS_PRUNE_INDEX + 1)) + [[ "${MAPOS_PRUNE_INDEX}" -le 3 ]] && continue + [[ "${MAPOS_PRUNE_ENTRY}" == "${MAPOS_TAG}" ]] && continue + [[ "releases/${MAPOS_PRUNE_ENTRY}" == "${MAPOS_PREVIOUS_TARGET}" ]] && continue + [[ "${MAPOS_REMOTE_DIR}/releases/${MAPOS_PRUNE_ENTRY}" == "${MAPOS_PREVIOUS_TARGET}" ]] && continue + [[ "${MAPOS_PRUNE_ENTRY}" =~ ^[A-Za-z0-9._-]+$ ]] || continue + rm -rf -- "${MAPOS_PRUNE_ROOT:?}/${MAPOS_PRUNE_ENTRY}" + done < <(ls -1t "${MAPOS_PRUNE_ROOT}") +} +mapos_prune_dir "${MAPOS_REMOTE_DIR}/releases" +mapos_prune_dir "${MAPOS_REMOTE_DIR}/backups" +for MAPOS_PRUNE_SERVICE in api web; do + docker image ls --format '{{.Tag}}' "${MAPOS_COMPOSE_PROJECT}-${MAPOS_PRUNE_SERVICE}" | + grep '^rollback-' | sort -r | tail -n +7 | + while IFS= read -r MAPOS_PRUNE_TAG; do + docker image rm "${MAPOS_COMPOSE_PROJECT}-${MAPOS_PRUNE_SERVICE}:${MAPOS_PRUNE_TAG}" >/dev/null + done +done +docker image prune -f >/dev/null +docker builder prune -f --filter until=168h >/dev/null +df -h "${MAPOS_REMOTE_DIR}" | tail -n 1 +set -e + mapos_release_compose ps echo "deploy: release ${MAPOS_TAG} is healthy; backup ${MAPOS_BACKUP_DIR} verified" MAPOS_REMOTE diff --git a/scripts/publish-staged-boundaries.mjs b/scripts/publish-staged-boundaries.mjs index f3daa11..cddaa75 100644 --- a/scripts/publish-staged-boundaries.mjs +++ b/scripts/publish-staged-boundaries.mjs @@ -94,6 +94,11 @@ try { throw error; } } + if (process.env.MAPOS_BOUNDARY_PUBLISH === "1") { + // Published rows replace whole editions; refresh planner statistics before traffic hits them. + const { analyzeTables } = await import(`${root}/db/analyze.js`); + await analyzeTables(["geo_units", "geo_unit_versions", "geo_unit_releases"]); + } } finally { await stage.end(); await sql.end(); From 254147c862239c50ba7331f184d5d04bf85a7529 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 25 Sep 2026 22:02:20 +0000 Subject: [PATCH 06/11] perf: compress vector tiles and precompress static assets Vector tiles left the API uncompressed: MVT is not on `@fastify/compress`'s list nor on the edge proxy's, although protobuf gzips to about a third. The API now compresses MVT and protobuf responses (event streams still never). The web image gzips its scripts, styles, HTML, SVG and JSON at build time and nginx serves those files with `gzip_static`, so the busy host no longer compresses the same bundle for every visitor. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01J3QFugXbaTxPuuP3q3rR16 --- Dockerfile | 5 +++++ apps/api/src/index.ts | 7 ++++++- apps/api/src/utils/compressibleTypes.test.ts | 16 ++++++++++++++++ apps/api/src/utils/compressibleTypes.ts | 8 ++++++++ infra/nginx.conf | 5 +++++ 5 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 apps/api/src/utils/compressibleTypes.test.ts create mode 100644 apps/api/src/utils/compressibleTypes.ts diff --git a/Dockerfile b/Dockerfile index 997ac04..c7e9bea 100644 --- a/Dockerfile +++ b/Dockerfile @@ -49,6 +49,11 @@ ENV VITE_MAP_RUNTIME_V2=$VITE_MAP_RUNTIME_V2 ENV VITE_DISCOVER_BOUNDARIES=$VITE_DISCOVER_BOUNDARIES COPY --from=base /app ./ RUN npm run build -w @mapos/web +# Compress once at build time instead of on every request on a busy host; nginx serves the +# `.gz` next to each file (`gzip_static`). Fonts and images are already compressed. +RUN find apps/web/dist -type f \( -name '*.js' -o -name '*.css' -o -name '*.html' -o -name '*.svg' \ + -o -name '*.json' -o -name '*.webmanifest' -o -name '*.txt' \) -size +1k \ + -exec sh -c 'for f; do gzip -9 -c "$f" > "$f.gz"; done' sh {} + FROM nginx:alpine AS web COPY --from=web-build /app/apps/web/dist /usr/share/nginx/html diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 277dd47..4018424 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -31,6 +31,7 @@ import Fastify from "fastify"; import cors from "@fastify/cors"; import cookie from "@fastify/cookie"; import compress from "@fastify/compress"; +import { COMPRESSIBLE_TYPES } from "./utils/compressibleTypes.js"; import type { Bbox, ContentDraft, DataProvider, TripPlan } from "@mapos/layer-sdk"; import { registerUser, @@ -298,7 +299,11 @@ export async function buildApp(options: BuildAppOptions = {}) { maxAge: 600 }); await app.register(cookie); - await app.register(compress, { global: true, threshold: 512 }); + await app.register(compress, { + global: true, + threshold: 512, + customTypes: COMPRESSIBLE_TYPES + }); app.addHook("onRequest", requireAllowedMutationOrigin(corsOrigins)); app.addHook( "preHandler", diff --git a/apps/api/src/utils/compressibleTypes.test.ts b/apps/api/src/utils/compressibleTypes.test.ts new file mode 100644 index 0000000..a5a5781 --- /dev/null +++ b/apps/api/src/utils/compressibleTypes.test.ts @@ -0,0 +1,16 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { COMPRESSIBLE_TYPES } from "./compressibleTypes.js"; + +test("vector tiles are compressed, event streams never are", () => { + for (const type of [ + "application/vnd.mapbox-vector-tile", + "application/x-protobuf", + "application/json; charset=utf-8", + "application/geo+json", + "text/html" + ]) + assert.ok(COMPRESSIBLE_TYPES.test(type), type); + for (const type of ["text/event-stream", "image/png", "image/webp"]) + assert.ok(!COMPRESSIBLE_TYPES.test(type), type); +}); diff --git a/apps/api/src/utils/compressibleTypes.ts b/apps/api/src/utils/compressibleTypes.ts new file mode 100644 index 0000000..789b53d --- /dev/null +++ b/apps/api/src/utils/compressibleTypes.ts @@ -0,0 +1,8 @@ +/** + * Response types the API gzips: `@fastify/compress`'s default list plus vector tiles. MVT is + * protobuf that gzips to about a third, and neither the plugin's list nor the edge proxy's + * treats it as compressible. Event streams stay uncompressed so each frame is flushed as it is + * written. + */ +export const COMPRESSIBLE_TYPES = + /^text\/(?!event-stream)|(?:\+|\/)json(?:;|$)|(?:\+|\/)text(?:;|$)|(?:\+|\/)xml(?:;|$)|octet-stream(?:;|$)|\/vnd\.mapbox-vector-tile(?:;|$)|\/x-protobuf(?:;|$)/u; diff --git a/infra/nginx.conf b/infra/nginx.conf index 4ce8a06..372c129 100644 --- a/infra/nginx.conf +++ b/infra/nginx.conf @@ -20,6 +20,11 @@ server { # `style-src 'unsafe-inline'` covers React's style attributes (per-pin colours), not scripts. include /etc/nginx/security-headers.inc; + # Static files are gzipped at build time (Dockerfile); send the `.gz` to clients that accept + # it. API responses are compressed by the API itself. + gzip_static on; + gzip_vary on; + location /api/ { proxy_pass http://api:4033/; proxy_http_version 1.1; From 28c85c397da286c185f535e714b6067b50ea1982 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 25 Sep 2026 23:59:11 +0000 Subject: [PATCH 07/11] perf(web): subset the icon font to the icons the app uses The subset kept 6,186 glyphs (367 kB): passing the icon names as text makes the subsetter's layout closure follow every ligature those letters can spell, which is every icon in Material Symbols. The script now shapes each name with HarfBuzz to find its glyph and private-use codepoint, keeps exactly those codepoints plus the letters with layout closure off, and fails unless every name still turns into a single icon glyph in the result. 229 icons, FILL and weight axes kept: 64 kB. A render of all icons at both axis ends matches the previous font within anti-aliasing. `harfbuzzjs` and `wawoff2`, already installed with `subset-font`, are declared because the script now imports them. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01J3QFugXbaTxPuuP3q3rR16 --- .../material-symbols-rounded-subset.woff2 | Bin 375564 -> 65536 bytes package-lock.json | 4 +- package.json | 4 +- scripts/subset-icon-font.mjs | 67 ++++++++++++++++-- 4 files changed, 67 insertions(+), 8 deletions(-) diff --git a/apps/web/src/assets/fonts/material-symbols-rounded-subset.woff2 b/apps/web/src/assets/fonts/material-symbols-rounded-subset.woff2 index 77a5bae69172d5ea26d2e40924c9756ef7f15353..e7dabfbfb55dc75075064d918598185f0db4f52c 100644 GIT binary patch literal 65536 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
RaiU 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 literal 375564 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 z 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Ξ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

Jc?4;bU%`QQ$-r-{6m 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

    *y!7FwvtnCd<3VQZ>eXhkS5-|p@rt)> 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%0Dkuqj1_BbjHb2ZT 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 { + const buffer = hb.createBuffer(); + buffer.addText(text); + buffer.guessSegmentProperties(); + hb.shape(font, buffer); + const glyphs = buffer.json().map((glyph) => glyph.g); + buffer.destroy(); + return glyphs; + }; + const unicodes = face.collectUnicodes(); + const destroy = () => { + font.destroy(); + face.destroy(); + blob.destroy(); + }; + return { shape, unicodes, destroy }; +} + const names = await readIconNames(); const source = await readFile(SOURCE); +const hb = await (await import("harfbuzzjs")).default; +const full = shaper(hb, Buffer.from(await wawoff2.decompress(source))); + +// Glyph → private-use codepoint, so an icon can be kept by codepoint instead of by closure. +const codepointOf = new Map(); +for (const codepoint of full.unicodes) { + if (codepoint < 0xe000) continue; + const [glyph] = full.shape(String.fromCodePoint(codepoint)); + if (glyph && !codepointOf.has(glyph)) codepointOf.set(glyph, codepoint); +} +const iconCodepoints = names.map((name) => { + const glyphs = full.shape(name); + const codepoint = glyphs.length === 1 ? codepointOf.get(glyphs[0]) : undefined; + if (codepoint === undefined) throw new Error(`"${name}" is not a single ligature in the font`); + return codepoint; +}); +full.destroy(); -// Ligature lookup needs every character that spells a name, and the subsetter needs them as -// a flat character set. Joining with a separator keeps the intent readable in a stack trace. -const text = names.join(" "); +const letters = [...new Set(names.join(""))].join(""); +const text = letters + String.fromCodePoint(...new Set(iconCodepoints)); const subset = await subsetFont(source, text, { targetFormat: "woff2", + noLayoutClosure: true, variationAxes: { // Keep FILL and wght variable so the CSS can animate a selected icon to filled and // match the surrounding text weight. opsz and GRAD are pinned; nothing uses them. @@ -56,6 +103,14 @@ const subset = await subsetFont(source, text, { } }); +const check = shaper(hb, Buffer.from(await wawoff2.decompress(subset))); +const broken = names.filter((name) => { + const glyphs = check.shape(name); + return glyphs.length !== 1 || glyphs[0] === 0; +}); +check.destroy(); +if (broken.length) throw new Error(`Ligatures lost in the subset: ${broken.join(", ")}`); + await mkdir(dirname(OUT), { recursive: true }); await writeFile(OUT, subset); From 1e3a1ae91177a2149599a71cf08bfdeba573af35 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 25 Sep 2026 23:59:11 +0000 Subject: [PATCH 08/11] perf(web): trim and split the startup bundle MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - React Query was installed and wrapped around the app, but nothing queried through it. - `@mapos/layer-sdk` is side-effect free, so the table parser the browser never calls (and `fflate` with it) no longer ships. - SGP4 (`satellite.js`, ~100 kB) arrives with the satellites layer's first update instead of with the map. - MapLibre resolves to its CSP build: its worker already loads from its own file, so the default build's inlined copy was dead weight. - MapLibre, React and the UI kit get their own chunks, which stay cached across releases while the app chunk changes. - The cleanup of an earlier app's service workers and caches runs once per browser instead of on every start. Startup JavaScript: one 2.42 MB chunk (706 kB gzip) → 2.26 MB in four chunks (651 kB gzip). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01J3QFugXbaTxPuuP3q3rR16 --- apps/web/package.json | 1 - apps/web/src/layers/satelliteLayer.test.ts | 4 +- apps/web/src/layers/satelliteLayer.ts | 23 +++++++++- apps/web/src/main.tsx | 52 +++++++++++++--------- apps/web/vite.config.ts | 22 ++++++++- package-lock.json | 27 ----------- packages/layer-sdk/package.json | 1 + 7 files changed, 76 insertions(+), 54 deletions(-) diff --git a/apps/web/package.json b/apps/web/package.json index d275708..9af3bfc 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -20,7 +20,6 @@ "@mapos/adapter-sdk": "*", "@mapos/layer-sdk": "*", "@mapos/map-runtime": "*", - "@tanstack/react-query": "^5.80.7", "maplibre-gl": "^5.6.0", "pmtiles": "^4.5.0", "react": "^19.1.0", diff --git a/apps/web/src/layers/satelliteLayer.test.ts b/apps/web/src/layers/satelliteLayer.test.ts index 358ad3d..480fdf9 100644 --- a/apps/web/src/layers/satelliteLayer.test.ts +++ b/apps/web/src/layers/satelliteLayer.test.ts @@ -1,7 +1,9 @@ import assert from "node:assert/strict"; import { describe, it } from "node:test"; import { json2satrec, type SatRec } from "satellite.js"; -import { groundTracks } from "./satelliteLayer.js"; +import { groundTracks, loadSatelliteMath } from "./satelliteLayer.js"; + +await loadSatelliteMath(); /** * The ground track is the "reflexе" the reader sees: the path a satellite is about to fly. It is diff --git a/apps/web/src/layers/satelliteLayer.ts b/apps/web/src/layers/satelliteLayer.ts index b56ae54..0d712d7 100644 --- a/apps/web/src/layers/satelliteLayer.ts +++ b/apps/web/src/layers/satelliteLayer.ts @@ -7,7 +7,7 @@ import type { GeoFeature, LayerHandle } from "@mapos/layer-sdk"; -import { eciToGeodetic, gstime, json2satrec, propagate, type SatRec } from "satellite.js"; +import type { SatRec } from "satellite.js"; import { emit } from "../lib/events"; import { registerInteractivePins, unregisterInteractivePins } from "../map/interactivePins"; @@ -96,11 +96,28 @@ function colorFor(category: string): string { return SATELLITE_CATEGORY_COLORS[category] ?? "#38bdf8"; } +/** SGP4 is about 100 kB of the app and only this layer needs it, so it arrives with the layer's + * first update instead of with the map. */ +let sgp4: typeof import("satellite.js") | null = null; +let sgp4Loading: Promise | null = null; +export function loadSatelliteMath(): Promise { + sgp4Loading ??= import("satellite.js").then( + (module) => (sgp4 = module), + (error) => { + sgp4Loading = null; + throw error; + } + ); + return sgp4Loading; +} + /** A satellite's position at an instant, or null when SGP4 cannot produce a sane one. */ function positionAt( satrec: SatRec, at: Date ): { lng: number; lat: number; altitudeKm: number } | null { + if (!sgp4) return null; + const { eciToGeodetic, gstime, propagate } = sgp4; const pv = propagate(satrec, at); const position = pv?.position; if ( @@ -207,7 +224,9 @@ export function createSatelliteLayer( } function buildSatrecs() { + const json2satrec = sgp4?.json2satrec; satrecs = elements.map((element) => { + if (!json2satrec) return { element, satrec: null }; try { const satrec = json2satrec({ OBJECT_NAME: element.name, @@ -404,6 +423,8 @@ export function createSatelliteLayer( ): Promise { ensureLayers(); const keyBefore = currentFilterKey; + await loadSatelliteMath(); + if (signal?.aborted || disposed) return null; await loadCatalog(filters, signal); if (signal?.aborted) return null; // The elements and the drawn tracks do not depend on the viewport, so a pan must not diff --git a/apps/web/src/main.tsx b/apps/web/src/main.tsx index 51448b6..b0c10ec 100644 --- a/apps/web/src/main.tsx +++ b/apps/web/src/main.tsx @@ -1,6 +1,5 @@ import { StrictMode, type ReactNode } from "react"; import { createRoot } from "react-dom/client"; -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import maplibregl from "maplibre-gl"; import maplibreWorker from "maplibre-gl/dist/maplibre-gl-csp-worker?url"; import { App } from "./App"; @@ -29,34 +28,43 @@ registerTileCacheProtocol(); document.documentElement.style.colorScheme = theme; } -// Clear leftover QuestLayer / Next.js service workers from previous deploys -if ("serviceWorker" in navigator) { - void navigator.serviceWorker.getRegistrations().then((regs) => { - for (const reg of regs) void reg.unregister(); - }); - if ("caches" in window) { - void caches.keys().then((keys) => { - for (const key of keys) void caches.delete(key); - }); - } +// Clear leftover QuestLayer / Next.js service workers from previous deploys. Once per browser: +// repeating it on every start cost a registration query and a cache sweep each time, and would +// remove a future service worker of this app as soon as it was installed. +const SERVICE_WORKER_CLEANUP_KEY = "mapos:legacy-sw-cleared-v1"; +let serviceWorkerCleared = false; +try { + serviceWorkerCleared = window.localStorage.getItem(SERVICE_WORKER_CLEANUP_KEY) === "1"; +} catch { + /* Without storage the cleanup simply runs again. */ +} +if (!serviceWorkerCleared && "serviceWorker" in navigator) { + void Promise.all([ + navigator.serviceWorker + .getRegistrations() + .then((regs) => Promise.all(regs.map((reg) => reg.unregister()))), + "caches" in window + ? caches.keys().then((keys) => Promise.all(keys.map((key) => caches.delete(key)))) + : Promise.resolve() + ]) + .then(() => { + try { + window.localStorage.setItem(SERVICE_WORKER_CLEANUP_KEY, "1"); + } catch { + /* Runs again next time. */ + } + }) + .catch(() => {}); } - -const queryClient = new QueryClient({ - defaultOptions: { - queries: { staleTime: 30_000, retry: 1 } - } -}); const root = createRoot(document.getElementById("root")!); function render(children: ReactNode) { root.render( - - - {children} - - + + {children} + ); } diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index 4241422..89340e7 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -19,8 +19,26 @@ export default defineConfig({ } ], resolve: { - alias: { - "@": "/src" + alias: [ + { find: "@", replacement: "/src" }, + // The worker is loaded from its own file (`setWorkerUrl` in main.tsx), so the default + // build's inlined copy of it was dead weight in the main bundle. + { find: /^maplibre-gl$/, replacement: "maplibre-gl/dist/maplibre-gl-csp.js" } + ] + }, + build: { + rollupOptions: { + output: { + // Libraries change far less often than the app: their own chunks stay cached across + // releases instead of being downloaded again with every app change. + manualChunks(id) { + if (id.includes("/node_modules/maplibre-gl/")) return "maplibre"; + if (/\/node_modules\/(react|react-dom|scheduler)\//.test(id)) return "react"; + if (id.includes("/node_modules/@base-ui/") || id.includes("/node_modules/@floating-ui/")) + return "ui-kit"; + return undefined; + } + } } }, server: { diff --git a/package-lock.json b/package-lock.json index 2cf0f4e..e2f4b11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -116,7 +116,6 @@ "@mapos/adapter-sdk": "*", "@mapos/layer-sdk": "*", "@mapos/map-runtime": "*", - "@tanstack/react-query": "^5.80.7", "maplibre-gl": "^5.6.0", "pmtiles": "^4.5.0", "react": "^19.1.0", @@ -2731,32 +2730,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@tanstack/query-core": { - "version": "5.102.3", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.102.3.tgz", - "integrity": "sha512-5O2VEceonqC4uaTLUGglb0hgPouWCJ4K1ykVWyeV8aThhdNCzwpwu01bYoaRNJ9mgFUXS7Kf9utJ46ysT8m+bw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.102.3", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.102.3.tgz", - "integrity": "sha512-nHazxUEUQSGJOswGgSL2DI77f2K75WRCowDgaiyEi0ACocZTFKewTv+A/rJfq6QkuE35rVPff1QUT3ClbaePGQ==", - "license": "MIT", - "dependencies": { - "@tanstack/query-core": "5.102.3" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18 || ^19" - } - }, "node_modules/@tweenjs/tween.js": { "version": "23.1.3", "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", diff --git a/packages/layer-sdk/package.json b/packages/layer-sdk/package.json index cd9a57f..e3b83b8 100644 --- a/packages/layer-sdk/package.json +++ b/packages/layer-sdk/package.json @@ -3,6 +3,7 @@ "version": "2.0.0", "private": true, "type": "module", + "sideEffects": false, "main": "./dist/index.js", "types": "./dist/index.d.ts", "exports": { From 378c70f8c99a6196dcd858f831e51fc2167780d5 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 26 Sep 2026 04:07:49 +0000 Subject: [PATCH 09/11] perf(web): less work per tile event, click, render and store update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Tile watchers read the whole style (`getStyle()` serialises every basemap layer) on each `sourcedata` event, hundreds per pan and mostly for the basemap. They now filter by source name and keep the list of their sources until the style changes. - A map click read the style three times to find cluster, weather and theme layers; it now reads the layer order once. - The map renders at most at pixel ratio 2 (a 3× phone drew 2.25× the pixels for no visible gain), following density changes within that cap. - The store snapshot hooks passed React a new subscribe function every render, which unsubscribed and resubscribed every component each time; loading flags, empty layers staying empty and repeated source reports no longer notify at all. - A partial answer whose retry is already scheduled is not asked again for the same request. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01J3QFugXbaTxPuuP3q3rR16 --- apps/web/src/engine/LayerEngine.ts | 4 ++ apps/web/src/map/MapCore.tsx | 32 ++++++------ apps/web/src/store/mapStore.test.ts | 31 ++++++++++++ apps/web/src/store/mapStore.ts | 17 +++++++ apps/web/src/store/useMapStoreSnapshot.ts | 7 ++- apps/web/src/store/useShellStoreSnapshot.ts | 5 +- apps/web/src/tasks/tileActivity.test.ts | 56 +++++++++++++++++++++ apps/web/src/tasks/tileActivity.ts | 48 ++++++++++++------ 8 files changed, 166 insertions(+), 34 deletions(-) create mode 100644 apps/web/src/tasks/tileActivity.test.ts diff --git a/apps/web/src/engine/LayerEngine.ts b/apps/web/src/engine/LayerEngine.ts index 56c5b0a..e11ddd5 100644 --- a/apps/web/src/engine/LayerEngine.ts +++ b/apps/web/src/engine/LayerEngine.ts @@ -510,6 +510,10 @@ export class LayerEngine { const query = this.query(id, managed, bbox); const state = this.states.get(id); if (this.controllers.has(id) && state?.key === query.key) continue; + // A partial answer for this very request already has its retry scheduled; asking again now + // would only duplicate the server's work. + if (!force && state?.status === "partial" && state.key === query.key && this.retries.has(id)) + continue; const sameFilters = state?.filterKey === query.filterKey; const fresh = state?.acceptedAt != null && Date.now() - state.acceptedAt < (state.ttl ?? query.ttl); diff --git a/apps/web/src/map/MapCore.tsx b/apps/web/src/map/MapCore.tsx index 3b18423..b8f1b99 100644 --- a/apps/web/src/map/MapCore.tsx +++ b/apps/web/src/map/MapCore.tsx @@ -108,7 +108,10 @@ export function MapCore() { dragRotate: false, pitchWithRotate: false, touchPitch: false, - fadeDuration: 0 + fadeDuration: 0, + // A 3× phone screen renders 2.25× the pixels of 2× for a difference nobody sees on a map + // in motion; the cap keeps panning smooth and the GPU cool. + pixelRatio: Math.min(window.devicePixelRatio || 1, 2) }); const stopSocialMap = attachSocialMap(map); const dataLayerLifecycle = MAP_RUNTIME_V2_ENABLED ? new MapLibreDataLayerLifecycle(map) : null; @@ -279,6 +282,9 @@ export function MapCore() { }); const resize = () => { + // Follows a window moved to a screen with another density, within the same cap. + const pixelRatio = Math.min(window.devicePixelRatio || 1, 2); + if (map.getPixelRatio() !== pixelRatio) map.setPixelRatio(pixelRatio); map.resize(); }; resize(); @@ -635,11 +641,12 @@ export function MapCore() { } const pinLayers = interactivePinLayers(map); - const clusterLayers = - map - .getStyle() - .layers?.filter((l) => l.id.startsWith("pins-") && l.id.endsWith("-cluster")) - .map((l) => l.id) ?? []; + // One read of the layer ids for the whole click; `getStyle()` serialised the entire style + // (every basemap layer with its paint and filters) three times per tap. + const layerIds = map.getLayersOrder(); + const clusterLayers = layerIds.filter( + (id) => id.startsWith("pins-") && id.endsWith("-cluster") + ); // Clusters are first-class map targets. Previously they were excluded from hit testing, // so a tap on a large count bubble fell through to the basemap and users had no way to @@ -693,10 +700,9 @@ export function MapCore() { const pinHits = pinLayers.length ? map.queryRenderedFeatures(e.point, { layers: pinLayers }) : []; - const weatherLayerIds = map - .getStyle() - .layers.map((layer) => layer.id) - .filter((id) => /^fill-weather(?:-[a-z-]+)?-sectors$/.test(id)); + const weatherLayerIds = layerIds.filter((id) => + /^fill-weather(?:-[a-z-]+)?-sectors$/.test(id) + ); const weatherHit = weatherLayerIds.length ? map.queryRenderedFeatures(e.point, { layers: weatherLayerIds })[0] : undefined; @@ -709,11 +715,7 @@ export function MapCore() { : []; // Thematic fills sit under everything else, so they are only consulted once nothing // clickable was hit above them: a pin standing on a coloured region belongs to the pin. - const themeLayers = - map - .getStyle() - .layers?.map((layer) => layer.id) - .filter((id) => /^vt-theme-.+-(fill|nodata)$/.test(id)) ?? []; + const themeLayers = layerIds.filter((id) => /^vt-theme-.+-(fill|nodata)$/.test(id)); const themeHit = !pinHits.length && themeLayers.length ? map.queryRenderedFeatures(e.point, { layers: themeLayers })[0] diff --git a/apps/web/src/store/mapStore.test.ts b/apps/web/src/store/mapStore.test.ts index 431ee89..230b17b 100644 --- a/apps/web/src/store/mapStore.test.ts +++ b/apps/web/src/store/mapStore.test.ts @@ -211,6 +211,37 @@ test("unchanged camera events preserve the snapshot and avoid notifications", () } }); +test("repeated loading flags, empty layers and source reports wake nobody", () => { + let calls = 0; + const unsubscribe = store.subscribe(() => { + calls++; + }); + try { + store.setLayerLoading("osm-poi", true); + store.setLayerLoading("osm-poi", true); + store.setLayerLoading("osm-poi", false); + store.setLayerLoading("osm-poi", false); + assert.equal(calls, 2, "only real loading transitions notify"); + + calls = 0; + store.setVisibleFeatures("osm-poi", []); + store.setVisibleFeatures("osm-poi", []); + assert.equal(calls, 1, "an empty layer staying empty is not a change"); + + calls = 0; + const report = [{ source: "osm", state: "ready", count: 3 }] as Parameters< + typeof store.applySourceMeta + >[0]; + store.applySourceMeta(report); + store.applySourceMeta(structuredClone(report)); + assert.equal(calls, 1, "a repeated source report is not a change"); + store.applySourceMeta([{ ...report[0]!, count: 4 }]); + assert.equal(calls, 2); + } finally { + unsubscribe(); + } +}); + test("subscribers are notified on every layer change", () => { let calls = 0; const unsubscribe = store.subscribe(() => { diff --git a/apps/web/src/store/mapStore.ts b/apps/web/src/store/mapStore.ts index 74e71ab..5a55c65 100644 --- a/apps/web/src/store/mapStore.ts +++ b/apps/web/src/store/mapStore.ts @@ -857,6 +857,19 @@ export class MapStore { message: meta.message }; } + // Every page of every POI answer reports its sources; most reports repeat the last one. + const current = this.state.sourceStatus; + const same = + Object.keys(next).length === Object.keys(current).length && + Object.entries(next).every(([source, status]) => { + const previous = current[source]; + return ( + previous?.state === status?.state && + previous?.count === status?.count && + previous?.message === status?.message + ); + }); + if (same) return; this.patch({ sourceStatus: next }); } @@ -1336,6 +1349,7 @@ export class MapStore { } setLayerLoading(layerId: string, loading: boolean) { + if (Boolean(this.state.loadingLayers[layerId]) === loading) return; const next = { ...this.state.loadingLayers }; if (loading) next[layerId] = true; else delete next[layerId]; @@ -1353,6 +1367,9 @@ export class MapStore { } setVisibleFeatures(layerId: string, features: GeoFeature[]) { + const previous = this.state.visibleFeatures[layerId]; + // An empty layer staying empty (every invalidation clears it) wakes nobody. + if (previous === features || (previous && !previous.length && !features.length)) return; this.patch({ visibleFeatures: { ...this.state.visibleFeatures, [layerId]: features } }); } diff --git a/apps/web/src/store/useMapStoreSnapshot.ts b/apps/web/src/store/useMapStoreSnapshot.ts index bee3c67..13a4145 100644 --- a/apps/web/src/store/useMapStoreSnapshot.ts +++ b/apps/web/src/store/useMapStoreSnapshot.ts @@ -1,11 +1,14 @@ -import { useSyncExternalStore } from "react"; +import { useCallback, useSyncExternalStore } from "react"; import type { MapStore } from "./mapStore"; import { getMapStore } from "./mapStore"; export function useMapStoreSnapshot(selector: (s: MapStore) => T): T { const store = getMapStore(); + // A new subscribe function each render made React unsubscribe and resubscribe every component + // on every render; one per store keeps the subscription. + const subscribe = useCallback((cb: () => void) => store.subscribe(cb), [store]); return useSyncExternalStore( - (cb) => store.subscribe(cb), + subscribe, () => selector(store), () => selector(store) ); diff --git a/apps/web/src/store/useShellStoreSnapshot.ts b/apps/web/src/store/useShellStoreSnapshot.ts index f4e135a..2e4c9cd 100644 --- a/apps/web/src/store/useShellStoreSnapshot.ts +++ b/apps/web/src/store/useShellStoreSnapshot.ts @@ -1,10 +1,11 @@ -import { useSyncExternalStore } from "react"; +import { useCallback, useSyncExternalStore } from "react"; import { getShellStore, type ShellState } from "./shellStore"; export function useShellStoreSnapshot(selector: (state: ShellState) => T): T { const store = getShellStore(); + const subscribe = useCallback((listener: () => void) => store.subscribe(listener), [store]); return useSyncExternalStore( - (listener) => store.subscribe(listener), + subscribe, () => selector(store.snapshot), () => selector(store.snapshot) ); diff --git a/apps/web/src/tasks/tileActivity.test.ts b/apps/web/src/tasks/tileActivity.test.ts new file mode 100644 index 0000000..e51e08a --- /dev/null +++ b/apps/web/src/tasks/tileActivity.test.ts @@ -0,0 +1,56 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import type maplibregl from "maplibre-gl"; +import { watchLayerTiles } from "./tileActivity"; + +function fakeMap(sources: Record) { + const handlers = new Map void>>(); + let styleReads = 0; + const map = { + getStyle() { + styleReads++; + return { sources }; + }, + getSource: (id: string) => sources[id], + isSourceLoaded: () => false, + on(type: string, handler: (event: unknown) => void) { + if (!handlers.has(type)) handlers.set(type, new Set()); + handlers.get(type)!.add(handler); + }, + off(type: string, handler: (event: unknown) => void) { + handlers.get(type)?.delete(handler); + } + }; + const fire = (type: string, event: unknown = {}) => + handlers.get(type)?.forEach((handler) => handler(event)); + return { map: map as unknown as maplibregl.Map, fire, styleReads: () => styleReads, handlers }; +} + +test("basemap tile events never make a layer's watcher read the whole style", () => { + const sources: Record = { + basemap: { type: "vector" }, + "source-tile-radar": { type: "raster" } + }; + const { map, fire, styleReads, handlers } = fakeMap(sources); + const stop = watchLayerTiles(map, "radar", 1, () => {}); + const initial = styleReads(); + for (let i = 0; i < 500; i++) + fire("sourcedata", { sourceId: "basemap", sourceDataType: "content", coord: { i } }); + for (let i = 0; i < 20; i++) + fire("sourcedata", { sourceId: "source-tile-radar", sourceDataType: "content", coord: { i } }); + assert.equal(styleReads(), initial, "the source list is cached between tile events"); + + // A source the layer adds later is picked up by its first event. + sources["source-tile-radar-2"] = { type: "raster" }; + fire("sourcedata", { sourceId: "source-tile-radar-2", sourceDataType: "metadata" }); + assert.equal(styleReads(), initial + 1); + fire("styledata"); + fire("idle"); + assert.equal(styleReads(), initial + 2, "a style change refreshes the list once"); + + stop(); + assert.equal( + [...handlers.values()].reduce((sum, set) => sum + set.size, 0), + 0 + ); +}); diff --git a/apps/web/src/tasks/tileActivity.ts b/apps/web/src/tasks/tileActivity.ts index 3afddcb..98ffecc 100644 --- a/apps/web/src/tasks/tileActivity.ts +++ b/apps/web/src/tasks/tileActivity.ts @@ -9,19 +9,35 @@ export function watchLayerTiles( ) { if (typeof map.getStyle !== "function" || typeof map.isSourceLoaded !== "function") return () => {}; - const sources = () => - Object.entries(map.getStyle()?.sources ?? {}) - .filter( - ([key, source]) => - (key === `source-tile-${id}` || - key.startsWith(`source-tile-${id}-`) || - key === id || - key === `source-${id}` || - key.startsWith(`source-${id}-`) || - key.startsWith(`${id}-`)) && - (source.type === "raster" || source.type === "vector") - ) - .map(([key]) => key); + const owns = (key: string) => + key === `source-tile-${id}` || + key.startsWith(`source-tile-${id}-`) || + key === id || + key === `source-${id}` || + key.startsWith(`source-${id}-`) || + key.startsWith(`${id}-`); + // `getStyle()` serialises the whole style, and tile events arrive by the hundred during a pan + // (most of them for the basemap). The list of this layer's sources is read once and again + // only when the style changes or one of its sources appears or disappears. + let cached: string[] | null = null; + const sources = () => { + if (!cached || cached.some((key) => !map.getSource(key))) + cached = Object.entries(map.getStyle()?.sources ?? {}) + .filter( + ([key, source]) => owns(key) && (source.type === "raster" || source.type === "vector") + ) + .map(([key]) => key); + return cached; + }; + const tracks = (sourceId: string | undefined) => { + if (!sourceId || !owns(sourceId)) return false; + if (sources().includes(sourceId)) return true; + cached = null; + return sources().includes(sourceId); + }; + const styleChanged = () => { + cached = null; + }; let disposed = false; let timedOut = false; let previousFailure = false; @@ -69,7 +85,7 @@ export function watchLayerTiles( const tileKey = (e: { sourceId?: string; coord?: unknown }) => `${e.sourceId}:${JSON.stringify(e.coord ?? "source")}`; const data = (e: maplibregl.MapSourceDataEvent) => { - if (!sources().includes(e.sourceId)) return; + if (!tracks(e.sourceId)) return; const detail = e as maplibregl.MapSourceDataEvent & { coord?: unknown }; if (e.sourceDataType === "content" && detail.coord) { received.add(tileKey(detail)); @@ -79,7 +95,7 @@ export function watchLayerTiles( }; const error = (e: maplibregl.ErrorEvent) => { const event = e as maplibregl.ErrorEvent & { sourceId?: string; coord?: unknown }; - if (!event.sourceId || !sources().includes(event.sourceId)) return; + if (!tracks(event.sourceId)) return; failed.add(tileKey(event)); previousFailure = true; check(); @@ -92,6 +108,7 @@ export function watchLayerTiles( failed.clear(); received.clear(); }; + map.on("styledata", styleChanged); map.on("sourcedata", data); map.on("sourcedataloading", data); map.on("error", error); @@ -101,6 +118,7 @@ export function watchLayerTiles( return () => { disposed = true; clearTimeout(deadline); + map.off("styledata", styleChanged); map.off("sourcedata", data); map.off("sourcedataloading", data); map.off("error", error); From ee869830a471ae2335dd263e81a6b21f8b45c58d Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 26 Sep 2026 04:07:49 +0000 Subject: [PATCH 10/11] perf: ask theme coverage with the key the server caches by The statistics store asked `/v2/themes` with the exact view after every pan. The coverage snapping (zoom band + outward grid) moves to `@mapos/adapter-sdk` as `statCoverageRequest`, used by the API's cache key and by the client, which now asks only when that key changes; a pan back is served by the browser cache the API now allows. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01J3QFugXbaTxPuuP3q3rR16 --- apps/api/src/themes/themeExplorerService.ts | 36 +----------------- apps/web/src/statistics/explorerStore.ts | 13 ++++++- packages/adapter-sdk/src/index.ts | 1 + .../adapter-sdk/src/stat/statCoverage.test.ts | 2 +- packages/adapter-sdk/src/stat/statCoverage.ts | 37 +++++++++++++++++++ 5 files changed, 52 insertions(+), 37 deletions(-) rename apps/api/src/themes/themeExplorerService.test.ts => packages/adapter-sdk/src/stat/statCoverage.test.ts (91%) create mode 100644 packages/adapter-sdk/src/stat/statCoverage.ts diff --git a/apps/api/src/themes/themeExplorerService.ts b/apps/api/src/themes/themeExplorerService.ts index c19b89d..47c5cc3 100644 --- a/apps/api/src/themes/themeExplorerService.ts +++ b/apps/api/src/themes/themeExplorerService.ts @@ -1,7 +1,7 @@ import { selectDataset } from "./selectDataset.js"; import { sql } from "../db/index.js"; import { theme, THEMES } from "./themeRegistry.js"; -import { statDataset } from "@mapos/adapter-sdk"; +import { statCoverageRequest, statDataset } from "@mapos/adapter-sdk"; import { databaseQueries } from "./themeService.js"; import { createHash } from "node:crypto"; import { TtlCache } from "../utils/ttlCache.js"; @@ -13,38 +13,6 @@ type Coverage = { }; type Bbox = [number, number, number, number]; -/** The dataset choice changes only at these zooms (see `selectDataset`), and each band snaps the - * view to a grid about a sixth of a typical screen at that zoom. */ -const ZOOM_BANDS = [ - { min: 8, grid: 0.25 }, - { min: 6, grid: 1 }, - { min: 4, grid: 2.5 }, - { min: 0, grid: 10 } -] as const; - -/** - * Coverage is a property of the imports, not of each pan: requests are grouped by the zoom band - * the dataset choice follows and by the view snapped outward to that band's grid, so the next - * few pans reuse one computation instead of each costing a PostGIS join over every territory. - * The snapped area can be slightly larger than the view, which only makes the dot conservative. - */ -export function coverageRequest(bbox: Bbox | null, zoom = 0): { bbox: Bbox | null; zoom: number } { - const band = ZOOM_BANDS.find((entry) => zoom >= entry.min) ?? ZOOM_BANDS[ZOOM_BANDS.length - 1]; - if (!bbox) return { bbox: null, zoom: band.min }; - const snap = (value: number, round: (value: number) => number) => - Number((round(value / band.grid) * band.grid).toFixed(6)); - const [w, s, e, n] = bbox; - return { - bbox: [ - Math.max(-180, snap(w, Math.floor)), - Math.max(-90, snap(s, Math.floor)), - Math.min(180, snap(e, Math.ceil)), - Math.min(90, snap(n, Math.ceil)) - ], - zoom: band.min - }; -} - const THEME_DATASET_IDS = [...new Set(THEMES.flatMap((t) => t.sources.map((s) => s.datasetId)))]; const catalogueCache = new TtlCache>({ ttlMs: 15 * 60_000, @@ -54,7 +22,7 @@ const catalogueCache = new TtlCache>({ /** One compact request for the drawer. No geometry or individual observations reach the client. * Coverage counts matching land territories, so coastlines don't turn complete data yellow. */ export function catalogCoverage(bbox: Bbox | null, zoom = 0) { - const request = coverageRequest(bbox, zoom); + const request = statCoverageRequest(bbox, zoom); const key = JSON.stringify([ request.bbox, request.zoom, diff --git a/apps/web/src/statistics/explorerStore.ts b/apps/web/src/statistics/explorerStore.ts index 0db1da4..8b93108 100644 --- a/apps/web/src/statistics/explorerStore.ts +++ b/apps/web/src/statistics/explorerStore.ts @@ -3,6 +3,7 @@ import { apiGet } from "../lib/api"; import { emit, on } from "../lib/events"; import { getMapStore } from "../store/mapStore"; import { fetchThemeDetail, fetchThemeSummaries } from "../layers/themes/themeCatalog"; +import { statCoverageRequest } from "@mapos/adapter-sdk"; import { syncThemeLayers, themeLayerId, @@ -270,6 +271,7 @@ export function attachStatisticsRuntime() { let coverageController: AbortController | null = null; let coverageTimer: ReturnType | undefined; let coverageGeneration = 0; + let coverageKey = ""; const offView = on("discover-viewport", (event) => { viewport = event.bbox; update({ viewportKey: event.bbox.map((v) => v.toFixed(4)).join(",") }); @@ -282,14 +284,21 @@ export function attachStatisticsRuntime() { fitCoverage: false }); } + // Coverage is asked per zoom band and grid-snapped view (the key the server caches by), so + // an ordinary pan asks nothing and a pan back is answered by the browser cache. + const coverage = statCoverageRequest(event.bbox, event.zoom); + const key = JSON.stringify(coverage); + if (key === coverageKey) return; clearTimeout(coverageTimer); coverageController?.abort(); const generation = ++coverageGeneration; coverageTimer = setTimeout(() => { coverageController = new AbortController(); - void fetchThemeSummaries(coverageController.signal, event.bbox, event.zoom) + void fetchThemeSummaries(coverageController.signal, coverage.bbox ?? undefined, coverage.zoom) .then((catalog) => { - if (!disposed && generation === coverageGeneration) update({ catalog }); + if (disposed || generation !== coverageGeneration) return; + coverageKey = key; + update({ catalog }); }) .catch(() => {}); }, 350); diff --git a/packages/adapter-sdk/src/index.ts b/packages/adapter-sdk/src/index.ts index 776ef76..54ad4cf 100644 --- a/packages/adapter-sdk/src/index.ts +++ b/packages/adapter-sdk/src/index.ts @@ -14,6 +14,7 @@ export * from "./builtins.js"; export * from "./pmtiles/pmtilesAdapter.js"; export * from "./stat/statSeries.js"; export * from "./stat/statDatasets.js"; +export * from "./stat/statCoverage.js"; export * from "./wms/capabilities.js"; export * from "./wms/wmsAdapter.js"; diff --git a/apps/api/src/themes/themeExplorerService.test.ts b/packages/adapter-sdk/src/stat/statCoverage.test.ts similarity index 91% rename from apps/api/src/themes/themeExplorerService.test.ts rename to packages/adapter-sdk/src/stat/statCoverage.test.ts index 6fbc710..0d3e39c 100644 --- a/apps/api/src/themes/themeExplorerService.test.ts +++ b/packages/adapter-sdk/src/stat/statCoverage.test.ts @@ -1,6 +1,6 @@ import assert from "node:assert/strict"; import test from "node:test"; -import { coverageRequest } from "./themeExplorerService.js"; +import { statCoverageRequest as coverageRequest } from "./statCoverage.js"; test("catalogue coverage is shared by neighbouring views in one zoom band", () => { const prague = coverageRequest([14.31, 50.02, 14.55, 50.13], 11.4); diff --git a/packages/adapter-sdk/src/stat/statCoverage.ts b/packages/adapter-sdk/src/stat/statCoverage.ts new file mode 100644 index 0000000..9760015 --- /dev/null +++ b/packages/adapter-sdk/src/stat/statCoverage.ts @@ -0,0 +1,37 @@ +export type CoverageBbox = [number, number, number, number]; + +/** The zooms at which the statistical dataset choice changes (country → NUTS → LAU), each with a + * grid about a sixth of a typical screen at that zoom. */ +const ZOOM_BANDS = [ + { min: 8, grid: 0.25 }, + { min: 6, grid: 1 }, + { min: 4, grid: 2.5 }, + { min: 0, grid: 10 } +] as const; + +/** + * The catalogue coverage question a view asks: the zoom band the dataset choice follows and the + * view snapped outward to that band's grid. The server computes and caches coverage per answer, + * and the client asks with the same key, so neighbouring views share one computation and a pan + * back is answered from the browser cache. The snapped area can be slightly larger than the + * view, which only makes a coverage dot conservative. + */ +export function statCoverageRequest( + bbox: readonly number[] | null, + zoom = 0 +): { bbox: CoverageBbox | null; zoom: number } { + const band = ZOOM_BANDS.find((entry) => zoom >= entry.min) ?? ZOOM_BANDS[ZOOM_BANDS.length - 1]!; + if (!bbox || bbox.length !== 4) return { bbox: null, zoom: band.min }; + const snap = (value: number, round: (value: number) => number) => + Number((round(value / band.grid) * band.grid).toFixed(6)); + const [w, s, e, n] = bbox as CoverageBbox; + return { + bbox: [ + Math.max(-180, snap(w, Math.floor)), + Math.max(-90, snap(s, Math.floor)), + Math.min(180, snap(e, Math.ceil)), + Math.min(90, snap(n, Math.ceil)) + ], + zoom: band.min + }; +} From 12adaf666f3ba4c61dc3f1d41e4693ec31b40c0e Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 26 Sep 2026 04:07:50 +0000 Subject: [PATCH 11/11] chore(web): remove styles for classes nothing renders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit About 110 classes in the stylesheets had no element left in the app (the removed activity indicator and layer notices, the old mega menu, planner sections the redesigned planning panel no longer has, unused motion helpers). Rules that only targeted them are removed; selector lists keep their live members. Found by matching every class selector against the TypeScript sources, including class names built from a prefix. App CSS 225 → 194 kB. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01J3QFugXbaTxPuuP3q3rR16 --- apps/web/src/discover/areaControls.css | 19 - apps/web/src/styles/chrome.css | 252 +--- apps/web/src/styles/drawers.css | 10 - apps/web/src/styles/motion.css | 20 - apps/web/src/styles/panels.css | 1648 ++---------------------- apps/web/src/styles/planner.css | 5 - apps/web/src/styles/primitives.css | 14 - 7 files changed, 118 insertions(+), 1850 deletions(-) diff --git a/apps/web/src/discover/areaControls.css b/apps/web/src/discover/areaControls.css index 217e896..03e2263 100644 --- a/apps/web/src/discover/areaControls.css +++ b/apps/web/src/discover/areaControls.css @@ -32,11 +32,6 @@ padding: 6px 8px; min-height: 36px; } -.area-actions { - display: flex; - flex-wrap: wrap; - gap: 6px; -} .area-controls details, .area-controls p { flex-basis: 100%; @@ -79,17 +74,3 @@ bottom: 96px; z-index: 30; } - -.area-layer-notices { - flex-basis: 100%; - max-height: 88px; - overflow: auto; - overscroll-behavior: contain; -} -.area-layer-notices .layer-notice { - box-shadow: none; - padding: 6px 0; - background: transparent; - border: 0; - font-size: 12px; -} diff --git a/apps/web/src/styles/chrome.css b/apps/web/src/styles/chrome.css index 31c0132..8bde354 100644 --- a/apps/web/src/styles/chrome.css +++ b/apps/web/src/styles/chrome.css @@ -1,182 +1,5 @@ /* Everything that floats above the map: top bar, bottom nav, mega menu, toasts. */ @layer chrome { - /* ---- Activity indicator (§4.12) -------------------------------------- - One surface for "something is loading", bottom right above the zoom controls. It replaces - the strip of single-letter source badges and the expandable task centre: which of seven - providers is slow belongs in the layer drawer, not over the map. */ - .activity-indicator { - position: fixed; - right: calc(var(--space-6) + var(--safe-right)); - /* Clears the mode switcher and whatever the footer currently is, so a loading pill never - lands on top of the thing it is reporting about. */ - bottom: calc( - var(--footer-stack-h, 0px) + var(--modebar-bottom-h, 0px) + var(--map-filter-h, 0px) + - var(--space-6) + var(--safe-bottom) - ); - z-index: var(--z-footer); - display: grid; - /* The rows carry nowrap labels, so the column has to be allowed to be narrower than their - intrinsic width — otherwise a long provider message widens the pill past the viewport. */ - grid-template-columns: minmax(0, 1fr); - justify-items: end; - gap: var(--space-2); - width: max-content; - max-width: min(320px, calc(100vw - var(--space-9))); - pointer-events: auto; - transition: - right var(--dur-slow) var(--ease-standard), - bottom var(--dur-slow) var(--ease-standard); - } - - .activity-indicator[data-right-open] { - right: calc(var(--drawer-w) + var(--space-6)); - } - - .activity-indicator[data-footer-active] { - bottom: calc(var(--space-6) + var(--safe-bottom) + 184px); - } - - /* The whole stack is the popover trigger, so the rows themselves are plain spans. */ - /* The pills are the visible status; this button is the tap target that opens the task popover. - A single 32 px pill leaves the trigger under the 44 px minimum, so the button claims the - rest as padding and gives the same amount back as negative margin: the hit box grows, the - pill stays exactly where it was, and it is still a quiet status rather than a banner. */ - .activity-rows { - display: grid; - justify-items: end; - gap: var(--space-2); - max-width: 100%; - padding-block: var(--space-3); - padding-inline: 0; - margin-block: calc(var(--space-3) * -1); - border: 0; - background: none; - cursor: pointer; - } - - .activity-row { - display: flex; - align-items: center; - gap: var(--space-4); - max-width: 100%; - min-height: 32px; - padding: var(--space-2) var(--space-5) var(--space-2) var(--space-4); - border-radius: var(--radius-pill); - background: var(--surface); - backdrop-filter: var(--blur); - border: 1px solid var(--border); - box-shadow: var(--shadow-sm); - color: var(--text); - font: var(--type-label-md); - text-align: start; - animation: mapos-slide-up var(--dur) var(--ease-emph-decel); - } - - .activity-row[data-tone="done"] { - color: var(--success); - } - - .activity-row[data-tone="error"] { - color: var(--danger); - border-color: color-mix(in srgb, var(--danger) 40%, var(--border)); - } - - .activity-row-icon { - display: grid; - place-items: center; - flex-shrink: 0; - } - - .activity-row-copy { - display: grid; - min-width: 0; - } - - .activity-row-label, - .activity-row-detail { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - .activity-row-detail { - font: var(--type-label-sm); - color: var(--text-muted); - } - - .activity-row-progress { - width: 40px; - height: 3px; - flex-shrink: 0; - border-radius: var(--radius-pill); - background: var(--surface-sunken); - overflow: hidden; - } - - .activity-row-progress > span { - display: block; - height: 100%; - border-radius: inherit; - background: var(--accent); - transition: width var(--dur) var(--ease-standard); - } - - .activity-tasks { - display: flex; - flex-direction: column; - gap: var(--space-4); - } - - .activity-tasks-empty { - margin: 0; - color: var(--text-muted); - font: var(--type-body-sm); - } - - .activity-task { - display: grid; - gap: var(--space-1); - } - - .activity-task-label { - font: var(--type-title-sm); - } - - .activity-task-detail { - color: var(--text-muted); - font: var(--type-label-sm); - } - - .activity-task-actions { - display: flex; - flex-wrap: wrap; - gap: var(--space-2); - } - - @media (max-width: 899px) { - /* On a phone the sheet owns the lower half of the screen, so the pill rides directly above - it rather than at a fixed distance from the bottom edge, where the sheet would bury it. */ - .activity-indicator, - .activity-indicator[data-right-open] { - /* Leave the fixed utility rail (layers/settings) its own column. A loading pill can be - wider than the icon and otherwise crosses the settings target on a raised bottom sheet. */ - right: calc(var(--space-4) + var(--safe-right) + var(--tap-min) + var(--space-2)); - bottom: calc( - var(--bottom-nav-h) + var(--sheet-h) + var(--space-4) + var(--safe-bottom) + 88px - ); - max-width: calc( - 100vw - var(--space-8) - var(--safe-left) - var(--safe-right) - var(--tap-min) - - var(--space-2) - ); - } - - .activity-indicator[data-footer-active] { - bottom: calc( - var(--bottom-nav-h) + var(--sheet-h) + var(--space-4) + var(--safe-bottom) + 176px - ); - } - } - .mapy-logo-ctrl { background: rgba(255, 255, 255, 0.86); border-radius: var(--radius-xs); @@ -205,10 +28,6 @@ flex-shrink: 0; } - .chrome-brand-name { - font: var(--type-title-md); - } - .brand-logo { flex-shrink: 0; color: var(--accent); @@ -797,15 +616,6 @@ z-index: 80; } - .mega-section-title { - margin: var(--space-6) 0 var(--space-4); - font-size: var(--text-xs); - font-weight: 800; - letter-spacing: 0.04em; - text-transform: uppercase; - color: var(--text-muted); - } - .experience-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); @@ -860,8 +670,7 @@ font-size: var(--text-sm); } - .layer-accordion-title small, - .mega-preset-copy small { + .layer-accordion-title small { color: var(--text-muted); font-size: var(--text-3xs); font-weight: var(--weight-body); @@ -929,46 +738,6 @@ margin-top: var(--space-4); } - .mega-preset-grid { - display: flex; - gap: var(--space-4); - max-width: 100%; - padding: 2px 2px var(--space-3); - overflow-x: auto; - overscroll-behavior-inline: contain; - scroll-snap-type: inline proximity; - scrollbar-width: thin; - } - - .mega-preset { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: var(--space-2); - padding: var(--space-5); - border-radius: var(--radius-sm); - border: 1px solid var(--border); - background: var(--surface-elevated); - text-align: left; - color: var(--text); - flex: 0 0 174px; - min-width: 0; - scroll-snap-align: start; - } - - .mega-preset-copy { - display: grid; - min-width: 0; - gap: 2px; - } - - .mega-preset-copy small { - display: -webkit-box; - overflow: hidden; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; - } - .category-group { padding-inline: 0; } @@ -977,24 +746,6 @@ margin-bottom: 0; } - .mega-preset:hover { - border-color: var(--border-strong); - } - - .mega-preset.active { - border-color: color-mix(in srgb, var(--accent) 45%, transparent); - background: var(--accent-soft); - } - - .mega-preset-icon { - font-size: var(--text-xl); - line-height: 1; - } - .mega-preset-name { - font-size: var(--text-sm); - font-weight: var(--weight-display); - } - /* ---- Layer cards ---------------------------------------------------- */ .layer-card { display: flex; @@ -1683,7 +1434,6 @@ html[data-map-picker="active"] .map-footer-stack, html[data-map-picker="active"] .desktop-modebar, html[data-map-picker="active"] .bottom-nav, - html[data-map-picker="active"] .activity-indicator, html[data-map-picker="active"] .theme-value-card, html[data-map-picker="active"] .layer-notices, html[data-map-picker="active"] .search-here-btn { diff --git a/apps/web/src/styles/drawers.css b/apps/web/src/styles/drawers.css index 42116f8..e3b2a96 100644 --- a/apps/web/src/styles/drawers.css +++ b/apps/web/src/styles/drawers.css @@ -598,16 +598,6 @@ opacity: 0.9; } - .basemap-preview-road.road-primary { - inset: 42% 0 auto 0; - height: 5px; - } - - .basemap-preview-road.road-secondary { - inset: 0 auto 0 28%; - width: 4px; - } - .basemap-preview[data-preview-kind="satellite"] { background: linear-gradient(150deg, #24402a, #4a5d33 55%, #6a6a41); } diff --git a/apps/web/src/styles/motion.css b/apps/web/src/styles/motion.css index d65a022..7811b91 100644 --- a/apps/web/src/styles/motion.css +++ b/apps/web/src/styles/motion.css @@ -89,24 +89,4 @@ transform: scale(1.8); } } - - /* ---- Utilities ------------------------------------------------------- */ - .motion-enter { - animation: mapos-slide-up var(--dur-enter) var(--ease-emph-decel) both; - } - - .motion-fade { - animation: mapos-fade-in var(--dur) var(--ease-standard) both; - } - - .motion-pop { - animation: mapos-scale-in var(--dur) var(--ease-emph-decel) both; - } - - /* Staggers a list so it reads as one movement instead of ten. Cap the delay: past ~6 items - the tail arrives late enough to feel like lag. */ - .motion-stagger > * { - animation: mapos-slide-up var(--dur-slow) var(--ease-emph-decel) both; - animation-delay: calc(min(var(--motion-index, 0), 6) * 24ms); - } } diff --git a/apps/web/src/styles/panels.css b/apps/web/src/styles/panels.css index 779e3d9..5e5750e 100644 --- a/apps/web/src/styles/panels.css +++ b/apps/web/src/styles/panels.css @@ -187,60 +187,6 @@ gap: var(--space-7); } - .planner-editor-scope { - display: grid; - gap: var(--space-7); - min-inline-size: 0; - margin: 0; - padding: 0; - border: 0; - } - - .planner-editor-scope:disabled { - opacity: 0.76; - } - - .planner-shared-banner { - display: grid; - grid-template-columns: 40px minmax(0, 1fr); - gap: var(--space-3); - align-items: center; - padding: var(--space-4); - border: 1px solid color-mix(in srgb, var(--accent) 42%, var(--border)); - border-radius: var(--radius-md); - background: linear-gradient( - 135deg, - color-mix(in srgb, var(--accent) 16%, var(--surface-elevated)), - var(--surface-elevated) - ); - } - - .planner-shared-banner > span { - width: 40px; - height: 40px; - display: grid; - place-items: center; - border-radius: 50%; - background: var(--accent); - color: var(--accent-contrast); - font-size: var(--text-lg); - font-weight: 800; - } - - .planner-shared-banner > div { - display: grid; - gap: 3px; - } - - .planner-shared-banner small { - color: var(--text-muted); - line-height: 1.4; - } - - .planner-shared-banner.status-error { - border-color: color-mix(in srgb, #ef4444 48%, var(--border)); - } - .planner-field { display: grid; gap: var(--space-2); @@ -250,31 +196,6 @@ font-weight: var(--weight-strong); } - .planner-toolbar, - .planner-stop-actions, - .planner-actions { - display: flex; - align-items: center; - gap: var(--space-2); - } - - .planner-toolbar { - justify-content: space-between; - color: var(--text-faint); - font-size: var(--text-xs); - } - - .planner-stop-actions { - flex-wrap: wrap; - } - - .planner-stop-location { - display: grid; - grid-template-columns: minmax(0, 1fr) auto auto; - gap: var(--space-2); - align-items: center; - } - .planner-stop-search { position: relative; min-width: 0; @@ -400,1249 +321,195 @@ color: var(--text-faint); } - .planner-stop-location > span { + .planner-field input, + .planner-field select { + width: 100%; min-width: 0; - color: var(--text-faint); - font-family: var(--font-mono, monospace); - font-size: 10px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + color: var(--text); } - .planner-location-fallback { + .planner-grid { display: grid; - grid-template-columns: 1fr auto; - gap: var(--space-3); - align-items: start; - min-width: 0; - padding: var(--space-4); - border: 1px solid color-mix(in srgb, #f59e0b 48%, var(--border)); - border-radius: var(--radius-md); - background: - radial-gradient(circle at 0 0, color-mix(in srgb, #f59e0b 14%, transparent), transparent 46%), - var(--surface-elevated); + gap: var(--space-4); } - .planner-location-fallback.kind-denied { - border-color: color-mix(in srgb, #ef4444 44%, var(--border)); + .planner-grid.two { + grid-template-columns: 1.25fr 0.75fr; } - .planner-location-fallback-heading { - grid-column: 1 / -1; - display: grid; - grid-template-columns: 30px minmax(0, 1fr); - gap: var(--space-2); - align-items: start; - min-width: 0; + .planner-grid.three { + grid-template-columns: repeat(3, minmax(0, 1fr)); } - .planner-location-fallback-heading > span { + .planning-panel .planner-adventure { + position: relative; display: grid; - width: 30px; - height: 30px; - place-items: center; - border-radius: 10px; - background: color-mix(in srgb, #f59e0b 16%, var(--surface-solid)); - color: #b45309; - font-size: var(--text-lg); - } - - .planner-location-fallback-heading > div { + gap: var(--space-4); min-width: 0; + padding: var(--space-5); + border: 1px solid color-mix(in srgb, #f97316 48%, var(--border)); + border-radius: var(--radius-lg); + background: + radial-gradient( + circle at 100% 0, + color-mix(in srgb, #f97316 19%, transparent), + transparent 46% + ), + linear-gradient( + 145deg, + color-mix(in srgb, #0f766e 8%, var(--surface-solid)), + var(--surface-solid) + ); + box-shadow: 0 16px 38px color-mix(in srgb, #0f172a 11%, transparent); + overflow: hidden; } - .planner-location-fallback-heading strong { + .planning-panel .planner-adventure h3, + .planning-panel .planner-adventure h4 { + margin: 0; color: var(--text); - font-size: var(--text-sm); } - .planner-location-fallback-heading p { - margin: 3px 0 0; - color: var(--text-muted); - font-size: var(--text-xs); - line-height: 1.45; + .planning-panel .planner-adventure h3 { + font-size: var(--text-lg); + line-height: 1.2; } - .planner-location-fallback > .btn { - grid-column: 1 / -1; - justify-self: start; + @media (max-width: 520px) { + .planning-panel .planner-adventure { + padding: var(--space-4); + } } - .planner-location-manual { - grid-column: 1 / -1; + .planner-stops { + position: relative; display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: var(--space-4); + } + + .planner-stop-window { + display: grid; + grid-template-columns: auto minmax(0, 1fr) auto; gap: var(--space-2); - min-width: 0; - margin: 0; - padding: var(--space-3); + align-items: center; + padding: var(--space-2); border: 1px solid var(--border); border-radius: var(--radius-sm); + background: var(--surface-elevated); } - .planner-location-manual legend { - padding: 0 4px; + .planner-stop-window span { color: var(--text-muted); - font-size: 10px; - font-weight: 750; - } - - .planner-location-manual label { - display: grid; - gap: 3px; - min-width: 0; - color: var(--text-faint); - font-size: 9px; - } - - .planner-location-manual input { - width: 100%; - min-width: 0; - padding: 7px; - font-family: var(--font-mono, monospace); - font-size: 10px; - } - - .planner-location-manual > .btn { - grid-column: 1 / -1; - justify-self: start; - } - - .planner-stop-more { - color: var(--text-faint); font-size: var(--text-xs); + text-align: center; } - .planner-stop-more summary { - width: max-content; - cursor: pointer; - } - - .planner-stop-more[open] summary { - margin-bottom: var(--space-2); - } - - .planner-stop-order { - justify-content: flex-end; - } - - .planner-add-actions { - display: grid; - grid-template-columns: 1fr 1fr; - gap: var(--space-2); - } - - .planner-field input, - .planner-field select { - width: 100%; - min-width: 0; - color: var(--text); + .planner-stops::before { + content: ""; + position: absolute; + top: 17px; + bottom: 17px; + left: 14px; + width: 2px; + background: color-mix(in srgb, var(--accent) 38%, var(--border)); } - .planner-grid { + .planner-stop { + position: relative; display: grid; - gap: var(--space-4); - } - - .planner-grid.two { - grid-template-columns: 1.25fr 0.75fr; - } - - .planner-grid.three { - grid-template-columns: repeat(3, minmax(0, 1fr)); + grid-template-columns: 30px minmax(0, 1fr) 24px; + gap: var(--space-3); + align-items: start; } - .planner-variants { - width: 100%; + .planner-suggestions { + display: flex; + flex-wrap: wrap; + gap: var(--space-2); } - .planning-panel .planner-more-options { - min-width: 0; - overflow: clip; + .planner-suggestions button { + display: inline-flex; + gap: var(--space-2); + align-items: center; + max-width: 100%; + padding: 7px 10px; border: 1px solid var(--border); - border-radius: var(--radius-md); + border-radius: var(--radius-pill); background: var(--surface-elevated); + font-size: var(--text-xs); } - .planning-panel .planner-more-options > summary { - padding: var(--space-4) var(--space-5); - color: var(--text); - font-weight: var(--weight-strong); - cursor: pointer; - } - - .planning-panel .planner-more-options > summary:focus-visible { - outline: 2px solid var(--accent); - outline-offset: -2px; - } - - .planning-panel .planner-more-content { - display: grid; - gap: var(--space-5); - min-width: 0; - padding: 0 var(--space-5) var(--space-5); - } - - .planning-panel .planner-more-content .planner-grid.two { - grid-template-columns: 1fr; - } - - .planning-panel .planner-more-content .planner-grid.three { - grid-template-columns: repeat(auto-fit, minmax(90px, 1fr)); + .planner-suggestions button span:last-child { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } - .planning-panel .planner-preferences { - min-width: 0; + .planner-error { margin: 0; - padding: 0; - border: 0; - } - - .planning-panel .planner-preferences legend { - margin-bottom: var(--space-2); - color: var(--text-muted); + padding: var(--space-4); + border-radius: var(--radius-sm); + background: color-mix(in srgb, #f59e0b 13%, transparent); + color: var(--text); font-size: var(--text-xs); - font-weight: var(--weight-strong); + line-height: 1.45; } - .planning-panel .planner-preference-grid { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: var(--space-2); - min-width: 0; - } - - .planning-panel .planner-preference-grid button { - display: grid; - gap: 2px; - min-width: 0; - padding: var(--space-3); - border: 1px solid var(--border); - border-radius: var(--radius-sm); - background: var(--surface-solid); - color: var(--text); - text-align: left; - overflow-wrap: anywhere; - } - - .planning-panel .planner-preference-grid button > span { - min-width: 0; - overflow-wrap: anywhere; - } - - .planning-panel .planner-preference-grid button[data-support="fallback"] { - border-style: dashed; - } - - .planning-panel .planner-preference-grid button.active { - border-color: var(--accent); - background: color-mix(in srgb, var(--accent) 12%, var(--surface-solid)); - color: var(--accent); - } - - .planning-panel .planner-preference-grid small, - .planning-panel .planner-capability small { - overflow-wrap: anywhere; - color: var(--text-faint); - font-size: 10px; - line-height: 1.35; - } - - .planning-panel .planner-capability { - display: grid; - gap: var(--space-2); - min-width: 0; - padding: var(--space-3); - border-left: 3px solid var(--accent); - border-radius: var(--radius-sm); - background: color-mix(in srgb, var(--accent) 7%, var(--surface-solid)); - font-size: var(--text-xs); - } - - .planning-panel .planner-capability.fallback { - border-left-color: #f59e0b; - background: color-mix(in srgb, #f59e0b 9%, var(--surface-solid)); - } - - .planning-panel .planner-capability span { - min-width: 0; - overflow-wrap: anywhere; - color: var(--text-muted); - font-family: var(--font-mono, monospace); - } - - .planning-panel .planner-bike-map { - display: grid; - grid-template-columns: auto minmax(0, 1fr); - gap: var(--space-3) var(--space-4); - align-items: start; - min-width: 0; - padding: var(--space-4); - border: 1px solid color-mix(in srgb, #7c3aed 38%, var(--border)); - border-radius: var(--radius-md); - background: - radial-gradient(circle at 0 0, color-mix(in srgb, #7c3aed 18%, transparent), transparent 45%), - var(--surface-solid); - } - - .planning-panel .planner-bike-map.active { - border-color: color-mix(in srgb, #16a34a 55%, var(--border)); - background: - radial-gradient(circle at 0 0, color-mix(in srgb, #16a34a 17%, transparent), transparent 45%), - var(--surface-solid); - } - - .planning-panel .planner-bike-map-icon { - display: grid; - width: 38px; - height: 38px; - place-items: center; - border-radius: 12px; - background: color-mix(in srgb, #7c3aed 16%, var(--surface-elevated)); - font-size: 21px; - } - - .planning-panel .planner-bike-map div { - min-width: 0; - } - - .planning-panel .planner-bike-map p { - margin: 4px 0 0; - color: var(--text-muted); - font-size: var(--text-xs); - line-height: 1.45; - } - - .planning-panel .planner-bike-map-actions { - grid-column: 2; - display: flex; - flex-wrap: wrap; - gap: var(--space-2); - } - - .planning-panel .planner-temporal-context { - display: grid; - gap: var(--space-3); - min-width: 0; - padding: var(--space-4); - border: 1px solid color-mix(in srgb, #0284c7 42%, var(--border)); - border-radius: var(--radius-lg); - background: - radial-gradient( - circle at 100% 0, - color-mix(in srgb, #38bdf8 14%, transparent), - transparent 44% - ), - var(--surface-solid); - } - - .planning-panel .planner-temporal-heading { - display: grid; - grid-template-columns: 40px minmax(0, 1fr); - gap: var(--space-3); - align-items: start; - } - - .planning-panel .planner-temporal-icon { - display: grid; - width: 40px; - height: 40px; - place-items: center; - border-radius: 13px; - background: #0284c7; - color: #fff; - font-size: 23px; - } - - .planning-panel .planner-temporal-heading > div { - display: grid; - gap: 2px; - min-width: 0; - } - - .planning-panel .planner-temporal-heading span:not(.planner-temporal-icon) { - color: #0369a1; - font-size: 10px; - font-weight: 800; - text-transform: uppercase; - letter-spacing: 0.05em; - } - - .planning-panel .planner-temporal-heading h3, - .planning-panel .planner-temporal-heading p { - margin: 0; - } - - .planning-panel .planner-temporal-heading h3 { - font-size: var(--text-md); - } - - .planning-panel .planner-temporal-heading p { - color: var(--text-muted); - font-size: var(--text-xs); - } - - .planning-panel .planner-temporal-switches { - display: flex; - flex-wrap: wrap; - gap: var(--space-2); - } - - .planning-panel .planner-temporal-switches label { - display: flex; - gap: 7px; - align-items: center; - padding: 7px 9px; - border: 1px solid var(--border); - border-radius: var(--radius-pill); - background: var(--surface-elevated); - color: var(--text-muted); - font-size: var(--text-xs); - font-weight: 700; - } - - .planning-panel .planner-temporal-switches input { - width: 15px; - height: 15px; - margin: 0; - accent-color: #0284c7; - } - - .planning-panel .planner-temporal-status-grid { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: var(--space-2); - } - - .planning-panel .planner-temporal-status-grid article { - display: grid; - grid-template-columns: 24px minmax(0, 1fr); - gap: var(--space-2); - align-items: start; - min-width: 0; - padding: 10px; - border: 1px solid var(--border); - border-radius: var(--radius-sm); - background: var(--surface-elevated); - } - - .planning-panel .planner-temporal-status-grid article[data-status="ready"], - .planning-panel .planner-temporal-status-grid article[data-status="provider-aware"] { - border-color: color-mix(in srgb, #16a34a 45%, var(--border)); - } - - .planning-panel .planner-temporal-status-grid article[data-status="unavailable"], - .planning-panel .planner-temporal-status-grid article[data-status="out-of-range"] { - border-style: dashed; - } - - .planning-panel .planner-temporal-status-grid article > span { - color: #0284c7; - font-size: 18px; - } - - .planning-panel .planner-temporal-status-grid article > div { - display: grid; - gap: 2px; - min-width: 0; - } - - .planning-panel .planner-temporal-status-grid small { - color: var(--text-muted); - font-size: 10px; - line-height: 1.35; - overflow-wrap: anywhere; - } - - .planning-panel .planner-temporal-map-action { - justify-self: start; - } - - .planning-panel .planner-temporal-budget { - color: var(--text-faint); - font-size: 9px; - line-height: 1.4; - } - - .planning-panel .planner-adventure { - position: relative; - display: grid; - gap: var(--space-4); - min-width: 0; - padding: var(--space-5); - border: 1px solid color-mix(in srgb, #f97316 48%, var(--border)); - border-radius: var(--radius-lg); - background: - radial-gradient( - circle at 100% 0, - color-mix(in srgb, #f97316 19%, transparent), - transparent 46% - ), - linear-gradient( - 145deg, - color-mix(in srgb, #0f766e 8%, var(--surface-solid)), - var(--surface-solid) - ); - box-shadow: 0 16px 38px color-mix(in srgb, #0f172a 11%, transparent); - overflow: hidden; - } - - .planning-panel .planner-adventure-heading { - display: grid; - grid-template-columns: 42px minmax(0, 1fr); - gap: var(--space-3); - align-items: start; - min-width: 0; - } - - .planning-panel .planner-adventure-icon { - display: grid; - width: 42px; - height: 42px; - place-items: center; - border-radius: 14px; - background: #f97316; - box-shadow: 0 7px 20px color-mix(in srgb, #f97316 28%, transparent); - color: #fff; - font-size: 24px; - } - - .planning-panel .planner-adventure-heading > div { - display: grid; - gap: 3px; - min-width: 0; - } - - .planning-panel .planner-adventure-eyebrow { - color: #c2410c; - font-size: 10px; - font-weight: 800; - text-transform: uppercase; - letter-spacing: 0.055em; - } - - .planning-panel .planner-adventure h3, - .planning-panel .planner-adventure h4 { - margin: 0; - color: var(--text); - } - - .planning-panel .planner-adventure h3 { - font-size: var(--text-lg); - line-height: 1.2; - } - - .planning-panel .planner-adventure-heading p, - .planning-panel .planner-adventure-place p, - .planning-panel .planner-adventure-method p { - margin: 0; - color: var(--text-muted); - font-size: var(--text-xs); - line-height: 1.45; - } - - .planning-panel .planner-adventure-controls { - display: flex; - flex-wrap: wrap; - gap: var(--space-3); - align-items: end; - justify-content: space-between; - } - - .planning-panel .planner-adventure-limit { - display: flex; - flex: 1 1 180px; - flex-wrap: wrap; - gap: 5px; - align-items: center; - min-width: 0; - } - - .planning-panel .planner-adventure-limit > span { - flex: 1 0 100%; - color: var(--text-muted); - font-size: 10px; - font-weight: 750; - text-transform: uppercase; - letter-spacing: 0.04em; - } - - .planning-panel .planner-adventure-limit button { - min-width: 52px; - padding: 7px 10px; - border: 1px solid var(--border); - border-radius: var(--radius-pill); - background: var(--surface-elevated); - color: var(--text-muted); - font-size: var(--text-xs); - font-weight: 750; - } - - .planning-panel .planner-adventure-limit button.active { - border-color: #f97316; - background: color-mix(in srgb, #f97316 13%, var(--surface-solid)); - color: #c2410c; - } - - .planning-panel .planner-adventure-results { - display: grid; - gap: var(--space-3); - min-width: 0; - padding-top: var(--space-3); - border-top: 1px solid color-mix(in srgb, #f97316 25%, var(--border)); - } - - .planning-panel .planner-adventure-summary { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: var(--space-2); - } - - .planning-panel .planner-adventure-summary > div { - display: grid; - gap: 1px; - min-width: 0; - padding: var(--space-2); - border-radius: var(--radius-sm); - background: color-mix(in srgb, #0f766e 7%, var(--surface-elevated)); - } - - .planning-panel .planner-adventure-summary strong { - color: #0f766e; - font-size: var(--text-md); - } - - .planning-panel .planner-adventure-summary span { - color: var(--text-faint); - font-size: 9px; - line-height: 1.25; - overflow-wrap: anywhere; - } - - .planning-panel .planner-adventure-candidates { - display: grid; - gap: var(--space-2); - } - - .planning-panel .planner-adventure-candidate { - display: grid; - grid-template-columns: 46px minmax(0, 1fr) auto; - gap: var(--space-3); - align-items: center; - min-width: 0; - padding: var(--space-3); - border: 1px solid var(--border); - border-radius: var(--radius-md); - background: color-mix(in srgb, var(--surface-elevated) 94%, #f97316); - } - - .planning-panel .planner-adventure-score { - display: grid; - width: 46px; - height: 46px; - place-content: center; - border: 1px solid color-mix(in srgb, #f97316 45%, var(--border)); - border-radius: 50%; - background: color-mix(in srgb, #f97316 10%, var(--surface-solid)); - color: #c2410c; - text-align: center; - line-height: 1; - } - - .planning-panel .planner-adventure-score strong { - font-size: var(--text-md); - } - - .planning-panel .planner-adventure-score span { - margin-top: 2px; - font-size: 8px; - } - - .planning-panel .planner-adventure-place { - display: grid; - gap: 3px; - min-width: 0; - } - - .planning-panel .planner-adventure-place > span { - color: #0f766e; - font-size: 9px; - font-weight: 750; - text-transform: uppercase; - letter-spacing: 0.03em; - } - - .planning-panel .planner-adventure-place h4 { - min-width: 0; - overflow: hidden; - font-size: var(--text-sm); - text-overflow: ellipsis; - white-space: nowrap; - } - - .planning-panel .planner-adventure-breakdown { - display: flex; - flex-wrap: wrap; - gap: 4px; - } - - .planning-panel .planner-adventure-breakdown span { - padding: 3px 6px; - border-radius: var(--radius-pill); - background: color-mix(in srgb, #0f766e 8%, var(--surface-solid)); - color: var(--text-faint); - font-size: 8px; - white-space: nowrap; - } - - .planning-panel .planner-adventure-empty { - margin: 0; - padding: var(--space-4); - border-radius: var(--radius-sm); - background: color-mix(in srgb, #f97316 9%, var(--surface-elevated)); - color: var(--text-muted); - font-size: var(--text-xs); - line-height: 1.5; - } - - .planning-panel .planner-adventure-method summary { - color: var(--text-muted); - font-size: var(--text-xs); - font-weight: 750; - cursor: pointer; - } - - .planning-panel .planner-adventure-method p { - margin-top: var(--space-2); - } - - .planning-panel .planner-adventure-method small { - display: block; - margin-top: var(--space-2); - color: var(--text-faint); - font-size: 9px; - line-height: 1.4; - overflow-wrap: anywhere; - } - - @media (max-width: 520px) { - .planning-panel .planner-preference-grid { - grid-template-columns: 1fr; - } - - .planner-stop-location { - grid-template-columns: 1fr 1fr; - } - - .planner-stop-location > span { - grid-column: 1 / -1; - } - - .planning-panel .planner-adventure { - padding: var(--space-4); - } - - .planning-panel .planner-adventure-controls > .btn { - width: 100%; - } - - .planning-panel .planner-adventure-candidate { - grid-template-columns: 46px minmax(0, 1fr); - } - - .planning-panel .planner-adventure-candidate > .btn { - grid-column: 2; - justify-self: start; - } - } - - .planner-section { - display: grid; - gap: var(--space-4); - padding-top: var(--space-5); - border-top: 1px solid var(--border); - } - - .planner-section-title { - display: flex; - align-items: center; - justify-content: space-between; - gap: var(--space-4); - } - - .planner-section-title h3 { - margin: 0; - font-size: var(--text-md); - } - - .planner-section-title > span { - color: var(--text-faint); - font-size: var(--text-xs); - } - - .planner-stops { - position: relative; - display: grid; - gap: var(--space-4); - } - - .planner-stop-window { - display: grid; - grid-template-columns: auto minmax(0, 1fr) auto; - gap: var(--space-2); - align-items: center; - padding: var(--space-2); - border: 1px solid var(--border); - border-radius: var(--radius-sm); - background: var(--surface-elevated); - } - - .planner-stop-window span { - color: var(--text-muted); - font-size: var(--text-xs); - text-align: center; - } - - .planner-stops::before { - content: ""; - position: absolute; - top: 17px; - bottom: 17px; - left: 14px; - width: 2px; - background: color-mix(in srgb, var(--accent) 38%, var(--border)); - } - - .planner-stop { - position: relative; - display: grid; - grid-template-columns: 30px minmax(0, 1fr) 24px; - gap: var(--space-3); - align-items: start; - } - - .planner-stop-index { - position: relative; - z-index: 1; - width: 30px; - height: 30px; - display: grid; - place-items: center; - border: 2px solid var(--accent); - border-radius: 50%; - background: var(--surface-solid); - color: var(--accent); - font-size: var(--text-xs); - font-weight: 800; - } - - .planner-stop-fields { - display: grid; - gap: var(--space-2); - } - - .planner-stop-fields > input { - width: 100%; - font-weight: var(--weight-strong); - } - - .planner-coordinates { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: var(--space-2); - } - - .planner-coordinates input { - min-width: 0; - padding: 7px; - font-size: 11px; - } - - .planner-remove { - width: 24px; - height: 30px; - color: var(--danger, #ef4444); - font-size: var(--text-lg); - } - - .planner-suggestions { - display: flex; - flex-wrap: wrap; - gap: var(--space-2); - } - - .planner-map-suggestion-block { - display: grid; - gap: var(--space-2); - padding: var(--space-3); - border: 1px dashed var(--border-strong); - border-radius: var(--radius-sm); - background: var(--surface-sunken); - } - - .planner-map-suggestion-block > span { - color: var(--text-faint); - font-size: 9px; - font-weight: 750; - text-transform: uppercase; - letter-spacing: 0.04em; - } - - .planner-suggestions button { - display: inline-flex; - gap: var(--space-2); - align-items: center; - max-width: 100%; - padding: 7px 10px; - border: 1px solid var(--border); - border-radius: var(--radius-pill); - background: var(--surface-elevated); - font-size: var(--text-xs); - } - - .planner-suggestions button span:last-child { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - .planner-error, - .planner-warning { - margin: 0; - padding: var(--space-4); - border-radius: var(--radius-sm); - background: color-mix(in srgb, #f59e0b 13%, transparent); - color: var(--text); - font-size: var(--text-xs); - line-height: 1.45; - } - - .planner-error, - .planner-warning.danger { + .planner-error { background: color-mix(in srgb, #ef4444 13%, transparent); color: #ef4444; } - .planner-result { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: var(--space-3); - padding: var(--space-5); - border: 1px solid color-mix(in srgb, var(--accent) 35%, var(--border)); - border-radius: var(--radius-md); - background: color-mix(in srgb, var(--accent) 7%, var(--surface-elevated)); - } - - .planner-result > div { - display: grid; - gap: 2px; - } - - .planner-result strong { - font-size: var(--text-lg); - } - - .planner-result div span { - color: var(--text-faint); - font-size: var(--text-xs); - } - - .planner-result > p, - .planner-result > a { - grid-column: 1 / -1; - } - - .planner-segments { - grid-column: 1 / -1; - display: grid; - gap: var(--space-2); - max-height: 280px; - overflow: auto; - } - - .planner-segment { - display: grid; - gap: var(--space-3); - padding: var(--space-3); - border: 1px solid var(--border); - border-radius: var(--radius-sm); - background: var(--surface-elevated); - transition: - border-color 150ms ease, - box-shadow 150ms ease, - background 150ms ease; - } - - .planner-map-selection-hint { - padding: 10px 12px; - border: 1px solid color-mix(in srgb, var(--accent) 28%, var(--border)); - border-radius: var(--radius-sm); - background: color-mix(in srgb, var(--accent) 7%, var(--surface-solid)); - color: var(--text-muted); - font-size: var(--text-xs); - line-height: 1.45; - } - - .planner-segment.selected-on-map { - border-color: #f97316; - box-shadow: inset 4px 0 0 #f97316; - background: color-mix(in srgb, #f97316 7%, var(--surface-elevated)); - } - - .planner-segment-map-focus { - justify-self: start; - padding: 6px 9px; - border: 1px solid color-mix(in srgb, var(--accent) 35%, var(--border)); - border-radius: var(--radius-pill); - background: var(--surface-solid); - color: var(--accent); - font-size: 10px; - font-weight: 750; - } - - .planner-segment-map-focus[aria-pressed="true"] { - border-color: #f97316; - background: color-mix(in srgb, #f97316 10%, var(--surface-solid)); - color: color-mix(in srgb, #f97316 80%, var(--text)); - } - - .planner-segment-temporal { - display: grid; - gap: 4px; - padding: 8px 10px; - border-radius: var(--radius-sm); - background: color-mix(in srgb, #0284c7 7%, var(--surface-solid)); - color: var(--text-muted); - font-size: 10px; - line-height: 1.35; - } - - .planner-segment-temporal strong { - color: #b45309; - font-size: 10px; - } - - .planner-segment-head { - display: grid; - grid-template-columns: 28px minmax(0, 1fr) auto; - gap: var(--space-2); - align-items: center; - } - - .planner-segment-head > span:first-child { - display: grid; - width: 26px; - height: 26px; - place-items: center; - border-radius: 9px; - background: color-mix(in srgb, var(--accent) 13%, var(--surface-solid)); - color: var(--accent); - font-size: var(--text-xs); - font-weight: 800; - } - - .planner-segment-head > div { - display: grid; - min-width: 0; - } - - .planner-segment-head strong { - min-width: 0; - overflow: hidden; - font-size: var(--text-sm); - text-overflow: ellipsis; - white-space: nowrap; - } - - .planner-segment-head small { - color: var(--text-faint); - } - - .planner-alternative-count { - padding: 4px 7px; - border-radius: var(--radius-pill); - background: color-mix(in srgb, var(--accent) 10%, var(--surface-solid)); - color: var(--accent); - font-size: 10px; - font-weight: 700; - white-space: nowrap; - } - - .planner-alternatives { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: var(--space-2); - padding-left: 36px; - } - - .planner-alternatives button { - position: relative; - display: grid; - grid-template-columns: 1fr auto; - gap: 2px var(--space-2); - min-width: 0; - padding: 10px; - border: 1px solid var(--border); - border-radius: var(--radius-sm); - background: var(--surface-solid); - color: var(--text); - text-align: left; - } - - .planner-alternatives button:hover { - border-color: color-mix(in srgb, var(--accent) 55%, var(--border)); - } - - .planner-alternatives button.selected { - border-color: var(--accent); - box-shadow: inset 0 0 0 1px var(--accent); - background: color-mix(in srgb, var(--accent) 8%, var(--surface-solid)); - } - - .planner-alternatives button > span:first-child { - grid-column: 1 / -1; - color: var(--text-muted); - font-size: 10px; - font-weight: 700; - text-transform: uppercase; - letter-spacing: 0.04em; - } - - .planner-alternatives button > span:nth-of-type(2) { - color: var(--text-muted); - font-size: var(--text-xs); - text-align: right; - } - - .planner-alternatives button > strong { - font-size: var(--text-sm); - white-space: nowrap; - } - - .planner-alternatives button > small { - grid-column: 1 / -1; - min-width: 0; - color: var(--text-faint); - font-size: 10px; - overflow-wrap: anywhere; - } - - .planner-segment.status-failed { - border-color: color-mix(in srgb, #ef4444 45%, var(--border)); - } - - .planner-segment.status-stale, - .planner-segment.status-pending { - border-style: dashed; - } - - @media (max-width: 520px) { - .planning-panel .planner-temporal-status-grid { - grid-template-columns: 1fr; - } - - .planning-panel .planner-bike-map-actions { - grid-column: 1 / -1; - } - - .planner-segment-head { - grid-template-columns: 28px minmax(0, 1fr); - } - - .planner-alternative-count { - grid-column: 2; - justify-self: start; - } - - .planner-alternatives { - grid-template-columns: 1fr; - padding-left: 36px; - } - } - - .planner-actions { - flex-wrap: wrap; - } - - .planner-actions .block { - flex: 1 0 100%; - } - - .planner-service-actions { - display: grid; - gap: var(--space-4); - padding-top: var(--space-4); - border-top: 1px solid var(--border); - } - - .planner-primary-actions, - .planner-export-actions { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: var(--space-2); - } - - .planner-primary-actions .btn:first-child { - grid-column: 1 / -1; - } - - .planner-share-manager { - overflow: hidden; - border: 1px solid color-mix(in srgb, var(--accent) 32%, var(--border)); - border-radius: var(--radius-md); + .planner-segment { + display: grid; + gap: var(--space-3); + padding: var(--space-3); + border: 1px solid var(--border); + border-radius: var(--radius-sm); background: var(--surface-elevated); + transition: + border-color 150ms ease, + box-shadow 150ms ease, + background 150ms ease; } - .planner-share-manager > summary { + .planner-segment-temporal { display: grid; - grid-template-columns: 36px minmax(0, 1fr); - gap: var(--space-3); - align-items: center; - padding: var(--space-4); - cursor: pointer; - list-style: none; + gap: 4px; + padding: 8px 10px; + border-radius: var(--radius-sm); + background: color-mix(in srgb, #0284c7 7%, var(--surface-solid)); + color: var(--text-muted); + font-size: 10px; + line-height: 1.35; } - .planner-share-manager > summary::-webkit-details-marker { - display: none; + .planner-segment-temporal strong { + color: #b45309; + font-size: 10px; } - .planner-share-manager > summary > span { - width: 36px; - height: 36px; - display: grid; - place-items: center; - border-radius: 50%; - background: color-mix(in srgb, var(--accent) 16%, var(--surface-sunken)); - color: var(--accent); - font-weight: 800; + .planner-segment.status-failed { + border-color: color-mix(in srgb, #ef4444 45%, var(--border)); + } + + .planner-segment.status-stale, + .planner-segment.status-pending { + border-style: dashed; } - .planner-share-manager > summary > div, - .planner-share-content, .planner-share-url label { display: grid; gap: var(--space-2); } - .planner-share-manager summary small, - .planner-share-content p, - .planner-share-url span, - .planner-share-list small { + .planner-share-url span { color: var(--text-faint); font-size: var(--text-xs); line-height: 1.4; } - .planner-share-content { - padding: 0 var(--space-4) var(--space-4); - } - - .planner-share-content > p { - margin: 0; - } - .planner-share-url { display: grid; grid-template-columns: minmax(0, 1fr) auto; @@ -1659,76 +526,6 @@ font-size: var(--text-xs); } - .planner-share-list { - display: grid; - gap: var(--space-2); - margin: var(--space-2) 0 0; - padding: 0; - list-style: none; - } - - .planner-share-list li { - display: flex; - gap: var(--space-3); - align-items: center; - justify-content: space-between; - padding: var(--space-3); - border: 1px solid var(--border); - border-radius: var(--radius-sm); - } - - .planner-share-list li > div { - display: grid; - gap: 2px; - } - - .planner-share-list li.revoked { - opacity: 0.58; - } - - .planner-ai-toggle { - display: grid; - grid-template-columns: 36px minmax(0, 1fr); - gap: var(--space-3); - align-items: center; - width: 100%; - padding: var(--space-4); - border: 1px solid color-mix(in srgb, var(--accent) 42%, var(--border)); - border-radius: var(--radius-md); - background: color-mix(in srgb, var(--accent) 9%, var(--surface-elevated)); - color: var(--text); - text-align: left; - } - - .planner-ai-toggle > span { - width: 36px; - height: 36px; - display: grid; - place-items: center; - border-radius: 50%; - background: var(--accent); - color: #fff; - font-size: var(--text-xs); - font-weight: 800; - } - - .planner-ai-toggle strong { - min-width: 0; - } - - .planner-ai-toggle small { - grid-column: 2; - min-width: 0; - color: var(--text-faint); - line-height: 1.35; - overflow-wrap: anywhere; - } - - .planner-ai-toggle:disabled { - cursor: default; - opacity: 0.68; - } - .planner-ai-discussion { display: grid; gap: var(--space-3); @@ -1744,99 +541,12 @@ resize: vertical; } - .planner-ai-thread-head { - display: flex; - gap: var(--space-3); - align-items: center; - justify-content: space-between; - } - - .planner-ai-thread-head > div { - display: grid; - gap: 2px; - } - - .planner-ai-thread-head small, - .planner-ai-thread-loading { - margin: 0; - color: var(--text-faint); - font-size: var(--text-xs); - } - - .planner-ai-thread { - display: grid; - gap: var(--space-3); - max-height: 380px; - overflow: auto; - padding: var(--space-2); - scroll-behavior: smooth; - } - - .planner-ai-thread article { - display: grid; - gap: var(--space-2); - max-width: 92%; - padding: var(--space-3) var(--space-4); - border: 1px solid var(--border); - border-radius: var(--radius-md); - background: var(--surface-elevated); - } - - .planner-ai-thread article.role-user { - justify-self: end; - border-color: color-mix(in srgb, var(--accent) 38%, var(--border)); - background: color-mix(in srgb, var(--accent) 10%, var(--surface-elevated)); - } - - .planner-ai-thread article.role-assistant { - justify-self: start; - border-color: color-mix(in srgb, var(--accent) 34%, var(--border)); - } - - .planner-ai-thread article p { - margin: 0; - line-height: 1.5; - white-space: pre-wrap; - } - - .planner-ai-thread article small { - color: var(--text-faint); - font-size: 0.68rem; - line-height: 1.4; - } - - .planner-ai-consent, - .planner-route-disclaimer { - margin: 0; - color: var(--text-faint); - font-size: var(--text-xs); - line-height: 1.45; - } - .planner-ai-discussion .btn-ai { border-color: var(--accent); background: var(--accent); color: #fff; } - .planner-ai-plan-answer { - display: grid; - gap: var(--space-2); - padding: var(--space-4); - border-radius: var(--radius-sm); - background: color-mix(in srgb, var(--accent) 10%, var(--surface-elevated)); - } - - .planner-ai-plan-answer p { - margin: 0; - white-space: pre-wrap; - } - - .planner-ai-plan-answer small { - color: var(--text-faint); - line-height: 1.4; - } - .planner-handoff { display: grid; gap: var(--space-3); @@ -1844,52 +554,10 @@ border-top: 1px solid var(--border); } - .planner-handoff-links { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: var(--space-2); - } - - .planner-handoff-links .btn { - min-width: 0; - padding-inline: var(--space-2); - text-align: center; - text-decoration: none; - } - - .planner-handoff-limits { - display: grid; - gap: var(--space-2); - margin: 0; - padding-left: var(--space-5); - color: var(--text-faint); - font-size: var(--text-xs); - } - - .planner-route-disclaimer { - padding: var(--space-3); - border-radius: var(--radius-sm); - background: var(--surface-sunken); - } - @media (max-width: 420px) { - .planner-handoff-links { - grid-template-columns: 1fr; - } - .planner-share-url { grid-template-columns: 1fr; } - - .planner-ai-thread article { - max-width: 96%; - } - } - - .planner-toll { - color: var(--accent); - font-size: var(--text-xs); - text-decoration: none; } /* ---- Personal panel (§4.3) ------------------------------------------- @@ -3431,21 +2099,6 @@ max-width: 640px; } - .timeline-contexts { - display: flex; - flex-wrap: wrap; - gap: var(--space-2); - } - - .timeline-contexts span { - padding: var(--space-1) var(--space-3); - border-radius: var(--radius-pill); - background: var(--accent-soft); - color: var(--accent); - font-size: var(--text-3xs); - font-weight: var(--weight-strong); - } - .timeline-presets { display: flex; align-items: center; @@ -3892,43 +2545,6 @@ gap: var(--space-3); } - .timeline-summary { - display: flex; - align-items: stretch; - justify-content: space-between; - gap: var(--space-5); - } - - .timeline-summary > div:first-child { - display: grid; - align-content: center; - gap: var(--space-1); - } - - .viewport-stat { - display: grid; - grid-template-columns: auto auto; - gap: 0 var(--space-5); - padding: var(--space-4) var(--space-5); - border: 1px solid color-mix(in srgb, var(--accent) 35%, var(--border)); - border-radius: var(--radius); - background: var(--accent-soft); - color: var(--text); - text-align: left; - } - - .viewport-stat > span, - .viewport-stat > small { - color: var(--text-muted); - font-size: var(--text-3xs); - } - - .viewport-stat strong { - grid-row: span 2; - align-self: center; - font-size: var(--text-xl); - } - /* Weather is useful while travelling, but the footer should stay a slim control strip. */ .map-timeline .weather-legend, .map-timeline .weather-source-legend { @@ -3950,27 +2566,6 @@ font-size: var(--text-3xs); } - .forecast-week { - display: grid; - grid-template-columns: repeat(7, minmax(54px, 1fr)); - gap: var(--space-3); - overflow-x: auto; - } - - .forecast-week > div { - display: grid; - gap: 1px; - padding: var(--space-3); - border-radius: var(--radius-sm); - background: var(--surface-sunken); - text-align: center; - font-size: var(--text-xs); - } - - .forecast-week small { - color: var(--text-muted); - } - .range-slider { display: flex; flex-direction: column; @@ -4090,15 +2685,6 @@ border: 2px solid var(--surface-solid); } - .timeline-time { - font-size: var(--text-xs); - font-weight: var(--weight-display); - font-variant-numeric: tabular-nums; - color: var(--text-muted); - min-width: 44px; - text-align: right; - } - .owm-pills { display: flex; gap: var(--space-3); diff --git a/apps/web/src/styles/planner.css b/apps/web/src/styles/planner.css index 4ec3505..c2748e5 100644 --- a/apps/web/src/styles/planner.css +++ b/apps/web/src/styles/planner.css @@ -238,11 +238,6 @@ font: var(--type-label-sm); } - .planner-stop-chip { - margin-inline-start: auto; - color: var(--text-muted); - } - .planner-stop-manual { display: flex; flex-direction: column; diff --git a/apps/web/src/styles/primitives.css b/apps/web/src/styles/primitives.css index 48d1552..0ae0a87 100644 --- a/apps/web/src/styles/primitives.css +++ b/apps/web/src/styles/primitives.css @@ -219,13 +219,6 @@ color: var(--text); } - .tag-row { - display: flex; - flex-wrap: wrap; - gap: var(--space-2); - margin-top: var(--space-3); - } - /* ---- Toggle --------------------------------------------------------- */ .toggle { width: 40px; @@ -539,13 +532,6 @@ line-height: 1.35; } - .setting-row-value { - font-size: var(--text-sm); - font-weight: var(--weight-strong); - color: var(--text-muted); - flex-shrink: 0; - } - .segmented { display: inline-flex; padding: 2px;