mirror of
https://github.com/gpxstudio/gpx.studio.git
synced 2025-09-04 01:22:32 +00:00
71 lines
2.3 KiB
Svelte
71 lines
2.3 KiB
Svelte
![]() |
<script lang="ts">
|
||
|
import * as Card from '$lib/components/ui/card';
|
||
|
import { Button } from '$lib/components/ui/button';
|
||
|
import { overpassPopup, overpassPopupPOI } from './OverpassLayer';
|
||
|
import { PencilLine } from 'lucide-svelte';
|
||
|
import { onMount } from 'svelte';
|
||
|
import { _ } from 'svelte-i18n';
|
||
|
|
||
|
let popupElement: HTMLDivElement;
|
||
|
|
||
|
onMount(() => {
|
||
|
overpassPopup.setDOMContent(popupElement);
|
||
|
popupElement.classList.remove('hidden');
|
||
|
});
|
||
|
|
||
|
let tags = {};
|
||
|
$: if ($overpassPopupPOI) {
|
||
|
tags = JSON.parse($overpassPopupPOI.tags);
|
||
|
}
|
||
|
</script>
|
||
|
|
||
|
<div bind:this={popupElement} class="hidden">
|
||
|
{#if $overpassPopupPOI}
|
||
|
<Card.Root class="border-none shadow-md text-base p-2 max-w-[50dvw]">
|
||
|
<Card.Header class="p-0">
|
||
|
<Card.Title class="text-md">
|
||
|
<div class="flex flex-row gap-3">
|
||
|
<div class="flex flex-col">
|
||
|
{tags.name ?? ''}
|
||
|
<div class="text-muted-foreground text-sm font-normal">
|
||
|
{$overpassPopupPOI.lat.toFixed(6)}° {$overpassPopupPOI.lon.toFixed(6)}°
|
||
|
</div>
|
||
|
</div>
|
||
|
<Button
|
||
|
class="ml-auto p-1.5 h-8"
|
||
|
variant="outline"
|
||
|
href="https://www.openstreetmap.org/edit?editor=id&node={$overpassPopupPOI.id}"
|
||
|
target="_blank"
|
||
|
>
|
||
|
<PencilLine size="16" />
|
||
|
</Button>
|
||
|
</div>
|
||
|
</Card.Title>
|
||
|
</Card.Header>
|
||
|
{#if tags.image || tags['image:0']}
|
||
|
<div class="w-full rounded-md overflow-clip my-2 max-w-96 mx-auto">
|
||
|
<img src={tags.image ?? tags['image:0']} />
|
||
|
</div>
|
||
|
{/if}
|
||
|
<Card.Content
|
||
|
class="grid grid-cols-[auto_auto] gap-x-3 p-0 text-sm mt-1 whitespace-normal break-all"
|
||
|
>
|
||
|
{#each Object.entries(tags) as [key, value]}
|
||
|
{#if key !== 'name' && !key.includes('image')}
|
||
|
<span class="font-mono">{key}</span>
|
||
|
{#if key === 'website' || key === 'contact:website' || key === 'contact:facebook' || key === 'contact:instagram' || key === 'contact:twitter'}
|
||
|
<a href={value} target="_blank" class="text-blue-500 underline">{value}</a>
|
||
|
{:else if key === 'phone' || key === 'contact:phone'}
|
||
|
<a href={'tel:' + value} class="text-blue-500 underline">{value}</a>
|
||
|
{:else if key === 'email' || key === 'contact:email'}
|
||
|
<a href={'mailto:' + value} class="text-blue-500 underline">{value}</a>
|
||
|
{:else}
|
||
|
<span>{value}</span>
|
||
|
{/if}
|
||
|
{/if}
|
||
|
{/each}
|
||
|
</Card.Content>
|
||
|
</Card.Root>
|
||
|
{/if}
|
||
|
</div>
|