fix(landing): replace language cycle button with dropdown selector
Some checks failed
Deploy to Production / Build and Deploy (push) Failing after 1m49s
Some checks failed
Deploy to Production / Build and Deploy (push) Failing after 1m49s
The landing page language switcher cycled to the next language on every click. It is now a dropdown listing all 13 languages; the cycling button variant is removed from the LanguageSwitcher component.
This commit is contained in:
@@ -56,7 +56,7 @@ const Navbar = () => {
|
|||||||
<a href="#formats" className="text-brand-dark/60 dark:text-white/60 hover:text-brand-dark dark:hover:text-white transition-colors text-[11px] font-bold uppercase tracking-widest">{t('landing.nav.formats')}</a>
|
<a href="#formats" className="text-brand-dark/60 dark:text-white/60 hover:text-brand-dark dark:hover:text-white transition-colors text-[11px] font-bold uppercase tracking-widest">{t('landing.nav.formats')}</a>
|
||||||
<a href="#pricing" className="text-brand-dark/60 dark:text-white/60 hover:text-brand-dark dark:hover:text-white transition-colors text-[11px] font-bold uppercase tracking-widest">{t('landing.nav.pricing')}</a>
|
<a href="#pricing" className="text-brand-dark/60 dark:text-white/60 hover:text-brand-dark dark:hover:text-white transition-colors text-[11px] font-bold uppercase tracking-widest">{t('landing.nav.pricing')}</a>
|
||||||
<div className="h-4 w-[1px] bg-black/10 dark:bg-white/10"></div>
|
<div className="h-4 w-[1px] bg-black/10 dark:bg-white/10"></div>
|
||||||
<LanguageSwitcher variant="button" />
|
<LanguageSwitcher className="h-9 w-auto gap-1.5 rounded-full border-black/10 dark:border-white/10 bg-transparent dark:bg-transparent px-4 text-[11px] font-bold uppercase tracking-widest text-brand-dark/60 dark:text-white/60 hover:text-brand-dark dark:hover:text-white shadow-none" />
|
||||||
<Link href="/auth/login" className="text-brand-dark/60 dark:text-white/60 hover:text-brand-dark dark:hover:text-white transition-colors text-[11px] font-bold uppercase tracking-widest">{t('landing.nav.login')}</Link>
|
<Link href="/auth/login" className="text-brand-dark/60 dark:text-white/60 hover:text-brand-dark dark:hover:text-white transition-colors text-[11px] font-bold uppercase tracking-widest">{t('landing.nav.login')}</Link>
|
||||||
<Link href="/auth/register" className="premium-button py-2.5 px-6 leading-none">{t('landing.nav.startFree')}</Link>
|
<Link href="/auth/register" className="premium-button py-2.5 px-6 leading-none">{t('landing.nav.startFree')}</Link>
|
||||||
</div>
|
</div>
|
||||||
@@ -78,7 +78,7 @@ const Navbar = () => {
|
|||||||
>
|
>
|
||||||
<div className="px-6 pt-4 pb-10 space-y-4 text-center">
|
<div className="px-6 pt-4 pb-10 space-y-4 text-center">
|
||||||
<div className="flex justify-center">
|
<div className="flex justify-center">
|
||||||
<LanguageSwitcher variant="button" />
|
<LanguageSwitcher className="w-full h-11 rounded-2xl border-2 border-black/5 dark:border-white/10 bg-transparent dark:bg-transparent font-bold text-brand-dark dark:text-white shadow-none" />
|
||||||
</div>
|
</div>
|
||||||
<a href="#features" onClick={() => setIsOpen(false)} className="block py-3 text-lg font-bold text-brand-dark dark:text-white">{t('landing.nav.why')}</a>
|
<a href="#features" onClick={() => setIsOpen(false)} className="block py-3 text-lg font-bold text-brand-dark dark:text-white">{t('landing.nav.why')}</a>
|
||||||
<a href="#formats" onClick={() => setIsOpen(false)} className="block py-3 text-lg font-bold text-brand-dark dark:text-white">{t('landing.nav.formats')}</a>
|
<a href="#formats" onClick={() => setIsOpen(false)} className="block py-3 text-lg font-bold text-brand-dark dark:text-white">{t('landing.nav.formats')}</a>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { Globe } from "lucide-react";
|
import { Globe } from "lucide-react";
|
||||||
import { Button } from "@/components/ui/button";
|
|
||||||
import {
|
import {
|
||||||
Select,
|
Select,
|
||||||
SelectContent,
|
SelectContent,
|
||||||
@@ -28,49 +27,27 @@ const languages: { value: Locale; label: string; flag: string }[] = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
interface LanguageSwitcherProps {
|
interface LanguageSwitcherProps {
|
||||||
variant?: "select" | "button";
|
className?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function LanguageSwitcher({ variant = "select" }: LanguageSwitcherProps) {
|
export function LanguageSwitcher({ className }: LanguageSwitcherProps) {
|
||||||
const { locale, setLocale } = useI18n();
|
const { locale, setLocale } = useI18n();
|
||||||
|
const current = languages.find((l) => l.value === locale) ?? languages[0];
|
||||||
if (variant === "button") {
|
|
||||||
const currentIndex = languages.findIndex((l) => l.value === locale);
|
|
||||||
const nextIndex = (currentIndex + 1) % languages.length;
|
|
||||||
const nextLang = languages[nextIndex];
|
|
||||||
const currentLang = languages[currentIndex];
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Button
|
|
||||||
variant="ghost"
|
|
||||||
size="sm"
|
|
||||||
onClick={() => setLocale(nextLang.value)}
|
|
||||||
className="gap-1.5 text-muted-foreground hover:text-foreground"
|
|
||||||
>
|
|
||||||
<Globe className="h-4 w-4" />
|
|
||||||
<span className="text-sm">{currentLang.flag}</span>
|
|
||||||
<span className="text-xs font-medium uppercase">{currentLang.value}</span>
|
|
||||||
</Button>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Select value={locale} onValueChange={(v) => setLocale(v as Locale)}>
|
<Select value={locale} onValueChange={(v) => setLocale(v as Locale)}>
|
||||||
<SelectTrigger className="w-[150px] h-9">
|
<SelectTrigger className={className} aria-label="Change language">
|
||||||
<SelectValue>
|
<SelectValue>
|
||||||
<span className="flex items-center gap-2">
|
<span className="flex items-center gap-2">
|
||||||
<Globe className="h-4 w-4" />
|
<Globe className="h-4 w-4" />
|
||||||
{languages.find((l) => l.value === locale)?.flag}{" "}
|
<span>{current.flag}</span>
|
||||||
{languages.find((l) => l.value === locale)?.label}
|
<span>{current.label}</span>
|
||||||
</span>
|
</span>
|
||||||
</SelectValue>
|
</SelectValue>
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
<SelectContent>
|
<SelectContent align="start">
|
||||||
{languages.map((lang) => (
|
{languages.map((lang) => (
|
||||||
<SelectItem
|
<SelectItem key={lang.value} value={lang.value}>
|
||||||
key={lang.value}
|
|
||||||
value={lang.value}
|
|
||||||
>
|
|
||||||
<span className="flex items-center gap-2">
|
<span className="flex items-center gap-2">
|
||||||
<span>{lang.flag}</span>
|
<span>{lang.flag}</span>
|
||||||
<span>{lang.label}</span>
|
<span>{lang.label}</span>
|
||||||
|
|||||||
Reference in New Issue
Block a user