diff --git a/app/[locale]/layout.tsx b/app/[locale]/layout.tsx index 6c6fb20..e328642 100644 --- a/app/[locale]/layout.tsx +++ b/app/[locale]/layout.tsx @@ -13,6 +13,7 @@ const inter = Inter({ subsets: ["latin"], display: "swap", variable: "--font-inter", + weight: ["400", "700", "800"], // Explicit weights to optimize download }); export const metadata: Metadata = { @@ -129,7 +130,7 @@ export default async function RootLayout({ } // Track server-side (initial load) - serverServices.analytics.trackPageview("/"); + // serverServices.analytics.trackPageview("/"); // Removed to avoid double-tracking and incorrect path reporting return ( diff --git a/components/HomeContent.tsx b/components/HomeContent.tsx index 135bdcd..5e607f3 100644 --- a/components/HomeContent.tsx +++ b/components/HomeContent.tsx @@ -16,6 +16,23 @@ import { Reveal } from "./Reveal"; import { TechBackground } from "./TechBackground"; import { useTranslations } from "next-intl"; +import dynamic from "next/dynamic"; + +const PortfolioSection = dynamic(() => + import("./sections/PortfolioSection").then((mod) => mod.PortfolioSection), +); +const ExpertiseSection = dynamic(() => + import("./sections/ExpertiseSection").then((mod) => mod.ExpertiseSection), +); +const TechnicalSpecsSection = dynamic(() => + import("./sections/TechnicalSpecsSection").then( + (mod) => mod.TechnicalSpecsSection, + ), +); +const CTASection = dynamic(() => + import("./sections/CTASection").then((mod) => mod.CTASection), +); + export default function Home() { const t = useTranslations("Index"); @@ -74,7 +91,7 @@ export default function Home() { fill className="object-cover" priority - quality={90} + quality={75} />
@@ -127,272 +144,11 @@ export default function Home() {
- {/* Portfolio Section */} -
- -
- - -
- - {t("portfolio.tag")} - -

- {t("portfolio.title")} -

-

- {t("portfolio.description")} -

-
- - {t("portfolio.link")}{" "} - - -
- -
- {[ - { - icon: , - title: t("portfolio.items.beratung.title"), - desc: t("portfolio.items.beratung.desc"), - }, - { - icon: , - title: t("portfolio.items.begleitung.title"), - desc: t("portfolio.items.begleitung.desc"), - }, - { - icon: , - title: t("portfolio.items.beschaffung.title"), - desc: t("portfolio.items.beschaffung.desc"), - }, - ].map((item, i) => ( - -
-
-
- {item.icon} -
-

- {item.title} -

-

- {item.desc} -

-
- - ))} -
-
-
- - {/* Expertise Section */} -
- -
- -
- -
-
- Technische Beratung -
-
-
- -
- - - {t("expertise.tag")} - -

- {t("expertise.title")} -

-

- {t("expertise.description")} -

-
-
- {t.raw("expertise.groups").map((item: string, i: number) => ( - -
-
-
- -
- {item} -
- - ))} -
-
-
-
-
- - {/* Technical Specs Section */} -
-
- Background -
-
- - -
- - {/* Data Stream Effect */} -
-
- - - - {t("specs.tag")} - -

- {t("specs.title")} -

-
- -
- {[ - { - label: t("specs.items.kabel.label"), - value: t("specs.items.kabel.value"), - desc: t("specs.items.kabel.desc"), - }, - { - label: t("specs.items.spannung.label"), - value: t("specs.items.spannung.value"), - desc: t("specs.items.spannung.desc"), - }, - { - label: t("specs.items.technologie.label"), - value: t("specs.items.technologie.value"), - desc: t("specs.items.technologie.desc"), - }, - ].map((item, i) => ( - -
-
-

- {item.label} -

-

- {item.value} -

-

{item.desc}

-
- - ))} -
-
-
- - {/* CTA Section */} -
- - {/* Decorative Background Elements */} -
-
- -
- - -
- {/* Corner Accents */} -
-
-
-
- -
- - - - - -
- -
-

- {t("cta.title")} -

-

- {t("cta.subtitle")} -

- -
-
- -
-
+ {/* Dynamic Sections */} + + + + ); } diff --git a/components/sections/CTASection.tsx b/components/sections/CTASection.tsx new file mode 100644 index 0000000..f73a044 --- /dev/null +++ b/components/sections/CTASection.tsx @@ -0,0 +1,102 @@ +"use client"; + +import React from "react"; +import { m } from "framer-motion"; +import { Reveal } from "../Reveal"; +import { Counter } from "../Counter"; +import { TechBackground } from "../TechBackground"; +import { Button } from "../Button"; +import { useTranslations } from "next-intl"; + +export const CTASection = () => { + const t = useTranslations("Index"); + + return ( +
+ + {/* Decorative Background Elements */} +
+
+ +
+ + +
+ {/* Corner Accents */} +
+
+
+
+ +
+ + + + + +
+ +
+

+ {t("cta.title")} +

+

+ {t("cta.subtitle")} +

+ +
+
+ +
+
+ ); +}; diff --git a/components/sections/ExpertiseSection.tsx b/components/sections/ExpertiseSection.tsx new file mode 100644 index 0000000..b65bca0 --- /dev/null +++ b/components/sections/ExpertiseSection.tsx @@ -0,0 +1,64 @@ +"use client"; + +import React from "react"; +import Image from "next/image"; +import { CheckCircle2 } from "lucide-react"; +import { Reveal } from "../Reveal"; +import { Counter } from "../Counter"; +import { TechBackground } from "../TechBackground"; +import { useTranslations } from "next-intl"; + +export const ExpertiseSection = () => { + const t = useTranslations("Index"); + + return ( +
+ +
+ +
+ +
+
+ Technische Beratung +
+
+
+ +
+ + + {t("expertise.tag")} + +

+ {t("expertise.title")} +

+

+ {t("expertise.description")} +

+
+
+ {t.raw("expertise.groups").map((item: string, i: number) => ( + +
+
+
+ +
+ {item} +
+ + ))} +
+
+
+
+
+ ); +}; diff --git a/components/sections/PortfolioSection.tsx b/components/sections/PortfolioSection.tsx new file mode 100644 index 0000000..2aac6f2 --- /dev/null +++ b/components/sections/PortfolioSection.tsx @@ -0,0 +1,80 @@ +"use client"; + +import React from "react"; +import Link from "next/link"; +import { ChevronRight, Zap, Shield, BarChart3 } from "lucide-react"; +import { Reveal } from "../Reveal"; +import { Counter } from "../Counter"; +import { TechBackground } from "../TechBackground"; +import { useTranslations } from "next-intl"; + +export const PortfolioSection = () => { + const t = useTranslations("Index"); + + return ( +
+ +
+ + +
+ + {t("portfolio.tag")} + +

+ {t("portfolio.title")} +

+

+ {t("portfolio.description")} +

+
+ + {t("portfolio.link")}{" "} + + +
+ +
+ {[ + { + icon: , + title: t("portfolio.items.beratung.title"), + desc: t("portfolio.items.beratung.desc"), + }, + { + icon: , + title: t("portfolio.items.begleitung.title"), + desc: t("portfolio.items.begleitung.desc"), + }, + { + icon: , + title: t("portfolio.items.beschaffung.title"), + desc: t("portfolio.items.beschaffung.desc"), + }, + ].map((item, i) => ( + +
+
+
+ {item.icon} +
+

+ {item.title} +

+

+ {item.desc} +

+
+ + ))} +
+
+
+ ); +}; diff --git a/components/sections/TechnicalSpecsSection.tsx b/components/sections/TechnicalSpecsSection.tsx new file mode 100644 index 0000000..68921e5 --- /dev/null +++ b/components/sections/TechnicalSpecsSection.tsx @@ -0,0 +1,76 @@ +"use client"; + +import React from "react"; +import Image from "next/image"; +import { Reveal } from "../Reveal"; +import { Counter } from "../Counter"; +import { TechBackground } from "../TechBackground"; +import { useTranslations } from "next-intl"; + +export const TechnicalSpecsSection = () => { + const t = useTranslations("Index"); + + return ( +
+
+ Background +
+
+ + +
+ + {/* Data Stream Effect */} +
+
+ + + + {t("specs.tag")} + +

+ {t("specs.title")} +

+
+ +
+ {[ + { + label: t("specs.items.kabel.label"), + value: t("specs.items.kabel.value"), + desc: t("specs.items.kabel.desc"), + }, + { + label: t("specs.items.spannung.label"), + value: t("specs.items.spannung.value"), + desc: t("specs.items.spannung.desc"), + }, + { + label: t("specs.items.technologie.label"), + value: t("specs.items.technologie.value"), + desc: t("specs.items.technologie.desc"), + }, + ].map((item, i) => ( + +
+
+

+ {item.label} +

+

+ {item.value} +

+

{item.desc}

+
+ + ))} +
+
+
+ ); +}; diff --git a/public/assets/logo.png b/public/assets/logo.png index 7252cc1..f7bcbbb 100644 Binary files a/public/assets/logo.png and b/public/assets/logo.png differ diff --git a/public/media/cables/hs-kabel.png b/public/media/cables/hs-kabel.png index 2e0f7b9..532cf61 100644 Binary files a/public/media/cables/hs-kabel.png and b/public/media/cables/hs-kabel.png differ diff --git a/public/media/laying/contact-hero.jpg b/public/media/laying/contact-hero.jpg index 2a65484..06a9a01 100644 Binary files a/public/media/laying/contact-hero.jpg and b/public/media/laying/contact-hero.jpg differ diff --git a/sentry.client.config.ts b/sentry.client.config.ts index b071947..c95319b 100644 --- a/sentry.client.config.ts +++ b/sentry.client.config.ts @@ -4,7 +4,7 @@ import { config } from "./lib/config"; if (config.errors.glitchtip.enabled) { Sentry.init({ dsn: config.errors.glitchtip.dsn, - tracesSampleRate: 1.0, + tracesSampleRate: 0.1, debug: config.isDevelopment, environment: config.target || "production", // Use the proxy path defined in config