// Quick City — Service detail + Services index pages const { useState: useSv } = React; function ServiceDetail({ slug }) { const { t, lang } = useT(); // Pick translated overlay if available, else fall back to DE const base = window.QC_CONTENT.services[slug]; const overlay = (lang === 'en' && window.QC_CONTENT.services_en && window.QC_CONTENT.services_en[slug]) || (lang === 'tr' && window.QC_CONTENT.services_tr && window.QC_CONTENT.services_tr[slug]) || null; if (!base) return ; const data = overlay ? { ...base, ...overlay } : base; const brand = base.brand; const b = window.QC_DATA.brands[brand]; return ( {/* HERO — editorial dark */}
{data.kicker} {brand === 'lns' ? 'Quick City Line Network Solution GmbH' : 'Quick City GmbH'}

{t('svc.' + (slug.indexOf('/') !== -1 ? slug.split('/').pop() : slug) + '.title', data.title)}

{data.lead}

{/* INTRO */}
{t('svc.intro.label', 'Worum es geht')}

{data.introH}

{data.introBody.map((p,i) =>

)}

{/* SCOPE */} {Array.isArray(data.scope) && data.scope.length > 0 && (
{t('svc.scope.label', 'Leistungsumfang')}

{t('svc.scope.title', 'Was wir abdecken')}

{data.scope.map((s,i) => (
{String(i+1).padStart(2,'0')}

{s.h}

{s.t}

))}
)} {/* MID BAND — colored statement banner (only if data present) */} {data.band && (

{data.band.h}.

{data.band.t}

)} {/* WAS UNS UNTERSCHEIDET — reusable, only if data present */} {Array.isArray(data.diff) && data.diff.length > 0 && (
{t('svc.diff.label', 'Was uns unterscheidet')}

{data.diffH || t('svc.diff.title', 'Mehr als nur räumen.')}

{data.diff.map((d,i) => (

{d.h}

{d.t}

))}
{data.diffClose &&

{data.diffClose}

}
)} {/* IHR ANSPRECHPARTNER — vorerst ausgeblendet. Zum Reaktivieren: SHOW_CONTACT = true */} {(() => { const SHOW_CONTACT = true; if (!SHOW_CONTACT) return null; const td = window.TEAM_DATA && window.TEAM_DATA[brand]; const shortSlug = slug.indexOf('/') !== -1 ? slug.split('/').pop() : slug; const cidRaw = td && td.contacts && td.contacts[shortSlug]; if (!cidRaw) return null; const cids = Array.isArray(cidRaw) ? cidRaw : [cidRaw]; const all = [...(td.leadership||[]), ...(td.team||[])]; const people = cids.map(id => all.find(p => p.id === id)).filter(Boolean); if (people.length === 0) return null; const ini = (n) => n.split(' ').map(w => w[0]).join('').slice(0,2).toUpperCase(); return (
{t('svc.contact.label', 'Ihr Ansprechpartner')}{people.length > 1 ? ' (' + people.length + ')' : ''}
1 ? ' is-multi' : '')}> {people.map((person) => (
{person.photo ? {person.name} : ini(person.name)}
{person.name}
{person.role}
{person.bio &&

{person.bio}

}
{person.email && ( {person.email} )} {b.phone}
))}
); })()} {/* QUOTE BANNER — hidden (band replaces it; set window.SVC_QUOTE = true to restore) */} {window.SVC_QUOTE && data.quote && (
{data.quote.q} {data.quote.cite}
)} {/* PROCESS — hidden (set window.SVC_PROCESS = true to restore) */} {window.SVC_PROCESS && (
{t('svc.process.label', 'Unser Ablauf')}

{t('svc.process.title', 'So gehen wir vor')}

{data.process.map((p,i) => (
{String(i+1).padStart(2,'0')}

{p.h}

{p.t}

))}
)} {/* FAQ + CTA — temporarily hidden (set window.SVC_FAQ_CTA = true to restore) */} {window.SVC_FAQ_CTA && (
{t('svc.faq.label', 'FAQ')}

{t('svc.faq.title', 'Häufig gefragt')}

{data.faq.map((f,i) => (
{f.q}

{f.a}

))}
{t('svc.cta.label', 'Bereit?')}

{data.ctaH}

)}
); } function ServicesIndex({ brand }) { const { t } = useT(); const services = brand === 'ifm' ? window.QC_DATA.ifmServices : window.QC_DATA.lnsServices; const otherBrand = brand === 'ifm' ? 'lns' : 'ifm'; // Hero copy via i18n keys; default fallback in DE const heroH = brand === 'ifm' ? t('ifm.svcidx.h', 'Was wir können.') : t('lns.svcidx.h', 'Was wir bauen.'); const heroP = brand === 'ifm' ? t('ifm.svcidx.p', 'Fünf Disziplinen, ein Anspruch: Außenflächen, die zu jeder Jahreszeit funktionieren — sicher, gepflegt, dokumentiert.') : t('lns.svcidx.p', 'Vier Disziplinen, eine Mannschaft: Tiefbau, Glasfaser, Straßen­bau und Verkehrssicherung — von der Spülbohrung bis zur Asphaltdecke.'); const otherTitle = brand === 'ifm' ? t('svcidx.other.lns.title', 'Tiefbau, Netzausbau, Straßenbau') : t('svcidx.other.ifm.title', 'Winterdienst, Pflege, Reinigung'); const otherSub = brand === 'ifm' ? t('svcidx.other.lns.sub', 'Quick City LNS ergänzt das IFM-Portfolio um Erd- und Tiefbau, Telekommunikations-Netzausbau und Verkehrsflächenbau. Häufig in einem gemeinsamen Auftrag.') : t('svcidx.other.ifm.sub', 'Quick City IFM betreut Außenanlagen — Winterdienst, Pflege, Reinigung — als Komplement zum Tiefbau.'); const otherKicker = t('svcidx.other.kicker', 'Auch für {brand}-Leistungen?').replace('{brand}', otherBrand.toUpperCase()); const otherCta = t('svcidx.other.cta', 'Zu den {brand}-Leistungen →').replace('{brand}', otherBrand.toUpperCase()); // Translate service title/sub via QC_CONTENT overlay if available (services from data.js are DE only) const lang = (window.QCI18N && window.QCI18N.getLang()) || 'de'; const overlay = lang === 'en' ? window.QC_CONTENT.services_en : (lang === 'tr' ? window.QC_CONTENT.services_tr : null); return (

{heroH.split(' ').slice(0,-1).join(' ')} {heroH.split(' ').slice(-1)[0].replace('.','')}.

{heroP}

{services.map((s,i) => { const ov = overlay && overlay[s.slug]; const title = t('svc.' + s.slug + '.title', ov ? ov.title : s.title); const sub = t('svc.' + s.slug + '.sub', ov ? ov.lead : s.sub); return ( { // Fallback: inline SVG for missing icons (e.g. lns-stoerungsdienst) e.target.style.display = 'none'; const fb = e.target.parentElement.querySelector('.svc-index__icon-fb'); if (fb) fb.style.display = 'block'; }} />
{String(i+1).padStart(2,'0')} — {brand.toUpperCase()}

{title}

{sub}

{t('svcidx.more', 'Zur Leistung')}
); })}
{otherKicker}

{otherTitle}

{otherSub}

{otherCta}
); } Object.assign(window, { ServiceDetail, ServicesIndex });