// Quick City — Info pages: About, Companies, Tech, Values, Certs, Team, Contact, Projects const { useState: useI, useMemo: useIm } = React; const HomeStyles = window.HomeStyles; /* ───────────────────────────────────────── Shared: a Legacy-Look hero matching home pages ───────────────────────────────────────── */ function PageHero({ brand, eyebrow, title, sub, image, side = 'left' }) { // side: which side the SVG-shape sits on. ifm=left, lns=right. const isIfm = brand === 'ifm'; return (
{image && }
{side === 'left' ? <> : <> }
{eyebrow}
{sub &&

{sub}

}
); } /* small inline-styles ensure info hero a bit shorter than home hero */ function InfoHeroStyles() { React.useEffect(() => { if (document.getElementById('info-hero-styles')) return; const s = document.createElement('style'); s.id = 'info-hero-styles'; s.textContent = ` .hh--info { height: 56vh; min-height: 440px; max-height: 620px; } .hh--info .hh__title { font-size: clamp(32px, 4.2vw, 56px); } .hh--info .hh__content { max-width: 540px; } .page > .hh--info:first-child { height: 56vh; min-height: 440px; max-height: 620px; } /* Team page bits */ .tm-chips { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 40px; } .tm-chip { background:#fff; border:1px solid #e8e8e8; padding:10px 18px; font-family:inherit; font-size:11px; font-weight:700; letter-spacing:0.15em; text-transform:uppercase; cursor:pointer; transition: all .2s; color:#444; } .tm-chip:hover { border-color: var(--accent); color: var(--accent); } .tm-chip.active { background: var(--accent); color:#fff; border-color: var(--accent); } .tm-grid { display:grid; grid-template-columns: repeat(4, 1fr); gap: 4px; } @media (max-width: 1100px) { .tm-grid { grid-template-columns: repeat(3,1fr); } } @media (max-width: 800px) { .tm-grid { grid-template-columns: repeat(2,1fr); } } .tm-card { background:#fff; padding: 28px 24px; cursor:pointer; transition: transform .25s, box-shadow .25s; border-bottom: 3px solid transparent; position:relative; } .tm-card:hover { transform: translateY(-3px); box-shadow: 0 12px 28px rgba(0,0,0,.08); border-bottom-color: var(--accent); } .tm-card__ph { width: 88px; height: 88px; border-radius:50%; background: linear-gradient(135deg, #efefef, #d8d8d8); display:flex; align-items:center; justify-content:center; font-size:24px; font-weight:900; color:#999; letter-spacing:0.05em; margin-bottom:18px; } .tm-card__name { font-size:16px; font-weight:700; margin-bottom:4px; } .tm-card__role { font-size:12px; color:#666; line-height:1.5; margin-bottom:8px; } .tm-card__dept { font-size:10px; font-weight:700; letter-spacing:0.18em; text-transform:uppercase; color: var(--accent); } /* Org chart */ .tm-org { padding: 40px 0 8px; } .tm-org__row { display: flex; gap: 24px; justify-content:center; flex-wrap:wrap; } .tm-org__connector { width: 2px; height: 24px; background: var(--accent); margin: 0 auto; } .tm-org__crossbar { height: 2px; background: var(--accent); width: min(560px, 80%); margin: 0 auto; } .tm-org-card { background: #fff; border-top: 4px solid var(--accent); padding: 24px 28px; min-width: 240px; max-width: 280px; cursor:pointer; transition: transform .2s, box-shadow .2s; box-shadow: 0 2px 8px rgba(0,0,0,.05); } .tm-org-card:hover { transform: translateY(-3px); box-shadow: 0 12px 28px rgba(0,0,0,.1); } .tm-org-card__ph { width: 60px; height: 60px; border-radius:50%; background: linear-gradient(135deg, #efefef, #d8d8d8); display:flex; align-items:center; justify-content:center; font-size:18px; font-weight:900; color:#999; margin-bottom:14px; } .tm-org-card__name { font-size:15px; font-weight:700; } .tm-org-card__role { font-size:12px; color:#666; line-height:1.5; margin-top:2px; } .tm-org-card__dept { font-size:10px; font-weight:700; letter-spacing:0.18em; text-transform:uppercase; color: var(--accent); margin-top:8px; } /* Modal */ .tm-modal { position:fixed; inset:0; background: rgba(20,20,20,0.7); display:flex; align-items:center; justify-content:center; z-index:1000; padding:24px; } .tm-modal__box { background:#fff; max-width:560px; width:100%; padding: 48px 48px 40px; position:relative; border-top: 6px solid var(--accent); } .tm-modal__close { position:absolute; top:14px; right:18px; background:none; border:none; font-size:28px; cursor:pointer; color:#888; } .tm-modal__ph { width:100px; height:100px; border-radius:50%; background: linear-gradient(135deg, #efefef, #d8d8d8); display:flex; align-items:center; justify-content:center; font-size:30px; font-weight:900; color:#999; margin-bottom:20px; } .tm-modal__name { font-size:24px; font-weight:700; margin-bottom:4px; } .tm-modal__role { font-size:14px; color:#555; } .tm-modal__dept { font-size:11px; font-weight:700; letter-spacing:0.2em; text-transform:uppercase; color: var(--accent); margin-top:12px; } .tm-modal__bio { font-size:14.5px; line-height:1.75; color:#444; margin-top:20px; } /* Contact form */ .ck-grid { display:grid; grid-template-columns: 1fr 1.2fr; gap: 64px; } @media (max-width: 900px) { .ck-grid { grid-template-columns: 1fr; gap: 32px; } } .ck-info { display:flex; flex-direction:column; gap: 2px; } .ck-info__block { background:#fff; padding: 28px 32px; border-left: 4px solid var(--accent); } .ck-info__label { font-size:10px; font-weight:700; letter-spacing:0.25em; text-transform:uppercase; color: var(--accent); margin-bottom:10px; } .ck-info__value { font-size:15px; line-height:1.7; color:#222; white-space: pre-line; } .ck-info__value a { color: inherit; text-decoration:none; border-bottom:1px solid rgba(0,0,0,0.15); } .ck-info__value a:hover { color: var(--accent); border-color: var(--accent); } .ck-form { background:#fff; padding: 40px 44px; border-top: 4px solid var(--accent); } @media (max-width: 600px) { .ck-form { padding: 28px; } } .ck-form__label { font-size:10px; font-weight:700; letter-spacing:0.25em; text-transform:uppercase; color: var(--accent); margin-bottom:8px; } .ck-form__title { font-size:24px; font-weight:900; margin-bottom:24px; text-transform:uppercase; letter-spacing:-0.01em; } .ck-row { display:grid; grid-template-columns: 1fr 1fr; gap:14px; } @media (max-width: 600px) { .ck-row { grid-template-columns: 1fr; } } .ck-field { margin-bottom: 14px; } .ck-field label { display:block; font-size:11px; font-weight:700; letter-spacing:0.12em; text-transform:uppercase; color:#555; margin-bottom:6px; } .ck-field input, .ck-field select, .ck-field textarea { width:100%; padding:12px 14px; border:1px solid #ddd; background:#fafafa; font-family:inherit; font-size:14px; color:#222; transition: border-color .2s, background .2s; } .ck-field input:focus, .ck-field select:focus, .ck-field textarea:focus { outline:none; border-color: var(--accent); background:#fff; } .ck-field textarea { min-height: 120px; resize: vertical; } .ck-submit { display:inline-flex; align-items:center; gap:12px; background: var(--accent); color:#fff; border:none; font-family:inherit; font-size:11px; font-weight:700; letter-spacing:0.2em; text-transform:uppercase; padding:14px 28px; cursor:pointer; transition: opacity .2s; } .ck-submit:hover { opacity:0.85; } .ck-success { padding: 32px 0; text-align:center; } .ck-success__check { width:64px; height:64px; border-radius:50%; background: var(--accent); color:#fff; display:flex; align-items:center; justify-content:center; font-size:32px; margin:0 auto 18px; } /* Cert list (legacy) */ .cert-list { display: grid; gap: 4px; } .cert-row { background:#fff; padding: 36px 40px; display:grid; grid-template-columns: 220px 1fr auto; gap: 40px; align-items:center; border-left: 4px solid var(--accent); } @media (max-width: 800px) { .cert-row { grid-template-columns: 1fr; gap:20px; padding: 28px; } } .cert-row__img { background:#f5f5f5; padding: 20px; text-align:center; border: none; cursor: default; font: inherit; color: inherit; position: relative; width: 100%; } .cert-row__img--clickable { cursor: zoom-in; transition: background 0.2s, transform 0.2s; } .cert-row__img--clickable:hover { background: #ececec; transform: scale(1.02); } .cert-row__img--clickable:hover .cert-row__zoom { opacity: 1; } .cert-row__img img { max-width:100%; height:auto; display:block; margin:0 auto; } .cert-row__placeholder { color:#999; font-size:11px; letter-spacing:0.2em; text-transform:uppercase; padding: 30px 0; font-weight:700; } .cert-row__zoom { position: absolute; top: 10px; right: 10px; width: 32px; height: 32px; border-radius: 50%; background: var(--accent); color: #fff; display: flex; align-items: center; justify-content: center; opacity: 0; transition: opacity 0.2s; pointer-events: none; } .cert-row__badge { position: absolute; left: 8px; bottom: 8px; width: 34px; height: 34px; object-fit: contain; background: #fff; border-radius: 50%; padding: 3px; box-shadow: 0 1px 5px rgba(0,0,0,0.2); } /* Cert lightbox */ .cert-lightbox { position: fixed; inset: 0; background: rgba(0,0,0,0.92); z-index: 500; display: flex; align-items: center; justify-content: center; padding: 40px; animation: certLbFadeIn 0.18s ease-out; } @keyframes certLbFadeIn { from { opacity: 0; } to { opacity: 1; } } .cert-lightbox__close { position: absolute; top: 24px; right: 28px; width: 44px; height: 44px; border-radius: 50%; background: rgba(255,255,255,0.1); color: #fff; border: none; font-size: 28px; line-height: 1; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.15s; } .cert-lightbox__close:hover { background: rgba(255,255,255,0.2); } .cert-lightbox__inner { max-width: min(1200px, 92vw); max-height: 85vh; display: flex; flex-direction: column; align-items: center; gap: 16px; } .cert-lightbox__inner img { max-width: 100%; max-height: 78vh; height: auto; width: auto; object-fit: contain; background: #fff; padding: 16px; box-shadow: 0 30px 80px rgba(0,0,0,0.5); } .cert-lightbox__label { font-size: 12px; font-weight: 700; letter-spacing: 0.22em; text-transform: uppercase; color: rgba(255,255,255,0.85); } .cert-row__code { font-size:11px; font-weight:700; letter-spacing:0.2em; text-transform:uppercase; color: var(--accent); margin-bottom:8px; } .cert-row__name { font-size:22px; font-weight:700; margin-bottom:14px; line-height:1.2; } .cert-row__meta { display:grid; grid-template-columns: auto 1fr; gap: 6px 16px; font-size:13.5px; color:#555; line-height:1.6; } .cert-row__meta dt { font-weight:700; color:#222; } .cert-row__valid { font-size:11px; font-weight:700; letter-spacing:0.18em; text-transform:uppercase; color:#888; white-space:nowrap; } `; document.head.appendChild(s); }, []); return null; } function PageHead({ brand, crumbs, title, sub, image }) { const b = window.QC_DATA.brands[brand]; const cls = 'page-head' + (image ? ' page-head--image' : ''); const style = image ? { '--bg-image': `url("${image}")` } : null; return (
{brand === 'lns' ? 'Quick City Line Network Solution GmbH' : 'Quick City GmbH'} {crumbs.map((c, i) => {c.href ? {c.label} : {c.label}})}

{sub &&

{sub}

}

); } /* ───────────────────────────────────────── ABOUT — original legacy markup (page-head + narrative + next-block) ───────────────────────────────────────── */ function AboutStyles() { React.useEffect(() => { if (document.getElementById('about-styles')) return; const s = document.createElement('style'); s.id = 'about-styles'; s.textContent = ` .ab-lead { font-size: 19px; line-height: 1.7; color: #444; max-width: 720px; margin-bottom: 64px; } .ab-lead strong { color: var(--accent); font-weight: 700; } .ab-narrative { display: grid; grid-template-columns: 1fr 1fr; gap: 72px 96px; margin-bottom: 88px; } @media (max-width: 800px) { .ab-narrative { grid-template-columns: 1fr; gap: 48px; } } .ab-item h3 { font-size: 20px; font-weight: 700; margin-bottom: 14px; color: var(--accent); } .ab-item h3::before { content:''; display:inline-block; width:24px; height:2px; background:var(--accent); vertical-align:middle; margin-right:12px; } .ab-item p { font-size: 15px; line-height: 1.8; color: #444; } .ab-stats-box { background:#f5f5f5; padding:32px; border-left:4px solid var(--accent); } .ab-stats-box__label { font-size:11px; font-weight:700; letter-spacing:0.22em; text-transform:uppercase; color:var(--accent); margin-bottom:12px; } .ab-stats-grid { display:grid; grid-template-columns:1fr 1fr; gap:18px 24px; } .ab-stat__num { font-size:32px; font-weight:700; color:var(--accent); line-height:1; } .ab-stat__label { font-size:12px; color:#666; margin-top:4px; } .ab-next { margin-top: 64px; background: var(--accent); color: #fff; padding: 56px 64px; display: grid; grid-template-columns: 1fr 1fr; gap: 56px; align-items: center; } @media (max-width: 800px) { .ab-next { grid-template-columns: 1fr; gap: 24px; padding: 40px; } } .ab-next h3 { font-size: 28px; font-weight: 700; line-height: 1.2; } .ab-next p { font-size: 16px; line-height: 1.7; color: rgba(255,255,255,0.9); margin-bottom: 24px; } .ab-next .btn { background:#fff; color:var(--accent); border-color:#fff; } `; document.head.appendChild(s); }, []); return null; } function AboutPage({ brand }) { if (brand === 'lns' && typeof window.LnsAboutPage === 'function') { return ; } if (brand === 'ifm' && typeof window.IfmAboutPage === 'function') { return ; } const { t } = useT(); const d = window.QC_CONTENT.about[brand]; const titleHtml = t(`${brand}.about.title2`, (d.title || '').replace(//gi, ' ')); const stripTitle = titleHtml.replace(//gi, ' '); return (

{d.blocks.map((bl, i) => { const k = `${brand}.about.p${i + 1}`; return (

{t(`${k}.h`, bl.h)}

); })}
{brand === 'ifm' ? t('ifm.about.stats.label', 'Quick City in Zahlen') : t('lns.about.stats.label', 'LNS in Zahlen')}
{d.stats.map((s, i) =>
{t(`${brand}.about.stat${i + 1}.label`, s.label)}
)}

{t('companies.together', 'Gemeinsam stark')}

{t('companies.together.text', window.QC_CONTENT.companies.togetherT)}

{t('nav.companies', 'Unsere Unternehmen')}
); } /* ───────────────────────────────────────── COMPANIES (left as-is — already passable) ───────────────────────────────────────── */ function CompaniesPage({ brand }) { const { t } = useT(); const d = window.QC_CONTENT.companies; return (
{d.cards.map((c) => { const cb = window.QC_DATA.brands[c.brand]; return (
{c.name}
{t(`companies.${c.brand}.label`, c.tag)}

{t(`companies.${c.brand}.text`, c.text)}

{t(`companies.${c.brand}.cta`, c.cta)} →

); })}
{t('companies.section.label', 'Zusammenspiel')}

{t('companies.together', d.togetherH)}

{t('companies.together.text', d.togetherT)}

); } /* ───────────────────────────────────────── TECH (left as-is) ───────────────────────────────────────── */ function TechPage({ brand }) { const { t, lang } = useT(); const d = window.QC_CONTENT.tech[brand]; // Technik-Übersetzung: Hersteller bleiben, Kategorien & Bezeichnungen werden übersetzt const TT = window.QC_TECH_TX || { ui: {}, terms: {} }; const txUI = (de) => (lang === 'de' ? de : (TT.ui[lang] && TT.ui[lang][de]) || de); const txTerm = (de) => (lang === 'de' ? de : (TT.terms[lang] && TT.terms[lang][de]) || de); const heroImg = brand === 'ifm' ? 'assets/ifm-fleet-sprinter.jpg' : 'assets/lns-fleet.jpg'; const hasInventory = Array.isArray(d.inventory) && d.inventory.length > 0; const totalMachines = hasInventory ? d.inventory.reduce((s, c) => s + c.items.reduce((a, it) => a + (typeof it.count === 'number' ? it.count : 1), 0), 0) : 0; const hasCounts = hasInventory && d.inventory.some(g => g.items.some(it => typeof it.count === 'number')); // Display override: IFM shows aggregate "350+" since per-item counts aren't tracked const totalDisplay = brand === 'ifm' ? '350+' : brand === 'lns' ? '850+' : `${totalMachines}${hasCounts ? '+' : ''}`; return ( {/* Overview cats — only shown when no detailed inventory exists */} {!hasInventory && (
{d.cats.map((c, i) =>
{String(i + 1).padStart(2, '0')}

{t(`tech.cat${i + 1}`, c.name)}

{t(`${brand}.tech.f${i + 1}.t`, c.t)}

)}
)} {/* Detailed inventory (IFM only — when data is present) */} {hasInventory && (
{txUI('Maschinenpark')}

{txUI('Vollständige Übersicht.')}

{totalDisplay}{txUI('Maschinen & Fahrzeuge')}
{d.inventory.length}{txUI('Bereiche')}
100 %{txUI('Eigener Bestand')}
{d.inventory.map((group, gi) => (

{txTerm(group.cat)}

{group.compact ? (
{group.items.map((it, ii) => ( {txTerm(it.type)} ))}
{group.items[0] && group.items[0].brand ? group.items[0].brand : txUI('Diverse Hersteller')}
) : (
{txUI('Bezeichnung')}
{txUI('Hersteller / Modell')}
{hasCounts &&
{txUI('Anzahl')}
}
{group.items.map((it, ii) => (
{txTerm(it.type)}
{it.brand}
{hasCounts &&
{typeof it.count === 'number' ? {it.count}× : }
}
))}
)}
))}

{txUI('Auszug aus unserem Bestand · Stand: laufend aktualisiert. Wartung, Reparatur und Pflege erfolgen in der eigenen Werkstatt.')}

)}
); } function TechStyles() { React.useEffect(() => { if (document.getElementById('tech-inv-styles')) return; const s = document.createElement('style'); s.id = 'tech-inv-styles'; s.textContent = ` .tech-inv__head { text-align: center; max-width: 760px; margin: 0 auto 56px; } .tech-inv__head .section__h, .tech-inv__head .section__title, .tech-inv__head .section__sub { margin-left: auto; margin-right: auto; } .tech-inv__head .section__sub { max-width: 60ch; } .tech-inv__stats { display: flex; justify-content: center; gap: 56px; margin-top: 32px; flex-wrap: wrap; } .tech-inv__stat { text-align: center; } .tech-inv__stat strong { display: block; font-size: 38px; font-weight: 800; color: var(--accent); letter-spacing: -0.02em; font-variant-numeric: tabular-nums; line-height: 1; } .tech-inv__stat span { display: block; margin-top: 6px; font-size: 11px; font-weight: 700; letter-spacing: 0.18em; text-transform: uppercase; color: #888; } .tech-inv__list { display: flex; flex-direction: column; gap: 28px; } .tech-inv__group { background: #fff; border: 1px solid #ececec; overflow: hidden; } .tech-inv__group-head { display: flex; align-items: center; gap: 18px; padding: 22px 28px; background: #1a1a1a; color: #fff; } .tech-inv__group-icon { font-size: 26px; line-height: 1; flex-shrink: 0; width: 44px; height: 44px; border-radius: 50%; background: var(--accent); display: flex; align-items: center; justify-content: center; } .tech-inv__group-info { display: flex; align-items: baseline; gap: 14px; flex: 1; flex-wrap: wrap; } .tech-inv__group-title { font-size: 19px; font-weight: 700; letter-spacing: -0.005em; margin: 0; } .tech-inv__group-count { font-size: 11px; font-weight: 700; letter-spacing: 0.18em; text-transform: uppercase; color: rgba(255,255,255,0.55); } .tech-inv__table { display: flex; flex-direction: column; } /* Compact chip layout — used for groups with all-same brand (e.g. "Spezialtechnik") */ .tech-inv__chips { padding: 28px; display: flex; flex-wrap: wrap; gap: 10px; align-items: center; position: relative; } .tech-inv__chip { display: inline-block; padding: 9px 16px; background: #fafafa; border: 1px solid #ececec; border-left: 3px solid var(--accent); font-size: 13.5px; font-weight: 600; color: #1a1a1a; letter-spacing: 0.01em; line-height: 1.3; } .tech-inv__chips-note { width: 100%; margin-top: 12px; padding-top: 14px; border-top: 1px dashed #e0e0e0; font-size: 11px; font-weight: 700; letter-spacing: 0.18em; text-transform: uppercase; color: #999; } .tech-inv__row { display: grid; grid-template-columns: 1.4fr 1fr; gap: 24px; padding: 14px 28px; border-bottom: 1px solid #f0f0f0; font-size: 14.5px; } .tech-inv__table--with-count .tech-inv__row { grid-template-columns: 1.4fr 1fr 100px; } .tech-inv__row:last-child { border-bottom: none; } .tech-inv__row:nth-child(even) { background: #fafafa; } .tech-inv__row--head { background: #fff !important; padding-top: 16px; padding-bottom: 16px; font-size: 10.5px; font-weight: 700; letter-spacing: 0.18em; text-transform: uppercase; color: #999; border-bottom: 2px solid #1a1a1a; } .tech-inv__type { color: #333; font-weight: 500; } .tech-inv__brand { color: #1a1a1a; font-weight: 700; } .tech-inv__count-cell { text-align: right; } .tech-inv__count-pill { display: inline-flex; align-items: center; justify-content: center; min-width: 52px; padding: 4px 10px; background: var(--accent); color: #fff; font-size: 12px; font-weight: 800; letter-spacing: 0.02em; font-variant-numeric: tabular-nums; } .tech-inv__count-pill--ghost { background: #ececec; color: #999; } @media (max-width: 640px) { .tech-inv__row, .tech-inv__table--with-count .tech-inv__row { grid-template-columns: 1fr auto; gap: 4px 12px; padding: 12px 20px; } .tech-inv__row--head { display: none; } .tech-inv__type { font-size: 12px; color: #888; letter-spacing: 0.04em; text-transform: uppercase; grid-column: 1 / -1; } .tech-inv__count-cell { grid-row: 2; grid-column: 2; align-self: center; } .tech-inv__brand { grid-row: 2; grid-column: 1; } .tech-inv__group-head { padding: 18px 20px; gap: 14px; } .tech-inv__group-icon { width: 38px; height: 38px; font-size: 22px; } .tech-inv__group-title { font-size: 17px; } } .tech-inv__note { margin-top: 36px; font-size: 12px; color: #888; text-align: center; font-style: italic; } `; document.head.appendChild(s); }, []); return null; } /* ───────────────────────────────────────── VALUES (left as-is) ───────────────────────────────────────── */ function ValuesPage({ brand }) { const { t } = useT(); const d = window.QC_CONTENT.values[brand]; return (
{d.vals.map((v, i) =>

{t(`${brand}.val${i + 1}.h`, v.h)}

{t(`${brand}.val${i + 1}.t`, v.t)}

{v.points && (
    {v.points.map((p, j) =>
  • {t(`${brand}.val${i + 1}.p${j + 1}`, p)}
  • )}
)}
)}
); } function ValuesStyles() { React.useEffect(() => { if (document.getElementById('qc-vals-styles')) return; const s = document.createElement('style'); s.id = 'qc-vals-styles'; s.textContent = ` .qc-vals-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; } @media (max-width: 980px) { .qc-vals-grid { grid-template-columns: 1fr 1fr; } } @media (max-width: 680px) { .qc-vals-grid { grid-template-columns: 1fr; gap: 16px; } } .qc-val-card { background: #fff; border: 1px solid #ececec; border-top: 3px solid var(--accent); padding: 32px 30px 28px; transition: transform 0.25s, box-shadow 0.25s; } .qc-val-card:hover { transform: translateY(-3px); box-shadow: 0 16px 36px rgba(0,0,0,0.06); } .qc-val-card__h { font-size: 21px; font-weight: 700; letter-spacing: -0.01em; margin: 0 0 14px; color: #1a1a1a; } .qc-val-card__t { font-size: 14.5px; line-height: 1.7; color: #555; margin: 0 0 18px; } .qc-val-card__list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 9px; } .qc-val-card__list li { position: relative; padding-left: 18px; font-size: 13.5px; line-height: 1.5; color: var(--accent); font-weight: 600; } .qc-val-card__list li::before { content: ''; position: absolute; left: 0; top: 8px; width: 6px; height: 6px; border-radius: 50%; background: var(--accent); } @media (max-width: 680px) { .qc-val-card { padding: 24px 22px 22px !important; } .qc-val-card__h { font-size: 18px !important; } .qc-val-card__t { font-size: 14px !important; } } `; document.head.appendChild(s); }, []); return null; } /* ───────────────────────────────────────── CERTS — Legacy-Look ───────────────────────────────────────── */ function CertsPage({ brand }) { const { t, lang } = useT(); const certName = (n) => { const m = { 'Qualitätsmanagement': { en: 'Quality management', tr: 'Kalite yönetimi' }, 'Umweltmanagement': { en: 'Environmental management', tr: 'Çevre yönetimi' } }; return lang === 'de' ? n : (m[n] && m[n][lang]) || n; }; const certValid = (v) => { if (lang === 'de' || !v) return v; const yr = (v.match(/\d{4}/) || [''])[0]; if (lang === 'en') return yr ? `valid until ${yr}` : v; if (lang === 'tr') return yr ? `${yr}’e kadar geçerli` : v; return v; }; const d = window.QC_CONTENT.certs[brand]; const isIfm = brand === 'ifm'; const heroImg = isIfm ? 'assets/ifm-hero.png' : 'assets/lns-kabel.jpg'; const [lightbox, setLightbox] = useI(null); React.useEffect(() => { if (!lightbox) return; const onKey = (e) => { if (e.key === 'Escape') setLightbox(null); }; window.addEventListener('keydown', onKey); document.body.style.overflow = 'hidden'; return () => { window.removeEventListener('keydown', onKey); document.body.style.overflow = ''; }; }, [lightbox]); // map known cert codes to image files const imgFor = (code, c) => { if (c && c.img) return c.img; if (code.includes('9001')) return isIfm ? 'assets/zertifikate/qc-iso-9001.jpg' : 'assets/zertifikate/lns-iso-9001.jpg'; if (code.includes('14001')) return 'assets/zertifikate/qc-iso-14001.jpg'; return null; }; return (
{t('certs.overview.label', 'Übersicht')}

{t('certs.overview.title', 'Unsere aktuellen Zertifizierungen')}

{d.list.map((c, i) => { const img = imgFor(c.code, c); const isIso9 = c.code.includes('9001'); const isIso14 = c.code.includes('14001'); const scopeKey = isIso9 ? `${brand}.certs.iso9.scope` : isIso14 ? `${brand}.certs.iso14.scope` : null; return (
{c.code}

{certName(c.name)}

{t('certs.scope.h', 'Geltungsbereich')}
{scopeKey ? t(scopeKey, c.scope) : c.scope}
{(isIso9 || isIso14) ? t('certs.body.h', 'Zertifizierungsstelle') : t('certs.body2.h', 'Art des Nachweises')}
{c.body}
{(isIso9 || isIso14) && (<>
{t('certs.acc.h', 'Akkreditierung')}
{t('certs.dakks', 'DAkkS · IAF')}
)}
{certValid(c.valid)}
); })}
{/* Was uns Zertifizieren bedeutet */}
{t('certs.bg.label', 'Hintergrund')}

für uns bedeutet') }} />

{t('certs.next.t', 'Zertifizierungen sind kein Selbstzweck. Sie zwingen uns zu Disziplin: Prozesse werden dokumentiert, Abweichungen analysiert, Verbesserungen umgesetzt. Jährliche Überwachungs­audits durch unabhängige Stellen sichern, dass Anspruch und Realität deckungsgleich bleiben — auf jeder Baustelle, in jedem Auftrag.')}

{/* Lightbox */} {lightbox && (
{ if (e.target.classList.contains('cert-lightbox')) setLightbox(null); }}>
{lightbox.label}
{lightbox.label}
)}
); } /* ───────────────────────────────────────── TEAM — Legacy-Look mit Org-Chart + Filter ───────────────────────────────────────── */ function TeamPage({ brand }) { const { t } = useT(); const td = window.TEAM_DATA[brand]; const all = [...td.leadership, ...td.team]; const depts = [...new Set(all.map((p) => p.dept))]; const [active, setActive] = useI('all'); const [openId, setOpenId] = useI(null); const list = active === 'all' ? td.team : td.team.filter((p) => p.dept === active); const isIfm = brand === 'ifm'; const heroImg = isIfm ? 'assets/ifm-bg.jpg' : 'assets/lns-tiefbau.jpeg'; const initials = (n) => n.split(' ').filter((p) => p[0] && p[0] === p[0].toUpperCase()).slice(0, 2).map((p) => p[0]).join(''); // Org: GF row + Bereichsleitung row const gf = td.leadership.filter((p) => p.dept === 'Geschäftsführung'); const bl = td.leadership.filter((p) => p.dept !== 'Geschäftsführung'); const openPerson = openId ? all.find((p) => p.id === openId) : null; // ── WIP-Schalter: nur LNS-Team-Seite vorerst in Bearbeitung. const TEAM_WIP = brand === 'lns'; if (TEAM_WIP) { return (

{t('wip.h', 'Diese Seite ist in Bearbeitung.')}

{t('wip.team.p', 'Wir stellen Ihnen unser Team in Kürze hier vor. Bis dahin erreichen Sie uns jederzeit direkt.')}

); } return ( {/* Org chart */} {td.leadership.length > 0 &&
{t('team.leadership.label', 'Führung')}

{t('team.leadership.title', 'Geschäftsführung & Bereichsleitung')}

{gf.length > 0 &&
{gf.map((p) =>
setOpenId(p.id)}>
{p.photo ? {p.name} : initials(p.name)}
{p.name}
{p.role}
{p.dept}
)}
} {gf.length > 0 && bl.length > 0 && <>
} {bl.length > 0 &&
{bl.map((p) =>
setOpenId(p.id)}>
{p.photo ? {p.name} : initials(p.name)}
{p.name}
{p.role}
{p.dept}
)}
}
} {/* Team grid with filters */}
{t('team.staff.label', 'Mitarbeiter')}

{t('team.staff.title', 'Unser Team')}

{depts.filter((d) => td.team.some((p) => p.dept === d)).map((d) => )}
{list.map((p) =>
setOpenId(p.id)}>
{p.photo ? {p.name} : initials(p.name)}
{p.name}
{p.role}
{p.dept}
)}
{openPerson &&
{if (e.target.classList.contains('tm-modal')) setOpenId(null);}}>
{openPerson.photo ? {openPerson.name} : initials(openPerson.name)}
{openPerson.name}
{openPerson.role}
{openPerson.dept}

{openPerson.bio}

{openPerson.email && {openPerson.email}}
}
); } /* ───────────────────────────────────────── CONTACT — original legacy markup ───────────────────────────────────────── */ function ContactStyles() { React.useEffect(() => { if (document.getElementById('contact-styles')) return; const s = document.createElement('style'); s.id = 'contact-styles'; s.textContent = ` .ct-grid { display: grid; grid-template-columns: 1.2fr 1fr; gap: 64px; align-items: start; } @media (max-width: 900px) { .ct-grid { grid-template-columns: 1fr; gap: 40px; } } .ct-info { background: var(--light); padding: 36px; border-left: 4px solid var(--accent); } .ct-block { margin-bottom: 28px; } .ct-block:last-child { margin-bottom: 0; } .ct-block__label { font-size: 10px; font-weight: 700; letter-spacing: 0.25em; text-transform: uppercase; color: var(--accent); margin-bottom: 8px; } .ct-block__value { font-size: 15px; line-height: 1.7; color: #222; white-space: pre-line; } .ct-block__value a { color: var(--accent); text-decoration: none; } .ct-block__value a:hover { text-decoration: underline; } .ct-section-label { font-size: 11px; font-weight: 700; letter-spacing: 0.22em; text-transform: uppercase; color: var(--accent); margin-bottom: 12px; } .ct-section-title { font-size: 32px; font-weight: 700; line-height: 1.15; margin-bottom: 16px; } .ct-intro { font-size: 16px; line-height: 1.7; color: #555; margin-bottom: 36px; } .ct-form { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; } @media (max-width: 600px) { .ct-form { grid-template-columns: 1fr; } } .ct-form__full { grid-column: 1 / -1; } .ct-field { display: flex; flex-direction: column; } .ct-field label { font-size: 11px; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; color: #555; margin-bottom: 6px; } .ct-field input, .ct-field select, .ct-field textarea { width: 100%; padding: 12px 14px; border: 1px solid #ddd; background: #fafafa; font-family: inherit; font-size: 14px; color: #222; transition: border-color .2s, background .2s; } .ct-field input:focus, .ct-field select:focus, .ct-field textarea:focus { outline: none; border-color: var(--accent); background: #fff; } .ct-field textarea { min-height: 140px; resize: vertical; } .ct-submit { display: inline-flex; align-items: center; gap: 12px; background: var(--accent); color: #fff; border: none; font-family: inherit; font-size: 11px; font-weight: 700; letter-spacing: 0.2em; text-transform: uppercase; padding: 14px 28px; cursor: pointer; transition: opacity .2s; } .ct-submit:hover { opacity: 0.85; } .ct-success { background: #fff4ec; border-left: 4px solid var(--accent); padding: 18px 22px; margin-top: 18px; font-size: 14px; color: #b04510; } .ct-map-section { padding: 0 0 96px; } .ct-map-wrap { width: 100%; height: 480px; position: relative; overflow: hidden; border-top: 4px solid var(--accent); } .ct-map-wrap iframe { width: 100%; height: 100%; border: 0; display: block; } .ct-map-consent { width: 100%; height: 100%; border: 0; cursor: pointer; background: #1a1a1a; color: #fff; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; padding: 32px; text-align: center; font-family: inherit; } .ct-map-consent svg { color: var(--accent); margin-bottom: 4px; } .ct-map-consent__title { font-size: 18px; font-weight: 700; letter-spacing: 0.02em; } .ct-map-consent__text { font-size: 13px; line-height: 1.6; color: rgba(255,255,255,0.65); max-width: 420px; } .ct-map-consent__btn { margin-top: 8px; display: inline-block; padding: 12px 24px; background: var(--accent); color: #fff; font-size: 12px; font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; } .ct-map-consent:hover .ct-map-consent__btn { background: #fff; color: #1a1a1a; } .ct-map-cta { position: absolute; bottom: 24px; right: 24px; background: #fff; padding: 14px 22px; box-shadow: 0 8px 24px rgba(0,0,0,0.15); font-size: 11px; font-weight: 700; letter-spacing: 0.18em; text-transform: uppercase; color: var(--accent); text-decoration: none; display: inline-flex; align-items: center; gap: 8px; transition: background 0.2s, color 0.2s; } .ct-map-cta:hover { background: var(--accent); color: #fff; } `; document.head.appendChild(s); }, []); return null; } function ContactPage({ brand }) { const { t } = useT(); const d = window.QC_CONTENT.contact[brand]; const [sent, setSent] = useI(false); const [mapConsent, setMapConsent] = useI(false); const [sending, setSending] = useI(false); const [sendError, setSendError] = useI(false); const isIfm = brand === 'ifm'; const submitContact = async (e) => { e.preventDefault(); if (sending) return; const form = e.target; const payload = { brand, name: form.name.value, company: form.company ? form.company.value : '', email: form.email.value, phone: form.phone ? form.phone.value : '', city: form.city ? form.city.value : '', topic: form.topic ? form.topic.value : '', message: form.message.value, website: form.website ? form.website.value : '' }; setSending(true); setSendError(false); try { const res = await fetch('kontakt.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); const data = await res.json().catch(() => ({ ok: false })); if (res.ok && data.ok) { setSent(true); } else { setSendError(true); } } catch (err) { setSendError(true); } finally { setSending(false); } }; const mapQ = d.mapQuery || 'Blankenburger+Straße+18,+13089+Berlin'; return (
{/* FORM */}
{t('contact.form.label', 'Anfrage senden')}

{t('contact.form.title', 'Schreiben Sie uns')}

{isIfm ? t('ifm.contact.intro', 'Beschreiben Sie kurz Ihr Anliegen — wir melden uns in der Regel innerhalb eines Werktags.') : t('lns.contact.intro', 'Beschreiben Sie kurz Bauvorhaben und Standort — wir melden uns in der Regel innerhalb eines Werktags.')}

{sent ?
{t('contact.success', 'Vielen Dank — wir haben Ihre Nachricht erhalten und melden uns zeitnah. Eine Eingangsbestätigung haben wir Ihnen per E-Mail geschickt (bitte ggf. auch den Spam-Ordner prüfen).')}
:
{!isIfm &&
}
{t('contact.privacy', 'Mit dem Absenden akzeptieren Sie unsere Datenschutzbestimmungen.')} {sendError && {t('contact.error', 'Senden fehlgeschlagen. Bitte versuchen Sie es erneut oder schreiben Sie uns direkt per E-Mail.')}}
}
{/* INFO */}
{isIfm ? t('contact.info.address', 'Adresse') : t('contact.info.hq', 'Leitungszentrale')}
{d.address}
{t('contact.info.phone', 'Telefon')}
{d.phone} {d.fax ? <>{'\n'}{t('contact.info.fax', 'Fax')}: {d.fax} : null}
{t('contact.info.email', 'E-Mail')}
{isIfm ? t('contact.info.hours', 'Öffnungszeiten') : t('contact.info.officehours', 'Bürozeiten')}
{t(`${brand}.contact.hours`, d.hours)}
{isIfm && (
{t('contact.info.emergency', 'Notfall & Winterdienst')}
)}
{/* MAP — DSGVO: erst nach Klick laden */}
{mapConsent ? (