Skip to content

🔌Leaflet.Donut ​

A Leaflet plugin for drawing circles with an inner radius (donut).

🧩 Available Components ​

🧪 Playground ​

vue
<script setup lang="ts">
import { LMap, LTileLayer } from '@maxel01/vue-leaflet'
import { LDonut } from '@maxel01/vue-leaflet-plugins'
import { ref } from 'vue'

const radius = ref(2000)
const innerRadius = ref(500)
const innerRadiusPercent = ref(0.5)
const innerRadiusAsPercent = ref(false)
</script>

<template>
    <LMap :zoom="12" :center="[47.41322, -1.219482]">
        <LTileLayer
            url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
            layer-type="base"
            name="OpenStreetMap"
        />
        <LDonut
            :lat-lng="[47.41322, -1.219482]"
            :radius="radius"
            :inner-radius="innerRadiusAsPercent ? innerRadiusPercent : innerRadius"
            :inner-radius-as-percent="innerRadiusAsPercent"
        />
    </LMap>
    <aside>
        <label>
            <span>Radius - </span>
            500 <input v-model.number="radius" type="range" min="500" max="3500" /> 3500
        </label>
        <br />
        <label>
            <span>Inner Radius - </span>
            0
            <input
                v-model.number="innerRadius"
                type="range"
                min="0"
                max="1000"
                :disabled="innerRadiusAsPercent"
            />
            1000
        </label>
        <br />
        <label>
            <span>Inner Radius as Percent - </span>
            <input v-model.boolean="innerRadiusAsPercent" type="checkbox" />
        </label>
        <br />
        <label>
            <span>Inner Radius in % - </span>
            0
            <input
                v-model.number="innerRadiusPercent"
                type="range"
                min="0"
                max="1"
                step="0.02"
                :disabled="!innerRadiusAsPercent"
            />
            100
        </label>
    </aside>
</template>

<style>
aside {
    max-width: 600px;
    text-align: center;
    margin: auto;
}

label {
    display: inline-block;
    padding: 0.5em;
}

input {
    vertical-align: text-bottom;
}
</style>