diff --git a/website/src/lib/components/elevation-profile/elevation-profile.ts b/website/src/lib/components/elevation-profile/elevation-profile.ts index 070992fc9..7690e72f9 100644 --- a/website/src/lib/components/elevation-profile/elevation-profile.ts +++ b/website/src/lib/components/elevation-profile/elevation-profile.ts @@ -594,6 +594,7 @@ export class ElevationProfile { destroy() { if (this._chart) { this._chart.destroy(); + this._chart = null; } if (this._marker) { this._marker.remove(); diff --git a/website/src/lib/components/embedding/Embedding.svelte b/website/src/lib/components/embedding/Embedding.svelte index f3542e365..9a9fdfee3 100644 --- a/website/src/lib/components/embedding/Embedding.svelte +++ b/website/src/lib/components/embedding/Embedding.svelte @@ -1,40 +1,35 @@
- - - {#if fileStateCollection.files.size > 1} + + + {#if $fileStateCollection.size > 1}
- +
{/if}
@@ -237,26 +114,20 @@ class="{options.elevation.show ? '' : 'h-10'} flex flex-row gap-2 px-2 sm:px-4" style={options.elevation.show ? `height: ${options.elevation.height}px` : ''} > - + /> {#if options.elevation.show} - + /> {/if}
diff --git a/website/src/lib/components/embedding/EmbeddingPlayground.svelte b/website/src/lib/components/embedding/EmbeddingPlayground.svelte index 92d66d3f5..0f6d7698b 100644 --- a/website/src/lib/components/embedding/EmbeddingPlayground.svelte +++ b/website/src/lib/components/embedding/EmbeddingPlayground.svelte @@ -18,63 +18,61 @@ import { i18n } from '$lib/i18n.svelte'; import { allowedEmbeddingBasemaps, + defaultEmbeddingOptions, getCleanedEmbeddingOptions, - getDefaultEmbeddingOptions, - } from './Embedding'; + getMergedEmbeddingOptions, + } from './embedding'; import { PUBLIC_MAPBOX_TOKEN } from '$env/static/public'; import Embedding from './Embedding.svelte'; - import { map } from '$lib/stores'; - import { tick } from 'svelte'; + import { onDestroy } from 'svelte'; import { base } from '$app/paths'; + import { map } from '$lib/components/map/map'; + import { mode } from 'mode-watcher'; - let options = getDefaultEmbeddingOptions(); - options.token = 'YOUR_MAPBOX_TOKEN'; - options.files = [ - 'https://raw.githubusercontent.com/gpxstudio/gpx.studio/main/gpx/test-data/simple.gpx', - ]; + let options = $state( + getMergedEmbeddingOptions( + { + token: 'YOUR_MAPBOX_TOKEN', + theme: mode.current, + }, + defaultEmbeddingOptions + ) + ); + let files = $state( + 'https://raw.githubusercontent.com/gpxstudio/gpx.studio/main/gpx/test-data/simple.gpx' + ); + let driveIds = $state(''); - let files = options.files[0]; - $: { - let urls = files.split(','); - urls = urls.filter((url) => url.length > 0); - if (JSON.stringify(urls) !== JSON.stringify(options.files)) { - options.files = urls; + let iframeOptions = $derived( + getMergedEmbeddingOptions( + { + token: + options.token.length === 0 || options.token === 'YOUR_MAPBOX_TOKEN' + ? PUBLIC_MAPBOX_TOKEN + : options.token, + files: files.split(',').filter((url) => url.length > 0), + ids: driveIds.split(',').filter((id) => id.length > 0), + elevation: { + fill: options.elevation.fill === 'none' ? undefined : options.elevation.fill, + }, + }, + options + ) + ); + + let manualCamera = $state(false); + let zoom = $state('0'); + let lat = $state('0'); + let lon = $state('0'); + let bearing = $state('0'); + let pitch = $state('0'); + let hash = $derived(manualCamera ? `#${zoom}/${lat}/${lon}/${bearing}/${pitch}` : ''); + + $effect(() => { + if (options.elevation.show || options.elevation.height) { + map.resize(); } - } - let driveIds = ''; - $: { - let ids = driveIds.split(','); - ids = ids.filter((id) => id.length > 0); - if (JSON.stringify(ids) !== JSON.stringify(options.ids)) { - options.ids = ids; - } - } - - let manualCamera = false; - - let zoom = '0'; - let lat = '0'; - let lon = '0'; - let bearing = '0'; - let pitch = '0'; - - $: hash = manualCamera ? `#${zoom}/${lat}/${lon}/${bearing}/${pitch}` : ''; - - $: iframeOptions = - options.token.length === 0 || options.token === 'YOUR_MAPBOX_TOKEN' - ? Object.assign({}, options, { token: PUBLIC_MAPBOX_TOKEN }) - : options; - - async function resizeMap() { - if ($map) { - await tick(); - $map.resize(); - } - } - - $: if (options.elevation.height || options.elevation.show) { - resizeMap(); - } + }); function updateCamera() { if ($map) { @@ -87,9 +85,15 @@ } } - $: if ($map) { - $map.on('moveend', updateCamera); - } + map.onLoad((map_) => { + map_.on('moveend', updateCamera); + }); + + onDestroy(() => { + if ($map) { + $map.off('moveend', updateCamera); + } + }); @@ -105,19 +109,9 @@ - { - if (selected?.value) { - options.basemap = selected?.value; - } - }} - > + - + {i18n._(`layers.label.${options.basemap}`)} {#each allowedEmbeddingBasemaps as basemap} @@ -145,23 +139,11 @@ {i18n._('embedding.fill_by')} - { - let value = selected?.value; - if (value === 'none') { - options.elevation.fill = undefined; - } else if ( - value === 'slope' || - value === 'surface' || - value === 'highway' - ) { - options.elevation.fill = value; - } - }} - > + - + {options.elevation.fill !== 'none' + ? i18n._(`quantities.${options.elevation.fill}`) + : i18n._('embedding.none')} {i18n._('quantities.slope')}
- +