Merge version_3 into main #5
@@ -16,6 +16,19 @@ export default function RootLayout({
|
||||
}) {
|
||||
return (
|
||||
<html lang="en">
|
||||
<head>
|
||||
<script
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: `
|
||||
(function() {
|
||||
const savedLang = localStorage.getItem('site-language') || 'en';
|
||||
window.__siteLanguage = savedLang;
|
||||
document.documentElement.lang = savedLang;
|
||||
})();
|
||||
`,
|
||||
}}
|
||||
/>
|
||||
</head>
|
||||
<body className={dmSans.variable}>
|
||||
{children}
|
||||
|
||||
|
||||
182
src/app/page.tsx
182
src/app/page.tsx
File diff suppressed because one or more lines are too long
93
src/components/language/LanguageToggle.tsx
Normal file
93
src/components/language/LanguageToggle.tsx
Normal file
@@ -0,0 +1,93 @@
|
||||
"use client";
|
||||
|
||||
import React from "react";
|
||||
import { Globe } from "lucide-react";
|
||||
|
||||
interface LanguageToggleProps {
|
||||
currentLanguage: 'en' | 'tr';
|
||||
onLanguageChange: (lang: 'en' | 'tr') => void;
|
||||
isTransitioning: boolean;
|
||||
}
|
||||
|
||||
export default function LanguageToggle({
|
||||
currentLanguage,
|
||||
onLanguageChange,
|
||||
isTransitioning,
|
||||
}: LanguageToggleProps) {
|
||||
return (
|
||||
<div className="fixed top-6 right-6 z-50 md:top-8 md:right-8">
|
||||
{/* Glassmorphism Background */}
|
||||
<div className="absolute inset-0 bg-gradient-to-br from-[#d4af37] to-[#3e2723] opacity-70 rounded-full blur-xl"></div>
|
||||
|
||||
{/* Premium Glass Button Container */}
|
||||
<div className="relative px-4 py-3 rounded-full backdrop-blur-2xl bg-white/10 border border-white/20 shadow-2xl hover:shadow-[0_0_40px_rgba(212,175,55,0.5)] transition-all duration-300 hover:border-[#d4af37]/50">
|
||||
{/* Toggle Content */}
|
||||
<div className="flex items-center gap-3">
|
||||
{/* Language Icon */}
|
||||
<Globe className="w-5 h-5 text-[#d4af37] animate-pulse" />
|
||||
|
||||
{/* Button Container with Smooth Sliding Animation */}
|
||||
<div className="flex items-center gap-2 bg-white/5 rounded-full p-1 border border-white/10">
|
||||
{/* TR Button */}
|
||||
<button
|
||||
onClick={() => onLanguageChange('tr')}
|
||||
className={`px-3 py-1.5 rounded-full font-semibold text-sm transition-all duration-300 ${
|
||||
currentLanguage === 'tr'
|
||||
? 'bg-gradient-to-r from-[#d4af37] to-[#ffd700] text-[#3e2723] shadow-lg shadow-[#d4af37]/50 scale-105'
|
||||
: 'text-white/60 hover:text-white/80 hover:bg-white/5'
|
||||
}`}
|
||||
disabled={isTransitioning}
|
||||
aria-label="Switch to Turkish"
|
||||
>
|
||||
TR
|
||||
</button>
|
||||
|
||||
{/* EN Button */}
|
||||
<button
|
||||
onClick={() => onLanguageChange('en')}
|
||||
className={`px-3 py-1.5 rounded-full font-semibold text-sm transition-all duration-300 ${
|
||||
currentLanguage === 'en'
|
||||
? 'bg-gradient-to-r from-[#d4af37] to-[#ffd700] text-[#3e2723] shadow-lg shadow-[#d4af37]/50 scale-105'
|
||||
: 'text-white/60 hover:text-white/80 hover:bg-white/5'
|
||||
}`}
|
||||
disabled={isTransitioning}
|
||||
aria-label="Switch to English"
|
||||
>
|
||||
EN
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Hover Glow Effect */}
|
||||
<div className="absolute inset-0 rounded-full bg-gradient-to-br from-[#d4af37]/0 via-[#d4af37]/0 to-[#ffd700]/0 opacity-0 group-hover:opacity-100 transition-opacity duration-300 blur-xl pointer-events-none"></div>
|
||||
</div>
|
||||
|
||||
{/* Ambient Glow Background */}
|
||||
<style jsx>{`
|
||||
@keyframes glow-pulse {
|
||||
0%, 100% {
|
||||
box-shadow: 0 0 20px rgba(212, 175, 55, 0.3);
|
||||
}
|
||||
50% {
|
||||
box-shadow: 0 0 40px rgba(212, 175, 55, 0.6);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slide-in-button {
|
||||
from {
|
||||
transform: translateX(20px);
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
transform: translateX(0);
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.animate-slide-in {
|
||||
animation: slide-in-button 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||
}
|
||||
`}</style>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user