diff --git a/package.json b/package.json index efff382..e79fd5f 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@vue/eslint-config-prettier": "^10.2.0", "@vue/eslint-config-typescript": "^14.6.0", "@vue/tsconfig": "^0.8.1", + "clsx": "^2.1.1", "eslint": "^9.39.2", "eslint-plugin-oxlint": "~1.33.0", "eslint-plugin-vue": "~10.6.2", @@ -44,6 +45,7 @@ "oxlint": "~1.33.0", "prettier": "3.7.4", "sass-embedded": "^1.97.0", + "tailwind-merge": "^3.4.0", "typescript": "~5.9.3", "vite": "npm:rolldown-vite@^7.2.11", "vite-plugin-vue-devtools": "^8.0.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ce425ea..686c944 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -57,6 +57,9 @@ importers: '@vue/tsconfig': specifier: ^0.8.1 version: 0.8.1(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3)) + clsx: + specifier: ^2.1.1 + version: 2.1.1 eslint: specifier: ^9.39.2 version: 9.39.2(jiti@2.6.1) @@ -81,6 +84,9 @@ importers: sass-embedded: specifier: ^1.97.0 version: 1.97.0 + tailwind-merge: + specifier: ^3.4.0 + version: 3.4.0 typescript: specifier: ~5.9.3 version: 5.9.3 @@ -1025,6 +1031,10 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1883,6 +1893,9 @@ packages: resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} engines: {node: ^14.18.0 || >=16.0.0} + tailwind-merge@3.4.0: + resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} + tailwindcss@4.1.18: resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} @@ -2986,6 +2999,8 @@ snapshots: readdirp: 4.1.2 optional: true + clsx@2.1.1: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -3713,6 +3728,8 @@ snapshots: dependencies: '@pkgr/core': 0.2.9 + tailwind-merge@3.4.0: {} + tailwindcss@4.1.18: {} tapable@2.3.0: {} diff --git a/public/map/icons/truck.svg b/public/map/icons/truck.svg new file mode 100644 index 0000000..7738433 --- /dev/null +++ b/public/map/icons/truck.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/App.vue b/src/App.vue index 53330aa..2ed1bfe 100644 --- a/src/App.vue +++ b/src/App.vue @@ -33,7 +33,6 @@ const center = ref([47.809376, -0.637207]) diff --git a/src/components/ReviewMarker.vue b/src/components/ReviewMarker.vue index 5da4f39..94b7c4c 100644 --- a/src/components/ReviewMarker.vue +++ b/src/components/ReviewMarker.vue @@ -3,6 +3,7 @@ import type { ReviewMarker } from '@/models/Markers'; import { LMarker, LPopup, LIcon } from '@vue-leaflet/vue-leaflet' import type { PointTuple } from 'leaflet'; import { computed, ref } from 'vue'; +import { cn } from '@/lib/cn'; defineProps<{ marker: ReviewMarker @@ -25,12 +26,19 @@ const popupOffset = [0, iconSize.value[0] * -0.66] - + + diff --git a/src/lib/cn.ts b/src/lib/cn.ts new file mode 100644 index 0000000..d1d7f94 --- /dev/null +++ b/src/lib/cn.ts @@ -0,0 +1,4 @@ +import { clsx, type ClassValue } from 'clsx' +import { twMerge } from 'tailwind-merge' + +export const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs)) diff --git a/src/models/Markers.ts b/src/models/Markers.ts index c9cd428..ac8dfef 100644 --- a/src/models/Markers.ts +++ b/src/models/Markers.ts @@ -1,7 +1,7 @@ import type { PointTuple } from "leaflet" -export type ReviewType = "restaurant" | "bar" | "bakery" | "tea-shop" | "coffee-shop" | "ice-cream" -export type FoodType = "mixed" | "asian" | "creole" | "vegetarian" | "italian" | "fast-food" | "street-food" | "burgers" | "seafood" | "creperie" | "eastern" +export type ReviewType = "restaurant" | "bar" | "bakery" | "tea-shop" | "coffee-shop" | "ice-cream" | "food-truck" +export type FoodType = "mixed" | "asian" | "creole" | "vegetarian" | "italian" | "fast-food" | "street-food" | "burgers" | "seafood" | "creperie" | "eastern" | "south-american" export interface DefaultMarker { coords: PointTuple @@ -13,6 +13,7 @@ export interface ReviewMarker extends DefaultMarker { food?: FoodType reviews?: Review[] closed?: boolean + url?: string } export interface Review { diff --git a/src/stores/reviews.ts b/src/stores/reviews.ts index 9b3513b..cb2454b 100644 --- a/src/stores/reviews.ts +++ b/src/stores/reviews.ts @@ -486,6 +486,18 @@ const markers: ReviewMarker[] = [ } ] }, + { + title: "Saveurs Afghanes", + coords: [48.110418451272935, -1.6586173600574508], + type: "restaurant", + food: "eastern", + reviews: [ + { + grade: 5.0, + text: "Choquant rapport qualité-prix, cuisine extrêmement bien épicée, saveurs impeccables. Un restaurant à ne rater sous aucun prétexte à Rennes." + } + ] + }, { title: "Fox and Friends", coords: [48.11215429073604, -1.6830048833083207], @@ -1231,7 +1243,8 @@ const markers: ReviewMarker[] = [ food: "eastern", reviews: [ { - grade: 4.4 + grade: 4.5, + text: "Un des meilleurs restaurant de street-food à Rennes, la qualité de la viande de poulet est incroyable. Le personnel est également très gentil." } ] }, @@ -1401,6 +1414,20 @@ const markers: ReviewMarker[] = [ } ] }, + // Food trucks + { + title: "Saveurs d'Argentine", + coords: [48.11820894564772, -1.6038506613892152], + type: "food-truck", + food: "south-american", + url: "https://www.instagram.com/saveursdargentine/", + reviews: [ + { + grade: 4.0, + text: "Les empanadas ont un excellent rapport qualité prix et c'est fait maison." + } + ] + } ] return { markers }