fix result card
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled

This commit is contained in:
Nyavokevin 2025-09-23 18:43:33 +03:00
parent 1fdc43efe9
commit cf89535c14
3 changed files with 371 additions and 104 deletions

View File

@ -1,37 +1,72 @@
<template>
<div
class="border-linen flex flex-col items-center gap-6 md:gap-8 rounded-lg border bg-white p-6 md:p-8 shadow-sm transition-all duration-300 hover:shadow-md md:flex-row"
class="flex flex-col items-center gap-6 md:gap-8 rounded-2xl bg-gradient-to-br from-purple-900/40 to-purple-800/30 border border-purple-700/30 p-6 md:p-8 shadow-2xl transition-all duration-500 hover:shadow-3xl md:flex-row backdrop-blur-sm hover:border-purple-600/50 group"
>
<!-- Card Image -->
<!-- Card Image Container -->
<div class="relative">
<!-- Card Image with Glow Effect -->
<div
class="h-56 w-36 sm:h-64 sm:w-40 md:h-72 md:w-48 flex-shrink-0 rounded-md bg-cover bg-center bg-no-repeat transition-transform duration-300 hover:scale-105"
class="h-56 w-36 sm:h-64 sm:w-40 md:h-72 md:w-48 flex-shrink-0 rounded-xl bg-cover bg-center bg-no-repeat transition-all duration-500 group-hover:scale-105 relative overflow-hidden"
:style="{
'background-image': `url(/cards/${cardNumber + 1}.png)`,
'box-shadow': '0 0 15px 5px rgba(215, 186, 141, 0.3)',
'background-image': `url(${imageUrl || '/cards/' + (cardNumber + 1) + '.png'})`,
transform: orientation === 'reversed' ? 'rotate(180deg)' : 'none'
}"
>
<!-- Gradient Overlay -->
<div class="absolute inset-0 bg-gradient-to-br from-transparent via-purple-900/10 to-purple-900/20 rounded-xl"></div>
<!-- Glow Effect -->
<div
class="absolute inset-0 rounded-xl opacity-0 group-hover:opacity-100 transition-opacity duration-500"
:style="{
'box-shadow': orientation === 'reversed'
? '0 0 30px 10px rgba(239, 68, 68, 0.4)'
: '0 0 30px 10px rgba(168, 85, 247, 0.4)'
}"
></div>
</div>
<!-- Orientation Badge -->
<div
v-if="orientation === 'reversed'"
class="absolute top-2 right-2 bg-red-100 text-red-800 text-xs px-2 py-1 rounded-full"
class="absolute top-3 right-3 bg-gradient-to-r from-red-600 to-red-700 text-red-100 text-xs font-semibold px-3 py-1.5 rounded-full border border-red-500/30 shadow-lg"
>
Inversée
</div>
<div
v-else
class="absolute top-3 right-3 bg-gradient-to-r from-purple-600 to-purple-700 text-purple-100 text-xs font-semibold px-3 py-1.5 rounded-full border border-purple-500/30 shadow-lg"
>
Droite
</div>
<!-- Card Number Badge -->
<div class="absolute -bottom-2 -left-2 bg-gradient-to-r from-purple-700 to-indigo-700 text-purple-100 text-sm font-bold w-10 h-10 rounded-full flex items-center justify-center border-2 border-purple-900/50 shadow-lg">
{{ cardNumber }}
</div>
</div>
<!-- Card Content -->
<div class="flex flex-col gap-3 text-center md:text-left">
<p class="text-spiritual-earth text-xs sm:text-sm tracking-widest uppercase font-semibold">
Carte {{ cardNumber }}
<div class="flex flex-col gap-4 text-center md:text-left flex-1">
<!-- Card Number -->
<p class="text-purple-300/70 text-xs sm:text-sm tracking-widest uppercase font-semibold">
Carte #{{ cardNumber }}
</p>
<h3 class="text-midnight-blue text-xl sm:text-2xl font-bold leading-tight">
<!-- Card Name -->
<h3 class="text-2xl sm:text-3xl font-black bg-gradient-to-r from-purple-200 to-purple-100 bg-clip-text text-transparent leading-tight">
{{ name }}
</h3>
<div class="text-midnight-blue/80 text-sm sm:text-base leading-relaxed" v-html="description">
<!-- Description -->
<div class="text-purple-300/90 text-base sm:text-lg leading-relaxed font-medium" v-html="description"></div>
<!-- Decorative Divider -->
<div class="w-16 h-0.5 bg-gradient-to-r from-purple-600 to-transparent rounded-full mt-2 mx-auto md:mx-0"></div>
</div>
</div>
<!-- Hover Effect Background -->
<div class="absolute inset-0 bg-gradient-to-r from-transparent via-purple-900/5 to-transparent opacity-0 group-hover:opacity-100 rounded-2xl transition-opacity duration-500 pointer-events-none"></div>
</div>
</template>
@ -49,17 +84,50 @@ defineProps<Props>();
<style scoped>
div {
animation: slideUp 0.5s ease-out;
animation: cardAppear 0.6s ease-out;
}
@keyframes slideUp {
@keyframes cardAppear {
from {
opacity: 0;
transform: translateY(15px);
transform: translateY(20px) scale(0.95);
}
to {
opacity: 1;
transform: translateY(0);
transform: translateY(0) scale(1);
}
}
/* Custom shadow for hover effect */
.shadow-3xl {
box-shadow:
0 25px 50px -12px rgba(0, 0, 0, 0.5),
0 0 30px rgba(168, 85, 247, 0.3);
}
/* Smooth transitions for all interactive elements */
* {
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 300ms;
}
/* Custom scrollbar for description */
.text-base::-webkit-scrollbar {
width: 4px;
}
.text-base::-webkit-scrollbar-track {
background: rgba(168, 85, 247, 0.1);
border-radius: 2px;
}
.text-base::-webkit-scrollbar-thumb {
background: rgba(168, 85, 247, 0.4);
border-radius: 2px;
}
.text-base::-webkit-scrollbar-thumb:hover {
background: rgba(168, 85, 247, 0.6);
}
</style>

View File

@ -31,14 +31,18 @@ onMounted(() => {
class="fixed top-0 z-50 w-full transition-all duration-300"
:class="isScrolled ? 'bg-black/90 py-2 shadow-xl backdrop-blur-md' : 'bg-transparent py-4'"
>
<div class="container mx-auto px-4">
<div class="flex items-center justify-between px-6 py-2 whitespace-nowrap">
<div class="container mx-auto px-4 sm:px-6">
<div class="flex items-center justify-between px-2 py-2 whitespace-nowrap sm:px-6">
<div class="flex items-center gap-3">
<img src="/logo-success.webp" alt="Logo" class="h-12 w-30 transition-transform duration-300 hover:scale-105" />
<img
src="/logo-success.webp"
alt="Logo"
class="h-10 w-24 transition-transform duration-300 hover:scale-105 sm:h-12 sm:w-30"
/>
</div>
<nav class="hidden items-center gap-8 md:flex">
<nav class="hidden items-center gap-4 md:flex lg:gap-8">
<Link
class="group/nav-link relative text-sm font-medium text-white transition-all duration-300 hover:text-[var(--c-gold)]"
class="group/nav-link relative px-2 py-1 text-sm font-medium text-white transition-all duration-300 hover:text-[var(--c-gold)]"
href="/"
>
Accueil
@ -47,7 +51,7 @@ onMounted(() => {
></span>
</Link>
<Link
class="group/nav-link relative text-sm font-medium text-white transition-all duration-300 hover:text-[var(--c-gold)]"
class="group/nav-link relative px-2 py-1 text-sm font-medium text-white transition-all duration-300 hover:text-[var(--c-gold)]"
href="/tirage"
>
Tirages
@ -56,7 +60,7 @@ onMounted(() => {
></span>
</Link>
<Link
class="group/nav-link relative text-sm font-medium text-white transition-all duration-300 hover:text-[var(--c-gold)]"
class="group/nav-link relative px-2 py-1 text-sm font-medium text-white transition-all duration-300 hover:text-[var(--c-gold)]"
href="/"
>
Témoignages
@ -65,17 +69,17 @@ onMounted(() => {
></span>
</Link>
</nav>
<div class="flex items-center gap-4">
<div class="flex items-center gap-2 sm:gap-4">
<button
class="mystic-btn mystic-btn-primary group relative inline-flex h-10 min-w-[160px] cursor-pointer items-center justify-center overflow-hidden rounded-full px-6 text-sm font-bold text-white shadow-lg transition-all duration-300 hover:-translate-y-0.5"
class="mystic-btn mystic-btn-primary group relative hidden h-10 min-w-[160px] cursor-pointer items-center justify-center overflow-hidden rounded-full px-4 text-sm font-bold text-white shadow-lg transition-all duration-300 hover:-translate-y-0.5 sm:inline-flex sm:px-6"
@click="goToBooking"
>
<span class="relative z-10 truncate">Réserver une Session</span>
<span class="relative z-10 truncate">Réserver</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>
<button class="text-white transition-colors hover:text-[var(--c-gold)] md:hidden" @click="toggleMobileMenu">
<button class="p-2 text-white transition-colors hover:text-[var(--c-gold)] md:hidden" @click="toggleMobileMenu">
<svg class="h-6 w-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path>
</svg>
@ -88,80 +92,80 @@ onMounted(() => {
<!-- Enhanced Mobile Menu -->
<div v-if="isMobileMenuOpen" class="fixed inset-0 z-40 bg-black/80 backdrop-blur-sm md:hidden" @click="toggleMobileMenu">
<div
class="absolute top-0 right-0 h-full w-3/4 bg-gradient-to-b from-[var(--c-purple)] to-[var(--c-deep-navy)] p-6 shadow-2xl"
class="absolute top-0 right-0 h-full w-full max-w-sm bg-gradient-to-b from-[var(--c-purple)] to-[var(--c-deep-navy)] p-6 shadow-2xl"
@click.stop
>
<div class="mb-8 flex items-center justify-between">
<img src="/logo-success.webp" alt="Logo" class="h-10 w-24" />
<button @click="toggleMobileMenu" class="text-white">
<button @click="toggleMobileMenu" class="p-2 text-white">
<svg class="h-6 w-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
</svg>
</button>
</div>
<nav class="flex flex-col gap-6">
<nav class="flex flex-col gap-4">
<Link
class="border-b border-white/10 py-2 text-lg font-medium text-white transition-colors duration-300 hover:text-[var(--c-gold)]"
class="border-b border-white/10 py-4 text-lg font-medium text-white transition-colors duration-300 hover:text-[var(--c-gold)]"
href="/"
@click="toggleMobileMenu"
>Accueil</Link
>
<Link
class="border-b border-white/10 py-2 text-lg font-medium text-white transition-colors duration-300 hover:text-[var(--c-gold)]"
class="border-b border-white/10 py-4 text-lg font-medium text-white transition-colors duration-300 hover:text-[var(--c-gold)]"
href="/tirage"
@click="toggleMobileMenu"
>Tirages</Link
>
<Link
class="border-b border-white/10 py-2 text-lg font-medium text-white transition-colors duration-300 hover:text-[var(--c-gold)]"
class="border-b border-white/10 py-4 text-lg font-medium text-white transition-colors duration-300 hover:text-[var(--c-gold)]"
href="/"
@click="toggleMobileMenu"
>Témoignages</Link
>
<button
class="mystic-btn mystic-btn-primary group relative mt-4 inline-flex h-12 w-full items-center justify-center overflow-hidden rounded-full px-6 text-sm font-bold text-white shadow-lg transition-all duration-300"
class="mystic-btn mystic-btn-primary group relative mt-8 inline-flex h-12 w-full items-center justify-center overflow-hidden rounded-full px-6 text-base font-bold text-white shadow-lg transition-all duration-300"
@click="
goToBooking;
goToBooking();
toggleMobileMenu();
"
>
<span class="relative z-10 truncate">Réserver une Session</span>
<span class="relative z-10">Réserver une Session</span>
</button>
</nav>
</div>
</div>
<main class="relative flex min-h-screen w-full flex-col items-center pt-20">
<main class="relative flex min-h-screen w-full flex-col items-center pt-16 sm:pt-20">
<slot />
</main>
<!-- Enhanced Footer -->
<footer class="relative border-t border-white/10 bg-gradient-to-t from-black to-[var(--c-deep-navy)] text-white">
<div class="absolute inset-x-0 top-0 h-0.5 bg-gradient-to-r from-transparent via-[var(--c-gold)] to-transparent"></div>
<div class="mx-auto max-w-7xl px-6 py-14">
<div class="grid gap-10 md:grid-cols-3">
<div class="mx-auto max-w-7xl px-4 py-8 sm:px-6 sm:py-14">
<div class="grid gap-8 md:grid-cols-3 lg:gap-10">
<!-- Brand + tagline -->
<div>
<div class="md:col-span-1">
<div class="flex items-center gap-3">
<img src="/logo-success.webp" alt="Logo" class="h-12 w-30" />
<img src="/logo-success.webp" alt="Logo" class="h-10 w-24 sm:h-12 sm:w-30" />
</div>
<p class="mt-4 max-w-sm text-sm text-white/70">
<p class="mt-4 max-w-sm text-sm leading-relaxed text-white/70">
Guidance et clarté à travers des tirages inspirés et un accompagnement personnalisé.
</p>
<div class="mt-6 flex gap-4">
<div class="mt-6 flex gap-3">
<a class="social-icon group" href="#" aria-label="Instagram">
<svg class="h-6 w-6" fill="currentColor" viewBox="0 0 256 256">
<svg class="h-5 w-5 sm:h-6 sm:w-6" fill="currentColor" viewBox="0 0 256 256">
<rect x="32" y="32" width="192" height="192" rx="48"></rect>
<circle cx="128" cy="128" r="40" fill="black"></circle>
</svg>
</a>
<a class="social-icon group" href="#" aria-label="Facebook">
<svg class="h-6 w-6" fill="currentColor" viewBox="0 0 256 256">
<svg class="h-5 w-5 sm:h-6 sm:w-6" fill="currentColor" viewBox="0 0 256 256">
<path d="M176 24h-32a56 56 0 0 0-56 56v24H64v32h24v96h32v-96h32l8-32h-40V80a16 16 0 0 1 16-16h32Z"></path>
</svg>
</a>
<a class="social-icon group" href="#" aria-label="X">
<svg class="h-6 w-6" fill="currentColor" viewBox="0 0 256 256">
<svg class="h-5 w-5 sm:h-6 sm:w-6" fill="currentColor" viewBox="0 0 256 256">
<path
d="M152.23,116.19l62.51-78.85H184.2l-38.79,49-30.06-49H80.2l43.9,70.44L60.44,218.66H99l42.31-53.56,32.63,53.56h35.09Z"
></path>
@ -171,10 +175,10 @@ onMounted(() => {
</div>
<!-- Quick links -->
<div class="grid grid-cols-2 gap-8 md:grid-cols-2">
<div class="grid grid-cols-2 gap-6 sm:gap-8 md:col-span-1 md:grid-cols-2">
<div>
<h4 class="mb-4 text-lg font-bold tracking-wider text-white">Navigation</h4>
<ul class="space-y-3 text-sm">
<h4 class="mb-4 text-base font-bold tracking-wider text-white sm:text-lg">Navigation</h4>
<ul class="space-y-2 text-sm sm:space-y-3">
<li>
<Link class="footer-link group" href="/">Accueil</Link>
</li>
@ -190,23 +194,27 @@ onMounted(() => {
</ul>
</div>
<div>
<h4 class="mb-4 text-lg font-bold tracking-wider text-white">Légal</h4>
<ul class="space-y-3 text-sm">
<h4 class="mb-4 text-base font-bold tracking-wider text-white sm:text-lg">Légal</h4>
<ul class="space-y-2 text-sm sm:space-y-3">
<li>
<Link class="footer-link group" href="/politique-confidalite">Politique de Confidentialité</Link>
<Link class="footer-link group" href="/politique-confidalite">Confidentialité</Link>
</li>
<li>
<Link class="footer-link group" href="/term-condition">Conditions d'Utilisation</Link>
<Link class="footer-link group" href="/term-condition">Conditions</Link>
</li>
</ul>
</div>
</div>
<!-- Newsletter -->
<div>
<h4 class="mb-4 text-lg font-bold tracking-wider text-white">Newsletter</h4>
<p class="mb-4 text-sm text-white/70">Recevez des inspirations et offres directement dans votre boîte mail.</p>
<form class="mt-2 flex max-w-md overflow-hidden rounded-full border border-white/20 bg-white/5 backdrop-blur-sm">
<div class="md:col-span-1 lg:col-span-1">
<h4 class="mb-4 text-base font-bold tracking-wider text-white sm:text-lg">Newsletter</h4>
<p class="mb-4 text-sm leading-relaxed text-white/70">
Recevez des inspirations et offres directement dans votre boîte mail.
</p>
<form
class="mt-2 flex max-w-md flex-col gap-2 overflow-hidden rounded-full border border-white/20 bg-white/5 backdrop-blur-sm sm:flex-row"
>
<input
type="email"
placeholder="Votre e-mail"
@ -214,7 +222,7 @@ onMounted(() => {
/>
<button
type="button"
class="mystic-btn mystic-btn-secondary px-4 text-sm font-bold whitespace-nowrap text-white transition-all"
class="mystic-btn mystic-btn-secondary min-w-[120px] px-4 py-3 text-sm font-bold whitespace-nowrap text-white transition-all"
>
S'abonner
</button>
@ -222,7 +230,7 @@ onMounted(() => {
</div>
</div>
<div class="mt-12 border-t border-white/10 pt-6 text-center text-xs text-white/60 sm:text-sm">
<div class="mt-8 border-t border-white/10 pt-6 text-center text-xs text-white/60 sm:mt-12 sm:text-sm">
© 2024 Kris Saint Ange. Tous droits réservés.
</div>
</div>
@ -283,8 +291,8 @@ onMounted(() => {
display: flex;
align-items: center;
justify-content: center;
width: 40px;
height: 40px;
width: 36px;
height: 36px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.1);
transition: all 0.3s ease;
@ -301,11 +309,13 @@ onMounted(() => {
position: relative;
color: rgba(255, 255, 255, 0.7);
transition: all 0.3s ease;
display: inline-block;
padding: 4px 0;
}
.footer-link:hover {
color: #ffd700;
padding-left: 8px;
padding-left: 12px;
}
.footer-link::before {
@ -367,4 +377,48 @@ header {
input:focus {
box-shadow: 0 0 0 2px rgba(125, 91, 166, 0.5);
}
/* Responsive improvements */
@media (max-width: 768px) {
.container {
padding-left: 1rem;
padding-right: 1rem;
}
/* Better touch targets for mobile */
button,
a {
min-height: 44px;
min-width: 44px;
}
/* Improve mobile menu spacing */
.fixed .absolute {
width: 85%;
max-width: 320px;
}
}
@media (max-width: 640px) {
/* Stack footer columns on very small screens */
footer .grid {
grid-template-columns: 1fr;
gap: 2rem;
}
/* Center align footer content on mobile */
footer .md\\:col-span-1 {
text-align: center;
}
footer .flex {
justify-content: center;
}
}
/* Prevent horizontal scroll */
html,
body {
overflow-x: hidden;
}
</style>

View File

@ -44,41 +44,81 @@ onMounted(async () => {
<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-4xl flex-col">
<main class="min-h-screen bg-gradient-to-br py-8">
<div class="container mx-auto max-w-6xl px-4 sm:px-6 lg:px-8">
<!-- Header Section -->
<div class="mb-8 text-center md:mb-12">
<h1 class="text-midnight-blue mb-2 text-3xl font-bold sm:text-4xl md:text-5xl">Votre Lecture</h1>
<p class="text-spiritual-earth mx-auto max-w-2xl text-base sm:text-lg">
Voici une analyse détaillée de votre lecture choisie. Veuillez vérifier avant de procéder au paiement.
<div class="mt-10 mb-12 text-center md:mb-16">
<h1
class="mb-4 bg-gradient-to-r from-purple-300 via-purple-200 to-purple-100 bg-clip-text text-4xl font-black text-transparent md:text-5xl lg:text-6xl"
>
Votre Lecture Spirituelle
</h1>
<p class="mx-auto max-w-3xl text-lg leading-relaxed text-purple-300/80 md:text-xl">
Découvrez les messages que l'univers a préparés pour vous. Cette analyse détaillée vous guidera sur votre chemin.
</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 v-if="loading" class="flex flex-col items-center justify-center py-20">
<div class="relative">
<div class="h-16 w-16 animate-spin rounded-full border-4 border-purple-700/30"></div>
<div
class="absolute top-1/2 left-1/2 h-8 w-8 -translate-x-1/2 -translate-y-1/2 transform animate-pulse rounded-full bg-gradient-to-r from-purple-400 to-purple-300"
></div>
</div>
<p class="mt-6 font-medium text-purple-300/80">Chargement de votre lecture...</p>
</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>
<button @click="$router.back()" class="mt-4 rounded-md bg-red-600 px-4 py-2 text-white transition-colors hover:bg-red-700">
Retour
<div v-else-if="error" class="mx-auto mb-12 max-w-2xl">
<div
class="rounded-2xl border border-red-700/30 bg-gradient-to-br from-red-900/30 to-purple-900/40 p-8 text-center shadow-2xl backdrop-blur-sm"
>
<div class="mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full border border-red-700/20 bg-red-900/40">
<div class="text-2xl text-red-300"></div>
</div>
<h3 class="mb-2 text-xl font-bold text-red-200">Une erreur est survenue</h3>
<p class="mb-6 text-red-300/90">{{ error }}</p>
<button
@click="$router.back()"
class="transform rounded-full border border-red-500/20 bg-gradient-to-r from-red-600 to-purple-700 px-6 py-3 font-semibold text-white transition-all duration-300 hover:-translate-y-0.5 hover:shadow-lg"
>
Retour à la page précédente
</button>
</div>
</div>
<!-- Empty State -->
<div v-else-if="!hasCards" 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 v-else-if="!hasCards" class="mx-auto max-w-2xl">
<div
class="rounded-2xl border border-purple-700/30 bg-gradient-to-br from-purple-900/40 to-indigo-900/30 p-12 text-center shadow-2xl backdrop-blur-sm"
>
<div
class="mx-auto mb-6 flex h-20 w-20 items-center justify-center rounded-full border border-purple-600/20 bg-purple-800/30"
>
<div class="text-3xl text-purple-300">🔮</div>
</div>
<h3 class="mb-3 text-2xl font-bold text-purple-200">Aucune carte trouvée</h3>
<p class="mb-6 text-purple-300/80">Votre session n'a pas généré de lecture. Veuillez réessayer ou contacter le support.</p>
<button
@click="$router.back()"
class="rounded-full border border-purple-500/20 bg-gradient-to-r from-purple-600 to-indigo-700 px-6 py-3 font-semibold text-white transition-all duration-300 hover:shadow-lg"
>
Nouvelle tentative
</button>
</div>
</div>
<!-- Cards Results -->
<div v-else class="mb-8 md:mb-12">
<div class="space-y-6 md:space-y-8">
<card-result
<div v-else class="mb-12 md:mb-16">
<div class="grid gap-8 md:gap-10">
<div
v-for="(card, index) in cards"
:key="card.id || index"
class="transform transition-all duration-500 hover:scale-[1.02]"
:style="{ animationDelay: `${index * 100}ms` }"
>
<card-result
:card-number="card.id"
:name="card.name"
:image-url="card.image_url"
@ -87,22 +127,69 @@ onMounted(async () => {
/>
</div>
</div>
</div>
<!-- Consultation CTA -->
<div
v-if="!loading && !error"
class="border-linen rounded-lg border bg-white p-6 text-center shadow-sm transition-all duration-300 hover:shadow-md md:p-8 lg:p-12"
v-if="!loading && !error && hasCards"
class="relative mx-auto max-w-4xl overflow-hidden rounded-2xl border border-purple-700/30 bg-gradient-to-br from-purple-900/40 to-purple-800/30 p-8 shadow-2xl backdrop-blur-sm md:p-12"
>
<div class="bg-subtle-gold mx-auto mb-6 h-1 w-16 rounded-full"></div>
<p class="text-midnight-blue/80 mx-auto mb-6 max-w-2xl text-base leading-relaxed md:mb-8 md:text-lg">
Pour une guidance plus approfondie, réservez une consultation personnalisée avec Kris Saint Ange.
<!-- Background decoration -->
<div
class="absolute top-0 right-0 h-32 w-32 translate-x-16 -translate-y-16 rounded-full bg-gradient-to-br from-purple-700/20 to-purple-600/10"
></div>
<div
class="absolute bottom-0 left-0 h-24 w-24 -translate-x-12 translate-y-12 rounded-full bg-gradient-to-tr from-purple-700/20 to-purple-600/10"
></div>
<div class="absolute inset-0 bg-gradient-to-r from-transparent via-purple-900/5 to-transparent"></div>
<div class="relative z-10 text-center">
<div
class="mb-6 inline-flex h-16 w-16 items-center justify-center rounded-full border border-purple-400/30 bg-gradient-to-br from-purple-500 to-purple-400"
>
<div class="text-2xl text-purple-950">🌟</div>
</div>
<h3 class="mb-4 bg-gradient-to-r from-purple-300 to-purple-200 bg-clip-text text-2xl font-black text-transparent md:text-3xl">
Approfondissez Votre Voyage
</h3>
<p class="mx-auto mb-8 max-w-2xl text-lg leading-relaxed text-purple-300/80">
Pour une guidance personnalisée et une compréhension plus profonde de votre chemin de vie, réservez une consultation
privée avec Kris Saint Ange.
</p>
<button
@click="goToBooking"
class="hover:bg-opacity-90 focus:ring-opacity-50 mt-4 inline-flex h-12 min-w-[160px] items-center justify-center rounded-full bg-[var(--subtle-gold)] px-6 text-base font-bold tracking-wide text-[var(--midnight-blue)] transition-all duration-300 hover:shadow-lg focus:ring-2 focus:ring-[var(--subtle-gold)] focus:outline-none md:mt-6 md:px-8"
class="group relative transform rounded-full border border-purple-400/30 bg-gradient-to-r from-purple-500 to-purple-400 px-8 py-4 text-lg font-bold tracking-wide text-purple-950 shadow-lg transition-all duration-300 hover:-translate-y-1 hover:from-purple-400 hover:to-purple-300 hover:shadow-xl"
>
<span class="relative z-10 flex items-center justify-center">
Réserver une Consultation
<svg
class="ml-2 h-5 w-5 transform transition-transform group-hover:translate-x-1"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6" />
</svg>
</span>
<div
class="absolute inset-0 rounded-full bg-gradient-to-r from-purple-400 to-purple-300 opacity-0 transition-opacity duration-300 group-hover:opacity-100"
></div>
</button>
<p class="mt-4 text-sm text-purple-400/70">Séances limitées disponibles</p>
</div>
</div>
<!-- Success Message -->
<div
v-if="!loading && !error && hasCards"
class="mx-auto mt-8 max-w-2xl rounded-2xl border border-green-700/30 bg-gradient-to-r from-green-900/30 to-emerald-900/20 p-6 text-center backdrop-blur-sm"
>
<div class="flex items-center justify-center space-x-3">
<div class="flex h-8 w-8 items-center justify-center rounded-full border border-green-600/20 bg-green-800/40">
<div class="text-green-300"></div>
</div>
<p class="font-medium text-green-200">Votre lecture a été générée avec succès !</p>
</div>
</div>
</div>
</main>
@ -110,18 +197,76 @@ onMounted(async () => {
</template>
<style scoped>
.layout-content-container {
animation: fadeIn 0.6s ease-out;
.container {
animation: fadeInUp 0.8s ease-out;
}
@keyframes fadeIn {
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(10px);
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Staggered animation for cards */
.grid > * {
animation: slideInLeft 0.6s ease-out both;
}
@keyframes slideInLeft {
from {
opacity: 0;
transform: translateX(-30px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
/* Custom scrollbar for dark theme */
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: var(--muted);
}
::-webkit-scrollbar-thumb {
background: var(--primary);
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--accent);
}
/* Glow effects for interactive elements */
button {
box-shadow: 0 4px 15px rgba(128, 90, 213, 0.3);
}
button:hover {
box-shadow: 0 8px 25px rgba(128, 90, 213, 0.5);
}
/* Subtle background pattern */
main::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-image:
radial-gradient(circle at 20% 80%, rgba(120, 119, 198, 0.1) 0%, transparent 50%),
radial-gradient(circle at 80% 20%, rgba(199, 120, 221, 0.1) 0%, transparent 50%),
radial-gradient(circle at 40% 40%, rgba(128, 90, 213, 0.05) 0%, transparent 50%);
pointer-events: none;
}
</style>