Files
gpx.studio/website/src/lib/components/Map.svelte

122 lines
2.3 KiB
Svelte
Raw Normal View History

2024-04-05 17:53:42 +02:00
<script lang="ts">
import { onMount, onDestroy } from 'svelte';
2024-04-10 14:54:35 +02:00
import mapboxgl from 'mapbox-gl';
import 'mapbox-gl/dist/mapbox-gl.css';
2024-04-05 17:53:42 +02:00
2024-04-10 14:54:35 +02:00
import MapboxGeocoder from '@mapbox/mapbox-gl-geocoder';
import '@mapbox/mapbox-gl-geocoder/dist/mapbox-gl-geocoder.css';
2024-04-05 17:53:42 +02:00
2024-04-10 14:54:35 +02:00
mapboxgl.accessToken =
'pk.eyJ1IjoiZ3B4c3R1ZGlvIiwiYSI6ImNrdHVoM2pjNTBodmUycG1yZTNwcnJ3MzkifQ.YZnNs9s9oCQPzoXAWs_SLg';
2024-04-16 22:57:28 +02:00
export let map: mapboxgl.Map | null = null;
2024-04-10 14:54:35 +02:00
export let distanceUnits: 'metric' | 'imperial' = 'metric';
2024-04-05 17:53:42 +02:00
onMount(() => {
2024-04-10 14:54:35 +02:00
map = new mapboxgl.Map({
2024-04-05 17:53:42 +02:00
container: 'map',
2024-04-11 17:18:21 +02:00
style: { version: 8, sources: {}, layers: [] },
2024-04-12 12:38:19 +02:00
projection: { name: 'mercator' },
2024-04-10 14:54:35 +02:00
hash: true,
language: 'auto',
attributionControl: false,
logoPosition: 'bottom-right'
2024-04-05 17:53:42 +02:00
});
map.addControl(
2024-04-10 14:54:35 +02:00
new mapboxgl.AttributionControl({
compact: true
2024-04-05 17:53:42 +02:00
})
);
2024-04-10 14:54:35 +02:00
map.addControl(new mapboxgl.NavigationControl());
2024-04-05 17:53:42 +02:00
map.addControl(
2024-04-10 14:54:35 +02:00
new MapboxGeocoder({
accessToken: mapboxgl.accessToken,
mapboxgl: mapboxgl,
collapsed: true
})
);
map.addControl(
new mapboxgl.GeolocateControl({
2024-04-05 17:53:42 +02:00
positionOptions: {
enableHighAccuracy: true
},
2024-04-10 14:54:35 +02:00
trackUserLocation: true,
showUserHeading: true
2024-04-05 17:53:42 +02:00
})
);
map.addControl(
2024-04-10 14:54:35 +02:00
new mapboxgl.ScaleControl({
unit: distanceUnits
2024-04-05 17:53:42 +02:00
})
);
});
2024-04-11 17:18:21 +02:00
onDestroy(() => {
if (map) {
map.remove();
}
});
2024-04-05 17:53:42 +02:00
</script>
<div {...$$restProps}>
2024-04-16 22:57:28 +02:00
<div id="map" class="h-full"></div>
2024-04-05 17:53:42 +02:00
</div>
2024-04-10 14:54:35 +02:00
<style lang="postcss">
div :global(.mapboxgl-ctrl) {
@apply shadow-md;
}
div :global(.mapboxgl-ctrl-geocoder) {
@apply flex;
@apply flex-row;
@apply w-fit;
@apply min-w-fit;
@apply items-center;
@apply shadow-md;
}
div :global(.suggestions) {
@apply shadow-md;
}
div :global(.mapboxgl-ctrl-geocoder--icon-search) {
@apply fill-inherit;
@apply relative;
@apply top-0;
@apply left-0;
@apply my-2;
@apply w-[29px];
}
div :global(.mapboxgl-ctrl-geocoder--input) {
@apply relative;
2024-04-12 18:05:26 +02:00
@apply w-64;
2024-04-10 14:54:35 +02:00
@apply py-0;
@apply pl-2;
@apply focus:outline-none;
2024-04-12 18:05:26 +02:00
@apply transition-[width];
@apply duration-200;
2024-04-10 14:54:35 +02:00
}
div :global(.mapboxgl-ctrl-geocoder--collapsed .mapboxgl-ctrl-geocoder--input) {
2024-04-12 18:05:26 +02:00
@apply w-0;
@apply p-0;
2024-04-10 14:54:35 +02:00
}
2024-04-12 15:51:57 +02:00
div :global(.mapboxgl-ctrl-top-right) {
@apply z-10;
2024-04-15 11:25:31 +02:00
@apply flex;
@apply flex-col;
@apply items-end;
@apply h-full;
@apply overflow-hidden;
2024-04-12 15:51:57 +02:00
}
2024-04-10 14:54:35 +02:00
</style>