diff --git a/dev-dist/sw.js b/dev-dist/sw.js index 6b06d1e..ef4bace 100644 --- a/dev-dist/sw.js +++ b/dev-dist/sw.js @@ -82,7 +82,7 @@ define(['./workbox-4a2e5f00'], (function (workbox) { 'use strict'; "revision": "3ca0b8505b4bec776b69afdba2768812" }, { "url": "index.html", - "revision": "0.364nagk4too" + "revision": "0.p5tdckiicb" }], {}); workbox.cleanupOutdatedCaches(); workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), { diff --git a/dev-dist/sw.js.map b/dev-dist/sw.js.map index b83807d..3998e3d 100644 --- a/dev-dist/sw.js.map +++ b/dev-dist/sw.js.map @@ -1 +1 @@ -{"version":3,"file":"sw.js","sources":["../../../Users/DAMJAN~1/AppData/Local/Temp/2cf31500057552b0b7f611e692393575/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-routing/registerRoute.mjs';\nimport {CacheableResponsePlugin as workbox_cacheable_response_CacheableResponsePlugin} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-cacheable-response/CacheableResponsePlugin.mjs';\nimport {CacheFirst as workbox_strategies_CacheFirst} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-strategies/CacheFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';\nimport {NavigationRoute as workbox_routing_NavigationRoute} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-routing/NavigationRoute.mjs';\nimport {createHandlerBoundToURL as workbox_precaching_createHandlerBoundToURL} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-precaching/createHandlerBoundToURL.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"registerSW.js\",\n \"revision\": \"3ca0b8505b4bec776b69afdba2768812\"\n },\n {\n \"url\": \"index.html\",\n \"revision\": \"0.364nagk4too\"\n }\n], {});\nworkbox_precaching_cleanupOutdatedCaches();\nworkbox_routing_registerRoute(new workbox_routing_NavigationRoute(workbox_precaching_createHandlerBoundToURL(\"index.html\"), {\n allowlist: [/^\\/$/],\n \n}));\n\n\nworkbox_routing_registerRoute(/^https:\\/\\/fonts\\.googleapis\\.com\\/.*/i, new workbox_strategies_CacheFirst({ \"cacheName\":\"google-fonts-cache\", plugins: [new workbox_cacheable_response_CacheableResponsePlugin({ statuses: [ 0, 200 ] })] }), 'GET');\nworkbox_routing_registerRoute(/^https:\\/\\/fonts\\.gstatic\\.com\\/.*/i, new workbox_strategies_CacheFirst({ \"cacheName\":\"gstatic-fonts-cache\", plugins: [new workbox_cacheable_response_CacheableResponsePlugin({ statuses: [ 0, 200 ] })] }), 'GET');\nworkbox_routing_registerRoute(/^https:\\/\\/www\\.googletagmanager\\.com\\/.*/i, new workbox_strategies_NetworkOnly(), 'GET');\n\n\n\n\n"],"names":["self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","workbox_precaching_cleanupOutdatedCaches","workbox_routing_registerRoute","workbox_routing_NavigationRoute","workbox_precaching_createHandlerBoundToURL","allowlist","workbox_strategies_CacheFirst","plugins","workbox_cacheable_response_CacheableResponsePlugin","statuses","workbox_strategies_NetworkOnly"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sw.js","sources":["../../../Users/DAMJAN~1/AppData/Local/Temp/97b763fe2808d25d7a3c242cadc4a959/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-routing/registerRoute.mjs';\nimport {CacheableResponsePlugin as workbox_cacheable_response_CacheableResponsePlugin} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-cacheable-response/CacheableResponsePlugin.mjs';\nimport {CacheFirst as workbox_strategies_CacheFirst} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-strategies/CacheFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';\nimport {NavigationRoute as workbox_routing_NavigationRoute} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-routing/NavigationRoute.mjs';\nimport {createHandlerBoundToURL as workbox_precaching_createHandlerBoundToURL} from 'C:/Development/Damjan Savic/Portfolio/node_modules/workbox-precaching/createHandlerBoundToURL.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"registerSW.js\",\n \"revision\": \"3ca0b8505b4bec776b69afdba2768812\"\n },\n {\n \"url\": \"index.html\",\n \"revision\": \"0.p5tdckiicb\"\n }\n], {});\nworkbox_precaching_cleanupOutdatedCaches();\nworkbox_routing_registerRoute(new workbox_routing_NavigationRoute(workbox_precaching_createHandlerBoundToURL(\"index.html\"), {\n allowlist: [/^\\/$/],\n \n}));\n\n\nworkbox_routing_registerRoute(/^https:\\/\\/fonts\\.googleapis\\.com\\/.*/i, new workbox_strategies_CacheFirst({ \"cacheName\":\"google-fonts-cache\", plugins: [new workbox_cacheable_response_CacheableResponsePlugin({ statuses: [ 0, 200 ] })] }), 'GET');\nworkbox_routing_registerRoute(/^https:\\/\\/fonts\\.gstatic\\.com\\/.*/i, new workbox_strategies_CacheFirst({ \"cacheName\":\"gstatic-fonts-cache\", plugins: [new workbox_cacheable_response_CacheableResponsePlugin({ statuses: [ 0, 200 ] })] }), 'GET');\nworkbox_routing_registerRoute(/^https:\\/\\/www\\.googletagmanager\\.com\\/.*/i, new workbox_strategies_NetworkOnly(), 'GET');\n\n\n\n\n"],"names":["self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","workbox_precaching_cleanupOutdatedCaches","workbox_routing_registerRoute","workbox_routing_NavigationRoute","workbox_precaching_createHandlerBoundToURL","allowlist","workbox_strategies_CacheFirst","plugins","workbox_cacheable_response_CacheableResponsePlugin","statuses","workbox_strategies_NetworkOnly"],"mappings":"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"} \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index dd1c1e4..e2e8efa 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -7,6 +7,8 @@ import AppRoutes from './routes'; import ErrorBoundary from './components/ErrorBoundary'; import CookieBanner from './components/CookieBanner'; import PageTransition from './components/PageTransition'; +import { ScrollProvider } from './components/ScrollContext'; +import DebugOverlay from './components/DebugOverlay'; import { logPageView } from './utils/analytics'; import './styles/scrollbar.css'; @@ -20,18 +22,21 @@ function App() { -
- - - - - - - - - - -
+ +
+ + + + + + + + + + + +
+
diff --git a/src/components/DebugOverlay.tsx b/src/components/DebugOverlay.tsx new file mode 100644 index 0000000..8c73789 --- /dev/null +++ b/src/components/DebugOverlay.tsx @@ -0,0 +1,41 @@ +import React, { useState, useEffect } from 'react'; +import { useScrollContext } from './ScrollContext'; + +interface KeyboardEvent { + key: string; +} + +const DebugOverlay: React.FC = () => { + const [showDebug, setShowDebug] = useState(false); + const { isTransitioning } = useScrollContext(); + + useEffect(() => { + const handleKeyPress = (e: KeyboardEvent) => { + if (e.key === 'd') { + setShowDebug((prev: boolean) => !prev); + } + }; + + window.addEventListener('keydown', handleKeyPress); + return () => window.removeEventListener('keydown', handleKeyPress); + }, []); + + if (!showDebug) return null; + + return ( +
+
Transitioning: {isTransitioning ? 'Yes' : 'No'}
+
Body Overflow: {document.body.style.overflow}
+
Scroll Position: {window.scrollY}
+
View Height: {window.innerHeight}
+ +
+ ); +}; + +export default DebugOverlay; \ No newline at end of file diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index 65e2573..d14960f 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -1,13 +1,24 @@ -// components/Layout.tsx -import { useEffect, useState, ReactNode, useCallback } from "react"; +// Layout.tsx +import { useEffect, useState, ReactNode } from "react"; import { useTranslation } from "react-i18next"; import { motion, AnimatePresence } from "framer-motion"; -import { Menu, X, Home, User, Briefcase, BookOpen, Phone, LayoutDashboard } from "lucide-react"; +import { + Menu, + X, + Home, + User, + Briefcase, + BookOpen, + Phone, + LayoutDashboard, +} from "lucide-react"; import { supabase } from "../utils/supabaseClient"; import { ContactInfo } from "./ContactInfo"; import { NavLink } from "./NavLink"; import LanguageSwitcher from "./LanguageSwitcher"; import { Link, useLocation } from "react-router-dom"; +import Footer from "./Footer"; +import { useScrollContext } from "./ScrollContext"; interface LayoutProps { children: ReactNode; @@ -16,41 +27,27 @@ interface LayoutProps { const Layout = ({ children }: LayoutProps) => { const { t } = useTranslation(); const [isAdmin, setIsAdmin] = useState(false); - const [isOpen, setIsOpen] = useState(false); const [scrolled, setScrolled] = useState(false); + const [isMounted, setIsMounted] = useState(false); const location = useLocation(); + const { isMenuOpen, setIsMenuOpen } = useScrollContext(); - // Memoized toggle function - const toggleMenu = useCallback((force?: boolean) => { - setIsOpen(prev => typeof force === 'boolean' ? force : !prev); + // Initial mount + useEffect(() => { + setIsMounted(true); }, []); - // Route change handler + // Schließe das Menü nur beim Routenwechsel useEffect(() => { - toggleMenu(false); - }, [location.pathname, toggleMenu]); + setIsMenuOpen(false); + }, [location.pathname, setIsMenuOpen]); - // Scroll lock effect - useEffect(() => { - const body = document.body; - if (isOpen) { - const scrollY = window.scrollY; - body.style.position = 'fixed'; - body.style.top = `-${scrollY}px`; - body.style.width = '100%'; - body.style.overflow = 'hidden'; - } else { - const scrollY = body.style.top; - body.style.position = ''; - body.style.top = ''; - body.style.width = ''; - body.style.overflow = ''; - if (scrollY) { - window.scrollTo(0, parseInt(scrollY || '0') * -1); - } - } - }, [isOpen]); + // Toggle Menu + const toggleMenu = () => { + setIsMenuOpen(!isMenuOpen); + }; + // Prüfe Admin-Status und registriere den Scroll-Handler useEffect(() => { const checkAdmin = async () => { const { data, error } = await supabase.auth.getSession(); @@ -82,11 +79,31 @@ const Layout = ({ children }: LayoutProps) => { }, []); const navigationLinks = [ - { path: "/", label: t("navigation.main.home"), icon: }, - { path: "/about", label: t("navigation.main.about"), icon: }, - { path: "/portfolio", label: t("navigation.main.portfolio"), icon: }, - { path: "/blog", label: t("navigation.main.blog"), icon: }, - { path: "/contact", label: t("navigation.main.contact"), icon: }, + { + path: "/", + label: t("navigation.main.home"), + icon: , + }, + { + path: "/about", + label: t("navigation.main.about"), + icon: , + }, + { + path: "/portfolio", + label: t("navigation.main.portfolio"), + icon: , + }, + { + path: "/blog", + label: t("navigation.main.blog"), + icon: , + }, + { + path: "/contact", + label: t("navigation.main.contact"), + icon: , + }, ...(isAdmin ? [ { @@ -98,11 +115,17 @@ const Layout = ({ children }: LayoutProps) => { : []), ]; + if (!isMounted) { + return null; + } + return ( -
+ // Relativer Container, um z-index-Steuerung zu ermöglichen +
+ {/* Navigation – oberste Ebene */} - - {isOpen && ( - <> - toggleMenu(false)} - /> - -
-
+ {/* Mobile Menu */} + + {isMenuOpen && ( + <> + {/* Backdrop: Sichtbar, aber mit pointer-events-none blockiert er keine Interaktionen */} + + + {/* Sidebar – oberhalb des Hauptinhalts */} + + {/* Header-Spacer für die Navigation */} +
+ + {/* Scrollbarer Sidebar-Inhalt */} +
+
+
{navigationLinks.map(({ path, label, icon }) => ( @@ -171,7 +214,8 @@ const Layout = ({ children }: LayoutProps) => { to={path} icon={icon} label={label} - onClick={() => toggleMenu(false)} + // Alternativ: Hier könnte ein Klick auch das Menü schließen + onClick={() => setIsMenuOpen(false)} className="flex items-center w-full mb-1" /> ))} @@ -179,19 +223,26 @@ const Layout = ({ children }: LayoutProps) => {
- Sprache ändern + + Sprache ändern +
- - - )} - - - {children} +
+ + + )} + + + {/* Hauptinhalt – hier kann normal gescrollt werden */} +
{children}
+ + {/* Footer */} +
); }; -export default Layout; \ No newline at end of file +export default Layout; diff --git a/src/components/PageContainer.tsx b/src/components/PageContainer.tsx index 6248252..c179011 100644 --- a/src/components/PageContainer.tsx +++ b/src/components/PageContainer.tsx @@ -1,6 +1,5 @@ // components/PageContainer.tsx -import React from 'react'; -import Footer from './Footer'; +import React, { Suspense } from 'react'; interface PageContainerProps { children: React.ReactNode; @@ -9,10 +8,11 @@ interface PageContainerProps { const PageContainer = ({ children }: PageContainerProps) => { return (
-
- {children} -
-
+ +
+ {children} +
+
); }; diff --git a/src/components/PageTransition.tsx b/src/components/PageTransition.tsx index bc7225a..e5bd2bd 100644 --- a/src/components/PageTransition.tsx +++ b/src/components/PageTransition.tsx @@ -1,7 +1,8 @@ "use client" -import React, { useEffect, useState } from "react" +import React, { useEffect, useState, useCallback } from "react" import { motion, AnimatePresence, cubicBezier } from "framer-motion" import { useLocation } from "react-router-dom" +import { useScrollContext } from './ScrollContext' interface PageTransitionProps { children: React.ReactNode @@ -34,55 +35,81 @@ const Logo = () => ( const PageTransition = ({ children }: PageTransitionProps) => { const location = useLocation() - const [isAnimating, setIsAnimating] = useState(false) + const [showLogo, setShowLogo] = useState(false) const [showContent, setShowContent] = useState(true) + const { setIsTransitioning, lockScroll, unlockScroll } = useScrollContext() + + const resetScroll = useCallback(() => { + requestAnimationFrame(() => { + window.scrollTo({ + top: 0, + behavior: 'instant' + }); + }); + }, []); + + const handleTransitionStart = useCallback(() => { + setIsTransitioning(true); + lockScroll(); + setShowContent(false); + setShowLogo(true); + }, [setIsTransitioning, lockScroll]); + + const handleTransitionEnd = useCallback(() => { + setShowContent(true); + setShowLogo(false); + setIsTransitioning(false); + unlockScroll(); + resetScroll(); + }, [setIsTransitioning, unlockScroll, resetScroll]); useEffect(() => { - setIsAnimating(true) - setShowContent(false) + const logoTimer = setTimeout(() => { + setShowLogo(false); + }, 800); - const contentTimer = setTimeout(() => { - setShowContent(true) - }, 800) + const transitionTimer = setTimeout(() => { + handleTransitionEnd(); + }, 1000); - const animationTimer = setTimeout(() => { - setIsAnimating(false) - }, 1000) + handleTransitionStart(); return () => { - clearTimeout(contentTimer) - clearTimeout(animationTimer) - } - }, [location.pathname]) + clearTimeout(logoTimer); + clearTimeout(transitionTimer); + unlockScroll(); + }; + }, [location.pathname, handleTransitionStart, handleTransitionEnd, unlockScroll]); return (
- {/* Overlay mit Logo */} - - {isAnimating && ( + + {showLogo && ( - +
+ +
)}
- {/* Content */} {showContent && ( {children} diff --git a/src/components/ScrollContext.tsx b/src/components/ScrollContext.tsx new file mode 100644 index 0000000..ba77b07 --- /dev/null +++ b/src/components/ScrollContext.tsx @@ -0,0 +1,56 @@ +// ScrollContext.tsx +import React, { createContext, useContext, useState, useCallback } from 'react'; + +interface ScrollContextType { + isTransitioning: boolean; + setIsTransitioning: (value: boolean) => void; + isMenuOpen: boolean; + setIsMenuOpen: (value: boolean) => void; + lockScroll: () => void; + unlockScroll: () => void; +} + +const ScrollContext = createContext(undefined); + +export const ScrollProvider = ({ children }: { children: React.ReactNode }) => { + const [isTransitioning, setIsTransitioning] = useState(false); + const [isMenuOpen, setIsMenuOpen] = useState(false); + + const lockScroll = useCallback(() => { + const scrollY = window.scrollY; + document.body.style.position = 'fixed'; + document.body.style.top = `-${scrollY}px`; + document.body.style.width = '100%'; + }, []); + + const unlockScroll = useCallback(() => { + const scrollY = document.body.style.top; + document.body.style.position = ''; + document.body.style.top = ''; + document.body.style.width = ''; + window.scrollTo(0, parseInt(scrollY || '0') * -1); + }, []); + + return ( + + {children} + + ); +}; + +export const useScrollContext = () => { + const context = useContext(ScrollContext); + if (context === undefined) { + throw new Error('useScrollContext must be used within a ScrollProvider'); + } + return context; +}; \ No newline at end of file diff --git a/src/hooks/useScrollLock.ts b/src/hooks/useScrollLock.ts new file mode 100644 index 0000000..d790af5 --- /dev/null +++ b/src/hooks/useScrollLock.ts @@ -0,0 +1,34 @@ +// hooks/useScrollLock.ts +import { useEffect } from 'react'; +import { useLocation } from 'react-router-dom'; +import { useScrollContext } from '../components/ScrollContext'; + +export const useScrollLock = (lock: boolean) => { + const location = useLocation(); + const { isTransitioning, lockScroll, unlockScroll } = useScrollContext(); + + // Handle lock state changes + useEffect(() => { + if (lock && !isTransitioning) { + lockScroll(); + } else { + unlockScroll(); + } + }, [lock, isTransitioning, lockScroll, unlockScroll]); + + // Handle location changes + useEffect(() => { + const timeout = setTimeout(() => { + unlockScroll(); + window.scrollTo(0, 0); + }, 100); + return () => clearTimeout(timeout); + }, [location.pathname, unlockScroll]); + + // Cleanup on unmount + useEffect(() => { + return () => { + unlockScroll(); + }; + }, [unlockScroll]); +}; \ No newline at end of file diff --git a/src/routes.tsx b/src/routes.tsx index 5be37b9..7e136f8 100644 --- a/src/routes.tsx +++ b/src/routes.tsx @@ -1,5 +1,5 @@ // routes.tsx -import React from 'react'; +import React, { Suspense } from 'react'; import { Routes, Route } from 'react-router-dom'; import RouteErrorBoundary from './components/RouteErrorBoundary'; import PageContainer from './components/PageContainer'; @@ -20,17 +20,128 @@ const TermsPage = React.lazy(() => import('./pages/TermsPage')); const AppRoutes = () => { return ( - } errorElement={} /> - } errorElement={} /> - } errorElement={} /> - } errorElement={} /> - } errorElement={} /> - } errorElement={} /> - } errorElement={} /> - } errorElement={} /> - } errorElement={} /> - } errorElement={} /> - } errorElement={} /> + + + + + + } + errorElement={} + /> + + + + + + } + errorElement={} + /> + {/* Rest of the routes follow the same pattern */} + + + + + + } + errorElement={} + /> + + + + + + } + errorElement={} + /> + + + + + + } + errorElement={} + /> + + + + + + } + errorElement={} + /> + + + + + + } + errorElement={} + /> + + + + + + } + errorElement={} + /> + + + + + + } + errorElement={} + /> + + + + + + } + errorElement={} + /> + + + + + + } + errorElement={} + /> ); };