Refactored marker into component
This commit is contained in:
74
src/App.vue
74
src/App.vue
@@ -5,20 +5,17 @@ import 'vue-leaflet-markercluster/dist/style.css'
|
||||
import L, { type PointTuple } from 'leaflet'
|
||||
globalThis.L = L
|
||||
|
||||
import { LMap, LTileLayer, LMarker, LPopup, LIcon, LControlZoom } from '@vue-leaflet/vue-leaflet'
|
||||
import { LMap, LTileLayer, LControlZoom } from '@vue-leaflet/vue-leaflet'
|
||||
import { LMarkerClusterGroup } from 'vue-leaflet-markercluster'
|
||||
import { computed, ref } from 'vue'
|
||||
import { ref } from 'vue'
|
||||
import { useReviewStore } from './stores/reviews'
|
||||
import ReviewMarker from './components/ReviewMarker.vue'
|
||||
|
||||
const { markers } = useReviewStore()
|
||||
|
||||
const zoom = ref(7)
|
||||
const minZoom = 4
|
||||
const center = ref<PointTuple>([47.809376, -0.637207])
|
||||
|
||||
const iconSize = ref<PointTuple>([38, 38])
|
||||
const iconAnchor = computed<PointTuple>(() => [iconSize.value[0] / 2, iconSize.value[1]])
|
||||
const popupOffset = [0, iconSize.value[0] * -0.66]
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -40,66 +37,7 @@ const popupOffset = [0, iconSize.value[0] * -0.66]
|
||||
/>
|
||||
|
||||
<LMarkerClusterGroup :max-cluster-radius="18" :disable-clustering-at-zoom="14">
|
||||
<LMarker v-for="marker in markers" :key="marker.title" :lat-lng="marker.coords">
|
||||
<LPopup :options="{ offset: popupOffset, maxWidth: 380, minWidth: 180 }">
|
||||
<div class="spacing">
|
||||
<h2 class="font-bold text-[1.2em] leading-5">
|
||||
{{ marker.title }}
|
||||
</h2>
|
||||
|
||||
<p v-html="marker.reviews?.[0].text" />
|
||||
</div>
|
||||
</LPopup>
|
||||
|
||||
<LIcon
|
||||
:icon-size
|
||||
:icon-anchor
|
||||
:class-name="marker.closed ? 'grayscale' : ''"
|
||||
>
|
||||
<img v-if="marker.type === 'bar'" src="/map/icons/bar.svg" />
|
||||
<img v-if="marker.type === 'bakery'" src="/map/icons/bakery.svg" />
|
||||
<img v-if="marker.type === 'tea-shop'" src="/map/icons/tea-shop.svg" />
|
||||
<img v-if="marker.type === 'coffee-shop'" src="/map/icons/coffee-shop.svg" />
|
||||
<img v-if="marker.type === 'ice-cream'" src="/map/icons/ice-cream.svg" />
|
||||
|
||||
<template v-else-if="marker.type === 'restaurant'">
|
||||
<img v-if="marker.food === 'asian'" src="/map/icons/asian.svg" />
|
||||
<img v-else-if="marker.food === 'burgers'" src="/map/icons/burgers.svg" />
|
||||
<!-- <img v-else-if="marker.food === 'creperie'" src="/map/icons/creperie.svg" /> -->
|
||||
<!-- <img v-else-if="marker.food === 'eastern'" src="/map/icons/eastern.svg" /> -->
|
||||
<img v-else-if="marker.food === 'fast-food'" src="/map/icons/fast-food.svg" />
|
||||
<img v-else-if="marker.food === 'italian'" src="/map/icons/italian.svg" />
|
||||
<img v-else-if="marker.food === 'seafood'" src="/map/icons/seafood.svg" />
|
||||
<!-- <img v-else-if="marker.food === 'street-food'" src="/map/icons/street-food.svg" /> -->
|
||||
<img v-else-if="marker.food === 'vegetarian'" src="/map/icons/vegetarian.svg" />
|
||||
<img v-else src="/map/icons/restaurant.svg" />
|
||||
</template>
|
||||
|
||||
<div
|
||||
class="absolute -top-2 -right-2 size-5 text-center grid place-items-center rounded-full text-[0.65rem] font-bold tracking-[-0.075em]"
|
||||
:class="{
|
||||
'text-white bg-red-500': marker.reviews?.[0].grade! <= 1.5,
|
||||
'text-black bg-amber-400': marker.reviews?.[0].grade! > 1.5 && marker.reviews?.[0].grade! <= 2.5,
|
||||
'text-black bg-lime-400': marker.reviews?.[0].grade! > 2.5 && marker.reviews?.[0].grade! < 4.0,
|
||||
'text-black bg-green-400': marker.reviews?.[0].grade! > 2.5 && marker.reviews?.[0].grade! < 4.7,
|
||||
'text-black bg-sky-400': marker.reviews?.[0].grade! >= 4.7
|
||||
}"
|
||||
>
|
||||
{{ marker.reviews?.[0].grade }}
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="absolute -z-10 -inset-0.5 rounded-full"
|
||||
:class="{
|
||||
'bg-red-500': marker.reviews?.[0].grade! <= 1.5,
|
||||
'bg-amber-400': marker.reviews?.[0].grade! > 1.5 && marker.reviews?.[0].grade! <= 2.5,
|
||||
'bg-lime-400': marker.reviews?.[0].grade! > 2.5 && marker.reviews?.[0].grade! < 4.0,
|
||||
'bg-green-400': marker.reviews?.[0].grade! > 2.5 && marker.reviews?.[0].grade! < 4.7,
|
||||
'bg-sky-400': marker.reviews?.[0].grade! >= 4.7
|
||||
}"
|
||||
/>
|
||||
</LIcon>
|
||||
</LMarker>
|
||||
<ReviewMarker v-once v-for="marker in markers" :key="marker.title" :marker />
|
||||
</LMarkerClusterGroup>
|
||||
</LMap>
|
||||
</main>
|
||||
@@ -128,6 +66,10 @@ main {
|
||||
}
|
||||
}
|
||||
|
||||
.marker-cluster span {
|
||||
font-weight: var(--font-weight-medium);
|
||||
}
|
||||
|
||||
.marker-cluster-small {
|
||||
background-color: color-mix(in srgb, var(--color-green-500) 25%, transparent);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user