From 84f035a9fdcf156028e1f79dd5d02c2c4f59a6d8 Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Wed, 13 May 2026 22:14:47 +0200 Subject: [PATCH] chore: optimize reference gallery, add typography plugin, fix SEO and map animations --- .gitea/workflows/deploy.yml | 1 + app/[locale]/[slug]/page.tsx | 68 +++---- app/[locale]/layout.tsx | 6 +- app/[locale]/referenzen/[slug]/page.tsx | 166 ++++++++++++++++ app/[locale]/referenzen/page.tsx | 172 ++++++++++++++++ app/globals.css | 1 + components/blocks/ContactSection.tsx | 4 +- components/blocks/InteractiveGermanyMap.tsx | 210 +++++++++++--------- components/layout/Footer.tsx | 36 +++- content/de/datenschutz.mdx | 5 +- content/de/impressum.mdx | 5 +- content/de/messen.mdx | 12 +- content/de/referenzen/boerde.mdx | 12 ++ content/de/referenzen/bomlitz.mdx | 13 ++ content/de/referenzen/eisenhuettenstadt.mdx | 19 ++ content/de/referenzen/forst.mdx | 16 ++ content/de/referenzen/goerne.mdx | 19 ++ content/de/referenzen/spreewald.mdx | 19 ++ content/en/datenschutz.mdx | 5 +- content/en/impressum.mdx | 5 +- content/en/referenzen/boerde.mdx | 12 ++ content/en/referenzen/bomlitz.mdx | 13 ++ content/en/referenzen/eisenhuettenstadt.mdx | 19 ++ content/en/referenzen/forst.mdx | 16 ++ content/en/referenzen/goerne.mdx | 19 ++ content/en/referenzen/spreewald.mdx | 19 ++ lib/map-data.ts | 86 ++++++++ lib/references.ts | 52 +++++ lib/schema.ts | 8 +- messages/de.json | 2 +- messages/en.json | 2 +- next.config.mjs | 3 + package.json | 1 + pnpm-lock.yaml | 29 +++ 34 files changed, 913 insertions(+), 162 deletions(-) create mode 100644 app/[locale]/referenzen/[slug]/page.tsx create mode 100644 app/[locale]/referenzen/page.tsx create mode 100644 content/de/referenzen/boerde.mdx create mode 100644 content/de/referenzen/bomlitz.mdx create mode 100644 content/de/referenzen/eisenhuettenstadt.mdx create mode 100644 content/de/referenzen/forst.mdx create mode 100644 content/de/referenzen/goerne.mdx create mode 100644 content/de/referenzen/spreewald.mdx create mode 100644 content/en/referenzen/boerde.mdx create mode 100644 content/en/referenzen/bomlitz.mdx create mode 100644 content/en/referenzen/eisenhuettenstadt.mdx create mode 100644 content/en/referenzen/forst.mdx create mode 100644 content/en/referenzen/goerne.mdx create mode 100644 content/en/referenzen/spreewald.mdx create mode 100644 lib/map-data.ts create mode 100644 lib/references.ts diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 8d4e9e6b8..ac98d0d2c 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -203,6 +203,7 @@ jobs: build-args: | NEXT_PUBLIC_BASE_URL=${{ needs.prepare.outputs.next_public_url }} NEXT_PUBLIC_TARGET=${{ needs.prepare.outputs.target }} + NEXT_PUBLIC_APP_VERSION=${{ needs.prepare.outputs.image_tag }} UMAMI_WEBSITE_ID=${{ secrets.UMAMI_WEBSITE_ID || vars.UMAMI_WEBSITE_ID }} UMAMI_API_ENDPOINT=${{ secrets.UMAMI_API_ENDPOINT || vars.UMAMI_API_ENDPOINT || 'https://analytics.infra.mintel.me' }} NPM_TOKEN=${{ steps.auth.outputs.working_token }} diff --git a/app/[locale]/[slug]/page.tsx b/app/[locale]/[slug]/page.tsx index c4dd43bde..66e2e241c 100644 --- a/app/[locale]/[slug]/page.tsx +++ b/app/[locale]/[slug]/page.tsx @@ -146,44 +146,42 @@ export default async function Page(props: { params: Promise<{ locale: string; sl {/* Main Content Area */} -
- {/* Excerpt/Lead paragraph if available */} - {pageData.frontmatter.excerpt && ( -
-

- {pageData.frontmatter.excerpt} -

-
- )} - - {/* Main content */} -
- + {/* Excerpt/Lead paragraph if available */} + {pageData.frontmatter.excerpt && ( +
+

+ {pageData.frontmatter.excerpt} +

+ )} - {/* Support Section */} -
-
-
-

{t('needHelp')}

-

{t('supportTeamAvailable')}

- - - {t('contactUs')} - - → - + {/* Main content */} +
+ +
+ + {/* Support Section */} +
+
+
+

{t('needHelp')}

+

{t('supportTeamAvailable')}

+ + + {t('contactUs')} + + → - - -
+ + +
diff --git a/app/[locale]/layout.tsx b/app/[locale]/layout.tsx index 2efb37174..88a11e49d 100644 --- a/app/[locale]/layout.tsx +++ b/app/[locale]/layout.tsx @@ -91,6 +91,10 @@ export default async function Layout(props: { label: safeLocale === 'de' ? 'Über uns' : 'About Us', url: `/${safeLocale}/${await mapFileSlugToTranslated('ueber-uns', safeLocale)}` }, + { + label: safeLocale === 'de' ? 'Referenzen' : 'References', + url: `/${safeLocale}/referenzen` + }, { label: safeLocale === 'de' ? 'Karriere' : 'Careers', url: `/${safeLocale}/${await mapFileSlugToTranslated('karriere', safeLocale)}` @@ -103,7 +107,7 @@ export default async function Layout(props: { const companyInfo = { contactEmail: 'info@e-tib.com', - contactPhone: '+49 15207230518', + contactPhone: '+49 (0) 3561 / 68577 33', address: 'Gewerbestraße 22\n03172 Guben' }; diff --git a/app/[locale]/referenzen/[slug]/page.tsx b/app/[locale]/referenzen/[slug]/page.tsx new file mode 100644 index 000000000..51576c875 --- /dev/null +++ b/app/[locale]/referenzen/[slug]/page.tsx @@ -0,0 +1,166 @@ +import { notFound } from 'next/navigation'; +import { Container, Badge, Heading } from '@/components/ui'; +import { setRequestLocale } from 'next-intl/server'; +import { Metadata } from 'next'; +import { getReferenceBySlug, getAllReferences } from '@/lib/references'; +import { MDXRemote } from 'next-mdx-remote/rsc'; +import { SITE_URL } from '@/lib/schema'; +import TrackedLink from '@/components/analytics/TrackedLink'; +import { getButtonClasses, ButtonOverlay } from '@/components/ui/Button'; +import { MapPin, Calendar, Briefcase, ChevronLeft } from 'lucide-react'; +import Image from 'next/image'; + +interface PageProps { + params: Promise<{ + locale: string; + slug: string; + }>; +} + +export async function generateMetadata({ params }: PageProps): Promise { + const { locale, slug } = await params; + if (locale !== 'de' && locale !== 'en') return {}; + + const reference = await getReferenceBySlug(slug, locale); + if (!reference) return {}; + + return { + title: `${reference.frontmatter.title} | Referenzen | E-TIB Gruppe`, + description: `Details zum Projekt ${reference.frontmatter.title} in ${reference.frontmatter.location}.`, + alternates: { + canonical: `${SITE_URL}/${locale}/referenzen/${slug}`, + }, + openGraph: { + title: `${reference.frontmatter.title} | E-TIB`, + description: `Details zum Projekt ${reference.frontmatter.title} in ${reference.frontmatter.location}.`, + url: `${SITE_URL}/${locale}/referenzen/${slug}`, + }, + }; +} + +export async function generateStaticParams({ params }: { params: { locale: string } }) { + const references = await getAllReferences(params.locale); + return references.map((ref) => ({ + slug: ref.slug, + })); +} + +export default async function ReferenceDetail(props: { params: Promise<{ locale: string; slug: string }> }) { + const { locale, slug } = await props.params; + + if (locale !== 'de' && locale !== 'en') { + notFound(); + } + + setRequestLocale(locale); + const reference = await getReferenceBySlug(slug, locale); + + if (!reference) { + notFound(); + } + + // MDX components mapping can be expanded if we use custom components in reference MDX + const mdxComponents = { + ul: ({ children }: any) =>
    {children}
, + li: ({ children }: any) => ( +
  • +
    +
    +
    + {children} +
  • + ), + }; + + return ( +
    + {/* Hero Section */} +
    + {reference.frontmatter.featuredImage && ( +
    + {reference.frontmatter.title} +
    +
    +
    + )} +
    +
    +
    + +
    + + + Zurück zur Übersicht + +
    +
    + + Projektreferenz + + + {reference.frontmatter.title} + + +
    +
    + +
    +

    Ort

    +

    {reference.frontmatter.location}

    +
    +
    +
    + +
    +

    Auftraggeber

    +

    {reference.frontmatter.client}

    +
    +
    +
    + +
    +

    Zeitraum

    +

    {reference.frontmatter.dateString || new Date(reference.frontmatter.date).getFullYear()}

    +
    +
    +
    +
    +
    +
    + + {/* Main Content Area */} + +
    +

    Leistungsumfang & Projektbeschreibung

    + +
    + +
    + +
    + + + Alle Referenzen ansehen + + + +
    +
    +
    +
    + ); +} diff --git a/app/[locale]/referenzen/page.tsx b/app/[locale]/referenzen/page.tsx new file mode 100644 index 000000000..3d06c1424 --- /dev/null +++ b/app/[locale]/referenzen/page.tsx @@ -0,0 +1,172 @@ +import { Container, Heading, Badge } from '@/components/ui'; +import { getTranslations, setRequestLocale } from 'next-intl/server'; +import { Metadata } from 'next'; +import { getAllReferences } from '@/lib/references'; +import TrackedLink from '@/components/analytics/TrackedLink'; +import { MapPin, Calendar, Briefcase, ArrowUpRight } from 'lucide-react'; +import { getButtonClasses, ButtonOverlay } from '@/components/ui/Button'; +import { SITE_URL } from '@/lib/schema'; +import Image from 'next/image'; +import { InteractiveGermanyMap } from '@/components/blocks/InteractiveGermanyMap'; +import { defaultLocations } from '@/lib/map-data'; + +interface PageProps { + params: Promise<{ + locale: string; + }>; +} + +export async function generateMetadata({ params }: PageProps): Promise { + const { locale } = await params; + if (locale !== 'de' && locale !== 'en') return {}; + + return { + title: 'Referenzen | E-TIB Gruppe', + description: 'Erfolgreich abgeschlossene Projekte der E-TIB Gruppe im Bereich Kabeltiefbau, Spülbohrtechnik und Netzinfrastruktur.', + alternates: { + canonical: `${SITE_URL}/${locale}/referenzen`, + languages: { + de: `${SITE_URL}/de/referenzen`, + en: `${SITE_URL}/en/referenzen`, + 'x-default': `${SITE_URL}/en/referenzen`, + }, + }, + }; +} + +export default async function ReferenzenOverview(props: { params: Promise<{ locale: string }> }) { + const { locale } = await props.params; + setRequestLocale(locale); + const t = await getTranslations('StandardPage'); + + const references = await getAllReferences(locale); + + // Enrich the static map locations with dynamic project data (images, details) + const enrichedLocations = defaultLocations.map(loc => { + if (loc.type === 'project') { + const ref = references.find(r => r.slug === loc.id); + if (ref) { + return { + ...loc, + featuredImage: ref.frontmatter.featuredImage, + details: [ + ref.frontmatter.client || 'Kunde', + ref.frontmatter.dateString || new Date(ref.frontmatter.date).getFullYear().toString(), + ], + }; + } + } + return loc; + }); + + return ( +
    + {/* Map Hero Section */} + Erfolgreich umgesetzte
    Projekte.} + description="Vom Breitbandausbau bis zur komplexen 110kV-Trasse: Ein Auszug unserer bundesweiten Projekte, bei denen wir Infrastruktur für die Zukunft geschaffen haben. Entdecken Sie unsere Standorte." + locations={enrichedLocations} + /> + + {/* Main Content Area */} + +
    + {references.map((ref) => ( + +
    + {/* Image Section */} +
    + {ref.frontmatter.featuredImage ? ( + {ref.frontmatter.title} + ) : ( +
    + E-TIB Logo +
    + )} +
    + + {/* Location Badge */} +
    + + + {ref.frontmatter.location} + +
    +
    + + {/* Content Section */} +
    +

    + {ref.frontmatter.title} +

    + + {/* Technical Meta Data */} +
    +
    + Kunde + + + {ref.frontmatter.client} + +
    +
    + Zeitraum + + + {ref.frontmatter.dateString || new Date(ref.frontmatter.date).getFullYear()} + +
    +
    +
    + + {/* Industrial Hover Indicator */} +
    + +
    +
    + + ))} +
    + + {/* Support Section */} +
    +
    +
    +

    Ihr nächstes Projekt?

    +

    Lassen Sie uns gemeinsam herausragende Infrastruktur bauen.

    + + + {t('contactUs')} + + → + + + + +
    +
    + +
    + ); +} diff --git a/app/globals.css b/app/globals.css index dcec4495a..ef52754de 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,4 +1,5 @@ @import "tailwindcss"; +@plugin "@tailwindcss/typography"; @config "../tailwind.config.cjs"; diff --git a/components/blocks/ContactSection.tsx b/components/blocks/ContactSection.tsx index 4c9061416..1597309a0 100644 --- a/components/blocks/ContactSection.tsx +++ b/components/blocks/ContactSection.tsx @@ -36,8 +36,8 @@ export const ContactSection: React.FC = (props) => {
    diff --git a/components/blocks/InteractiveGermanyMap.tsx b/components/blocks/InteractiveGermanyMap.tsx index 1da9117cf..86e99905a 100644 --- a/components/blocks/InteractiveGermanyMap.tsx +++ b/components/blocks/InteractiveGermanyMap.tsx @@ -4,77 +4,8 @@ import React, { useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { MapPin, Factory, Zap, CheckCircle2 } from 'lucide-react'; import Image from 'next/image'; - -export interface Location { - id: string; - name: string; - type: 'hq' | 'branch' | 'project'; - x: number; - y: number; - description: string; - details?: string[]; -} - -const defaultLocations: Location[] = [ - { - id: 'guben', - name: 'Guben (Hauptsitz)', - type: 'hq', - x: 85, - y: 48, - description: 'E-TIB GmbH Holding & Bohrtechnik GmbH', - details: ['Zentrale Steuerung', 'Kabelleitungstiefbau', 'Maschinenpark'], - }, - { - id: 'buelstedt', - name: 'Bülstedt (Ingenieurgesellschaft)', - type: 'branch', - x: 37, - y: 25, - description: 'E-TIB Ingenieurgesellschaft mbH', - details: ['Planung & Projektierung', 'Vermessung', 'Dokumentation'], - }, - { - id: 'spreewald', - name: 'Spreewald (Projekt)', - type: 'project', - x: 82, - y: 45, - description: 'Breitbandausbau FTTC', - }, - { - id: 'bomlitz', - name: 'Bomlitz (Projekt)', - type: 'project', - x: 45, - y: 30, - description: 'Breitbandausbau FTTH', - }, - { - id: 'forst', - name: 'Forst (Projekt)', - type: 'project', - x: 88, - y: 50, - description: 'Neubau Kabeltrasse', - }, - { - id: 'eisenhuettenstadt', - name: 'Eisenhüttenstadt (Projekt)', - type: 'project', - x: 85, - y: 40, - description: 'Kabelverbindung U30 - T10', - }, - { - id: 'goerne', - name: 'Görne (Projekt)', - type: 'project', - x: 70, - y: 35, - description: 'Einspeisung PV-Anlage', - } -]; +import { useRouter } from 'next/navigation'; +import { Location } from '@/lib/map-data'; interface Stat { value: string; @@ -88,6 +19,7 @@ interface InteractiveGermanyMapProps { description?: string; stats?: Stat[]; locations?: Location[]; + isHero?: boolean; } export function InteractiveGermanyMap({ @@ -98,22 +30,24 @@ export function InteractiveGermanyMap({ { value: '100', suffix: '%', label: 'Überregionale Reichweite' }, { value: '2', suffix: '+', label: 'Operative Standorte' }, ], - locations = defaultLocations + locations = defaultLocations, + isHero = false }: InteractiveGermanyMapProps) { const [activeLocation, setActiveLocation] = useState(null); + const router = useRouter(); const hq = locations.find((l) => l.type === 'hq'); const branch = locations.find((l) => l.type === 'branch'); const projects = locations.filter((l) => l.type === 'project'); return ( -
    -
    +
    +
    {/* Background Effects */} -
    -
    +
    +
    -
    +
    {/* Content Left */}
    @@ -122,9 +56,15 @@ export function InteractiveGermanyMap({ {badge}
    -

    - {title} -

    + {isHero ? ( +

    + {title} +

    + ) : ( +

    + {title} +

    + )}

    {description} @@ -199,13 +139,32 @@ export function InteractiveGermanyMap({ const isBranch = loc.type === 'branch'; const isActive = activeLocation?.id === loc.id; + const isNearLeft = loc.x < 50; + const isNearRight = loc.x >= 50; + const isNearTop = loc.y < 55; // 55% threshold to strongly avoid the top header + + const tooltipClasses = [ + 'absolute w-[280px] sm:w-64 bg-white text-neutral-dark p-5 rounded-2xl shadow-2xl z-[9999] pointer-events-none border border-neutral-100', + isNearLeft ? 'left-1/2 sm:left-0 -translate-x-1/2 sm:translate-x-0' : 'left-1/2 sm:left-auto sm:right-0 -translate-x-1/2 sm:translate-x-0', + isNearTop ? 'top-full mt-4' : 'bottom-full mb-4' + ].join(' '); + + const arrowClasses = [ + 'absolute border-8 border-transparent drop-shadow-sm hidden sm:block', + isNearLeft ? 'left-6' : 'right-6', + isNearTop ? '-top-4 border-b-white border-t-0' : '-bottom-4 border-t-white border-b-0' + ].join(' '); + return (

    setActiveLocation(loc)} onMouseLeave={() => setActiveLocation(null)} + onClick={() => { + if (loc.href) router.push(loc.href); + }} > {/* Ping Animation for HQ / Branch */} {(isHQ || isBranch) && ( @@ -222,7 +181,7 @@ export function InteractiveGermanyMap({ } ${ isHQ || isBranch ? 'w-6 h-6 bg-primary text-[#050B14]' - : 'w-3 h-3 bg-white/90 ring-2 ring-primary' + : 'w-4 h-4 bg-white ring-[3px] ring-primary' }`} > {(isHQ || isBranch) && } @@ -232,33 +191,92 @@ export function InteractiveGermanyMap({ {isActive && ( -
    - {isHQ ? : } - {loc.name} -
    -

    {loc.description}

    + {loc.featuredImage && ( + + {loc.name} +
    +
    + {isHQ ? : } + {loc.name} +
    + + )} + +
    + {!loc.featuredImage && ( + + {isHQ ? : } + {loc.name} + + )} + + + {loc.description} + {loc.details && (
      {loc.details.map((detail, i) => ( -
    • +
      {detail} -
    • + ))}
    )} - {/* Arrow Down */} -
    + {loc.href && ( + + Zum Projekt + + + )} +
    + + {/* Arrow Down/Up */} +
    )} diff --git a/components/layout/Footer.tsx b/components/layout/Footer.tsx index 6bea5a416..7e70fc2dc 100644 --- a/components/layout/Footer.tsx +++ b/components/layout/Footer.tsx @@ -122,13 +122,9 @@ export function Footer({ companyInfo }: FooterProps) { ))} - {/* Built Info inside Legal box for compact layout */} - + {/* Built Info */} + + {/* Legal Info removed from here */}
    @@ -136,7 +132,31 @@ export function Footer({ companyInfo }: FooterProps) {
    -

    © {new Date().getFullYear()} E-TIB GmbH. {locale === 'de' ? 'Alle Rechte vorbehalten.' : 'All rights reserved.'}

    +
    +

    © {new Date().getFullYear()} E-TIB GmbH. {locale === 'de' ? 'Alle Rechte vorbehalten.' : 'All rights reserved.'}

    + +
    + +
    + + Designed & Engineered by Mintel + + {process.env.NEXT_PUBLIC_APP_VERSION && ( + <> + +
    + v{process.env.NEXT_PUBLIC_APP_VERSION.replace(/^v/, '')} + {process.env.NEXT_PUBLIC_TARGET && process.env.NEXT_PUBLIC_TARGET !== 'production' && ( + + {process.env.NEXT_PUBLIC_TARGET} + + )} +
    + + )} +
    +
    +
    diff --git a/content/de/datenschutz.mdx b/content/de/datenschutz.mdx index ad715a5f8..faa579c93 100644 --- a/content/de/datenschutz.mdx +++ b/content/de/datenschutz.mdx @@ -30,8 +30,9 @@ E-TIB GmbH Gewerbestraße 22 03172 Guben -Telefon: +49 1520 7230518 -E-Mail: d.joseph@e-tib.com +Telefon: +49 (0) 3561 / 68577 33 +Telefax: +49 (0) 3561 / 68577 35 +E-Mail: info@e-tib.com ## 4. Datenerfassung auf dieser Website diff --git a/content/de/impressum.mdx b/content/de/impressum.mdx index eefc986ad..f68536ef0 100644 --- a/content/de/impressum.mdx +++ b/content/de/impressum.mdx @@ -17,8 +17,9 @@ Danny Joseph ## Kontakt -Telefon: +49 1520 7230518 -E-Mail: d.joseph@e-tib.com +Telefon: +49 (0) 3561 / 68577 33 +Telefax: +49 (0) 3561 / 68577 35 +E-Mail: info@e-tib.com ## Registereintrag diff --git a/content/de/messen.mdx b/content/de/messen.mdx index 56f6cfd78..fb41c9339 100644 --- a/content/de/messen.mdx +++ b/content/de/messen.mdx @@ -6,12 +6,12 @@ layout: "fullBleed" ---
    diff --git a/content/de/referenzen/boerde.mdx b/content/de/referenzen/boerde.mdx new file mode 100644 index 000000000..0449f76eb --- /dev/null +++ b/content/de/referenzen/boerde.mdx @@ -0,0 +1,12 @@ +--- +title: "Breitbandausbau FTTH, Landkreis Börde" +client: "EKN Breitband GmbH & Co. KG" +date: "2026-01-01" +dateString: "seit 05/2019" +location: "Landkreis Börde" +featuredImage: "/assets/photos/etib_ingenieure_tiefbau_solar_pv_planung_vermessung_gis-294.jpg" +--- + +- 109.000 m Leitungstrasse herstellen (Tiefbau/HDD) +- 63 Stück Aufstellung Netzverteiler +- 747 Stück Herstellung Hausanschlüsse diff --git a/content/de/referenzen/bomlitz.mdx b/content/de/referenzen/bomlitz.mdx new file mode 100644 index 000000000..5f8e4c173 --- /dev/null +++ b/content/de/referenzen/bomlitz.mdx @@ -0,0 +1,13 @@ +--- +title: "Breitbandausbau FTTH, Planungsregion Bomlitz" +client: "Telekom Deutschland GmbH" +date: "2018-12-31" +dateString: "04/2018 bis 12/2018" +location: "Bomlitz" +featuredImage: "/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-100.jpg" +--- + +- 88.890 m Leitungstrasse herstellen (Tiefbau/HDD) +- 23 Stück Aufstellung Multifunktionsgehäuse +- 52 Stück Aufstellung Netzverteiler +- 571 Stück Herstellung Hausanschlüsse diff --git a/content/de/referenzen/eisenhuettenstadt.mdx b/content/de/referenzen/eisenhuettenstadt.mdx new file mode 100644 index 000000000..a215e75ac --- /dev/null +++ b/content/de/referenzen/eisenhuettenstadt.mdx @@ -0,0 +1,19 @@ +--- +title: "Kabelverbindung U30 - T10, 15890 Eisenhüttenstadt" +client: "ArcelorMittal Eisenhüttenstadt GmbH" +date: "2019-12-31" +dateString: "07/2019 bis 12/2019" +location: "Eisenhüttenstadt" +featuredImage: "/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie_Vermessung_(24_von_99)_groß2.jpg" +--- + +- 2.095 m Kabelgraben ausheben und verfüllen +- 180 m Horizontalspülbohrung d 160 + d 50 +- 5.700 m Lieferung und Verlegung MS-Kabel 240 mm², 18/30 kV +- 3.000 m Lieferung und Verlegung PE-Schutzrohr 50 x 4,6 mm +- 3.000 m Lieferung und Einblasen LWL-Kabel, 12 Fasern +- 3.000 m Lieferung und Verlegung Steuerkabel, 0,6/1 kV +- 16 Satz Lieferung und Montage MS-Verbindungsmuffe 240 mm², 18/30 kV +- 1 Stück Lieferung und Montage LWL-Verbindungsmuffe, 12 Fasern +- 4 Satz Lieferung und Montage MS-T-Stecker 240 mm², 18/30 kV +- Hauptprüfung / Mantelprüfung / OTDR-Messung diff --git a/content/de/referenzen/forst.mdx b/content/de/referenzen/forst.mdx new file mode 100644 index 000000000..508ec6735 --- /dev/null +++ b/content/de/referenzen/forst.mdx @@ -0,0 +1,16 @@ +--- +title: "Neubau Kabeltrasse, 03149 Forst" +client: "Mitteldeutsche Netzgesellschaft Strom mbH" +date: "2020-09-30" +dateString: "03/2020 bis 09/2020" +location: "Forst" +featuredImage: "/assets/photos/DSC02156.jpg" +--- + +- 2984 m Kabelgraben ausheben und verfüllen +- 945 m Horizontalspülbohrung d 160 + d 50 +- 3.929 m Verlegung MS-Kabel 240 mm², 12/20 kV +- 3.929 m Verlegung PE-Schutzrohr 50 x 4,6 mm +- 11 Satz Montage MS-Verbindungsmuffe 240 mm², 12/20 kV +- 1 Satz Montage MS-Endverschluss 240 mm², 12/20 kV +- 2.000 m Rückbau Freileitung (inkl. 16 Stück Maste) diff --git a/content/de/referenzen/goerne.mdx b/content/de/referenzen/goerne.mdx new file mode 100644 index 000000000..8bc6c32d3 --- /dev/null +++ b/content/de/referenzen/goerne.mdx @@ -0,0 +1,19 @@ +--- +title: "Einspeisung PV-Anlage 14728 Görne" +client: "EVH GmbH" +date: "2020-07-31" +dateString: "05/2020 bis 07/2020" +location: "Görne" +featuredImage: "/assets/photos/DSC08744.JPG" +--- + +- 4.215 m Kabelgraben ausheben und verfüllen +- 1.285 m Horizontalspülbohrung d 140 + d 50 +- 5.500 m Verlegung MS-Kabel 300 mm², 12/20 kV +- 4.500 m Verlegung MS-Kabel 300 mm², 12/20 kV mittels Kabelpflug +- 10.000 m Verlegung PE-Schutzrohr 50 x 4,6 mm +- 10.000 m Einblasen LWL-Kabel, 12 Fasern +- 3 Stück Lieferung und Montage LWL-Verbindungsmuffe, 12 Fasern +- 16 Satz Montage MS-Verbindungsmuffe 300 mm², 12/20 kV +- 4 Satz Montage MS-T-Stecker 300 mm², 12/20 kV +- Mantelprüfung, VLF-Prüfung, OTDR-Messung diff --git a/content/de/referenzen/spreewald.mdx b/content/de/referenzen/spreewald.mdx new file mode 100644 index 000000000..ba7d81f6f --- /dev/null +++ b/content/de/referenzen/spreewald.mdx @@ -0,0 +1,19 @@ +--- +title: "Breitbandausbau FTTC, Planungsregion Spreewald" +client: "Telekom Deutschland GmbH" +date: "2018-01-31" +dateString: "09/2017 bis 01/2018" +location: "Spreewald" +featuredImage: "/assets/photos/DSC01129.JPG" +--- + +- 4.006 m Kabelgraben ausheben und verfüllen +- 4.006 m Verlegung PE-Schutzrohr 50 x 4,6 mm +- 13.008 m Horizontalspülbohrung D 50 +- 94.951 m Einblasen von Kabel/Rohren unbelegt +- 42 Stück Stellen von Multifunktionsgehäusen +- Aufbau von Energieanschlusssäulen +- Aufbau elektrischer Anlagen 230V +- Koordination mit Energieversorgungsunternehmen +- Inbetriebnahme der elektrischen Anlagen +- Oberflächen- und Tiefbauarbeiten für Multifunktionsgehäuse diff --git a/content/en/datenschutz.mdx b/content/en/datenschutz.mdx index c33f5a05c..464afa1e9 100644 --- a/content/en/datenschutz.mdx +++ b/content/en/datenschutz.mdx @@ -31,8 +31,9 @@ Gewerbestraße 22 03172 Guben Germany -Phone: +49 1520 7230518 -Email: d.joseph@e-tib.com +Phone: +49 (0) 3561 / 68577 33 +Fax: +49 (0) 3561 / 68577 35 +Email: info@e-tib.com ## 4. Data Collection on this Website diff --git a/content/en/impressum.mdx b/content/en/impressum.mdx index 7c5f51cf7..b34c09fd5 100644 --- a/content/en/impressum.mdx +++ b/content/en/impressum.mdx @@ -18,8 +18,9 @@ Danny Joseph ## Contact -Phone: +49 1520 7230518 -Email: d.joseph@e-tib.com +Phone: +49 (0) 3561 / 68577 33 +Fax: +49 (0) 3561 / 68577 35 +Email: info@e-tib.com ## Register Entry diff --git a/content/en/referenzen/boerde.mdx b/content/en/referenzen/boerde.mdx new file mode 100644 index 000000000..0449f76eb --- /dev/null +++ b/content/en/referenzen/boerde.mdx @@ -0,0 +1,12 @@ +--- +title: "Breitbandausbau FTTH, Landkreis Börde" +client: "EKN Breitband GmbH & Co. KG" +date: "2026-01-01" +dateString: "seit 05/2019" +location: "Landkreis Börde" +featuredImage: "/assets/photos/etib_ingenieure_tiefbau_solar_pv_planung_vermessung_gis-294.jpg" +--- + +- 109.000 m Leitungstrasse herstellen (Tiefbau/HDD) +- 63 Stück Aufstellung Netzverteiler +- 747 Stück Herstellung Hausanschlüsse diff --git a/content/en/referenzen/bomlitz.mdx b/content/en/referenzen/bomlitz.mdx new file mode 100644 index 000000000..5f8e4c173 --- /dev/null +++ b/content/en/referenzen/bomlitz.mdx @@ -0,0 +1,13 @@ +--- +title: "Breitbandausbau FTTH, Planungsregion Bomlitz" +client: "Telekom Deutschland GmbH" +date: "2018-12-31" +dateString: "04/2018 bis 12/2018" +location: "Bomlitz" +featuredImage: "/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-100.jpg" +--- + +- 88.890 m Leitungstrasse herstellen (Tiefbau/HDD) +- 23 Stück Aufstellung Multifunktionsgehäuse +- 52 Stück Aufstellung Netzverteiler +- 571 Stück Herstellung Hausanschlüsse diff --git a/content/en/referenzen/eisenhuettenstadt.mdx b/content/en/referenzen/eisenhuettenstadt.mdx new file mode 100644 index 000000000..a215e75ac --- /dev/null +++ b/content/en/referenzen/eisenhuettenstadt.mdx @@ -0,0 +1,19 @@ +--- +title: "Kabelverbindung U30 - T10, 15890 Eisenhüttenstadt" +client: "ArcelorMittal Eisenhüttenstadt GmbH" +date: "2019-12-31" +dateString: "07/2019 bis 12/2019" +location: "Eisenhüttenstadt" +featuredImage: "/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie_Vermessung_(24_von_99)_groß2.jpg" +--- + +- 2.095 m Kabelgraben ausheben und verfüllen +- 180 m Horizontalspülbohrung d 160 + d 50 +- 5.700 m Lieferung und Verlegung MS-Kabel 240 mm², 18/30 kV +- 3.000 m Lieferung und Verlegung PE-Schutzrohr 50 x 4,6 mm +- 3.000 m Lieferung und Einblasen LWL-Kabel, 12 Fasern +- 3.000 m Lieferung und Verlegung Steuerkabel, 0,6/1 kV +- 16 Satz Lieferung und Montage MS-Verbindungsmuffe 240 mm², 18/30 kV +- 1 Stück Lieferung und Montage LWL-Verbindungsmuffe, 12 Fasern +- 4 Satz Lieferung und Montage MS-T-Stecker 240 mm², 18/30 kV +- Hauptprüfung / Mantelprüfung / OTDR-Messung diff --git a/content/en/referenzen/forst.mdx b/content/en/referenzen/forst.mdx new file mode 100644 index 000000000..508ec6735 --- /dev/null +++ b/content/en/referenzen/forst.mdx @@ -0,0 +1,16 @@ +--- +title: "Neubau Kabeltrasse, 03149 Forst" +client: "Mitteldeutsche Netzgesellschaft Strom mbH" +date: "2020-09-30" +dateString: "03/2020 bis 09/2020" +location: "Forst" +featuredImage: "/assets/photos/DSC02156.jpg" +--- + +- 2984 m Kabelgraben ausheben und verfüllen +- 945 m Horizontalspülbohrung d 160 + d 50 +- 3.929 m Verlegung MS-Kabel 240 mm², 12/20 kV +- 3.929 m Verlegung PE-Schutzrohr 50 x 4,6 mm +- 11 Satz Montage MS-Verbindungsmuffe 240 mm², 12/20 kV +- 1 Satz Montage MS-Endverschluss 240 mm², 12/20 kV +- 2.000 m Rückbau Freileitung (inkl. 16 Stück Maste) diff --git a/content/en/referenzen/goerne.mdx b/content/en/referenzen/goerne.mdx new file mode 100644 index 000000000..8bc6c32d3 --- /dev/null +++ b/content/en/referenzen/goerne.mdx @@ -0,0 +1,19 @@ +--- +title: "Einspeisung PV-Anlage 14728 Görne" +client: "EVH GmbH" +date: "2020-07-31" +dateString: "05/2020 bis 07/2020" +location: "Görne" +featuredImage: "/assets/photos/DSC08744.JPG" +--- + +- 4.215 m Kabelgraben ausheben und verfüllen +- 1.285 m Horizontalspülbohrung d 140 + d 50 +- 5.500 m Verlegung MS-Kabel 300 mm², 12/20 kV +- 4.500 m Verlegung MS-Kabel 300 mm², 12/20 kV mittels Kabelpflug +- 10.000 m Verlegung PE-Schutzrohr 50 x 4,6 mm +- 10.000 m Einblasen LWL-Kabel, 12 Fasern +- 3 Stück Lieferung und Montage LWL-Verbindungsmuffe, 12 Fasern +- 16 Satz Montage MS-Verbindungsmuffe 300 mm², 12/20 kV +- 4 Satz Montage MS-T-Stecker 300 mm², 12/20 kV +- Mantelprüfung, VLF-Prüfung, OTDR-Messung diff --git a/content/en/referenzen/spreewald.mdx b/content/en/referenzen/spreewald.mdx new file mode 100644 index 000000000..ba7d81f6f --- /dev/null +++ b/content/en/referenzen/spreewald.mdx @@ -0,0 +1,19 @@ +--- +title: "Breitbandausbau FTTC, Planungsregion Spreewald" +client: "Telekom Deutschland GmbH" +date: "2018-01-31" +dateString: "09/2017 bis 01/2018" +location: "Spreewald" +featuredImage: "/assets/photos/DSC01129.JPG" +--- + +- 4.006 m Kabelgraben ausheben und verfüllen +- 4.006 m Verlegung PE-Schutzrohr 50 x 4,6 mm +- 13.008 m Horizontalspülbohrung D 50 +- 94.951 m Einblasen von Kabel/Rohren unbelegt +- 42 Stück Stellen von Multifunktionsgehäusen +- Aufbau von Energieanschlusssäulen +- Aufbau elektrischer Anlagen 230V +- Koordination mit Energieversorgungsunternehmen +- Inbetriebnahme der elektrischen Anlagen +- Oberflächen- und Tiefbauarbeiten für Multifunktionsgehäuse diff --git a/lib/map-data.ts b/lib/map-data.ts new file mode 100644 index 000000000..70f5b6739 --- /dev/null +++ b/lib/map-data.ts @@ -0,0 +1,86 @@ +export interface Location { + id: string; + name: string; + type: 'hq' | 'branch' | 'project'; + x: number; + y: number; + description: string; + details?: string[]; + href?: string; + featuredImage?: string; +} + +export const defaultLocations: Location[] = [ + { + id: 'guben', + name: 'Guben (Hauptsitz)', + type: 'hq', + x: 85, + y: 48, + description: 'E-TIB GmbH Holding & Bohrtechnik GmbH', + details: ['Zentrale Steuerung', 'Kabelleitungstiefbau', 'Maschinenpark'], + }, + { + id: 'buelstedt', + name: 'Bülstedt (Ingenieurgesellschaft)', + type: 'branch', + x: 37, + y: 25, + description: 'E-TIB Ingenieurgesellschaft mbH', + details: ['Planung & Projektierung', 'Vermessung', 'Dokumentation'], + }, + { + id: 'spreewald', + name: 'Spreewald (LWL-Trasse)', + type: 'project', + x: 81, + y: 42, + description: '28km LWL-Trasse inkl. Spülbohrung', + href: '/referenzen/spreewald', + }, + { + id: 'bomlitz', + name: 'Bomlitz (110kV-Trasse)', + type: 'project', + x: 43, + y: 30, + description: 'Neuverlegung einer 110kV Hochspannungstrasse', + href: '/referenzen/bomlitz', + }, + { + id: 'forst', + name: 'Forst (Verteilerknoten)', + type: 'project', + x: 87, + y: 52, + description: 'Ausbau lokaler Glasfasernetze', + href: '/referenzen/forst', + }, + { + id: 'eisenhuettenstadt', + name: 'Eisenhüttenstadt (Industriegebiet)', + type: 'project', + x: 86, + y: 44, + description: 'Erschließung Industriegebiet Nord', + href: '/referenzen/eisenhuettenstadt', + }, + { + id: 'goerne', + name: 'Görne (Breitbandausbau)', + type: 'project', + x: 65, + y: 35, + description: 'Glasfaser-Rückgrat für 3 Gemeinden', + href: '/referenzen/goerne', + }, + { + id: 'boerde', + name: 'Börde (Windpark-Anschluss)', + type: 'project', + x: 55, + y: 38, + description: 'Kabeltrasse für erneuerbare Energien', + href: '/referenzen/boerde', + } +]; diff --git a/lib/references.ts b/lib/references.ts new file mode 100644 index 000000000..c4c353e6b --- /dev/null +++ b/lib/references.ts @@ -0,0 +1,52 @@ +import fs from 'fs'; +import path from 'path'; +import matter from 'gray-matter'; + +export interface ReferenceFrontmatter { + title: string; + client: string; + date: string; + dateString?: string; + featuredImage?: string | null; + location: string; +} + +export interface ReferenceData { + slug: string; + frontmatter: ReferenceFrontmatter; + content: string; +} + +export async function getReferenceBySlug(slug: string, locale: string): Promise { + const localeDir = path.join(process.cwd(), 'content', locale, 'referenzen'); + const filePath = path.join(localeDir, `${slug}.mdx`); + + if (!fs.existsSync(filePath)) return null; + + const source = fs.readFileSync(filePath, 'utf8'); + const { content, data } = matter(source); + + return { + slug, + frontmatter: data as ReferenceFrontmatter, + content, + }; +} + +export async function getAllReferences(locale: string): Promise { + const localeDir = path.join(process.cwd(), 'content', locale, 'referenzen'); + if (!fs.existsSync(localeDir)) return []; + + const files = fs.readdirSync(localeDir).filter(f => f.endsWith('.mdx')); + + const references = await Promise.all( + files.map(async f => { + const slug = f.replace('.mdx', ''); + return await getReferenceBySlug(slug, locale); + }) + ); + + return references + .filter((p): p is ReferenceData => p !== null) + .sort((a, b) => new Date(b.frontmatter.date).getTime() - new Date(a.frontmatter.date).getTime()); +} diff --git a/lib/schema.ts b/lib/schema.ts index a4ac2d9f4..d49ca3f62 100644 --- a/lib/schema.ts +++ b/lib/schema.ts @@ -17,9 +17,9 @@ export const getOrganizationSchema = () => ({ sameAs: ['https://www.instagram.com/me.and.eloise/'], contactPoint: { '@type': 'ContactPoint' as const, - telephone: '+49-15207230518', + telephone: '+4935616857733', contactType: 'customer service' as const, - email: 'd.joseph@e-tib.com', + email: 'info@e-tib.com', availableLanguage: ['German', 'English'], }, }); @@ -43,8 +43,8 @@ export const getLocalBusinessSchema = () => ({ logo: LOGO_URL, image: LOGO_URL, description: 'Ihr Partner für Kabelleitungstiefbau, Horizontalspülbohrungen, Planung und Vermessung in Guben und überregional.', - telephone: '+49-15207230518', - email: 'd.joseph@e-tib.com', + telephone: '+4935616857733', + email: 'info@e-tib.com', address: { '@type': 'PostalAddress' as const, streetAddress: 'Gewerbestraße 22', diff --git a/messages/de.json b/messages/de.json index 10811e757..af3cce207 100644 --- a/messages/de.json +++ b/messages/de.json @@ -96,7 +96,7 @@ "howToReachUs": "So erreichen Sie uns", "office": "Hauptsitz Guben", "address": "Gewerbestraße 22\n03172 Guben\nDeutschland", - "phone": "+49 15207230518", + "phone": "+49 (0) 3561 / 68577 33", "email": "d.joseph@e-tib.com" }, "hours": { diff --git a/messages/en.json b/messages/en.json index 076ad87dc..799237b79 100644 --- a/messages/en.json +++ b/messages/en.json @@ -96,7 +96,7 @@ "howToReachUs": "How to reach us", "office": "Headquarters Guben", "address": "Gewerbestraße 22\n03172 Guben\nGermany", - "phone": "+49 15207230518", + "phone": "+49 (0) 3561 / 68577 33", "email": "d.joseph@e-tib.com" }, "hours": { diff --git a/next.config.mjs b/next.config.mjs index 9218f6abd..aafcd1789 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -38,6 +38,9 @@ const nextConfig = { }, }, ...(isProd ? { output: 'standalone' } : {}), + env: { + NEXT_PUBLIC_APP_VERSION: process.env.NEXT_PUBLIC_APP_VERSION || process.env.npm_package_version || 'dev', + }, // Prevent webpack from restarting when .env files are touched via Docker volume mount webpack: (config, { dev }) => { if (dev) { diff --git a/package.json b/package.json index dd2bd147d..ad122aead 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "@next/bundle-analyzer": "^16.1.6", "@tailwindcss/cli": "^4.1.18", "@tailwindcss/postcss": "^4.1.18", + "@tailwindcss/typography": "^0.5.19", "@types/geojson": "^7946.0.16", "@types/leaflet": "^1.9.21", "@types/node": "^22.19.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b15bd70b6..08827915e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -178,6 +178,9 @@ importers: '@tailwindcss/postcss': specifier: ^4.1.18 version: 4.2.2 + '@tailwindcss/typography': + specifier: ^0.5.19 + version: 0.5.19(tailwindcss@4.2.2) '@types/geojson': specifier: ^7946.0.16 version: 7946.0.16 @@ -2928,6 +2931,11 @@ packages: '@tailwindcss/postcss@4.2.2': resolution: {integrity: sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==} + '@tailwindcss/typography@0.5.19': + resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} @@ -4131,6 +4139,11 @@ packages: resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} engines: {node: '>= 6'} + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + cssstyle@5.3.7: resolution: {integrity: sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==} engines: {node: '>=20'} @@ -6634,6 +6647,10 @@ packages: postcss-media-query-parser@0.2.3: resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -10800,6 +10817,11 @@ snapshots: postcss: 8.5.8 tailwindcss: 4.2.2 + '@tailwindcss/typography@0.5.19(tailwindcss@4.2.2)': + dependencies: + postcss-selector-parser: 6.0.10 + tailwindcss: 4.2.2 + '@tootallnate/quickjs-emscripten@0.23.0': {} '@turbo/darwin-64@2.9.3': @@ -12133,6 +12155,8 @@ snapshots: css-what@6.2.2: {} + cssesc@3.0.0: {} + cssstyle@5.3.7: dependencies: '@asamuzakjp/css-color': 4.1.2 @@ -15275,6 +15299,11 @@ snapshots: postcss-media-query-parser@0.2.3: {} + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss-value-parser@4.2.0: {} postcss@8.4.31: