Skip to content

Svelte 5 Quickstart

Install

bash
npm install maplibre-gl

Component

svelte
<script>
  import { onMount } from 'svelte';
  import maplibregl from 'maplibre-gl';
  import 'maplibre-gl/dist/maplibre-gl.css';

  let el;
  let map;

  onMount(() => {
    map = new maplibregl.Map({
      container: el,
      style: `https://api.mapsfordevs.com/styles/standard.json?key=${import.meta.env.VITE_MFD_PUB_KEY}`,
      center: [28.04, -26.20],
      zoom: 11
    });
    return () => map.remove();
  });
</script>

<div bind:this={el} class="w-full h-screen"></div>

Reusable wrapper

svelte
<!-- MapLibreMap.svelte -->
<script>
  import { onMount } from 'svelte';
  import maplibregl from 'maplibre-gl';

  let { styleUrl, center = [0, 0], zoom = 2, oninit } = $props();
  let el;
  let map;

  onMount(() => {
    map = new maplibregl.Map({ container: el, style: styleUrl, center, zoom });
    oninit?.(map);
    return () => map.remove();
  });
</script>

<div bind:this={el} class="w-full h-full"></div>

Usage:

svelte
<script>
  import MapLibreMap from './MapLibreMap.svelte';

  const STYLE = `https://api.mapsfordevs.com/styles/standard.json?key=${import.meta.env.VITE_MFD_PUB_KEY}`;

  function handleInit(map) {
    new maplibregl.Marker().setLngLat([28.04, -26.20]).addTo(map);
  }
</script>

<MapLibreMap styleUrl={STYLE} center={[28.04, -26.20]} zoom={11} oninit={handleInit} />

Language switcher with rune state

svelte
<script>
  let lang = $state('en');

  $effect(() => {
    if (!map || !map.isStyleLoaded()) return;
    ['place_label', 'transportation_name', 'poi_label'].forEach(layer => {
      map.setLayoutProperty(layer, 'text-field', [
        'coalesce',
        ['get', `name:${lang}`],
        ['get', 'name:latin'],
        ['get', 'name']
      ]);
    });
  });
</script>

<select bind:value={lang}>
  <option value="en">English</option>
  <option value="de">Deutsch</option>
  <option value="ja">日本語</option>
</select>

SvelteKit SSR

MapLibre is browser-only. Wrap in {#if browser}:

svelte
<script>
  import { browser } from '$app/environment';
</script>

{#if browser}
  <MapLibreMap ... />
{/if}

Or use onMount (only runs on client) — recommended approach above.