@rcpch/imd-map 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -0
- package/LICENSE +21 -0
- package/README.md +417 -0
- package/dist/index.d.ts +225 -0
- package/dist/index.esm.js +1571 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/umd/rcpch-imd-map.min.js +595 -0
- package/package.json +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/resolver.ts","../src/core/state.ts","../src/map/sources.ts","../src/map/styles.ts","../src/map/layers.ts","../src/utils/properties.ts","../src/map/popups.ts","../src/utils/validation.ts","../src/adapters/patientInput.ts","../src/overlays/leadCentre.ts","../src/overlays/localAuthority.ts","../src/overlays/healthBoundaries.ts","../src/map/legend.ts","../src/utils/logging.ts","../src/core/createImdMap.ts"],"names":["VectorTileSource","MaplibreMap"],"mappings":"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","file":"index.esm.js","sourcesContent":["import type { Nation, Era } from '../types/public';\n\n// ── Era resolution ────────────────────────────────────────────────────────────\n//\n// These rules encode the core domain constraints from the spec.\n// They must not be moved to consuming applications.\n//\n// Source of truth: rcpch-census-platform AGENTS.md \"Dataset/Boundary Source Of Truth\"\n//\n// Era key meanings (from live census platform):\n// '2021' era → England 2025 IMD on 2021 LSOAs (default for England)\n// '2011' era → England 2019 IMD on 2011 LSOAs\n// Wales → always 2019 WIMD on 2011 LSOAs (no 2025 WIMD published)\n// Scotland → always 2020 SIMD on 2011 DataZones\n// N. Ireland → always 2017 NIMDM on 2001 SOAs\n//\n// Rules:\n// all-UK view → always 2011 era (uk_master_2011_* so all 4 nations appear)\n// england only → consumer-requested era (2011 or 2021, default 2021)\n// wales / scotland → fixed to 2011 era in current tile infrastructure\n// northern ireland → fixed to 2011 era in current tile infrastructure\n\n/**\n * Resolve the effective era that will actually be used for tile fetching.\n * The consumer may request an era that is not supported for a given nation.\n */\nexport function resolveEffectiveEra(nation: Nation, requestedEra: Era): Era {\n switch (nation) {\n case 'all':\n return '2011';\n case 'england':\n return requestedEra;\n case 'wales':\n case 'scotland':\n case 'northern_ireland':\n return '2011';\n default:\n return '2011';\n }\n}\n\n/**\n * Returns true when the effective era will differ from the requested era.\n * Use this to decide whether to emit an onWarning callback.\n */\nexport function willEraBeOverridden(nation: Nation, requestedEra: Era): boolean {\n return resolveEffectiveEra(nation, requestedEra) !== requestedEra;\n}\n\n// ── Zoom tier resolution ──────────────────────────────────────────────────────\n//\n// The census platform materializes three tile tables per era, each pre-built for\n// a zoom range with appropriate geometry simplification.\n//\n// z0_4 → zoom 0–4 (whole UK fits on screen)\n// z5_7 → zoom 5–7 (region/county level)\n// z8_10 → zoom 8–10 (individual area level)\n//\n// In MapLibre GL, all three sources are added simultaneously. Each corresponding\n// fill layer is given a minzoom / maxzoom so MapLibre switches them automatically\n// as the user zooms. Only the correct tier is rendered at any given zoom level.\n\nexport type ZoomTier = 'z0_4' | 'z5_7' | 'z8_10';\n\nexport const ZOOM_TIERS: { tier: ZoomTier; minzoom: number; maxzoom: number }[] = [\n { tier: 'z0_4', minzoom: 0, maxzoom: 5 },\n { tier: 'z5_7', minzoom: 5, maxzoom: 8 },\n { tier: 'z8_10', minzoom: 8, maxzoom: 24 },\n];\n\n// ── Table name resolution ─────────────────────────────────────────────────────\n//\n// The tile server (pg_tileserv) exposes tables in the format:\n// public.uk_master_{era}_{zoom_tier}\n//\n// The URL template for MapLibre is:\n// {tilesBaseUrl}/public.uk_master_{era}_{zoom_tier}/{z}/{x}/{y}.pbf\n//\n// The source-layer name inside the PBF file is the table name WITHOUT the schema\n// prefix, i.e. `uk_master_2011_z0_4` (pg_tileserv default behavior).\n//\n// Nation filtering is done via a MapLibre filter expression on the `nation`\n// property column — all nations are stored in the same `uk_master_*` tables.\n\n/**\n * Resolve the pg_tileserv table name for a given effective era and zoom tier.\n * Returns the bare table name (without schema prefix).\n * Used as the `source-layer` value in MapLibre layer definitions.\n */\nexport function resolveTileTableName(effectiveEra: Era, tier: ZoomTier): string {\n return `uk_master_${effectiveEra}_${tier}`;\n}\n\n/**\n * Build the full pg_tileserv table identifier including schema prefix.\n * Used in tile URL construction.\n */\nexport function resolveFullTableName(effectiveEra: Era, tier: ZoomTier): string {\n return `public.uk_master_${effectiveEra}_${tier}`;\n}\n\n/**\n * Build a MapLibre-compatible tile URL template for a given table.\n * pg_tileserv format: {base}/public.{tableName}/{z}/{x}/{y}.pbf\n */\nexport function buildTileUrl(tilesBaseUrl: string, fullTableName: string): string {\n const base = tilesBaseUrl.replace(/\\/$/, '');\n return `${base}/${fullTableName}/{z}/{x}/{y}.pbf`;\n}\n\n// ── Nation filter expressions ─────────────────────────────────────────────────\n//\n// The `nation` column in uk_master_* tiles holds lowercase string values.\n// When a specific nation is selected, apply a MapLibre filter expression to\n// restrict rendered features. For 'all', no filter is applied.\n\nexport type NationFilterValue = 'england' | 'wales' | 'scotland' | 'northern_ireland' | null;\n\n/**\n * Return a MapLibre filter expression to restrict tiles to a single nation,\n * or null when all nations should be shown.\n */\nexport function resolveNationFilter(nation: Nation): unknown[] | null {\n if (nation === 'all') return null;\n return ['==', ['get', 'nation'], nation];\n}\n","import type { Nation, Era, ImdMapState } from '../types/public';\nimport { resolveEffectiveEra } from './resolver';\n\nexport function createInitialState(nation: Nation = 'all', era: Era = '2021'): ImdMapState {\n return {\n nation,\n era,\n effectiveEra: resolveEffectiveEra(nation, era),\n hasPatients: false,\n hasLeadCentre: false,\n overlays: {\n localAuthority: false,\n nhser: false,\n icb: false,\n lhb: false,\n },\n };\n}\n","import { GeoJSONSource, VectorTileSource } from 'maplibre-gl';\nimport type { Map as MaplibreMap } from 'maplibre-gl';\nimport type { FeatureCollection, Point } from 'geojson';\nimport type { Era } from '../types/public';\nimport { ZOOM_TIERS, resolveFullTableName, buildTileUrl } from '../core/resolver';\nimport type { ZoomTier } from '../core/resolver';\n\n// ── Choropleth source IDs ─────────────────────────────────────────────────────\n//\n// Three separate vector tile sources — one per zoom tier — are added to the map.\n// MapLibre switches rendering automatically via minzoom/maxzoom on each layer.\n\nexport function choroplethSourceId(tier: ZoomTier): string {\n return `rcpch-imd-${tier}`;\n}\n\nexport const ALL_CHOROPLETH_SOURCE_IDS = ZOOM_TIERS.map((t) => choroplethSourceId(t.tier));\n\nexport const PATIENTS_SOURCE_ID = 'rcpch-imd-patients';\nexport const LEAD_CENTRE_SOURCE_ID = 'rcpch-imd-lead-centre';\n\n// ── Choropleth sources (3 per era) ────────────────────────────────────────────\n\n/**\n * Add or update all three zoom-tier vector tile sources for the choropleth.\n * Existing sources for the same IDs are updated in-place via setTiles() to\n * avoid removing layers that depend on them.\n */\nexport function addOrUpdateChoroplethSources(\n map: MaplibreMap,\n tilesBaseUrl: string,\n effectiveEra: Era,\n): void {\n for (const { tier } of ZOOM_TIERS) {\n const sourceId = choroplethSourceId(tier);\n const fullTableName = resolveFullTableName(effectiveEra, tier);\n const tileUrl = buildTileUrl(tilesBaseUrl, fullTableName);\n\n const existing = map.getSource(sourceId);\n if (existing instanceof VectorTileSource) {\n existing.setTiles([tileUrl]);\n } else {\n if (existing) map.removeSource(sourceId);\n map.addSource(sourceId, {\n type: 'vector',\n tiles: [tileUrl],\n minzoom: 0,\n maxzoom: 14,\n });\n }\n }\n}\n\nexport function removeChoroplethSources(map: MaplibreMap): void {\n for (const id of ALL_CHOROPLETH_SOURCE_IDS) {\n if (map.getSource(id)) map.removeSource(id);\n }\n}\n\n// ── Patient GeoJSON source ────────────────────────────────────────────────────\n\nexport function addOrUpdatePatientsSource(\n map: MaplibreMap,\n features: FeatureCollection<Point>['features'],\n): void {\n const data: FeatureCollection<Point> = { type: 'FeatureCollection', features };\n const existing = map.getSource(PATIENTS_SOURCE_ID);\n if (existing instanceof GeoJSONSource) {\n existing.setData(data);\n } else {\n if (existing) map.removeSource(PATIENTS_SOURCE_ID);\n map.addSource(PATIENTS_SOURCE_ID, { type: 'geojson', data });\n }\n}\n\n// ── Lead-centre GeoJSON source ────────────────────────────────────────────────\n\nexport function addOrUpdateLeadCentreSource(\n map: MaplibreMap,\n feature: FeatureCollection<Point>['features'][number] | null,\n): void {\n const data: FeatureCollection<Point> = {\n type: 'FeatureCollection',\n features: feature ? [feature] : [],\n };\n const existing = map.getSource(LEAD_CENTRE_SOURCE_ID);\n if (existing instanceof GeoJSONSource) {\n existing.setData(data);\n } else {\n if (existing) map.removeSource(LEAD_CENTRE_SOURCE_ID);\n map.addSource(LEAD_CENTRE_SOURCE_ID, { type: 'geojson', data });\n }\n}\n","import type { MapStyleOptions, Nation } from '../types/public';\n\n// ── RCPCH brand tokens ────────────────────────────────────────────────────────\n\nexport const RCPCH_DARK_BLUE = '#0d0d58';\nexport const RCPCH_PINK = '#e00087';\nexport const RCPCH_PINK_DARK = '#7a0036';\nexport const RCPCH_LIGHT_BLUE = '#41b6e6';\nexport const RCPCH_CHARCOAL = '#3d3d3d';\n\n// ── Color ramp generation ─────────────────────────────────────────────────────\n\nexport const DEFAULT_BASE_COLORS_BY_NATION: Record<Nation, string> = {\n england: '#d7191c',\n wales: '#1a9641',\n scotland: '#2b83ba',\n northern_ireland: '#7f7f7f',\n all: '#d7191c',\n};\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction normalizeHex(hex: string): string | null {\n const clean = hex.trim();\n if (/^#[0-9a-fA-F]{6}$/.test(clean)) return clean;\n if (/^#[0-9a-fA-F]{3}$/.test(clean)) {\n const r = clean[1];\n const g = clean[2];\n const b = clean[3];\n return `#${r}${r}${g}${g}${b}${b}`;\n }\n return null;\n}\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const normalized = normalizeHex(hex);\n if (!normalized) return null;\n const value = parseInt(normalized.slice(1), 16);\n return {\n r: (value >> 16) & 255,\n g: (value >> 8) & 255,\n b: value & 255,\n };\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n const rr = clamp(Math.round(r), 0, 255).toString(16).padStart(2, '0');\n const gg = clamp(Math.round(g), 0, 255).toString(16).padStart(2, '0');\n const bb = clamp(Math.round(b), 0, 255).toString(16).padStart(2, '0');\n return `#${rr}${gg}${bb}`;\n}\n\nfunction rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: number } {\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n let h = 0;\n const l = (max + min) / 2;\n const d = max - min;\n\n if (d !== 0) {\n switch (max) {\n case rn:\n h = ((gn - bn) / d + (gn < bn ? 6 : 0)) / 6;\n break;\n case gn:\n h = ((bn - rn) / d + 2) / 6;\n break;\n default:\n h = ((rn - gn) / d + 4) / 6;\n break;\n }\n }\n\n const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));\n return { h, s, l };\n}\n\nfunction hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const hp = h * 6;\n const x = c * (1 - Math.abs((hp % 2) - 1));\n\n let r1 = 0;\n let g1 = 0;\n let b1 = 0;\n\n if (hp >= 0 && hp < 1) {\n r1 = c; g1 = x; b1 = 0;\n } else if (hp < 2) {\n r1 = x; g1 = c; b1 = 0;\n } else if (hp < 3) {\n r1 = 0; g1 = c; b1 = x;\n } else if (hp < 4) {\n r1 = 0; g1 = x; b1 = c;\n } else if (hp < 5) {\n r1 = x; g1 = 0; b1 = c;\n } else {\n r1 = c; g1 = 0; b1 = x;\n }\n\n const m = l - c / 2;\n return {\n r: (r1 + m) * 255,\n g: (g1 + m) * 255,\n b: (b1 + m) * 255,\n };\n}\n\n/**\n * Create a 10-step ramp from a base color with equal lightness distance\n * on either side of the base color.\n */\nexport function generateDecileRampFromBaseColor(baseHex: string): string[] {\n const rgb = hexToRgb(baseHex);\n if (!rgb) return Array(10).fill('#cccccc');\n\n const { h, s, l } = rgbToHsl(rgb.r, rgb.g, rgb.b);\n const steps = 10;\n const spread = 0.34;\n const half = (steps - 1) / 2;\n\n return Array.from({ length: steps }, (_, i) => {\n const normalized = (i - half) / half;\n const li = clamp(l + normalized * spread, 0.08, 0.92);\n const { r, g, b } = hslToRgb(h, s, li);\n return rgbToHex(r, g, b);\n });\n}\n\n// ── Full default style ────────────────────────────────────────────────────────\n\nexport const DEFAULT_STYLE: Required<MapStyleOptions> = {\n choropleth: {\n decileColorsByNation: {},\n baseColorByNation: {\n england: DEFAULT_BASE_COLORS_BY_NATION.england,\n wales: DEFAULT_BASE_COLORS_BY_NATION.wales,\n scotland: DEFAULT_BASE_COLORS_BY_NATION.scotland,\n northern_ireland: DEFAULT_BASE_COLORS_BY_NATION.northern_ireland,\n },\n fallbackDecileColors: generateDecileRampFromBaseColor(DEFAULT_BASE_COLORS_BY_NATION.england),\n fillOpacity: 0.7,\n borderColor: '#ffffff',\n borderWidth: 0.5,\n hoverBorderColor: RCPCH_DARK_BLUE,\n hoverBorderWidth: 2,\n },\n boundaries: {\n localAuthorityColor: RCPCH_DARK_BLUE,\n localAuthorityWidth: 1,\n nhserColor: RCPCH_PINK,\n nhserWidth: 1.5,\n icbColor: RCPCH_CHARCOAL,\n icbWidth: 1,\n lhbColor: RCPCH_LIGHT_BLUE,\n lhbWidth: 1,\n },\n patients: {\n circleColor: RCPCH_DARK_BLUE,\n circleRadius: 5,\n circleStrokeColor: '#ffffff',\n circleStrokeWidth: 1,\n circleOpacity: 0.8,\n colorByGroup: {},\n },\n leadCentre: {\n color: RCPCH_PINK,\n radius: 10,\n strokeColor: '#ffffff',\n strokeWidth: 2,\n },\n tooltip: {\n backgroundColor: RCPCH_DARK_BLUE,\n textColor: '#ffffff',\n borderColor: RCPCH_DARK_BLUE,\n borderRadius: 4,\n areaLabel: 'Area',\n decileLabel: 'IMD decile',\n nationLabel: 'Nation',\n patientLabel: 'Patient',\n leadCentreLabel: 'Lead centre',\n patientTooltipText: '{{patientLabel}}',\n leadCentreTooltipText: '{{leadCentreLabel}}: {{label}}',\n },\n legend: {\n backgroundColor: '#ffffff',\n textColor: RCPCH_DARK_BLUE,\n borderColor: '#d8dde6',\n borderRadius: 8,\n fontSize: 13,\n fontFamily: 'system-ui, -apple-system, Segoe UI, Roboto, sans-serif',\n width: 220,\n boxShadow: '0 6px 18px rgba(0, 0, 0, 0.12)',\n toggleOnColor: RCPCH_DARK_BLUE,\n toggleOffColor: '#6b7280',\n },\n};\n\n// ── Style helpers ─────────────────────────────────────────────────────────────\n\n/** Deep-merge consumer overrides on top of the library defaults. */\nexport function mergeStyle(\n defaults: Required<MapStyleOptions>,\n overrides?: MapStyleOptions,\n): Required<MapStyleOptions> {\n if (!overrides) return defaults;\n return {\n choropleth: { ...defaults.choropleth, ...overrides.choropleth },\n boundaries: { ...defaults.boundaries, ...overrides.boundaries },\n patients: { ...defaults.patients, ...overrides.patients },\n leadCentre: { ...defaults.leadCentre, ...overrides.leadCentre },\n tooltip: { ...defaults.tooltip, ...overrides.tooltip },\n legend: { ...defaults.legend, ...overrides.legend },\n };\n}\n\n/**\n * Pick the 10-color decile array for a given nation from the resolved style.\n * Falls back to `fallbackDecileColors` → England defaults.\n */\nexport function getDecileColors(\n nation: Nation | string,\n style: Required<MapStyleOptions>,\n): string[] {\n const byNation = style.choropleth.decileColorsByNation ?? {};\n const fromExplicitRamp = byNation[nation as Nation];\n if (fromExplicitRamp && fromExplicitRamp.length === 10) return fromExplicitRamp;\n\n const baseByNation = style.choropleth.baseColorByNation ?? {};\n const configuredBase = baseByNation[nation as Nation];\n if (configuredBase) return generateDecileRampFromBaseColor(configuredBase);\n\n const defaultBase =\n DEFAULT_BASE_COLORS_BY_NATION[nation as Nation] ?? DEFAULT_BASE_COLORS_BY_NATION.england;\n\n return (\n generateDecileRampFromBaseColor(defaultBase) ??\n style.choropleth.fallbackDecileColors ??\n generateDecileRampFromBaseColor(DEFAULT_BASE_COLORS_BY_NATION.england)\n );\n}\n","import type { Map as MaplibreMap } from 'maplibre-gl';\nimport type { Nation, Era, MapStyleOptions } from '../types/public';\nimport { choroplethSourceId, PATIENTS_SOURCE_ID, LEAD_CENTRE_SOURCE_ID } from './sources';\nimport { getDecileColors } from './styles';\nimport { ZOOM_TIERS, resolveFullTableName, resolveNationFilter } from '../core/resolver';\nimport type { ZoomTier } from '../core/resolver';\n\n// ── Layer ID helpers ──────────────────────────────────────────────────────────\n\nexport function choroplethFillLayerId(tier: ZoomTier): string {\n return `rcpch-imd-fill-${tier}`;\n}\n\nexport function choroplethLineLayerId(tier: ZoomTier): string {\n return `rcpch-imd-line-${tier}`;\n}\n\nexport const ALL_CHOROPLETH_LAYER_IDS = ZOOM_TIERS.flatMap((t) => [\n choroplethFillLayerId(t.tier),\n choroplethLineLayerId(t.tier),\n]);\n\nexport const PATIENTS_LAYER_ID = 'rcpch-imd-patients';\nexport const LEAD_CENTRE_LAYER_ID = 'rcpch-imd-lead-centre';\n\n// Expose a representative fill layer ID for hover/click event binding.\n// We attach mouse events to the high-zoom tier layer as it is most precise\n// at the zoom levels where users will actually interact with individual areas.\nexport const CHOROPLETH_FILL_LAYER_ID = choroplethFillLayerId('z8_10');\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/**\n * Build a MapLibre step expression mapping imd_decile (1–10) to colors.\n */\nfunction buildDecileColorExpression(colors: string[]): unknown[] {\n const fallback = colors[0] ?? '#cccccc';\n return [\n 'step',\n ['get', 'imd_decile'],\n fallback,\n 2, colors[1] ?? fallback,\n 3, colors[2] ?? fallback,\n 4, colors[3] ?? fallback,\n 5, colors[4] ?? fallback,\n 6, colors[5] ?? fallback,\n 7, colors[6] ?? fallback,\n 8, colors[7] ?? fallback,\n 9, colors[8] ?? fallback,\n 10, colors[9] ?? fallback,\n ];\n}\n\n/**\n * Build a MapLibre fill-color expression for a given nation view.\n * - Single nation: a `step` expression on imd_decile.\n * - All nations ('all'): a `match` expression on the `nation` feature property,\n * each branch using its own decile color ramp, so England/Wales/Scotland/NI\n * each render in their own color family simultaneously.\n */\nfunction buildColorExpression(nation: Nation, style: Required<MapStyleOptions>): unknown[] {\n if (nation !== 'all') {\n return buildDecileColorExpression(getDecileColors(nation, style));\n }\n\n const perNation = (\n ['england', 'wales', 'scotland', 'northern_ireland'] as const\n ).flatMap((n) => [n, buildDecileColorExpression(getDecileColors(n, style))]);\n\n return [\n 'match',\n ['get', 'nation'],\n ...perNation,\n // fallback for any unrecognised nation value\n getDecileColors('england', style)[0] ?? '#cccccc',\n ];\n}\n\n/**\n * Find the first symbol layer so choropleth fills are inserted below labels.\n */\nfunction firstSymbolLayerId(map: MaplibreMap): string | undefined {\n for (const layer of map.getStyle().layers ?? []) {\n if (layer.type === 'symbol') return layer.id;\n }\n return undefined;\n}\n\nexport function buildPatientCircleColorExpression(\n style: Required<MapStyleOptions>,\n): string | unknown[] {\n const fallback = style.patients.circleColor ?? '#0d0d58';\n const groupMap = style.patients.colorByGroup ?? {};\n const entries = Object.entries(groupMap).filter(([k, v]) => k && v);\n\n if (!entries.length) return fallback;\n\n return [\n 'match',\n ['coalesce', ['to-string', ['get', 'group']], ''],\n ...entries.flatMap(([group, color]) => [group, color]),\n fallback,\n ];\n}\n\n// ── Choropleth layers (3 per view) ────────────────────────────────────────────\n//\n// One fill + one line layer per zoom tier. Each pair is constrained to its\n// zoom range. MapLibre renders only the active tier at any given zoom level.\n\nexport function addChoroplethLayers(\n map: MaplibreMap,\n nation: Nation,\n effectiveEra: Era,\n style: Required<MapStyleOptions>,\n): void {\n removeChoroplethLayers(map);\n\n const nationFilter = resolveNationFilter(nation);\n const filterProps = nationFilter ? ({ filter: nationFilter as any }) : {};\n const before = firstSymbolLayerId(map);\n\n for (const { tier, minzoom, maxzoom } of ZOOM_TIERS) {\n const sourceId = choroplethSourceId(tier);\n const sourceLayer = resolveFullTableName(effectiveEra, tier);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const colorExpr = buildColorExpression(nation, style) as any;\n\n map.addLayer(\n {\n id: choroplethFillLayerId(tier),\n type: 'fill',\n source: sourceId,\n 'source-layer': sourceLayer,\n minzoom,\n maxzoom,\n ...filterProps,\n paint: {\n 'fill-color': colorExpr,\n 'fill-opacity': style.choropleth.fillOpacity ?? 0.7,\n },\n },\n before,\n );\n\n map.addLayer(\n {\n id: choroplethLineLayerId(tier),\n type: 'line',\n source: sourceId,\n 'source-layer': sourceLayer,\n minzoom,\n maxzoom,\n ...filterProps,\n paint: {\n 'line-color': style.choropleth.borderColor ?? '#ffffff',\n 'line-width': style.choropleth.borderWidth ?? 0.5,\n },\n },\n before,\n );\n }\n}\n\nexport function removeChoroplethLayers(map: MaplibreMap): void {\n for (const id of ALL_CHOROPLETH_LAYER_IDS) {\n if (map.getLayer(id)) map.removeLayer(id);\n }\n}\n\nexport function updateChoroplethStyle(\n map: MaplibreMap,\n nation: Nation,\n style: Required<MapStyleOptions>,\n): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const colorExpr = buildColorExpression(nation, style) as any;\n\n for (const { tier } of ZOOM_TIERS) {\n const fillId = choroplethFillLayerId(tier);\n const lineId = choroplethLineLayerId(tier);\n if (!map.getLayer(fillId)) continue;\n map.setPaintProperty(fillId, 'fill-color', colorExpr);\n map.setPaintProperty(fillId, 'fill-opacity', style.choropleth.fillOpacity ?? 0.7);\n map.setPaintProperty(lineId, 'line-color', style.choropleth.borderColor ?? '#ffffff');\n map.setPaintProperty(lineId, 'line-width', style.choropleth.borderWidth ?? 0.5);\n }\n}\n\nexport function updateChoroplethNationFilter(\n map: MaplibreMap,\n nation: Nation,\n effectiveEra: Era,\n): void {\n const nationFilter = resolveNationFilter(nation);\n\n for (const { tier } of ZOOM_TIERS) {\n const fillId = choroplethFillLayerId(tier);\n const lineId = choroplethLineLayerId(tier);\n if (!map.getLayer(fillId)) continue;\n\n // Update source-layer in case era changed (era change requires layer rebuild)\n // For nation-only changes on same era, just update the filter.\n const newSourceLayer = resolveFullTableName(effectiveEra, tier);\n // MapLibre does not expose setSourceLayer, so if source-layer needs to change\n // the caller must rebuild the layers. Just update filter here.\n void newSourceLayer; // acknowledged — era change is handled by removeChoroplethLayers + addChoroplethLayers\n\n map.setFilter(fillId, nationFilter as any);\n map.setFilter(lineId, nationFilter as any);\n }\n}\n\n// ── Patient layer ─────────────────────────────────────────────────────────────\n\nexport function addOrUpdatePatientsLayer(\n map: MaplibreMap,\n style: Required<MapStyleOptions>,\n): void {\n const p = style.patients;\n const color = buildPatientCircleColorExpression(style);\n\n if (map.getLayer(PATIENTS_LAYER_ID)) {\n map.setPaintProperty(PATIENTS_LAYER_ID, 'circle-color', color as any);\n map.setPaintProperty(PATIENTS_LAYER_ID, 'circle-radius', p.circleRadius ?? 5);\n map.setPaintProperty(PATIENTS_LAYER_ID, 'circle-stroke-color', p.circleStrokeColor ?? '#ffffff');\n map.setPaintProperty(PATIENTS_LAYER_ID, 'circle-stroke-width', p.circleStrokeWidth ?? 1);\n map.setPaintProperty(PATIENTS_LAYER_ID, 'circle-opacity', p.circleOpacity ?? 0.8);\n } else {\n map.addLayer({\n id: PATIENTS_LAYER_ID,\n type: 'circle',\n source: PATIENTS_SOURCE_ID,\n paint: {\n 'circle-color': color as any,\n 'circle-radius': p.circleRadius ?? 5,\n 'circle-stroke-color': p.circleStrokeColor ?? '#ffffff',\n 'circle-stroke-width': p.circleStrokeWidth ?? 1,\n 'circle-opacity': p.circleOpacity ?? 0.8,\n },\n });\n }\n}\n\nexport function removePatientsLayer(map: MaplibreMap): void {\n if (map.getLayer(PATIENTS_LAYER_ID)) map.removeLayer(PATIENTS_LAYER_ID);\n}\n\n// ── Lead-centre layer ─────────────────────────────────────────────────────────\n\nexport function addOrUpdateLeadCentreLayer(\n map: MaplibreMap,\n style: Required<MapStyleOptions>,\n): void {\n const lc = style.leadCentre;\n\n if (map.getLayer(LEAD_CENTRE_LAYER_ID)) {\n map.setPaintProperty(LEAD_CENTRE_LAYER_ID, 'circle-color', lc.color ?? '#e00087');\n map.setPaintProperty(LEAD_CENTRE_LAYER_ID, 'circle-radius', lc.radius ?? 10);\n map.setPaintProperty(LEAD_CENTRE_LAYER_ID, 'circle-stroke-color', lc.strokeColor ?? '#ffffff');\n map.setPaintProperty(LEAD_CENTRE_LAYER_ID, 'circle-stroke-width', lc.strokeWidth ?? 2);\n } else {\n map.addLayer({\n id: LEAD_CENTRE_LAYER_ID,\n type: 'circle',\n source: LEAD_CENTRE_SOURCE_ID,\n paint: {\n 'circle-color': lc.color ?? '#e00087',\n 'circle-radius': lc.radius ?? 10,\n 'circle-stroke-color': lc.strokeColor ?? '#ffffff',\n 'circle-stroke-width': lc.strokeWidth ?? 2,\n },\n });\n }\n}\n\nexport function removeLeadCentreLayer(map: MaplibreMap): void {\n if (map.getLayer(LEAD_CENTRE_LAYER_ID)) map.removeLayer(LEAD_CENTRE_LAYER_ID);\n}\n","// Case-insensitive and alias-tolerant property lookup for vector tile features.\n// Canonical property names are as exposed by pg_tileserv from the census platform.\n//\n// Source of truth: rcpch-census-platform AGENTS.md \"Exposed tile properties\"\n//\n// uk_master_* columns: code, area_name, imd_decile, imd_year, nation, year,\n// la_code, la_name, la_year, nhser_code, nhser_name, icb_code, icb_name,\n// lhb_code, lhb_name\n// lsoa_tiles_* columns: lsoa_code, area_name, imd_decile, imd_rank, year\n//\n// The alias lists below allow the library to remain resilient to minor\n// schema changes and to work with both table families.\n\nconst KEY_ALIASES: Record<string, string[]> = {\n // Canonical: 'code' (uk_master_*). Also accept lsoa_code for lsoa_tiles_* family.\n code: ['code', 'lsoa_code', 'LSOA11CD', 'lsoa11cd', 'LSOA21CD', 'lsoa21cd'],\n // Canonical: 'area_name' for both table families.\n area_name: ['area_name', 'LSOA11NM', 'lsoa11nm', 'LSOA21NM', 'lsoa21nm', 'name'],\n imd_decile: ['imd_decile', 'IMD_Decile', 'IMDDecile', 'decile', 'imd_rank_decile'],\n imd_rank: ['imd_rank', 'IMD_Rank', 'rank'],\n imd_year: ['imd_year', 'IMD_Year'],\n nation: ['nation', 'Nation', 'country', 'Country'],\n year: ['year', 'Year'],\n // Health / administrative boundary codes\n la_code: ['la_code', 'LAD_code', 'lad_code'],\n la_name: ['la_name', 'LAD_name', 'lad_name'],\n nhser_code: ['nhser_code', 'NHSER_code'],\n nhser_name: ['nhser_name', 'NHSER_name'],\n icb_code: ['icb_code', 'ICB_code'],\n icb_name: ['icb_name', 'ICB_name'],\n lhb_code: ['lhb_code', 'LHB_code'],\n lhb_name: ['lhb_name', 'LHB_name'],\n};\n\n/**\n * Look up a canonical property key from a feature's properties object.\n * Tries: exact match → known aliases → case-insensitive match.\n */\nexport function getFeatureProperty(\n properties: Record<string, unknown> | null | undefined,\n canonicalKey: string,\n): unknown {\n if (!properties) return undefined;\n\n if (canonicalKey in properties) return properties[canonicalKey];\n\n const aliases = KEY_ALIASES[canonicalKey];\n if (aliases) {\n for (const alias of aliases) {\n if (alias in properties) return properties[alias];\n }\n }\n\n const lowerKey = canonicalKey.toLowerCase();\n for (const [k, v] of Object.entries(properties)) {\n if (k.toLowerCase() === lowerKey) return v;\n }\n\n return undefined;\n}\n","import { Popup } from 'maplibre-gl';\nimport type { Map as MaplibreMap, MapMouseEvent, MapGeoJSONFeature } from 'maplibre-gl';\nimport type { CreateImdMapOptions, MapStyleOptions, AreaHoverPayload } from '../types/public';\nimport {\n CHOROPLETH_FILL_LAYER_ID,\n ALL_CHOROPLETH_LAYER_IDS,\n PATIENTS_LAYER_ID,\n LEAD_CENTRE_LAYER_ID,\n} from './layers';\nimport { getFeatureProperty } from '../utils/properties';\n\nfunction interpolateTemplate(template: string, tokens: Record<string, unknown>): string {\n return template.replace(/{{\\s*([a-zA-Z0-9_]+)\\s*}}/g, (_, key: string) => {\n const value = tokens[key];\n return value === null || value === undefined ? '' : String(value);\n });\n}\n\n// ── Tooltip HTML builder ──────────────────────────────────────────────────────\n// Property names match the pg_tileserv uk_master_* schema:\n// code, area_name, imd_decile, nation\n\nexport function buildChoroplethTooltipHtml(\n properties: Record<string, unknown> | null | undefined,\n style: Required<MapStyleOptions>,\n): string {\n const t = style.tooltip;\n const areaName = getFeatureProperty(properties, 'area_name') ?? 'Unknown area';\n const decile = getFeatureProperty(properties, 'imd_decile') ?? '–';\n const nation = getFeatureProperty(properties, 'nation') ?? '–';\n const areaYear = getFeatureProperty(properties, 'year') ?? '–';\n const imdYear = getFeatureProperty(properties, 'imd_year') ?? '–';\n\n const bg = t.backgroundColor ?? '#0d0d58';\n const color = t.textColor ?? '#ffffff';\n const radius = t.borderRadius ?? 4;\n\n return `<div style=\"background:${bg};color:${color};padding:8px 12px;border-radius:${radius}px;font-size:13px;line-height:1.6;font-family:sans-serif;\">\n <strong style=\"display:block;margin-bottom:2px;\">${String(areaName)}</strong>\n <span>LSOA year: ${String(areaYear)}</span><br/>\n <span>${t.decileLabel ?? 'IMD decile'}: <strong>${String(decile)}</strong></span><br/>\n <span>IMD year: ${String(imdYear)}</span><br/>\n <span>${t.nationLabel ?? 'Nation'}: ${String(nation)}</span>\n</div>`;\n}\n\nexport function buildPatientTooltipHtml(\n properties: Record<string, unknown> | null | undefined,\n style: Required<MapStyleOptions>,\n): string {\n const t = style.tooltip;\n const id = getFeatureProperty(properties, 'id') ?? '';\n const group = getFeatureProperty(properties, 'group') ?? '';\n\n const bg = t.backgroundColor ?? '#0d0d58';\n const color = t.textColor ?? '#ffffff';\n const radius = t.borderRadius ?? 4;\n\n const patientLabel = t.patientLabel ?? 'Patient';\n const template = t.patientTooltipText ?? '{{patientLabel}}';\n const tokens = {\n // Spread all feature properties first so named tokens (id, group, etc.)\n // override any same-named extra field, and extra fields like nhs_number\n // are available as {{nhs_number}} etc.\n ...(properties ?? {}),\n patientLabel,\n id,\n group,\n };\n\n const text = interpolateTemplate(template, tokens);\n\n return `<div style=\"background:${bg};color:${color};padding:8px 12px;border-radius:${radius}px;font-size:13px;line-height:1.6;font-family:sans-serif;\">\n <span>${text}</span>\n</div>`;\n}\n\nexport function buildLeadCentreTooltipHtml(\n properties: Record<string, unknown> | null | undefined,\n style: Required<MapStyleOptions>,\n): string {\n const t = style.tooltip;\n const label = getFeatureProperty(properties, 'label') ?? 'Lead centre';\n\n const bg = t.backgroundColor ?? '#0d0d58';\n const color = t.textColor ?? '#ffffff';\n const radius = t.borderRadius ?? 4;\n\n const leadCentreLabel = t.leadCentreLabel ?? 'Lead centre';\n const text = interpolateTemplate(t.leadCentreTooltipText ?? '{{leadCentreLabel}}: {{label}}', {\n leadCentreLabel,\n label,\n });\n\n return `<div style=\"background:${bg};color:${color};padding:8px 12px;border-radius:${radius}px;font-size:13px;line-height:1.6;font-family:sans-serif;\">\n <span>${text}</span>\n</div>`;\n}\n\nfunction featureToPayload(\n feature: MapGeoJSONFeature,\n): AreaHoverPayload {\n const props = (feature.properties ?? {}) as Record<string, unknown>;\n const decileRaw = getFeatureProperty(props, 'imd_decile');\n return {\n lsoaCode: String(getFeatureProperty(props, 'code') ?? ''),\n lsoaName: String(getFeatureProperty(props, 'area_name') ?? ''),\n imdDecile: typeof decileRaw === 'number' ? decileRaw : undefined,\n nation: String(getFeatureProperty(props, 'nation') ?? ''),\n rawProperties: props,\n };\n}\n\n// ── Attach hover + click handlers ────────────────────────────────────────────\n// Events are attached to all fill layer IDs (all zoom tiers) so hover works\n// at every zoom level.\n\nexport function attachChoroplethInteraction(\n map: MaplibreMap,\n popup: Popup,\n style: Required<MapStyleOptions>,\n options: Pick<CreateImdMapOptions, 'onAreaHover' | 'onAreaClick'>,\n): void {\n // All fill layer IDs from all zoom tiers\n const fillLayers = ALL_CHOROPLETH_LAYER_IDS.filter((id) => id.startsWith('rcpch-imd-fill-'));\n\n for (const layerId of fillLayers) {\n map.on('mousemove', layerId, (e: MapMouseEvent) => {\n const features = map.queryRenderedFeatures(e.point, { layers: [layerId] });\n if (!features.length) return;\n\n map.getCanvas().style.cursor = 'pointer';\n\n const feature = features[0];\n popup\n .setLngLat(e.lngLat)\n .setHTML(buildChoroplethTooltipHtml(feature.properties as Record<string, unknown>, style))\n .addTo(map);\n\n options.onAreaHover?.(featureToPayload(feature));\n });\n\n map.on('mouseleave', layerId, () => {\n map.getCanvas().style.cursor = '';\n popup.remove();\n });\n\n map.on('click', layerId, (e: MapMouseEvent) => {\n const features = map.queryRenderedFeatures(e.point, { layers: [layerId] });\n if (!features.length) return;\n options.onAreaClick?.(featureToPayload(features[0]));\n });\n }\n\n // Keep the named export for any caller that references a single fill layer\n void CHOROPLETH_FILL_LAYER_ID;\n}\n\nexport function attachPatientInteraction(\n map: MaplibreMap,\n popup: Popup,\n style: Required<MapStyleOptions>,\n): void {\n map.on('mousemove', PATIENTS_LAYER_ID, (e: MapMouseEvent) => {\n const features = map.queryRenderedFeatures(e.point, { layers: [PATIENTS_LAYER_ID] });\n if (!features.length) return;\n\n const feature = features[0];\n map.getCanvas().style.cursor = 'pointer';\n popup\n .setLngLat(e.lngLat)\n .setHTML(buildPatientTooltipHtml(feature.properties as Record<string, unknown>, style))\n .addTo(map);\n });\n\n map.on('mouseleave', PATIENTS_LAYER_ID, () => {\n map.getCanvas().style.cursor = '';\n popup.remove();\n });\n}\n\nexport function attachLeadCentreInteraction(\n map: MaplibreMap,\n popup: Popup,\n style: Required<MapStyleOptions>,\n): void {\n map.on('mousemove', LEAD_CENTRE_LAYER_ID, (e: MapMouseEvent) => {\n const features = map.queryRenderedFeatures(e.point, { layers: [LEAD_CENTRE_LAYER_ID] });\n if (!features.length) return;\n\n const feature = features[0];\n map.getCanvas().style.cursor = 'pointer';\n popup\n .setLngLat(e.lngLat)\n .setHTML(buildLeadCentreTooltipHtml(feature.properties as Record<string, unknown>, style))\n .addTo(map);\n });\n\n map.on('mouseleave', LEAD_CENTRE_LAYER_ID, () => {\n map.getCanvas().style.cursor = '';\n popup.remove();\n });\n}\n\n// ── Attach hover + click handlers ────────────────────────────────────────────\n","import type { NormalizedPatientPoint } from '../types/public';\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/** Validate that lat/lon are numbers within WGS-84 bounds. */\nexport function validateLatLon(lat: unknown, lon: unknown): ValidationResult {\n const errors: string[] = [];\n\n if (typeof lat !== 'number' || isNaN(lat) || lat < -90 || lat > 90) {\n errors.push(`Invalid latitude: ${String(lat)}. Must be a number between -90 and 90.`);\n }\n if (typeof lon !== 'number' || isNaN(lon) || lon < -180 || lon > 180) {\n errors.push(`Invalid longitude: ${String(lon)}. Must be a number between -180 and 180.`);\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n// Approximate UK bounding box (includes Channel Islands and Isle of Man)\nconst UK_BOUNDS = { minLat: 49.5, maxLat: 61.5, minLon: -8.7, maxLon: 2.1 };\n\n/** Returns true if the coordinate is within the approximate UK bounding box. */\nexport function isWithinUK(lat: number, lon: number): boolean {\n return (\n lat >= UK_BOUNDS.minLat &&\n lat <= UK_BOUNDS.maxLat &&\n lon >= UK_BOUNDS.minLon &&\n lon <= UK_BOUNDS.maxLon\n );\n}\n\n/**\n * Validate and normalize a single patient record.\n *\n * - Invalid lat/lon → point is null (fatal, emitted as warning unless strict)\n * - Outside UK bounds → point is returned but errors list is non-empty (soft warning)\n * - strict = true → outside UK bounds is treated as fatal\n */\nexport function validatePatientPoint(\n record: unknown,\n): { point: NormalizedPatientPoint | null; errors: string[] } {\n if (!record || typeof record !== 'object') {\n return { point: null, errors: ['Record is not an object.'] };\n }\n\n const r = record as Record<string, unknown>;\n\n const lat = r.lat ?? r.latitude ?? r.LAT;\n const lon = r.lon ?? r.lng ?? r.longitude ?? r.LON;\n\n const { valid, errors } = validateLatLon(lat, lon);\n if (!valid) return { point: null, errors };\n\n if (!isWithinUK(lat as number, lon as number)) {\n const msg = `Point (${String(lat)}, ${String(lon)}) is outside UK bounds and will be skipped.`;\n // Always skip out-of-bounds points — this is a UK patient mapping tool.\n // In non-strict mode a warning is emitted; strict mode is reserved for\n // callers that want to treat this as a hard error.\n return { point: null, errors: [msg] };\n }\n\n const reservedKeys = new Set(['lat', 'lon', 'id', 'weight', 'group', 'latitude', 'longitude', 'lng', 'LAT', 'LON']);\n\n const point: NormalizedPatientPoint = {\n lat: lat as number,\n lon: lon as number,\n id: r.id !== undefined ? String(r.id) : undefined,\n weight: typeof r.weight === 'number' ? r.weight : undefined,\n group: typeof r.group === 'string' ? r.group : undefined,\n properties: Object.fromEntries(\n Object.entries(r).filter(([k]) => !reservedKeys.has(k)),\n ),\n };\n\n return { point, errors: [] };\n}\n","import type { Feature, FeatureCollection, Point } from 'geojson';\nimport type { PatientInput, PatientRecord } from '../types/public';\nimport { validatePatientPoint } from '../utils/validation';\n\nexport interface NormalizeResult {\n features: FeatureCollection<Point>['features'];\n warnings: Array<{ code: string; message: string; details?: unknown }>;\n}\n\ninterface NormalizeOptions {\n strict?: boolean;\n}\n\nfunction isGeoJsonFeatureCollection(data: unknown): data is FeatureCollection<Point> {\n return (\n typeof data === 'object' &&\n data !== null &&\n (data as { type?: unknown }).type === 'FeatureCollection' &&\n Array.isArray((data as { features?: unknown }).features)\n );\n}\n\nfunction isGeoJsonFeature(data: unknown): data is Feature<Point> {\n return (\n typeof data === 'object' &&\n data !== null &&\n (data as { type?: unknown }).type === 'Feature'\n );\n}\n\n/**\n * Normalize any supported PatientInput form into a list of GeoJSON Point features\n * suitable for passing directly to a MapLibre GeoJSON source.\n *\n * Invalid records are skipped and surfaced as warnings.\n * Records outside UK bounds are surfaced as warnings but still skipped to\n * avoid misleading the map.\n */\nexport function normalizePatientInput(\n data: PatientInput,\n options?: NormalizeOptions,\n): NormalizeResult {\n const features: FeatureCollection<Point>['features'] = [];\n const warnings: NormalizeResult['warnings'] = [];\n const strict = options?.strict === true;\n\n let records: PatientRecord[];\n\n if (isGeoJsonFeatureCollection(data)) {\n // Extract coordinates + properties from each feature\n records = data.features.map((f) => ({\n lat: f.geometry.coordinates[1],\n lon: f.geometry.coordinates[0],\n ...f.properties,\n }));\n } else if (Array.isArray(data)) {\n // Could be Feature[] or PatientRecord[]\n records = data.map((item) =>\n isGeoJsonFeature(item)\n ? { lat: item.geometry.coordinates[1], lon: item.geometry.coordinates[0], ...item.properties }\n : (item as PatientRecord),\n );\n } else {\n if (strict) {\n throw new Error('[rcpch-imd-map] PatientInput must be an array or GeoJSON FeatureCollection.');\n }\n warnings.push({ code: 'INVALID_INPUT', message: 'PatientInput must be an array or GeoJSON FeatureCollection.' });\n return { features, warnings };\n }\n\n for (let i = 0; i < records.length; i++) {\n const { point, errors } = validatePatientPoint(records[i]);\n\n if (!point) {\n if (strict) {\n throw new Error(\n `[rcpch-imd-map] Patient record at index ${i} is invalid: ${errors.join('; ')}`,\n );\n }\n warnings.push({\n code: 'INVALID_PATIENT_POINT',\n message: `Patient record at index ${i} is invalid and will be skipped: ${errors.join('; ')}`,\n details: { index: i, errors },\n });\n continue;\n }\n\n // Non-fatal warnings (e.g., outside UK bounds already handled in validatePatientPoint)\n for (const err of errors) {\n warnings.push({ code: 'PATIENT_POINT_WARNING', message: err, details: { index: i } });\n }\n\n features.push({\n type: 'Feature',\n geometry: { type: 'Point', coordinates: [point.lon, point.lat] },\n properties: {\n id: point.id ?? `patient-${i}`,\n weight: point.weight ?? 1,\n group: point.group ?? null,\n ...point.properties,\n },\n });\n }\n\n return { features, warnings };\n}\n","import type { Feature, Point } from 'geojson';\nimport type { LeadCentreInput } from '../types/public';\nimport { validateLatLon } from '../utils/validation';\n\n/**\n * Normalize any supported LeadCentreInput form into a single GeoJSON Point feature.\n * Returns null if the input cannot be resolved to valid coordinates.\n */\nexport function normalizeLeadCentreInput(\n data: LeadCentreInput,\n): Feature<Point> | null {\n if (!data || typeof data !== 'object') return null;\n\n let lat: number;\n let lon: number;\n let label = 'Lead centre';\n\n // Accept a GeoJSON point feature\n if (data.type === 'Feature' && data.geometry?.type === 'Point') {\n [lon, lat] = data.geometry.coordinates;\n label = (data.properties?.label as string) ?? label;\n } else {\n const d = data as Record<string, unknown>;\n lat = (d.lat ?? d.latitude) as number;\n lon = (d.lon ?? d.lng ?? d.longitude) as number;\n label = (d.label as string) ?? label;\n }\n\n const { valid } = validateLatLon(lat, lon);\n if (!valid) return null;\n\n return {\n type: 'Feature',\n geometry: { type: 'Point', coordinates: [lon, lat] },\n properties: { label },\n };\n}\n","import { VectorTileSource } from 'maplibre-gl';\nimport type { Map as MaplibreMap } from 'maplibre-gl';\nimport type { MapStyleOptions } from '../types/public';\nimport { buildTileUrl } from '../core/resolver';\n\nexport const LOCAL_AUTHORITY_SOURCE_ID = 'rcpch-imd-la-overlay';\nexport const LOCAL_AUTHORITY_LAYER_ID = 'rcpch-imd-la-overlay-line';\n\nconst LOCAL_AUTHORITY_FULL_TABLE_NAME = 'public.la_tiles';\nconst LOCAL_AUTHORITY_SOURCE_LAYER = 'public.la_tiles';\n\nexport function addOrUpdateLocalAuthorityOverlay(\n\tmap: MaplibreMap,\n\ttilesBaseUrl: string,\n\tstyle: Required<MapStyleOptions>,\n): void {\n\tconst tileUrl = buildTileUrl(tilesBaseUrl, LOCAL_AUTHORITY_FULL_TABLE_NAME);\n\tconst existing = map.getSource(LOCAL_AUTHORITY_SOURCE_ID);\n\n\tif (existing instanceof VectorTileSource) {\n\t\texisting.setTiles([tileUrl]);\n\t} else {\n\t\tif (existing) map.removeSource(LOCAL_AUTHORITY_SOURCE_ID);\n\t\tmap.addSource(LOCAL_AUTHORITY_SOURCE_ID, {\n\t\t\ttype: 'vector',\n\t\t\ttiles: [tileUrl],\n\t\t\tminzoom: 0,\n\t\t\tmaxzoom: 14,\n\t\t});\n\t}\n\n\tif (map.getLayer(LOCAL_AUTHORITY_LAYER_ID)) {\n\t\tmap.setPaintProperty(\n\t\t\tLOCAL_AUTHORITY_LAYER_ID,\n\t\t\t'line-color',\n\t\t\tstyle.boundaries.localAuthorityColor ?? '#0d0d58',\n\t\t);\n\t\tmap.setPaintProperty(\n\t\t\tLOCAL_AUTHORITY_LAYER_ID,\n\t\t\t'line-width',\n\t\t\tstyle.boundaries.localAuthorityWidth ?? 1,\n\t\t);\n\t\tmap.setLayoutProperty(LOCAL_AUTHORITY_LAYER_ID, 'visibility', 'visible');\n\t\treturn;\n\t}\n\n\tmap.addLayer({\n\t\tid: LOCAL_AUTHORITY_LAYER_ID,\n\t\ttype: 'line',\n\t\tsource: LOCAL_AUTHORITY_SOURCE_ID,\n\t\t'source-layer': LOCAL_AUTHORITY_SOURCE_LAYER,\n\t\tpaint: {\n\t\t\t'line-color': style.boundaries.localAuthorityColor ?? '#0d0d58',\n\t\t\t'line-width': style.boundaries.localAuthorityWidth ?? 1,\n\t\t},\n\t\tlayout: {\n\t\t\tvisibility: 'visible',\n\t\t},\n\t});\n}\n\nexport function hideLocalAuthorityOverlay(map: MaplibreMap): void {\n\tif (map.getLayer(LOCAL_AUTHORITY_LAYER_ID)) {\n\t\tmap.setLayoutProperty(LOCAL_AUTHORITY_LAYER_ID, 'visibility', 'none');\n\t}\n}\n","import { VectorTileSource } from 'maplibre-gl';\nimport type { Map as MaplibreMap } from 'maplibre-gl';\nimport type { MapStyleOptions } from '../types/public';\nimport { buildTileUrl } from '../core/resolver';\n\nexport const NHSER_SOURCE_ID = 'rcpch-imd-nhser-overlay';\nexport const NHSER_LAYER_ID = 'rcpch-imd-nhser-overlay-line';\nexport const ICB_SOURCE_ID = 'rcpch-imd-icb-overlay';\nexport const ICB_LAYER_ID = 'rcpch-imd-icb-overlay-line';\nexport const LHB_SOURCE_ID = 'rcpch-imd-lhb-overlay';\nexport const LHB_LAYER_ID = 'rcpch-imd-lhb-overlay-line';\n\nconst NHSER_FULL_TABLE_NAME = 'public.nhser_tiles_2021';\nconst NHSER_SOURCE_LAYER = 'public.nhser_tiles_2021';\nconst ICB_FULL_TABLE_NAME = 'public.icb_tiles_2023';\nconst ICB_SOURCE_LAYER = 'public.icb_tiles_2023';\nconst LHB_FULL_TABLE_NAME = 'public.lhb_tiles_2022';\nconst LHB_SOURCE_LAYER = 'public.lhb_tiles_2022';\n\nfunction addOrUpdateBoundaryOverlay(\n\tmap: MaplibreMap,\n\ttilesBaseUrl: string,\n\tinput: {\n\t\tsourceId: string;\n\t\tlayerId: string;\n\t\tfullTableName: string;\n\t\tsourceLayer: string;\n\t\tlineColor: string;\n\t\tlineWidth: number;\n\t},\n): void {\n\tconst tileUrl = buildTileUrl(tilesBaseUrl, input.fullTableName);\n\tconst existing = map.getSource(input.sourceId);\n\n\tif (existing instanceof VectorTileSource) {\n\t\texisting.setTiles([tileUrl]);\n\t} else {\n\t\tif (existing) map.removeSource(input.sourceId);\n\t\tmap.addSource(input.sourceId, {\n\t\t\ttype: 'vector',\n\t\t\ttiles: [tileUrl],\n\t\t\tminzoom: 0,\n\t\t\tmaxzoom: 14,\n\t\t});\n\t}\n\n\tif (map.getLayer(input.layerId)) {\n\t\tmap.setPaintProperty(input.layerId, 'line-color', input.lineColor);\n\t\tmap.setPaintProperty(input.layerId, 'line-width', input.lineWidth);\n\t\tmap.setLayoutProperty(input.layerId, 'visibility', 'visible');\n\t\treturn;\n\t}\n\n\tmap.addLayer({\n\t\tid: input.layerId,\n\t\ttype: 'line',\n\t\tsource: input.sourceId,\n\t\t'source-layer': input.sourceLayer,\n\t\tpaint: {\n\t\t\t'line-color': input.lineColor,\n\t\t\t'line-width': input.lineWidth,\n\t\t},\n\t\tlayout: {\n\t\t\tvisibility: 'visible',\n\t\t},\n\t});\n}\n\nexport function addOrUpdateNhserOverlay(\n\tmap: MaplibreMap,\n\ttilesBaseUrl: string,\n\tstyle: Required<MapStyleOptions>,\n): void {\n\taddOrUpdateBoundaryOverlay(map, tilesBaseUrl, {\n\t\tsourceId: NHSER_SOURCE_ID,\n\t\tlayerId: NHSER_LAYER_ID,\n\t\tfullTableName: NHSER_FULL_TABLE_NAME,\n\t\tsourceLayer: NHSER_SOURCE_LAYER,\n\t\tlineColor: style.boundaries.nhserColor ?? '#e00087',\n\t\tlineWidth: style.boundaries.nhserWidth ?? 1.5,\n\t});\n}\n\nexport function addOrUpdateIcbOverlay(\n\tmap: MaplibreMap,\n\ttilesBaseUrl: string,\n\tstyle: Required<MapStyleOptions>,\n): void {\n\taddOrUpdateBoundaryOverlay(map, tilesBaseUrl, {\n\t\tsourceId: ICB_SOURCE_ID,\n\t\tlayerId: ICB_LAYER_ID,\n\t\tfullTableName: ICB_FULL_TABLE_NAME,\n\t\tsourceLayer: ICB_SOURCE_LAYER,\n\t\tlineColor: style.boundaries.icbColor ?? '#57c7f2',\n\t\tlineWidth: style.boundaries.icbWidth ?? 1,\n\t});\n}\n\nexport function addOrUpdateLhbOverlay(\n\tmap: MaplibreMap,\n\ttilesBaseUrl: string,\n\tstyle: Required<MapStyleOptions>,\n): void {\n\taddOrUpdateBoundaryOverlay(map, tilesBaseUrl, {\n\t\tsourceId: LHB_SOURCE_ID,\n\t\tlayerId: LHB_LAYER_ID,\n\t\tfullTableName: LHB_FULL_TABLE_NAME,\n\t\tsourceLayer: LHB_SOURCE_LAYER,\n\t\tlineColor: style.boundaries.lhbColor ?? '#57c7f2',\n\t\tlineWidth: style.boundaries.lhbWidth ?? 1,\n\t});\n}\n\nfunction hideOverlay(map: MaplibreMap, layerId: string): void {\n\tif (map.getLayer(layerId)) {\n\t\tmap.setLayoutProperty(layerId, 'visibility', 'none');\n\t}\n}\n\nexport function hideNhserOverlay(map: MaplibreMap): void {\n\thideOverlay(map, NHSER_LAYER_ID);\n}\n\nexport function hideIcbOverlay(map: MaplibreMap): void {\n\thideOverlay(map, ICB_LAYER_ID);\n}\n\nexport function hideLhbOverlay(map: MaplibreMap): void {\n\thideOverlay(map, LHB_LAYER_ID);\n}\n","import type { ImdMapState, LegendPosition, MapStyleOptions } from '../types/public';\nimport { getDecileColors } from './styles';\n\ntype OverlayKey = keyof ImdMapState['overlays'];\n\ninterface LegendRow {\n key: OverlayKey;\n label: string;\n isVisible: boolean;\n isEnabled: boolean;\n isActive: boolean;\n disabledNote?: string;\n}\n\ninterface LegendVisibilityConfig {\n localAuthority: boolean;\n nhser: boolean;\n icb: boolean;\n lhb: boolean;\n}\n\ninterface CreateLegendInput {\n container: HTMLElement;\n position: LegendPosition;\n title: string;\n collapsed: boolean;\n style: Required<MapStyleOptions>;\n state: ImdMapState;\n visibility: LegendVisibilityConfig;\n onToggle: (key: OverlayKey, nextValue: boolean) => void;\n}\n\nexport interface LegendController {\n update: (state: ImdMapState, style: Required<MapStyleOptions>) => void;\n destroy: () => void;\n}\n\nexport function getLegendRows(\n state: ImdMapState,\n visibility: LegendVisibilityConfig,\n): LegendRow[] {\n const nation = state.nation;\n const isNhserEligible = nation === 'all' || nation === 'england';\n const isIcbEligible = nation === 'all' || nation === 'england';\n const isLhbEligible = nation === 'all' || nation === 'wales';\n\n const rows: LegendRow[] = [\n {\n key: 'nhser',\n label: 'NHS England regions',\n isVisible: visibility.nhser,\n isEnabled: isNhserEligible,\n isActive: state.overlays.nhser,\n disabledNote: 'England only',\n },\n {\n key: 'icb',\n label: 'ICBs',\n isVisible: visibility.icb,\n isEnabled: isIcbEligible,\n isActive: state.overlays.icb,\n disabledNote: 'England only',\n },\n {\n key: 'localAuthority',\n label: 'Local authorities',\n isVisible: visibility.localAuthority,\n isEnabled: true,\n isActive: state.overlays.localAuthority,\n },\n {\n key: 'lhb',\n label: 'Local health boards',\n isVisible: visibility.lhb,\n isEnabled: isLhbEligible,\n isActive: state.overlays.lhb,\n disabledNote: 'Wales only',\n },\n ];\n\n return rows.filter((row) => row.isVisible);\n}\n\nfunction applyLegendPosition(el: HTMLDivElement, position: LegendPosition): void {\n el.style.top = '';\n el.style.right = '';\n el.style.bottom = '';\n el.style.left = '';\n\n switch (position) {\n case 'top-left':\n el.style.top = '12px';\n el.style.left = '12px';\n break;\n case 'bottom-left':\n el.style.bottom = '12px';\n el.style.left = '12px';\n break;\n case 'bottom-right':\n el.style.bottom = '12px';\n el.style.right = '12px';\n break;\n case 'top-right':\n default:\n el.style.top = '12px';\n el.style.right = '12px';\n break;\n }\n}\n\nexport function createLegendControl(input: CreateLegendInput): LegendController {\n const containerStyle = window.getComputedStyle(input.container);\n if (containerStyle.position === 'static') {\n input.container.style.position = 'relative';\n }\n\n let currentState = input.state;\n let currentStyle = input.style;\n let collapsed = input.collapsed;\n\n const root = document.createElement('div');\n root.setAttribute('data-rcpch-legend', 'true');\n root.style.position = 'absolute';\n root.style.zIndex = '5';\n root.style.pointerEvents = 'auto';\n applyLegendPosition(root, input.position);\n\n const panel = document.createElement('div');\n const headerBtn = document.createElement('button');\n const headerTitle = document.createElement('span');\n const headerIcon = document.createElement('span');\n const body = document.createElement('div');\n const keySection = document.createElement('div');\n\n headerBtn.type = 'button';\n headerBtn.setAttribute('aria-expanded', String(!collapsed));\n headerTitle.textContent = input.title;\n headerIcon.textContent = collapsed ? '+' : '-';\n\n headerBtn.appendChild(headerTitle);\n headerBtn.appendChild(headerIcon);\n panel.appendChild(headerBtn);\n panel.appendChild(body);\n panel.appendChild(keySection);\n root.appendChild(panel);\n input.container.appendChild(root);\n\n function applyStyle(): void {\n const legend = currentStyle.legend;\n const backgroundColor = legend?.backgroundColor ?? '#ffffff';\n const textColor = legend?.textColor ?? '#0d0d58';\n const borderColor = legend?.borderColor ?? '#d8dde6';\n const borderRadius = legend?.borderRadius ?? 8;\n const fontSize = legend?.fontSize ?? 13;\n const fontFamily = legend?.fontFamily ?? 'system-ui, -apple-system, Segoe UI, Roboto, sans-serif';\n const width = legend?.width ?? 220;\n const boxShadow = legend?.boxShadow ?? '0 6px 18px rgba(0, 0, 0, 0.12)';\n\n panel.style.background = backgroundColor;\n panel.style.color = textColor;\n panel.style.border = `1px solid ${borderColor}`;\n panel.style.borderRadius = `${borderRadius}px`;\n panel.style.width = `${width}px`;\n panel.style.boxShadow = boxShadow;\n panel.style.overflow = 'hidden';\n\n headerBtn.style.width = '100%';\n headerBtn.style.border = '0';\n headerBtn.style.background = 'transparent';\n headerBtn.style.color = textColor;\n headerBtn.style.display = 'flex';\n headerBtn.style.alignItems = 'center';\n headerBtn.style.justifyContent = 'space-between';\n headerBtn.style.padding = '10px 12px';\n headerBtn.style.cursor = 'pointer';\n headerBtn.style.fontWeight = '600';\n headerBtn.style.fontSize = `${fontSize}px`;\n headerBtn.style.fontFamily = fontFamily;\n headerBtn.style.textAlign = 'left';\n\n body.style.padding = '0 12px 10px';\n body.style.display = collapsed ? 'none' : 'block';\n body.style.fontFamily = fontFamily;\n body.style.fontSize = `${fontSize}px`;\n\n keySection.style.padding = '0 12px 10px';\n keySection.style.display = collapsed ? 'none' : 'block';\n keySection.style.fontFamily = fontFamily;\n keySection.style.fontSize = `${Math.max(fontSize - 1, 11)}px`;\n keySection.style.borderTop = `1px solid ${borderColor}`;\n }\n\n function renderRows(): void {\n body.innerHTML = '';\n keySection.innerHTML = '';\n\n const rows = getLegendRows(currentState, input.visibility);\n if (!rows.length) {\n root.style.display = 'none';\n return;\n }\n\n root.style.display = '';\n\n for (const row of rows) {\n const rowBtn = document.createElement('button');\n const dot = document.createElement('span');\n const label = document.createElement('span');\n const textWrap = document.createElement('span');\n\n rowBtn.type = 'button';\n rowBtn.style.width = '100%';\n rowBtn.style.border = '0';\n rowBtn.style.background = 'transparent';\n rowBtn.style.color = currentStyle.legend?.textColor ?? '#0d0d58';\n rowBtn.style.display = 'flex';\n rowBtn.style.alignItems = 'center';\n rowBtn.style.gap = '8px';\n rowBtn.style.padding = '6px 0';\n rowBtn.style.cursor = row.isEnabled ? 'pointer' : 'not-allowed';\n rowBtn.style.textAlign = 'left';\n rowBtn.style.opacity = row.isEnabled ? (row.isActive ? '1' : '0.75') : '0.5';\n\n dot.style.width = '10px';\n dot.style.height = '10px';\n dot.style.borderRadius = '999px';\n dot.style.flex = '0 0 10px';\n dot.style.background = row.isActive\n ? currentStyle.legend?.toggleOnColor ?? '#0d0d58'\n : currentStyle.legend?.toggleOffColor ?? '#6b7280';\n\n textWrap.style.display = 'flex';\n textWrap.style.flexDirection = 'column';\n textWrap.style.gap = '1px';\n\n label.textContent = row.label;\n textWrap.appendChild(label);\n\n if (!row.isEnabled && row.disabledNote) {\n const note = document.createElement('span');\n note.textContent = row.disabledNote;\n note.style.fontSize = '11px';\n note.style.opacity = '0.9';\n textWrap.appendChild(note);\n }\n\n rowBtn.setAttribute('aria-pressed', String(row.isActive));\n rowBtn.setAttribute('aria-disabled', String(!row.isEnabled));\n rowBtn.disabled = !row.isEnabled;\n rowBtn.setAttribute(\n 'title',\n !row.isEnabled && row.disabledNote\n ? `${row.label} (${row.disabledNote})`\n : (row.isActive ? `Hide ${row.label}` : `Show ${row.label}`),\n );\n\n rowBtn.addEventListener('click', () => {\n if (!row.isEnabled) return;\n input.onToggle(row.key, !row.isActive);\n });\n\n rowBtn.appendChild(dot);\n rowBtn.appendChild(textWrap);\n body.appendChild(rowBtn);\n }\n\n renderKeySection(rows);\n }\n\n function renderKeySection(rows: LegendRow[]): void {\n const keyTitle = document.createElement('div');\n keyTitle.textContent = 'Key';\n keyTitle.style.paddingTop = '8px';\n keyTitle.style.paddingBottom = '6px';\n keyTitle.style.fontWeight = '600';\n keySection.appendChild(keyTitle);\n\n for (const row of rows) {\n const line = document.createElement('div');\n const swatch = document.createElement('span');\n const label = document.createElement('span');\n\n line.style.display = 'flex';\n line.style.alignItems = 'center';\n line.style.gap = '8px';\n line.style.padding = '2px 0';\n\n swatch.style.display = 'inline-block';\n swatch.style.width = '18px';\n swatch.style.height = '0';\n swatch.style.borderTopWidth = `${Math.max(\n resolveBoundaryWidth(row.key, currentStyle),\n 2,\n )}px`;\n swatch.style.borderTopStyle = 'solid';\n swatch.style.borderTopColor = resolveBoundaryColor(row.key, currentStyle);\n\n label.textContent = row.label;\n line.appendChild(swatch);\n line.appendChild(label);\n keySection.appendChild(line);\n }\n\n const scale = document.createElement('div');\n scale.style.paddingTop = '8px';\n\n const scaleLabel = document.createElement('div');\n scaleLabel.textContent = 'IMD decile (1 most deprived, 10 least deprived)';\n scaleLabel.style.paddingBottom = '4px';\n keySection.appendChild(scaleLabel);\n\n const ramp = document.createElement('div');\n ramp.style.display = 'grid';\n ramp.style.gridTemplateColumns = 'repeat(10, minmax(0, 1fr))';\n ramp.style.gap = '2px';\n\n const colors = getDecileColors(currentState.nation, currentStyle);\n for (let i = 0; i < 10; i++) {\n const chip = document.createElement('span');\n chip.style.height = '8px';\n chip.style.background = colors[i] ?? colors[0] ?? '#cccccc';\n chip.style.display = 'inline-block';\n chip.title = `Decile ${i + 1}`;\n ramp.appendChild(chip);\n }\n\n const scaleTicks = document.createElement('div');\n scaleTicks.style.display = 'flex';\n scaleTicks.style.justifyContent = 'space-between';\n scaleTicks.style.paddingTop = '2px';\n scaleTicks.textContent = '1';\n\n const rightTick = document.createElement('span');\n rightTick.textContent = '10';\n scaleTicks.appendChild(rightTick);\n\n scale.appendChild(ramp);\n scale.appendChild(scaleTicks);\n keySection.appendChild(scale);\n }\n\n function resolveBoundaryColor(\n key: OverlayKey,\n style: Required<MapStyleOptions>,\n ): string {\n if (key === 'localAuthority') return style.boundaries.localAuthorityColor ?? '#0d0d58';\n if (key === 'nhser') return style.boundaries.nhserColor ?? '#e00087';\n if (key === 'icb') return style.boundaries.icbColor ?? '#57c7f2';\n return style.boundaries.lhbColor ?? '#57c7f2';\n }\n\n function resolveBoundaryWidth(\n key: OverlayKey,\n style: Required<MapStyleOptions>,\n ): number {\n if (key === 'localAuthority') return style.boundaries.localAuthorityWidth ?? 1;\n if (key === 'nhser') return style.boundaries.nhserWidth ?? 1.5;\n if (key === 'icb') return style.boundaries.icbWidth ?? 1;\n return style.boundaries.lhbWidth ?? 1;\n }\n\n headerBtn.addEventListener('click', () => {\n collapsed = !collapsed;\n headerBtn.setAttribute('aria-expanded', String(!collapsed));\n headerIcon.textContent = collapsed ? '+' : '-';\n body.style.display = collapsed ? 'none' : 'block';\n keySection.style.display = collapsed ? 'none' : 'block';\n });\n\n applyStyle();\n renderRows();\n\n return {\n update(nextState, nextStyle) {\n currentState = nextState;\n currentStyle = nextStyle;\n applyStyle();\n renderRows();\n },\n destroy() {\n root.remove();\n },\n };\n}\n","// Internal logger — never logs raw patient data by default.\n// Patient-level properties are intentionally excluded from all log output.\n\nlet _debugMode = false;\n\nexport function setDebugMode(enabled: boolean): void {\n _debugMode = enabled;\n}\n\nexport const logger = {\n debug(message: string, ...args: unknown[]): void {\n if (_debugMode) {\n // eslint-disable-next-line no-console\n console.debug(`[rcpch-imd-map] ${message}`, ...args);\n }\n },\n info(message: string, ...args: unknown[]): void {\n // eslint-disable-next-line no-console\n console.info(`[rcpch-imd-map] ${message}`, ...args);\n },\n warn(message: string, ...args: unknown[]): void {\n // eslint-disable-next-line no-console\n console.warn(`[rcpch-imd-map] ${message}`, ...args);\n },\n error(message: string, ...args: unknown[]): void {\n // eslint-disable-next-line no-console\n console.error(`[rcpch-imd-map] ${message}`, ...args);\n },\n};\n","import { Map as MaplibreMap, Popup, AttributionControl } from 'maplibre-gl';\nimport type { Feature, Point } from 'geojson';\nimport type {\n CreateImdMapOptions,\n ImdMapInstance,\n Nation,\n Era,\n MapStyleOptions,\n PatientInput,\n PatientLayerOptions,\n LeadCentreInput,\n LeadCentreOptions,\n} from '../types/public';\nimport { createInitialState } from './state';\nimport { resolveEffectiveEra, willEraBeOverridden } from './resolver';\nimport {\n addOrUpdateChoroplethSources,\n addOrUpdatePatientsSource,\n addOrUpdateLeadCentreSource,\n PATIENTS_SOURCE_ID,\n LEAD_CENTRE_SOURCE_ID,\n} from '../map/sources';\nimport {\n addChoroplethLayers,\n removeChoroplethLayers,\n updateChoroplethStyle,\n updateChoroplethNationFilter,\n addOrUpdatePatientsLayer,\n removePatientsLayer,\n addOrUpdateLeadCentreLayer,\n removeLeadCentreLayer,\n} from '../map/layers';\nimport {\n attachChoroplethInteraction,\n attachPatientInteraction,\n attachLeadCentreInteraction,\n} from '../map/popups';\nimport { normalizePatientInput } from '../adapters/patientInput';\nimport { normalizeLeadCentreInput } from '../overlays/leadCentre';\nimport {\n addOrUpdateLocalAuthorityOverlay,\n hideLocalAuthorityOverlay,\n} from '../overlays/localAuthority';\nimport {\n addOrUpdateNhserOverlay,\n addOrUpdateIcbOverlay,\n addOrUpdateLhbOverlay,\n hideNhserOverlay,\n hideIcbOverlay,\n hideLhbOverlay,\n} from '../overlays/healthBoundaries';\nimport { createLegendControl, type LegendController } from '../map/legend';\nimport { mergeStyle, DEFAULT_STYLE } from '../map/styles';\nimport { logger } from '../utils/logging';\n\n// Default center and zoom for a UK-wide view\nconst UK_CENTER: [number, number] = [-2.5, 54.0];\nconst UK_ZOOM = 5;\n\nexport function createImdMap(options: CreateImdMapOptions): ImdMapInstance {\n // ── Resolve container ───────────────────────────────────────────────────────\n const containerEl =\n typeof options.container === 'string'\n ? document.getElementById(options.container)\n : options.container;\n\n if (!containerEl) {\n throw new Error(\n `[rcpch-imd-map] Container not found: \"${String(options.container)}\". Ensure the element exists in the DOM before calling createImdMap.`,\n );\n }\n\n const tilesBaseUrl = options.tilesBaseUrl ?? '';\n if (!tilesBaseUrl) {\n logger.warn('No tilesBaseUrl provided. Choropleth tiles will not load.');\n }\n\n // ── Resolve style and initial state ────────────────────────────────────────\n let resolvedStyle = mergeStyle(DEFAULT_STYLE, options.style);\n let state = createInitialState(options.initialNation ?? 'all', options.initialEra ?? '2021');\n\n if (options.enableLocalAuthorityOverlay) {\n state = { ...state, overlays: { ...state.overlays, localAuthority: true } };\n }\n if (options.enableHealthOverlays) {\n state = {\n ...state,\n overlays: {\n ...state.overlays,\n nhser: true,\n icb: true,\n lhb: true,\n },\n };\n }\n\n const showLegend = options.showLegend ?? true;\n const legendPosition = options.legendPosition ?? 'top-right';\n const legendCollapsed = options.legendCollapsed ?? false;\n const legendTitle = options.legendTitle ?? 'Map layers';\n const legendVisibility = {\n localAuthority: options.showLegendLocalAuthority ?? true,\n nhser: options.showLegendNhser ?? true,\n icb: options.showLegendIcb ?? true,\n lhb: options.showLegendLhb ?? true,\n };\n\n // Emit warning if the requested era will be silently overridden\n if (\n options.initialNation &&\n options.initialEra &&\n willEraBeOverridden(options.initialNation, options.initialEra)\n ) {\n const warning = {\n code: 'ERA_OVERRIDE',\n message: `Era '${options.initialEra}' is not supported for nation '${options.initialNation}'. Effective era will be '${state.effectiveEra}'.`,\n };\n logger.warn(warning.message);\n options.onWarning?.(warning);\n }\n\n // ── Create MapLibre map ─────────────────────────────────────────────────────\n const map = new MaplibreMap({\n container: containerEl,\n style:\n options.mapStyleUrl ??\n 'https://basemaps.cartocdn.com/gl/positron-gl-style/style.json',\n center: options.center ?? UK_CENTER,\n zoom: options.zoom ?? UK_ZOOM,\n attributionControl: false,\n });\n\n map.addControl(new AttributionControl({ compact: true }));\n\n const popup = new Popup({ closeButton: false, closeOnClick: false });\n\n // ── Queued data (set before map finishes loading) ───────────────────────────\n let mapLoaded = false;\n let pendingPatientFeatures: Feature<Point>[] | null = null;\n let pendingLeadCentreFeature: Feature<Point> | null = null;\n let pendingFitToData: { zoom?: number; padding?: number } | null = null;\n let patientInteractionAttached = false;\n let leadCentreInteractionAttached = false;\n\n // ── Stored lead centre coordinate for fitToData() ───────────────────────────\n let storedLeadCentreCoord: [number, number] | null = null;\n let storedPatientCoords: [number, number][] = [];\n\n function getFitCoords(): [number, number][] {\n return [\n ...(storedLeadCentreCoord ? [storedLeadCentreCoord] : []),\n ...storedPatientCoords,\n ];\n }\n\n function applyFitToData(zoom?: number, padding?: number): void {\n const coords = getFitCoords();\n if (!coords.length) {\n logger.warn('No patient or lead centre data to fit to.');\n return;\n }\n\n if (coords.length === 1) {\n const [lon, lat] = coords[0];\n map.flyTo({ center: [lon, lat], zoom: zoom ?? 6 });\n return;\n }\n\n let minLon = coords[0][0];\n let minLat = coords[0][1];\n let maxLon = coords[0][0];\n let maxLat = coords[0][1];\n\n for (const [lon, lat] of coords) {\n if (lon < minLon) minLon = lon;\n if (lat < minLat) minLat = lat;\n if (lon > maxLon) maxLon = lon;\n if (lat > maxLat) maxLat = lat;\n }\n\n map.fitBounds(\n [\n [minLon, minLat],\n [maxLon, maxLat],\n ],\n {\n padding: padding ?? 50,\n maxZoom: zoom,\n },\n );\n }\n\n function applyOverlayVisibility(): void {\n if (!mapLoaded || !tilesBaseUrl) return;\n const nation = state.nation;\n const canShowNhser = nation === 'all' || nation === 'england';\n const canShowIcb = nation === 'all' || nation === 'england';\n const canShowLhb = nation === 'all' || nation === 'wales';\n\n if (state.overlays.localAuthority) {\n addOrUpdateLocalAuthorityOverlay(map, tilesBaseUrl, resolvedStyle);\n } else {\n hideLocalAuthorityOverlay(map);\n }\n\n if (state.overlays.nhser && canShowNhser) {\n addOrUpdateNhserOverlay(map, tilesBaseUrl, resolvedStyle);\n } else {\n hideNhserOverlay(map);\n }\n\n if (state.overlays.icb && canShowIcb) {\n addOrUpdateIcbOverlay(map, tilesBaseUrl, resolvedStyle);\n } else {\n hideIcbOverlay(map);\n }\n\n if (state.overlays.lhb && canShowLhb) {\n addOrUpdateLhbOverlay(map, tilesBaseUrl, resolvedStyle);\n } else {\n hideLhbOverlay(map);\n }\n }\n\n function setOverlayVisibilityState(input: {\n localAuthority?: boolean;\n nhser?: boolean;\n icb?: boolean;\n lhb?: boolean;\n }): void {\n state = { ...state, overlays: { ...state.overlays, ...input } };\n applyOverlayVisibility();\n legendController?.update(state, resolvedStyle);\n }\n\n let legendController: LegendController | null = null;\n if (showLegend) {\n legendController = createLegendControl({\n container: containerEl,\n position: legendPosition,\n title: legendTitle,\n collapsed: legendCollapsed,\n style: resolvedStyle,\n state,\n visibility: legendVisibility,\n onToggle: (key, nextValue) => {\n if (key === 'localAuthority') {\n setOverlayVisibilityState({ localAuthority: nextValue });\n } else if (key === 'nhser') {\n setOverlayVisibilityState({ nhser: nextValue });\n } else if (key === 'icb') {\n setOverlayVisibilityState({ icb: nextValue });\n } else if (key === 'lhb') {\n setOverlayVisibilityState({ lhb: nextValue });\n }\n },\n });\n }\n\n logger.debug(`tilesBaseUrl resolved to: \"${tilesBaseUrl}\"`);\n\n // ── Map load handler ────────────────────────────────────────────────────────\n map.on('load', () => {\n mapLoaded = true;\n\n if (tilesBaseUrl) {\n addOrUpdateChoroplethSources(map, tilesBaseUrl, state.effectiveEra);\n addChoroplethLayers(map, state.nation, state.effectiveEra, resolvedStyle);\n }\n\n applyOverlayVisibility();\n\n attachChoroplethInteraction(map, popup, resolvedStyle, options);\n\n if (pendingPatientFeatures) {\n storedPatientCoords = pendingPatientFeatures\n .map((f) => f.geometry.coordinates as [number, number]);\n addOrUpdatePatientsSource(map, pendingPatientFeatures);\n addOrUpdatePatientsLayer(map, resolvedStyle);\n if (!patientInteractionAttached) {\n attachPatientInteraction(map, popup, resolvedStyle);\n patientInteractionAttached = true;\n }\n state = { ...state, hasPatients: true };\n pendingPatientFeatures = null;\n }\n\n if (pendingLeadCentreFeature) {\n storedLeadCentreCoord = pendingLeadCentreFeature.geometry.coordinates as [number, number];\n addOrUpdateLeadCentreSource(map, pendingLeadCentreFeature);\n addOrUpdateLeadCentreLayer(map, resolvedStyle);\n if (!leadCentreInteractionAttached) {\n attachLeadCentreInteraction(map, popup, resolvedStyle);\n leadCentreInteractionAttached = true;\n }\n state = { ...state, hasLeadCentre: true };\n pendingLeadCentreFeature = null;\n }\n\n if (pendingFitToData) {\n const { zoom, padding } = pendingFitToData;\n // Defer camera movement until after first idle to avoid interrupting layer rendering.\n map.once('idle', () => {\n applyFitToData(zoom, padding);\n });\n pendingFitToData = null;\n }\n });\n\n // ── Internal helpers ────────────────────────────────────────────────────────\n\n function applyViewChange(newNation: Nation, newEra: Era): void {\n const newEffectiveEra = resolveEffectiveEra(newNation, newEra);\n\n if (willEraBeOverridden(newNation, newEra)) {\n const warning = {\n code: 'ERA_OVERRIDE',\n message: `Era '${newEra}' overridden to '${newEffectiveEra}' for nation '${newNation}'.`,\n };\n logger.warn(warning.message);\n options.onWarning?.(warning);\n }\n\n const eraChanged = newEffectiveEra !== state.effectiveEra;\n const nationChanged = newNation !== state.nation;\n\n state = { ...state, nation: newNation, era: newEra, effectiveEra: newEffectiveEra };\n\n if (mapLoaded && tilesBaseUrl) {\n if (eraChanged) {\n // Era change: sources must serve new table family; rebuild layers.\n removeChoroplethLayers(map);\n addOrUpdateChoroplethSources(map, tilesBaseUrl, newEffectiveEra);\n addChoroplethLayers(map, newNation, newEffectiveEra, resolvedStyle);\n } else if (nationChanged) {\n // Nation change only: sources stay the same, just update filter expressions.\n updateChoroplethNationFilter(map, newNation, newEffectiveEra);\n }\n }\n\n options.onViewChange?.({ nation: newNation, era: newEra, effectiveEra: newEffectiveEra });\n }\n\n // ── Public API ──────────────────────────────────────────────────────────────\n\n const instance: ImdMapInstance = {\n setView({ nation, era } = {}) {\n applyViewChange(nation ?? state.nation, era ?? state.era);\n },\n\n setNation(nation) {\n applyViewChange(nation, state.era);\n },\n\n setEra(era) {\n applyViewChange(state.nation, era);\n },\n\n setStyle(newStyle: MapStyleOptions) {\n resolvedStyle = mergeStyle(DEFAULT_STYLE, newStyle);\n if (mapLoaded) {\n updateChoroplethStyle(map, state.nation, resolvedStyle);\n applyOverlayVisibility();\n if (state.hasPatients) {\n addOrUpdatePatientsLayer(map, resolvedStyle);\n }\n if (state.hasLeadCentre) {\n addOrUpdateLeadCentreLayer(map, resolvedStyle);\n }\n legendController?.update(state, resolvedStyle);\n }\n },\n\n setOverlayVisibility(input) {\n setOverlayVisibilityState(input);\n },\n\n setPatients(data: PatientInput, patientOptions?: PatientLayerOptions) {\n const { features, warnings } = normalizePatientInput(data, {\n strict: patientOptions?.strict,\n });\n\n storedPatientCoords = features.map(\n (f) => f.geometry.coordinates as [number, number],\n );\n\n for (const w of warnings) {\n logger.warn(w.message);\n options.onWarning?.(w);\n }\n\n if (!mapLoaded) {\n pendingPatientFeatures = features;\n return;\n }\n\n addOrUpdatePatientsSource(map, features);\n addOrUpdatePatientsLayer(map, resolvedStyle);\n if (!patientInteractionAttached) {\n attachPatientInteraction(map, popup, resolvedStyle);\n patientInteractionAttached = true;\n }\n state = { ...state, hasPatients: true };\n },\n\n clearPatients() {\n pendingPatientFeatures = null;\n storedPatientCoords = [];\n if (!mapLoaded) return;\n removePatientsLayer(map);\n if (map.getSource(PATIENTS_SOURCE_ID)) map.removeSource(PATIENTS_SOURCE_ID);\n state = { ...state, hasPatients: false };\n },\n\n setLeadCentre(data: LeadCentreInput, _options?: LeadCentreOptions) {\n const feature = normalizeLeadCentreInput(data);\n if (!feature) {\n const warning = { code: 'INVALID_LEAD_CENTRE', message: 'Lead centre data could not be resolved to valid coordinates.' };\n logger.warn(warning.message);\n options.onWarning?.(warning);\n return;\n }\n\n if (!mapLoaded) {\n pendingLeadCentreFeature = feature;\n return;\n }\n\n storedLeadCentreCoord = feature.geometry.coordinates as [number, number];\n addOrUpdateLeadCentreSource(map, feature);\n addOrUpdateLeadCentreLayer(map, resolvedStyle);\n if (!leadCentreInteractionAttached) {\n attachLeadCentreInteraction(map, popup, resolvedStyle);\n leadCentreInteractionAttached = true;\n }\n state = { ...state, hasLeadCentre: true };\n },\n\n clearLeadCentre() {\n pendingLeadCentreFeature = null;\n storedLeadCentreCoord = null;\n if (!mapLoaded) return;\n removeLeadCentreLayer(map);\n if (map.getSource(LEAD_CENTRE_SOURCE_ID)) map.removeSource(LEAD_CENTRE_SOURCE_ID);\n state = { ...state, hasLeadCentre: false };\n },\n\n getState() {\n return { ...state };\n },\n\n resize() {\n map.resize();\n },\n\n fitToData(fitOptions?: { zoom?: number; padding?: number }) {\n const zoom = fitOptions?.zoom;\n const padding = fitOptions?.padding;\n\n if (!mapLoaded) {\n pendingFitToData = { zoom, padding };\n return;\n }\n\n applyFitToData(zoom, padding);\n },\n\n destroy() {\n popup.remove();\n legendController?.destroy();\n map.remove();\n },\n };\n\n return instance;\n}\n"]}
|