map
A mapboxgl wrapper.
const pickStyle = preview.querySelector('select')
const mapbox = preview.querySelector('tosi-map')
const here = preview.querySelector('button')
pickStyle.addEventListener('change', () => {
mapbox.mapStyle = pickStyle.value
})
function getUserGPSCoordinates() {
return new Promise((resolve) => {
// Check if geolocation is supported
if (!navigator.geolocation) {
console.log("Geolocation is not supported by this browser.");
resolve(null);
return;
}
// Request position with options
navigator.geolocation.getCurrentPosition(
// Success callback
(position) => {
resolve({
latitude: position.coords.latitude,
longitude: position.coords.longitude
});
},
// Error callback
(error) => {
console.log(`Error getting location: ${error.message}`);
resolve(null);
},
// Options
{
enableHighAccuracy: true, // Request high accuracy if available
timeout: 10000, // Time to wait for position (10 seconds)
maximumAge: 0 // Don't use cached position
}
);
});
}
here.addEventListener('click', async () => {
const location = await getUserGPSCoordinates()
if (location) {
mapbox.coords = `${location.latitude},${location.longitude},12`
}
})
<!-- please don't abuse my mapbox token -->
<tosi-map
style="width: 100%; height: 100%"
coords="14.0093606,120.995083,17"
token="pk.eyJ1IjoicG9kcGVyc29uIiwiYSI6ImNqc2JlbWU0bjA1ZmY0YW5ycHZod3VhbWcifQ.arvqfpOqMgFYkKgQ35UScA"
map-style="mapbox://styles/mapbox/streets-v12"
></tosi-map>
<select>
<option selected value="mapbox://styles/mapbox/streets-v12">Streets</option>
<option value="mapbox://styles/mapbox/satellite-v9">Satellite</option>
<option value="mapbox://styles/mapbox/light-v11">Light</option>
<option value="mapbox://styles/mapbox/dark-v11">Dark</option>
<option value="mapbox://styles/mapbox/outdoors-v12">Outdoors</option>
</select>
<button>
<tosi-icon icon="mapPin"></tosi-icon>
<span>Your Location</span>
</button>
.preview button {
position: absolute;
right: 10px;
top: 10px;
display: flex;
align-items: center;
gap: 5px;
}
.preview select {
position: absolute;
bottom: 10px;
right: 10px;
}
There's no need to learn new APIs or write wrappers, just access the element's map property
and use the standard mapbox APIs directly.
Form Integration
<tosi-map> is form-associated, making it useful as a location picker in forms:
<form class="map-form">
<label>
<b>Select your location:</b>
<tosi-map
name="location"
style="width: 100%; height: 200px"
coords="40.7128,-74.0060,10"
token="pk.eyJ1IjoicG9kcGVyc29uIiwiYSI6ImNqc2JlbWU0bjA1ZmY0YW5ycHZod3VhbWcifQ.arvqfpOqMgFYkKgQ35UScA"
></tosi-map>
</label>
<button type="submit">Submit Location</button>
<button type="reset">Reset</button>
<span class="output"></span>
</form>
.preview .map-form {
display: flex;
flex-direction: column;
gap: 10px;
}
.preview .map-form label {
display: flex;
flex-direction: column;
gap: 5px;
}
const form = preview.querySelector('.map-form')
form.addEventListener('submit', (e) => {
e.preventDefault()
const data = new FormData(form)
form.querySelector('.output').textContent = 'Location: ' + data.get('location')
})