+
- {/* Gallery (if any) */}
+
+
+
{safeLocale === 'de' ? 'Unsere Leistungen vor Ort' : 'Our Local Services'}
+
+ {standort.keyFeatures[safeLocale].map((feature, idx) => (
+
+ {feature}
+
+ ))}
+
+
+
{safeLocale === 'de' ? 'Kontakt & Anfahrt' : 'Contact & Directions'}
+
+
+ {safeLocale === 'de' ? 'Adresse:' : 'Address:'}
+ {standort.address.street}
+ {standort.address.city}
+
+
+
+ {safeLocale === 'de' ? 'In Google Maps öffnen' : 'Open in Google Maps'}
+
+
+
+
+
+ {safeLocale === 'de' ? 'Telefon:' : 'Phone:'}
+
+ {standort.contact.phone}
+
+
+
+
+ Email:
+
+ {standort.contact.email}
+
+
+
{standort.gallery && standort.gallery.length > 0 && (
-
- {standort.gallery.map((img, idx) => (
-
-
-
- ))}
-
+ <>
+
Galerie
+
+ {standort.gallery.map((img, idx) => (
+
+
+
+ ))}
+
+ >
)}
+
-
-
- {/* Contact Card */}
-
-
-
-
-
-
-
- {safeLocale === 'de' ? 'Kontakt & Anfahrt' : 'Contact & Directions'}
-
-
-
-
-
-
-
-
-
- {safeLocale === 'de' ? 'Adresse' : 'Address'}
-
-
- {standort.address.street}
- {standort.address.city}
-
- {(() => {
- const baseUrl = 'https://maps.google.com/';
- const mapsUrl = `${baseUrl}?q=${encodeURIComponent(`${standort.address.street}, ${standort.address.city}`)}`;
- return (
-
- {safeLocale === 'de' ? 'In Google Maps öffnen' : 'Open in Google Maps'}
-
-
- );
- })()}
-
-
-
-
-
-
-
-
-
-
-
+ {/* Support Section */}
+
+
+
+
+
{t('needHelp')}
+
{t('supportTeamAvailable')}
+
+
+ {t('contactUs')}
+
+ →
+
+
+
+
diff --git a/components/blocks/InteractiveGermanyMap.tsx b/components/blocks/InteractiveGermanyMap.tsx
index b28f2300f..3d993f49d 100644
--- a/components/blocks/InteractiveGermanyMap.tsx
+++ b/components/blocks/InteractiveGermanyMap.tsx
@@ -7,12 +7,10 @@ import Image from 'next/image';
import { useRouter } from 'next/navigation';
import Link from 'next/link';
import { AnimatedGlossyBorder } from '@/components/ui/AnimatedGlossyBorder';
-import { Location, defaultLocations, minorLocations } from '@/lib/map-data';
+import { Location, defaultLocations, minorLocations, projectLocations } from '@/lib/map-data';
import { standorteLocations } from '@/lib/standorte-data';
import { useLocale, useTranslations } from 'next-intl';
-const allLocations = [...standorteLocations, ...defaultLocations, ...minorLocations];
-
interface Stat {
value: string;
suffix?: string;
@@ -34,7 +32,7 @@ export function InteractiveGermanyMap({
title,
description,
stats,
- locations = allLocations,
+ locations = projectLocations,
isHero = false
}: InteractiveGermanyMapProps) {
const [activeLocation, setActiveLocation] = useState
(null);
diff --git a/contact-page-auth-debug.html b/contact-page-auth-debug.html
new file mode 100644
index 000000000..217ea5d44
--- /dev/null
+++ b/contact-page-auth-debug.html
@@ -0,0 +1 @@
+Gatekeeper | Access Control
etib-testing Gatekeeper
Infrastructure Protection
© 2026 MINTEL
\ No newline at end of file
diff --git a/contact-page-debug.html b/contact-page-debug.html
new file mode 100644
index 000000000..af71c9eef
--- /dev/null
+++ b/contact-page-debug.html
@@ -0,0 +1 @@
+Gatekeeper | Access Control
etib-testing Gatekeeper
Infrastructure Protection
© 2026 MINTEL
\ No newline at end of file
diff --git a/contact.png b/contact.png
new file mode 100644
index 000000000..6560a374e
Binary files /dev/null and b/contact.png differ
diff --git a/content/de/ueber-uns.mdx b/content/de/ueber-uns.mdx
index 79f150e37..8a46a07ee 100644
--- a/content/de/ueber-uns.mdx
+++ b/content/de/ueber-uns.mdx
@@ -86,7 +86,7 @@ layout: "fullBleed"
title: "E-TIB Bohrtechnik GmbH",
description: "Präzise Horizontalspülbohrungen in allen Bodenklassen für eine oberflächenschonende und grabenlose Leitungsverlegung.",
icon: "M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z",
- url: "/de/bohrtechnik",
+ url: "/de/standorte/kirchheilingen",
backgroundImage: "/assets/photos/DSC08653.JPG"
}
]}
diff --git a/content/en/ueber-uns.mdx b/content/en/ueber-uns.mdx
index 65d9ac50e..5b72992aa 100644
--- a/content/en/ueber-uns.mdx
+++ b/content/en/ueber-uns.mdx
@@ -86,7 +86,7 @@ layout: "fullBleed"
title: "E-TIB Bohrtechnik GmbH",
description: "Precise horizontal directional drilling in all soil classes for surface-friendly and trenchless pipe laying.",
icon: "M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z",
- url: "/en/drilling-technology",
+ url: "/en/standorte/kirchheilingen",
backgroundImage: "/assets/photos/DSC08653.JPG"
}
]}
diff --git a/lib/map-data.ts b/lib/map-data.ts
index 3b62aa2ba..58605b172 100644
--- a/lib/map-data.ts
+++ b/lib/map-data.ts
@@ -896,3 +896,4 @@ export const minorLocations: Location[] = [
description: 'pv',
},
];
+export const projectLocations = [...defaultLocations, ...minorLocations];
diff --git a/login-result.html b/login-result.html
new file mode 100644
index 000000000..d69c958e9
--- /dev/null
+++ b/login-result.html
@@ -0,0 +1 @@
+Gatekeeper | Access Control
etib-testing Gatekeeper
Infrastructure Protection
Access Denied. Try Again.
© 2026 MINTEL
\ No newline at end of file
diff --git a/scripts/smoke.ts b/scripts/smoke.ts
index e41238537..d7451bcfd 100644
--- a/scripts/smoke.ts
+++ b/scripts/smoke.ts
@@ -29,7 +29,12 @@ async function run() {
console.log(` Waiting for potential Gatekeeper redirect...`);
await new Promise((resolve) => setTimeout(resolve, 3000));
- const isGatekeeper = await page.$('input[name="password"]');
+ let isGatekeeper = null;
+ try {
+ isGatekeeper = await page.$('input[name="password"]');
+ } catch (e) {
+ console.log('Navigation happened while checking gatekeeper:', e.message);
+ }
if (isGatekeeper) {
await page.type('input[name="password"]', gatekeeperPassword);
await Promise.all([
@@ -65,7 +70,7 @@ async function run() {
urls.map(async (url) => {
if (url.includes('openstreetmap.org') || url.includes('unpkg.com')) return;
try {
- const res = await fetch(url, { method: 'HEAD' });
+ const res = await fetch(url, { method: 'GET' });
if (res.status >= 400) {
// Diagnostic: check if the raw source is available
const rawUrlMatch = url.match(/[?&]url=([^&]+)/);
@@ -73,7 +78,7 @@ async function run() {
const rawPath = decodeURIComponent(rawUrlMatch[1]);
const baseUrl = new URL(url).origin;
const rawUrl = `${baseUrl}${rawPath}`;
- const rawRes = await fetch(rawUrl, { method: 'HEAD' });
+ const rawRes = await fetch(rawUrl, { method: 'GET' });
broken.push(`${url} (Status: ${res.status}, Raw Status: ${rawRes.status})`);
} else {
broken.push(`${url} (Status: ${res.status})`);
diff --git a/test-contact-auth.cjs b/test-contact-auth.cjs
new file mode 100644
index 000000000..c8be29f96
--- /dev/null
+++ b/test-contact-auth.cjs
@@ -0,0 +1,32 @@
+const puppeteer = require('puppeteer');
+(async () => {
+ const targetUrl = 'https://test.e-tib.com';
+ const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026';
+
+ const browser = await puppeteer.launch({ headless: true });
+ const page = await browser.newPage();
+
+ await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
+ await new Promise((resolve) => setTimeout(resolve, 3000));
+
+ const isGatekeeper = await page.$('input[name="password"]');
+ if (isGatekeeper) {
+ await page.type('input[name="password"]', gatekeeperPassword);
+ await Promise.all([
+ page.click('button[type="submit"]'),
+ ]);
+ await new Promise((resolve) => setTimeout(resolve, 5000));
+ }
+
+ await page.screenshot({ path: 'after-login.png' });
+
+ await page.goto(`${targetUrl}/de/kontakt`, { waitUntil: 'domcontentloaded' });
+ await new Promise(r => setTimeout(r, 2000));
+
+ const html = await page.content();
+ const fs = require('fs');
+ fs.writeFileSync('contact-page-auth-debug.html', html);
+ await page.screenshot({ path: 'contact.png' });
+
+ await browser.close();
+})();
diff --git a/test-contact.cjs b/test-contact.cjs
new file mode 100644
index 000000000..ff3ccce5e
--- /dev/null
+++ b/test-contact.cjs
@@ -0,0 +1,12 @@
+const puppeteer = require('puppeteer');
+(async () => {
+ const browser = await puppeteer.launch({ headless: true });
+ const page = await browser.newPage();
+
+ await page.goto('https://test.e-tib.com/de/kontakt', { waitUntil: 'networkidle0' });
+ const html = await page.content();
+ const fs = require('fs');
+ fs.writeFileSync('contact-page-debug.html', html);
+
+ await browser.close();
+})();
diff --git a/test-contact.js b/test-contact.js
new file mode 100644
index 000000000..ff3ccce5e
--- /dev/null
+++ b/test-contact.js
@@ -0,0 +1,12 @@
+const puppeteer = require('puppeteer');
+(async () => {
+ const browser = await puppeteer.launch({ headless: true });
+ const page = await browser.newPage();
+
+ await page.goto('https://test.e-tib.com/de/kontakt', { waitUntil: 'networkidle0' });
+ const html = await page.content();
+ const fs = require('fs');
+ fs.writeFileSync('contact-page-debug.html', html);
+
+ await browser.close();
+})();
diff --git a/test-login-error.cjs b/test-login-error.cjs
new file mode 100644
index 000000000..c507e25bd
--- /dev/null
+++ b/test-login-error.cjs
@@ -0,0 +1,24 @@
+const puppeteer = require('puppeteer');
+(async () => {
+ const targetUrl = 'https://test.e-tib.com';
+ const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026';
+
+ const browser = await puppeteer.launch({ headless: true });
+ const page = await browser.newPage();
+
+ await page.goto(targetUrl, { waitUntil: 'networkidle0' });
+ const isGatekeeper = await page.$('input[name="password"]');
+ if (isGatekeeper) {
+ await page.type('input[name="password"]', gatekeeperPassword);
+ await Promise.all([
+ page.click('button[type="submit"]'),
+ page.waitForNavigation({ waitUntil: 'networkidle0' }).catch(() => {})
+ ]);
+ const html = await page.content();
+ const fs = require('fs');
+ fs.writeFileSync('login-result.html', html);
+ } else {
+ console.log("No gatekeeper found!");
+ }
+ await browser.close();
+})();