Undangan/proyek-frontend/app/components/templates/khitan/KhitanA.vue
2025-10-20 15:42:05 +07:00

229 lines
7.2 KiB
Vue

<template>
<div class="h-screen w-full relative bg-blue-900 overflow-hidden">
<div class="absolute inset-0 bg-pattern opacity-30"></div>
<div class="absolute top-0 left-0 w-full h-full">
<div class="absolute top-0 left-0 w-full">
<svg viewBox="0 0 1200 300" class="w-full h-auto">
<defs>
<linearGradient id="goldGradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#FFD700"/>
<stop offset="50%" style="stop-color:#FFA500"/>
<stop offset="100%" style="stop-color:#FFD700"/>
</linearGradient>
</defs>
<path d="M0,150 C300,50 600,250 1200,150 L1200,0 L0,0 Z" fill="url(#goldGradient)" opacity="0.3"/>
</svg>
</div>
<div class="absolute bottom-0 left-0 w-full">
<svg viewBox="0 0 1200 300" class="w-full h-auto">
<path d="M0,150 C300,250 600,50 1200,150 L1200,300 L0,300 Z" fill="url(#goldGradient)" opacity="0.3"/>
</svg>
</div>
</div>
<div class="relative z-10 h-full flex items-center justify-center px-6">
<div class="text-center max-w-4xl mx-auto">
<div class="mb-8 animate-fade-in-down">
<div class="mx-auto w-32 h-32 relative">
<div class="absolute inset-0 flex items-center justify-center">
<svg viewBox="0 0 100 100" class="w-full h-full text-yellow-400">
<defs>
<filter id="glow">
<feGaussianBlur stdDeviation="3" result="coloredBlur"/>
<feMerge>
<feMergeNode in="coloredBlur"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
</defs>
<path d="M35 20 A 25 25 0 1 1 35 80 A 15 15 0 1 0 35 20" fill="currentColor" filter="url(#glow)"/>
<polygon points="65,25 67,35 77,35 69,42 72,52 65,45 58,52 61,42 53,35 63,35" fill="currentColor" filter="url(#glow)"/>
</svg>
</div>
</div>
</div>
<div class="mb-12 animate-fade-in-up animation-delay-300">
<h1 class="text-yellow-400 text-3xl md:text-4xl font-bold mb-4 tracking-wide">
Undangan
</h1>
<h2 class="text-white text-4xl md:text-6xl font-bold mb-6 font-serif">
TASYAKURAN
</h2>
<h2 class="text-white text-4xl md:text-6xl font-bold mb-8 font-serif">
KHITAN
</h2>
</div>
<div class="mb-12 animate-fade-in-up animation-delay-600">
<div class="bg-white/10 backdrop-blur-sm rounded-2xl p-6 mb-6 border border-yellow-400/30">
<p class="text-yellow-400 text-lg mb-2">{{ data?.guestTitle || 'Kepada Yth.' }}</p>
<p class="text-white text-xl font-semibold">{{ data?.guestName || '' }}</p>
</div>
</div>
<div class="animate-fade-in-up animation-delay-900">
<button
@click="$emit('next-page')"
class="group relative px-8 py-4 bg-gradient-to-r from-yellow-400 to-yellow-500 text-blue-900 font-bold text-lg rounded-full shadow-lg hover:shadow-xl transform hover:scale-105 transition-all duration-300 overflow-hidden"
>
<div class="absolute inset-0 bg-gradient-to-r from-yellow-300 to-yellow-600 opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div>
<span class="relative flex items-center space-x-2">
<span>OPEN INVITATION</span>
<Icon name="lucide:chevron-right" class="w-5 h-5 group-hover:translate-x-1 transition-transform duration-300" />
</span>
<div class="absolute inset-0 bg-gradient-to-r from-transparent via-white/20 to-transparent transform -skew-x-12 -translate-x-full group-hover:translate-x-full transition-transform duration-700"></div>
</button>
</div>
<div class="absolute inset-0 pointer-events-none">
<div class="absolute top-1/4 left-1/4 animate-float">
<div class="w-2 h-2 bg-yellow-400 rounded-full opacity-60"></div>
</div>
<div class="absolute top-1/3 right-1/4 animate-float animation-delay-500">
<div class="w-1 h-1 bg-yellow-300 rounded-full opacity-80"></div>
</div>
<div class="absolute bottom-1/3 left-1/3 animate-float animation-delay-1000">
<div class="w-3 h-3 bg-yellow-500 rounded-full opacity-40"></div>
</div>
</div>
</div>
</div>
<div class="absolute top-4 left-4 w-16 h-16 border-l-2 border-t-2 border-yellow-400 opacity-50"></div>
<div class="absolute top-4 right-4 w-16 h-16 border-r-2 border-t-2 border-yellow-400 opacity-50"></div>
<div class="absolute bottom-4 left-4 w-16 h-16 border-l-2 border-b-2 border-yellow-400 opacity-50"></div>
<div class="absolute bottom-4 right-4 w-16 h-16 border-r-2 border-b-2 border-yellow-400 opacity-50"></div>
</div>
</template>
<script setup>
import { onMounted, ref } from 'vue'
// Props
const props = defineProps({
data: {
type: Object,
default: () => ({})
}
})
// Emits
const emit = defineEmits(['next-page'])
// Reactive data
const isVisible = ref(false)
// Methods
const animateIn = () => {
isVisible.value = true
}
// Lifecycle
onMounted(() => {
setTimeout(animateIn, 100)
})
</script>
<style scoped>
/* Background Pattern */
.bg-pattern {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><defs><pattern id="islamic" x="0" y="0" width="25" height="25" patternUnits="userSpaceOnUse"><g fill="none" stroke="rgba(255,255,255,0.1)" stroke-width="0.5"><path d="M12.5 0 L25 12.5 L12.5 25 L0 12.5 Z M6.25 6.25 L18.75 6.25 L18.75 18.75 L6.25 18.75 Z"/><circle cx="12.5" cy="12.5" r="3"/></g></pattern></defs><rect width="100%" height="100%" fill="url(%23islamic)"/></svg>');
}
/* Animations */
@keyframes fadeInDown {
from {
opacity: 0;
transform: translateY(-30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes float {
0%, 100% {
transform: translateY(0px);
}
50% {
transform: translateY(-10px);
}
}
.animate-fade-in-down {
animation: fadeInDown 0.8s ease-out forwards;
}
.animate-fade-in-up {
animation: fadeInUp 0.8s ease-out forwards;
}
.animate-float {
animation: float 3s ease-in-out infinite;
}
/* Animation Delays */
.animation-delay-300 {
animation-delay: 0.3s;
opacity: 0;
animation-fill-mode: forwards;
}
.animation-delay-500 {
animation-delay: 0.5s;
}
.animation-delay-600 {
animation-delay: 0.6s;
opacity: 0;
animation-fill-mode: forwards;
}
.animation-delay-900 {
animation-delay: 0.9s;
opacity: 0;
animation-fill-mode: forwards;
}
.animation-delay-1000 {
animation-delay: 1s;
}
/* Custom fonts */
.font-serif {
font-family: 'Times New Roman', serif;
}
/* Responsive */
@media (max-width: 640px) {
.text-4xl.md\:text-6xl {
font-size: 2.25rem;
}
.text-3xl.md\:text-4xl {
font-size: 1.875rem;
}
.px-8 {
padding-left: 1.5rem;
padding-right: 1.5rem;
}
}
</style>