Refactor and other improvements

This commit is contained in:
Andras Schmelczer 2026-02-08 18:25:58 +00:00
parent 04a78e7bfe
commit 6c90cf3c0f
47 changed files with 2705 additions and 1568 deletions

View file

@ -71,7 +71,7 @@ export function getMapStyle(theme: 'light' | 'dark'): StyleSpecification {
} as StyleSpecification;
}
type GradientStop = { t: number; color: [number, number, number] };
export type GradientStop = { t: number; color: [number, number, number] };
// Oklab color space for perceptually uniform interpolation
function srgbToLinear(c: number): number {
@ -200,3 +200,47 @@ export function emojiToTwemojiUrl(emoji: string): string {
const hex = codePoint.toString(16);
return `${TWEMOJI_BASE}${hex}.png`;
}
/**
* Shared fill-color logic for hex and postcode layers.
* When a viewFeature is active, normalizes by colorRange and applies the feature gradient.
* Otherwise falls back to density-based coloring using countRange.
*/
export function getFeatureFillColor(
value: number | null | undefined,
minVal: number | undefined,
maxVal: number | undefined,
colorRange: [number, number] | null,
filterRange: [number, number] | null,
countNormalized: number,
densityGradient: GradientStop[],
isDark: boolean,
alpha: number
): [number, number, number, number] {
if (colorRange) {
if (value == null)
return (isDark ? [80, 70, 65, 80] : [128, 128, 128, 80]) as [number, number, number, number];
if (filterRange) {
if ((maxVal as number) < filterRange[0] || (minVal as number) > filterRange[1]) {
return (isDark ? [60, 55, 50, 60] : [180, 180, 180, 60]) as [
number,
number,
number,
number,
];
}
}
const range = colorRange[1] - colorRange[0];
if (range === 0)
return [...FEATURE_GRADIENT[0].color, alpha] as [number, number, number, number];
const t = ((value as number) - colorRange[0]) / range;
const rgb = normalizedToColor(Math.max(0, Math.min(1, t)));
return [...rgb, alpha] as [number, number, number, number];
}
return [...countToColor(Math.max(0, Math.min(1, countNormalized)), densityGradient), alpha] as [
number,
number,
number,
number,
];
}