The WAS gap made visible: a worked-states set joins the cluster status cache (distinct states over the three US entities), the status entries carry a NewState flag wherever the state resolves (log county first, ULS licence second), and the decode panel gains the badge in its status column plus the filter chip alongside NEW/BAND/MODE/GRID. Colour from the shared marker palette, so the cluster can adopt it later without a second hue.
47 lines
2.5 KiB
TypeScript
47 lines
2.5 KiB
TypeScript
// The "extra" spot markers — the ones ORTHOGONAL to the entity status.
|
|
//
|
|
// A spot's entity status (new DXCC / new band / new slot / worked) answers one
|
|
// question. These answer others that can be true at the same time: the park is
|
|
// new even if the entity is worked, the county is new even if the band is not.
|
|
// Both the DX-cluster list and the band map show them, and they have to agree —
|
|
// the same fact must not be green in one panel and violet in the next, so the
|
|
// colours live HERE and nowhere else. This is also the table a per-marker colour
|
|
// setting will drive, which is why it is a table rather than three constants.
|
|
//
|
|
// Colour choices:
|
|
// POTA green — parks; the association is worth keeping
|
|
// county violet — a chart hue, because every semantic token was already
|
|
// spoken for: red, orange and yellow are the entity
|
|
// statuses, blue is "callsign worked", green is POTA
|
|
// worked blue — matches the WKD-CALL badge the cluster list has always used
|
|
// prefix yellow — unchanged
|
|
// grid magenta — the last hue in the categorical set that is not already
|
|
// spoken for here and does not read as a status; a grid is
|
|
// never urgent the way a new entity is
|
|
export type SpotMarkerKey = 'new_pota' | 'new_county' | 'new_pfx' | 'worked_call' | 'new_grid' | 'new_state';
|
|
|
|
export type SpotMarker = {
|
|
key: SpotMarkerKey;
|
|
colour: string; // a CSS colour — a var() reference, so it follows the theme
|
|
labelKey: string; // i18n key, short form (badge / legend)
|
|
};
|
|
|
|
// Order is the display order, in both panels.
|
|
export const SPOT_MARKERS: SpotMarker[] = [
|
|
{ key: 'new_pota', colour: 'var(--success)', labelKey: 'clg2.newPota' },
|
|
{ key: 'new_county', colour: 'var(--chart-5)', labelKey: 'clg2.newCounty' },
|
|
{ key: 'new_pfx', colour: 'var(--caution)', labelKey: 'clg2.newPfx' },
|
|
{ key: 'new_grid', colour: 'var(--chart-7)', labelKey: 'clg2.newGrid' },
|
|
{ key: 'new_state', colour: 'var(--chart-3)', labelKey: 'clg2.newState' },
|
|
{ key: 'worked_call', colour: 'var(--info)', labelKey: 'clg2.wkdCall' },
|
|
];
|
|
|
|
export const markerColour = (key: SpotMarkerKey): string =>
|
|
SPOT_MARKERS.find((m) => m.key === key)?.colour ?? 'var(--muted-foreground)';
|
|
|
|
// activeMarkers returns the markers set on a status entry, in display order.
|
|
export function activeMarkers(e: Record<string, unknown> | undefined): SpotMarker[] {
|
|
if (!e) return [];
|
|
return SPOT_MARKERS.filter((m) => !!e[m.key]);
|
|
}
|