28 Commits

Author SHA1 Message Date
vcoppe fe8896e870 get styles from github 2026-05-27 20:17:49 +02:00
vcoppe c99517572e update images 2026-05-27 19:40:09 +02:00
vcoppe 0b7f30a7c4 remove maptiler layers 2026-05-27 18:52:15 +02:00
vcoppe fcfaf043c4 fix map localization 2026-05-26 06:28:32 +02:00
vcoppe 0393a330a6 fix loading initial style 2026-05-26 06:18:00 +02:00
vcoppe 2fdb58bc7d switch contour lines based on units 2026-05-25 16:50:28 +02:00
vcoppe c758bda1a9 update tiles endpoint 2026-05-25 15:48:23 +02:00
vcoppe 88e301e2a2 use maptiler satellite 2026-05-25 14:45:03 +02:00
vcoppe 161c664e08 borders 2026-05-25 11:26:49 +02:00
vcoppe a0408ec798 revert rivers 2026-05-25 11:00:55 +02:00
vcoppe 480d5586b9 inverse font color and halo 2026-05-25 10:58:23 +02:00
vcoppe 7b49018593 remove casings 2026-05-25 10:44:53 +02:00
vcoppe 4b447a9b9d revert some of the changes 2026-05-25 10:40:38 +02:00
vcoppe 443feb2bfa road opacities 2026-05-25 10:29:29 +02:00
vcoppe 8710101a78 remove filled areas 2026-05-25 09:59:54 +02:00
vcoppe 2c20148e64 start satellite style 2026-05-24 13:49:43 +02:00
vcoppe ffc0e84788 slightly bigger paths 2026-05-24 00:23:40 +02:00
vcoppe 2d2004e447 small color change 2026-05-24 00:16:55 +02:00
vcoppe 4a7cfc113d vector terrain 2026-05-24 00:13:26 +02:00
vcoppe f03ad5a0e9 colored track casing 2026-05-24 00:04:09 +02:00
vcoppe 7f5b83f9d8 only use surface for coloring 2026-05-23 20:13:47 +02:00
vcoppe 5a8f93e225 different colors depending on surface 2026-05-23 20:10:21 +02:00
vcoppe 668b0f6b23 clearer path names 2026-05-23 19:59:12 +02:00
vcoppe fc1eb5a408 highlight trails 2026-05-23 19:52:04 +02:00
vcoppe 561c7e22b3 first tweaks 2026-05-23 19:17:37 +02:00
vcoppe ce067d4ff0 add custom layer base from openfreemap (osm liberty) 2026-05-23 19:14:59 +02:00
vcoppe 7361b54255 only apply minify to selection 2026-05-21 20:27:22 +02:00
vcoppe 9e2334ca83 New Crowdin updates (#336)
* New translations en.json (Dutch)

* New translations view.mdx (Dutch)

* New translations en.json (Spanish)

* New translations view.mdx (Spanish)

* New translations view.mdx (Dutch)

* New translations en.json (Chinese Simplified)

* New translations view.mdx (Chinese Simplified)

* New translations map-controls.mdx (Chinese Simplified)

* New translations files-and-stats.mdx (Serbian (Latin))

* New translations edit.mdx (Serbian (Latin))

* New translations elevation.mdx (Serbian (Latin))

* New translations en.json (Serbian (Latin))

* New translations files-and-stats.mdx (Serbian (Latin))

* New translations edit.mdx (Serbian (Latin))

* New translations file.mdx (Serbian (Latin))

* New translations settings.mdx (Serbian (Latin))

* New translations view.mdx (Serbian (Latin))

* New translations clean.mdx (Serbian (Latin))

* New translations extract.mdx (Serbian (Latin))

* New translations merge.mdx (Serbian (Latin))

* New translations poi.mdx (Serbian (Latin))

* New translations routing.mdx (Serbian (Latin))

* New translations scissors.mdx (Serbian (Latin))

* New translations time.mdx (Serbian (Latin))

* New translations elevation.mdx (Serbian (Latin))

* New translations minify.mdx (Serbian (Latin))

* New translations routing.mdx (Serbian (Latin))

* New translations faq.mdx (Serbian (Latin))

* New translations integration.mdx (Serbian (Latin))

* New translations files-and-stats.mdx (Serbian (Latin))

* New translations integration.mdx (Serbian (Latin))

* New translations map-controls.mdx (Serbian (Latin))

* New translations menu.mdx (Serbian (Latin))

* New translations edit.mdx (Serbian (Latin))

* New translations file.mdx (Serbian (Latin))

* New translations view.mdx (Serbian (Latin))

* New translations toolbar.mdx (Serbian (Latin))

* New translations routing.mdx (Serbian (Latin))

* New translations scissors.mdx (Serbian (Latin))

* New translations gpx.mdx (Serbian (Latin))

* New translations integration.mdx (Serbian (Latin))

* New translations en.json (Russian)

* New translations elevation.mdx (Dutch)

[ci skip]

* New translations map-controls.mdx (Dutch)

[ci skip]

* New translations elevation.mdx (Dutch)

[ci skip]

* New translations files-and-stats.mdx (Russian)

[ci skip]

* New translations view.mdx (Russian)

[ci skip]

* New translations clean.mdx (Norwegian)

[ci skip]

* New translations clean.mdx (Norwegian)

[ci skip]

* New translations en.json (Norwegian)

[ci skip]

* New translations poi.mdx (Norwegian)

[ci skip]

* New translations en.json (Indonesian)

[ci skip]

* New translations en.json (Dutch)

[ci skip]
2026-05-21 20:20:49 +02:00
26 changed files with 138 additions and 235 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 339 KiB

After

Width:  |  Height:  |  Size: 313 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 729 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 525 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

After

Width:  |  Height:  |  Size: 710 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 348 KiB

+10 -19
View File
@@ -31,10 +31,8 @@ import bikerouterGravel from './custom/bikerouter-gravel.json';
export const maptilerKeyPlaceHolder = 'MAPTILER_KEY'; export const maptilerKeyPlaceHolder = 'MAPTILER_KEY';
export const basemaps: { [key: string]: string | StyleSpecification } = { export const basemaps: { [key: string]: string | StyleSpecification } = {
maptilerStreets: `https://api.maptiler.com/maps/streets-v4/style.json?key=${maptilerKeyPlaceHolder}`, topo: 'https://raw.githubusercontent.com/gpxstudio/styles/refs/heads/main/topo.json',
maptilerTopo: `https://api.maptiler.com/maps/topo-v4/style.json?key=${maptilerKeyPlaceHolder}`, satellite: 'https://raw.githubusercontent.com/gpxstudio/styles/refs/heads/main/satellite.json',
maptilerOutdoors: `https://api.maptiler.com/maps/outdoor-v4/style.json?key=${maptilerKeyPlaceHolder}`,
maptilerSatellite: `https://api.maptiler.com/maps/hybrid-v4/style.json?key=${maptilerKeyPlaceHolder}`,
esriSatellite: { esriSatellite: {
version: 8, version: 8,
sources: { sources: {
@@ -799,10 +797,8 @@ export type LayerTreeType = { [key: string]: LayerTreeType | boolean };
export const basemapTree: LayerTreeType = { export const basemapTree: LayerTreeType = {
basemaps: { basemaps: {
world: { world: {
maptilerStreets: true, topo: true,
maptilerTopo: true, satellite: true,
maptilerOutdoors: true,
maptilerSatellite: true,
esriSatellite: true, esriSatellite: true,
openStreetMap: true, openStreetMap: true,
openTopoMap: true, openTopoMap: true,
@@ -936,7 +932,7 @@ export const overpassTree: LayerTreeType = {
}; };
// Default basemap used // Default basemap used
export const defaultBasemap = 'maptilerStreets'; export const defaultBasemap = 'topo';
// Default overlays used (none) // Default overlays used (none)
export const defaultOverlays: LayerTreeType = { export const defaultOverlays: LayerTreeType = {
@@ -1025,10 +1021,8 @@ export const defaultOverpassQueries: LayerTreeType = {
export const defaultBasemapTree: LayerTreeType = { export const defaultBasemapTree: LayerTreeType = {
basemaps: { basemaps: {
world: { world: {
maptilerStreets: true, topo: true,
maptilerTopo: true, satellite: true,
maptilerOutdoors: true,
maptilerSatellite: true,
esriSatellite: false, esriSatellite: false,
openStreetMap: true, openStreetMap: true,
openTopoMap: true, openTopoMap: true,
@@ -1487,14 +1481,11 @@ export const overpassQueryData: Record<string, OverpassQueryData> = {
}; };
export const terrainSources: { [key: string]: RasterDEMSourceSpecification } = { export const terrainSources: { [key: string]: RasterDEMSourceSpecification } = {
'maptiler-dem': {
type: 'raster-dem',
url: `https://api.maptiler.com/tiles/terrain-rgb-v2/tiles.json?key=${maptilerKeyPlaceHolder}`,
},
mapterhorn: { mapterhorn: {
type: 'raster-dem', type: 'raster-dem',
url: 'https://tiles.mapterhorn.com/tilejson.json', url: 'https://tiles.gpx.studio/mapterhorn.json',
encoding: 'terrarium',
}, },
}; };
export const defaultTerrainSource = 'maptiler-dem'; export const defaultTerrainSource = 'mapterhorn';
+1 -7
View File
@@ -8,7 +8,7 @@
...others ...others
}: { }: {
iconOnly?: boolean; iconOnly?: boolean;
company?: 'gpx.studio' | 'maptiler' | 'github' | 'crowdin' | 'facebook' | 'reddit'; company?: 'gpx.studio' | 'github' | 'crowdin' | 'facebook' | 'reddit';
[key: string]: any; [key: string]: any;
} = $props(); } = $props();
</script> </script>
@@ -19,12 +19,6 @@
alt="Logo of gpx.studio." alt="Logo of gpx.studio."
{...others} {...others}
/> />
{:else if company === 'maptiler'}
<img
src="{base}/maptiler-logo{mode.current === 'dark' ? '-dark' : ''}.svg"
alt="Logo of Maptiler."
{...others}
/>
{:else if company === 'github'} {:else if company === 'github'}
<svg <svg
role="img" role="img"
@@ -1,10 +1,10 @@
<script lang="ts"> <script lang="ts">
import maptilerTopoMap from '$lib/assets/img/home/maptiler-topo.png?enhanced'; import topoMap from '$lib/assets/img/docs/maps/topo.png?enhanced';
import waymarkedMap from '$lib/assets/img/home/waymarked.png?enhanced'; import waymarkedMap from '$lib/assets/img/docs/maps/waymarked.png?enhanced';
</script> </script>
<div class="relative h-80 aspect-square rounded-2xl shadow-xl overflow-clip"> <div class="relative h-80 aspect-square rounded-2xl shadow-xl overflow-clip">
<enhanced:img src={maptilerTopoMap} alt="MapTiler Topo map screenshot." class="absolute" /> <enhanced:img src={topoMap} alt="Topo map screenshot." class="absolute" />
<enhanced:img <enhanced:img
src={waymarkedMap} src={waymarkedMap}
alt="Waymarked Trails map screenshot." alt="Waymarked Trails map screenshot."
@@ -29,7 +29,7 @@ export const defaultEmbeddingOptions = {
key: '', key: '',
files: [], files: [],
ids: [], ids: [],
basemap: 'maptilerStreets', basemap: 'topo',
elevation: { elevation: {
show: true, show: true,
height: 170, height: 170,
@@ -125,9 +125,7 @@ export function convertOldEmbeddingOptions(options: URLSearchParams): any {
} }
if (options.has('source')) { if (options.has('source')) {
let basemap = options.get('source')!; let basemap = options.get('source')!;
if (basemap === 'satellite') { if (basemap === 'otm') {
newOptions.basemap = 'maptilerSatellite';
} else if (basemap === 'otm') {
newOptions.basemap = 'openTopoMap'; newOptions.basemap = 'openTopoMap';
} else if (basemap === 'ohm') { } else if (basemap === 'ohm') {
newOptions.basemap = 'openHikingMap'; newOptions.basemap = 'openHikingMap';
+37 -23
View File
@@ -10,7 +10,8 @@ import {
import { getLayers } from '$lib/components/map/layer-control/utils'; import { getLayers } from '$lib/components/map/layer-control/utils';
import { i18n } from '$lib/i18n.svelte'; import { i18n } from '$lib/i18n.svelte';
const { currentBasemap, currentOverlays, customLayers, opacities, terrainSource } = settings; const { currentBasemap, currentOverlays, customLayers, opacities, terrainSource, distanceUnits } =
settings;
const emptySource: maplibregl.GeoJSONSourceSpecification = { const emptySource: maplibregl.GeoJSONSourceSpecification = {
type: 'geojson', type: 'geojson',
@@ -57,15 +58,21 @@ export class StyleManager {
opacities.subscribe(() => this.updateOverlays()); opacities.subscribe(() => this.updateOverlays());
terrainSource.subscribe(() => this.updateTerrain()); terrainSource.subscribe(() => this.updateTerrain());
customLayers.subscribe(() => this.updateBasemap()); customLayers.subscribe(() => this.updateBasemap());
distanceUnits.subscribe(() => {
if (get(currentBasemap) === 'topo') this.updateBasemap();
});
} }
updateBasemap() { updateBasemap() {
const map_ = get(this._map); const map_ = get(this._map);
if (!map_) return; if (!map_) return;
this.buildStyle().then((style) => map_.setStyle(style)); let basemap = get(currentBasemap);
this.buildStyle(basemap).then((style) => {
if (get(currentBasemap) === basemap) map_.setStyle(style);
});
} }
async buildStyle(): Promise<maplibregl.StyleSpecification> { async buildStyle(basemap: string): Promise<maplibregl.StyleSpecification> {
const custom = get(customLayers); const custom = get(customLayers);
const style: maplibregl.StyleSpecification = { const style: maplibregl.StyleSpecification = {
@@ -79,22 +86,31 @@ export class StyleManager {
layers: [], layers: [],
}; };
let basemap = get(currentBasemap);
const basemapInfo = basemaps[basemap] ?? custom[basemap]?.value ?? basemaps[defaultBasemap]; const basemapInfo = basemaps[basemap] ?? custom[basemap]?.value ?? basemaps[defaultBasemap];
let basemapStyle = basemaps.openStreetMap as maplibregl.StyleSpecification; let basemapStyle = basemaps.openStreetMap as maplibregl.StyleSpecification;
try { try {
basemapStyle = await this.get(basemapInfo); basemapStyle = await this.get(basemapInfo);
for (const source in basemapStyle.sources) {
const src = basemapStyle.sources[source];
if (
src &&
typeof src === 'object' &&
'url' in src &&
typeof src.url === 'string' &&
src.url.includes(maptilerKeyPlaceHolder)
) {
src.url = src.url.replace(maptilerKeyPlaceHolder, this._maptilerKey);
}
}
} catch (e) { } catch (e) {
console.error(e.message); console.error(e.message);
} }
this.merge(style, basemapStyle); this.merge(style, basemapStyle);
if (this._maptilerKey !== '') { const terrain = this.getCurrentTerrain();
const terrain = this.getCurrentTerrain(); style.sources[terrain.source] = terrainSources[terrain.source];
style.sources[terrain.source] = terrainSources[terrain.source]; style.terrain = terrain.exaggeration > 0 ? terrain : undefined;
style.terrain = terrain.exaggeration > 0 ? terrain : undefined;
}
style.layers.push(...anchorLayers); style.layers.push(...anchorLayers);
@@ -166,7 +182,6 @@ export class StyleManager {
} }
updateTerrain() { updateTerrain() {
if (this._maptilerKey === '') return;
const map_ = get(this._map); const map_ = get(this._map);
if (!map_) return; if (!map_) return;
@@ -189,9 +204,6 @@ export class StyleManager {
): Promise<maplibregl.StyleSpecification> { ): Promise<maplibregl.StyleSpecification> {
if (typeof styleInfo === 'string') { if (typeof styleInfo === 'string') {
let styleUrl = styleInfo as string; let styleUrl = styleInfo as string;
if (styleUrl.includes(maptilerKeyPlaceHolder)) {
styleUrl = styleUrl.replace(maptilerKeyPlaceHolder, this._maptilerKey);
}
const response = await fetch(styleUrl, { cache: 'force-cache' }); const response = await fetch(styleUrl, { cache: 'force-cache' });
if (!response.ok) { if (!response.ok) {
throw new Error(`HTTP error fetching style "${styleInfo}": ${response.status}`); throw new Error(`HTTP error fetching style "${styleInfo}": ${response.status}`);
@@ -205,17 +217,23 @@ export class StyleManager {
merge(style: maplibregl.StyleSpecification, other: maplibregl.StyleSpecification) { merge(style: maplibregl.StyleSpecification, other: maplibregl.StyleSpecification) {
style.sources = { ...style.sources, ...other.sources }; style.sources = { ...style.sources, ...other.sources };
const units = get(distanceUnits);
for (let layer of other.layers ?? []) { for (let layer of other.layers ?? []) {
if ('source' in layer) {
if (layer.source == 'contours_m' && units === 'imperial') continue;
if (layer.source == 'contours_ft' && units !== 'imperial') continue;
}
if (layer.type === 'symbol' && layer.layout && layer.layout['text-field']) { if (layer.type === 'symbol' && layer.layout && layer.layout['text-field']) {
const textField = layer.layout['text-field']; const textField = layer.layout['text-field'];
if ( if (
Array.isArray(textField) && Array.isArray(textField) &&
textField.length >= 2 && textField.length == 4 &&
textField[0] === 'coalesce' && Array.isArray(textField[3]) &&
Array.isArray(textField[1]) && textField[3][0] === 'coalesce' &&
textField[1][0] === 'get' && Array.isArray(textField[3][1]) &&
typeof textField[1][1] === 'string' && textField[3][1][0] === 'get' &&
textField[1][1].startsWith('name') typeof textField[3][1][1] === 'string' &&
textField[3][1][1].startsWith('name')
) { ) {
layer.layout['text-field'] = [ layer.layout['text-field'] = [
'coalesce', 'coalesce',
@@ -236,10 +254,6 @@ export class StyleManager {
getCurrentTerrain() { getCurrentTerrain() {
const terrain = get(terrainSource); const terrain = get(terrainSource);
const source = terrainSources[terrain];
if (source.url && source.url.includes(maptilerKeyPlaceHolder)) {
source.url = source.url.replace(maptilerKeyPlaceHolder, this._maptilerKey);
}
const map_ = get(this._map); const map_ = get(this._map);
return { return {
source: terrain, source: terrain,
@@ -163,6 +163,9 @@ export class ReducedGPXLayerCollection {
reduce() { reduce() {
let itemsAndPoints = new Map<ListItem, TrackPoint[]>(); let itemsAndPoints = new Map<ListItem, TrackPoint[]>();
this._simplified.forEach(([item, maxPts, points], itemFullId) => { this._simplified.forEach(([item, maxPts, points], itemFullId) => {
if (!get(selection).hasAnyParent(item)) {
return;
}
itemsAndPoints.set( itemsAndPoints.set(
item, item,
points points
+1 -1
View File
@@ -59,7 +59,7 @@ Only one basemap can be displayed at a time.
<DocsLayers /> <DocsLayers />
<span class="text-sm text-center mt-2"> <span class="text-sm text-center mt-2">
Hover over the map to show the <a href="https://hiking.waymarkedtrails.org" target="_blank">Waymarked Trails hiking</a> overlay on top of the <a href="https://www.maptiler.com/maps/outdoor-topo/" target="_blank">MapTiler Topo</a> basemap. Hover over the map to show the <a href="https://hiking.waymarkedtrails.org" target="_blank">Waymarked Trails hiking</a> overlay on top of the topographic basemap.
</span> </span>
</div> </div>
@@ -18,7 +18,7 @@ This tool allows you to add elevation data to traces and [points of interest](..
<DocsNote> <DocsNote>
Elevation data is provided by <a href="https://maptiler.com" target="_blank">MapTiler</a>. Elevation data is provided by <a href="https://mapterhorn.com" target="_blank">Mapterhorn</a>.
You can learn more about its origin and accuracy in the <a href="https://docs.maptiler.com/guides/map-tiling-hosting/data-hosting/rgb-terrain-by-maptiler/" target="_blank">documentation</a>. You can learn more about its origin and accuracy in the <a href="https://mapterhorn.com/attribution/" target="_blank">documentation</a>.
</DocsNote> </DocsNote>
+3 -3
View File
@@ -1,5 +1,5 @@
--- ---
title: Clean title: Rens
--- ---
<script> <script>
@@ -9,9 +9,9 @@ title: Clean
# <SquareDashedMousePointer size="24" class="inline-block" style="margin-bottom: 5px" /> { title } # <SquareDashedMousePointer size="24" class="inline-block" style="margin-bottom: 5px" /> { title }
When the clean tool is selected, dragging the map will create a rectangular selection. Når rensverktøyet er valgt, markeres et område ved å tegne et rektangel på kartet.
Depending on the options selected in the dialog shown below, clicking the delete button will remove GPS points and/or [points of interest](../gpx) located either inside or outside the selection. Avhengig av alternativene som er valgt i dialogboksen nedenfor, fjerner slett-knappen GPS-punkter og/eller [interessepunkter POI](../gpx) enten innenfor eller utenfor det merkede området.
<div class="flex flex-row justify-center"> <div class="flex flex-row justify-center">
<Clean class="text-foreground p-3 border rounded-md shadow-lg" /> <Clean class="text-foreground p-3 border rounded-md shadow-lg" />
+9 -9
View File
@@ -1,5 +1,5 @@
--- ---
title: Points of interest title: Interessepunkt
--- ---
<script> <script>
@@ -9,19 +9,19 @@ title: Points of interest
# <MapPin size="24" class="inline-block" style="margin-bottom: 5px" /> { title } # <MapPin size="24" class="inline-block" style="margin-bottom: 5px" /> { title }
[Points of interest](../gpx) can be added to GPX files to mark locations of interest on the map and display them on your GPS device. [Interessepunkt](../gpx) kan legges til GPX filer for å markere punkter av interesse for å vises på en GPS-enhet.
### Creating a point of interest ### Opprettelse av interessepunkt
To create a point of interest, fill in the form shown below. Fyll ut skjemaet nedenfor for å opprette et interessepunkt.
You can choose the location of the point of interest either by clicking on the map or by entering the coordinates manually. Ved å klikke på kartet eller skrive inn koordinatene, kan du angi plassering til interessepunktet.
Validate the form when you are done. Bekreft skjemaet når du er ferdig.
<div class="flex flex-row justify-center"> <div class="flex flex-row justify-center">
<Waypoint class="text-foreground p-3 border rounded-md shadow-lg" /> <Waypoint class="text-foreground p-3 border rounded-md shadow-lg" />
</div> </div>
### Editing a point of interest ### Redigering av interessepunkt
The form above can also be used to edit an existing point of interest after selecting it on the map. Et eksisterende interessepunkt kan også redigeres ved å velge det på kartet og deretter bruke skjemaet over.
If you only need to move the point of interest, you can drag it to the desired location. Interessepunktet kan flyttes ved å dra det til ønsket plassering.
+2 -2
View File
@@ -210,7 +210,7 @@ type RoutingProfile =
| 'motorcycle' | 'motorcycle'
| 'water' | 'water'
| 'railway'; | 'railway';
type TerrainSource = 'maptiler-dem' | 'mapterhorn'; type TerrainSource = 'mapterhorn';
type StreetViewSource = 'mapillary' | 'google'; type StreetViewSource = 'mapillary' | 'google';
export const settings = { export const settings = {
@@ -308,7 +308,7 @@ export const settings = {
terrainSource: new Setting<TerrainSource>( terrainSource: new Setting<TerrainSource>(
'terrainSource', 'terrainSource',
defaultTerrainSource, defaultTerrainSource,
getValueValidator(['maptiler-dem', 'mapterhorn'], defaultTerrainSource) getValueValidator(['mapterhorn'], defaultTerrainSource)
), ),
directionMarkers: new Setting('directionMarkers', false), directionMarkers: new Setting('directionMarkers', false),
distanceMarkers: new Setting('distanceMarkers', false), distanceMarkers: new Setting('distanceMarkers', false),
+8 -10
View File
@@ -7,7 +7,6 @@ import maplibregl from 'maplibre-gl';
import { pointToTile, pointToTileFraction } from '@mapbox/tilebelt'; import { pointToTile, pointToTileFraction } from '@mapbox/tilebelt';
import type { GPXStatisticsTree } from '$lib/logic/statistics-tree'; import type { GPXStatisticsTree } from '$lib/logic/statistics-tree';
import { ListTrackSegmentItem } from '$lib/components/file-list/file-list'; import { ListTrackSegmentItem } from '$lib/components/file-list/file-list';
import { PUBLIC_MAPTILER_KEY } from '$env/static/public';
export function cn(...inputs: ClassValue[]) { export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs)); return twMerge(clsx(inputs));
@@ -101,7 +100,7 @@ export function getClosestTrackSegments(
export function getElevation( export function getElevation(
points: (TrackPoint | Waypoint | Coordinates)[], points: (TrackPoint | Waypoint | Coordinates)[],
ELEVATION_ZOOM: number = 13, ELEVATION_ZOOM: number = 12,
tileSize = 512 tileSize = 512
): Promise<number[]> { ): Promise<number[]> {
let coordinates = points.map((point) => let coordinates = points.map((point) =>
@@ -122,10 +121,9 @@ export function getElevation(
}; };
let promises = uniqueTiles.map((tile) => let promises = uniqueTiles.map((tile) =>
fetch( fetch(`https://tiles.gpx.studio/mapterhorn/${ELEVATION_ZOOM}/${tile[0]}/${tile[1]}.webp`, {
`https://api.maptiler.com/tiles/terrain-rgb-v2/${ELEVATION_ZOOM}/${tile[0]}/${tile[1]}.webp?key=${PUBLIC_MAPTILER_KEY}`, cache: 'force-cache',
{ cache: 'force-cache' } })
)
.then((response) => response.blob()) .then((response) => response.blob())
.then( .then(
(blob) => (blob) =>
@@ -180,10 +178,10 @@ export function getElevation(
_y + (_y + 1 == tileSize ? 0 : 1) _y + (_y + 1 == tileSize ? 0 : 1)
); );
let ele00 = -10000 + (p00[0] * 256 * 256 + p00[1] * 256 + p00[2]) * 0.1; let ele00 = -32768 + p00[0] * 256 + p00[1] + p00[2] / 256;
let ele01 = -10000 + (p01[0] * 256 * 256 + p01[1] * 256 + p01[2]) * 0.1; let ele01 = -32768 + p01[0] * 256 + p01[1] + p01[2] / 256;
let ele10 = -10000 + (p10[0] * 256 * 256 + p10[1] * 256 + p10[2]) * 0.1; let ele10 = -32768 + p10[0] * 256 + p10[1] + p10[2] / 256;
let ele11 = -10000 + (p11[0] * 256 * 256 + p11[1] * 256 + p11[2]) * 0.1; let ele11 = -32768 + p11[0] * 256 + p11[1] + p11[2] / 256;
return ( return (
ele00 * (1 - dx) * (1 - dy) + ele00 * (1 - dx) * (1 - dy) +
+3 -6
View File
@@ -235,7 +235,7 @@
}, },
"elevation": { "elevation": {
"button": "Request elevation data", "button": "Request elevation data",
"help": "Requesting elevation data will erase the existing elevation data, if any, and replace it with data from MapTiler.", "help": "Requesting elevation data will erase the existing elevation data, if any, and replace it with data from Mapterhorn.",
"help_no_selection": "Select a file item to request elevation data." "help_no_selection": "Select a file item to request elevation data."
}, },
"waypoint": { "waypoint": {
@@ -304,10 +304,8 @@
"switzerland": "Switzerland", "switzerland": "Switzerland",
"united_kingdom": "United Kingdom", "united_kingdom": "United Kingdom",
"united_states": "United States", "united_states": "United States",
"maptilerStreets": "MapTiler Streets", "topo": "Topo",
"maptilerTopo": "MapTiler Topo", "satellite": "Satellite",
"maptilerOutdoors": "MapTiler Outdoors",
"maptilerSatellite": "MapTiler Satellite",
"esriSatellite": "Esri Satellite", "esriSatellite": "Esri Satellite",
"openStreetMap": "OpenStreetMap", "openStreetMap": "OpenStreetMap",
"openTopoMap": "OpenTopoMap", "openTopoMap": "OpenTopoMap",
@@ -388,7 +386,6 @@
"tram-stop": "Tram Stop", "tram-stop": "Tram Stop",
"bus-stop": "Bus Stop", "bus-stop": "Bus Stop",
"ferry": "Ferry", "ferry": "Ferry",
"maptiler-dem": "MapTiler DEM",
"mapterhorn": "Mapterhorn" "mapterhorn": "Mapterhorn"
} }
}, },
+47 -47
View File
@@ -28,7 +28,7 @@
"undo": "Batalkan", "undo": "Batalkan",
"redo": "Ulangi", "redo": "Ulangi",
"delete": "Hapus", "delete": "Hapus",
"delete_all": "Delete all", "delete_all": "Hapus Semua",
"select_all": "Pilih Semua", "select_all": "Pilih Semua",
"view": "Lihat", "view": "Lihat",
"elevation_profile": "Profil ketinggian", "elevation_profile": "Profil ketinggian",
@@ -36,7 +36,7 @@
"switch_basemap": "Beralih ke peta dasar sebelumnya", "switch_basemap": "Beralih ke peta dasar sebelumnya",
"toggle_overlays": "Beralih lapisan", "toggle_overlays": "Beralih lapisan",
"toggle_3d": "Beralih 3D", "toggle_3d": "Beralih 3D",
"fullscreen": "Full screen", "fullscreen": "Layar Penuh",
"settings": "Pengaturan", "settings": "Pengaturan",
"distance_units": "Satuan jarak", "distance_units": "Satuan jarak",
"metric": "Metrik", "metric": "Metrik",
@@ -64,7 +64,7 @@
"ctrl": "Ctrl", "ctrl": "Ctrl",
"click": "Klik", "click": "Klik",
"drag": "Seret", "drag": "Seret",
"right_click_drag": "Right-click drag", "right_click_drag": "Klik kanan geser",
"metadata": { "metadata": {
"button": "Info...", "button": "Info...",
"name": "Nama", "name": "Nama",
@@ -82,7 +82,7 @@
"center": "Tengah", "center": "Tengah",
"open_in": "Buka di", "open_in": "Buka di",
"copy_coordinates": "Salin koordinat", "copy_coordinates": "Salin koordinat",
"edit_osm": "Edit in OpenStreetMap" "edit_osm": "Ubah di OpenStreetMap"
}, },
"toolbar": { "toolbar": {
"routing": { "routing": {
@@ -192,8 +192,8 @@
"from": "Titik awal terlalu jauh dari jalan terdekat", "from": "Titik awal terlalu jauh dari jalan terdekat",
"via": "Titik via terlalu jauh dari jalan terdekat", "via": "Titik via terlalu jauh dari jalan terdekat",
"to": "Titik akhir terlalu jauh dari jalan terdekat", "to": "Titik akhir terlalu jauh dari jalan terdekat",
"distance": "The end point is too far from the start point", "distance": "Titik akhir terlalu jauh dari jalan terdekat",
"connection": "No connection found between the points", "connection": "Tidak ditemukan koneksi antar titik-titik tersebut",
"timeout": "Perhitungan rute memakan waktu terlalu lama, coba tambahkan titik-titik yang lebih dekat satu sama lain" "timeout": "Perhitungan rute memakan waktu terlalu lama, coba tambahkan titik-titik yang lebih dekat satu sama lain"
} }
}, },
@@ -235,7 +235,7 @@
}, },
"elevation": { "elevation": {
"button": "Minta data elevasi", "button": "Minta data elevasi",
"help": "Requesting elevation data will erase the existing elevation data, if any, and replace it with data from MapTiler.", "help": "Meminta data elevasi akan menghapus data elevasi yang ada, jika ada, dan menggantinya dengan data dari MapTiler.",
"help_no_selection": "Pilih item file untuk meminta data elevasi." "help_no_selection": "Pilih item file untuk meminta data elevasi."
}, },
"waypoint": { "waypoint": {
@@ -277,7 +277,7 @@
"new": "Lapisan kustom baru", "new": "Lapisan kustom baru",
"edit": "Edit lapisan kustom", "edit": "Edit lapisan kustom",
"urls": "URL", "urls": "URL",
"url_placeholder": "WMTS, WMS or MapLibre style JSON", "url_placeholder": "WMTS, WMS, atau JSON style MapLibre",
"max_zoom": "Zoom maksimum", "max_zoom": "Zoom maksimum",
"layer_type": "Tipe lapisan", "layer_type": "Tipe lapisan",
"basemap": "Peta dasar", "basemap": "Peta dasar",
@@ -286,7 +286,7 @@
"update": "Perbarui lapisan" "update": "Perbarui lapisan"
}, },
"opacity": "Opasitas Overlay", "opacity": "Opasitas Overlay",
"terrain": "Terrain source", "terrain": "Sumber medan",
"label": { "label": {
"basemaps": "Peta dasar", "basemaps": "Peta dasar",
"overlays": "Overlay", "overlays": "Overlay",
@@ -363,7 +363,7 @@
"water": "Air", "water": "Air",
"shower": "Mandi", "shower": "Mandi",
"shelter": "Penampungan", "shelter": "Penampungan",
"cemetery": "Cemetery", "cemetery": "Pemakaman",
"motorized": "Mobil dan Motor", "motorized": "Mobil dan Motor",
"fuel-station": "Stasiun bahan bakar", "fuel-station": "Stasiun bahan bakar",
"parking": "Parkir", "parking": "Parkir",
@@ -477,55 +477,55 @@
"shelter": "Penampungan", "shelter": "Penampungan",
"shopping_center": "Pusat Perbelanjaan", "shopping_center": "Pusat Perbelanjaan",
"shower": "Mandi", "shower": "Mandi",
"summit": "Summit", "summit": "Puncak",
"telephone": "Telephone", "telephone": "Telepon",
"tunnel": "Tunnel", "tunnel": "Terowongan",
"water_source": "Water Source" "water_source": "Sumber Air"
} }
}, },
"homepage": { "homepage": {
"website": "Website", "website": "Situs Web",
"home": "Home", "home": "Beranda",
"app": "App", "app": "Aplikasi",
"contact": "Contact", "contact": "Kontak",
"reddit": "Reddit", "reddit": "Reddit",
"facebook": "Facebook", "facebook": "Facebook",
"github": "GitHub", "github": "GitHub",
"crowdin": "Crowdin", "crowdin": "Crowdin",
"email": "Email", "email": "Email",
"contribute": "Contribute", "contribute": "Kontribusi",
"supported_by": "supported by", "supported_by": "didukung oleh",
"features": "Features", "features": "Fitur",
"route_planning": "Route planning", "route_planning": "Perencanaan rute",
"route_planning_description": "An intuitive interface to create itineraries tailored to each sport, based on OpenStreetMap data.", "route_planning_description": "Antarmuka intuitif untuk membuat rencana perjalanan yang disesuaikan dengan setiap olahraga, berdasarkan data OpenStreetMap.",
"file_processing": "Pengolahan file lanjutan", "file_processing": "Pengolahan file lanjutan",
"file_processing_description": "A suite of tools for performing all common file processing tasks, and which can be applied to multiple files at once.", "file_processing_description": "Seperangkat alat untuk melakukan semua tugas pemrosesan file umum, dan yang dapat diterapkan pada banyak file sekaligus.",
"maps": "Global and local maps", "maps": "Peta global dan lokal",
"maps_description": "A large collection of basemaps, overlays and points of interest to help you craft your next outdoor adventure, or visualize your latest achievement.", "maps_description": "Koleksi besar peta dasar, lapisan peta, dan tempat menarik untuk membantu Anda merencanakan petualangan luar ruangan berikutnya, atau memvisualisasikan pencapaian terbaru Anda.",
"data_visualization": "Data visualization", "data_visualization": "Visualisasi data",
"data_visualization_description": "An interactive elevation profile with detailed statistics to analyze recorded activities and future objectives.", "data_visualization_description": "Profil ketinggian interaktif dengan statistik terperinci untuk menganalisis aktivitas yang tercatat dan tujuan di masa mendatang.",
"philosophy": "Philosophy", "philosophy": "Filosofi",
"foss": "Free, ad-free and open source", "foss": "Gratis, tanpa iklan, dan open source",
"foss_description": "The website is free to use, without ads, and the source code is publicly available on GitHub.", "foss_description": "Situs web ini gratis untuk digunakan, tanpa iklan, dan kode sumbernya tersedia untuk umum di GitHub.",
"privacy": "Privacy-friendly", "privacy": "Ramah privasi",
"privacy_description": "Your GPX files never leave your browser. No tracking, no data collection.", "privacy_description": "File GPX Anda tidak pernah meninggalkan browser Anda. Tidak ada pelacakan, tidak ada pengumpulan data.",
"community": "Made possible by the community", "community": "Terwujud berkat komunitas",
"community_description": "gpx.studio has an amazing community that has covered its costs through donations for years, while shaping the project through feature suggestions, bug reports, and translations into many languages.", "community_description": "gpx.studio memiliki komunitas luar biasa yang telah menutupi biaya operasionalnya melalui donasi selama bertahun-tahun, sekaligus membentuk proyek ini melalui saran fitur, laporan bug, dan terjemahan ke dalam banyak bahasa.",
"support_button": "Support gpx.studio on Open Collective", "support_button": "Dukung gpx.studio di Open Collective",
"translate_button": "Help translate the website on Crowdin" "translate_button": "Bantu menerjemahkan situs web di Crowdin"
}, },
"docs": { "docs": {
"translate": "Improve the translation on Crowdin", "translate": "Perbaiki kualitas terjemahan di Crowdin",
"answer_not_found": "Did not find what you were looking for?", "answer_not_found": "Tidak menemukan apa yang Anda cari?",
"ask_on_reddit": "Ask the community on Reddit", "ask_on_reddit": "Tanyakan kepada komunitas di Reddit",
"search": { "search": {
"search": "Search", "search": "Cari",
"clear": "Clear", "clear": "Bersihkan",
"cancel": "Cancel", "cancel": "Batalkan",
"recent": "Recent searches", "recent": "Pencarian terakhir",
"no_recent": "No recent searches", "no_recent": "Tidak Ada Pencarian Baru",
"save": "Save this search", "save": "Simpan pencarian ini",
"remove": "Remove this search from history", "remove": "Hapus pencarian ini dari riwayat",
"favorites": "Favorites", "favorites": "Favorites",
"remove_favorite": "Remove this search from favorites", "remove_favorite": "Remove this search from favorites",
"to_select": "to select", "to_select": "to select",
+1 -1
View File
@@ -401,7 +401,7 @@
"elevation_gain_loss": "Stijging en daling", "elevation_gain_loss": "Stijging en daling",
"temperature": "Temperatuur", "temperature": "Temperatuur",
"speed": "Snelheid", "speed": "Snelheid",
"pace": "Snelheid", "pace": "Tempo",
"heartrate": "Hartslag", "heartrate": "Hartslag",
"cadence": "Cadans", "cadence": "Cadans",
"power": "Kracht", "power": "Kracht",
+4 -4
View File
@@ -36,7 +36,7 @@
"switch_basemap": "Bytt til forrige basekart", "switch_basemap": "Bytt til forrige basekart",
"toggle_overlays": "Vis eller skjul kartlag", "toggle_overlays": "Vis eller skjul kartlag",
"toggle_3d": "Skru av/på 3D", "toggle_3d": "Skru av/på 3D",
"fullscreen": "Full screen", "fullscreen": "Fullskjerm",
"settings": "Innstillinger", "settings": "Innstillinger",
"distance_units": "Avstandsenhet", "distance_units": "Avstandsenhet",
"metric": "Metrisk", "metric": "Metrisk",
@@ -64,7 +64,7 @@
"ctrl": "Ctrl", "ctrl": "Ctrl",
"click": "Klikk", "click": "Klikk",
"drag": "Dra", "drag": "Dra",
"right_click_drag": "Right-click drag", "right_click_drag": "Høyreklikk dra",
"metadata": { "metadata": {
"button": "Informasjon...", "button": "Informasjon...",
"name": "Navn", "name": "Navn",
@@ -192,8 +192,8 @@
"from": "Startpunktet er for langt unna nærmeste vei", "from": "Startpunktet er for langt unna nærmeste vei",
"via": "Via-punktet er for langt fra nærmeste vei", "via": "Via-punktet er for langt fra nærmeste vei",
"to": "Sluttpunktet er for langt unna nærmeste vei", "to": "Sluttpunktet er for langt unna nærmeste vei",
"distance": "The end point is too far from the start point", "distance": "Sluttpunktet er for langt fra startpunktet",
"connection": "No connection found between the points", "connection": "Ingen forbindelse mellom punktene funnet",
"timeout": "Ruteberegning tok for lang tid, prøv å legge til flere punkter" "timeout": "Ruteberegning tok for lang tid, prøv å legge til flere punkter"
} }
}, },
@@ -19,8 +19,8 @@
return; return;
} }
embeddingOptions = getMergedEmbeddingOptions(options); embeddingOptions = getMergedEmbeddingOptions(options);
if (embeddingOptions.key === '' && embeddingOptions.basemap.startsWith('maptiler')) { if (embeddingOptions.key === '' && embeddingOptions.basemap === 'satellite') {
embeddingOptions.basemap = 'openStreetMap'; embeddingOptions.basemap = 'topo';
} }
}); });
</script> </script>
-47
View File
@@ -1,47 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Vrstva_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 812 212" style="enable-background:new 0 0 812 212;" xml:space="preserve">
<style type="text/css">
.st0{fill:#3A1888;}
.st1{fill:#03A1C4;}
.st2{fill:#05D0DF;}
.st3{fill:#761FE8;}
.st4{fill:#FFAA01;}
.st5{fill:#F1175D;}
.st6{fill:#FB3A1B;}
.st7{fill:#FBC935;}
.st8{fill:#FFFFFF;}
</style>
<g>
<path class="st0" d="M94.3,164.2c9.2,9.2,33.8,34.3,33.8,34.3c-0.1,0.2,24.4-24.5,34.2-34.2l-34.1-34.1L94.3,164.2z"/>
<path class="st1" d="M128.3,130.2l34.1,34.1c0.1-0.1,0.1-0.1,0.2-0.2l34-34L162.5,96L128.3,130.2z"/>
<path class="st2" d="M196.6,130.1L196.6,130.1c18.9-18.9,18.9-49.4,0.1-68.3L162.5,96L196.6,130.1z"/>
<path class="st3" d="M94.1,96l-34,34c0,0,0,0,0,0l34.1,34.1c0,0,0,0,0.1,0.1l34-34L94.1,96z"/>
<path class="st4" d="M128.3,61.8L162.5,96l34.2-34.2c0,0,0,0-0.1-0.1l-34.1-34.1c0,0,0,0,0,0L128.3,61.8z"/>
<path class="st5" d="M60,61.9c-18.7,18.9-18.6,49.3,0.1,68.1l34-34L60,61.9z"/>
<path class="st6" d="M128.3,61.8L94.2,27.7l-34,34c-0.1,0.1-0.1,0.1-0.2,0.2L94.1,96L128.3,61.8z"/>
<path class="st7" d="M162.5,27.6c-18.9-18.8-49.4-18.8-68.2,0l-0.1,0.1l34.1,34.1L162.5,27.6z"/>
</g>
<path class="st8" d="M303.8,138.6v-34.9c0-8.6-4.5-16.4-13.3-16.4c-8.7,0-13.9,7.8-13.9,16.4v34.9h-16.1V73.4h14.9l1.2,7.9
c3.4-6.6,11-9,17.2-9c7.8,0,15.6,3.2,19.3,12.2c5.8-9.2,13.3-11.9,21.8-11.9c18.5,0,27.6,11.4,27.6,30.9v35.1h-16.1v-35.1
c0-8.6-3.6-15.9-12.3-15.9c-8.7,0-14.1,7.5-14.1,16.1v34.9H303.8z"/>
<path class="st8" d="M430.5,73.5h15.5v65.1h-15.2l-0.8-9.5c-3.7,7.7-13.9,11.4-21.1,11.5c-19.3,0.1-33.6-11.8-33.6-34.6
c0-22.5,14.9-34.2,34-34.1c8.7,0,17,4.1,20.7,10.6L430.5,73.5z M391.4,106c0,12.4,8.6,19.8,19.3,19.8c25.4,0,25.4-39.5,0-39.5
C399.9,86.3,391.4,93.6,391.4,106z"/>
<path class="st8" d="M459.5,165.8V73.5h15.1l1.1,9c5-7.3,13.7-10.4,21.1-10.4c20.1,0,33.4,14.9,33.4,34.1c0,19-12,34.1-32.9,34.1
c-6.9,0-17-2.1-21.7-9.3v34.9H459.5z M514.1,106.1c0-10.2-6.9-18.5-18.5-18.5c-11.6,0-18.5,8.3-18.5,18.5c0,10.2,7.5,18.5,18.5,18.5
C506.6,124.6,514.1,116.3,514.1,106.1z"/>
<path class="st8" d="M559,53.7v19.7h22.2v5.4H559v39.8c0,8.8,1.9,15.1,12,15.1c3.2,0,6.7-1.1,10-2.6l2.2,5.3
c-4.1,2-8.2,3.3-12.3,3.3c-13.9,0-18.4-8.2-18.4-21V78.8h-13.9v-5.4h13.9v-19L559,53.7z"/>
<path class="st8" d="M604.7,52.1c0,6.9-10.4,6.9-10.4,0C594.3,45.2,604.7,45.2,604.7,52.1z M596.1,73.1v65.5h6.5V73.1H596.1z"/>
<path class="st8" d="M627.6,46.2v92.5h-6.5V46.2H627.6z"/>
<path class="st8" d="M730.2,73.4l0.3,11.6c4.1-8.9,13.3-12.3,21.7-12.3c4.9-0.1,9.6,1.2,14,3.8l-2.9,5.3c-3.4-2.1-7.3-3-11.1-3
c-12.2,0.1-21.5,9.9-21.5,21.8v38h-6.5V73.4H730.2z"/>
<g>
<path class="st8" d="M675.1,134.7c-11.5,0-21.4-7.2-25.5-17.4l0,0l0,0c0,0,0,0,0,0l52.8-14c0,0,0,0,0,0.1l5.6-1.5
c-2.3-16.5-16.2-29.3-33-29.3c-18.4,0-33.3,15.2-33.3,34c0,18.8,14.9,34,33.3,34c13.8,0,25.6-8.5,30.6-20.7l-5.3-2.3
C696.2,127.6,686.4,134.7,675.1,134.7z M647.5,106.6c0-15.5,12.3-28.1,27.5-28.1c11.9,0,22,7.7,25.9,18.5L647.9,111
C647.6,109.5,647.5,108.1,647.5,106.6z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

-45
View File
@@ -1,45 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Vrstva_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 812 212" style="enable-background:new 0 0 812 212;" xml:space="preserve">
<style type="text/css">
.st0{fill:#3A1888;}
.st1{fill:#03A1C4;}
.st2{fill:#05D0DF;}
.st3{fill:#761FE8;}
.st4{fill:#FFAA01;}
.st5{fill:#F1175D;}
.st6{fill:#FB3A1B;}
.st7{fill:#FBC935;}
.st8{fill:#333359;}
</style>
<path class="st0" d="M94.3,164.2c9.2,9.2,33.8,34.3,33.8,34.3c-0.1,0.2,24.4-24.5,34.2-34.2l-34.1-34.1L94.3,164.2z"/>
<path class="st1" d="M128.3,130.2l34.1,34.1c0.1-0.1,0.1-0.1,0.2-0.2l34-34L162.5,96L128.3,130.2z"/>
<path class="st2" d="M196.6,130.1L196.6,130.1c18.9-18.9,18.9-49.4,0.1-68.3L162.5,96L196.6,130.1z"/>
<path class="st3" d="M94.1,96l-34,34c0,0,0,0,0,0l34.1,34.1c0,0,0,0,0.1,0.1l34-34L94.1,96z"/>
<path class="st4" d="M128.3,61.8L162.5,96l34.2-34.2c0,0,0,0-0.1-0.1l-34.1-34.1c0,0,0,0,0,0L128.3,61.8z"/>
<path class="st5" d="M60,61.9c-18.7,18.9-18.6,49.3,0.1,68.1l34-34L60,61.9z"/>
<path class="st6" d="M128.3,61.8L94.2,27.7l-34,34c-0.1,0.1-0.1,0.1-0.2,0.2L94.1,96L128.3,61.8z"/>
<path class="st7" d="M162.5,27.6c-18.9-18.8-49.4-18.8-68.2,0l-0.1,0.1l34.1,34.1L162.5,27.6z"/>
<path class="st8" d="M303.7,138.6v-34.9c0-8.6-4.5-16.4-13.3-16.4c-8.7,0-13.9,7.8-13.9,16.4v34.9h-16.1V73.4h14.9l1.2,7.9
c3.4-6.6,11-9,17.2-9c7.8,0,15.6,3.2,19.3,12.2c5.8-9.2,13.3-11.9,21.8-11.9c18.5,0,27.6,11.4,27.6,30.9v35.1h-16.1v-35.1
c0-8.6-3.6-15.9-12.3-15.9c-8.7,0-14.1,7.5-14.1,16.1v34.9H303.7z"/>
<path class="st8" d="M430.3,73.5h15.5v65.1h-15.2l-0.8-9.5c-3.7,7.7-13.9,11.4-21.1,11.5c-19.3,0.1-33.6-11.8-33.6-34.6
c0-22.5,14.9-34.2,34-34.1c8.7,0,17,4.1,20.7,10.6L430.3,73.5z M391.2,106c0,12.4,8.6,19.8,19.3,19.8c25.4,0,25.4-39.5,0-39.5
C399.8,86.3,391.2,93.6,391.2,106z"/>
<path class="st8" d="M459.4,165.8V73.5h15.1l1.1,9c5-7.3,13.7-10.4,21.1-10.4c20.1,0,33.4,14.9,33.4,34.1c0,19-12,34.1-32.9,34.1
c-6.9,0-17-2.1-21.7-9.3v34.9H459.4z M514,106.1c0-10.2-6.9-18.5-18.5-18.5c-11.6,0-18.5,8.3-18.5,18.5c0,10.2,7.5,18.5,18.5,18.5
C506.4,124.6,514,116.3,514,106.1z"/>
<path class="st8" d="M558.9,53.7v19.7h22.2v5.4h-22.2v39.8c0,8.8,1.9,15.1,12,15.1c3.2,0,6.7-1.1,10-2.6l2.2,5.3
c-4.1,2-8.2,3.3-12.3,3.3c-13.9,0-18.4-8.2-18.4-21V78.8h-13.9v-5.4h13.9v-19L558.9,53.7z"/>
<path class="st8" d="M604.6,52.1c0,6.9-10.4,6.9-10.4,0C594.1,45.2,604.6,45.2,604.6,52.1z M596,73.1v65.5h6.5V73.1H596z"/>
<path class="st8" d="M627.4,46.2v92.5H621V46.2H627.4z"/>
<path class="st8" d="M730.1,73.4l0.3,11.6c4.1-8.9,13.3-12.3,21.7-12.3c4.9-0.1,9.6,1.2,14,3.8l-2.9,5.3c-3.4-2.1-7.3-3-11.1-3
c-12.2,0.1-21.5,9.9-21.5,21.8v38H724V73.4H730.1z"/>
<g>
<path class="st8" d="M674.9,134.7c-11.5,0-21.4-7.2-25.5-17.4l0,0l0,0c0,0,0,0,0,0l52.8-14c0,0,0,0,0,0.1l5.6-1.5
c-2.3-16.5-16.2-29.3-33-29.3c-18.4,0-33.3,15.2-33.3,34c0,18.8,14.9,34,33.3,34c13.8,0,25.6-8.5,30.6-20.7l-5.3-2.3
C696.1,127.6,686.3,134.7,674.9,134.7z M647.4,106.6c0-15.5,12.3-28.1,27.5-28.1c11.9,0,22,7.7,25.9,18.5L647.7,111
C647.5,109.5,647.4,108.1,647.4,106.6z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB