c847a456a3
- Override Tailwind ease-out/ease-in-out with stronger curves, add ease-drawer - hoverOnlyWhenSupported so hover styles never stick on touch devices - Replace transition-all with explicit properties across the public UI - Press feedback via active:scale-[0.97] instead of hover:scale-105 - Global prefers-reduced-motion handling (CSS + MotionConfig reducedMotion="user") - Mobile menu is a real drawer: stays mounted, inert when closed, Escape closes - Progress and music bars animate scaleX/scaleY instead of width/height - Fix undefined animate-spin-slow, contain hero CTA shine with overflow-hidden Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
86 lines
4.7 KiB
TypeScript
86 lines
4.7 KiB
TypeScript
"use client";
|
|
|
|
import React from "react";
|
|
import Link from "next/link";
|
|
import { useLocale, useTranslations } from "next-intl";
|
|
import { ArrowUp } from "lucide-react";
|
|
|
|
const Footer = () => {
|
|
const locale = useLocale();
|
|
const t = useTranslations("footer");
|
|
const year = new Date().getFullYear();
|
|
|
|
const scrollToTop = () => {
|
|
window.scrollTo({ top: 0, behavior: "smooth" });
|
|
};
|
|
|
|
return (
|
|
<footer className="bg-stone-50 dark:bg-stone-950 pt-16 sm:pt-24 md:pt-32 pb-8 sm:pb-12 px-4 sm:px-6 overflow-hidden transition-colors duration-500">
|
|
<div className="max-w-7xl mx-auto">
|
|
|
|
<div className="grid grid-cols-1 md:grid-cols-12 gap-8 sm:gap-10 md:gap-12 items-end">
|
|
{/* Copyright & Info */}
|
|
<div className="md:col-span-4 space-y-6">
|
|
<div className="w-12 h-12 rounded-2xl bg-stone-900 dark:bg-stone-50 flex items-center justify-center text-white dark:text-stone-900 font-black text-xs">
|
|
dk
|
|
</div>
|
|
<div className="space-y-2">
|
|
<p className="text-xl font-black text-stone-900 dark:text-stone-50 uppercase tracking-tighter">{t("role")}</p>
|
|
<p className="text-stone-600 dark:text-stone-400 text-sm font-medium">© {year} {t("madeIn")}.</p>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Navigation Links */}
|
|
<div className="md:col-span-4 grid grid-cols-2 gap-8">
|
|
<div className="space-y-4">
|
|
<p className="text-[10px] font-black uppercase tracking-[0.2em] text-stone-600 dark:text-stone-400">{t("legalNotice")}</p>
|
|
<div className="flex flex-col gap-2">
|
|
<Link href={`/${locale}/legal-notice`} className="text-sm font-bold text-stone-600 dark:text-stone-400 hover:text-stone-900 dark:hover:text-white transition-colors">{t("legalNotice")}</Link>
|
|
<Link href={`/${locale}/privacy-policy`} className="text-sm font-bold text-stone-600 dark:text-stone-400 hover:text-stone-900 dark:hover:text-white transition-colors">{t("privacyPolicy")}</Link>
|
|
</div>
|
|
</div>
|
|
<div className="space-y-4">
|
|
<p className="text-[10px] font-black uppercase tracking-[0.2em] text-stone-600 dark:text-stone-400">Social</p>
|
|
<div className="flex flex-col gap-2">
|
|
<a href="https://github.com/Denshooter" target="_blank" rel="noopener noreferrer" className="text-sm font-bold text-stone-600 dark:text-stone-400 hover:text-stone-900 dark:hover:text-white transition-colors">GitHub</a>
|
|
<a href="https://linkedin.com/in/dkonkol" target="_blank" rel="noopener noreferrer" className="text-sm font-bold text-stone-600 dark:text-stone-400 hover:text-stone-900 dark:hover:text-white transition-colors">LinkedIn</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Back to Top */}
|
|
<div className="md:col-span-4 flex justify-start md:justify-end">
|
|
<button
|
|
onClick={scrollToTop}
|
|
className="group flex flex-col items-center gap-4 text-stone-600 dark:text-stone-400 hover:text-stone-900 dark:hover:text-white transition-colors"
|
|
>
|
|
<span className="text-[10px] font-black uppercase tracking-[0.3em] text-stone-600 dark:text-stone-400" style={{ writingMode: 'vertical-rl', transform: 'rotate(180deg)' }}>{t("backToTop")}</span>
|
|
<div className="w-12 h-12 rounded-full border border-stone-200 dark:border-stone-800 flex items-center justify-center group-hover:bg-stone-900 dark:group-hover:bg-stone-50 group-hover:text-white dark:group-hover:text-stone-900 group-active:scale-[0.97] transition-[background-color,color,transform] duration-200 ease-out shadow-sm">
|
|
<ArrowUp size={20} />
|
|
</div>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Bottom Bar */}
|
|
<div className="mt-10 sm:mt-16 md:mt-20 pt-6 sm:pt-8 border-t border-stone-100 dark:border-stone-900 flex flex-col md:flex-row justify-between items-center gap-4">
|
|
<div className="flex flex-col gap-1">
|
|
<p className="text-[10px] font-bold text-stone-600 dark:text-stone-400 uppercase tracking-widest">
|
|
{t("builtWith")} Next.js, Directus & Passion.
|
|
</p>
|
|
<p className="text-[10px] text-stone-500 dark:text-stone-500 tracking-wide">
|
|
{t("aiDisclaimer")}
|
|
</p>
|
|
</div>
|
|
<div className="flex items-center gap-2">
|
|
<div className="w-2 h-2 rounded-full bg-green-500 animate-pulse" />
|
|
<span className="text-[10px] font-bold text-stone-600 dark:text-stone-400 uppercase tracking-widest">{t("systemsOnline")}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
);
|
|
};
|
|
|
|
export default Footer;
|