mirror of
https://github.com/Crosstalk-Solutions/project-nomad.git
synced 2026-10-17 05:14:19 +02:00
Salvages @kennethbrewer3's work from #836, which had drifted onto a stale base (GitHub showed 231 files; the real change is the map UI plus a migration). Marker visibility (individually and Hide All), per-marker icon and custom hex colour with contrast-adjusted icon colour, search, sorting and a tree view over the marker list, coordinate search and fly-to with URL parameters (?lat=&lng=&zoom=), creating a marker from typed coordinates, and markers rendered as SVGs anchored to true coordinates rather than approximately. Name, notes and preset colour already existed; the new columns are custom_color, icon, icon_color and visible. Dropped from the original as stale-base noise rather than his work: unrelated duplicate changes to the Ollama, Docker, download, RAG and ZIM services, the API reference and getting-started docs, README/FAQ/CONTRIBUTING, the installer script, and a revert of AppLayout to a version predating the compact sidebar. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F8Mgg1vd2eKSs8StZiuyMV
70 lines
2.0 KiB
TypeScript
70 lines
2.0 KiB
TypeScript
type ScaleUnit = 'imperial' | 'metric' | 'nautical'
|
|
|
|
type ScaleUnitSelectorProps = {
|
|
scaleUnit: ScaleUnit
|
|
onChange: (unit: ScaleUnit) => void
|
|
onMouseEnter?: () => void
|
|
}
|
|
|
|
export default function ScaleUnitSelector({
|
|
scaleUnit,
|
|
onChange,
|
|
onMouseEnter,
|
|
}: ScaleUnitSelectorProps) {
|
|
return (
|
|
<div className="absolute bottom-[30px] left-[10px] z-[2]" onMouseEnter={onMouseEnter}>
|
|
<div className="inline-flex overflow-hidden rounded text-[11px] font-semibold leading-none shadow-[0_0_0_2px_rgba(0,0,0,0.1)]">
|
|
|
|
{/* Metric */}
|
|
<button
|
|
type="button"
|
|
onClick={() => {
|
|
if (scaleUnit !== 'metric') onChange('metric')
|
|
}}
|
|
className="border-0 px-2 py-1"
|
|
style={{
|
|
background: scaleUnit === 'metric' ? '#424420' : 'white',
|
|
color: scaleUnit === 'metric' ? 'white' : '#666',
|
|
cursor: 'pointer',
|
|
}}
|
|
>
|
|
Metric
|
|
</button>
|
|
|
|
{/* Imperial */}
|
|
<button
|
|
type="button"
|
|
onClick={() => {
|
|
if (scaleUnit !== 'imperial') onChange('imperial')
|
|
}}
|
|
className="border-0 px-2 py-1"
|
|
style={{
|
|
background: scaleUnit === 'imperial' ? '#424420' : 'white',
|
|
color: scaleUnit === 'imperial' ? 'white' : '#666',
|
|
cursor: 'pointer',
|
|
}}
|
|
>
|
|
Imperial
|
|
</button>
|
|
|
|
{/* Nautical */}
|
|
<button
|
|
type="button"
|
|
onClick={() => {
|
|
if (scaleUnit !== 'nautical') onChange('nautical')
|
|
}}
|
|
className="border-0 px-2 py-1"
|
|
style={{
|
|
background: scaleUnit === 'nautical' ? '#424420' : 'white',
|
|
color: scaleUnit === 'nautical' ? 'white' : '#666',
|
|
cursor: 'pointer',
|
|
}}
|
|
>
|
|
Nautical
|
|
</button>
|
|
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|