diff --git a/hifi-src/src/components/Navbar.jsx b/hifi-src/src/components/Navbar.jsx
index f438bb3..e9cfffd 100644
--- a/hifi-src/src/components/Navbar.jsx
+++ b/hifi-src/src/components/Navbar.jsx
@@ -45,13 +45,21 @@ const LANGUAGE_OPTIONS = [
{ code: 'en', label: 'English', Flag: FlagGB },
];
-function LanguageSwitcher({ overHero = false, variant = 'header' }) {
+function LanguageSwitcher({ overHero = false, variant = 'header', onOpenChange }) {
const { language, setLanguage, t } = useLanguage();
- const [isOpen, setIsOpen] = useState(false);
+ const [isOpen, setIsOpenState] = useState(false);
const containerRef = useRef(null);
const current = LANGUAGE_OPTIONS.find((opt) => opt.code === language) || LANGUAGE_OPTIONS[0];
const isHeader = variant === 'header';
+ const setIsOpen = (value) => {
+ setIsOpenState((prev) => {
+ const next = typeof value === 'function' ? value(prev) : value;
+ onOpenChange?.(next);
+ return next;
+ });
+ };
+
useEffect(() => {
if (!isOpen) return undefined;
const handleClickOutside = (e) => {
@@ -105,8 +113,8 @@ function LanguageSwitcher({ overHero = false, variant = 'header' }) {
{isOpen && (
{LANGUAGE_OPTIONS.map((opt) => (
@@ -139,6 +147,7 @@ export default function Navbar() {
const [open, setOpen] = useState(false);
const [mounted, setMounted] = useState(false);
const [menuVisible, setMenuVisible] = useState(false);
+ const [langMenuOpen, setLangMenuOpen] = useState(false);
const { user } = useAuth();
const { phone, whatsapp } = useSiteSettings();
const { t } = useLanguage();
@@ -185,6 +194,14 @@ export default function Navbar() {
}, [open, totalItems]);
const flyIn = () => `transition-all duration-500 ease-out ${menuVisible ? 'opacity-100' : 'opacity-0'}`;
+ // Wie flyIn(), aber lässt sich zusätzlich per langMenuOpen abdunkeln - eine einzelne
+ // opacity-Klasse statt zwei nebeneinander gesetzten, da bei gleichzeitig vorhandenen
+ // Tailwind-opacity-Klassen die Reihenfolge im generierten CSS (nicht im class-Attribut)
+ // entscheidet und "opacity-100" die Abdunklung sonst zufällig überschreiben kann.
+ const flyInDimmable = () =>
+ `transition-all duration-500 ease-out ${
+ !menuVisible ? 'opacity-0' : langMenuOpen ? 'pointer-events-none opacity-20' : 'opacity-100'
+ }`;
const flyInStyle = (index) => {
const delayIndex = menuVisible ? index : totalItems - 1 - index;
return {
@@ -274,11 +291,15 @@ export default function Navbar() {
-
+
{phone && (
-
+
{phone}
@@ -288,7 +309,7 @@ export default function Navbar() {
href={`https://wa.me/${digitsOnly(whatsapp).replace(/^0/, '49').replace('+', '')}`}
target="_blank"
rel="noopener noreferrer"
- className={`flex items-center gap-2 text-sm font-semibold uppercase tracking-wide text-neutral-600 hover:text-brand-600 ${flyIn()}`}
+ className={`flex items-center gap-2 text-sm font-semibold uppercase tracking-wide text-neutral-600 hover:text-brand-600 ${flyInDimmable()}`}
style={flyInStyle(7)}
>