Extract @trails-cool/map-core package from Planner
New renderer-agnostic package with zero dependencies: - Tile configs (base layers, overlay layers) - Color palettes (surface, highway, smoothness, tracktype, cycleway, bikeroute, elevation, maxspeed) — 8 color maps + 3 color functions - POI category definitions (9 categories with Overpass queries, icons, colors, profile mappings) - Z-index layering constants - Snap distance constant Updated 15 consuming files to import from @trails-cool/map-core. Deleted poi-categories.ts and z-index.ts from the Planner (fully moved). packages/map re-exports tile configs from map-core for backwards compat. All 117 tests pass, no user-facing changes. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
cd939ccf07
commit
60b94b5789
33 changed files with 339 additions and 257 deletions
|
|
@ -1,6 +1,6 @@
|
|||
import { describe, it, expect } from "vitest";
|
||||
import { buildQuery, parseResponse, deduplicateById, type Poi } from "./overpass.ts";
|
||||
import { poiCategories } from "./poi-categories.ts";
|
||||
import { poiCategories } from "@trails-cool/map-core";
|
||||
|
||||
describe("buildQuery", () => {
|
||||
it("builds Overpass QL with bbox and category union", () => {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import type { PoiCategory } from "./poi-categories.ts";
|
||||
import type { PoiCategory } from "@trails-cool/map-core";
|
||||
|
||||
const OVERPASS_ENDPOINTS = [
|
||||
"https://overpass.kumi.systems/api/interpreter",
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { describe, it, expect } from "vitest";
|
||||
import { getCategoriesForProfile, profileOverlayDefaults, poiCategories } from "./poi-categories.ts";
|
||||
import { getCategoriesForProfile, profileOverlayDefaults, poiCategories } from "@trails-cool/map-core";
|
||||
|
||||
describe("getCategoriesForProfile", () => {
|
||||
it("returns bike infra for cycling profiles", () => {
|
||||
|
|
|
|||
|
|
@ -1,90 +0,0 @@
|
|||
export interface PoiCategory {
|
||||
id: string;
|
||||
name: string;
|
||||
icon: string;
|
||||
color: string;
|
||||
query: string;
|
||||
profiles?: string[];
|
||||
}
|
||||
|
||||
export const poiCategories: PoiCategory[] = [
|
||||
{
|
||||
id: "drinking_water",
|
||||
name: "poi.drinkingWater",
|
||||
icon: "💧",
|
||||
color: "#2563eb",
|
||||
query: 'nwr["amenity"="drinking_water"];nwr["amenity"="water_point"];',
|
||||
},
|
||||
{
|
||||
id: "shelter",
|
||||
name: "poi.shelter",
|
||||
icon: "🛖",
|
||||
color: "#8B6D3A",
|
||||
query: 'nwr["amenity"="shelter"];nwr["tourism"="wilderness_hut"];',
|
||||
profiles: ["trekking"],
|
||||
},
|
||||
{
|
||||
id: "camping",
|
||||
name: "poi.camping",
|
||||
icon: "⛺",
|
||||
color: "#059669",
|
||||
query: 'nwr["tourism"="camp_site"];nwr["tourism"="caravan_site"];',
|
||||
},
|
||||
{
|
||||
id: "food",
|
||||
name: "poi.food",
|
||||
icon: "🍽️",
|
||||
color: "#dc2626",
|
||||
query: 'nwr["amenity"="restaurant"];nwr["amenity"="cafe"];nwr["amenity"="fast_food"];nwr["amenity"="pub"];nwr["amenity"="biergarten"];',
|
||||
},
|
||||
{
|
||||
id: "groceries",
|
||||
name: "poi.groceries",
|
||||
icon: "🛒",
|
||||
color: "#f97316",
|
||||
query: 'nwr["shop"="supermarket"];nwr["shop"="convenience"];nwr["shop"="bakery"];',
|
||||
},
|
||||
{
|
||||
id: "bike_infra",
|
||||
name: "poi.bikeInfra",
|
||||
icon: "🔧",
|
||||
color: "#8b5cf6",
|
||||
query: 'nwr["amenity"="bicycle_parking"];nwr["amenity"="bicycle_repair_station"];nwr["amenity"="bicycle_rental"];',
|
||||
profiles: ["fastbike", "safety"],
|
||||
},
|
||||
{
|
||||
id: "accommodation",
|
||||
name: "poi.accommodation",
|
||||
icon: "🏨",
|
||||
color: "#0891b2",
|
||||
query: 'nwr["tourism"="hotel"];nwr["tourism"="hostel"];nwr["tourism"="guest_house"];',
|
||||
},
|
||||
{
|
||||
id: "viewpoints",
|
||||
name: "poi.viewpoints",
|
||||
icon: "👁️",
|
||||
color: "#9333ea",
|
||||
query: 'nwr["tourism"="viewpoint"];',
|
||||
profiles: ["trekking"],
|
||||
},
|
||||
{
|
||||
id: "toilets",
|
||||
name: "poi.toilets",
|
||||
icon: "🚻",
|
||||
color: "#6b7280",
|
||||
query: 'nwr["amenity"="toilets"];',
|
||||
},
|
||||
];
|
||||
|
||||
export function getCategoriesForProfile(profile: string): string[] {
|
||||
return poiCategories
|
||||
.filter((c) => c.profiles?.includes(profile))
|
||||
.map((c) => c.id);
|
||||
}
|
||||
|
||||
/** Profile → tile overlay mapping */
|
||||
export const profileOverlayDefaults: Record<string, string[]> = {
|
||||
fastbike: ["waymarked-cycling"],
|
||||
safety: ["waymarked-cycling"],
|
||||
trekking: ["waymarked-hiking"],
|
||||
};
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
import type { Poi } from "./overpass.ts";
|
||||
|
||||
const SNAP_DISTANCE_METERS = 50;
|
||||
import { SNAP_DISTANCE_METERS } from "@trails-cool/map-core";
|
||||
|
||||
export interface SnapResult {
|
||||
lat: number;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import { useCallback, useEffect, useRef, useState } from "react";
|
||||
import { queryPois, OverpassRateLimitError, type Poi, type BBox } from "./overpass.ts";
|
||||
import { getCached, setCached } from "./poi-cache.ts";
|
||||
import { poiCategories } from "./poi-categories.ts";
|
||||
import { poiCategories } from "@trails-cool/map-core";
|
||||
|
||||
const MIN_ZOOM = 10;
|
||||
const DEBOUNCE_MS = 800;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import { useEffect, useRef } from "react";
|
||||
import type { YjsState } from "./use-yjs.ts";
|
||||
import type { PoiState } from "./use-pois.ts";
|
||||
import { getCategoriesForProfile } from "./poi-categories.ts";
|
||||
import { getCategoriesForProfile } from "@trails-cool/map-core";
|
||||
|
||||
/**
|
||||
* Auto-enable relevant POI categories when the routing profile changes.
|
||||
|
|
|
|||
|
|
@ -1,13 +0,0 @@
|
|||
/**
|
||||
* Leaflet marker z-index offsets for consistent layering.
|
||||
* Higher values render on top of lower values.
|
||||
*
|
||||
* Rendering order (bottom to top):
|
||||
* POI markers → cursor markers → ghost waypoint → waypoint markers → highlight dot
|
||||
*/
|
||||
export const Z_CURSOR = -1000;
|
||||
export const Z_GHOST_WAYPOINT = -100;
|
||||
export const Z_WAYPOINT = 1000;
|
||||
export const Z_POI_MARKER = 900;
|
||||
export const Z_WAYPOINT_HIGHLIGHTED = 1600;
|
||||
export const Z_HIGHLIGHT = 2000;
|
||||
Loading…
Add table
Add a link
Reference in a new issue