Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 490f216502 | |||
| 3674e21fda | |||
| 298b81713c | |||
| 3b438de94d | |||
| aff47de037 | |||
| 85d366cfe2 | |||
| 5dc2a9fd37 | |||
| 57e5431e2a | |||
| a13b033b7d | |||
| 93714d2683 | |||
| b0fae48e65 | |||
| 60391b5a3f | |||
| 6d4e080d17 | |||
| 2a4c605a77 | |||
| da9d1954d6 | |||
| 4fc00098f2 | |||
| 2df7aece5c | |||
| d65be95e95 | |||
| e83d3c0933 | |||
| f69d1977ad | |||
| 4f73ac109e | |||
| 535d6d0588 | |||
| c2ce09c106 | |||
| 265f93716e | |||
| 66fb4f3939 | |||
| 10f5dd9774 | |||
| 30a177663c | |||
| 8d4f085c58 | |||
| c0a577cff3 | |||
| bec2a53d3d | |||
| b4fc3f6a28 |
@@ -0,0 +1 @@
|
||||
{"chromeFlags":"--no-sandbox --disable-setuid-sandbox --disable-dev-shm-usage --headless=new","port":59457}
|
||||
2895
.lighthouseci/lhr-1782154267607.html
Normal file
2895
.lighthouseci/lhr-1782154359499.html
Normal file
2895
.lighthouseci/lhr-1782154420108.html
Normal file
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"https://e-tib.com/en": "https://storage.googleapis.com/lighthouse-infrastructure.appspot.com/reports/1782063743188-8000.report.html"
|
||||
}
|
||||
@@ -184,7 +184,6 @@ export default async function Layout(props: {
|
||||
data-scroll-behavior="smooth"
|
||||
>
|
||||
<head>
|
||||
<link rel="preconnect" href="https://img.infra.mintel.me" />
|
||||
<link rel="icon" href="/favicon.ico" sizes="any" />
|
||||
<link rel="apple-touch-icon" href="/apple-icon.png" sizes="180x180" />
|
||||
|
||||
|
||||
@@ -10,11 +10,6 @@ export const runtime = 'nodejs';
|
||||
export default async function Image({ params }: { params: Promise<{ locale: string }> }) {
|
||||
const { locale } = await params;
|
||||
const t = await getTranslations({ locale, namespace: 'Index.meta' });
|
||||
|
||||
let pageTitle = t('title');
|
||||
if (pageTitle.startsWith('E-TIB GmbH | ')) {
|
||||
pageTitle = pageTitle.substring('E-TIB GmbH | '.length);
|
||||
}
|
||||
|
||||
const fonts = await getOgFonts();
|
||||
const bg = getOgBackground();
|
||||
@@ -23,7 +18,6 @@ export default async function Image({ params }: { params: Promise<{ locale: stri
|
||||
return new ImageResponse(
|
||||
<OGImageTemplate
|
||||
title="Die Experten für Kabelnetzbau"
|
||||
description={pageTitle}
|
||||
label="Kabelnetzbau & Infrastruktur"
|
||||
image={bg}
|
||||
logo={logo}
|
||||
@@ -33,4 +27,4 @@ export default async function Image({ params }: { params: Promise<{ locale: stri
|
||||
fonts,
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -4,8 +4,8 @@ import { notFound } from 'next/navigation';
|
||||
import { getMdxContent } from '@/lib/mdx';
|
||||
import { MDXRemote } from 'next-mdx-remote/rsc';
|
||||
|
||||
|
||||
import nextDynamic from 'next/dynamic';
|
||||
import { getImageProps } from 'next/image';
|
||||
|
||||
import { HeroVideo as HomeHero } from '@/components/blocks/HeroVideo';
|
||||
const HomeSubCompanyTiles = nextDynamic(() => import('@/components/blocks/SubCompanyTiles').then(mod => mod.SubCompanyTiles));
|
||||
@@ -38,8 +38,40 @@ const mdxComponents = (references: any[]) => ({
|
||||
InteractiveGermanyMap,
|
||||
ScaleOfImpact,
|
||||
img: (props: any) => {
|
||||
// We proxy it through Next.js image optimizer
|
||||
return <img {...props} src={`/_next/image?url=${encodeURIComponent(props.src)}&w=1920&q=75`} loading="lazy" decoding="async" />;
|
||||
// Parse src if it's already a next image proxy
|
||||
let src = props.src;
|
||||
if (typeof src === 'string' && src.startsWith('/_next/image')) {
|
||||
try {
|
||||
const urlParam = new URLSearchParams(src.split('?')[1]).get('url');
|
||||
if (urlParam) src = decodeURIComponent(urlParam);
|
||||
} catch (e) {
|
||||
// Fallback
|
||||
}
|
||||
}
|
||||
|
||||
// Use Next.js getImageProps for responsive srcSet generation
|
||||
const {
|
||||
props: { srcSet, src: finalSrc, sizes }
|
||||
} = getImageProps({
|
||||
src,
|
||||
alt: props.alt || '',
|
||||
width: 1920,
|
||||
height: 1080,
|
||||
sizes: '(max-width: 768px) 100vw, (max-width: 1200px) 75vw, 50vw',
|
||||
quality: 80,
|
||||
});
|
||||
|
||||
return (
|
||||
<img
|
||||
{...props}
|
||||
src={finalSrc}
|
||||
srcSet={srcSet}
|
||||
sizes={sizes}
|
||||
loading="lazy"
|
||||
decoding="async"
|
||||
style={{ width: '100%', height: 'auto', ...props.style }}
|
||||
/>
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -28,9 +28,9 @@ const CustomLi = ({ children, ...props }: any) => {
|
||||
else if (lowerText.includes('vlf') || lowerText.includes('otdr')) Icon = Zap;
|
||||
|
||||
return (
|
||||
<li className="flex items-start gap-3 p-3 bg-neutral-50/50 border border-neutral-100 rounded-xl" {...props}>
|
||||
<Icon className="w-4 h-4 text-primary shrink-0 mt-[2px]" />
|
||||
<span className="text-sm font-medium text-neutral-700 leading-tight">{children}</span>
|
||||
<li className="flex items-start gap-3 pl-4 pr-6 py-3.5 bg-neutral-50/50 border border-neutral-100 rounded-xl" {...props}>
|
||||
<Icon className="w-5 h-5 text-primary shrink-0 mt-0.5" />
|
||||
<span className="text-sm font-medium text-neutral-700 leading-snug [&>p]:mb-0">{children}</span>
|
||||
</li>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -70,7 +70,7 @@ export function CompetenceBentoGrid(props: CompetenceBentoGridProps) {
|
||||
<h3 className="font-heading text-3xl md:text-5xl font-extrabold text-neutral-dark mb-4">{title}</h3>
|
||||
</div>
|
||||
</div>
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 lg:grid-cols-4 gap-4 auto-rows-[220px]">
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 lg:grid-cols-4 gap-4 auto-rows-[minmax(220px,auto)]">
|
||||
{/* Simplified static grid */}
|
||||
</div>
|
||||
</Container>
|
||||
@@ -88,7 +88,7 @@ export function CompetenceBentoGrid(props: CompetenceBentoGridProps) {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 lg:grid-cols-4 gap-4 auto-rows-[220px] px-4 md:px-0">
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 lg:grid-cols-4 gap-4 auto-rows-[minmax(220px,auto)] px-4 md:px-0">
|
||||
{items.map((item, idx) => {
|
||||
const isLarge = item.size === 'large';
|
||||
const isMedium = item.size === 'medium';
|
||||
|
||||
@@ -22,6 +22,8 @@ interface HeroVideoProps {
|
||||
badge?: string;
|
||||
}
|
||||
|
||||
import placeholders from '@/lib/placeholders.json';
|
||||
|
||||
export function HeroVideo(props: HeroVideoProps) {
|
||||
const { data } = props;
|
||||
const title = props.title || data?.title || 'DIE EXPERTEN FÜR KABELNETZBAU';
|
||||
@@ -30,7 +32,12 @@ export function HeroVideo(props: HeroVideoProps) {
|
||||
const videoUrl = explicitNoVideo ? null : (props.videoUrl || data?.videoUrl || '/assets/dummy-hero.mp4');
|
||||
const pathname = usePathname();
|
||||
|
||||
const posterSrc = props.backgroundImage?.url || props.posterImage?.url || data?.posterImage?.url || "/assets/photos/DJI_0048.JPG";
|
||||
let defaultPoster = "/assets/photos/DJI_0048.JPG";
|
||||
if (videoUrl && videoUrl.endsWith('.mp4')) {
|
||||
defaultPoster = videoUrl.replace('.mp4', '-poster.jpg');
|
||||
}
|
||||
|
||||
const posterSrc = props.backgroundImage?.url || props.posterImage?.url || data?.posterImage?.url || defaultPoster;
|
||||
const posterAlt = props.backgroundImage?.alt || data?.posterImage?.alt || "E-TIB Gruppe Baustelle";
|
||||
|
||||
const ctaLabel = props.ctaLabel || props.linkText || data?.ctaLabel || 'Unternehmen entdecken';
|
||||
@@ -88,7 +95,7 @@ export function HeroVideo(props: HeroVideoProps) {
|
||||
{videoUrl && (
|
||||
<video
|
||||
key={`${pathname}-${videoUrl}`}
|
||||
className="absolute inset-0 w-full h-full object-cover z-[2] pointer-events-none filter contrast-125 saturate-110 brightness-90"
|
||||
className={`absolute inset-0 w-full h-full object-cover z-[2] pointer-events-none filter contrast-125 saturate-110 brightness-90 transition-opacity duration-1000 ${videoSrcLoaded ? 'opacity-100' : 'opacity-0'}`}
|
||||
src={videoSrcLoaded ? videoUrl : undefined}
|
||||
autoPlay
|
||||
muted
|
||||
|
||||
@@ -239,7 +239,7 @@ export function InteractiveGermanyMap({
|
||||
animate={{ opacity: 1, y: 0, scale: 1 }}
|
||||
exit={{ opacity: 0, y: 10, scale: 0.95 }}
|
||||
transition={{ duration: 0.2 }}
|
||||
className="absolute z-[9999] pointer-events-auto bottom-[-60px] left-1/2 -translate-x-1/2 w-[calc(100vw-2rem)] max-w-[320px] md:w-max md:bottom-auto md:left-[var(--md-left)] md:top-[var(--md-top)] md:[transform:var(--md-transform)]"
|
||||
className="absolute z-[9999] pointer-events-auto bottom-[-60px] left-1/2 -translate-x-1/2 w-[calc(100vw_-_2rem)] max-w-[320px] md:w-max md:bottom-auto md:left-[var(--md-left)] md:top-[var(--md-top)] md:[transform:var(--md-transform)]"
|
||||
style={{
|
||||
'--md-left': `${activeLocation.x}%`,
|
||||
'--md-top': `${activeLocation.y}%`,
|
||||
|
||||
@@ -107,15 +107,18 @@ export function ReferencesSlider(props: ReferencesSliderProps) {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="relative z-10">
|
||||
<div className="container relative z-10">
|
||||
<div className="absolute right-0 top-0 bottom-0 w-16 bg-gradient-to-l from-neutral-dark to-transparent z-20 md:hidden pointer-events-none" />
|
||||
|
||||
{/* Carousel: stays inside container for left alignment, breaks right to viewport edge */}
|
||||
<div
|
||||
ref={containerRef}
|
||||
onMouseDown={onMouseDown}
|
||||
onMouseLeave={onMouseLeave}
|
||||
onMouseUp={onMouseUp}
|
||||
onMouseMove={onMouseMove}
|
||||
className={`select-none flex gap-6 overflow-x-auto pb-8 pt-4 px-6 md:px-[max(2rem,calc((100vw-1280px)/2))] lg:px-[max(2.5rem,calc((100vw-1280px)/2))] [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden ${isDragging ? 'cursor-grabbing snap-none' : 'cursor-grab snap-x snap-mandatory'}`}
|
||||
style={{ marginRight: 'calc(-50vw + 50%)' }}
|
||||
className={`select-none flex gap-6 overflow-x-auto pb-8 pt-4 [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden ${isDragging ? 'cursor-grabbing snap-none' : 'cursor-grab snap-x snap-mandatory'}`}
|
||||
>
|
||||
{references.map((ref, i) => {
|
||||
const imgSrc = ref.image
|
||||
@@ -163,6 +166,8 @@ export function ReferencesSlider(props: ReferencesSliderProps) {
|
||||
</motion.div>
|
||||
);
|
||||
})}
|
||||
{/* Right padding spacer so last card doesn't clip at viewport edge */}
|
||||
<div className="flex-shrink-0 w-6" aria-hidden="true" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -84,19 +84,19 @@ export function ScaleOfImpact() {
|
||||
{/* Static Data Grid (No jumping text) */}
|
||||
<div className="grid grid-cols-2 md:grid-cols-4 gap-y-4 gap-x-2 md:gap-12 w-full max-w-5xl mt-4 md:mt-12">
|
||||
<div className="flex flex-col items-center">
|
||||
<div className="font-mono text-3xl md:text-5xl font-black text-white tracking-tighter mb-2">200<span className="text-primary">+</span></div>
|
||||
<div className="font-mono text-3xl md:text-5xl font-black text-white tracking-tighter mb-2">200<span className="text-emerald-400">+</span></div>
|
||||
<div className="text-xs font-bold uppercase tracking-widest text-white/50">{locale === 'en' ? 'Projects' : 'Projekte'}</div>
|
||||
</div>
|
||||
<div className="flex flex-col items-center">
|
||||
<div className="font-mono text-3xl md:text-5xl font-black text-white tracking-tighter mb-2">974<span className="text-primary text-xl md:text-2xl ml-1">km</span></div>
|
||||
<div className="font-mono text-3xl md:text-5xl font-black text-white tracking-tighter mb-2">974<span className="text-emerald-400 text-xl md:text-2xl ml-1">km</span></div>
|
||||
<div className="text-xs font-bold uppercase tracking-widest text-white/50">{locale === 'en' ? 'Cable Laying' : 'Kabelverlegung'}</div>
|
||||
</div>
|
||||
<div className="flex flex-col items-center">
|
||||
<div className="font-mono text-3xl md:text-5xl font-black text-white tracking-tighter mb-2">300<span className="text-primary text-xl md:text-2xl ml-1">km</span></div>
|
||||
<div className="font-mono text-3xl md:text-5xl font-black text-white tracking-tighter mb-2">300<span className="text-emerald-400 text-xl md:text-2xl ml-1">km</span></div>
|
||||
<div className="text-xs font-bold uppercase tracking-widest text-white/50">{locale === 'en' ? 'Open Trenching' : 'Offener Tiefbau'}</div>
|
||||
</div>
|
||||
<div className="flex flex-col items-center">
|
||||
<div className="font-mono text-3xl md:text-5xl font-black text-white tracking-tighter mb-2">160<span className="text-primary text-xl md:text-2xl ml-1">km</span></div>
|
||||
<div className="font-mono text-3xl md:text-5xl font-black text-white tracking-tighter mb-2">160<span className="text-emerald-400 text-xl md:text-2xl ml-1">km</span></div>
|
||||
<div className="text-xs font-bold uppercase tracking-widest text-white/50">{locale === 'en' ? 'HDD Drilling' : 'Spülbohrung'}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -73,7 +73,7 @@ export function SubCompanyTiles(props: SubCompanyTilesProps) {
|
||||
|
||||
{(badge || title) && (
|
||||
<div className="text-center md:text-left max-w-3xl mx-auto md:mx-0 mb-16">
|
||||
{badge && <h2 className="text-primary font-bold tracking-wider uppercase text-sm mb-3">{badge}</h2>}
|
||||
{badge && <h2 className="text-emerald-400 font-bold tracking-wider uppercase text-sm mb-3">{badge}</h2>}
|
||||
{title && <h3 className="font-heading text-3xl md:text-5xl font-extrabold text-white">{title}</h3>}
|
||||
</div>
|
||||
)}
|
||||
|
||||
@@ -94,7 +94,7 @@ export function MobileBottomNav({ navLinks, currentLocale }: MobileBottomNavProp
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="md:hidden fixed bottom-0 left-0 right-0 z-[9999] px-2 pb-[calc(env(safe-area-inset-bottom)+12px)] pt-4 pointer-events-none flex justify-center">
|
||||
<div className="md:hidden fixed bottom-0 left-0 right-0 z-[9999] px-2 pb-[calc(env(safe-area-inset-bottom)_+_12px)] pt-4 pointer-events-none flex justify-center">
|
||||
<nav className="flex justify-between items-center bg-white/75 backdrop-blur-2xl border border-white/60 shadow-[0_8px_32px_rgba(0,0,0,0.12)] rounded-3xl p-1.5 pointer-events-auto w-full max-w-[480px]">
|
||||
{items.map((item) => {
|
||||
const mappedUrl = item.url.startsWith('/') && !item.url.match(/^\/(en|de)/)
|
||||
@@ -129,8 +129,8 @@ export function MobileBottomNav({ navLinks, currentLocale }: MobileBottomNavProp
|
||||
{item.icon}
|
||||
</motion.div>
|
||||
<motion.span
|
||||
animate={{ opacity: isActive ? 1 : 0.7, y: isActive ? 0 : 2 }}
|
||||
className="text-[9px] font-bold mt-1 tracking-wide"
|
||||
animate={{ y: isActive ? 0 : 2 }}
|
||||
className="text-[10px] font-bold mt-1 tracking-wide"
|
||||
>
|
||||
{item.label}
|
||||
</motion.span>
|
||||
@@ -144,7 +144,7 @@ export function MobileBottomNav({ navLinks, currentLocale }: MobileBottomNavProp
|
||||
key={item.label}
|
||||
onClick={() => setIsFlyoutOpen(!isFlyoutOpen)}
|
||||
className={`relative flex flex-col items-center justify-center flex-1 h-[62px] transition-colors duration-300 select-none w-full focus:outline-none ${
|
||||
isActive ? 'text-primary' : 'text-neutral-500 hover:text-neutral-900'
|
||||
isActive ? 'text-primary' : 'text-neutral-800 hover:text-neutral-900'
|
||||
}`}
|
||||
style={{ WebkitTapHighlightColor: 'transparent', touchAction: 'manipulation' }}
|
||||
>
|
||||
@@ -159,7 +159,7 @@ export function MobileBottomNav({ navLinks, currentLocale }: MobileBottomNavProp
|
||||
href={mappedUrl}
|
||||
onClick={() => setIsFlyoutOpen(false)}
|
||||
className={`relative flex flex-col items-center justify-center flex-1 h-[62px] transition-colors duration-300 select-none ${
|
||||
isActive ? 'text-primary' : 'text-neutral-500 hover:text-neutral-900'
|
||||
isActive ? 'text-primary' : 'text-neutral-800 hover:text-neutral-900'
|
||||
}`}
|
||||
style={{ WebkitTapHighlightColor: 'transparent', touchAction: 'manipulation' }}
|
||||
>
|
||||
@@ -194,7 +194,7 @@ export function MobileBottomNav({ navLinks, currentLocale }: MobileBottomNavProp
|
||||
setIsFlyoutOpen(false);
|
||||
}
|
||||
}}
|
||||
className="fixed bottom-0 left-0 right-0 z-[9998] bg-white rounded-t-[32px] pt-4 pb-[calc(env(safe-area-inset-bottom)+7rem)] px-6 md:hidden shadow-[0_-20px_40px_rgba(0,0,0,0.1)] border-t border-neutral-100"
|
||||
className="fixed bottom-0 left-0 right-0 z-[9998] bg-white rounded-t-[32px] pt-4 pb-[calc(env(safe-area-inset-bottom)_+_7rem)] px-6 md:hidden shadow-[0_-20px_40px_rgba(0,0,0,0.1)] border-t border-neutral-100"
|
||||
>
|
||||
<div className="w-16 h-1.5 bg-neutral-200 rounded-full mx-auto mb-6 cursor-grab active:cursor-grabbing" />
|
||||
<h3 className="text-xs font-bold uppercase tracking-widest text-neutral-400 mb-4 px-2">{currentLocale === 'de' ? 'Über uns & Mehr' : 'About us & More'}</h3>
|
||||
|
||||
@@ -88,7 +88,7 @@ description: "Die E-TIB GmbH ist Ihr zuverlässiger Partner für komplexe Kabelt
|
||||
{/* Right Column: Imagery & Mission */}
|
||||
<div className="lg:col-span-7 relative">
|
||||
<div className="aspect-[4/3] md:aspect-[16/9] lg:aspect-[4/3] rounded-3xl overflow-hidden shadow-2xl relative border border-neutral-200/50">
|
||||
<img src="/_next/image?url=%2Fassets%2Fphotos%2FEtib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-100.jpg&w=1920&q=75" alt="E-TIB im Einsatz" className="w-full h-full object-cover" loading="lazy" decoding="async" />
|
||||
<img src="/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-100.jpg" alt="E-TIB im Einsatz" className="w-full h-full object-cover" loading="lazy" decoding="async" />
|
||||
<div className="absolute inset-0 bg-gradient-to-t from-neutral-dark/95 via-neutral-dark/40 to-transparent"></div>
|
||||
|
||||
<div className="absolute bottom-0 left-0 w-full p-8 md:p-12">
|
||||
|
||||
@@ -88,7 +88,7 @@ description: "E-TIB GmbH is your reliable partner for complex cable routes, hori
|
||||
{/* Right Column: Imagery & Mission */}
|
||||
<div className="lg:col-span-7 relative">
|
||||
<div className="aspect-[4/3] md:aspect-[16/9] lg:aspect-[4/3] rounded-3xl overflow-hidden shadow-2xl relative border border-neutral-200/50">
|
||||
<img src="/_next/image?url=%2Fassets%2Fphotos%2FEtib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-100.jpg&w=1920&q=75" alt="E-TIB in action" className="w-full h-full object-cover" loading="lazy" decoding="async" />
|
||||
<img src="/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-100.jpg" alt="E-TIB in action" className="w-full h-full object-cover" loading="lazy" decoding="async" />
|
||||
<div className="absolute inset-0 bg-gradient-to-t from-neutral-dark/95 via-neutral-dark/40 to-transparent"></div>
|
||||
|
||||
<div className="absolute bottom-0 left-0 w-full p-8 md:p-12">
|
||||
|
||||
14117
lh-single.json
Normal file
7
lib/placeholders.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"/assets/photos/DJI_0048.JPG": "data:image/webp;base64,UklGRjIAAABXRUJQVlA4ICYAAADwAQCdASoKAAcABUB8JYwCdH8AGDNIbaAA92kbyv6vgOVMTIAAAA==",
|
||||
"/assets/videos/web/hero-bahnkreuzung-poster.jpg": "data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAAwAQCdASoKAAYABUB8JaQAA3AA/vDUoAA=",
|
||||
"/assets/videos/web/hero-bohrung-poster.jpg": "data:image/webp;base64,UklGRjIAAABXRUJQVlA4ICYAAACwAQCdASoKAAYABUB8JZACdAEOO2gAAN5Rr3co8j7CDYNKNCAAAA==",
|
||||
"/assets/videos/web/hero-kabelpflug-poster.jpg": "data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAAwAQCdASoKAAYABUB8JaQAA3AA/vDUoAA=",
|
||||
"/assets/videos/web/hero-messe-poster.jpg": "data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAAwAQCdASoKAAYABUB8JaQAA3AA/vDUoAA="
|
||||
}
|
||||
@@ -138,7 +138,7 @@
|
||||
"prepare": "husky",
|
||||
"preinstall": "npx only-allow pnpm"
|
||||
},
|
||||
"version": "2.2.31",
|
||||
"version": "2.2.44",
|
||||
"pnpm": {
|
||||
"onlyBuiltDependencies": [
|
||||
"@parcel/watcher",
|
||||
|
||||
BIN
public/assets/photos/2025-09-23_12.11.43.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 11 MiB After Width: | Height: | Size: 360 KiB |
BIN
public/assets/photos/2025-09-23_12.12.37.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 5.0 MiB After Width: | Height: | Size: 297 KiB |
BIN
public/assets/photos/DJI_0037.JPG
Executable file → Normal file
|
Before Width: | Height: | Size: 9.3 MiB After Width: | Height: | Size: 160 KiB |
BIN
public/assets/photos/DJI_0048.JPG
Executable file → Normal file
|
Before Width: | Height: | Size: 7.8 MiB After Width: | Height: | Size: 126 KiB |
BIN
public/assets/photos/DJI_0243.JPG
Executable file → Normal file
|
Before Width: | Height: | Size: 8.6 MiB After Width: | Height: | Size: 161 KiB |
BIN
public/assets/photos/DJI_0301.JPG
Executable file → Normal file
|
Before Width: | Height: | Size: 9.8 MiB After Width: | Height: | Size: 174 KiB |
|
Before Width: | Height: | Size: 447 KiB After Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 570 KiB After Width: | Height: | Size: 172 KiB |
BIN
public/assets/photos/DSC00373.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 3.2 MiB After Width: | Height: | Size: 106 KiB |
BIN
public/assets/photos/DSC00375.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 3.1 MiB After Width: | Height: | Size: 112 KiB |
BIN
public/assets/photos/DSC00388.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 3.5 MiB After Width: | Height: | Size: 121 KiB |
BIN
public/assets/photos/DSC00400.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 3.2 MiB After Width: | Height: | Size: 134 KiB |
BIN
public/assets/photos/DSC00430.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 5.5 MiB After Width: | Height: | Size: 198 KiB |
BIN
public/assets/photos/DSC00440.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 3.3 MiB After Width: | Height: | Size: 145 KiB |
BIN
public/assets/photos/DSC00452.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 6.5 MiB After Width: | Height: | Size: 236 KiB |
|
Before Width: | Height: | Size: 434 KiB After Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 336 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 422 KiB After Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 702 KiB After Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 380 KiB After Width: | Height: | Size: 81 KiB |
|
Before Width: | Height: | Size: 406 KiB After Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 664 KiB After Width: | Height: | Size: 140 KiB |
|
Before Width: | Height: | Size: 546 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 636 KiB After Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 877 KiB After Width: | Height: | Size: 166 KiB |
|
Before Width: | Height: | Size: 894 KiB After Width: | Height: | Size: 167 KiB |
|
Before Width: | Height: | Size: 402 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 755 KiB After Width: | Height: | Size: 160 KiB |
|
Before Width: | Height: | Size: 306 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 686 KiB After Width: | Height: | Size: 119 KiB |
|
Before Width: | Height: | Size: 660 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 606 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 432 KiB After Width: | Height: | Size: 86 KiB |
BIN
public/assets/photos/DSC02028.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 4.4 MiB After Width: | Height: | Size: 128 KiB |
BIN
public/assets/photos/DSC02057.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 4.7 MiB After Width: | Height: | Size: 139 KiB |
BIN
public/assets/photos/DSC02069.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 9.0 MiB After Width: | Height: | Size: 230 KiB |
BIN
public/assets/photos/DSC02083.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 7.2 MiB After Width: | Height: | Size: 200 KiB |
BIN
public/assets/photos/DSC02089.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 5.8 MiB After Width: | Height: | Size: 147 KiB |
BIN
public/assets/photos/DSC02114.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 3.7 MiB After Width: | Height: | Size: 94 KiB |
BIN
public/assets/photos/DSC02135.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 5.0 MiB After Width: | Height: | Size: 126 KiB |
BIN
public/assets/photos/DSC02150.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 8.7 MiB After Width: | Height: | Size: 245 KiB |
BIN
public/assets/photos/DSC02152.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 9.4 MiB After Width: | Height: | Size: 263 KiB |
BIN
public/assets/photos/DSC02156.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 9.3 MiB After Width: | Height: | Size: 253 KiB |
BIN
public/assets/photos/DSC02164.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 9.2 MiB After Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 710 KiB After Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 844 KiB After Width: | Height: | Size: 157 KiB |
|
Before Width: | Height: | Size: 655 KiB After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 771 KiB After Width: | Height: | Size: 162 KiB |
|
Before Width: | Height: | Size: 919 KiB After Width: | Height: | Size: 174 KiB |
|
Before Width: | Height: | Size: 577 KiB After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 675 KiB After Width: | Height: | Size: 122 KiB |
|
Before Width: | Height: | Size: 689 KiB After Width: | Height: | Size: 141 KiB |
|
Before Width: | Height: | Size: 614 KiB After Width: | Height: | Size: 109 KiB |
|
Before Width: | Height: | Size: 895 KiB After Width: | Height: | Size: 174 KiB |
|
Before Width: | Height: | Size: 315 KiB After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 346 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 404 KiB After Width: | Height: | Size: 81 KiB |
|
Before Width: | Height: | Size: 248 KiB After Width: | Height: | Size: 163 KiB |
|
Before Width: | Height: | Size: 664 KiB After Width: | Height: | Size: 142 KiB |
|
Before Width: | Height: | Size: 633 KiB After Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 543 KiB After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 468 KiB After Width: | Height: | Size: 102 KiB |
|
Before Width: | Height: | Size: 492 KiB After Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 384 KiB After Width: | Height: | Size: 92 KiB |
|
Before Width: | Height: | Size: 317 KiB After Width: | Height: | Size: 81 KiB |
|
Before Width: | Height: | Size: 328 KiB After Width: | Height: | Size: 77 KiB |
BIN
public/assets/photos/DSCF8687.JPG
Executable file → Normal file
|
Before Width: | Height: | Size: 8.2 MiB After Width: | Height: | Size: 193 KiB |
BIN
public/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-100.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 2.2 MiB After Width: | Height: | Size: 83 KiB |
BIN
public/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-12.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 3.3 MiB After Width: | Height: | Size: 133 KiB |
BIN
public/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-14.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 4.5 MiB After Width: | Height: | Size: 148 KiB |
BIN
public/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-15.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 3.0 MiB After Width: | Height: | Size: 134 KiB |
BIN
public/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-2.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 4.4 MiB After Width: | Height: | Size: 141 KiB |
BIN
public/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-24.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 2.0 MiB After Width: | Height: | Size: 174 KiB |