|
|
@@ -1,21 +1,277 @@
|
|
|
<template>
|
|
|
<PageMeta
|
|
|
title="La Sauvagerie - Location de vacances"
|
|
|
- description=""
|
|
|
+ description="Maison de vacances pour 6 personnes à proximité de la mer en Normandie"
|
|
|
/>
|
|
|
|
|
|
+ <div class="rental-container">
|
|
|
+ <!-- Main Image Section -->
|
|
|
+ <div class="main-image-container">
|
|
|
+ <v-img
|
|
|
+ src="/images/photos/IMG_2216.min.JPG"
|
|
|
+ alt="La Sauvagerie - Vue principale"
|
|
|
+ cover
|
|
|
+ eager
|
|
|
+ height="500"
|
|
|
+ class="main-image rounded-lg"
|
|
|
+ :loading="loading"
|
|
|
+ @click="selectImage('/images/photos/IMG_2216.min.png')"
|
|
|
+ @load="onImageLoad"
|
|
|
+ @error="onImageError"
|
|
|
+ style="cursor: pointer;"
|
|
|
+ ></v-img>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- Thumbnails Section -->
|
|
|
+ <div class="thumbnails-container mt-4">
|
|
|
+ <v-row>
|
|
|
+ <v-col v-for="(image, index) in thumbnailImages" :key="index" cols="12" sm="6" md="3">
|
|
|
+ <v-img
|
|
|
+ :src="image.src"
|
|
|
+ :alt="image.alt"
|
|
|
+ height="150"
|
|
|
+ cover
|
|
|
+ eager
|
|
|
+ class="thumbnail rounded-lg"
|
|
|
+ @click="selectImage(image.src)"
|
|
|
+ @load="onImageLoad"
|
|
|
+ @error="onImageError"
|
|
|
+ ></v-img>
|
|
|
+ </v-col>
|
|
|
+ </v-row>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- Description Section -->
|
|
|
+ <div class="description-container mt-8">
|
|
|
+ <h2>Bienvenue à La Sauvagerie</h2>
|
|
|
+ <v-card class="pa-4">
|
|
|
+ <p class="text-body-1">
|
|
|
+ Bienvenue à la Sauvagerie, maison de vacances de 95m², idéale pour des séjours en famille ou entre amis.
|
|
|
+ Située dans un cadre verdoyant et paisible, cette maison offre trois chambres pouvant accueillir jusqu'à six personnes.
|
|
|
+ Profitez de la tranquillité ambiante, et de la proximité d'une voie pédestre et cyclable qui vous mènera facilement
|
|
|
+ aux commerces du bourg à 1,5 km, ou à la plage et la mer à seulement 3 km.
|
|
|
+ </p>
|
|
|
+ </v-card>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- Features Summary Section -->
|
|
|
+ <div class="features-container mt-8">
|
|
|
+ <h2>Caractéristiques</h2>
|
|
|
+ <v-row>
|
|
|
+ <v-col cols="12" md="6">
|
|
|
+ <v-card class="pa-4 h-100">
|
|
|
+ <h3 class="text-h6 mb-4">Informations générales</h3>
|
|
|
+ <ul class="feature-list">
|
|
|
+ <li>Maison de vacances pour 6 personnes</li>
|
|
|
+ <li>Location semaine du samedi au samedi, 700€ la semaine</li>
|
|
|
+ <li>Arrivée entre 17h et 19h, départ avant midi</li>
|
|
|
+ <li>Surface: 95m²</li>
|
|
|
+ <li>2 places de parking</li>
|
|
|
+ </ul>
|
|
|
+ </v-card>
|
|
|
+ </v-col>
|
|
|
+ <v-col cols="12" md="6">
|
|
|
+ <v-card class="pa-4 h-100">
|
|
|
+ <h3 class="text-h6 mb-4">Équipements</h3>
|
|
|
+ <ul class="feature-list">
|
|
|
+ <li>3 chambres (capacité 6 personnes)</li>
|
|
|
+ <li>1 salle de bain avec douche</li>
|
|
|
+ <li>2 WC</li>
|
|
|
+ <li>Salon / cuisine équipée</li>
|
|
|
+ <li>Terrasse en bois fermée de 30m²</li>
|
|
|
+ <li>Électroménager complet (lave-linge, lave-vaisselle, etc.)</li>
|
|
|
+ </ul>
|
|
|
+ </v-card>
|
|
|
+ </v-col>
|
|
|
+ </v-row>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- Location Section -->
|
|
|
+ <div class="location-container mt-8">
|
|
|
+ <h2>Situation</h2>
|
|
|
+ <v-card class="pa-4">
|
|
|
+ <ul class="feature-list">
|
|
|
+ <li>Accès à la mer à 3 km</li>
|
|
|
+ <li>Commerces du bourg à 1,5 km</li>
|
|
|
+ <li>Voie pédestre et cyclable à proximité</li>
|
|
|
+ <li>Cadre verdoyant et paisible</li>
|
|
|
+ </ul>
|
|
|
+ </v-card>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- Contact Section -->
|
|
|
+ <div class="contact-container mt-8">
|
|
|
+ <h2>Contact</h2>
|
|
|
+ <v-card class="pa-4">
|
|
|
+ <Contact />
|
|
|
+ </v-card>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- Image Modal -->
|
|
|
+ <v-dialog v-model="showImageModal" max-width="90vw" content-class="image-modal-dialog">
|
|
|
+ <v-card class="image-modal-card">
|
|
|
+ <v-btn icon class="close-btn" @click="showImageModal = false">
|
|
|
+ <v-icon>fas fa-times</v-icon>
|
|
|
+ </v-btn>
|
|
|
+ <v-card-text class="text-center pa-0">
|
|
|
+ <v-img
|
|
|
+ :src="selectedImageSrc"
|
|
|
+ class="enlarged-image"
|
|
|
+ :loading="loading"
|
|
|
+ cover
|
|
|
+ >
|
|
|
+ <template v-slot:placeholder>
|
|
|
+ <div class="d-flex align-center justify-center" style="height: 300px;">
|
|
|
+ <v-progress-circular indeterminate color="primary"></v-progress-circular>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </v-img>
|
|
|
+ </v-card-text>
|
|
|
+ </v-card>
|
|
|
+ </v-dialog>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
-
|
|
|
import { useDisplay, useTheme } from 'vuetify'
|
|
|
import type { Ref } from '@vue/reactivity'
|
|
|
+import { ref } from 'vue'
|
|
|
|
|
|
const i18n = useI18n()
|
|
|
-
|
|
|
const theme = useTheme()
|
|
|
|
|
|
+// Variables de débogage
|
|
|
+const showDebug = ref(true)
|
|
|
+const loading = ref(true)
|
|
|
+const imageErrors = ref<string[]>([])
|
|
|
+const imagesLoaded = ref<string[]>([])
|
|
|
+
|
|
|
+// Variables for image modal
|
|
|
+const showImageModal = ref(false)
|
|
|
+const selectedImageSrc = ref('')
|
|
|
+
|
|
|
+// List of thumbnail images
|
|
|
+const thumbnailImages = ref([
|
|
|
+ { src: '/images/photos/IMG_2216.min.JPG', alt: 'Vue principale' },
|
|
|
+ { src: '/images/photos/IMG_2217.min.JPG', alt: 'Vue extérieure' },
|
|
|
+ { src: '/images/photos/IMG_2219.min.JPG', alt: 'Intérieur' },
|
|
|
+ { src: '/images/photos/IMG_2220.min.JPG', alt: 'Intérieur' },
|
|
|
+ { src: '/images/photos/IMG_2222.min.JPG', alt: 'Intérieur' },
|
|
|
+ { src: '/images/photos/IMG_2223.min.JPG', alt: 'Intérieur' },
|
|
|
+ { src: '/images/photos/IMG_2224.min.JPG', alt: 'Intérieur' },
|
|
|
+ { src: '/images/photos/IMG_2225.min.JPG', alt: 'Intérieur' },
|
|
|
+])
|
|
|
+
|
|
|
+// Function to select an image and show it in the modal
|
|
|
+const selectImage = (src: string) => {
|
|
|
+ console.log('Selected image:', src)
|
|
|
+ selectedImageSrc.value = src
|
|
|
+ showImageModal.value = true
|
|
|
+}
|
|
|
+
|
|
|
+// Fonctions de débogage
|
|
|
+const onImageLoad = (event: Event) => {
|
|
|
+ const target = event.target as HTMLImageElement
|
|
|
+ console.log('✅ Image chargée:', target.src)
|
|
|
+ imagesLoaded.value.push(target.src)
|
|
|
+ loading.value = false
|
|
|
+}
|
|
|
+
|
|
|
+const onImageError = (event: Event) => {
|
|
|
+ const target = event.target as HTMLImageElement
|
|
|
+ console.error('❌ Erreur image:', target.src)
|
|
|
+ imageErrors.value.push(target.src)
|
|
|
+ loading.value = false
|
|
|
+}
|
|
|
+
|
|
|
+// Masquer le debug après 10 secondes
|
|
|
+setTimeout(() => {
|
|
|
+ showDebug.value = false
|
|
|
+}, 10000)
|
|
|
+
|
|
|
</script>
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
-</style>
|
|
|
+.rental-container {
|
|
|
+ max-width: 1200px;
|
|
|
+ margin: 0 auto;
|
|
|
+}
|
|
|
+
|
|
|
+.main-image {
|
|
|
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
|
|
+ transition: transform 0.3s ease;
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ transform: scale(1.01);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.thumbnail {
|
|
|
+ cursor: pointer;
|
|
|
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
|
+ transition: transform 0.2s ease;
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ transform: scale(1.05);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.feature-list {
|
|
|
+ list-style-type: none;
|
|
|
+ padding-left: 0;
|
|
|
+
|
|
|
+ li {
|
|
|
+ padding: 8px 0;
|
|
|
+ position: relative;
|
|
|
+ padding-left: 24px;
|
|
|
+
|
|
|
+ &:before {
|
|
|
+ content: "•";
|
|
|
+ color: rgb(var(--v-theme-primary));
|
|
|
+ position: absolute;
|
|
|
+ left: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+h2 {
|
|
|
+ color: rgb(var(--v-theme-primary));
|
|
|
+ font-weight: 600;
|
|
|
+}
|
|
|
+
|
|
|
+h3 {
|
|
|
+ color: rgb(var(--v-theme-primary));
|
|
|
+}
|
|
|
+
|
|
|
+.enlarged-image {
|
|
|
+ border-radius: 0;
|
|
|
+ margin: 0 auto;
|
|
|
+ max-height: 90vh;
|
|
|
+ width: auto;
|
|
|
+}
|
|
|
+
|
|
|
+.image-modal-dialog {
|
|
|
+ background: rgba(0, 0, 0, 0.2);
|
|
|
+}
|
|
|
+
|
|
|
+.image-modal-card {
|
|
|
+ background: transparent;
|
|
|
+ box-shadow: none;
|
|
|
+ position: relative;
|
|
|
+ overflow: visible;
|
|
|
+}
|
|
|
+
|
|
|
+.close-btn {
|
|
|
+ position: absolute;
|
|
|
+ top: 10px;
|
|
|
+ right: 10px;
|
|
|
+ z-index: 10;
|
|
|
+ background-color: rgba(0, 0, 0, 0.3);
|
|
|
+ color: white;
|
|
|
+ transition: background-color 0.2s;
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ background-color: rgba(0, 0, 0, 0.5);
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|