// 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('nav.services', 'Leistungen')} / {t('svc.' + (slug.indexOf('/') !== -1 ? slug.split('/').pop() : slug) + '.title', data.crumb)} {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.icon} {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 ? : 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} {data.ctaT} {t('svc.cta.btn', 'Anfrage senden →')} )} ); } 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ßenbau 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 });
{data.lead}
{s.t}
{data.band.t}
{d.t}
{data.diffClose}
{person.bio}
{data.quote.q}
{p.t}
{f.a}
{data.ctaT}
{heroP}
{sub}
{otherSub}