Nyavokevin 113573866d
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
english
2025-10-13 19:28:06 +03:00

271 lines
14 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<LandingLayout>
<main class="flex flex-1 justify-center px-4 py-8 sm:px-6 sm:py-12 md:py-16 lg:px-8">
<div class="layout-content-container flex w-full max-w-5xl flex-col">
<!-- Header Section -->
<div class="mb-8 text-center md:mb-12">
<h1 class="mb-2 text-3xl font-black text-white sm:text-4xl md:text-5xl">Votre Lecture</h1>
<p class="mx-auto max-w-2xl text-base text-white/70 sm:text-lg">Voici une analyse détaillée de votre lecture choisie.</p>
</div>
<!-- Loading State -->
<div v-if="loading" class="flex items-center justify-center py-16">
<div class="h-12 w-12 animate-spin rounded-full border-t-2 border-b-2 border-[var(--subtle-gold)]"></div>
</div>
<!-- Error State -->
<div v-else-if="error" class="mb-8 rounded-lg bg-red-50 p-6 text-center">
<div class="mb-2 font-medium text-red-700">Erreur</div>
<p class="text-red-600">{{ error }}</p>
</div>
<!-- Empty State -->
<div v-else-if="!hasCard" class="rounded-lg bg-gray-50 p-8 text-center">
<p class="text-gray-600">Aucune carte n'a été trouvée pour votre session.</p>
</div>
<!-- Single Card Display -->
<div v-else class="mb-8 md:mb-12">
<div
class="relative overflow-hidden rounded-3xl border border-[var(--c-purple)]/30 bg-gradient-to-br from-[var(--card)] to-[var(--card)]/90 p-6 shadow-2xl ring-1 ring-[var(--c-purple)]/40 md:p-10"
>
<!-- Ambient glows -->
<div class="pointer-events-none absolute -top-20 -left-20 h-56 w-56 rounded-full bg-[var(--c-purple)]/25 blur-3xl"></div>
<div class="pointer-events-none absolute -right-20 -bottom-20 h-56 w-56 rounded-full bg-[var(--c-gold)]/20 blur-3xl"></div>
<!-- Card Header -->
<div class="relative z-10 mb-6 text-center">
<h2 class="text-3xl font-black text-white md:text-4xl">{{ card.name }}</h2>
<div v-if="card.orientation" class="mt-2 text-sm text-white/70">
<div v-html="card.orientation === 'reversed' ? 'Inversée' : 'Droite'"></div>
</div>
</div>
<!-- Card Content -->
<div class="relative z-10 p-0 md:p-2">
<!-- Card Image -->
<div class="mb-8 flex justify-center">
<div class="relative h-[420px] w-[280px] overflow-hidden rounded-2xl border border-[var(--c-purple)]/30 shadow-xl">
<img
:src="card.image_url || `/cards/${card.id + 1}.png`"
:alt="card.name"
class="absolute inset-0 h-full w-full rounded-2xl object-cover"
/>
<div
class="absolute inset-x-0 bottom-0 rounded-b-2xl bg-gradient-to-t from-black/80 to-transparent p-4 text-center"
>
<p class="text-sm font-bold text-white">{{ card.name }}</p>
</div>
</div>
</div>
<!-- Descriptions -->
<div v-if="card.description" class="mb-8">
<h3 class="mb-3 text-lg font-black text-white">Description</h3>
<div class="prose prose-invert max-w-none text-white/80" v-html="card.description"></div>
</div>
<div class="mb-8">
<h3 class="mb-3 text-lg font-black text-white">
{{ card.orientation === 'reversed' ? 'Signification Inversée' : 'Signification Droite' }}
</h3>
<div
class="prose prose-invert max-w-none text-white/80"
v-html="card.orientation === 'reversed' ? card.description_reversed : card.description_upright"
></div>
</div>
<div class="mb-6">
<h3 class="mb-3 text-lg font-black text-white">
{{ card.orientation === 'reversed' ? 'Signification Droite' : 'Signification Inversée' }}
</h3>
<div
class="prose prose-invert max-w-none text-white/80"
v-html="card.orientation === 'reversed' ? card.description_upright : card.description_reversed"
></div>
</div>
<!-- Symbolism -->
<div v-if="card.symbolism && Object.keys(card.symbolism).length > 0" class="mb-6">
<h3 class="mb-3 text-lg font-black text-white">Symbolisme</h3>
<ul class="space-y-2 text-white/80">
<li v-for="(value, key) in card.symbolism" :key="key" class="pl-0">
<strong class="text-white">{{ key }}:</strong> {{ value }}
</li>
</ul>
</div>
</div>
</div>
</div>
<!-- Consultation CTA -->
<div
v-if="!loading && !error"
class="relative overflow-hidden rounded-3xl border border-white/10 bg-gradient-to-br from-[var(--c-purple)]/20 to-[var(--c-gold)]/10 p-10 text-center shadow-2xl backdrop-blur-lg md:p-12"
>
<!-- Animated background -->
<div
class="animate-pulse-slow absolute inset-0 bg-gradient-to-r from-[var(--c-purple)]/10 via-transparent to-[var(--c-gold)]/10"
></div>
<div class="pointer-events-none absolute -top-20 -left-20 h-40 w-40 rounded-full bg-[var(--c-purple)]/20 blur-3xl"></div>
<div class="pointer-events-none absolute -right-20 -bottom-20 h-40 w-40 rounded-full bg-[var(--c-gold)]/15 blur-3xl"></div>
<div class="relative z-10">
<!-- En-tête -->
<div class="mb-6 inline-flex items-center gap-2 rounded-full bg-white/10 px-6 py-2 backdrop-blur-sm">
<span class="text-2xl">🔮</span>
<span class="text-lg font-bold text-white">Pathfinder Offer</span>
</div>
<!-- Contenu principal -->
<div class="space-y-6 text-left">
<!-- Introduction -->
<div class="text-center">
<h3 class="mb-4 font-title text-xl font-bold text-white md:text-2xl">Dear Explorer of Symbols,</h3>
<p class="leading-relaxed text-white/80">
These revelations are only a prelude to what we could accomplish in a direct consultation. Because the arcana:
</p>
</div>
<!-- Points clés -->
<div class="space-y-3">
<div class="flex items-start space-x-3">
<span class="mt-1 text-[var(--c-gold)]">•</span>
<p class="text-white/80"><strong>Adapt</strong> to your voice and micro-expressions</p>
</div>
<div class="flex items-start space-x-3">
<span class="mt-1 text-[var(--c-gold)]">•</span>
<p class="text-white/80"><strong>Deepen</strong> through intuitive real-time dialogue</p>
</div>
<div class="flex items-start space-x-3">
<span class="mt-1 text-[var(--c-gold)]">•</span>
<p class="text-white/80"><strong>Transmute</strong> into a tailored action plan</p>
</div>
</div>
<!-- Offre -->
<div class="space-y-4">
<div class="flex items-center space-x-3">
<span class="text-xl text-[var(--c-gold)]">➤</span>
<h4 class="font-title text-lg font-bold text-white">Pathfinder Offer:</h4>
</div>
<p class="text-white/80">Receive an indepth analysis where we will:</p>
<div class="space-y-3 pl-4">
<div class="flex items-start space-x-3">
<span class="mt-1 text-[var(--c-gold)]">1.</span>
<p class="text-white/80">Decode the synchronicities between your reading and the one we'll do together</p>
</div>
<div class="flex items-start space-x-3">
<span class="mt-1 text-[var(--c-gold)]">2.</span>
<p class="text-white/80">Activate the hidden bridges between past, present, and future</p>
</div>
<div class="flex items-start space-x-3">
<span class="mt-1 text-[var(--c-gold)]">3.</span>
<p class="text-white/80">Crystallize a strategic compass for your next choices</p>
</div>
</div>
</div>
</div>
<!-- Bouton CTA et informations -->
<div class="mt-8 space-y-4">
<button
@click="goToBooking"
class="mystic-btn mystic-btn-primary group relative inline-flex h-14 min-w-[220px] items-center justify-center overflow-hidden rounded-full px-8 text-lg font-bold text-white shadow-2xl transition-all duration-300 hover:-translate-y-1"
>
<span class="relative z-10">Book my amplified session here</span>
<span
class="pointer-events-none absolute inset-0 translate-x-[-120%] -skew-x-12 bg-gradient-to-r from-transparent via-white/30 to-transparent transition-transform duration-700 group-hover:translate-x-[120%]"
></span>
</button>
<!-- Informations tarif et durée -->
<div class="space-y-2">
<p class="text-sm font-semibold text-[var(--c-gold)]">Limited to 15 days</p>
<p class="text-lg font-bold text-white">Special rate for digital reading holders: 390</p>
</div>
</div>
</div>
</div>
</div>
</main>
</LandingLayout>
</template>
<script setup lang="ts">
import LandingLayout from '@/layouts/app/LandingLayout.vue';
import { router } from '@inertiajs/vue3';
import axios from 'axios';
import { computed, onMounted, ref } from 'vue';
const goToBooking = () => {
router.visit('/rendez-vous');
};
const card = ref<any>(null);
const error = ref<string | null>(null);
const loading = ref(true);
const params = new URLSearchParams(window.location.search);
const cardId = params.get('id');
const hasCard = computed(() => card.value !== null);
onMounted(async () => {
try {
const response = await axios.get(`/api/get-card/${cardId}`);
card.value = response.data.cards;
} catch (err: any) {
console.error('Card fetch error:', err);
error.value = err.response?.data?.message || 'Failed to get cards from the server. Please contact support.';
} finally {
loading.value = false;
}
});
</script>
<style scoped>
/* Button styles */
.mystic-btn {
position: relative;
overflow: hidden;
transition: all 0.3s ease;
}
.mystic-btn-primary {
background: linear-gradient(135deg, rgba(125, 91, 166, 0.9) 0%, rgba(79, 70, 229, 0.9) 100%);
box-shadow: 0 0 25px rgba(125, 91, 166, 0.7);
}
.mystic-btn-primary:hover {
box-shadow: 0 0 35px rgba(125, 91, 166, 0.9);
}
.mystic-btn-secondary {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.05) 100%);
border: 1px solid rgba(255, 255, 255, 0.2);
backdrop-filter: blur(10px);
}
.mystic-btn-secondary:hover {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.08) 100%);
border-color: rgba(255, 255, 255, 0.3);
}
.mystic-btn::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(45deg, transparent, rgba(255, 255, 255, 0.2), transparent);
transform: translateX(-100%);
transition: transform 0.6s;
z-index: 1;
}
.mystic-btn:hover::before {
transform: translateX(100%);
}
</style>